xiaomianao666

邀您一起看:南来北往

Feb 23rd, 2024
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥南来北往@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWkuOWFi+WIl+ihqEFQSVwiLFwicGF0aFwiOlwiUXVhcmtTaGFyZUFwaVwiLFwicnVsZVwiOlwianM6XFxuLy9AYXV0aG9yIExveURnSWtcXG5sZXQgaHR0cFJlcXVlc3QgPSAkLnJlcXVpcmUoXFxcImh0dHBSZXF1ZXN0XFxcIik7XFxuY29uc3QgYmFzZVVybCA9IFxcXCJodHRwczovL3Bhbi5xdWFyay5jblxcXCI7XFxuXFxuZnVuY3Rpb24gUXVhcmtTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCkge1xcbiAgICB0aGlzLnNoYXJlSWQgPSBzaGFyZUlkO1xcbiAgICB0aGlzLnNoYXJlUHdkID0gc2hhcmVQd2Q7XFxuICAgIHRoaXMucmVmcmVzaENhbGxCYWNrID0gKCgpID0+IHZvaWQgMCk7XFxuICAgIC8vdGhpcy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbiB8fCB0aGlzLmdldFNoYXJlVG9rZW4oKTtcXG59XFxuT2JqZWN0LmFzc2lnbihRdWFya1NoYXJlQXBpLnByb3RvdHlwZSwge1xcbiAgICBzZXRSZWZyZXNoKHJlZnJlc2hDYWxsQmFjaykge1xcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2sgPSByZWZyZXNoQ2FsbEJhY2s7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0VG9rZW4oc2hhcmVUb2tlbikge1xcbiAgICAgICAgdGhpcy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbjtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICByZXF1ZXN0SHR0cChhcGkpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QoYmFzZVVybCthcGkpLnN1Y2Nlc3MoKGJvZHkpID0+IHtcXG4gICAgICAgICAgICBpZiAoYm9keS5zdGF0dXMgIT09IDIwMCkge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgZ2V0VG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICB9LFxcblxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVxdWVzdEh0dHAoXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL3Rva2VuXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcInB3ZF9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwicGFzc2NvZGVcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSkuYm9keVRvU3RyaW5nKHRydWUpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuZGF0YS5zdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayhyZXN1bHQuZGF0YS5zdG9rZW4sIHRoaXMpO1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVUb2tlbjtcXG4gICAgfSxcXG4gICAgZ2V0TGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGV0YWlsP3ByPXVjcHJvJmZyPXBjXFxcIikuYnVpbGRVcmwoe1xcbiAgICAgICAgICAgIHB3ZF9pZDogdGhpcy5zaGFyZUlkIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0VG9rZW4oKSB8fCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgcGRpcl9maWQ6IGZpbGVJZCB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICBmb3JjZTogMCxcXG4gICAgICAgICAgICBfcGFnZTogcGFnZSxcXG4gICAgICAgICAgICBfc2l6ZTogNTAsXFxuICAgICAgICAgICAgX2ZldGNoX2Jhbm5lcjogMSxcXG4gICAgICAgICAgICBfZmV0Y2hfc2hhcmU6IDEsXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcbiAgICAgICAgICAgIF9zb3J0OiBcXFwiZmlsZV90eXBlOmFzYyxcXFwiICsgb3JkZXJCeVxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGVyciwgcmVzLCBodHRwKSA9PiB7XFxuICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0b2tlbicpKSB7XFxuICAgICAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgICAgICBidWlsZFVybDoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0U2hhcmVUb2tlbigpfHxcXFwiXFxcIilcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IFF1YXJrU2hhcmVBcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJodHRwUmVxdWVzdFwiLFwicGF0aFwiOlwiaHR0cFJlcXVlc3RcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcbiAgICB0aGlzLnVybCA9IHVybDtcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcbiAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgfSk7XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge3Rocm93IGVycn07XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IChlcnIsIHJlcywgdHJ5UmVzdGFydCkgPT4gZmFsc2U7XFxuICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gKGJvZHksIHN0YXR1c0NvZGUsIGhlYWRlcnMpID0+IGJvZHk7XFxuICAgIHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2sgPSAoZXJyLCByZXMpID0+IGVycjtcXG4gICAgdGhpcy5zdGFydFJlcXVlc3QgPSBmZXRjaDtcXG4gICAgdGhpcy5fYm9keVRvU3RyaW5nID0gZmFsc2U7XFxuICAgIHRoaXMuYnVpbGRQYXJhbSA9IHZvaWQoMCk7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XFxuICAgIGJvZHlUb1N0cmluZyhmbGFnKSB7XFxuICAgICAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSAhIWZsYWc7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgYm9keShib2R5KSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuYm9keSA9IGJvZHkgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGJ1aWxkVXJsKGJ1aWxkUGFyYW0pIHtcXG4gICAgICAgIHRoaXMuYnVpbGRQYXJhbSA9IGJ1aWxkUGFyYW0gfHwge307XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0U3RhcnRSZXF1ZXN0RnVuYyhmdW5jKSB7XFxuICAgICAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZ1bmM7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgaGVhZGVycyhoZWFkZXJzKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JUeXBlQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgcmV0cnlDb3VudCA9PT0gXFxcImZ1bmN0aW9uXFxcIiAmJiB0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9PT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gcmV0cnlDb3VudDtcXG4gICAgICAgICAgICByZXRyeUNvdW50ID0gMTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSAhPT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gTnVtYmVyKHJldHJ5Q291bnQpO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gZXJyb3JDYWxsYmFja1dpdGhSZXRyeTtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBzdGFydCh0b0pzb24pIHtcXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFwib2JqZWN0XFxcIiAmJiB0aGlzLl9ib2R5VG9TdHJpbmcpIHtcXG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UodGhpcy5zdGFydFJlcXVlc3QodGhpcy5idWlsZFBhcmFtP2J1aWxkVXJsKHRoaXMudXJsLCB0aGlzLmJ1aWxkUGFyYW0pOnRoaXMudXJsLCBvcHRpb25zKSk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPD0gMzAwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XFxuICAgICAgICAgICAgICAgIGlmICh0b0pzb24pIHtcXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3NDYWxsYmFjayhib2R5LCByZXMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihTdHJpbmcocmVzLnN0YXR1c0NvZGUpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBlcnIgPSB0aGlzLmVycm9yVHlwZUNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0aGlzLnJldHJ5Q291bnQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRyeVJlc3VsdCA9IHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeShlcnIsIHJlcywgdGhpcyk7XFxuICAgICAgICAgICAgICAgIGlmICh0cnlSZXN1bHQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudC0tO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodG9Kc29uKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XFxuICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIG1lcmdlSGVhZEFuZEJvZHkob3B0aW9ucykge1xcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5oZWFkZXJzfHx7fSwgb3B0aW9ucy5oZWFkZXJzKTtcXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuYm9keXx8e30sIG9wdGlvbnMuYm9keSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYnVpbGRVcmwgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmJ1aWxkUGFyYW18fHt9LCBvcHRpb25zLmJ1aWxkVXJsKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9XFxufSk7XFxuXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdCwge1xcbiAgICBmZXRjaCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKTtcXG4gICAgfSxcXG4gICAgcG9zdCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpO1xcbiAgICB9LFxcbiAgICByZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocmVxdWVzdCk7XFxuICAgIH0sXFxuICAgIHBvc3RSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdFJlcXVlc3QpO1xcbiAgICB9LFxcbiAgICBmZXRjaENvb2tpZSh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKGZldGNoQ29va2llKTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IGh0dHBSZXF1ZXN0O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aS45YWL5YiX6KGoXCIsXCJwYXRoXCI6XCJxdWFya0xpc3RcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiKSk7XFxuYWRkTGlzdGVuZXIoXFxcIm9uUmVmcmVzaFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIpKTtcXG5sZXQgc29VcmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJlYWx1cmxcXFwiLCBcXFwiXFxcIikpO1xcbmxldCByZWFsdXJsID0gc29Vcmwuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG5cXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFwiI1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgZ2V0UGFyYW0oXFxcInBhc3Njb2RlXFxcIiwgXFxcIlxcXCIsIHNvVXJsKSB8fCBcXFwiXFxcIik7XFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFwic2hhcmVUb2tlblxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXCJcXFwiKTtcXG5cXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXG5cXG5sZXQgc29ydCA9IHtcXG4gICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJmaWxlX25hbWU6YXNjXFxcIixcXG4gICAgXFxcIuWQjeensOWAkuW6j1xcXCI6IFxcXCJmaWxlX25hbWU6ZGVzY1xcXCIsXFxuICAgIFxcXCLml7bpl7TmraPluo9cXFwiOiBcXFwidXBkYXRlZF9hdDphc2NcXFwiLFxcbiAgICBcXFwi5pe26Ze05YCS5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXCJcXG59O1xcbmxldCBzdHlsZXMgPSBbXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiXTtcXG5cXG5sZXQgc29ydFZhbHVlID0gc29ydFtnZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgXFxcIuWQjeensOato+W6j1xcXCIpXTtcXG5sZXQgc3R5bGUgPSBnZXRJdGVtKFxcXCJzdHlsZVxcXCIsIHN0eWxlc1swXSk7XFxuaWYgKE1ZX1BBR0UgPT0gMSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHN0eWxlLFxcbiAgICAgICAgdXJsOiAkKHN0eWxlcywgMSwgJ+ivt+mAieaLqScpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbSgnc3R5bGUnLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX2ljb24uc3ZnXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBnZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgXFxcIuWQjeensOato+W6j1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKE9iamVjdC5rZXlzKHNvcnQpLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgaW5wdXQpXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX3NvcnQuc3ZnXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBnZXRJdGVtKFxcXCJxdWFya19wbGF5TW9kZVxcXCIsIFxcXCLovaznoIFcXFwiKSxcXG4gICAgICAgIHVybDogJChbXFxcIui9rOeggVxcXCIsIFxcXCLljp/nlLtcXFwiXSwgMiwgXFxcIuaSreaUvuaooeW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtfcGxheU1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX3BsYXkuc3ZnXFxcIixcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWKn+iDvVxcXCIsXFxuICAgICAgICB1cmw6ICQoW1xcXCLot7PovazlpLjlhYtBUFBcXFwiLCBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIiwgXFxcIueZu+W9lei0puWPt1xcXCIsIFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiXSwgMikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIui3s+i9rOWkuOWFi0FQUFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJxa2xpbms6Ly93d3cudWMuY24vYjIwYjg0ZmQ3MzVhOGRkM2Y3NTQxMTI5YmFjYzRlOWE/YWN0aW9uPW9wZW5fdXJsJnVybD1odHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXCIgKyBzaGFyZUlkO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnmbvlvZXotKblj7dcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImFjY291bnRcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Y6f55S75LiL6L2957q/56iLXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFxcXCIxMFxcXCIpLCBcXFwi6K+36L6T5YWlMy0zMuS5i+mXtOeahOaVtOaVsFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGVlZFRocmVhZCA9IHBhcnNlSW50KGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGVlZFRocmVhZCA8IDMgfHwgc3BlZWRUaHJlYWQgPiAzMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7kuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLCBTdHJpbmcoc3BlZWRUaHJlYWQpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgYnVpbGRVcmwoXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuL3MvXFxcIiArIHNoYXJlSWQsIHtcXG4gICAgICAgICAgICAgICAgICAgIHBhc3Njb2RlOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBzaGFyZUlkLCBzaGFyZVB3ZCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfZmlsZWludG8uc3ZnXFxcIixcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2xpbmVfYmxhbmsnXFxuICAgIH0pO1xcbn1cXG5cXG5cXG5sZXQgUXVhcmtTaGFyZUFwaSA9ICQucmVxdWlyZShcXFwiUXVhcmtTaGFyZUFwaVxcXCIpO1xcbmxldCBxdWFya1NoYXJlQXBpID0gbmV3IFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpLnNldFRva2VuKHNoYXJlVG9rZW4pLnNldFJlZnJlc2goKHNoYXJlVG9rZW4pID0+IHtcXG4gICAgTVlfUEFSQU1TLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxufSk7XFxuXFxuZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplKSB7XFxuICAgIGlmICghc2l6ZSkge1xcbiAgICAgICAgcmV0dXJuICcnO1xcbiAgICB9XFxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxuICAgIGxldCBpID0gMDtcXG4gICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcbiAgICAgICAgc2l6ZSAvPSAxMDI0O1xcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcbn1cXG5cXG5sZXQgc3ViRXh0cyA9IFtcXFwidnR0XFxcIiwgXFxcInNydFxcXCIsIFxcXCJhc3NcXFwiXTtcXG5sZXQgdGl0bGVIZWFkID0ge1xcbiAgICB2aWRlbzogXFxcIvCfjqxcXFwiLFxcbiAgICBhdWRpbzogXFxcIvCfjrVcXFwiLFxcbiAgICBkb2M6IFxcXCLwn5ORXFxcIixcXG4gICAgaW1hZ2U6IFxcXCLwn5a8XFxcIixcXG4gICAgYXJjaGl2ZTogXFxcIvCfk6ZcXFwiLFxcbiAgICBcXFwiZGVmYXVsdFxcXCI6IFxcXCLinZNcXFwiXFxufTtcXG5cXG5mdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcbiAgICBsZXQgaGVhZCA9IHRpdGxlSGVhZFt0eXBlXTtcXG4gICAgLyppZiAoc3ViRXh0cy5pbmNsdWRlcyhleHQpKSB7XFxuICAgICAgICBoZWFkID0gXFxcIvCflbhcXFwiO1xcbiAgICB9Ki9cXG4gICAgcmV0dXJuIGhlYWQgfHwgXFxcIuKdk1xcXCI7XFxufVxcbnRyeSB7XFxuICAgIHZhciByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgLy/orr7nva7moIfpophcXG4gICAgc2V0UGFnZVRpdGxlKHJlcy5kYXRhLnNoYXJlLnRpdGxlKTtcXG4gICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgIWZpbGVJZCkge1xcbiAgICAgICAgcmVzID0gcXVhcmtTaGFyZUFwaS5nZXRMaXN0RmlsZShyZXMuZGF0YS5zaGFyZS5maXJzdF9maWQsIE1ZX1BBR0UsIHNvcnRWYWx1ZSk7XFxuICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcbiAgICAgICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcbiAgICB9XFxuICAgIGxpc3QuZm9yRWFjaChpdGVtID0+IHtcXG4gICAgICAgIC8v5Yik5pat5piv5ZCm5paH5Lu25aS5XFxuICAgICAgICBpZiAoaXRlbS5kaXIpIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIvCfk4JcXFwiICsgaXRlbS5maWxlX25hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgaXRlbS5pbmNsdWRlX2l0ZW1zICsgJ+mhuSAgJyxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvMjcuc3ZnXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9wYWdlPWZ5cGFnZVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlSWQsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogaXRlbS5maWQsXFxuICAgICAgICAgICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGdldEhlYWQoaXRlbS5vYmpfY2F0ZWdvcnkpICsgaXRlbS5maWxlX25hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgZm9ybWF0U2l6ZShpdGVtLnNpemUpLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdGVtLnRodW1ibmFpbCxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsQ2FjaGUgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwge30pO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXlVcmxDYWNoZVtmaWRdKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXlVcmxDYWNoZVtmaWRdO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJC5yZXF1aXJlKFxcXCJwbGF5XFxcIikuZ2V0UGxheVVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwgcGxheVVybENhY2hlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9LCBpdGVtLmZpZCwgaXRlbS5zaGFyZV9maWRfdG9rZW4sIHNoYXJlSWQsIHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSwgaXRlbS5vYmpfY2F0ZWdvcnkpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogaXRlbS5maWQsXFxuICAgICAgICAgICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiAncGxheWxpc3QgJyArIGl0ZW0ub2JqX2NhdGVnb3J5XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfVxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxuICAgICAgICB9KTtcXG4gICAgfSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGUubWVzc2FnZSxcXG4gICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXCLmj5Dlj5bnoIFcXFwiKSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIui+k+WFpeaPkOWPlueggVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IGlucHV0XFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcInBsYXlcIixcInBhdGhcIjpcInBsYXlcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IGNvb2tpZSA9IGdldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFwiaHR0cFJlcXVlc3RcXFwiKTtcXG5cXG5mdW5jdGlvbiBDb29raWVNYW5hZ2UoY29va2llKSB7XFxuICAgIHRoaXMuY29va2llID0ge307XFxuICAgIHRoaXMuYWRkKGNvb2tpZSk7XFxufVxcbk9iamVjdC5hc3NpZ24oQ29va2llTWFuYWdlLnByb3RvdHlwZSwge1xcbiAgICBhZGQoY29va2llKSB7XFxuICAgICAgICBsZXQgY29va2llcyA9IFtdO1xcbiAgICAgICAgaWYgKHR5cGVvZiBjb29raWUgPT09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZS5zcGxpdChcXFwiO1xcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvb2tpZSkpIHtcXG4gICAgICAgICAgICBjb29raWVzID0gY29va2llO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29va2llcy5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgIHYgPSB2LnNwbGl0KFxcXCI9XFxcIik7XFxuICAgICAgICAgICAgaWYgKHYubGVuZ3RoIDwgMikgcmV0dXJuO1xcbiAgICAgICAgICAgIHRoaXMuY29va2llW3ZbMF0udHJpbSgpXSA9IHZbMV0udHJpbSgpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIGdldCgpIHtcXG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmNvb2tpZSkubWFwKHYgPT4gdlswXSArIFxcXCI9XFxcIiArIHZbMV0pLmpvaW4oXFxcIjtcXFwiKTtcXG4gICAgfVxcbn0pO1xcbmNvbnN0IGNvb2tpZU1hbmFnZSA9IG5ldyBDb29raWVNYW5hZ2UoY29va2llKTtcXG5cXG5mdW5jdGlvbiB3YWl0U2xlZXAodGltZSkge1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUgfHwgNjAwKTtcXG59XFxuXFxuZnVuY3Rpb24gcmVxdWVzdEh0dHAodXJsKSB7XFxuICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsKVxcbiAgICAgICAgLnN1Y2Nlc3MoKGJvZHksIHJlcykgPT4ge1xcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1cyAhPT0gMjAwKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBjb29raWVNYW5hZ2UuYWRkKHJlcy5oZWFkZXJzW1xcXCJzZXQtY29va2llXFxcIl0pO1xcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xcbiAgICAgICAgfSlcXG4gICAgICAgIC5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnBhcnNlKHJlcy5ib2R5KS5tZXNzYWdlKTtcXG4gICAgICAgIH0pXFxuICAgICAgICAuYm9keVRvU3RyaW5nKHRydWUpXFxuICAgICAgICAuaGVhZGVycyh7XFxuICAgICAgICAgICAgY29va2llOiBjb29raWVNYW5hZ2UuZ2V0KCksXFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgcXVhcmstY2xvdWQtZHJpdmUvMi41LjIwIENocm9tZS8xMDAuMC40ODk2LjE2MCBFbGVjdHJvbi8xOC4zLjUuNC1iNDc4NDkxMTAwIFNhZmFyaS81MzcuMzYgQ2hhbm5lbC9wY2trX290aGVyX2NoXFxcIixcXG4gICAgICAgICAgICBcXFwicmVmZXJlclxcXCI6IFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuL1xcXCJcXG4gICAgICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREcml2ZUluZm8oKSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jbi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL2Rpcj9wcj11Y3BybyZmcj1wYyZhdmVyPTFcXFwiKS5zdGFydCh0cnVlKTtcXG59XFxuXFxuZnVuY3Rpb24gY3JlYXRlU2F2ZVRhc2soZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuKSB7XFxuICAgIGxldCBkcml2ZUluZm8gPSBnZXREcml2ZUluZm8oKTtcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2Uvc2F2ZT9wcj11Y3BybyZmcj1wY1xcXCIpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuYm9keSh7XFxuICAgICAgICBcXFwiZmlkX2xpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcImZpZF90b2tlbl9saXN0XFxcIjogW1xcbiAgICAgICAgICAgIGZpZF90b2tlblxcbiAgICAgICAgXSxcXG4gICAgICAgIFxcXCJ0b19wZGlyX2ZpZFxcXCI6IGRyaXZlSW5mby5kYXRhLmRpci5maWQsXFxuICAgICAgICBcXFwicHdkX2lkXFxcIjogcHdkX2lkLFxcbiAgICAgICAgXFxcInN0b2tlblxcXCI6IHN0b2tlbixcXG4gICAgICAgIFxcXCJwZGlyX2ZpZFxcXCI6IGRyaXZlSW5mby5kYXRhLmRpci5wZGlyX2ZpZFxcbiAgICB9KS5zdGFydCh0cnVlKTtcXG59XFxuXFxuZnVuY3Rpb24gY3JlYXRlRGVsZXRlVGFzayhmaWQpIHtcXG4gICAgbGV0IGRyaXZlSW5mbyA9IGdldERyaXZlSW5mbygpO1xcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY24vMS9jbG91ZGRyaXZlL2ZpbGUvZGVsZXRlP3ByPXVjcHJvJmZyPXBjXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXG4gICAgICAgIFxcXCJhY3Rpb25fdHlwZVxcXCI6IDIsXFxuICAgICAgICBcXFwiZmlsZWxpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcImV4Y2x1ZGVfZmlkc1xcXCI6IFtdXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrKHRhc2tfaWQsIHJldHJ5X2luZGV4KSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jbi8xL2Nsb3VkZHJpdmUvdGFza1xcXCIpLmJ1aWxkVXJsKHtcXG4gICAgICAgIHByOiBcXFwidWNwcm9cXFwiLFxcbiAgICAgICAgZnI6IFxcXCJwY1xcXCIsXFxuICAgICAgICB0YXNrX2lkOiB0YXNrX2lkLFxcbiAgICAgICAgcmV0cnlfaW5kZXg6IHJldHJ5X2luZGV4XFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBxdWVyeVRhc2sodGFza19pZCkge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGEuc2F2ZV9hcy5zYXZlX2FzX3RvcF9maWRzWzBdO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3YWl0U2xlZXAoMzAwKihpKzEpKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgIH1cXG4gICAgcmV0dXJuIHZvaWQoMCk7XFxufVxcblxcbmZ1bmN0aW9uIHF1ZXJ5VGFza1N0YXR1cyh0YXNrX2lkKSB7XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCByZXMgPSB0YXNrKHRhc2tfaWQsIGkgKyBcXFwiXFxcIik7XFxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnN0YXR1cyA9PT0gMikge1xcbiAgICAgICAgICAgICAgICB3YWl0U2xlZXAoMTAwMCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3YWl0U2xlZXAoMzAwKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgIH1cXG4gICAgcmV0dXJuIGZhbHNlO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRQcmV2aWV3VmlkZW8oZmlkKSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jbi8xL2Nsb3VkZHJpdmUvZmlsZS92Mi9wbGF5P3ByPXVjcHJvJmZyPXBjXFxcIikuYm9keSh7XFxuICAgICAgICBcXFwiZmlkXFxcIjogZmlkLFxcbiAgICAgICAgXFxcInJlc29sdXRpb25zXFxcIjogXFxcIm5vcm1hbCxsb3csaGlnaCxzdXBlciwyayw0a1xcXCIsXFxuICAgICAgICBcXFwic3VwcG9ydHNcXFwiOiBcXFwiZm1wNCxtM3U4XFxcIlxcbiAgICB9KS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREb3dubG9hZFVybChmaWQpIHtcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9maWxlL2Rvd25sb2FkP3ByPXVjcHJvJmZyPXBjXFxcIikuYm9keSh7XFxuICAgICAgICBcXFwiZmlkc1xcXCI6IFtmaWRdXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSkge1xcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKCFjb29raWUpIHJldHVybiBcXFwidG9hc3Q6Ly/or7fnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgbGV0IHRhc2tJZCA9IGNyZWF0ZVNhdmVUYXNrKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbikuZGF0YS50YXNrX2lkO1xcbiAgICAgICAgbGV0IGFzZmlkID0gcXVlcnlUYXNrKHRhc2tJZCk7XFxuICAgICAgICBpZiAoIWFzZmlkKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0pVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcGxheUNvb2tpZSA9IGNvb2tpZU1hbmFnZS5nZXQoKTtcXG4gICAgICAgIGxldCBwbGF5SGVhZGVyID0ge1xcbiAgICAgICAgICAgIFJlZmVyZXI6IFxcXCJodHRwOi8vcGFuLnF1YXJrLmNuL1xcXCIsXFxuICAgICAgICAgICAgY29va2llOiBwbGF5Q29va2llLFxcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcImNvbS5zdHViLlN0dWJBcHAvMS4zLjAgKExpbnV4O0FuZHJvaWQgMTQpIEFuZHJvaWRYTWVkaWEzLzEuMS4xXFxcIlxcbiAgICAgICAgfTtcXG4gICAgICAgIGlmIChjYXRlZ29yeSA9PSBcXFwidmlkZW9cXFwiKSB7XFxuICAgICAgICAgICAgbGV0IHBsYXlNb2RlID0gZ2V0SXRlbShcXFwicXVhcmtfcGxheU1vZGVcXFwiLCBcXFwi6L2s56CBXFxcIik7XFxuICAgICAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFwi6L2s56CBXFxcIikge1xcbiAgICAgICAgICAgICAgICBsZXQgdmlkZW9SZXMgPSBnZXRQcmV2aWV3VmlkZW8oYXNmaWQpO1xcbiAgICAgICAgICAgICAgICBsZXQgdmlkZW9MaXN0ID0gdmlkZW9SZXMuZGF0YS52aWRlb19saXN0O1xcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxuICAgICAgICAgICAgICAgICAgICBuYW1lczogW10sXFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbXSxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtdXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgIHZpZGVvTGlzdC5maWx0ZXIodiA9PiB2LmFjY2Vzc2FibGUpLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC5uYW1lcy5wdXNoKHYucmVzb2x1dGlvbik7XFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC51cmxzLnB1c2godi52aWRlb19pbmZvLnVybCArIFxcXCIjaXNWaWRlbz10cnVlI1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgcGxheUxpc3QuaGVhZGVycy5wdXNoKHBsYXlIZWFkZXIpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBnZXREb3dubG9hZFVybChhc2ZpZCkuZGF0YVswXS5kb3dubG9hZF91cmw7XFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbXFxcIuWOn+eUu1xcXCJdLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW3BsYXlVcmwgKyBcXFwiI2lzVmlkZW89dHJ1ZSMjZmFzdFBsYXlNb2RlIyN0aHJlYWRzPVxcXCIgKyBnZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFxcXCIxMFxcXCIpICsgXFxcIiNcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtwbGF5SGVhZGVyXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNyZWF0ZURlbGV0ZVRhc2soYXNmaWQpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheUxpc3QpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBnZXREb3dubG9hZFVybChhc2ZpZCkuZGF0YVswXS5kb3dubG9hZF91cmw7XFxuICAgICAgICAgICAgY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCk7XFxuICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09PSAnYXVkaW8nKSB7XFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbXFxcIumfs+mikVxcXCJdLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW3BsYXlVcmwgKyBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtwbGF5SGVhZGVyXSxcXG4gICAgICAgICAgICAgICAgICAgIGx5cmljOiBcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PT0gJ2ltYWdlJykge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChwbGF5VXJsLCBwbGF5SGVhZGVyKS5pbWFnZSgpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHBsYXlIZWFkZXIgPSBPYmplY3Qua2V5cyhwbGF5SGVhZGVyKS5tYXAoa2V5ID0+IGtleSArIFxcXCJAXFxcIiArIFN0cmluZyhwbGF5SGVhZGVyW2tleV0pLnJlcGxhY2UoLzsvZywgXFxcIu+8m++8m1xcXCIpKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJkb3dubG9hZDovL1xcXCIgKyBwbGF5VXJsICsgXFxcIjt7XFxcIiArIHBsYXlIZWFkZXIuam9pbihcXFwiJiZcXFwiKSArIFxcXCJ9XFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcInJlcXVpcmUgbG9naW5cXFwiKSkge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmnKrnmbvlvZXmiJbnmbvlvZXov4fmnJ/vvIzor7fph43mlrDnmbvlvZVcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpblxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGUudG9TdHJpbmcoKTtcXG4gICAgfVxcbn1cXG5cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGdldFBsYXlVcmxcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi55m75b2V6LSm5Y+3XCIsXCJwYXRoXCI6XCJsb2dpblwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIueZu+W9leWkuOWFi+i0puWPt1xcXCIpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc56Gu6K6k55m75b2V4oCd4oCdXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCBjbSA9IGFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcXG4gICAgICAgIGxldCBjb29raWUgPSBTdHJpbmcoY20uZ2V0Q29va2llKFxcXCJodHRwczovL3Bhbi5xdWFyay5jblxcXCIpIHx8IFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGNvb2tpZSkpIHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIGNvb2tpZSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXCI7XFxuICAgIH0pLFxcbiAgICBkZXNjOlxcXCLigJzigJzigJ3igJ08c21hbGw+54K55Ye75aS05YOP5Y+v5Lul6YCA5Ye66LSm5Y+36YeN5paw55m75b2VPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJ4NV93ZWJ2aWV3X3NpbmdsZVxcXCIsXFxuICAgIHVybDogXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuL1xcXCIsXFxuICAgIGRlc2M6IFxcXCJsaXN0JiZzY3JlZW4tMTUwXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVhOiBQQ19VQSxcXG4gICAgICAgIGpzTG9hZGluZ0luamVjdDogZmFsc2VcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChkKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5bel5YW3XCIsXCJwYXRoXCI6XCJ0b29sXCIsXCJydWxlXCI6XCJqczpcXG5cXG4kLmV4cG9ydHM9e1xcbiAgICBpc0xvZ2luQ29va2llKGNvb2tpZSl7XFxuICAgICAgICByZXR1cm4gISEoY29va2llICYmIGNvb2tpZS5pbmNsdWRlcyhcXFwiX1VQX0Y3RV84RF89XFxcIikgJiYgY29va2llLmluY2x1ZGVzKFxcXCJfX3VpZD1cXFwiKSAmJiBjb29raWUuaW5jbHVkZXMoXFxcIl9fcHV1cz1cXFwiKSk7XFxuICAgIH1cXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Liq5Lq66LSm5Y+36K6+572uXCIsXCJwYXRoXCI6XCJhY2NvdW50XCIsXCJydWxlXCI6XCIkLmV4cG9ydHMgPSAkKFtcXFwiQ29va2ll55m75b2VXFxcIiwgXFxcIue9kemhteeZu+W9lVxcXCIsIFxcXCLojrflj5ZQR+acrOWcsOWFseS6q0Nvb2tpZVxcXCIsIFxcXCLlpI3liLZDb29raWVcXFwiLCBcXFwi5riF6ZmkQ29va2llXFxcIl0pLnNlbGVjdCgoaXNyKSA9PiB7XFxuICAgIGlmIChpbnB1dCA9PT0gXFxcIue9kemhteeZu+W9lVxcXCIpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luXFxcIjtcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIkNvb2tpZeeZu+W9lVxcXCIpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWlQ29va2llXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIGlucHV0LnJlcGxhY2UoL1xcXFxzL2csIFxcXCJcXFwiKSk7XFxuICAgICAgICAgICAgICAgIGlzciYmcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0Nvb2tpZeagvOW8j+mUmeivr1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgaXNyKTtcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuiOt+WPllBH5pys5Zyw5YWx5LqrQ29va2llXFxcIikge1xcbiAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvVFYvLnF1YXJrX3VzZXJcXFwiKSkge1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaChcXFwiZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvVFYvLnF1YXJrX3VzZXJcXFwiKSk7XFxuICAgICAgICAgICAgICAgIGxldCBjb29raWUgPSBqc29uLmNvb2tpZTtcXG4gICAgICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwidG9vbFxcXCIpLmlzTG9naW5Db29raWUoY29va2llKSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBjb29raWUpO1xcbiAgICAgICAgICAgICAgICAgICAgaXNyJiZyZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vQ29va2ll5qC85byP6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0peWFseS6q+aWh+S7tuaNn+Wdj1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gJChcXFwi5Li65qOA5rWL5YiwVFZCT1jnmoRQR+acrOWcsOWMheeahOWFseS6q0Nvb2tpZVxcXFxu6K+35L2/55So6L+H5ZCO5YaN5bCd6K+VXFxcIikuY29uZmlybSgoKSA9PiB7fSk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZihpbnB1dD09PVxcXCLlpI3liLZDb29raWVcXFwiKXtcXG4gICAgICAgIGxldCBjb29raWUgPSBnZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmIChjb29raWUpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgY29va2llO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq55m75b2VXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfWVsc2V7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcInF1YXJrQ29va2llXFxcIik7XFxuICAgIH1cXG59LCAkLmltcG9ydFBhcmFtKTtcIn1dLFwicGFyYW1zXCI6XCJ7XFxcImZpbGVJZFxcXCI6XFxcIjBlNjZmMDMxNzA3NzRiMWZhMjQ4ZGQ4N2YyMDEzNDQzXFxcIixcXFwiaW5oZXJpdFRpdGxlXFxcIjpmYWxzZSxcXFwic2hhcmVJZFxcXCI6XFxcIjFmODlhNjIwODJjNFxcXCIsXFxcInNoYXJlUHdkXFxcIjpcXFwiXFxcIixcXFwic2hhcmVUb2tlblxcXCI6XFxcIm5pVndHUXlsN2hObEErVG4zazlKb254MVVBTEFhamVMSGNKZHpmWFp1aWs9XFxcIn1cIixcInNhdmVkXCI6ZmFsc2UsXCJ0aXRsZVwiOlwiUXVhcmsu566AXCIsXCJ2ZXJzaW9uXCI6MCxcInVybFwiOlwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9wYWdlPWZ5cGFnZVwiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIpKTtcXG5hZGRMaXN0ZW5lcihcXFwib25SZWZyZXNoXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFwicGxheVVybENhY2hlXFxcIikpO1xcbmxldCBzb1VybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicmVhbHVybFxcXCIsIFxcXCJcXFwiKSk7XFxubGV0IHJlYWx1cmwgPSBzb1VybC5zcGxpdChcXFwiP1xcXCIpWzBdO1xcbmxldCB1cmxEYXRhID0gcmVhbHVybC5zcGxpdChcXFwiL1xcXCIpO1xcblxcbmxldCBzaGFyZUlkID0gTVlfUEFSQU1TLnNoYXJlSWQgfHwgdXJsRGF0YVs0XS5yZXBsYWNlKFxcXCIjXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBzaGFyZVB3ZCA9IGdldFBhcmFtKFxcXCJzaGFyZVB3ZFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVB3ZCB8fCBnZXRQYXJhbShcXFwicGFzc2NvZGVcXFwiLCBcXFwiXFxcIiwgc29VcmwpIHx8IFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVUb2tlbiA9IGdldFBhcmFtKFxcXCJzaGFyZVRva2VuXFxcIiwgTVlfUEFSQU1TLnNoYXJlVG9rZW4gfHwgXFxcIlxcXCIpO1xcblxcbmxldCBmaWxlSWQgPSBNWV9QQVJBTVMuZmlsZUlkO1xcblxcbmxldCBzb3J0ID0ge1xcbiAgICBcXFwi5ZCN56ew5q2j5bqPXFxcIjogXFxcImZpbGVfbmFtZTphc2NcXFwiLFxcbiAgICBcXFwi5ZCN56ew5YCS5bqPXFxcIjogXFxcImZpbGVfbmFtZTpkZXNjXFxcIixcXG4gICAgXFxcIuaXtumXtOato+W6j1xcXCI6IFxcXCJ1cGRhdGVkX2F0OmFzY1xcXCIsXFxuICAgIFxcXCLml7bpl7TlgJLluo9cXFwiOiBcXFwidXBkYXRlZF9hdDpkZXNjXFxcIlxcbn07XFxubGV0IHN0eWxlcyA9IFtcXFwidGV4dF8xXFxcIiwgXFxcImF2YXRhclxcXCJdO1xcblxcbmxldCBzb3J0VmFsdWUgPSBzb3J0W2dldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBcXFwi5ZCN56ew5q2j5bqPXFxcIildO1xcbmxldCBzdHlsZSA9IGdldEl0ZW0oXFxcInN0eWxlXFxcIiwgc3R5bGVzWzBdKTtcXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogc3R5bGUsXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKCdzdHlsZScsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfaWNvbi5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBcXFwi5ZCN56ew5q2j5bqPXFxcIiksXFxuICAgICAgICB1cmw6ICQoT2JqZWN0LmtleXMoc29ydCksIDEsICfor7fpgInmi6knKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBpbnB1dClcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfc29ydC5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi6L2s56CBXFxcIiwgXFxcIuWOn+eUu1xcXCJdLCAyLCBcXFwi5pKt5pS+5qih5byPXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya19wbGF5TW9kZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfcGxheS5zdmdcXFwiLFxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Yqf6IO9XFxcIixcXG4gICAgICAgIHVybDogJChbXFxcIui3s+i9rOWkuOWFi0FQUFxcXCIsIFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFwiLCBcXFwi55m75b2V6LSm5Y+3XFxcIiwgXFxcIuWOn+eUu+S4i+i9vee6v+eoi1xcXCJdLCAyKS5zZWxlY3QoKHNoYXJlSWQsIHNoYXJlUHdkKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6Lez6L2s5aS45YWLQVBQXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInFrbGluazovL3d3dy51Yy5jbi9iMjBiODRmZDczNWE4ZGQzZjc1NDExMjliYWNjNGU5YT9hY3Rpb249b3Blbl91cmwmdXJsPWh0dHBzOi8vcGFuLnF1YXJrLmNuL3MvXFxcIiArIHNoYXJlSWQ7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIueZu+W9lei0puWPt1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiYWNjb3VudFxcXCIpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjEwXFxcIiksIFxcXCLor7fovpPlhaUzLTMy5LmL6Ze055qE5pW05pWwXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWVkVGhyZWFkID0gcGFyc2VJbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkVGhyZWFkIDwgMyB8fCBzcGVlZFRocmVhZCA+IDMyKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruS4jeWQiOazlVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFN0cmluZyhzcGVlZFRocmVhZCkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBidWlsZFVybChcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFwiICsgc2hhcmVJZCwge1xcbiAgICAgICAgICAgICAgICAgICAgcGFzc2NvZGU6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9maWxlaW50by5zdmdcXFwiLFxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnbGluZV9ibGFuaydcXG4gICAgfSk7XFxufVxcblxcblxcbmxldCBRdWFya1NoYXJlQXBpID0gJC5yZXF1aXJlKFxcXCJRdWFya1NoYXJlQXBpXFxcIik7XFxubGV0IHF1YXJrU2hhcmVBcGkgPSBuZXcgUXVhcmtTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCkuc2V0VG9rZW4oc2hhcmVUb2tlbikuc2V0UmVmcmVzaCgoc2hhcmVUb2tlbikgPT4ge1xcbiAgICBNWV9QQVJBTVMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG59KTtcXG5cXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXG4gICAgaWYgKCFzaXplKSB7XFxuICAgICAgICByZXR1cm4gJyc7XFxuICAgIH1cXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxufVxcblxcbmxldCBzdWJFeHRzID0gW1xcXCJ2dHRcXFwiLCBcXFwic3J0XFxcIiwgXFxcImFzc1xcXCJdO1xcbmxldCB0aXRsZUhlYWQgPSB7XFxuICAgIHZpZGVvOiBcXFwi8J+OrFxcXCIsXFxuICAgIGF1ZGlvOiBcXFwi8J+OtVxcXCIsXFxuICAgIGRvYzogXFxcIvCfk5FcXFwiLFxcbiAgICBpbWFnZTogXFxcIvCflrxcXFwiLFxcbiAgICBhcmNoaXZlOiBcXFwi8J+TplxcXCIsXFxuICAgIFxcXCJkZWZhdWx0XFxcIjogXFxcIuKdk1xcXCJcXG59O1xcblxcbmZ1bmN0aW9uIGdldEhlYWQodHlwZSwgZXh0KSB7XFxuICAgIGxldCBoZWFkID0gdGl0bGVIZWFkW3R5cGVdO1xcbiAgICAvKmlmIChzdWJFeHRzLmluY2x1ZGVzKGV4dCkpIHtcXG4gICAgICAgIGhlYWQgPSBcXFwi8J+VuFxcXCI7XFxuICAgIH0qL1xcbiAgICByZXR1cm4gaGVhZCB8fCBcXFwi4p2TXFxcIjtcXG59XFxudHJ5IHtcXG4gICAgdmFyIHJlcyA9IHF1YXJrU2hhcmVBcGkuZ2V0TGlzdEZpbGUoZmlsZUlkLCBNWV9QQUdFLCBzb3J0VmFsdWUpO1xcbiAgICAvL+iuvue9ruagh+mimFxcbiAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcbiAgICB2YXIgbGlzdCA9IHJlcy5kYXRhLmxpc3QgfHwgW107XFxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCAmJiAhZmlsZUlkKSB7XFxuICAgICAgICByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKHJlcy5kYXRhLnNoYXJlLmZpcnN0X2ZpZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXG4gICAgICAgIHNldFBhZ2VUaXRsZShyZXMuZGF0YS5zaGFyZS50aXRsZSk7XFxuICAgICAgICB2YXIgbGlzdCA9IHJlcy5kYXRhLmxpc3QgfHwgW107XFxuICAgIH1cXG4gICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXG4gICAgICAgIGlmIChpdGVtLmRpcikge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+TglxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBpdGVtLmluY2x1ZGVfaXRlbXMgKyAn6aG5ICAnLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tZXNzeS8yNy5zdmdcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0SGVhZChpdGVtLm9ial9jYXRlZ29yeSkgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IGl0ZW0udGh1bWJuYWlsLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlVcmxDYWNoZSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiLCB7fSk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAocGxheVVybENhY2hlW2ZpZF0pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheVVybENhY2hlW2ZpZF07XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAkLnJlcXVpcmUoXFxcInBsYXlcXFwiKS5nZXRQbGF5VXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlVcmxDYWNoZVtmaWRdID0gdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiLCBwbGF5VXJsQ2FjaGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGl0ZW0uZmlkLCBpdGVtLnNoYXJlX2ZpZF90b2tlbiwgc2hhcmVJZCwgcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLCBpdGVtLm9ial9jYXRlZ29yeSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBjbHM6ICdwbGF5bGlzdCAnICsgaXRlbS5vYmpfY2F0ZWdvcnlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXG4gICAgICAgIH0pO1xcbiAgICB9KTtcXG59IGNhdGNoIChlKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZS5tZXNzYWdlLFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcIuaPkOWPlueggVxcXCIpKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6L6T5YWl5o+Q5Y+W56CBXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldFBhZ2VQYXJhbXMoT2JqZWN0LmFzc2lnbih7fSwgTVlfUEFSQU1TLCB7XFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogaW5wdXRcXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIH0sIE1ZX1BBUkFNUyksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuc2V0UmVzdWx0KGQpO1wiLFwiZ3JvdXBcIjpcIuW8gOWPkeS4reW/g1wiLFwidWFcIjpcIm1vYmlsZVwiLFwicHJlUnVsZVwiOlwiXCIsXCJwYWdlc1wiOlwiW3tcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWkuOWFi+WIl+ihqEFQSVxcXCIsXFxcInBhdGhcXFwiOlxcXCJRdWFya1NoYXJlQXBpXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuLy9AYXV0aG9yIExveURnSWtcXFxcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFxcXFxcImh0dHBSZXF1ZXN0XFxcXFxcXCIpO1xcXFxuY29uc3QgYmFzZVVybCA9IFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFxcXFxcIjtcXFxcblxcXFxuZnVuY3Rpb24gUXVhcmtTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCkge1xcXFxuICAgIHRoaXMuc2hhcmVJZCA9IHNoYXJlSWQ7XFxcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcXFxuICAgIHRoaXMucmVmcmVzaENhbGxCYWNrID0gKCgpID0+IHZvaWQgMCk7XFxcXG4gICAgLy90aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcXFxufVxcXFxuT2JqZWN0LmFzc2lnbihRdWFya1NoYXJlQXBpLnByb3RvdHlwZSwge1xcXFxuICAgIHNldFJlZnJlc2gocmVmcmVzaENhbGxCYWNrKSB7XFxcXG4gICAgICAgIHRoaXMucmVmcmVzaENhbGxCYWNrID0gcmVmcmVzaENhbGxCYWNrO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHNldFRva2VuKHNoYXJlVG9rZW4pIHtcXFxcbiAgICAgICAgdGhpcy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbjtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICByZXF1ZXN0SHR0cChhcGkpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdChiYXNlVXJsK2FwaSkuc3VjY2VzcygoYm9keSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzICE9PSAyMDApIHtcXFxcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xcXFxuICAgICAgICB9KTtcXFxcbiAgICB9LFxcXFxuICAgIGdldFRva2VuKCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcXFxuICAgIH0sXFxcXG5cXFxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFxcXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL3Rva2VuXFxcXFxcXCIpLmJvZHkoe1xcXFxuICAgICAgICAgICAgXFxcXFxcXCJwd2RfaWRcXFxcXFxcIjogdGhpcy5zaGFyZUlkLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJwYXNzY29kZVxcXFxcXFwiOiB0aGlzLnNoYXJlUHdkLFxcXFxuICAgICAgICB9KS5ib2R5VG9TdHJpbmcodHJ1ZSkuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5zdGFydCh0cnVlKTtcXFxcbiAgICAgICAgdGhpcy5zaGFyZVRva2VuID0gcmVzdWx0LmRhdGEuc3Rva2VuO1xcXFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayhyZXN1bHQuZGF0YS5zdG9rZW4sIHRoaXMpO1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0TGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlcXVlc3RIdHRwKFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGV0YWlsP3ByPXVjcHJvJmZyPXBjXFxcXFxcXCIpLmJ1aWxkVXJsKHtcXFxcbiAgICAgICAgICAgIHB3ZF9pZDogdGhpcy5zaGFyZUlkIHx8IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBzdG9rZW46IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdldFRva2VuKCkgfHwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBmb3JjZTogMCxcXFxcbiAgICAgICAgICAgIF9wYWdlOiBwYWdlLFxcXFxuICAgICAgICAgICAgX3NpemU6IDUwLFxcXFxuICAgICAgICAgICAgX2ZldGNoX2Jhbm5lcjogMSxcXFxcbiAgICAgICAgICAgIF9mZXRjaF9zaGFyZTogMSxcXFxcbiAgICAgICAgICAgIF9mZXRjaF90b3RhbDogMSxcXFxcbiAgICAgICAgICAgIF9zb3J0OiBcXFxcXFxcImZpbGVfdHlwZTphc2MsXFxcXFxcXCIgKyBvcmRlckJ5XFxcXG4gICAgICAgIH0pLmVycm9yV2l0aFJldHJ5KChlcnIsIHJlcywgaHR0cCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0b2tlbicpKSB7XFxcXG4gICAgICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRVcmw6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0U2hhcmVUb2tlbigpfHxcXFxcXFxcIlxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuJC5leHBvcnRzID0gUXVhcmtTaGFyZUFwaTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJodHRwUmVxdWVzdFxcXCIsXFxcInBhdGhcXFwiOlxcXCJodHRwUmVxdWVzdFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcXFxuICAgIHRoaXMudXJsID0gdXJsO1xcXFxuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcXFxcbiAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXFxcbiAgICB9KTtcXFxcbiAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSAoZXJyLCByZXMpID0+IHt0aHJvdyBlcnJ9O1xcXFxuICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IChlcnIsIHJlcywgdHJ5UmVzdGFydCkgPT4gZmFsc2U7XFxcXG4gICAgdGhpcy5zdWNjZXNzQ2FsbGJhY2sgPSAoYm9keSwgc3RhdHVzQ29kZSwgaGVhZGVycykgPT4gYm9keTtcXFxcbiAgICB0aGlzLmVycm9yVHlwZUNhbGxiYWNrID0gKGVyciwgcmVzKSA9PiBlcnI7XFxcXG4gICAgdGhpcy5zdGFydFJlcXVlc3QgPSBmZXRjaDtcXFxcbiAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSBmYWxzZTtcXFxcbiAgICB0aGlzLmJ1aWxkUGFyYW0gPSB2b2lkKDApO1xcXFxufVxcXFxuXFxcXG5PYmplY3QuYXNzaWduKGh0dHBSZXF1ZXN0LnByb3RvdHlwZSwge1xcXFxuICAgIGJvZHlUb1N0cmluZyhmbGFnKSB7XFxcXG4gICAgICAgIHRoaXMuX2JvZHlUb1N0cmluZyA9ICEhZmxhZztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBib2R5KGJvZHkpIHtcXFxcbiAgICAgICAgdGhpcy5vcHRpb25zLmJvZHkgPSBib2R5IHx8IHZvaWQgMDtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBidWlsZFVybChidWlsZFBhcmFtKSB7XFxcXG4gICAgICAgIHRoaXMuYnVpbGRQYXJhbSA9IGJ1aWxkUGFyYW0gfHwge307XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgc2V0U3RhcnRSZXF1ZXN0RnVuYyhmdW5jKSB7XFxcXG4gICAgICAgIHRoaXMuc3RhcnRSZXF1ZXN0ID0gZnVuYztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBoZWFkZXJzKGhlYWRlcnMpIHtcXFxcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlYWRlcnMgPSBoZWFkZXJzIHx8IHZvaWQgMDtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBzdWNjZXNzKHN1Y2Nlc3NDYWxsYmFjaykge1xcXFxuICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiKSByZXR1cm4gdGhpcztcXFxcbiAgICAgICAgdGhpcy5zdWNjZXNzQ2FsbGJhY2sgPSBzdWNjZXNzQ2FsbGJhY2s7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgZXJyb3IoZXJyb3JDYWxsYmFjaykge1xcXFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgIT09IFxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIikgcmV0dXJuIHRoaXM7XFxcXG4gICAgICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IGVycm9yQ2FsbGJhY2s7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgZXJyb3JUeXBlKGVycm9yVHlwZUNhbGxiYWNrKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JUeXBlQ2FsbGJhY2sgIT09IFxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIikgcmV0dXJuIHRoaXM7XFxcXG4gICAgICAgIHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2sgPSBlcnJvclR5cGVDYWxsYmFjaztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBlcnJvcldpdGhSZXRyeShyZXRyeUNvdW50LCBlcnJvckNhbGxiYWNrV2l0aFJldHJ5KSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgcmV0cnlDb3VudCA9PT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiICYmIHR5cGVvZiBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID09PSBcXFxcXFxcInVuZGVmaW5lZFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gcmV0cnlDb3VudDtcXFxcbiAgICAgICAgICAgIHJldHJ5Q291bnQgPSAxO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSAhPT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSBOdW1iZXIocmV0cnlDb3VudCk7XFxcXG4gICAgICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IGVycm9yQ2FsbGJhY2tXaXRoUmV0cnk7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgc3RhcnQodG9Kc29uKSB7XFxcXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXFxcXFwib2JqZWN0XFxcXFxcXCIgJiYgdGhpcy5fYm9keVRvU3RyaW5nKSB7XFxcXG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHZhciByZXMgPSBKU09OLnBhcnNlKHRoaXMuc3RhcnRSZXF1ZXN0KHRoaXMuYnVpbGRQYXJhbT9idWlsZFVybCh0aGlzLnVybCwgdGhpcy5idWlsZFBhcmFtKTp0aGlzLnVybCwgb3B0aW9ucykpO1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8PSAzMDApIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgYm9keSA9IHJlcy5ib2R5O1xcXFxuICAgICAgICAgICAgICAgIGlmICh0b0pzb24pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IEpTT04ucGFyc2UoYm9keSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3NDYWxsYmFjayhib2R5LCByZXMpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoU3RyaW5nKHJlcy5zdGF0dXNDb2RlKSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICBlcnIgPSB0aGlzLmVycm9yVHlwZUNhbGxiYWNrKGVyciwgcmVzKTtcXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcblxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHRoaXMucmV0cnlDb3VudCkge1xcXFxuICAgICAgICAgICAgICAgIGxldCB0cnlSZXN1bHQgPSB0aGlzLmVycm9yQ2FsbGJhY2tXaXRoUmV0cnkoZXJyLCByZXMsIHRoaXMpO1xcXFxuICAgICAgICAgICAgICAgIGlmICh0cnlSZXN1bHQpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50LS07XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0KHRvSnNvbik7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gMDtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JDYWxsYmFjayhlcnIsIHJlcyk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XFxcXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcXFxcbiAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIG1lcmdlSGVhZEFuZEJvZHkob3B0aW9ucykge1xcXFxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcXFxcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuaGVhZGVyc3x8e30sIG9wdGlvbnMuaGVhZGVycyk7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJvZHkgPT09IFxcXFxcXFwib2JqZWN0XFxcXFxcXCIgJiYgdHlwZW9mIG9wdGlvbnMuYm9keSA9PT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuYm9keXx8e30sIG9wdGlvbnMuYm9keSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJ1aWxkVXJsID09PSBcXFxcXFxcIm9iamVjdFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuYnVpbGRQYXJhbXx8e30sIG9wdGlvbnMuYnVpbGRVcmwpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5PYmplY3QuYXNzaWduKGh0dHBSZXF1ZXN0LCB7XFxcXG4gICAgZmV0Y2godXJsLCBvcHRpb25zKSB7XFxcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKTtcXFxcbiAgICB9LFxcXFxuICAgIHBvc3QodXJsLCBvcHRpb25zKSB7XFxcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpO1xcXFxuICAgIH0sXFxcXG4gICAgcmVxdWVzdCh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocmVxdWVzdCk7XFxcXG4gICAgfSxcXFxcbiAgICBwb3N0UmVxdWVzdCh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdFJlcXVlc3QpO1xcXFxuICAgIH0sXFxcXG4gICAgZmV0Y2hDb29raWUodXJsLCBvcHRpb25zKSB7XFxcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKGZldGNoQ29va2llKTtcXFxcbiAgICB9XFxcXG59KTtcXFxcbiQuZXhwb3J0cyA9IGh0dHBSZXF1ZXN0O1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWkuOWFi+WIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJxdWFya0xpc3RcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZCA9IFtdO1xcXFxuXFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFxcXFxcInBsYXlVcmxDYWNoZVxcXFxcXFwiKSk7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uUmVmcmVzaFxcXFxcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIpKTtcXFxcbmxldCBzb1VybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcInJlYWx1cmxcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikpO1xcXFxubGV0IHJlYWx1cmwgPSBzb1VybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF07XFxcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFxcXFxcIiNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFxcXFxcInNoYXJlUHdkXFxcXFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVB3ZCB8fCBnZXRQYXJhbShcXFxcXFxcInBhc3Njb2RlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIsIHNvVXJsKSB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBzaGFyZVRva2VuID0gZ2V0UGFyYW0oXFxcXFxcXCJzaGFyZVRva2VuXFxcXFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXFxcblxcXFxubGV0IHNvcnQgPSB7XFxcXG4gICAgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIjogXFxcXFxcXCJmaWxlX25hbWU6YXNjXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCLlkI3np7DlgJLluo9cXFxcXFxcIjogXFxcXFxcXCJmaWxlX25hbWU6ZGVzY1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwi5pe26Ze05q2j5bqPXFxcXFxcXCI6IFxcXFxcXFwidXBkYXRlZF9hdDphc2NcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcIuaXtumXtOWAkuW6j1xcXFxcXFwiOiBcXFxcXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXFxcXFwiXFxcXG59O1xcXFxubGV0IHN0eWxlcyA9IFtcXFxcXFxcInRleHRfMVxcXFxcXFwiLCBcXFxcXFxcImF2YXRhclxcXFxcXFwiXTtcXFxcblxcXFxubGV0IHNvcnRWYWx1ZSA9IHNvcnRbZ2V0SXRlbShcXFxcXFxcInNvcnRLZXlcXFxcXFxcIiwgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIildO1xcXFxubGV0IHN0eWxlID0gZ2V0SXRlbShcXFxcXFxcInN0eWxlXFxcXFxcXCIsIHN0eWxlc1swXSk7XFxcXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHN0eWxlLFxcXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oJ3N0eWxlJywgaW5wdXQpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL2ltZy9hbGlfaWNvbi5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl9zbWFsbF80XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFxcXFxcInNvcnRLZXlcXFxcXFxcIiwgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChPYmplY3Qua2V5cyhzb3J0KSwgMSwgJ+ivt+mAieaLqScpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwic29ydEtleVxcXFxcXFwiLCBpbnB1dClcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX3NvcnQuc3ZnXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfNFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBcXFxcXFxcIui9rOeggVxcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFtcXFxcXFxcIui9rOeggVxcXFxcXFwiLCBcXFxcXFxcIuWOn+eUu1xcXFxcXFwiXSwgMiwgXFxcXFxcXCLmkq3mlL7mqKHlvI9cXFxcXFxcIikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfNFxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX3BsYXkuc3ZnXFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yqf6IO9XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChbXFxcXFxcXCLot7PovazlpLjlhYtBUFBcXFxcXFxcIiwgXFxcXFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFxcXFxcIiwgXFxcXFxcXCLnmbvlvZXotKblj7dcXFxcXFxcIiwgXFxcXFxcXCLljp/nlLvkuIvovb3nur/nqItcXFxcXFxcIl0sIDIpLnNlbGVjdCgoc2hhcmVJZCwgc2hhcmVQd2QpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLot7PovazlpLjlhYtBUFBcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInFrbGluazovL3d3dy51Yy5jbi9iMjBiODRmZDczNWE4ZGQzZjc1NDExMjliYWNjNGU5YT9hY3Rpb249b3Blbl91cmwmdXJsPWh0dHBzOi8vcGFuLnF1YXJrLmNuL3MvXFxcXFxcXCIgKyBzaGFyZUlkO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLnmbvlvZXotKblj7dcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcXFxcXCJhY2NvdW50XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLljp/nlLvkuIvovb3nur/nqItcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcXFxcXCJzcGVlZFRocmVhZFxcXFxcXFwiLCBcXFxcXFxcIjEwXFxcXFxcXCIpLCBcXFxcXFxcIuivt+i+k+WFpTMtMzLkuYvpl7TnmoTmlbTmlbBcXFxcXFxcIikuaW5wdXQoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3BlZWRUaHJlYWQgPSBwYXJzZUludChpbnB1dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGVlZFRocmVhZCA8IDMgfHwgc3BlZWRUaHJlYWQgPiAzMikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7kuI3lkIjms5VcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwic3BlZWRUaHJlYWRcXFxcXFxcIiwgU3RyaW5nKHNwZWVkVGhyZWFkKSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuWkjeWItuWIhuS6q+mTvuaOpVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgYnVpbGRVcmwoXFxcXFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXFxcXFwiICsgc2hhcmVJZCwge1xcXFxuICAgICAgICAgICAgICAgICAgICBwYXNzY29kZTogc2hhcmVQd2RcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIixcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9maWxlaW50by5zdmdcXFxcXFxcIixcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2xpbmVfYmxhbmsnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcblxcXFxubGV0IFF1YXJrU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcXFxcXCJRdWFya1NoYXJlQXBpXFxcXFxcXCIpO1xcXFxubGV0IHF1YXJrU2hhcmVBcGkgPSBuZXcgUXVhcmtTaGFyZUFwaShzaGFyZUlkLCBzaGFyZVB3ZCkuc2V0VG9rZW4oc2hhcmVUb2tlbikuc2V0UmVmcmVzaCgoc2hhcmVUb2tlbikgPT4ge1xcXFxuICAgIE1ZX1BBUkFNUy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbjtcXFxcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxcXG59KTtcXFxcblxcXFxuZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplKSB7XFxcXG4gICAgaWYgKCFzaXplKSB7XFxcXG4gICAgICAgIHJldHVybiAnJztcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXFxcbiAgICBsZXQgaSA9IDA7XFxcXG4gICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcXFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxcXG4gICAgICAgIGkrKztcXFxcbiAgICB9XFxcXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxcXG4gICAgcmV0dXJuIGAke3NpemV9ICR7dW5pdHNbaV19YDtcXFxcbn1cXFxcblxcXFxubGV0IHN1YkV4dHMgPSBbXFxcXFxcXCJ2dHRcXFxcXFxcIiwgXFxcXFxcXCJzcnRcXFxcXFxcIiwgXFxcXFxcXCJhc3NcXFxcXFxcIl07XFxcXG5sZXQgdGl0bGVIZWFkID0ge1xcXFxuICAgIHZpZGVvOiBcXFxcXFxcIvCfjqxcXFxcXFxcIixcXFxcbiAgICBhdWRpbzogXFxcXFxcXCLwn461XFxcXFxcXCIsXFxcXG4gICAgZG9jOiBcXFxcXFxcIvCfk5FcXFxcXFxcIixcXFxcbiAgICBpbWFnZTogXFxcXFxcXCLwn5a8XFxcXFxcXCIsXFxcXG4gICAgYXJjaGl2ZTogXFxcXFxcXCLwn5OmXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCJkZWZhdWx0XFxcXFxcXCI6IFxcXFxcXFwi4p2TXFxcXFxcXCJcXFxcbn07XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEhlYWQodHlwZSwgZXh0KSB7XFxcXG4gICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxcXG4gICAgLyppZiAoc3ViRXh0cy5pbmNsdWRlcyhleHQpKSB7XFxcXG4gICAgICAgIGhlYWQgPSBcXFxcXFxcIvCflbhcXFxcXFxcIjtcXFxcbiAgICB9Ki9cXFxcbiAgICByZXR1cm4gaGVhZCB8fCBcXFxcXFxcIuKdk1xcXFxcXFwiO1xcXFxufVxcXFxudHJ5IHtcXFxcbiAgICB2YXIgcmVzID0gcXVhcmtTaGFyZUFwaS5nZXRMaXN0RmlsZShmaWxlSWQsIE1ZX1BBR0UsIHNvcnRWYWx1ZSk7XFxcXG4gICAgLy/orr7nva7moIfpophcXFxcbiAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcXFxuICAgIHZhciBsaXN0ID0gcmVzLmRhdGEubGlzdCB8fCBbXTtcXFxcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgIWZpbGVJZCkge1xcXFxuICAgICAgICByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKHJlcy5kYXRhLnNoYXJlLmZpcnN0X2ZpZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKHJlcy5kYXRhLnNoYXJlLnRpdGxlKTtcXFxcbiAgICAgICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcXFxuICAgIH1cXFxcbiAgICBsaXN0LmZvckVhY2goaXRlbSA9PiB7XFxcXG4gICAgICAgIC8v5Yik5pat5piv5ZCm5paH5Lu25aS5XFxcXG4gICAgICAgIGlmIChpdGVtLmRpcikge1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLwn5OCXFxcXFxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXFxcbiAgICAgICAgICAgICAgICBkZXNjOiAkLmRhdGVGb3JtYXQoaXRlbS51cGRhdGVkX2F0LCAneXl5eS1NTS1kZCcpICsgJyAgJyArIGl0ZW0uaW5jbHVkZV9pdGVtcyArICfpobkgICcsXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vdHViaWFvL21lc3N5LzI3LnN2Z1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlSWQsXFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkLFxcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVRva2VuOiBxdWFya1NoYXJlQXBpLmdldFRva2VuKCksXFxcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJZDogaXRlbS5maWQsXFxcXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2VcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGdldEhlYWQoaXRlbS5vYmpfY2F0ZWdvcnkpICsgaXRlbS5maWxlX25hbWUsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaXRlbS50aHVtYm5haWwsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlVcmxDYWNoZSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIsIHt9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXlVcmxDYWNoZVtmaWRdKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheVVybENhY2hlW2ZpZF07XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gJC5yZXF1aXJlKFxcXFxcXFwicGxheVxcXFxcXFwiKS5nZXRQbGF5VXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxheVVybENhY2hlW2ZpZF0gPSB1cmw7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFxcXFxcInBsYXlVcmxDYWNoZVxcXFxcXFwiLCBwbGF5VXJsQ2FjaGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0sIGl0ZW0uZmlkLCBpdGVtLnNoYXJlX2ZpZF90b2tlbiwgc2hhcmVJZCwgcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLCBpdGVtLm9ial9jYXRlZ29yeSksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmZpZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiAncGxheWxpc3QgJyArIGl0ZW0ub2JqX2NhdGVnb3J5XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICB9KTtcXFxcbn0gY2F0Y2ggKGUpIHtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogZS5tZXNzYWdlLFxcXFxuICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFxcXFxcIuaPkOWPlueggVxcXFxcXFwiKSkge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6L6T5YWl5o+Q5Y+W56CBXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVBhcmFtcyhPYmplY3QuYXNzaWduKHt9LCBNWV9QQVJBTVMsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IGlucHV0XFxcXG4gICAgICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICB9LCBNWV9QQVJBTVMpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbnNldFJlc3VsdChkKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJwbGF5XFxcIixcXFwicGF0aFxcXCI6XFxcInBsYXlcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBjb29raWUgPSBnZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgaHR0cFJlcXVlc3QgPSAkLnJlcXVpcmUoXFxcXFxcXCJodHRwUmVxdWVzdFxcXFxcXFwiKTtcXFxcblxcXFxuZnVuY3Rpb24gQ29va2llTWFuYWdlKGNvb2tpZSkge1xcXFxuICAgIHRoaXMuY29va2llID0ge307XFxcXG4gICAgdGhpcy5hZGQoY29va2llKTtcXFxcbn1cXFxcbk9iamVjdC5hc3NpZ24oQ29va2llTWFuYWdlLnByb3RvdHlwZSwge1xcXFxuICAgIGFkZChjb29raWUpIHtcXFxcbiAgICAgICAgbGV0IGNvb2tpZXMgPSBbXTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBjb29raWUgPT09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGNvb2tpZXMgPSBjb29raWUuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29va2llKSkge1xcXFxuICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBjb29raWVzLmZvckVhY2godiA9PiB7XFxcXG4gICAgICAgICAgICB2ID0gdi5zcGxpdChcXFxcXFxcIj1cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAodi5sZW5ndGggPCAyKSByZXR1cm47XFxcXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVt2WzBdLnRyaW0oKV0gPSB2WzFdLnRyaW0oKTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSxcXFxcbiAgICBnZXQoKSB7XFxcXG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmNvb2tpZSkubWFwKHYgPT4gdlswXSArIFxcXFxcXFwiPVxcXFxcXFwiICsgdlsxXSkuam9pbihcXFxcXFxcIjtcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5jb25zdCBjb29raWVNYW5hZ2UgPSBuZXcgQ29va2llTWFuYWdlKGNvb2tpZSk7XFxcXG5cXFxcbmZ1bmN0aW9uIHdhaXRTbGVlcCh0aW1lKSB7XFxcXG4gICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lIHx8IDYwMCk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHJlcXVlc3RIdHRwKHVybCkge1xcXFxuICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsKVxcXFxuICAgICAgICAuc3VjY2VzcygoYm9keSwgcmVzKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoYm9keS5zdGF0dXMgIT09IDIwMCkge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgY29va2llTWFuYWdlLmFkZChyZXMuaGVhZGVyc1tcXFxcXFxcInNldC1jb29raWVcXFxcXFxcIl0pO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIC5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxcXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9KVxcXFxuICAgICAgICAuYm9keVRvU3RyaW5nKHRydWUpXFxcXG4gICAgICAgIC5oZWFkZXJzKHtcXFxcbiAgICAgICAgICAgIGNvb2tpZTogY29va2llTWFuYWdlLmdldCgpLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IFxcXFxcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgcXVhcmstY2xvdWQtZHJpdmUvMi41LjIwIENocm9tZS8xMDAuMC40ODk2LjE2MCBFbGVjdHJvbi8xOC4zLjUuNC1iNDc4NDkxMTAwIFNhZmFyaS81MzcuMzYgQ2hhbm5lbC9wY2trX290aGVyX2NoXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInJlZmVyZXJcXFxcXFxcIjogXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuL1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXREcml2ZUluZm8oKSB7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKFxcXFxcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jbi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL2Rpcj9wcj11Y3BybyZmcj1wYyZhdmVyPTFcXFxcXFxcIikuc3RhcnQodHJ1ZSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGNyZWF0ZVNhdmVUYXNrKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbikge1xcXFxuICAgIGxldCBkcml2ZUluZm8gPSBnZXREcml2ZUluZm8oKTtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2Uvc2F2ZT9wcj11Y3BybyZmcj1wY1xcXFxcXFwiKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLmJvZHkoe1xcXFxuICAgICAgICBcXFxcXFxcImZpZF9saXN0XFxcXFxcXCI6IFtcXFxcbiAgICAgICAgICAgIGZpZFxcXFxuICAgICAgICBdLFxcXFxuICAgICAgICBcXFxcXFxcImZpZF90b2tlbl9saXN0XFxcXFxcXCI6IFtcXFxcbiAgICAgICAgICAgIGZpZF90b2tlblxcXFxuICAgICAgICBdLFxcXFxuICAgICAgICBcXFxcXFxcInRvX3BkaXJfZmlkXFxcXFxcXCI6IGRyaXZlSW5mby5kYXRhLmRpci5maWQsXFxcXG4gICAgICAgIFxcXFxcXFwicHdkX2lkXFxcXFxcXCI6IHB3ZF9pZCxcXFxcbiAgICAgICAgXFxcXFxcXCJzdG9rZW5cXFxcXFxcIjogc3Rva2VuLFxcXFxuICAgICAgICBcXFxcXFxcInBkaXJfZmlkXFxcXFxcXCI6IGRyaXZlSW5mby5kYXRhLmRpci5wZGlyX2ZpZFxcXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjcmVhdGVEZWxldGVUYXNrKGZpZCkge1xcXFxuICAgIGxldCBkcml2ZUluZm8gPSBnZXREcml2ZUluZm8oKTtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9maWxlL2RlbGV0ZT9wcj11Y3BybyZmcj1wY1xcXFxcXFwiKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLmJvZHkoe1xcXFxuICAgICAgICBcXFxcXFxcImFjdGlvbl90eXBlXFxcXFxcXCI6IDIsXFxcXG4gICAgICAgIFxcXFxcXFwiZmlsZWxpc3RcXFxcXFxcIjogW1xcXFxuICAgICAgICAgICAgZmlkXFxcXG4gICAgICAgIF0sXFxcXG4gICAgICAgIFxcXFxcXFwiZXhjbHVkZV9maWRzXFxcXFxcXCI6IFtdXFxcXG4gICAgfSkuc3RhcnQodHJ1ZSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHRhc2sodGFza19pZCwgcmV0cnlfaW5kZXgpIHtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS90YXNrXFxcXFxcXCIpLmJ1aWxkVXJsKHtcXFxcbiAgICAgICAgcHI6IFxcXFxcXFwidWNwcm9cXFxcXFxcIixcXFxcbiAgICAgICAgZnI6IFxcXFxcXFwicGNcXFxcXFxcIixcXFxcbiAgICAgICAgdGFza19pZDogdGFza19pZCxcXFxcbiAgICAgICAgcmV0cnlfaW5kZXg6IHJldHJ5X2luZGV4XFxcXG4gICAgfSkuc3RhcnQodHJ1ZSk7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHF1ZXJ5VGFzayh0YXNrX2lkKSB7XFxcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCByZXMgPSB0YXNrKHRhc2tfaWQsIGkgKyBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXFxcbiAgICAgICAgICAgICAgICB3YWl0U2xlZXAoMTAwMCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5kYXRhLnNhdmVfYXMuc2F2ZV9hc190b3BfZmlkc1swXTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHdhaXRTbGVlcCgzMDAqKGkrMSkpO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gdm9pZCgwKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcXVlcnlUYXNrU3RhdHVzKHRhc2tfaWQpIHtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IHRhc2sodGFza19pZCwgaSArIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnN0YXR1cyA9PT0gMikge1xcXFxuICAgICAgICAgICAgICAgIHdhaXRTbGVlcCgxMDAwKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHdhaXRTbGVlcCgzMDApO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gZmFsc2U7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFByZXZpZXdWaWRlbyhmaWQpIHtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9maWxlL3YyL3BsYXk/cHI9dWNwcm8mZnI9cGNcXFxcXFxcIikuYm9keSh7XFxcXG4gICAgICAgIFxcXFxcXFwiZmlkXFxcXFxcXCI6IGZpZCxcXFxcbiAgICAgICAgXFxcXFxcXCJyZXNvbHV0aW9uc1xcXFxcXFwiOiBcXFxcXFxcIm5vcm1hbCxsb3csaGlnaCxzdXBlciwyayw0a1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInN1cHBvcnRzXFxcXFxcXCI6IFxcXFxcXFwiZm1wNCxtM3U4XFxcXFxcXCJcXFxcbiAgICB9KS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXREb3dubG9hZFVybChmaWQpIHtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9maWxlL2Rvd25sb2FkP3ByPXVjcHJvJmZyPXBjXFxcXFxcXCIpLmJvZHkoe1xcXFxuICAgICAgICBcXFxcXFxcImZpZHNcXFxcXFxcIjogW2ZpZF1cXFxcbiAgICB9KS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRQbGF5VXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnkpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBpZiAoIWNvb2tpZSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fnmbvlvZXotKblj7dcXFxcXFxcIjtcXFxcbiAgICAgICAgbGV0IHRhc2tJZCA9IGNyZWF0ZVNhdmVUYXNrKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbikuZGF0YS50YXNrX2lkO1xcXFxuICAgICAgICBsZXQgYXNmaWQgPSBxdWVyeVRhc2sodGFza0lkKTtcXFxcbiAgICAgICAgaWYgKCFhc2ZpZCkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcGxheUNvb2tpZSA9IGNvb2tpZU1hbmFnZS5nZXQoKTtcXFxcbiAgICAgICAgbGV0IHBsYXlIZWFkZXIgPSB7XFxcXG4gICAgICAgICAgICBSZWZlcmVyOiBcXFxcXFxcImh0dHA6Ly9wYW4ucXVhcmsuY24vXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb29raWU6IHBsYXlDb29raWUsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJjb20uc3R1Yi5TdHViQXBwLzEuMy4wIChMaW51eDtBbmRyb2lkIDE0KSBBbmRyb2lkWE1lZGlhMy8xLjEuMVxcXFxcXFwiXFxcXG4gICAgICAgIH07XFxcXG4gICAgICAgIGlmIChjYXRlZ29yeSA9PSBcXFxcXFxcInZpZGVvXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBcXFxcXFxcIui9rOeggVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcXFxcXCLovaznoIFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIGxldCB2aWRlb1JlcyA9IGdldFByZXZpZXdWaWRlbyhhc2ZpZCk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvTGlzdCA9IHZpZGVvUmVzLmRhdGEudmlkZW9fbGlzdDtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW10sXFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtdXFxcXG4gICAgICAgICAgICAgICAgfTtcXFxcbiAgICAgICAgICAgICAgICB2aWRlb0xpc3QuZmlsdGVyKHYgPT4gdi5hY2Nlc3NhYmxlKS5mb3JFYWNoKHYgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC5uYW1lcy5wdXNoKHYucmVzb2x1dGlvbik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LnVybHMucHVzaCh2LnZpZGVvX2luZm8udXJsICsgXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcGxheUxpc3QuaGVhZGVycy5wdXNoKHBsYXlIZWFkZXIpO1xcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIGNyZWF0ZURlbGV0ZVRhc2soYXNmaWQpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF0uZG93bmxvYWRfdXJsO1xcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtcXFxcXFxcIuWOn+eUu1xcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW3BsYXlVcmwgKyBcXFxcXFxcIiNpc1ZpZGVvPXRydWUjI2Zhc3RQbGF5TW9kZSMjdGhyZWFkcz1cXFxcXFxcIiArIGdldEl0ZW0oXFxcXFxcXCJzcGVlZFRocmVhZFxcXFxcXFwiLCBcXFxcXFxcIjEwXFxcXFxcXCIpICsgXFxcXFxcXCIjXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbcGxheUhlYWRlcl1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF0uZG93bmxvYWRfdXJsO1xcXFxuICAgICAgICAgICAgY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCk7XFxcXG4gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT09ICdhdWRpbycpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbXFxcXFxcXCLpn7PpopFcXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFtwbGF5VXJsICsgXFxcXFxcXCIjaXNWaWRlbz10cnVlI1xcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogW3BsYXlIZWFkZXJdLFxcXFxuICAgICAgICAgICAgICAgICAgICBseXJpYzogXFxcXFxcXCJcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheUxpc3QpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PT0gJ2ltYWdlJykge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiAkKHBsYXlVcmwsIHBsYXlIZWFkZXIpLmltYWdlKCk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHBsYXlIZWFkZXIgPSBPYmplY3Qua2V5cyhwbGF5SGVhZGVyKS5tYXAoa2V5ID0+IGtleSArIFxcXFxcXFwiQFxcXFxcXFwiICsgU3RyaW5nKHBsYXlIZWFkZXJba2V5XSkucmVwbGFjZSgvOy9nLCBcXFxcXFxcIu+8m++8m1xcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiZG93bmxvYWQ6Ly9cXFxcXFxcIiArIHBsYXlVcmwgKyBcXFxcXFxcIjt7XFxcXFxcXCIgKyBwbGF5SGVhZGVyLmpvaW4oXFxcXFxcXCImJlxcXFxcXFwiKSArIFxcXFxcXFwifVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXFxcXFwicmVxdWlyZSBsb2dpblxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLmnKrnmbvlvZXmiJbnmbvlvZXov4fmnJ/vvIzor7fph43mlrDnmbvlvZVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW5cXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgZS50b1N0cmluZygpO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzID0ge1xcXFxuICAgIGdldFBsYXlVcmxcXFxcbn07XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi55m75b2V6LSm5Y+3XFxcIixcXFwicGF0aFxcXCI6XFxcImxvZ2luXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IGQgPSBbXTtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIueZu+W9leWkuOWFi+i0puWPt1xcXFxcXFwiKTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc56Gu6K6k55m75b2V4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICBsZXQgY20gPSBhbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XFxcXG4gICAgICAgIGxldCBjb29raWUgPSBTdHJpbmcoY20uZ2V0Q29va2llKFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFxcXFxcIikgfHwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmICgkLnJlcXVpcmUoXFxcXFxcXCJ0b29sXFxcXFxcXCIpLmlzTG9naW5Db29raWUoY29va2llKSkge1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIGNvb2tpZSk7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pyq55m75b2VXFxcXFxcXCI7XFxcXG4gICAgfSksXFxcXG4gICAgZGVzYzpcXFxcXFxcIuKAnOKAnOKAneKAnTxzbWFsbD7ngrnlh7vlpLTlg4/lj6/ku6XpgIDlh7rotKblj7fph43mlrDnmbvlvZU8L3NtYWxsPlxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxufSk7XFxcXG5kLnB1c2goe1xcXFxuICAgIGNvbF90eXBlOlxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwieDVfd2Vidmlld19zaW5nbGVcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vXFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCJsaXN0JiZzY3JlZW4tMTUwXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdWE6IFBDX1VBLFxcXFxuICAgICAgICBqc0xvYWRpbmdJbmplY3Q6IGZhbHNlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5zZXRSZXN1bHQoZClcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlt6XlhbdcXFwiLFxcXCJwYXRoXFxcIjpcXFwidG9vbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcblxcXFxuJC5leHBvcnRzPXtcXFxcbiAgICBpc0xvZ2luQ29va2llKGNvb2tpZSl7XFxcXG4gICAgICAgIHJldHVybiAhIShjb29raWUgJiYgY29va2llLmluY2x1ZGVzKFxcXFxcXFwiX1VQX0Y3RV84RF89XFxcXFxcXCIpICYmIGNvb2tpZS5pbmNsdWRlcyhcXFxcXFxcIl9fdWlkPVxcXFxcXFwiKSAmJiBjb29raWUuaW5jbHVkZXMoXFxcXFxcXCJfX3B1dXM9XFxcXFxcXCIpKTtcXFxcbiAgICB9XFxcXG59O1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS4quS6uui0puWPt+iuvue9rlxcXCIsXFxcInBhdGhcXFwiOlxcXCJhY2NvdW50XFxcIixcXFwicnVsZVxcXCI6XFxcIiQuZXhwb3J0cyA9ICQoW1xcXFxcXFwiQ29va2ll55m75b2VXFxcXFxcXCIsIFxcXFxcXFwi572R6aG155m75b2VXFxcXFxcXCIsIFxcXFxcXFwi6I635Y+WUEfmnKzlnLDlhbHkuqtDb29raWVcXFxcXFxcIiwgXFxcXFxcXCLlpI3liLZDb29raWVcXFxcXFxcIiwgXFxcXFxcXCLmuIXpmaRDb29raWVcXFxcXFxcIl0pLnNlbGVjdCgoaXNyKSA9PiB7XFxcXG4gICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIue9kemhteeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2dpblxcXFxcXFwiO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwiQ29va2ll55m75b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCJcXFxcXFxcIiwgXFxcXFxcXCLor7fovpPlhaVDb29raWVcXFxcXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShpbnB1dCkpIHtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgaW5wdXQucmVwbGFjZSgvXFxcXFxcXFxzL2csIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICBpc3ImJnJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgaXNyKTtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiOt+WPllBH5pys5Zyw5YWx5LqrQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgaWYgKGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL1RWLy5xdWFya191c2VyXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaChcXFxcXFxcImZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL1RWLy5xdWFya191c2VyXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgY29va2llID0ganNvbi5jb29raWU7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShjb29raWUpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBjb29raWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpc3ImJnJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ojrflj5blpLHotKXlhbHkuqvmlofku7bmjZ/lnY9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAkKFxcXFxcXFwi5Li65qOA5rWL5YiwVFZCT1jnmoRQR+acrOWcsOWMheeahOWFseS6q0Nvb2tpZVxcXFxcXFxcbuivt+S9v+eUqOi/h+WQjuWGjeWwneivlVxcXFxcXFwiKS5jb25maXJtKCgpID0+IHt9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSBpZihpbnB1dD09PVxcXFxcXFwi5aSN5Yi2Q29va2llXFxcXFxcXCIpe1xcXFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoY29va2llKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBjb29raWU7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfWVsc2V7XFxcXG4gICAgICAgIGNsZWFySXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbn0sICQuaW1wb3J0UGFyYW0pO1xcXCJ9XVwiLFwicHJveHlcIjpcIlwifSIsInBpY1VybCI6Imh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvMjcuc3ZnIiwidGl0bGUiOiLljZfmnaXljJflvoAifQ==
Add Comment
Please, Sign In to add comment