Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥「道长仓库Pro」@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW3peWFt1wiLFwicGF0aFwiOlwidXRpbGl5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgaG9zdCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3NcXFwiO1xcbi8vbGV0IGhvc3QgPSBcXFwiaHR0cDovLzE5Mi4xNjguMy45NDo4MDc5XFxcIjtcXG5sZXQgaG9tZSA9IGJhc2U2NERlY29kZShcXFwiYUdsclpYSTZMeTlvYjIxbFxcXCIpO1xcbnZhciBhcGkgPSB7XFxuICAgIGhvc3Q6IGhvc3QrXFxcIi9oaWtlcnVsZVxcXCIsXFxuICAgIHVzZXJzVXJsOiBcXFwiL2Rldi91c2Vycz9vcmRlcj1cXFwiLCAvL+eUqOaIt+WIl+ihqFxcbiAgICBydWxlQ291bnRVcmw6IFxcXCIvZGV2L3J1bGVjb3VudFxcXCIsIC8v6I635Y+W6KeE5YiZ5pWw6YePXFxuICAgIHJ1bGVzVXJsOiBcXFwiL2Rldi9nZXRcXFwiLCAvL+eUqOaIt+WvueW6lOeahOinhOWImeWIl+ihqOS7heS7heiOt+WPluWFrOW8gFxcbiAgICBydWxlc0FsbFVybDogXFxcIi9kZXYvZ2V0YWxsXFxcIiwgLy/lvIDlj5HogIXlr7nlupTnmoTop4TliJnliJfooajlj6/ojrflj5bnp4HmnIlcXG4gICAgZGV2U2VsZjonL2Rldi9nZXRzZWxmJywvL+iOt+WPluW8gOWPkeiAheS/oeaBr1xcbiAgICBtYW5DYW5VcGxvYWQ6Jy9zZXRfY2FuX3VwbG9hZC8nLC8v6LaF566h6K6+572u5byA5Y+R6ICF5piv5ZCm5Y+v5LiK5LygXFxuICAgIG1hblJ1bGVTYWZlOicvc2V0X3J1bGVfc2FmZS8nLC8v6LaF566h6K6+572u6KeE5YiZ5a6J5YWo5oCnXFxuICAgIG1hblJ1bGVHb29kOicvc2V0X3J1bGVfZ29vZC8nLC8v6LaF566h6K6+572u6KeE5YiZ5LyY6LSo5oCnXFxuICAgIGltcG9ydFVybDogXFxcIi9ydWxlbGlzdC5qc29uP2lkPVxcXCIsIC8v6KeE5YiZ6K+m5oOF5Y+v5a+85YWlXFxuICAgIGluZm9TZXRVcmw6IFxcXCIvZGV2L3NldF9pbmZvXFxcIixcXG4gICAgbm93Q29uVXJsOiBcXFwiL3NxbF9pbmZvL2dldF9ub3dfY29uXFxcIixcXG4gICAgaW5mb0dldFVybDogXFxcIi9kZXYvZ2V0X2luZm8/bmFtZT1cXFwiLFxcbiAgICBzZXR0aW5nc0dldFVybDogXFxcIi9kZXYvZ2V0X3NldHRpbmdzP25hbWU9XFxcIixcXG4gICAgZ3VwbG9hZDogXFxcIi9kZXYvZ3VwbG9hZFxcXCIsXFxuICAgIGd0aW1lb3ZlcjogXFxcIi9kZXYvZ3RpbWVvdmVyXFxcIixcXG4gICAgZ2V0YnlpZDogXFxcIi9kZXYvZ2V0YnlpZFxcXCIsXFxuICAgIHJ1bGVMaXN0SnNvbjogXFxcIi9ydWxlbGlzdC5qc29uXFxcIixcXG4gICAgYXV0aDogXFxcIi9kZXYvZ2V0X2F1dGhcXFwiLFxcbiAgICB0aW1lb3ZlcjogXFxcIi9kZXYvdGltZW92ZXJcXFwiLFxcbiAgICBzaGFyZTogXFxcIi9kZXYvc2hhcmVcXFwiLFxcbiAgICBnZW5BdXRoOiBcXFwiL2Rldi9nZW5fYXV0aFxcXCIsXFxuICAgIGRlbGV0ZVVybDogXFxcIi9kZXYvZGVsZXRlXFxcIixcXG4gICAganNvbkxpc3Q6IFxcXCIvZGV2L2pzb25fbGlzdFxcXCIsXFxuICAgIHNlYXJjaDogXFxcIi9kZXYvc2VhcmNoXFxcIixcXG4gICAgbmV3X2RldjogXFxcIi9kZXZfcmVnaXN0L25ld1xcXCIsXFxuICAgIG5ld19nZXRJZDogXFxcIi9kZXZfcmVnaXN0L2dldF9pZFxcXCIsXFxuICAgIG5ld19jb25maXJtOiBcXFwiL2Rldl9yZWdpc3QvY29uZmlybVxcXCIsXFxuICAgIG1vZGlmeV9wd2Q6IFxcXCIvbW9kaWZ5L3Bhc3N3b3JkXFxcIixcXG4gICAgbW9kaWZ5X25hbWU6IFxcXCIvbW9kaWZ5L25hbWVcXFwiLFxcbiAgICBtb2RpZnlfYXZhOiBcXFwiL21vZGlmeS9hdmF0YXJcXFwiLFxcbiAgICB1c2VyOiBcXFwiL2Rldi91c2VyL1xcXCIsXFxuICAgIGdldF9ydWxlX25vdGU6IFxcXCIvbW9kaWZ5L2dldF9ydWxlX25vdGUvXFxcIixcXG4gICAgc2V0X3J1bGVfcGljOiBcXFwiL21vZGlmeS9ydWxlX3BpYy9cXFwiLFxcbiAgICBzZXRfcnVsZV9ub3RlOiBcXFwiL21vZGlmeS9ydWxlX25vdGUvXFxcIlxcbn1cXG4kLmV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbihtLCBuKSB7XFxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobSAtIG4gKyAxKSArIG4pO1xcbn1cXG4kLmV4cG9ydHMubWFwQ29sVHlwZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgbikge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xcbiAgICAgICAgdGFyZ2V0LnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiB0eXBlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG52YXIgZ2V0QXBpID0gZnVuY3Rpb24oaykge1xcbiAgICByZXR1cm4gYXBpLmhvc3QgKyBhcGlba107XFxufTtcXG4kLmV4cG9ydHMuZ2V0QXBpPWdldEFwaTtcXG4kLmV4cG9ydHMubWQ9Z2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiMzE4N1xcXCI7XFxuJC5leHBvcnRzLmxvY2FsUnVsZVZlciA9IGZ1bmN0aW9uKGxvY2FsUnVsZUxpc3QsIHJ1bGUpIHtcXG4gICAgbGV0IGxvY2FsUnVsZTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJ1bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgaXRlbSA9IGxvY2FsUnVsZUxpc3RbaV07XFxuICAgICAgICBsZXQgYXUgPSBpdGVtLmF1dGhvciB8fCBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBzYW1lQXU9YXUubGVuZ3RoID4gMCAmJiBydWxlLmF1dGhvci5pbmNsdWRlcyhhdSk7XFxuICAgICAgICBzYW1lQXU9dHJ1ZTsvL+S4jeWIpOaWreS9nOiAhem7mOiupOS4unRydWVcXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBydWxlLm5hbWUgJiYgc2FtZUF1KSB7XFxuICAgICAgICAgICAgbG9jYWxSdWxlID0gaXRlbTtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAobG9jYWxSdWxlID09PSB2b2lkIDApIHtcXG4gICAgICAgIHJldHVybiAtMTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBsb2NhbFJ1bGUudmVyc2lvbjtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuY29sb3IgPSBmdW5jdGlvbih0ZXh0LCBjb2xvcikge1xcbiAgICB0ZXh0ICs9IFxcXCJcXFwiO1xcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXCLigJzigJzigJ3igJ1cXFwiKSA9PT0gMCkge1xcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXCLigJzigJzigJ3igJ1cXFwiLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ08Zm9udCBjb2xvcj0nXFxcIiArIGNvbG9yICsgXFxcIic+XFxcIiArIHRleHQgKyBcXFwiPC9mb250PlxcXCI7XFxufVxcblxcbiQuZXhwb3J0cy5zbGVlcCA9IGZ1bmN0aW9uKHRpbWVvdXQpe1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWVvdXQpO1xcbn1cXG5mdW5jdGlvbiBodG1sVGFnKHRhZywgdGV4dCkge1xcbiAgICB0ZXh0ICs9IFxcXCJcXFwiO1xcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXCLigJzigJzigJ3igJ1cXFwiKSA9PT0gMCkge1xcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXCLigJzigJzigJ3igJ1cXFwiLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIjxcXFwiICsgdGFnICsgXFxcIj5cXFwiICsgdGV4dCArIFxcXCI8L1xcXCIgKyB0YWcgKyBcXFwiPlxcXCI7XFxuXFxufVxcblxcbmZ1bmN0aW9uIGdldE5vd0Zvcm1hdERhdGUoKSB7XFxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IxID0gXFxcIi1cXFwiO1xcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IyID0gXFxcIjpcXFwiO1xcbiAgICAgICAgICAgIGxldCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XFxuICAgICAgICAgICAgbGV0IHN0ckRhdGUgPSBkYXRlLmdldERhdGUoKTtcXG4gICAgICAgICAgICBsZXQgc3RySG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XFxuICAgICAgICAgICAgbGV0IHN0ck1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcXG4gICAgICAgICAgICBsZXQgc3RyU2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpKzE7XFxuICAgICAgICAgICAgaWYgKG1vbnRoID49IDEgJiYgbW9udGggPD0gOSkge1xcbiAgICAgICAgICAgICAgICBtb250aCA9IFxcXCIwXFxcIiArIG1vbnRoXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJEYXRlID49IDAgJiYgc3RyRGF0ZSA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0ckRhdGUgPSBcXFwiMFxcXCIgKyBzdHJEYXRlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJIb3VycyA+PSAwICYmIHN0ckhvdXJzIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RySG91cnMgPSBcXFwiMFxcXCIgKyBzdHJIb3Vyc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyTWludXRlcyA+PSAwICYmIHN0ck1pbnV0ZXMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJNaW51dGVzID0gXFxcIjBcXFwiICsgc3RyTWludXRlc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyU2Vjb25kcyA+PSAwICYmIHN0clNlY29uZHMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJTZWNvbmRzID0gXFxcIjBcXFwiICsgc3RyU2Vjb25kc1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvL2xldCBjdXJyZW50ZGF0ZSA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIHNlcGVyYXRvcjEgKyBtb250aCArIHNlcGVyYXRvcjEgKyBzdHJEYXRlICsgXFxcIiBcXFwiICsgc3RySG91cnMgKyBzZXBlcmF0b3IyICsgc3RyTWludXRlcyArIHNlcGVyYXRvcjIgKyBzdHJTZWNvbmRzO1xcbiAgICAgICAgICAgIGxldCBjdXJyZW50ZGF0ZSA9IChkYXRlLmdldEZ1bGxZZWFyKCktMjAyMCkrJycrIG1vbnRoICsnJysgc3RyRGF0ZSArJycrIHN0ckhvdXJzKycnICsgc3RyTWludXRlcyArJycrIE1hdGguY2VpbChzdHJTZWNvbmRzLzcpO1xcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChjdXJyZW50ZGF0ZSlcXG4gICAgICAgIH1cXG4kLmV4cG9ydHMuZ2V0Tm93Rm9ybWF0RGF0ZSA9IGdldE5vd0Zvcm1hdERhdGU7XFxuJC5leHBvcnRzLmh0bWxUYWcgPSBodG1sVGFnO1xcbiQuZXhwb3J0cy5zbWFsbCA9IGZ1bmN0aW9uKHRleHQpIHtcXG4gICAgcmV0dXJuIGh0bWxUYWcoXFxcInNtYWxsXFxcIiwgdGV4dCk7XFxufVxcbiQuZXhwb3J0cy5nZXRGaWxlID0gZnVuY3Rpb24oKSB7XFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiKSB8fCBcXFwie31cXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoRmlsZSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBcXFwie31cXFwiKTtcXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuZ2V0VXNlckRhdGUgPWZ1bmN0aW9uKCl7XFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcIikgfHwgXFxcIltdXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEZpbGUpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXCIsIFxcXCJbXVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIFtdO1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5leGlzdEZpbGUgPSBmdW5jdGlvbihzcGF0aCwgaXBhdGgsIGhlYWRlcnMpIHtcXG4gICAgbGV0IHNjb2RlID0gcmVxdWVzdChzcGF0aCk7XFxuICAgIGlmICghc2NvZGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShzcGF0aCwgcmVxdWVzdChpcGF0aCwgaGVhZGVycykpO1xcbiAgICB9XFxufVxcblxcbmxldCBuZXdBcGkgPSB7XFxuICAgIFxcXCJkaXNfbmV3XFxcIjogXFxcIi9oaWtlcnVsZS9uZXdfcnVsZV9kaXNjdXNzL1xcXCIsXFxuICAgIFxcXCJkaXNfdmVyaWZ5XFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvZ2V0X3l6bVxcXCIsXFxuICAgIFxcXCJkaXNfZ2V0XFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvXFxcIixcXG4gICAgXFxcImRpc19zZXRcXFwiOiBcXFwiL2hpa2VydWxlL21vZGlmeS9jYW5fZGlzY3Vzcy9cXFwiLFxcbiAgICBcXFwiZGlzX25ld191c2VyXFxcIjogXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvbmV3X3VzZXJcXFwiLFxcbiAgICBcXFwiZGlzX2xvZ2luXFxcIjpcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy91c2VyX2xvZ2luXFxcIixcXG4gICAgXFxcImRpc19kZXZfZGlzY3Vzc1xcXCI6XFxcIi9oaWtlcnVsZS9tb2RpZnkvZGV2X2Nhbl9kaXNjdXNzXFxcIixcXG4gICAgXFxcImRpc19kZXZfY29udHJvbFxcXCI6XFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvcmVtb3ZlL1xcXCIsXFxuICAgIFxcXCJhbGxfcnVsZVxcXCI6XFxcIi9oaWtlcnVsZS9nZXRfcnVsZXNcXFwiLFxcbiAgICBcXFwiZGlzX2dldF9yZXBseVxcXCI6XFxcIi9oaWtlcnVsZS9nZXRfcmVwbHlfcnVsZV9kaXNjdXNzXFxcIixcXG4gICAgXFxcImRpc19yZXBseVxcXCI6XFxcIi9oaWtlcnVsZS9kZXZfbmV3X3J1bGVfZGlzY3Vzcy9cXFwiLFxcbn1cXG5cXG5mdW5jdGlvbiBzZXRBcGkob2JqZWN0KSB7XFxuICAgIGxldCB0YXJnZXQgPSB7fTtcXG4gICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xcbiAgICAgICAgdGFyZ2V0W2tleV09aG9zdCtvYmplY3Rba2V5XVxcbiAgICB9XFxuICAgIHJldHVybiB0YXJnZXQ7XFxufVxcblxcbiQuZXhwb3J0cy5hcGkgPSBzZXRBcGkobmV3QXBpKTtcXG4kLmV4cG9ydHMuYXBpLmhvc3Q9aG9zdDtcXG4kLmV4cG9ydHMuYXBpLmhvbWU9aG9tZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8gOWPkeiAheeZu+W9lVwiLFwicGF0aFwiOlwiZGV2TG9naW5cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5byA5Y+R6ICF55m75b2VXFxcIik7XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGh0bWxUYWcsXFxuICAgIG1hcENvbFR5cGUsXFxuICAgIHNtYWxsLFxcbmdldEZpbGVcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxudmFyIGRhdGEgPSBbXTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCk9PntcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXCIpO1xcbn0pKVxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCcnKSxcXG4gICAgICAgIHR5cGU6XFxcIm51bWJlclxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0sIHtcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCImbmJzcDsmbmJzcDs8YSBocmVmPSdoaWtlcjovL3BhZ2UvUmVnaXN0ZXInPuazqOWGjDwvYT5cXFwiLFxcbiAgICBjb2xfdHlwZTpcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVfYmxhbmtcXFwiLCAxKTtcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYlxcXCIsIFxcXCLnmbvlvZVcXFwiKSxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKHVybCwgZik9PiB7XFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywgJycpLFxcbiAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2VQYXNzd29yZCcsICcnKTtcXG4gICAgICAgIGlmKHVzZXJuYW1lID09PSBcXFwiXFxcIiAmJiBwYXNzd29yZCA9PT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPt+WSjOWvhueggeS4jeiDveS4uuepulxcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBteVVybCA9IHVybCArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQ7XFxuICAgICAgICBsZXQgY29kZV9zdHIgPSByZXF1ZXN0KG15VXJsKTtcXG4gICAgICAgIGxldCBjb2RlID0gSlNPTi5wYXJzZShjb2RlX3N0cik7XFxuICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgIGYudXNlcm5hbWU9dXNlcm5hbWU7XFxuICAgICAgICAgICAgZi5wYXNzd29yZD1wYXNzd29yZFxcbiAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFwiO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPt+aIluWvhueggemUmeivr1xcXCI7XFxuICAgICAgICB9XFxuICAgIH0sIGdldEFwaShcXFwicnVsZXNBbGxVcmxcXFwiKSx1c2VyKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImljb25fMl9yb3VuZFwiLFwibmFtZVwiOlwi5byA5Y+R6ICF566h55CGXCIsXCJwYXRoXCI6XCJkZXZNYW5hZ2VcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi6KeE5YiZ566h55CGXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAnY2xlYXJWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIixcXFwiXFxcIik7Jyk7XFxuaWYgKGdldFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGJhY2soKTtcXG59XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZXhpc3RGaWxlLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgZGV2XFxufSA9IE1ZX1BBUkFNUztcXG5sZXQge1xcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxufSA9IGdldEZpbGUoKTtcXG4vL2V4aXN0RmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCBcXFwiaHR0cHM6Ly9lcnAuc2N3aW5iYW8uY29tL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5XFxcIik7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZXNBbGxVcmxcXFwiKSArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQpKS5yZXN1bHQ7XFxubGV0IE1PQklMRV9VQSA9ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG5sZXQgaW5mb1NldFVybCA9IGdldEFwaShcXFwiaW5mb1NldFVybFxcXCIpO1xcbmxldCBpbmZvR2V0VXJsID0gZ2V0QXBpKFxcXCJpbmZvR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5sZXQgc2V0dGluZ3NHZXRVcmwgPSBnZXRBcGkoXFxcInNldHRpbmdzR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5wdXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIiwgW3VzZXJuYW1lLCBwYXNzd29yZCwgaW5mb1NldFVybCwgTU9CSUxFX1VBLCBpbmZvR2V0VXJsXS5qb2luKFxcXCIkJFxcXCIpKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGJpZz7ku5PlupPorr7nva48L2JpZz4mbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+77yIIOS4quS6uui1hOaWmSA+77yJPC91Pjwvc21hbGw+JyxcXG4gICAgZGVzYzogJ+KAnOKAnOKAneKAneaCqOWFseaciSA8c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPicgKyBydWxlTGlzdC5sZW5ndGggKyAnPC9zcGFuPicgKyBcXFwiIOadoeinhOWImeOAglxcXFxu54K55Ye76KeE5YiZ5Y+v6L+b6KGM5YiG5Lqr44CB5Yig6Zmk44CB5a+85YWl5pON5L2c5Y+K5p+l55yL6K+m5oOFXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7aWQ6ZGV2LmlkfSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZVxcXCIsIDIpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05pS55YWs5ZGK4pyNXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIC8vIHVybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2VkaXQuaHRtbFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9kZXZJbmZvRWRpdFxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05aSa5YiG5Lqr8J+TslxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICAvL3VybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21vcmVTaGFyZVxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5Y2H57qn5L6d6LWW8J+TpVxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICB1cmw6ICQoXFxcIuWNh+e6p+S8mumHjeaWsOS7juS7k+W6k+aLieWPluebuOWFs+eahOmdmeaAgemhtemdouWIsOacrOWcsFxcXFxu56Gu6K6k5Y2H57qn5ZCXP1xcXCIpLmNvbmZpcm0oKGhvc3QpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOScpKTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDInKSk7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2dldC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDQnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6YeN572u5byA5Y+R6ICF5YiG5LqrLOeugOS7i+afpeeciyznroDku4vnvJbovpHnrYnpnZnmgIHmlofku7ZcXFwiO1xcbiAgICB9LGFwaS5ob3N0KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxubGV0IGRldlNldEJhY2s7XFxudHJ5IHtcXG4gICAgZGV2U2V0QmFjayA9IEpTT04ucGFyc2UocmVxdWVzdChzZXR0aW5nc0dldFVybCkpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gICAgZGV2U2V0QmFjayA9IHt9O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYykge1xcbiAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZykgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMV0gKyBcXFwiXFxcXG5cXFwiICsgcmV0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZylcXG4gICAgfTtcXG4gICAgcmV0dXJuIHRlbXA7XFxufVxcbmlmIChkZXZTZXRCYWNrLnN0YXR1cyA9PSAwKSB7XFxuICAgIGxldCBkZXZTZXR0aW5ncyA9IGRldlNldEJhY2sucmVzdWx0O1xcbiAgICBsZXQgc2hhcmUgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnNoYXJlX3B1YmxpYykge1xcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5YWs5byA5LiK5LygXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOengeiXjylcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHNoYXJlLnVybCA9IGdldEFwaShcXFwiZ3VwbG9hZFxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCArIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIHNoYXJlLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k56eB6JeP5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXCI7XFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcIuW3suengeiXj1xcXCIsIFxcXCLnp4Hol4/lpLHotKVcXFwiXTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNoYXJlLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuengeWvhuS4iuS8oFxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5YWs5byAKVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXCJndXBsb2FkXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTlhazlvIDku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcIjtcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFwi5bey5YWs5byAXFxcIiwgXFxcIuWFrOW8gOWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShzaGFyZSkpO1xcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnRpbWVfb3Zlcikge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi55+t5pe256eY6ZKlXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOawuOS5hSlcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwiZ3RpbWVvdmVyXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li65rC45LmFXFxcIiwgXFxcIuiuvuS4uuawuOS5heWksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5rC45LmF56eY6ZKlXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijov4fmnJ8pXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcImd0aW1lb3ZlclxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uui/h+acn1xcXCIsIFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0odGltZU92ZXIpKTtcXG4gICAgbGV0IGRpc2N1c3MgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLmNhbl9kaXNjdXNzKSB7XFxuICAgICAgICBkaXNjdXNzLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuWFgeiuuOivhOiuulxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5LiN6K64KVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjuS4iuS8oOeahOinhOWImeWFgeiuuOivhOiuuj9cXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5tc2cgPSBbXFxcIuW3suiuvuS4uuS4jeiuuFxcXCIsIFxcXCLorr7nva7lpLHotKVcXFwiXTtcXG5cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5LiN6K646K+E6K66XFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOWFgeiuuClcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIGRpc2N1c3MudXJsID0gYXBpLmRpc19kZXZfZGlzY3VzcyArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXCI7XFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFwi5bey6K6+5Li65YWB6K64XFxcIiwgXFxcIuiuvue9ruWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShkaXNjdXNzKSk7XFxufVxcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVcXFwiLCAyKTtcXG5mb3IgKGxldCBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxuICAgIGxldCBteV90X2V4Y29kZTEgPSAnJztcXG4gICAgbGV0IG15X3RfZXhjb2RlMiA9ICcnO1xcbiAgICBpZiAoaXRlbS5zdGF0ZSAhPSAncHVibGljJykge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICfjipnvuI8nO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICcnO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogbXlfdF9leGNvZGUxICsgaXRlbS5uYW1lICsgbXlfdF9leGNvZGUyLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21hbmFnZVJ1bGUjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxuICAgICAgICAgICAgLy91c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICAgICAgLy9wYXNzd29yZDogcGFzc3dvcmRcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSlcXG59XFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7lv6vmnaXkuIrkvKDkvaDnmoTnrKzkuIDmnaHop4TliJnlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufVxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeivpue7hi1kZXZcIixcInBhdGhcIjpcIm1hbmFnZVJ1bGVcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBnZXRBcGksXFxuICAgICAgICBjb2xvcixcXG4gICAgICAgIHNtYWxsLFxcbiAgICAgICAgZ2V0RmlsZSxcXG4gICAgICAgIGV4aXN0RmlsZSxcXG4gICAgICAgIG1hcENvbFR5cGUsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpLFxcbiAgICAgICAgbWQsXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZFxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHtcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkLFxcbn0gPSBnZXRGaWxlKCk7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRieWlkXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpZCkpLnJlc3VsdDtcXG5zZXRQYWdlVGl0bGUoXFxcIue8lui+keOAjFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAjVxcXCIpO1xcbmxldCByZXFCeUdldCA9IFxcXCI/aWQ9XFxcIiArIGRhdGFJdGVtLmlkICsgXFxcIiZxcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi54mI5pysXFxcIiksXFxuICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ3kupHnq6/niYjmnKw6XFxcIiArIGNvbG9yKGRhdGFJdGVtLnZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuS4iuasoeaPkOS6pOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWImTonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcblxcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIik7XFxuYmFzaWMuZGVzYyA9IFxcXCLmlbDmja7nsbvlnovvvJpcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFwiI2NiNTRmZlxcXCIpICsgXFxcIlxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcbmlmIChbXFxcImh0bWxcXFwiLCBcXFwiY29uZmlnXFxcIiwgXFxcImpzX3VybFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXG4gICAgYmFzaWMuZGVzYyArPSBcXFwiXFxcXG7igJzigJzigJ3igJ0gPT5cXFwiICsgc21hbGwoXFxcIueCueatpOmihOiniFxcXCIpO1xcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG59XFxubGV0IGF1dGggPSBcXFwiXFxcIjtcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gXFxcInByaXZhdGVcXFwiKSB7XFxuICAgIGxldCBhdXRoX2JhY2sgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJhdXRoXFxcIikgKyByZXFCeUdldCkpO1xcbiAgICBiYXNpYy50aXRsZSA9IGJhc2ljLnRpdGxlICsgXFxcIlxcXFxuXFxcIiArIHNtYWxsKGNvbG9yKGF1dGhfYmFjay5yZXN1bHQsIFxcXCJncmV5XFxcIikpO1xcbiAgICBhdXRoID0gJyZhdXRoPScgKyBhdXRoX2JhY2sucmVzdWx0O1xcbiAgICBiYXNpYy51cmwgPSBiYXNpYy51cmwgPT09IFxcXCJoaWtlcjovL2VtcHR5XFxcIiA/IGJhc2ljLnVybCA6IGJhc2ljLnVybCArIGF1dGg7XFxufVxcbmRhdGEucHVzaChiYXNpYyk7XFxubGV0IG5vdGVzID0gcmVxdWVzdChnZXRBcGkoXFxcImdldF9ydWxlX25vdGVcXFwiKSArIGlkKTtcXG5ub3RlcyA9IEpTT04ucGFyc2Uobm90ZXMpLnJlc3VsdDtcXG5yZXF1aXJlKG1kKTtcXG5sZXQgbm90ZXNIdG1sPVxcXCJcXFwiXFxudHJ5e1xcbiAgICBub3Rlc0h0bWw9bWFya2VkLnBhcnNlKG5vdGVzKTtcXG59Y2F0Y2goZSl7fVxcbmlmIChub3RlcyAhPT0gZmFsc2UpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5aSH5rOoXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi5p+l55yL5a6M5pW05YWs5ZGKID5cXFwiKSksXFxuICAgICAgICBkZXNjOiBub3RlcyxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdGV4dDogbm90ZXNIdG1sLFxcbiAgICAgICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxuICAgICAgICAgICAgLy8gdHlwZTogXFxcImxvbmdfdGV4dFxcXCJcXG4gICAgICAgICAgICB0eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLmk43kvZxcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXCJcXG59KTtcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcIlxcXCI7XFxubGV0IHN1YlVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXG4gICAgYmFja0NvZGUgPSByZXF1ZXN0KHN1YlVybCk7XFxufVxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxuICAgIGNhc2UgXFxcImhvbWVfcnVsZV91cmxcXFwiOlxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxuICAgICAgICBpbXBvcnRVcmwgPSBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAncHVibGlzaCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2pzX3VybCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2h0bWwnOlxcbiAgICAgICAgbGV0IGZpbGVfdG1wID0gZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpO1xcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXCIvXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcIiArIGZpbGVfcGF0aCArIFxcXCJAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVha1xcbiAgICBjYXNlIFxcXCJjb25maWdcXFwiOlxcbiAgICAgICAgaW1wb3J0VXJsID0gJCgpLnJ1bGUocGFzc3dvcmQgPT4ge1xcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcImhpa2VyOi8vYXNzZXRzL2hvbWUuanNcXFwiKSk7XFxuICAgICAgICAgICAgSGlrZXJIb21lLmxvYWQoXFxcImltcG9ydFxcXCIsIHBhc3N3b3JkKTtcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5sZXQgbXlfY29sX3R5cGUgPSBcXFwidGV4dF8yXFxcIjtcXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWvvOWFpeinhOWImVxcXCIsXFxuICAgICAgICB1cmw6IGltcG9ydFVybCxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG4gICAgaWYoZGF0YUl0ZW0uaXNfanNvbl9saXN0JiYvaG9tZV9ydWxlX3VybHxodG1sLy50ZXN0KGRhdGFJdGVtLmRhdGFfdHlwZSkpe1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcIkgtXFxcIitkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3I7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXCJKLVxcXCIrZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpWzBdO1xcbiAgICAgICAgICAgICAgICBsZXQgc3ViT2JqID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBzdWJVcmwsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFwiK3RpdGxlK1xcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsLy/npoHnlKjlubblj5Hmm7TmlrBcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcbiAgICAgICAgICAgICAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcIit0aXRsZSsnXFxcXG4nK3VybDtcXG4gICAgICAgICAgICAgICAgY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxuICAgICAgICAgICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4g6K6i6ZiF5a+85YWlKHBhdGgpXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxzdWJVcmwpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuaWYgKHJ1bGVDb2RlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+inhOWImVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJjb3B5Oi8vXFxcIiArIHJ1bGVDb2RlLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYywgcGF0dGVybikge1xcbiAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZywgcGF0dGVybikgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrQSA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrQSk7XFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID8gYmFjaygpIDogcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIG1zZ1swXTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID8gYmFjaygpIDogcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIG1zZ1sxXSArIFxcXCJcXFxcblxcXCIgKyByZXQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnLCBwYXR0ZXJuKVxcbiAgICB9O1xcbiAgICByZXR1cm4gdGVtcDtcXG59XFxuaWYgKGRhdGFJdGVtLnN0YXRlID09ICdwcml2YXRlJykge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLorr7kuLrlhazlvIBcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwic2hhcmVcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiZmbGFnXFxcIiArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suiuvuS4uuWFrOW8gFxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIumaj+acuuWvhumSpVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJnZW5BdXRoXFxcIikgKyByZXFCeUdldCArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgYmFjayA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey55Sf5oiQ6ZqP5py65a+G56CBXFxcXG5cXFwiICsgcmV0LnJlc3VsdFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6ZqP5py65a+G56CB55Sf5oiQ5aSx6LSlXFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgIH0pO1xcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfTtcXG4gICAgaWYgKGRhdGFJdGVtLnRpbWVfb3Zlcikge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi55+t5pe25a+G6ZKlXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOKGkuawuOS5hSlcXFwiLCBcXFwicmVkXFxcIikpO1xcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXCJ0aW1lb3ZlclxcXCIpICsgcmVxQnlHZXQgKyBcXFwiJmZsYWc9MVxcXCI7XFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFwiO1xcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXCLlt7Lorr7kuLrmsLjkuYVcXFwiLCBcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcIl07XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLmsLjkuYXlr4bpkqVcXFwiLCBcXFwicmVkXFxcIikgKyBjb2xvcihcXFwiKOKGkuefreaXtilcXFwiLCBcXFwiZ3JlZW5cXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcInRpbWVvdmVyXFxcIikgKyByZXFCeUdldDtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uui/h+acn1xcXCIsIFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0odGltZU92ZXIpKTtcXG59IGVsc2UgaWYgKGRhdGFJdGVtLnN0YXRlID09ICdwdWJsaWMnKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuiuvuS4uuengeaciVxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJzaGFyZVxcXCIpICsgcmVxQnlHZXQgKyBcXFwiJmZsYWc9MSNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6K6+5Li656eB5pyJXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpOaVsOaNrlxcXCIsXFxuICAgIGNvbmZpcm06IFxcXCLmmK/lkKbnoa7orqTliKDpmaRcXFwiLFxcbiAgICBtc2c6IFtcXFwi5bey5Yig6ZmkXFxcIiwgXFxcIuWIoOmZpOWksei0pVxcXCJdLFxcbiAgICB1cmw6IGdldEFwaShcXFwiZGVsZXRlVXJsXFxcIikgKyByZXFCeUdldCxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSwgdHJ1ZSkpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K6+572u5Zu+5qCHXFxcIixcXG4gICAgdXJsOiAkKGRhdGFJdGVtLnBpY191cmwsIFxcXCLovpPlhaXlm77moIflnLDlnYBcXFwiKS5pbnB1dChhcGkgPT4ge1xcbiAgICAgICAgaWYgKGlucHV0ID09PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDlnKjpgJfmiJHpk77mjqXlk6o/XFxcIlxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYXBpICsgXFxcIiZydWxlX3BpYz1cXFwiICsgaW5wdXQpO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgfSwgZ2V0QXBpKFxcXCJzZXRfcnVsZV9waWNcXFwiKSArIGRhdGFJdGVtLmlkICsgcmVxQnlHZXQpLFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uY2FuX2Rpc2N1c3MgPyBcXFwi56aB5q2i6K+E6K66XFxcIiA6IFxcXCLlvIDlkK/or4TorrpcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19zZXQgKyBkYXRhSXRlbS5pZCArIHJlcUJ5R2V0ICsgXFxcIiZzdGF0ZT1cXFwiICsgKGRhdGFJdGVtLmNhbl9kaXNjdXNzID8gXFxcIlxcXCIgOiAxKSkubGF6eVJ1bGUoKGNhbl9kaXNjdXNzKSA9PiB7XFxuICAgICAgICByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBjYW5fZGlzY3VzcyA/IFxcXCJ0b2FzdDovL+W3suemgeatouivhOiuulxcXCIgOiBcXFwidG9hc3Q6Ly/lt7LlvIDlkK/or4TorrpcXFwiO1xcbiAgICB9LCBkYXRhSXRlbS5jYW5fZGlzY3VzcyksXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbn0pO1xcbk1ZX1BBUkFNUy5uYW1lID0gZGF0YUl0ZW0ubmFtZTtcXG5NWV9QQVJBTVMudXNlcm5hbWU9dXNlcm5hbWU7XFxuTVlfUEFSQU1TLnBhc3N3b3JkPXBhc3N3b3JkO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K6+572u5aSH5rOoXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3NldF9ydWxlX25vdGVzXFxcIixcXG4gICAgZXh0cmE6IE1ZX1BBUkFNUyxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSk7XFxuaWYgKGRhdGFJdGVtLmlzX2pzb24gJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfov5vlhaXpopHpgZMnLFxcbiAgICAgICAgdXJsOiAkKCAvKlxcXCIjbm9Mb2FkaW5nI1xcXCIqLyApLmxhenlSdWxlKChuYW1lLGhvbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoaG9tZSkpO1xcbiAgICAgICAgICAgIGxldCBoYXNSdWxlID0gcnVsZUxpc3Quc29tZShpdGVtID0+IGl0ZW0udGl0bGUgPT09IG5hbWUpO1xcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXCJzQFxcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrlronoo4VcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuivhOiuulxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1JlcGx5I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0uYXV0aG9yLFxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lXFxuICAgIH1cXG59KTtcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLor4TorrooXFxcIiArIHRvdGFsU3VtICsgXFxcIilcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlhajpg6jor4Torroo5o6n6K+EKSA+XFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxuICAgICAgICBub19hY3RpdmU6IHRydWUsXFxuICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmRcXG4gICAgfVxcbn0pO1xcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxubGV0IGljb24gPSB7XFxuICAgIFxcXCJnb29kXFxcIjogXFxcIvCfkY1cXFwiLFxcbiAgICBcXFwiYmFkXFxcIjogXFxcIvCfkY5cXFwiLFxcbiAgICBcXFwicmVwbHlcXFwiOiBcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXCI/bGltaXQ9NVxcXCIpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgcmVwbHlJZDppdGVtLmlkXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgdHlwZTogXFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuinhOWImeWIl+ihqFwiLFwicGF0aFwiOlwicnVsZXNcIixcInJ1bGVcIjpcImpzOlxcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsJC50b1N0cmluZygoKT0+e1xcbiAgICAgICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIik7XFxuICAgICAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmZpbHRlclxcXCIpO1xcbiAgICAgICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIik7XFxuICAgICAgICBpZihnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywnJykpe1xcbiAgICAgICAgICAgIGxvZygn5pON5L2c6L+H56aB5q2i5LiK5LygOicrZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcpKTtcXG4gICAgICAgICAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNhbl91cGxvYWRcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIH1cXG4gICAgfSkpO1xcblxcbmlmIChnZXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIikgPT09IFxcXCIxXFxcIikge1xcbiAgICBiYWNrKGZhbHNlKTtcXG59XFxuXFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGFwaSxcXG4gICAgY29sb3IsXFxuICAgIHNtYWxsLFxcbiAgICBsb2NhbFJ1bGVWZXIsXFxuICAgIGh0bWxUYWcsXFxuICAgIG1kXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmNvbnN0IHsgbm9ybWFsU29ydCB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXCIpO1xcbmxldCB7XFxuICAgIGF2YXRhclVybCxcXG4gICAgcXEsXFxuICAgIGlkLFxcbiAgICBjYW5fdXBsb2FkXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIixcXFwiXFxcIik7XFxubGV0IGJhY2tDb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZXNVcmxcXFwiKSArIFxcXCI/bmFtZT1cXFwiICsgcXErXFxcIiZkYXRhX3R5cGU9XFxcIitkYXRhVHlwZSkpO1xcbmxldCBkZXZOYW1lID0gYmFja0NvZGUuZGV2X25hbWU7XFxucHV0VmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIiwgZGV2TmFtZSk7XFxubGV0IHJ1bGVMaXN0ID0gYmFja0NvZGUucmVzdWx0O1xcbmxldCBzdWJVcmwgPSBnZXRBcGkoXFxcImpzb25MaXN0XFxcIikgKyBcXFwiP25hbWU9XFxcIiArIHFxO1xcbmxldCBoYXNTdWIgPSBoYXNIb21lU3ViKHN1YlVybCk7XFxubGV0IGRldkluZm8gPSBcXFwi6L+Z5Liq5Lq65b6I5oeSLOS7gOS5iOmDveayoeWGmeWTpn5cXFwiO1xcbmxldCB0bXBKc29uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiaW5mb0dldFVybFxcXCIpICsgcXEpKTtcXG5pZiAodG1wSnNvbi5zdGF0dXMgPT0gMCkge1xcbiAgICBkZXZJbmZvID0gdG1wSnNvbi5yZXN1bHQgfHwgZGV2SW5mbztcXG59XFxubGV0IHN1YkZsYWcgPSBoYXNTdWIgPyAn8J+GlycgOiAn8J+ToSc7XFxubGV0IGRhdGEgPSBbXTtcXG5yZXF1aXJlKG1kKTtcXG5kZXZJbmZvPW1hcmtlZC5wYXJzZShkZXZJbmZvKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBkZXZOYW1lICsgXFxcIlxcXFxuXFxcXG5cXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLngrnlh7vmn6XnnIvlrozmlbTlhazlkYpcXFwiKSksXFxuICAgIGRlc2M6IHNtYWxsKGRldkluZm8pLFxcbiAgICB1cmw6ICdoaWtlcjovL3BhZ2UvaW5mbycsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0OiBkZXZJbmZvLFxcbiAgICAgICAgbmFtZTogZGV2TmFtZSxcXG4gICAgICAgIHR5cGU6XFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSxcXG4gICAgcGljX3VybDogYXZhdGFyVXJsLFxcbiAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7orqLpmIXnrqHnkIY8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOW9k+WJjVxcXCIgKyAoaGFzU3ViID8gXFxcIuW3suiuoumYhVxcXCIgOiBcXFwi5pyq6K6i6ZiFXFxcIikgKyBcXFwiKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxuXFxubGV0IHN1Yl9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRldk5hbWUgKyBcXFwi5ZCI6ZuGQEBcXFwiICsgc3ViVXJsO1xcbmxldCBydWxlc0NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ77+laG9tZV9ydWxlX3VybO+/pScgKyBzdWJVcmw7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuS4gOmUruiuoumYhTwvc3Bhbj4nLFxcbiAgICBkZXNjOiAn6K6i6ZiF4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjNWNmZjJjXFxcIj4nICsgZGV2TmFtZSArICc8L3NwYW4+55qE5omA5pyJ5Y2V6KeE5YiZ77yM5ZCI6ZuG6ZyA5Y2V54us6K6i6ZiFJyxcXG4gICAgdXJsOiBzdWJfY29kZSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpeWFqOmDqDwvc3Bhbj4nLFxcbiAgICB1cmw6IHJ1bGVzQ29kZSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGV2TmFtZSxzdWJVcmwsYXZhdGFyVXJsKT0+e1xcbiAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXCIpO1xcbiAgICAgICAgbG9nKFxcXCLovbvlkIjpm4blm77moIfpk77mjqU6XFxcIithdmF0YXJVcmwpO1xcbiAgICAgICAgbGV0IGltcG9ydF9ydWxlPWdlblJ1bGUoXFxcIui9u+WQiOmbhi5cXFwiK2Rldk5hbWUsc3ViVXJsLGF2YXRhclVybCk7XFxuICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIilbMF0pO1xcbiAgICAgICAgLy9yZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXG4gICAgICAgIGxldCB0aXRsZSA9IFxcXCJILVxcXCIrZGV2TmFtZTtcXG4gICAgICAgIGxldCBzdWJPYmogPSB7XFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgIHVybDogc3ViVXJsLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXCIrdGl0bGUrXFxcIi5qc29uXFxcIixcXG4gICAgICAgICAgICBjb2RlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLC8v56aB55So5bm25Y+R5pu05pawXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcbiAgICAgICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcbiAgICAgICAgdmFyIHVybCA9IHNoYXJlUGFzdGUoc2hhcmVUZXh0LHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcbiAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcIit0aXRsZSsnXFxcXG4nK3VybDtcXG4gICAgICAgIGNvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgY29uc3QgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL3N1Yi5qc29uJztcXG4gICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcbiAgICAgICAgcmV0dXJuIOiuoumYheWvvOWFpShwYXRoKVxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcbmxldCBjYW5fdXBsb2FkX2FwaSA9IGdldEFwaShcXFwibWFuQ2FuVXBsb2FkXFxcIikraWQ7XFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcbiAgICBsZXQgdGlwcyA9IGNhbl91cGxvYWQ/J+iDvSc6J+WQpic7XFxuICAgIC8vIGxvZygndGlwczonK3RpcHMpO1xcbiAgICAvLyBsb2coJ2Nhbl91cGxvYWQ6JytjYW5fdXBsb2FkKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimqDog73lkKbkuIrkvKA6JysoZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcpfHx0aXBzKSxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDonaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSk7XFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLGNhbl91cGxvYWRfYXBpKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChjYW5fdXBsb2FkX2FwaSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiY2FuX3VwbG9hZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfmqvnpoHmraLkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+emgeatouivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZChmYWxzZSxjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCflkKYnKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXlhYHorrjkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+WFgeiuuOivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZCh0cnVlLGNhbl91cGxvYWRfYXBpKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsJ+aYrycpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7op4TliJnliJfooag8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOWFsVxcXCIgKyBydWxlTGlzdC5sZW5ndGggKyBcXFwi5p2hKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGV0IGRhdGFUeXBlTGlzdCA9IHtcXG4gICAgXFxcIlxcXCI6XFxcIuWFqOmDqFxcXCIsXFxuICAgIFxcXCJob21lX3J1bGVfdXJsXFxcIjogJ+Wwj+eoi+W6jycsXFxuICAgIC8vXFxcInB1Ymxpc2hcXFwiOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAgXFxcImpzX3VybFxcXCI6ICfnvZHpobXmj5Lku7YnLFxcbiAgICBcXFwiaHRtbFxcXCI6ICfpnZnmgIHpobXpnaInLFxcbiAgICBcXFwiY29uZmlnXFxcIjogJ+S4u+mimCdcXG59O1xcbmZvcihsZXQga2V5IGluIGRhdGFUeXBlTGlzdCl7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpkYXRhVHlwZT09PWtleT9cXFwi4oCc4oCcXFxcIitkYXRhVHlwZUxpc3Rba2V5XStcXFwi4oCd4oCdXFxcIjpkYXRhVHlwZUxpc3Rba2V5XSxcXG4gICAgICAgIHVybDokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXkpPT57XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIsa2V5KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sa2V5KSxcXG4gICAgICAgIGNvbF90eXBlOlxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA+IDIwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5b2T5YmN5byA5Y+R6ICF55qE6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXFxuICAgICAgICB9LFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxuICAgIH0pO1xcbn1cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG5pZihnZXRJdGVtKFxcXCLmjpLluo9cXFwiLFxcXCLml7bpl7TkvJjlhYhcXFwiKT09PSfmlrDniYjkvJjlhYgnKXtcXG4gICAgbVJ1bGVMaXN0ID0gbm9ybWFsU29ydChtUnVsZUxpc3QpO1xcbn1cXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXG5zZXRSZXN1bHQoZGF0YSk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnor6bnu4YtdXNlclwiLFwicGF0aFwiOlwicnVsZURldGFpbFwiLFwicnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGdldEFwaSxcXG4gICAgICAgIGNvbG9yLFxcbiAgICAgICAgc21hbGwsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpLFxcbiAgICAgICAgbWRcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBsdmVyLFxcbiAgICBpc0FsbFxcbn0gPSBNWV9QQVJBTVM7XFxuaWYoZ2V0UGFyYW0oXFxcImlkXFxcIikpe1xcbiAgICBpc0FsbD10cnVlO1xcbiAgICBpZD1nZXRQYXJhbShcXFwiaWRcXFwiKTtcXG4gICAgbHZlcj1sdmVyfHwn5pyq6I635Y+W54mI5pys5Y+3JztcXG59XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcbiAgICBpZighaXNBbGwpe1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9XFxufSxpc0FsbCkpO1xcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImdldGJ5aWRcXFwiKSArIFxcXCI/aWQ9XFxcIiArIGlkKSkucmVzdWx0O1xcbnNldFBhZ2VUaXRsZShcXFwi44CMXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CNXFxcIilcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbnZhciBoYXNTdWIgPSBmYWxzZTtcXG5cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnKTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLniYjmnKxcXFwiKSxcXG4gICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneW8gOWPkeiAhe+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS5hdXRob3IsIFxcXCIjMjI4QkU2XFxcIikgKyBcXFwiXFxcXG7kupHnq6/niYjmnKzvvJpcXFwiICsgY29sb3IoZGF0YUl0ZW0udmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFx0XFxcXHTmnKzlnLDniYjmnKzvvJpcXFwiICsgY29sb3IobHZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuabtOaWsOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOacrOWcsOeJiOacrD5cXFxcblxcXCIgKyBsdmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWIme+8micgKyBkYXRhSXRlbS5kYXRhX3R5cGU7XFxuXFxubGV0IHNhZmVfdGlwPWRhdGFJdGVtLmlzX3NhZmU/XFxcIuWuieWFqFxcXCI6XFxcIuWNsemZqVxcXCI7XFxubGV0IGdvb2RfdGlwID0gZGF0YUl0ZW0uaXNfZ29vZD9zbWFsbChjb2xvcihcXFwi44CQ5LyY6LSo6KeE5YiZ44CRXFxcIiwnI2ZmNzAwMCcpKTpcXFwiXFxcIjtcXG5sZXQgbm90X3NhZmVfbm90ZT1kYXRhSXRlbS5ub3Rfc2FmZV9ub3RlO1xcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIikrXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKOmjjumZqeajgOa1izpcXFwiICtzYWZlX3RpcCtcXFwiKVxcXCIpK2dvb2RfdGlwO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcblxcbmRhdGEucHVzaChiYXNpYyk7XFxubGV0IGhhc1N1YnMgPSBcXFwiXFxcIjtcXG5pZiAoaGFzU3ViKSB7XFxuICAgIGhhc1N1YnMgPSBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCLlt7LorqLpmIVcXFwiKVxcbn1cXG5cXG5sZXQgbm90ZXMgPSByZXF1ZXN0KGdldEFwaShcXFwiZ2V0X3J1bGVfbm90ZVxcXCIpICsgaWQpO1xcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcbnJlcXVpcmUobWQpO1xcbmxldCBub3Rlc0h0bWw9XFxcIlxcXCJcXG50cnl7XFxuICAgIG5vdGVzSHRtbD1tYXJrZWQucGFyc2Uobm90ZXMpO1xcbn1jYXRjaChlKXt9XFxuXFxuaWYgKG5vdGVzICE9PSBmYWxzZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLlpIfms6hcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlrozmlbTlhazlkYogPlxcXCIpKSxcXG4gICAgICAgIGRlc2M6IG5vdGVzLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0ZXh0OiBub3Rlc0h0bWwsXFxuICAgICAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAvLyB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIlxcbiAgICAgICAgICAgIHR5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuaTjeS9nFxcXCIpICsgaGFzU3VicyxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXCJcXG59KTtcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcIlxcXCI7XFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxufVxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxuICAgIGNhc2UgXFxcImhvbWVfcnVsZV91cmxcXFwiOlxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShydWxlQ29kZSlcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdwdWJsaXNoJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8micgKyBkYXRhSXRlbS5uYW1lICsgJ++/pXB1Ymxpc2jvv6UnICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnaHRtbCc6XFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxuICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZV90bXAubGVuZ3RoID4gMSA/IGZpbGVfdG1wW2ZpbGVfdG1wLmxlbmd0aCAtIDFdICsgXFxcIi9cXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFwiICsgZmlsZV9wYXRoICsgXFxcIkBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWtcXG4gICAgY2FzZSBcXFwiY29uZmlnXFxcIjpcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcIikpO1xcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXCJpbXBvcnRcXFwiLCBwYXNzd29yZCk7XFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxuICAgICAgICBicmVhaztcXG59XFxubGV0IG15X2NvbF90eXBlID0gXFxcInRleHRfMlxcXCI7XFxubGV0IG15X2NvbF90eXBlMiA9IFxcXCJ0ZXh0XzNcXFwiO1xcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogZGF0YUl0ZW0uaXNfc2FmZT9pbXBvcnRVcmw6J3RvYXN0Oi8v6aOO6Zmp6KeE5YiZ56aB5q2i5a+85YWlISEhJyxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVDb2RlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+WPo+S7pFxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJjb3B5Oi8vXFxcIiArIHJ1bGVDb2RlLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5cXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1Yikge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheWQiOmbhicsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3Isc3ViVXJsKTtcXG4gICAgICAgICAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIilbMF0pO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcIkgtXFxcIitkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3I7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXCJKLVxcXCIrZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpWzBdO1xcbiAgICAgICAgICAgICAgICBsZXQgc3ViT2JqID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBzdWJVcmwsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFwiK3RpdGxlK1xcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsLy/npoHnlKjlubblj5Hmm7TmlrBcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcbiAgICAgICAgICAgICAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcIit0aXRsZSsnXFxcXG4nK3VybDtcXG4gICAgICAgICAgICAgICAgY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxuICAgICAgICAgICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4g6K6i6ZiF5a+85YWlKHBhdGgpXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiPHNtYWxsPuaPkOekuu+8muW8gOWPkeiAheWNleeLrOWIhuS6q+eahOWQiOmbhuaWh+S7tuWPquiDveWNleeLrOWvvOWFpeOAgjwvc21hbGw+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2UgaWYgKCFkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1YiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzljZXop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcIkBAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJztcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheinhOWImScsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICAgICAgfSlcXG4gICAgfVxcbn1cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxuICAgICAgICB1cmw6ICQoIC8qXFxcIiNub0xvYWRpbmcjXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSBydWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcInNAXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acquWuieijhVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSlcXG59XFxubGV0IG1hbl9ydWxlX3NhZmUgPSBnZXRBcGkoXFxcIm1hblJ1bGVTYWZlXFxcIikrZGF0YUl0ZW0uaWQ7XFxubGV0IG1hbl9ydWxlX2dvb2QgPSBnZXRBcGkoXFxcIm1hblJ1bGVHb29kXFxcIikrZGF0YUl0ZW0uaWQ7XFxuLy8gZGF0YUl0ZW0uaXNfc2FmZTtcXG5pZihnZXRWYXIoJ2hvdXNlLmlzX21hbmFnZXInKSl7XFxuICAgIGZ1bmN0aW9uIHNldElzU2FmZShmbGFnLG1hbl9ydWxlX3NhZmUpIHtcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX3NhZmUsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImlzX3NhZmVcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZnVuY3Rpb24gc2V0SXNHb29kKGZsYWcsbWFuX3J1bGVfZ29vZCkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfZ29vZCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfZ29vZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/Cfmqvpo47pmaknLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumjjumZqT/po47pmanop4TliJnml6Dms5Xooqvlr7zlhaUnKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKGZhbHNlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pyF5q2j5bi4JyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrmraPluLg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZSh0cnVlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pml6Z2e5LyY6LSoJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpnZ7kvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZChmYWxzZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfkpbkvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKHRydWUsbWFuX3J1bGVfZ29vZCk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcbiAgICB9KTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5nb29kX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/otZ4uc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgZGVmYXVsdFR5cGU6XFxcImJhZFxcXCJcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K+E6K66XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLor4TorrooXFxcIiArIHRvdGFsU3VtICsgXFxcIilcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlhajpg6jor4TorrogPlxcXCIpKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvQ29tbWVudFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5I2Z5cGFnZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgdG90YWxTdW06IHRvdGFsU3VtLFxcbiAgICAgICAgbm9fYWN0aXZlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6XFxcIuW8gOWPkeiAhfCfl6NcXFwiXFxufVxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgZGF0YUl0ZW0uaWQgKyBcXFwiP2xpbWl0PTVcXFwiKSkucmVzdWx0O1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXCJyZXBseVxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcIuKAmOKAmOWbnuWkjUBcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFwiICNcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFwi4oCZ4oCZXFxcXG5cXFwiOlxcXCJcXFwiO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgLy91cmw6IFxcXCJ0b2FzdDovL1xcXCIgKyBpdGVtLnFxLFxcbiAgICAgICAgICAgIHVybDpcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFwiK2l0ZW0ucXEsXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJyaWNoX3RleHRcIixcIm5hbWVcIjpcIuafpeeci1wiLFwicGF0aFwiOlwiaW5mb1wiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLmn6XnnIvjgIxcXFwiK01ZX1BBUkFNUy5uYW1lK1xcXCLjgI1cXFwiKVxcbnNldFJlc3VsdChbe1xcbiAgICB0aXRsZTogTVlfUEFSQU1TLnRleHQsXFxuICAgIGNvbF90eXBlOk1ZX1BBUkFNUy50eXBlXFxufV0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5byA5Y+R6ICF5rOo5YaMXCIsXCJwYXRoXCI6XCJSZWdpc3RlclwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLlvIDlj5HogIXms6jlhoxcXFwiKTtcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgaHRtbFRhZyxcXG4gICAgbWFwQ29sVHlwZSxcXG4gICAgc21hbGxcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxudmFyIGRhdGEgPSBbXTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLlBhc3N3b3JkXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuVXNlcm5hbWVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5EZXNjcmlwdGlvblxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcIik7XFxufSkpO1xcbmFkZExpc3RlbmVyKCdvblJlZnJlc2gnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLldhaXRcXFwiLCBcXFwiXFxcIik7XFxufSkpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn6LSm5Y+3JyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpei0puWPtyjlv4XloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlVzZXJuYW1lJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLlVzZXJuYW1lXFxcIixpbnB1dCknXFxuICAgIH1cXG59LCB7XFxuICAgIHRpdGxlOiAn5a+G56CBJyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpeWvhueggSjlv4XloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlBhc3N3b3JkJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuUGFzc3dvcmRcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVfYmxhbmtcXFwiLCAxKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+aYteensCcsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXmmLXnp7Ao5b+F5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VyQWRkcmVzcycsICcnKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0sIHtcXG4gICAgdGl0bGU6ICfmj4/ov7AnLFxcbiAgICBkZXNjOiBcXFwi6K+06K+05Li65LuA5LmI6KaB5rOo5YaM5ZCnXFxcXG4o5Y+v5Lul5aKe5Yqg6YCa6L+H5qaC546HLOmAieWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuRGVzY3JpcHRpb24nLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5EZXNjcmlwdGlvblxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSlcXG5cXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lX2JsYW5rXFxcIiwgMSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJcXFwiLCBcXFwi5rOo5YaMXFxcIiksXFxuICAgIHVybDogJChnZXRBcGkoXFxcIm5ld19kZXZcXFwiKStcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZ2V0SWQsIGNvbmZpcm0pID0+IHtcXG4gICAgICAgIGxldCB1c2VybmFtZSA9IGdldFZhcignV2FyZWhvdXNlLlVzZXJuYW1lJywgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UuUGFzc3dvcmQnLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBnZXRWYXIoJ1dhcmVob3VzZS5EZXNjcmlwdGlvbicsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBuYW1lID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoW3VzZXJuYW1lLCBwYXNzd29yZCwgbmFtZV0uaW5jbHVkZXMoXFxcIlxcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+i0puWPtyzlr4bnoIHlkozmmLXnp7DkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOaPkOS6pOeUs+ivt+ihqFxcXCIpO1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJyZWFzb25cXFwiOiBkZXNjcmlwdGlvbixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IHBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogdXNlcm5hbWVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaWRyZXN1bHQgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0SWQgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSkpO1xcbiAgICAgICAgaWYgKGlkcmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgaWRyZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgXFxuICAgICAgICByZXR1cm4gJChcXFwiXFxcIiwgXFxcIui+k+WFpemCrueusemqjOivgeeggVxcXFxuXFxcIiArIHJlc3VsdC5kZXRhaWwpLmlucHV0KChjb25maXJtLCBpZCwgYWNjb3VudCkgPT4ge1xcbiAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLor7fogJDlv4PnrYnlvoVcXFwiKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChjb25maXJtLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicmVnaXN0X2lkXFxcIjogaWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ5em1cXFwiOiBpbnB1dFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXCIsIGFjY291bnRbMF0pO1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXCIsIGFjY291bnRbMV0pO1xcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/miJDlip/mj5DkuqTms6jlhozms6jlhoxcXFxcblxcXCIrcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WHuumUmeS6huWRkFxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgY29uZmlybSwgaWRyZXN1bHQucmVzdWx0LCBbdXNlcm5hbWUsIHBhc3N3b3JkXSk7XFxuICAgIH0sIGdldEFwaShcXFwibmV3X2dldElkXFxcIiksIGdldEFwaShcXFwibmV3X2NvbmZpcm1cXFwiKSksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJ0ZXh0XzFcIixcIm5hbWVcIjpcIuS4quS6uui1hOaWmVwiLFwicGF0aFwiOlwiUGVyc29uYWxEYXRhXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuS4quS6uui1hOaWmVxcXCIpO1xcbnZhciBkYXRhPVtdO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBnZXRGaWxlLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuXFxubGV0IHt1c2VybmFtZSxwYXNzd29yZH0gPSBnZXRGaWxlKCk7XFxubGV0IGRldiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInVzZXJcXFwiKStNWV9QQVJBTVMuaWQpKS5yZXN1bHQ7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuWktOWDj1xcXCIsXFxuICAgIGRlc2M6ZGV2LmF2YXRhcixcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBkZXY6ZGV2LFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXG4gICAgICAgIFBhdHRlcm46MFxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcblxcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLmmLXnp7BcXFwiLFxcbiAgICBkZXNjOmRldi5uYW1lLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntcXG4gICAgICAgIGRldjpkZXYsXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcbiAgICAgICAgUGF0dGVybjoxXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuWvhueggVxcXCIsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6e1xcbiAgICAgICAgZGV2OmRldixcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxuICAgICAgICBQYXR0ZXJuOjJcXG4gICAgfSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi6LSm5Y+377yaXFxcIit1c2VybmFtZSxcXG4gICAgdXJsOlxcXCJjb3B5Oi8vXFxcIit1c2VybmFtZSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwiVUlE77yaXFxcIitkZXYuaWQsXFxuICAgIHVybDpcXFwiY29weTovL1xcXCIrZGV2LmlkLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFwiLFxcbiAgICB1cmw6JChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaG9zdCk9PntcXG4gICAgICAgIGxldCBjb2RlPXJlcXVlc3QoaG9zdCtcXFwiL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MTQ1XFxcIik7XFxuICAgICAgICBsZXQgd29yZD1cXFwi77+lcHVibGlzaO+/pVxcXCIrYmFzZTY0RW5jb2RlKGNvZGUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJydWxlOi8vXFxcIitiYXNlNjRFbmNvZGUod29yZCk7XFxuICAgIH0sYXBpLmhvc3QpLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLlkIzmraXmj5DkuqTkupHku5PlupPotKblj7flr4bnoIFcXFwiLFxcbiAgICB1cmw6XFxcInJ1bGU6Ly9cXFwiK2Jhc2U2NEVuY29kZShcXFwi77+lcHVibGlzaF9hY2NvdW5077+lXFxcIit1c2VybmFtZStcXFwiQFxcXCIrcGFzc3dvcmQpLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLkvaDkuIDlhbHlj5HluIPkuobjgIxcXFwiK2Rldi5ydWxlX251bStcXFwi44CN5p2h6KeE5YiZXFxcIixcXG4gICAgdXJsOlxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5rOo6ZSA55m75b2VXFxcIixcXG4gICAgdXJsOiQoXFxcIuehruiupOazqOmUgOeZu+W9lT9cXFwiKS5jb25maXJtKGYgPT4ge1xcbiAgICAgICAgZi51c2VybmFtZT1cXFwiXFxcIjtcXG4gICAgICAgIGYucGFzc3dvcmQ9XFxcIlxcXCI7XFxuICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uJywgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsXFxcIjFcXFwiKTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lms6jplIBcXFwiO1xcbiAgICB9LHVzZXIpLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmm7TmlLnkuKrkurrotYTmlplcIixcInBhdGhcIjpcIm1vZGlmeV9QZXJzb25hbERhdGFcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGdldEZpbGUsXFxuICAgIGh0bWxUYWdcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgZGV2LFxcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIFBhdHRlcm5cXG59ID0gTVlfUEFSQU1TO1xcbnZhciBkYXRhID0gW107XFxubGV0IHBhdGggPSBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5wZXROYW1lXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5hdmF0YXJcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLmNcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnhcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnlcXFwiKTtcXG59KSk7XFxuZnVuY3Rpb24gbV9wZXROYW1lKCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeaWsOaYteensFxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnBldE5hbWUnLCAnJyl8fGRldi5uYW1lLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5wZXROYW1lXFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcIm1vZGlmeV9uYW1lXFxcIikgKyBwYXRoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IG5ld1BldE5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnBldE5hbWUnLCAnJyk7XFxuICAgICAgICAgICAgaWYgKG5ld1BldE5hbWUgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWhq+WViiFcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXCImbmFtZT1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld1BldE5hbWUpKTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBtX2F2YXRhcigpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXmlrDnmoTlpLTlg4/pk77mjqVcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5hdmF0YXInLCAnJykgfHwgZGV2LmF2YXRhcixcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uYXZhdGFyXFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcIm1vZGlmeV9hdmFcXFwiKSArIHBhdGgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgbmV3QXZhdGFyID0gZ2V0VmFyKCdXYXJlaG91c2UubS5hdmF0YXInLCAnJyk7XFxuICAgICAgICAgICAgXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFwiJmF2YXRhcl91cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdBdmF0YXIpKTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBtX3B3ZCgpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi5Y6f5a+G56CBXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeWOn+WvhueggVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHR5cGU6XFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueScsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueVxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi5paw5a+G56CBXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeaWsOWvhueggVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHR5cGU6XFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueCcsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueFxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOlxcXCLph43lpI3mlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36YeN5aSN5paw5a+G56CBXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTpcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLmMnLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLmNcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwibW9kaWZ5X3B3ZFxcXCIpK3BhdGgpLmxhenlSdWxlKChwYXNzd29yZCx1c2VybmFtZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBvbGRfcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLnknLCAnJyk7XFxuICAgICAgICAgICAgbGV0IG5ld19wYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueCcsICcnKTtcXG4gICAgICAgICAgICBsZXQgbmV3X3Bhc3N3b3JkX2FnYWluID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC5jJywgJycpO1xcbiAgICAgICAgICAgIGlmIChvbGRfcGFzc3dvcmQhPT1wYXNzd29yZCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Y6f5a+G56CB6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYobmV3X3Bhc3N3b3JkPT09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5paw5a+G56CBXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYobmV3X3Bhc3N3b3JkIT09bmV3X3Bhc3N3b3JkX2FnYWluKXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S4pOasoeWvhueggeS4jeWQjFxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFwiJm5ld19wYXNzd29yZD1cXFwiICsgbmV3X3Bhc3N3b3JkK1xcXCImbmV3X3Bhc3N3b3JkX3JlPVxcXCIrbmV3X3Bhc3N3b3JkX2FnYWluKTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDpuZXdfcGFzc3dvcmRcXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LHBhc3N3b3JkLHVzZXJuYW1lKSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSk7XFxufVxcblxcbnN3aXRjaCAoUGF0dGVybikge1xcbiAgICBjYXNlIDA6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuS/ruaUueWktOWDj1xcXCIpO1xcbiAgICAgICAgbV9hdmF0YXIoKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIDE6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuS/ruaUueaYteensFxcXCIpO1xcbiAgICAgICAgbV9wZXROYW1lKCk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAyOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLkv67mlLnlr4bnoIFcXFwiKTtcXG4gICAgICAgIG1fcHdkKCk7XFxuICAgICAgICBicmVhaztcXG59XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi57yW6L6R6KeE5YiZ5aSH5rOoXCIsXCJwYXRoXCI6XCJzZXRfcnVsZV9ub3Rlc1wiLFwicnVsZVwiOlwianM6XFxubGV0IGRhdGEgPSBbXTtcXG5jb25zdCB7XFxuICAgIGdldEFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZCxcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkLFxcbiAgICBuYW1lXFxufSA9IE1ZX1BBUkFNUztcXG5zZXRQYWdlVGl0bGUoXFxcIuWkh+azqOOAjFxcXCIrbmFtZStcXFwi44CNXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLFxcXCJjbGVhclZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJylcXFwiKTtcXG5sZXQgbm90ZXM9cmVxdWVzdChnZXRBcGkoXFxcImdldF9ydWxlX25vdGVcXFwiKStpZCk7XFxubm90ZXM9SlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcbmRhdGEucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLop4TliJnlpIfms6guLi4uLi5cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJyl8fG5vdGVzfHxcXFwiXFxcIixcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6LTEsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLnJ1bGUubm90ZXNcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKGdldEFwaShcXFwic2V0X3J1bGVfbm90ZVxcXCIpICsgaWQpLmxhenlSdWxlKCh1c2VybmFtZSwgcGFzc3dvcmQpID0+IHtcXG4gICAgICAgIGxldCBub3RlcyA9IGdldFZhcignV2FyZWhvdXNlLnJ1bGUubm90ZXMnLCAnJyk7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogdXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJub3RlXFxcIjpub3Rlc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgfSwgdXNlcm5hbWUsIHBhc3N3b3JkKVxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImxpbmVcIixcIm5hbWVcIjpcIuivhOiuuuWIl+ihqFwiLFwicGF0aFwiOlwiQ29tbWVudFwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLor4TorrrliJfooahcXFwiKTtcXG5jb25zdCB7XFxuICAgIGFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmxldCB7XFxuICAgIHRvdGFsU3VtLFxcbiAgICBpZCxcXG4gICAgbm9fYWN0aXZlLFxcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmRcXG59ID0gTVlfUEFSQU1TO1xcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0pO1xcbmxldCBkaXNjdXNzX3R5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJcXFwiKTtcXG5pZiAocGFnZSA9PT0gMSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICB9KSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWFqOmDqFxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwiXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcblxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+Rjei1nlxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwiZ29vZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiZ29vZFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLwn5GO6LipXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJiYWRcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcImJhZFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlm57lpI1cXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcInJlcGx5XFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJyZXBseVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuICAgIH0pO1xcbn1cXG5cXG5cXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6XFxcIuW8gOWPkeiAhfCfl6NcXFwiXFxufVxcbmxldCBjb250cm9sPShwaWQsYWN0aXZlKT0+dm9pZCAwO1xcbmlmKG5vX2FjdGl2ZSl7XFxuICAgIGNvbnRyb2w9ZnVuY3Rpb24ocGlkLGFjdGl2ZSl7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOmFjdGl2ZT9cXFwi6ZqQ6JeP6K+E6K66XFxcIjpcXFwi5bGV56S66K+E6K66XFxcIixcXG4gICAgICAgICAgICB1cmw6JChhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkK1xcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9SlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIityZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzJcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6XFxcIuWIoOmZpOivhOiuulxcXCIsXFxuICAgICAgICAgICAgdXJsOiQoXFxcIuehruiupOWIoOmZpOivpeivhOiuuj9cXFwiKS5jb25maXJtKChpbnB1dCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdD1KU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfSxhcGkuZGlzX2Rldl9jb250cm9sK3BpZCtcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkK1xcXCImZGVsZXRlPTFcXFwiKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJsaW5lXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJsaW5lXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBpZCArIFxcXCI/bGltaXQ9NSZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZub19hY3RpdmU9XFxcIiArIG5vX2FjdGl2ZSArIFxcXCImZGlzY3Vzc190eXBlPVxcXCIgKyBkaXNjdXNzX3R5cGUpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICAvL3VybDogbm9fYWN0aXZlP1xcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFwiOlxcXCJ0b2FzdDovL1xcXCIgKyBpdGVtLnFxLFxcblxcdFxcdCAgICAgICB1cmw6bm9fYWN0aXZlP1xcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFwiOlxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXCIraXRlbS5xcSxcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIHJ1bGVJZDogaWQsXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgIHJlcGx5SWQ6aXRlbS5pZFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgY29udHJvbChpdGVtLmlkLGl0ZW0uYWN0aXZlKTtcXG4gICAgfVxcbiAgICBpZiAoY29tbWVudExpc3QubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcblxcbnNldFJlc3VsdChkYXRhKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Y+R6KGo6K+E6K66XCIsXCJwYXRoXCI6XCJNYWtlQWNvbW1lbnRcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkYXRhID0gW107XFxuY29uc3Qge1xcbiAgICBhcGksXFxuICAgIGdldEZpbGVcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWQsXFxuICAgIG5hbWUsXFxuICAgIGRlZmF1bHRUeXBlXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgdXNlcj1nZXRGaWxlKCkudXNlcnx8W1xcXCJcXFwiLFxcXCJcXFwiXTtcXG5cXG5zZXRQYWdlVGl0bGUoXFxcIuivhOiuuihcXFwiICsgbmFtZSArIFxcXCIpXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnFxXFxcIik7XFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG59KSk7XFxubGV0IHR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiKSB8fCBkZWZhdWx0VHlwZXx8XFxcImdvb2RcXFwiO1xcbmRhdGEucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLor4TorrouLi4uLi5cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6NyxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi6LSm5Y+377yaXFxcIisodXNlclswXXx8XFxcIlxcXCIpLFxcbiAgICBkZXNjOlxcXCLpqozor4HnoIHvvJpcXFwiKyh1c2VyWzFdfHxcXFwiXFxcIiksXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL1VzZXJyZWdpc3RyYXRpb25cXFwiLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgIFxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAgKHR5cGUgPT09IFxcXCJnb29kXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpK1xcXCIg8J+RjVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiLCBcXFwiZ29vZFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXG5cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogICh0eXBlID09PSBcXFwiYmFkXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpK1xcXCIg8J+RjlxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFwiLCBcXFwiYmFkXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5o+Q5LqkXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiAkKGFwaS5kaXNfbmV3ICsgaWQpLmxhenlSdWxlKChBY2NvdW50KSA9PiB7XFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXG4gICAgICAgIGxldCBbcXEsYXV0aF9jb2RlXSA9IEFjY291bnQ7XFxuICAgICAgICBsZXQgdHlwZSA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudHlwZScpIHx8ICdnb29kJztcXG4gICAgICAgIHFxPXFxfHxcXFwiXFxcIjtcXG4gICAgICAgIGF1dGhfY29kZT1hdXRoX2NvZGV8fFxcXCJcXFwiO1xcbiAgICAgICAgaWYocXE9PVxcXCJcXFwifHxhdXRoX2NvZGU9PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq55m75b2V6LSm5Y+3XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmKHRleHQ9PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGZ1bmN0aW9uIHIocCkge1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocCksXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcCA9IHtcXG4gICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190ZXh0XFxcIjogdGV4dCxcXG4gICAgICAgICAgICAgICAgXFxcInFxXFxcIjogcXEsXFxuICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX3R5cGVcXFwiOiB0eXBlLFxcbiAgICAgICAgICAgICAgICBcXFwiYXV0aF9jb2RlXFxcIjogYXV0aF9jb2RlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHIocCk7XFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT09MCl7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIityZXN1bHQuZGV0YWlsO1xcblxcbiAgICB9LHVzZXIpXFxufSk7XFxuXFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Lyq55So5oi35rOo5YaMXCIsXCJwYXRoXCI6XCJVc2VycmVnaXN0cmF0aW9uXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCB7XFxuICAgIGFwaSxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZ2V0VXNlckRhdGVcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IGRhdGEgPSBbXTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuc2V0UGFnZVRpdGxlKFxcXCLnlKjmiLfliJfooajnrqHnkIZcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0ucXFcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLnl6bVxcXCIpO1xcbn0pKTtcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXG5sZXQgdXNlck5hbWUgPSB1c2VyLnVzZXIgfHwgW1xcXCJcXFwiXTtcXG51c2VyTmFtZSA9IHVzZXJOYW1lWzBdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdPGJpZz4o5re75YqgL+mqjOivgSnotKblj7c8L2JpZz5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLojrflj5ZcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpXFxXFxcIixcXG4gICAgdXJsOiAkLnRvU3RyaW5nKChhLCBiKSA9PiB7XFxuICAgICAgICBsZXQgcXEgPSBpbnB1dDtcXG4gICAgICAgIGlmIChxcSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLojrflj5bkuK0uLi5cXFwiKVxcbiAgICAgICAgcmV0dXJuICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHFxLCBhLCBiKSA9PiB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGEsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHFxXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQyID0gSlNPTi5wYXJzZShyZXF1ZXN0KGIgKyBcXFwiP3FxPVxcXCIgKyBxcSkpO1xcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdDIuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICB9XFxuICAgICAgICB9LCBxcSwgYSwgYik7XFxuXFxuICAgIH0sIGFwaS5kaXNfbmV3X3VzZXIsIGFwaS5kaXNfdmVyaWZ5KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJudW1iZXJcXFwiLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnFxJywgJycpIHx8IHVzZXJOYW1lLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLnFxXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpemqjOivgeeggVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnl6bScsICcnKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS55em1cXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677yaMS7mr4/lpKnlj6rog73ojrflj5Y15qyh6aqM6K+B56CBLjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyLjxzPumqjOivgeeggeacieaViOacn+aMgee7reS4gOWRqOW3puWPszwvcz4o5pqC5pe25LiN5Lya77yM5b+Y6K6w6aqM6K+B56CB5Y+v6YCa6L+HUVHlj7fojrflj5YpPC9zbWFsbD5cXFwiXFxufSk7XFxuXFxubGV0IHVzZXJMaXN0ID0gZ2V0VXNlckRhdGUoKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumqjOivgS/nmbvlvZVcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruWumuS/neWtmO+8jOmqjOivgeeggeWhq+mUme+8jOaXoOazleivhOiuuuWTplxcXCIpLmNvbmZpcm0oKGYsIGwsIGxvZ2luKSA9PiB7XFxuICAgICAgICBsZXQgcXEgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnFxJywgJycpO1xcbiAgICAgICAgbGV0IHl6bSA9IGdldFZhcignV2FyZWhvdXNlLm0ueXptJywgJycpO1xcbiAgICAgICAgaWYgKHFxID09IFxcXCJcXFwiIHx8IHl6bSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9xceaIlumqjOivgeeggeS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChsb2dpbiwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogcXEsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiYXV0aF9jb2RlXFxcIjogeXptXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICBmLnVzZXIgPSBbcXEsIHl6bV07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBsLmZpbmRJbmRleChpdGVtID0+IGl0ZW1bMF0gPT09IHFxKTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xcbiAgICAgICAgICAgICAgICBsLnNwbGljZShpbmRleCwgMSwgW3FxLCB5em1dKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGwubGVuZ3RoIDwgNikge1xcbiAgICAgICAgICAgICAgICBsLnB1c2goW3FxLCB5em1dKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsLnNwbGljZSgwLCAxKTtcXG4gICAgICAgICAgICAgICAgbC5wdXNoKFtxcSwgeXptXSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkobCkpO1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6aqM6K+B5oiQ5YqfXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgfSwgdXNlciwgdXNlckxpc3QsIGFwaS5kaXNfbG9naW4pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdPGJpZz7otKblj7fliJfooag8L2JpZz5cXFxcdFxcXFx0XFxcXHQ8c21hbGw+KOS/neeVmTXmnaHorrDlvZUpPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxufSk7XFxudXNlckxpc3QucmV2ZXJzZSgpO1xcblxcbmZvciAobGV0IGl0ZW0gb2YgdXNlckxpc3QpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6LSm5Y+377yaXFxcIiArIGl0ZW1bMF0gKyAodXNlck5hbWUgPT09IGl0ZW1bMF0gPyBcXFwiXFxcXHRcXFxcdFxcXFx04oCc4oCcW+W9k+WJjei0puWPt13igJ3igJ1cXFwiIDogXFxcIlxcXCIpLFxcbiAgICAgICAgZGVzYzogXFxcIumqjOivgeegge+8mlxcXCIgKyBpdGVtWzFdLFxcbiAgICAgICAgdXJsOiAkKFxcXCLmmK/lkKbliIfmjaLkuLror6VbXFxcIiArIGl0ZW1bMF0gKyBcXFwiXei0puWPt1xcXCIpLmNvbmZpcm0oKGYsIGl0ZW0pID0+IHtcXG4gICAgICAgICAgICBmLnVzZXIgPSBpdGVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFwiO1xcbiAgICAgICAgfSwgdXNlciwgaXRlbSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAgOWHuui0puWPt1xcXCIsXFxuICAgIHVybDogJChcXFwi56Gu6K6k6YCA5Ye655m75b2V54q25oCBXFxcIikuY29uZmlybSgoZikgPT4ge1xcbiAgICAgICAgZi51c2VyID0gW107XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgYmFjaygpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mAgOWHuuaIkOWKn1xcXCI7XFxuICAgIH0sIHVzZXIpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YiX6KGo5o6S5bqP566X5rOVXCIsXCJwYXRoXCI6XCJzb3J0XCIsXCJydWxlXCI6XCJqczpcXG4vKiDop4TliJnliJfooajmjpLluo8gWyBVUOOAgU5FV+OAgeaXoOabtOaWsCBdIOmhuuW6jyAqL1xcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcbi8qXFxuZnVuY3Rpb24gbWVyZ2VTb3J0KGFycikge1xcbiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcXG4gICAgaWYgKGxlbiA8IDIpIHtcXG4gICAgICAgIHJldHVybiBhcnI7XFxuICAgIH1cXG4gICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuIC8gMiksXFxuICAgICAgICBsZWZ0ID0gYXJyLnNsaWNlKDAsIG1pZGRsZSksXFxuICAgICAgICByaWdodCA9IGFyci5zbGljZShtaWRkbGUpO1xcbiAgICByZXR1cm4gbWVyZ2UobWVyZ2VTb3J0KGxlZnQpLCBtZXJnZVNvcnQocmlnaHQpKTtcXG59XFxuZnVuY3Rpb24gbWVyZ2UobGVmdCwgcmlnaHQpIHtcXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xcbiAgICB2YXIgaXNUaGlzVmVyc2lvbkxpc3QgPSBbXTtcXG5cXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoID4gMCAmJiByaWdodC5sZW5ndGggPiAwKSB7XFxuICAgICAgICBpZiAobGVmdFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GmVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRbMF0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhplcXFwiKSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aVXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GlVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlzVGhpc1ZlcnNpb25MaXN0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIHdoaWxlIChpc1RoaXNWZXJzaW9uTGlzdC5sZW5ndGgpIHJlc3VsdC5wdXNoKGlzVGhpc1ZlcnNpb25MaXN0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGgpXFxuICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAocmlnaHQubGVuZ3RoKVxcbiAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuXFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcbiQuZXhwb3J0cy5tZXJnZVNvcnQgPSBtZXJnZVNvcnQ7XFxuKi9cXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuLyog5pmu6YCa5YiG57G75o6S5bqPIFN0YXJ0ICovXFxuZnVuY3Rpb24gbm9ybWFsU29ydChhcnIpIHtcXG4gICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XFxuICAgIGlmIChsZW4gPCAyKSB7XFxuICAgICAgICByZXR1cm4gYXJyO1xcbiAgICB9XFxuICAgIGxldCB1cFJlc3VsdCA9IFtdO1xcbiAgICBsZXQgb3RoZXJSZXN1bHQgPSBbXTtcXG4gICAgd2hpbGUoYXJyLmxlbmd0aCkge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBhcnIuc2hpZnQoKTtcXG4gICAgICAgIGlmKGl0ZW0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhplcXFwiKSkge1xcbiAgICAgICAgICAgIHVwUmVzdWx0LnB1c2goaXRlbSlcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgb3RoZXJSZXN1bHQucHVzaChpdGVtKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiB1cFJlc3VsdC5jb25jYXQob3RoZXJSZXN1bHQpO1xcbn1cXG4kLmV4cG9ydHMubm9ybWFsU29ydCA9IG5vcm1hbFNvcnQ7XFxuLyog5pmu6YCa5YiG57G75o6S5bqPIEVuZCAqL1wifSx7XCJjb2xfdHlwZVwiOlwiaWNvbl8yX3JvdW5kXCIsXCJuYW1lXCI6XCLlhajpg6jlhazlvIDop4TliJlcIixcInBhdGhcIjpcIkFsbFB1YmxpY1J1bGVcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBhcGksXFxuICAgICAgICBsb2NhbFJ1bGVWZXIsXFxuICAgICAgICBnZXRBcGlcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmNvbnN0IHtcXG4gICAgbWVyZ2VTb3J0XFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFwiKTtcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBvcmRlciA9IGdldFZhcihcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgc29ydCA9IGdldFZhcihcXFwiV2FyZWhvdXNlLnNvcnRcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBnb29kID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgcGFnZSA9IE1ZX1VSTC5zcGxpdChcXFwiI1xcXCIpWzFdIHx8IDE7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5hbGxfcnVsZSArIFxcXCI/ZGF0YV90eXBlPVxcXCIgKyBkYXRhVHlwZSArIFxcXCImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbGltaXQ9MjAmb3JkZXI9XFxcIiArIG9yZGVyICsgXFxcIiZzb3J0PVxcXCIgKyBzb3J0KyBcXFwiJmlzX2dvb2Q9XFxcIiArIGdvb2QpKS5yZXN1bHQ7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5zb3J0XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKTtcXG59KSk7XFxubGV0IGRhdGEgPSBbXTtcXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjaygpO1xcbn1cXG5mdW5jdGlvbiB0YWIoYXJyLCB0eXBlLCBjb250cmFzdCkge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFycikge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbVsxXSA9PT0gY29udHJhc3QgPyBcXFwi4oCc4oCcXFxcIiArIGl0ZW1bMF0gKyBcXFwi4oCd4oCdXFxcIiA6IGl0ZW1bMF0sXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXksIHR5cGUpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKHR5cGUsIGtleSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBpdGVtWzFdLCB0eXBlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxufVxcbmlmIChwYWdlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgdGFiKFtcXG4gICAgICAgIFtcXFwi5YWo6YOoXFxcIiwgXFxcIlxcXCJdLFxcbiAgICAgICAgW1xcXCLlsI/nqIvluo9cXFwiLCBcXFwiaG9tZV9ydWxlX3VybFxcXCJdLFxcbiAgICAgICAgW1xcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFwiLCBcXFwicHVibGlzaFxcXCJdLFxcbiAgICAgICAgW1xcXCLnvZHpobXmj5Lku7ZcXFwiLCBcXFwianNfdXJsXFxcIl0sXFxuICAgICAgICBbXFxcIumdmeaAgemhtemdolxcXCIsIFxcXCJodG1sXFxcIl0sXFxuICAgICAgICBbXFxcIuS4u+mimFxcXCIsIFxcXCJjb25maWdcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLCBkYXRhVHlwZSk7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuaXtumXtFxcXCIsIFxcXCIwXFxcIl0sXFxuICAgICAgICBbXFxcIklEXFxcIiwgXFxcIjFcXFwiXSxcXG4gICAgICAgIFtcXFwi5aW96K+E5bqmXFxcIiwgXFxcIjJcXFwiXSxcXG4gICAgICAgIFtcXFwi5beu6K+E5bqmXFxcIiwgXFxcIjNcXFwiXSxcXG4gICAgICAgIFtcXFwi5Zue5aSN5pWwXFxcIiwgXFxcIjRcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgb3JkZXIpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLlgJLluo9cXFwiLCBcXFwiMFxcXCJdLFxcbiAgICAgICAgW1xcXCLmraPluo9cXFwiLCBcXFwiMVxcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2Uuc29ydFxcXCIsIHNvcnQpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLkuI3orrpcXFwiLCBcXFwiXFxcIl0sXFxuICAgICAgICBbXFxcIuS8mOi0qFxcXCIsIFxcXCIxXFxcIl1cXG4gICAgXSwgXFxcIldhcmVob3VzZS5nb29kXFxcIiwgZ29vZCk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5YWo6YOo6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxuXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxcbiAgICAgICAgICAgIGlzQWxsOnRydWVcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSlcXG59XFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxuLy9tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlm57lpI1cIixcInBhdGhcIjpcIlJlcGx5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIHJlcGx5SWQsXFxuICAgIHJ1bGVJZCxcXG4gICAgbmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIHVzZXJuYW1lXFxufSA9IE1ZX1BBUkFNUztcXG5cXG5cXG5zZXRQYWdlVGl0bGUoXFxcIuWbnuWkjShcXFwiICsgbmFtZSArIFxcXCIpXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi5Zue5aSNLi4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OjcsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmj5DkuqRcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19yZXBseSArIHJ1bGVJZCkubGF6eVJ1bGUoKHBhc3N3b3JkLCB1c2VybmFtZSwgcnVsZUlkKSA9PiB7XFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBcXFwiXFxcIiB8fCB1c2VybmFtZSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRleHQgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190ZXh0XFxcIjogdGV4dCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc19pZFxcXCI6IHJ1bGVJZFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuXFxuICAgIH0sIHBhc3N3b3JkLCB1c2VybmFtZSwgcmVwbHlJZClcXG59KTtcXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmiJHnmoTlm57lpI1cIixcInBhdGhcIjpcIk15UmVwbHlcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGF1dGhfY29kZSxcXG4gICAgcXFcXG59ID0gTVlfUEFSQU1TO1xcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0pO1xcbmxldCBkYXRhPVtdO1xcbmxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldF9yZXBseSArIFxcXCI/bGltaXQ9NSZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZxcT1cXFwiICsgcXEgKyBcXFwiJmF1dGhfY29kZT1cXFwiICsgYXV0aF9jb2RlKSkucmVzdWx0O1xcbmlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5Yir5ouJ5LqG5LiA5p2h5Lmf5LiN5Ymp5LqGPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbHZlcjogXFxcIuWbnuWkjei/m+WFpeS4jeaUr+aMgeafpeeci1xcXCIsXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLnJ1bGVfaWRbMF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIitpdGVtLnJ1bGVfaWRbMV0rXFxcIsK3XFxcIitcXFwi5byA5Y+R6ICF8J+Xo1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIFxcbn1cXG5zZXRSZXN1bHQoZGF0YSk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmm7TlpJrliIbkuqtcIixcInBhdGhcIjpcIm1vcmVTaGFyZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcbiAgICAgICAgY2xlYXJWYXIoXFxcImhvdXNlLnVwbG9hZF9jb2RlXFxcIik7XFxuICAgIH0pKTtcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG5sZXQgcHV0X3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvZGV2L3B1dCc7XFxuaWYoIWhvdXNlRmlsZSl7XFxuICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbn1cXG5sZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbi8vIGxvZyhob3VzZV9kYXRhLnVzZXJuYW1lKyctJytob3VzZV9kYXRhLnBhc3N3b3JkKTtcXG52YXIgY2FudXAgPSBob3VzZV9kYXRhLnVzZXJuYW1lLmxlbmd0aCA+PSA2ICYmIGhvdXNlX2RhdGEucGFzc3dvcmQubGVuZ3RoID4gMjtcXG5sb2coJ+WPr+S7peS4iuS8oD8nK2NhbnVwKTtcXG5sZXQgZCA9IFtdO1xcbmxldCBmaWxlX3R5cGUgPSBbe25hbWU6J+mdmeaAgeaWh+S7ticsdmFsdWU6J2h0bWwnfSx7bmFtZTon572R6aG15o+S5Lu2Jyx2YWx1ZTonanNfdXJsJ30se25hbWU6J+S4u+mhtemFjee9ricsdmFsdWU6J2NvbmZpZyd9XTsgLy/kuIrkvKDnsbvlnotcXG5sZXQgZmlsZV9yZWRpcmVjdCA9IFt7bmFtZTon5pys5ZywJyx2YWx1ZTonZmFsc2UnfSx7bmFtZTon55u06ZO+MzAyJyx2YWx1ZTondHJ1ZSd9XTsgLy/mmK/lkKbph43lrprlkJFcXG5sZXQgZmlsZV91YSA9IFt7bmFtZTon55S16ISRJyx2YWx1ZToncGMnfSx7bmFtZTon5omL5py6Jyx2YWx1ZTonbW9iaWxlJ31dO1xcbmxldCBmaWxlX3R5cGVfdGl0bGUgPSBmaWxlX3R5cGUubWFwKChpdGVtKSA9PiB7XFxuICAgIGxldCBuYW1lID0gZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2Jyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3JlZGlyZWN0X3RpdGxlID0gZmlsZV9yZWRpcmVjdC5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3VhX3RpdGxlID0gZmlsZV91YS5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7Y29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsIGV4dHJhOiB7anM6ICdjb25zb2xlLmxvZyhcXFwi5oiR5Yqg6L295LqGXFxcIiknfX0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn6I635Y+WJyxcXG4gICAgZGVzYzogXFxcIuaWh+S7tui3r+W+hCzmlK/mjIFoaWtlcixmaWxlLGh0dHAs5Li76aKYXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0VmFyKCdob3VzZS53ZWJfdXJsJyxpbnB1dClcXFwiLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlLFxcbiAgICAgICAgaWQ6J2ZpbGVQYXRoJyxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTpnZXRWYXIoJ2hvdXNlLndlYl91cmwnKVxcbiAgICB9LFxcbiAgICB1cmw6JC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgaW5wdXQgPSBnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKTtcXG4gICAgICAgIGlmKGlucHV0Lmxlbmd0aDwyKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZO+5o6l5LiN5Y+v5Lul5Li656m6J1xcbiAgICAgICAgfSBlbHNlIGlmKC9eaGlrZXI6fF5maWxlOnxeaHR0cDp8Xmh0dHBzOnxeXFxcXC9zdG9yYWdlXFxcXC98XlxcXFwvc2RjYXJkXFxcXC8vLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBpZigvXlxcXFwvc3RvcmFnZVxcXFwvfF5cXFxcL3NkY2FyZFxcXFwvLy50ZXN0KGlucHV0KSl7XFxuICAgICAgICAgICAgICAgIGlucHV0ID0gJ2ZpbGU6Ly8nK2lucHV0O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coJ+ato+W4uOmTvuaOpTonK2lucHV0KTtcXG4gICAgICAgICAgICBsZXQgdWEgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz8nTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgU2FmYXJpLzUzNy4zNic6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBNSSA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODkuMC40Mzg5LjkwIE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG4gICAgICAgICAgICBsZXQgd2ViX3VybF9hcnIgPSBpbnB1dC5zcGxpdCgnOycpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbMF07XFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB7XFxuICAgICAgICAgICAgICAgICdSZWZlcmVyJzonaHR0cHM6Ly9ibG9nLmNzZG4ubmV0JyxcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOnVhLFxcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMScsXFxuICAgICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTMmJndlYl91cmxfYXJyWzJdLmxlbmd0aD4yKXsgLy/orr7nva7nvJbnoIFcXG4gICAgICAgICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnY2hhcnNldD0nK3dlYl91cmxfYXJyWzJdLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7aGVhZGVyczpoZWFkZXJzLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlfTtcXG4gICAgICAgICAgICBpZih3ZWJfdXJsX2Fyci5sZW5ndGg+PTImJndlYl91cmxfYXJyWzFdLmxlbmd0aD4yKXsgLy8g6K6+572u6K+35rGC5pa55rOVXFxuICAgICAgICAgICAgICAgIHBhcmFtc1snbWV0aG9kJ10gPSB3ZWJfdXJsX2FyclsxXS50b1VwcGVyQ2FzZSgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsb2coJ+W8gOWni+iOt+WPlua6kOeggScpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIC8qXFxuICAgICAgICAgICAgICAgIHJlcXVlc3RBc3luYyh3ZWJfdXJsLHBhcmFtcyxmdW5jdGlvbiAoa2V5LGNvZGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBjb2RlO1xcbiAgICAgICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bliLDnqbrmlofmnKzvvIznlpHkvLzkvaDmsqHmnInmraTmlofku7YhJztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaCh3ZWJfdXJsLHBhcmFtcyk6cmVxdWVzdCh3ZWJfdXJsLHBhcmFtcyk7XFxuICAgICAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApe1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vOlxcXFxuJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBsb2coJ+S4u+mimOmTvuaOpScpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCfvv6UnKTtcXG4gICAgICAgICAgICBsZXQgd2ViX3VybCA9IHdlYl91cmxfYXJyW3dlYl91cmxfYXJyLmxlbmd0aC0xXTtcXG4gICAgICAgICAgICBsZXQgYmFja19jb2RlID0gcGFyc2VQYXN0ZSh3ZWJfdXJsKTtcXG4gICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKSB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPlui/lOWbnuS4ujpcXFxcbicrYmFja19jb2RlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pnZ7ms5Xpk77mjqU6XFxcXG4nK2dldFZhcignaG91c2Uud2ViX3VybCcpO1xcbiAgICAgICAgfVxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqeaWh+S7tui3r+W+hFxcXCIsXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICAvKlxcbiAgICAgICAgbGV0IGZwID0gJ2h0dHBzOi8vZ2l0Y29kZS5uZXQvcXFfMzIzOTQzNTEvZHIvLS9yYXcvbWFzdGVyL2pzL2ZpbGVTZWxlY3QuanMnO1xcbiAgICAgICAgbGV0IGYgPSByZXF1aXJlKGZwKTtcXG4gICAgICAgICovXFxuICAgICAgICBsZXQgZnA9Y29uZmlnLmxpYi5maWxlU2VsZWN0O1xcbiAgICAgICAgbGV0IGY9JC5yYyhmcCk7XFxuICAgICAgICByZXR1cm4gZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBmaW5kSXRlbShcXFwiZmlsZVBhdGhcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwiZmlsZVBhdGhcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLFBBVEgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBvbkNsaWNrVHlwZTonY29uZmlybScsXFxuICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCIuanN8LnR4dHwuaGlrZXJ8Lmpzb258Lmh0bWxcXFwiLFxcbiAgICAgICAgICAgIHBhdHRlcm46IDAsXFxuICAgICAgICAgICAgcmVxdWlyZVVybDpmcCxcXG4gICAgICAgICAgICBpbml0aWFsUGF0aDpnZXRQYXRoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvJykuc2xpY2UoNyksXFxuICAgICAgICAgICAgbWVtb3J5Oid0cnVlJyxcXG4gICAgICAgIH0pO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon5LiK5Lyg57G75Z6LJyxcXG4gICAgZGVzYzon5LiK5Lyg5paH5Lu255qE57G75Z6LLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpLCcjZmY3MDAwJyksXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6JChmaWxlX3R5cGVfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifmlofku7blrprkvY0nLFxcbiAgICBkZXNjOifmlofku7bmmK/lkKblsZ7kuo7ph43lrprlkJEs5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpLCcjZmY3MDAwJyksXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6JChmaWxlX3JlZGlyZWN0X3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0JyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+iuvuWkh1VBJyxcXG4gICAgZGVzYzon5Y+R6LW3572R6aG16K+35rGC5aS05qCH6K+GLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSwnI2ZmNzAwMCcpLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOiQoZmlsZV91YV90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV91YScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcbmZ1bmN0aW9uIGNvbXBhcmUobmFtZSkge1xcbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gbmFtZTtcXG4gICAgfVxcbn1cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+XhO+4j+eOr+WigycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKGZpbGVfdHlwZSxjb21wYXJlKT0+e1xcbiAgICAgICAgbG9nKCfmn6XnnIvnjq/looPlj5jph48nKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHVwX2NvZGUgPSBnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJyk7XFxuICAgICAgICAgICAgbGV0IGZ0eXBlID0gIGZpbGVfdHlwZS5maWx0ZXIoY29tcGFyZShnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSkpWzBdLnZhbHVlO1xcbiAgICAgICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gIXJlZGlyZWN0P3VwX2NvZGU6aW5wdXQ7XFxuICAgICAgICAgICAgbGV0IGVudiA9IHtcXG4gICAgICAgICAgICAgICAgd2ViX3VybDpnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKSxcXG4gICAgICAgICAgICAgICAgZGV2aWNlOmdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSxcXG4gICAgICAgICAgICAgICAgZnR5cGU6ZnR5cGV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDpyZWRpcmVjdCxcXG4gICAgICAgICAgICAgICAgY29kZTpjb2RlLnN1YnN0cmluZygwLDQwKXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZyhlbnYpO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK0pTT04uc3RyaW5naWZ5KGVudik7XFxuICAgICAgICAgICAgLy8gYWxlcnQoSlNPTi5zdHJpbmdpZnkoZW52KSk7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgLy8gYWxlcnQoZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgfSxmaWxlX3R5cGUsY29tcGFyZSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+Tg+aVmeeoiycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkueDVSdWxlKCgpPT57XFxuICAgICAgICBsZXQgbXNnID0gJ+asoui/juS9v+eUqOW8gOWPkeiAheabtOWkmuWIhuS6q+W3peWFt1xcXFxuMS7ovpPlhaXnvZHlnYDkuLrmnKzlnLDmlofku7bot6/lvoQsaGlrZXI6Ly/miJbogIVmaWxlOi8v5byA5aS0XFxcXG4yLueCueWHu+e9keWdgOi+k+WFpeagj+WQjumdoueahOaMiemSrlxcXFxuMy7nnIvmlofmnKzpooTop4jljLrmmK/lkKbmraPnoa5cXFxcbjQu54K55Ye75LiK5Lyg5oyJ6ZKu5o+Q5Lqk5Yiw5LuT5bqTJztcXG4gICAgICAgIGFsZXJ0KG1zZyk7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfl5HvuI/muIXnqbonLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBjbGVhclZhcignaG91c2UudXBsb2FkX2NvZGUnKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3sua4hemZpOmihOiniOWMuuWfn+WGheWuuSdcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+TsuekuuS+iycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGxldCBkZW1vX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcbiAgICAgICAgaWYoZGVtb19jb2RlPT0nMCcpe1xcbiAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+i1hOa6kOe9keS5puetvi5odG1sJyk7XFxuICAgICAgICAgICAgZGVtb19jb2RlID0gcGFyc2VJbnQoZGVtb19jb2RlKSsxO1xcbiAgICAgICAgICAgIHNldEl0ZW0oJ2hvdXNlLmRlbW8nLGRlbW9fY29kZSsnJyk7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLCdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv6LWE5rqQ572R5Lmm562+Lmh0bWwnKTtcXG4gICAgICAgICAgICBzZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey6K6+572u56S65L6L5Zyw5Z2AJ1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5Ok5LiK5LygJyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoY2FudXAsaG91c2VfZGF0YSxwdXRfdXJsLGZpbGVfdHlwZSkgPT57XFxuICAgICAgICBmdW5jdGlvbiBjb21wYXJlKG5hbWUpIHtcXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lID09PSBuYW1lO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGNvbnN0IHtnZXROb3dGb3JtYXREYXRlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG4gICAgICAgIGxldCB1cF9jb2RlID0gZ2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpO1xcbiAgICAgICAgaWYodXBfY29kZS5sZW5ndGggPCAyKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5Yy65peg5YaF5a6577yM6K+35YWI6K6/6Zeu5LiA5Liq6Z2Z5oCB6aG16Z2iJ1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYoIWNhbnVwKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g5LiN5piv5byA5Y+R6ICF77yM5rKh5pyJ5o+Q5Lqk5Yiw5LuT5bqT55qE5p2D5YipISdcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcbiAgICAgICAgbGV0IHdlYl91cmwgPSBpbnB1dC5zcGxpdCgnOycpWzBdO1xcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gJyc7XFxuICAgICAgICBpZigvXmhpa2VyOnxeZmlsZTp8Xmh0dHA6fF5odHRwczp8XlxcXFwvc3RvcmFnZVxcXFwvfF5cXFxcL3NkY2FyZFxcXFwvLy50ZXN0KHdlYl91cmwpKXtcXG4gICAgICAgICAgICBmaWxlTmFtZSA9IHdlYl91cmwuc3BsaXQoJy8nKVt3ZWJfdXJsLnNwbGl0KCcvJykubGVuZ3RoLTFdO1xcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBsZXQgYmthcnIgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKTtcXG4gICAgICAgICAgICBpZihia2Fyci5sZW5ndGg8Myl7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kupHliarotLTmnb/lhoXlrrnmnInor68nXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHN3aXRjaCAoYmthcnJbMV0pIHtcXG4gICAgICAgICAgICAgICAgY2FzZSAnbXlfaG9tZV90aGVtZSc6XFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlICdteV9ob21lX3NpbmdsZSc6XFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKVsyXS5zcGxpdCgnQCcpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOe9kemhtemTvuaOpeaXoOWGheWuuSEnO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHVhID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IFNhZmFyaS81MzcuMzYnOidNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgTUkgNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS45MCBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnUmVmZXJlcic6J2h0dHBzOi8vYmxvZy5jc2RuLm5ldCcsXFxuICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIixcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxuICAgICAgICAgICAgJ0FjY2VwdCc6J2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnLFxcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHRvQ29tcGFyZSA9ICcnO1xcbiAgICAgICAgaWYoZmlsZU5hbWUuZW5kc1dpdGgoJy5odG1sJykpe1xcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfpnZnmgIHmlofku7YnO1xcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimC8udGVzdChmaWxlTmFtZSkpe1xcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfkuLvpobXphY3nva4nXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZnR5cGUgPSAgZmlsZV90eXBlLmZpbHRlcihjb21wYXJlKHRvQ29tcGFyZXx8Z2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JykpKVswXS52YWx1ZTtcXG4gICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcbiAgICAgICAgaWYocmVkaXJlY3QmJiF3ZWJfdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSl7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+ebtOmTvjMwMumHjeWumuWQkee9keWdgOmTvuaOpeW/hemhu2h0dHDlvIDlpLQnO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGNvZGUgPSAhcmVkaXJlY3Q/dXBfY29kZTp3ZWJfdXJsO1xcbiAgICAgICAgbGV0IGRhdGEgPSB7XFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgIHtcXFwiZGF0YVxcXCI6IHtydWxlX25hbWU6IGZpbGVOYW1lLCBcXFwicnVsZV90eXBlXFxcIjogJ+abtOWkmuWIhuS6qycsIFxcXCJ2ZXJzaW9uXFxcIjpnZXROb3dGb3JtYXREYXRlKCksXFxcInJ1bGVfdmFsdWVcXFwiOiBjb2RlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTpmdHlwZSwgaXNfcmVkaXJlY3Q6cmVkaXJlY3QsZGV2aWNlVWE6Z2V0SXRlbSgnaG91c2UuZmlsZV91YScpLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogaG91c2VfZGF0YS51c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR9XFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHVwcGFyYW1zID0ge2hlYWRlcnM6aGVhZGVycyxib2R5OkpTT04uc3RyaW5naWZ5KGRhdGEpLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlLG1ldGhvZDonUE9TVCd9O1xcbiAgICAgICAgbGV0IGJhY2ttc2cgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaChwdXRfdXJsLHVwcGFyYW1zKTpyZXF1ZXN0KHB1dF91cmwsdXBwYXJhbXMpO1xcbiAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGJhY2ttc2cpLnJlc3VsdDtcXG4gICAgICAgICAgICBsZXQgZGV0YWlsID0gcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytkZXRhaWw7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vXFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgIH1cXG4gICAgfSxjYW51cCxob3VzZV9kYXRhLHB1dF91cmwsZmlsZV90eXBlKVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifplb/mlofmnKzpooTop4jljLrln58nLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOidoaWtlcjovL2VtcHR5JyxcXG4gICAgZXh0cmE6IHt0ZXh0U2l6ZTogMTEsbGluZVZpc2libGU6ZmFsc2V9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6Z2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpLnN1YnN0cmluZygwLDEwMjQwKSxcXG4gICAgY29sX3R5cGU6J2xvbmdfdGV4dCcsXFxuICAgIGV4dHJhOiB7dGV4dFNpemU6IDExfVxcbn0pO1xcbnNldFBhZ2VUaXRsZShcXFwi5pu05aSa5YiG5LqrXFxcIik7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6L275ZCI6ZuG55Sf5oiQ5o6l5Y+jXCIsXCJwYXRoXCI6XCJnZW5BcGlcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGdlblJ1bGUobmFtZSx1cmwsaWNvbil7XFxuICAgIGljb249aWNvbnx8J2h0dHBzOi8vejMuYXgxeC5jb20vMjAyMS8xMS8xNi9JV0poeGYucG5nJztcXG4gICAgY29uc3Qge2dldE5vd0Zvcm1hdERhdGUsYXBpLGdldEFwaX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uKG9sZCxuZXdfc3RyKXtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KG9sZCkuam9pbihuZXdfc3RyKTtcXG4gICAgfTtcXG4gICAgbGV0IG11YmFuID0gZ2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiMTY5MFxcXCI7XFxuICAgIGxldCBtdWJhbl93b3JkPXtuYW1lOlxcXCJA6L275ZCI6ZuGXFxcIix1cmw6XFxcIkDlnLDlnYBcXFwiLHZlcjpcXFwiQOeJiOacrFxcXCIsaWNvbjpcXFwiQOWbvuagh1xcXCJ9O1xcbiAgICBsZXQgbXViYW5fY29kZSA9IGZldGNoKG11YmFuKTtcXG4gICAgbXViYW5fY29kZT1tdWJhbl9jb2RlLnJlcGxhY2VBbGwobXViYW5fd29yZC5uYW1lLG5hbWUpLnJlcGxhY2VBbGwobXViYW5fd29yZC52ZXIsZ2V0Tm93Rm9ybWF0RGF0ZSgpKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQudXJsLHVybCkucmVwbGFjZUFsbChtdWJhbl93b3JkLmljb24saWNvbik7XFxuICAgIGxldCBpbXBvcnRfY29kZT1cXFwi5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya5bCP56iL5bqP77yM5peg5qC55qCR77yM6Iqx5q2j5riF77yM5LiN5pat6I2k6IWl5LiN5oiS5rer77+laG9tZV9ydWxlX3Yy77+lYmFzZTY0Oi8vQFxcXCIrbmFtZStcXFwiQFxcXCIrYmFzZTY0RW5jb2RlKG11YmFuX2NvZGUpO1xcbiAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKGltcG9ydF9jb2RlLHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcbiAgICBsZXQgaW1wb3J0X3J1bGU9IHVybCtcXFwiXFxcXG5cXFxcbuWwj+eoi+W6j++8mlxcXCIrbmFtZTtcXG4gICAgcmV0dXJuIGltcG9ydF9ydWxlO1xcbn1cXG4kLmV4cG9ydHMuZ2VuUnVsZT1nZW5SdWxlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YWo5bGA6Kej5p6Q5YWN5ZeFXCIsXCJwYXRoXCI6XCJnbG9iYWxQYXJzZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGZ1bmN0aW9uIGdldEhlYWRlcnMocGxheVVybCl7XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHt9O1xcbiAgICAgICAgbGV0IHJlZmVyPXBsYXlVcmwuc3BsaXQoXFxcIi8vXFxcIilbMF0rXFxcIi8vXFxcIitwbGF5VXJsLnNwbGl0KFxcXCIvL1xcXCIpWzFdLnNwbGl0KFxcXCIvXFxcIilbMF07XFxuICAgICAgICBpZigvbGVjbG91ZFxcXFwuY29tfGJpbGl2aWRlb1xcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogJ2h0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS8nLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICAgICAgfWVsc2UgaWYoL21ndHZcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6IHJlZmVyLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogJ2h0dHBzOi8vd3d3Lml4aWd1YS5jb20vJyxcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIn1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiByZWZlciwnVXNlci1BZ2VudCc6J0RhcnQvMi4xMyAoZGFydDppbyknfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNcXG4gICAgfVxcbmZ1bmN0aW9uIGlzUGljKHN0cil7XFxuICAgIHJldHVybiAvXFxcXC4oZ2lmfGpwZ3xqcGVnfHBuZ3xHSUZ8SlBHfFBORykkLy50ZXN0KHN0cik7XFxufVxcbmZ1bmN0aW9uIGlzVmlkZW8ocGxheVVybCxyZWNoYW5nZSl7XFxuICAgIC8v5rOo5oSPLnBocOS4jeWPr+S7peiiq+aOkumZpOWQpuWImeiejeWFtOino+aekOS4jeS6hiB8LnBocCRcXG4gICAgLy/lpoLmnpzmmK/mkq3mlL7lnLDlnYDlsLHnm7TmjqXov5Tlm57lnLDlnYDliqDkuIpVQe+8jOS4jeaYr+eahOivneWwsei/lOWbnmZhbHNlXFxuICAgIC8vIGxldCB0MSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICBsZXQgY2FjaGVSZWd4ID0gbmV3IFJlZ0V4cCgnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLyguKj8pXFxcXFxcXFwubTN1OHxoaWtlcjovL2ZpbGVzLyguKj8pXFxcXFxcXFwubTN1OCcpO1xcbiAgICBpZihjYWNoZVJlZ3gudGVzdChwbGF5VXJsKSl7XFxuICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICB9XFxuICAgIGZ1bmN0aW9uIGdldEhvc3QodXJsKXtcXG4gICAgICAgIC8vIGZiYeeahHBhcnNlTGF6eeWkquaFouS6huWNg+S4h+WIq+eUqFxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9eaHR0cChzKT86XFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXS5zbGljZSgwLC0xKTtcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICAgICAgLypcXG4gICAgICAgIGlmKHR5cGVvZihsb2cpPT09J3VuZGVmaW5lZCcpe1xcbiAgICAgICAgICAgIHJldHVybiAgZmJhLnBhcnNlTGF6eVJ1bGUoJCQkKCkubGF6eVJ1bGUoKHVybCk9PntcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEhvbWUodXJsKVxcbiAgICAgICAgICAgIH0sdXJsKSlcXG4gICAgICAgIH1lbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2V0SG9tZSh1cmwpXFxuICAgICAgICB9XFxuICAgICAgICAqL1xcbiAgICB9XFxuICAgIGxldCBwVXJsPXBsYXlVcmwuc3BsaXQoXFxcIjtcXFwiKVswXTsvL+iOt+WPluaKoOaOiea1t+mYlHVh562J5Y+C5pWw55qE572R6aG15pKt5pS+6ZO+5o6lXFxuICAgIGxldCBob3N0ID0gZ2V0SG9zdChwVXJsKTsgLy8g6I635Y+W5Z+f5ZCNXFxuICAgIGlmKCFob3N0KXsvL+WIpOaWreaXoOWfn+WQjeebtOaOpeS4jeaYr+inhumikVxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxuICAgIH1cXG4gICAgZnVuY3Rpb24gcHJpbnQoZGF0YSl7XFxuICAgICAgICBpZih0eXBlb2YobG9nKT09PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICByZXR1cm4gIGZiYS5sb2coZGF0YSlcXG4gICAgICAgIH1lbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gbG9nKGRhdGEpXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmVjaGFuZ2U9dHlwZW9mKHJlY2hhbmdlKT09PVxcXCJmdW5jdGlvblxcXCI/cmVjaGFuZ2U6ZnVuY3Rpb24ocGxheVVybCl7cmV0dXJuIHBsYXlVcmx9O1xcbiAgICBsZXQgZXhjZXB0V29yZHMgPSAnLmpzJHwuY3NzJHwudHMkfC5odG1sJHwuaHRtJHwuZ2lmJHwuanBnJHwuanBlZyR8LnBuZyR8LmljbyR8LnN2ZyR8LnR4dCQnLnNwbGl0KCd8JykubWFwKGl0PT4nXFxcXFxcXFwnK2l0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzID0gbmV3IFJlZ0V4cChleGNlcHRXb3Jkcyk7XFxuICAgIGxldCBleGNlcHRXb3JkczEgPSAncmVmZXJlcj18dXJsPScuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzMSA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMxKTtcXG4gICAgbGV0IHJlcGxhY2VXb3JkcyA9ICdwbGF5bTN1OHxtM3U4XFxcXC50dicuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIGxldCByZXBsYWNlS2V5cyA9IG5ldyBSZWdFeHAocmVwbGFjZVdvcmRzLCdnJyk7XFxuICAgIGxldCB2aWRlb1dvcmRzID0gXFxcIi92aWRlby90b3N8Lm1wNCR8Lm0zdTgkfC5mbHYkfC5hdmkkfC4zZ3AkfC5tcGVnJHwud212JHwubW92JHxybXZifC5kYXQkfC5tcDMkfC5tNGEkfHFxQkZkb3dubG9hZHxtaW1lPXZpZGVvJTJGfG1pbWVfdHlwZT12aWRlb198dHlwZT1tM3U4fHB0PW0zdThcXFwiLnNwbGl0KCd8JykubWFwKChpdCk9PntcXG4gICAgICAgIC8vdHlwZT1tcDRcXG4gICAgICAgIGlmKGl0LnN0YXJ0c1dpdGgoXFxcIi5cXFwiKSl7XFxuICAgICAgICAgICAgcmV0dXJuICdcXFxcXFxcXCcraXRcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiBpdFxcbiAgICAgICAgfVxcbiAgICB9KS5qb2luKFxcXCJ8XFxcIik7XFxuICAgIGxldCB2aWRlb0tleXMgPSBuZXcgUmVnRXhwKHZpZGVvV29yZHMpO1xcbiAgICBsZXQgclVybCA9IHBVcmwucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9memTvuaOpVxcbiAgICBsZXQgcFVybDI9cFVybC5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF07Ly/ojrflj5bkuI3luKblj4LmlbDnmoTnvZHpobXpk77mjqVcXG4gICAgbGV0IHJ1cmwyID0gcFVybDIucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9meS4jeW4puWPguaVsOmTvuaOpVxcbiAgICBsZXQgaGFzS2V5ID0gdmlkZW9LZXlzLnRlc3QoclVybCl8fHZpZGVvS2V5cy50ZXN0KHJ1cmwyKTtcXG4gICAgbGV0IHBhclVybCA9IHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpOyAvLyDliIblibLpl67lj7flkI7liankvZnlj4LmlbDnmoTlrozmlbTpk77mjqVcXG4gICAgbGV0IGV4Y0tleSA9IGV4Y2VwdEtleXMxLnRlc3QocGFyVXJsKTtcXG4gICAgaWYoclVybC5zcGxpdCgnPycpLmxlbmd0aD4yKXtcXG4gICAgICAgIGxldCByVXJsMz1yVXJsLnNwbGl0KFxcXCI/XFxcIilbMV07Ly/ojrflj5Y/5YiG5Ymy5ZCO55qE56ys5LiA5q61XFxuICAgICAgICBoYXNLZXkgPSBoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwzKTtcXG4gICAgfVxcbiAgICBpZihoYXNLZXkmJiFleGNLZXkpe1xcbiAgICAgICAgbGV0IHRpcHMgPSAn5qOA5rWL5Yiw55aR5Ly85aSa5aqS5L2T55qE5Zyw5Z2AOic7XFxuICAgICAgICBwcmludChcXFwianPkuK1cXFwiK3RpcHMrcFVybCk7XFxuICAgICAgICBwcmludChcXFwi5YiG5Ymy6Zeu5Y+35ZCOOlxcXCIrcGFyVXJsKTtcXG4gICAgfVxcbiAgICAvLyBsb2coJzE6JysodmlkZW9LZXlzLnRlc3QocFVybCl8fHZpZGVvS2V5cy50ZXN0KHBVcmwyKXx8dmlkZW9LZXlzLnRlc3QocFVybC5yZXBsYWNlKHJlcGxhY2VLZXlzLFxcXCJcXFwiKS5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF0pKSk7XFxuICAgIC8vIGxvZygnMjonKyFleGNlcHRLZXlzLnRlc3QocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLnNwbGl0KCcmJylbMF0pKTtcXG4gICAgLy8gbG9nKCczOicrIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXSwnJykpKTtcXG4gICAgaWYgKChoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFwiXFxcIikuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdKSApJiYgIWV4Y2VwdEtleXMudGVzdChwVXJsMikmJiFleGNlcHRLZXlzMS50ZXN0KHBVcmwyKSkge1xcbiAgICAgICAgaWYoISgvVXNlci1BZ2VudHxSZWZlcmVyQC8udGVzdChwbGF5VXJsKSkpe1xcbiAgICAgICAgICAgIGlmKC9sZWNsb3VkXFxcXC5jb218YmlsaXZpZGVvLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIjt7UmVmZXJlckBodHRwczovL3d3dy5iaWxpYmlsaS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIiNpc3ZpZGVvPXRydWUjO3tSZWZlcmVyQGh0dHBzOi8vd3d3Lml4aWd1YS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGVsc2UgaWYoL21ndHZcXFxcLmNvbXxieXRlYW1vbmUvLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfWVsc2UgaWYoL3B0d29cXFxcLndrZmlsZVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpJiYvdXJsPS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmw9cGxheVVybC5zcGxpdChcXFwidXJsPVxcXCIpWzFdK1xcXCI7e1JlZmVyZXJAaHR0cHM6Ly9mYW50dWFuLnR2fVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8g5aSE55CG5aSn5biI5YWE5LmL57G755qEYXBwXFxuICAgICAgICAgICAgLy8gZWxzZXtcXG4gICAgICAgICAgICAvLyAgICAgcGxheVVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIC8vIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHBsYXlVcmw9cmVjaGFuZ2UocGxheVVybCk7XFxuICAgICAgICBpZighLyNpc1ZpZGVvPXRydWUjLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBwbGF5VXJsKz1cXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy8gbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuICAgICAgICAvLyBwcmludCgn5Yik5pataXNWaWRlb+iAl+aXtjonKyh0Mi10MSkpO1xcbiAgICAgICAgcmV0dXJuIHBsYXlVcmw7XFxuICAgIH1lbHNle1xcbiAgICAgICAgLy8gbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuICAgICAgICAvLyBwcmludCgn5Yik5pataXNWaWRlb+iAl+aXtjonKyh0Mi10MSkpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcbmZ1bmN0aW9uIGNvbVBhcnNlKHBhclN0cixlaixvbmx5YmFjayxodG1sKXtcXG4gICAgLy/liJfooajvvIzmoIfpopjvvIzlm77niYfvvIzmj4/ov7DvvIzpk77mjqXvvIzlhoXlrrlcXG4gICAgZWogPSBlanx8ZmFsc2U7Ly/mnInkuoznuqdcXG4gICAgb25seWJhY2s9b25seWJhY2t8fGZhbHNlOy8v5Y+q6L+U5Zue5pWw5o2uXFxuICAgIGh0bWwgPSBodG1sfHxnZXRSZXNDb2RlKCk7XFxuICAgIGh0bWwgPSB0eXBlb2YoaHRtbCk9PT0nc3RyaW5nJz9odG1sOmh0bWwuaHRtbDtcXG4gICAgcmV0dXJuICQudG9TdHJpbmcoKHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKT0+e1xcbiAgICAgICAgbGV0IHQ9cGFyU3RyLnNwbGl0KFxcXCI7XFxcIik7XFxuICAgICAgICBsZXQgZD1bXTtcXG4gICAgICAgIC8vIGxldCBsaXN0PXBkZmEoZ2V0UmVzQ29kZSgpLHRbMF0pO1xcbiAgICAgICAgbGV0IGxpc3Q9cGRmYShodG1sLHRbMF0pO1xcbiAgICAgICAgbGV0IGxhenkgPSAkKCcnKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgICAgIGNvbnN0IHtsYXp5UGFyc2V9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgICAgICAgICByZXR1cm4gbGF6eVBhcnNlKGlucHV0KVxcbiAgICAgICAgfSk7XFxuICAgICAgICBmb3IobGV0IGkgaW4gbGlzdCl7XFxuICAgICAgICAgICAgbGV0IF9waWMgPSB0WzJdP3BkKGxpc3RbaV0sdFsyXSk6Jyc7XFxuICAgICAgICAgICAgaWYoaXNQaWMoX3BpYykmJiEvQFJlZmVyZXI9Ly50ZXN0KF9waWMpKXtcXG4gICAgICAgICAgICAgICAgX3BpYys9J0BSZWZlcmVyPSdcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGl0PXtcXG4gICAgICAgICAgICAgICAgdGl0bGU6cGRmaChsaXN0W2ldLHRbMV0pLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOl9waWMsXFxuICAgICAgICAgICAgICAgIGRlc2M6cGRmaChsaXN0W2ldLHRbM10pLFxcbiAgICAgICAgICAgICAgICB1cmw6ZWo/cGQobGlzdFtpXSx0WzRdKTpwZChsaXN0W2ldLHRbNF0pK2xhenlcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGlmKHQubGVuZ3RoPjUpey8v5YaF5a6577yM55So5LqO5pCc57SiXFxuICAgICAgICAgICAgICAgIGl0LmNvbnRlbnQ9cGRmaChsaXN0W2ldLHRbNV0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGQucHVzaChpdCk7XFxuICAgICAgICB9XFxuICAgICAgICBpZihvbmx5YmFjayl7XFxuICAgICAgICAgICAgcmV0dXJuIGRcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHNldFJlc3VsdChkKVxcbiAgICAgICAgfVxcbiAgICB9LHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKVxcbn1cXG5cXG5mdW5jdGlvbiBpc0JhZFZpZGVvKHZpZGVvVXJsKSB7Ly/mmK/lnY/nmoTop4bpopFcXG4gICAgbGV0IGRtUGF0aCA9ICdoaWtlcjovL2ZpbGVzL2NhY2hlL2RpYW9tYW8udHh0JzsvL+WQiuavm+aooeW8j+i/h+a7pOaWh+S7tui3r+W+hFxcbiAgICBsZXQgZG1VcmxzO1xcbiAgICB0cnkge1xcbiAgICAgICAgZG1VcmxzID0gcmVxdWVzdChkbVBhdGgpLnRyaW0oKS5zcGxpdCgnXFxcXG4nKS5maWx0ZXIoaXQgPT4gaXQgJiYgIWl0LnN0YXJ0c1dpdGgoJy8vJykpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkbVVybHMgPSBbXTtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBoYXNEbSh2aWRlb1VybCwgZG1VcmxzKSB7Ly/mkq3mlL7lnLDlnYDmmK/lkKbkuLrlkIrmr5vop4bpopFcXG4gICAgICAgIGlmIChkbVVybHMubGVuZ3RoIDwgMSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICAgICAgZnVuY3Rpb24gcHJpbnQoc3RyKXtcXG4gICAgICAgICAgICBpZih0eXBlb2YobG9nKSE9PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICAgICAgbG9nKHN0cik7XFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2coc3RyKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBkbVVybCBvZiBkbVVybHMpIHtcXG4gICAgICAgICAgICBpZiAoKG5ldyBSZWdFeHAoZG1VcmwpKS50ZXN0KHZpZGVvVXJsKSkgey8v5pKt5pS+5Zyw5Z2A5YyF5ZCr5ZCK5q+b5qCH5b+X55qE5Zyw5Z2AXFxuICAgICAgICAgICAgICAgIHByaW50KCflkIrmr5vop4bpopEs6Ieq5Yqo6L+H5rukOicrdmlkZW9VcmwpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHByaW50KCfpnZ7lkIrmr5vop4bpopEs5Y+v5pKt5pS+OicrdmlkZW9VcmwpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gaXNEbShyZXQpIHtcXG4gICAgICAgIGlmICghcmV0KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWVcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoYXNEbShyZXQuc3BsaXQoJyMnKVswXS5zcGxpdCgnOycpWzBdLCBkbVVybHMpXFxuICAgIH1cXG4gICAgcmV0dXJuIGlzRG0odmlkZW9VcmwpXFxufVxcblxcbmZ1bmN0aW9uIGxhenlQYXJzZShwbGF5VXJsLG1zLHRtLHJlY2hhbmdlKXtcXG4gICAgLy8gbG9nKCfosIPnlKjku5PlupPlhY3ll4XmjqLkvKDlj4LotoXml7bkuLo6Jyttcyk7XFxuICAgIHRtID0gcGFyc2VJbnQodG0pfHw1MDAwO1xcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzLGlzQmFkVmlkZW99ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2UpO1xcbiAgICAvL2xvZyhyZWFsVXJsKTtcXG4gICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyl7Ly9ib29s5YC85bCx5piv5aSx6LSlXFxuICAgICAgICB0cnl7XFxuICAgICAgICAgICAgbGV0IHJ1cmw9cmVhbFVybC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCIjXFxcIilbMF07XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdChydXJsLHt0aW1lb3V0OnRtfSkpLnVybFxcbiAgICAgICAgfWNhdGNoKGUpe1xcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICB9XFxuICAgICAgICAvL3JldHVybiByZWFsVXJsXFxuICAgIH1cXG5cXG4gICAgLy9sb2coXFxcIuiuv+mXrui2heaXtjpcXFwiK3RtKTtcXG4gICAgbG9nKFxcXCLlsJ3or5XpgZPplb/ku5PlupN4NeWFjeWXhTpcXFwiK3BsYXlVcmwpO1xcbiAgICBjbGVhclZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgbGV0IGJhZD0kKFxcXCLnvZHnu5zkuI3kvbPmiJbogIXnlpHkvLzlr7nmlrnnvZHnq5nmjILkuobvvIzkvaDopoHmn6XnnIvlhbbnvZHpobXlkJfvvJ9cXFwiKS5jb25maXJtKChwbGF5VXJsKT0+e1xcbiAgICAgICAgbG9nKFxcXCLnvZHnq5nnnIvotbfmnaXmjILkuoY6XFxcIitwbGF5VXJsKTtcXG4gICAgICAgIHJldHVybiBwbGF5VXJsXFxuICAgIH0scGxheVVybCk7XFxuICAgIHRyeXtcXG4gICAgICAgIHZhciBiYWNrPXJlcXVlc3QocGxheVVybCx7aGVhZGVyczogZ2V0SGVhZGVycyhwbGF5VXJsKSx0aW1lb3V0OnRtfSk7XFxuICAgICAgICAvL3ZhciBiYWNrPWZldGNoKHBsYXlVcmwse2hlYWRlcnM6IHsnVXNlci1BZ2VudCc6IFBDX1VBfX0pO1xcbiAgICAgICAgaWYoIWJhY2spe1xcbiAgICAgICAgICAgIGxvZyhcXFwi572R56uZXFxcIitwbGF5VXJsK1xcXCLnoa7lrp7llaXkuZ/msqHov5Tlm55cXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gYmFkXFxuICAgICAgICB9ZWxzZSBpZigvI0VYVElORi8udGVzdChiYWNrKSl7XFxuICAgICAgICAgICAgLy9sZXQgbGNhY2hlPVxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvLm0zdThcXFwiO1xcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrKTtcXG4gICAgICAgICAgICAvL3JldHVybiBsY2FjaGUrXFxcIiMjXFxcIitwbGF5VXJsK1xcXCIjaXNWaWRlbz10cnVlI1xcXCJcXG4gICAgICAgICAgICBwbGF5VXJsPWNhY2hlTTN1OChwbGF5VXJsKTtcXG4gICAgICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICAgICAgfWVsc2UgaWYoKCEv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QoYmFjaykpJiYoIS9odHRwfHVybC8udGVzdChiYWNrKSkmJighL21zZ3xjb2RlfGh0bWwvLnRlc3QoYmFjaykpKXtcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+eWkeS8vOWvueaWueaVsOaNruWKoOWvhuS6hu+8jOWFt+S9k+aVsOaNrueci+aXpeW/lydcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoKGUpe1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gYmFkXFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGJhY2s9SlNPTi5wYXJzZShiYWNrKTtcXG4gICAgICAgIGxldCByZWFsVXJsPWJhY2sudXJsO1xcbiAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT1cXFwidW5kZWZpbmVkXFxcInx8IXJlYWxVcmwpe1xcbiAgICAgICAgICAgIGxvZyhiYWNrKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YGT6ZW/5LuT5bqT6Kej5p6Q5aSx6LSl77yB6L+U5Zue5pKt5pS+5Zyw5Z2A5Li656m6XFxcIlxcbiAgICAgICAgfSBlbHNlIGlmKHR5cGVvZihpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpKT09J3N0cmluZycpe1xcbiAgICAgICAgICAgIHJldHVybiBpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmwrXFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vZWxzZXtcXG4gICAgICAgIC8vcmVhbFVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgLy8gfVxcbiAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhcXFwi5qOA5rWL5Yiw6Kej5p6Q5Y+j6Z2eanNvbumUmeivrzpcXFwiK2UubWVzc2FnZSsnLOW8gOWni3g15YWN5ZeF5o6iJyk7XFxuICAgICAgICAvLyByZXF1aXJlKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9qcy9sc2cuanMnKTsvL+W8leeUqOacrOWcsOWCqOWtmOaPkuS7tlxcbiAgICAgICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpOy8v5byV55So5a2Q6aG16Z2i5pys5Zyw5YKo5a2Y5o+S5Lu2XFxuICAgICAgICBsZXQgbG9jYWxfbXMgPSBsc2cuZ2V0SXRlbSgndGltZW91dCcpO1xcbiAgICAgICAgbGV0IG1zID0gcGFyc2VJbnQobXMpfHxwYXJzZUludChsb2NhbF9tcyl8fDUwMDA7XFxuICAgICAgICBsZXQgbWF4X2NvdW50PU1hdGguY2VpbChtcy8yNTApO1xcbiAgICAgICAgbG9nKFxcXCLmnKzmrKHll4XmjqLotoXml7Y6XFxcIittcytcXFwi5YWx6K6h5b6F5oqT5YyFOlxcXCIrbWF4X2NvdW50K1xcXCLmrKFcXFwiKTtcXG4gICAgICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHliIfmjaJ3ZWLll4XmjqIuLi4nKTtcXG4gICAgICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLHJlY2hhbmdlLHBsYXlVcmwsbWF4X2NvdW50LFBDX1VBLGlzQmFkVmlkZW8pPT57XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGZiYSk9PSd1bmRlZmluZWQnfHwhZmJhKXtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVxdWVzdCk9PSd1bmRlZmluZWQnfHwhcmVxdWVzdCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZmJhLnB1dFZhcihcXFwiX3g1anhVcmxcXFwiLHBsYXlVcmwpO1xcbiAgICAgICAgICAgICAgICBpZih3aW5kb3cuY291bnQgPT0gbnVsbCl7XFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQ9MTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgdGV4dD0nJztcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcbiAgICAgICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09PTEpe1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5qOA5rWL5Yiw5pyJ5o6I5p2D77yM5byA5aeL6L+H5o6I5p2DXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvY2F0aW9uLnJlbG9hZCgpO1xcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1mYmEuZ2V0VmFyKFxcXCJfeDVqeFVybFxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudCsrO1xcbiAgICAgICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonK3dpbmRvdy5jb3VudCsnLG1heF9jb3VudDonK21heF9jb3VudCk7XFxuICAgICAgICAgICAgICAgIGlmKCB3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KXtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIui2hei/h1xcXCIrbWF4X2NvdW50KjI1MCtcXFwi5q+r56eS5pyq6I635Y+W5Yiw6LWE5rqQ5Zyw5Z2A77yM6Lez5Yiw5rqQ572R6aG1LOS7peS4i+aYr+WKoOi9vei/h+eahOWcsOWdgFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXCJib2R5XFxcIikuaW5uZXJUZXh0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2codGV4dCk7XFxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKEpTT04uc3RyaW5naWZ5KF9nZXRVcmxzKCkpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYmEuZ2V0VmFyKFxcXCJfeDVqeFVybFxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucGF1c2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcInZpZGVvXFxcIiksIGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImF1ZGlvXFxcIiksIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiZW1iZWRcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCIjcGxheWVyXFxcIik7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodmlkZW8pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjIsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhKU09OLnN0cmluZ2lmeSh1cmxzKSk7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gdXJscykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO31jYXRjaChlKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdT11bmVzY2FwZSh1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhcXFwidXJs5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3VybD1cXFxcLy8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCJ2aWTliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPVxcXFwvLy50ZXN0KHUpJiYvXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QgPSB1Lm1hdGNoKC8oLiopXFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGhvc3QrdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwidmlk5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFw/KC4qKT1odHRwLy50ZXN0KHUpJiYvXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFxcXCJodHRwXFxcIit1LnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5YW25LuW5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vfGluZGV4XFxcXC5tM3U4JFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFwvMVxcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSxyZWNoYW5nZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyYmIWlzQmFkVmlkZW8odSkpey8v6L+H5ruk5ZCK5q+b6KeG6aKRXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnlfYnJpZGdlX2FwcC5zZXRXZWJVYShQQ19VQSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEuZ2V0SGVhZGVyVXJsKSE9PSd1bmRlZmluZWQnJiZ0eXBlb2YocmVjaGFuZ2UpIT09J2Z1bmN0aW9uJyl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYmFja1VybCA9IGZiYS5nZXRIZWFkZXJVcmwodS5yZXBsYWNlKFxcXCI7e1xcXCIsXFxcIiNpc1ZpZGVvPXRydWUjO3tcXFwiKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFja1VybCA9IGZiYS5nZXRIZWFkZXJVcmwodXJsc1tpXSkucmVwbGFjZSgnO3snLCcjaWdub3JlSW1nPXRydWUjI2lzVmlkZW89dHJ1ZSM7eycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUxID0gYmFja1VybC5zcGxpdCgnI2lnbm9yZUltZycpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUyID0gJyNpZ25vcmVJbWcnK2JhY2tVcmwuc3BsaXQoJyNpZ25vcmVJbWcnKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdXJsPVxcXFwvLy50ZXN0KHUxKSYmL1xcXFwubTN1OC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0MSA9IHUxLm1hdGNoKC8oLiopXFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGhvc3QxK3UxLnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcLy8udGVzdCh1MSkmJi9cXFxcLm0zdTgvLnRlc3QodTEpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdDEgPSB1MS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBob3N0MSt1MS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFw/KC4qKT1odHRwLy50ZXN0KHUxKSYmL1xcXFwubTN1OC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gXFxcImh0dHBcXFwiK3UxLnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tVcmwgPSB1MSArIHUyO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZygn6L+U5Zue6Ieq5Yqo5YqgY29va2ll6ZO+5o6lOicrYmFja1VybCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKCfov5Tlm57pk77mjqU6Jyt1Kyflubboh6rliqjliqDkuoZjb29raWUs5YW35L2TY29va2ll5Zyo6KeG6aKR5pKt5pS+5aSE5p+l55yLJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFja1VybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNle1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi6L+U5Zue5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcIityZWFsVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgLy8gZnlfYnJpZGdlX2FwcC5sb2coJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgYWxlcnQoJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+aKpemUmee7k+adn3g1J1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0saXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSxpc0JhZFZpZGVvKTtcXG4gICAgICAgIGxldCB1c2VXZWI9bHNnLmdldEl0ZW0oXFxcIumAmuWFjVxcXCIsXFxcIlg1XFxcIik9PT1cXFwiV0VCXFxcIjtcXG4gICAgICAgIC8vbG9nKFxcXCLku5PlupPkvb/nlKh3ZWLpgJrlhY3mm7/ku6N4NTpcXFwiK3VzZVdlYik7XFxuICAgICAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXCJ3ZWJSdWxlOi8vXFxcIjpcXFwieDVSdWxlOi8vXFxcIjtcXG4gICAgICAgIGxldCB4NVVybCA9IHJ1bGVIZWFkK3BsYXlVcmwrICdAJyArX3g1O1xcbiAgICAgICAgcmV0dXJuIHg1VXJsXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24geDVQYXJzZVBybyh4NWxpc3QseDVUaW1lb3V0LGlzVmlkZW8pe1xcbiAgICBsZXQgYnBhdGggPSAnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+a1t+mYlOWXheaOouWZqC5odG1sJztcXG4gICAgbGV0IGJjb2RlID0gZmV0Y2goYnBhdGgpO1xcbiAgICBpZighYmNvZGV8fCEvZnlfYnJpZGdlX2FwcC8udGVzdChiY29kZSkpe1xcbiAgICAgICAgbG9nKCfmnKzlnLDmnKrlronoo4Xll4XmjqLlmajvvIzlvIDlp4vlronoo4UnKTtcXG4gICAgICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgICAgICBsZXQgaHRtbCA9IGZldGNoKGFwaS5ob3N0KycvcnVsZWxpc3QuanNvbj9pZD0yMDU1Jyk7XFxuICAgICAgICBpZigv5rW36ZiU6KeG55WMLy50ZXN0KGh0bWwpKXtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYnBhdGgsaHRtbCk7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYnBhdGgsZmV0Y2goJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2h0bWwvZ2V0VmlkZW8uaHRtbCcpKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHg1VGltZW91dCA9IHBhcnNlSW50KHg1VGltZW91dCl8fDUwMDA7XFxuICAgIGxldCBtYXhfY291bnQ9KHg1VGltZW91dC8yNTApOyAvL+agueaNrui2heaXtuiHquWKqOiuoeeul+S6huWPr+aJp+ihjOeahOasoeaVsFxcbiAgICBwdXRWYXIoJ3g1TGlzdCcsSlNPTi5zdHJpbmdpZnkoeDVsaXN0KSk7XFxuICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLCBtYXhfY291bnQseDVUaW1lb3V0LGlzQmFkVmlkZW8pID0+IHtcXG4gICAgICAgIC8v5Yid5aeL5YyWZmJh5ZKMcmVxdXN0XFxuICAgICAgICBpZiAodHlwZW9mIChmYmEpID09ICd1bmRlZmluZWQnIHx8ICFmYmEpIHtcXG4gICAgICAgICAgICB2YXIgZmJhID0gZnlfYnJpZGdlX2FwcDtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVxdWVzdCkgPT0gJ3VuZGVmaW5lZCcgfHwgIXJlcXVlc3QpIHtcXG4gICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKHdpbmRvdy5jb3VudCA9PSBudWxsKSB7XFxuICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudCA9IDE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCB0ZXh0PScnO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxuICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PTEpe1xcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcXG4gICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5qOA5rWL5Yiw5pyJ5o6I5p2D77yM5byA5aeL6L+H5o6I5p2DXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHdpbmRvdy5jb3VudCsrO1xcbiAgICAgICAgICAgIC8vIGZiYS5sb2coJ2NvdW50OicgKyB3aW5kb3cuY291bnQgKyAnLG1heF9jb3VudDonICsgbWF4X2NvdW50KTtcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID49IG1heF9jb3VudCkge1xcbiAgICAgICAgICAgICAgICBmYmEuY2xlYXJWYXIoJ3g1TGlzdCcpO1xcbiAgICAgICAgICAgICAgICBmYmEuaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgbGV0IGZtc2cgPSAn6YGT6ZW/5LuT5bqT6YCa5YWN6Kej5p6Q5aSx6LSlLOWOn+WboDrotoXml7YnK3g1VGltZW91dCsn5q+r56eSJztcXG4gICAgICAgICAgICAgICAgZmJhLmxvZyhmbXNnKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZm1zZztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGVsZW0ucGF1c2UoKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcInZpZGVvXFxcIiksIGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImF1ZGlvXFxcIiksXFxuICAgICAgICAgICAgdjIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJlbWJlZFxcXCIpLCB2MyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcIiNwbGF5ZXJcXFwiKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHZpZGVvcywgZnVuY3Rpb24gKHZpZGVvKSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZSh2aWRlbyk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbChhdWRpb3MsIGZ1bmN0aW9uIChhdWRpbykge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjIsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYzLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdXJscykge1xcbiAgICAgICAgICAgICAgICBsZXQgdT11cmxzW2ldO1xcbiAgICAgICAgICAgICAgICAvL3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO1xcbiAgICAgICAgICAgICAgICB0cnl7dT1kZWNvZGVVUklDb21wb25lbnQodSk7fWNhdGNoKGUpe1xcbiAgICAgICAgICAgICAgICAgICAgdT11bmVzY2FwZSh1KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL1xcXFw/KC4qKT1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cFxcXCIrdS5zcGxpdCgvXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAvL2ZiYS5sb2coXFxcIuWFtuS7luWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXC8xXFxcXC5tM3U4JC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHUpO1xcbiAgICAgICAgICAgICAgICBpZiAocmVhbFVybCYmIWlzQmFkVmlkZW8odSkpIHsvL+i/h+a7pOWQiuavm1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcIiArIHJlYWxVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpXFxuICAgICAgICB9XFxuICAgIH0sIGlzVmlkZW8sIG1heF9jb3VudCx4NVRpbWVvdXQsaXNCYWRWaWRlbyk7XFxuICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFwi6YCa5YWNXFxcIixcXFwiWDVcXFwiKT09PVxcXCJXRUJcXFwiO1xcbiAgICAvL2xvZyhcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcIit1c2VXZWIpO1xcbiAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXCJ3ZWJSdWxlOi8vXFxcIjpcXFwieDVSdWxlOi8vXFxcIjtcXG4gICAgcmV0dXJuIHJ1bGVIZWFkK2JwYXRoKydAJyArIF94NTtcXG59XFxuXFxuZnVuY3Rpb24gTGF6eVBhcnNlRmFzdChwbGF5VXJsTGlzdCxnZXRUaW1lb3V0LHg1VGltZW91dCl7XFxuICAgIGNvbnN0IHtpc1ZpZGVvLGdldEhlYWRlcnMseDVQYXJzZVByb30gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcbiAgICAvLyBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqI6JytwbGF5VXJsTGlzdCk7XFxuICAgIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOoicpO1xcbiAgICBsZXQgcGxheVVybHMgPSBwbGF5VXJsTGlzdC5tYXAoKGl0KT0+e1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcIjtcXFwiKVswXSxcXG4gICAgICAgICAgICBvcHRpb25zOiB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiRGFydC8yLjEzIChkYXJ0OmlvKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiBnZXRUaW1lb3V0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IGJodG1sID0gYmF0Y2hGZXRjaChwbGF5VXJscyk7XFxuICAgIGxldCB2aWRlb3MgPSBbXTtcXG4gICAgbGV0IHg1bGlzdCA9IFtdO1xcbiAgICBmb3IobGV0IGkgaW4gYmh0bWwpe1xcbiAgICAgICAgbGV0IG9yZGVyID0gcGFyc2VJbnQoaSkrMTtcXG4gICAgICAgIGxldCB0bmFtZT1vcmRlcisn5Y+36Kej5p6Q572R5Z2AOic7XFxuICAgICAgICAvL2xvZyh0bmFtZSk7XFxuICAgICAgICBsZXQgdHVybD1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFwiO1xcXCIpWzBdO1xcbiAgICAgICAgbGV0IGpuYW1lPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjE/cGxheVVybExpc3RbaV0uc3BsaXQoXFxcIjtcXFwiKVsxXTpcXFwiXFxcIjtcXG4gICAgICAgIHRuYW1lKz1qbmFtZTtcXG4gICAgICAgIGxldCBiYWNrY29kZSA9IGJodG1sW2ldO1xcbiAgICAgICAgaWYoKCEvdXJsfGh0dHAvLnRlc3QoYmFja2NvZGUpKSYmKCEvI0VYVElORi8udGVzdChiYWNrY29kZSkpKXtcXG4gICAgICAgICAgICBsb2codG5hbWUrdHVybCsn5pyJ6Zeu6aKYLOWPr+iDveWKoOWvhuaIluiAheaMguS6hicpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKXtcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW9fXFxcIit0bmFtZStcXFwiLm0zdThcXFwiO1xcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrY29kZSk7XFxuICAgICAgICAgICAgLy92aWRlb3MucHVzaChsY2FjaGUpO1xcbiAgICAgICAgICAgIGxldCBwVXJsPWNhY2hlTTN1OCh0dXJsKTtcXG4gICAgICAgICAgICB2aWRlb3MucHVzaChwVXJsKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IEpTT04ucGFyc2UoYmFja2NvZGUpLnVybDtcXG4gICAgICAgICAgICBpZigvXmh0dHAvLnRlc3QodXJsKSl7XFxuICAgICAgICAgICAgICAgIGxldCByZWFsVmlkZW8gPSBpc1ZpZGVvKHVybCk7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVmlkZW8pPT0nc3RyaW5nJyl7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+W3suino+aekOWHuuinhumikTonK3JlYWxWaWRlbyk7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFZpZGVvKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2gocmVhbFZpZGVvKTtcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+ino+aekOWHuuS4jeefpemBk+S7gOS5iOS4nOilvzonK3VybCk7XFxuICAgICAgICAgICAgICAgICAgICB1cmwrPVxcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2godXJsKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+S4umpzb27mjqXlj6PkuJTml6Dov5Tlm57op4bpopHlnLDlnYDmlbDmja46JytwbGF5VXJsTGlzdFtpXSsnXFxcXG4nK2JhY2tjb2RlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2codG5hbWUrJ+S4ung15o6l5Y+jLOWKoOWFpXg15ZeF5o6i5YiX6KGoJyk7XFxuICAgICAgICAgICAgeDVsaXN0LnB1c2gocGxheVVybExpc3RbaV0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIC8vIGxvZyh2aWRlb3MpO1xcbiAgICBpZih2aWRlb3MubGVuZ3RoPjApe1xcbiAgICAgICAgaWYoZ2V0VmFyKCdkcC5jYWNoZVZpZGVvJywndHJ1ZScpPT09J3RydWUnJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMjU1KVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxvZyhcXFwi5bCK5pWs55qE6a2U5pat55So5oi377yM6KeG6aKR57yT5a2Y5bey5ZCv55So77yM6K+35bC95oOF5Lqr5Y+X55yL5Ymn5pe25YWJXFxcIik7XFxuICAgICAgICAgICAgbGV0IHZpZGVvc0NhY2hlPXZpZGVvcy5tYXAoKGl0KT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycz17fTtcXG4gICAgICAgICAgICAgICAgaWYoaXQuc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZCA9IGl0LnNwbGl0KCc7JylbMV07XFxuICAgICAgICAgICAgICAgICAgICBpZigvQC8udGVzdChoZWFkKSYmL3t8fS8udGVzdChoZWFkKSl7XFxuLy9oZWFkID0gaGVhZC5yZXBsYWNlKC97fH0vZywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoXFxcIntcXFwiKVsxXS5zcGxpdChcXFwifVxcXCIpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KCcmJicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBoZWFkKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGhlYWRbaV0uc3BsaXQoJ0AnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID1oZWFkW2ldLnNwbGl0KCdAJylbMV0ucmVwbGFjZSgvOy8sJ++8m++8mycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDppdC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCLimIVcXFwiKVswXSxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6e1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6aGVhZGVyc1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgdmFyIGRhdGE9YmF0Y2hDYWNoZU0zdTgodmlkZW9zQ2FjaGUpO1xcbiAgICAgICAgICAgIGRhdGE9ZGF0YS5tYXAoKGl0LGlkKT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgZXh0cmE9XFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIGlmKHZpZGVvc1tpZF0uc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFwiO1xcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFwiO1xcXCIpWzFdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXCLimIVcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFwi4piFXFxcIit2aWRlb3NbaWRdLnNwbGl0KFxcXCLimIVcXFwiKVsxXTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICBpZihpdCtcXFwiXFxcIiE9XFxcIm51bGxcXFwiKXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCtleHRyYVxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWRlb3NbaWRdXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhkYXRhKTtcXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxcbiAgICAgICAgICAgIC8vcmV0dXJuIHZpZGVvc1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHZpZGVvc1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxvZygn5YWx5pyJJyt4NWxpc3QubGVuZ3RoKyfkuKp4NeWcsOWdgOi/m+ihjOi9rua1geWXheaOoicpO1xcbiAgICAvL+ayoeacieeahOivneWwseW8gOWni+S+neasoXg15ZeF5o6iXFxuICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHliIfmjaJ3ZWLll4XmjqIuLi4nKTtcXG4gICAgcmV0dXJuIHg1UGFyc2VQcm8oeDVsaXN0LHg1VGltZW91dCxpc1ZpZGVvKTtcXG59XFxudmFyIGxhenk9JCgnJykubGF6eVJ1bGUoKCk9PntcXG4gICAgdHJ5e1xcbiAgICAgICAgcmVhbFVybD1pbnB1dDtcXG4gICAgICAgIGV2YWwoXFxcInZhciBjb25maWdfZHAgPVxcXCIgKyBmZXRjaChcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9NeVBhcnNlU2V0Lmpzb25cXFwiKSk7XFxuICAgICAgICBldmFsKGZldGNoKGNvbmZpZ19kcC5jaikpO1xcbiAgICAgICAgbG9nKGlucHV0KyctPuato+WcqOaWreaPkumtlOaUueeJiOino+aekC4uLicpO1xcbiAgICAgICAgLy8g5Yqg5YWl6LaF5pe26K6+572u77yM5bu66K6u5Zyo6aaW6aG16K6+572uXFxuICAgICAgICByZXR1cm4gYXl0bVBhcnNlKHJlYWxVcmwpXFxuICAgIH1jYXRjaChlKXtcXG4gICAgICAgIHJldHVybiBpbnB1dFxcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzLmlzUGljPWlzUGljO1xcbiQuZXhwb3J0cy5pc1ZpZGVvPWlzVmlkZW87XFxuJC5leHBvcnRzLmlzQmFkVmlkZW89aXNCYWRWaWRlbztcXG4kLmV4cG9ydHMuY29tUGFyc2U9Y29tUGFyc2U7XFxuJC5leHBvcnRzLmdldEhlYWRlcnM9Z2V0SGVhZGVycztcXG4kLmV4cG9ydHMubGF6eVBhcnNlPWxhenlQYXJzZTtcXG4kLmV4cG9ydHMueDVQYXJzZVBybz14NVBhcnNlUHJvO1xcbiQuZXhwb3J0cy5MYXp5UGFyc2VGYXN0PUxhenlQYXJzZUZhc3Q7XFxuJC5leHBvcnRzLmxhenk9bGF6eTtcIn0se1wibmFtZVwiOlwi5Lu75Yqh5LuT5bqT5o6l5Y+jXCIsXCJwYXRoXCI6XCJ0YXNrQ2FsbFwiLFwicnVsZVwiOlwianM6XFxuU3RyaW5nLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVwbGFjZSgvKF5cXFxccyopfChcXFxccyokKS9nLCBcXFwiXFxcIik7IH07XFxuZnVuY3Rpb24gdGFza19yZXEodGFza19hcGksdGFzaykgeyAvLyDpgJrnlKjlj5HpgIHku5PlupNwb3N06LCD55So5Lu75Yqh6K+35rGCXFxuICAgIGNvbnN0IHtnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxuICAgIGlmKCFob3VzZUZpbGUpe1xcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxuICAgIH1cXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QodGFza19hcGksIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICB9LFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJkYXRhXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiB0YXNrLm1vZGV8fCdydW4nLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImZ1bmNcXFwiOiB0YXNrLmZ1bmN8fCcnLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHRhc2sucGFyYW1zfHxbXVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXV0aFxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICB9KTtcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfdXBsb2FkKHRhc2speyAvLyDpgJrnlKjku7vliqHlj5HluIPmlrDlop7lj4rkv67mlLnlip/og71cXG4gICAgY29uc3Qge2FwaSxnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxuICAgIGlmKCFob3VzZUZpbGUpe1xcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxuICAgIH1cXG4gICAgbGV0IGFwaV91cmwgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svYWRkJztcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYXBpX3VybCwge1xcbiAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgIH0sXFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcImRhdGFcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IHRhc2submFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJweWNvZGVcXFwiOiB0YXNrLnB5Y29kZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJub3RlXFxcIjogdGFzay5ub3RlLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInRlc3RfY29kZVxcXCI6IHRhc2sudGVzdF9jb2RlLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXV0aFxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICB9KTtcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfY2FsbChpZCxmdW5jLHBhcmFtcyl7XFxuICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9ydW4vJytpZDtcXG4gICAgbGV0IHRhc2sgPSB7XFxuICAgICAgICBtb2RlOidjYWxsJyxcXG4gICAgICAgIGZ1bmM6ZnVuYyxcXG4gICAgICAgIHBhcmFtczpwYXJhbXN8fFtdXFxuICAgIH07XFxuICAgIHJldHVybiB0YXNrX3JlcSh0YXNrX2FwaSx0YXNrKTtcXG59XFxuXFxuZnVuY3Rpb24gdGFza19yZW5hbWUoaWQsbmV3X3Rhc2tfbmFtZSl7XFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9yZW5hbWUvJytpZDtcXG4gICAgdGFza19hcGkgPSB0YXNrX2FwaSsnP25hbWU9Jytob3VzZV9kYXRhLnVzZXJuYW1lKycmcGFzc3dvcmQ9Jytob3VzZV9kYXRhLnBhc3N3b3JkKycmdGFza19uYW1lPScrbmV3X3Rhc2tfbmFtZTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT0wKXtcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0KycnK3Jlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX2NoYW5nZV9zdGF0ZShpZCl7XFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9jaGFuZ2Vfc3RhdGUvJytpZDtcXG4gICAgdGFza19hcGkgPSB0YXNrX2FwaSsnP25hbWU9Jytob3VzZV9kYXRhLnVzZXJuYW1lKycmcGFzc3dvcmQ9Jytob3VzZV9kYXRhLnBhc3N3b3JkO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZmV0Y2godGFza19hcGkse30pKTtcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PTApe1xcbiAgICAgICAgICAgIHJldHVybiAgcmVzdWx0LmRldGFpbFxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQrJycrcmVzdWx0LmRldGFpbFxcbiAgICAgICAgfVxcbiAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgcmV0dXJuICcnK2UubWVzc2FnZVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfcnVuKGlkKXtcXG4gICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3J1bi8nK2lkO1xcbiAgICBsZXQgdGFzayA9IHt9O1xcbiAgICByZXR1cm4gdGFza19yZXEodGFza19hcGksdGFzayk7XFxufVxcblxcbiQuZXhwb3J0cy50YXNrQ2FsbCA9IHRhc2tfY2FsbDtcXG4kLmV4cG9ydHMudGFza1J1biA9IHRhc2tfcnVuO1xcbiQuZXhwb3J0cy50YXNrUmVxID0gdGFza19yZXE7XFxuJC5leHBvcnRzLnRhc2tVcGxvYWQgPSB0YXNrX3VwbG9hZDtcXG4kLmV4cG9ydHMudGFza1JlbmFtZSA9IHRhc2tfcmVuYW1lO1xcbiQuZXhwb3J0cy50YXNrQ2hhbmdlU3RhdGUgPSB0YXNrX2NoYW5nZV9zdGF0ZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWFqOWxgOWCqOWtmFwiLFwicGF0aFwiOlwibG9jYWxTdG9yYWdlXCIsXCJydWxlXCI6XCJsZXQgbG9jYWxTdG9yYWdlID0gKGZ1bmN0aW9uKCkge1xcbiAgICBldmFsUHJpdmF0ZUpTKFxcXCJqd1VLd05UaVBHY1dTTENYQjVYdEFYd2I2TFFiVnlIRCswWEo3bDA3Y2UwPVxcXCIpO1xcbiAgICAvL3BhdGh0bz11bmRlZmluZWQ7XFxuICAgIGV2YWxQcml2YXRlSlMoXFxcIjRDMFl4UlluR0NZa2dGUlh0cGwvQ3o1ekw1aGg0akNDenRiK25nK1dva3ltUThvVXJ6UzlsQTh5eEM1YUZhZG5TRW15SEtNYnJhZmxScVhDbk5SSERsazZ1ZTh5SFRPMTZsQlBycHdnczVqZjBQaHJBdG9USklFMFpIbjltS2FRNEpkMmVycWI0STU1YmVXSWV1Z0tzRHMyMTFTeklOUTV5SmdTaDFkVnVOenp4UkdKZzQwRm1UdVZtWFZmTjF4ZzJXSUdIQkVta1ZuR3htT1JoUE9OQStRNVZ3UG1kcDQxL2h6ZTNlSXNVdmhvN1ZDQmdLNHJhSm1QYWxJUkJCVmxDVmduOEZrV21mS3FabytWVytvQmNIN2hyY3JzU2xDU2pCYW5nVC83c3lXSHhLWWhlaFUwa2FNWWpuV0ZnMUVtMGNtTlJ0b21Dc0h6MUI4cTMyT2VRSG9hd2RXeHpLT2FNSE9YREJqUm9qQThFL2FoMFdST3l6aXFSU3hsL204ZGhCZDBmOXBoWXovNVNVL3pKRDUyWC85RUMxNldWVmRwU1czM2FrUkhSc2xQcFJsVFdGOStBeVJtUncwZVpPRXMxbzlRTVBBUVVmQXhiWXlGSGd6dHcvTzJkSlJwSHlUbWlCaWFhcVRjaXZ4NnY5enl2QnowNHdJMUFhU0N1aStkVHVVM2x1NXhkRXQzQWp0NlozaURYT1ZjRVAwRURGNzQ3NFBRVTZKRVp1d2U5N1NjaDRiaTF3QjFYSFpTZkl0ZGxZWW9HZWQzTExwYm1EQUlSY2l2MHJBb3A4Vm1RY1R0MkszTGZoMVJEWVkwWXR2UmNINDlPdnBEUkgveGE1RmM4TVkzRHJGb0E3cWNvRjRlQ2dpVkJmQmdKUjY4K0xwUUs3dE9rZzhrOWVjKzNOU3hKVGhjbDhkNnlOd3hUOVRrMTd6ZUpnZDZNb3lZWklwV1FMbEY2WXZiT2RFV2hqbW5BNzh3QzBoV3orWG02aFFNU3F0RncrYmhGZjdjQkdVM2FhdFBGbWRDWTJFZFhmaDBJWVc4NXdkT3lNZml3VzcvdlZUcDlpRTAwSTNGMDl3R0hrR0toVmJMdWVBa1llN3p6SlhSN3RoYUZvcjZIN3FMbUpqYlJRazlldk50QlFYTlI3RGlmaVh1UWYybHQ3bk9IODBTV20xZkRISHpqbVBzTklwczJUWEdUK2l3VlY2OWcvdFdpcFZRNkQ4QlR4K2NDUXA0N25tVElyWStxTjRraDJGWWg1TGx3WGRnSXl5MVZJdUMzeDA1M2V3QUlJVW1sWTluaUVwcVl0KzFmRlBYT0N0Q0d0WWJTZDM3dlZSMUVPajJrNUd1Lys5SldnMnF2d2wxdHdlbGcxSjB0eGFySWk0a1RiVHJ2cm5GTE45MnBvZnBaUVVmb1dvNGNlN0hXTmRidTRKS0VyYUxRVWZkZkdFUGQxVEl1ZnV1UlZhMzllcTlHWnlTRHVCTDYwTVBkbGR4S3cxem8rZkI1WlkrWU1qM0xMMmdHdERiczk4K0FzUlY5TEpXbVVtc3g5MWhtSnRGVU1XRDN4bmo4SE1aV3MwTlBsQ0ZVcjk0ODVLcVRwbzVrUnpHZkYray9ObDJKenJ2NWN2a3F0VW5MZ0twWEVPai9zZS9vRHpPQXJRS0k1VE5VYnZZd2N3Y2Rqak1TZmpLNjhLcndocytuNlNtV1o0WmRnUkhnQUs1TW9GaTNYbUxWNDdQM3ZTUld1NXp5RXNNazR5M3V1Q0ZpdVJQUmx1NFE1cEp2dU9lbTdIN1VMaUloQ2VtdjVEZ2tHdERMMWNHTDRFUWhZUkI2SVN6VnZzYjJFYVA5d1FFNkRWUm5NN08rcG5TemV0Nmx6cDNwRmRHbmJveDFMUmZDNjB1dFhaK0NqSW00aUVNbXRiQjJONXpEU2hHYmVNM1hVYkpRZENCaXM4WElyaGgyYmlCNWhCQ1Z3bjNZM2V0dDdHRFBWdG9pMUdSanorSmJnTStZUjkyOEtiZFdTNXRGYU1NM0tqM1h2Nm90SXh6TUJuREM5dVczZCtJWHg2dkxQSjBKUnVoM3lQN3BUbGE2YzNpUjRwOW5XWURxSitaU21wckhGbkRPenNMV21GamFwamUvTXF3TUpkNlRrM25BV3dpY01PUHVZcE15cUlGMDRmbDRtcWd0c0hMU01XUlJOSFBaakVUUTlnUm1lRFllNmFSdGxXMDJxTDJvbERFTnFMUU10QWRvaXJOV1JjUDlWTDNUZDhIYVVPNmZTbEdOYWJNYWtKRC8wMFhDaE9TVU9JUCs3Zk03VjAvbDFiTFdQdEV6MWk3THlnVFY3cGRHb0RudHFTQ0VuSnJCeWhCQXpMUmc1UUljOTQzOEloS215Zm4wLzNhd29EMUlyNzgwZXlwL1hjSTZ4TmN3NlR2L0VUZkhnMGU3aVlDMFVZY0pJRTVRVVh2MHMrWW9HSUVxNUdJekt1YjhITmpTVFVwc3Zua1Z4K2RiZTJqUm4zWWI5VzdKQ1o1WVM2RjVNeVVWc3BqTUQ3TlljK0RXalVMMmIyc1Z5QWZlWXBDOFVoYWg5dHVtYXZiQnY3YTNhOWtnRmJxNThsckh4elk3aUpRVmlnenEzZTFhMkJTYjBQY1cxYUo4QkQ3TmtOcGhLWWF5VHh5a2d3aWxFUkw4anFxQkVuaUhWZEJ4REpZTGIrWHczYWxMbWx0dVRFVjZLR3RCbnRCWCt5ejM2UlBETXlHSUtlKzNmemN4Zm5DRG4yME1vZFZWa1ZOb3pQcU1YWjBHNUw0YUxUQVFha1lLVWpzVk1RakFoUWtUbEhCZU8vYUxQeDlzeGwrK2oxWjVyTGdHMTJUTjRYSjFlaWN2dzRBVkU1OExvcmFxMFFpRTBjUzdQSDFwYnJaV3JmdDdMWUdpeUJTaG9yNyswamlvVWgxcGRXcTJxTVlMcWVNRWV1Q1JPUXQ1N21Gck9qeVBINDlxcDk3Y1dPcmdlZzJXeWZXU0RHUVBqZTUrUDB5UW9DcEQvRDNSQU11V21iOXdsQnRjcTJqOFdKUHQ5MUUza0thd3VRSXl2ZDJyMlVqeDQrSFROdFZLYjlrTUxPTzg1STY1Yk5HQkgrNGlyU3k1Z1FZbEUyNkEyY1NHSWNMS1FSbHZKb01uYTdMLzl3eXJ5NEh6T3J6a3JBdkxkZ3NTTmxZanBIUUVSaU9JODBzSjVqTkNDbmZ3MDEzRitBK3NBZkxteVMvQkRMTlExcWFRM3A2aDgvSnFBZmhYNU9HSGdTaVJWT0NFanVhREIvTXdaTkN1M1FMOWVoaG9Bajd1T2Y4UGtyM21JamJoaDlIaWpzangxOTErMGUySlFyRmEwMUFWSktFVnR1UHRJYzJoLzFwUEtNdnllbnhqVE8yT3hQbmpqdCs4NG5JS0toeERKL2doUHQ3aXY4UG1USjBsS0t5UFJzc2w4Zi9RZEhkeHVwYjZqVHNJNlVLbXo5WTQ2UE1CdUQ2UDN3aDhxcDM2TzZvaWJORGlRZDFzRTEwdkpoOXoxRnlzS0llOEVxTXBuTmRFbUcyVGZFQnhScG1RcmhLRXFlZTBwNithNnNRbzhjVmxSSmtLUUFZS2F3Y2FORVM1WGM2ZFFZNW5xZWlxOHNVaXpmMXNwZkhlSGVsRHUxTTZCUlh1Q2pGYWZYaHo4aTNsUFdnWXFWcGZ4MTNpZ1ZDUmY0N1VINjUyeUxuc21lcENCV2d5QlRXQWNPeUYxUXg4WUd0Wm5vYjFUTis2eEV3enBjV1Z5N1FPOVA5MnNLQTlTSysvTkhzcWYxM0NPdDBKSEN0VFYxT2xUUVcrSkFLeXhlMUhsNytzOTV6M0tDZ0ZLUVMrM0FzMUpWN05hK2crTENSMklldnU4ZDVEMEw3R3dvRHJlVXY0Mzc0TFJhRmtOc0hPcVdiVTluaFFqZE1WcjdhL2k4Ty80aGJwdGFTenFxa2dZRmlORlUvb21XNXF3SXo3c3A0bnNjSVRSRTNndWE2YnprbE1aOEVDbjFpcUFXdDBhNmdla2k1RGFMOHFZYXBUQ0NoamxXc0V4cUZ1eGlXUDM1VFVDZGRFZDhBQ2JNR3MrZ1FGeURPb3pmQkRHMTdkWk8wbUN3VytQekNMMmpiSUNETmFpNS9qbTFRcjZNTDU2anpVYUlEejBHTFBUU2FleDFVRER3a1E5bzdtWFdDMFI3alduemJrSFJXY29tVmJXbUdxTDFyamRvYWNzL1I5dWpxVXVCQTZBNVZML3FrUTF4SEw0MkVYb29wckM4d3JyZlI2OHpNTUZ4T3dVN0NZSEo3YmhHL1E0ck5zWERCY01vMUFkaXE5TFhiWG0vUUpqMHUvamdaR3NzejBubktLVUZKY3h6dUFOSzk2eld3ZjFEWGFzVWNPb0V1RWF0bTFybVA1d3JCSm1XL1p3VDZhQkJpUjJPU0oweHI4dFE2T2JtZEtqeWIrMWVFWGIxNDM3UjJJZGhEVWRrNVBSenRIMllGdDJwbXVMNC9MbUlMRkF2UGRpeU10REhOaitLaDRzVjRNbFhiV1Byckk5N1lCT0ZwRmxYK2duZXdLS2ZGWmtIRTdkaXR5MzRkVVEyR25lNnNBR3gxenh5alp2NUtCTTI2bFJIRjQ1WHFGTkoxUlEzaE15bUpIc3lZTnNNTzQxQldyR3YxOVBBNDY4ZWN3OUhjUk4wd2hqVVRnbnM4WlZhQzRoaUpzZ1kwN2FBRUJIbTkwL3VoaGpPL1dtYjd3dVZhZGhsOVJuSGVRanB4NGd3Q3JMejVpNXM1SXQxc0J3ZkRiMEZlK1BDcExrYyt3SUlOSzJZODZrUHRoUjZnSndXNzV6dW9ONUMwQ0FpRHdmVTczdmFBWmFoemY0VkxObE0wVTA0T3RIWUJpMTNZZ1BvTm1HSFJlbFpWRXkyS3VLVlpnaEQxNHZTbFkrSnJNQkRkbTJ5MnRoRlYrQnJpaEw3K2ZRNXdjWW54R2VsYXdEdW9TUjUrYkREa3I2Ukw0MEw0eHlmQWh4bHJPbjB1QTI4Z2hHZVdndWFXS0V2NW5CcnJ2ZXUxdWVWeTFNdkdVWUJZK0lsRXI4TmRETlJkbUV6WHQzOWtHbGQ4NnhPZkFIL3hMMVZtdWdhWE9HYVBCMnFjN1dEUmtXNms1RjZuM1BrSXpkUFh5T05LcDFEa09nM29jU01aTVRzNkdLajlDM3ZPRFo2WlFwd05EWUxNVCtDbUVMMThHUmpYTmNabFAvTG5oaUFJc2NZVEwxK2lIV0RZdlJtdlBNd3RPSGhDbkVYSVUzRlRiUCs2UVJHQTZxeWRibm5lcVZoWG93Y0xtYk1JejE2SUMxa3doWmo3NS9NNTNzS1lYMnpSZ09TVEFmTlNELzVsWllTTlV4SmZLVERnaWFGRWdnckNyZCszQ2MrY2h6c2xJM3pEWEVLVHJ2bGNYMkluQzl1SCtmc3lweUh3K0F2WTJPbUJHUU1JSWM4ZkUzdE5PMGdCVFZxWHNkc0U3Nll3SHIyOWR6UWNrdXN1eUpzQmZTVmNscnZzTkNaMVBRREw4SDNjUnMzSEU5blVreDViYkpZV3NQeGI4MjVnbkVwV1U5WjlLdHp2c2xpNy9oZU9sREtwSHhKYjF1Q3JXcWY4Z1JuV21xM3pmU1NyVVhCSFNMdTYyTXJrWFRqV2dhcFVWeE1Ha3JuelIwRTRQTXkxYkZjeURwRVFlMTVUYXlXQk0xQjZqcklHKzBEUlI5T2FDVVB3RDdleE5talpiOU04MXVzK0FJUmZ5ekpQWkdtZkh1VDlTTnpGZk51UWRGWnlpWlZ0YVlhb3ZXdU4yaXJJM3pRYXRLQ0RuUUlYcHIwVmhHMEdvcDhjL3pyb1dCb04vYVZLbW44c2tTRnZBRE9qb1pBaXhnNksxeTl3Rmk4cGVDbWltRlozWnpDVnNHNkVVOVN2bGJxNSt3bjdENnkrZEFZZGFQbXM0Z3dDckx6NWk1czVJdDFzQndmRGJ6NFg0VnhxSXBjVEM5TmFZS3FBN0dLSythVHJaV1V3d04yMVFPdHI4ZXF4U2dKMVU5ZUNPY1dYUWQrcDM2R3k0ZlkrdDljMkNzVk5iTmwxZ2h4YTliSThVNmU2RlRkL3Z2QmFxOWpyS2RpdHE0bU5DYWlvZ21mUEs2TTQ4VVlJOGpaTUNkZC85QzhCcXZVajRiWVU1YnlXQVNFRzZCQkdkSzhLbGZpL2E0TFd0M2l2QzR1OVFCVGZiL3ZDbU5KaS9RQWZhYmNQRytVc1dtc1lOUksrZzhoTWNzdUJtaGg0OE5waFJ2ZWJWUXFxNm5jS3hjMW5GSFdNVzVNNm9mK3o4YzFIZGRuaWVEUDlHYUJzcSt5c2xqS3NsWXJ0OTg5UFk5eHNibWtyM1gvb0NmaUZVNE5mY09oZWUrK25nVzBYcFpBVnQxSTJRbmMxYWx3Ym5vTnFNTWhYSUI5NWlrTHhTRnFIMjI2WnE5c0cvdHJkcjJTQVZ1cm55V3NmSE5qdUlsQldLRE9yZDdWcllGSnZROXhiVm9tS3FRanVoOWR6ZjJudlZyQnpiRUYwQ1pZNml6a1kvUlFZNXI5azkzL3kyTkc3bzA3bk1Zak90WllZZU5Vb2lrN0diSy9IelFsMVM3cy9GQ2hudDlNNmZFMFV5dVBtdHRPOThocXp4UWJ0ZU1hbE10U2NlMldMY2p5WFZHZnBxZEJrWXltNGdaQnljY1M2YW50dDRvTGRsdVdTU0pzSFgxSWNYaFF5Nm9KK0Foanc5aEZZd1hMSFBMb0NvM2pFbGlVQUs0MTc5d3RZdEhzTzBhYkx4NCtobXRNNUZ6N3dVVmFoQkE5c3VwT1RmL0ZENHNpWk1Nb2Y1VzN2bTVEZWRocUdBTmxodDNtSTZSbUlodjQ4UVZ0bmVNc1V6WUM0TkRoWkQ0TTVSNnA3R1hCcWNwdTNGYUVGLzBJMGUzTGNlWDFITitpRHFLUlB1R3p2cGFjLzF0c0dQSXRlQUR4dTlPWW9hcDJ6M0YxQ3pTZy9VdWE4bC9LRXp0QUtEY3ZiaE5VL1lVYzJsaGd4Z2ZkYjRlK1A5VFo3UmFYODJzNjI3dTBDYkZzZkdFLzFoTHBiNU1jMnZrMXVER3JkSWNiV0E2eGhwWUFIWWhFWVVsOWM3NVkvUi8wZ2w2cjkrbTZjSTBCdkJZNUFhNU5CUmM2VU12c08vUE93NUNjcjc5c0p6aWNlYVYzWXdyWUVranA2S2krT1lyR3U5NTRBQStkSjlXc3ZOR0JGR01yS0FmUTlWVUMvQVRrSmZUbG9NbHREZVY1QW85emthYXkzZEtBYTUvUHhBR1JEQVVjUUxERjd1VlhiRDF2RmdFLytSWGl3elM1TjdjcjNhRkJkUlk3WEFtRnovZmIwL0tTcFI4Q1EvbG9rcG1NMm1sdEo5dkdQZ2lxYjVuWmw5S3U3ZDJHbGdBZGlFUmhTWDF6dmxqOUgvU0J1akJQb08xZnBvT3U1RjM1Y2RIYTVrU0Z2QURPam9aQWl4ZzZLMXk5d0ZsajBFejVrc1VXM1dVNjNFN2U0cXREVUNLV3dqalU1ZjBGZDU3VnlWenBDNkNkQ1NjQmpZU3pUOXJaTFZza3E2MWFPV3JERFVOS3FBUTMrblgvQkJXM2NRVEVjT1ZkYzE1bmdWWGNTUy9hSzJRRk1kaUtRbHFtMTVmRXJKZHdxeWV6YTdoZmxLVGlDelVkdTVWR2xGVzlxQ3Q4c3lIb29zQTJOemZvc0pkVGROOGJXSG5vRHI1TjI1ZXQrcC9udmpqT3paUmFMWW9ZL2ZyL2s1aHFwdE9rPVxcXCIpO1xcbiAgICByZXR1cm4gJC5leHBvcnRzO1xcbn0pKCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvJbovpHlhazlkYpcIixcInBhdGhcIjpcImRldkluZm9FZGl0XCIsXCJydWxlXCI6XCJqczpcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCk9PntcXG4gICAgcHV0TXlWYXIoXFxcImRldkluZm9cXFwiLCcnKTsgLy/muIXpmaTljoblj7LlhazlkYpcXG59KSk7XFxuc2V0UGFnZVRpdGxlKCfnvJbovpHlhazlkYonKTtcXG4vLyBsZXQge25vd0p4LE15SmlleGksanhzUm91dGV9ID0gTVlfUEFSQU1TO1xcbmNvbnN0IHtjb2xvcixzbWFsbCxhcGksIGdldEZpbGUsZ2V0QXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbi8vIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG52YXIgZGV2X2luZm9fdXJsID0gZ2V0QXBpKCdpbmZvR2V0VXJsJyk7XFxuLy8gbG9nKGRldl9pbmZvX3VybCk7XFxudmFyIGdldF9pbmZvID0gZnVuY3Rpb24ocXEpe1xcbiAgICBxcSA9IHFxfHwnNDM0ODU3MDA1JztcXG4gICAgbGV0IGRldl9pbmZvX3VybCA9IGRldl9pbmZvX3VybCtxcTtcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXG4gICAgbGV0IGRldl9pbmZvPWJhY2tfY29kZS5yZXN1bHR8fGJhY2tfY29kZS5kZXRhaWw7XFxuICAgIHJldHVybiBkZXZfaW5mbztcXG59O1xcbnZhciBiZWZvcmVfcmVmcmVzaCA9IGZ1bmN0aW9uKCl7XFxuICAgIGxldCBkZXZfc2V0X2luZm8gPSBnZXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIikuc3BsaXQoJyQkJyk7XFxuICAgIGxldCBkZXZfaW5mb191cmwgPSBkZXZfc2V0X2luZm8uc2xpY2UoLTEpWzBdO1xcbiAgICBsZXQgYmFja19jb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGRldl9pbmZvX3VybCkpO1xcbiAgICBsZXQgZGV2X2luZm89YmFja19jb2RlLnJlc3VsdHx8YmFja19jb2RlLmRldGFpbDtcXG4gICAgcHV0TXlWYXIoXFxcImRldkluZm9cXFwiLGRldl9pbmZvKTtcXG4gICAgcmV0dXJuIGRldl9pbmZvXFxufTtcXG5sZXQgZCA9IFtdO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOifnvJbovpHlhazlkYonLFxcbiAgICBkZXNjOifmlK/mjIFtZOivreazlSzngrnlh7vov5vlhaXlrabkuaBNZOivreazlVxcXFxu5L+d5a2Y5YWs5ZGK5oyJ6ZKu5Zyo5paH5pys5qGG5pyA5LiL6Z2iJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDonaHR0cHM6Ly93d3cucnVub29iLmNvbS9tYXJrZG93bi9tZC10dXRvcmlhbC5odG1sJ1xcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOifov5Tlm54nLFxcbiAgICBjb2xfdHlwZTondGV4dF8yJyxcXG4gICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICB9KVxcbn0pO1xcbmlmKCFnZXRNeVZhcignZGV2SW5mbycpKXtcXG4gICAgYmVmb3JlX3JlZnJlc2goKTtcXG59XFxubGV0IGVtcHR5ID0gJ2hpa2VyOi8vZW1wdHknO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOifpmIXop4jmn6XpmIUnLFxcbiAgICBjb2xfdHlwZTondGV4dF8yJyxcXG4gICAgLy8gdXJsOiQoZ2V0TXlWYXIoJ2RldkluZm8nKSkuY29uZmlybSgpXFxuICAgIHVybDokKGVtcHR5KS5ydWxlKCgpPT57XFxuICAgICAgICByZXF1aXJlKFxcXCJodHRwczovL2dpdGxhYi5jb20vaGpkaG54L2hpa2VyLy0vcmF3L21haW4vanMvbWFya2VkLm1pbi5qc1xcXCIpO1xcbiAgICAgICBsZXQgZGV2SW5mbz1cXFwiXFxcIjtcXG4gICAgICAgdHJ5e1xcbiAgICAgICAgICBkZXZJbmZvPW1hcmtlZC5wYXJzZShnZXRNeVZhcignZGV2SW5mbycpKTtcXG4gICAgICAgfWNhdGNoKGUpe31cXG4gICAgICAgIHNldFJlc3VsdChbXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICB0aXRsZTpkZXZJbmZvLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZToncmljaF90ZXh0JyxcXG4gICAgICAgICAgICB9XFxuICAgICAgICBdKTtcXG4gICAgfSlcXG59KTtcXG5kLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi5b+r5p2l57yW6L6R5L2g55qE5YWs5ZGK5ZCnflxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ2RldkluZm8nLCAnJyl8fFxcXCJcXFwiLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDotMSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcImRldkluZm9cXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLkv53lrZjlhazlkYpcXFwiLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICB1cmw6JCgn56Gu6K6k5L+d5a2Y5YWs5ZGK5ZCX77yf5bCG5Lya5LiO6YGT6ZW/5LuT5bqT5pyN5Yqh5Zmo6YCa6K6vJykuY29uZmlybSgoKT0+e1xcbiAgICAgICAgbGV0IGRldl9zZXRfaW5mbyA9IGdldE15VmFyKFxcXCJkZXZfc2V0X2luZm9cXFwiKS5zcGxpdCgnJCQnKTtcXG4gICAgICAgIGxldCBpbnB1dF90ZXh0ID0gZ2V0TXlWYXIoJ2RldkluZm8nLCAnJyk7XFxuICAgICAgICBpZihpbnB1dF90ZXh0Lmxlbmd0aCA+PSA0KXtcXG4gICAgICAgICAgICBsZXQgaW5mb19zZXRfdXJsPSBkZXZfc2V0X2luZm9bMl07XFxuICAgICAgICAgICAgbGV0IHNlbmRfZGF0YSA9IHtcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIHtcXFwiZGF0YVxcXCI6IHtcXFwiaW5mb1xcXCI6IGlucHV0X3RleHR9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogZGV2X3NldF9pbmZvWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGRldl9zZXRfaW5mb1sxXX1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIC8vIGxvZyhzZW5kX2RhdGEpO1xcbiAgICAgICAgICAgIGxldCBwYXIyID0ge2hlYWRlcnM6eydjb250ZW50LXR5cGUnOidhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLCdVc2VyLUFnZW50JzpkZXZfc2V0X2luZm9bM119LGJvZHk6SlNPTi5zdHJpbmdpZnkoc2VuZF9kYXRhKSxtZXRob2Q6J1BPU1QnfTtcXG4gICAgICAgICAgICAvLyBwYXIyID0gSlNPTi5zdHJpbmdpZnkocGFyMik7IC8veDXph4zpnaLor7fmsYLmiY3pnIDopoHnvJbnoIFcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgYmFja19yZXQgPSByZXF1ZXN0KGluZm9fc2V0X3VybCwgcGFyMik7XFxuICAgICAgICAgICAgICAgIGJhY2tfcmV0ID0gSlNPTi5wYXJzZShiYWNrX3JldCkucmVzdWx0O1xcbiAgICAgICAgICAgICAgICBpZihiYWNrX3JldC5zdGF0dXM9PT0wKXtcXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcXG4nK2JhY2tfcmV0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5aSx6LSlXFxcXG4nK2JhY2tfcmV0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+vXFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBjb25maXJtKHt0aXRsZTon6YGT6ZW/5o+Q56S6Jyxjb250ZW50Oifomb3nhLbkvaDlvojmh5LvvIzkvYbmmK/lhazlkYroh7PlsJHlhpk05Liq5a2X5ZCn77yBJ30pO1xcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgIH1cXG4gICAgfSlcXG59KTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpooTlpITnkIbkvp3otZbmlofku7ZcIixcInBhdGhcIjpcImxpYnNcIixcInJ1bGVcIjpcImlmKGdldEFwcFZlcnNpb24oKT49MzIwMCl7XFxuICAgIHRyeXtcXG4gICAgICAgIHJjKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2pzLyRoaWtlci5qc1xcXCIsIC0xKTtcXG4gICAgICAgIC8vJC5zZXRSb290KCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3B1YmxpYy9oaWtlci9oaWtlci9naXQvZmlsZXMvbWFzdGVyL2pzLycpO1xcbiAgICAgICAgJC5zZXRSb290KCk7XFxuICAgICAgICAkLnNldExpYih7XFxuICAgICAgICAgICAgbHNnOiBcXFwibHNnLmpzXFxcIiwgLy/mnKzlnLDlgqjlrZhcXG4gICAgICAgICAgICBmaWxlOiBcXFwiZmlsZS5qc1xcXCIsIC8v5paH5Lu2b3NcXG4gICAgICAgICAgICBmaWxlU2VsZWN0OiBcXFwiZmlsZVNlbGVjdC5qc1xcXCIsIC8v5paH5Lu26YCJ5oup5ZmoXFxuICAgICAgICAgICAgZHQ6IFxcXCJkdC5qc1xcXCIsIC8v5Yqo5oCB5YiG57G7XFxuICAgICAgICAgICAgZHI6IFxcXCJkci5qc1xcXCIsIC8vZHLmqKHmnb/kvp3otZZcXG4gICAgICAgICAgICBkcnByZTogXFxcImRycHJlLmpzXFxcIiwgLy9kcuaooeadv+mihOWkhOeQhlxcbiAgICAgICAgICAgIGRydXA6IFxcXCJkcnVwLmpzXFxcIiwgLy9kcuaooeadv+iHquWKqOabtOaWsFxcbiAgICAgICAgICAgIGRybWF0Y2g6IFxcXCJkcm1hdGNoLmpzXFxcIiwgLy9kcuaooeadv+iHquWKqOaooeadv+WMuemFjVxcbiAgICAgICAgICAgIGRybTogXFxcImRybS5qc1xcXCIsIC8vZHLmqKHmnb/lsI/nqIvluo9cXG4gICAgICAgICAgICBjbXM6IFxcXCJjbXMuanNcXFwiLCAvL2Ntc+aooeadv+S+nei1llxcbiAgICAgICAgICAgIGNtc3ByZTogXFxcImNtc3ByZS5qc1xcXCIsIC8vY21z6aKE5aSE55CGXFxuICAgICAgICAgICAgY21zbTogXFxcImNtc20uanNcXFwiLCAvL2Ntc+aooeadv+Wwj+eoi+W6j1xcbiAgICAgICAgICAgIGxpYmNoZWNrOiBcXFwibGliY2hlY2suanNcXFwiLCAvL2Ry5qOA5rWL5L6d6LWWXFxuICAgICAgICAgICAgcnVsZUVkaXRvcjogXFxcInJ1bGVFZGl0b3IuanNcXFwiLCAvL+WGmemhtea6kOelnuWZqOWwj+eoi+W6j1xcbiAgICAgICAgICAgIGhvdXNlTGF6eTogXFxcImhvdXNlTGF6eS5qc1xcXCIsIC8v5LuT5bqT6YCa5YWNXFxuICAgICAgICAgICAgbGF6eTogXFxcImxhenkuanNcXFwiLCAvL+mmmeWFjVxcbiAgICAgICAgICAgIHN1YjogXFxcInN1Yi5qc1xcXCIsIC8v6YGT5b6357uP6K6i6ZiFXFxuICAgICAgICAgICAgaGlrZXJVaTogXFxcImhpa2VyVWkuanNcXFwiLCAvL+a1t+mYlOe7hOS7tuS+nei1llxcbiAgICAgICAgICAgIGhpa2VyTGliczogXFxcImhpa2VyTGlicy5qc1xcXCIsIC8v5rW36ZiU5YWo6IO95L6d6LWWXFxuICAgICAgICB9KTtcXG4gICAgfWNhdGNoKGUpe1xcbiAgICAgICAgLy90b2FzdCgn6K+35bCd6K+V54K55Ye75LuT5bqT5Li76aG155qE5Y2H57qn5LuT5bqT5peB6L6555qE5oyJ6ZKu5Y2H57qnJOaJqeWxle+8jOWQpuWImeafkOS6m+WKn+iDveS4jeiDveato+W4uOS9v+eUqCcpO1xcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6ICfmj5DnpLot54K55Ye756Gu5a6a5Y+v5Lul5a+85YWlJyxcXG4gICAgICAgICAgICBjb250ZW50OiAn6K+35bCd6K+V54K55Ye75LuT5bqT5Li76aG155qE5Y2H57qn5LuT5bqT5peB6L6555qE5oyJ6ZKu5Y2H57qnJOaJqeWxle+8jOWQpuWImeafkOS6m+WKn+iDveS4jeiDveato+W4uOS9v+eUqCcsXFxuICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygoKT0+e1xcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2V0QXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUhlYWQgPSAn5rW36ZiU6KeG55WM77yM572R6aG15o+S5Lu277+lanNfdXJs77+lJGhpa2VyQCc7XFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBnZXRBcGkoJ2ltcG9ydFVybCcpK1xcXCI1MTExXFxcIjtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydFVybCA9ICdydWxlOi8vJytiYXNlNjRFbmNvZGUocnVsZUhlYWQrdXJsKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNhbmNlbDogJC50b1N0cmluZygoKT0+e1xcblxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgfSlcXG4gICAgfVxcbn1cIn1dLFwicGFyYW1zXCI6XCJ7XFxcImlkXFxcIjoxMDk0LFxcXCJsdmVyXFxcIjoxNTV9XCIsXCJzYXZlZFwiOmZhbHNlLFwidGl0bGVcIjpcIumBk+mVv+S7k+W6k1Byb1wiLFwidmVyc2lvblwiOjAsXCJ1cmxcIjpcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGdldEFwaSxcXG4gICAgICAgIGNvbG9yLFxcbiAgICAgICAgc21hbGwsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpLFxcbiAgICAgICAgbWRcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBsdmVyLFxcbiAgICBpc0FsbFxcbn0gPSBNWV9QQVJBTVM7XFxuaWYoZ2V0UGFyYW0oXFxcImlkXFxcIikpe1xcbiAgICBpc0FsbD10cnVlO1xcbiAgICBpZD1nZXRQYXJhbShcXFwiaWRcXFwiKTtcXG4gICAgbHZlcj1sdmVyfHwn5pyq6I635Y+W54mI5pys5Y+3JztcXG59XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcbiAgICBpZighaXNBbGwpe1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9XFxufSxpc0FsbCkpO1xcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImdldGJ5aWRcXFwiKSArIFxcXCI/aWQ9XFxcIiArIGlkKSkucmVzdWx0O1xcbnNldFBhZ2VUaXRsZShcXFwi44CMXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CNXFxcIilcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbnZhciBoYXNTdWIgPSBmYWxzZTtcXG5cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnKTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLniYjmnKxcXFwiKSxcXG4gICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneW8gOWPkeiAhe+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS5hdXRob3IsIFxcXCIjMjI4QkU2XFxcIikgKyBcXFwiXFxcXG7kupHnq6/niYjmnKzvvJpcXFwiICsgY29sb3IoZGF0YUl0ZW0udmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFx0XFxcXHTmnKzlnLDniYjmnKzvvJpcXFwiICsgY29sb3IobHZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuabtOaWsOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOacrOWcsOeJiOacrD5cXFxcblxcXCIgKyBsdmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWIme+8micgKyBkYXRhSXRlbS5kYXRhX3R5cGU7XFxuXFxubGV0IHNhZmVfdGlwPWRhdGFJdGVtLmlzX3NhZmU/XFxcIuWuieWFqFxcXCI6XFxcIuWNsemZqVxcXCI7XFxubGV0IGdvb2RfdGlwID0gZGF0YUl0ZW0uaXNfZ29vZD9zbWFsbChjb2xvcihcXFwi44CQ5LyY6LSo6KeE5YiZ44CRXFxcIiwnI2ZmNzAwMCcpKTpcXFwiXFxcIjtcXG5sZXQgbm90X3NhZmVfbm90ZT1kYXRhSXRlbS5ub3Rfc2FmZV9ub3RlO1xcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIikrXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKOmjjumZqeajgOa1izpcXFwiICtzYWZlX3RpcCtcXFwiKVxcXCIpK2dvb2RfdGlwO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcblxcbmRhdGEucHVzaChiYXNpYyk7XFxubGV0IGhhc1N1YnMgPSBcXFwiXFxcIjtcXG5pZiAoaGFzU3ViKSB7XFxuICAgIGhhc1N1YnMgPSBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCLlt7LorqLpmIVcXFwiKVxcbn1cXG5cXG5sZXQgbm90ZXMgPSByZXF1ZXN0KGdldEFwaShcXFwiZ2V0X3J1bGVfbm90ZVxcXCIpICsgaWQpO1xcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcbnJlcXVpcmUobWQpO1xcbmxldCBub3Rlc0h0bWw9XFxcIlxcXCJcXG50cnl7XFxuICAgIG5vdGVzSHRtbD1tYXJrZWQucGFyc2Uobm90ZXMpO1xcbn1jYXRjaChlKXt9XFxuXFxuaWYgKG5vdGVzICE9PSBmYWxzZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLlpIfms6hcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlrozmlbTlhazlkYogPlxcXCIpKSxcXG4gICAgICAgIGRlc2M6IG5vdGVzLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0ZXh0OiBub3Rlc0h0bWwsXFxuICAgICAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAvLyB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIlxcbiAgICAgICAgICAgIHR5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuaTjeS9nFxcXCIpICsgaGFzU3VicyxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXCJcXG59KTtcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcIlxcXCI7XFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxufVxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxuICAgIGNhc2UgXFxcImhvbWVfcnVsZV91cmxcXFwiOlxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShydWxlQ29kZSlcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdwdWJsaXNoJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8micgKyBkYXRhSXRlbS5uYW1lICsgJ++/pXB1Ymxpc2jvv6UnICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnaHRtbCc6XFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxuICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZV90bXAubGVuZ3RoID4gMSA/IGZpbGVfdG1wW2ZpbGVfdG1wLmxlbmd0aCAtIDFdICsgXFxcIi9cXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFwiICsgZmlsZV9wYXRoICsgXFxcIkBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWtcXG4gICAgY2FzZSBcXFwiY29uZmlnXFxcIjpcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcIikpO1xcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXCJpbXBvcnRcXFwiLCBwYXNzd29yZCk7XFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxuICAgICAgICBicmVhaztcXG59XFxubGV0IG15X2NvbF90eXBlID0gXFxcInRleHRfMlxcXCI7XFxubGV0IG15X2NvbF90eXBlMiA9IFxcXCJ0ZXh0XzNcXFwiO1xcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogZGF0YUl0ZW0uaXNfc2FmZT9pbXBvcnRVcmw6J3RvYXN0Oi8v6aOO6Zmp6KeE5YiZ56aB5q2i5a+85YWlISEhJyxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVDb2RlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+WPo+S7pFxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJjb3B5Oi8vXFxcIiArIHJ1bGVDb2RlLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5cXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1Yikge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheWQiOmbhicsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3Isc3ViVXJsKTtcXG4gICAgICAgICAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIilbMF0pO1xcbiAgICAgICAgICAgICAgICAvL3JldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcIkgtXFxcIitkYXRhSXRlbS5uYW1lK1xcXCIuXFxcIitkYXRhSXRlbS5hdXRob3I7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXCJKLVxcXCIrZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpWzBdO1xcbiAgICAgICAgICAgICAgICBsZXQgc3ViT2JqID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBzdWJVcmwsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFwiK3RpdGxlK1xcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsLy/npoHnlKjlubblj5Hmm7TmlrBcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcbiAgICAgICAgICAgICAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKHNoYXJlVGV4dCxwYXN0ZXMuc2xpY2UoLTEpWzBdKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcIit0aXRsZSsnXFxcXG4nK3VybDtcXG4gICAgICAgICAgICAgICAgY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSAnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9zdWIuanNvbic7XFxuICAgICAgICAgICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4g6K6i6ZiF5a+85YWlKHBhdGgpXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwiPHNtYWxsPuaPkOekuu+8muW8gOWPkeiAheWNleeLrOWIhuS6q+eahOWQiOmbhuaWh+S7tuWPquiDveWNleeLrOWvvOWFpeOAgjwvc21hbGw+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9IGVsc2UgaWYgKCFkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1YiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzljZXop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcIkBAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJztcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheinhOWImScsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICAgICAgfSlcXG4gICAgfVxcbn1cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxuICAgICAgICB1cmw6ICQoIC8qXFxcIiNub0xvYWRpbmcjXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSBydWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcInNAXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acquWuieijhVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSlcXG59XFxubGV0IG1hbl9ydWxlX3NhZmUgPSBnZXRBcGkoXFxcIm1hblJ1bGVTYWZlXFxcIikrZGF0YUl0ZW0uaWQ7XFxubGV0IG1hbl9ydWxlX2dvb2QgPSBnZXRBcGkoXFxcIm1hblJ1bGVHb29kXFxcIikrZGF0YUl0ZW0uaWQ7XFxuLy8gZGF0YUl0ZW0uaXNfc2FmZTtcXG5pZihnZXRWYXIoJ2hvdXNlLmlzX21hbmFnZXInKSl7XFxuICAgIGZ1bmN0aW9uIHNldElzU2FmZShmbGFnLG1hbl9ydWxlX3NhZmUpIHtcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX3NhZmUsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImlzX3NhZmVcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZnVuY3Rpb24gc2V0SXNHb29kKGZsYWcsbWFuX3J1bGVfZ29vZCkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfZ29vZCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfZ29vZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/Cfmqvpo47pmaknLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumjjumZqT/po47pmanop4TliJnml6Dms5Xooqvlr7zlhaUnKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKGZhbHNlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pyF5q2j5bi4JyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrmraPluLg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZSh0cnVlLG1hbl9ydWxlX3NhZmUpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pml6Z2e5LyY6LSoJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpnZ7kvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZChmYWxzZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfkpbkvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKHRydWUsbWFuX3J1bGVfZ29vZCk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcbiAgICB9KTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5nb29kX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/otZ4uc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcbiAgICAgICAgZGVmYXVsdFR5cGU6XFxcImJhZFxcXCJcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K+E6K66XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxuICAgIH1cXG59KTtcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLor4TorrooXFxcIiArIHRvdGFsU3VtICsgXFxcIilcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlhajpg6jor4TorrogPlxcXCIpKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvQ29tbWVudFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5I2Z5cGFnZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgdG90YWxTdW06IHRvdGFsU3VtLFxcbiAgICAgICAgbm9fYWN0aXZlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6XFxcIuW8gOWPkeiAhfCfl6NcXFwiXFxufVxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgZGF0YUl0ZW0uaWQgKyBcXFwiP2xpbWl0PTVcXFwiKSkucmVzdWx0O1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXCJyZXBseVxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcIuKAmOKAmOWbnuWkjUBcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFwiICNcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFwi4oCZ4oCZXFxcXG5cXFwiOlxcXCJcXFwiO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgLy91cmw6IFxcXCJ0b2FzdDovL1xcXCIgKyBpdGVtLnFxLFxcbiAgICAgICAgICAgIHVybDpcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFwiK2l0ZW0ucXEsXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiICsgaWNvbltpdGVtLmRpc2N1c3NfdHlwZV0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCIsXCJncm91cFwiOlwi4pGg5bi455SoXCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCIkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9saWJzP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XCIsXCJwYWdlc1wiOlwiW3tcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW3peWFt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJ1dGlsaXlcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgaG9zdCA9IFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzXFxcXFxcXCI7XFxcXG4vL2xldCBob3N0ID0gXFxcXFxcXCJodHRwOi8vMTkyLjE2OC4zLjk0OjgwNzlcXFxcXFxcIjtcXFxcbmxldCBob21lID0gYmFzZTY0RGVjb2RlKFxcXFxcXFwiYUdsclpYSTZMeTlvYjIxbFxcXFxcXFwiKTtcXFxcbnZhciBhcGkgPSB7XFxcXG4gICAgaG9zdDogaG9zdCtcXFxcXFxcIi9oaWtlcnVsZVxcXFxcXFwiLFxcXFxuICAgIHVzZXJzVXJsOiBcXFxcXFxcIi9kZXYvdXNlcnM/b3JkZXI9XFxcXFxcXCIsIC8v55So5oi35YiX6KGoXFxcXG4gICAgcnVsZUNvdW50VXJsOiBcXFxcXFxcIi9kZXYvcnVsZWNvdW50XFxcXFxcXCIsIC8v6I635Y+W6KeE5YiZ5pWw6YePXFxcXG4gICAgcnVsZXNVcmw6IFxcXFxcXFwiL2Rldi9nZXRcXFxcXFxcIiwgLy/nlKjmiLflr7nlupTnmoTop4TliJnliJfooajku4Xku4Xojrflj5blhazlvIBcXFxcbiAgICBydWxlc0FsbFVybDogXFxcXFxcXCIvZGV2L2dldGFsbFxcXFxcXFwiLCAvL+W8gOWPkeiAheWvueW6lOeahOinhOWImeWIl+ihqOWPr+iOt+WPluengeaciVxcXFxuICAgIGRldlNlbGY6Jy9kZXYvZ2V0c2VsZicsLy/ojrflj5blvIDlj5HogIXkv6Hmga9cXFxcbiAgICBtYW5DYW5VcGxvYWQ6Jy9zZXRfY2FuX3VwbG9hZC8nLC8v6LaF566h6K6+572u5byA5Y+R6ICF5piv5ZCm5Y+v5LiK5LygXFxcXG4gICAgbWFuUnVsZVNhZmU6Jy9zZXRfcnVsZV9zYWZlLycsLy/otoXnrqHorr7nva7op4TliJnlronlhajmgKdcXFxcbiAgICBtYW5SdWxlR29vZDonL3NldF9ydWxlX2dvb2QvJywvL+i2heeuoeiuvue9ruinhOWImeS8mOi0qOaAp1xcXFxuICAgIGltcG9ydFVybDogXFxcXFxcXCIvcnVsZWxpc3QuanNvbj9pZD1cXFxcXFxcIiwgLy/op4TliJnor6bmg4Xlj6/lr7zlhaVcXFxcbiAgICBpbmZvU2V0VXJsOiBcXFxcXFxcIi9kZXYvc2V0X2luZm9cXFxcXFxcIixcXFxcbiAgICBub3dDb25Vcmw6IFxcXFxcXFwiL3NxbF9pbmZvL2dldF9ub3dfY29uXFxcXFxcXCIsXFxcXG4gICAgaW5mb0dldFVybDogXFxcXFxcXCIvZGV2L2dldF9pbmZvP25hbWU9XFxcXFxcXCIsXFxcXG4gICAgc2V0dGluZ3NHZXRVcmw6IFxcXFxcXFwiL2Rldi9nZXRfc2V0dGluZ3M/bmFtZT1cXFxcXFxcIixcXFxcbiAgICBndXBsb2FkOiBcXFxcXFxcIi9kZXYvZ3VwbG9hZFxcXFxcXFwiLFxcXFxuICAgIGd0aW1lb3ZlcjogXFxcXFxcXCIvZGV2L2d0aW1lb3ZlclxcXFxcXFwiLFxcXFxuICAgIGdldGJ5aWQ6IFxcXFxcXFwiL2Rldi9nZXRieWlkXFxcXFxcXCIsXFxcXG4gICAgcnVsZUxpc3RKc29uOiBcXFxcXFxcIi9ydWxlbGlzdC5qc29uXFxcXFxcXCIsXFxcXG4gICAgYXV0aDogXFxcXFxcXCIvZGV2L2dldF9hdXRoXFxcXFxcXCIsXFxcXG4gICAgdGltZW92ZXI6IFxcXFxcXFwiL2Rldi90aW1lb3ZlclxcXFxcXFwiLFxcXFxuICAgIHNoYXJlOiBcXFxcXFxcIi9kZXYvc2hhcmVcXFxcXFxcIixcXFxcbiAgICBnZW5BdXRoOiBcXFxcXFxcIi9kZXYvZ2VuX2F1dGhcXFxcXFxcIixcXFxcbiAgICBkZWxldGVVcmw6IFxcXFxcXFwiL2Rldi9kZWxldGVcXFxcXFxcIixcXFxcbiAgICBqc29uTGlzdDogXFxcXFxcXCIvZGV2L2pzb25fbGlzdFxcXFxcXFwiLFxcXFxuICAgIHNlYXJjaDogXFxcXFxcXCIvZGV2L3NlYXJjaFxcXFxcXFwiLFxcXFxuICAgIG5ld19kZXY6IFxcXFxcXFwiL2Rldl9yZWdpc3QvbmV3XFxcXFxcXCIsXFxcXG4gICAgbmV3X2dldElkOiBcXFxcXFxcIi9kZXZfcmVnaXN0L2dldF9pZFxcXFxcXFwiLFxcXFxuICAgIG5ld19jb25maXJtOiBcXFxcXFxcIi9kZXZfcmVnaXN0L2NvbmZpcm1cXFxcXFxcIixcXFxcbiAgICBtb2RpZnlfcHdkOiBcXFxcXFxcIi9tb2RpZnkvcGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICBtb2RpZnlfbmFtZTogXFxcXFxcXCIvbW9kaWZ5L25hbWVcXFxcXFxcIixcXFxcbiAgICBtb2RpZnlfYXZhOiBcXFxcXFxcIi9tb2RpZnkvYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgdXNlcjogXFxcXFxcXCIvZGV2L3VzZXIvXFxcXFxcXCIsXFxcXG4gICAgZ2V0X3J1bGVfbm90ZTogXFxcXFxcXCIvbW9kaWZ5L2dldF9ydWxlX25vdGUvXFxcXFxcXCIsXFxcXG4gICAgc2V0X3J1bGVfcGljOiBcXFxcXFxcIi9tb2RpZnkvcnVsZV9waWMvXFxcXFxcXCIsXFxcXG4gICAgc2V0X3J1bGVfbm90ZTogXFxcXFxcXCIvbW9kaWZ5L3J1bGVfbm90ZS9cXFxcXFxcIlxcXFxufVxcXFxuJC5leHBvcnRzLnJhbmdlID0gZnVuY3Rpb24obSwgbikge1xcXFxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobSAtIG4gKyAxKSArIG4pO1xcXFxufVxcXFxuJC5leHBvcnRzLm1hcENvbFR5cGUgPSBmdW5jdGlvbih0YXJnZXQsIHR5cGUsIG4pIHtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xcXFxuICAgICAgICB0YXJnZXQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogdHlwZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG52YXIgZ2V0QXBpID0gZnVuY3Rpb24oaykge1xcXFxuICAgIHJldHVybiBhcGkuaG9zdCArIGFwaVtrXTtcXFxcbn07XFxcXG4kLmV4cG9ydHMuZ2V0QXBpPWdldEFwaTtcXFxcbiQuZXhwb3J0cy5tZD1nZXRBcGkoJ2ltcG9ydFVybCcpK1xcXFxcXFwiMzE4N1xcXFxcXFwiO1xcXFxuJC5leHBvcnRzLmxvY2FsUnVsZVZlciA9IGZ1bmN0aW9uKGxvY2FsUnVsZUxpc3QsIHJ1bGUpIHtcXFxcbiAgICBsZXQgbG9jYWxSdWxlO1xcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxSdWxlTGlzdC5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICBsZXQgaXRlbSA9IGxvY2FsUnVsZUxpc3RbaV07XFxcXG4gICAgICAgIGxldCBhdSA9IGl0ZW0uYXV0aG9yIHx8IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGxldCBzYW1lQXU9YXUubGVuZ3RoID4gMCAmJiBydWxlLmF1dGhvci5pbmNsdWRlcyhhdSk7XFxcXG4gICAgICAgIHNhbWVBdT10cnVlOy8v5LiN5Yik5pat5L2c6ICF6buY6K6k5Li6dHJ1ZVxcXFxuICAgICAgICBpZiAoaXRlbS50aXRsZSA9PT0gcnVsZS5uYW1lICYmIHNhbWVBdSkge1xcXFxuICAgICAgICAgICAgbG9jYWxSdWxlID0gaXRlbTtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGlmIChsb2NhbFJ1bGUgPT09IHZvaWQgMCkge1xcXFxuICAgICAgICByZXR1cm4gLTE7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgcmV0dXJuIGxvY2FsUnVsZS52ZXJzaW9uO1xcXFxuICAgIH1cXFxcbn1cXFxcbiQuZXhwb3J0cy5jb2xvciA9IGZ1bmN0aW9uKHRleHQsIGNvbG9yKSB7XFxcXG4gICAgdGV4dCArPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGlmICh0ZXh0LmluZGV4T2YoXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIikgPT09IDApIHtcXFxcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gXFxcXFxcXCLigJzigJzigJ3igJ08Zm9udCBjb2xvcj0nXFxcXFxcXCIgKyBjb2xvciArIFxcXFxcXFwiJz5cXFxcXFxcIiArIHRleHQgKyBcXFxcXFxcIjwvZm9udD5cXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzLnNsZWVwID0gZnVuY3Rpb24odGltZW91dCl7XFxcXG4gICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lb3V0KTtcXFxcbn1cXFxcbmZ1bmN0aW9uIGh0bWxUYWcodGFnLCB0ZXh0KSB7XFxcXG4gICAgdGV4dCArPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGlmICh0ZXh0LmluZGV4T2YoXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIikgPT09IDApIHtcXFxcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwiPFxcXFxcXFwiICsgdGFnICsgXFxcXFxcXCI+XFxcXFxcXCIgKyB0ZXh0ICsgXFxcXFxcXCI8L1xcXFxcXFwiICsgdGFnICsgXFxcXFxcXCI+XFxcXFxcXCI7XFxcXG5cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0Tm93Rm9ybWF0RGF0ZSgpIHtcXFxcbiAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcXFxcbiAgICAgICAgICAgIGxldCBzZXBlcmF0b3IxID0gXFxcXFxcXCItXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgc2VwZXJhdG9yMiA9IFxcXFxcXFwiOlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcXFxcbiAgICAgICAgICAgIGxldCBzdHJEYXRlID0gZGF0ZS5nZXREYXRlKCk7XFxcXG4gICAgICAgICAgICBsZXQgc3RySG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XFxcXG4gICAgICAgICAgICBsZXQgc3RyTWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xcXFxuICAgICAgICAgICAgbGV0IHN0clNlY29uZHMgPSBkYXRlLmdldFNlY29uZHMoKSsxO1xcXFxuICAgICAgICAgICAgaWYgKG1vbnRoID49IDEgJiYgbW9udGggPD0gOSkge1xcXFxuICAgICAgICAgICAgICAgIG1vbnRoID0gXFxcXFxcXCIwXFxcXFxcXCIgKyBtb250aFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHN0ckRhdGUgPj0gMCAmJiBzdHJEYXRlIDw9IDkpIHtcXFxcbiAgICAgICAgICAgICAgICBzdHJEYXRlID0gXFxcXFxcXCIwXFxcXFxcXCIgKyBzdHJEYXRlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoc3RySG91cnMgPj0gMCAmJiBzdHJIb3VycyA8PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgc3RySG91cnMgPSBcXFxcXFxcIjBcXFxcXFxcIiArIHN0ckhvdXJzXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoc3RyTWludXRlcyA+PSAwICYmIHN0ck1pbnV0ZXMgPD0gOSkge1xcXFxuICAgICAgICAgICAgICAgIHN0ck1pbnV0ZXMgPSBcXFxcXFxcIjBcXFxcXFxcIiArIHN0ck1pbnV0ZXNcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChzdHJTZWNvbmRzID49IDAgJiYgc3RyU2Vjb25kcyA8PSA5KSB7XFxcXG4gICAgICAgICAgICAgICAgc3RyU2Vjb25kcyA9IFxcXFxcXFwiMFxcXFxcXFwiICsgc3RyU2Vjb25kc1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgLy9sZXQgY3VycmVudGRhdGUgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBzZXBlcmF0b3IxICsgbW9udGggKyBzZXBlcmF0b3IxICsgc3RyRGF0ZSArIFxcXFxcXFwiIFxcXFxcXFwiICsgc3RySG91cnMgKyBzZXBlcmF0b3IyICsgc3RyTWludXRlcyArIHNlcGVyYXRvcjIgKyBzdHJTZWNvbmRzO1xcXFxuICAgICAgICAgICAgbGV0IGN1cnJlbnRkYXRlID0gKGRhdGUuZ2V0RnVsbFllYXIoKS0yMDIwKSsnJysgbW9udGggKycnKyBzdHJEYXRlICsnJysgc3RySG91cnMrJycgKyBzdHJNaW51dGVzICsnJysgTWF0aC5jZWlsKHN0clNlY29uZHMvNyk7XFxcXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY3VycmVudGRhdGUpXFxcXG4gICAgICAgIH1cXFxcbiQuZXhwb3J0cy5nZXROb3dGb3JtYXREYXRlID0gZ2V0Tm93Rm9ybWF0RGF0ZTtcXFxcbiQuZXhwb3J0cy5odG1sVGFnID0gaHRtbFRhZztcXFxcbiQuZXhwb3J0cy5zbWFsbCA9IGZ1bmN0aW9uKHRleHQpIHtcXFxcbiAgICByZXR1cm4gaHRtbFRhZyhcXFxcXFxcInNtYWxsXFxcXFxcXCIsIHRleHQpO1xcXFxufVxcXFxuJC5leHBvcnRzLmdldEZpbGUgPSBmdW5jdGlvbigpIHtcXFxcbiAgICB2YXIgRmlsZSA9IHJlcXVlc3QoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCI7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoRmlsZSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXFxcXFwiLCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4ge307XFxcXG4gICAgfVxcXFxufVxcXFxuJC5leHBvcnRzLmdldFVzZXJEYXRlID1mdW5jdGlvbigpe1xcXFxuICAgIHZhciBGaWxlID0gcmVxdWVzdChcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCI7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoRmlsZSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIFtdO1xcXFxuICAgIH1cXFxcbn1cXFxcbiQuZXhwb3J0cy5leGlzdEZpbGUgPSBmdW5jdGlvbihzcGF0aCwgaXBhdGgsIGhlYWRlcnMpIHtcXFxcbiAgICBsZXQgc2NvZGUgPSByZXF1ZXN0KHNwYXRoKTtcXFxcbiAgICBpZiAoIXNjb2RlKSB7XFxcXG4gICAgICAgIHdyaXRlRmlsZShzcGF0aCwgcmVxdWVzdChpcGF0aCwgaGVhZGVycykpO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxubGV0IG5ld0FwaSA9IHtcXFxcbiAgICBcXFxcXFxcImRpc19uZXdcXFxcXFxcIjogXFxcXFxcXCIvaGlrZXJ1bGUvbmV3X3J1bGVfZGlzY3Vzcy9cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc192ZXJpZnlcXFxcXFxcIjogXFxcXFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL2dldF95em1cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRpc19nZXRcXFxcXFxcIjogXFxcXFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX3NldFxcXFxcXFwiOiBcXFxcXFxcIi9oaWtlcnVsZS9tb2RpZnkvY2FuX2Rpc2N1c3MvXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfbmV3X3VzZXJcXFxcXFxcIjogXFxcXFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL25ld191c2VyXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfbG9naW5cXFxcXFxcIjpcXFxcXFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvdXNlcl9sb2dpblxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX2Rldl9kaXNjdXNzXFxcXFxcXCI6XFxcXFxcXCIvaGlrZXJ1bGUvbW9kaWZ5L2Rldl9jYW5fZGlzY3Vzc1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX2Rldl9jb250cm9sXFxcXFxcXCI6XFxcXFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL3JlbW92ZS9cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImFsbF9ydWxlXFxcXFxcXCI6XFxcXFxcXCIvaGlrZXJ1bGUvZ2V0X3J1bGVzXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkaXNfZ2V0X3JlcGx5XFxcXFxcXCI6XFxcXFxcXCIvaGlrZXJ1bGUvZ2V0X3JlcGx5X3J1bGVfZGlzY3Vzc1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGlzX3JlcGx5XFxcXFxcXCI6XFxcXFxcXCIvaGlrZXJ1bGUvZGV2X25ld19ydWxlX2Rpc2N1c3MvXFxcXFxcXCIsXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNldEFwaShvYmplY3QpIHtcXFxcbiAgICBsZXQgdGFyZ2V0ID0ge307XFxcXG4gICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xcXFxuICAgICAgICB0YXJnZXRba2V5XT1ob3N0K29iamVjdFtrZXldXFxcXG4gICAgfVxcXFxuICAgIHJldHVybiB0YXJnZXQ7XFxcXG59XFxcXG5cXFxcbiQuZXhwb3J0cy5hcGkgPSBzZXRBcGkobmV3QXBpKTtcXFxcbiQuZXhwb3J0cy5hcGkuaG9zdD1ob3N0O1xcXFxuJC5leHBvcnRzLmFwaS5ob21lPWhvbWU7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5byA5Y+R6ICF55m75b2VXFxcIixcXFwicGF0aFxcXCI6XFxcImRldkxvZ2luXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5byA5Y+R6ICF55m75b2VXFxcXFxcXCIpO1xcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBodG1sVGFnLFxcXFxuICAgIG1hcENvbFR5cGUsXFxcXG4gICAgc21hbGwsXFxcXG5nZXRGaWxlXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbnZhciBkYXRhID0gW107XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCk9PntcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFxcXFxcIik7XFxcXG59KSlcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfotKblj7cnLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VVc2VybmFtZScsJycpLFxcXFxuICAgICAgICB0eXBlOlxcXFxcXFwibnVtYmVyXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSwge1xcXFxuICAgIHRpdGxlOiAn5a+G56CBJyxcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlUGFzc3dvcmQnLCAnJyksXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIixcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIiZuYnNwOyZuYnNwOzxhIGhyZWY9J2hpa2VyOi8vcGFnZS9SZWdpc3Rlcic+5rOo5YaMPC9hPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxubWFwQ29sVHlwZShkYXRhLCBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIiwgMSk7XFxcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiXFxcXFxcXCIsIFxcXFxcXFwi55m75b2VXFxcXFxcXCIpLFxcXFxuICAgIHVybDogJCgpLmxhenlSdWxlKCh1cmwsIGYpPT4ge1xcXFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywgJycpLFxcXFxuICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZVBhc3N3b3JkJywgJycpO1xcXFxuICAgICAgICBpZih1c2VybmFtZSA9PT0gXFxcXFxcXCJcXFxcXFxcIiAmJiBwYXNzd29yZCA9PT1cXFxcXFxcIlxcXFxcXFwiKXtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6LSm5Y+35ZKM5a+G56CB5LiN6IO95Li656m6XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgbXlVcmwgPSB1cmwgKyAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkO1xcXFxuICAgICAgICBsZXQgY29kZV9zdHIgPSByZXF1ZXN0KG15VXJsKTtcXFxcbiAgICAgICAgbGV0IGNvZGUgPSBKU09OLnBhcnNlKGNvZGVfc3RyKTtcXFxcbiAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09IDApIHtcXFxcbiAgICAgICAgICAgIGYudXNlcm5hbWU9dXNlcm5hbWU7XFxcXG4gICAgICAgICAgICBmLnBhc3N3b3JkPXBhc3N3b3JkXFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uJywgSlNPTi5zdHJpbmdpZnkoZikpO1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+i0puWPt+aIluWvhueggemUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSwgZ2V0QXBpKFxcXFxcXFwicnVsZXNBbGxVcmxcXFxcXFxcIiksdXNlciksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcImljb25fMl9yb3VuZFxcXCIsXFxcIm5hbWVcXFwiOlxcXCLlvIDlj5HogIXnrqHnkIZcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZGV2TWFuYWdlXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6KeE5YiZ566h55CGXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAnY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpOycpO1xcXFxuaWYgKGdldFZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIpID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGJhY2soKTtcXFxcbn1cXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGksXFxcXG4gICAgY29sb3IsXFxcXG4gICAgc21hbGwsXFxcXG4gICAgZ2V0RmlsZSxcXFxcbiAgICBleGlzdEZpbGUsXFxcXG4gICAgbWFwQ29sVHlwZSxcXFxcbiAgICBhcGlcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBkZXZcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQge1xcXFxuICAgIHVzZXJuYW1lLFxcXFxuICAgIHBhc3N3b3JkLFxcXFxufSA9IGdldEZpbGUoKTtcXFxcbi8vZXhpc3RGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFxcXFxcIiwgXFxcXFxcXCJodHRwczovL2VycC5zY3dpbmJhby5jb20vaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MzlcXFxcXFxcIik7XFxcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwicnVsZXNBbGxVcmxcXFxcXFxcIikgKyAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkKSkucmVzdWx0O1xcXFxubGV0IE1PQklMRV9VQSA9ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXFxcbmxldCBpbmZvU2V0VXJsID0gZ2V0QXBpKFxcXFxcXFwiaW5mb1NldFVybFxcXFxcXFwiKTtcXFxcbmxldCBpbmZvR2V0VXJsID0gZ2V0QXBpKFxcXFxcXFwiaW5mb0dldFVybFxcXFxcXFwiKSArIHVzZXJuYW1lO1xcXFxubGV0IHNldHRpbmdzR2V0VXJsID0gZ2V0QXBpKFxcXFxcXFwic2V0dGluZ3NHZXRVcmxcXFxcXFxcIikgKyB1c2VybmFtZTtcXFxcbnB1dE15VmFyKFxcXFxcXFwiZGV2X3NldF9pbmZvXFxcXFxcXCIsIFt1c2VybmFtZSwgcGFzc3dvcmQsIGluZm9TZXRVcmwsIE1PQklMRV9VQSwgaW5mb0dldFVybF0uam9pbihcXFxcXFxcIiQkXFxcXFxcXCIpKTtcXFxcbmxldCBkYXRhID0gW107XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGJpZz7ku5PlupPorr7nva48L2JpZz4mbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+77yIIOS4quS6uui1hOaWmSA+77yJPC91Pjwvc21hbGw+JyxcXFxcbiAgICBkZXNjOiAn4oCc4oCc4oCd4oCd5oKo5YWx5pyJIDxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj4nICsgcnVsZUxpc3QubGVuZ3RoICsgJzwvc3Bhbj4nICsgXFxcXFxcXCIg5p2h6KeE5YiZ44CCXFxcXFxcXFxu54K55Ye76KeE5YiZ5Y+v6L+b6KGM5YiG5Lqr44CB5Yig6Zmk44CB5a+85YWl5pON5L2c5Y+K5p+l55yL6K+m5oOFXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e2lkOmRldi5pZH0sXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxcXG59KTtcXFxcbm1hcENvbFR5cGUoZGF0YSwgXFxcXFxcXCJsaW5lXFxcXFxcXCIsIDIpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogc21hbGwoY29sb3IoXFxcXFxcXCLmm7TmlLnlhazlkYrinI1cXFxcXFxcIiwgXFxcXFxcXCIjMzRiMWZmXFxcXFxcXCIpKSxcXFxcbiAgICAvLyB1cmw6IFxcXFxcXFwieDU6Ly9maWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9kZXZJbmZvRWRpdFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFxcXFxcIuabtOWkmuWIhuS6q/Cfk7JcXFxcXFxcIiwgXFxcXFxcXCIjMzRiMWZmXFxcXFxcXCIpKSxcXFxcbiAgICAvL3VybDogXFxcXFxcXCJ4NTovL2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvbW9yZVNoYXJlXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXFxcXFwi5Y2H57qn5L6d6LWW8J+TpVxcXFxcXFwiLCBcXFxcXFxcIiMzNGIxZmZcXFxcXFxcIikpLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuWNh+e6p+S8mumHjeaWsOS7juS7k+W6k+aLieWPluebuOWFs+eahOmdmeaAgemhtemdouWIsOacrOWcsFxcXFxcXFxcbuehruiupOWNh+e6p+WQlz9cXFxcXFxcIikuY29uZmlybSgoaG9zdCkgPT4ge1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXFxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOScpKTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcXFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NDAyJykpO1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19nZXQuaHRtbFxcXFxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTQwNCcpKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3sumHjee9ruW8gOWPkeiAheWIhuS6qyznroDku4vmn6XnnIss566A5LuL57yW6L6R562J6Z2Z5oCB5paH5Lu2XFxcXFxcXCI7XFxcXG4gICAgfSxhcGkuaG9zdCksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxcXG59KTtcXFxcbmxldCBkZXZTZXRCYWNrO1xcXFxudHJ5IHtcXFxcbiAgICBkZXZTZXRCYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KHNldHRpbmdzR2V0VXJsKSk7XFxcXG59IGNhdGNoIChlKSB7XFxcXG4gICAgZGV2U2V0QmFjayA9IHt9O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYykge1xcXFxuICAgIGxldCB0ZW1wID0ge1xcXFxuICAgICAgICB0aXRsZTogYmFzaWMudGl0bGUsXFxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXFxcbiAgICAgICAgdXJsOiAkKGJhc2ljLmNvbmZpcm0pLmNvbmZpcm0oKHVybCwgbXNnKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgYmFjayA9IHJlcXVlc3QodXJsKTtcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcXFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBtc2dbMF07XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgbXNnWzFdICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArIHJldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnKVxcXFxuICAgIH07XFxcXG4gICAgcmV0dXJuIHRlbXA7XFxcXG59XFxcXG5pZiAoZGV2U2V0QmFjay5zdGF0dXMgPT0gMCkge1xcXFxuICAgIGxldCBkZXZTZXR0aW5ncyA9IGRldlNldEJhY2sucmVzdWx0O1xcXFxuICAgIGxldCBzaGFyZSA9IHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCJcXFxcbiAgICB9O1xcXFxuICAgIGlmIChkZXZTZXR0aW5ncy5zaGFyZV9wdWJsaWMpIHtcXFxcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuWFrOW8gOS4iuS8oFxcXFxcXFwiLCBcXFxcXFxcImdyZWVuXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo56eB6JePKVxcXFxcXFwiLCBcXFxcXFxcIiMwMGJmZmZcXFxcXFxcIikpO1xcXFxuICAgICAgICBzaGFyZS51cmwgPSBnZXRBcGkoXFxcXFxcXCJndXBsb2FkXFxcXFxcXCIpICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSArIFxcXFxcXFwiJnBhc3N3b3JkPVxcXFxcXFwiICsgcGFzc3dvcmQgKyBcXFxcXFxcIiZmbGFnPTFcXFxcXFxcIjtcXFxcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXFxcXFwi5piv5ZCm56Gu6K6k56eB6JeP5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXFxcXFwiO1xcXFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcXFxcXCLlt7Lnp4Hol49cXFxcXFxcIiwgXFxcXFxcXCLnp4Hol4/lpLHotKVcXFxcXFxcIl07XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuengeWvhuS4iuS8oFxcXFxcXFwiLCBcXFxcXFxcInJlZFxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOWFrOW8gClcXFxcXFxcIiwgXFxcXFxcXCIjYWRmZjJmXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXFxcXFwiZ3VwbG9hZFxcXFxcXFwiKSArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxuICAgICAgICBzaGFyZS5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTlhazlvIDku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcXFxcXCI7XFxcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFxcXFxcIuW3suWFrOW8gFxcXFxcXFwiLCBcXFxcXFxcIuWFrOW8gOWksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHNoYXJlKSk7XFxcXG4gICAgbGV0IHRpbWVPdmVyID0ge1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgIH07XFxcXG4gICAgaWYgKGRldlNldHRpbmdzLnRpbWVfb3Zlcikge1xcXFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi55+t5pe256eY6ZKlXFxcXFxcXCIsIFxcXFxcXFwiZ3JlZW5cXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijmsLjkuYUpXFxcXFxcXCIsIFxcXFxcXFwiIzAwYmZmZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFxcXFxcImd0aW1lb3ZlclxcXFxcXFwiKSArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkICsgXFxcXFxcXCImZmxhZz0xXFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFxcXFxcIjtcXFxcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXFxcXFwi5bey6K6+5Li65rC45LmFXFxcXFxcXCIsIFxcXFxcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLmsLjkuYXnp5jpkqVcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijov4fmnJ8pXFxcXFxcXCIsIFxcXFxcXFwiI2FkZmYyZlxcXFxcXFwiKSk7XFxcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFxcXFxcImd0aW1lb3ZlclxcXFxcXFwiKSArIFxcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcXFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uui/h+acn1xcXFxcXFwiLCBcXFxcXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHRpbWVPdmVyKSk7XFxcXG4gICAgbGV0IGRpc2N1c3MgPSB7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfM1xcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBpZiAoZGV2U2V0dGluZ3MuY2FuX2Rpc2N1c3MpIHtcXFxcbiAgICAgICAgZGlzY3Vzcy50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXFxcXFwi5YWB6K646K+E6K66XFxcXFxcXCIsIFxcXFxcXFwicmVkXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo5LiN6K64KVxcXFxcXFwiLCBcXFxcXFxcIiNhZGZmMmZcXFxcXFxcIikpO1xcXFxuICAgICAgICBkaXNjdXNzLnVybCA9IGFwaS5kaXNfZGV2X2Rpc2N1c3MgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZCsgXFxcXFxcXCImZmxhZz0xXFxcXFxcXCI7XFxcXG4gICAgICAgIGRpc2N1c3MuY29uZmlybSA9IFxcXFxcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXFxcXFwiO1xcXFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uuS4jeiuuFxcXFxcXFwiLCBcXFxcXFxcIuiuvue9ruWksei0pVxcXFxcXFwiXTtcXFxcblxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFxcXFxcIuS4jeiuuOivhOiuulxcXFxcXFwiLCBcXFxcXFxcImdyZWVuXFxcXFxcXCIpICsgY29sb3IoXFxcXFxcXCIo5YWB6K64KVxcXFxcXFwiLCBcXFxcXFxcIiMwMGJmZmZcXFxcXFxcIikpO1xcXFxuICAgICAgICBkaXNjdXNzLnVybCA9IGFwaS5kaXNfZGV2X2Rpc2N1c3MgKyBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZDtcXFxcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcXFxcXCLmmK/lkKbnoa7orqTku6XlkI7kuIrkvKDnmoTop4TliJnlhYHorrjor4Torro/XFxcXFxcXCI7XFxcXG4gICAgICAgIGRpc2N1c3MubXNnID0gW1xcXFxcXFwi5bey6K6+5Li65YWB6K64XFxcXFxcXCIsIFxcXFxcXFwi6K6+572u5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oZGlzY3VzcykpO1xcXFxufVxcXFxubWFwQ29sVHlwZShkYXRhLCBcXFxcXFxcImxpbmVcXFxcXFxcIiwgMik7XFxcXG5mb3IgKGxldCBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxcXG4gICAgbGV0IG15X3RfZXhjb2RlMSA9ICcnO1xcXFxuICAgIGxldCBteV90X2V4Y29kZTIgPSAnJztcXFxcbiAgICBpZiAoaXRlbS5zdGF0ZSAhPSAncHVibGljJykge1xcXFxuICAgICAgICBteV90X2V4Y29kZTEgKz0gJ+OKme+4jyc7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICcnO1xcXFxuICAgIH1cXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogbXlfdF9leGNvZGUxICsgaXRlbS5uYW1lICsgbXlfdF9leGNvZGUyLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL21hbmFnZVJ1bGUjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogaXRlbS5pZCxcXFxcbiAgICAgICAgICAgIC8vdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgLy9wYXNzd29yZDogcGFzc3dvcmRcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxcXG4gICAgfSlcXFxcbn1cXFxcbmlmIChydWxlTGlzdC5sZW5ndGggPT09IDApIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7lv6vmnaXkuIrkvKDkvaDnmoTnrKzkuIDmnaHop4TliJnlkKfvvIE8L2g1PlxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhOWImeivpue7hi1kZXZcXFwiLFxcXCJwYXRoXFxcIjpcXFwibWFuYWdlUnVsZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbiAgICBjb25zdCB7XFxcXG4gICAgICAgIGdldEFwaSxcXFxcbiAgICAgICAgY29sb3IsXFxcXG4gICAgICAgIHNtYWxsLFxcXFxuICAgICAgICBnZXRGaWxlLFxcXFxuICAgICAgICBleGlzdEZpbGUsXFxcXG4gICAgICAgIG1hcENvbFR5cGUsXFxcXG4gICAgICAgIGh0bWxUYWcsXFxcXG4gICAgICAgIGFwaSxcXFxcbiAgICAgICAgbWQsXFxcXG4gICAgfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGlkXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxubGV0IHtcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZCxcXFxcbn0gPSBnZXRGaWxlKCk7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbn0pKTtcXFxcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJnZXRieWlkXFxcXFxcXCIpICsgXFxcXFxcXCI/aWQ9XFxcXFxcXCIgKyBpZCkpLnJlc3VsdDtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIue8lui+keOAjFxcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXFxcXFwi44CNXFxcXFxcXCIpO1xcXFxubGV0IHJlcUJ5R2V0ID0gXFxcXFxcXCI/aWQ9XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiJnFxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkO1xcXFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLniYjmnKxcXFxcXFxcIiksXFxcXG4gICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ3kupHnq6/niYjmnKw6XFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXFxcXFwiIzVjZmYyY1xcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5LiK5qyh5o+Q5Lqk5LqOOiBbXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcXFxcXCIjZmY3MDAwXFxcXFxcXCIpICsgXFxcXFxcXCJdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiPOW8gOWPkeiAhT5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXFxcXFwiXFxcXFxcXFxuPOWQjeensD5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcbjzkupHnq6/niYjmnKw+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFxcXFxcIlxcXFxcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXFxcXFxuW1xcXFxcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFxcXFxcIl1cXFxcXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxcXG59KTtcXFxcbmxldCBkYXRhVHlwZSA9IHtcXFxcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXFxcbiAgICBqc191cmw6ICfnvZHpobXmj5Lku7bop4TliJknLFxcXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXFxcbn07XFxcXG5cXFxcbmxldCBiYXNpYyA9IHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59O1xcXFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWImTonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcXFxuXFxcXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLnsbvlnotcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCIoaWQ6XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiKVxcXFxcXFwiKTtcXFxcbmJhc2ljLmRlc2MgPSBcXFxcXFxcIuaVsOaNruexu+Wei++8mlxcXFxcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFxcXFxcIiNjYjU0ZmZcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXFxcXFwiICsgZGF0YUl0ZW0uc3RhdGU7XFxcXG5pZiAoW1xcXFxcXFwiaHRtbFxcXFxcXFwiLCBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiLCBcXFxcXFxcImpzX3VybFxcXFxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxcXG4gICAgYmFzaWMuZGVzYyArPSBcXFxcXFxcIlxcXFxcXFxcbuKAnOKAnOKAneKAnSA9PlxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCLngrnmraTpooTop4hcXFxcXFxcIik7XFxcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG59XFxcXG5sZXQgYXV0aCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gXFxcXFxcXCJwcml2YXRlXFxcXFxcXCIpIHtcXFxcbiAgICBsZXQgYXV0aF9iYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcImF1dGhcXFxcXFxcIikgKyByZXFCeUdldCkpO1xcXFxuICAgIGJhc2ljLnRpdGxlID0gYmFzaWMudGl0bGUgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiICsgc21hbGwoY29sb3IoYXV0aF9iYWNrLnJlc3VsdCwgXFxcXFxcXCJncmV5XFxcXFxcXCIpKTtcXFxcbiAgICBhdXRoID0gJyZhdXRoPScgKyBhdXRoX2JhY2sucmVzdWx0O1xcXFxuICAgIGJhc2ljLnVybCA9IGJhc2ljLnVybCA9PT0gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIgPyBiYXNpYy51cmwgOiBiYXNpYy51cmwgKyBhdXRoO1xcXFxufVxcXFxuZGF0YS5wdXNoKGJhc2ljKTtcXFxcbmxldCBub3RlcyA9IHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0X3J1bGVfbm90ZVxcXFxcXFwiKSArIGlkKTtcXFxcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcXFxucmVxdWlyZShtZCk7XFxcXG5sZXQgbm90ZXNIdG1sPVxcXFxcXFwiXFxcXFxcXCJcXFxcbnRyeXtcXFxcbiAgICBub3Rlc0h0bWw9bWFya2VkLnBhcnNlKG5vdGVzKTtcXFxcbn1jYXRjaChlKXt9XFxcXG5pZiAobm90ZXMgIT09IGZhbHNlKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLlpIfms6hcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLmn6XnnIvlrozmlbTlhazlkYogPlxcXFxcXFwiKSksXFxcXG4gICAgICAgIGRlc2M6IG5vdGVzLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0ZXh0OiBub3Rlc0h0bWwsXFxcXG4gICAgICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgLy8gdHlwZTogXFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICAgICAgdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi5pON5L2cXFxcXFxcXCIpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBpbXBvcnRVcmwsIHJ1bGVDb2RlLCBzaGFyZVVybCwgYmFja0NvZGUgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxubGV0IHN1YlVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXFxcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcXFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChzdWJVcmwpO1xcXFxufVxcXFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXFxcbiAgICBjYXNlIFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiOlxcXFxuICAgICAgICBydWxlQ29kZSA9IFxcXFxcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXFxcXFwicnVsZTovL1xcXFxcXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlICdwdWJsaXNoJzpcXFxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlICdqc191cmwnOlxcXFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ2h0bWwnOlxcXFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFxcXFxcIi9cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcXFxuICAgICAgICBydWxlQ29kZSA9IFxcXFxcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcXFxcXCIgKyBmaWxlX3BhdGggKyBcXFxcXFxcIkBcXFxcXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWtcXFxcbiAgICBjYXNlIFxcXFxcXFwiY29uZmlnXFxcXFxcXCI6XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXFxcbiAgICAgICAgICAgIGV2YWwoZmV0Y2goXFxcXFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXFxcXFwiaW1wb3J0XFxcXFxcXCIsIHBhc3N3b3JkKTtcXFxcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcXFxuICAgICAgICBicmVhaztcXFxcbn1cXFxcbmxldCBteV9jb2xfdHlwZSA9IFxcXFxcXFwidGV4dF8yXFxcXFxcXCI7XFxcXG5pZiAoaW1wb3J0VXJsKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85YWl6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogaW1wb3J0VXJsLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbiAgICBpZihkYXRhSXRlbS5pc19qc29uX2xpc3QmJi9ob21lX3J1bGVfdXJsfGh0bWwvLnRlc3QoZGF0YUl0ZW0uZGF0YV90eXBlKSl7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcXFxcXCJILVxcXFxcXFwiK2RhdGFJdGVtLm5hbWUrXFxcXFxcXCIuXFxcXFxcXCIrZGF0YUl0ZW0uYXV0aG9yO1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXFxcXFwiSi1cXFxcXFxcIitkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJylbMF07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHN1YlVybCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXFxcXFwiK3RpdGxlK1xcXFxcXFwiLmpzb25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcXFxuICAgICAgICAgICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXFxcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShzaGFyZVRleHQscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFxcXFxcIui9u+WQiOmbhuiuoumYhe+8mlxcXFxcXFwiK3RpdGxlKydcXFxcXFxcXG4nK3VybDtcXFxcbiAgICAgICAgICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvc3ViLmpzb24nO1xcXFxuICAgICAgICAgICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0sc3ViVXJsKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59XFxcXG5pZiAocnVsZUNvZGUpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLliIbkuqvop4TliJlcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIHJ1bGVDb2RlLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gc2V0U2V0dGluZ0l0ZW0oYmFzaWMsIHBhdHRlcm4pIHtcXFxcbiAgICBsZXQgdGVtcCA9IHtcXFxcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcXFxuICAgICAgICBjb2xfdHlwZTogYmFzaWMuY29sX3R5cGUsXFxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZywgcGF0dGVybikgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGJhY2tBID0gcmVxdWVzdCh1cmwpO1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFja0EpO1xcXFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIG1zZ1swXTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcGF0dGVybiA/IGJhY2soKSA6IHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgbXNnWzFdICsgXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIiArIHJldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnLCBwYXR0ZXJuKVxcXFxuICAgIH07XFxcXG4gICAgcmV0dXJuIHRlbXA7XFxcXG59XFxcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gJ3ByaXZhdGUnKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K6+5Li65YWs5byAXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJzaGFyZVxcXFxcXFwiKSArIHJlcUJ5R2V0ICsgXFxcXFxcXCImZmxhZ1xcXFxcXFwiICsgXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey6K6+5Li65YWs5byAXFxcXFxcXCI7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9LCB7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIumaj+acuuWvhumSpVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGUsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJnZW5BdXRoXFxcXFxcXCIpICsgcmVxQnlHZXQgKyBcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdChpbnB1dCk7XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrKTtcXFxcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LnlJ/miJDpmo/mnLrlr4bnoIFcXFxcXFxcXG5cXFxcXFxcIiArIHJldC5yZXN1bHRcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pmo/mnLrlr4bnoIHnlJ/miJDlpLHotKVcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KVxcXFxuICAgIH0pO1xcXFxuICAgIGxldCB0aW1lT3ZlciA9IHtcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfTtcXFxcbiAgICBpZiAoZGF0YUl0ZW0udGltZV9vdmVyKSB7XFxcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLnn63ml7blr4bpkqVcXFxcXFxcIiwgXFxcXFxcXCJncmVlblxcXFxcXFwiKSArIGNvbG9yKFxcXFxcXFwiKOKGkuawuOS5hSlcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikpO1xcXFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcXFxcXCJ0aW1lb3ZlclxcXFxcXFwiKSArIHJlcUJ5R2V0ICsgXFxcXFxcXCImZmxhZz0xXFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFxcXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFxcXFxcIjtcXFxcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXFxcXFwi5bey6K6+5Li65rC45LmFXFxcXFxcXCIsIFxcXFxcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcXFxcXCJdO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcXFxcXCLmsLjkuYXlr4bpkqVcXFxcXFxcIiwgXFxcXFxcXCJyZWRcXFxcXFxcIikgKyBjb2xvcihcXFxcXFxcIijihpLnn63ml7YpXFxcXFxcXCIsIFxcXFxcXFwiZ3JlZW5cXFxcXFxcIikpO1xcXFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcXFxcXCJ0aW1lb3ZlclxcXFxcXFwiKSArIHJlcUJ5R2V0O1xcXFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcXFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcXFxcXCI7XFxcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFxcXFxcIuW3suiuvuS4uui/h+acn1xcXFxcXFwiLCBcXFxcXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXFxcXFwiXTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHRpbWVPdmVyKSk7XFxcXG59IGVsc2UgaWYgKGRhdGFJdGVtLnN0YXRlID09ICdwdWJsaWMnKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6K6+5Li656eB5pyJXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJzaGFyZVxcXFxcXFwiKSArIHJlcUJ5R2V0ICsgXFxcXFxcXCImZmxhZz0xI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suiuvuS4uuengeaciVxcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0oe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWIoOmZpOaVsOaNrlxcXFxcXFwiLFxcXFxuICAgIGNvbmZpcm06IFxcXFxcXFwi5piv5ZCm56Gu6K6k5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgbXNnOiBbXFxcXFxcXCLlt7LliKDpmaRcXFxcXFxcIiwgXFxcXFxcXCLliKDpmaTlpLHotKVcXFxcXFxcIl0sXFxcXG4gICAgdXJsOiBnZXRBcGkoXFxcXFxcXCJkZWxldGVVcmxcXFxcXFxcIikgKyByZXFCeUdldCxcXFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbn0sIHRydWUpKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K6+572u5Zu+5qCHXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKGRhdGFJdGVtLnBpY191cmwsIFxcXFxcXFwi6L6T5YWl5Zu+5qCH5Zyw5Z2AXFxcXFxcXCIpLmlucHV0KGFwaSA9PiB7XFxcXG4gICAgICAgIGlmIChpbnB1dCA9PT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kvaDlnKjpgJfmiJHpk77mjqXlk6o/XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhcGkgKyBcXFxcXFxcIiZydWxlX3BpYz1cXFxcXFxcIiArIGlucHV0KTtcXFxcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcXFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICB9LCBnZXRBcGkoXFxcXFxcXCJzZXRfcnVsZV9waWNcXFxcXFxcIikgKyBkYXRhSXRlbS5pZCArIHJlcUJ5R2V0KSxcXFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXFxcXFwi56aB5q2i6K+E6K66XFxcXFxcXCIgOiBcXFxcXFxcIuW8gOWQr+ivhOiuulxcXFxcXFwiLFxcXFxuICAgIHVybDogJChhcGkuZGlzX3NldCArIGRhdGFJdGVtLmlkICsgcmVxQnlHZXQgKyBcXFxcXFxcIiZzdGF0ZT1cXFxcXFxcIiArIChkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXFxcXFwiXFxcXFxcXCIgOiAxKSkubGF6eVJ1bGUoKGNhbl9kaXNjdXNzKSA9PiB7XFxcXG4gICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBjYW5fZGlzY3VzcyA/IFxcXFxcXFwidG9hc3Q6Ly/lt7LnpoHmraLor4TorrpcXFxcXFxcIiA6IFxcXFxcXFwidG9hc3Q6Ly/lt7LlvIDlkK/or4TorrpcXFxcXFxcIjtcXFxcbiAgICB9LCBkYXRhSXRlbS5jYW5fZGlzY3VzcyksXFxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG59KTtcXFxcbk1ZX1BBUkFNUy5uYW1lID0gZGF0YUl0ZW0ubmFtZTtcXFxcbk1ZX1BBUkFNUy51c2VybmFtZT11c2VybmFtZTtcXFxcbk1ZX1BBUkFNUy5wYXNzd29yZD1wYXNzd29yZDtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi6K6+572u5aSH5rOoXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9zZXRfcnVsZV9ub3Rlc1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiBNWV9QQVJBTVMsXFxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG59KTtcXFxcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXFxcbiAgICAgICAgdXJsOiAkKCAvKlxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGhvbWUpKTtcXFxcbiAgICAgICAgICAgIGxldCBoYXNSdWxlID0gcnVsZUxpc3Quc29tZShpdGVtID0+IGl0ZW0udGl0bGUgPT09IG5hbWUpO1xcXFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXFxcXFwic0BcXFxcXFxcIiArIG5hbWU7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq5a6J6KOFXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLor4TorrpcXFxcXFxcIixcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF8zXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9SZXBseSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5hdXRob3IsXFxcXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXFxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lXFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLor4TorrooXFxcXFxcXCIgKyB0b3RhbFN1bSArIFxcXFxcXFwiKVxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXFxcXFwidVxcXFxcXFwiLCBcXFxcXFxcIuafpeeci+WFqOmDqOivhOiuuijmjqfor4QpID5cXFxcXFxcIikpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29tbWVudFxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5I2Z5cGFnZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxcXG4gICAgICAgIG5vX2FjdGl2ZTogdHJ1ZSxcXFxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmRcXFxcbiAgICB9XFxcXG59KTtcXFxcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxcXG5sZXQgaWNvbiA9IHtcXFxcbiAgICBcXFxcXFxcImdvb2RcXFxcXFxcIjogXFxcXFxcXCLwn5GNXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJiYWRcXFxcXFxcIjogXFxcXFxcXCLwn5GOXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJyZXBseVxcXFxcXFwiOiBcXFxcXFxcIuW8gOWPkeiAhfCfl6NcXFxcXFxcIlxcXFxufVxcXFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgZGF0YUl0ZW0uaWQgKyBcXFxcXFxcIj9saW1pdD01XFxcXFxcXCIpKS5yZXN1bHQ7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcXFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXFxcXFwicmVwbHlcXFxcXFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFxcXFxcIuKAmOKAmOWbnuWkjUBcXFxcXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcXFxcXCIgI1xcXFxcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFxcXFxcIuKAmeKAmVxcXFxcXFxcblxcXFxcXFwiOlxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcXFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFxcXFxcIiArIGl0ZW0uaWQgKyBcXFxcXFxcIjwvc21hbGw+PGZvbnQ+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvUmVwbHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcXFxuICAgICAgICAgICAgICAgIHJlcGx5SWQ6aXRlbS5pZFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFJlcGx5K2l0ZW0uY3JlYXRlX2RhdGUgKyBcXFxcXFxcIsK3XFxcXFxcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICB0eXBlOiBcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW0uZGlzY3Vzc190ZXh0XFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwiaWNvbl8yX3JvdW5kXFxcIixcXFwibmFtZVxcXCI6XFxcIuinhOWImeWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJydWxlc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsJC50b1N0cmluZygoKT0+e1xcXFxuICAgICAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIpO1xcXFxuICAgICAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5maWx0ZXJcXFxcXFxcIik7XFxcXG4gICAgICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLnR5cGVcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCcnKSl7XFxcXG4gICAgICAgICAgICBsb2coJ+aTjeS9nOi/h+emgeatouS4iuS8oDonK2dldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKSk7XFxcXG4gICAgICAgICAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5jYW5fdXBsb2FkXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KSk7XFxcXG5cXFxcbmlmIChnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBiYWNrKGZhbHNlKTtcXFxcbn1cXFxcblxcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaSxcXFxcbiAgICBhcGksXFxcXG4gICAgY29sb3IsXFxcXG4gICAgc21hbGwsXFxcXG4gICAgbG9jYWxSdWxlVmVyLFxcXFxuICAgIGh0bWxUYWcsXFxcXG4gICAgbWRcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxuY29uc3QgeyBub3JtYWxTb3J0IH0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgYXZhdGFyVXJsLFxcXFxuICAgIHFxLFxcXFxuICAgIGlkLFxcXFxuICAgIGNhbl91cGxvYWRcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IGJhY2tDb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInJ1bGVzVXJsXFxcXFxcXCIpICsgXFxcXFxcXCI/bmFtZT1cXFxcXFxcIiArIHFxK1xcXFxcXFwiJmRhdGFfdHlwZT1cXFxcXFxcIitkYXRhVHlwZSkpO1xcXFxubGV0IGRldk5hbWUgPSBiYWNrQ29kZS5kZXZfbmFtZTtcXFxcbnB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5maWx0ZXJcXFxcXFxcIiwgZGV2TmFtZSk7XFxcXG5sZXQgcnVsZUxpc3QgPSBiYWNrQ29kZS5yZXN1bHQ7XFxcXG5sZXQgc3ViVXJsID0gZ2V0QXBpKFxcXFxcXFwianNvbkxpc3RcXFxcXFxcIikgKyBcXFxcXFxcIj9uYW1lPVxcXFxcXFwiICsgcXE7XFxcXG5sZXQgaGFzU3ViID0gaGFzSG9tZVN1YihzdWJVcmwpO1xcXFxubGV0IGRldkluZm8gPSBcXFxcXFxcIui/meS4quS6uuW+iOaHkizku4DkuYjpg73msqHlhpnlk6Z+XFxcXFxcXCI7XFxcXG5sZXQgdG1wSnNvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJpbmZvR2V0VXJsXFxcXFxcXCIpICsgcXEpKTtcXFxcbmlmICh0bXBKc29uLnN0YXR1cyA9PSAwKSB7XFxcXG4gICAgZGV2SW5mbyA9IHRtcEpzb24ucmVzdWx0IHx8IGRldkluZm87XFxcXG59XFxcXG5sZXQgc3ViRmxhZyA9IGhhc1N1YiA/ICfwn4aXJyA6ICfwn5OhJztcXFxcbmxldCBkYXRhID0gW107XFxcXG5yZXF1aXJlKG1kKTtcXFxcbmRldkluZm89bWFya2VkLnBhcnNlKGRldkluZm8pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIGRldk5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFxcblxcXFxcXFwiICsgc21hbGwoaHRtbFRhZyhcXFxcXFxcInVcXFxcXFxcIiwgXFxcXFxcXCLngrnlh7vmn6XnnIvlrozmlbTlhazlkYpcXFxcXFxcIikpLFxcXFxuICAgIGRlc2M6IHNtYWxsKGRldkluZm8pLFxcXFxuICAgIHVybDogJ2hpa2VyOi8vcGFnZS9pbmZvJyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0ZXh0OiBkZXZJbmZvLFxcXFxuICAgICAgICBuYW1lOiBkZXZOYW1lLFxcXFxuICAgICAgICB0eXBlOlxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9LFxcXFxuICAgIHBpY191cmw6IGF2YXRhclVybCxcXFxcbiAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljJ1xcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxiaWc+6K6i6ZiF566h55CGPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlvZPliY1cXFxcXFxcIiArIChoYXNTdWIgPyBcXFxcXFxcIuW3suiuoumYhVxcXFxcXFwiIDogXFxcXFxcXCLmnKrorqLpmIVcXFxcXFxcIikgKyBcXFxcXFxcIik8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGV0IHN1Yl9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRldk5hbWUgKyBcXFxcXFxcIuWQiOmbhkBAXFxcXFxcXCIgKyBzdWJVcmw7XFxcXG5sZXQgcnVsZXNDb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWIme+/pWhvbWVfcnVsZV91cmzvv6UnICsgc3ViVXJsO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7kuIDplK7orqLpmIU8L3NwYW4+JyxcXFxcbiAgICBkZXNjOiAn6K6i6ZiF4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogIzVjZmYyY1xcXFxcXFwiPicgKyBkZXZOYW1lICsgJzwvc3Bhbj7nmoTmiYDmnInljZXop4TliJnvvIzlkIjpm4bpnIDljZXni6zorqLpmIUnLFxcXFxuICAgIHVybDogc3ViX2NvZGUsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5a+85YWl5YWo6YOoPC9zcGFuPicsXFxcXG4gICAgdXJsOiBydWxlc0NvZGUsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5a+85YWl6L275ZCI6ZuGPC9zcGFuPicsXFxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXFxcbiAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFxcXFxcIik7XFxcXG4gICAgICAgIGxvZyhcXFxcXFxcIui9u+WQiOmbhuWbvuagh+mTvuaOpTpcXFxcXFxcIithdmF0YXJVcmwpO1xcXFxuICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShcXFxcXFxcIui9u+WQiOmbhi5cXFxcXFxcIitkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpO1xcXFxuICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcXFxuICAgICAgICBsZXQgcnVsZUNvZGU9cGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiKVswXSk7XFxcXG4gICAgICAgIC8vcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcXFxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjZmY3MDAwXFxcXFxcXCI+5a+85YWl6YGT5b6357uPPC9zcGFuPicsXFxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXFxcbiAgICAgICAgbGV0IHRpdGxlID0gXFxcXFxcXCJILVxcXFxcXFwiK2Rldk5hbWU7XFxcXG4gICAgICAgIGxldCBzdWJPYmogPSB7XFxcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgICAgICB1cmw6IHN1YlVybCxcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL3J1bGVDYWNoZS9cXFxcXFxcIit0aXRsZStcXFxcXFxcIi5qc29uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2RlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBzaGFyZVRleHQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoc3ViT2JqKSk7XFxcXG4gICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXFxcbiAgICAgICAgdmFyIHVybCA9IHNoYXJlUGFzdGUoc2hhcmVUZXh0LHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcXFxuICAgICAgICBsZXQgaW1wb3J0X3J1bGU9IFxcXFxcXFwi6L275ZCI6ZuG6K6i6ZiF77yaXFxcXFxcXCIrdGl0bGUrJ1xcXFxcXFxcbicrdXJsO1xcXFxuICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgY29uc3QgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL3N1Yi5qc29uJztcXFxcbiAgICAgICAgJC5yYyhjb25maWcubGliLnN1Yik7XFxcXG4gICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXFxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxcXG59KTtcXFxcbmxldCBjYW5fdXBsb2FkX2FwaSA9IGdldEFwaShcXFxcXFxcIm1hbkNhblVwbG9hZFxcXFxcXFwiKStpZDtcXFxcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXFxcbiAgICBsZXQgdGlwcyA9IGNhbl91cGxvYWQ/J+iDvSc6J+WQpic7XFxcXG4gICAgLy8gbG9nKCd0aXBzOicrdGlwcyk7XFxcXG4gICAgLy8gbG9nKCdjYW5fdXBsb2FkOicrY2FuX3VwbG9hZCk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J+KaoOiDveWQpuS4iuS8oDonKyhnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJyl8fHRpcHMpLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDonaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9KTtcXFxcbiAgICBmdW5jdGlvbiBzZXRVcGxvYWQoZmxhZyxjYW5fdXBsb2FkX2FwaSkge1xcXFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2goY2FuX3VwbG9hZF9hcGksIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IE1PQklMRV9VQX0sXFxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwidXNlcm5hbWVcXFxcXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiY2FuX3VwbG9hZFxcXFxcXFwiOiAhIWZsYWdcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOifwn5qr56aB5q2i5LiK5LygJyxcXFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICB1cmw6JCgn56aB5q2i6K+l5byA5Y+R6ICF5LiK5Lyg6KeE5YiZP+S9oOeahOaTjeS9nOWwhuiiq+ezu+e7n+iusOW9lScpLmNvbmZpcm0oKGlkLGNhbl91cGxvYWRfYXBpLHNldFVwbG9hZCk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRVcGxvYWQoZmFsc2UsY2FuX3VwbG9hZF9hcGkpO1xcXFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsJ+WQpicpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcXFxuICAgICAgICB9LGlkLGNhbl91cGxvYWRfYXBpLHNldFVwbG9hZClcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon4pyF5YWB6K645LiK5LygJyxcXFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICB1cmw6JCgn5YWB6K646K+l5byA5Y+R6ICF5LiK5Lyg6KeE5YiZP+S9oOeahOaTjeS9nOWwhuiiq+ezu+e7n+iusOW9lScpLmNvbmZpcm0oKGlkLGNhbl91cGxvYWRfYXBpLHNldFVwbG9hZCk9PntcXFxcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRVcGxvYWQodHJ1ZSxjYW5fdXBsb2FkX2FwaSk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywn5pivJyk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcXFxuICAgIH0pO1xcXFxufVxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxiaWc+6KeE5YiZ5YiX6KGoPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlhbFcXFxcXFxcIiArIHJ1bGVMaXN0Lmxlbmd0aCArIFxcXFxcXFwi5p2hKTwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGRhdGFUeXBlTGlzdCA9IHtcXFxcbiAgICBcXFxcXFxcIlxcXFxcXFwiOlxcXFxcXFwi5YWo6YOoXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCI6ICflsI/nqIvluo8nLFxcXFxuICAgIC8vXFxcXFxcXCJwdWJsaXNoXFxcXFxcXCI6ICfmj5DkuqTkupHku5PlupPop4TliJknLFxcXFxuICAgIFxcXFxcXFwianNfdXJsXFxcXFxcXCI6ICfnvZHpobXmj5Lku7YnLFxcXFxuICAgIFxcXFxcXFwiaHRtbFxcXFxcXFwiOiAn6Z2Z5oCB6aG16Z2iJyxcXFxcbiAgICBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiOiAn5Li76aKYJ1xcXFxufTtcXFxcbmZvcihsZXQga2V5IGluIGRhdGFUeXBlTGlzdCl7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ZGF0YVR5cGU9PT1rZXk/XFxcXFxcXCLigJzigJxcXFxcXFxcIitkYXRhVHlwZUxpc3Rba2V5XStcXFxcXFxcIuKAneKAnVxcXFxcXFwiOmRhdGFUeXBlTGlzdFtrZXldLFxcXFxuICAgICAgICB1cmw6JChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChrZXkpPT57XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UudHlwZVxcXFxcXFwiLGtleSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgIH0sa2V5KSxcXFxcbiAgICAgICAgY29sX3R5cGU6XFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmlmIChydWxlTGlzdC5sZW5ndGggPiAyMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaQnOe0olxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIgKyBpbnB1dCArIFxcXFxcXFwiJnJ1bGU9XFxcXFxcXCIgKyBuYW1lLCBNWV9SVUxFLnRpdGxlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLmkJzntKLlvZPliY3lvIDlj5HogIXnmoTop4TliJlcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxcXG5sZXQgbVJ1bGVMaXN0ID0gW107XFxcXG5mb3IgKHZhciBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxcXG4gICAgaWYgKGl0ZW0uaXNfdGFwKSB7XFxcXG4gICAgICAgIGxldCBsb2NhdGlvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJydWxlTGlzdEpzb25cXFxcXFxcIikgKyBcXFxcXFxcIj9pZD1cXFxcXFxcIiArIGl0ZW0uaWQpKTtcXFxcbiAgICAgICAgaXRlbS5pZCA9IGxvY2F0aW9uLmlkO1xcXFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcXFxuICAgICAgICBpdGVtLmF1dGhvciA9IGxvY2F0aW9uLmF1dGhvcjtcXFxcbiAgICAgICAgaXRlbS5kYXRhX3R5cGUgPSBsb2NhdGlvbi5kYXRhX3R5cGU7XFxcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxcXG4gICAgfVxcXFxuICAgIGl0ZW0udmVyc2lvbiA9IGl0ZW0udmVyO1xcXFxuICAgIGxldCBsYWJlbCA9IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgIGx2ZXIgPSAtMjtcXFxcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFxcXFxcImhvbWVfcnVsZV91cmxcXFxcXFxcIikge1xcXFxuICAgICAgICBsdmVyID0gbG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcXFxcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXFxcXFwi8J+GlVxcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcXFxuICAgICAgICAgICAgbGFiZWwgPSBcXFxcXFxcIvCfhplcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBtUnVsZUxpc3QucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXFxcXG4gICAgICAgICAgICBpZDogaXRlbS5pZFxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXFxcbiAgICB9KTtcXFxcbn1cXFxcbi8qIOW9kuW5tuaOkuW6jyBTdGFydCAqL1xcXFxuaWYoZ2V0SXRlbShcXFxcXFxcIuaOkuW6j1xcXFxcXFwiLFxcXFxcXFwi5pe26Ze05LyY5YWIXFxcXFxcXCIpPT09J+aWsOeJiOS8mOWFiCcpe1xcXFxuICAgIG1SdWxlTGlzdCA9IG5vcm1hbFNvcnQobVJ1bGVMaXN0KTtcXFxcbn1cXFxcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXFxcbmRhdGEucHVzaC5hcHBseShkYXRhLCBtUnVsZUxpc3QpXFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLop4TliJnor6bnu4YtdXNlclxcXCIsXFxcInBhdGhcXFwiOlxcXCJydWxlRGV0YWlsXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuICAgIGNvbnN0IHtcXFxcbiAgICAgICAgZ2V0QXBpLFxcXFxuICAgICAgICBjb2xvcixcXFxcbiAgICAgICAgc21hbGwsXFxcXG4gICAgICAgIGh0bWxUYWcsXFxcXG4gICAgICAgIGFwaSxcXFxcbiAgICAgICAgbWRcXFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgaWQsXFxcXG4gICAgbHZlcixcXFxcbiAgICBpc0FsbFxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmlmKGdldFBhcmFtKFxcXFxcXFwiaWRcXFxcXFxcIikpe1xcXFxuICAgIGlzQWxsPXRydWU7XFxcXG4gICAgaWQ9Z2V0UGFyYW0oXFxcXFxcXCJpZFxcXFxcXFwiKTtcXFxcbiAgICBsdmVyPWx2ZXJ8fCfmnKrojrflj5bniYjmnKzlj7cnO1xcXFxufVxcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcXFxuICAgIGlmKCFpc0FsbCl7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICB9XFxcXG59LGlzQWxsKSk7XFxcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0YnlpZFxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiICsgaWQpKS5yZXN1bHQ7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLjgIxcXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIuOAjVxcXFxcXFwiKVxcXFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbnZhciBoYXNTdWIgPSBmYWxzZTtcXFxcblxcXFxuaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcXFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcXFxufSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXFxcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJyk7XFxcXG59XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLniYjmnKxcXFxcXFxcIiksXFxcXG4gICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ3lvIDlj5HogIXvvJpcXFxcXFxcIiArIGNvbG9yKGRhdGFJdGVtLmF1dGhvciwgXFxcXFxcXCIjMjI4QkU2XFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXG7kupHnq6/niYjmnKzvvJpcXFxcXFxcIiArIGNvbG9yKGRhdGFJdGVtLnZlciwgXFxcXFxcXCIjNWNmZjJjXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHTmnKzlnLDniYjmnKzvvJpcXFxcXFxcIiArIGNvbG9yKGx2ZXIsIFxcXFxcXFwiIzVjZmYyY1xcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxu5pu05paw5LqOOiBbXFxcXFxcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcXFxcXCIjZmY3MDAwXFxcXFxcXCIpICsgXFxcXFxcXCJdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiPOW8gOWPkeiAhT5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXFxcXFwiXFxcXFxcXFxuPOWQjeensD5cXFxcXFxcXG5cXFxcXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFxcXFxcIlxcXFxcXFxcbjzkupHnq6/niYjmnKw+XFxcXFxcXFxuXFxcXFxcXCIgKyBkYXRhSXRlbS52ZXIgKyBcXFxcXFxcIlxcXFxcXFxcbjzmnKzlnLDniYjmnKw+XFxcXFxcXFxuXFxcXFxcXCIgKyBsdmVyICsgXFxcXFxcXCJcXFxcXFxcXG485pu05paw5pe26Ze0PlxcXFxcXFxcbltcXFxcXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcXFxcXCJdXFxcXFxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJ1xcXFxufSk7XFxcXG5sZXQgZGF0YVR5cGUgPSB7XFxcXG4gICAgaG9tZV9ydWxlX3VybDogJ+mmlumhteS6keinhOWImScsXFxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXFxcbiAgICBodG1sOiAn6Z2Z5oCB6aG16Z2iJyxcXFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxcXG59O1xcXFxuXFxcXG5sZXQgYmFzaWMgPSB7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxufTtcXFxcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJnvvJonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcXFxuXFxcXG5sZXQgc2FmZV90aXA9ZGF0YUl0ZW0uaXNfc2FmZT9cXFxcXFxcIuWuieWFqFxcXFxcXFwiOlxcXFxcXFwi5Y2x6ZmpXFxcXFxcXCI7XFxcXG5sZXQgZ29vZF90aXAgPSBkYXRhSXRlbS5pc19nb29kP3NtYWxsKGNvbG9yKFxcXFxcXFwi44CQ5LyY6LSo6KeE5YiZ44CRXFxcXFxcXCIsJyNmZjcwMDAnKSk6XFxcXFxcXCJcXFxcXFxcIjtcXFxcbmxldCBub3Rfc2FmZV9ub3RlPWRhdGFJdGVtLm5vdF9zYWZlX25vdGU7XFxcXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLnsbvlnotcXFxcXFxcIikgKyBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCIoaWQ6XFxcXFxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXFxcXFwiKVxcXFxcXFwiKStcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCIo6aOO6Zmp5qOA5rWLOlxcXFxcXFwiICtzYWZlX3RpcCtcXFxcXFxcIilcXFxcXFxcIikrZ29vZF90aXA7XFxcXG5iYXNpYy5kZXNjID0gXFxcXFxcXCLmlbDmja7nsbvlnovvvJpcXFxcXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcXFxcXCIjY2I1NGZmXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXG7liIbkuqvnirbmgIHkuLrvvJpcXFxcXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcXFxuaWYgKFtcXFxcXFxcImh0bWxcXFxcXFxcIiwgXFxcXFxcXCJjb25maWdcXFxcXFxcIiwgXFxcXFxcXCJqc191cmxcXFxcXFxcIl0uaW5jbHVkZXMoZGF0YUl0ZW0uZGF0YV90eXBlKSkge1xcXFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcXFxcXCJcXFxcXFxcXG7igJzigJzigJ3igJ0gPT5cXFxcXFxcIiArIHNtYWxsKFxcXFxcXFwi54K55q2k6aKE6KeIXFxcXFxcXCIpO1xcXFxuICAgIGJhc2ljLnVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcXFxufVxcXFxuXFxcXG5kYXRhLnB1c2goYmFzaWMpO1xcXFxubGV0IGhhc1N1YnMgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuaWYgKGhhc1N1Yikge1xcXFxuICAgIGhhc1N1YnMgPSBcXFxcXFxcIlxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFxcdFxcXFxcXFwiICsgc21hbGwoXFxcXFxcXCLlt7LorqLpmIVcXFxcXFxcIilcXFxcbn1cXFxcblxcXFxubGV0IG5vdGVzID0gcmVxdWVzdChnZXRBcGkoXFxcXFxcXCJnZXRfcnVsZV9ub3RlXFxcXFxcXCIpICsgaWQpO1xcXFxubm90ZXMgPSBKU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxcXG5yZXF1aXJlKG1kKTtcXFxcbmxldCBub3Rlc0h0bWw9XFxcXFxcXCJcXFxcXFxcIlxcXFxudHJ5e1xcXFxuICAgIG5vdGVzSHRtbD1tYXJrZWQucGFyc2Uobm90ZXMpO1xcXFxufWNhdGNoKGUpe31cXFxcblxcXFxuaWYgKG5vdGVzICE9PSBmYWxzZSkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBodG1sVGFnKFxcXFxcXFwiYmlnXFxcXFxcXCIsIFxcXFxcXFwi5aSH5rOoXFxcXFxcXCIpICsgXFxcXFxcXCJcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcXFxcXCJ1XFxcXFxcXCIsIFxcXFxcXFwi5p+l55yL5a6M5pW05YWs5ZGKID5cXFxcXFxcIikpLFxcXFxuICAgICAgICBkZXNjOiBub3RlcyxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdGV4dDogbm90ZXNIdG1sLFxcXFxuICAgICAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgIC8vIHR5cGU6IFxcXFxcXFwibG9uZ190ZXh0XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIHR5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxufVxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogaHRtbFRhZyhcXFxcXFxcImJpZ1xcXFxcXFwiLCBcXFxcXFxcIuaTjeS9nFxcXFxcXFwiKSArIGhhc1N1YnMsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcInRvYXN0Oi8v5L2g5omN5piv5pyA5biF55qE6YKj5Liq5Lq677yBXFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG5pZiAoIWRhdGFJdGVtLmlzX2pzb24pIHtcXFxcbiAgICBiYWNrQ29kZSA9IHJlcXVlc3QocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcXFxufVxcXFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXFxcbiAgICBjYXNlIFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiOlxcXFxuICAgICAgICBydWxlQ29kZSA9IFxcXFxcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcXFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcXFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcXFxcXCJydWxlOi8vXFxcXFxcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcXFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgJ2pzX3VybCc6XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXFxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG4gICAgY2FzZSAnaHRtbCc6XFxcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXFxcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXFxcXFwiL1xcXFxcXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcXFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFxcXFxcIiArIGZpbGVfcGF0aCArIFxcXFxcXFwiQFxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxcXG4gICAgICAgIGJyZWFrXFxcXG4gICAgY2FzZSBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiOlxcXFxuICAgICAgICBpbXBvcnRVcmwgPSAkKCkucnVsZShwYXNzd29yZCA9PiB7XFxcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXFxcXFwiaGlrZXI6Ly9hc3NldHMvaG9tZS5qc1xcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICBIaWtlckhvbWUubG9hZChcXFxcXFxcImltcG9ydFxcXFxcXFwiLCBwYXNzd29yZCk7XFxcXG4gICAgICAgIH0sIGJhY2tDb2RlKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5sZXQgbXlfY29sX3R5cGUgPSBcXFxcXFxcInRleHRfMlxcXFxcXFwiO1xcXFxubGV0IG15X2NvbF90eXBlMiA9IFxcXFxcXFwidGV4dF8zXFxcXFxcXCI7XFxcXG5pZiAoaW1wb3J0VXJsKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85YWl6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogZGF0YUl0ZW0uaXNfc2FmZT9pbXBvcnRVcmw6J3RvYXN0Oi8v6aOO6Zmp6KeE5YiZ56aB5q2i5a+85YWlISEhJyxcXFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxcXG4gICAgfSk7XFxcXG59XFxcXG5pZiAocnVsZUNvZGUpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLliIbkuqvlj6Pku6RcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIHJ1bGVDb2RlLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuaWYgKGltcG9ydFVybCkge1xcXFxuICAgIGlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1Yikge1xcXFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCJAQFxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXlkIjpm4YnLFxcXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI2ZmNzAwMFxcXFxcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRhdGFJdGVtLHN1YlVybCk9PntcXFxcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2VuUnVsZX09JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0X3J1bGU9Z2VuUnVsZShkYXRhSXRlbS5uYW1lK1xcXFxcXFwiLlxcXFxcXFwiK2RhdGFJdGVtLmF1dGhvcixzdWJVcmwpO1xcXFxuICAgICAgICAgICAgICAgIC8vY29weShpbXBvcnRfcnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIilbMF0pO1xcXFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZTJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNmZjcwMDBcXFxcXFxcIj7lr7zlhaXpgZPlvrfnu488L3NwYW4+JyxcXFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxcXG4gICAgICAgICAgICAgICAgLy8gbGV0IHRpdGxlID0gXFxcXFxcXCJILVxcXFxcXFwiK2RhdGFJdGVtLm5hbWUrXFxcXFxcXCIuXFxcXFxcXCIrZGF0YUl0ZW0uYXV0aG9yO1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IFxcXFxcXFwiSi1cXFxcXFxcIitkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJylbMF07XFxcXG4gICAgICAgICAgICAgICAgbGV0IHN1Yk9iaiA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHN1YlVybCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvcnVsZUNhY2hlL1xcXFxcXFwiK3RpdGxlK1xcXFxcXFwiLmpzb25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSwvL+emgeeUqOW5tuWPkeabtOaWsFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBsZXQgc2hhcmVUZXh0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHN1Yk9iaikpO1xcXFxuICAgICAgICAgICAgICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXFxcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gc2hhcmVQYXN0ZShzaGFyZVRleHQscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPSBcXFxcXFxcIui9u+WQiOmbhuiuoumYhe+8mlxcXFxcXFwiK3RpdGxlKydcXFxcXFxcXG4nK3VybDtcXFxcbiAgICAgICAgICAgICAgICBjb3B5KGltcG9ydF9ydWxlKTtcXFxcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9ydWxlQ2FjaGUvc3ViLmpzb24nO1xcXFxuICAgICAgICAgICAgICAgICQucmMoY29uZmlnLmxpYi5zdWIpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiDorqLpmIXlr7zlhaUocGF0aClcXFxcbiAgICAgICAgICAgIH0sZGF0YUl0ZW0scnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlMlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmICFoYXNTdWIgJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09ICdob21lX3J1bGVfdXJsJykge1xcXFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzljZXop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcXFxcXCJAQFxcXFxcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnO1xcXFxuICAgICAgICBsZXQgc3ViX3VybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShzdWJfcnVsZV9jb2RlKTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF6KeE5YiZJyxcXFxcbiAgICAgICAgICAgIHVybDogc3ViX3VybCxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcXFxuICAgICAgICB9KVxcXFxuICAgIH1cXFxcbn1cXFxcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXFxcbiAgICAgICAgdXJsOiAkKCAvKlxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGhvbWUpKTtcXFxcbiAgICAgICAgICAgIGxldCBoYXNSdWxlID0gcnVsZUxpc3Quc29tZShpdGVtID0+IGl0ZW0udGl0bGUgPT09IG5hbWUpO1xcXFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXFxcXFwic0BcXFxcXFxcIiArIG5hbWU7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq5a6J6KOFXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXFxcbiAgICB9KVxcXFxufVxcXFxubGV0IG1hbl9ydWxlX3NhZmUgPSBnZXRBcGkoXFxcXFxcXCJtYW5SdWxlU2FmZVxcXFxcXFwiKStkYXRhSXRlbS5pZDtcXFxcbmxldCBtYW5fcnVsZV9nb29kID0gZ2V0QXBpKFxcXFxcXFwibWFuUnVsZUdvb2RcXFxcXFxcIikrZGF0YUl0ZW0uaWQ7XFxcXG4vLyBkYXRhSXRlbS5pc19zYWZlO1xcXFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcXFxuICAgIGZ1bmN0aW9uIHNldElzU2FmZShmbGFnLG1hbl9ydWxlX3NhZmUpIHtcXFxcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX3NhZmUsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IE1PQklMRV9VQX0sXFxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwidXNlcm5hbWVcXFxcXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiaXNfc2FmZVxcXFxcXFwiOiAhIWZsYWdcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGZ1bmN0aW9uIHNldElzR29vZChmbGFnLG1hbl9ydWxlX2dvb2QpIHtcXFxcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX2dvb2QsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IE1PQklMRV9VQX0sXFxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwidXNlcm5hbWVcXFxcXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiaXNfZ29vZFxcXFxcXFwiOiAhIWZsYWdcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOifwn5qr6aOO6ZmpJyxcXFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66aOO6ZmpP+mjjumZqeinhOWImeaXoOazleiiq+WvvOWFpScpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZShmYWxzZSxtYW5fcnVsZV9zYWZlKTtcXFxcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcXFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOifinIXmraPluLgnLFxcXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrmraPluLg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKHRydWUsbWFuX3J1bGVfc2FmZSk7XFxcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSlcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTon4pml6Z2e5LyY6LSoJyxcXFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66Z2e5LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZChmYWxzZSxtYW5fcnVsZV9nb29kKTtcXFxcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcXFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOifwn5KW5LyY6LSoJyxcXFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcXFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZCh0cnVlLG1hbl9ydWxlX2dvb2QpO1xcXFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcXFxuICAgIHBpY191cmw6IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzNcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXFxcbiAgICB9XFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxcXG4gICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfM1xcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvTWFrZUFjb21tZW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXFxcbiAgICAgICAgZGVmYXVsdFR5cGU6XFxcXFxcXCJiYWRcXFxcXFxcIlxcXFxuICAgIH1cXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLor4TorrpcXFxcXFxcIixcXFxcbiAgICBwaWNfdXJsOiBcXFxcXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF8zXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5uYW1lXFxcXG4gICAgfVxcXFxufSk7XFxcXG5sZXQgdG90YWxTdW0gPSBkYXRhSXRlbS5nb29kX251bSArIGRhdGFJdGVtLmJhZF9udW07XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiaWdcXFxcXFxcIiwgXFxcXFxcXCLor4TorrooXFxcXFxcXCIgKyB0b3RhbFN1bSArIFxcXFxcXFwiKVxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXFxcXFwidVxcXFxcXFwiLCBcXFxcXFxcIuafpeeci+WFqOmDqOivhOiuuiA+XFxcXFxcXCIpKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbW1lbnRcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXFxcbiAgICAgICAgdG90YWxTdW06IHRvdGFsU3VtLFxcXFxuICAgICAgICBub19hY3RpdmU6IGZhbHNlXFxcXG4gICAgfVxcXFxufSk7XFxcXG4vL2NvbnN0IGxvbmdlc3RTdW09MTIwO1xcXFxubGV0IGljb24gPSB7XFxcXG4gICAgXFxcXFxcXCJnb29kXFxcXFxcXCI6IFxcXFxcXFwi8J+RjVxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiYmFkXFxcXFxcXCI6IFxcXFxcXFwi8J+RjlxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwicmVwbHlcXFxcXFxcIjpcXFxcXFxcIuW8gOWPkeiAhfCfl6NcXFxcXFxcIlxcXFxufVxcXFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgZGF0YUl0ZW0uaWQgKyBcXFxcXFxcIj9saW1pdD01XFxcXFxcXCIpKS5yZXN1bHQ7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcXFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXFxcXFwicmVwbHlcXFxcXFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFxcXFxcIuKAmOKAmOWbnuWkjUBcXFxcXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcXFxcXCIgI1xcXFxcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFxcXFxcIuKAmeKAmVxcXFxcXFxcblxcXFxcXFwiOlxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcXFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFxcXFxcIiArIGl0ZW0uaWQgKyBcXFxcXFxcIjwvc21hbGw+PGZvbnQ+XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIC8vdXJsOiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBpdGVtLnFxLFxcXFxuICAgICAgICAgICAgdXJsOlxcXFxcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFxcXFxcIitpdGVtLnFxLFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXFxcXFwiwrdcXFxcXFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXFxcXFwibG9uZ190ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwicmljaF90ZXh0XFxcIixcXFwibmFtZVxcXCI6XFxcIuafpeeci1xcXCIsXFxcInBhdGhcXFwiOlxcXCJpbmZvXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5p+l55yL44CMXFxcXFxcXCIrTVlfUEFSQU1TLm5hbWUrXFxcXFxcXCLjgI1cXFxcXFxcIilcXFxcbnNldFJlc3VsdChbe1xcXFxuICAgIHRpdGxlOiBNWV9QQVJBTVMudGV4dCxcXFxcbiAgICBjb2xfdHlwZTpNWV9QQVJBTVMudHlwZVxcXFxufV0pO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuW8gOWPkeiAheazqOWGjFxcXCIsXFxcInBhdGhcXFwiOlxcXCJSZWdpc3RlclxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuW8gOWPkeiAheazqOWGjFxcXFxcXFwiKTtcXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGksXFxcXG4gICAgaHRtbFRhZyxcXFxcbiAgICBtYXBDb2xUeXBlLFxcXFxuICAgIHNtYWxsXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbnZhciBkYXRhID0gW107XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLlBhc3N3b3JkXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLlVzZXJuYW1lXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLkRlc2NyaXB0aW9uXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxuYWRkTGlzdGVuZXIoJ29uUmVmcmVzaCcsICQudG9TdHJpbmcoKCk9PntcXFxcbiAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuV2FpdFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbn0pKTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfotKblj7cnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl6LSm5Y+3KOW/heWhqylcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlVzZXJuYW1lJywgJycpLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcIm51bWJlclxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5Vc2VybmFtZVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICB9XFxcXG59LCB7XFxcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5a+G56CBKOW/heWhqylcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlBhc3N3b3JkJywgJycpLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInBhc3N3b3JkXFxcXFxcXCIsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLlBhc3N3b3JkXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxubWFwQ29sVHlwZShkYXRhLCBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIiwgMSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn5pi156ewJyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeaYteensCjlv4XloaspXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VyQWRkcmVzcycsICcnKSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSwge1xcXFxuICAgIHRpdGxlOiAn5o+P6L+wJyxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuivtOivtOS4uuS7gOS5iOimgeazqOWGjOWQp1xcXFxcXFxcbijlj6/ku6Xlop7liqDpgJrov4fmpoLnjocs6YCJ5aGrKVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuRGVzY3JpcHRpb24nLCAnJyksXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuRGVzY3JpcHRpb25cXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSlcXFxcblxcXFxubWFwQ29sVHlwZShkYXRhLCBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIiwgMSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcXFxcXCJiXFxcXFxcXCIsIFxcXFxcXFwi5rOo5YaMXFxcXFxcXCIpLFxcXFxuICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJuZXdfZGV2XFxcXFxcXCIpK1xcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGdldElkLCBjb25maXJtKSA9PiB7XFxcXG4gICAgICAgIGxldCB1c2VybmFtZSA9IGdldFZhcignV2FyZWhvdXNlLlVzZXJuYW1lJywgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBwYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLlBhc3N3b3JkJywgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGdldFZhcignV2FyZWhvdXNlLkRlc2NyaXB0aW9uJywgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBuYW1lID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoW3VzZXJuYW1lLCBwYXNzd29yZCwgbmFtZV0uaW5jbHVkZXMoXFxcXFxcXCJcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6LSm5Y+3LOWvhueggeWSjOaYteensOS4jeiDveS4uuepulxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi5q2j5Zyo5o+Q5Lqk55Sz6K+36KGoXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcXFxuICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInJlYXNvblxcXFxcXFwiOiBkZXNjcmlwdGlvbixcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IG5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogdXNlcm5hbWVcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGlkcmVzdWx0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldElkICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyB1c2VybmFtZSkpO1xcXFxuICAgICAgICBpZiAoaWRyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgaWRyZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIFxcXFxuICAgICAgICByZXR1cm4gJChcXFxcXFxcIlxcXFxcXFwiLCBcXFxcXFxcIui+k+WFpemCrueusemqjOivgeeggVxcXFxcXFxcblxcXFxcXFwiICsgcmVzdWx0LmRldGFpbCkuaW5wdXQoKGNvbmZpcm0sIGlkLCBhY2NvdW50KSA9PiB7XFxcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFxcXFxcIuivt+iAkOW/g+etieW+hVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoY29uZmlybSwge1xcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInJlZ2lzdF9pZFxcXFxcXFwiOiBpZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInl6bVxcXFxcXFwiOiBpbnB1dFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcXFxcXCIsIGFjY291bnRbMF0pO1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXFxcXFwiLCBhY2NvdW50WzFdKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aIkOWKn+aPkOS6pOazqOWGjOazqOWGjFxcXFxcXFxcblxcXFxcXFwiK3Jlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lh7rplJnkuoblkZBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgY29uZmlybSwgaWRyZXN1bHQucmVzdWx0LCBbdXNlcm5hbWUsIHBhc3N3b3JkXSk7XFxcXG4gICAgfSwgZ2V0QXBpKFxcXFxcXFwibmV3X2dldElkXFxcXFxcXCIpLCBnZXRBcGkoXFxcXFxcXCJuZXdfY29uZmlybVxcXFxcXFwiKSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMVxcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuKrkurrotYTmlplcXFwiLFxcXCJwYXRoXFxcIjpcXFwiUGVyc29uYWxEYXRhXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5Liq5Lq66LWE5paZXFxcXFxcXCIpO1xcXFxudmFyIGRhdGE9W107XFxcXG5jb25zdCB7XFxcXG4gICAgZ2V0QXBpLFxcXFxuICAgIGdldEZpbGUsXFxcXG4gICAgYXBpXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxldCB7dXNlcm5hbWUscGFzc3dvcmR9ID0gZ2V0RmlsZSgpO1xcXFxubGV0IGRldiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcXFxcXCJ1c2VyXFxcXFxcXCIpK01ZX1BBUkFNUy5pZCkpLnJlc3VsdDtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLlpLTlg49cXFxcXFxcIixcXFxcbiAgICBkZXNjOmRldi5hdmF0YXIsXFxcXG4gICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e1xcXFxuICAgICAgICBkZXY6ZGV2LFxcXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxcXG4gICAgICAgIFBhdHRlcm46MFxcXFxuICAgIH0sXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuaYteensFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6ZGV2Lm5hbWUsXFxcXG4gICAgdXJsOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6e1xcXFxuICAgICAgICBkZXY6ZGV2LFxcXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxcXG4gICAgICAgIFBhdHRlcm46MVxcXFxuICAgIH0sXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLlr4bnoIFcXFxcXFxcIixcXFxcbiAgICB1cmw6XFxcXFxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYTp7XFxcXG4gICAgICAgIGRldjpkZXYsXFxcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXFxcbiAgICAgICAgUGF0dGVybjoyXFxcXG4gICAgfSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIui0puWPt++8mlxcXFxcXFwiK3VzZXJuYW1lLFxcXFxuICAgIHVybDpcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIit1c2VybmFtZSxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCJVSUTvvJpcXFxcXFxcIitkZXYuaWQsXFxcXG4gICAgdXJsOlxcXFxcXFwiY29weTovL1xcXFxcXFwiK2Rldi5pZCxcXFxcbiAgICBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuaPkOS6pOS6keS7k+W6k+inhOWImVxcXFxcXFwiLFxcXFxuICAgIHVybDokKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGhvc3QpPT57XFxcXG4gICAgICAgIGxldCBjb2RlPXJlcXVlc3QoaG9zdCtcXFxcXFxcIi9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTE0NVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHdvcmQ9XFxcXFxcXCLvv6VwdWJsaXNo77+lXFxcXFxcXCIrYmFzZTY0RW5jb2RlKGNvZGUpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJydWxlOi8vXFxcXFxcXCIrYmFzZTY0RW5jb2RlKHdvcmQpO1xcXFxuICAgIH0sYXBpLmhvc3QpLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuWQjOatpeaPkOS6pOS6keS7k+W6k+i0puWPt+WvhueggVxcXFxcXFwiLFxcXFxuICAgIHVybDpcXFxcXFxcInJ1bGU6Ly9cXFxcXFxcIitiYXNlNjRFbmNvZGUoXFxcXFxcXCLvv6VwdWJsaXNoX2FjY291bnTvv6VcXFxcXFxcIit1c2VybmFtZStcXFxcXFxcIkBcXFxcXFxcIitwYXNzd29yZCksXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6XFxcXFxcXCLkvaDkuIDlhbHlj5HluIPkuobjgIxcXFxcXFxcIitkZXYucnVsZV9udW0rXFxcXFxcXCLjgI3mnaHop4TliJlcXFxcXFxcIixcXFxcbiAgICB1cmw6XFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuazqOmUgOeZu+W9lVxcXFxcXFwiLFxcXFxuICAgIHVybDokKFxcXFxcXFwi56Gu6K6k5rOo6ZSA55m75b2VP1xcXFxcXFwiKS5jb25maXJtKGYgPT4ge1xcXFxuICAgICAgICBmLnVzZXJuYW1lPVxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGYucGFzc3dvcmQ9XFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvbicsIEpTT04uc3RyaW5naWZ5KGYpKTtcXFxcbiAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmJhY2tcXFxcXFxcIixcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lms6jplIBcXFxcXFxcIjtcXFxcbiAgICB9LHVzZXIpLFxcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmm7TmlLnkuKrkurrotYTmlplcXFwiLFxcXCJwYXRoXFxcIjpcXFwibW9kaWZ5X1BlcnNvbmFsRGF0YVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IHtcXFxcbiAgICBnZXRBcGksXFxcXG4gICAgY29sb3IsXFxcXG4gICAgc21hbGwsXFxcXG4gICAgZ2V0RmlsZSxcXFxcbiAgICBodG1sVGFnXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCB7XFxcXG4gICAgZGV2LFxcXFxuICAgIHVzZXJuYW1lLFxcXFxuICAgIHBhc3N3b3JkLFxcXFxuICAgIFBhdHRlcm5cXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG52YXIgZGF0YSA9IFtdO1xcXFxubGV0IHBhdGggPSBcXFxcXFxcIj9xcT1cXFxcXFxcIiArIHVzZXJuYW1lICsgXFxcXFxcXCImcGFzc3dvcmQ9XFxcXFxcXCIgKyBwYXNzd29yZDtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5wZXROYW1lXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uYXZhdGFyXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQuY1xcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnhcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC55XFxcXFxcXCIpO1xcXFxufSkpO1xcXFxuZnVuY3Rpb24gbV9wZXROYW1lKCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuivt+i+k+WFpeaWsOaYteensFxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5wZXROYW1lJywgJycpfHxkZXYubmFtZSxcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ucGV0TmFtZVxcXFxcXFwiLGlucHV0KSdcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuS/neWtmFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXFxcXFwibW9kaWZ5X25hbWVcXFxcXFxcIikgKyBwYXRoKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgbmV3UGV0TmFtZSA9IGdldFZhcignV2FyZWhvdXNlLm0ucGV0TmFtZScsICcnKTtcXFxcbiAgICAgICAgICAgIGlmIChuZXdQZXROYW1lID09IFxcXFxcXFwiXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWhq+WViiFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcXFxcXCImbmFtZT1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdQZXROYW1lKSk7XFxcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbV9hdmF0YXIoKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl5paw55qE5aS05YOP6ZO+5o6lXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLmF2YXRhcicsICcnKSB8fCBkZXYuYXZhdGFyLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5hdmF0YXJcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkv53lrZhcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFxcXFxcIm1vZGlmeV9hdmFcXFxcXFxcIikgKyBwYXRoKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgbmV3QXZhdGFyID0gZ2V0VmFyKCdXYXJlaG91c2UubS5hdmF0YXInLCAnJyk7XFxcXG4gICAgICAgICAgICBcXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcXFxcXCImYXZhdGFyX3VybD1cXFxcXFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdBdmF0YXIpKTtcXFxcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXFxcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBtX3B3ZCgpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTpcXFxcXFxcIuWOn+WvhueggVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXljp/lr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHR5cGU6XFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLnknLCAnJyksXFxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnlcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTpcXFxcXFxcIuaWsOWvhueggVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLor7fovpPlhaXmlrDlr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHR5cGU6XFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLngnLCAnJyksXFxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnhcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTpcXFxcXFxcIumHjeWkjeaWsOWvhueggVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLor7fph43lpI3mlrDlr4bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHR5cGU6XFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC5jJywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC5jXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5L+d5a2YXFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJtb2RpZnlfcHdkXFxcXFxcXCIpK3BhdGgpLmxhenlSdWxlKChwYXNzd29yZCx1c2VybmFtZSkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IG9sZF9wYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueScsICcnKTtcXFxcbiAgICAgICAgICAgIGxldCBuZXdfcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLngnLCAnJyk7XFxcXG4gICAgICAgICAgICBsZXQgbmV3X3Bhc3N3b3JkX2FnYWluID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC5jJywgJycpO1xcXFxuICAgICAgICAgICAgaWYgKG9sZF9wYXNzd29yZCE9PXBhc3N3b3JkKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ljp/lr4bnoIHplJnor69cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmKG5ld19wYXNzd29yZD09PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K+36L6T5YWl5paw5a+G56CBXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZihuZXdfcGFzc3dvcmQhPT1uZXdfcGFzc3dvcmRfYWdhaW4pe1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Lik5qyh5a+G56CB5LiN5ZCMXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcXFxcXCImbmV3X3Bhc3N3b3JkPVxcXFxcXFwiICsgbmV3X3Bhc3N3b3JkK1xcXFxcXFwiJm5ld19wYXNzd29yZF9yZT1cXFxcXFxcIituZXdfcGFzc3dvcmRfYWdhaW4pO1xcXFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcXFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXFxcXFwiLEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOm5ld19wYXNzd29yZFxcXFxuICAgICAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0scGFzc3dvcmQsdXNlcm5hbWUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbnN3aXRjaCAoUGF0dGVybikge1xcXFxuICAgIGNhc2UgMDpcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi5L+u5pS55aS05YOPXFxcXFxcXCIpO1xcXFxuICAgICAgICBtX2F2YXRhcigpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlIDE6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuS/ruaUueaYteensFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbV9wZXROYW1lKCk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgMjpcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi5L+u5pS55a+G56CBXFxcXFxcXCIpO1xcXFxuICAgICAgICBtX3B3ZCgpO1xcXFxuICAgICAgICBicmVhaztcXFxcbn1cXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLnvJbovpHop4TliJnlpIfms6hcXFwiLFxcXCJwYXRoXFxcIjpcXFwic2V0X3J1bGVfbm90ZXNcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuY29uc3Qge1xcXFxuICAgIGdldEFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGlkLFxcXFxuICAgIHVzZXJuYW1lLFxcXFxuICAgIHBhc3N3b3JkLFxcXFxuICAgIG5hbWVcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLlpIfms6jjgIxcXFxcXFxcIituYW1lK1xcXFxcXFwi44CNXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLFxcXFxcXFwiY2xlYXJWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpXFxcXFxcXCIpO1xcXFxubGV0IG5vdGVzPXJlcXVlc3QoZ2V0QXBpKFxcXFxcXFwiZ2V0X3J1bGVfbm90ZVxcXFxcXFwiKStpZCk7XFxcXG5ub3Rlcz1KU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGRlc2M6IFxcXFxcXFwi6KeE5YiZ5aSH5rOoLi4uLi4uXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpfHxub3Rlc3x8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6LTEsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLnJ1bGUubm90ZXNcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5L+d5a2YXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChnZXRBcGkoXFxcXFxcXCJzZXRfcnVsZV9ub3RlXFxcXFxcXCIpICsgaWQpLmxhenlSdWxlKCh1c2VybmFtZSwgcGFzc3dvcmQpID0+IHtcXFxcbiAgICAgICAgbGV0IG5vdGVzID0gZ2V0VmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKTtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJxcVxcXFxcXFwiOiB1c2VybmFtZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBwYXNzd29yZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJub3RlXFxcXFxcXCI6bm90ZXNcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgfSwgdXNlcm5hbWUsIHBhc3N3b3JkKVxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZGF0YSk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcImxpbmVcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6K+E6K665YiX6KGoXFxcIixcXFwicGF0aFxcXCI6XFxcIkNvbW1lbnRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLor4TorrrliJfooahcXFxcXFxcIik7XFxcXG5jb25zdCB7XFxcXG4gICAgYXBpXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCBkYXRhID0gW107XFxcXG5sZXQge1xcXFxuICAgIHRvdGFsU3VtLFxcXFxuICAgIGlkLFxcXFxuICAgIG5vX2FjdGl2ZSxcXFxcbiAgICB1c2VybmFtZSxcXFxcbiAgICBwYXNzd29yZFxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKVsxXSk7XFxcXG5sZXQgZGlzY3Vzc190eXBlID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuaWYgKHBhZ2UgPT09IDEpIHtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgfSkpO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcXFxcXCJcXFxcXFxcIiA/IFxcXFxcXFwi4peJXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1xcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcXFxuXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi8J+Rjei1nlxcXFxcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcXFxcXCJnb29kXFxcXFxcXCIgPyBcXFxcXFxcIuKXiVxcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcImdvb2RcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxcXG5cXFxcbiAgICB9KTtcXFxcbiAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLwn5GO6LipXFxcXFxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFxcXFxcImJhZFxcXFxcXFwiID8gXFxcXFxcXCLil4lcXFxcXFxcIiA6IFxcXFxcXFwi4peLXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFxcXFxcIiwgXFxcXFxcXCJiYWRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxcXG4gICAgfSk7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Zue5aSNXFxcXFxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFxcXFxcInJlcGx5XFxcXFxcXCIgPyBcXFxcXFxcIuKXiVxcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXFxcXFwiLCBcXFxcXFxcInJlcGx5XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5cXFxcbmxldCBpY29uID0ge1xcXFxuICAgIFxcXFxcXFwiZ29vZFxcXFxcXFwiOiBcXFxcXFxcIvCfkY1cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImJhZFxcXFxcXFwiOiBcXFxcXFxcIvCfkY5cXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcInJlcGx5XFxcXFxcXCI6XFxcXFxcXCLlvIDlj5HogIXwn5ejXFxcXFxcXCJcXFxcbn1cXFxcbmxldCBjb250cm9sPShwaWQsYWN0aXZlKT0+dm9pZCAwO1xcXFxuaWYobm9fYWN0aXZlKXtcXFxcbiAgICBjb250cm9sPWZ1bmN0aW9uKHBpZCxhY3RpdmUpe1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6YWN0aXZlP1xcXFxcXFwi6ZqQ6JeP6K+E6K66XFxcXFxcXCI6XFxcXFxcXCLlsZXnpLror4TorrpcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDokKGFwaS5kaXNfZGV2X2NvbnRyb2wrcGlkK1xcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkK1xcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCk9PntcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0PUpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIrcmVzdWx0LmRldGFpbDtcXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOlxcXFxcXFwi5Yig6Zmk6K+E6K66XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6JChcXFxcXFxcIuehruiupOWIoOmZpOivpeivhOiuuj9cXFxcXFxcIikuY29uZmlybSgoaW5wdXQpPT57XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdD1KU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiK3Jlc3VsdC5kZXRhaWw7XFxcXG4gICAgICAgICAgICB9LGFwaS5kaXNfZGV2X2NvbnRyb2wrcGlkK1xcXFxcXFwiP3FxPVxcXFxcXFwiICsgdXNlcm5hbWUgKyBcXFxcXFxcIiZwYXNzd29yZD1cXFxcXFxcIiArIHBhc3N3b3JkK1xcXFxcXFwiJmRlbGV0ZT0xXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgaWQgKyBcXFxcXFxcIj9saW1pdD01JnBhZ2U9XFxcXFxcXCIgKyBwYWdlICsgXFxcXFxcXCImbm9fYWN0aXZlPVxcXFxcXFwiICsgbm9fYWN0aXZlICsgXFxcXFxcXCImZGlzY3Vzc190eXBlPVxcXFxcXFwiICsgZGlzY3Vzc190eXBlKSkucmVzdWx0O1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXFxcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFxcXFxcInJlcGx5XFxcXFxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcXFxcXCLigJjigJjlm57lpI1AXFxcXFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXFxcXFwiICNcXFxcXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcXFxcXCLigJnigJlcXFxcXFxcXG5cXFxcXFxcIjpcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXFxcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcXFxcXCIgKyBpdGVtLmlkICsgXFxcXFxcXCI8L3NtYWxsPjxmb250PlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAvL3VybDogbm9fYWN0aXZlP1xcXFxcXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcXFxcXCI6XFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgaXRlbS5xcSxcXFxcblxcXFx0XFxcXHQgICAgICAgdXJsOm5vX2FjdGl2ZT9cXFxcXFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXFxcXFwiOlxcXFxcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFxcXFxcIitpdGVtLnFxLFxcXFxuICAgICAgICAgICAgZXh0cmE6e1xcXFxuICAgICAgICAgICAgICAgIHJ1bGVJZDogaWQsXFxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXFxcbiAgICAgICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgcmVwbHlJZDppdGVtLmlkXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXFxcXFwiwrdcXFxcXFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOntcXFxcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXFxcXFwibG9uZ190ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgY29udHJvbChpdGVtLmlkLGl0ZW0uYWN0aXZlKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGNvbW1lbnRMaXN0Lmxlbmd0aCA9PT0gMCkge1xcXFxuICAgICAgICBkYXRhLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuc2V0UmVzdWx0KGRhdGEpXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Y+R6KGo6K+E6K66XFxcIixcXFwicGF0aFxcXCI6XFxcIk1ha2VBY29tbWVudFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBkYXRhID0gW107XFxcXG5jb25zdCB7XFxcXG4gICAgYXBpLFxcXFxuICAgIGdldEZpbGVcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IHtcXFxcbiAgICBpZCxcXFxcbiAgICBuYW1lLFxcXFxuICAgIGRlZmF1bHRUeXBlXFxcXG59ID0gTVlfUEFSQU1TO1xcXFxubGV0IHVzZXI9Z2V0RmlsZSgpLnVzZXJ8fFtcXFxcXFxcIlxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCJdO1xcXFxuXFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLor4TorrooXFxcXFxcXCIgKyBuYW1lICsgXFxcXFxcXCIpXFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnR5cGVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQucXFcXFxcXFxcIik7XFxcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxufSkpO1xcXFxubGV0IHR5cGUgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcXFxcXCIpIHx8IGRlZmF1bHRUeXBlfHxcXFxcXFxcImdvb2RcXFxcXFxcIjtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgZGVzYzogXFxcXFxcXCLor4TorrouLi4uLi5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6NyxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIui0puWPt++8mlxcXFxcXFwiKyh1c2VyWzBdfHxcXFxcXFxcIlxcXFxcXFwiKSxcXFxcbiAgICBkZXNjOlxcXFxcXFwi6aqM6K+B56CB77yaXFxcXFxcXCIrKHVzZXJbMV18fFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgIHVybDpcXFxcXFxcImhpa2VyOi8vcGFnZS9Vc2VycmVnaXN0cmF0aW9uXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcXFxuICAgIFxcXFxufSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6ICAodHlwZSA9PT0gXFxcXFxcXCJnb29kXFxcXFxcXCIgPyBcXFxcXFxcIuKXiVxcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIikrXFxcXFxcXCIg8J+RjVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXFxcXFwiLCBcXFxcXFxcImdvb2RcXFxcXFxcIik7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXFxcblxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiAgKHR5cGUgPT09IFxcXFxcXFwiYmFkXFxcXFxcXCIgPyBcXFxcXFxcIuKXiVxcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIikrXFxcXFxcXCIg8J+RjlxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgcHV0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXFxcXFwiLCBcXFxcXFxcImJhZFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcXFxufSk7XFxcXG5cXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5o+Q5LqkXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChhcGkuZGlzX25ldyArIGlkKS5sYXp5UnVsZSgoQWNjb3VudCkgPT4ge1xcXFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXFxcbiAgICAgICAgbGV0IFtxcSxhdXRoX2NvZGVdID0gQWNjb3VudDtcXFxcbiAgICAgICAgbGV0IHR5cGUgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnR5cGUnKSB8fCAnZ29vZCc7XFxcXG4gICAgICAgIHFxPXFxfHxcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBhdXRoX2NvZGU9YXV0aF9jb2RlfHxcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICBpZihxcT09XFxcXFxcXCJcXFxcXFxcInx8YXV0aF9jb2RlPT1cXFxcXFxcIlxcXFxcXFwiKXtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq55m75b2V6LSm5Y+3XFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYodGV4dD09XFxcXFxcXCJcXFxcXFxcIil7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWGmeWVilxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGZ1bmN0aW9uIHIocCkge1xcXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHApLFxcXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBwID0ge1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJwYXJhbXNcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiZGlzY3Vzc190ZXh0XFxcXFxcXCI6IHRleHQsXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJxcVxcXFxcXFwiOiBxcSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImRpc2N1c3NfdHlwZVxcXFxcXFwiOiB0eXBlLFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiYXV0aF9jb2RlXFxcXFxcXCI6IGF1dGhfY29kZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSByKHApO1xcXFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT09MCl7XFxcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiK3Jlc3VsdC5kZXRhaWw7XFxcXG5cXFxcbiAgICB9LHVzZXIpXFxcXG59KTtcXFxcblxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS8queUqOaIt+azqOWGjFxcXCIsXFxcInBhdGhcXFwiOlxcXCJVc2VycmVnaXN0cmF0aW9uXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3Qge1xcXFxuICAgIGFwaSxcXFxcbiAgICBnZXRGaWxlLFxcXFxuICAgIGdldFVzZXJEYXRlXFxcXG59ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmxldCBkYXRhID0gW107XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLnlKjmiLfliJfooajnrqHnkIZcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm0ucXFcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UubS55em1cXFxcXFxcIik7XFxcXG59KSk7XFxcXG5sZXQgdXNlciA9IGdldEZpbGUoKTtcXFxcbmxldCB1c2VyTmFtZSA9IHVzZXIudXNlciB8fCBbXFxcXFxcXCJcXFxcXFxcIl07XFxcXG51c2VyTmFtZSA9IHVzZXJOYW1lWzBdO1xcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ08YmlnPijmt7vliqAv6aqM6K+BKei0puWPtzwvYmlnPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuiOt+WPllxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWlcXFcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKGEsIGIpID0+IHtcXFxcbiAgICAgICAgbGV0IHFxID0gaW5wdXQ7XFxcXG4gICAgICAgIGlmIChxcSA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWhq+WViiFcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBzaG93TG9hZGluZyhcXFxcXFxcIuiOt+WPluS4rS4uLlxcXFxcXFwiKVxcXFxuICAgICAgICByZXR1cm4gJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChxcSwgYSwgYikgPT4ge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYSwge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInFxXFxcXFxcXCI6IHFxXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXFxcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0MiA9IEpTT04ucGFyc2UocmVxdWVzdChiICsgXFxcXFxcXCI/cXE9XFxcXFxcXCIgKyBxcSkpO1xcXFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdDIuZGV0YWlsO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgdGhyb3cgZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB9LCBxcSwgYSwgYik7XFxcXG5cXFxcbiAgICB9LCBhcGkuZGlzX25ld191c2VyLCBhcGkuZGlzX3ZlcmlmeSksXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJudW1iZXJcXFxcXFxcIixcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnFxJywgJycpIHx8IHVzZXJOYW1lLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5tLnFxXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi6K+36L6T5YWl6aqM6K+B56CBXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLnl6bScsICcnKSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcXFxcXCJXYXJlaG91c2UubS55em1cXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8c21hbGw+5o+Q56S677yaMS7mr4/lpKnlj6rog73ojrflj5Y15qyh6aqM6K+B56CBLjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyLjxzPumqjOivgeeggeacieaViOacn+aMgee7reS4gOWRqOW3puWPszwvcz4o5pqC5pe25LiN5Lya77yM5b+Y6K6w6aqM6K+B56CB5Y+v6YCa6L+HUVHlj7fojrflj5YpPC9zbWFsbD5cXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxldCB1c2VyTGlzdCA9IGdldFVzZXJEYXRlKCk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumqjOivgS/nmbvlvZVcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7lrprkv53lrZjvvIzpqozor4HnoIHloavplJnvvIzml6Dms5Xor4Torrrlk6ZcXFxcXFxcIikuY29uZmlybSgoZiwgbCwgbG9naW4pID0+IHtcXFxcbiAgICAgICAgbGV0IHFxID0gZ2V0VmFyKCdXYXJlaG91c2UubS5xcScsICcnKTtcXFxcbiAgICAgICAgbGV0IHl6bSA9IGdldFZhcignV2FyZWhvdXNlLm0ueXptJywgJycpO1xcXFxuICAgICAgICBpZiAocXEgPT0gXFxcXFxcXCJcXFxcXFxcIiB8fCB5em0gPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9xceaIlumqjOivgeeggeS4uuepulxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGxvZ2luLCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogcXEsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiYXV0aF9jb2RlXFxcXFxcXCI6IHl6bVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxcXG4gICAgICAgICAgICBmLnVzZXIgPSBbcXEsIHl6bV07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBsLmZpbmRJbmRleChpdGVtID0+IGl0ZW1bMF0gPT09IHFxKTtcXFxcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoaW5kZXgsIDEsIFtxcSwgeXptXSk7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGwubGVuZ3RoIDwgNikge1xcXFxuICAgICAgICAgICAgICAgIGwucHVzaChbcXEsIHl6bV0pO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICBsLnNwbGljZSgwLCAxKTtcXFxcbiAgICAgICAgICAgICAgICBsLnB1c2goW3FxLCB5em1dKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShsKSk7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+mqjOivgeaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyByZXN1bHQuZGV0YWlsO1xcXFxuICAgIH0sIHVzZXIsIHVzZXJMaXN0LCBhcGkuZGlzX2xvZ2luKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmRhdGEucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdPGJpZz7otKblj7fliJfooag8L2JpZz5cXFxcXFxcXHRcXFxcXFxcXHRcXFxcXFxcXHQ8c21hbGw+KOS/neeVmTXmnaHorrDlvZUpPC9zbWFsbD5cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG59KTtcXFxcbnVzZXJMaXN0LnJldmVyc2UoKTtcXFxcblxcXFxuZm9yIChsZXQgaXRlbSBvZiB1c2VyTGlzdCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIui0puWPt++8mlxcXFxcXFwiICsgaXRlbVswXSArICh1c2VyTmFtZSA9PT0gaXRlbVswXSA/IFxcXFxcXFwiXFxcXFxcXFx0XFxcXFxcXFx0XFxcXFxcXFx04oCc4oCcW+W9k+WJjei0puWPt13igJ3igJ1cXFxcXFxcIiA6IFxcXFxcXFwiXFxcXFxcXCIpLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIumqjOivgeegge+8mlxcXFxcXFwiICsgaXRlbVsxXSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwi5piv5ZCm5YiH5o2i5Li66K+lW1xcXFxcXFwiICsgaXRlbVswXSArIFxcXFxcXFwiXei0puWPt1xcXFxcXFwiKS5jb25maXJtKChmLCBpdGVtKSA9PiB7XFxcXG4gICAgICAgICAgICBmLnVzZXIgPSBpdGVtO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgdXNlciwgaXRlbSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5kYXRhLnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIumAgOWHuui0puWPt1xcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIuehruiupOmAgOWHuueZu+W9leeKtuaAgVxcXFxcXFwiKS5jb25maXJtKChmKSA9PiB7XFxcXG4gICAgICAgIGYudXNlciA9IFtdO1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxcXG4gICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pgIDlh7rmiJDlip9cXFxcXFxcIjtcXFxcbiAgICB9LCB1c2VyKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG59KTtcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLliJfooajmjpLluo/nrpfms5VcXFwiLFxcXCJwYXRoXFxcIjpcXFwic29ydFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbi8qIOinhOWImeWIl+ihqOaOkuW6jyBbIFVQ44CBTkVX44CB5peg5pu05pawIF0g6aG65bqPICovXFxcXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXFxcbi8qXFxcXG5mdW5jdGlvbiBtZXJnZVNvcnQoYXJyKSB7XFxcXG4gICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XFxcXG4gICAgaWYgKGxlbiA8IDIpIHtcXFxcbiAgICAgICAgcmV0dXJuIGFycjtcXFxcbiAgICB9XFxcXG4gICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuIC8gMiksXFxcXG4gICAgICAgIGxlZnQgPSBhcnIuc2xpY2UoMCwgbWlkZGxlKSxcXFxcbiAgICAgICAgcmlnaHQgPSBhcnIuc2xpY2UobWlkZGxlKTtcXFxcbiAgICByZXR1cm4gbWVyZ2UobWVyZ2VTb3J0KGxlZnQpLCBtZXJnZVNvcnQocmlnaHQpKTtcXFxcbn1cXFxcbmZ1bmN0aW9uIG1lcmdlKGxlZnQsIHJpZ2h0KSB7XFxcXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xcXFxuICAgIHZhciBpc1RoaXNWZXJzaW9uTGlzdCA9IFtdO1xcXFxuXFxcXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoID4gMCAmJiByaWdodC5sZW5ndGggPiAwKSB7XFxcXG4gICAgICAgIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXFxcXFwi8J+GmVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFxcXFxcIvCfhplcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRbMF0udGl0bGUuaW5jbHVkZXMoXFxcXFxcXCLwn4aVXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXFxcXFwi8J+GlVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgd2hpbGUgKGlzVGhpc1ZlcnNpb25MaXN0Lmxlbmd0aCkgcmVzdWx0LnB1c2goaXNUaGlzVmVyc2lvbkxpc3Quc2hpZnQoKSk7XFxcXG5cXFxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGgpXFxcXG4gICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxcXG5cXFxcbiAgICB3aGlsZSAocmlnaHQubGVuZ3RoKVxcXFxuICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXFxcblxcXFxuICAgIHJldHVybiByZXN1bHQ7XFxcXG59XFxcXG4kLmV4cG9ydHMubWVyZ2VTb3J0ID0gbWVyZ2VTb3J0O1xcXFxuKi9cXFxcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXFxcbi8qIOaZrumAmuWIhuexu+aOkuW6jyBTdGFydCAqL1xcXFxuZnVuY3Rpb24gbm9ybWFsU29ydChhcnIpIHtcXFxcbiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcXFxcbiAgICBpZiAobGVuIDwgMikge1xcXFxuICAgICAgICByZXR1cm4gYXJyO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgdXBSZXN1bHQgPSBbXTtcXFxcbiAgICBsZXQgb3RoZXJSZXN1bHQgPSBbXTtcXFxcbiAgICB3aGlsZShhcnIubGVuZ3RoKSB7XFxcXG4gICAgICAgIGxldCBpdGVtID0gYXJyLnNoaWZ0KCk7XFxcXG4gICAgICAgIGlmKGl0ZW0udGl0bGUuaW5jbHVkZXMoXFxcXFxcXCLwn4aZXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICB1cFJlc3VsdC5wdXNoKGl0ZW0pXFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBvdGhlclJlc3VsdC5wdXNoKGl0ZW0pXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHVwUmVzdWx0LmNvbmNhdChvdGhlclJlc3VsdCk7XFxcXG59XFxcXG4kLmV4cG9ydHMubm9ybWFsU29ydCA9IG5vcm1hbFNvcnQ7XFxcXG4vKiDmma7pgJrliIbnsbvmjpLluo8gRW5kICovXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcImljb25fMl9yb3VuZFxcXCIsXFxcIm5hbWVcXFwiOlxcXCLlhajpg6jlhazlvIDop4TliJlcXFwiLFxcXCJwYXRoXFxcIjpcXFwiQWxsUHVibGljUnVsZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbiAgICBjb25zdCB7XFxcXG4gICAgICAgIGFwaSxcXFxcbiAgICAgICAgbG9jYWxSdWxlVmVyLFxcXFxuICAgICAgICBnZXRBcGlcXFxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbmNvbnN0IHtcXFxcbiAgICBtZXJnZVNvcnRcXFxcbn0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXFxcXFwiKTtcXFxcbmxldCBkYXRhVHlwZSA9IGdldFZhcihcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxubGV0IG9yZGVyID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLm9yZGVyXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBzb3J0ID0gZ2V0VmFyKFxcXFxcXFwiV2FyZWhvdXNlLnNvcnRcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxubGV0IGdvb2QgPSBnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuZ29vZFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBwYWdlID0gTVlfVVJMLnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKVsxXSB8fCAxO1xcXFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5hbGxfcnVsZSArIFxcXFxcXFwiP2RhdGFfdHlwZT1cXFxcXFxcIiArIGRhdGFUeXBlICsgXFxcXFxcXCImcGFnZT1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIiZsaW1pdD0yMCZvcmRlcj1cXFxcXFxcIiArIG9yZGVyICsgXFxcXFxcXCImc29ydD1cXFxcXFxcIiArIHNvcnQrIFxcXFxcXFwiJmlzX2dvb2Q9XFxcXFxcXCIgKyBnb29kKSkucmVzdWx0O1xcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS50eXBlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLm9yZGVyXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiV2FyZWhvdXNlLnNvcnRcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuZ29vZFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhclZhcihcXFxcXFxcIldhcmVob3VzZS5iYWNrXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxubGV0IGRhdGEgPSBbXTtcXFxcbmlmIChnZXRWYXIoXFxcXFxcXCJXYXJlaG91c2UuYmFja1xcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBiYWNrKCk7XFxcXG59XFxcXG5mdW5jdGlvbiB0YWIoYXJyLCB0eXBlLCBjb250cmFzdCkge1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgYXJyKSB7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbVsxXSA9PT0gY29udHJhc3QgPyBcXFxcXFxcIuKAnOKAnFxcXFxcXFwiICsgaXRlbVswXSArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCIgOiBpdGVtWzBdLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGtleSwgdHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcih0eXBlLCBrZXkpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9LCBpdGVtWzFdLCB0eXBlKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYmxhbmtfYmxvY2tcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuaWYgKHBhZ2UgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgdGFiKFtcXFxcbiAgICAgICAgW1xcXFxcXFwi5YWo6YOoXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLlsI/nqIvluo9cXFxcXFxcIiwgXFxcXFxcXCJob21lX3J1bGVfdXJsXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFxcXFxcIiwgXFxcXFxcXCJwdWJsaXNoXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLnvZHpobXmj5Lku7ZcXFxcXFxcIiwgXFxcXFxcXCJqc191cmxcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIumdmeaAgemhtemdolxcXFxcXFwiLCBcXFxcXFxcImh0bWxcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuS4u+mimFxcXFxcXFwiLCBcXFxcXFxcImNvbmZpZ1xcXFxcXFwiXVxcXFxuICAgIF0sIFxcXFxcXFwiV2FyZWhvdXNlLnR5cGVcXFxcXFxcIiwgZGF0YVR5cGUpO1xcXFxuICAgIHRhYihbXFxcXG4gICAgICAgIFtcXFxcXFxcIuaXtumXtFxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIklEXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5aW96K+E5bqmXFxcXFxcXCIsIFxcXFxcXFwiMlxcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5beu6K+E5bqmXFxcXFxcXCIsIFxcXFxcXFwiM1xcXFxcXFwiXSxcXFxcbiAgICAgICAgW1xcXFxcXFwi5Zue5aSN5pWwXFxcXFxcXCIsIFxcXFxcXFwiNFxcXFxcXFwiXVxcXFxuICAgIF0sIFxcXFxcXFwiV2FyZWhvdXNlLm9yZGVyXFxcXFxcXCIsIG9yZGVyKTtcXFxcbiAgICB0YWIoW1xcXFxuICAgICAgICBbXFxcXFxcXCLlgJLluo9cXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCJdLFxcXFxuICAgICAgICBbXFxcXFxcXCLmraPluo9cXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCJdXFxcXG4gICAgXSwgXFxcXFxcXCJXYXJlaG91c2Uuc29ydFxcXFxcXFwiLCBzb3J0KTtcXFxcbiAgICB0YWIoW1xcXFxuICAgICAgICBbXFxcXFxcXCLkuI3orrpcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIl0sXFxcXG4gICAgICAgIFtcXFxcXFxcIuS8mOi0qFxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIl1cXFxcbiAgICBdLCBcXFxcXFxcIldhcmVob3VzZS5nb29kXFxcXFxcXCIsIGdvb2QpO1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaQnOe0olxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIgKyBpbnB1dCArIFxcXFxcXFwiJnJ1bGU9XFxcXFxcXCIgKyBuYW1lLCBNWV9SVUxFLnRpdGxlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICAgICAgZGVzYzogXFxcXFxcXCLmkJzntKLlhajpg6jop4TliJlcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5sZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmhvbWUpKTtcXFxcbmxldCBtUnVsZUxpc3QgPSBbXTtcXFxcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXFxcbiAgICB2YXIgbmFtZSA9IGl0ZW0ubmFtZTtcXFxcbiAgICBpZiAoaXRlbS5pc190YXApIHtcXFxcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFxcXFxcInJ1bGVMaXN0SnNvblxcXFxcXFwiKSArIFxcXFxcXFwiP2lkPVxcXFxcXFwiICsgaXRlbS5pZCkpO1xcXFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxcXG4gICAgICAgIGl0ZW0ubmFtZSA9IGxvY2F0aW9uLm5hbWU7XFxcXG4gICAgICAgIGl0ZW0uYXV0aG9yID0gbG9jYXRpb24uYXV0aG9yO1xcXFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXFxcbiAgICAgICAgaXRlbS52ZXIgPSBsb2NhdGlvbi52ZXJcXFxcbiAgICB9XFxcXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxcXG4gICAgbGV0IGxhYmVsID0gXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgbHZlciA9IC0yO1xcXFxuICAgIGlmIChpdGVtLmlzX2pzb24gJiYgaXRlbS5kYXRhX3R5cGUgPT09IFxcXFxcXFwiaG9tZV9ydWxlX3VybFxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcXFxuICAgICAgICBpZiAobHZlciA9PT0gLTEpIHtcXFxcbiAgICAgICAgICAgIGxhYmVsID0gXFxcXFxcXCLwn4aVXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAobHZlciA8IGl0ZW0udmVyKSB7XFxcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXFxcXFwi8J+GmVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGxhYmVsICsgbmFtZSxcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgbHZlcjogbHZlcixcXFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxcXFxuICAgICAgICAgICAgaXNBbGw6dHJ1ZVxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXFxcbiAgICB9KVxcXFxufVxcXFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxcXG4vL21SdWxlTGlzdCA9IG1lcmdlU29ydChtUnVsZUxpc3QpO1xcXFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1xcXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXFxcbnNldFJlc3VsdChkYXRhKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlm57lpI1cXFwiLFxcXCJwYXRoXFxcIjpcXFwiUmVwbHlcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZGF0YSA9IFtdO1xcXFxuY29uc3Qge1xcXFxuICAgIGFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIHJlcGx5SWQsXFxcXG4gICAgcnVsZUlkLFxcXFxuICAgIG5hbWUsXFxcXG4gICAgcGFzc3dvcmQsXFxcXG4gICAgdXNlcm5hbWVcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5cXFxcblxcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5Zue5aSNKFxcXFxcXFwiICsgbmFtZSArIFxcXFxcXFwiKVxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJWYXIoXFxcXFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcXFxcXCIpO1xcXFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbn0pKTtcXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuWbnuWkjS4uLi4uLlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpLFxcXFxuICAgICAgICB0eXBlOiBcXFxcXFxcInRleHRhcmVhXFxcXFxcXCIsXFxcXG4gICAgICAgIGhlaWdodDo3LFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFxcXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFxcXFxcIixpbnB1dCknXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcblxcXFxuZGF0YS5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmj5DkuqRcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKGFwaS5kaXNfcmVwbHkgKyBydWxlSWQpLmxhenlSdWxlKChwYXNzd29yZCwgdXNlcm5hbWUsIHJ1bGVJZCkgPT4ge1xcXFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXFxcbiAgICAgICAgaWYgKHBhc3N3b3JkID09IFxcXFxcXFwiXFxcXFxcXCIgfHwgdXNlcm5hbWUgPT0gXFxcXFxcXCJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodGV4dCA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWGmeWVilxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcInBhcmFtc1xcXFxcXFwiOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiZGlzY3Vzc190ZXh0XFxcXFxcXCI6IHRleHQsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicXFcXFxcXFxcIjogdXNlcm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogcGFzc3dvcmQsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwiZGlzY3Vzc19pZFxcXFxcXFwiOiBydWxlSWRcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcXFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcXFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9cXFxcXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxcXG5cXFxcbiAgICB9LCBwYXNzd29yZCwgdXNlcm5hbWUsIHJlcGx5SWQpXFxcXG59KTtcXFxcblxcXFxuc2V0UmVzdWx0KGRhdGEpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuaIkeeahOWbnuWkjVxcXCIsXFxcInBhdGhcXFwiOlxcXCJNeVJlcGx5XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3Qge1xcXFxuICAgIGFwaVxcXFxufSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG5sZXQge1xcXFxuICAgIGF1dGhfY29kZSxcXFxcbiAgICBxcVxcXFxufSA9IE1ZX1BBUkFNUztcXFxcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKVsxXSk7XFxcXG5sZXQgZGF0YT1bXTtcXFxcbmxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldF9yZXBseSArIFxcXFxcXFwiP2xpbWl0PTUmcGFnZT1cXFxcXFxcIiArIHBhZ2UgKyBcXFxcXFxcIiZxcT1cXFxcXFxcIiArIHFxICsgXFxcXFxcXCImYXV0aF9jb2RlPVxcXFxcXFwiICsgYXV0aF9jb2RlKSkucmVzdWx0O1xcXFxuaWYgKGNvbW1lbnRMaXN0Lmxlbmd0aCA9PT0gMCkge1xcXFxuICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuWIq+aLieS6huS4gOadoeS5n+S4jeWJqeS6hjwvaDU+XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXFxcbiAgICAgICAgZGF0YS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFxcXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXFxcXFwiICsgaXRlbS5pZCArIFxcXFxcXFwiPC9zbWFsbD48Zm9udD5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBsdmVyOiBcXFxcXFxcIuWbnuWkjei/m+WFpeS4jeaUr+aMgeafpeeci1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLnJ1bGVfaWRbMF1cXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGRhdGEucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxcXG4gICAgICAgICAgICBkZXNjOiBpdGVtLmNyZWF0ZV9kYXRlICsgXFxcXFxcXCLCt1xcXFxcXFwiK2l0ZW0ucnVsZV9pZFsxXStcXFxcXFxcIsK3XFxcXFxcXCIrXFxcXFxcXCLlvIDlj5HogIXwn5ejXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6e1xcXFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBcXFxcbn1cXFxcbnNldFJlc3VsdChkYXRhKTtcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuabtOWkmuWIhuS6q1xcXCIsXFxcInBhdGhcXFwiOlxcXCJtb3JlU2hhcmVcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxcXG4gICAgICAgIGNsZWFyVmFyKFxcXFxcXFwiaG91c2UudXBsb2FkX2NvZGVcXFxcXFxcIik7XFxcXG4gICAgfSkpO1xcXFxuY29uc3Qge2NvbG9yLHNtYWxsLGFwaSwgZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcXFxcXCIpO1xcXFxubGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcXFxubGV0IHB1dF91cmwgPSBhcGkuaG9zdCsnL2hpa2VydWxlL2Rldi9wdXQnO1xcXFxuaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxcXG59XFxcXG5sZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcXFxuLy8gbG9nKGhvdXNlX2RhdGEudXNlcm5hbWUrJy0nK2hvdXNlX2RhdGEucGFzc3dvcmQpO1xcXFxudmFyIGNhbnVwID0gaG91c2VfZGF0YS51c2VybmFtZS5sZW5ndGggPj0gNiAmJiBob3VzZV9kYXRhLnBhc3N3b3JkLmxlbmd0aCA+IDI7XFxcXG5sb2coJ+WPr+S7peS4iuS8oD8nK2NhbnVwKTtcXFxcbmxldCBkID0gW107XFxcXG5sZXQgZmlsZV90eXBlID0gW3tuYW1lOifpnZnmgIHmlofku7YnLHZhbHVlOidodG1sJ30se25hbWU6J+e9kemhteaPkuS7ticsdmFsdWU6J2pzX3VybCd9LHtuYW1lOifkuLvpobXphY3nva4nLHZhbHVlOidjb25maWcnfV07IC8v5LiK5Lyg57G75Z6LXFxcXG5sZXQgZmlsZV9yZWRpcmVjdCA9IFt7bmFtZTon5pys5ZywJyx2YWx1ZTonZmFsc2UnfSx7bmFtZTon55u06ZO+MzAyJyx2YWx1ZTondHJ1ZSd9XTsgLy/mmK/lkKbph43lrprlkJFcXFxcbmxldCBmaWxlX3VhID0gW3tuYW1lOifnlLXohJEnLHZhbHVlOidwYyd9LHtuYW1lOifmiYvmnLonLHZhbHVlOidtb2JpbGUnfV07XFxcXG5sZXQgZmlsZV90eXBlX3RpdGxlID0gZmlsZV90eXBlLm1hcCgoaXRlbSkgPT4ge1xcXFxuICAgIGxldCBuYW1lID0gZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2Jyk7XFxcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxcXG4gICAgICAgIHJldHVybiAn8J+RiScraXRlbS5uYW1lO1xcXFxuICAgIH1lbHNle1xcXFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxubGV0IGZpbGVfcmVkaXJlY3RfdGl0bGUgPSBmaWxlX3JlZGlyZWN0Lm1hcCgoaXRlbSkgPT4ge1xcXFxuICAgIGxldCBuYW1lID0gZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpO1xcXFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcXFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXFxcbiAgICB9ZWxzZXtcXFxcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxldCBmaWxlX3VhX3RpdGxlID0gZmlsZV91YS5tYXAoKGl0ZW0pID0+IHtcXFxcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKTtcXFxcbiAgICBpZihpdGVtLm5hbWU9PT1uYW1lKXtcXFxcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxcXG4gICAgfWVsc2V7XFxcXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWU7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5kLnB1c2goe2NvbF90eXBlOiAneDVfd2Vidmlld19zaW5nbGUnLCBleHRyYToge2pzOiAnY29uc29sZS5sb2coXFxcXFxcXCLmiJHliqDovb3kuoZcXFxcXFxcIiknfX0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+iOt+WPlicsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLmlofku7bot6/lvoQs5pSv5oyBaGlrZXIsZmlsZSxodHRwLOS4u+mimFxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIG9uQ2hhbmdlOiBcXFxcXFxcInB1dFZhcignaG91c2Uud2ViX3VybCcsaW5wdXQpXFxcXFxcXCIsXFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogdHJ1ZSxcXFxcbiAgICAgICAgaWQ6J2ZpbGVQYXRoJyxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOmdldFZhcignaG91c2Uud2ViX3VybCcpXFxcXG4gICAgfSxcXFxcbiAgICB1cmw6JC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcXFxuICAgICAgICBpZihpbnB1dC5sZW5ndGg8Mil7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZO+5o6l5LiN5Y+v5Lul5Li656m6J1xcXFxuICAgICAgICB9IGVsc2UgaWYoL15oaWtlcjp8XmZpbGU6fF5odHRwOnxeaHR0cHM6fF5cXFxcXFxcXC9zdG9yYWdlXFxcXFxcXFwvfF5cXFxcXFxcXC9zZGNhcmRcXFxcXFxcXC8vLnRlc3QoaW5wdXQpKXtcXFxcbiAgICAgICAgICAgIGlmKC9eXFxcXFxcXFwvc3RvcmFnZVxcXFxcXFxcL3xeXFxcXFxcXFwvc2RjYXJkXFxcXFxcXFwvLy50ZXN0KGlucHV0KSl7XFxcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSAnZmlsZTovLycraW5wdXQ7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsb2coJ+ato+W4uOmTvuaOpTonK2lucHV0KTtcXFxcbiAgICAgICAgICAgIGxldCB1YSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnPydNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBTYWZhcmkvNTM3LjM2JzonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IE1JIDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OS4wLjQzODkuOTAgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcXFxuICAgICAgICAgICAgbGV0IHdlYl91cmxfYXJyID0gaW5wdXQuc3BsaXQoJzsnKTtcXFxcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbMF07XFxcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHtcXFxcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6J2h0dHBzOi8vYmxvZy5jc2RuLm5ldCcsXFxcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOnVhLFxcXFxuICAgICAgICAgICAgICAgICdBY2NlcHQnOidhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJyxcXFxcbiAgICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzonemgtQ04nLFxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MyYmd2ViX3VybF9hcnJbMl0ubGVuZ3RoPjIpeyAvL+iuvue9rue8lueggVxcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2NoYXJzZXQ9Jyt3ZWJfdXJsX2FyclsyXS50b1VwcGVyQ2FzZSgpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtoZWFkZXJzOmhlYWRlcnMsd2l0aEhlYWRlcnM6ZmFsc2UscmVkaXJlY3Q6ZmFsc2V9O1xcXFxuICAgICAgICAgICAgaWYod2ViX3VybF9hcnIubGVuZ3RoPj0yJiZ3ZWJfdXJsX2FyclsxXS5sZW5ndGg+Mil7IC8vIOiuvue9ruivt+axguaWueazlVxcXFxuICAgICAgICAgICAgICAgIHBhcmFtc1snbWV0aG9kJ10gPSB3ZWJfdXJsX2FyclsxXS50b1VwcGVyQ2FzZSgpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbG9nKCflvIDlp4vojrflj5bmupDnoIEnKTtcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgLypcXFxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QXN5bmMod2ViX3VybCxwYXJhbXMsZnVuY3Rpb24gKGtleSxjb2RlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBjb2RlO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcXFxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor6/vvIzmnKzmrKHojrflj5bliLDnqbrmlofmnKzvvIznlpHkvLzkvaDmsqHmnInmraTmlofku7YhJztcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgICovXFxcXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnP2ZldGNoKHdlYl91cmwscGFyYW1zKTpyZXF1ZXN0KHdlYl91cmwscGFyYW1zKTtcXFxcbiAgICAgICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W5Yiw56m65paH5pys77yM55aR5Ly85L2g5rKh5pyJ5q2k5paH5Lu2ISc7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WPkeeUn+S6humUmeivrzpcXFxcXFxcXG4nK2UubWVzc2FnZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXFxcbiAgICAgICAgICAgIGxvZygn5Li76aKY6ZO+5o6lJyk7XFxcXG4gICAgICAgICAgICBsZXQgd2ViX3VybF9hcnIgPSBpbnB1dC5zcGxpdCgn77+lJyk7XFxcXG4gICAgICAgICAgICBsZXQgd2ViX3VybCA9IHdlYl91cmxfYXJyW3dlYl91cmxfYXJyLmxlbmd0aC0xXTtcXFxcbiAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBwYXJzZVBhc3RlKHdlYl91cmwpO1xcXFxuICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCkge1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2UudXBsb2FkX2NvZGUnLGJhY2tfY29kZSk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeW3suiOt+WPlizlubbpg6jliIbmj5LlhaXliLDmlofmnKzljLrln58nXFxcXG4gICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W6L+U5Zue5Li6OlxcXFxcXFxcbicrYmFja19jb2RlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pnZ7ms5Xpk77mjqU6XFxcXFxcXFxuJytnZXRWYXIoJ2hvdXNlLndlYl91cmwnKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCJcXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLpgInmi6nmlofku7bot6/lvoRcXFxcXFxcIixcXFxcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgICAgICAvKlxcXFxuICAgICAgICBsZXQgZnAgPSAnaHR0cHM6Ly9naXRjb2RlLm5ldC9xcV8zMjM5NDM1MS9kci8tL3Jhdy9tYXN0ZXIvanMvZmlsZVNlbGVjdC5qcyc7XFxcXG4gICAgICAgIGxldCBmID0gcmVxdWlyZShmcCk7XFxcXG4gICAgICAgICovXFxcXG4gICAgICAgIGxldCBmcD1jb25maWcubGliLmZpbGVTZWxlY3Q7XFxcXG4gICAgICAgIGxldCBmPSQucmMoZnApO1xcXFxuICAgICAgICByZXR1cm4gZi5maWxlU2VsZWN0aW9uVXJpKHtcXFxcbiAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcXFxcXCJmaWxlUGF0aFxcXFxcXFwiKS5leHRyYTtcXFxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKFxcXFxcXFwiZmlsZVBhdGhcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUEFUSFxcXFxuICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsUEFUSCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIG9uQ2xpY2tUeXBlOidjb25maXJtJyxcXFxcbiAgICAgICAgICAgIGZpbGVUeXBlOiBcXFxcXFxcIi5qc3wudHh0fC5oaWtlcnwuanNvbnwuaHRtbFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgcGF0dGVybjogMCxcXFxcbiAgICAgICAgICAgIHJlcXVpcmVVcmw6ZnAsXFxcXG4gICAgICAgICAgICBpbml0aWFsUGF0aDpnZXRQYXRoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvJykuc2xpY2UoNyksXFxcXG4gICAgICAgICAgICBtZW1vcnk6J3RydWUnLFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+S4iuS8oOexu+WeiycsXFxcXG4gICAgZGVzYzon5LiK5Lyg5paH5Lu255qE57G75Z6LLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpLCcjZmY3MDAwJyksXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxcXG4gICAgdXJsOiQoZmlsZV90eXBlX3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+aWh+S7tuWumuS9jScsXFxcXG4gICAgZGVzYzon5paH5Lu25piv5ZCm5bGe5LqO6YeN5a6a5ZCRLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSwnI2ZmNzAwMCcpLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcXFxuICAgIHVybDokKGZpbGVfcmVkaXJlY3RfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+iuvuWkh1VBJyxcXFxcbiAgICBkZXNjOiflj5HotbfnvZHpobXor7fmsYLlpLTmoIfor4Ys5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV91YScsJ+eUteiEkScpLCcjZmY3MDAwJyksXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxcXG4gICAgdXJsOiQoZmlsZV91YV90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcXFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3VhJyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcXFxuICAgIH0pXFxcXG59KTtcXFxcbmZ1bmN0aW9uIGNvbXBhcmUobmFtZSkge1xcXFxuICAgIHJldHVybiBmdW5jdGlvbihpdGVtKSB7XFxcXG4gICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IG5hbWU7XFxcXG4gICAgfVxcXFxufVxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon8J+XhO+4j+eOr+WigycsXFxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKChmaWxlX3R5cGUsY29tcGFyZSk9PntcXFxcbiAgICAgICAgbG9nKCfmn6XnnIvnjq/looPlj5jph48nKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCB1cF9jb2RlID0gZ2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpO1xcXFxuICAgICAgICAgICAgbGV0IGZ0eXBlID0gIGZpbGVfdHlwZS5maWx0ZXIoY29tcGFyZShnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSkpWzBdLnZhbHVlO1xcXFxuICAgICAgICAgICAgbGV0IHJlZGlyZWN0ID0gZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpIT09J+acrOWcsCc7XFxcXG4gICAgICAgICAgICBsZXQgY29kZSA9ICFyZWRpcmVjdD91cF9jb2RlOmlucHV0O1xcXFxuICAgICAgICAgICAgbGV0IGVudiA9IHtcXFxcbiAgICAgICAgICAgICAgICB3ZWJfdXJsOmdldFZhcignaG91c2Uud2ViX3VybCcsJycpLFxcXFxuICAgICAgICAgICAgICAgIGRldmljZTpnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyksXFxcXG4gICAgICAgICAgICAgICAgZnR5cGU6ZnR5cGV8fFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6cmVkaXJlY3QsXFxcXG4gICAgICAgICAgICAgICAgY29kZTpjb2RlLnN1YnN0cmluZygwLDQwKXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGxvZyhlbnYpO1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrSlNPTi5zdHJpbmdpZnkoZW52KTtcXFxcbiAgICAgICAgICAgIC8vIGFsZXJ0KEpTT04uc3RyaW5naWZ5KGVudikpO1xcXFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK2UubWVzc2FnZTtcXFxcbiAgICAgICAgICAgIC8vIGFsZXJ0KGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LGZpbGVfdHlwZSxjb21wYXJlKVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J/Cfk4PmlZnnqIsnLFxcXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxcXG4gICAgdXJsOiQoKS54NVJ1bGUoKCk9PntcXFxcbiAgICAgICAgbGV0IG1zZyA9ICfmrKLov47kvb/nlKjlvIDlj5HogIXmm7TlpJrliIbkuqvlt6XlhbdcXFxcXFxcXG4xLui+k+WFpee9keWdgOS4uuacrOWcsOaWh+S7tui3r+W+hCxoaWtlcjovL+aIluiAhWZpbGU6Ly/lvIDlpLRcXFxcXFxcXG4yLueCueWHu+e9keWdgOi+k+WFpeagj+WQjumdoueahOaMiemSrlxcXFxcXFxcbjMu55yL5paH5pys6aKE6KeI5Yy65piv5ZCm5q2j56GuXFxcXFxcXFxuNC7ngrnlh7vkuIrkvKDmjInpkq7mj5DkuqTliLDku5PlupMnO1xcXFxuICAgICAgICBhbGVydChtc2cpO1xcXFxuICAgIH0pXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon8J+Xke+4j+a4heepuicsXFxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgIGNsZWFyVmFyKCdob3VzZS51cGxvYWRfY29kZScpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3sua4hemZpOmihOiniOWMuuWfn+WGheWuuSdcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J/Cfk7LnpLrkvosnLFxcXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgICAgICBsZXQgZGVtb19jb2RlID0gZ2V0SXRlbSgnaG91c2UuZGVtbycsJzAnKTtcXFxcbiAgICAgICAgaWYoZGVtb19jb2RlPT0nMCcpe1xcXFxuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS53ZWJfdXJsJywnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv6LWE5rqQ572R5Lmm562+Lmh0bWwnKTtcXFxcbiAgICAgICAgICAgIGRlbW9fY29kZSA9IHBhcnNlSW50KGRlbW9fY29kZSkrMTtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oJ2hvdXNlLmRlbW8nLGRlbW9fY29kZSsnJyk7XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS53ZWJfdXJsJywnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+i1hOa6kOe9keS5puetvi5odG1sJyk7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey6K6+572u56S65L6L5Zyw5Z2AJ1xcXFxuICAgIH0pXFxcXG59KTtcXFxcblxcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTon8J+TpOS4iuS8oCcsXFxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKChjYW51cCxob3VzZV9kYXRhLHB1dF91cmwsZmlsZV90eXBlKSA9PntcXFxcbiAgICAgICAgZnVuY3Rpb24gY29tcGFyZShuYW1lKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IG5hbWU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgY29uc3Qge2dldE5vd0Zvcm1hdERhdGV9PSQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCB1cF9jb2RlID0gZ2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpO1xcXFxuICAgICAgICBpZih1cF9jb2RlLmxlbmd0aCA8IDIpe1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOeggeWMuuaXoOWGheWuue+8jOivt+WFiOiuv+mXruS4gOS4qumdmeaAgemhtemdoidcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZighY2FudXApe1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOS4jeaYr+W8gOWPkeiAhe+8jOayoeacieaPkOS6pOWIsOS7k+W6k+eahOadg+WIqSEnXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGlucHV0ID0gZ2V0VmFyKCdob3VzZS53ZWJfdXJsJywnJyk7XFxcXG4gICAgICAgIGxldCB3ZWJfdXJsID0gaW5wdXQuc3BsaXQoJzsnKVswXTtcXFxcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gJyc7XFxcXG4gICAgICAgIGlmKC9eaGlrZXI6fF5maWxlOnxeaHR0cDp8Xmh0dHBzOnxeXFxcXFxcXFwvc3RvcmFnZVxcXFxcXFxcL3xeXFxcXFxcXFwvc2RjYXJkXFxcXFxcXFwvLy50ZXN0KHdlYl91cmwpKXtcXFxcbiAgICAgICAgICAgIGZpbGVOYW1lID0gd2ViX3VybC5zcGxpdCgnLycpW3dlYl91cmwuc3BsaXQoJy8nKS5sZW5ndGgtMV07XFxcXG4gICAgICAgIH1lbHNlIGlmKC/kuLvpopjvv6V85YWD57Sg77+lLy50ZXN0KGlucHV0KSl7XFxcXG4gICAgICAgICAgICBsZXQgYmthcnIgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKTtcXFxcbiAgICAgICAgICAgIGlmKGJrYXJyLmxlbmd0aDwzKXtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5LqR5Ymq6LS05p2/5YaF5a655pyJ6K+vJ1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgc3dpdGNoIChia2FyclsxXSkge1xcXFxuICAgICAgICAgICAgICAgIGNhc2UgJ215X2hvbWVfdGhlbWUnOlxcXFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgY2FzZSAnbXlfaG9tZV9zaW5nbGUnOlxcXFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgY2FzZSAnanNfdXJsJzpcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKVsyXS5zcGxpdCgnQCcpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM572R6aG16ZO+5o6l5peg5YaF5a65ISc7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHVhID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IFNhZmFyaS81MzcuMzYnOidNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgTUkgNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS45MCBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxcXG4gICAgICAgIGxldCBoZWFkZXJzID0ge1xcXFxuICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIjogXFxcXFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxcXG4gICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMScsXFxcXG4gICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzonemgtQ04nLFxcXFxuICAgICAgICB9O1xcXFxuICAgICAgICBsZXQgdG9Db21wYXJlID0gJyc7XFxcXG4gICAgICAgIGlmKGZpbGVOYW1lLmVuZHNXaXRoKCcuaHRtbCcpKXtcXFxcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfpnZnmgIHmlofku7YnO1xcXFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKYLy50ZXN0KGZpbGVOYW1lKSl7XFxcXG4gICAgICAgICAgICB0b0NvbXBhcmUgPSAn5Li76aG16YWN572uJ1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBmdHlwZSA9ICBmaWxlX3R5cGUuZmlsdGVyKGNvbXBhcmUodG9Db21wYXJlfHxnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSkpWzBdLnZhbHVlO1xcXFxuICAgICAgICBsZXQgcmVkaXJlY3QgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJykhPT0n5pys5ZywJztcXFxcbiAgICAgICAgaWYocmVkaXJlY3QmJiF3ZWJfdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSl7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v55u06ZO+MzAy6YeN5a6a5ZCR572R5Z2A6ZO+5o6l5b+F6aG7aHR0cOW8gOWktCc7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGNvZGUgPSAhcmVkaXJlY3Q/dXBfY29kZTp3ZWJfdXJsO1xcXFxuICAgICAgICBsZXQgZGF0YSA9IHtcXFxcXFxcInBhcmFtc1xcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgIHtcXFxcXFxcImRhdGFcXFxcXFxcIjoge3J1bGVfbmFtZTogZmlsZU5hbWUsIFxcXFxcXFwicnVsZV90eXBlXFxcXFxcXCI6ICfmm7TlpJrliIbkuqsnLCBcXFxcXFxcInZlcnNpb25cXFxcXFxcIjpnZXROb3dGb3JtYXREYXRlKCksXFxcXFxcXCJydWxlX3ZhbHVlXFxcXFxcXCI6IGNvZGUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU6ZnR5cGUsIGlzX3JlZGlyZWN0OnJlZGlyZWN0LGRldmljZVVhOmdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZH1cXFxcbiAgICAgICAgfTtcXFxcbiAgICAgICAgbGV0IHVwcGFyYW1zID0ge2hlYWRlcnM6aGVhZGVycyxib2R5OkpTT04uc3RyaW5naWZ5KGRhdGEpLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlLG1ldGhvZDonUE9TVCd9O1xcXFxuICAgICAgICBsZXQgYmFja21zZyA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnP2ZldGNoKHB1dF91cmwsdXBwYXJhbXMpOnJlcXVlc3QocHV0X3VybCx1cHBhcmFtcyk7XFxcXG4gICAgICAgIHRyeXtcXFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGJhY2ttc2cpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgIGxldCBkZXRhaWwgPSByZXN1bHQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZGV0YWlsO1xcXFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+WPkeeUn+S6humUmeivr1xcXFxcXFxcbicrZS5tZXNzYWdlO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxjYW51cCxob3VzZV9kYXRhLHB1dF91cmwsZmlsZV90eXBlKVxcXFxufSk7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+mVv+aWh+acrOmihOiniOWMuuWfnycsXFxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxcXG4gICAgdXJsOidoaWtlcjovL2VtcHR5JyxcXFxcbiAgICBleHRyYToge3RleHRTaXplOiAxMSxsaW5lVmlzaWJsZTpmYWxzZX1cXFxcbn0pO1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOmdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKS5zdWJzdHJpbmcoMCwxMDI0MCksXFxcXG4gICAgY29sX3R5cGU6J2xvbmdfdGV4dCcsXFxcXG4gICAgZXh0cmE6IHt0ZXh0U2l6ZTogMTF9XFxcXG59KTtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuabtOWkmuWIhuS6q1xcXFxcXFwiKTtcXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLovbvlkIjpm4bnlJ/miJDmjqXlj6NcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZ2VuQXBpXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuZnVuY3Rpb24gZ2VuUnVsZShuYW1lLHVybCxpY29uKXtcXFxcbiAgICBpY29uPWljb258fCdodHRwczovL3ozLmF4MXguY29tLzIwMjEvMTEvMTYvSVdKaHhmLnBuZyc7XFxcXG4gICAgY29uc3Qge2dldE5vd0Zvcm1hdERhdGUsYXBpLGdldEFwaX09JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbihvbGQsbmV3X3N0cil7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KG9sZCkuam9pbihuZXdfc3RyKTtcXFxcbiAgICB9O1xcXFxuICAgIGxldCBtdWJhbiA9IGdldEFwaSgnaW1wb3J0VXJsJykrXFxcXFxcXCIxNjkwXFxcXFxcXCI7XFxcXG4gICAgbGV0IG11YmFuX3dvcmQ9e25hbWU6XFxcXFxcXCJA6L275ZCI6ZuGXFxcXFxcXCIsdXJsOlxcXFxcXFwiQOWcsOWdgFxcXFxcXFwiLHZlcjpcXFxcXFxcIkDniYjmnKxcXFxcXFxcIixpY29uOlxcXFxcXFwiQOWbvuagh1xcXFxcXFwifTtcXFxcbiAgICBsZXQgbXViYW5fY29kZSA9IGZldGNoKG11YmFuKTtcXFxcbiAgICBtdWJhbl9jb2RlPW11YmFuX2NvZGUucmVwbGFjZUFsbChtdWJhbl93b3JkLm5hbWUsbmFtZSkucmVwbGFjZUFsbChtdWJhbl93b3JkLnZlcixnZXROb3dGb3JtYXREYXRlKCkpLnJlcGxhY2VBbGwobXViYW5fd29yZC51cmwsdXJsKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQuaWNvbixpY29uKTtcXFxcbiAgICBsZXQgaW1wb3J0X2NvZGU9XFxcXFxcXCLmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrlsI/nqIvluo/vvIzml6DmoLnmoJHvvIzoirHmraPmuIXvvIzkuI3mlq3ojaTohaXkuI3miJLmt6vvv6Vob21lX3J1bGVfdjLvv6ViYXNlNjQ6Ly9AXFxcXFxcXCIrbmFtZStcXFxcXFxcIkBcXFxcXFxcIitiYXNlNjRFbmNvZGUobXViYW5fY29kZSk7XFxcXG4gICAgdmFyIHBhc3RlcyA9IGdldFBhc3RlcygpO1xcXFxuICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKGltcG9ydF9jb2RlLHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcXFxuICAgIGxldCBpbXBvcnRfcnVsZT0gdXJsK1xcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXFxu5bCP56iL5bqP77yaXFxcXFxcXCIrbmFtZTtcXFxcbiAgICByZXR1cm4gaW1wb3J0X3J1bGU7XFxcXG59XFxcXG4kLmV4cG9ydHMuZ2VuUnVsZT1nZW5SdWxlO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWFqOWxgOino+aekOWFjeWXhVxcXCIsXFxcInBhdGhcXFwiOlxcXCJnbG9iYWxQYXJzZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbiAgICBmdW5jdGlvbiBnZXRIZWFkZXJzKHBsYXlVcmwpe1xcXFxuICAgICAgICBsZXQgaGVhZGVycyA9IHt9O1xcXFxuICAgICAgICBsZXQgcmVmZXI9cGxheVVybC5zcGxpdChcXFxcXFxcIi8vXFxcXFxcXCIpWzBdK1xcXFxcXFwiLy9cXFxcXFxcIitwbGF5VXJsLnNwbGl0KFxcXFxcXFwiLy9cXFxcXFxcIilbMV0uc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpWzBdO1xcXFxuICAgICAgICBpZigvbGVjbG91ZFxcXFxcXFxcLmNvbXxiaWxpdmlkZW9cXFxcXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogJ2h0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS8nLFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOlxcXFxcXFwiTW96aWxsYS81LjBcXFxcXFxcIn1cXFxcbiAgICAgICAgfWVsc2UgaWYoL21ndHZcXFxcXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFxcXFxcIlJlZmVyZXJcXFxcXFxcIjogcmVmZXIsXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6XFxcXFxcXCJNb3ppbGxhLzUuMFxcXFxcXFwifVxcXFxuICAgICAgICB9ZWxzZSBpZigvaXhpZ3VhXFxcXFxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXFxcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6ICdodHRwczovL3d3dy5peGlndWEuY29tLycsXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6XFxcXFxcXCJNb3ppbGxhLzUuMFxcXFxcXFwifVxcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcXFxcXCJSZWZlcmVyXFxcXFxcXCI6IHJlZmVyLCdVc2VyLUFnZW50JzonRGFydC8yLjEzIChkYXJ0OmlvKSd9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNcXFxcbiAgICB9XFxcXG5mdW5jdGlvbiBpc1BpYyhzdHIpe1xcXFxuICAgIHJldHVybiAvXFxcXFxcXFwuKGdpZnxqcGd8anBlZ3xwbmd8R0lGfEpQR3xQTkcpJC8udGVzdChzdHIpO1xcXFxufVxcXFxuZnVuY3Rpb24gaXNWaWRlbyhwbGF5VXJsLHJlY2hhbmdlKXtcXFxcbiAgICAvL+azqOaEjy5waHDkuI3lj6/ku6XooqvmjpLpmaTlkKbliJnono3lhbTop6PmnpDkuI3kuoYgfC5waHAkXFxcXG4gICAgLy/lpoLmnpzmmK/mkq3mlL7lnLDlnYDlsLHnm7TmjqXov5Tlm57lnLDlnYDliqDkuIpVQe+8jOS4jeaYr+eahOivneWwsei/lOWbnmZhbHNlXFxcXG4gICAgLy8gbGV0IHQxID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG4gICAgbGV0IGNhY2hlUmVneCA9IG5ldyBSZWdFeHAoJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8oLio/KVxcXFxcXFxcXFxcXFxcXFwubTN1OHxoaWtlcjovL2ZpbGVzLyguKj8pXFxcXFxcXFxcXFxcXFxcXC5tM3U4Jyk7XFxcXG4gICAgaWYoY2FjaGVSZWd4LnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICByZXR1cm4gcGxheVVybFxcXFxuICAgIH1cXFxcbiAgICBmdW5jdGlvbiBnZXRIb3N0KHVybCl7XFxcXG4gICAgICAgIC8vIGZiYeeahHBhcnNlTGF6eeWkquaFouS6huWNg+S4h+WIq+eUqFxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHVybC5tYXRjaCgvXmh0dHAocyk/OlxcXFxcXFxcL1xcXFxcXFxcLyguKj8pXFxcXFxcXFwvLylbMF0uc2xpY2UoMCwtMSk7XFxcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLypcXFxcbiAgICAgICAgaWYodHlwZW9mKGxvZyk9PT0ndW5kZWZpbmVkJyl7XFxcXG4gICAgICAgICAgICByZXR1cm4gIGZiYS5wYXJzZUxhenlSdWxlKCQkJCgpLmxhenlSdWxlKCh1cmwpPT57XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEhvbWUodXJsKVxcXFxuICAgICAgICAgICAgfSx1cmwpKVxcXFxuICAgICAgICB9ZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZ2V0SG9tZSh1cmwpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgKi9cXFxcbiAgICB9XFxcXG4gICAgbGV0IHBVcmw9cGxheVVybC5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMF07Ly/ojrflj5bmiqDmjonmtbfpmJR1YeetieWPguaVsOeahOe9kemhteaSreaUvumTvuaOpVxcXFxuICAgIGxldCBob3N0ID0gZ2V0SG9zdChwVXJsKTsgLy8g6I635Y+W5Z+f5ZCNXFxcXG4gICAgaWYoIWhvc3Qpey8v5Yik5pat5peg5Z+f5ZCN55u05o6l5LiN5piv6KeG6aKRXFxcXG4gICAgICAgIHJldHVybiBmYWxzZVxcXFxuICAgIH1cXFxcbiAgICBmdW5jdGlvbiBwcmludChkYXRhKXtcXFxcbiAgICAgICAgaWYodHlwZW9mKGxvZyk9PT0ndW5kZWZpbmVkJyl7XFxcXG4gICAgICAgICAgICByZXR1cm4gIGZiYS5sb2coZGF0YSlcXFxcbiAgICAgICAgfWVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIGxvZyhkYXRhKVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHJlY2hhbmdlPXR5cGVvZihyZWNoYW5nZSk9PT1cXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCI/cmVjaGFuZ2U6ZnVuY3Rpb24ocGxheVVybCl7cmV0dXJuIHBsYXlVcmx9O1xcXFxuICAgIGxldCBleGNlcHRXb3JkcyA9ICcuanMkfC5jc3MkfC50cyR8Lmh0bWwkfC5odG0kfC5naWYkfC5qcGckfC5qcGVnJHwucG5nJHwuaWNvJHwuc3ZnJHwudHh0JCcuc3BsaXQoJ3wnKS5tYXAoaXQ9PidcXFxcXFxcXFxcXFxcXFxcJytpdCkuam9pbignfCcpO1xcXFxuICAgIHZhciBleGNlcHRLZXlzID0gbmV3IFJlZ0V4cChleGNlcHRXb3Jkcyk7XFxcXG4gICAgbGV0IGV4Y2VwdFdvcmRzMSA9ICdyZWZlcmVyPXx1cmw9Jy5zcGxpdCgnfCcpLm1hcChpdD0+aXQpLmpvaW4oJ3wnKTtcXFxcbiAgICB2YXIgZXhjZXB0S2V5czEgPSBuZXcgUmVnRXhwKGV4Y2VwdFdvcmRzMSk7XFxcXG4gICAgbGV0IHJlcGxhY2VXb3JkcyA9ICdwbGF5bTN1OHxtM3U4XFxcXFxcXFwudHYnLnNwbGl0KCd8JykubWFwKGl0PT5pdCkuam9pbignfCcpO1xcXFxuICAgIGxldCByZXBsYWNlS2V5cyA9IG5ldyBSZWdFeHAocmVwbGFjZVdvcmRzLCdnJyk7XFxcXG4gICAgbGV0IHZpZGVvV29yZHMgPSBcXFxcXFxcIi92aWRlby90b3N8Lm1wNCR8Lm0zdTgkfC5mbHYkfC5hdmkkfC4zZ3AkfC5tcGVnJHwud212JHwubW92JHxybXZifC5kYXQkfC5tcDMkfC5tNGEkfHFxQkZkb3dubG9hZHxtaW1lPXZpZGVvJTJGfG1pbWVfdHlwZT12aWRlb198dHlwZT1tM3U4fHB0PW0zdThcXFxcXFxcIi5zcGxpdCgnfCcpLm1hcCgoaXQpPT57XFxcXG4gICAgICAgIC8vdHlwZT1tcDRcXFxcbiAgICAgICAgaWYoaXQuc3RhcnRzV2l0aChcXFxcXFxcIi5cXFxcXFxcIikpe1xcXFxuICAgICAgICAgICAgcmV0dXJuICdcXFxcXFxcXFxcXFxcXFxcJytpdFxcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIHJldHVybiBpdFxcXFxuICAgICAgICB9XFxcXG4gICAgfSkuam9pbihcXFxcXFxcInxcXFxcXFxcIik7XFxcXG4gICAgbGV0IHZpZGVvS2V5cyA9IG5ldyBSZWdFeHAodmlkZW9Xb3Jkcyk7XFxcXG4gICAgbGV0IHJVcmwgPSBwVXJsLnJlcGxhY2UoaG9zdCwnJyk7Ly/ojrflj5bpmaTlvIDln5/lkI3nmoTliankvZnpk77mjqVcXFxcbiAgICBsZXQgcFVybDI9cFVybC5zcGxpdChcXFxcXFxcIiZcXFxcXFxcIilbMF0uc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdOy8v6I635Y+W5LiN5bim5Y+C5pWw55qE572R6aG16ZO+5o6lXFxcXG4gICAgbGV0IHJ1cmwyID0gcFVybDIucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9meS4jeW4puWPguaVsOmTvuaOpVxcXFxuICAgIGxldCBoYXNLZXkgPSB2aWRlb0tleXMudGVzdChyVXJsKXx8dmlkZW9LZXlzLnRlc3QocnVybDIpO1xcXFxuICAgIGxldCBwYXJVcmwgPSBwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0sJycpOyAvLyDliIblibLpl67lj7flkI7liankvZnlj4LmlbDnmoTlrozmlbTpk77mjqVcXFxcbiAgICBsZXQgZXhjS2V5ID0gZXhjZXB0S2V5czEudGVzdChwYXJVcmwpO1xcXFxuICAgIGlmKHJVcmwuc3BsaXQoJz8nKS5sZW5ndGg+Mil7XFxcXG4gICAgICAgIGxldCByVXJsMz1yVXJsLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVsxXTsvL+iOt+WPlj/liIblibLlkI7nmoTnrKzkuIDmrrVcXFxcbiAgICAgICAgaGFzS2V5ID0gaGFzS2V5fHx2aWRlb0tleXMudGVzdChyVXJsMyk7XFxcXG4gICAgfVxcXFxuICAgIGlmKGhhc0tleSYmIWV4Y0tleSl7XFxcXG4gICAgICAgIGxldCB0aXBzID0gJ+ajgOa1i+WIsOeWkeS8vOWkmuWqkuS9k+eahOWcsOWdgDonO1xcXFxuICAgICAgICBwcmludChcXFxcXFxcImpz5LitXFxcXFxcXCIrdGlwcytwVXJsKTtcXFxcbiAgICAgICAgcHJpbnQoXFxcXFxcXCLliIblibLpl67lj7flkI46XFxcXFxcXCIrcGFyVXJsKTtcXFxcbiAgICB9XFxcXG4gICAgLy8gbG9nKCcxOicrKHZpZGVvS2V5cy50ZXN0KHBVcmwpfHx2aWRlb0tleXMudGVzdChwVXJsMil8fHZpZGVvS2V5cy50ZXN0KHBVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdChcXFxcXFxcIiZcXFxcXFxcIilbMF0uc3BsaXQoXFxcXFxcXCI/XFxcXFxcXCIpWzBdKSkpO1xcXFxuICAgIC8vIGxvZygnMjonKyFleGNlcHRLZXlzLnRlc3QocFVybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0uc3BsaXQoJyYnKVswXSkpO1xcXFxuICAgIC8vIGxvZygnMzonKyFleGNlcHRLZXlzMS50ZXN0KHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXFxcXFwiP1xcXFxcXFwiKVswXSwnJykpKTtcXFxcbiAgICBpZiAoKGhhc0tleXx8dmlkZW9LZXlzLnRlc3QoclVybC5yZXBsYWNlKHJlcGxhY2VLZXlzLFxcXFxcXFwiXFxcXFxcXCIpLnNwbGl0KFxcXFxcXFwiJlxcXFxcXFwiKVswXS5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF0pICkmJiAhZXhjZXB0S2V5cy50ZXN0KHBVcmwyKSYmIWV4Y2VwdEtleXMxLnRlc3QocFVybDIpKSB7XFxcXG4gICAgICAgIGlmKCEoL1VzZXItQWdlbnR8UmVmZXJlckAvLnRlc3QocGxheVVybCkpKXtcXFxcbiAgICAgICAgICAgIGlmKC9sZWNsb3VkXFxcXFxcXFwuY29tfGJpbGl2aWRlby8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcXFxcXCI7e1JlZmVyZXJAaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXFxcXFwiI2lzdmlkZW89dHJ1ZSM7e1JlZmVyZXJAaHR0cHM6Ly93d3cuaXhpZ3VhLmNvbS8mJlVzZXItQWdlbnRATW96aWxsYS81LjB9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBlbHNlIGlmKC9tZ3R2XFxcXFxcXFwuY29tfGJ5dGVhbW9uZS8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcXFxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9ZWxzZSBpZigvcHR3b1xcXFxcXFxcLndrZmlsZVxcXFxcXFxcLmNvbS8udGVzdChwbGF5VXJsKSYmL3VybD0vLnRlc3QocGxheVVybCkpe1xcXFxuICAgICAgICAgICAgICAgIHBsYXlVcmw9cGxheVVybC5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIilbMV0rXFxcXFxcXCI7e1JlZmVyZXJAaHR0cHM6Ly9mYW50dWFuLnR2fVxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAvLyDlpITnkIblpKfluIjlhYTkuYvnsbvnmoRhcHBcXFxcbiAgICAgICAgICAgIC8vIGVsc2V7XFxcXG4gICAgICAgICAgICAvLyAgICAgcGxheVVybCs9XFxcXFxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAvLyB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcGxheVVybD1yZWNoYW5nZShwbGF5VXJsKTtcXFxcbiAgICAgICAgaWYoIS8jaXNWaWRlbz10cnVlIy8udGVzdChwbGF5VXJsKSl7XFxcXG4gICAgICAgICAgICBwbGF5VXJsKz1cXFxcXFxcIiNpc1ZpZGVvPXRydWUjXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy8gbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG4gICAgICAgIC8vIHByaW50KCfliKTmlq1pc1ZpZGVv6ICX5pe2OicrKHQyLXQxKSk7XFxcXG4gICAgICAgIHJldHVybiBwbGF5VXJsO1xcXFxuICAgIH1lbHNle1xcXFxuICAgICAgICAvLyBsZXQgdDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbiAgICAgICAgLy8gcHJpbnQoJ+WIpOaWrWlzVmlkZW/ogJfml7Y6JysodDItdDEpKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH1cXFxcbn1cXFxcbmZ1bmN0aW9uIGNvbVBhcnNlKHBhclN0cixlaixvbmx5YmFjayxodG1sKXtcXFxcbiAgICAvL+WIl+ihqO+8jOagh+mimO+8jOWbvueJh++8jOaPj+i/sO+8jOmTvuaOpe+8jOWGheWuuVxcXFxuICAgIGVqID0gZWp8fGZhbHNlOy8v5pyJ5LqM57qnXFxcXG4gICAgb25seWJhY2s9b25seWJhY2t8fGZhbHNlOy8v5Y+q6L+U5Zue5pWw5o2uXFxcXG4gICAgaHRtbCA9IGh0bWx8fGdldFJlc0NvZGUoKTtcXFxcbiAgICBodG1sID0gdHlwZW9mKGh0bWwpPT09J3N0cmluZyc/aHRtbDpodG1sLmh0bWw7XFxcXG4gICAgcmV0dXJuICQudG9TdHJpbmcoKHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKT0+e1xcXFxuICAgICAgICBsZXQgdD1wYXJTdHIuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgZD1bXTtcXFxcbiAgICAgICAgLy8gbGV0IGxpc3Q9cGRmYShnZXRSZXNDb2RlKCksdFswXSk7XFxcXG4gICAgICAgIGxldCBsaXN0PXBkZmEoaHRtbCx0WzBdKTtcXFxcbiAgICAgICAgbGV0IGxhenkgPSAkKCcnKS5sYXp5UnVsZSgoKT0+e1xcXFxuICAgICAgICAgICAgY29uc3Qge2xhenlQYXJzZX0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGxhenlQYXJzZShpbnB1dClcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGZvcihsZXQgaSBpbiBsaXN0KXtcXFxcbiAgICAgICAgICAgIGxldCBfcGljID0gdFsyXT9wZChsaXN0W2ldLHRbMl0pOicnO1xcXFxuICAgICAgICAgICAgaWYoaXNQaWMoX3BpYykmJiEvQFJlZmVyZXI9Ly50ZXN0KF9waWMpKXtcXFxcbiAgICAgICAgICAgICAgICBfcGljKz0nQFJlZmVyZXI9J1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IGl0PXtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTpwZGZoKGxpc3RbaV0sdFsxXSksXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDpfcGljLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6cGRmaChsaXN0W2ldLHRbM10pLFxcXFxuICAgICAgICAgICAgICAgIHVybDplaj9wZChsaXN0W2ldLHRbNF0pOnBkKGxpc3RbaV0sdFs0XSkrbGF6eVxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIGlmKHQubGVuZ3RoPjUpey8v5YaF5a6577yM55So5LqO5pCc57SiXFxcXG4gICAgICAgICAgICAgICAgaXQuY29udGVudD1wZGZoKGxpc3RbaV0sdFs1XSlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGQucHVzaChpdCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYob25seWJhY2spe1xcXFxuICAgICAgICAgICAgcmV0dXJuIGRcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICBzZXRSZXN1bHQoZClcXFxcbiAgICAgICAgfVxcXFxuICAgIH0scGFyU3RyLGVqLG9ubHliYWNrLGh0bWwsaXNQaWMpXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGlzQmFkVmlkZW8odmlkZW9VcmwpIHsvL+aYr+Wdj+eahOinhumikVxcXFxuICAgIGxldCBkbVBhdGggPSAnaGlrZXI6Ly9maWxlcy9jYWNoZS9kaWFvbWFvLnR4dCc7Ly/lkIrmr5vmqKHlvI/ov4fmu6Tmlofku7bot6/lvoRcXFxcbiAgICBsZXQgZG1VcmxzO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGRtVXJscyA9IHJlcXVlc3QoZG1QYXRoKS50cmltKCkuc3BsaXQoJ1xcXFxcXFxcbicpLmZpbHRlcihpdCA9PiBpdCAmJiAhaXQuc3RhcnRzV2l0aCgnLy8nKSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBkbVVybHMgPSBbXTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBoYXNEbSh2aWRlb1VybCwgZG1VcmxzKSB7Ly/mkq3mlL7lnLDlnYDmmK/lkKbkuLrlkIrmr5vop4bpopFcXFxcbiAgICAgICAgaWYgKGRtVXJscy5sZW5ndGggPCAxKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmdW5jdGlvbiBwcmludChzdHIpe1xcXFxuICAgICAgICAgICAgaWYodHlwZW9mKGxvZykhPT0ndW5kZWZpbmVkJyl7XFxcXG4gICAgICAgICAgICAgICAgbG9nKHN0cik7XFxcXG4gICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICBmYmEubG9nKHN0cik7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgZm9yIChsZXQgZG1Vcmwgb2YgZG1VcmxzKSB7XFxcXG4gICAgICAgICAgICBpZiAoKG5ldyBSZWdFeHAoZG1VcmwpKS50ZXN0KHZpZGVvVXJsKSkgey8v5pKt5pS+5Zyw5Z2A5YyF5ZCr5ZCK5q+b5qCH5b+X55qE5Zyw5Z2AXFxcXG4gICAgICAgICAgICAgICAgcHJpbnQoJ+WQiuavm+inhumikSzoh6rliqjov4fmu6Q6Jyt2aWRlb1VybCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBwcmludCgn6Z2e5ZCK5q+b6KeG6aKRLOWPr+aSreaUvjonK3ZpZGVvVXJsKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZnVuY3Rpb24gaXNEbShyZXQpIHtcXFxcbiAgICAgICAgaWYgKCFyZXQpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0cnVlXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIGhhc0RtKHJldC5zcGxpdCgnIycpWzBdLnNwbGl0KCc7JylbMF0sIGRtVXJscylcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIGlzRG0odmlkZW9VcmwpXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGxhenlQYXJzZShwbGF5VXJsLG1zLHRtLHJlY2hhbmdlKXtcXFxcbiAgICAvLyBsb2coJ+iwg+eUqOS7k+W6k+WFjeWXheaOouS8oOWPgui2heaXtuS4ujonK21zKTtcXFxcbiAgICB0bSA9IHBhcnNlSW50KHRtKXx8NTAwMDtcXFxcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzLGlzQmFkVmlkZW99ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXFxcbiAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8ocGxheVVybCxyZWNoYW5nZSk7XFxcXG4gICAgLy9sb2cocmVhbFVybCk7XFxcXG4gICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyl7Ly9ib29s5YC85bCx5piv5aSx6LSlXFxcXG4gICAgICAgIHRyeXtcXFxcbiAgICAgICAgICAgIGxldCBydXJsPXJlYWxVcmwuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdLnNwbGl0KFxcXFxcXFwiI1xcXFxcXFwiKVswXTtcXFxcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QocnVybCx7dGltZW91dDp0bX0pKS51cmxcXFxcbiAgICAgICAgfWNhdGNoKGUpe1xcXFxuICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvL3JldHVybiByZWFsVXJsXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgLy9sb2coXFxcXFxcXCLorr/pl67otoXml7Y6XFxcXFxcXCIrdG0pO1xcXFxuICAgIGxvZyhcXFxcXFxcIuWwneivlemBk+mVv+S7k+W6k3g15YWN5ZeFOlxcXFxcXFwiK3BsYXlVcmwpO1xcXFxuICAgIGNsZWFyVmFyKFxcXFxcXFwiX3g1anhVcmxcXFxcXFxcIik7XFxcXG4gICAgbGV0IGJhZD0kKFxcXFxcXFwi572R57uc5LiN5L2z5oiW6ICF55aR5Ly85a+55pa5572R56uZ5oyC5LqG77yM5L2g6KaB5p+l55yL5YW2572R6aG15ZCX77yfXFxcXFxcXCIpLmNvbmZpcm0oKHBsYXlVcmwpPT57XFxcXG4gICAgICAgIGxvZyhcXFxcXFxcIue9keermeeci+i1t+adpeaMguS6hjpcXFxcXFxcIitwbGF5VXJsKTtcXFxcbiAgICAgICAgcmV0dXJuIHBsYXlVcmxcXFxcbiAgICB9LHBsYXlVcmwpO1xcXFxuICAgIHRyeXtcXFxcbiAgICAgICAgdmFyIGJhY2s9cmVxdWVzdChwbGF5VXJsLHtoZWFkZXJzOiBnZXRIZWFkZXJzKHBsYXlVcmwpLHRpbWVvdXQ6dG19KTtcXFxcbiAgICAgICAgLy92YXIgYmFjaz1mZXRjaChwbGF5VXJsLHtoZWFkZXJzOiB7J1VzZXItQWdlbnQnOiBQQ19VQX19KTtcXFxcbiAgICAgICAgaWYoIWJhY2spe1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwi572R56uZXFxcXFxcXCIrcGxheVVybCtcXFxcXFxcIuehruWunuWVpeS5n+ayoei/lOWbnlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBiYWRcXFxcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFjaykpe1xcXFxuICAgICAgICAgICAgLy9sZXQgbGNhY2hlPVxcXFxcXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9jYWNoZS92aWRlby5tM3U4XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAvL3dyaXRlRmlsZShsY2FjaGUsYmFjayk7XFxcXG4gICAgICAgICAgICAvL3JldHVybiBsY2FjaGUrXFxcXFxcXCIjI1xcXFxcXFwiK3BsYXlVcmwrXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiXFxcXG4gICAgICAgICAgICBwbGF5VXJsPWNhY2hlTTN1OChwbGF5VXJsKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBwbGF5VXJsXFxcXG4gICAgICAgIH1lbHNlIGlmKCghL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KGJhY2spKSYmKCEvaHR0cHx1cmwvLnRlc3QoYmFjaykpJiYoIS9tc2d8Y29kZXxodG1sLy50ZXN0KGJhY2spKSl7XFxcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v55aR5Ly85a+55pa55pWw5o2u5Yqg5a+G5LqG77yM5YW35L2T5pWw5o2u55yL5pel5b+XJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfWNhdGNoKGUpe1xcXFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgcmV0dXJuIGJhZFxcXFxuICAgIH1cXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBiYWNrPUpTT04ucGFyc2UoYmFjayk7XFxcXG4gICAgICAgIGxldCByZWFsVXJsPWJhY2sudXJsO1xcXFxuICAgICAgICBpZih0eXBlb2YocmVhbFVybCk9PVxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCJ8fCFyZWFsVXJsKXtcXFxcbiAgICAgICAgICAgIGxvZyhiYWNrKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6YGT6ZW/5LuT5bqT6Kej5p6Q5aSx6LSl77yB6L+U5Zue5pKt5pS+5Zyw5Z2A5Li656m6XFxcXFxcXCJcXFxcbiAgICAgICAgfSBlbHNlIGlmKHR5cGVvZihpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpKT09J3N0cmluZycpe1xcXFxuICAgICAgICAgICAgcmV0dXJuIGlzVmlkZW8ocmVhbFVybCxyZWNoYW5nZSk7XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmwrXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIC8vZWxzZXtcXFxcbiAgICAgICAgLy9yZWFsVXJsKz1cXFxcXFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFxcXFxcIjtcXFxcbiAgICAgICAgLy8gfVxcXFxuICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLmo4DmtYvliLDop6PmnpDlj6PpnZ5qc29u6ZSZ6K+vOlxcXFxcXFwiK2UubWVzc2FnZSsnLOW8gOWni3g15YWN5ZeF5o6iJyk7XFxcXG4gICAgICAgIC8vIHJlcXVpcmUoJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2pzL2xzZy5qcycpOy8v5byV55So5pys5Zyw5YKo5a2Y5o+S5Lu2XFxcXG4gICAgICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9jYWxTdG9yYWdlP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpOy8v5byV55So5a2Q6aG16Z2i5pys5Zyw5YKo5a2Y5o+S5Lu2XFxcXG4gICAgICAgIGxldCBsb2NhbF9tcyA9IGxzZy5nZXRJdGVtKCd0aW1lb3V0Jyk7XFxcXG4gICAgICAgIGxldCBtcyA9IHBhcnNlSW50KG1zKXx8cGFyc2VJbnQobG9jYWxfbXMpfHw1MDAwO1xcXFxuICAgICAgICBsZXQgbWF4X2NvdW50PU1hdGguY2VpbChtcy8yNTApO1xcXFxuICAgICAgICBsb2coXFxcXFxcXCLmnKzmrKHll4XmjqLotoXml7Y6XFxcXFxcXCIrbXMrXFxcXFxcXCLlhbHorqHlvoXmipPljIU6XFxcXFxcXCIrbWF4X2NvdW50K1xcXFxcXFwi5qyhXFxcXFxcXCIpO1xcXFxuICAgICAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx5YiH5o2id2Vi5ZeF5o6iLi4uJyk7XFxcXG4gICAgICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLHJlY2hhbmdlLHBsYXlVcmwsbWF4X2NvdW50LFBDX1VBLGlzQmFkVmlkZW8pPT57XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEpPT0ndW5kZWZpbmVkJ3x8IWZiYSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVxdWVzdCk9PSd1bmRlZmluZWQnfHwhcmVxdWVzdCl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsKGZiYS5nZXRJbnRlcm5hbEpzKCkpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgZmJhLnB1dFZhcihcXFxcXFxcIl94NWp4VXJsXFxcXFxcXCIscGxheVVybCk7XFxcXG4gICAgICAgICAgICAgICAgaWYod2luZG93LmNvdW50ID09IG51bGwpe1xcXFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQ9MTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRleHQ9Jyc7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXFxcXFwiYm9keVxcXFxcXFwiKS5pbm5lclRleHQ7XFxcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcXFxuICAgICAgICAgICAgICAgIGlmKC/op6blj5HkuobpmLLnm5fpk7585pyq5o6I5p2DfOaOpeWPo+mYsuebly8udGVzdCh0ZXh0KSYmd2luZG93LmNvdW50PT09MSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9jYXRpb24ucmVsb2FkKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9ZmJhLmdldFZhcihcXFxcXFxcIl94NWp4VXJsXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXFxcbiAgICAgICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonK3dpbmRvdy5jb3VudCsnLG1heF9jb3VudDonK21heF9jb3VudCk7XFxcXG4gICAgICAgICAgICAgICAgaWYoIHdpbmRvdy5jb3VudCA+PSBtYXhfY291bnQpe1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi6LaF6L+HXFxcXFxcXCIrbWF4X2NvdW50KjI1MCtcXFxcXFxcIuavq+enkuacquiOt+WPluWIsOi1hOa6kOWcsOWdgO+8jOi3s+WIsOa6kOe9kemhtSzku6XkuIvmmK/liqDovb3ov4fnmoTlnLDlnYBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXFxcXFwiYm9keVxcXFxcXFwiKS5pbm5lclRleHQ7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKHRleHQpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coSlNPTi5zdHJpbmdpZnkoX2dldFVybHMoKSkpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmJhLmdldFZhcihcXFxcXFxcIl94NWp4VXJsXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5wYXVzZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCJ2aWRlb1xcXFxcXFwiKSwgYXVkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcImF1ZGlvXFxcXFxcXCIpLCB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCJlbWJlZFxcXFxcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiI3BsYXllclxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2aWRlbyk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MiwgZnVuY3Rpb24gKHYpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICAgICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICAgICAgdmFyIHVybHMgPSBfZ2V0VXJscygpO1xcXFxuICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coSlNPTi5zdHJpbmdpZnkodXJscykpO1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiB1cmxzKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdT11cmxzW2ldO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO31jYXRjaChlKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1PXVuZXNjYXBlKHUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcXFxcXCJ1cmw9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKFxcXFxcXFwidXJs5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3VybD1cXFxcXFxcXC8vLnRlc3QodSkmJi9cXFxcXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHUubWF0Y2goLyguKilcXFxcXFxcXC9cXFxcXFxcXC8oLio/KVxcXFxcXFxcLy8pWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcXFxcXCJ1cmw9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKFxcXFxcXFwidXJs5YiG5YmyOlxcXFxcXFwiK3UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXFxcXFwidmlkPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcInZpZOWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9XFxcXFxcXFwvLy50ZXN0KHUpJiYvXFxcXFxcXFwubTN1OC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QgPSB1Lm1hdGNoKC8oLiopXFxcXFxcXFwvXFxcXFxcXFwvKC4qPylcXFxcXFxcXC8vKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaG9zdCt1LnNwbGl0KFxcXFxcXFwidmlkPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcInZpZOWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFxcXFxcPyguKik9aHR0cC8udGVzdCh1KSYmL1xcXFxcXFxcLm0zdTgvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBcXFxcXFxcImh0dHBcXFxcXFxcIit1LnNwbGl0KC9cXFxcXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFxcXFxcIuWFtuS7luWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vfGluZGV4XFxcXFxcXFwubTN1OCRcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFxcXFxcLzFcXFxcXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHU9dS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHUscmVjaGFuZ2UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyYmIWlzQmFkVmlkZW8odSkpey8v6L+H5ruk5ZCK5q+b6KeG6aKRXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9meV9icmlkZ2VfYXBwLnNldFdlYlVhKFBDX1VBKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YoZmJhLmdldEhlYWRlclVybCkhPT0ndW5kZWZpbmVkJyYmdHlwZW9mKHJlY2hhbmdlKSE9PSdmdW5jdGlvbicpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYmFja1VybCA9IGZiYS5nZXRIZWFkZXJVcmwodS5yZXBsYWNlKFxcXFxcXFwiO3tcXFxcXFxcIixcXFxcXFxcIiNpc1ZpZGVvPXRydWUjO3tcXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFja1VybCA9IGZiYS5nZXRIZWFkZXJVcmwodXJsc1tpXSkucmVwbGFjZSgnO3snLCcjaWdub3JlSW1nPXRydWUjI2lzVmlkZW89dHJ1ZSM7eycpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdTEgPSBiYWNrVXJsLnNwbGl0KCcjaWdub3JlSW1nJylbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1MiA9ICcjaWdub3JlSW1nJytiYWNrVXJsLnNwbGl0KCcjaWdub3JlSW1nJylbMV07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUxKSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IHUxLnNwbGl0KFxcXFxcXFwidXJsPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC91cmw9XFxcXFxcXFwvLy50ZXN0KHUxKSYmL1xcXFxcXFxcLm0zdTgvLnRlc3QodTEpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0MSA9IHUxLm1hdGNoKC8oLiopXFxcXFxcXFwvXFxcXFxcXFwvKC4qPylcXFxcXFxcXC8vKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gaG9zdDErdTEuc3BsaXQoXFxcXFxcXCJ1cmw9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcXFxcXCJ1cmzliIblibI6XFxcXFxcXCIrdSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodTEpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEuc3BsaXQoXFxcXFxcXCJ2aWQ9XFxcXFxcXCIpLnNsaWNlKC0xKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcXFxcXC8vLnRlc3QodTEpJiYvXFxcXFxcXFwubTN1OC8udGVzdCh1MSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QxID0gdTEubWF0Y2goLyguKilcXFxcXFxcXC9cXFxcXFxcXC8oLio/KVxcXFxcXFxcLy8pWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBob3N0MSt1MS5zcGxpdChcXFxcXFxcInZpZD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFxcXFxcPyguKik9aHR0cC8udGVzdCh1MSkmJi9cXFxcXFxcXC5tM3U4Ly50ZXN0KHUxKSl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IFxcXFxcXFwiaHR0cFxcXFxcXFwiK3UxLnNwbGl0KC9cXFxcXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1VybCA9IHUxICsgdTI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coJ+i/lOWbnuiHquWKqOWKoGNvb2tpZemTvuaOpTonK2JhY2tVcmwpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKCfov5Tlm57pk77mjqU6Jyt1Kyflubboh6rliqjliqDkuoZjb29raWUs5YW35L2TY29va2ll5Zyo6KeG6aKR5pKt5pS+5aSE5p+l55yLJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYWNrVXJsO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi6L+U5Zue5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcXFxcXCIrcmVhbFVybCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgIC8vIGZ5X2JyaWRnZV9hcHAubG9nKCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICAgICAgYWxlcnQoJ3g15aSn6IyD5Zu06ZSZ6K+vOicrZS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5oql6ZSZ57uT5p2feDUnXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0saXNWaWRlbyxyZWNoYW5nZSxwbGF5VXJsLG1heF9jb3VudCxQQ19VQSxpc0JhZFZpZGVvKTtcXFxcbiAgICAgICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFxcXFxcIumAmuWFjVxcXFxcXFwiLFxcXFxcXFwiWDVcXFxcXFxcIik9PT1cXFxcXFxcIldFQlxcXFxcXFwiO1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuS7k+W6k+S9v+eUqHdlYumAmuWFjeabv+S7o3g1OlxcXFxcXFwiK3VzZVdlYik7XFxcXG4gICAgICAgIGxldCBydWxlSGVhZD11c2VXZWImJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIzMzk/XFxcXFxcXCJ3ZWJSdWxlOi8vXFxcXFxcXCI6XFxcXFxcXCJ4NVJ1bGU6Ly9cXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IHg1VXJsID0gcnVsZUhlYWQrcGxheVVybCsgJ0AnICtfeDU7XFxcXG4gICAgICAgIHJldHVybiB4NVVybFxcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24geDVQYXJzZVBybyh4NWxpc3QseDVUaW1lb3V0LGlzVmlkZW8pe1xcXFxuICAgIGxldCBicGF0aCA9ICdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv5rW36ZiU5ZeF5o6i5ZmoLmh0bWwnO1xcXFxuICAgIGxldCBiY29kZSA9IGZldGNoKGJwYXRoKTtcXFxcbiAgICBpZighYmNvZGV8fCEvZnlfYnJpZGdlX2FwcC8udGVzdChiY29kZSkpe1xcXFxuICAgICAgICBsb2coJ+acrOWcsOacquWuieijheWXheaOouWZqO+8jOW8gOWni+WuieijhScpO1xcXFxuICAgICAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBodG1sID0gZmV0Y2goYXBpLmhvc3QrJy9ydWxlbGlzdC5qc29uP2lkPTIwNTUnKTtcXFxcbiAgICAgICAgaWYoL+a1t+mYlOinhueVjC8udGVzdChodG1sKSl7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoYnBhdGgsaHRtbCk7XFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKGJwYXRoLGZldGNoKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9odG1sL2dldFZpZGVvLmh0bWwnKSlcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICB4NVRpbWVvdXQgPSBwYXJzZUludCh4NVRpbWVvdXQpfHw1MDAwO1xcXFxuICAgIGxldCBtYXhfY291bnQ9KHg1VGltZW91dC8yNTApOyAvL+agueaNrui2heaXtuiHquWKqOiuoeeul+S6huWPr+aJp+ihjOeahOasoeaVsFxcXFxuICAgIHB1dFZhcigneDVMaXN0JyxKU09OLnN0cmluZ2lmeSh4NWxpc3QpKTtcXFxcbiAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCxpc0JhZFZpZGVvKSA9PiB7XFxcXG4gICAgICAgIC8v5Yid5aeL5YyWZmJh5ZKMcmVxdXN0XFxcXG4gICAgICAgIGlmICh0eXBlb2YgKGZiYSkgPT0gJ3VuZGVmaW5lZCcgfHwgIWZiYSkge1xcXFxuICAgICAgICAgICAgdmFyIGZiYSA9IGZ5X2JyaWRnZV9hcHA7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJlcXVlc3QpID09ICd1bmRlZmluZWQnIHx8ICFyZXF1ZXN0KSB7XFxcXG4gICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tXFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID09IG51bGwpIHtcXFxcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQgPSAxO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IHRleHQ9Jyc7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFxcXFxcImJvZHlcXFxcXFxcIikuaW5uZXJUZXh0O1xcXFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcXFxuICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PTEpe1xcXFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xcXFxuICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcXFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXFxcbiAgICAgICAgICAgIC8vIGZiYS5sb2coJ2NvdW50OicgKyB3aW5kb3cuY291bnQgKyAnLG1heF9jb3VudDonICsgbWF4X2NvdW50KTtcXFxcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KSB7XFxcXG4gICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXFxcbiAgICAgICAgICAgICAgICBmYmEuaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgZm1zZyA9ICfpgZPplb/ku5PlupPpgJrlhY3op6PmnpDlpLHotKUs5Y6f5ZugOui2heaXticreDVUaW1lb3V0Kyfmr6vnp5InO1xcXFxuICAgICAgICAgICAgICAgIGZiYS5sb2coZm1zZyk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrZm1zZztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFxcXFxcInZpZGVvXFxcXFxcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiYXVkaW9cXFxcXFxcIiksXFxcXG4gICAgICAgICAgICB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcXFxcXCJlbWJlZFxcXFxcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXFxcXFwiI3BsYXllclxcXFxcXFwiKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2aWRlb3MsIGZ1bmN0aW9uICh2aWRlbykge1xcXFxuICAgICAgICAgICAgICAgIG11dGVNZSh2aWRlbyk7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXFxcbiAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcXFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MywgZnVuY3Rpb24gKHYpIHtcXFxcbiAgICAgICAgICAgICAgICBtdXRlTWUodik7XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdXJscykge1xcXFxuICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxcXG4gICAgICAgICAgICAgICAgLy91PWRlY29kZVVSSUNvbXBvbmVudCh1KTtcXFxcbiAgICAgICAgICAgICAgICB0cnl7dT1kZWNvZGVVUklDb21wb25lbnQodSk7fWNhdGNoKGUpe1xcXFxuICAgICAgICAgICAgICAgICAgICB1PXVuZXNjYXBlKHUpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcXFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFxcXFxcInVybD1cXFxcXFxcIikuc2xpY2UoLTEpWzBdO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXFxcXFwidmlkPVxcXFxcXFwiKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL1xcXFxcXFxcPyguKik9aHR0cC8udGVzdCh1KSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIHUgPSBcXFxcXFxcImh0dHBcXFxcXFxcIit1LnNwbGl0KC9cXFxcXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vZmJhLmxvZyhcXFxcXFxcIuWFtuS7luWIhuWJsjpcXFxcXFxcIit1KTtcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXFxcXFwvMVxcXFxcXFxcLm0zdTgkLy50ZXN0KHUpKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHU9dS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcXFxuICAgICAgICAgICAgICAgIGxldCByZWFsVXJsID0gaXNWaWRlbyh1KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAocmVhbFVybCYmIWlzQmFkVmlkZW8odSkpIHsvL+i/h+a7pOWQiuavm1xcXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXFxcXFwi5LuT5bqTeDXlhY3ll4Xnu5Pmnpw6XFxcXFxcXCIgKyByZWFsVXJsKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgZmJhLmNsZWFyVmFyKCd4NUxpc3QnKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcXFxuICAgICAgICB9XFxcXG4gICAgfSwgaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCxpc0JhZFZpZGVvKTtcXFxcbiAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgdXNlV2ViPWxzZy5nZXRJdGVtKFxcXFxcXFwi6YCa5YWNXFxcXFxcXCIsXFxcXFxcXCJYNVxcXFxcXFwiKT09PVxcXFxcXFwiV0VCXFxcXFxcXCI7XFxcXG4gICAgLy9sb2coXFxcXFxcXCLku5PlupPkvb/nlKh3ZWLpgJrlhY3mm7/ku6N4NTpcXFxcXFxcIit1c2VXZWIpO1xcXFxuICAgIGxldCBydWxlSGVhZD11c2VXZWImJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIzMzk/XFxcXFxcXCJ3ZWJSdWxlOi8vXFxcXFxcXCI6XFxcXFxcXCJ4NVJ1bGU6Ly9cXFxcXFxcIjtcXFxcbiAgICByZXR1cm4gcnVsZUhlYWQrYnBhdGgrJ0AnICsgX3g1O1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBMYXp5UGFyc2VGYXN0KHBsYXlVcmxMaXN0LGdldFRpbWVvdXQseDVUaW1lb3V0KXtcXFxcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzLHg1UGFyc2VQcm99ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXFxcbiAgICAvLyBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqI6JytwbGF5VXJsTGlzdCk7XFxcXG4gICAgbG9nKCflvIDlp4vmiafooYwnK3BsYXlVcmxMaXN0Lmxlbmd0aCsn5Liq5Zyw5Z2A55qE5om56YeP5ZeF5o6iJyk7XFxcXG4gICAgbGV0IHBsYXlVcmxzID0gcGxheVVybExpc3QubWFwKChpdCk9PntcXFxcbiAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgIHVybDppdC5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilbMF0sXFxcXG4gICAgICAgICAgICBvcHRpb25zOiB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAvL1xcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBcXFxcXFxcIkRhcnQvMi4xMyAoZGFydDppbylcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6XFxcXFxcXCJNb3ppbGxhLzUuMFxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiBnZXRUaW1lb3V0XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBsZXQgYmh0bWwgPSBiYXRjaEZldGNoKHBsYXlVcmxzKTtcXFxcbiAgICBsZXQgdmlkZW9zID0gW107XFxcXG4gICAgbGV0IHg1bGlzdCA9IFtdO1xcXFxuICAgIGZvcihsZXQgaSBpbiBiaHRtbCl7XFxcXG4gICAgICAgIGxldCBvcmRlciA9IHBhcnNlSW50KGkpKzE7XFxcXG4gICAgICAgIGxldCB0bmFtZT1vcmRlcisn5Y+36Kej5p6Q572R5Z2AOic7XFxcXG4gICAgICAgIC8vbG9nKHRuYW1lKTtcXFxcbiAgICAgICAgbGV0IHR1cmw9cGxheVVybExpc3RbaV0uc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdO1xcXFxuICAgICAgICBsZXQgam5hbWU9cGxheVVybExpc3RbaV0uc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpLmxlbmd0aD4xP3BsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVsxXTpcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICB0bmFtZSs9am5hbWU7XFxcXG4gICAgICAgIGxldCBiYWNrY29kZSA9IGJodG1sW2ldO1xcXFxuICAgICAgICBpZigoIS91cmx8aHR0cC8udGVzdChiYWNrY29kZSkpJiYoIS8jRVhUSU5GLy50ZXN0KGJhY2tjb2RlKSkpe1xcXFxuICAgICAgICAgICAgbG9nKHRuYW1lK3R1cmwrJ+aciemXrumimCzlj6/og73liqDlr4bmiJbogIXmjILkuoYnKTtcXFxcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICB9ZWxzZSBpZigvI0VYVElORi8udGVzdChiYWNrY29kZSkpe1xcXFxuICAgICAgICAgICAgLy9sZXQgbGNhY2hlPVxcXFxcXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9jYWNoZS92aWRlb19cXFxcXFxcIit0bmFtZStcXFxcXFxcIi5tM3U4XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAvL3dyaXRlRmlsZShsY2FjaGUsYmFja2NvZGUpO1xcXFxuICAgICAgICAgICAgLy92aWRlb3MucHVzaChsY2FjaGUpO1xcXFxuICAgICAgICAgICAgbGV0IHBVcmw9Y2FjaGVNM3U4KHR1cmwpO1xcXFxuICAgICAgICAgICAgdmlkZW9zLnB1c2gocFVybCk7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHVybCA9IEpTT04ucGFyc2UoYmFja2NvZGUpLnVybDtcXFxcbiAgICAgICAgICAgIGlmKC9eaHR0cC8udGVzdCh1cmwpKXtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVhbFZpZGVvID0gaXNWaWRlbyh1cmwpO1xcXFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVmlkZW8pPT0nc3RyaW5nJyl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxvZyh0bmFtZSsn5bey6Kej5p6Q5Ye66KeG6aKROicrcmVhbFZpZGVvKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYoam5hbWUpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFZpZGVvKz1cXFxcXFxcIuKYhVxcXFxcXFwiK2puYW1lXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2gocmVhbFZpZGVvKTtcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9nKHRuYW1lKyfop6PmnpDlh7rkuI3nn6XpgZPku4DkuYjkuJzopb86Jyt1cmwpO1xcXFxuICAgICAgICAgICAgICAgICAgICB1cmwrPVxcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYoam5hbWUpe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFxcXFxcIuKYhVxcXFxcXFwiK2puYW1lXFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2godXJsKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+S4umpzb27mjqXlj6PkuJTml6Dov5Tlm57op4bpopHlnLDlnYDmlbDmja46JytwbGF5VXJsTGlzdFtpXSsnXFxcXFxcXFxuJytiYWNrY29kZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKHRuYW1lKyfkuLp4NeaOpeWPoyzliqDlhaV4NeWXheaOouWIl+ihqCcpO1xcXFxuICAgICAgICAgICAgeDVsaXN0LnB1c2gocGxheVVybExpc3RbaV0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIC8vIGxvZyh2aWRlb3MpO1xcXFxuICAgIGlmKHZpZGVvcy5sZW5ndGg+MCl7XFxcXG4gICAgICAgIGlmKGdldFZhcignZHAuY2FjaGVWaWRlbycsJ3RydWUnKT09PSd0cnVlJyYmcGFyc2VJbnQoZ2V0QXBwVmVyc2lvbigpKT49MjI1NSlcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwi5bCK5pWs55qE6a2U5pat55So5oi377yM6KeG6aKR57yT5a2Y5bey5ZCv55So77yM6K+35bC95oOF5Lqr5Y+X55yL5Ymn5pe25YWJXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IHZpZGVvc0NhY2hlPXZpZGVvcy5tYXAoKGl0KT0+e1xcXFxuICAgICAgICAgICAgICAgIGxldCBoZWFkZXJzPXt9O1xcXFxuICAgICAgICAgICAgICAgIGlmKGl0LnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKS5sZW5ndGg+MSl7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBoZWFkID0gaXQuc3BsaXQoJzsnKVsxXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYoL0AvLnRlc3QoaGVhZCkmJi97fH0vLnRlc3QoaGVhZCkpe1xcXFxuLy9oZWFkID0gaGVhZC5yZXBsYWNlKC97fH0vZywnJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkID0gaGVhZC5zcGxpdChcXFxcXFxcIntcXFxcXFxcIilbMV0uc3BsaXQoXFxcXFxcXCJ9XFxcXFxcXCIpWzBdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoJyYmJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gaGVhZCl7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGhlYWRbaV0uc3BsaXQoJ0AnKVswXTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPWhlYWRbaV0uc3BsaXQoJ0AnKVsxXS5yZXBsYWNlKC87Lywn77yb77ybJyk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOml0LnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXS5zcGxpdChcXFxcXFxcIuKYhVxcXFxcXFwiKVswXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczp7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOmhlYWRlcnNcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgdmFyIGRhdGE9YmF0Y2hDYWNoZU0zdTgodmlkZW9zQ2FjaGUpO1xcXFxuICAgICAgICAgICAgZGF0YT1kYXRhLm1hcCgoaXQsaWQpPT57XFxcXG4gICAgICAgICAgICAgICAgbGV0IGV4dHJhPVxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgaWYodmlkZW9zW2lkXS5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIikubGVuZ3RoPjEpe1xcXFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFxcXFxcIjtcXFxcXFxcIit2aWRlb3NbaWRdLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVsxXTtcXFxcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXFxcXFwi4piFXFxcXFxcXCIpLmxlbmd0aD4xKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE9XFxcXFxcXCLimIVcXFxcXFxcIit2aWRlb3NbaWRdLnNwbGl0KFxcXFxcXFwi4piFXFxcXFxcXCIpWzFdO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgICAgIGlmKGl0K1xcXFxcXFwiXFxcXFxcXCIhPVxcXFxcXFwibnVsbFxcXFxcXFwiKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0K2V4dHJhXFxcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWRlb3NbaWRdXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAvL2xvZyhkYXRhKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBkYXRhXFxcXG4gICAgICAgICAgICAvL3JldHVybiB2aWRlb3NcXFxcbiAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICByZXR1cm4gdmlkZW9zXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgbG9nKCflhbHmnIknK3g1bGlzdC5sZW5ndGgrJ+S4qng15Zyw5Z2A6L+b6KGM6L2u5rWB5ZeF5o6iJyk7XFxcXG4gICAgLy/msqHmnInnmoTor53lsLHlvIDlp4vkvp3mrKF4NeWXheaOolxcXFxuICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHliIfmjaJ3ZWLll4XmjqIuLi4nKTtcXFxcbiAgICByZXR1cm4geDVQYXJzZVBybyh4NWxpc3QseDVUaW1lb3V0LGlzVmlkZW8pO1xcXFxufVxcXFxudmFyIGxhenk9JCgnJykubGF6eVJ1bGUoKCk9PntcXFxcbiAgICB0cnl7XFxcXG4gICAgICAgIHJlYWxVcmw9aW5wdXQ7XFxcXG4gICAgICAgIGV2YWwoXFxcXFxcXCJ2YXIgY29uZmlnX2RwID1cXFxcXFxcIiArIGZldGNoKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9NeVBhcnNlU2V0Lmpzb25cXFxcXFxcIikpO1xcXFxuICAgICAgICBldmFsKGZldGNoKGNvbmZpZ19kcC5jaikpO1xcXFxuICAgICAgICBsb2coaW5wdXQrJy0+5q2j5Zyo5pat5o+S6a2U5pS554mI6Kej5p6QLi4uJyk7XFxcXG4gICAgICAgIC8vIOWKoOWFpei2heaXtuiuvue9ru+8jOW7uuiuruWcqOmmlumhteiuvue9rlxcXFxuICAgICAgICByZXR1cm4gYXl0bVBhcnNlKHJlYWxVcmwpXFxcXG4gICAgfWNhdGNoKGUpe1xcXFxuICAgICAgICByZXR1cm4gaW5wdXRcXFxcbiAgICB9XFxcXG59KTtcXFxcbiQuZXhwb3J0cy5pc1BpYz1pc1BpYztcXFxcbiQuZXhwb3J0cy5pc1ZpZGVvPWlzVmlkZW87XFxcXG4kLmV4cG9ydHMuaXNCYWRWaWRlbz1pc0JhZFZpZGVvO1xcXFxuJC5leHBvcnRzLmNvbVBhcnNlPWNvbVBhcnNlO1xcXFxuJC5leHBvcnRzLmdldEhlYWRlcnM9Z2V0SGVhZGVycztcXFxcbiQuZXhwb3J0cy5sYXp5UGFyc2U9bGF6eVBhcnNlO1xcXFxuJC5leHBvcnRzLng1UGFyc2VQcm89eDVQYXJzZVBybztcXFxcbiQuZXhwb3J0cy5MYXp5UGFyc2VGYXN0PUxhenlQYXJzZUZhc3Q7XFxcXG4kLmV4cG9ydHMubGF6eT1sYXp5O1xcXCJ9LHtcXFwibmFtZVxcXCI6XFxcIuS7u+WKoeS7k+W6k+aOpeWPo1xcXCIsXFxcInBhdGhcXFwiOlxcXCJ0YXNrQ2FsbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcblN0cmluZy5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJlcGxhY2UoLyheXFxcXFxcXFxzKil8KFxcXFxcXFxccyokKS9nLCBcXFxcXFxcIlxcXFxcXFwiKTsgfTtcXFxcbmZ1bmN0aW9uIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spIHsgLy8g6YCa55So5Y+R6YCB5LuT5bqTcG9zdOiwg+eUqOS7u+WKoeivt+axglxcXFxuICAgIGNvbnN0IHtnZXRGaWxlfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcXFxuICAgIGlmKCFob3VzZUZpbGUpe1xcXFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdCh0YXNrX2FwaSwge1xcXFxuICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImRhdGFcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInR5cGVcXFxcXFxcIjogdGFzay5tb2RlfHwncnVuJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJmdW5jXFxcXFxcXCI6IHRhc2suZnVuY3x8JycsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHRhc2sucGFyYW1zfHxbXVxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJhdXRoXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IGhvdXNlX2RhdGEudXNlcm5hbWV8fFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZHx8XFxcXFxcXCJcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXFxcXG4gICAgfSk7XFxcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2tfdXBsb2FkKHRhc2speyAvLyDpgJrnlKjku7vliqHlj5HluIPmlrDlop7lj4rkv67mlLnlip/og71cXFxcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgYXBpX3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9hZGQnO1xcXFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYXBpX3VybCwge1xcXFxuICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicGFyYW1zXFxcXFxcXCI6IHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImRhdGFcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogdGFzay5uYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInB5Y29kZVxcXFxcXFwiOiB0YXNrLnB5Y29kZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJub3RlXFxcXFxcXCI6IHRhc2subm90ZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJ0ZXN0X2NvZGVcXFxcXFxcIjogdGFzay50ZXN0X2NvZGUsXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcImF1dGhcXFxcXFxcIjoge1xcXFxuICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJwYXNzd29yZFxcXFxcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFxcXFxcIlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcXFxcbiAgICB9KTtcXFxcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gdGFza19jYWxsKGlkLGZ1bmMscGFyYW1zKXtcXFxcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3J1bi8nK2lkO1xcXFxuICAgIGxldCB0YXNrID0ge1xcXFxuICAgICAgICBtb2RlOidjYWxsJyxcXFxcbiAgICAgICAgZnVuYzpmdW5jLFxcXFxuICAgICAgICBwYXJhbXM6cGFyYW1zfHxbXVxcXFxuICAgIH07XFxcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX3JlbmFtZShpZCxuZXdfdGFza19uYW1lKXtcXFxcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXFxcXFwiKTtcXFxcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcXFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9yZW5hbWUvJytpZDtcXFxcbiAgICB0YXNrX2FwaSA9IHRhc2tfYXBpKyc/bmFtZT0nK2hvdXNlX2RhdGEudXNlcm5hbWUrJyZwYXNzd29yZD0nK2hvdXNlX2RhdGEucGFzc3dvcmQrJyZ0YXNrX25hbWU9JytuZXdfdGFza19uYW1lO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PTApe1xcXFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQrJycrcmVzdWx0LmRldGFpbFxcXFxuICAgICAgICB9XFxcXG4gICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX2NoYW5nZV9zdGF0ZShpZCl7XFxcXG4gICAgY29uc3Qge2FwaSxnZXRGaWxlfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcXFxuICAgIGlmKCFob3VzZUZpbGUpe1xcXFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXFxcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svY2hhbmdlX3N0YXRlLycraWQ7XFxcXG4gICAgdGFza19hcGkgPSB0YXNrX2FwaSsnP25hbWU9Jytob3VzZV9kYXRhLnVzZXJuYW1lKycmcGFzc3dvcmQ9Jytob3VzZV9kYXRhLnBhc3N3b3JkO1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PTApe1xcXFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxcXG4gICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQrJycrcmVzdWx0LmRldGFpbFxcXFxuICAgICAgICB9XFxcXG4gICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcXFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrX3J1bihpZCl7XFxcXG4gICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIpO1xcXFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9ydW4vJytpZDtcXFxcbiAgICBsZXQgdGFzayA9IHt9O1xcXFxuICAgIHJldHVybiB0YXNrX3JlcSh0YXNrX2FwaSx0YXNrKTtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzLnRhc2tDYWxsID0gdGFza19jYWxsO1xcXFxuJC5leHBvcnRzLnRhc2tSdW4gPSB0YXNrX3J1bjtcXFxcbiQuZXhwb3J0cy50YXNrUmVxID0gdGFza19yZXE7XFxcXG4kLmV4cG9ydHMudGFza1VwbG9hZCA9IHRhc2tfdXBsb2FkO1xcXFxuJC5leHBvcnRzLnRhc2tSZW5hbWUgPSB0YXNrX3JlbmFtZTtcXFxcbiQuZXhwb3J0cy50YXNrQ2hhbmdlU3RhdGUgPSB0YXNrX2NoYW5nZV9zdGF0ZTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlhajlsYDlgqjlrZhcXFwiLFxcXCJwYXRoXFxcIjpcXFwibG9jYWxTdG9yYWdlXFxcIixcXFwicnVsZVxcXCI6XFxcImxldCBsb2NhbFN0b3JhZ2UgPSAoZnVuY3Rpb24oKSB7XFxcXG4gICAgZXZhbFByaXZhdGVKUyhcXFxcXFxcImp3VUt3TlRpUEdjV1NMQ1hCNVh0QVh3YjZMUWJWeUhEKzBYSjdsMDdjZTA9XFxcXFxcXCIpO1xcXFxuICAgIC8vcGF0aHRvPXVuZGVmaW5lZDtcXFxcbiAgICBldmFsUHJpdmF0ZUpTKFxcXFxcXFwiNEMwWXhSWW5HQ1lrZ0ZSWHRwbC9DejV6TDVoaDRqQ0N6dGIrbmcrV29reW1ROG9VcnpTOWxBOHl4QzVhRmFkblNFbXlIS01icmFmbFJxWENuTlJIRGxrNnVlOHlIVE8xNmxCUHJwd2dzNWpmMFBockF0b1RKSUUwWkhuOW1LYVE0SmQyZXJxYjRJNTViZVdJZXVnS3NEczIxMVN6SU5RNXlKZ1NoMWRWdU56enhSR0pnNDBGbVR1Vm1YVmZOMXhnMldJR0hCRW1rVm5HeG1PUmhQT05BK1E1VndQbWRwNDEvaHplM2VJc1V2aG83VkNCZ0s0cmFKbVBhbElSQkJWbENWZ244RmtXbWZLcVpvK1ZXK29CY0g3aHJjcnNTbENTakJhbmdULzdzeVdIeEtZaGVoVTBrYU1Zam5XRmcxRW0wY21OUnRvbUNzSHoxQjhxMzJPZVFIb2F3ZFd4ektPYU1IT1hEQmpSb2pBOEUvYWgwV1JPeXppcVJTeGwvbThkaEJkMGY5cGhZei81U1UvekpENTJYLzlFQzE2V1ZWZHBTVzMzYWtSSFJzbFBwUmxUV0Y5K0F5Um1SdzBlWk9FczFvOVFNUEFRVWZBeGJZeUZIZ3p0dy9PMmRKUnBIeVRtaUJpYWFxVGNpdng2djl6eXZCejA0d0kxQWFTQ3VpK2RUdVUzbHU1eGRFdDNBanQ2WjNpRFhPVmNFUDBFREY3NDc0UFFVNkpFWnV3ZTk3U2NoNGJpMXdCMVhIWlNmSXRkbFlZb0dlZDNMTHBibURBSVJjaXYwckFvcDhWbVFjVHQySzNMZmgxUkRZWTBZdHZSY0g0OU92cERSSC94YTVGYzhNWTNEckZvQTdxY29GNGVDZ2lWQmZCZ0pSNjgrTHBRSzd0T2tnOGs5ZWMrM05TeEpUaGNsOGQ2eU53eFQ5VGsxN3plSmdkNk1veVlaSXBXUUxsRjZZdmJPZEVXaGptbkE3OHdDMGhXeitYbTZoUU1TcXRGdytiaEZmN2NCR1UzYWF0UEZtZENZMkVkWGZoMElZVzg1d2RPeU1maXdXNy92VlRwOWlFMDBJM0YwOXdHSGtHS2hWYkx1ZUFrWWU3enpKWFI3dGhhRm9yNkg3cUxtSmpiUlFrOWV2TnRCUVhOUjdEaWZpWHVRZjJsdDduT0g4MFNXbTFmREhIemptUHNOSXBzMlRYR1QraXdWVjY5Zy90V2lwVlE2RDhCVHgrY0NRcDQ3bm1USXJZK3FONGtoMkZZaDVMbHdYZGdJeXkxVkl1QzN4MDUzZXdBSUlVbWxZOW5pRXBxWXQrMWZGUFhPQ3RDR3RZYlNkMzd2VlIxRU9qMms1R3UvKzlKV2cycXZ3bDF0d2VsZzFKMHR4YXJJaTRrVGJUcnZybkZMTjkycG9mcFpRVWZvV280Y2U3SFdOZGJ1NEpLRXJhTFFVZmRmR0VQZDFUSXVmdXVSVmEzOWVxOUdaeVNEdUJMNjBNUGRsZHhLdzF6bytmQjVaWStZTWozTEwyZ0d0RGJzOTgrQXNSVjlMSldtVW1zeDkxaG1KdEZVTVdEM3huajhITVpXczBOUGxDRlVyOTQ4NUtxVHBvNWtSekdmRitrL05sMkp6cnY1Y3ZrcXRVbkxnS3BYRU9qL3NlL29Eek9BclFLSTVUTlVidll3Y3djZGpqTVNmaks2OEtyd2hzK242U21XWjRaZGdSSGdBSzVNb0ZpM1htTFY0N1AzdlNSV3U1enlFc01rNHkzdXVDRml1UlBSbHU0UTVwSnZ1T2VtN0g3VUxpSWhDZW12NURna0d0REwxY0dMNEVRaFlSQjZJU3pWdnNiMkVhUDl3UUU2RFZSbk03TytwblN6ZXQ2bHpwM3BGZEduYm94MUxSZkM2MHV0WForQ2pJbTRpRU1tdGJCMk41ekRTaEdiZU0zWFViSlFkQ0JpczhYSXJoaDJiaUI1aEJDVnduM1kzZXR0N0dEUFZ0b2kxR1JqeitKYmdNK1lSOTI4S2JkV1M1dEZhTU0zS2ozWHY2b3RJeHpNQm5EQzl1VzNkK0lYeDZ2TFBKMEpSdWgzeVA3cFRsYTZjM2lSNHA5bldZRHFKK1pTbXBySEZuRE96c0xXbUZqYXBqZS9NcXdNSmQ2VGszbkFXd2ljTU9QdVlwTXlxSUYwNGZsNG1xZ3RzSExTTVdSUk5IUFpqRVRROWdSbWVEWWU2YVJ0bFcwMnFMMm9sREVOcUxRTXRBZG9pck5XUmNQOVZMM1RkOEhhVU82ZlNsR05hYk1ha0pELzAwWENoT1NVT0lQKzdmTTdWMC9sMWJMV1B0RXoxaTdMeWdUVjdwZEdvRG50cVNDRW5KckJ5aEJBekxSZzVRSWM5NDM4SWhLbXlmbjAvM2F3b0QxSXI3ODBleXAvWGNJNnhOY3c2VHYvRVRmSGcwZTdpWUMwVVljSklFNVFVWHYwcytZb0dJRXE1R0l6S3ViOEhOalNUVXBzdm5rVngrZGJlMmpSbjNZYjlXN0pDWjVZUzZGNU15VVZzcGpNRDdOWWMrRFdqVUwyYjJzVnlBZmVZcEM4VWhhaDl0dW1hdmJCdjdhM2E5a2dGYnE1OGxySHh6WTdpSlFWaWd6cTNlMWEyQlNiMFBjVzFhSjhCRDdOa05waEtZYXlUeHlrZ3dpbEVSTDhqcXFCRW5pSFZkQnhESllMYitYdzNhbExtbHR1VEVWNktHdEJudEJYK3l6MzZSUERNeUdJS2UrM2Z6Y3hmbkNEbjIwTW9kVlZrVk5velBxTVhaMEc1TDRhTFRBUWFrWUtVanNWTVFqQWhRa1RsSEJlTy9hTFB4OXN4bCsrajFaNXJMZ0cxMlRONFhKMWVpY3Z3NEFWRTU4TG9yYXEwUWlFMGNTN1BIMXBiclpXcmZ0N0xZR2l5QlNob3I3KzBqaW9VaDFwZFdxMnFNWUxxZU1FZXVDUk9RdDU3bUZyT2p5UEg0OXFwOTdjV09yZ2VnMld5ZldTREdRUGplNStQMHlRb0NwRC9EM1JBTXVXbWI5d2xCdGNxMmo4V0pQdDkxRTNrS2F3dVFJeXZkMnIyVWp4NCtIVE50VktiOWtNTE9PODVJNjViTkdCSCs0aXJTeTVnUVlsRTI2QTJjU0dJY0xLUVJsdkpvTW5hN0wvOXd5cnk0SHpPcnprckF2TGRnc1NObFlqcEhRRVJpT0k4MHNKNWpOQ0NuZncwMTNGK0Erc0FmTG15Uy9CRExOUTFxYVEzcDZoOC9KcUFmaFg1T0dIZ1NpUlZPQ0VqdWFEQi9Nd1pOQ3UzUUw5ZWhob0FqN3VPZjhQa3IzbUlqYmhoOUhpanNqeDE5MSswZTJKUXJGYTAxQVZKS0VWdHVQdEljMmgvMXBQS012eWVueGpUTzJPeFBuamp0Kzg0bklLS2h4REovZ2hQdDdpdjhQbVRKMGxLS3lQUnNzbDhmL1FkSGR4dXBiNmpUc0k2VUttejlZNDZQTUJ1RDZQM3doOHFwMzZPNm9pYk5EaVFkMXNFMTB2Smg5ejFGeXNLSWU4RXFNcG5OZEVtRzJUZkVCeFJwbVFyaEtFcWVlMHA2K2E2c1FvOGNWbFJKa0tRQVlLYXdjYU5FUzVYYzZkUVk1bnFlaXE4c1VpemYxc3BmSGVIZWxEdTFNNkJSWHVDakZhZlhoejhpM2xQV2dZcVZwZngxM2lnVkNSZjQ3VUg2NTJ5TG5zbWVwQ0JXZ3lCVFdBY095RjFReDhZR3Rabm9iMVROKzZ4RXd6cGNXVnk3UU85UDkyc0tBOVNLKy9OSHNxZjEzQ090MEpIQ3RUVjFPbFRRVytKQUt5eGUxSGw3K3M5NXozS0NnRktRUyszQXMxSlY3TmErZytMQ1IySWV2dThkNUQwTDdHd29EcmVVdjQzNzRMUmFGa05zSE9xV2JVOW5oUWpkTVZyN2EvaThPLzRoYnB0YVN6cXFrZ1lGaU5GVS9vbVc1cXdJejdzcDRuc2NJVFJFM2d1YTZiemtsTVo4RUNuMWlxQVd0MGE2Z2VraTVEYUw4cVlhcFRDQ2hqbFdzRXhxRnV4aVdQMzVUVUNkZEVkOEFDYk1HcytnUUZ5RE9vemZCREcxN2RaTzBtQ3dXK1B6Q0wyamJJQ0ROYWk1L2ptMVFyNk1MNTZqelVhSUR6MEdMUFRTYWV4MVVERHdrUTlvN21YV0MwUjdqV256YmtIUldjb21WYldtR3FMMXJqZG9hY3MvUjl1anFVdUJBNkE1VkwvcWtRMXhITDQyRVhvb3ByQzh3cnJmUjY4ek1NRnhPd1U3Q1lISjdiaEcvUTRyTnNYREJjTW8xQWRpcTlMWGJYbS9RSmowdS9qZ1pHc3N6MG5uS0tVRkpjeHp1QU5LOTZ6V3dmMURYYXNVY09vRXVFYXRtMXJtUDV3ckJKbVcvWndUNmFCQmlSMk9TSjB4cjh0UTZPYm1kS2p5YisxZUVYYjE0MzdSMklkaERVZGs1UFJ6dEgyWUZ0MnBtdUw0L0xtSUxGQXZQZGl5TXRESE5qK0toNHNWNE1sWGJXUHJySTk3WUJPRnBGbFgrZ25ld0tLZkZaa0hFN2RpdHkzNGRVUTJHbmU2c0FHeDF6eHlqWnY1S0JNMjZsUkhGNDVYcUZOSjFSUTNoTXltSkhzeVlOc01PNDFCV3JHdjE5UEE0NjhlY3c5SGNSTjB3aGpVVGduczhaVmFDNGhpSnNnWTA3YUFFQkhtOTAvdWhoak8vV21iN3d1VmFkaGw5Um5IZVFqcHg0Z3dDckx6NWk1czVJdDFzQndmRGIwRmUrUENwTGtjK3dJSU5LMlk4NmtQdGhSNmdKd1c3NXp1b041QzBDQWlEd2ZVNzN2YUFaYWh6ZjRWTE5sTTBVMDRPdEhZQmkxM1lnUG9ObUdIUmVsWlZFeTJLdUtWWmdoRDE0dlNsWStKck1CRGRtMnkydGhGVitCcmloTDcrZlE1d2NZbnhHZWxhd0R1b1NSNStiRERrcjZSTDQwTDR4eWZBaHhsck9uMHVBMjhnaEdlV2d1YVdLRXY1bkJycnZldTF1ZVZ5MU12R1VZQlkrSWxFcjhOZEROUmRtRXpYdDM5a0dsZDg2eE9mQUgveEwxVm11Z2FYT0dhUEIycWM3V0RSa1c2azVGNm4zUGtJemRQWHlPTktwMURrT2czb2NTTVpNVHM2R0tqOUMzdk9EWjZaUXB3TkRZTE1UK0NtRUwxOEdSalhOY1psUC9MbmhpQUlzY1lUTDEraUhXRFl2Um12UE13dE9IaENuRVhJVTNGVGJQKzZRUkdBNnF5ZGJubmVxVmhYb3djTG1iTUl6MTZJQzFrd2haajc1L001M3NLWVgyelJnT1NUQWZOU0QvNWxaWVNOVXhKZktURGdpYUZFZ2dyQ3JkKzNDYytjaHpzbEkzekRYRUtUcnZsY1gySW5DOXVIK2ZzeXB5SHcrQXZZMk9tQkdRTUlJYzhmRTN0Tk8wZ0JUVnFYc2RzRTc2WXdIcjI5ZHpRY2t1c3V5SnNCZlNWY2xydnNOQ1oxUFFETDhIM2NSczNIRTluVWt4NWJiSllXc1B4YjgyNWduRXBXVTlaOUt0enZzbGk3L2hlT2xES3BIeEpiMXVDcldxZjhnUm5XbXEzemZTU3JVWEJIU0x1NjJNcmtYVGpXZ2FwVVZ4TUdrcm56UjBFNFBNeTFiRmN5RHBFUWUxNVRheVdCTTFCNmpySUcrMERSUjlPYUNVUHdEN2V4Tm1qWmI5TTgxdXMrQUlSZnl6SlBaR21mSHVUOVNOekZmTnVRZEZaeWlaVnRhWWFvdld1TjJpckkzelFhdEtDRG5RSVhwcjBWaEcwR29wOGMvenJvV0JvTi9hVkttbjhza1NGdkFET2pvWkFpeGc2SzF5OXdGaThwZUNtaW1GWjNaekNWc0c2RVU5U3ZsYnE1K3duN0Q2eStkQVlkYVBtczRnd0NyTHo1aTVzNUl0MXNCd2ZEYno0WDRWeHFJcGNUQzlOYVlLcUE3R0tLK2FUclpXVXd3TjIxUU90cjhlcXhTZ0oxVTllQ09jV1hRZCtwMzZHeTRmWSt0OWMyQ3NWTmJObDFnaHhhOWJJOFU2ZTZGVGQvdnZCYXE5anJLZGl0cTRtTkNhaW9nbWZQSzZNNDhVWUk4alpNQ2RkLzlDOEJxdlVqNGJZVTVieVdBU0VHNkJCR2RLOEtsZmkvYTRMV3QzaXZDNHU5UUJUZmIvdkNtTkppL1FBZmFiY1BHK1VzV21zWU5SSytnOGhNY3N1Qm1oaDQ4TnBoUnZlYlZRcXE2bmNLeGMxbkZIV01XNU02b2YrejhjMUhkZG5pZURQOUdhQnNxK3lzbGpLc2xZcnQ5ODlQWTl4c2Jta3IzWC9vQ2ZpRlU0TmZjT2hlZSsrbmdXMFhwWkFWdDFJMlFuYzFhbHdibm9OcU1NaFhJQjk1aWtMeFNGcUgyMjZacTlzRy90cmRyMlNBVnVybnlXc2ZITmp1SWxCV0tET3JkN1ZyWUZKdlE5eGJWb21LcVFqdWg5ZHpmMm52VnJCemJFRjBDWlk2aXprWS9SUVk1cjlrOTMveTJORzdvMDduTVlqT3RaWVllTlVvaWs3R2JLL0h6UWwxUzdzL0ZDaG50OU02ZkUwVXl1UG10dE85OGhxenhRYnRlTWFsTXRTY2UyV0xjanlYVkdmcHFkQmtZeW00Z1pCeWNjUzZhbnR0NG9MZGx1V1NTSnNIWDFJY1hoUXk2b0orQWhqdzloRll3WExIUExvQ28zakVsaVVBSzQxNzl3dFl0SHNPMGFiTHg0K2htdE01Rno3d1VWYWhCQTlzdXBPVGYvRkQ0c2laTU1vZjVXM3ZtNURlZGhxR0FObGh0M21JNlJtSWh2NDhRVnRuZU1zVXpZQzRORGhaRDRNNVI2cDdHWEJxY3B1M0ZhRUYvMEkwZTNMY2VYMUhOK2lEcUtSUHVHenZwYWMvMXRzR1BJdGVBRHh1OU9Zb2FwMnozRjFDelNnL1V1YThsL0tFenRBS0RjdmJoTlUvWVVjMmxoZ3hnZmRiNGUrUDlUWjdSYVg4MnM2Mjd1MENiRnNmR0UvMWhMcGI1TWMydmsxdURHcmRJY2JXQTZ4aHBZQUhZaEVZVWw5Yzc1WS9SLzBnbDZyOSttNmNJMEJ2Qlk1QWE1TkJSYzZVTXZzTy9QT3c1Q2NyNzlzSnppY2VhVjNZd3JZRWtqcDZLaStPWXJHdTk1NEFBK2RKOVdzdk5HQkZHTXJLQWZROVZVQy9BVGtKZlRsb01sdERlVjVBbzl6a2FheTNkS0FhNS9QeEFHUkRBVWNRTERGN3VWWGJEMXZGZ0UvK1JYaXd6UzVON2NyM2FGQmRSWTdYQW1Gei9mYjAvS1NwUjhDUS9sb2twbU0ybWx0Sjl2R1BnaXFiNW5abDlLdTdkMkdsZ0FkaUVSaFNYMXp2bGo5SC9TQnVqQlBvTzFmcG9PdTVGMzVjZEhhNWtTRnZBRE9qb1pBaXhnNksxeTl3RmxqMEV6NWtzVVczV1U2M0U3ZTRxdERVQ0tXd2pqVTVmMEZkNTdWeVZ6cEM2Q2RDU2NCallTelQ5clpMVnNrcTYxYU9XckREVU5LcUFRMytuWC9CQlczY1FURWNPVmRjMTVuZ1ZYY1NTL2FLMlFGTWRpS1FscW0xNWZFckpkd3F5ZXphN2hmbEtUaUN6VWR1NVZHbEZXOXFDdDhzeUhvb3NBMk56Zm9zSmRUZE44YldIbm9EcjVOMjVldCtwL252ampPelpSYUxZb1kvZnIvazVocXB0T2s9XFxcXFxcXCIpO1xcXFxuICAgIHJldHVybiAkLmV4cG9ydHM7XFxcXG59KSgpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIue8lui+keWFrOWRilxcXCIsXFxcInBhdGhcXFwiOlxcXCJkZXZJbmZvRWRpdFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwiZGV2SW5mb1xcXFxcXFwiLCcnKTsgLy/muIXpmaTljoblj7LlhazlkYpcXFxcbn0pKTtcXFxcbnNldFBhZ2VUaXRsZSgn57yW6L6R5YWs5ZGKJyk7XFxcXG4vLyBsZXQge25vd0p4LE15SmlleGksanhzUm91dGV9ID0gTVlfUEFSQU1TO1xcXFxuY29uc3Qge2NvbG9yLHNtYWxsLGFwaSwgZ2V0RmlsZSxnZXRBcGl9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXFxcXFwiKTtcXFxcbi8vIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXFxcbnZhciBkZXZfaW5mb191cmwgPSBnZXRBcGkoJ2luZm9HZXRVcmwnKTtcXFxcbi8vIGxvZyhkZXZfaW5mb191cmwpO1xcXFxudmFyIGdldF9pbmZvID0gZnVuY3Rpb24ocXEpe1xcXFxuICAgIHFxID0gcXF8fCc0MzQ4NTcwMDUnO1xcXFxuICAgIGxldCBkZXZfaW5mb191cmwgPSBkZXZfaW5mb191cmwrcXE7XFxcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXFxcbiAgICBsZXQgZGV2X2luZm89YmFja19jb2RlLnJlc3VsdHx8YmFja19jb2RlLmRldGFpbDtcXFxcbiAgICByZXR1cm4gZGV2X2luZm87XFxcXG59O1xcXFxudmFyIGJlZm9yZV9yZWZyZXNoID0gZnVuY3Rpb24oKXtcXFxcbiAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcXFxcXCJkZXZfc2V0X2luZm9cXFxcXFxcIikuc3BsaXQoJyQkJyk7XFxcXG4gICAgbGV0IGRldl9pbmZvX3VybCA9IGRldl9zZXRfaW5mby5zbGljZSgtMSlbMF07XFxcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXFxcbiAgICBsZXQgZGV2X2luZm89YmFja19jb2RlLnJlc3VsdHx8YmFja19jb2RlLmRldGFpbDtcXFxcbiAgICBwdXRNeVZhcihcXFxcXFxcImRldkluZm9cXFxcXFxcIixkZXZfaW5mbyk7XFxcXG4gICAgcmV0dXJuIGRldl9pbmZvXFxcXG59O1xcXFxubGV0IGQgPSBbXTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6J+e8lui+keWFrOWRiicsXFxcXG4gICAgZGVzYzon5pSv5oyBbWTor63ms5Us54K55Ye76L+b5YWl5a2m5LmgTWTor63ms5VcXFxcXFxcXG7kv53lrZjlhazlkYrmjInpkq7lnKjmlofmnKzmoYbmnIDkuIvpnaInLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcXFxuICAgIHVybDonaHR0cHM6Ly93d3cucnVub29iLmNvbS9tYXJrZG93bi9tZC10dXRvcmlhbC5odG1sJ1xcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifov5Tlm54nLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzInLFxcXFxuICAgIHVybDokKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCgpPT57XFxcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuaWYoIWdldE15VmFyKCdkZXZJbmZvJykpe1xcXFxuICAgIGJlZm9yZV9yZWZyZXNoKCk7XFxcXG59XFxcXG5sZXQgZW1wdHkgPSAnaGlrZXI6Ly9lbXB0eSc7XFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOifpmIXop4jmn6XpmIUnLFxcXFxuICAgIGNvbF90eXBlOid0ZXh0XzInLFxcXFxuICAgIC8vIHVybDokKGdldE15VmFyKCdkZXZJbmZvJykpLmNvbmZpcm0oKVxcXFxuICAgIHVybDokKGVtcHR5KS5ydWxlKCgpPT57XFxcXG4gICAgICAgIHJlcXVpcmUoXFxcXFxcXCJodHRwczovL2dpdGxhYi5jb20vaGpkaG54L2hpa2VyLy0vcmF3L21haW4vanMvbWFya2VkLm1pbi5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICBsZXQgZGV2SW5mbz1cXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgIHRyeXtcXFxcbiAgICAgICAgICBkZXZJbmZvPW1hcmtlZC5wYXJzZShnZXRNeVZhcignZGV2SW5mbycpKTtcXFxcbiAgICAgICB9Y2F0Y2goZSl7fVxcXFxuICAgICAgICBzZXRSZXN1bHQoW1xcXFxuICAgICAgICAgICAge1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOmRldkluZm8sXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6J3JpY2hfdGV4dCcsXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIF0pO1xcXFxuICAgIH0pXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgZGVzYzogXFxcXFxcXCLlv6vmnaXnvJbovpHkvaDnmoTlhazlkYrlkKd+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignZGV2SW5mbycsICcnKXx8XFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6LTEsXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcXFxcXCJkZXZJbmZvXFxcXFxcXCIsaW5wdXQpJ1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuZC5wdXNoKHtcXFxcbiAgICB0aXRsZTpcXFxcXFxcIuS/neWtmOWFrOWRilxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxcXG4gICAgdXJsOiQoJ+ehruiupOS/neWtmOWFrOWRiuWQl++8n+WwhuS8muS4jumBk+mVv+S7k+W6k+acjeWKoeWZqOmAmuiurycpLmNvbmZpcm0oKCk9PntcXFxcbiAgICAgICAgbGV0IGRldl9zZXRfaW5mbyA9IGdldE15VmFyKFxcXFxcXFwiZGV2X3NldF9pbmZvXFxcXFxcXCIpLnNwbGl0KCckJCcpO1xcXFxuICAgICAgICBsZXQgaW5wdXRfdGV4dCA9IGdldE15VmFyKCdkZXZJbmZvJywgJycpO1xcXFxuICAgICAgICBpZihpbnB1dF90ZXh0Lmxlbmd0aCA+PSA0KXtcXFxcbiAgICAgICAgICAgIGxldCBpbmZvX3NldF91cmw9IGRldl9zZXRfaW5mb1syXTtcXFxcbiAgICAgICAgICAgIGxldCBzZW5kX2RhdGEgPSB7XFxcXFxcXCJwYXJhbXNcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAge1xcXFxcXFwiZGF0YVxcXFxcXFwiOiB7XFxcXFxcXCJpbmZvXFxcXFxcXCI6IGlucHV0X3RleHR9LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IGRldl9zZXRfaW5mb1swXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXFwicGFzc3dvcmRcXFxcXFxcIjogZGV2X3NldF9pbmZvWzFdfVxcXFxuICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgIC8vIGxvZyhzZW5kX2RhdGEpO1xcXFxuICAgICAgICAgICAgbGV0IHBhcjIgPSB7aGVhZGVyczp7J2NvbnRlbnQtdHlwZSc6J2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsJ1VzZXItQWdlbnQnOmRldl9zZXRfaW5mb1szXX0sYm9keTpKU09OLnN0cmluZ2lmeShzZW5kX2RhdGEpLG1ldGhvZDonUE9TVCd9O1xcXFxuICAgICAgICAgICAgLy8gcGFyMiA9IEpTT04uc3RyaW5naWZ5KHBhcjIpOyAvL3g16YeM6Z2i6K+35rGC5omN6ZyA6KaB57yW56CBXFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX3JldCA9IHJlcXVlc3QoaW5mb19zZXRfdXJsLCBwYXIyKTtcXFxcbiAgICAgICAgICAgICAgICBiYWNrX3JldCA9IEpTT04ucGFyc2UoYmFja19yZXQpLnJlc3VsdDtcXFxcbiAgICAgICAgICAgICAgICBpZihiYWNrX3JldC5zdGF0dXM9PT0wKXtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S/neWtmOaIkOWKn1xcXFxcXFxcbicrYmFja19yZXQuZGV0YWlsO1xcXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5aSx6LSlXFxcXFxcXFxuJytiYWNrX3JldC5kZXRhaWw7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr1xcXFxcXFxcbicrZS5tZXNzYWdlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9ZWxzZXtcXFxcbiAgICAgICAgICAgIGNvbmZpcm0oe3RpdGxlOifpgZPplb/mj5DnpLonLGNvbnRlbnQ6J+iZveeEtuS9oOW+iOaHku+8jOS9huaYr+WFrOWRiuiHs+WwkeWGmTTkuKrlrZflkKfvvIEnfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KVxcXFxufSk7XFxcXG5cXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLpooTlpITnkIbkvp3otZbmlofku7ZcXFwiLFxcXCJwYXRoXFxcIjpcXFwibGlic1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJpZihnZXRBcHBWZXJzaW9uKCk+PTMyMDApe1xcXFxuICAgIHRyeXtcXFxcbiAgICAgICAgcmMoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2pzLyRoaWtlci5qc1xcXFxcXFwiLCAtMSk7XFxcXG4gICAgICAgIC8vJC5zZXRSb290KCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3B1YmxpYy9oaWtlci9oaWtlci9naXQvZmlsZXMvbWFzdGVyL2pzLycpO1xcXFxuICAgICAgICAkLnNldFJvb3QoKTtcXFxcbiAgICAgICAgJC5zZXRMaWIoe1xcXFxuICAgICAgICAgICAgbHNnOiBcXFxcXFxcImxzZy5qc1xcXFxcXFwiLCAvL+acrOWcsOWCqOWtmFxcXFxuICAgICAgICAgICAgZmlsZTogXFxcXFxcXCJmaWxlLmpzXFxcXFxcXCIsIC8v5paH5Lu2b3NcXFxcbiAgICAgICAgICAgIGZpbGVTZWxlY3Q6IFxcXFxcXFwiZmlsZVNlbGVjdC5qc1xcXFxcXFwiLCAvL+aWh+S7tumAieaLqeWZqFxcXFxuICAgICAgICAgICAgZHQ6IFxcXFxcXFwiZHQuanNcXFxcXFxcIiwgLy/liqjmgIHliIbnsbtcXFxcbiAgICAgICAgICAgIGRyOiBcXFxcXFxcImRyLmpzXFxcXFxcXCIsIC8vZHLmqKHmnb/kvp3otZZcXFxcbiAgICAgICAgICAgIGRycHJlOiBcXFxcXFxcImRycHJlLmpzXFxcXFxcXCIsIC8vZHLmqKHmnb/pooTlpITnkIZcXFxcbiAgICAgICAgICAgIGRydXA6IFxcXFxcXFwiZHJ1cC5qc1xcXFxcXFwiLCAvL2Ry5qih5p2/6Ieq5Yqo5pu05pawXFxcXG4gICAgICAgICAgICBkcm1hdGNoOiBcXFxcXFxcImRybWF0Y2guanNcXFxcXFxcIiwgLy9kcuaooeadv+iHquWKqOaooeadv+WMuemFjVxcXFxuICAgICAgICAgICAgZHJtOiBcXFxcXFxcImRybS5qc1xcXFxcXFwiLCAvL2Ry5qih5p2/5bCP56iL5bqPXFxcXG4gICAgICAgICAgICBjbXM6IFxcXFxcXFwiY21zLmpzXFxcXFxcXCIsIC8vY21z5qih5p2/5L6d6LWWXFxcXG4gICAgICAgICAgICBjbXNwcmU6IFxcXFxcXFwiY21zcHJlLmpzXFxcXFxcXCIsIC8vY21z6aKE5aSE55CGXFxcXG4gICAgICAgICAgICBjbXNtOiBcXFxcXFxcImNtc20uanNcXFxcXFxcIiwgLy9jbXPmqKHmnb/lsI/nqIvluo9cXFxcbiAgICAgICAgICAgIGxpYmNoZWNrOiBcXFxcXFxcImxpYmNoZWNrLmpzXFxcXFxcXCIsIC8vZHLmo4DmtYvkvp3otZZcXFxcbiAgICAgICAgICAgIHJ1bGVFZGl0b3I6IFxcXFxcXFwicnVsZUVkaXRvci5qc1xcXFxcXFwiLCAvL+WGmemhtea6kOelnuWZqOWwj+eoi+W6j1xcXFxuICAgICAgICAgICAgaG91c2VMYXp5OiBcXFxcXFxcImhvdXNlTGF6eS5qc1xcXFxcXFwiLCAvL+S7k+W6k+mAmuWFjVxcXFxuICAgICAgICAgICAgbGF6eTogXFxcXFxcXCJsYXp5LmpzXFxcXFxcXCIsIC8v6aaZ5YWNXFxcXG4gICAgICAgICAgICBzdWI6IFxcXFxcXFwic3ViLmpzXFxcXFxcXCIsIC8v6YGT5b6357uP6K6i6ZiFXFxcXG4gICAgICAgICAgICBoaWtlclVpOiBcXFxcXFxcImhpa2VyVWkuanNcXFxcXFxcIiwgLy/mtbfpmJTnu4Tku7bkvp3otZZcXFxcbiAgICAgICAgICAgIGhpa2VyTGliczogXFxcXFxcXCJoaWtlckxpYnMuanNcXFxcXFxcIiwgLy/mtbfpmJTlhajog73kvp3otZZcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfWNhdGNoKGUpe1xcXFxuICAgICAgICAvL3RvYXN0KCfor7flsJ3or5Xngrnlh7vku5PlupPkuLvpobXnmoTljYfnuqfku5PlupPml4HovrnnmoTmjInpkq7ljYfnuqck5omp5bGV77yM5ZCm5YiZ5p+Q5Lqb5Yqf6IO95LiN6IO95q2j5bi45L2/55SoJyk7XFxcXG4gICAgICAgIGNvbmZpcm0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfmj5DnpLot54K55Ye756Gu5a6a5Y+v5Lul5a+85YWlJyxcXFxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICfor7flsJ3or5Xngrnlh7vku5PlupPkuLvpobXnmoTljYfnuqfku5PlupPml4HovrnnmoTmjInpkq7ljYfnuqck5omp5bGV77yM5ZCm5YiZ5p+Q5Lqb5Yqf6IO95LiN6IO95q2j5bi45L2/55SoJyxcXFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKCk9PntcXFxcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2V0QXBpfSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVIZWFkID0gJ+a1t+mYlOinhueVjO+8jOe9kemhteaPkuS7tu+/pWpzX3VybO+/pSRoaWtlckAnO1xcXFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBnZXRBcGkoJ2ltcG9ydFVybCcpK1xcXFxcXFwiNTExMVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRVcmwgPSAncnVsZTovLycrYmFzZTY0RW5jb2RlKHJ1bGVIZWFkK3VybCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKCk9PntcXFxcblxcXFxuICAgICAgICAgICAgfSksXFxcXG4gICAgICAgIH0pXFxcXG4gICAgfVxcXFxufVxcXCJ9XVwiLFwicHJveHlcIjpcIlwifSIsInBpY1VybCI6Imh0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9vdGhlci8zMC5zdmciLCJ0aXRsZSI6IuOAjOmBk+mVv+S7k+W6k1Byb+OAjSJ9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement