Advertisement
xiaomianao666

邀您一起看:选择器|[综]用绳命推销的男人 作者:醉饮长歌

Oct 10th, 2022
1,193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥选择器|[]用绳命推销的男人 作者:醉饮长歌@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmLkZpbGXlt6XlhbdcIixcInBhdGhcIjpcIkZpbGUuanNcIixcInJ1bGVcIjpcImNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxuY29uc3Qge1xcbiAgICBGaWxlcyxcXG4gICAgUGF0aHMsXFxuICAgIFN0YW5kYXJkQ29weU9wdGlvbixcXG4gICAgU3RhbmRhcmRPcGVuT3B0aW9uXFxufSA9IGphdmEubmlvLmZpbGU7XFxuY29uc3QgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7XFxubGV0IGphdmFTY29wZSA9IG5ldyBKYXZhSW1wb3J0ZXIoamF2YS5pbywgamF2YS5sYW5nLCBqYXZhLmxhbmcucmVmbGVjdCwgamF2YS51dGlsLlZlY3Rvcik7XFxuXFxuZnVuY3Rpb24gZGVsZXRlRmlsZXMoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmICghZmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOaWh+S7tuWksei0pe+8mlxcXCIgKyBmaWxlTmFtZSArIFxcXCLmlofku7bkuI3lrZjlnKhcXFwiKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGUoZmlsZU5hbWUpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRGlyZWN0b3J5KGZpbGVOYW1lKTtcXG4gICAgICAgIH1cXG5cXG4gICAgfVxcblxcbn1cXG4vKipcXG4gKiDliKDpmaTljZXkuKrmlofku7ZcXG4gKiBcXG4gKiBAcGFyYW0gZmlsZU5hbWVcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOaWh+S7tueahOaWh+S7tuWQjVxcbiAqIEByZXR1cm4g5Y2V5Liq5paH5Lu25Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZUZpbGUoZmlsZU5hbWUpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7XFxuICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgIGZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuaIkOWKn++8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcIiArIGZpbGVOYW1lICsgXFxcIuWksei0pe+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuXFxufVxcbi8qKlxcbiAqIOWIoOmZpOebruW9le+8iOaWh+S7tuWkue+8ieS7peWPiuebruW9leS4i+eahOaWh+S7tlxcbiAqIFxcbiAqIEBwYXJhbSBkaXJcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOebruW9leeahOaWh+S7tui3r+W+hFxcbiAqIEByZXR1cm4g55uu5b2V5Yig6Zmk5oiQ5Yqf6L+U5ZuedHJ1ZSzlkKbliJnov5Tlm55mYWxzZVxcbiAqL1xcbmZ1bmN0aW9uIGRlbGV0ZURpcmVjdG9yeShkaXIpIHtcXG4gICAgLy8g5aaC5p6cZGly5LiN5Lul5paH5Lu25YiG6ZqU56ym57uT5bC+77yM6Ieq5Yqo5re75Yqg5paH5Lu25YiG6ZqU56ymXFxuICAgIGlmICghZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkge1xcbiAgICAgICAgZGlyID0gZGlyICsgRmlsZS5zZXBhcmF0b3I7XFxuICAgIH1cXG4gICAgbGV0IGRpckZpbGUgPSBuZXcgRmlsZShkaXIpO1xcbiAgICAvLyDlpoLmnpxkaXLlr7nlupTnmoTmlofku7bkuI3lrZjlnKjvvIzmiJbogIXkuI3mmK/kuIDkuKrnm67lvZXvvIzliJnpgIDlh7pcXG4gICAgaWYgKCFkaXJGaWxlLmV4aXN0cygpIHx8ICFkaXJGaWxlLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgIC8vbG9nKFxcXCLliKDpmaTnm67lvZXlpLHotKVcXFwiICsgZGlyICsgXFxcIuebruW9leS4jeWtmOWcqO+8gVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxuICAgIGxldCBmbGFnID0gdHJ1ZTtcXG4gICAgLy8g5Yig6Zmk5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2KOWMheaLrOWtkOebruW9lSlcXG4gICAgbGV0IGZpbGVzID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgLy8g5Yig6Zmk5a2Q5paH5Lu2XFxuICAgICAgICBpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHtcXG4gICAgICAgICAgICBmbGFnID0gZGVsZXRlRmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7XFxuICAgICAgICAgICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7IC8vIOWIoOmZpOWtkOebruW9lVxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVEaXJlY3RvcnkoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpO1xcbiAgICAgICAgICAgIGlmICghZmxhZykge1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKCFmbGFnKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2V5aSx6LSlXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gICAgLy8g5Yig6Zmk5b2T5YmN55uu5b2VXFxuICAgIGlmIChkaXJGaWxlLmRlbGV0ZSgpKSB7XFxuICAgICAgICAvL2xvZyhcXFwi5Yig6Zmk55uu5b2VXFxcIiArIGRpciArIFxcXCLmiJDlip/vvIFcXFwiKTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgLy9sb2coXFxcIuWIoOmZpOebruW9lVxcXCIgKyBkaXIgKyBcXFwi5aSx6LSl77yBXFxcIik7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuLy9jb3B55Y2V5Liq5paH5Lu2XFxuZnVuY3Rpb24gY29weUZpbGUoc291cmNlLCB0YXJnZXQsIGlzQ292ZXIpIHtcXG4gICAgbGV0IHNvdXJjZVBhdGggPSBQYXRocy5nZXQoc291cmNlKTtcXG4gICAgbGV0IHRhcmdldFBhdGggPSBQYXRocy5nZXQodGFyZ2V0KTtcXG4gICAgbGV0IGlzRXhpc3QgPSBGaWxlcy5leGlzdHModGFyZ2V0UGF0aCk7XFxuICAgIGlmIChGaWxlcy5pc0RpcmVjdG9yeShzb3VyY2VQYXRoKSB8fCAoaXNFeGlzdCAmJiAhaXNDb3ZlcikgfHwgKGlzRXhpc3QgJiYgRmlsZXMuaXNEaXJlY3RvcnkodGFyZ2V0UGF0aCkpKSB7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghaXNFeGlzdCkge1xcbiAgICAgICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKHRhcmdldFBhdGguZ2V0UGFyZW50KCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGlzQ292ZXIgPT09IHRydWUpIHtcXG4gICAgICAgICAgICBGaWxlcy5jb3B5KHNvdXJjZVBhdGgsIHRhcmdldFBhdGgsIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HLCBTdGFuZGFyZENvcHlPcHRpb24uQ09QWV9BVFRSSUJVVEVTKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgRmlsZXMuY29weShzb3VyY2VQYXRoLCB0YXJnZXRQYXRoLCBTdGFuZGFyZENvcHlPcHRpb24uQ09QWV9BVFRSSUJVVEVTKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldEZpbGVUaW1lKHBhdGgpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXG4gICAgbGV0IGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7XFxuICAgIGxldCBkYXRlID0gbmV3IERhdGUobGFzdE1vZGlmaWVkKTtcXG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXROYW1lKHBhdGgpIHtcXG4gICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldE5hbWUoKSArIFxcXCJcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGaWxlUGF0aChwYXRoLCB0eXBlLCBleHBhbmQpIHtcXG4gICAgdHlwZSA9IHR5cGUgfHwgXFxcImZpbGVcXFwiO1xcbiAgICBpZiAoIVtcXFwiZmlsZVxcXCIsIFxcXCJkaXJcXFwiXS5pbmNsdWRlcyh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFxcXCLnsbvlnovplJnor69cXFwiKTtcXG4gICAgbGV0IGZpbGVUeXBlID0gdHlwZSA9PT0gXFxcImZpbGVcXFwiID8gXFxcImlzRmlsZVxcXCIgOiBcXFwiaXNEaXJlY3RvcnlcXFwiO1xcbiAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKHBhdGgpO1xcbiAgICBsZXQgYXJyYXkgPSBmaWxlLmxpc3RGaWxlcygpIHx8IFtdO1xcbiAgICBsZXQgcGF0aExpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgaWYgKGFycmF5W2ldW2ZpbGVUeXBlXSgpKSB7XFxuICAgICAgICAgICAgcGF0aExpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIG5hbWU6IGFycmF5W2ldLmdldE5hbWUoKSArIFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICBwYXRoOiBhcnJheVtpXS5nZXRQYXRoKCkgKyBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBOdW1iZXIoYXJyYXlbaV0ubGFzdE1vZGlmaWVkKCkpLFxcblxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChleHBhbmQpIHtcXG4gICAgICAgIHBhdGhMaXN0ID0gcGF0aExpc3QuZmlsdGVyKGl0ID0+IGl0Lm5hbWUuZW5kc1dpdGgoZXhwYW5kKSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHBhdGhMaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiByZW5hbWVGaWxlKGZyb21QYXRoLCBuYW1lKSB7XFxuICAgIGxldCBmcm9tRmlsZSA9IG5ldyBGaWxlKGZyb21QYXRoKTtcXG4gICAgbGV0IHRvRmlsZSA9IG5ldyBGaWxlKGZyb21GaWxlLmdldFBhcmVudCgpICsgXFxcIi9cXFwiICsgbmFtZSk7XFxuICAgIHRyeSB7XFxuICAgICAgICBpZiAoIWZyb21GaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRvRmlsZS5leGlzdHMoKSkge1xcbiAgICAgICAgICAgIGlmICghZGVsZXRlRmxpZXModG9QYXRoKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgRmlsZXMubW92ZShmcm9tRmlsZS50b1BhdGgoKSwgdG9GaWxlLnRvUGF0aCgpLCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORyk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gbW92ZUZpbGVzKGZyb21QYXRoLCB0b1BhdGgpIHtcXG4gICAgbGV0IGZyb21GaWxlID0gbmV3IEZpbGUoZnJvbVBhdGgpO1xcbiAgICBsZXQgdG9GaWxlID0gbmV3IEZpbGUodG9QYXRoKTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICghZnJvbUZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodG9GaWxlLmV4aXN0cygpKSB7XFxuICAgICAgICAgICAgaWYgKCFkZWxldGVGbGllcyh0b1BhdGgpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBGaWxlcy5tb3ZlKGZyb21GaWxlLnRvUGF0aCgpLCB0b0ZpbGUudG9QYXRoKCksIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBmaWxlV3JpdGUocGF0aCwgY29udGVudCkge1xcbiAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCwgY29udGVudClcXG59XFxuXFxuZnVuY3Rpb24gZmlsZVdyaXRlQXBwZW5kKHBhdGgsIGNvbnRlbnQpIHtcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXG4gICAgbGV0IHBhdGhzID0gZmlsZS50b1BhdGgoKTtcXG4gICAgaWYgKGZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgIEZpbGVzLndyaXRlKHBhdGhzLCBuZXcgamF2YVN0cmluZyhjb250ZW50KS5nZXRCeXRlcygpLCBTdGFuZGFyZE9wZW5PcHRpb24uQVBQRU5EKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoLCBjb250ZW50KTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIoZmlsZSkge1xcbiAgICBpZiAoZmlsZS5pc0ZpbGUoKSkge1xcbiAgICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCk7XFxuICAgIH1cXG4gICAgbGV0IGNoaWxkcmVuID0gZmlsZS5saXN0RmlsZXMoKTtcXG4gICAgbGV0IHRvdGFsID0gMDtcXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcXG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XFxuICAgICAgICAgICAgdG90YWwgKz0gZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKGNoaWxkKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gdG90YWw7XFxufVxcblxcbmZ1bmN0aW9uIGdldEZpbGVTaXplKGZpbGVQYXRoKSB7XFxuICAgIC8vQnl0ZVxcbiAgICBsZXQgc2l6ZSA9IGdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihuZXcgRmlsZShmaWxlUGF0aCkpO1xcbiAgICBpZiAoc2l6ZSA8IDApIHtcXG4gICAgICAgIHJldHVybiBudWxsO1xcbiAgICB9XFxuICAgIGxldCB1bml0Rm9ybSA9IFtcXFwiQnl0ZVxcXCIsIFxcXCJLQlxcXCIsIFxcXCJNQlxcXCIsIFxcXCJHQlxcXCIsIFxcXCJUQlxcXCJdO1xcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdW5pdEZvcm0ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXG4gICAgICAgIGlmIChzaXplID4gMTAyNCkge1xcbiAgICAgICAgICAgIHNpemUgLz0gMTAyNDtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIHNpemUudG9GaXhlZCgyKS5yZXBsYWNlKC8oXFxcXC4wMCkkLywgXFxcIlxcXCIpICsgdW5pdEZvcm1baV07XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCJFUlJPUjrmlbDlgLzov4flpKdcXFwiO1xcbn1cXG4vL+WujOaVtOWQiOW5tlxcbi8qXFxuZnVuY3Rpb24gZmlsZUNvbWJpbmUoZmlsZXNJbnB1dCwgZmlsZU91dCwgZXh0ZW5zaW9uLCBpbnRlcmNlcHQpIHtcXG4gICAgd2l0aChqYXZhU2NvcGUpIHtcXG4gICAgICAgIGNvbnN0IFRNUF9CVUZGRVJfU0laRSA9IDB4MzAwMDA7XFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcbiAgICAgICAgLy/lkIjlubbkuLTml7bmlofku7ZcXG4gICAgICAgIGxldCBpbnB1dEZpbGUgPSBuZXcgRmlsZShmaWxlc0lucHV0KTtcXG4gICAgICAgIGxldCB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZU91dCArIFxcXCIudG1wXFxcIik7XFxuICAgICAgICBsZXQgdG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpKTtcXG4gICAgICAgIGxldCBpbnB1dEZpbGVzID0gaW5wdXRGaWxlLmxpc3RGaWxlcygpO1xcbiAgICAgICAgbGV0IHRieXMgPSBBcnJheS5uZXdJbnN0YW5jZShCeXRlLlRZUEUsIFRNUF9CVUZGRVJfU0laRSk7XFxuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGlucHV0RmlsZXMpIHtcXG4gICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpO1xcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gMDtcXG4gICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBpcy5yZWFkKHRieXMpKSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgdG9zLndyaXRlKHRieXMsIDAsIGxlbik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICB0b3MuY2xvc2UoKTtcXG4gICAgICAgIC8v6KeE5YiZ5pu/5o2i6KeE5YiZO1xcbiAgICAgICAgbGV0IG91dEZpbGUgPSBuZXcgRmlsZShmaWxlT3V0KTtcXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0ID09PSBcXFwiZnVuY3Rpb25cXFwiKSB7XFxuICAgICAgICAgICAgbGV0IHRpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRmlsZSk7XFxuICAgICAgICAgICAgbGV0IG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTtcXG4gICAgICAgICAgICBsZXQgbGVuID0gMDtcXG4gICAgICAgICAgICBsZXQgYnlzID0gQXJyYXkubmV3SW5zdGFuY2UoQnl0ZS5UWVBFLCBCVUZGRVJfU0laRSk7XFxuICAgICAgICAgICAgd2hpbGUgKChsZW4gPSB0aXMucmVhZChieXMpKSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICBsZXQgbmJ5cyA9IGludGVyY2VwdChuZXcgU3RyaW5nKGJ5cywwLGxlbikpO1xcbiAgICAgICAgICAgICAgICBvcy53cml0ZShuYnlzLCAwLCBuYnlzLmxlbmd0aCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7XFxuICAgICAgICAgICAgdGlzLmNsb3NlKCk7XFxuICAgICAgICAgICAgb3MuY2xvc2UoKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKG91dEZpbGUuZXhpc3RzKCkpIHtcXG4gICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdG1wRmlsZS5yZW5hbWVUbyhvdXRGaWxlKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn0qL1xcbi8v5q6LXFxuZnVuY3Rpb24gZmlsZVJ1bGUoZmlsZXNJbnB1dCwgZmlsZU91dCwgaW50ZXJjZXB0KSB7XFxuICAgIHdpdGgoamF2YVNjb3BlKSB7XFxuICAgICAgICBjb25zdCBCVUZGRVJfU0laRSA9IDB4MzAwMDAwO1xcbiAgICAgICAgbGV0IHRtcEZpbGUgPSBuZXcgRmlsZShmaWxlc0lucHV0KTtcXG4gICAgICAgIGlmICghKHRtcEZpbGUuZXhpc3RzKCkgJiYgdG1wRmlsZS5pc0ZpbGUoKSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgb3V0RmlsZSA9IG5ldyBGaWxlKGZpbGVPdXQpO1xcblxcbiAgICAgICAgbGV0IHRpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRmlsZSk7XFxuICAgICAgICBsZXQgb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSkpO1xcbiAgICAgICAgbGV0IGxlbiA9IDA7XFxuICAgICAgICBsZXQgYnlzID0gQXJyYXkubmV3SW5zdGFuY2UoQnl0ZS5UWVBFLCBCVUZGRVJfU0laRSk7XFxuICAgICAgICB3aGlsZSAoKGxlbiA9IHRpcy5yZWFkKGJ5cykpICE9IC0xKSB7XFxuICAgICAgICAgICAgbGV0IG5ieXMgPSBpbnRlcmNlcHQobmV3IFN0cmluZyhieXMsIDAsIGxlbikpO1xcbiAgICAgICAgICAgIG9zLndyaXRlKG5ieXMsIDAsIG5ieXMubGVuZ3RoKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7XFxuICAgICAgICB0aXMuY2xvc2UoKTtcXG4gICAgICAgIG9zLmNsb3NlKCk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiByZWFkRmlsZShwYXRoKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgcGF0aHMgPSBQYXRocy5nZXQocGF0aCk7XFxuICAgICAgICBpZiAoIUZpbGVzLmV4aXN0cyhwYXRocykpIHJldHVybiBcXFwiXFxcIjtcXG4gICAgICAgIHJldHVybiBTdHJpbmcobmV3IGphdmFTdHJpbmcoRmlsZXMucmVhZEFsbEJ5dGVzKHBhdGhzKSkpO1xcbiAgICB9IGNhdGNoIHtcXG4gICAgICAgIHJldHVybiBcXFwiXFxcIjtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGdldEZpbGVUaW1lOiAocGF0aCkgPT4gZ2V0RmlsZVRpbWUocGF0aCksXFxuICAgIGdldEZpbGVQYXRoOiAocGF0aCwgdHlwZSwgZXhwYW5kKSA9PiBnZXRGaWxlUGF0aChwYXRoLCB0eXBlLCBleHBhbmQpLFxcbiAgICBkZWxldGVGaWxlczogKHBhdGgpID0+IGRlbGV0ZUZpbGVzKHBhdGgpLFxcbiAgICByZW5hbWVGaWxlOiAocGF0aCwgbmFtZSkgPT4gcmVuYW1lRmlsZShwYXRoLCBuYW1lKSxcXG4gICAgbW92ZUZpbGVzOiAoZnJvbVBhdGgsIHRvUGF0aCkgPT4gbW92ZUZpbGVzKGZyb21QYXRoLCB0b1BhdGgpLFxcbiAgICBmaWxlV3JpdGU6IChwYXRoLCBjb250ZW50KSA9PiBmaWxlV3JpdGUocGF0aCwgY29udGVudCksXFxuICAgIGZpbGVXcml0ZUFwcGVuZDogKHBhdGgsIGNvbnRlbnQpID0+IGZpbGVXcml0ZUFwcGVuZChwYXRoLCBjb250ZW50KSxcXG4gICAgZ2V0TmFtZTogKHBhdGgpID0+IGdldE5hbWUocGF0aCksXFxuICAgIGdldEZpbGVTaXplOiAoZmlsZVBhdGgpID0+IGdldEZpbGVTaXplKGZpbGVQYXRoKSxcXG4gICAgZmlsZVJ1bGU6IChmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpID0+IGZpbGVSdWxlKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGludGVyY2VwdCksXFxuICAgIGNvcHlGaWxlOiAoc291cmNlLCB0YXJnZXQsIGlzQ292ZXIpID0+IGNvcHlGaWxlKHNvdXJjZSwgdGFyZ2V0LCBpc0NvdmVyKSxcXG4gICAgcmVhZEZpbGU6IChwYXRoKSA9PiByZWFkRmlsZShwYXRoKVxcbn1cIn0se1wiY29sX3R5cGVcIjpcInRleHRfMlwiLFwibmFtZVwiOlwiI3Yu5LiL6L295YiX6KGoLeaZrumAmuS4i+i9vVwiLFwicGF0aFwiOlwiZG93bmxvYWQudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3Qgdmlld0NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICBjaGFwdGVyTGlzdDogW10sXFxuICAgIGluZm86IHt9LFxcbiAgICBkZWZhdWx0VmlldzogXFxcIjBcXFwiXFxufSwgTVlfUEFSQU1TKTtcXG52aWV3Q29uZmlnLmluZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgcnVsZU5hbWU6IFxcXCJcXFwiLFxcbiAgICBib29rTmFtZTogXFxcIlxcXCIsXFxuICAgIGJvb2tUb3BQaWM6IFxcXCJcXFwiLFxcbiAgICBwYXJzZUNvZGU6IFxcXCJcXFwiLFxcbiAgICB0eXBlOiBcXFwiY29taWNcXFwiLFxcbn0sIHZpZXdDb25maWcuaW5mbyk7XFxubGV0IHtcXG4gICAgY2hhcHRlckxpc3QsXFxuICAgIGluZm8sXFxuICAgIGRlZmF1bHRWaWV3XFxufSA9IHZpZXdDb25maWc7XFxuc2V0UGFnZVRpdGxlKFxcXCLpgInmi6nlmah8XFxcIiArIGluZm8uYm9va05hbWUpXFxuXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxuY29uc3QgZGVmX0RvVmlfU3R5bGUgPSBDb25maWcuZGVmX0RvVmlfU3R5bGU7XFxuY29uc3QgTVlfSUQgPSBpbmZvLnJ1bGVOYW1lICsgXFxcIi8vXFxcIiArIGluZm8uYm9va05hbWU7XFxuXFxuXFxubGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpO1xcbmxldCB2aWV3TW9kZSA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjp2aWV3TW9kZVxcXCIsIGRlZmF1bHRWaWV3KTtcXG5sZXQgaXNSZXZlcnNlID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzUmV2ZXJzZVxcXCIsIFxcXCIwXFxcIik7XFxubGV0IHRhZ0ZpbHRlciA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiLCBDb25maWcuZGVmX0RvVmlfVHlwZSk7XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKChNWV9JRCkgPT4ge1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjp2aWV3TW9kZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpjb21wbGV0ZWRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOnRhZ0ZpbHRlclxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIik7XFxufSwgTVlfSUQpKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxuXFxuaWYgKGlzU3RhcnQgPT09IFxcXCIxXFxcIikge1xcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiLCBkZWZhdWx0Vmlldyk7XFxuICAgIHZpZXdNb2RlID0gXFxcIjFcXFwiO1xcbn1cXG5cXG5sZXQgYmFja3VwQ2hhcHRlckxpc3QgPSBjaGFwdGVyTGlzdDtcXG5pZiAodHlwZW9mIGNoYXB0ZXJMaXN0ID09PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICBjaGFwdGVyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBjaGFwdGVyTGlzdCkgfHwgXFxcIltdXFxcIik7XFxufVxcbmxldCBjaGFwdGVyQWxsID0gY2hhcHRlckxpc3Q7XFxuY2hhcHRlckxpc3QgPSBjaGFwdGVyTGlzdC5tYXAoKGl0ZW0sIENJRCkgPT4ge1xcbiAgICBpdGVtLkNJRCA9IENJRDtcXG4gICAgcmV0dXJuIGl0ZW07XFxufSk7XFxubGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnBhZ2VOdW1cXFwiLCBcXFwiMVxcXCIpKTtcXG5sZXQgY2hhcHRlckNodW5rID0gW2NoYXB0ZXJMaXN0XS5jb25jYXQoVG9vbC5jaHVuayhjaGFwdGVyTGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSkpO1xcbmNoYXB0ZXJMaXN0ID0gY2hhcHRlckNodW5rW3BhZ2VOdW1dIHx8IFtdO1xcblxcbmZ1bmN0aW9uIHNldFR5cGUoKSB7XFxuICAgIGxldCBzZXQgPSAodGFnLCBwdXQpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKHB1dCwgdGFnKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IDAgPT0gcGFnZU51bSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKFxcXCLlhajpg6goXFxcIiArIGNoYXB0ZXJBbGwubGVuZ3RoICsgXFxcIilcXFwiKS5mb250Y29sb3IoXFxcIiMyM0FENkZcXFwiKSA6IFxcXCLlhajpg6goXFxcIiArIGNoYXB0ZXJBbGwubGVuZ3RoICsgXFxcIilcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldCwgMCwgTVlfSUQgKyBcXFwiOnBhZ2VOdW1cXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2hhcHRlckNodW5rLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgdGFnVGV4dCA9IChpIC0gMSkgKiBDb25maWcudmlld1BhZ2VTaXplICsgXFxcIi1cXFwiICsgKChpIC0gMSkgKiBDb25maWcudmlld1BhZ2VTaXplICsgY2hhcHRlckNodW5rW2ldLmxlbmd0aCk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGkgPT0gcGFnZU51bSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgdGFnVGV4dC5mb250Y29sb3IoXFxcIiMyM0FENkZcXFwiKSA6IHRhZ1RleHQsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldCwgaSwgTVlfSUQgKyBcXFwiOnBhZ2VOdW1cXFwiKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHRhZ0ZpbHRlciA9PT0gXFxcIjBcXFwiID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5YWo6YOoXFxcIi5mb250Y29sb3IoXFxcIiMyM0FENkZcXFwiKSA6IFxcXCLlhajpg6hcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldCwgXFxcIjBcXFwiLCBNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFwiMVxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLmnKrkuIvovb1cXFwiLmZvbnRjb2xvcihcXFwiIzIzQUQ2RlxcXCIpIDogXFxcIuacquS4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0LCBcXFwiMVxcXCIsIE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0YWdGaWx0ZXIgPT09IFxcXCIyXFxcIiA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuW3suS4i+i9vVxcXCIuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5bey5LiL6L29XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIFxcXCIyXFxcIiwgTVlfSUQgKyBcXFwiOnRhZ0ZpbHRlclxcXCIpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGNoYXB0ZXJUZWFtID0gW107XFxubGV0IHJlY29yZCA9IFtdO1xcbmlmIChpbmZvLnR5cGUgPT09IFxcXCJjb21pY1xcXCIpIHtcXG4gICAgbGV0IGxhenkgPSAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXG4gICAgICAgIGxldCBwaWNsaXN0ID0gZmlsZWxpc3QubWFwKChpdGVtLCBpKSA9PiBcXFwiZmlsZTovL1xcXCIgKyBpbnB1dCArIFxcXCIvXFxcIiArIChpICsgMSkgKyBcXFwiLmpwZ1xcXCIpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIiArIHBpY2xpc3Quam9pbihcXFwiJiZcXFwiKTtcXG4gICAgfSk7XFxuXFxuICAgIGZ1bmN0aW9uIGNvbUZ1bihpLCBpdGVtKSB7XFxuICAgICAgICBsZXQgcm9vdFBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiL1xcXCIgKyBpICsgXFxcIiRBJFxcXCIgKyBpdGVtLnRpdGxlO1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAneKAnVxcXCIsXFxuICAgICAgICAgICAgdXJsOiByb290UGF0aCArIGxhenksXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaSxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBkZWZfRG9WaV9TdHlsZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW2luZm8udHlwZSArIFxcXCJQYXRoXFxcIl0gKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZSwgXFxcImRpclxcXCIpLmZvckVhY2goKGZpbGUpID0+IHtcXG4gICAgICAgIGxldCBhdHQgPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgICAgIGlmIChhdHQubGVuZ3RoID09PSAzICYmIGF0dFsxXSA9PT0gKFxcXCJBXFxcIikpIHtcXG4gICAgICAgICAgICByZWNvcmQucHVzaChhdHRbMl0pO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBmdW5jdGlvbiBjb21GdW4oaSwgaXRlbSkge1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAneKAnVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGksXFxuICAgICAgICAgICAgICAgIHBhdGg6IENvbmZpZy5ub3ZlbFBhdGggKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCIvXFxcIiArIGkgKyBcXFwiJEEkXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwiLnR4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tpbmZvLnR5cGUgKyBcXFwiUGF0aFxcXCJdICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUsIFxcXCJmaWxlXFxcIiwgXFxcIi50eHRcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxuICAgICAgICBsZXQgYXR0ID0gVG9vbC5zcGxpdChmaWxlLm5hbWUsIFxcXCIkXFxcIiwgMik7XFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFwiQVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVjb3JkLnB1c2goYXR0WzJdLnNsaWNlKDAsIGF0dFsyXS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBjbGlja0Rvd25sb2FkKGl0ZW0sIGluZm8sIE1ZX0lELCBpKSB7XFxuICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGxldCBFbGVtZW50SW5kZXggPSBsb2FkaW5nVGVhbS5pbmRleE9mKGkpO1xcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb1cXFwiO1xcblxcbiAgICBsb2FkaW5nVGVhbS5wdXNoKGkpO1xcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShsb2FkaW5nVGVhbSkpO1xcbiAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCY4oCYXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCZ4oCZXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IHJlc3VsdCA9IFxcXCJ0b2FzdDovL+S4i+i9veWksei0pVxcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICB0b2FzdChcXFwi5byA5aeL5LiL6L29OlxcXCIgKyBpdGVtLnRpdGxlKTtcXG4gICAgICAgIGxldCBkb3dubG9hZCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0Rvd25sb2FkLmV4ZS5qc1xcXCIpO1xcbiAgICAgICAgcmVzdWx0ID0gZG93bmxvYWQoaXRlbSwgaW5mbywgTVlfSUQsIGkpO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcInRvYXN0Oi8v5bey5LiL6L29XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgbG9hZGluZ1RlYW0uc3BsaWNlKEVsZW1lbnRJbmRleCwgMSk7XFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShsb2FkaW5nVGVhbSkpO1xcbiAgICB9XFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIHNpbmdsZVZpZXcoKSB7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Y+N6L2s5YiX6KGoXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlLCBNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjppc1JldmVyc2VcXFwiLCBpc1JldmVyc2UgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpc1JldmVyc2UsIE1ZX0lEKSxcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9pZD0zM252RHFiSEg3SFcmc2l6ZT00OCZmb3JtYXQ9Z2lmJnRva2VuPVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fMlxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5om56YeP5LiL6L29XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGlmIChsb2FkaW5nVGVhbS5sZW5ndGggPiAwKSByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5pyJ5Lu75Yqh5rKh5pyJ5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICBpZiAoZ2V0QXBwVmVyc2lvbigpIDwgMjU5NCkgcmV0dXJuIFxcXCJ0b2FzdDovL+acquW8gOaUvlxcXCI7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG5cXG4gICAgICAgIH0sIE1ZX0lEKSxcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPTB1YWZhTU56eGo4OCZ0b2tlbj1cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzJcXFwiXFxuICAgIH0pO1xcbiAgICBzZXRUeXBlKCk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGZvciAobGV0IGkgPSAwLCBpdGVtID0gY2hhcHRlckxpc3RbMF07IGkgPCBjaGFwdGVyTGlzdC5sZW5ndGg7IGl0ZW0gPSBjaGFwdGVyTGlzdFsrK2ldKSB7XFxuICAgICAgICBsZXQgaXNfZG93bmxvYWQgPSByZWNvcmQuaW5jbHVkZXMoaXRlbS50aXRsZSk7XFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBjaGFwdGVyVGVhbS5wdXNoKGNvbUZ1bihpdGVtLkNJRCwgaXRlbSkpO1xcbiAgICAgICAgfSBlbHNlIGlmICghaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFwiMlxcXCIpIHtcXG4gICAgICAgICAgICBjaGFwdGVyVGVhbS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGxvYWRpbmdUZWFtLmluY2x1ZGVzKGl0ZW0uQ0lEKSA/IFxcXCLigJjigJhcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJnigJlcXFwiIDogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGNsaWNrRG93bmxvYWQsIGl0ZW0sIGluZm8sIE1ZX0lELCBpdGVtLkNJRCksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpdGVtLkNJRFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBjbGlja0Nob29zZSh0aXRsZSwgTVlfSUQsIGkpIHtcXG4gICAgbGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpO1xcbiAgICBpZiAoaXNTdGFydCA9PT0gXFxcIjFcXFwiKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29Li4uXFxcIjtcXG4gICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBsZXQgRWxlbWVudEluZGV4ID0gYmF0Y2hUZWFtLmluZGV4T2YoaSk7XFxuICAgIGlmIChFbGVtZW50SW5kZXggPiAtMSkge1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGJhdGNoVGVhbS5zcGxpY2UoRWxlbWVudEluZGV4LCAxKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCY4oCYXFxcIiArIHRpdGxlICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgYmF0Y2hUZWFtLnB1c2goaSk7XFxuICAgIH1cXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBiYXRjaFZpZXcoKSB7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Y2V6YCJ5LiL6L29XFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9pZD1QSWljdkY2ZWJ6TW4mc2l6ZT00OCZmb3JtYXQ9Z2lmJnRva2VuPVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIikgPT09IFxcXCIxXFxcIikgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOaJuemHj+S4i+i9vVxcXCI7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIE1ZX0lEKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIlxcbiAgICB9KTtcXG4gICAgbGV0IHN0YXJ0ID0gQ29uZmlnLnZpZXdQYWdlU2l6ZSAqIE1hdGgubWF4KHBhZ2VOdW0gLSAxLCAwKTtcXG4gICAgbGV0IGVuZCA9IHN0YXJ0ICsgY2hhcHRlckxpc3QubGVuZ3RoO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIumAieaLqeWFqOmDqFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD0xSFZjSExvTnpyaXQmdG9rZW49XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoc3RhcnQsIGVuZCwgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICAgICAgICAgIGxldCBjaG9vc2VUZWFtID0gVG9vbC5yYW5nZShzdGFydCwgZW5kKTtcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gQXJyYXkuZnJvbShuZXcgU2V0KGJhdGNoVGVhbS5jb25jYXQoY2hvb3NlVGVhbSkpKTtcXG4gICAgICAgICAgICBsZXQgY29tcGxldGVkID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6Y29tcGxldGVkXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcigoaSkgPT4gIWNvbXBsZXRlZC5pbmNsdWRlcyhpKSk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBzdGFydCwgZW5kLCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Y+W5raI5YWo6YOoXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPUh6RWpQcEkzTkw4RCZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChzdGFydCwgZW5kLCBNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcIik7XFxuICAgICAgICAgICAgbGV0IGNob29zZVRlYW0gPSBuZXcgU2V0KFRvb2wucmFuZ2Uoc3RhcnQsIGVuZCkpO1xcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICBiYXRjaFRlYW0gPSBiYXRjaFRlYW0uZmlsdGVyKHggPT4gIWNob29zZVRlYW0uaGFzKHgpKTtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkoYmF0Y2hUZWFtKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH0sIHN0YXJ0LCBlbmQsIE1ZX0lEKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLnoa7orqTpgInkuK1cXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9dE1ydnRjNlQ5aFZiJnRva2VuPVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIiwgXFxcIi0xXFxcIikgIT09IFxcXCItMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9vS4uLlxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hUZWFtLmxlbmd0aCA9PT0gMCA/IFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeaciemAiVxcXCIgOiBcXFwiaGlrZXI6Ly9wYWdlL0JhdGNoLnZpZXcjbm9SZWZyZXNoIyNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgfSwgTVlfSUQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBuZXdXaW5kb3c6IHRydWUsXFxuICAgICAgICAgICAgd2luZG93SWQ6IE1ZX0lEICsgXFxcIi8v5om56YeP5LiL6L29XFxcIixcXG4gICAgICAgICAgICBNWV9JRDogTVlfSUQsXFxuICAgICAgICAgICAgY2hhcHRlckxpc3Q6IGJhY2t1cENoYXB0ZXJMaXN0LFxcbiAgICAgICAgICAgIGluZm86IGluZm9cXG4gICAgICAgIH0sXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIHNldFR5cGUoKTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBsZXQgY29tcGxldGVkID0gW107XFxuICAgIGZvciAobGV0IGkgPSAwLCBpdGVtID0gY2hhcHRlckxpc3RbMF07IGkgPCBjaGFwdGVyTGlzdC5sZW5ndGg7IGl0ZW0gPSBjaGFwdGVyTGlzdFsrK2ldKSB7XFxuICAgICAgICBsZXQgaXNfZG93bmxvYWQgPSByZWNvcmQuaW5jbHVkZXMoaXRlbS50aXRsZSk7XFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBjb21wbGV0ZWQucHVzaChpdGVtLkNJRCk7XFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcIjJcXFwiKSB7XFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBiYXRjaFRlYW0uaW5jbHVkZXMoaXRlbS5DSUQpID8gXFxcIuKAmOKAmFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAmeKAmVxcXCIgOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoY2xpY2tDaG9vc2UsIGl0ZW0udGl0bGUsIE1ZX0lELCBpdGVtLkNJRCksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpdGVtLkNJRFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6Y29tcGxldGVkXFxcIiwgSlNPTi5zdHJpbmdpZnkoY29tcGxldGVkKSk7XFxufVxcbnN3aXRjaCAodmlld01vZGUpIHtcXG4gICAgY2FzZSBcXFwiMFxcXCI6XFxuICAgICAgICBzaW5nbGVWaWV3KCk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwiMVxcXCI6XFxuICAgICAgICBiYXRjaFZpZXcoKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5pZiAoaXNSZXZlcnNlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgY2hhcHRlclRlYW0ucmV2ZXJzZSgpO1xcbn1cXG5sYXlvdXQucHVzaC5hcHBseShsYXlvdXQsIGNoYXB0ZXJUZWFtKTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuaJuemHj+S4i+i9veWZqFwiLFwicGF0aFwiOlwiQmF0Y2gudmlld1wiLFwicnVsZVwiOlwianM6XFxubGV0IHtcXG4gICAgY2hhcHRlckxpc3QsXFxuICAgIGluZm8sXFxuICAgIE1ZX0lEXFxufSA9IE1ZX1BBUkFNUztcXG5zZXRQYWdlVGl0bGUoXFxcIuS4i+i9veWZqHxcXFwiK2luZm8uYm9va05hbWUpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIik7XFxuICAgIHJlZnJlc2hQYWdlKCk7XFxufSwgTVlfSUQpKTtcXG5cXG5sZXQgaXNTdGFydCA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxubGV0IGxheW91dCA9IFtdO1xcblxcbmxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG5pZih0eXBlb2YgY2hhcHRlckxpc3QgPT09IFxcXCJzdHJpbmdcXFwiKXtcXG4gICAgY2hhcHRlckxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiK2NoYXB0ZXJMaXN0KXx8XFxcIltdXFxcIik7XFxufVxcbmxldCBjaGFwdGVyVGVhbSA9IGJhdGNoVGVhbS5tYXAodiA9PiB7XFxuICAgIGxldCBjaGFwdGVySXRlbSA9IGNoYXB0ZXJMaXN0W3ZdO1xcbiAgICBjaGFwdGVySXRlbS5DSUQgPSB2O1xcbiAgICByZXR1cm4gY2hhcHRlckl0ZW07XFxufSk7XFxuaWYgKGlzU3RhcnQgPT09IFxcXCIwXFxcIikge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuW8gOWni+S4i+i9vVtcXFwiICsgY2hhcHRlclRlYW0ubGVuZ3RoICsgXFxcIl1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIGxldCBkb3dubG9hZCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0JhdGNoU3RhdGlzdGljcy5qc1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBkb3dubG9hZChjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpIHx8IFxcXCJ0b2FzdDovL+S4i+i9vemUmeivr1xcXCI7XFxuICAgICAgICB9LCBjaGFwdGVyVGVhbSwgaW5mbywgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85byA5aeL5LiL6L29XFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLku7vliqHliJfooajvvJpcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB9KTtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyVGVhbSkge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG5cXG59IGVsc2Uge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS4i+i9vei/m+W6pjowL1xcXCIrY2hhcHRlclRlYW0ubGVuZ3RoLFxcbiAgICAgICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneKWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh+KWh1xcXCIuZm9udGNvbG9yKFxcXCIjZTVlMWU0XFxcIikrXFxcIiAwJVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9vei/m+W6plxcXCIsXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWQjuWPsOS4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJmdW5jOi8vYmFja2dyb3VuZFxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgfSk7XFxuXFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBbXFxcIlvlj5bmtojkuIvovb1dXFxcIiwgXFxcIlvmraPlnKjlgZzmraIuLi5dXFxcIiwgXFxcIlvov5Tlm55dXFxcIiwgXFxcIlvlpITnkIblpLHotKVdXFxcIiwgXFxcIlvph43mlrDlvIDlp4tdXFxcIl1bc3RhdHVzXSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXFxcIjBcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiW+ato+WcqOWBnOatoi4uLl1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3mjqfliLZcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5Y+W5raI5LiL6L295Lu75YqhXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmmoLlgZwuLi5cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBcXFwiMlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6YCA5Ye65LiL6L295ZmoXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFtcXFwiM1xcXCIsIFxcXCI0XFxcIl0uaW5jbHVkZXMoc3RhdHVzKSkge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjppc1N0YXJ0XFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjpsb2dcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mHjeaWsOeCueWHu+S4i+i9vVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPHN0cm9uZz7kuIvovb3ml6Xlv5c8L3N0cm9uZz5cXFwiLmJpZygpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzml6Xlv5dcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi4oCc4oCc4oCd4oCdJD5cXFwiK1xcXCLlvIDlp4vkuIvovb0uLi4uLi5cXFwiLmZvbnRjb2xvcihcXFwiIzAwZmYwMFxcXCIpLFxcbiAgICAgICAgdXJsOlxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNsb2cjMFxcXCIsXFxuICAgICAgICAgICAgbGluZVZpc2libGU6ZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcblxcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ZnLuaJuemHj+S4i+i9vee7n+iuoVwiLFwicGF0aFwiOlwiQmF0Y2hTdGF0aXN0aWNzLmpzXCIsXCJydWxlXCI6XCJjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxuZnVuY3Rpb24gdGFzayh0YXNrUGFyYW0pIHtcXG4gICAgbGV0IHJlc3VsdCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0JhdGNoLmV4ZS5qc1xcXCIpKHRhc2tQYXJhbSk7XFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcblxcbiQuZXhwb3J0cyA9IGZ1bmN0aW9uKGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCkge1xcbiAgICBpZiAoY2hhcHRlclRlYW0ubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v56m655qE5LiL6L296Zif5YiXXFxcIjtcXG4gICAgfVxcbiAgICB2YXIgY291bnQgPSAwO1xcbiAgICB2YXIgdGFza0NvdW50ID0gY2hhcHRlclRlYW0ubGVuZ3RoO1xcbiAgICB2YXIgc3VjY2Vzc0NJRCA9IFtdO1xcbiAgICB2YXIgZmFpbE5hbWUgPSBbXTtcXG4gICAgdmFyIGxvZ0NvdW50ID0gMTtcXG4gICAgdmFyIHRhc2tUZWFtID0gY2hhcHRlclRlYW0ubWFwKGNoYXB0ZXJJdGVtID0+ICh7XFxuICAgICAgICBmdW5jOiB0YXNrLFxcbiAgICAgICAgaWQ6IGNoYXB0ZXJJdGVtLnRpdGxlLFxcbiAgICAgICAgcGFyYW06IHtcXG4gICAgICAgICAgICBjaGFwdGVySXRlbTogY2hhcHRlckl0ZW0sXFxuICAgICAgICAgICAgaW5mbzogaW5mbyxcXG4gICAgICAgICAgICBNWV9JRDogTVlfSURcXG4gICAgICAgIH1cXG4gICAgfSkpO1xcbiAgICBsZXQgbG9nTnVtID0gQ29uZmlnLmxvZ051bTtcXG5cXG4gICAgZnVuY3Rpb24gcHV0TG9nKHRleHQpIHtcXG4gICAgICAgIGxvZyh0ZXh0KTtcXG4gICAgICAgIGlmIChsb2dDb3VudCA+PSBsb2dOdW0pIHtcXG4gICAgICAgICAgICBkZWxldGVJdGVtKE1ZX0lEICsgXFxcIiNsb2cjXFxcIiArIChsb2dDb3VudCAtIDEwKSk7XFxuICAgICAgICB9XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoTVlfSUQgKyBcXFwifHzml6Xlv5dcXFwiLCB7XFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgdGl0bGU6IFxcXCIkPlxcXCIgKyB0ZXh0LFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjbG9nI1xcXCIgKyBsb2dDb3VudFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgbG9nQ291bnQrKztcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBsaXN0ZW5lcihwZXJjaCwgaWQsIGVycm9yLCBDSUQpIHtcXG4gICAgICAgIGNvdW50Kys7XFxuICAgICAgICBsZXQgaXNTdWNjZXNzID0gZmFsc2U7XFxuICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcXG4gICAgICAgICAgICBmYWlsTmFtZS5wdXNoKGlkKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl3kuIvovb3lpLHotKXvvJpcXFwiICsgaWQgKyBcXFwiPEVSUk9SQCBcXFwiICsgZXJyb3IgKyBcXFwiPlxcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmIChDSUQgPj0gMCkge1xcbiAgICAgICAgICAgIHN1Y2Nlc3NDSUQucHVzaChDSUQpO1xcbiAgICAgICAgICAgIGxldCByYXRpbyA9IChjb3VudCAvIHRhc2tDb3VudCkudG9GaXhlZCg0KTtcXG4gICAgICAgICAgICBsZXQgc3RyaXBDb3VudCA9IE1hdGguY2VpbChyYXRpbyAqIDEwKTtcXG4gICAgICAgICAgICBpc1N1Y2Nlc3MgPSB0cnVlO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuS4i+i9vei/m+W6pu+8mlxcXCIgKyBzdWNjZXNzQ0lELmxlbmd0aCArIFxcXCIvXFxcIiArIHRhc2tDb3VudCxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi4paHXFxcIi5yZXBlYXQoc3RyaXBDb3VudCkuZm9udGNvbG9yKFxcXCIjZmZhYzJkXFxcIikgKyBcXFwi4paHXFxcIi5yZXBlYXQoMTAgLSBzdHJpcENvdW50KS5mb250Y29sb3IoXFxcIiNlNWUxZTRcXFwiKSArIFxcXCIgXFxcIiArIChyYXRpbyAqIDEwMCkgKyBcXFwiJVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwifHzkuIvovb3ov5vluqZcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl3lt7LlrozmiJDkuIvovb3vvJpcXFwiICsgaWQpO1xcbiAgICAgICAgfSBlbHNlIGlmIChDSUQgPT09IC0xKSB7XFxuICAgICAgICAgICAgZmFpbE5hbWUucHVzaChpZCk7XFxuICAgICAgICAgICAgcHV0TG9nKFxcXCJbbGlzdGVuZXJd5bey5YGc5q2i77yaXFxcIiArIGlkKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0YXNrQ291bnQgIT09IGNvdW50KSByZXR1cm47XFxuICAgICAgICBpZiAoc3VjY2Vzc0NJRC5sZW5ndGggPT09IHRhc2tDb3VudCkge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLilodcXFwiLnJlcGVhdCgxMCkuZm9udGNvbG9yKFxcXCIjMDBmZjAwXFxcIikgKyBcXFwiIDEwMCVcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L296L+b5bqmXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOnN0YXR1c1xcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICBsZXQgZmFpbFRlYW0gPSBiYXRjaFRlYW0uZmlsdGVyKHYgPT4gIXN1Y2Nlc3NDSUQuaW5jbHVkZXModikpO1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGZhaWxUZWFtKSk7XFxuICAgICAgICBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgIT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiM1xcXCIpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwi5LiL6L295aSx6LSlOltcXFwiICsgZmFpbE5hbWUuam9pbihcXFwiXe+8jFtcXFwiKSArIFxcXCJd44CCXFxcIik7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiW+WkhOeQhuWksei0pV1cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGZhaWxUZWFtLmxlbmd0aCA+IDAgJiYgc3RhdHVzID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjRcXFwiKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIltsaXN0ZW5lcl0j5bey5YGc5q2i5omA5pyJ5Lu75Yqh77yM5L2G5bey5pyJ6L+b5bqm5LiN5Lya5raI5aSxI1xcXCIpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIlvph43mlrDlvIDlp4tdXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCJ8fOS4i+i9veaOp+WItlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjJcXFwiKTtcXG4gICAgICAgICAgICBwdXRMb2coXFxcIuS4i+i9veS7u+WKoVtcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCJd5bey5YWo6YOo5oiQ5Yqf5a6M5oiQXFxcIik7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiW+i/lOWbnl1cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICB0b2FzdChcXFwi5LiL6L295Lu75YqhW1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIl3lt7LlrozmiJBcXFwiKTtcXG4gICAgfVxcbiAgICBsZXQgdGFza1RlYW1DaHVuayA9IFtdO1xcbiAgICBpZiAoQ29uZmlnLnRocmVhZE51bSA+IDApIHtcXG4gICAgICAgIHRhc2tUZWFtQ2h1bmsgPSBUb29sLmNodW5rKHRhc2tUZWFtLCBDb25maWcudGhyZWFkTnVtKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHRhc2tUZWFtQ2h1bmsgPSBbdGFza1RlYW1dO1xcbiAgICB9XFxuICAgIGZvciAobGV0IHRhc2tMaXN0IG9mIHRhc2tUZWFtQ2h1bmspIHtcXG4gICAgICAgIGJlKHRhc2tMaXN0LCB7XFxuICAgICAgICAgICAgZnVuYzogbGlzdGVuZXJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmFpbFRlYW0gPSBiYXRjaFRlYW0uZmlsdGVyKHYgPT4gIXN1Y2Nlc3NDSUQuaW5jbHVkZXModikpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShmYWlsVGVhbSkpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiNFxcXCIpO1xcbiAgICAgICAgICAgIHB1dExvZyhcXFwiW2xpc3RlbmVyXSPlt7LlgZzmraLmiYDmnInku7vliqHvvIzkvYblt7LmnInov5vluqbkuI3kvJrmtojlpLEjXFxcIik7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiW+mHjeaWsOW8gOWni11cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcInx85LiL6L295o6n5Yi2XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH1cXG5cXG4gICAgfVxcblxcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjZmcu5om56YeP5Li756iL5bqPXCIsXCJwYXRoXCI6XCJCYXRjaC5leGUuanNcIixcInJ1bGVcIjpcImNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcblxcbmZ1bmN0aW9uIGNvbWljKHRhc2tQYXJhbSkge1xcbiAgICBsZXQge1xcbiAgICAgICAgY2hhcHRlckl0ZW0sXFxuICAgICAgICBpbmZvLFxcbiAgICAgICAgTVlfSUQsXFxuICAgIH0gPSB0YXNrUGFyYW07XFxuICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIlxcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgIHJldHVybiAtMTtcXG4gICAgfVxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiL1xcXCI7XFxuICAgIGxldCBjaGFwdGVyUGF0aCA9IG1haW5QYXRoICsgY2hhcHRlckl0ZW0uQ0lEICsgXFxcIiRCJFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSArIFxcXCIvXFxcIjtcXG4gICAgbGV0IHBpY0xpc3Q7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFwiaW5wdXRcXFwiLCBcXFwidXJsXFxcIiwgXFxcInJldHVybiBcXFwiICsgaW5mby5wYXJzZUNvZGUpO1xcbiAgICAgICAgcGljTGlzdCA9IGdldFBpY0xpc3QoY2hhcHRlckl0ZW0udXJsLCBjaGFwdGVySXRlbS51cmwpO1xcbiAgICAgICAgaWYgKHR5cGVvZiBwaWNMaXN0ID09PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgICAgIHBpY0xpc3QgPSBwaWNMaXN0LnJlcGxhY2UoXFxcInBpY3M6Ly9cXFwiLCBcXFwiXFxcIikuc3BsaXQoXFxcIiYmXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGUubWVzc2FnZSA9IFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+v77yaXFxcIiArIGUubWVzc2FnZSArIFxcXCI+XFxcIjtcXG4gICAgICAgIHRocm93IGU7XFxuICAgIH1cXG4gICAgY29uc3QgTCA9IHBpY0xpc3QubGVuZ3RoO1xcbiAgICBpZihMPT09MCl7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor6/vvJrlm77niYfpk77mjqXov5Tlm57kuLrnqbo+XFxcIik7XFxuICAgIH1cXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgYm9va1RvcFBpYyA9IFRvb2wuaGlrZXJQaWMoaW5mby5ib29rVG9wUGljKTtcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcIi5qcGdcXFwiLCBib29rVG9wUGljWzFdKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIjzlsIHpnaLkuIvovb3plJnor6/vvJpcXFwiICsgZS5tZXNzYWdlICsgXFxcIj5cXFwiKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICB2YXIgc2NoZWR1bGUgPSBuZXcgTWFwKFtcXG4gICAgICAgIFtMLCAoKSA9PiBsb2coY2hhcHRlckl0ZW0udGl0bGUgKyBcXFwi5bey5LiL6L29MTAwJVxcXCIpXSxcXG4gICAgICAgIFt+figwLjkwICogTCksICgpID0+IGxvZyhjaGFwdGVySXRlbS50aXRsZSArIFxcXCLlt7LkuIvovb05MCUrXFxcIildLFxcbiAgICAgICAgW35+KDAuNzUgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcIuW3suS4i+i9vTc1JStcXFwiKV0sXFxuICAgICAgICBbfn4oMC41MCAqIEwpLCAoKSA9PiBsb2coY2hhcHRlckl0ZW0udGl0bGUgKyBcXFwi5bey5LiL6L29NTAlK1xcXCIpXSxcXG4gICAgICAgIFt+figwLjI1ICogTCksICgpID0+IGxvZyhjaGFwdGVySXRlbS50aXRsZSArIFxcXCLlt7LkuIvovb0yNSUrXFxcIildXFxuICAgIF0pO1xcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEw7IGkrKykge1xcbiAgICAgICAgbGV0IHBpYyA9IFRvb2wuaGlrZXJQaWMocGljTGlzdFtpXSk7XFxuICAgICAgICByZXF1aXJlRG93bmxvYWQocGljWzBdLCBjaGFwdGVyUGF0aCArIChpICsgMSkgKyBcXFwiLmpwZ1xcXCIsIHBpY1sxXSk7XFxuICAgICAgICBzY2hlZHVsZS5oYXMoaSArIDEpICYmIHNjaGVkdWxlLmdldChpICsgMSkoKTtcXG4gICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6c3RhdHVzXFxcIiwgXFxcIlxcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gLTE7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgRmlsZS5yZW5hbWVGaWxlKGNoYXB0ZXJQYXRoLCBjaGFwdGVySXRlbS5DSUQgKyBcXFwiJEEkXFxcIiArIGNoYXB0ZXJJdGVtLnRpdGxlKTtcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtLkNJRDtcXG59XFxuXFxuZnVuY3Rpb24gbm92ZWwodGFza1BhcmFtKSB7XFxuICAgIGxldCB7XFxuICAgICAgICBjaGFwdGVySXRlbSxcXG4gICAgICAgIGluZm8sXFxuICAgICAgICBNWV9JRCxcXG4gICAgfSA9IHRhc2tQYXJhbTtcXG4gICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcIjpzdGF0dXNcXFwiLCBcXFwiXFxcIikgPT09IFxcXCIxXFxcIikge1xcbiAgICAgICAgcmV0dXJuIC0xO1xcbiAgICB9XFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5ub3ZlbFBhdGggKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCIvXFxcIjtcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBjaGFwdGVySXRlbS5DSUQgKyBcXFwiJEEkXFxcIiArIGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcIi50eHRcXFwiO1xcbiAgICBsZXQgY29udGVudCA9IFxcXCJcXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGdldENvbnRlbnQgPSBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcInVybFxcXCIsIFxcXCJyZXR1cm4gXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXG4gICAgICAgIGNvbnRlbnQgPSBnZXRDb250ZW50KGNoYXB0ZXJJdGVtLnVybCwgY2hhcHRlckl0ZW0udXJsKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor6/vvJpcXFwiICsgZS5tZXNzYWdlICsgXFxcIj5cXFwiO1xcbiAgICAgICAgdGhyb3cgZTtcXG4gICAgfVxcbiAgICBpZiAoIWNvbnRlbnQpIHtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiPOWwj+ivtOato+aWh+ino+aekOmUmeivr++8muato+aWh+i/lOWbnuS4uuepuj5cXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcbiAgICAgICAgICAgIHJlcXVpcmVEb3dubG9hZChib29rVG9wUGljWzBdLCBtYWluUGF0aCArIGluZm8uYm9va05hbWUgKyBcXFwiLmpwZ1xcXCIsIGJvb2tUb3BQaWNbMV0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiPOWwgemdouS4i+i9vemUmeivr++8mlxcXCIgKyBlLm1lc3NhZ2UgKyBcXFwiPlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIEZpbGUuZmlsZVdyaXRlKGNoYXB0ZXJQYXRoLCBjb250ZW50LnJlcGxhY2UoLzxzY3JpcHQ+Lio/PFxcXFwvc2NyaXB0Pi9nbWksIFxcXCJcXFwiKS50cmltUmlnaHQoKSk7XFxuICAgIC8vRmlsZS5yZW5hbWVGaWxlKGNoYXB0ZXJQYXRoLCBjaGFwdGVySXRlbS5DSUQgKyBcXFwiJEEkXFxcIiArIGNoYXB0ZXJJdGVtLnRpdGxlKTtcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtLkNJRDtcXG59XFxudmFyICRleGUgPSB7XFxuICAgIGNvbWljOiBjb21pYyxcXG4gICAgbm92ZWw6IG5vdmVsXFxufTtcXG4kLmV4cG9ydHMgPSBmdW5jdGlvbih0YXNrUGFyYW0pIHtcXG4gICAgcmV0dXJuICRleGVbdGFza1BhcmFtLmluZm8udHlwZV0odGFza1BhcmFtKTtcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI2ZnLuaZrumAmuS4u+eoi+W6j1wiLFwicGF0aFwiOlwiRG93bmxvYWQuZXhlLmpzXCIsXCJydWxlXCI6XCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5cXG5mdW5jdGlvbiBub3ZlbChpdGVtLCBpbmZvLCBNWV9JRCwgb3JkZXIpIHtcXG4gICAgbGV0IG1haW5QYXRoID0gQ29uZmlnLm5vdmVsUGF0aCArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIi9cXFwiO1xcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIG9yZGVyICsgXFxcIiRBJFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIi50eHRcXFwiO1xcbiAgICBsZXQgY29udGVudCA9IFxcXCJcXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGdldENvbnRlbnQgPSBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcInVybFxcXCIsIFxcXCJyZXR1cm4gXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXG4gICAgICAgIGNvbnRlbnQgPSBnZXRDb250ZW50KGl0ZW0udXJsLCBpdGVtLnVybCkgfHwgXFxcIlxcXCI7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGUubWVzc2FnZSA9IFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+vPiBcXFwiICsgZS5tZXNzYWdlO1xcbiAgICAgICAgdGhyb3cgZTtcXG4gICAgfVxcbiAgICBpZiAoIWNvbnRlbnQpIHtcXG4gICAgICAgIHRvYXN0KFxcXCLlsI/or7TkuLrnqbpcXFwiKTtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiPOWwj+ivtOato+aWh+ino+aekOmUmeivr++8muato+aWh+i/lOWbnuS4uuepuj5cXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcbiAgICAgICAgICAgIHJlcXVpcmVEb3dubG9hZChib29rVG9wUGljWzBdLCBtYWluUGF0aCArIGluZm8uYm9va05hbWUgKyBcXFwiLmpwZ1xcXCIsIGJvb2tUb3BQaWNbMV0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiPOWwgemdouS4i+i9vemUmeivrz4gXFxcIiArIGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgRmlsZS5maWxlV3JpdGUoY2hhcHRlclBhdGgsIGNvbnRlbnQucmVwbGFjZSgvPHNjcmlwdD4uKj88XFxcXC9zY3JpcHQ+L2dtaSwgXFxcIlxcXCIpLnRyaW1SaWdodCgpKTtcXG4gICAgLy9GaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIG9yZGVyICsgXFxcIiRBJFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIi50eHRcXFwiKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIkBcXFwiICsgaXRlbS50aXRsZSArIFxcXCIg5LiL6L295a6M5oiQXFxcIjtcXG59XFxuXFxuZnVuY3Rpb24gY29taWMoaXRlbSwgaW5mbywgTVlfSUQsIG9yZGVyKSB7XFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5jb21pY1BhdGggKyBcXFwiL1xcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcIi9cXFwiICsgaW5mby5ib29rTmFtZSArIFxcXCIvXFxcIjtcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBvcmRlciArIFxcXCIkQiRcXFwiICsgaXRlbS50aXRsZSArIFxcXCIvXFxcIjtcXG4gICAgbGV0IHBpY0xpc3QgPSBbXTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBnZXRQaWNMaXN0ID0gbmV3IEZ1bmN0aW9uKFxcXCJpbnB1dFxcXCIsIFxcXCJyZXR1cm5cXFwiICsgaW5mby5wYXJzZUNvZGUpO1xcbiAgICAgICAgcGljTGlzdCA9IGdldFBpY0xpc3QoaXRlbS51cmwpO1xcbiAgICAgICAgaWYgKHR5cGVvZiBwaWNMaXN0ID09PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgICAgIHBpY0xpc3QgPSBwaWNMaXN0LnJlcGxhY2UoXFxcInBpY3M6Ly9cXFwiLCBcXFwiXFxcIikuc3BsaXQoXFxcIiYmXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGUubWVzc2FnZSA9IFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+vPiBcXFwiICsgZS5tZXNzYWdlO1xcbiAgICAgICAgdGhyb3cgZTtcXG4gICAgfVxcblxcbiAgICBjb25zdCBMID0gcGljTGlzdC5sZW5ndGg7XFxuICAgIGlmKEw9PT0wKXtcXG4gICAgICAgIHRvYXN0KFxcXCLlm77niYfpk77mjqXkuLrnqbpcXFwiKTtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivr++8muWbvueJh+mTvuaOpei/lOWbnuS4uuepuj5cXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoaW5mby5ib29rVG9wUGljKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcbiAgICAgICAgICAgIHJlcXVpcmVEb3dubG9hZChib29rVG9wUGljWzBdLCBtYWluUGF0aCArIGluZm8uYm9va05hbWUgKyBcXFwiLmpwZ1xcXCIsIGJvb2tUb3BQaWNbMV0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiPOWwgemdouS4i+i9vemUmeivrz4gXFxcIiArIGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgdmFyIHNjaGVkdWxlID0gbmV3IE1hcChbXFxuICAgICAgICBbTCwgKCkgPT4gbG9nKGl0ZW0udGl0bGUgKyBcXFwi5bey5LiL6L29MTAwJVxcXCIpXSxcXG4gICAgICAgIFt+figwLjkwICogTCksICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcIuW3suS4i+i9vTkwJStcXFwiKV0sXFxuICAgICAgICBbfn4oMC43NSAqIEwpLCAoKSA9PiBsb2coaXRlbS50aXRsZSArIFxcXCLlt7LkuIvovb03NSUrXFxcIildLFxcbiAgICAgICAgW35+KDAuNTAgKiBMKSwgKCkgPT4gbG9nKGl0ZW0udGl0bGUgKyBcXFwi5bey5LiL6L29NTAlK1xcXCIpXSxcXG4gICAgICAgIFt+figwLjI1ICogTCksICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcIuW3suS4i+i9vTI1JStcXFwiKV1cXG4gICAgXSk7XFxuXFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTDsgaSsrKSB7XFxuICAgICAgICBsZXQgcGljID0gVG9vbC5oaWtlclBpYyhwaWNMaXN0W2ldKTtcXG4gICAgICAgIHJlcXVpcmVEb3dubG9hZChwaWNbMF0sIGNoYXB0ZXJQYXRoICsgKGkgKyAxKSArIFxcXCIuanBnXFxcIiwgcGljWzFdKTtcXG4gICAgICAgIHNjaGVkdWxlLmhhcyhpICsgMSkgJiYgc2NoZWR1bGUuZ2V0KGkgKyAxKSgpO1xcbiAgICB9XFxuXFxuICAgIEZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgb3JkZXIgKyBcXFwiJEEkXFxcIiArIGl0ZW0udGl0bGUpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiQFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIiDkuIvovb3lrozmiJBcXFwiO1xcbn1cXG52YXIgJGV4ZSA9IHtcXG4gICAgY29taWM6IGNvbWljLFxcbiAgICBub3ZlbDogbm92ZWxcXG59O1xcbiQuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZW0sIGluZm8sIE1ZX0lELCBvcmRlcikge1xcbiAgICByZXR1cm4gJGV4ZVtpbmZvLnR5cGVdKGl0ZW0sIGluZm8sIE1ZX0lELCBvcmRlcik7XFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiNmLumAmueUqOW3peWFt1wiLFwicGF0aFwiOlwiVG9vbC5qc1wiLFwicnVsZVwiOlwiJC5leHBvcnRzID0ge1xcbiAgICBzcGxpdCh0ZXh0LCB0YXJnZXQsIGNvdW50KSB7XFxuICAgICAgICBjb3VudCA9IGNvdW50ID09PSB1bmRlZmluZWQgPyAxIDogY291bnQ7XFxuICAgICAgICBsZXQgYXJyYXkgPSBbdGV4dF07XFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcXG4gICAgICAgICAgICB0ZXh0ID0gYXJyYXlbaV07XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGV4dC5pbmRleE9mKHRhcmdldCk7XFxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYXJyYXlbaV0gPSB0ZXh0LnNsaWNlKDAsIGluZGV4KTtcXG4gICAgICAgICAgICBhcnJheVtpICsgMV0gPSB0ZXh0LnNsaWNlKGluZGV4ICsgdGFyZ2V0Lmxlbmd0aCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gYXJyYXk7XFxuICAgIH0sXFxuICAgIGNodW5rKGFyciwgc2l6ZSkge1xcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkgKz0gc2l6ZSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyci5zbGljZShpLCBpICsgc2l6ZSkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgaGlrZXJQaWModXJsKSB7XFxuICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xcbiAgICAgICAgbGV0IHVybHMgPSB1cmwuc3BsaXQoXFxcIkBcXFwiKTtcXG4gICAgICAgIGxldCBwaWNVcmwgPSB1cmxzLnNoaWZ0KCk7XFxuICAgICAgICBsZXQgbGVuZ3RoID0gdXJscy5sZW5ndGg7XFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHVybHNbaV0uc3BsaXQoXFxcIj1cXFwiKTtcXG4gICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBbcGljVXJsLCBoZWFkZXJzXTtcXG4gICAgfSxcXG4gICAgcmFuZ2Uoc3RhcnQsIGVuZCkge1xcbiAgICAgICAgcmV0dXJuIEFycmF5KGVuZCAtIHN0YXJ0KS5maWxsKDApLm1hcCgoZWwsIGkpID0+IHN0YXJ0ICsgaSk7XFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjai5Db25maWdcIixcInBhdGhcIjpcIkNvbmZpZy5qc29uXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcblxcbmxldCBsb2NhbENvbmZpZyA9IHt9O1xcblxcbnRyeSB7XFxuICAgIGxvY2FsQ29uZmlnID0gSlNPTi5wYXJzZShGaWxlLnJlYWRGaWxlKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZmlsZXMv5pys5Zyw6LWE5rqQ566h55CGL2NvbmZpZy5qc29uXFxcIikuc2xpY2UoNykpKTtcXG59IGNhdGNoIChlKSB7XFxuICAgIGRlbGV0ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIik7XFxufVxcbmNvbnN0IENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICBob21lUGF0aDogZ2V0UGF0aChcXFwiaGlrZXI6Ly9maWxlcy9sb2NhbE1hbmFnZXJcXFwiKS5zbGljZSg3KSxcXG4gICAgbG9nTnVtOiAxMCxcXG4gICAgdGhyZWFkTnVtOiAxNixcXG4gICAgZGVmX2lzUGFnaW5hdGU6IFxcXCIxXFxcIiwgLy8x6buY6K6k5byA5ZCv5YiG6aG177yMMOm7mOiupOWFs+mXrVxcbiAgICB2aWV3UGFnZVNpemU6IDIwMCxcXG4gICAgZGVmX1BpYzogXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljNFxcXCIsXFxuICAgIGRlZl9Mb3JkX1R5cGU6IFxcXCJjb21pY1xcXCIsXFxuICAgIGRlZl9WaWV3X1N0eWxlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZGVmX0RvVmlfU3R5bGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICBkZWZfRG9WaV9UeXBlOiBcXFwiMVxcXCIsIC8vMOWFqOmDqCwgMeacquWujOaIkO+8jDLlt7LlrozmiJBcXG59LCBsb2NhbENvbmZpZyk7XFxuY29uc3QgUEFUSFMgPSB7XFxuICAgIG5vdmVsUGF0aDogXFxcIi/lsI/or7QvXFxcIixcXG4gICAgY29taWNQYXRoOiBcXFwiL+a8q+eUuy9cXFwiLFxcbiAgICBub3ZlbEZ1bGxQYXRoOiBcXFwiL+Wwj+ivtOWQiOW5ti9cXFwiLFxcbiAgICBleHRlcm5hbEltcG9ydFBhdGg6IFxcXCIv5aSW5a+85bCP6K+0L1xcXCJcXG59XFxuXFxuXFxuT2JqZWN0LmtleXMoUEFUSFMpLmZvckVhY2goa2V5ID0+IENvbmZpZ1trZXldID0gQ29uZmlnLmhvbWVQYXRoICsgUEFUSFNba2V5XSk7XFxuJC5leHBvcnRzID0gQ29uZmlnO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu5Li76aG16Z2iXCIsXCJwYXRoXCI6XCJNYWluLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIG1haW4oKSB7XFxuICAgIHZhciBsYXlvdXQgPSBbXTtcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG4gICAgbGV0IHR5cGUgPSBnZXRNeVZhcihcXFwiLnR5cGVcXFwiLCBnZXRJdGVtKFxcXCJtYWluOnR5cGVcXFwiKSB8fCBDb25maWcuZGVmX0xvcmRfVHlwZSk7XFxuICAgIGxldCB0Z251bSA9IGdldE15VmFyKFxcXCIudGdudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKE1ZX0lEKSA9PiB7XFxuICAgICAgICBjbGVhck15VmFyKFxcXCJzZWFyY2hLZXlcXFwiKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICB9KSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0eXBlID09PSBcXFwiY29taWNcXFwiID8gXFxcIuKXiea8q+eUu1xcXCIgOiBcXFwi4peL5ryr55S7XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcXFwiY29taWNcXFwiKSByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIudHlwZVxcXCIsIFxcXCJjb21pY1xcXCIpO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcIm1haW46dHlwZVxcXCIsIFxcXCJjb21pY1xcXCIpO1xcbiAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIi50Z251bVxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgdHlwZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdHlwZSA9PT0gXFxcIm5vdmVsXFxcIiA/IFxcXCLil4nlsI/or7RcXFwiIDogXFxcIuKXi+Wwj+ivtFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHR5cGUpID0+IHtcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcIm5vdmVsXFxcIikgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnR5cGVcXFwiLCBcXFwibm92ZWxcXFwiKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJtYWluOnR5cGVcXFwiLCBcXFwibm92ZWxcXFwiKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCIudGdudW1cXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHR5cGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHR5cGUgPT09IFxcXCJ0eHRcXFwiID8gXFxcIuKXiVRYVFxcXCIgOiBcXFwi4peLVFhUXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcXFwidHh0XFxcIikgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxDb2xsZWN0ZWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIudHlwZVxcXCIsIFxcXCJ0eHRcXFwiKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJtYWluOnR5cGVcXFwiLCBcXFwidHh0XFxcIik7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiLnRnbnVtXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCB0eXBlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9KTtcXG4gICAgaWYgKHR5cGUgPT09IFxcXCJ0eHRcXFwiKSB7XFxuICAgICAgICB0eHRWaWV3ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvZXh0ZXJuYWxpbXBvcnRUeHQudmlld1xcXCIpO1xcbiAgICAgICAgcmV0dXJuIHR4dFZpZXcobGF5b3V0KTtcXG4gICAgfVxcbiAgICBsZXQgdGFnID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWdbdHlwZSArIFxcXCJQYXRoXFxcIl0sIFxcXCJkaXJcXFwiKTtcXG4gICAgaWYgKHRhZy5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLorr7nva5cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBNWV9SVUxFLnZlcnNpb25cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOW4ruWKqeKAneKAnVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2hlbHAudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9rZXl3b3JkPW5vdmVsQ29taWNcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICc8aDEgc3R5bGU9XFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFwiPuWVpemDveayoeacieiAtjwvaDE+JyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHNldFJlc3VsdChsYXlvdXQpO1xcbiAgICB9XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHVybDogJ1xcXCJoaWtlcjovL3NlYXJjaD9zPVxcXCIraW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuaQnOS9oOaDs+imgeeahCNcXFwiICsgdHlwZSArIFxcXCIjLi4uLi4uXFxcIixcXG4gICAgICAgIHRpdGxlOiAn5pCc57SiJyxcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBydWxlczogJC50b1N0cmluZygodGFnLCB0eXBlKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIxID0gW107XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIxLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ0aXRsZVxcXCI6IHRhZ1tpXS5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJzZWFyY2hfdXJsXFxcIjogXFxcImhpa2VyOi8vZW1wdHk/aXNBbGw9MSZzZWFyY2hUZXJtcz0qKiZ0eXBlPVxcXCIgKyB0eXBlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJzZWFyY2hGaW5kXFxcIjogXFxcImpzOiQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL1NlYXJjaC52aWV3P3J1bGU9JytNWV9SVUxFLl90aXRsZSk7XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFycjEpO1xcbiAgICAgICAgICAgIH0sIHRhZywgdHlwZSksXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignc2VhcmNoS2V5JywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ3NlYXJjaEtleScsaW5wdXQpXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG5cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJjigJjimpnorr7nva7igJnigJlcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB2ZXJzaW9uOiBNWV9SVUxFLnZlcnNpb25cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuXFxuICAgIGZvciAobGV0IGkgaW4gdGFnKSB7XFxuICAgICAgICBsZXQgaXQgPSB0YWdbaV07XFxuICAgICAgICBpZiAodGdudW0gPT09IGkpIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGl0Lm5hbWUgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFtcXFwi5Yig6Zmk6K+l55uu5b2VXFxcIiwgXFxcIui3s+i9rOWwj+eoi+W6j1xcXCJdLCAxLCBcXFwi6YCJ5oup5pON5L2cXFxcIikuc2VsZWN0KChpdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxcXCLot7PovazlsI/nqIvluo9cXFwiID09PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9ob21lQFxcXCIgKyBpdC5uYW1lO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiB0aGVuKFtcXFwi6K+l5pON5L2c5LiN5Lya5Yig6Zmk5bCP56iL5bqP77yM5L2G6K+l5bCP56iL5bqP5LiL6L2955qE5omA5pyJ5ryr55S75bCG6KKr5Yig6ZmkXFxcIl0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLor6Xmk43kvZzkuI3kvJrliKDpmaTlsI/nqIvluo/vvIzkvYbor6XlsI/nqIvluo/kuIvovb3nmoTmiYDmnIkg5ryr55S7L+Wwj+ivtCDlsIbooqvliKDpmaRcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCIudGdudW1cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXQucGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGl0KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5uYW1lLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoaSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiLnRnbnVtXFxcIiwgaSk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgaSksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IHBhdGggPSB0YWdbdGdudW1dLnBhdGg7XFxuICAgIGxldCBtaGxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG4gICAgaWYgKG1obGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5ZWl6YO95rKh5pyJ6IC2XFxcIi5iaWcoKSxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGxheW91dCk7XFxuICAgIH1cXG4gICAgbGV0IHBhZ2VVcmwgPSB0eXBlID09PSBcXFwibm92ZWxcXFwiID8gXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbEJyb3dzZXIudmlld1xcXCIgOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcIjtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXG4gICAgICAgIGxldCBwaWMgPSBmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgaXRlbS5wYXRoICsgXFxcIi9cXFwiICsgaXRlbS5uYW1lICsgXFxcIi5qcGdcXFwiKSA/IGl0ZW0ucGF0aCArIFxcXCIvXFxcIiArIGl0ZW0ubmFtZSArIFxcXCIuanBnXFxcIiA6IENvbmZpZy5kZWZfUGljO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcbiAgICAgICAgICAgIHVybDogcGFnZVVybCArIFxcXCI/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgICBleHRyYTogaXRlbVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxufVxcblxcbm1haW4oKTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiI3Yu5ryr55S756ug6IqC5YiX6KGoXCIsXCJwYXRoXCI6XCJDb21pY0Jyb3dzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxuaWYgKGdldFBhcmFtKFxcXCJoYXNQYXJhbXNcXFwiKSA9PT0gXFxcInRydWVcXFwiKSB7XFxuICAgIE1ZX1BBUkFNUyA9IHtcXG4gICAgICAgIHBhdGg6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicGF0aFxcXCIpKSxcXG4gICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwibmFtZVxcXCIpKVxcbiAgICB9XFxufVxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxuc2V0UGFnZVRpdGxlKFxcXCJDVnxcXFwiICsgTVlfUEFSQU1TLm5hbWUpXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxudmFyIGxheW91dCA9IFtdO1xcbmxldCBtb2RlID0gZ2V0TXlWYXIoXFxcIi5tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgaXNSZXZlcnNlID0gZ2V0TXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiLCBcXFwiMFxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5tb2RlXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiKTtcXG59KSk7XFxuY29uc3QgY29taWNTdGF0dXM9bmV3IE1hcChbW1xcXCJBXFxcIixcXFwiXFxcIl0sW1xcXCJCXFxcIixcXFwi4oCY4oCYW+acquWujOaIkF3igJnigJlcXFwiXV0pO1xcbmZ1bmN0aW9uIGdldFRpdGxlKHRpdGxlKSB7XFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFwiJFxcXCIsIDIpO1xcbiAgICByZXR1cm4gY29taWNTdGF0dXMuZ2V0KHRpdGxlc1sxXSkrdGl0bGVzWzJdIHx8IHRpdGxlO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6Zmk5pW05pysXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTliKDpmaTmlbTmnKzmvKvnlLvvvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LCBwYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLnnIvmvKvnlLtcXFwiLCBcXFwi5Yig6Zmk56ug6IqCXFxcIl1bbW9kZV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5tb2RlXFxcIiwgbW9kZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBtb2RlKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSlcXG5sZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFwiZGlyXFxcIik7XFxubWhsaXN0LnNvcnQoKGEsIGIpID0+IHtcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxuICAgIHJldHVybiBhIC0gYjtcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnq6DoioIgXFxcIi5iaWcoKSArIChcXFwi5YWx5pyJOlxcXCIgKyBtaGxpc3QubGVuZ3RoICsgXFxcIueroFxcXCIpLnNtYWxsKCksXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpc1JldmVyc2UpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sZXQgYXJyYXkgPSBbXTtcXG5sZXQgbGF6eSA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXG4gICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IFxcXCJmaWxlOi8vXFxcIiArIGlucHV0ICsgXFxcIi9cXFwiICsgKGkgKyAxKSArIFxcXCIuanBnXFxcIik7XFxuICAgIHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNsaXN0LmpvaW4oXFxcIiYmXFxcIik7XFxufSlcXG5pZiAobW9kZSA9PT0gXFxcIjBcXFwiKSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxuICAgICAgICBhcnJheS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUoaXRlbS5uYW1lKSxcXG4gICAgICAgICAgICB1cmw6IGl0ZW0ucGF0aCtsYXp5LFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSBlbHNlIHtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXG4gICAgICAgIGFycmF5LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIHVybDogJChcXFwi56Gu6K6k5Yig6ZmkW1xcXCIgKyBuYW1lICsgXFxcIl3vvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LCBpdGVtLnBhdGgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmIChpc1JldmVyc2UgPT09IFxcXCIxXFxcIikge1xcbiAgICBhcnJheS5yZXZlcnNlKCk7XFxufVxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgYXJyYXkpO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu6IGa5ZCI5pCc57SiXCIsXCJwYXRoXCI6XCJTZWFyY2gudmlld1wiLFwicnVsZVwiOlwianM6XFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanM/cnVsZT1cXFwiICsgTVlfUlVMRS5fdGl0bGUpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uP3J1bGU9XFxcIiArIE1ZX1JVTEUuX3RpdGxlKTtcXG5sZXQgY29taWNSdWxlRGlycyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnW2dldFBhcmFtKFxcXCJ0eXBlXFxcIikrXFxcIlBhdGhcXFwiXSwgXFxcImRpclxcXCIpO1xcbmlmIChnZXRQYXJhbShcXFwiaXNBbGxcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGNvbWljUnVsZURpcnMgPSBjb21pY1J1bGVEaXJzLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZSA9PT0gTVlfUlVMRS50aXRsZSk7XFxufVxcblxcbmxldCBzZWFyY2hSZXN1bHQgPSBbXTtcXG5sZXQgc2VhcmNoVGVybXMgPSBnZXRQYXJhbShcXFwic2VhcmNoVGVybXNcXFwiKTtcXG5sZXQgdGVybXNBcnIgPSBzZWFyY2hUZXJtcy5zcGxpdChcXFwiXFxcIikubWFwKHQgPT4gdC5yZXBsYWNlKC9cXFxcKnxcXFxcLnxcXFxcP3xcXFxcK3xcXFxcJHxcXFxcXnxcXFxcW3xcXFxcXXxcXFxcKHxcXFxcKXxcXFxce3xcXFxcfXxcXFxcfHxcXFxcL3xcXFxcXFxcXC9nLCBrID0+IFxcXCJcXFxcXFxcXFxcXCIgKyBrKSk7XFxubGV0IHJlZyA9IG5ldyBSZWdFeHAodGVybXNBcnIuam9pbihcXFwiLipcXFwiKSxcXFwiaVxcXCIpO1xcbmxldCBwYWdlVXJsPWdldFBhcmFtKFxcXCJ0eXBlXFxcIik9PT1cXFwibm92ZWxcXFwiP1xcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFwiOlxcXCJoaWtlcjovL3BhZ2UvQ29taWNCcm93c2VyLnZpZXdcXFwiO1xcbmZvciAobGV0IHNvbkRpciBvZiBjb21pY1J1bGVEaXJzKSB7XFxuICAgIGxldCBjb21pY0xpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHNvbkRpci5wYXRoLCBcXFwiZGlyXFxcIik7XFxuICAgIGZvciAobGV0IGNvbWljIG9mIGNvbWljTGlzdCkge1xcbiAgICAgICAgaWYgKHJlZy50ZXN0KGNvbWljLm5hbWUpKSB7XFxuICAgICAgICAgICAgc2VhcmNoUmVzdWx0LnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogY29taWMubmFtZSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogY29taWMucGF0aCArIFxcXCIvXFxcIiArIGNvbWljLm5hbWUgKyBcXFwiLmpwZ1xcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogcGFnZVVybCtcXFwiP3J1bGU9XFxcIiArIE1ZX1JVTEUuX3RpdGxlLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBzb25EaXIubmFtZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IGNvbWljXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG59XFxuc2V0UmVzdWx0KHNlYXJjaFJlc3VsdCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7orr7nva5cIixcInBhdGhcIjpcIlNldHRpbmcudmlld1wiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKE1ZX1JVTEUudGl0bGUgKyBcXFwifOiuvue9rlxcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuWfuuehgOiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLnm67lvZXot6/lvoRcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9Y29udGVudHNcXFwiLFxcbiAgICBkZXNjOiBDb25maWcuaG9tZVBhdGgsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorr7nva7pu5jorqTlsIHpnaJcXFwiLFxcbiAgICBkZXNjOiBDb25maWcuZGVmX1BpYyxcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3NldHRpbmdUeXBlPWRlZmF1bHRQaWNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuS4i+i9veWZqOiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcblxcbmZ1bmN0aW9uIHNldE51bShrZXksIHRlc3QpIHtcXG4gICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgMCkgfHwgXFxcInt9XFxcIik7XFxuICAgIGlucHV0ID0gcGFyc2VJbnQoaW5wdXQpO1xcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0KSkgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeaVsOWtl1xcXCI7XFxuICAgIGlmICghdGVzdChpbnB1dCkpIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3nrKblkIjmnaHku7ZcXFwiO1xcbiAgICBDb25maWdba2V5XSA9IGlucHV0O1xcbiAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcImxvZ+aVsFxcXCIsXFxuICAgIHVybDogJChDb25maWcubG9nTnVtLCBcXFwiMDxOPDEwMFxcXCIpLmlucHV0KHNldE51bSwgXFxcImxvZ051bVxcXCIsIGl0ID0+IGl0ID4gMCAmJiBpdCA8IDEwMCksXFxuICAgIGRlc2M6IFxcXCJcXFwiICsgQ29uZmlnLmxvZ051bSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIhuaJueS4i+i9veaVsCgw5LiN5byA5ZCvKVxcXCIsXFxuICAgIHVybDogJChcXFwiXFxcIiArIENvbmZpZy50aHJlYWROdW0sIFxcXCJOPi0xXFxcIikuaW5wdXQoc2V0TnVtLCBcXFwidGhyZWFkTnVtXFxcIiwgaXQgPT4gaXQgPiAtMSksXFxuICAgIGRlc2M6IFxcXCJcXFwiICsgQ29uZmlnLnRocmVhZE51bSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuXFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzdHJvbmc+5bCP6K+06ZiF6K+75Zmo6K6+572uPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIum7mOiupOW8gOWQr+WIhumhtemYheivu1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZGVmX2lzUGFnaW5hdGUpID0+IHtcXG4gICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIDApIHx8IFxcXCJ7fVxcXCIpO1xcblxcbiAgICAgICAgQ29uZmlnLmRlZl9pc1BhZ2luYXRlID0gZGVmX2lzUGFnaW5hdGUgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIjtcXG5cXG4gICAgICAgIHNhdmVGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgQ29uZmlnLmRlZl9pc1BhZ2luYXRlKSxcXG4gICAgZGVzYzogQ29uZmlnLmRlZl9pc1BhZ2luYXRlID09PSBcXFwiMFxcXCIgPyBcXFwi5LiN5byA5ZCvXFxcIiA6IFxcXCLlvIDlkK9cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5q+P6aG15pyA5aSn56ug5pWwXFxcIixcXG4gICAgdXJsOiAkKENvbmZpZy52aWV3UGFnZVNpemUsIFxcXCIzMDxOPDUwMFxcXCIpLmlucHV0KHNldE51bSwgXFxcInZpZXdQYWdlU2l6ZVxcXCIsIGl0ID0+IGl0ID4gMzAgJiYgaXQgPCA1MDApLFxcbiAgICBkZXNjOiBcXFwiXFxcIiArIENvbmZpZy52aWV3UGFnZVNpemUsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmm7/mjaLop4TliJlcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy9Nb3JlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/c2V0dGluZ1R5cGU9cmVwbGFjZVJ1bGVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c3Ryb25nPuWFtuS7luiuvue9rjwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLop4TliJnlj5HluIPpobVcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgbHZlcjogTVlfUEFSQU1TLnZlcnNpb24gfHwgXFxcIuiOt+WPlueJiOacrOWksei0pe+8jOiHquihjOafpeeci1xcXCIsXFxuICAgICAgICBpZDogXFxcIjM1NTlcXFwiXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlhbPkuo7lpoLkvZXosIPnlKhcXFwiLFxcbiAgICB1cmw6IFxcXCJodHRwczovL3F1bi5xcS5jb20vcXF3ZWIvcXVucHJvL3NoYXJlP193dj0zJl93d3Y9MTI4Jmludml0ZUNvZGU9MUhGeUJKJmZyb209MjQ2NjEwJmJpej1rYVxcXCIsXFxuICAgIGRlc2M6IFxcXCLor6bnu4bngrnlh7vliqDlhaXpopHpgZPvvIzpopHpgZPph4xATG95RGdJa1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmgaLlpI3pu5jorqTorr7nva5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruiupOaBouWkjem7mOiupOiuvue9ru+8n1xcXCIpLmNvbmZpcm0oKCkgPT4ge1xcbiAgICAgICAgZGVsZXRlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mgaLlpI3lrozmiJBcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4heeQhue8k+WtmFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/c2V0dGluZ1R5cGU9Y2FjaGVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG59KTtcXG5sZXQgdGlkID0gRGF0ZS5ub3coKTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5qOA5rWL5pu05pawXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG9sZFZlcnNpb24sIHRpZCkgPT4ge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgbmV3VmVyc2lvbiA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL2Rldi9nZXRieWlkP2lkPTM1NTlcXFwiLCB7XFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDIwMDBcXG4gICAgICAgICAgICB9KSkucmVzdWx0LnZlcjtcXG4gICAgICAgICAgICBpZiAobmV3VmVyc2lvbiA8PSBvbGRWZXJzaW9uKSB7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGlkICsgXFxcIiPorr7nva5f5pu05pawXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlt7Lnu4/mmK/mnIDmlrDniYjmnKzkuoZcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5paw54mI5pys5LqGXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHRpZCArIFxcXCIj6K6+572uX+abtOaWsFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5pyJ5paw54mI5pys6L+Y5pyq5pu05pawXFxcIlxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIuacieaWsOeJiOacrOi/mOacquabtOaWsFxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInJ1bGU6Ly81clczNlppVTZLZUc1NVdNNzcrbGFHOXRaVjl5ZFd4bFgzVnliTysvcFdoMGRIQTZMeTlvYVd0bGNpNXViMnRwWVM1d2NtVnpjeTlvYVd0bGNuVnNaUzl5ZFd4bGJHbHpkQzVxYzI5dVAybGtQVE0xTlRrPVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGlkICsgXFxcIiPorr7nva5f5pu05pawXFxcIiwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuS/oeaBr+iOt+WPluWksei0pVxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pu05paw5L+h5oGv6I635Y+W5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSwgTVlfUEFSQU1TLnZlcnNpb24sIHRpZCksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogdGlkICsgXFxcIiPorr7nva5f5pu05pawXFxcIlxcbiAgICB9XFxufSk7XFxuLypcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF6Zmk5bCP6K+05YiG6aG16K6w5b2VXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTmuIXpmaTlsI/or7TliIbpobXorrDlvZXvvJ9cXFwiKS5jb25maXJtKCgpID0+IHtcXG4gICAgICAgIGRlbGV0ZUZpbGUoXFxcIm5vdmVsRm9vdHByaW50Lmpzb25cXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuKi9cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiI3Yu5bCP6K+056ug6IqC5YiX6KGoXCIsXCJwYXRoXCI6XCJOb3ZlbEJyb3dzZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxuaWYgKGdldFBhcmFtKFxcXCJoYXNQYXJhbXNcXFwiKSA9PT0gXFxcInRydWVcXFwiKSB7XFxuICAgIE1ZX1BBUkFNUyA9IHtcXG4gICAgICAgIHBhdGg6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicGF0aFxcXCIpKSxcXG4gICAgICAgIG5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwibmFtZVxcXCIpKVxcbiAgICB9XFxufVxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxuc2V0UGFnZVRpdGxlKFxcXCJOVnxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbmNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIGZvb3Q6IDAsXFxuICAgIGlzUmVwbGFjZTogdHJ1ZVxcbn0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcbmxldCBpZCA9IFxcXCIjXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbnZhciBsYXlvdXQgPSBbXTtcXG5sZXQgbW9kZSA9IGdldE15VmFyKFxcXCIubW9kZVxcXCIsIFxcXCIwXFxcIik7XFxubGV0IG1vZGUyID0gZ2V0TXlWYXIoXFxcIi5tb2RlMlxcXCIsIENvbmZpZy5kZWZfaXNQYWdpbmF0ZSk7XFxuXFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKFxcXCIuaXNSZXZlcnNlXFxcIiwgXFxcIjBcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCIubW9kZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIubW9kZTJcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmlzUmV2ZXJzZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIucGFnZU51bVxcXCIpO1xcbn0pKTtcXG5cXG5mdW5jdGlvbiBnZXRUaXRsZSh0aXRsZSkge1xcbiAgICBsZXQgdGl0bGVzID0gVG9vbC5zcGxpdCh0aXRsZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgcmV0dXJuIHRpdGxlc1syXSAhPT0gdW5kZWZpbmVkID8gdGl0bGVzWzJdLnNsaWNlKDAsIHRpdGxlc1syXS5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKSA6IHRpdGxlO1xcbn1cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6Zmk5pW05pysXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTliKDpmaTmlbTmnKzlsI/or7TvvJ9cXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LCBwYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLnnIvlsI/or7RcXFwiLCBcXFwi5Yig6Zmk56ug6IqCXFxcIl1bbW9kZV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobW9kZSkgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5tb2RlXFxcIiwgbW9kZSA9PT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBtb2RlKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAmOKAmOabtOWkmuWKn+iDvSA+4oCZ4oCZXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5cXG5mdW5jdGlvbiB0eHQocGF0aHMpIHtcXG4gICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWQiOW5ti4uLlxcXCIpO1xcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcblxcbiAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGhzLnBhdGgsIFxcXCJmaWxlXFxcIiwgXFxcIi50eHRcXFwiKTtcXG4gICAgbGV0IGxpc3RMZW5ndGggPSBmaWxlbGlzdC5sZW5ndGg7XFxuICAgIGlmIChsaXN0TGVuZ3RoID09PSAwKSB7XFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+epuueahOeroOiKglxcXCI7XFxuICAgIH1cXG4gICAgY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgIHNlbGVjdGVkOiBbXSxcXG4gICAgICAgIGlzUmVwbGFjZTogdHJ1ZVxcbiAgICB9LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aHMucGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpKTtcXG4gICAgbGV0IGJ1ZmlsZWxpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBmaWxlID0gZmlsZWxpc3RbaV07XFxuICAgICAgICBsZXQgZmlsZUluZm8gPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcIiRcXFwiLCAyKTtcXG4gICAgICAgIGJ1ZmlsZWxpc3QucHVzaCh7XFxuICAgICAgICAgICAgbmFtZTogZmlsZUluZm9bMl0uc2xpY2UoMCwgZmlsZUluZm9bMl0ubGFzdEluZGV4T2YoXFxcIi5cXFwiKSksXFxuICAgICAgICAgICAgcGF0aDogXFxcImZpbGU6Ly9cXFwiICsgZmlsZS5wYXRoLFxcbiAgICAgICAgICAgIGlkOiBOdW1iZXIoZmlsZUluZm9bMF0pIHx8IDBcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGJ1ZmlsZWxpc3Quc29ydCgoYSwgYikgPT4gYS5pZCAtIGIuaWQpO1xcbiAgICBsZXQgZW50aXJlUGF0aCA9IHBhdGhzLnBhdGgucmVwbGFjZShDb25maWcubm92ZWxQYXRoLCBDb25maWcubm92ZWxGdWxsUGF0aCkgKyBcXFwiLnR4dFxcXCI7XFxuICAgIGxldCBlbnRpcmVQYXRodG8gPSBib29rSW5mby5pc1JlcGxhY2UgPyBlbnRpcmVQYXRoICsgXFxcIi50bXBcXFwiIDogZW50aXJlUGF0aDtcXG5cXG4gICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyBlbnRpcmVQYXRoKSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuWIneWni+WMluaWh+S7tlxcXCIpO1xcbiAgICAgICAgaWYgKCFGaWxlLmRlbGV0ZUZpbGVzKGVudGlyZVBhdGgpKSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yid5aeL5YyW5aSx6LSlXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdG9hc3QoXFxcIuWIneWni+WMluaIkOWKn1xcXCIpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgaXRlbSA9IGJ1ZmlsZWxpc3RbaV07XFxuICAgICAgICBsZXQgY29udGVudCA9IHJlcXVlc3QoaXRlbS5wYXRoKTtcXG4gICAgICAgIEZpbGUuZmlsZVdyaXRlQXBwZW5kKGVudGlyZVBhdGh0bywgaXRlbS5uYW1lICsgXFxcIlxcXFxu44CA44CAXFxcIiArIGNvbnRlbnQucmVwbGFjZSgvXlxcXFxzK3xcXFxccyskL2dtLCBcXFwiXFxcIikucmVwbGFjZSgvJm5ic3A7L2csXFxcIlxcXCIpLnNwbGl0KC9cXFxcbisvKS5qb2luKFxcXCJcXFxccuOAgOOAgFxcXCIpICsgXFxcIlxcXFxuXFxcXG5cXFwiKTtcXG4gICAgfVxcbiAgICBpZiAoYm9va0luZm8uaXNSZXBsYWNlKSB7XFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICBsZXQgbGVuID0gcnVsZUxpc3QubGVuZ3RoO1xcbiAgICAgICAgbGV0IHJlcGxhY2VQYXR0ZXJuID0gW1xcXCJyZXBsYWNlXFxcIiwgXFxcInJlcGxhY2VBbGxcXFwiXTtcXG4gICAgICAgIGxldCBmbGFnID0gRmlsZS5maWxlUnVsZShlbnRpcmVQYXRodG8sIGVudGlyZVBhdGgsIChqYXZhU3RyaW5nKSA9PiB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgaWYgKCFib29rSW5mby5zZWxlY3RlZC5pbmNsdWRlcyhyZXBsYWNlUnVsZS5pZCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gcmVwbGFjZVBhdHRlcm5bMCArIHJlcGxhY2VSdWxlLmlzUmVnZXhdO1xcbiAgICAgICAgICAgICAgICBqYXZhU3RyaW5nID0gamF2YVN0cmluZ1tyZXBsYWNlXShyZXBsYWNlUnVsZS5wYXR0ZXJuLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBqYXZhU3RyaW5nLmdldEJ5dGVzKCk7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmICghZmxhZykge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WQiOW5tuWksei0pVxcXCI7XFxuICAgICAgICB9XFxuXFxuICAgIH1cXG4gICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WQiOW5tuWujOaIkFxcXCI7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlkIjlubblsI/or7RcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruWumuWQiOW5tj9cXFxcbuS8muimhuebluW3suaciVRYVFxcXCIpLmNvbmZpcm0odHh0LCBNWV9QQVJBTVMpLFxcbiAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLimJDliIbpobVcXFwiLCBcXFwi4piR5YiG6aG1XFxcIl1bbW9kZTJdLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG1vZGUyKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiLm1vZGUyXFxcIiwgbW9kZTIgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIG1vZGUyKSxcXG4gICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLlh4DljJZcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxDdXN0b20udmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCIsXFxuICAgIGV4dHJhOiBNWV9QQVJBTVMsXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5aSW6YOo5p+l55yLXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxuICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbiAgICAgICAgbGV0IGVudGlyZVBhdGggPSBwYXRoLnJlcGxhY2UoQ29uZmlnLm5vdmVsUGF0aCwgQ29uZmlnLm5vdmVsRnVsbFBhdGgpICsgXFxcIi50eHRcXFwiO1xcbiAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyBlbnRpcmVQYXRoKSkge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLosIPnlKjnrKzkuInmlrnlupTnlKjmiZPlvIDmlofku7ZcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXCIgKyBlbnRpcmVQYXRoXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKzlnLDmmoLml6Dlj6/kvpvlpJbpg6jmiZPlvIDnmoR0eHTmlofku7bvvIzor7flhYjlkIjlubblsI/or7TvvIFcXFwiXFxuICAgICAgICB9XFxuICAgIH0sIHBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuXFxubGV0IG1obGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgocGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnR4dFxcXCIpO1xcbm1obGlzdC5zb3J0KChhLCBiKSA9PiB7XFxuICAgIGEgPSAoYS5uYW1lLm1hdGNoKC9cXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXG4gICAgYiA9IChiLm5hbWUubWF0Y2goL1xcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcbiAgICByZXR1cm4gYSAtIGI7XFxufSk7XFxubGV0IGNoYXB0ZXJMaXN0ID0gW107XFxubGV0IGNoYXB0ZXJDb3VudCA9IG1obGlzdC5sZW5ndGg7XFxuXFxuaWYgKG1vZGUyID09PSBcXFwiMVxcXCIpIHtcXG4gICAgbGV0IG1obGlzdENodW5rID0gVG9vbC5jaHVuayhtaGxpc3QsIENvbmZpZy52aWV3UGFnZVNpemUpO1xcbiAgICBsZXQgdmlld1BhZ2VDb3VudCA9IG1obGlzdENodW5rLmxlbmd0aDtcXG4gICAgbGV0IGRlZlBhZ2UgPSAodmlld1BhZ2VDb3VudCAtIDEgPCBib29rSW5mby5mb290ID8gMCA6IGJvb2tJbmZvLmZvb3QpIHx8IDA7XFxuICAgIGxldCBwYWdlTnVtID0gTnVtYmVyKGdldE15VmFyKFxcXCIucGFnZU51bVxcXCIsIFxcXCJcXFwiICsgZGVmUGFnZSkpO1xcbiAgICBjaGFwdGVyTGlzdCA9IG1obGlzdENodW5rW3BhZ2VOdW1dIHx8IFtdO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi56ug6IqCIFxcXCIuYmlnKCkgKyAoXFxcIuacrOmhtTpcXFwiICsgY2hhcHRlckxpc3QubGVuZ3RoICsgXFxcIiDlhbHmnIk6XFxcIiArIGNoYXB0ZXJDb3VudCArIFxcXCLnq6Ag5b2T5YmNOlxcXCIgKyAocGFnZU51bSArIDEpICsgXFxcIi9cXFwiICsgdmlld1BhZ2VDb3VudCkuc21hbGwoKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiLCBpc1JldmVyc2UgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgaXNSZXZlcnNlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLot7Ppm4ZcXFwiLFxcbiAgICAgICAgdXJsOiAkKGNoYXB0ZXJDb3VudCwgXFxcIui+k+WFpei3s+i9rOeroOiKgiAxLVxcXCIgKyBjaGFwdGVyQ291bnQpLmlucHV0KChjaGFwdGVyQ291bnQsIHBhZ2VOdW0sIHZpZXdQYWdlU2l6ZSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IE51bWJlcihpbnB1dCk7XFxuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihpbnB1dE51bSkgfHwgaW5wdXROdW0gPCAwIHx8IGlucHV0TnVtID4gY2hhcHRlckNvdW50KSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXmraPnoa7ojIPlm7TlhoXnmoTmlbDlrZdcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpbnB1dE51bSA9IE1hdGguZmxvb3IoKGlucHV0TnVtICsgdmlld1BhZ2VTaXplKSAvIHZpZXdQYWdlU2l6ZSkgLSAxO1xcbiAgICAgICAgICAgIGlmIChwYWdlTnVtID09PSBpbnB1dE51bSkgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOW9k+WJjemhtemdolxcXCI7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBpbnB1dE51bSk7XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICB9LCBjaGFwdGVyQ291bnQsIHBhZ2VOdW0sIENvbmZpZy52aWV3UGFnZVNpemUsIHBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzVcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIui3s+mhtVxcXCIsXFxuICAgICAgICB1cmw6ICQocGFnZU51bSArIDEsIFxcXCLot7PovazpobXmlbAgMS1cXFwiICsgdmlld1BhZ2VDb3VudCkuaW5wdXQoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBOdW1iZXIoaW5wdXQpIC0gMTtcXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0TnVtKSB8fCBpbnB1dE51bSA8IDAgfHwgaW5wdXROdW0gPiB2aWV3UGFnZUNvdW50IC0gMSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5q2j56Gu6IyD5Zu05YaF55qE5pWw5a2XXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5b2T5YmN6aG16Z2iXFxcIjtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiLnBhZ2VOdW1cXFwiLCBcXFwiXFxcIiArIGlucHV0TnVtKTtcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkuIrkuIDpobVcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYWdlTnVtLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gcGFnZU51bSAtIDE7XFxuICAgICAgICAgICAgaWYgKGlucHV0TnVtIDwgMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5piv56ys5LiA6aG15LqGXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5wYWdlTnVtXFxcIiwgXFxcIlxcXCIgKyBpbnB1dE51bSk7XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBwYWdlTnVtLCBwYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF81XFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkuIvkuIDpobVcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0TnVtID0gcGFnZU51bSArIDE7XFxuICAgICAgICAgICAgaWYgKGlucHV0TnVtID4gdmlld1BhZ2VDb3VudCAtIDEpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+aYr+acgOWQjuS4gOmhteS6hlxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIucGFnZU51bVxcXCIsIFxcXCJcXFwiICsgaW5wdXROdW0pO1xcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgdmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNVxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pyr6aG1XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IHZpZXdQYWdlQ291bnQgLSAxO1xcbiAgICAgICAgICAgIGlmIChwYWdlTnVtID09PSBpbnB1dE51bSB8fCBpbnB1dE51bSA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+aYr+acgOWQjuS4gOmhteS6hlxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCIucGFnZU51bVxcXCIsIFxcXCJcXFwiICsgaW5wdXROdW0pO1xcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgdmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNVxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgY2hhcHRlckxpc3QgPSBtaGxpc3Q7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLnq6DoioIgXFxcIi5iaWcoKSArIChcXFwi5YWx5pyJOlxcXCIgKyBjaGFwdGVyQ291bnQgKyBcXFwi56ugXFxcIikuc21hbGwoKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXNSZXZlcnNlKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIi5pc1JldmVyc2VcXFwiLCBpc1JldmVyc2UgPT09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgaXNSZXZlcnNlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGFycmF5ID0gW107XFxuaWYgKG1vZGUgPT09IFxcXCIwXFxcIikge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXB0ZXJMaXN0KSB7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldFRpdGxlKGl0ZW0ubmFtZSk7XFxuICAgICAgICBhcnJheS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxNYWluQm9keSNhdXRvUGFnZSMjcmVhZFRoZW1lI1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgcGF0aDogaXRlbS5wYXRoLFxcbiAgICAgICAgICAgICAgICBkaXJQYXRoOiBwYXRoLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogbmFtZSxcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSBlbHNlIHtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyTGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcbiAgICAgICAgYXJyYXkucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IG5hbWUsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTliKDpmaRbXFxcIiArIG5hbWUgKyBcXFwiXe+8n1xcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIGl0ZW0ucGF0aCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfVmlld19TdHlsZVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGFycmF5LnJldmVyc2UoKTtcXG59XFxubGF5b3V0LnB1c2guYXBwbHkobGF5b3V0LCBhcnJheSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7lsI/or7TmraPmlofpmIXor7tcIixcInBhdGhcIjpcIk5vdmVsTWFpbkJvZHlcIixcInJ1bGVcIjpcImpzOlxcbnZhciBsYXlvdXQgPSBbXTtcXG5sZXQgY29udGVudCA9IHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgTVlfUEFSQU1TLnBhdGgpO1xcbi8vY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXFxcXG58XFxcXHIvZywgXFxcIjxicj5cXFwiKS5yZXBsYWNlKC8oJm5ic3A7KSsvZyxcXFwiIFxcXCIpO1xcbmNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIHNlbGVjdGVkOiBbXSxcXG4gICAgaXNSZXBsYWNlOiB0cnVlXFxufSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIE1ZX1BBUkFNUy5kaXJQYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcblxcbmlmIChib29rSW5mby5pc1JlcGxhY2UpIHtcXG4gICAgbGV0IGphdmFTdHJpbmcgPSBqYXZhLmxhbmcuU3RyaW5nKGNvbnRlbnQpO1xcbiAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgIGxldCByZXBsYWNlUGF0dGVybiA9IFtcXFwicmVwbGFjZVxcXCIsIFxcXCJyZXBsYWNlQWxsXFxcIl07XFxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICAgICAgbGV0IHJlcGxhY2VSdWxlID0gcnVsZUxpc3RbaV07XFxuICAgICAgICBpZiAoIWJvb2tJbmZvLnNlbGVjdGVkLmluY2x1ZGVzKHJlcGxhY2VSdWxlLmlkKSkge1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlcGxhY2UgPSByZXBsYWNlUGF0dGVyblswICsgcmVwbGFjZVJ1bGUuaXNSZWdleF07XFxuICAgICAgICBqYXZhU3RyaW5nID0gamF2YVN0cmluZ1tyZXBsYWNlXShyZXBsYWNlUnVsZS5wYXR0ZXJuLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCk7XFxuICAgIH1cXG4gICAgY29udGVudCA9IFN0cmluZyhqYXZhU3RyaW5nKTtcXG59XFxuY29udGVudCA9IFxcXCLjgIDjgIBcXFwiICsgY29udGVudC5yZXBsYWNlKC9eXFxcXHMrfFxcXFxzKyQvZ20sIFxcXCJcXFwiKS5zcGxpdCgvXFxcXG4rLykuam9pbihcXFwiPGJyPuOAgOOAgFxcXCIpO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICB0aXRsZTogKFxcXCI8c3Ryb25nPlxcXCIgKyBNWV9QQVJBTVMudGl0bGUgKyBcXFwiPC9zdHJvbmc+XFxcIikuYmlnKCksXFxufSk7XFxuXFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogY29udGVudCxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgY2xpY2s6IHRydWVcXG4gICAgfVxcbn0pO1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwidGV4dF8xXCIsXCJuYW1lXCI6XCIjdi7lkIjlubZUWFRcIixcInBhdGhcIjpcIk5vdmVsQ29sbGVjdGVkLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG5sZXQgcnVsZWxEaXIgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZy5ub3ZlbEZ1bGxQYXRoLCBcXFwiZGlyXFxcIik7XFxuc2V0UGFnZVRpdGxlKFxcXCLlkIjlubZUWFRcXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxuXFxuZnVuY3Rpb24gb3BlcmF0aW9uKHBhdGgpIHtcXG4gICAgc3dpdGNoIChpbnB1dCkge1xcbiAgICAgICAgY2FzZSBcXFwi5YiG5LqrXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICBjYXNlIFxcXCLliKDpmaRcXFwiOlxcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgY2FzZSBcXFwi5rW36ZiU6aKE6KeIXFxcIjpcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlld1xcXCI7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICBjYXNlIFxcXCLmiZPlvIDmlrnlvI9cXFwiOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgIH1cXG59XFxuZm9yIChsZXQgcnVsZVBhdGhzIG9mIHJ1bGVsRGlyKSB7XFxuICAgIGxldCBub3ZlbHMgPSBGaWxlLmdldEZpbGVQYXRoKHJ1bGVQYXRocy5wYXRoLCBcXFwiZmlsZVxcXCIsIFxcXCIudHh0XFxcIik7XFxuICAgIGZvciAobGV0IG5vdmVsIG9mIG5vdmVscykge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBub3ZlbC5uYW1lLFxcbiAgICAgICAgICAgIHVybDogJChbXFxcIuWIhuS6q1xcXCIsIFxcXCLliKDpmaRcXFwiLCBcXFwi5rW36ZiU6aKE6KeIXFxcIiwgXFxcIuaJk+W8gOaWueW8j1xcXCJdLCAxKS5zZWxlY3Qob3BlcmF0aW9uLCBub3ZlbC5wYXRoKSxcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5p2l5rqQ77yaXFxcIiArIHJ1bGVQYXRocy5uYW1lLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBwYXRoOiBub3ZlbC5wYXRoXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuaWYgKGxheW91dC5sZW5ndGggPT09IDApIHtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICc8aDEgc3R5bGU9XFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFwiPuWVpemDveayoeacieiAtjwvaDE+JyxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjdi7mm7TlpJrorr7nva5cIixcInBhdGhcIjpcIlNldHRpbmcvTW9yZS52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuXFxuY29uc3Qgc2V0dGluZ1R5cGUgPSBNWV9QQVJBTVMuc2V0dGluZ1R5cGUgfHwgZ2V0UGFyYW0oXFxcInNldHRpbmdUeXBlXFxcIik7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcbmxldCBpZCA9IFxcXCIjXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbnN3aXRjaCAoc2V0dGluZ1R5cGUpIHtcXG4gICAgY2FzZSBcXFwiY2FjaGVcXFwiOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLmuIXpmaTnvJPlrZh86K6+572uXFxcIik7XFxuICAgICAgICBjb25zdCBrbm93bkxpc3QgPSBuZXcgTWFwKFtcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbFBhdGgpLCBcXFwiI+euoeeQhuWZqCPlsI/or7TnvJPlrZjnm67lvZVb5LiN5bu66K6u5riF6ZmkXVxcXCJdLFxcbiAgICAgICAgICAgIFtGaWxlLmdldE5hbWUoQ29uZmlnLmNvbWljUGF0aCksIFxcXCIj566h55CG5ZmoI+a8q+eUu+e8k+WtmOebruW9lVvkuI3lu7rorq7muIXpmaRdXFxcIl0sXFxuICAgICAgICAgICAgW0ZpbGUuZ2V0TmFtZShDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoKSwgXFxcIiPnrqHnkIblmagj5a+85YWl55qEVFhU55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSwgXFxcIiPnrqHnkIblmagj5bCP6K+05ZCI5bm255uu5b2VW+WPr+S7pea4hemZpF1cXFwiXSxcXG4gICAgICAgICAgICBbXFxcImRy56ug6IqC57yT5a2YXFxcIiwgXFxcIumBk+mVv+aooeadv+S4tOaXtue8k+WtmFvlu7rorq7muIXpmaRdXFxcIl1cXG4gICAgICAgIF0pO1xcblxcbiAgICAgICAgbGV0IGNhY2hlRGlyID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuaG9tZVBhdGgsIFxcXCJkaXJcXFwiKTtcXG5cXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFuQ2FjaGUocGF0aCkge1xcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5a6M5oiQXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5riF6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBjYWNoZSBvZiBjYWNoZURpcikge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNhY2hlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IFxcXCLlpKflsI/vvJpcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShjYWNoZS5wYXRoKSArIFxcXCJcXFxcbuaPj+i/sO+8mlxcXCIgKyAoa25vd25MaXN0LmdldChjYWNoZS5uYW1lKSB8fCBcXFwi5pyq55+l55uu5b2VW+mjjumZqeacquefpV1cXFwiKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIuehruiupOa4hemZpCBcXFwiICsgY2FjaGUubmFtZSArIFxcXCIgP1xcXCIpLmNvbmZpcm0oY2xlYW5DYWNoZSwgY2FjaGUucGF0aClcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuWFqOmDqOa4hemZpChcXFwiICsgRmlsZS5nZXRGaWxlU2l6ZShDb25maWcuaG9tZVBhdGgpICsgXFxcIilcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCLnoa7orqTmuIXpmaTlhajpg6jnvJPlrZjmlbDmja4/XFxcIikuY29uZmlybShjbGVhbkNhY2hlLCBDb25maWcuaG9tZVBhdGgpXFxuICAgICAgICB9KTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIFxcXCJkZWZhdWx0UGljXFxcIjpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi6buY6K6k5bCB6Z2ifOiuvue9rlxcXCIpO1xcbiAgICAgICAgaWYgKGdldE15VmFyKFxcXCI6ZGVmYXVsdFBpY0JhY2tcXFwiKSkge1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCI6ZGVmYXVsdFBpY0JhY2tcXFwiKTtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIHNldERlZmF1bHRQaWModXJsKSB7XFxuICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgMCkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSB1cmw7XFxuICAgICAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHN0YXJ0ID0gMTtcXG4gICAgICAgIGlmICh0eXBlb2YoTVlfTkFNRSkgIT09IFxcXCJ1bmRlZmluZWRcXFwiICYmIE1ZX05BTUUgPT09IFxcXCLll4Xop4nmtY/op4jlmahcXFwiKSB7XFxuICAgICAgICAgICAgc3RhcnQgPSA0O1xcbiAgICAgICAgfVxcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IDQ7IGkrKykge1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlm77niYdcXFwiICsgaSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJtb3ZpZV8zXFxcIixcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljXFxcIiArIGksXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXREZWZhdWx0UGljLCBcXFwiaGlrZXI6Ly9pbWFnZXMvaG9tZV9waWNcXFwiICsgaSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuiHquWumuS5ieKelVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbiAgICAgICAgICAgIHVybDogJChbXFxcIuiHquWumuS5iXVybFxcXCIsIFxcXCLpgInmi6nmlofku7bot6/lvoRcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6Ieq5a6a5LmJdXJsXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLovpPlhaXlm77niYfnmoTot6/lvoTmiJbogIXpk77mjqVcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgMCkgfHwgXFxcInt9XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXF1aXJlVXJsID0gXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVTZWxlY3QgPSByZXF1aXJlKHJlcXVpcmVVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCAwKSB8fCBcXFwie31cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSBcXFwiZmlsZTovL1xcXCIgKyBQQVRIO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwiY29uZmlnLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcIjpkZWZhdWx0UGljQmFja1xcXCIsIFxcXCJ0cnVlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZVVybDogcmVxdWlyZVVybCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZTogXFxcIi5qcGd8LmpwZWd8LmdpZnwucG5nfC5zdmd8LmJtcFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja1R5cGU6IFxcXCJjb25maXJtXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnk6IFxcXCJzZWxlY3RQYXRoQ2FjaGUyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSBcXFwicmVwbGFjZVJ1bGVcXFwiOlxcbiAgICAgICAgaWYgKE1ZX1BBUkFNUy5pc1JlZnJlc2gpIHtcXG4gICAgICAgICAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4gcmVmcmVzaFBhZ2UoKSkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLmm7/mjaLop4TliJl86K6+572uXFxcIik7XFxuICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmlrDlu7rmm7/mjaJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9lZGl0UmVwbGFjZVJ1bGUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9pc05ldz10cnVlXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5a+85Ye66KeE5YiZXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIuehruiupOWvvOWHulxcXCIgKyBydWxlTGlzdC5sZW5ndGggKyBcXFwi5p2h6KeE5YiZ77yfXFxcXG4oe2hvbWVQdGFofS9yZXBsYWNlUnVsZS5qc29uKVxcXCIpLmNvbmZpcm0oKG51bSkgPT4ge1xcbiAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgc2F2ZVB0YSA9IENvbmZpZy5ob21lUGF0aCArIFxcXCIvcmVwbGFjZVJ1bGUuanNvblxcXCI7XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShzYXZlUHRhLCByZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsb2coXFxcIlxcXFxu6Lev5b6E77yaXFxcIiArIHNhdmVQdGEgKyBcXFwiXFxcXG7lr7zlh7rop4TliJkgXFxcIiArIG51bSArIFxcXCIg5p2hXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgc2F2ZVB0YTtcXG4gICAgICAgICAgICB9LCBydWxlTGlzdC5sZW5ndGgpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBmdW5jdGlvbiBpbXBvcnRSdWxlKGlzYmFjaykge1xcbiAgICAgICAgICAgIGlucHV0ID0gdHlwZW9mIFBBVEggPT09IFxcXCJ1bmRlZmluZWRcXFwiID8gaW5wdXQgOiBQQVRIO1xcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpID8gaW5wdXQgOiBcXFwiZmlsZTovL1xcXCIgKyBpbnB1dFxcbiAgICAgICAgICAgIGxldCBydWxlVGV4dCA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIGlmICghcnVsZVRleHQpIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5bmlofku7bkuLrnqbpcXFwiO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlTGlzdCA9IEpTT04ucGFyc2UocnVsZVRleHQpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdDb3VudCA9IDAsXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3VudCA9IDA7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gbmV3UnVsZUxpc3QpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdSdWxlID0gbmV3UnVsZUxpc3RbaV07XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcInJlcGxhY2VtZW50XFxcIikgfHwgIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcInBhdHRlcm5cXFwiKSB8fCAhbmV3UnVsZS5oYXNPd25Qcm9wZXJ0eShcXFwibmFtZVxcXCIpIHx8IChuZXdSdWxlLnNjb3BlQ29udGVudCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAhbmV3UnVsZS5zY29wZUNvbnRlbnQpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBuZXdSdWxlLmlkO1xcbiAgICAgICAgICAgICAgICAgICAgbmV3UnVsZS5pZCA9IGlkIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkSW5kZXggPSBydWxlTGlzdC5maW5kSW5kZXgocnVsZSA9PiBydWxlLmlkID09PSBpZCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRJbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291bnQrKztcXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlTGlzdC5zcGxpY2UoaWRJbmRleCwgMSwgbmV3UnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50Kys7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3QucHVzaChuZXdSdWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxuICAgICAgICAgICAgICAgIGlmIChpc2JhY2spIHtcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbG9nKFxcXCJcXFxcbui3r+W+hO+8mlxcXCIgKyBpbnB1dCArIFxcXCJcXFxcbuaAu+inhOWImeaVsO+8mlxcXCIgKyBuZXdSdWxlTGlzdC5sZW5ndGggKyBcXFwiXFxcXG7mm7TmlrDop4TliJkgXFxcIiArIHVwZGF0ZUNvdW50ICsgXFxcIiDmnaFcXFxcdOaWsOWinuinhOWImSBcXFwiICsgbmV3Q291bnQgKyBcXFwiIOadoVxcXCIpO1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5a+85YWl5oiQ5YqfXFxcIik7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgaWYgKGlzYmFjaykgYmFjaygpO1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5a+85YWl5aSx6LSlXFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoW1xcXCLlpJbpg6jmlofku7ZcXFwiLCBcXFwi5YaF6YOo5paH5Lu2XFxcIl0sIDEsIFxcXCLop4TliJnlr7zlhaVcXFwiKS5zZWxlY3QoKGltcG9ydFJ1bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5aSW6YOo5paH5Lu2XFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJmaWxlU2VsZWN0Oi8vXFxcIiArICQudG9TdHJpbmcoaW1wb3J0UnVsZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZVVybCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlU2VsZWN0ID0gcmVxdWlyZShyZXF1aXJlVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlU2VsZWN0LmZpbGVTZWxlY3Rpb25Vcmkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKGltcG9ydFJ1bGUsIHRydWUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVVcmw6IHJlcXVpcmVVcmwsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCIuanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja1R5cGU6IFxcXCJjb25maXJtXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnk6IFxcXCJzZWxlY3RQYXRoQ2FjaGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIGltcG9ydFJ1bGUpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcnVsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXG4gICAgICAgICAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiByZXBsYWNlUnVsZS5uYW1lLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXCIuXFxcIiArIGksXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkLCBpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGcgPSBydWxlTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9kZWxldGVJdGVtQnlDbHMoaWQgKyBcXFwiLlxcXCIgKyBpbmRleCk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFwi5Yig6Zmk5oiQ5YqfXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICB9LCBpZCwgaSksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi57yW6L6RXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2VkaXRSZXBsYWNlUnVsZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP2luZGV4PVxcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIi5cXFwiICsgaVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXCIuXFxcIiArIGlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcImNvbnRlbnRzXFxcIjpcXG4gICAgICAgIGxldCBmID0gcmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLnm67lvZXorr7nva586K6+572uXFxcIik7XFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLpgInmi6nmlofku7blpLlcXFwiLFxcbiAgICAgICAgICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oaWQpLmV4dHJhO1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgICAgICAgICBpbml0aWFsUGF0aDogQ29uZmlnLmhvbWVQYXRoLFxcbiAgICAgICAgICAgICAgICByZXF1aXJlVXJsOiBcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIsXFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IDFcXG4gICAgICAgICAgICB9KSksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIuaUr+aMgWhpa2VyOi8vZmlsZXPot6/lvoQo6K+l5pON5L2c5LiN5Lya5Yid5aeL5YyW55uu5b2VKVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBDb25maWcuaG9tZVBhdGgsXFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKChpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoaWQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgICAgICAgICBpZDogaWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBnZXRNeVZhcihpZCwgZmluZEl0ZW0oaWQpLmV4dHJhLmRlZmF1bHRWYWx1ZSB8fCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpKSBpbnB1dCA9IGdldFBhdGgoaW5wdXQpLnNsaWNlKDcpO1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZW5kc1dpdGgoXFxcIi9cXFwiKSkgaW5wdXQ9aW5wdXQucmVwbGFjZSgvXFxcXC8kLyxcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChDb25maWcuaG9tZVBhdGggPT0gaW5wdXQpIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/lvZPliY3nm67lvZVcXFwiO1xcbiAgICAgICAgICAgICAgICBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXCJjb25maWcuanNvblxcXCIsIDApIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgICAgICBDb25maWcuaG9tZVBhdGggPSBpbnB1dDtcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcImNvbmZpZy5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suS/neWtmFxcXCI7XFxuICAgICAgICAgICAgfSwgaWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGJyZWFrO1xcbn1cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2Lue8lui+keabv+aNouinhOWImVwiLFwicGF0aFwiOlwiZWRpdFJlcGxhY2VSdWxlLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IGlzTmV3ID0gTVlfUEFSQU1TLmlzTmV3IHx8IGdldFBhcmFtKFxcXCJpc05ld1xcXCIpO1xcbmNvbnN0IGluZGV4ID0gTVlfUEFSQU1TLmluZGV4IHx8IE51bWJlcihnZXRQYXJhbShcXFwiaW5kZXhcXFwiKSk7XFxubGV0IGxheW91dCA9IFtdO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXCIpO1xcbiAgICAvL2NsZWFyTXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuc2NvcGVcXFwiKTtcXG59KSk7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbmxldCBpZCA9IFxcXCIjXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbi8vbGV0IHJlcGxhY2VSdWxlID0gaXNOZXcgPT0gXFxcInRydWVcXFwiP3t9OnJ1bGVMaXN0W2luZGV4XTtcXG5pZiAoaXNOZXcgPT0gXFxcInRydWVcXFwiKSB7XFxuICAgIHJlcGxhY2VSdWxlID0ge1xcbiAgICAgICAgaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxcbiAgICAgICAgaXNSZWdleDogZmFsc2UsXFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2luZGV4XTtcXG59XFxuLy/pppbmrKHliJ3lp4vljJZcXG5pZihnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXCIsXFxcIlxcXCIpPT1cXFwiXFxcIil7XFxuICAgIHB1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFwiLCBcXFwiXFxcIiArIHJlcGxhY2VSdWxlLmlzUmVnZXgpO1xcbiAgICBwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXCIsXFxcIjFcXFwiKTtcXG59XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaLt+i0nVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBsZXQgYXR0ID0gW1xcXCJuYW1lXFxcIiwgXFxcImlzUmVnZXhcXFwiLCBcXFwicGF0dGVyblxcXCIsIFxcXCJyZXBsYWNlbWVudFxcXCJdO1xcbiAgICAgICAgbGV0IGpzb24gPSB7fTtcXG4gICAgICAgIGF0dC5mb3JFYWNoKGtleSA9PiB7XFxuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuXFxcIiArIGtleSwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFxcXCJpc1JlZ2V4XFxcIikge1xcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBcXFwidHJ1ZVxcXCIgPyB0cnVlIDogZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGpzb25ba2V5XSA9IHZhbHVlO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBjb3B5KEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi57KY6LS0XFxcIixcXG4gICAgdXJsOiAkKFxcXCJ7e2NsaXBib2FyZH19XFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaW5wdXQpO1xcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pIHx8IGpzb24ucGF0dGVybiA9PSB1bmRlZmluZWQpIHJldHVybjtcXG4gICAgICAgICAgICBsZXQgYXR0ID0gW1xcXCJuYW1lXFxcIiwgXFxcImlzUmVnZXhcXFwiLCBcXFwicGF0dGVyblxcXCIsIFxcXCJyZXBsYWNlbWVudFxcXCJdO1xcbiAgICAgICAgICAgIGF0dC5mb3JFYWNoKGtleSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLlxcXCIgKyBrZXksIFN0cmluZyhqc29uW2tleV0pKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5pu/5o2i6KeE5YiZ5ZCN56ewXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFwiLCByZXBsYWNlUnVsZS5uYW1lKSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXCIsaW5wdXQpOydcXG4gICAgfVxcbn0pO1xcblxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmm7/mjaLop4TliJlcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcIiwgcmVwbGFjZVJ1bGUucGF0dGVybiksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnBhdHRlcm5cXFwiLCBpbnB1dCk7J1xcbiAgICB9XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaYr+WQpuS9v+eUqOato+WImeihqOi+vuW8j++8mlxcXCIgKyBnZXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcIiksXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXG4gICAgICAgIGxldCBpc1JlZ2V4ID0gZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIpID09PSBcXFwidHJ1ZVxcXCIgPyBmYWxzZSA6IHRydWU7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5piv5ZCm5L2/55So5q2j5YiZ6KGo6L6+5byP77yaXFxcIiArIGlzUmVnZXhcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIsIFxcXCJcXFwiICsgaXNSZWdleCk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBpZCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBpZFxcbiAgICB9XFxufSk7XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuabv+aNouS4ulxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogLTEsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcIiwgcmVwbGFjZVJ1bGUucmVwbGFjZW1lbnQpLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXCIsaW5wdXQpOydcXG4gICAgfVxcbn0pO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHJlcGxhY2VSdWxlLCBpc05ldywgaW5kZXgpID0+IHtcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucGF0dGVyblxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICghcGF0dGVybikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mm7/mjaLop4TliJnkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBsYWNlUnVsZSwge1xcbiAgICAgICAgICAgIG5hbWU6IGdldE15VmFyKFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgaXNSZWdleDogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXCIpID09PSBcXFwidHJ1ZVxcXCIgPyB0cnVlIDogZmFsc2UsXFxuICAgICAgICAgICAgcGF0dGVybjogcGF0dGVybixcXG4gICAgICAgICAgICByZXBsYWNlbWVudDogZ2V0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUucmVwbGFjZW1lbnRcXFwiLCBcXFwiXFxcIilcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFwicmVwbGFjZVJ1bGUuanNvblxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgaWYgKGlzTmV3ID09IFxcXCJ0cnVlXFxcIikge1xcbiAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gocmVwbGFjZVJ1bGUpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBydWxlTGlzdC5zcGxpY2UoaW5kZXgsIDEsIHJlcGxhY2VSdWxlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHNhdmVGaWxlKFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkocnVsZUxpc3QpKTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFwiO1xcbiAgICB9LCByZXBsYWNlUnVsZSwgaXNOZXcsIGluZGV4KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5cXG4vKlxcbmxheW91dC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmm7/mjaLojIPlm7RcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcIi5lZGl0UmVwbGFjZVJ1bGUuc2NvcGVcXFwiLGlucHV0KTsnXFxuICAgIH1cXG59KTtcXG5cXG4qL1xcbnNldFJlc3VsdChsYXlvdXQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3Yu5bCP6K+05Liq5oCn5YyW5YeA5YyWXCIsXCJwYXRoXCI6XCJOb3ZlbEN1c3RvbS52aWV3XCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuabv+aNouinhOWImXxcXFwiICsgTVlfUEFSQU1TLm5hbWUpO1xcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcInJlcGxhY2VSdWxlLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG5sZXQgaWQgPSBcXFwiI1xcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXG5cXG5jb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICBmb290OiAwLFxcbiAgICBpc1JlcGxhY2U6IHRydWUsXFxuICAgIHNlbGVjdGVkOiBbXVxcbn0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBNWV9QQVJBTVMucGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpKTtcXG5cXG5sZXQgbGF5b3V0ID0gW107XFxubGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogW1xcXCLimJDlh4DljJZcXFwiLCBcXFwi4piR5YeA5YyWXFxcIl1bMCArIGJvb2tJbmZvLmlzUmVwbGFjZV0sXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoJGlkLCBwYXRoKSA9PiB7XFxuXFxuICAgICAgICB2YXIgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgbGV0IGlzUmVwbGFjZSA9IGJvb2tJbmZvLmlzUmVwbGFjZT09PXVuZGVmaW5lZD90cnVlOmJvb2tJbmZvLmlzUmVwbGFjZTtcXG4gICAgICAgIGJvb2tJbmZvLmlzUmVwbGFjZSA9ICFpc1JlcGxhY2U7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICB1cGRhdGVJdGVtKCRpZCwge1xcbiAgICAgICAgICAgIHRpdGxlOiBpc1JlcGxhY2UgPyBcXFwi4piQ5YeA5YyWXFxcIiA6IFxcXCLimJHlh4DljJZcXFwiLFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBpZCArIFxcXCIjLTFcXFwiLCBNWV9QQVJBTVMucGF0aCksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogaWQgKyBcXFwiIy0xXFxcIlxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi57yW6L6R6KeE5YiZXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP3NldHRpbmdUeXBlPXJlcGxhY2VSdWxlXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBpc1JlZnJlc2g6IHRydWVcXG4gICAgfVxcbn0pO1xcbmZvciAobGV0IGkgPSAwLCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xcbiAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXG4gICAgbGV0IGlzVHJ1ZSA9IGJvb2tJbmZvLnNlbGVjdGVkLmluY2x1ZGVzKHJlcGxhY2VSdWxlLmlkKTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IChpc1RydWUgPyBcXFwi4pePXFxcIiA6IFxcXCLil4tcXFwiKSArIHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIHk6IDAsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlzVHJ1ZTogaXNUcnVlLFxcbiAgICAgICAgICAgIGlkOiBpZCArIGksXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuW8gOWQr1xcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCRpZCwgcmVwbGFjZVJ1bGUsIHBhdGgpID0+IHtcXG4gICAgICAgICAgICBpZiAoZmluZEl0ZW0oJGlkKS5leHRyYS5pc1RydWUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suW8gOWQr1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBbXVxcbiAgICAgICAgICAgIH0sIEpTT04ucGFyc2UocmVxdWVzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIikgfHwgXFxcInt9XFxcIikpO1xcbiAgICAgICAgICAgIGJvb2tJbmZvLnNlbGVjdGVkLnB1c2gocmVwbGFjZVJ1bGUuaWQpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oJGlkLCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4pePXFxcIiArIHJlcGxhY2VSdWxlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpc1RydWU6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICBpZDogJGlkLFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIvYm9va0luZm8uanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIGlkICsgaSwgcmVwbGFjZVJ1bGUsIE1ZX1BBUkFNUy5wYXRoKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlhbPpl61cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgkaWQsIHJlcGxhY2VSdWxlLCBwYXRoKSA9PiB7XFxuICAgICAgICAgICAgaWYgKCFmaW5kSXRlbSgkaWQpLmV4dHJhLmlzVHJ1ZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5YWz6ZetXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IFtdXFxuICAgICAgICAgICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJmaWxlOi8vXFxcIiArIHBhdGggKyBcXFwiL2Jvb2tJbmZvLmpzb25cXFwiKSB8fCBcXFwie31cXFwiKSk7XFxuICAgICAgICAgICAgYm9va0luZm8uc2VsZWN0ZWQuc3BsaWNlKGJvb2tJbmZvLnNlbGVjdGVkLmluZGV4T2YocmVwbGFjZVJ1bGUuaWQpLCAxKTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKCRpZCwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKXi1xcXCIgKyByZXBsYWNlUnVsZS5uYW1lLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAkaWQsXFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiZmlsZTovL1xcXCIgKyBwYXRoICsgXFxcIi9ib29rSW5mby5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaWQgKyBpLCByZXBsYWNlUnVsZSwgTVlfUEFSQU1TLnBhdGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LuWkluWvvFRYVFwiLFwicGF0aFwiOlwiZXh0ZXJuYWxpbXBvcnRUeHQudmlld1wiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gdHh0VmlldyhsYXlvdXQpIHtcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG4gICAgbGV0IGZpbGVzID0gRmlsZS5nZXRGaWxlUGF0aChDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoLCB1bmRlZmluZWQsIFxcXCIudHh0XFxcIik7XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5aSW5a+8VFhUXFxcIik7XFxuICAgIC8vbGV0IGxheW91dCA9IFtdO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWvvOWFpVRYVFxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICB1cmw6ICQoW1xcXCLns7vnu5/pgInmi6nlmahcXFwiLCBcXFwi5rW36ZiU6YCJ5oup5ZmoXFxcIl0sIDEsIFxcXCLpgInmi6nlmajnsbvlnotcXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIuezu+e7n+mAieaLqeWZqFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJmaWxlU2VsZWN0Oi8vXFxcIiArICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvKFxcXFwudHh0KSQvaS50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLpgInmi6nkuobplJnor6/nmoTmlofku7bnsbvlnotcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vdmVsTmFtZSA9IGlucHV0Lm1hdGNoKC9cXFxcLyhbXlxcXFwvXSo/KShcXFxcLnR4dCkkL2kpWzFdLnJlcGxhY2UoXFxcIl9maWxlU2VsZWN0X1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3BhdGggPSBDb25maWcuZXh0ZXJuYWxJbXBvcnRQYXRoICsgbm92ZWxOYW1lICsgXFxcIi50eHRcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBpbnB1dC5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyB0b3BhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5a+85YWl5o+Q56S6XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogXFxcIuW3suWtmOWcqFtcXFwiICsgbm92ZWxOYW1lICsgXFxcIl3mmK/lkKbopobnm5Y/XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygocGF0aCwgdG9wYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5jb3B5RmlsZShwYXRoLCB0b3BhdGgsIHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyB0b3BhdGggKyBcXFwiLmpzb25cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuZGVsZXRlRmlsZXModG9wYXRoICsgXFxcIi5qc29uXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5a+85YWl5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGF0aCwgdG9wYXRoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmNvcHlGaWxlKHBhdGgsIHRvcGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyB0b3BhdGggKyBcXFwiLmpzb25cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aCArIFxcXCIuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeaIkOWKn1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVVcmwgPSBcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCI7XFxuICAgICAgICAgICAgICAgIGxldCBmaWxlU2VsZWN0ID0gcmVxdWlyZShyZXF1aXJlVXJsKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm92ZWxOYW1lID0gUEFUSC5tYXRjaCgvXFxcXC8oW15cXFxcL10qPykoXFxcXC50eHQpJC9pKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9wYXRoID0gQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCArIG5vdmVsTmFtZSArIFxcXCIudHh0XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFBBVEg7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyB0b3BhdGgpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLlt7LlrZjlnKhbXFxcIiArIG5vdmVsTmFtZSArIFxcXCJd5piv5ZCm6KaG55uWP1xcXCIpLmNvbmZpcm0oKHBhdGgsIHRvcGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY29weUZpbGUocGF0aCwgdG9wYXRoLCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgdG9wYXRoICsgXFxcIi5qc29uXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aCArIFxcXCIuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WvvOWFpeaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBhdGgsIHRvcGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5jb3B5RmlsZShwYXRoLCB0b3BhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXCJmaWxlOi8vXFxcIiArIHRvcGF0aCArIFxcXCIuanNvblxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aCArIFxcXCIuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WvvOWFpeaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlVXJsOiByZXF1aXJlVXJsLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCIudHh0XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tUeXBlOiBcXFwiY29uZmlybVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBtZW1vcnk6IFxcXCJzZWxlY3RQYXRoQ2FjaGUxXFxcIlxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsZXQgb3B0aW9ucyA9IFtcXFwi6ZiF6K+7XFxcIiwgXFxcIuWIhuS6q1xcXCIsIFxcXCLliKDpmaRcXFwiLCBcXFwi5omT5byA5pa55byPXFxcIl07XFxuXFxuICAgIGxldCBwYXR0ZXJuID0gZ2V0TXlWYXIoXFxcIjp0eHRQYXR0ZXJuXFxcIiwgb3B0aW9uc1swXSk7XFxuICAgIGxldCBpZCA9IERhdGUubm93KCkgKyBcXFwiOuaooeW8j1xcXCI7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBwYXR0ZXJuLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgdXJsOiAkKG9wdGlvbnMsIDEsIFxcXCLmk43kvZzmqKHlvI9cXFwiKS5zZWxlY3QoKGlkKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIjp0eHRQYXR0ZXJuXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGlucHV0XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LCBpZCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZFxcbiAgICAgICAgfVxcbiAgICB9KVxcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcblxcbiAgICBmdW5jdGlvbiBvcGVyYXRpb24ocGF0aCwgbmFtZSkge1xcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBnZXRNeVZhcihcXFwiOnR4dFBhdHRlcm5cXFwiLCBcXFwi6ZiF6K+7XFxcIik7XFxuICAgICAgICBzd2l0Y2ggKHBhdHRlcm4pIHtcXG4gICAgICAgICAgICBjYXNlIFxcXCLliIbkuqtcXFwiOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgXFxcIuWIoOmZpFxcXCI6XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTliKDpmaRbXFxcIiArIG5hbWUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCArIFxcXCIuanNvblxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuZGVsZXRlRmlsZXMocGF0aCArIFxcXCIuanNvblxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgcGF0aCk7XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIGNhc2UgXFxcIumYheivu1xcXCI6XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3XFxcIjtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSBcXFwi5omT5byA5pa55byPXFxcIjpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJvcGVuRmlsZTovL2ZpbGU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgZm9yIChsZXQgbm92ZWwgb2YgZmlsZXMpIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbm92ZWwubmFtZSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUob3BlcmF0aW9uLCBub3ZlbC5wYXRoLCBub3ZlbC5uYW1lKSxcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5aSn5bCP77yaXFxcIiArIEZpbGUuZ2V0RmlsZVNpemUobm92ZWwucGF0aCkgKyBcXFwiXFxcXG7kv67mlLnml7bpl7TvvJpcXFwiICsgJC5kYXRlRm9ybWF0KG5vdmVsLmxhc3RNb2RpZmllZCwgXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFwiKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgcGF0aDogbm92ZWwucGF0aCxcXG4gICAgICAgICAgICAgICAgaXNDYWNoZTogdHJ1ZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuiuvue9rlxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHZlcnNpb246IE1ZX1JVTEUudmVyc2lvblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc5biu5Yqp4oCd4oCdXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaGVscC52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2tleXdvcmQ9dHh0XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcIj7llaXpg73msqHmnInogLY8L2gxPicsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQobGF5b3V0KTtcXG59XFxuXFxuJC5leHBvcnRzID0gdHh0VmlldztcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIiN2LlRYVOino+aekOWZqFwiLFwicGF0aFwiOlwidHh0UGFyc2VyLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbihmdW5jdGlvbigpIHtcXG4gICAgbGV0IHJlZ3MgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9yZWd1bGFyQ2hhcHRlci5mXFxcIik7XFxuICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJwYXRoXFxcIikgfHwgXFxcIlxcXCIpIHx8IE1ZX1BBUkFNUy5wYXRoO1xcbiAgICBsZXQgY2hhcnN0ID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJjaGFyc3RcXFwiKSB8fCBcXFwiXFxcIikgfHwgTVlfUEFSQU1TLmNoYXJzdCB8fCBcXFwiVVRGLThcXFwiO1xcbiAgICBsZXQgaXNDYWNoZSA9IE1ZX1BBUkFNUy5pc0NhY2hlO1xcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpKSB7XFxuICAgICAgICBwYXRoID0gXFxcImZpbGU6Ly9cXFwiICsgcGF0aDtcXG4gICAgfVxcbiAgICBsZXQgbGF5b3V0ID0gW107XFxuICAgIGxldCBjaGFwdGVyTmFtZXMgPSBbXTtcXG4gICAgbGV0IGludGVydmFscyA9IFtdO1xcbiAgICBsZXQgaGFzUHJlZmFjZSA9IGZhbHNlO1xcbiAgICBpZiAoZmlsZUV4aXN0KHBhdGggKyBcXFwiLmpzb25cXFwiKSAmJiBpc0NhY2hlKSB7XFxuICAgICAgICB0cnkge1xcblxcbiAgICAgICAgICAgIGxldCBjID0gSlNPTi5wYXJzZShyZXF1ZXN0KHBhdGggKyBcXFwiLmpzb25cXFwiKSk7XFxuICAgICAgICAgICAgY2hhcHRlck5hbWVzID0gYy5jaGFwdGVyTmFtZXM7XFxuICAgICAgICAgICAgaW50ZXJ2YWxzID0gYy5pbnRlcnZhbHM7XFxuICAgICAgICAgICAgaGFzUHJlZmFjZSA9IGMuaGFzUHJlZmFjZTtcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6YeN5paw6Kej5p6Q55uu5b2VXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgrXFxcIi5qc29uXFxcIiksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTpmYWxzZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c3Ryb25nPuebruW9leino+aekOWksei0pSjph43mlrDop6PmnpApPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgrXFxcIi5qc29uXFxcIiksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1dKTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo6Kej5p6Q55uu5b2VXFxcIik7XFxuICAgICAgICBsZXQgdHh0ID0gcmVxdWVzdChwYXRoLCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAvL1xcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwidGV4dC9wbGFpbjsgY2hhcnN0PVxcXCIgKyBjaGFyc3RcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBwYXR0ZXJuID0gcmVncy5nZXRUb2NSdWxlKHR4dCk7XFxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHNldFJlc3VsdChbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+55uu5b2V6Kej5p6Q5aSx6LSlPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1dKTtcXG4gICAgICAgICAgICByZXR1cm47XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcih0eHQpO1xcbiAgICAgICAgbGV0IHBvaW50ZXIgPSAwO1xcbiAgICAgICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7XFxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpO1xcbiAgICAgICAgICAgIGxldCBlbmQgPSBtYXRjaGVyLmVuZCgpO1xcbiAgICAgICAgICAgIGxldCB0ID0gbWF0Y2hlci5ncm91cCgpO1xcbiAgICAgICAgICAgIGlmIChwb2ludGVyID09PSAwICYmIHN0YXJ0ID4gMzApIHtcXG4gICAgICAgICAgICAgICAgaGFzUHJlZmFjZSA9IHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNoYXB0ZXJOYW1lcy5wdXNoKHQpO1xcbiAgICAgICAgICAgIGludGVydmFscy5wdXNoKFtwb2ludGVyLCBzdGFydF0pO1xcbiAgICAgICAgICAgIHBvaW50ZXIgPSBlbmQ7XFxuICAgICAgICB9XFxuICAgICAgICBpbnRlcnZhbHMucHVzaChbcG9pbnRlciwgdHh0Lmxlbmd0aF0pO1xcbiAgICAgICAgaWYgKGlzQ2FjaGUpIHtcXG4gICAgICAgICAgICB3cml0ZUZpbGUocGF0aCArIFxcXCIuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgY2hhcHRlck5hbWVzOiBjaGFwdGVyTmFtZXMsXFxuICAgICAgICAgICAgICAgIGludGVydmFsczogaW50ZXJ2YWxzLFxcbiAgICAgICAgICAgICAgICBoYXNQcmVmYWNlOiBoYXNQcmVmYWNlXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgfVxcblxcblxcbiAgICBpZiAoaGFzUHJlZmFjZSkge1xcbiAgICAgICAgbGV0IGludGVydmFsID0gaW50ZXJ2YWxzWzBdO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5bqP6KiAXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1RYVFZpZXdlci52aWV3I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBjaGFwdGVyTmFtZTogXFxcIuW6j+iogFxcXCIsXFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBpbnRlcnZhbFswXSxcXG4gICAgICAgICAgICAgICAgZW5kOiBpbnRlcnZhbFsxXSxcXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCxcXG4gICAgICAgICAgICAgICAgY2hhcnN0OiBjaGFyc3RcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXB0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IG5hbWUgPSBjaGFwdGVyTmFtZXNbaV07XFxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBpbnRlcnZhbHNbaSArIDFdO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvVFhUVmlld2VyLnZpZXcjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBpbnRlcnZhbFswXSxcXG4gICAgICAgICAgICAgICAgZW5kOiBpbnRlcnZhbFsxXSxcXG4gICAgICAgICAgICAgICAgY2hhcHRlck5hbWU6IG5hbWUsXFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXFxuICAgICAgICAgICAgICAgIGNoYXJzdDogY2hhcnN0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxufSkoKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI3YuVFhU5p+l55yL5ZmoXCIsXCJwYXRoXCI6XCJUWFRWaWV3ZXIudmlld1wiLFwicnVsZVwiOlwianM6XFxubGV0IHBhdGggPSBNWV9QQVJBTVMucGF0aDtcXG5sZXQgY2hhcnN0ID0gTVlfUEFSQU1TLmNoYXJzdDtcXG5sZXQgdHh0ID0gcmVxdWVzdChwYXRoLCB7XFxuICAgIGhlYWRlcnM6IHtcXG4gICAgICAgLy9cXFwiY29udGVudC10eXBlXFxcIjogXFxcInRleHQvcGxhaW47IGNoYXJzdD1cXFwiICsgY2hhcnN0XFxuICAgIH1cXG59KTtcXG5cXG5sZXQgdGFyZ2V0VGV4dHMgPSB0eHQuc3Vic3RyaW5nKE1ZX1BBUkFNUy5zdGFydCwgTVlfUEFSQU1TLmVuZCk7XFxuXFxubGV0IGNvbnRlbnQgPSB0YXJnZXRUZXh0cy5zcGxpdCgvXFxcXG4rLykuZmlsdGVyKGl0ID0+IGl0Lmxlbmd0aCA+IDEpLmpvaW4oXFxcIjxicj5cXFwiKTtcXG5sZXQgbGF5b3V0ID0gW107XFxubGF5b3V0LnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiAoXFxcIjxzdHJvbmc+XFxcIiArIE1ZX1BBUkFNUy5jaGFwdGVyTmFtZSArIFxcXCI8L3N0cm9uZz5cXFwiKS5iaWcoKSxcXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBjb250ZW50LFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxuICAgICAgICBjbGljazogdHJ1ZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCIjai7nq6DoioLmraPliJlcIixcInBhdGhcIjpcInJlZ3VsYXJDaGFwdGVyLmZcIixcInJ1bGVcIjpcImpzOlxcbmxldCBydWxlcyA9IFt7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMSxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi55uu5b2VKOWOu+epuueZvSlcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVvjgIBcXFxcXFxcXHNdKSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXHN7MCw0fVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dKz9cXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSkpKS57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuesrOS4gOeroCDlgYfoo4XnrKzkuIDnq6DliY3pnaLmnInnqbrnmb3kvYbmiJHkuI3opoFcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDBcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTIsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuebruW9lVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnznrKw/XFxcXFxcXFxzezAsNH1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxzezAsNH0oPzrnq6B86IqCKD8h6K++KXzljbd86ZuGKD8hW+WQiOWSjF0pfOmDqCg/IVvliIbotZvmuLhdKXznr4coPyHlvKApKSkuezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLnrKzkuIDnq6Ag5qCH5YeG55qE57Kk6K+t5bCx5piv6L+Z5qC3XFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxXFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0zLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi55uu5b2VKOWMuemFjeeugOS7iylcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVvjgIBcXFxcXFxcXHNdKSg/Oig/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXHN7MCw0fVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dKz9cXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl856+HKD8h5bygKSkpLnswLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi566A5LuLIOiAgeWkq+ivuOiRm+adkeWkq1xcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMlxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtNCxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiBmYWxzZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuebruW9lSjlj6TlhbjjgIHovbvlsI/or7TlpIfnlKgpXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl5bIOOAgFxcXFxcXFxcdF17MCw0fSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXHN7MCw0fVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dKz9cXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl86K+dfOevhyg/IeW8oCkpKS57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuesrOS4gOeroCDmr5TkuIrpnaLlj6rlpJrkuoblm57lkozor51cXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDNcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTUsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLmlbDlrZco57qv5pWw5a2X5qCH6aKYKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoPzw9W+OAgFxcXFxcXFxcc10pXFxcXFxcXFxkK1xcXFxcXFxcLj9bIOOAgFxcXFxcXFxcdF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwiMTJcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDRcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTYsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLlpKflhpnmlbDlrZco57qv5pWw5a2X5qCH6aKYKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoPzw9W+OAgFxcXFxcXFxcc10pW+OAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSwxMn1bIOOAgFxcXFxcXFxcdF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5LiA55m+5LiD5Y2BXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiA0XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC03LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLmlbDlrZcg5YiG6ZqU56ymIOagh+mimOWQjeensFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH1cXFxcXFxcXGR7MSw1fVs677yaLC7vvIwg44CBX+KAlFxcXFxcXFxcLV0uezEsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCIx44CB6L+Z5Liq5bCx5piv5qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiA1XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC04LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLlpKflhpnmlbDlrZcg5YiG6ZqU56ymIOagh+mimOWQjeensFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnxb44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9KVsg44CBX+KAlFxcXFxcXFxcLV0uezEsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLkuIDjgIHlj6rmnInliY3pnaLnmoTmlbDlrZfmnInlt67liKtcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDZcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTksXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIuato+aWhyDmoIfpopgv5bqP5Y+3XFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl5bIOOAgFxcXFxcXFxcdF17MCw0feato+aWh1sg44CAXXsxLDR9LnswLDIwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5q2j5paHIOaIkeWltuW4uOWxsei1teWtkOm+mVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogN1xcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTAsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIkNoYXB0ZXIvU2VjdGlvbi9QYXJ0L0VwaXNvZGUg5bqP5Y+3IOagh+mimFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyDjgIBcXFxcXFxcXHRdezAsNH0oPzpbQ2NdaGFwdGVyfFtTc11lY3Rpb258W1BwXWFydHzvvLDvvKHvvLLvvLR8W05uXVtvT11cXFxcXFxcXC58W0VlXXBpc29kZXwoPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklilcXFxcXFxcXHN7MCw0fVxcXFxcXFxcZHsxLDR9LnswLDMwfSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwiQ2hhcHRlciAxIE15R3JhbmRtYUlzTkJcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDhcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTExLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwiQ2hhcHRlcijljrvnroDku4spXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl5bIOOAgFxcXFxcXFxcdF17MCw0fSg/OltDY11oYXB0ZXJ8W1NzXWVjdGlvbnxbUHBdYXJ0fO+8sO+8oe+8su+8tHxbTm5dW09vXVxcXFxcXFxcLnxbRWVdcGlzb2RlKVxcXFxcXFxcc3swLDR9XFxcXFxcXFxkezEsNH0uezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCJDaGFwdGVyIDEgTXlHcmFuZG1hSXNOQlxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogOVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTIsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIueJueauiuespuWPtyDluo/lj7cg5qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/PD1bXFxcXFxcXFxz44CAXSlb44CQ44CU44CW44CM44CO44CI77y7XFxcXFxcXFxbXSg/OuesrHxbQ2NdaGFwdGVyKVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsMTB9W+eroOiKgl0uezAsMjB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLjgJDnrKzkuIDnq6Ag5ZCO6Z2i55qE56ym5Y+35Y+v5Lul5rKh5pyJXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxMFxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTMsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLnibnmrornrKblj7cg5qCH6aKYKOaIkOWvuSlcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD88PVtcXFxcXFxcXHPjgIBdezAsNH0pKD86W1xcXFxcXFxcW+OAiOOAjOOAjuOAluOAlOOAiu+8iOOAkFxcXFxcXFxcKF0uezEsMzB9W1xcXFxcXFxcKeOAke+8ieOAi+OAleOAl+OAj+OAjeOAiVxcXFxcXFxcXV0/fCg/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWKVsg44CAXXswLDR9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLjgI7liqDkuKrnm7Top5LlvJXlj7fmm7TkuJPkuJrjgI9cXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDExXFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0xNCxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi54m55q6K56ym5Y+3IOagh+mimCjljZXkuKopXFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIig/PD1bXFxcXFxcXFxz44CAXXswLDR9KSg/OlvimIbimIXinKbinKddLnsxLDMwfXwoPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklilbIOOAgF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi4piG44CB5pmL5rGf5L2c6ICF5pyA5Zac5qyi55qE5qC85byPXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxMlxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTUsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogdHJ1ZSxcXG4gICAgICAgIFxcXCJuYW1lXFxcIjogXFxcIueroC/ljbcg5bqP5Y+3IOagh+mimFxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCJeWyBcXFxcXFxcXHTjgIBdezAsNH0oPzooPzrlhoXlrrl85paH56ugKT/nroDku4t85paH5qGIfOWJjeiogHzluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnxb5Y2356ugXVtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH0pWyDjgIBdezAsNH0uezAsMzB9JFxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLljbfkupQg5byA5rqQ55ub5LiWXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxM1xcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTYsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLpobbmoLzmoIfpophcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXlxcXFxcXFxcUy57MSwyMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuS4jei2hei/hzIw5Liq5a2X6aG25qC85YaZ55qE6YO95piv5qCH6aKYXFxcIixcXG4gICAgICAgIFxcXCJzZXJpYWxOdW1iZXJcXFwiOiAxNFxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBcXFwiaWRcXFwiOiAtMTcsXFxuICAgICAgICBcXFwiZW5hYmxlXFxcIjogZmFsc2UsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLlj4zmoIfpopgo5YmN5ZCRKVxcXCIsXFxuICAgICAgICBcXFwicnVsZVxcXCI6IFxcXCIoP20pKD88PVsgXFxcXFxcXFx044CAXXswLDR9KeesrFtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JCg/PVtcXFxcXFxcXHPjgIBdezAsOH3nrKxbXFxcXFxcXFxk6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh956ugKVxcXCIsXFxuICAgICAgICBcXFwiZXhhbXBsZVxcXCI6IFxcXCLnrKzkuIDnq6Ag55yf5q2j55qE5qCH6aKY5bm25YGH6KOF5o2i6KGM56ys5LiA56ugIOi/meS4quS4jeimgVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTVcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTE4LFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IGZhbHNlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5Y+M5qCH6aKYKOWQjuWQkSlcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiKD9tKSg/PD1bIFxcXFxcXFxcdOOAgF17MCw0feesrFtcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JFtcXFxcXFxcXHPjgIBdezAsOH0p56ysW1xcXFxcXFxcZOmbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4feeroC57MCwzMH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuesrOS4gOeroCDov5nkuKrmoIfpopjkuI3opoHlubblgYfoo4XmjaLooYznrKzkuIDnq6DnnJ/mraPnmoTmoIfpophcXFwiLFxcbiAgICAgICAgXFxcInNlcmlhbE51bWJlclxcXCI6IDE2XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIFxcXCJpZFxcXCI6IC0xOSxcXG4gICAgICAgIFxcXCJlbmFibGVcXFwiOiB0cnVlLFxcbiAgICAgICAgXFxcIm5hbWVcXFwiOiBcXFwi5Lmm5ZCNIOaLrOWPtyDluo/lj7dcXFwiLFxcbiAgICAgICAgXFxcInJ1bGVcXFwiOiBcXFwiXi57MSwyMH1bKO+8iF1bXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9WynvvIldWyDjgIBcXFxcdF17MCw0fSRcXFwiLFxcbiAgICAgICAgXFxcImV4YW1wbGVcXFwiOiBcXFwi5qCH6aKY5ZCO6Z2i5pWw5a2X5pyJ5ous5Y+3KDEyKVxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMTdcXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgXFxcImlkXFxcIjogLTIwLFxcbiAgICAgICAgXFxcImVuYWJsZVxcXCI6IHRydWUsXFxuICAgICAgICBcXFwibmFtZVxcXCI6IFxcXCLkuablkI0g5bqP5Y+3XFxcIixcXG4gICAgICAgIFxcXCJydWxlXFxcIjogXFxcIl4uezEsMjB9W1xcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4fVsg44CAXFxcXHRdezAsNH0kXFxcIixcXG4gICAgICAgIFxcXCJleGFtcGxlXFxcIjogXFxcIuagh+mimOWQjumdouaVsOWtl+ayoeacieaLrOWPtzEyNFxcXCIsXFxuICAgICAgICBcXFwic2VyaWFsTnVtYmVyXFxcIjogMThcXG4gICAgfVxcbl07XFxubGV0IE1hdGNoZXIgPSBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjtcXG5sZXQgUGF0dGVybiA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuO1xcblxcbmZ1bmN0aW9uIGdldFRvY1J1bGUoY29udGVudCkge1xcbiAgICBsZXQgbWF4Q3MgPSAxO1xcbiAgICBsZXQgdG9jUGF0dGVybiA9IG51bGw7XFxuICAgIGZvciAobGV0IHRvY1J1bGUgb2YgcnVsZXMpIHtcXG4gICAgICAgIGlmICghdG9jUnVsZS5lbmFibGUpIGNvbnRpbnVlO1xcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUodG9jUnVsZS5ydWxlLCBQYXR0ZXJuLk1VTFRJTElORSk7XFxuICAgICAgICBsZXQgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihjb250ZW50KTtcXG4gICAgICAgIGxldCBjcyA9IDA7XFxuICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHtcXG4gICAgICAgICAgICBjcysrO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGNzID49IG1heENzKSB7XFxuICAgICAgICAgICAgbWF4Q3MgPSBjcztcXG4gICAgICAgICAgICB0b2NQYXR0ZXJuID0gcGF0dGVybjtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gdG9jUGF0dGVybjtcXG59XFxuJC5leHBvcnRzLmdldFRvY1J1bGUgPSBnZXRUb2NSdWxlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiI1Yu5biu5YqpXCIsXCJwYXRoXCI6XCJoZWxwLnZpZXdcIixcInJ1bGVcIjpcImpzOlxcbmxldCBoZWxwVGV4dCA9IHtcXG4gICAgXFxcInR4dFxcXCI6IGBcXG4gICAgICAgIDxoMSBpZD1cXFwidHh05piv5LuA5LmIXFxcIj5UWFTmmK/ku4DkuYg/PC9oMT5cXG4gICAgICAgIDxwPjxhIGhyZWY9XFxcImh0dHBzOi8vYmFpa2UuYmFpZHUuY29tL2l0ZW0vdHh0LzEyMTczMzBcXFwiPuaIkeW3sue7j+W4ruS9oOeZvuW6puS6hjwvYT7vvJvnroDljZXmnaXor7TlsLHmmK/kuIDnp43lgqjlrZjlsI/or7TnmoTmlofku7Yo5omp5bGV5ZCNOnR4dCnjgII8L3A+XFxuICAgICAgICA8aDEgaWQ9XFxcIuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtFxcXCI+5aaC5L2V55So6K+l5bCP56iL5bqP6ZiF6K+7dHh05bCP6K+0PzwvaDE+XFxuICAgICAgICA8cD7lnKjkuLvpobXpnaIg4peJVFhUIOeVjOmdouS4i++8jOeCueWHu+WvvOWFpVRYVO+8jOmAieaLqeebruagh+Wwj+ivtOaWh+S7tih0eHTmlofku7bvvIw8ZW0+6K+l5pON5L2c5LiN5Lya5Yig6ZmkdHh05paH5Lu277yM6ICM5pivY29weeS4gOS7veWIsOWwj+eoi+W6j+eahOi3r+W+hOS4izwvZW0+Ke+8jOWvvOWFpeWQjuWGjeWcqCDil4lUWFQg55WM6Z2i5LiL6YCJ5oup5oOz6KaB6ZiF6K+755qE5bCP6K+05Y2z5Y+v44CCPC9wPlxcblxcbiAgICBgLFxcbiAgICBcXFwibm92ZWxDb21pY1xcXCI6IGBcXG4gICAgICAgIDxoMSBpZD1cXFwi6L+Z5Liq5bCP56iL5bqP5pyJ5LuA5LmI55So77yfXFxcIj7ov5nkuKrlsI/nqIvluo/mnInku4DkuYjnlKjvvJ88L2gxPlxcbiAgICAgICAgPHVsPlxcbiAgICAgICAgPGxpPjx1PuS7o+eggeS4iuS4uuWFtuS7luWwj+eoi+W6jyjmvKvnlLvnsbsv5bCP6K+057G7KeaPkOS+m+S4i+i9veaOpeWPo+OAgjwvdT48L2xpPlxcbiAgICAgICAgPGxpPjx1PuacrOS9k+WFheW9k+mYheivu+WZqO+8jOWPr+S7pea1j+iniOeUqOivpeWwj+eoi+W6j+aPkOS+m+eahOS4i+i9veaOpeWPoyjkuIrpnaIp77yM5LiL6L2955qE5ryr55S7L+Wwj+ivtOOAgjwvdT48L2xpPlxcbiAgICAgICAgPGxpPjx1PuaPkOS+m1RYVOagvOW8j+Wwj+ivtOaWh+S7tuino+aekOWKn+iDveOAgjwvdT5cXG4gICAgICAgIDxoMSBpZD1cXFwi5Li65LuA5LmI5YiX6KGo6YeM5LuA5LmI6YO95rKh55SoXFxcIj7kuLrku4DkuYjliJfooajph4zku4DkuYjpg73msqHnlKg/PC9oMT5cXG4gICAgICAgIDx1PuWIneasoeS9v+eUqO+8jOayoeacieW+iOato+W4uOWQp+OAgvCfpJQ8L3U+XFxuICAgICAgICA8aDEgaWQ9XFxcIuivpeWmguS9lea3u+WKoOa8q+eUu+aIluWwj+ivtFxcXCI+6K+l5aaC5L2V5re75Yqg5ryr55S7KOaIluWwj+ivtCk/PC9oMT5cXG4gICAgICAgIDx1PiDlnKjkuIDkuKrmnInkuIvovb3lip/og73nmoTlsI/nqIvluo8o5ryr55S757G7L+Wwj+ivtOexuynkuK3kuIvovb3kuIDmnKzmvKvnlLsv5bCP6K+077yM6L+U5Zue6K+l6KeE5YiZ5Y2z5Y+v5rWP6KeI44CCPC91PjwvbGk+XFxuICAgICAgICA8L3VsPlxcbiAgICBgXFxufTtcXG5zZXRQYWdlVGl0bGUoXFxcIuW4ruWKqVxcXCIpO1xcbmxldCBrZXl3b3JkID0gZ2V0UGFyYW0oXFxcImtleXdvcmRcXFwiKTtcXG5sZXQgdGV4dDtcXG5pZiAoa2V5d29yZCA9PT0gdW5kZWZpbmVkIHx8ICEodGV4dCA9IGhlbHBUZXh0W2tleXdvcmRdKSkge1xcbiAgICBzZXRSZXN1bHQoW3tcXG4gICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcIj7otYTmlpnkuI3op4Hlkq88L2gxPicsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfV0pO1xcbn0gZWxzZSB7XFxuICAgIHNldFJlc3VsdChbe1xcbiAgICAgICAgdGl0bGU6IHRleHQsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfV0pO1xcbn1cIn1dLFwicGFyYW1zXCI6XCJ7XFxcImNoYXB0ZXJMaXN0XFxcIjpbXSxcXFwiZGVmYXVsdFZpZXdcXFwiOlxcXCIxXFxcIixcXFwiaW5mb1xcXCI6e1xcXCJib29rTmFtZVxcXCI6XFxcIlvnu7xd55So57uz5ZG95o6o6ZSA55qE55S35Lq6IOS9nOiAhe+8mumGiemlrumVv+atjFxcXCIsXFxcImJvb2tUb3BQaWNcXFwiOlxcXCJoaWtlcjovL2VtcHR5XFxcIixcXFwicGFyc2VDb2RlXFxcIjpcXFwiKFxcXFxuKE1ZX1BBUkFNUykgPT4ge1xcXFxuICAgIHZhciByZXMgPSByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICB2YXIgcnVsZSA9IE1ZX1BBUkFNUy5jb250ZW50O1xcXFxuICAgIGxldCByID0gcnVsZS5jb250ZW50LnJlcGxhY2UoXFxcXFxcXCJAXFxcXFxcXCIsIFxcXFxcXFwiJiZcXFxcXFxcIikucmVwbGFjZShcXFxcXFxcInRleHRcXFxcXFxcIiwgXFxcXFxcXCJUZXh0XFxcXFxcXCIpLnJlcGxhY2UoL1xcXFxcXFxcLlswLTldL2csIGZ1bmN0aW9uIChhKSB7XFxcXG4gICAgICAgIHJldHVybiBhLnJlcGxhY2UoXFxcXFxcXCIuXFxcXFxcXCIsIFxcXFxcXFwiLFxcXFxcXFwiKTtcXFxcbiAgICB9KTtcXFxcbiAgICBsZXQgcjEgPSByLnNwbGl0KFxcXFxcXFwiJiZcXFxcXFxcIik7XFxcXG4gICAgbGV0IHIyID0gcjEuc2xpY2UoMCwgcjEubGVuZ3RoIC0gMSkuam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgIGxldCBhcnIgPSBwZGZhKHJlcywgXFxcXFxcXCJib2R5JiZcXFxcXFxcIiArIHIyKTtcXFxcbiAgICB2YXIgdHQgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIGZvciAobGV0IGl0IG9mIGFycikge1xcXFxuICAgICAgICBpdCA9IGl0LnJlcGxhY2UobmV3IFJlZ0V4cChcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiLCBcXFxcXFxcImdcXFxcXFxcIiksIFxcXFxcXFwiLS1ici0tXFxcXFxcXCIpO1xcXFxuICAgICAgICB2YXIgdCA9IHBkZmgoaXQsIFxcXFxcXFwiVGV4dFxcXFxcXFwiKTtcXFxcbiAgICAgICAgdCA9IHQucmVwbGFjZShuZXcgUmVnRXhwKFxcXFxcXFwiLS1ici0tXFxcXFxcXCIsIFxcXFxcXFwiZ1xcXFxcXFwiKSwgXFxcXFxcXCI8YnI+XFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAodCA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgdDIgPSB0LnNwbGl0KFxcXFxcXFwiPGJyPlxcXFxcXFwiKTtcXFxcbiAgICAgICAgZm9yIChsZXQgaXQyIG9mIHQyKSB7XFxcXG4gICAgICAgICAgICBpZiAoaXQyID09IFxcXFxcXFwiXFxcXFxcXCIgfHwgaXQyLmxlbmd0aCA9PSAxKSB7XFxcXG4gICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoIWl0Mi5zdGFydHNXaXRoKFxcXFxcXFwiXFxcXFxcXFx1MzAwMFxcXFxcXFwiKSAmJiAhaXQyLnN0YXJ0c1dpdGgoXFxcXFxcXCImbmJzcDsmbmJzcDtcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICBpdDIgPSBcXFxcXFxcIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1xcXFxcXFwiICsgaXQyLnRyaW0oKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChydWxlLnJlcGxhY2VSZWdleCkge1xcXFxuICAgICAgICAgICAgICAgIGl0MiA9IGl0Mi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZS5yZXBsYWNlUmVnZXgucmVwbGFjZShcXFxcXFxcIiMjXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLCBcXFxcXFxcImdcXFxcXFxcIiksIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKGl0MiA9PSBcXFxcXFxcIlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgY29udGludWU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB0dCArPSBpdDIgKyBcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiB0dDtcXFxcbn1cXFxcbikoe1xcXFxcXFwiVG9jXFxcXFxcXCI6e1xcXFxcXFwiY2hhcHRlckxpc3RcXFxcXFxcIjpcXFxcXFxcIi5jYXRhbG9nIGxpIGFcXFxcXFxcIixcXFxcXFxcImNoYXB0ZXJOYW1lXFxcXFxcXCI6XFxcXFxcXCJ0ZXh0XFxcXFxcXCIsXFxcXFxcXCJjaGFwdGVyVXJsXFxcXFxcXCI6XFxcXFxcXCJocmVmXFxcXFxcXCJ9LFxcXFxcXFwiYm9va05hbWVcXFxcXFxcIjpcXFxcXFxcIlvnu7xd55So57uz5ZG95o6o6ZSA55qE55S35Lq6IOS9nOiAhe+8mumGiemlrumVv+atjFxcXFxcXFwiLFxcXFxcXFwiY29udGVudFxcXFxcXFwiOntcXFxcXFxcImNvbnRlbnRcXFxcXFxcIjpcXFxcXFxcIi5ib29rX2NvbkBwQHRleHRcXFxcXFxcIixcXFxcXFxcImltYWdlU3R5bGVcXFxcXFxcIjpcXFxcXFxcIjBcXFxcXFxcIixcXFxcXFxcIm5leHRDb250ZW50VXJsXFxcXFxcXCI6XFxcXFxcXCJ0ZXh0LuS4i+S4gOmhtUBocmVmXFxcXFxcXCIsXFxcXFxcXCJyZXBsYWNlUmVnZXhcXFxcXFxcIjpcXFxcXFxcIiMjXFxcXFxcXFxcXFxcXFxcXOOAkDI1NuaWh+Wtpi4qXFxcXFxcXFxcXFxcXFxcXOOAkVxcXFxcXFwifSxcXFxcXFxcImNvdmVyXFxcXFxcXCI6XFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJ9KVxcXCIsXFxcInJ1bGVOYW1lXFxcIjpcXFwi5oKm6K+7XFxcIixcXFwidHlwZVxcXCI6XFxcIm5vdmVsXFxcIn19XCIsXCJzYXZlZFwiOmZhbHNlLFwidGl0bGVcIjpcIuacrOWcsOi1hOa6kOeuoeeQhlwiLFwidmVyc2lvblwiOjAsXCJ1cmxcIjpcImhpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9SZWZyZXNoIyNub0hpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGXCIsXCJjb2xfdHlwZVwiOlwidGV4dF8yXCIsXCJmaW5kX3J1bGVcIjpcImpzOlxcbmNvbnN0IHZpZXdDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXG4gICAgY2hhcHRlckxpc3Q6IFtdLFxcbiAgICBpbmZvOiB7fSxcXG4gICAgZGVmYXVsdFZpZXc6IFxcXCIwXFxcIlxcbn0sIE1ZX1BBUkFNUyk7XFxudmlld0NvbmZpZy5pbmZvID0gT2JqZWN0LmFzc2lnbih7XFxuICAgIHJ1bGVOYW1lOiBcXFwiXFxcIixcXG4gICAgYm9va05hbWU6IFxcXCJcXFwiLFxcbiAgICBib29rVG9wUGljOiBcXFwiXFxcIixcXG4gICAgcGFyc2VDb2RlOiBcXFwiXFxcIixcXG4gICAgdHlwZTogXFxcImNvbWljXFxcIixcXG59LCB2aWV3Q29uZmlnLmluZm8pO1xcbmxldCB7XFxuICAgIGNoYXB0ZXJMaXN0LFxcbiAgICBpbmZvLFxcbiAgICBkZWZhdWx0Vmlld1xcbn0gPSB2aWV3Q29uZmlnO1xcbnNldFBhZ2VUaXRsZShcXFwi6YCJ5oup5ZmofFxcXCIgKyBpbmZvLmJvb2tOYW1lKVxcblxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcIik7XFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXCIpO1xcblxcbmNvbnN0IGRlZl9Eb1ZpX1N0eWxlID0gQ29uZmlnLmRlZl9Eb1ZpX1N0eWxlO1xcbmNvbnN0IE1ZX0lEID0gaW5mby5ydWxlTmFtZSArIFxcXCIvL1xcXCIgKyBpbmZvLmJvb2tOYW1lO1xcblxcblxcbmxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG5sZXQgdmlld01vZGUgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiLCBkZWZhdWx0Vmlldyk7XFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKE1ZX0lEICsgXFxcIjppc1JldmVyc2VcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCB0YWdGaWx0ZXIgPSBnZXRNeVZhcihNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiwgQ29uZmlnLmRlZl9Eb1ZpX1R5cGUpO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6dmlld01vZGVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6Y29tcGxldGVkXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIpO1xcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6cGFnZU51bVxcXCIpO1xcbn0sIE1ZX0lEKSk7XFxuXFxubGV0IGxheW91dCA9IFtdO1xcblxcbmlmIChpc1N0YXJ0ID09PSBcXFwiMVxcXCIpIHtcXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOnZpZXdNb2RlXFxcIiwgZGVmYXVsdFZpZXcpO1xcbiAgICB2aWV3TW9kZSA9IFxcXCIxXFxcIjtcXG59XFxuXFxubGV0IGJhY2t1cENoYXB0ZXJMaXN0ID0gY2hhcHRlckxpc3Q7XFxuaWYgKHR5cGVvZiBjaGFwdGVyTGlzdCA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgY2hhcHRlckxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcImZpbGU6Ly9cXFwiICsgY2hhcHRlckxpc3QpIHx8IFxcXCJbXVxcXCIpO1xcbn1cXG5sZXQgY2hhcHRlckFsbCA9IGNoYXB0ZXJMaXN0O1xcbmNoYXB0ZXJMaXN0ID0gY2hhcHRlckxpc3QubWFwKChpdGVtLCBDSUQpID0+IHtcXG4gICAgaXRlbS5DSUQgPSBDSUQ7XFxuICAgIHJldHVybiBpdGVtO1xcbn0pO1xcbmxldCBwYWdlTnVtID0gTnVtYmVyKGdldE15VmFyKE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiwgXFxcIjFcXFwiKSk7XFxubGV0IGNoYXB0ZXJDaHVuayA9IFtjaGFwdGVyTGlzdF0uY29uY2F0KFRvb2wuY2h1bmsoY2hhcHRlckxpc3QsIENvbmZpZy52aWV3UGFnZVNpemUpKTtcXG5jaGFwdGVyTGlzdCA9IGNoYXB0ZXJDaHVua1twYWdlTnVtXSB8fCBbXTtcXG5cXG5mdW5jdGlvbiBzZXRUeXBlKCkge1xcbiAgICBsZXQgc2V0ID0gKHRhZywgcHV0KSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihwdXQsIHRhZyk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgIH07XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAwID09IHBhZ2VOdW0gPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIChcXFwi5YWo6YOoKFxcXCIgKyBjaGFwdGVyQWxsLmxlbmd0aCArIFxcXCIpXFxcIikuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5YWo6YOoKFxcXCIgKyBjaGFwdGVyQWxsLmxlbmd0aCArIFxcXCIpXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIDAsIE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoYXB0ZXJDaHVuay5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IHRhZ1RleHQgPSAoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIFxcXCItXFxcIiArICgoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIGNoYXB0ZXJDaHVua1tpXS5sZW5ndGgpO1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpID09IHBhZ2VOdW0gPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHRhZ1RleHQuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiB0YWdUZXh0LFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIGksIE1ZX0lEICsgXFxcIjpwYWdlTnVtXFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0YWdGaWx0ZXIgPT09IFxcXCIwXFxcIiA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuWFqOmDqFxcXCIuZm9udGNvbG9yKFxcXCIjMjNBRDZGXFxcIikgOiBcXFwi5YWo6YOoXFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShzZXQsIFxcXCIwXFxcIiwgTVlfSUQgKyBcXFwiOnRhZ0ZpbHRlclxcXCIpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHRhZ0ZpbHRlciA9PT0gXFxcIjFcXFwiID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5pyq5LiL6L29XFxcIi5mb250Y29sb3IoXFxcIiMyM0FENkZcXFwiKSA6IFxcXCLmnKrkuIvovb1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHNldCwgXFxcIjFcXFwiLCBNWV9JRCArIFxcXCI6dGFnRmlsdGVyXFxcIiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFwiMlxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLlt7LkuIvovb1cXFwiLmZvbnRjb2xvcihcXFwiIzIzQUQ2RlxcXCIpIDogXFxcIuW3suS4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoc2V0LCBcXFwiMlxcXCIsIE1ZX0lEICsgXFxcIjp0YWdGaWx0ZXJcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBjaGFwdGVyVGVhbSA9IFtdO1xcbmxldCByZWNvcmQgPSBbXTtcXG5pZiAoaW5mby50eXBlID09PSBcXFwiY29taWNcXFwiKSB7XFxuICAgIGxldCBsYXp5ID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXCIpO1xcbiAgICAgICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChpbnB1dCk7XFxuICAgICAgICBsZXQgcGljbGlzdCA9IGZpbGVsaXN0Lm1hcCgoaXRlbSwgaSkgPT4gXFxcImZpbGU6Ly9cXFwiICsgaW5wdXQgKyBcXFwiL1xcXCIgKyAoaSArIDEpICsgXFxcIi5qcGdcXFwiKTtcXG4gICAgICAgIHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNsaXN0LmpvaW4oXFxcIiYmXFxcIik7XFxuICAgIH0pO1xcblxcbiAgICBmdW5jdGlvbiBjb21GdW4oaSwgaXRlbSkge1xcbiAgICAgICAgbGV0IHJvb3RQYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcIi9cXFwiICsgaSArIFxcXCIkQSRcXFwiICsgaXRlbS50aXRsZTtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogcm9vdFBhdGggKyBsYXp5LFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGksXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tpbmZvLnR5cGUgKyBcXFwiUGF0aFxcXCJdICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUsIFxcXCJkaXJcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxuICAgICAgICBsZXQgYXR0ID0gVG9vbC5zcGxpdChmaWxlLm5hbWUsIFxcXCIkXFxcIiwgMik7XFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFwiQVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVjb3JkLnB1c2goYXR0WzJdKTtcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbE1haW5Cb2R5I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpLFxcbiAgICAgICAgICAgICAgICBwYXRoOiBDb25maWcubm92ZWxQYXRoICsgXFxcIi9cXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXCIvXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFwiL1xcXCIgKyBpICsgXFxcIiRBJFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIi50eHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgRmlsZS5nZXRGaWxlUGF0aChDb25maWdbaW5mby50eXBlICsgXFxcIlBhdGhcXFwiXSArIFxcXCIvXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFwiL1xcXCIgKyBpbmZvLmJvb2tOYW1lLCBcXFwiZmlsZVxcXCIsIFxcXCIudHh0XFxcIikuZm9yRWFjaCgoZmlsZSkgPT4ge1xcbiAgICAgICAgbGV0IGF0dCA9IFRvb2wuc3BsaXQoZmlsZS5uYW1lLCBcXFwiJFxcXCIsIDIpO1xcbiAgICAgICAgaWYgKGF0dC5sZW5ndGggPT09IDMgJiYgYXR0WzFdID09PSAoXFxcIkFcXFwiKSkge1xcbiAgICAgICAgICAgIHJlY29yZC5wdXNoKGF0dFsyXS5zbGljZSgwLCBhdHRbMl0ubGFzdEluZGV4T2YoXFxcIi5cXFwiKSkpO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gY2xpY2tEb3dubG9hZChpdGVtLCBpbmZvLCBNWV9JRCwgaSkge1xcbiAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBsZXQgRWxlbWVudEluZGV4ID0gbG9hZGluZ1RlYW0uaW5kZXhPZihpKTtcXG4gICAgaWYgKEVsZW1lbnRJbmRleCA+IC0xKSByZXR1cm4gXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29XFxcIjtcXG5cXG4gICAgbG9hZGluZ1RlYW0ucHVzaChpKTtcXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkobG9hZGluZ1RlYW0pKTtcXG4gICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICB0aXRsZTogXFxcIuKAmOKAmFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGxldCByZXN1bHQgPSBcXFwidG9hc3Q6Ly/kuIvovb3lpLHotKVcXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgdG9hc3QoXFxcIuW8gOWni+S4i+i9vTpcXFwiICsgaXRlbS50aXRsZSk7XFxuICAgICAgICBsZXQgZG93bmxvYWQgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9Eb3dubG9hZC5leGUuanNcXFwiKTtcXG4gICAgICAgIHJlc3VsdCA9IGRvd25sb2FkKGl0ZW0sIGluZm8sIE1ZX0lELCBpKTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCd4oCdXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJ0b2FzdDovL+W3suS4i+i9vVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIGxvYWRpbmdUZWFtLnNwbGljZShFbGVtZW50SW5kZXgsIDEpO1xcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmxvYWRpbmdUZWFtXFxcIiwgSlNPTi5zdHJpbmdpZnkobG9hZGluZ1RlYW0pKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcmVzdWx0O1xcbn1cXG5cXG5mdW5jdGlvbiBzaW5nbGVWaWV3KCkge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWPjei9rOWIl+ihqFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSwgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXCI6aXNSZXZlcnNlXFxcIiwgaXNSZXZlcnNlID09PSBcXFwiMFxcXCIgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaXNSZXZlcnNlLCBNWV9JRCksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9MzNudkRxYkhIN0hXJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzJcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaJuemHj+S4i+i9vVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGxvYWRpbmdUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6bG9hZGluZ1RlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgICAgICBpZiAobG9hZGluZ1RlYW0ubGVuZ3RoID4gMCkgcmV0dXJuIFxcXCJ0b2FzdDovL+i/mOacieS7u+WKoeayoeacieWujOaIkFxcXCI7XFxuICAgICAgICAgICAgaWYgKGdldEFwcFZlcnNpb24oKSA8IDI1OTQpIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrlvIDmlL5cXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjp2aWV3TW9kZVxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuXFxuICAgICAgICB9LCBNWV9JRCksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD0wdWFmYU1OenhqODgmdG9rZW49XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl8yXFxcIlxcbiAgICB9KTtcXG4gICAgc2V0VHlwZSgpO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBsZXQgbG9hZGluZ1RlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpsb2FkaW5nVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICBmb3IgKGxldCBpID0gMCwgaXRlbSA9IGNoYXB0ZXJMaXN0WzBdOyBpIDwgY2hhcHRlckxpc3QubGVuZ3RoOyBpdGVtID0gY2hhcHRlckxpc3RbKytpXSkge1xcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcbiAgICAgICAgaWYgKGlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcIjJcXFwiKSB7XFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBsb2FkaW5nVGVhbS5pbmNsdWRlcyhpdGVtLkNJRCkgPyBcXFwi4oCY4oCYXFxcIiArIGl0ZW0udGl0bGUgKyBcXFwi4oCZ4oCZXFxcIiA6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShjbGlja0Rvd25sb2FkLCBpdGVtLCBpbmZvLCBNWV9JRCwgaXRlbS5DSUQpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaXRlbS5DSURcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gY2xpY2tDaG9vc2UodGl0bGUsIE1ZX0lELCBpKSB7XFxuICAgIGxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmlzU3RhcnRcXFwiKTtcXG4gICAgaWYgKGlzU3RhcnQgPT09IFxcXCIxXFxcIikgcmV0dXJuIFxcXCJ0b2FzdDovL+ato+WcqOS4i+i9vS4uLlxcXCI7XFxuICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IEVsZW1lbnRJbmRleCA9IGJhdGNoVGVhbS5pbmRleE9mKGkpO1xcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFwiI1xcXCIgKyBpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBiYXRjaFRlYW0uc3BsaWNlKEVsZW1lbnRJbmRleCwgMSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAmOKAmFxcXCIgKyB0aXRsZSArIFxcXCLigJnigJlcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXCIjXFxcIiArIGlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGJhdGNoVGVhbS5wdXNoKGkpO1xcbiAgICB9XFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG59XFxuXFxuZnVuY3Rpb24gYmF0Y2hWaWV3KCkge1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWNlemAieS4i+i9vVxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9UElpY3ZGNmViek1uJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIpID09PSBcXFwiMVxcXCIpIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmibnph4/kuIvovb1cXFwiO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjp2aWV3TW9kZVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIGxldCBzdGFydCA9IENvbmZpZy52aWV3UGFnZVNpemUgKiBNYXRoLm1heChwYWdlTnVtIC0gMSwgMCk7XFxuICAgIGxldCBlbmQgPSBzdGFydCArIGNoYXB0ZXJMaXN0Lmxlbmd0aDtcXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLpgInmi6nlhajpg6hcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9MUhWY0hMb056cml0JnRva2VuPVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHN0YXJ0LCBlbmQsIE1ZX0lEKSA9PiB7XFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFwiKTtcXG4gICAgICAgICAgICBsZXQgY2hvb3NlVGVhbSA9IFRvb2wucmFuZ2Uoc3RhcnQsIGVuZCk7XFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IEFycmF5LmZyb20obmV3IFNldChiYXRjaFRlYW0uY29uY2F0KGNob29zZVRlYW0pKSk7XFxuICAgICAgICAgICAgbGV0IGNvbXBsZXRlZCA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFwiOmNvbXBsZXRlZFxcXCIsIFxcXCJbXVxcXCIpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIoKGkpID0+ICFjb21wbGV0ZWQuaW5jbHVkZXMoaSkpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgc3RhcnQsIGVuZCwgTVlfSUQpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBsYXlvdXQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWPlua2iOWFqOmDqFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD1IekVqUHBJM05MOEQmdG9rZW49XFxcIixcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoc3RhcnQsIGVuZCwgTVlfSUQpID0+IHtcXG4gICAgICAgICAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXCIpO1xcbiAgICAgICAgICAgIGxldCBjaG9vc2VUZWFtID0gbmV3IFNldChUb29sLnJhbmdlKHN0YXJ0LCBlbmQpKTtcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih4ID0+ICFjaG9vc2VUZWFtLmhhcyh4KSk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmJhdGNoVGVhbVxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBzdGFydCwgZW5kLCBNWV9JRCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCJcXG4gICAgfSk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi56Gu6K6k6YCJ5LitXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPXRNcnZ0YzZUOWhWYiZ0b2tlbj1cXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChNWV9JRCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXCI6aXNTdGFydFxcXCIsIFxcXCItMVxcXCIpICE9PSBcXFwiLTFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjkuIvovb0uLi5cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXCI6YmF0Y2hUZWFtXFxcIiwgXFxcIltdXFxcIikgfHwgXFxcIltdXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIGJhdGNoVGVhbS5sZW5ndGggPT09IDAgPyBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHmnInpgIlcXFwiIDogXFxcImhpa2VyOi8vcGFnZS9CYXRjaC52aWV3I25vUmVmcmVzaCMjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIjtcXG4gICAgICAgIH0sIE1ZX0lEKSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcbiAgICAgICAgICAgIHdpbmRvd0lkOiBNWV9JRCArIFxcXCIvL+aJuemHj+S4i+i9vVxcXCIsXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lELFxcbiAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBiYWNrdXBDaGFwdGVyTGlzdCxcXG4gICAgICAgICAgICBpbmZvOiBpbmZvXFxuICAgICAgICB9LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiXFxuICAgIH0pO1xcbiAgICBzZXRUeXBlKCk7XFxuICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcIjpiYXRjaFRlYW1cXFwiLCBcXFwiW11cXFwiKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgbGV0IGNvbXBsZXRlZCA9IFtdO1xcbiAgICBmb3IgKGxldCBpID0gMCwgaXRlbSA9IGNoYXB0ZXJMaXN0WzBdOyBpIDwgY2hhcHRlckxpc3QubGVuZ3RoOyBpdGVtID0gY2hhcHRlckxpc3RbKytpXSkge1xcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcbiAgICAgICAgaWYgKGlzX2Rvd25sb2FkICYmIHRhZ0ZpbHRlciAhPT0gXFxcIjFcXFwiKSB7XFxuICAgICAgICAgICAgY29tcGxldGVkLnB1c2goaXRlbS5DSUQpO1xcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goY29tRnVuKGl0ZW0uQ0lELCBpdGVtKSk7XFxuICAgICAgICB9IGVsc2UgaWYgKCFpc19kb3dubG9hZCAmJiB0YWdGaWx0ZXIgIT09IFxcXCIyXFxcIikge1xcbiAgICAgICAgICAgIGNoYXB0ZXJUZWFtLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogYmF0Y2hUZWFtLmluY2x1ZGVzKGl0ZW0uQ0lEKSA/IFxcXCLigJjigJhcXFwiICsgaXRlbS50aXRsZSArIFxcXCLigJnigJlcXFwiIDogaXRlbS50aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGNsaWNrQ2hvb3NlLCBpdGVtLnRpdGxlLCBNWV9JRCwgaXRlbS5DSUQpLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcIiNcXFwiICsgaXRlbS5DSURcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFwiOmNvbXBsZXRlZFxcXCIsIEpTT04uc3RyaW5naWZ5KGNvbXBsZXRlZCkpO1xcbn1cXG5zd2l0Y2ggKHZpZXdNb2RlKSB7XFxuICAgIGNhc2UgXFxcIjBcXFwiOlxcbiAgICAgICAgc2luZ2xlVmlldygpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgXFxcIjFcXFwiOlxcbiAgICAgICAgYmF0Y2hWaWV3KCk7XFxuICAgICAgICBicmVhaztcXG59XFxuaWYgKGlzUmV2ZXJzZSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGNoYXB0ZXJUZWFtLnJldmVyc2UoKTtcXG59XFxubGF5b3V0LnB1c2guYXBwbHkobGF5b3V0LCBjaGFwdGVyVGVhbSk7XFxuc2V0UmVzdWx0KGxheW91dCk7XCIsXCJncm91cFwiOlwi4pGg5o6o6I2QXCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCJcIixcInBhZ2VzXCI6XCJbe1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI2YuRmlsZeW3peWFt1xcXCIsXFxcInBhdGhcXFwiOlxcXCJGaWxlLmpzXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IEZpbGUgPSBqYXZhLmlvLkZpbGU7XFxcXG5jb25zdCB7XFxcXG4gICAgRmlsZXMsXFxcXG4gICAgUGF0aHMsXFxcXG4gICAgU3RhbmRhcmRDb3B5T3B0aW9uLFxcXFxuICAgIFN0YW5kYXJkT3Blbk9wdGlvblxcXFxufSA9IGphdmEubmlvLmZpbGU7XFxcXG5jb25zdCBqYXZhU3RyaW5nID0gamF2YS5sYW5nLlN0cmluZztcXFxcbmxldCBqYXZhU2NvcGUgPSBuZXcgSmF2YUltcG9ydGVyKGphdmEuaW8sIGphdmEubGFuZywgamF2YS5sYW5nLnJlZmxlY3QsIGphdmEudXRpbC5WZWN0b3IpO1xcXFxuXFxcXG5mdW5jdGlvbiBkZWxldGVGaWxlcyhmaWxlTmFtZSkge1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpO1xcXFxuICAgIGlmICghZmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuWIoOmZpOaWh+S7tuWksei0pe+8mlxcXFxcXFwiICsgZmlsZU5hbWUgKyBcXFxcXFxcIuaWh+S7tuS4jeWtmOWcqFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRmlsZShmaWxlTmFtZSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlRGlyZWN0b3J5KGZpbGVOYW1lKTtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfVxcXFxuXFxcXG59XFxcXG4vKipcXFxcbiAqIOWIoOmZpOWNleS4quaWh+S7tlxcXFxuICogXFxcXG4gKiBAcGFyYW0gZmlsZU5hbWVcXFxcbiAqICAgICAgICAgICAg6KKr5Yig6Zmk5paH5Lu255qE5paH5Lu25ZCNXFxcXG4gKiBAcmV0dXJuIOWNleS4quaWh+S7tuWIoOmZpOaIkOWKn+i/lOWbnnRydWUs5ZCm5YiZ6L+U5ZueZmFsc2VcXFxcbiAqL1xcXFxuZnVuY3Rpb24gZGVsZXRlRmlsZShmaWxlTmFtZSkge1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpO1xcXFxuICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUuZXhpc3RzKCkpIHtcXFxcbiAgICAgICAgZmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgLy9sb2coXFxcXFxcXCLliKDpmaTljZXkuKrmlofku7ZcXFxcXFxcIiArIGZpbGVOYW1lICsgXFxcXFxcXCLmiJDlip/vvIFcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk5Y2V5Liq5paH5Lu2XFxcXFxcXCIgKyBmaWxlTmFtZSArIFxcXFxcXFwi5aSx6LSl77yBXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxuXFxcXG59XFxcXG4vKipcXFxcbiAqIOWIoOmZpOebruW9le+8iOaWh+S7tuWkue+8ieS7peWPiuebruW9leS4i+eahOaWh+S7tlxcXFxuICogXFxcXG4gKiBAcGFyYW0gZGlyXFxcXG4gKiAgICAgICAgICAgIOiiq+WIoOmZpOebruW9leeahOaWh+S7tui3r+W+hFxcXFxuICogQHJldHVybiDnm67lvZXliKDpmaTmiJDlip/ov5Tlm550cnVlLOWQpuWImei/lOWbnmZhbHNlXFxcXG4gKi9cXFxcbmZ1bmN0aW9uIGRlbGV0ZURpcmVjdG9yeShkaXIpIHtcXFxcbiAgICAvLyDlpoLmnpxkaXLkuI3ku6Xmlofku7bliIbpmpTnrKbnu5PlsL7vvIzoh6rliqjmt7vliqDmlofku7bliIbpmpTnrKZcXFxcbiAgICBpZiAoIWRpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHtcXFxcbiAgICAgICAgZGlyID0gZGlyICsgRmlsZS5zZXBhcmF0b3I7XFxcXG4gICAgfVxcXFxuICAgIGxldCBkaXJGaWxlID0gbmV3IEZpbGUoZGlyKTtcXFxcbiAgICAvLyDlpoLmnpxkaXLlr7nlupTnmoTmlofku7bkuI3lrZjlnKjvvIzmiJbogIXkuI3mmK/kuIDkuKrnm67lvZXvvIzliJnpgIDlh7pcXFxcbiAgICBpZiAoIWRpckZpbGUuZXhpc3RzKCkgfHwgIWRpckZpbGUuaXNEaXJlY3RvcnkoKSkge1xcXFxuICAgICAgICAvL2xvZyhcXFxcXFxcIuWIoOmZpOebruW9leWksei0pVxcXFxcXFwiICsgZGlyICsgXFxcXFxcXCLnm67lvZXkuI3lrZjlnKjvvIFcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICB9XFxcXG4gICAgbGV0IGZsYWcgPSB0cnVlO1xcXFxuICAgIC8vIOWIoOmZpOaWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tijljIXmi6zlrZDnm67lvZUpXFxcXG4gICAgbGV0IGZpbGVzID0gZGlyRmlsZS5saXN0RmlsZXMoKTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIC8vIOWIoOmZpOWtkOaWh+S7tlxcXFxuICAgICAgICBpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHtcXFxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVGaWxlKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpKTtcXFxcbiAgICAgICAgICAgIGlmICghZmxhZykge1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGVsc2UgeyAvLyDliKDpmaTlrZDnm67lvZVcXFxcbiAgICAgICAgICAgIGZsYWcgPSBkZWxldGVEaXJlY3RvcnkoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpO1xcXFxuICAgICAgICAgICAgaWYgKCFmbGFnKSB7XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgaWYgKCFmbGFnKSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk55uu5b2V5aSx6LSlXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxuICAgIC8vIOWIoOmZpOW9k+WJjeebruW9lVxcXFxuICAgIGlmIChkaXJGaWxlLmRlbGV0ZSgpKSB7XFxcXG4gICAgICAgIC8vbG9nKFxcXFxcXFwi5Yig6Zmk55uu5b2VXFxcXFxcXCIgKyBkaXIgKyBcXFxcXFxcIuaIkOWKn++8gVxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgLy9sb2coXFxcXFxcXCLliKDpmaTnm67lvZVcXFxcXFxcIiArIGRpciArIFxcXFxcXFwi5aSx6LSl77yBXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG4vL2NvcHnljZXkuKrmlofku7ZcXFxcbmZ1bmN0aW9uIGNvcHlGaWxlKHNvdXJjZSwgdGFyZ2V0LCBpc0NvdmVyKSB7XFxcXG4gICAgbGV0IHNvdXJjZVBhdGggPSBQYXRocy5nZXQoc291cmNlKTtcXFxcbiAgICBsZXQgdGFyZ2V0UGF0aCA9IFBhdGhzLmdldCh0YXJnZXQpO1xcXFxuICAgIGxldCBpc0V4aXN0ID0gRmlsZXMuZXhpc3RzKHRhcmdldFBhdGgpO1xcXFxuICAgIGlmIChGaWxlcy5pc0RpcmVjdG9yeShzb3VyY2VQYXRoKSB8fCAoaXNFeGlzdCAmJiAhaXNDb3ZlcikgfHwgKGlzRXhpc3QgJiYgRmlsZXMuaXNEaXJlY3RvcnkodGFyZ2V0UGF0aCkpKSB7XFxcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICB9XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgaWYgKCFpc0V4aXN0KSB7XFxcXG4gICAgICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3Rvcmllcyh0YXJnZXRQYXRoLmdldFBhcmVudCgpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoaXNDb3ZlciA9PT0gdHJ1ZSkge1xcXFxuICAgICAgICAgICAgRmlsZXMuY29weShzb3VyY2VQYXRoLCB0YXJnZXRQYXRoLCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORywgU3RhbmRhcmRDb3B5T3B0aW9uLkNPUFlfQVRUUklCVVRFUyk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBGaWxlcy5jb3B5KHNvdXJjZVBhdGgsIHRhcmdldFBhdGgsIFN0YW5kYXJkQ29weU9wdGlvbi5DT1BZX0FUVFJJQlVURVMpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXRGaWxlVGltZShwYXRoKSB7XFxcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXFxcbiAgICBsZXQgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTtcXFxcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKGxhc3RNb2RpZmllZCk7XFxcXG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBnZXROYW1lKHBhdGgpIHtcXFxcbiAgICByZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0TmFtZSgpICsgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RmlsZVBhdGgocGF0aCwgdHlwZSwgZXhwYW5kKSB7XFxcXG4gICAgdHlwZSA9IHR5cGUgfHwgXFxcXFxcXCJmaWxlXFxcXFxcXCI7XFxcXG4gICAgaWYgKCFbXFxcXFxcXCJmaWxlXFxcXFxcXCIsIFxcXFxcXFwiZGlyXFxcXFxcXCJdLmluY2x1ZGVzKHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLnsbvlnovplJnor69cXFxcXFxcIik7XFxcXG4gICAgbGV0IGZpbGVUeXBlID0gdHlwZSA9PT0gXFxcXFxcXCJmaWxlXFxcXFxcXCIgPyBcXFxcXFxcImlzRmlsZVxcXFxcXFwiIDogXFxcXFxcXCJpc0RpcmVjdG9yeVxcXFxcXFwiO1xcXFxuICAgIGxldCBmaWxlID0gbmV3IEZpbGUocGF0aCk7XFxcXG4gICAgbGV0IGFycmF5ID0gZmlsZS5saXN0RmlsZXMoKSB8fCBbXTtcXFxcbiAgICBsZXQgcGF0aExpc3QgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGlmIChhcnJheVtpXVtmaWxlVHlwZV0oKSkge1xcXFxuICAgICAgICAgICAgcGF0aExpc3QucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgbmFtZTogYXJyYXlbaV0uZ2V0TmFtZSgpICsgXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBwYXRoOiBhcnJheVtpXS5nZXRQYXRoKCkgKyBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogTnVtYmVyKGFycmF5W2ldLmxhc3RNb2RpZmllZCgpKSxcXFxcblxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgaWYgKGV4cGFuZCkge1xcXFxuICAgICAgICBwYXRoTGlzdCA9IHBhdGhMaXN0LmZpbHRlcihpdCA9PiBpdC5uYW1lLmVuZHNXaXRoKGV4cGFuZCkpO1xcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gcGF0aExpc3Q7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHJlbmFtZUZpbGUoZnJvbVBhdGgsIG5hbWUpIHtcXFxcbiAgICBsZXQgZnJvbUZpbGUgPSBuZXcgRmlsZShmcm9tUGF0aCk7XFxcXG4gICAgbGV0IHRvRmlsZSA9IG5ldyBGaWxlKGZyb21GaWxlLmdldFBhcmVudCgpICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBuYW1lKTtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBpZiAoIWZyb21GaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRvRmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAgICAgaWYgKCFkZWxldGVGbGllcyh0b1BhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIEZpbGVzLm1vdmUoZnJvbUZpbGUudG9QYXRoKCksIHRvRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBtb3ZlRmlsZXMoZnJvbVBhdGgsIHRvUGF0aCkge1xcXFxuICAgIGxldCBmcm9tRmlsZSA9IG5ldyBGaWxlKGZyb21QYXRoKTtcXFxcbiAgICBsZXQgdG9GaWxlID0gbmV3IEZpbGUodG9QYXRoKTtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBpZiAoIWZyb21GaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRvRmlsZS5leGlzdHMoKSkge1xcXFxuICAgICAgICAgICAgaWYgKCFkZWxldGVGbGllcyh0b1BhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIEZpbGVzLm1vdmUoZnJvbUZpbGUudG9QYXRoKCksIHRvRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpO1xcXFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBmaWxlV3JpdGUocGF0aCwgY29udGVudCkge1xcXFxuICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgsIGNvbnRlbnQpXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGZpbGVXcml0ZUFwcGVuZChwYXRoLCBjb250ZW50KSB7XFxcXG4gICAgbGV0IGZpbGUgPSBuZXcgRmlsZShwYXRoKTtcXFxcbiAgICBsZXQgcGF0aHMgPSBmaWxlLnRvUGF0aCgpO1xcXFxuICAgIGlmIChmaWxlLmV4aXN0cygpKSB7XFxcXG4gICAgICAgIEZpbGVzLndyaXRlKHBhdGhzLCBuZXcgamF2YVN0cmluZyhjb250ZW50KS5nZXRCeXRlcygpLCBTdGFuZGFyZE9wZW5PcHRpb24uQVBQRU5EKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoLCBjb250ZW50KTtcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFRvdGFsU2l6ZU9mRmlsZXNJbkRpcihmaWxlKSB7XFxcXG4gICAgaWYgKGZpbGUuaXNGaWxlKCkpIHtcXFxcbiAgICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7XFxcXG4gICAgbGV0IHRvdGFsID0gMDtcXFxcbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xcXFxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xcXFxuICAgICAgICAgICAgdG90YWwgKz0gZ2V0VG90YWxTaXplT2ZGaWxlc0luRGlyKGNoaWxkKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gdG90YWw7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldEZpbGVTaXplKGZpbGVQYXRoKSB7XFxcXG4gICAgLy9CeXRlXFxcXG4gICAgbGV0IHNpemUgPSBnZXRUb3RhbFNpemVPZkZpbGVzSW5EaXIobmV3IEZpbGUoZmlsZVBhdGgpKTtcXFxcbiAgICBpZiAoc2l6ZSA8IDApIHtcXFxcbiAgICAgICAgcmV0dXJuIG51bGw7XFxcXG4gICAgfVxcXFxuICAgIGxldCB1bml0Rm9ybSA9IFtcXFxcXFxcIkJ5dGVcXFxcXFxcIiwgXFxcXFxcXCJLQlxcXFxcXFwiLCBcXFxcXFxcIk1CXFxcXFxcXCIsIFxcXFxcXFwiR0JcXFxcXFxcIiwgXFxcXFxcXCJUQlxcXFxcXFwiXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdW5pdEZvcm0ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXFxcbiAgICAgICAgaWYgKHNpemUgPiAxMDI0KSB7XFxcXG4gICAgICAgICAgICBzaXplIC89IDEwMjQ7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBzaXplLnRvRml4ZWQoMikucmVwbGFjZSgvKFxcXFxcXFxcLjAwKSQvLCBcXFxcXFxcIlxcXFxcXFwiKSArIHVuaXRGb3JtW2ldO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiBcXFxcXFxcIkVSUk9SOuaVsOWAvOi/h+Wkp1xcXFxcXFwiO1xcXFxufVxcXFxuLy/lrozmlbTlkIjlubZcXFxcbi8qXFxcXG5mdW5jdGlvbiBmaWxlQ29tYmluZShmaWxlc0lucHV0LCBmaWxlT3V0LCBleHRlbnNpb24sIGludGVyY2VwdCkge1xcXFxuICAgIHdpdGgoamF2YVNjb3BlKSB7XFxcXG4gICAgICAgIGNvbnN0IFRNUF9CVUZGRVJfU0laRSA9IDB4MzAwMDA7XFxcXG4gICAgICAgIGNvbnN0IEJVRkZFUl9TSVpFID0gMHgzMDAwMDA7XFxcXG4gICAgICAgIC8v5ZCI5bm25Li05pe25paH5Lu2XFxcXG4gICAgICAgIGxldCBpbnB1dEZpbGUgPSBuZXcgRmlsZShmaWxlc0lucHV0KTtcXFxcbiAgICAgICAgbGV0IHRtcEZpbGUgPSBuZXcgRmlsZShmaWxlT3V0ICsgXFxcXFxcXCIudG1wXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgdG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpKTtcXFxcbiAgICAgICAgbGV0IGlucHV0RmlsZXMgPSBpbnB1dEZpbGUubGlzdEZpbGVzKCk7XFxcXG4gICAgICAgIGxldCB0YnlzID0gQXJyYXkubmV3SW5zdGFuY2UoQnl0ZS5UWVBFLCBUTVBfQlVGRkVSX1NJWkUpO1xcXFxuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGlucHV0RmlsZXMpIHtcXFxcbiAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aChleHRlbnNpb24pKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gMDtcXFxcbiAgICAgICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGlzLnJlYWQodGJ5cykpICE9IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRvcy53cml0ZSh0YnlzLCAwLCBsZW4pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpcy5jbG9zZSgpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRvcy5jbG9zZSgpO1xcXFxuICAgICAgICAvL+inhOWImeabv+aNouinhOWImTtcXFxcbiAgICAgICAgbGV0IG91dEZpbGUgPSBuZXcgRmlsZShmaWxlT3V0KTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHQgPT09IFxcXFxcXFwiZnVuY3Rpb25cXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgbGV0IHRpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG1wRmlsZSk7XFxcXG4gICAgICAgICAgICBsZXQgb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSkpO1xcXFxuICAgICAgICAgICAgbGV0IGxlbiA9IDA7XFxcXG4gICAgICAgICAgICBsZXQgYnlzID0gQXJyYXkubmV3SW5zdGFuY2UoQnl0ZS5UWVBFLCBCVUZGRVJfU0laRSk7XFxcXG4gICAgICAgICAgICB3aGlsZSAoKGxlbiA9IHRpcy5yZWFkKGJ5cykpICE9IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IG5ieXMgPSBpbnRlcmNlcHQobmV3IFN0cmluZyhieXMsMCxsZW4pKTtcXFxcbiAgICAgICAgICAgICAgICBvcy53cml0ZShuYnlzLCAwLCBuYnlzLmxlbmd0aCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpO1xcXFxuICAgICAgICAgICAgdGlzLmNsb3NlKCk7XFxcXG4gICAgICAgICAgICBvcy5jbG9zZSgpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgaWYgKG91dEZpbGUuZXhpc3RzKCkpIHtcXFxcbiAgICAgICAgICAgICAgICBvdXRGaWxlLmRlbGV0ZSgpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgdG1wRmlsZS5yZW5hbWVUbyhvdXRGaWxlKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbn0qL1xcXFxuLy/mrotcXFxcbmZ1bmN0aW9uIGZpbGVSdWxlKGZpbGVzSW5wdXQsIGZpbGVPdXQsIGludGVyY2VwdCkge1xcXFxuICAgIHdpdGgoamF2YVNjb3BlKSB7XFxcXG4gICAgICAgIGNvbnN0IEJVRkZFUl9TSVpFID0gMHgzMDAwMDA7XFxcXG4gICAgICAgIGxldCB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZXNJbnB1dCk7XFxcXG4gICAgICAgIGlmICghKHRtcEZpbGUuZXhpc3RzKCkgJiYgdG1wRmlsZS5pc0ZpbGUoKSkpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgb3V0RmlsZSA9IG5ldyBGaWxlKGZpbGVPdXQpO1xcXFxuXFxcXG4gICAgICAgIGxldCB0aXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRtcEZpbGUpO1xcXFxuICAgICAgICBsZXQgb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSkpO1xcXFxuICAgICAgICBsZXQgbGVuID0gMDtcXFxcbiAgICAgICAgbGV0IGJ5cyA9IEFycmF5Lm5ld0luc3RhbmNlKEJ5dGUuVFlQRSwgQlVGRkVSX1NJWkUpO1xcXFxuICAgICAgICB3aGlsZSAoKGxlbiA9IHRpcy5yZWFkKGJ5cykpICE9IC0xKSB7XFxcXG4gICAgICAgICAgICBsZXQgbmJ5cyA9IGludGVyY2VwdChuZXcgU3RyaW5nKGJ5cywgMCwgbGVuKSk7XFxcXG4gICAgICAgICAgICBvcy53cml0ZShuYnlzLCAwLCBuYnlzLmxlbmd0aCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdG1wRmlsZS5kZWxldGUoKTtcXFxcbiAgICAgICAgdGlzLmNsb3NlKCk7XFxcXG4gICAgICAgIG9zLmNsb3NlKCk7XFxcXG4gICAgICAgIHJldHVybiB0cnVlO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcmVhZEZpbGUocGF0aCkge1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxldCBwYXRocyA9IFBhdGhzLmdldChwYXRoKTtcXFxcbiAgICAgICAgaWYgKCFGaWxlcy5leGlzdHMocGF0aHMpKSByZXR1cm4gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgcmV0dXJuIFN0cmluZyhuZXcgamF2YVN0cmluZyhGaWxlcy5yZWFkQWxsQnl0ZXMocGF0aHMpKSk7XFxcXG4gICAgfSBjYXRjaCB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH1cXFxcbn1cXFxcbiQuZXhwb3J0cyA9IHtcXFxcbiAgICBnZXRGaWxlVGltZTogKHBhdGgpID0+IGdldEZpbGVUaW1lKHBhdGgpLFxcXFxuICAgIGdldEZpbGVQYXRoOiAocGF0aCwgdHlwZSwgZXhwYW5kKSA9PiBnZXRGaWxlUGF0aChwYXRoLCB0eXBlLCBleHBhbmQpLFxcXFxuICAgIGRlbGV0ZUZpbGVzOiAocGF0aCkgPT4gZGVsZXRlRmlsZXMocGF0aCksXFxcXG4gICAgcmVuYW1lRmlsZTogKHBhdGgsIG5hbWUpID0+IHJlbmFtZUZpbGUocGF0aCwgbmFtZSksXFxcXG4gICAgbW92ZUZpbGVzOiAoZnJvbVBhdGgsIHRvUGF0aCkgPT4gbW92ZUZpbGVzKGZyb21QYXRoLCB0b1BhdGgpLFxcXFxuICAgIGZpbGVXcml0ZTogKHBhdGgsIGNvbnRlbnQpID0+IGZpbGVXcml0ZShwYXRoLCBjb250ZW50KSxcXFxcbiAgICBmaWxlV3JpdGVBcHBlbmQ6IChwYXRoLCBjb250ZW50KSA9PiBmaWxlV3JpdGVBcHBlbmQocGF0aCwgY29udGVudCksXFxcXG4gICAgZ2V0TmFtZTogKHBhdGgpID0+IGdldE5hbWUocGF0aCksXFxcXG4gICAgZ2V0RmlsZVNpemU6IChmaWxlUGF0aCkgPT4gZ2V0RmlsZVNpemUoZmlsZVBhdGgpLFxcXFxuICAgIGZpbGVSdWxlOiAoZmlsZXNJbnB1dCwgZmlsZU91dCwgaW50ZXJjZXB0KSA9PiBmaWxlUnVsZShmaWxlc0lucHV0LCBmaWxlT3V0LCBpbnRlcmNlcHQpLFxcXFxuICAgIGNvcHlGaWxlOiAoc291cmNlLCB0YXJnZXQsIGlzQ292ZXIpID0+IGNvcHlGaWxlKHNvdXJjZSwgdGFyZ2V0LCBpc0NvdmVyKSxcXFxcbiAgICByZWFkRmlsZTogKHBhdGgpID0+IHJlYWRGaWxlKHBhdGgpXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMlxcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7kuIvovb3liJfooagt5pmu6YCa5LiL6L29XFxcIixcXFwicGF0aFxcXCI6XFxcImRvd25sb2FkLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCB2aWV3Q29uZmlnID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgY2hhcHRlckxpc3Q6IFtdLFxcXFxuICAgIGluZm86IHt9LFxcXFxuICAgIGRlZmF1bHRWaWV3OiBcXFxcXFxcIjBcXFxcXFxcIlxcXFxufSwgTVlfUEFSQU1TKTtcXFxcbnZpZXdDb25maWcuaW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIHJ1bGVOYW1lOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIGJvb2tOYW1lOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIGJvb2tUb3BQaWM6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgcGFyc2VDb2RlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgIHR5cGU6IFxcXFxcXFwiY29taWNcXFxcXFxcIixcXFxcbn0sIHZpZXdDb25maWcuaW5mbyk7XFxcXG5sZXQge1xcXFxuICAgIGNoYXB0ZXJMaXN0LFxcXFxuICAgIGluZm8sXFxcXG4gICAgZGVmYXVsdFZpZXdcXFxcbn0gPSB2aWV3Q29uZmlnO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi6YCJ5oup5ZmofFxcXFxcXFwiICsgaW5mby5ib29rTmFtZSlcXFxcblxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuXFxcXG5jb25zdCBkZWZfRG9WaV9TdHlsZSA9IENvbmZpZy5kZWZfRG9WaV9TdHlsZTtcXFxcbmNvbnN0IE1ZX0lEID0gaW5mby5ydWxlTmFtZSArIFxcXFxcXFwiLy9cXFxcXFxcIiArIGluZm8uYm9va05hbWU7XFxcXG5cXFxcblxcXFxubGV0IGlzU3RhcnQgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzU3RhcnRcXFxcXFxcIik7XFxcXG5sZXQgdmlld01vZGUgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnZpZXdNb2RlXFxcXFxcXCIsIGRlZmF1bHRWaWV3KTtcXFxcbmxldCBpc1JldmVyc2UgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmlzUmV2ZXJzZVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgdGFnRmlsdGVyID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjp0YWdGaWx0ZXJcXFxcXFxcIiwgQ29uZmlnLmRlZl9Eb1ZpX1R5cGUpO1xcXFxuXFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6bG9hZGluZ1RlYW1cXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOnZpZXdNb2RlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpjb21wbGV0ZWRcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dGFnRmlsdGVyXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpwYWdlTnVtXFxcXFxcXCIpO1xcXFxufSwgTVlfSUQpKTtcXFxcblxcXFxubGV0IGxheW91dCA9IFtdO1xcXFxuXFxcXG5pZiAoaXNTdGFydCA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnZpZXdNb2RlXFxcXFxcXCIsIGRlZmF1bHRWaWV3KTtcXFxcbiAgICB2aWV3TW9kZSA9IFxcXFxcXFwiMVxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5sZXQgYmFja3VwQ2hhcHRlckxpc3QgPSBjaGFwdGVyTGlzdDtcXFxcbmlmICh0eXBlb2YgY2hhcHRlckxpc3QgPT09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpIHtcXFxcbiAgICBjaGFwdGVyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIGNoYXB0ZXJMaXN0KSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxufVxcXFxubGV0IGNoYXB0ZXJBbGwgPSBjaGFwdGVyTGlzdDtcXFxcbmNoYXB0ZXJMaXN0ID0gY2hhcHRlckxpc3QubWFwKChpdGVtLCBDSUQpID0+IHtcXFxcbiAgICBpdGVtLkNJRCA9IENJRDtcXFxcbiAgICByZXR1cm4gaXRlbTtcXFxcbn0pO1xcXFxubGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpwYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKSk7XFxcXG5sZXQgY2hhcHRlckNodW5rID0gW2NoYXB0ZXJMaXN0XS5jb25jYXQoVG9vbC5jaHVuayhjaGFwdGVyTGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSkpO1xcXFxuY2hhcHRlckxpc3QgPSBjaGFwdGVyQ2h1bmtbcGFnZU51bV0gfHwgW107XFxcXG5cXFxcbmZ1bmN0aW9uIHNldFR5cGUoKSB7XFxcXG4gICAgbGV0IHNldCA9ICh0YWcsIHB1dCkgPT4ge1xcXFxuICAgICAgICBwdXRNeVZhcihwdXQsIHRhZyk7XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAwID09IHBhZ2VOdW0gPyBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgKFxcXFxcXFwi5YWo6YOoKFxcXFxcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFxcXFxcIilcXFxcXFxcIikuZm9udGNvbG9yKFxcXFxcXFwiIzIzQUQ2RlxcXFxcXFwiKSA6IFxcXFxcXFwi5YWo6YOoKFxcXFxcXFwiICsgY2hhcHRlckFsbC5sZW5ndGggKyBcXFxcXFxcIilcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoc2V0LCAwLCBNWV9JRCArIFxcXFxcXFwiOnBhZ2VOdW1cXFxcXFxcIiksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2hhcHRlckNodW5rLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCB0YWdUZXh0ID0gKGkgLSAxKSAqIENvbmZpZy52aWV3UGFnZVNpemUgKyBcXFxcXFxcIi1cXFxcXFxcIiArICgoaSAtIDEpICogQ29uZmlnLnZpZXdQYWdlU2l6ZSArIGNoYXB0ZXJDaHVua1tpXS5sZW5ndGgpO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaSA9PSBwYWdlTnVtID8gXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIHRhZ1RleHQuZm9udGNvbG9yKFxcXFxcXFwiIzIzQUQ2RlxcXFxcXFwiKSA6IHRhZ1RleHQsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIGksIE1ZX0lEICsgXFxcXFxcXCI6cGFnZU51bVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuWFqOmDqFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMFxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjFcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuacquS4i+i9vVxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuacquS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMVxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdGFnRmlsdGVyID09PSBcXFxcXFxcIjJcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIuW3suS4i+i9vVxcXFxcXFwiLmZvbnRjb2xvcihcXFxcXFxcIiMyM0FENkZcXFxcXFxcIikgOiBcXFxcXFxcIuW3suS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXQsIFxcXFxcXFwiMlxcXFxcXFwiLCBNWV9JRCArIFxcXFxcXFwiOnRhZ0ZpbHRlclxcXFxcXFwiKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5sZXQgY2hhcHRlclRlYW0gPSBbXTtcXFxcbmxldCByZWNvcmQgPSBbXTtcXFxcbmlmIChpbmZvLnR5cGUgPT09IFxcXFxcXFwiY29taWNcXFxcXFxcIikge1xcXFxuICAgIGxldCBsYXp5ID0gJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCgpID0+IHtcXFxcbiAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICBsZXQgZmlsZWxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKGlucHV0KTtcXFxcbiAgICAgICAgbGV0IHBpY2xpc3QgPSBmaWxlbGlzdC5tYXAoKGl0ZW0sIGkpID0+IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgaW5wdXQgKyBcXFxcXFxcIi9cXFxcXFxcIiArIChpICsgMSkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiArIHBpY2xpc3Quam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXFxcbiAgICAgICAgbGV0IHJvb3RQYXRoID0gQ29uZmlnLmNvbWljUGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgaW5mby5ydWxlTmFtZSArIFxcXFxcXFwiL1xcXFxcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiL1xcXFxcXFwiICsgaSArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBpdGVtLnRpdGxlO1xcXFxuICAgICAgICByZXR1cm4ge1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogcm9vdFBhdGggKyBsYXp5LFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGksXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgRmlsZS5nZXRGaWxlUGF0aChDb25maWdbaW5mby50eXBlICsgXFxcXFxcXCJQYXRoXFxcXFxcXCJdICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lLCBcXFxcXFxcImRpclxcXFxcXFwiKS5mb3JFYWNoKChmaWxlKSA9PiB7XFxcXG4gICAgICAgIGxldCBhdHQgPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgICAgICBpZiAoYXR0Lmxlbmd0aCA9PT0gMyAmJiBhdHRbMV0gPT09IChcXFxcXFxcIkFcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHJlY29yZC5wdXNoKGF0dFsyXSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgZnVuY3Rpb24gY29tRnVuKGksIGl0ZW0pIHtcXFxcbiAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL05vdmVsTWFpbkJvZHkjYXV0b1BhZ2UjI3JlYWRUaGVtZSNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjXFxcXFxcXCIgKyBpLFxcXFxuICAgICAgICAgICAgICAgIHBhdGg6IENvbmZpZy5ub3ZlbFBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGkgKyBcXFxcXFxcIiRBJFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IGRlZl9Eb1ZpX1N0eWxlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgRmlsZS5nZXRGaWxlUGF0aChDb25maWdbaW5mby50eXBlICsgXFxcXFxcXCJQYXRoXFxcXFxcXCJdICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lLCBcXFxcXFxcImZpbGVcXFxcXFxcIiwgXFxcXFxcXCIudHh0XFxcXFxcXCIpLmZvckVhY2goKGZpbGUpID0+IHtcXFxcbiAgICAgICAgbGV0IGF0dCA9IFRvb2wuc3BsaXQoZmlsZS5uYW1lLCBcXFxcXFxcIiRcXFxcXFxcIiwgMik7XFxcXG4gICAgICAgIGlmIChhdHQubGVuZ3RoID09PSAzICYmIGF0dFsxXSA9PT0gKFxcXFxcXFwiQVxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgcmVjb3JkLnB1c2goYXR0WzJdLnNsaWNlKDAsIGF0dFsyXS5sYXN0SW5kZXhPZihcXFxcXFxcIi5cXFxcXFxcIikpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjbGlja0Rvd25sb2FkKGl0ZW0sIGluZm8sIE1ZX0lELCBpKSB7XFxcXG4gICAgbGV0IGxvYWRpbmdUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmxvYWRpbmdUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgRWxlbWVudEluZGV4ID0gbG9hZGluZ1RlYW0uaW5kZXhPZihpKTtcXFxcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29XFxcXFxcXCI7XFxcXG5cXFxcbiAgICBsb2FkaW5nVGVhbS5wdXNoKGkpO1xcXFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6bG9hZGluZ1RlYW1cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkobG9hZGluZ1RlYW0pKTtcXFxcbiAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJnigJlcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGV0IHJlc3VsdCA9IFxcXFxcXFwidG9hc3Q6Ly/kuIvovb3lpLHotKVcXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICB0b2FzdChcXFxcXFxcIuW8gOWni+S4i+i9vTpcXFxcXFxcIiArIGl0ZW0udGl0bGUpO1xcXFxuICAgICAgICBsZXQgZG93bmxvYWQgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRG93bmxvYWQuZXhlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXN1bHQgPSBkb3dubG9hZChpdGVtLCBpbmZvLCBNWV9JRCwgaSk7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCcXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJ3igJ1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+W3suS4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgIH0gZmluYWxseSB7XFxcXG4gICAgICAgIGxvYWRpbmdUZWFtLnNwbGljZShFbGVtZW50SW5kZXgsIDEpO1xcXFxuICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmxvYWRpbmdUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGxvYWRpbmdUZWFtKSk7XFxcXG4gICAgfVxcXFxuICAgIHJldHVybiByZXN1bHQ7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIHNpbmdsZVZpZXcoKSB7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlj43ovazliJfooahcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSwgTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNSZXZlcnNlXFxcXFxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgaXNSZXZlcnNlLCBNWV9JRCksXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9MzNudkRxYkhIN0hXJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl8yXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaJuemHj+S4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2FkaW5nVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAobG9hZGluZ1RlYW0ubGVuZ3RoID4gMCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ov5jmnInku7vliqHmsqHmnInlrozmiJBcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGlmIChnZXRBcHBWZXJzaW9uKCkgPCAyNTk0KSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acquW8gOaUvlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjp2aWV3TW9kZVxcXFxcXFwiLCBcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG5cXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHBzOi8vaW1nLmljb25zOC5jb20vP2Zvcm1hdD1naWYmaWQ9MHVhZmFNTnp4ajg4JnRva2VuPVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uXzJcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIHNldFR5cGUoKTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBsb2FkaW5nVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpsb2FkaW5nVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgZm9yIChsZXQgaSA9IDAsIGl0ZW0gPSBjaGFwdGVyTGlzdFswXTsgaSA8IGNoYXB0ZXJMaXN0Lmxlbmd0aDsgaXRlbSA9IGNoYXB0ZXJMaXN0WysraV0pIHtcXFxcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcXFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmICghaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGxvYWRpbmdUZWFtLmluY2x1ZGVzKGl0ZW0uQ0lEKSA/IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCLigJnigJlcXFxcXFxcIiA6IGl0ZW0udGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoY2xpY2tEb3dubG9hZCwgaXRlbSwgaW5mbywgTVlfSUQsIGl0ZW0uQ0lEKSxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNcXFxcXFxcIiArIGl0ZW0uQ0lEXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZGVmX0RvVmlfU3R5bGVcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjbGlja0Nob29zZSh0aXRsZSwgTVlfSUQsIGkpIHtcXFxcbiAgICBsZXQgaXNTdGFydCA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiKTtcXFxcbiAgICBpZiAoaXNTdGFydCA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29Li4uXFxcXFxcXCI7XFxcXG4gICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgIGxldCBFbGVtZW50SW5kZXggPSBiYXRjaFRlYW0uaW5kZXhPZihpKTtcXFxcbiAgICBpZiAoRWxlbWVudEluZGV4ID4gLTEpIHtcXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgYmF0Y2hUZWFtLnNwbGljZShFbGVtZW50SW5kZXgsIDEpO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCYXFxcXFxcXCIgKyB0aXRsZSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgYmF0Y2hUZWFtLnB1c2goaSk7XFxcXG4gICAgfVxcXFxuICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJhdGNoVGVhbSkpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gYmF0Y2hWaWV3KCkge1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Y2V6YCJ5LiL6L29XFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/aWQ9UElpY3ZGNmViek1uJnNpemU9NDgmZm9ybWF0PWdpZiZ0b2tlbj1cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIpID09PSBcXFxcXFxcIjFcXFxcXFxcIikgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mraPlnKjmibnph4/kuIvovb1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6dmlld01vZGVcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBzdGFydCA9IENvbmZpZy52aWV3UGFnZVNpemUgKiBNYXRoLm1heChwYWdlTnVtIC0gMSwgMCk7XFxcXG4gICAgbGV0IGVuZCA9IHN0YXJ0ICsgY2hhcHRlckxpc3QubGVuZ3RoO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6YCJ5oup5YWo6YOoXFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD0xSFZjSExvTnpyaXQmdG9rZW49XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChzdGFydCwgZW5kLCBNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IGNob29zZVRlYW0gPSBUb29sLnJhbmdlKHN0YXJ0LCBlbmQpO1xcXFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gQXJyYXkuZnJvbShuZXcgU2V0KGJhdGNoVGVhbS5jb25jYXQoY2hvb3NlVGVhbSkpKTtcXFxcbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWQgPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6Y29tcGxldGVkXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJhdGNoVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIoKGkpID0+ICFjb21wbGV0ZWQuaW5jbHVkZXMoaSkpO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYmF0Y2hUZWFtKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgc3RhcnQsIGVuZCwgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Y+W5raI5YWo6YOoXFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cHM6Ly9pbWcuaWNvbnM4LmNvbS8/Zm9ybWF0PWdpZiZpZD1IekVqUHBJM05MOEQmdG9rZW49XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChzdGFydCwgZW5kLCBNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IGNob29zZVRlYW0gPSBuZXcgU2V0KFRvb2wucmFuZ2Uoc3RhcnQsIGVuZCkpO1xcXFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYmF0Y2hUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih4ID0+ICFjaG9vc2VUZWFtLmhhcyh4KSk7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShiYXRjaFRlYW0pKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICB9LCBzdGFydCwgZW5kLCBNWV9JRCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fc21hbGxfNFxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLnoa7orqTpgInkuK1cXFxcXFxcIixcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwczovL2ltZy5pY29uczguY29tLz9mb3JtYXQ9Z2lmJmlkPXRNcnZ0YzZUOWhWYiZ0b2tlbj1cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKE1ZX0lEKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIsIFxcXFxcXFwiLTFcXFxcXFxcIikgIT09IFxcXFxcXFwiLTFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5LiL6L29Li4uXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBsZXQgYmF0Y2hUZWFtID0gSlNPTi5wYXJzZShnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBcXFxcXFxcIltdXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hUZWFtLmxlbmd0aCA9PT0gMCA/IFxcXFxcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHmnInpgIlcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0JhdGNoLnZpZXcjbm9SZWZyZXNoIyNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgbmV3V2luZG93OiB0cnVlLFxcXFxuICAgICAgICAgICAgd2luZG93SWQ6IE1ZX0lEICsgXFxcXFxcXCIvL+aJuemHj+S4i+i9vVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lELFxcXFxuICAgICAgICAgICAgY2hhcHRlckxpc3Q6IGJhY2t1cENoYXB0ZXJMaXN0LFxcXFxuICAgICAgICAgICAgaW5mbzogaW5mb1xcXFxuICAgICAgICB9LFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uX3NtYWxsXzRcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIHNldFR5cGUoKTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgY29tcGxldGVkID0gW107XFxcXG4gICAgZm9yIChsZXQgaSA9IDAsIGl0ZW0gPSBjaGFwdGVyTGlzdFswXTsgaSA8IGNoYXB0ZXJMaXN0Lmxlbmd0aDsgaXRlbSA9IGNoYXB0ZXJMaXN0WysraV0pIHtcXFxcbiAgICAgICAgbGV0IGlzX2Rvd25sb2FkID0gcmVjb3JkLmluY2x1ZGVzKGl0ZW0udGl0bGUpO1xcXFxuICAgICAgICBpZiAoaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY29tcGxldGVkLnB1c2goaXRlbS5DSUQpO1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaChjb21GdW4oaXRlbS5DSUQsIGl0ZW0pKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmICghaXNfZG93bmxvYWQgJiYgdGFnRmlsdGVyICE9PSBcXFxcXFxcIjJcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgY2hhcHRlclRlYW0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGJhdGNoVGVhbS5pbmNsdWRlcyhpdGVtLkNJRCkgPyBcXFxcXFxcIuKAmOKAmFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwi4oCZ4oCZXFxcXFxcXCIgOiBpdGVtLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKGNsaWNrQ2hvb3NlLCBpdGVtLnRpdGxlLCBNWV9JRCwgaXRlbS5DSUQpLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwiI1xcXFxcXFwiICsgaXRlbS5DSURcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBkZWZfRG9WaV9TdHlsZVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpjb21wbGV0ZWRcXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoY29tcGxldGVkKSk7XFxcXG59XFxcXG5zd2l0Y2ggKHZpZXdNb2RlKSB7XFxcXG4gICAgY2FzZSBcXFxcXFxcIjBcXFxcXFxcIjpcXFxcbiAgICAgICAgc2luZ2xlVmlldygpO1xcXFxuICAgICAgICBicmVhaztcXFxcbiAgICBjYXNlIFxcXFxcXFwiMVxcXFxcXFwiOlxcXFxuICAgICAgICBiYXRjaFZpZXcoKTtcXFxcbiAgICAgICAgYnJlYWs7XFxcXG59XFxcXG5pZiAoaXNSZXZlcnNlID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGNoYXB0ZXJUZWFtLnJldmVyc2UoKTtcXFxcbn1cXFxcbmxheW91dC5wdXNoLmFwcGx5KGxheW91dCwgY2hhcHRlclRlYW0pO1xcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5om56YeP5LiL6L295ZmoXFxcIixcXFwicGF0aFxcXCI6XFxcIkJhdGNoLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQge1xcXFxuICAgIGNoYXB0ZXJMaXN0LFxcXFxuICAgIGluZm8sXFxcXG4gICAgTVlfSURcXFxcbn0gPSBNWV9QQVJBTVM7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCLkuIvovb3lmah8XFxcXFxcXCIraW5mby5ib29rTmFtZSk7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6aXNTdGFydFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIik7XFxcXG4gICAgcmVmcmVzaFBhZ2UoKTtcXFxcbn0sIE1ZX0lEKSk7XFxcXG5cXFxcbmxldCBpc1N0YXJ0ID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5cXFxcbmxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbmlmKHR5cGVvZiBjaGFwdGVyTGlzdCA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIil7XFxcXG4gICAgY2hhcHRlckxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIrY2hhcHRlckxpc3QpfHxcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxufVxcXFxubGV0IGNoYXB0ZXJUZWFtID0gYmF0Y2hUZWFtLm1hcCh2ID0+IHtcXFxcbiAgICBsZXQgY2hhcHRlckl0ZW0gPSBjaGFwdGVyTGlzdFt2XTtcXFxcbiAgICBjaGFwdGVySXRlbS5DSUQgPSB2O1xcXFxuICAgIHJldHVybiBjaGFwdGVySXRlbTtcXFxcbn0pO1xcXFxuaWYgKGlzU3RhcnQgPT09IFxcXFxcXFwiMFxcXFxcXFwiKSB7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlvIDlp4vkuIvovb1bXFxcXFxcXCIgKyBjaGFwdGVyVGVhbS5sZW5ndGggKyBcXFxcXFxcIl1cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIGxldCBkb3dubG9hZCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9CYXRjaFN0YXRpc3RpY3MuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICByZXR1cm4gZG93bmxvYWQoY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB8fCBcXFxcXFxcInRvYXN0Oi8v5LiL6L296ZSZ6K+vXFxcXFxcXCI7XFxcXG4gICAgICAgIH0sIGNoYXB0ZXJUZWFtLCBpbmZvLCBNWV9JRCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzlvIDlp4vkuIvovb1cXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLku7vliqHliJfooajvvJpcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjaGFwdGVyVGVhbSkge1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG5cXFxcbn0gZWxzZSB7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIvovb3ov5vluqY6MC9cXFxcXFxcIitjaGFwdGVyVGVhbS5sZW5ndGgsXFxcXG4gICAgICAgIGRlc2M6IFxcXFxcXFwi4oCc4oCc4oCd4oCd4paH4paH4paH4paH4paH4paH4paH4paH4paH4paHXFxcXFxcXCIuZm9udGNvbG9yKFxcXFxcXFwiI2U1ZTFlNFxcXFxcXFwiKStcXFxcXFxcIiAwJVxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L296L+b5bqmXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5ZCO5Y+w5LiL6L29XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJmdW5jOi8vYmFja2dyb3VuZFxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogW1xcXFxcXFwiW+WPlua2iOS4i+i9vV1cXFxcXFxcIiwgXFxcXFxcXCJb5q2j5Zyo5YGc5q2iLi4uXVxcXFxcXFwiLCBcXFxcXFxcIlvov5Tlm55dXFxcXFxcXCIsIFxcXFxcXFwiW+WkhOeQhuWksei0pV1cXFxcXFxcIiwgXFxcXFxcXCJb6YeN5paw5byA5aeLXVxcXFxcXFwiXVtzdGF0dXNdLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoTVlfSUQpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBcXFxcXFxcIjBcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiW+ato+WcqOWBnOatoi4uLl1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mraPlnKjlj5bmtojkuIvovb3ku7vliqFcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5pqC5YGcLi4uXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gXFxcXFxcXCIyXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LpgIDlh7rkuIvovb3lmahcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoW1xcXFxcXFwiM1xcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIl0uaW5jbHVkZXMoc3RhdHVzKSkge1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjppc1N0YXJ0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihNWV9JRCArIFxcXFxcXFwiOmxvZ1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6YeN5paw54K55Ye75LiL6L29XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgTVlfSUQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIjxzdHJvbmc+5LiL6L295pel5b+XPC9zdHJvbmc+XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcbiAgICB9KTtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzml6Xlv5dcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTpcXFxcXFxcIuKAnOKAnOKAneKAnSQ+XFxcXFxcXCIrXFxcXFxcXCLlvIDlp4vkuIvovb0uLi4uLi5cXFxcXFxcIi5mb250Y29sb3IoXFxcXFxcXCIjMDBmZjAwXFxcXFxcXCIpLFxcXFxuICAgICAgICB1cmw6XFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCIjbG9nIzBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOmZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbn1cXFxcblxcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI2ZnLuaJuemHj+S4i+i9vee7n+iuoVxcXCIsXFxcInBhdGhcXFwiOlxcXCJCYXRjaFN0YXRpc3RpY3MuanNcXFwiLFxcXCJydWxlXFxcIjpcXFwiY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuXFxcXG5mdW5jdGlvbiB0YXNrKHRhc2tQYXJhbSkge1xcXFxuICAgIGxldCByZXN1bHQgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQmF0Y2guZXhlLmpzXFxcXFxcXCIpKHRhc2tQYXJhbSk7XFxcXG4gICAgcmV0dXJuIHJlc3VsdDtcXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzID0gZnVuY3Rpb24oY2hhcHRlclRlYW0sIGluZm8sIE1ZX0lEKSB7XFxcXG4gICAgaWYgKGNoYXB0ZXJUZWFtLmxlbmd0aCA9PT0gMCkge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+epuueahOS4i+i9vemYn+WIl1xcXFxcXFwiO1xcXFxuICAgIH1cXFxcbiAgICB2YXIgY291bnQgPSAwO1xcXFxuICAgIHZhciB0YXNrQ291bnQgPSBjaGFwdGVyVGVhbS5sZW5ndGg7XFxcXG4gICAgdmFyIHN1Y2Nlc3NDSUQgPSBbXTtcXFxcbiAgICB2YXIgZmFpbE5hbWUgPSBbXTtcXFxcbiAgICB2YXIgbG9nQ291bnQgPSAxO1xcXFxuICAgIHZhciB0YXNrVGVhbSA9IGNoYXB0ZXJUZWFtLm1hcChjaGFwdGVySXRlbSA9PiAoe1xcXFxuICAgICAgICBmdW5jOiB0YXNrLFxcXFxuICAgICAgICBpZDogY2hhcHRlckl0ZW0udGl0bGUsXFxcXG4gICAgICAgIHBhcmFtOiB7XFxcXG4gICAgICAgICAgICBjaGFwdGVySXRlbTogY2hhcHRlckl0ZW0sXFxcXG4gICAgICAgICAgICBpbmZvOiBpbmZvLFxcXFxuICAgICAgICAgICAgTVlfSUQ6IE1ZX0lEXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KSk7XFxcXG4gICAgbGV0IGxvZ051bSA9IENvbmZpZy5sb2dOdW07XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBwdXRMb2codGV4dCkge1xcXFxuICAgICAgICBsb2codGV4dCk7XFxcXG4gICAgICAgIGlmIChsb2dDb3VudCA+PSBsb2dOdW0pIHtcXFxcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW0oTVlfSUQgKyBcXFxcXFxcIiNsb2cjXFxcXFxcXCIgKyAobG9nQ291bnQgLSAxMCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGFkZEl0ZW1BZnRlcihNWV9JRCArIFxcXFxcXFwifHzml6Xlv5dcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIiQ+XFxcXFxcXCIgKyB0ZXh0LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcIiNsb2cjXFxcXFxcXCIgKyBsb2dDb3VudFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbG9nQ291bnQrKztcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBmdW5jdGlvbiBsaXN0ZW5lcihwZXJjaCwgaWQsIGVycm9yLCBDSUQpIHtcXFxcbiAgICAgICAgY291bnQrKztcXFxcbiAgICAgICAgbGV0IGlzU3VjY2VzcyA9IGZhbHNlO1xcXFxuICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcXFxcbiAgICAgICAgICAgIGZhaWxOYW1lLnB1c2goaWQpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwiW2xpc3RlbmVyXeS4i+i9veWksei0pe+8mlxcXFxcXFwiICsgaWQgKyBcXFxcXFxcIjxFUlJPUkAgXFxcXFxcXCIgKyBlcnJvciArIFxcXFxcXFwiPlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChDSUQgPj0gMCkge1xcXFxuICAgICAgICAgICAgc3VjY2Vzc0NJRC5wdXNoKENJRCk7XFxcXG4gICAgICAgICAgICBsZXQgcmF0aW8gPSAoY291bnQgLyB0YXNrQ291bnQpLnRvRml4ZWQoNCk7XFxcXG4gICAgICAgICAgICBsZXQgc3RyaXBDb3VudCA9IE1hdGguY2VpbChyYXRpbyAqIDEwKTtcXFxcbiAgICAgICAgICAgIGlzU3VjY2VzcyA9IHRydWU7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIvovb3ov5vluqbvvJpcXFxcXFxcIiArIHN1Y2Nlc3NDSUQubGVuZ3RoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyB0YXNrQ291bnQsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwi4paHXFxcXFxcXCIucmVwZWF0KHN0cmlwQ291bnQpLmZvbnRjb2xvcihcXFxcXFxcIiNmZmFjMmRcXFxcXFxcIikgKyBcXFxcXFxcIuKWh1xcXFxcXFwiLnJlcGVhdCgxMCAtIHN0cmlwQ291bnQpLmZvbnRjb2xvcihcXFxcXFxcIiNlNWUxZTRcXFxcXFxcIikgKyBcXFxcXFxcIiBcXFxcXFxcIiArIChyYXRpbyAqIDEwMCkgKyBcXFxcXFxcIiVcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L296L+b5bqmXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHB1dExvZyhcXFxcXFxcIltsaXN0ZW5lcl3lt7LlrozmiJDkuIvovb3vvJpcXFxcXFxcIiArIGlkKTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChDSUQgPT09IC0xKSB7XFxcXG4gICAgICAgICAgICBmYWlsTmFtZS5wdXNoKGlkKTtcXFxcbiAgICAgICAgICAgIHB1dExvZyhcXFxcXFxcIltsaXN0ZW5lcl3lt7LlgZzmraLvvJpcXFxcXFxcIiArIGlkKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodGFza0NvdW50ICE9PSBjb3VudCkgcmV0dXJuO1xcXFxuICAgICAgICBpZiAoc3VjY2Vzc0NJRC5sZW5ndGggPT09IHRhc2tDb3VudCkge1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwi4paHXFxcXFxcXCIucmVwZWF0KDEwKS5mb250Y29sb3IoXFxcXFxcXCIjMDBmZjAwXFxcXFxcXCIpICsgXFxcXFxcXCIgMTAwJVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3ov5vluqZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBiYXRjaFRlYW0gPSBKU09OLnBhcnNlKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6YmF0Y2hUZWFtXFxcXFxcXCIsIFxcXFxcXFwiW11cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGZhaWxUZWFtID0gYmF0Y2hUZWFtLmZpbHRlcih2ID0+ICFzdWNjZXNzQ0lELmluY2x1ZGVzKHYpKTtcXFxcbiAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoZmFpbFRlYW0pKTtcXFxcbiAgICAgICAgaWYgKGZhaWxUZWFtLmxlbmd0aCA+IDAgJiYgc3RhdHVzICE9PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwi5LiL6L295aSx6LSlOltcXFxcXFxcIiArIGZhaWxOYW1lLmpvaW4oXFxcXFxcXCJd77yMW1xcXFxcXFwiKSArIFxcXFxcXFwiXeOAglxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvlpITnkIblpLHotKVdXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9veaOp+WItlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gZWxzZSBpZiAoZmFpbFRlYW0ubGVuZ3RoID4gMCAmJiBzdGF0dXMgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIjRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBwdXRMb2coXFxcXFxcXCJbbGlzdGVuZXJdI+W3suWBnOatouaJgOacieS7u+WKoe+8jOS9huW3suaciei/m+W6puS4jeS8mua2iOWksSNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCJb6YeN5paw5byA5aeLXVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBNWV9JRCArIFxcXFxcXFwifHzkuIvovb3mjqfliLZcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIyXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwi5LiL6L295Lu75YqhW1xcXFxcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiXeW3suWFqOmDqOaIkOWKn+WujOaIkFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIlvov5Tlm55dXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX0lEICsgXFxcXFxcXCJ8fOS4i+i9veaOp+WItlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLkuIvovb3ku7vliqFbXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCJd5bey5a6M5oiQXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgdGFza1RlYW1DaHVuayA9IFtdO1xcXFxuICAgIGlmIChDb25maWcudGhyZWFkTnVtID4gMCkge1xcXFxuICAgICAgICB0YXNrVGVhbUNodW5rID0gVG9vbC5jaHVuayh0YXNrVGVhbSwgQ29uZmlnLnRocmVhZE51bSk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdGFza1RlYW1DaHVuayA9IFt0YXNrVGVhbV07XFxcXG4gICAgfVxcXFxuICAgIGZvciAobGV0IHRhc2tMaXN0IG9mIHRhc2tUZWFtQ2h1bmspIHtcXFxcbiAgICAgICAgYmUodGFza0xpc3QsIHtcXFxcbiAgICAgICAgICAgIGZ1bmM6IGxpc3RlbmVyXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoc3RhdHVzID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgbGV0IGJhdGNoVGVhbSA9IEpTT04ucGFyc2UoZ2V0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpiYXRjaFRlYW1cXFxcXFxcIiwgXFxcXFxcXCJbXVxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGxldCBmYWlsVGVhbSA9IGJhdGNoVGVhbS5maWx0ZXIodiA9PiAhc3VjY2Vzc0NJRC5pbmNsdWRlcyh2KSk7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOmJhdGNoVGVhbVxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShmYWlsVGVhbSkpO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfSUQgKyBcXFxcXFxcIjpzdGF0dXNcXFxcXFxcIiwgXFxcXFxcXCI0XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcHV0TG9nKFxcXFxcXFwiW2xpc3RlbmVyXSPlt7LlgZzmraLmiYDmnInku7vliqHvvIzkvYblt7LmnInov5vluqbkuI3kvJrmtojlpLEjXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwiW+mHjeaWsOW8gOWni11cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfSUQgKyBcXFxcXFxcInx85LiL6L295o6n5Yi2XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZmcu5om56YeP5Li756iL5bqPXFxcIixcXFwicGF0aFxcXCI6XFxcIkJhdGNoLmV4ZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFxcXFxcIik7XFxcXG5cXFxcbmZ1bmN0aW9uIGNvbWljKHRhc2tQYXJhbSkge1xcXFxuICAgIGxldCB7XFxcXG4gICAgICAgIGNoYXB0ZXJJdGVtLFxcXFxuICAgICAgICBpbmZvLFxcXFxuICAgICAgICBNWV9JRCxcXFxcbiAgICB9ID0gdGFza1BhcmFtO1xcXFxuICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuIC0xO1xcXFxuICAgIH1cXFxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCI7XFxcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBjaGFwdGVySXRlbS5DSUQgKyBcXFxcXFxcIiRCJFxcXFxcXFwiICsgY2hhcHRlckl0ZW0udGl0bGUgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBsZXQgcGljTGlzdDtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFxcXFxcImlucHV0XFxcXFxcXCIsIFxcXFxcXFwidXJsXFxcXFxcXCIsIFxcXFxcXFwicmV0dXJuIFxcXFxcXFwiICsgaW5mby5wYXJzZUNvZGUpO1xcXFxuICAgICAgICBwaWNMaXN0ID0gZ2V0UGljTGlzdChjaGFwdGVySXRlbS51cmwsIGNoYXB0ZXJJdGVtLnVybCk7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgcGljTGlzdCA9PT0gXFxcXFxcXCJzdHJpbmdcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcGljTGlzdCA9IHBpY0xpc3QucmVwbGFjZShcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikuc3BsaXQoXFxcXFxcXCImJlxcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcXFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+v77yaXFxcXFxcXCIgKyBlLm1lc3NhZ2UgKyBcXFxcXFxcIj5cXFxcXFxcIjtcXFxcbiAgICAgICAgdGhyb3cgZTtcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgTCA9IHBpY0xpc3QubGVuZ3RoO1xcXFxuICAgIGlmKEw9PT0wKXtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwiPOa8q+eUu+WbvueJh+ino+aekOmUmeivr++8muWbvueJh+mTvuaOpei/lOWbnuS4uuepuj5cXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIGlmIChpbmZvLmJvb2tUb3BQaWMpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLCBib29rVG9wUGljWzFdKTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwiPOWwgemdouS4i+i9vemUmeivr++8mlxcXFxcXFwiICsgZS5tZXNzYWdlICsgXFxcXFxcXCI+XFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHZhciBzY2hlZHVsZSA9IG5ldyBNYXAoW1xcXFxuICAgICAgICBbTCwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb0xMDAlXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuOTAgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb05MCUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuNzUgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb03NSUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuNTAgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb01MCUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuMjUgKiBMKSwgKCkgPT4gbG9nKGNoYXB0ZXJJdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb0yNSUrXFxcXFxcXCIpXVxcXFxuICAgIF0pO1xcXFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBwaWMgPSBUb29sLmhpa2VyUGljKHBpY0xpc3RbaV0pO1xcXFxuICAgICAgICByZXF1aXJlRG93bmxvYWQocGljWzBdLCBjaGFwdGVyUGF0aCArIChpICsgMSkgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIiwgcGljWzFdKTtcXFxcbiAgICAgICAgc2NoZWR1bGUuaGFzKGkgKyAxKSAmJiBzY2hlZHVsZS5nZXQoaSArIDEpKCk7XFxcXG4gICAgICAgIGlmIChnZXRNeVZhcihNWV9JRCArIFxcXFxcXFwiOnN0YXR1c1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAtMTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBGaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIGNoYXB0ZXJJdGVtLkNJRCArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSk7XFxcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtLkNJRDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gbm92ZWwodGFza1BhcmFtKSB7XFxcXG4gICAgbGV0IHtcXFxcbiAgICAgICAgY2hhcHRlckl0ZW0sXFxcXG4gICAgICAgIGluZm8sXFxcXG4gICAgICAgIE1ZX0lELFxcXFxuICAgIH0gPSB0YXNrUGFyYW07XFxcXG4gICAgaWYgKGdldE15VmFyKE1ZX0lEICsgXFxcXFxcXCI6c3RhdHVzXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gLTE7XFxcXG4gICAgfVxcXFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5ub3ZlbFBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIGNoYXB0ZXJJdGVtLkNJRCArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiO1xcXFxuICAgIGxldCBjb250ZW50ID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgZ2V0Q29udGVudCA9IG5ldyBGdW5jdGlvbihcXFxcXFxcImlucHV0XFxcXFxcXCIsIFxcXFxcXFwidXJsXFxcXFxcXCIsIFxcXFxcXFwicmV0dXJuIFxcXFxcXFwiICsgaW5mby5wYXJzZUNvZGUpO1xcXFxuICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudChjaGFwdGVySXRlbS51cmwsIGNoYXB0ZXJJdGVtLnVybCk7XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFxcXFxcIjzlsI/or7TmraPmlofop6PmnpDplJnor6/vvJpcXFxcXFxcIiArIGUubWVzc2FnZSArIFxcXFxcXFwiPlxcXFxcXFwiO1xcXFxuICAgICAgICB0aHJvdyBlO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoIWNvbnRlbnQpIHtcXFxcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwiPOWwj+ivtOato+aWh+ino+aekOmUmeivr++8muato+aWh+i/lOWbnuS4uuepuj5cXFxcXFxcIik7XFxcXG4gICAgfVxcXFxuICAgIGlmIChpbmZvLmJvb2tUb3BQaWMpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBib29rVG9wUGljID0gVG9vbC5oaWtlclBpYyhpbmZvLmJvb2tUb3BQaWMpO1xcXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKGJvb2tUb3BQaWNbMF0sIG1haW5QYXRoICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLCBib29rVG9wUGljWzFdKTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgbG9nKFxcXFxcXFwiPOWwgemdouS4i+i9vemUmeivr++8mlxcXFxcXFwiICsgZS5tZXNzYWdlICsgXFxcXFxcXCI+XFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIEZpbGUuZmlsZVdyaXRlKGNoYXB0ZXJQYXRoLCBjb250ZW50LnJlcGxhY2UoLzxzY3JpcHQ+Lio/PFxcXFxcXFxcL3NjcmlwdD4vZ21pLCBcXFxcXFxcIlxcXFxcXFwiKS50cmltUmlnaHQoKSk7XFxcXG4gICAgLy9GaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIGNoYXB0ZXJJdGVtLkNJRCArIFxcXFxcXFwiJEEkXFxcXFxcXCIgKyBjaGFwdGVySXRlbS50aXRsZSk7XFxcXG4gICAgcmV0dXJuIGNoYXB0ZXJJdGVtLkNJRDtcXFxcbn1cXFxcbnZhciAkZXhlID0ge1xcXFxuICAgIGNvbWljOiBjb21pYyxcXFxcbiAgICBub3ZlbDogbm92ZWxcXFxcbn07XFxcXG4kLmV4cG9ydHMgPSBmdW5jdGlvbih0YXNrUGFyYW0pIHtcXFxcbiAgICByZXR1cm4gJGV4ZVt0YXNrUGFyYW0uaW5mby50eXBlXSh0YXNrUGFyYW0pO1xcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZmcu5pmu6YCa5Li756iL5bqPXFxcIixcXFwicGF0aFxcXCI6XFxcIkRvd25sb2FkLmV4ZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG5jb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFxcXFxcIik7XFxcXG5cXFxcbmZ1bmN0aW9uIG5vdmVsKGl0ZW0sIGluZm8sIE1ZX0lELCBvcmRlcikge1xcXFxuICAgIGxldCBtYWluUGF0aCA9IENvbmZpZy5ub3ZlbFBhdGggKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8ucnVsZU5hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIiArIGluZm8uYm9va05hbWUgKyBcXFxcXFxcIi9cXFxcXFxcIjtcXFxcbiAgICBsZXQgY2hhcHRlclBhdGggPSBtYWluUGF0aCArIG9yZGVyICsgXFxcXFxcXCIkQSRcXFxcXFxcIiArIGl0ZW0udGl0bGUgKyBcXFxcXFxcIi50eHRcXFxcXFxcIjtcXFxcbiAgICBsZXQgY29udGVudCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IGdldENvbnRlbnQgPSBuZXcgRnVuY3Rpb24oXFxcXFxcXCJpbnB1dFxcXFxcXFwiLCBcXFxcXFxcInVybFxcXFxcXFwiLCBcXFxcXFxcInJldHVybiBcXFxcXFxcIiArIGluZm8ucGFyc2VDb2RlKTtcXFxcbiAgICAgICAgY29udGVudCA9IGdldENvbnRlbnQoaXRlbS51cmwsIGl0ZW0udXJsKSB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgZS5tZXNzYWdlID0gXFxcXFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZTtcXFxcbiAgICAgICAgdGhyb3cgZTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKCFjb250ZW50KSB7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi5bCP6K+05Li656m6XFxcXFxcXCIpO1xcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCI85bCP6K+05q2j5paH6Kej5p6Q6ZSZ6K+v77ya5q2j5paH6L+U5Zue5Li656m6PlxcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGJvb2tUb3BQaWMgPSBUb29sLmhpa2VyUGljKGluZm8uYm9va1RvcFBpYyk7XFxcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsIGJvb2tUb3BQaWNbMV0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCI85bCB6Z2i5LiL6L296ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgRmlsZS5maWxlV3JpdGUoY2hhcHRlclBhdGgsIGNvbnRlbnQucmVwbGFjZSgvPHNjcmlwdD4uKj88XFxcXFxcXFwvc2NyaXB0Pi9nbWksIFxcXFxcXFwiXFxcXFxcXCIpLnRyaW1SaWdodCgpKTtcXFxcbiAgICAvL0ZpbGUucmVuYW1lRmlsZShjaGFwdGVyUGF0aCwgb3JkZXIgKyBcXFxcXFxcIiRBJFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiKTtcXFxcbiAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL1xcXFxcXFwiICsgaW5mby5ib29rTmFtZSArIFxcXFxcXFwiQFxcXFxcXFwiICsgaXRlbS50aXRsZSArIFxcXFxcXFwiIOS4i+i9veWujOaIkFxcXFxcXFwiO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjb21pYyhpdGVtLCBpbmZvLCBNWV9JRCwgb3JkZXIpIHtcXFxcbiAgICBsZXQgbWFpblBhdGggPSBDb25maWcuY29taWNQYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLnJ1bGVOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIvXFxcXFxcXCI7XFxcXG4gICAgbGV0IGNoYXB0ZXJQYXRoID0gbWFpblBhdGggKyBvcmRlciArIFxcXFxcXFwiJEIkXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCIvXFxcXFxcXCI7XFxcXG4gICAgbGV0IHBpY0xpc3QgPSBbXTtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgZ2V0UGljTGlzdCA9IG5ldyBGdW5jdGlvbihcXFxcXFxcImlucHV0XFxcXFxcXCIsIFxcXFxcXFwicmV0dXJuXFxcXFxcXCIgKyBpbmZvLnBhcnNlQ29kZSk7XFxcXG4gICAgICAgIHBpY0xpc3QgPSBnZXRQaWNMaXN0KGl0ZW0udXJsKTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBwaWNMaXN0ID09PSBcXFxcXFxcInN0cmluZ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBwaWNMaXN0ID0gcGljTGlzdC5yZXBsYWNlKFxcXFxcXFwicGljczovL1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdChcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICBlLm1lc3NhZ2UgPSBcXFxcXFxcIjzmvKvnlLvlm77niYfop6PmnpDplJnor68+IFxcXFxcXFwiICsgZS5tZXNzYWdlO1xcXFxuICAgICAgICB0aHJvdyBlO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIGNvbnN0IEwgPSBwaWNMaXN0Lmxlbmd0aDtcXFxcbiAgICBpZihMPT09MCl7XFxcXG4gICAgICAgIHRvYXN0KFxcXFxcXFwi5Zu+54mH6ZO+5o6l5Li656m6XFxcXFxcXCIpO1xcXFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCI85ryr55S75Zu+54mH6Kej5p6Q6ZSZ6K+v77ya5Zu+54mH6ZO+5o6l6L+U5Zue5Li656m6PlxcXFxcXFwiKTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGluZm8uYm9va1RvcFBpYykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IGJvb2tUb3BQaWMgPSBUb29sLmhpa2VyUGljKGluZm8uYm9va1RvcFBpYyk7XFxcXG4gICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoYm9va1RvcFBpY1swXSwgbWFpblBhdGggKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIsIGJvb2tUb3BQaWNbMV0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coXFxcXFxcXCI85bCB6Z2i5LiL6L296ZSZ6K+vPiBcXFxcXFxcIiArIGUubWVzc2FnZSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgdmFyIHNjaGVkdWxlID0gbmV3IE1hcChbXFxcXG4gICAgICAgIFtMLCAoKSA9PiBsb2coaXRlbS50aXRsZSArIFxcXFxcXFwi5bey5LiL6L29MTAwJVxcXFxcXFwiKV0sXFxcXG4gICAgICAgIFt+figwLjkwICogTCksICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb05MCUrXFxcXFxcXCIpXSxcXFxcbiAgICAgICAgW35+KDAuNzUgKiBMKSwgKCkgPT4gbG9nKGl0ZW0udGl0bGUgKyBcXFxcXFxcIuW3suS4i+i9vTc1JStcXFxcXFxcIildLFxcXFxuICAgICAgICBbfn4oMC41MCAqIEwpLCAoKSA9PiBsb2coaXRlbS50aXRsZSArIFxcXFxcXFwi5bey5LiL6L29NTAlK1xcXFxcXFwiKV0sXFxcXG4gICAgICAgIFt+figwLjI1ICogTCksICgpID0+IGxvZyhpdGVtLnRpdGxlICsgXFxcXFxcXCLlt7LkuIvovb0yNSUrXFxcXFxcXCIpXVxcXFxuICAgIF0pO1xcXFxuXFxcXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBMOyBpKyspIHtcXFxcbiAgICAgICAgbGV0IHBpYyA9IFRvb2wuaGlrZXJQaWMocGljTGlzdFtpXSk7XFxcXG4gICAgICAgIHJlcXVpcmVEb3dubG9hZChwaWNbMF0sIGNoYXB0ZXJQYXRoICsgKGkgKyAxKSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLCBwaWNbMV0pO1xcXFxuICAgICAgICBzY2hlZHVsZS5oYXMoaSArIDEpICYmIHNjaGVkdWxlLmdldChpICsgMSkoKTtcXFxcbiAgICB9XFxcXG5cXFxcbiAgICBGaWxlLnJlbmFtZUZpbGUoY2hhcHRlclBhdGgsIG9yZGVyICsgXFxcXFxcXCIkQSRcXFxcXFxcIiArIGl0ZW0udGl0bGUpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBpbmZvLmJvb2tOYW1lICsgXFxcXFxcXCJAXFxcXFxcXCIgKyBpdGVtLnRpdGxlICsgXFxcXFxcXCIg5LiL6L295a6M5oiQXFxcXFxcXCI7XFxcXG59XFxcXG52YXIgJGV4ZSA9IHtcXFxcbiAgICBjb21pYzogY29taWMsXFxcXG4gICAgbm92ZWw6IG5vdmVsXFxcXG59O1xcXFxuJC5leHBvcnRzID0gZnVuY3Rpb24oaXRlbSwgaW5mbywgTVlfSUQsIG9yZGVyKSB7XFxcXG4gICAgcmV0dXJuICRleGVbaW5mby50eXBlXShpdGVtLCBpbmZvLCBNWV9JRCwgb3JkZXIpO1xcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjZi7pgJrnlKjlt6XlhbdcXFwiLFxcXCJwYXRoXFxcIjpcXFwiVG9vbC5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCIkLmV4cG9ydHMgPSB7XFxcXG4gICAgc3BsaXQodGV4dCwgdGFyZ2V0LCBjb3VudCkge1xcXFxuICAgICAgICBjb3VudCA9IGNvdW50ID09PSB1bmRlZmluZWQgPyAxIDogY291bnQ7XFxcXG4gICAgICAgIGxldCBhcnJheSA9IFt0ZXh0XTtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxcXG4gICAgICAgICAgICB0ZXh0ID0gYXJyYXlbaV07XFxcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0ZXh0LmluZGV4T2YodGFyZ2V0KTtcXFxcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGFycmF5W2ldID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XFxcXG4gICAgICAgICAgICBhcnJheVtpICsgMV0gPSB0ZXh0LnNsaWNlKGluZGV4ICsgdGFyZ2V0Lmxlbmd0aCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIGFycmF5O1xcXFxuICAgIH0sXFxcXG4gICAgY2h1bmsoYXJyLCBzaXplKSB7XFxcXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcXFxcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkgKz0gc2l6ZSkge1xcXFxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyLnNsaWNlKGksIGkgKyBzaXplKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXFxcbiAgICB9LFxcXFxuICAgIGhpa2VyUGljKHVybCkge1xcXFxuICAgICAgICB2YXIgaGVhZGVycyA9IHt9O1xcXFxuICAgICAgICBsZXQgdXJscyA9IHVybC5zcGxpdChcXFxcXFxcIkBcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBwaWNVcmwgPSB1cmxzLnNoaWZ0KCk7XFxcXG4gICAgICAgIGxldCBsZW5ndGggPSB1cmxzLmxlbmd0aDtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHVybHNbaV0uc3BsaXQoXFxcXFxcXCI9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIFtwaWNVcmwsIGhlYWRlcnNdO1xcXFxuICAgIH0sXFxcXG4gICAgcmFuZ2Uoc3RhcnQsIGVuZCkge1xcXFxuICAgICAgICByZXR1cm4gQXJyYXkoZW5kIC0gc3RhcnQpLmZpbGwoMCkubWFwKChlbCwgaSkgPT4gc3RhcnQgKyBpKTtcXFxcbiAgICB9XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI2ouQ29uZmlnXFxcIixcXFwicGF0aFxcXCI6XFxcIkNvbmZpZy5qc29uXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgbG9jYWxDb25maWcgPSB7fTtcXFxcblxcXFxudHJ5IHtcXFxcbiAgICBsb2NhbENvbmZpZyA9IEpTT04ucGFyc2UoRmlsZS5yZWFkRmlsZShnZXRQYXRoKFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9maWxlcy/mnKzlnLDotYTmupDnrqHnkIYvY29uZmlnLmpzb25cXFxcXFxcIikuc2xpY2UoNykpKTtcXFxcbn0gY2F0Y2ggKGUpIHtcXFxcbiAgICBkZWxldGVGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG59XFxcXG5jb25zdCBDb25maWcgPSBPYmplY3QuYXNzaWduKHtcXFxcbiAgICBob21lUGF0aDogZ2V0UGF0aChcXFxcXFxcImhpa2VyOi8vZmlsZXMvbG9jYWxNYW5hZ2VyXFxcXFxcXCIpLnNsaWNlKDcpLFxcXFxuICAgIGxvZ051bTogMTAsXFxcXG4gICAgdGhyZWFkTnVtOiAxNixcXFxcbiAgICBkZWZfaXNQYWdpbmF0ZTogXFxcXFxcXCIxXFxcXFxcXCIsIC8vMem7mOiupOW8gOWQr+WIhumhte+8jDDpu5jorqTlhbPpl61cXFxcbiAgICB2aWV3UGFnZVNpemU6IDIwMCxcXFxcbiAgICBkZWZfUGljOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljNFxcXFxcXFwiLFxcXFxuICAgIGRlZl9Mb3JkX1R5cGU6IFxcXFxcXFwiY29taWNcXFxcXFxcIixcXFxcbiAgICBkZWZfVmlld19TdHlsZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICBkZWZfRG9WaV9TdHlsZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICBkZWZfRG9WaV9UeXBlOiBcXFxcXFxcIjFcXFxcXFxcIiwgLy8w5YWo6YOoLCAx5pyq5a6M5oiQ77yMMuW3suWujOaIkFxcXFxufSwgbG9jYWxDb25maWcpO1xcXFxuY29uc3QgUEFUSFMgPSB7XFxcXG4gICAgbm92ZWxQYXRoOiBcXFxcXFxcIi/lsI/or7QvXFxcXFxcXCIsXFxcXG4gICAgY29taWNQYXRoOiBcXFxcXFxcIi/mvKvnlLsvXFxcXFxcXCIsXFxcXG4gICAgbm92ZWxGdWxsUGF0aDogXFxcXFxcXCIv5bCP6K+05ZCI5bm2L1xcXFxcXFwiLFxcXFxuICAgIGV4dGVybmFsSW1wb3J0UGF0aDogXFxcXFxcXCIv5aSW5a+85bCP6K+0L1xcXFxcXFwiXFxcXG59XFxcXG5cXFxcblxcXFxuT2JqZWN0LmtleXMoUEFUSFMpLmZvckVhY2goa2V5ID0+IENvbmZpZ1trZXldID0gQ29uZmlnLmhvbWVQYXRoICsgUEFUSFNba2V5XSk7XFxcXG4kLmV4cG9ydHMgPSBDb25maWc7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5Li76aG16Z2iXFxcIixcXFwicGF0aFxcXCI6XFxcIk1haW4udmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmZ1bmN0aW9uIG1haW4oKSB7XFxcXG4gICAgdmFyIGxheW91dCA9IFtdO1xcXFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG4gICAgbGV0IHR5cGUgPSBnZXRNeVZhcihcXFxcXFxcIi50eXBlXFxcXFxcXCIsIGdldEl0ZW0oXFxcXFxcXCJtYWluOnR5cGVcXFxcXFxcIikgfHwgQ29uZmlnLmRlZl9Mb3JkX1R5cGUpO1xcXFxuICAgIGxldCB0Z251bSA9IGdldE15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICBhZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoTVlfSUQpID0+IHtcXFxcbiAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcInNlYXJjaEtleVxcXFxcXFwiKTtcXFxcbiAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiKTtcXFxcbiAgICB9KSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdHlwZSA9PT0gXFxcXFxcXCJjb21pY1xcXFxcXFwiID8gXFxcXFxcXCLil4nmvKvnlLtcXFxcXFxcIiA6IFxcXFxcXFwi4peL5ryr55S7XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCh0eXBlKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcXFxcXCJjb21pY1xcXFxcXFwiKSByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi50eXBlXFxcXFxcXCIsIFxcXFxcXFwiY29taWNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwibWFpbjp0eXBlXFxcXFxcXCIsIFxcXFxcXFwiY29taWNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCB0eXBlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdHlwZSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiID8gXFxcXFxcXCLil4nlsI/or7RcXFxcXFxcIiA6IFxcXFxcXFwi4peL5bCP6K+0XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCh0eXBlKSA9PiB7XFxcXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiKSByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi50eXBlXFxcXFxcXCIsIFxcXFxcXFwibm92ZWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwibWFpbjp0eXBlXFxcXFxcXCIsIFxcXFxcXFwibm92ZWxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCB0eXBlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdHlwZSA9PT0gXFxcXFxcXCJ0eHRcXFxcXFxcIiA/IFxcXFxcXFwi4peJVFhUXFxcXFxcXCIgOiBcXFxcXFxcIuKXi1RYVFxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgodHlwZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFxcXFxcXFwidHh0XFxcXFxcXCIpIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbENvbGxlY3RlZC52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIudHlwZVxcXFxcXFwiLCBcXFxcXFxcInR4dFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJtYWluOnR5cGVcXFxcXFxcIiwgXFxcXFxcXCJ0eHRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCB0eXBlKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8zXFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBpZiAodHlwZSA9PT0gXFxcXFxcXCJ0eHRcXFxcXFxcIikge1xcXFxuICAgICAgICB0eHRWaWV3ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2V4dGVybmFsaW1wb3J0VHh0LnZpZXdcXFxcXFxcIik7XFxcXG4gICAgICAgIHJldHVybiB0eHRWaWV3KGxheW91dCk7XFxcXG4gICAgfVxcXFxuICAgIGxldCB0YWcgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1t0eXBlICsgXFxcXFxcXCJQYXRoXFxcXFxcXCJdLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbiAgICBpZiAodGFnLmxlbmd0aCA9PT0gMCkge1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLorr7nva5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogTVlfUlVMRS52ZXJzaW9uXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOW4ruWKqeKAneKAnVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9oZWxwLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/a2V5d29yZD1ub3ZlbENvbWljXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICc8aDEgc3R5bGU9XFxcXFxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcXFxcXCI+5ZWl6YO95rKh5pyJ6IC2PC9oMT4nLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJldHVybiBzZXRSZXN1bHQobGF5b3V0KTtcXFxcbiAgICB9XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB1cmw6ICdcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIraW5wdXQnLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIuaQnOS9oOaDs+imgeeahCNcXFxcXFxcIiArIHR5cGUgKyBcXFxcXFxcIiMuLi4uLi5cXFxcXFxcIixcXFxcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKCh0YWcsIHR5cGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgYXJyMSA9IFtdO1xcXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcInRpdGxlXFxcXFxcXCI6IHRhZ1tpXS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJzZWFyY2hfdXJsXFxcXFxcXCI6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eT9pc0FsbD0xJnNlYXJjaFRlcm1zPSoqJnR5cGU9XFxcXFxcXCIgKyB0eXBlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcXCJzZWFyY2hGaW5kXFxcXFxcXCI6IFxcXFxcXFwianM6JC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvU2VhcmNoLnZpZXc/cnVsZT0nK01ZX1JVTEUuX3RpdGxlKTtcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJyMSk7XFxcXG4gICAgICAgICAgICB9LCB0YWcsIHR5cGUpLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignc2VhcmNoS2V5JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXFxcXFwicHV0TXlWYXIoJ3NlYXJjaEtleScsaW5wdXQpXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLigJjigJjimpnorr7nva7igJnigJlcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcudmlldyNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgdmVyc2lvbjogTVlfUlVMRS52ZXJzaW9uXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcblxcXFxuXFxcXG4gICAgZm9yIChsZXQgaSBpbiB0YWcpIHtcXFxcbiAgICAgICAgbGV0IGl0ID0gdGFnW2ldO1xcXFxuICAgICAgICBpZiAodGdudW0gPT09IGkpIHtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJxcXFxcXFxcIiArIGl0Lm5hbWUgKyBcXFxcXFxcIuKAneKAnVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoW1xcXFxcXFwi5Yig6Zmk6K+l55uu5b2VXFxcXFxcXCIsIFxcXFxcXFwi6Lez6L2s5bCP56iL5bqPXFxcXFxcXCJdLCAxLCBcXFxcXFxcIumAieaLqeaTjeS9nFxcXFxcXFwiKS5zZWxlY3QoKGl0KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChcXFxcXFxcIui3s+i9rOWwj+eoi+W6j1xcXFxcXFwiID09PSBpbnB1dCkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9ob21lQFxcXFxcXFwiICsgaXQubmFtZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRoZW4oW1xcXFxcXFwi6K+l5pON5L2c5LiN5Lya5Yig6Zmk5bCP56iL5bqP77yM5L2G6K+l5bCP56iL5bqP5LiL6L2955qE5omA5pyJ5ryr55S75bCG6KKr5Yig6ZmkXFxcXFxcXCJdKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXFxcXFwi6K+l5pON5L2c5LiN5Lya5Yig6Zmk5bCP56iL5bqP77yM5L2G6K+l5bCP56iL5bqP5LiL6L2955qE5omA5pyJIOa8q+eUuy/lsI/or7Qg5bCG6KKr5Yig6ZmkXFxcXFxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuZGVsZXRlRmlsZXMocGF0aCkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIi50Z251bVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGl0LnBhdGgpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSwgaXQpXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoaSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnRnbnVtXFxcXFxcXCIsIGkpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSwgaSksXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBsZXQgcGF0aCA9IHRhZ1t0Z251bV0ucGF0aDtcXFxcbiAgICBsZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcblxcXFxuICAgIGlmIChtaGxpc3QubGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgXFxcXFxcXCLllaXpg73msqHmnInogLZcXFxcXFxcIi5iaWcoKSxcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KVxcXFxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGxheW91dCk7XFxcXG4gICAgfVxcXFxuICAgIGxldCBwYWdlVXJsID0gdHlwZSA9PT0gXFxcXFxcXCJub3ZlbFxcXFxcXFwiID8gXFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxCcm93c2VyLnZpZXdcXFxcXFxcIiA6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcXFxcXCI7XFxcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBtaGxpc3QpIHtcXFxcbiAgICAgICAgbGV0IHBpYyA9IGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIGl0ZW0ucGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgaXRlbS5uYW1lICsgXFxcXFxcXCIuanBnXFxcXFxcXCIpID8gaXRlbS5wYXRoICsgXFxcXFxcXCIvXFxcXFxcXCIgKyBpdGVtLm5hbWUgKyBcXFxcXFxcIi5qcGdcXFxcXFxcIiA6IENvbmZpZy5kZWZfUGljO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lLFxcXFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcXFxuICAgICAgICAgICAgdXJsOiBwYWdlVXJsICsgXFxcXFxcXCI/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGUsXFxcXG4gICAgICAgICAgICBleHRyYTogaXRlbVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxcXG59XFxcXG5cXFxcbm1haW4oKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwidGV4dF8xXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2Lua8q+eUu+eroOiKguWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJDb21pY0Jyb3dzZXIudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmlmIChnZXRQYXJhbShcXFxcXFxcImhhc1BhcmFtc1xcXFxcXFwiKSA9PT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCIpIHtcXFxcbiAgICBNWV9QQVJBTVMgPSB7XFxcXG4gICAgICAgIHBhdGg6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcInBhdGhcXFxcXFxcIikpLFxcXFxuICAgICAgICBuYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJuYW1lXFxcXFxcXCIpKVxcXFxuICAgIH1cXFxcbn1cXFxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCJDVnxcXFxcXFxcIiArIE1ZX1BBUkFNUy5uYW1lKVxcXFxuY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgVG9vbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Ub29sLmpzXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuXFxcXG52YXIgbGF5b3V0ID0gW107XFxcXG5sZXQgbW9kZSA9IGdldE15VmFyKFxcXFxcXFwiLm1vZGVcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxubGV0IGlzUmV2ZXJzZSA9IGdldE15VmFyKFxcXFxcXFwiLmlzUmV2ZXJzZVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5tb2RlXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuaXNSZXZlcnNlXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxuY29uc3QgY29taWNTdGF0dXM9bmV3IE1hcChbW1xcXFxcXFwiQVxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCJdLFtcXFxcXFxcIkJcXFxcXFxcIixcXFxcXFxcIuKAmOKAmFvmnKrlrozmiJBd4oCZ4oCZXFxcXFxcXCJdXSk7XFxcXG5mdW5jdGlvbiBnZXRUaXRsZSh0aXRsZSkge1xcXFxuICAgIGxldCB0aXRsZXMgPSBUb29sLnNwbGl0KHRpdGxlLCBcXFxcXFxcIiRcXFxcXFxcIiwgMik7XFxcXG4gICAgcmV0dXJuIGNvbWljU3RhdHVzLmdldCh0aXRsZXNbMV0pK3RpdGxlc1syXSB8fCB0aXRsZTtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLliKDpmaTmlbTmnKxcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTliKDpmaTmlbTmnKzmvKvnlLvvvJ9cXFxcXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIHBhdGgpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogW1xcXFxcXFwi55yL5ryr55S7XFxcXFxcXCIsIFxcXFxcXFwi5Yig6Zmk56ug6IqCXFxcXFxcXCJdW21vZGVdLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChtb2RlKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLm1vZGVcXFxcXFxcIiwgbW9kZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgIH0sIG1vZGUpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pXFxcXG5sZXQgbWhsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbm1obGlzdC5zb3J0KChhLCBiKSA9PiB7XFxcXG4gICAgYSA9IChhLm5hbWUubWF0Y2goL1xcXFxcXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXFxcbiAgICBiID0gKGIubmFtZS5tYXRjaCgvXFxcXFxcXFxkKy8pIHx8IFtdKVswXSB8fCAwO1xcXFxuICAgIHJldHVybiBhIC0gYjtcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyBcXFxcXFxcIueroOiKgiBcXFxcXFxcIi5iaWcoKSArIChcXFxcXFxcIuWFseaciTpcXFxcXFxcIiArIG1obGlzdC5sZW5ndGggKyBcXFxcXFxcIueroFxcXFxcXFwiKS5zbWFsbCgpLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChpc1JldmVyc2UpID0+IHtcXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIuaXNSZXZlcnNlXFxcXFxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgIH0sIGlzUmV2ZXJzZSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCJcXFxcbn0pO1xcXFxubGV0IGFycmF5ID0gW107XFxcXG5sZXQgbGF6eSA9ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgIGxldCBmaWxlbGlzdCA9IEZpbGUuZ2V0RmlsZVBhdGgoaW5wdXQpO1xcXFxuICAgIGxldCBwaWNsaXN0ID0gZmlsZWxpc3QubWFwKChpdGVtLCBpKSA9PiBcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIGlucHV0ICsgXFxcXFxcXCIvXFxcXFxcXCIgKyAoaSArIDEpICsgXFxcXFxcXCIuanBnXFxcXFxcXCIpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiArIHBpY2xpc3Quam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxufSlcXFxcbmlmIChtb2RlID09PSBcXFxcXFxcIjBcXFxcXFxcIikge1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxcXG4gICAgICAgIGFycmF5LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IGdldFRpdGxlKGl0ZW0ubmFtZSksXFxcXG4gICAgICAgICAgICB1cmw6IGl0ZW0ucGF0aCtsYXp5LFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IENvbmZpZy5kZWZfVmlld19TdHlsZVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG59IGVsc2Uge1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgbWhsaXN0KSB7XFxcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXFxcbiAgICAgICAgYXJyYXkucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIuehruiupOWIoOmZpFtcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIl3vvJ9cXFxcXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0sIGl0ZW0ucGF0aCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9WaWV3X1N0eWxlXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmlmIChpc1JldmVyc2UgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgYXJyYXkucmV2ZXJzZSgpO1xcXFxufVxcXFxubGF5b3V0LnB1c2guYXBwbHkobGF5b3V0LCBhcnJheSk7XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7ogZrlkIjmkJzntKJcXFwiLFxcXCJwYXRoXFxcIjpcXFwiU2VhcmNoLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanM/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUuX3RpdGxlKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvbj9ydWxlPVxcXFxcXFwiICsgTVlfUlVMRS5fdGl0bGUpO1xcXFxubGV0IGNvbWljUnVsZURpcnMgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZ1tnZXRQYXJhbShcXFxcXFxcInR5cGVcXFxcXFxcIikrXFxcXFxcXCJQYXRoXFxcXFxcXCJdLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbmlmIChnZXRQYXJhbShcXFxcXFxcImlzQWxsXFxcXFxcXCIpID09PSBcXFxcXFxcIjFcXFxcXFxcIikge1xcXFxuICAgIGNvbWljUnVsZURpcnMgPSBjb21pY1J1bGVEaXJzLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZSA9PT0gTVlfUlVMRS50aXRsZSk7XFxcXG59XFxcXG5cXFxcbmxldCBzZWFyY2hSZXN1bHQgPSBbXTtcXFxcbmxldCBzZWFyY2hUZXJtcyA9IGdldFBhcmFtKFxcXFxcXFwic2VhcmNoVGVybXNcXFxcXFxcIik7XFxcXG5sZXQgdGVybXNBcnIgPSBzZWFyY2hUZXJtcy5zcGxpdChcXFxcXFxcIlxcXFxcXFwiKS5tYXAodCA9PiB0LnJlcGxhY2UoL1xcXFxcXFxcKnxcXFxcXFxcXC58XFxcXFxcXFw/fFxcXFxcXFxcK3xcXFxcXFxcXCR8XFxcXFxcXFxefFxcXFxcXFxcW3xcXFxcXFxcXF18XFxcXFxcXFwofFxcXFxcXFxcKXxcXFxcXFxcXHt8XFxcXFxcXFx9fFxcXFxcXFxcfHxcXFxcXFxcXC98XFxcXFxcXFxcXFxcXFxcXC9nLCBrID0+IFxcXFxcXFwiXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwiICsgaykpO1xcXFxubGV0IHJlZyA9IG5ldyBSZWdFeHAodGVybXNBcnIuam9pbihcXFxcXFxcIi4qXFxcXFxcXCIpLFxcXFxcXFwiaVxcXFxcXFwiKTtcXFxcbmxldCBwYWdlVXJsPWdldFBhcmFtKFxcXFxcXFwidHlwZVxcXFxcXFwiKT09PVxcXFxcXFwibm92ZWxcXFxcXFxcIj9cXFxcXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbEJyb3dzZXIudmlld1xcXFxcXFwiOlxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbWljQnJvd3Nlci52aWV3XFxcXFxcXCI7XFxcXG5mb3IgKGxldCBzb25EaXIgb2YgY29taWNSdWxlRGlycykge1xcXFxuICAgIGxldCBjb21pY0xpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHNvbkRpci5wYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbiAgICBmb3IgKGxldCBjb21pYyBvZiBjb21pY0xpc3QpIHtcXFxcbiAgICAgICAgaWYgKHJlZy50ZXN0KGNvbWljLm5hbWUpKSB7XFxcXG4gICAgICAgICAgICBzZWFyY2hSZXN1bHQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNvbWljLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogY29taWMucGF0aCArIFxcXFxcXFwiL1xcXFxcXFwiICsgY29taWMubmFtZSArIFxcXFxcXFwiLmpwZ1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogcGFnZVVybCtcXFxcXFxcIj9ydWxlPVxcXFxcXFwiICsgTVlfUlVMRS5fdGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogc29uRGlyLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IGNvbWljXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxufVxcXFxuc2V0UmVzdWx0KHNlYXJjaFJlc3VsdCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu6K6+572uXFxcIixcXFwicGF0aFxcXCI6XFxcIlNldHRpbmcudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCJ86K6+572uXFxcXFxcXCIpO1xcXFxuY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCI8c3Ryb25nPuWfuuehgOiuvue9rjwvc3Ryb25nPlxcXFxcXFwiLmJpZygpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLnm67lvZXot6/lvoRcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3NldHRpbmdUeXBlPWNvbnRlbnRzXFxcXFxcXCIsXFxcXG4gICAgZGVzYzogQ29uZmlnLmhvbWVQYXRoLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLorr7nva7pu5jorqTlsIHpnaJcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBDb25maWcuZGVmX1BpYyxcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP3NldHRpbmdUeXBlPWRlZmF1bHRQaWNcXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzdHJvbmc+5LiL6L295Zmo6K6+572uPC9zdHJvbmc+XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxuZnVuY3Rpb24gc2V0TnVtKGtleSwgdGVzdCkge1xcXFxuICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgMCkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICBpbnB1dCA9IHBhcnNlSW50KGlucHV0KTtcXFxcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0KSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fovpPlhaXmlbDlrZdcXFxcXFxcIjtcXFxcbiAgICBpZiAoIXRlc3QoaW5wdXQpKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S4jeespuWQiOadoeS7tlxcXFxcXFwiO1xcXFxuICAgIENvbmZpZ1trZXldID0gaW5wdXQ7XFxcXG4gICAgc2F2ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXFxcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCJsb2fmlbBcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoQ29uZmlnLmxvZ051bSwgXFxcXFxcXCIwPE48MTAwXFxcXFxcXCIpLmlucHV0KHNldE51bSwgXFxcXFxcXCJsb2dOdW1cXFxcXFxcIiwgaXQgPT4gaXQgPiAwICYmIGl0IDwgMTAwKSxcXFxcbiAgICBkZXNjOiBcXFxcXFxcIlxcXFxcXFwiICsgQ29uZmlnLmxvZ051bSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLliIbmibnkuIvovb3mlbAoMOS4jeW8gOWQrylcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCJcXFxcXFxcIiArIENvbmZpZy50aHJlYWROdW0sIFxcXFxcXFwiTj4tMVxcXFxcXFwiKS5pbnB1dChzZXROdW0sIFxcXFxcXFwidGhyZWFkTnVtXFxcXFxcXCIsIGl0ID0+IGl0ID4gLTEpLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwiXFxcXFxcXCIgKyBDb25maWcudGhyZWFkTnVtLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzdHJvbmc+5bCP6K+06ZiF6K+75Zmo6K6+572uPC9zdHJvbmc+XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIum7mOiupOW8gOWQr+WIhumhtemYheivu1xcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChkZWZfaXNQYWdpbmF0ZSkgPT4ge1xcXFxuICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIDApIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG5cXFxcbiAgICAgICAgQ29uZmlnLmRlZl9pc1BhZ2luYXRlID0gZGVmX2lzUGFnaW5hdGUgPT09IFxcXFxcXFwiMFxcXFxcXFwiID8gXFxcXFxcXCIxXFxcXFxcXCIgOiBcXFxcXFxcIjBcXFxcXFxcIjtcXFxcblxcXFxuICAgICAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcXFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9LCBDb25maWcuZGVmX2lzUGFnaW5hdGUpLFxcXFxuICAgIGRlc2M6IENvbmZpZy5kZWZfaXNQYWdpbmF0ZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIuS4jeW8gOWQr1xcXFxcXFwiIDogXFxcXFxcXCLlvIDlkK9cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmr4/pobXmnIDlpKfnq6DmlbBcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoQ29uZmlnLnZpZXdQYWdlU2l6ZSwgXFxcXFxcXCIzMDxOPDUwMFxcXFxcXFwiKS5pbnB1dChzZXROdW0sIFxcXFxcXFwidmlld1BhZ2VTaXplXFxcXFxcXCIsIGl0ID0+IGl0ID4gMzAgJiYgaXQgPCA1MDApLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwiXFxcXFxcXCIgKyBDb25maWcudmlld1BhZ2VTaXplLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmm7/mjaLop4TliJlcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjP3NldHRpbmdUeXBlPXJlcGxhY2VSdWxlXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIjxzdHJvbmc+5YW25LuW6K6+572uPC9zdHJvbmc+XFxcXFxcXCIuYmlnKCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLop4TliJnlj5HluIPpobVcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgbHZlcjogTVlfUEFSQU1TLnZlcnNpb24gfHwgXFxcXFxcXCLojrflj5bniYjmnKzlpLHotKXvvIzoh6rooYzmn6XnnItcXFxcXFxcIixcXFxcbiAgICAgICAgaWQ6IFxcXFxcXFwiMzU1OVxcXFxcXFwiXFxcXG4gICAgfSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5YWz5LqO5aaC5L2V6LCD55SoXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImh0dHBzOi8vcXVuLnFxLmNvbS9xcXdlYi9xdW5wcm8vc2hhcmU/X3d2PTMmX3d3dj0xMjgmaW52aXRlQ29kZT0xSEZ5QkomZnJvbT0yNDY2MTAmYml6PWthXFxcXFxcXCIsXFxcXG4gICAgZGVzYzogXFxcXFxcXCLor6bnu4bngrnlh7vliqDlhaXpopHpgZPvvIzpopHpgZPph4xATG95RGdJa1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmgaLlpI3pu5jorqTorr7nva5cXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTmgaLlpI3pu5jorqTorr7nva7vvJ9cXFxcXFxcIikuY29uZmlybSgoKSA9PiB7XFxcXG4gICAgICAgIGRlbGV0ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiKTtcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+aBouWkjeWujOaIkFxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmuIXnkIbnvJPlrZhcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1NldHRpbmcvTW9yZS52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9zZXR0aW5nVHlwZT1jYWNoZVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmxldCB0aWQgPSBEYXRlLm5vdygpO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuajgOa1i+abtOaWsFxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChvbGRWZXJzaW9uLCB0aWQpID0+IHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBuZXdWZXJzaW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL2Rldi9nZXRieWlkP2lkPTM1NTlcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDIwMDBcXFxcbiAgICAgICAgICAgIH0pKS5yZXN1bHQudmVyO1xcXFxuICAgICAgICAgICAgaWYgKG5ld1ZlcnNpb24gPD0gb2xkVmVyc2lvbikge1xcXFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0odGlkICsgXFxcXFxcXCIj6K6+572uX+abtOaWsFxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuW3sue7j+aYr+acgOaWsOeJiOacrOS6hlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7Lnu4/mmK/mnIDmlrDniYjmnKzkuoZcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh0aWQgKyBcXFxcXFxcIiPorr7nva5f5pu05pawXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5pyJ5paw54mI5pys6L+Y5pyq5pu05pawXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB0b2FzdChcXFxcXFxcIuacieaWsOeJiOacrOi/mOacquabtOaWsFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJydWxlOi8vNXJXMzZaaVU2S2VHNTVXTTc3K2xhRzl0WlY5eWRXeGxYM1Z5Yk8rL3BXaDBkSEE2THk5b2FXdGxjaTV1YjJ0cFlTNXdjbVZ6Y3k5b2FXdGxjblZzWlM5eWRXeGxiR2x6ZEM1cWMyOXVQMmxrUFRNMU5Uaz1cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh0aWQgKyBcXFxcXFxcIiPorr7nva5f5pu05pawXFxcXFxcXCIsIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLkv6Hmga/ojrflj5blpLHotKVcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+abtOaWsOS/oeaBr+iOt+WPluWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSwgTVlfUEFSQU1TLnZlcnNpb24sIHRpZCksXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IHRpZCArIFxcXFxcXFwiI+iuvue9rl/mm7TmlrBcXFxcXFxcIlxcXFxuICAgIH1cXFxcbn0pO1xcXFxuLypcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLmuIXpmaTlsI/or7TliIbpobXorrDlvZVcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTmuIXpmaTlsI/or7TliIbpobXorrDlvZXvvJ9cXFxcXFxcIikuY29uZmlybSgoKSA9PiB7XFxcXG4gICAgICAgIGRlbGV0ZUZpbGUoXFxcXFxcXCJub3ZlbEZvb3RwcmludC5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+a4hemZpOWujOaIkFxcXFxcXFwiO1xcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG59KTtcXFxcbiovXFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwidGV4dF8xXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuWwj+ivtOeroOiKguWIl+ihqFxcXCIsXFxcInBhdGhcXFwiOlxcXCJOb3ZlbEJyb3dzZXIudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmlmIChnZXRQYXJhbShcXFxcXFxcImhhc1BhcmFtc1xcXFxcXFwiKSA9PT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCIpIHtcXFxcbiAgICBNWV9QQVJBTVMgPSB7XFxcXG4gICAgICAgIHBhdGg6IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcInBhdGhcXFxcXFxcIikpLFxcXFxuICAgICAgICBuYW1lOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJuYW1lXFxcXFxcXCIpKVxcXFxuICAgIH1cXFxcbn1cXFxcbmxldCBwYXRoID0gTVlfUEFSQU1TLnBhdGg7XFxcXG5zZXRQYWdlVGl0bGUoXFxcXFxcXCJOVnxcXFxcXFxcIiArIE1ZX1BBUkFNUy5uYW1lKTtcXFxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IFRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvVG9vbC5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcbmNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgZm9vdDogMCxcXFxcbiAgICBpc1JlcGxhY2U6IHRydWVcXFxcbn0sIEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIikpO1xcXFxubGV0IGlkID0gXFxcXFxcXCIjXFxcXFxcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbnZhciBsYXlvdXQgPSBbXTtcXFxcbmxldCBtb2RlID0gZ2V0TXlWYXIoXFxcXFxcXCIubW9kZVxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIik7XFxcXG5sZXQgbW9kZTIgPSBnZXRNeVZhcihcXFxcXFxcIi5tb2RlMlxcXFxcXFwiLCBDb25maWcuZGVmX2lzUGFnaW5hdGUpO1xcXFxuXFxcXG5sZXQgaXNSZXZlcnNlID0gZ2V0TXlWYXIoXFxcXFxcXCIuaXNSZXZlcnNlXFxcXFxcXCIsIFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLm1vZGVcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5tb2RlMlxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmlzUmV2ZXJzZVxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLnBhZ2VOdW1cXFxcXFxcIik7XFxcXG59KSk7XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFRpdGxlKHRpdGxlKSB7XFxcXG4gICAgbGV0IHRpdGxlcyA9IFRvb2wuc3BsaXQodGl0bGUsIFxcXFxcXFwiJFxcXFxcXFwiLCAyKTtcXFxcbiAgICByZXR1cm4gdGl0bGVzWzJdICE9PSB1bmRlZmluZWQgPyB0aXRsZXNbMl0uc2xpY2UoMCwgdGl0bGVzWzJdLmxhc3RJbmRleE9mKFxcXFxcXFwiLlxcXFxcXFwiKSkgOiB0aXRsZTtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLliKDpmaTmlbTmnKxcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTliKDpmaTmlbTmnKzlsI/or7TvvJ9cXFxcXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sIHBhdGgpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBbXFxcXFxcXCLnnIvlsI/or7RcXFxcXFxcIiwgXFxcXFxcXCLliKDpmaTnq6DoioJcXFxcXFxcIl1bbW9kZV0sXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKG1vZGUpID0+IHtcXFxcbiAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIubW9kZVxcXFxcXFwiLCBtb2RlID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSwgbW9kZSksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCY4oCY5pu05aSa5Yqf6IO9ID7igJnigJlcXFxcXFxcIixcXFxcbiAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmZ1bmN0aW9uIHR4dChwYXRocykge1xcXFxuICAgIHNob3dMb2FkaW5nKFxcXFxcXFwi5q2j5Zyo5ZCI5bm2Li4uXFxcXFxcXCIpO1xcXFxuICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICBjb25zdCBUb29sID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1Rvb2wuanNcXFxcXFxcIik7XFxcXG4gICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgbGV0IGZpbGVsaXN0ID0gRmlsZS5nZXRGaWxlUGF0aChwYXRocy5wYXRoLCBcXFxcXFxcImZpbGVcXFxcXFxcIiwgXFxcXFxcXCIudHh0XFxcXFxcXCIpO1xcXFxuICAgIGxldCBsaXN0TGVuZ3RoID0gZmlsZWxpc3QubGVuZ3RoO1xcXFxuICAgIGlmIChsaXN0TGVuZ3RoID09PSAwKSB7XFxcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v56m655qE56ug6IqCXFxcXFxcXCI7XFxcXG4gICAgfVxcXFxuICAgIGNvbnN0IGJvb2tJbmZvID0gT2JqZWN0LmFzc2lnbih7XFxcXG4gICAgICAgIHNlbGVjdGVkOiBbXSxcXFxcbiAgICAgICAgaXNSZXBsYWNlOiB0cnVlXFxcXG4gICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aHMucGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG4gICAgbGV0IGJ1ZmlsZWxpc3QgPSBbXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xcXFxuICAgICAgICBsZXQgZmlsZSA9IGZpbGVsaXN0W2ldO1xcXFxuICAgICAgICBsZXQgZmlsZUluZm8gPSBUb29sLnNwbGl0KGZpbGUubmFtZSwgXFxcXFxcXCIkXFxcXFxcXCIsIDIpO1xcXFxuICAgICAgICBidWZpbGVsaXN0LnB1c2goe1xcXFxuICAgICAgICAgICAgbmFtZTogZmlsZUluZm9bMl0uc2xpY2UoMCwgZmlsZUluZm9bMl0ubGFzdEluZGV4T2YoXFxcXFxcXCIuXFxcXFxcXCIpKSxcXFxcbiAgICAgICAgICAgIHBhdGg6IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgZmlsZS5wYXRoLFxcXFxuICAgICAgICAgICAgaWQ6IE51bWJlcihmaWxlSW5mb1swXSkgfHwgMFxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgYnVmaWxlbGlzdC5zb3J0KChhLCBiKSA9PiBhLmlkIC0gYi5pZCk7XFxcXG4gICAgbGV0IGVudGlyZVBhdGggPSBwYXRocy5wYXRoLnJlcGxhY2UoQ29uZmlnLm5vdmVsUGF0aCwgQ29uZmlnLm5vdmVsRnVsbFBhdGgpICsgXFxcXFxcXCIudHh0XFxcXFxcXCI7XFxcXG4gICAgbGV0IGVudGlyZVBhdGh0byA9IGJvb2tJbmZvLmlzUmVwbGFjZSA/IGVudGlyZVBhdGggKyBcXFxcXFxcIi50bXBcXFxcXFxcIiA6IGVudGlyZVBhdGg7XFxcXG5cXFxcbiAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgZW50aXJlUGF0aCkpIHtcXFxcbiAgICAgICAgdG9hc3QoXFxcXFxcXCLliJ3lp4vljJbmlofku7ZcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmICghRmlsZS5kZWxldGVGaWxlcyhlbnRpcmVQYXRoKSkge1xcXFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yid5aeL5YyW5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICB0b2FzdChcXFxcXFxcIuWIneWni+WMluaIkOWKn1xcXFxcXFwiKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBpdGVtID0gYnVmaWxlbGlzdFtpXTtcXFxcbiAgICAgICAgbGV0IGNvbnRlbnQgPSByZXF1ZXN0KGl0ZW0ucGF0aCk7XFxcXG4gICAgICAgIEZpbGUuZmlsZVdyaXRlQXBwZW5kKGVudGlyZVBhdGh0bywgaXRlbS5uYW1lICsgXFxcXFxcXCJcXFxcXFxcXG7jgIDjgIBcXFxcXFxcIiArIGNvbnRlbnQucmVwbGFjZSgvXlxcXFxcXFxccyt8XFxcXFxcXFxzKyQvZ20sIFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoLyZuYnNwOy9nLFxcXFxcXFwiXFxcXFxcXCIpLnNwbGl0KC9cXFxcXFxcXG4rLykuam9pbihcXFxcXFxcIlxcXFxcXFxccuOAgOOAgFxcXFxcXFwiKSArIFxcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXFxuXFxcXFxcXCIpO1xcXFxuICAgIH1cXFxcbiAgICBpZiAoYm9va0luZm8uaXNSZXBsYWNlKSB7XFxcXG4gICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBsZW4gPSBydWxlTGlzdC5sZW5ndGg7XFxcXG4gICAgICAgIGxldCByZXBsYWNlUGF0dGVybiA9IFtcXFxcXFxcInJlcGxhY2VcXFxcXFxcIiwgXFxcXFxcXCJyZXBsYWNlQWxsXFxcXFxcXCJdO1xcXFxuICAgICAgICBsZXQgZmxhZyA9IEZpbGUuZmlsZVJ1bGUoZW50aXJlUGF0aHRvLCBlbnRpcmVQYXRoLCAoamF2YVN0cmluZykgPT4ge1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcXFxuICAgICAgICAgICAgICAgIGlmICghYm9va0luZm8uc2VsZWN0ZWQuaW5jbHVkZXMocmVwbGFjZVJ1bGUuaWQpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IHJlcGxhY2VQYXR0ZXJuWzAgKyByZXBsYWNlUnVsZS5pc1JlZ2V4XTtcXFxcbiAgICAgICAgICAgICAgICBqYXZhU3RyaW5nID0gamF2YVN0cmluZ1tyZXBsYWNlXShyZXBsYWNlUnVsZS5wYXR0ZXJuLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZXR1cm4gamF2YVN0cmluZy5nZXRCeXRlcygpO1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgaWYgKCFmbGFnKSB7XFxcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lkIjlubblpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfVxcXFxuICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lkIjlubblrozmiJBcXFxcXFxcIjtcXFxcbn1cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLlkIjlubblsI/or7RcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCLnoa7lrprlkIjlubY/XFxcXFxcXFxu5Lya6KaG55uW5bey5pyJVFhUXFxcXFxcXCIpLmNvbmZpcm0odHh0LCBNWV9QQVJBTVMpLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFtcXFxcXFxcIuKYkOWIhumhtVxcXFxcXFwiLCBcXFxcXFxcIuKYkeWIhumhtVxcXFxcXFwiXVttb2RlMl0sXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKG1vZGUyKSA9PiB7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLm1vZGUyXFxcXFxcXCIsIG1vZGUyID09PSBcXFxcXFxcIjBcXFxcXFxcIiA/IFxcXFxcXFwiMVxcXFxcXFwiIDogXFxcXFxcXCIwXFxcXFxcXCIpO1xcXFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sIG1vZGUyKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBcXFxcXFxcIuWHgOWMllxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvTm92ZWxDdXN0b20udmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiBNWV9QQVJBTVMsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLlpJbpg6jmn6XnnItcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgocGF0aCkgPT4ge1xcXFxuICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBlbnRpcmVQYXRoID0gcGF0aC5yZXBsYWNlKENvbmZpZy5ub3ZlbFBhdGgsIENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiO1xcXFxuICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgZW50aXJlUGF0aCkpIHtcXFxcbiAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi6LCD55So56ys5LiJ5pa55bqU55So5omT5byA5paH5Lu2XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcXFxcXCIgKyBlbnRpcmVQYXRoXFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acrOWcsOaaguaXoOWPr+S+m+WklumDqOaJk+W8gOeahHR4dOaWh+S7tu+8jOivt+WFiOWQiOW5tuWwj+ivtO+8gVxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LCBwYXRoKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCJcXFxcbn0pO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxufSk7XFxcXG5cXFxcbmxldCBtaGxpc3QgPSBGaWxlLmdldEZpbGVQYXRoKHBhdGgsIFxcXFxcXFwiZmlsZVxcXFxcXFwiLCBcXFxcXFxcIi50eHRcXFxcXFxcIik7XFxcXG5taGxpc3Quc29ydCgoYSwgYikgPT4ge1xcXFxuICAgIGEgPSAoYS5uYW1lLm1hdGNoKC9cXFxcXFxcXGQrLykgfHwgW10pWzBdIHx8IDA7XFxcXG4gICAgYiA9IChiLm5hbWUubWF0Y2goL1xcXFxcXFxcZCsvKSB8fCBbXSlbMF0gfHwgMDtcXFxcbiAgICByZXR1cm4gYSAtIGI7XFxcXG59KTtcXFxcbmxldCBjaGFwdGVyTGlzdCA9IFtdO1xcXFxubGV0IGNoYXB0ZXJDb3VudCA9IG1obGlzdC5sZW5ndGg7XFxcXG5cXFxcbmlmIChtb2RlMiA9PT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBsZXQgbWhsaXN0Q2h1bmsgPSBUb29sLmNodW5rKG1obGlzdCwgQ29uZmlnLnZpZXdQYWdlU2l6ZSk7XFxcXG4gICAgbGV0IHZpZXdQYWdlQ291bnQgPSBtaGxpc3RDaHVuay5sZW5ndGg7XFxcXG4gICAgbGV0IGRlZlBhZ2UgPSAodmlld1BhZ2VDb3VudCAtIDEgPCBib29rSW5mby5mb290ID8gMCA6IGJvb2tJbmZvLmZvb3QpIHx8IDA7XFxcXG4gICAgbGV0IHBhZ2VOdW0gPSBOdW1iZXIoZ2V0TXlWYXIoXFxcXFxcXCIucGFnZU51bVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiICsgZGVmUGFnZSkpO1xcXFxuICAgIGNoYXB0ZXJMaXN0ID0gbWhsaXN0Q2h1bmtbcGFnZU51bV0gfHwgW107XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwi56ug6IqCIFxcXFxcXFwiLmJpZygpICsgKFxcXFxcXFwi5pys6aG1OlxcXFxcXFwiICsgY2hhcHRlckxpc3QubGVuZ3RoICsgXFxcXFxcXCIg5YWx5pyJOlxcXFxcXFwiICsgY2hhcHRlckNvdW50ICsgXFxcXFxcXCLnq6Ag5b2T5YmNOlxcXFxcXFwiICsgKHBhZ2VOdW0gKyAxKSArIFxcXFxcXFwiL1xcXFxcXFwiICsgdmlld1BhZ2VDb3VudCkuc21hbGwoKSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIuaXNSZXZlcnNlXFxcXFxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIGlzUmV2ZXJzZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLot7Ppm4ZcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKGNoYXB0ZXJDb3VudCwgXFxcXFxcXCLovpPlhaXot7Povaznq6DoioIgMS1cXFxcXFxcIiArIGNoYXB0ZXJDb3VudCkuaW5wdXQoKGNoYXB0ZXJDb3VudCwgcGFnZU51bSwgdmlld1BhZ2VTaXplLCBwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBOdW1iZXIoaW5wdXQpO1xcXFxuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihpbnB1dE51bSkgfHwgaW5wdXROdW0gPCAwIHx8IGlucHV0TnVtID4gY2hhcHRlckNvdW50KSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fovpPlhaXmraPnoa7ojIPlm7TlhoXnmoTmlbDlrZdcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlucHV0TnVtID0gTWF0aC5mbG9vcigoaW5wdXROdW0gKyB2aWV3UGFnZVNpemUpIC8gdmlld1BhZ2VTaXplKSAtIDE7XFxcXG4gICAgICAgICAgICBpZiAocGFnZU51bSA9PT0gaW5wdXROdW0pIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5q2j5Zyo5b2T5YmN6aG16Z2iXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBpbnB1dE51bSk7XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICB9LCBjaGFwdGVyQ291bnQsIHBhZ2VOdW0sIENvbmZpZy52aWV3UGFnZVNpemUsIHBhdGgpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzVcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi6Lez6aG1XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChwYWdlTnVtICsgMSwgXFxcXFxcXCLot7PovazpobXmlbAgMS1cXFxcXFxcIiArIHZpZXdQYWdlQ291bnQpLmlucHV0KCh2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBOdW1iZXIoaW5wdXQpIC0gMTtcXFxcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXROdW0pIHx8IGlucHV0TnVtIDwgMCB8fCBpbnB1dE51bSA+IHZpZXdQYWdlQ291bnQgLSAxKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/or7fovpPlhaXmraPnoa7ojIPlm7TlhoXnmoTmlbDlrZdcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmIChwYWdlTnVtID09PSBpbnB1dE51bSkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mraPlnKjlvZPliY3pobXpnaJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLnBhZ2VOdW1cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiArIGlucHV0TnVtKTtcXFxcbiAgICAgICAgICAgIGNvbnN0IGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJvb2tJbmZvLmZvb3QgPSBpbnB1dE51bTtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KGJvb2tJbmZvKSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgIH0sIHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzVcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5LiK5LiA6aG1XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChwYWdlTnVtLCBwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgaW5wdXROdW0gPSBwYWdlTnVtIC0gMTtcXFxcbiAgICAgICAgICAgIGlmIChpbnB1dE51bSA8IDApIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3sue7j+aYr+esrOS4gOmhteS6hlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIucGFnZU51bVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiICsgaW5wdXROdW0pO1xcXFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgcGFnZU51bSwgcGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLkuIvkuIDpobVcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IHBhZ2VOdW0gKyAxO1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0TnVtID4gdmlld1BhZ2VDb3VudCAtIDEpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3sue7j+aYr+acgOWQjuS4gOmhteS6hlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIucGFnZU51bVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiICsgaW5wdXROdW0pO1xcXFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgYm9va0luZm8uZm9vdCA9IGlucHV0TnVtO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgdmlld1BhZ2VDb3VudCwgcGFnZU51bSwgcGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLmnKvpobVcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKHZpZXdQYWdlQ291bnQsIHBhZ2VOdW0sIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCBpbnB1dE51bSA9IHZpZXdQYWdlQ291bnQgLSAxO1xcXFxuICAgICAgICAgICAgaWYgKHBhZ2VOdW0gPT09IGlucHV0TnVtIHx8IGlucHV0TnVtID09PSAtMSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey57uP5piv5pyA5ZCO5LiA6aG15LqGXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5wYWdlTnVtXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBpbnB1dE51bSk7XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBib29rSW5mby5mb290ID0gaW5wdXROdW07XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCB2aWV3UGFnZUNvdW50LCBwYWdlTnVtLCBwYXRoKSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgY2hhcHRlckxpc3QgPSBtaGxpc3Q7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArIFxcXFxcXFwi56ug6IqCIFxcXFxcXFwiLmJpZygpICsgKFxcXFxcXFwi5YWx5pyJOlxcXFxcXFwiICsgY2hhcHRlckNvdW50ICsgXFxcXFxcXCLnq6BcXFxcXFxcIikuc21hbGwoKSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlzUmV2ZXJzZSkgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCIuaXNSZXZlcnNlXFxcXFxcXCIsIGlzUmV2ZXJzZSA9PT0gXFxcXFxcXCIwXFxcXFxcXCIgPyBcXFxcXFxcIjFcXFxcXFxcIiA6IFxcXFxcXFwiMFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIGlzUmV2ZXJzZSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5sZXQgYXJyYXkgPSBbXTtcXFxcbmlmIChtb2RlID09PSBcXFxcXFxcIjBcXFxcXFxcIikge1xcXFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY2hhcHRlckxpc3QpIHtcXFxcbiAgICAgICAgbGV0IG5hbWUgPSBnZXRUaXRsZShpdGVtLm5hbWUpO1xcXFxuICAgICAgICBhcnJheS5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9Ob3ZlbE1haW5Cb2R5I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcXFxcbiAgICAgICAgICAgICAgICBkaXJQYXRoOiBwYXRoLFxcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBDb25maWcuZGVmX1ZpZXdfU3R5bGVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufSBlbHNlIHtcXFxcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXB0ZXJMaXN0KSB7XFxcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0VGl0bGUoaXRlbS5uYW1lKTtcXFxcbiAgICAgICAgYXJyYXkucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXFxcbiAgICAgICAgICAgIHVybDogJChcXFxcXFxcIuehruiupOWIoOmZpFtcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIl3vvJ9cXFxcXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liKDpmaTmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0sIGl0ZW0ucGF0aCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogQ29uZmlnLmRlZl9WaWV3X1N0eWxlXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn1cXFxcbmlmIChpc1JldmVyc2UgPT09IFxcXFxcXFwiMVxcXFxcXFwiKSB7XFxcXG4gICAgYXJyYXkucmV2ZXJzZSgpO1xcXFxufVxcXFxubGF5b3V0LnB1c2guYXBwbHkobGF5b3V0LCBhcnJheSk7XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7lsI/or7TmraPmlofpmIXor7tcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTm92ZWxNYWluQm9keVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnZhciBsYXlvdXQgPSBbXTtcXFxcbmxldCBjb250ZW50ID0gcmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIE1ZX1BBUkFNUy5wYXRoKTtcXFxcbi8vY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXFxcXFxcXFxufFxcXFxcXFxcci9nLCBcXFxcXFxcIjxicj5cXFxcXFxcIikucmVwbGFjZSgvKCZuYnNwOykrL2csXFxcXFxcXCIgXFxcXFxcXCIpO1xcXFxuY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXFxcbiAgICBzZWxlY3RlZDogW10sXFxcXG4gICAgaXNSZXBsYWNlOiB0cnVlXFxcXG59LCBKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBNWV9QQVJBTVMuZGlyUGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG5cXFxcbmlmIChib29rSW5mby5pc1JlcGxhY2UpIHtcXFxcbiAgICBsZXQgamF2YVN0cmluZyA9IGphdmEubGFuZy5TdHJpbmcoY29udGVudCk7XFxcXG4gICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICBsZXQgcmVwbGFjZVBhdHRlcm4gPSBbXFxcXFxcXCJyZXBsYWNlXFxcXFxcXCIsIFxcXFxcXFwicmVwbGFjZUFsbFxcXFxcXFwiXTtcXFxcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcnVsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXFxcbiAgICAgICAgbGV0IHJlcGxhY2VSdWxlID0gcnVsZUxpc3RbaV07XFxcXG4gICAgICAgIGlmICghYm9va0luZm8uc2VsZWN0ZWQuaW5jbHVkZXMocmVwbGFjZVJ1bGUuaWQpKSB7XFxcXG4gICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcmVwbGFjZSA9IHJlcGxhY2VQYXR0ZXJuWzAgKyByZXBsYWNlUnVsZS5pc1JlZ2V4XTtcXFxcbiAgICAgICAgamF2YVN0cmluZyA9IGphdmFTdHJpbmdbcmVwbGFjZV0ocmVwbGFjZVJ1bGUucGF0dGVybiwgcmVwbGFjZVJ1bGUucmVwbGFjZW1lbnQpO1xcXFxuICAgIH1cXFxcbiAgICBjb250ZW50ID0gU3RyaW5nKGphdmFTdHJpbmcpO1xcXFxufVxcXFxuY29udGVudCA9IFxcXFxcXFwi44CA44CAXFxcXFxcXCIgKyBjb250ZW50LnJlcGxhY2UoL15cXFxcXFxcXHMrfFxcXFxcXFxccyskL2dtLCBcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdCgvXFxcXFxcXFxuKy8pLmpvaW4oXFxcXFxcXCI8YnI+44CA44CAXFxcXFxcXCIpO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG4gICAgdGl0bGU6IChcXFxcXFxcIjxzdHJvbmc+XFxcXFxcXCIgKyBNWV9QQVJBTVMudGl0bGUgKyBcXFxcXFxcIjwvc3Ryb25nPlxcXFxcXFwiKS5iaWcoKSxcXFxcbn0pO1xcXFxuXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IGNvbnRlbnQsXFxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRleHRTaXplOiAxOCxcXFxcbiAgICAgICAgY2xpY2s6IHRydWVcXFxcbiAgICB9XFxcXG59KTtcXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJ0ZXh0XzFcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu5ZCI5bm2VFhUXFxcIixcXFwicGF0aFxcXCI6XFxcIk5vdmVsQ29sbGVjdGVkLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG5jb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG5sZXQgcnVsZWxEaXIgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZy5ub3ZlbEZ1bGxQYXRoLCBcXFxcXFxcImRpclxcXFxcXFwiKTtcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuWQiOW5tlRYVFxcXFxcXFwiKTtcXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcblxcXFxuZnVuY3Rpb24gb3BlcmF0aW9uKHBhdGgpIHtcXFxcbiAgICBzd2l0Y2ggKGlucHV0KSB7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLliIbkuqtcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInNoYXJlOi8vXFxcXFxcXCIgKyBwYXRoO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLliKDpmaRcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLmtbfpmJTpooTop4hcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS90eHRQYXJzZXIudmlld1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgIGNhc2UgXFxcXFxcXCLmiZPlvIDmlrnlvI9cXFxcXFxcIjpcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcIm9wZW5GaWxlOi8vZmlsZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgIH1cXFxcbn1cXFxcbmZvciAobGV0IHJ1bGVQYXRocyBvZiBydWxlbERpcikge1xcXFxuICAgIGxldCBub3ZlbHMgPSBGaWxlLmdldEZpbGVQYXRoKHJ1bGVQYXRocy5wYXRoLCBcXFxcXFxcImZpbGVcXFxcXFxcIiwgXFxcXFxcXCIudHh0XFxcXFxcXCIpO1xcXFxuICAgIGZvciAobGV0IG5vdmVsIG9mIG5vdmVscykge1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbm92ZWwubmFtZSxcXFxcbiAgICAgICAgICAgIHVybDogJChbXFxcXFxcXCLliIbkuqtcXFxcXFxcIiwgXFxcXFxcXCLliKDpmaRcXFxcXFxcIiwgXFxcXFxcXCLmtbfpmJTpooTop4hcXFxcXFxcIiwgXFxcXFxcXCLmiZPlvIDmlrnlvI9cXFxcXFxcIl0sIDEpLnNlbGVjdChvcGVyYXRpb24sIG5vdmVsLnBhdGgpLFxcXFxuICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLmnaXmupDvvJpcXFxcXFxcIiArIHJ1bGVQYXRocy5uYW1lLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHBhdGg6IG5vdmVsLnBhdGhcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuaWYgKGxheW91dC5sZW5ndGggPT09IDApIHtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXFxcXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXFxcXFwiPuWVpemDveayoeacieiAtjwvaDE+JyxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbn1cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuabtOWkmuiuvue9rlxcXCIsXFxcInBhdGhcXFwiOlxcXCJTZXR0aW5nL01vcmUudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbmNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcblxcXFxuY29uc3Qgc2V0dGluZ1R5cGUgPSBNWV9QQVJBTVMuc2V0dGluZ1R5cGUgfHwgZ2V0UGFyYW0oXFxcXFxcXCJzZXR0aW5nVHlwZVxcXFxcXFwiKTtcXFxcblxcXFxubGV0IGxheW91dCA9IFtdO1xcXFxubGV0IGlkID0gXFxcXFxcXCIjXFxcXFxcXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcXFxcbnN3aXRjaCAoc2V0dGluZ1R5cGUpIHtcXFxcbiAgICBjYXNlIFxcXFxcXFwiY2FjaGVcXFxcXFxcIjpcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi5riF6Zmk57yT5a2YfOiuvue9rlxcXFxcXFwiKTtcXFxcbiAgICAgICAgY29uc3Qga25vd25MaXN0ID0gbmV3IE1hcChbXFxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbFBhdGgpLCBcXFxcXFxcIiPnrqHnkIblmagj5bCP6K+057yT5a2Y55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5jb21pY1BhdGgpLCBcXFxcXFxcIiPnrqHnkIblmagj5ryr55S757yT5a2Y55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5leHRlcm5hbEltcG9ydFBhdGgpLCBcXFxcXFxcIiPnrqHnkIblmagj5a+85YWl55qEVFhU55uu5b2VW+S4jeW7uuiurua4hemZpF1cXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICBbRmlsZS5nZXROYW1lKENvbmZpZy5ub3ZlbEZ1bGxQYXRoKSwgXFxcXFxcXCIj566h55CG5ZmoI+Wwj+ivtOWQiOW5tuebruW9lVvlj6/ku6XmuIXpmaRdXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgW1xcXFxcXFwiZHLnq6DoioLnvJPlrZhcXFxcXFxcIiwgXFxcXFxcXCLpgZPplb/mqKHmnb/kuLTml7bnvJPlrZhb5bu66K6u5riF6ZmkXVxcXFxcXFwiXVxcXFxuICAgICAgICBdKTtcXFxcblxcXFxuICAgICAgICBsZXQgY2FjaGVEaXIgPSBGaWxlLmdldEZpbGVQYXRoKENvbmZpZy5ob21lUGF0aCwgXFxcXFxcXCJkaXJcXFxcXFxcIik7XFxcXG5cXFxcbiAgICAgICAgZnVuY3Rpb24gY2xlYW5DYWNoZShwYXRoKSB7XFxcXG4gICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAoRmlsZS5kZWxldGVGaWxlcyhwYXRoKSkge1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+a4hemZpOWujOaIkFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+a4hemZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGZvciAobGV0IGNhY2hlIG9mIGNhY2hlRGlyKSB7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGNhY2hlLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLlpKflsI/vvJpcXFxcXFxcIiArIEZpbGUuZ2V0RmlsZVNpemUoY2FjaGUucGF0aCkgKyBcXFxcXFxcIlxcXFxcXFxcbuaPj+i/sO+8mlxcXFxcXFwiICsgKGtub3duTGlzdC5nZXQoY2FjaGUubmFtZSkgfHwgXFxcXFxcXCLmnKrnn6Xnm67lvZVb6aOO6Zmp5pyq55+lXVxcXFxcXFwiKSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTmuIXpmaQgXFxcXFxcXCIgKyBjYWNoZS5uYW1lICsgXFxcXFxcXCIgP1xcXFxcXFwiKS5jb25maXJtKGNsZWFuQ2FjaGUsIGNhY2hlLnBhdGgpXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuWFqOmDqOa4hemZpChcXFxcXFxcIiArIEZpbGUuZ2V0RmlsZVNpemUoQ29uZmlnLmhvbWVQYXRoKSArIFxcXFxcXFwiKVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwi56Gu6K6k5riF6Zmk5YWo6YOo57yT5a2Y5pWw5o2uP1xcXFxcXFwiKS5jb25maXJtKGNsZWFuQ2FjaGUsIENvbmZpZy5ob21lUGF0aClcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgXFxcXFxcXCJkZWZhdWx0UGljXFxcXFxcXCI6XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIum7mOiupOWwgemdonzorr7nva5cXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChnZXRNeVZhcihcXFxcXFxcIjpkZWZhdWx0UGljQmFja1xcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgY2xlYXJNeVZhcihcXFxcXFxcIjpkZWZhdWx0UGljQmFja1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgZnVuY3Rpb24gc2V0RGVmYXVsdFBpYyh1cmwpIHtcXFxcbiAgICAgICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgMCkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgIENvbmZpZy5kZWZfUGljID0gdXJsO1xcXFxuICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXFxcbiAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHN0YXJ0ID0gMTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZihNWV9OQU1FKSAhPT0gXFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcIiAmJiBNWV9OQU1FID09PSBcXFxcXFxcIuWXheiniea1j+iniOWZqFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBzdGFydCA9IDQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IDQ7IGkrKykge1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuWbvueJh1xcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJtb3ZpZV8zXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcXFxcXCJoaWtlcjovL2ltYWdlcy9ob21lX3BpY1xcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShzZXREZWZhdWx0UGljLCBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2hvbWVfcGljXFxcXFxcXCIgKyBpKVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6Ieq5a6a5LmJ4p6VXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogJChbXFxcXFxcXCLoh6rlrprkuYl1cmxcXFxcXFxcIiwgXFxcXFxcXCLpgInmi6nmlofku7bot6/lvoRcXFxcXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiHquWumuS5iXVybFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi6L6T5YWl5Zu+54mH55qE6Lev5b6E5oiW6ICF6ZO+5o6lXFxcXFxcXCIpLmlucHV0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBDb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgMCkgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5kZWZfUGljID0gaW5wdXQ7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KENvbmZpZyksIDApO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVVcmwgPSBcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVTZWxlY3QgPSByZXF1aXJlKHJlcXVpcmVVcmwpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVNlbGVjdC5maWxlU2VsZWN0aW9uVXJpKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgQ29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcImNvbmZpZy5qc29uXFxcXFxcXCIsIDApIHx8IFxcXFxcXFwie31cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLmRlZl9QaWMgPSBcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIFBBVEg7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShDb25maWcpLCAwKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIjpkZWZhdWx0UGljQmFja1xcXFxcXFwiLCBcXFxcXFxcInRydWVcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVVcmw6IHJlcXVpcmVVcmwsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZTogXFxcXFxcXCIuanBnfC5qcGVnfC5naWZ8LnBuZ3wuc3ZnfC5ibXBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tUeXBlOiBcXFxcXFxcImNvbmZpcm1cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeTogXFxcXFxcXCJzZWxlY3RQYXRoQ2FjaGUyXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgXFxcXFxcXCJyZXBsYWNlUnVsZVxcXFxcXFwiOlxcXFxuICAgICAgICBpZiAoTVlfUEFSQU1TLmlzUmVmcmVzaCkge1xcXFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICQudG9TdHJpbmcoKCkgPT4gcmVmcmVzaFBhZ2UoKSkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFxcXFxcIuabv+aNouinhOWImXzorr7nva5cXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuaWsOW7uuabv+aNolxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9lZGl0UmVwbGFjZVJ1bGUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9pc05ldz10cnVlXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85Ye66KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCLnoa7orqTlr7zlh7pcXFxcXFxcIiArIHJ1bGVMaXN0Lmxlbmd0aCArIFxcXFxcXFwi5p2h6KeE5YiZ77yfXFxcXFxcXFxuKHtob21lUHRhaH0vcmVwbGFjZVJ1bGUuanNvbilcXFxcXFxcIikuY29uZmlybSgobnVtKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIGxldCBzYXZlUHRhID0gQ29uZmlnLmhvbWVQYXRoICsgXFxcXFxcXCIvcmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShzYXZlUHRhLCByZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsb2coXFxcXFxcXCJcXFxcXFxcXG7ot6/lvoTvvJpcXFxcXFxcIiArIHNhdmVQdGEgKyBcXFxcXFxcIlxcXFxcXFxcbuWvvOWHuuinhOWImSBcXFxcXFxcIiArIG51bSArIFxcXFxcXFwiIOadoVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJzaGFyZTovL1xcXFxcXFwiICsgc2F2ZVB0YTtcXFxcbiAgICAgICAgICAgIH0sIHJ1bGVMaXN0Lmxlbmd0aCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgICAgICBmdW5jdGlvbiBpbXBvcnRSdWxlKGlzYmFjaykge1xcXFxuICAgICAgICAgICAgaW5wdXQgPSB0eXBlb2YgUEFUSCA9PT0gXFxcXFxcXCJ1bmRlZmluZWRcXFxcXFxcIiA/IGlucHV0IDogUEFUSDtcXFxcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3RhcnRzV2l0aChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIikgPyBpbnB1dCA6IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgaW5wdXRcXFxcbiAgICAgICAgICAgIGxldCBydWxlVGV4dCA9IHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICAgICAgaWYgKCFydWxlVGV4dCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/ojrflj5bmlofku7bkuLrnqbpcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IG5ld1J1bGVMaXN0ID0gSlNPTi5wYXJzZShydWxlVGV4dCk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q291bnQgPSAwLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3VudCA9IDA7XFxcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBuZXdSdWxlTGlzdCkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UnVsZSA9IG5ld1J1bGVMaXN0W2ldO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJyZXBsYWNlbWVudFxcXFxcXFwiKSB8fCAhbmV3UnVsZS5oYXNPd25Qcm9wZXJ0eShcXFxcXFxcInBhdHRlcm5cXFxcXFxcIikgfHwgIW5ld1J1bGUuaGFzT3duUHJvcGVydHkoXFxcXFxcXCJuYW1lXFxcXFxcXCIpIHx8IChuZXdSdWxlLnNjb3BlQ29udGVudCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAhbmV3UnVsZS5zY29wZUNvbnRlbnQpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBuZXdSdWxlLmlkO1xcXFxuICAgICAgICAgICAgICAgICAgICBuZXdSdWxlLmlkID0gaWQgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpZEluZGV4ID0gcnVsZUxpc3QuZmluZEluZGV4KHJ1bGUgPT4gcnVsZS5pZCA9PT0gaWQpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRJbmRleCA+IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3VudCsrO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3Quc3BsaWNlKGlkSW5kZXgsIDEsIG5ld1J1bGUpO1xcXFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQrKztcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVMaXN0LnB1c2gobmV3UnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGlzYmFjaykge1xcXFxuICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgbG9nKFxcXFxcXFwiXFxcXFxcXFxu6Lev5b6E77yaXFxcXFxcXCIgKyBpbnB1dCArIFxcXFxcXFwiXFxcXFxcXFxu5oC76KeE5YiZ5pWw77yaXFxcXFxcXCIgKyBuZXdSdWxlTGlzdC5sZW5ndGggKyBcXFxcXFxcIlxcXFxcXFxcbuabtOaWsOinhOWImSBcXFxcXFxcIiArIHVwZGF0ZUNvdW50ICsgXFxcXFxcXCIg5p2hXFxcXFxcXFx05paw5aKe6KeE5YiZIFxcXFxcXFwiICsgbmV3Q291bnQgKyBcXFxcXFxcIiDmnaFcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLlr7zlhaXmiJDlip9cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGlzYmFjaykgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi5a+85YWl5aSx6LSlXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuWvvOWFpeinhOWImVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiAkKFtcXFxcXFxcIuWklumDqOaWh+S7tlxcXFxcXFwiLCBcXFxcXFxcIuWGhemDqOaWh+S7tlxcXFxcXFwiXSwgMSwgXFxcXFxcXCLop4TliJnlr7zlhaVcXFxcXFxcIikuc2VsZWN0KChpbXBvcnRSdWxlKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIuWklumDqOaWh+S7tlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImZpbGVTZWxlY3Q6Ly9cXFxcXFxcIiArICQudG9TdHJpbmcoaW1wb3J0UnVsZSk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVVcmwgPSBcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVTZWxlY3QgPSByZXF1aXJlKHJlcXVpcmVVcmwpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVNlbGVjdC5maWxlU2VsZWN0aW9uVXJpKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKGltcG9ydFJ1bGUsIHRydWUpLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZVVybDogcmVxdWlyZVVybCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlOiBcXFxcXFxcIi5qc29uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrVHlwZTogXFxcXFxcXCJjb25maXJtXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnk6IFxcXFxcXFwic2VsZWN0UGF0aENhY2hlXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSwgaW1wb3J0UnVsZSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzNcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcnVsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXFxcbiAgICAgICAgICAgIGxldCByZXBsYWNlUnVsZSA9IHJ1bGVMaXN0W2ldO1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiByZXBsYWNlUnVsZS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXFxcXFwiLlxcXFxcXFwiICsgaSxcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGlkLCBpbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiKSB8fCBcXFxcXFxcIltdXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgZyA9IHJ1bGVMaXN0LnNwbGljZShpbmRleCwgMSk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIsIEpTT04uc3RyaW5naWZ5KHJ1bGVMaXN0KSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIC8vZGVsZXRlSXRlbUJ5Q2xzKGlkICsgXFxcXFxcXCIuXFxcXFxcXCIgKyBpbmRleCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLliKDpmaTmiJDlip9cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9LCBpZCwgaSksXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXFxcXFwiLlxcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIue8lui+kVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvZWRpdFJlcGxhY2VSdWxlLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCM/aW5kZXg9XFxcXFxcXCIgKyBpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFxcXFxcIi5cXFxcXFxcIiArIGlcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsaW5lX2JsYW5rXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBpZCArIFxcXFxcXFwiLlxcXFxcXFwiICsgaVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGJyZWFrO1xcXFxuICAgIGNhc2UgXFxcXFxcXCJjb250ZW50c1xcXFxcXFwiOlxcXFxuICAgICAgICBsZXQgZiA9IHJlcXVpcmUoXFxcXFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcXFxcXCIpO1xcXFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcXFxcXCLnm67lvZXorr7nva586K6+572uXFxcXFxcXCIpO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLpgInmi6nmlofku7blpLlcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXFxcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoaWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKGlkKS5leHRyYTtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbShpZCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgICAgICAgICAgICAgfSwgaWQpLFxcXFxuICAgICAgICAgICAgICAgIGluaXRpYWxQYXRoOiBDb25maWcuaG9tZVBhdGgsXFxcXG4gICAgICAgICAgICAgICAgcmVxdWlyZVVybDogXFxcXFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MDk5XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgcGF0dGVybjogMVxcXFxuICAgICAgICAgICAgfSkpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwi5pSv5oyBaGlrZXI6Ly9maWxlc+i3r+W+hCjor6Xmk43kvZzkuI3kvJrliJ3lp4vljJbnm67lvZUpXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogQ29uZmlnLmhvbWVQYXRoLFxcXFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKChpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihpZCwgaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgIH0sIGlkKSxcXFxcbiAgICAgICAgICAgICAgICBpZDogaWRcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi56Gu6K6kXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBnZXRNeVZhcihpZCwgZmluZEl0ZW0oaWQpLmV4dHJhLmRlZmF1bHRWYWx1ZSB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcXFxcXCJoaWtlcjovL2ZpbGVzL1xcXFxcXFwiKSkgaW5wdXQgPSBnZXRQYXRoKGlucHV0KS5zbGljZSg3KTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZW5kc1dpdGgoXFxcXFxcXCIvXFxcXFxcXCIpKSBpbnB1dD1pbnB1dC5yZXBsYWNlKC9cXFxcXFxcXC8kLyxcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLmhvbWVQYXRoID09IGlucHV0KSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3sue7j+aYr+W9k+WJjeebruW9lVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIENvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJjb25maWcuanNvblxcXFxcXFwiLCAwKSB8fCBcXFxcXFxcInt9XFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgIENvbmZpZy5ob21lUGF0aCA9IGlucHV0O1xcXFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKFxcXFxcXFwiY29uZmlnLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwgMCk7XFxcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5L+d5a2YXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9LCBpZCksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCIsXFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgIGJyZWFrO1xcXFxufVxcXFxuc2V0UmVzdWx0KGxheW91dCk7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3Yu57yW6L6R5pu/5o2i6KeE5YiZXFxcIixcXFwicGF0aFxcXCI6XFxcImVkaXRSZXBsYWNlUnVsZS52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuY29uc3QgaXNOZXcgPSBNWV9QQVJBTVMuaXNOZXcgfHwgZ2V0UGFyYW0oXFxcXFxcXCJpc05ld1xcXFxcXFwiKTtcXFxcbmNvbnN0IGluZGV4ID0gTVlfUEFSQU1TLmluZGV4IHx8IE51bWJlcihnZXRQYXJhbShcXFxcXFxcImluZGV4XFxcXFxcXCIpKTtcXFxcbmxldCBsYXlvdXQgPSBbXTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5uYW1lXFxcXFxcXCIpO1xcXFxuICAgIGNsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmlzUmVnZXhcXFxcXFxcIik7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUucGF0dGVyblxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXFxcXFwiKTtcXFxcbiAgICBjbGVhck15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5maXJzdFxcXFxcXFwiKTtcXFxcbiAgICAvL2NsZWFyTXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnNjb3BlXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbmxldCBpZCA9IFxcXFxcXFwiI1xcXFxcXFwiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxcXG4vL2xldCByZXBsYWNlUnVsZSA9IGlzTmV3ID09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiP3t9OnJ1bGVMaXN0W2luZGV4XTtcXFxcbmlmIChpc05ldyA9PSBcXFxcXFxcInRydWVcXFxcXFxcIikge1xcXFxuICAgIHJlcGxhY2VSdWxlID0ge1xcXFxuICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksXFxcXG4gICAgICAgIGlzUmVnZXg6IGZhbHNlLFxcXFxuICAgIH1cXFxcbn0gZWxzZSB7XFxcXG4gICAgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpbmRleF07XFxcXG59XFxcXG4vL+mmluasoeWIneWni+WMllxcXFxuaWYoZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLmZpcnN0XFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIik9PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxuICAgIHB1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyByZXBsYWNlUnVsZS5pc1JlZ2V4KTtcXFxcbiAgICBwdXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuZmlyc3RcXFxcXFxcIixcXFxcXFxcIjFcXFxcXFxcIik7XFxcXG59XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5ou36LSdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICBsZXQgYXR0ID0gW1xcXFxcXFwibmFtZVxcXFxcXFwiLCBcXFxcXFxcImlzUmVnZXhcXFxcXFxcIiwgXFxcXFxcXCJwYXR0ZXJuXFxcXFxcXCIsIFxcXFxcXFwicmVwbGFjZW1lbnRcXFxcXFxcIl07XFxcXG4gICAgICAgIGxldCBqc29uID0ge307XFxcXG4gICAgICAgIGF0dC5mb3JFYWNoKGtleSA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuXFxcXFxcXCIgKyBrZXksIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKGtleSA9PT0gXFxcXFxcXCJpc1JlZ2V4XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBcXFxcXFxcInRydWVcXFxcXFxcIiA/IHRydWUgOiBmYWxzZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGpzb25ba2V5XSA9IHZhbHVlO1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgY29weShKU09OLnN0cmluZ2lmeShqc29uKSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi57KY6LS0XFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwie3tjbGlwYm9hcmR9fVxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaW5wdXQpO1xcXFxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikgfHwganNvbi5wYXR0ZXJuID09IHVuZGVmaW5lZCkgcmV0dXJuO1xcXFxuICAgICAgICAgICAgbGV0IGF0dCA9IFtcXFxcXFxcIm5hbWVcXFxcXFxcIiwgXFxcXFxcXCJpc1JlZ2V4XFxcXFxcXCIsIFxcXFxcXFwicGF0dGVyblxcXFxcXFwiLCBcXFxcXFxcInJlcGxhY2VtZW50XFxcXFxcXCJdO1xcXFxuICAgICAgICAgICAgYXR0LmZvckVhY2goa2V5ID0+IHtcXFxcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuXFxcXFxcXCIgKyBrZXksIFN0cmluZyhqc29uW2tleV0pKTtcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5pu/5o2i6KeE5YiZ5ZCN56ewXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXFxcXFwiLCByZXBsYWNlUnVsZS5uYW1lKSxcXFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUubmFtZVxcXFxcXFwiLGlucHV0KTsnXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5pu/5o2i6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcXFxcXCIsIHJlcGxhY2VSdWxlLnBhdHRlcm4pLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcXFxcXCIsIGlucHV0KTsnXFxcXG4gICAgfVxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5piv5ZCm5L2/55So5q2j5YiZ6KGo6L6+5byP77yaXFxcXFxcXCIgKyBnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXFxcXFwiKSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoaWQpID0+IHtcXFxcbiAgICAgICAgbGV0IGlzUmVnZXggPSBnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXFxcXFwiKSA9PT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCIgPyBmYWxzZSA6IHRydWU7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDogaWRcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLmmK/lkKbkvb/nlKjmraPliJnooajovr7lvI/vvJpcXFxcXFxcIiArIGlzUmVnZXhcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHB1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5pc1JlZ2V4XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIgKyBpc1JlZ2V4KTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgIH0sIGlkKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogaWRcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi5pu/5o2i5Li6XFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXFxcbiAgICAgICAgdHlwZTogXFxcXFxcXCJ0ZXh0YXJlYVxcXFxcXFwiLFxcXFxuICAgICAgICBoZWlnaHQ6IC0xLFxcXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXFxcXFwiLCByZXBsYWNlUnVsZS5yZXBsYWNlbWVudCksXFxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLnJlcGxhY2VtZW50XFxcXFxcXCIsaW5wdXQpOydcXFxcbiAgICB9XFxcXG59KTtcXFxcbmxheW91dC5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLkv53lrZhcXFxcXFxcIixcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgocmVwbGFjZVJ1bGUsIGlzTmV3LCBpbmRleCkgPT4ge1xcXFxuICAgICAgICBsZXQgcGF0dGVybiA9IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5wYXR0ZXJuXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5pu/5o2i6KeE5YiZ5LiN6IO95Li656m6XFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBsYWNlUnVsZSwge1xcXFxuICAgICAgICAgICAgbmFtZTogZ2V0TXlWYXIoXFxcXFxcXCIuZWRpdFJlcGxhY2VSdWxlLm5hbWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBpc1JlZ2V4OiBnZXRNeVZhcihcXFxcXFxcIi5lZGl0UmVwbGFjZVJ1bGUuaXNSZWdleFxcXFxcXFwiKSA9PT0gXFxcXFxcXCJ0cnVlXFxcXFxcXCIgPyB0cnVlIDogZmFsc2UsXFxcXG4gICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLFxcXFxuICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IGdldE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5yZXBsYWNlbWVudFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKVxcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZShcXFxcXFxcInJlcGxhY2VSdWxlLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJbXVxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKGlzTmV3ID09IFxcXFxcXFwidHJ1ZVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBydWxlTGlzdC5wdXNoKHJlcGxhY2VSdWxlKTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJ1bGVMaXN0LnNwbGljZShpbmRleCwgMSwgcmVwbGFjZVJ1bGUpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHNhdmVGaWxlKFxcXFxcXFwicmVwbGFjZVJ1bGUuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShydWxlTGlzdCkpO1xcXFxuICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgfSwgcmVwbGFjZVJ1bGUsIGlzTmV3LCBpbmRleCksXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxufSk7XFxcXG5cXFxcbi8qXFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICBkZXNjOiBcXFxcXFxcIuabv+aNouiMg+WbtFxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxcXG4gICAgICAgIHR5cGU6IFxcXFxcXFwidGV4dGFyZWFcXFxcXFxcIixcXFxcbiAgICAgICAgaGVpZ2h0OiAtMSxcXFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dE15VmFyKFxcXFxcXFwiLmVkaXRSZXBsYWNlUnVsZS5zY29wZVxcXFxcXFwiLGlucHV0KTsnXFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbiovXFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi7lsI/or7TkuKrmgKfljJblh4DljJZcXFwiLFxcXCJwYXRoXFxcIjpcXFwiTm92ZWxDdXN0b20udmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnNldFBhZ2VUaXRsZShcXFxcXFxcIuabv+aNouinhOWImXxcXFxcXFxcIiArIE1ZX1BBUkFNUy5uYW1lKTtcXFxcbmxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVhZEZpbGUoXFxcXFxcXCJyZXBsYWNlUnVsZS5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwiW11cXFxcXFxcIik7XFxcXG5sZXQgaWQgPSBcXFxcXFxcIiNcXFxcXFxcIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcXFxuXFxcXG5jb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgIGZvb3Q6IDAsXFxcXG4gICAgaXNSZXBsYWNlOiB0cnVlLFxcXFxuICAgIHNlbGVjdGVkOiBbXVxcXFxufSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgTVlfUEFSQU1TLnBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIikpO1xcXFxuXFxcXG5sZXQgbGF5b3V0ID0gW107XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFtcXFxcXFxcIuKYkOWHgOWMllxcXFxcXFwiLCBcXFxcXFxcIuKYkeWHgOWMllxcXFxcXFwiXVswICsgYm9va0luZm8uaXNSZXBsYWNlXSxcXFxcbiAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoJGlkLCBwYXRoKSA9PiB7XFxcXG5cXFxcbiAgICAgICAgdmFyIGJvb2tJbmZvID0gSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IGlzUmVwbGFjZSA9IGJvb2tJbmZvLmlzUmVwbGFjZT09PXVuZGVmaW5lZD90cnVlOmJvb2tJbmZvLmlzUmVwbGFjZTtcXFxcbiAgICAgICAgYm9va0luZm8uaXNSZXBsYWNlID0gIWlzUmVwbGFjZTtcXFxcbiAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXFxcbiAgICAgICAgdXBkYXRlSXRlbSgkaWQsIHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBpc1JlcGxhY2UgPyBcXFxcXFxcIuKYkOWHgOWMllxcXFxcXFwiIDogXFxcXFxcXCLimJHlh4DljJZcXFxcXFxcIixcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICB9LCBpZCArIFxcXFxcXFwiIy0xXFxcXFxcXCIsIE1ZX1BBUkFNUy5wYXRoKSxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogaWQgKyBcXFxcXFxcIiMtMVxcXFxcXFwiXFxcXG4gICAgfSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxufSk7XFxcXG5sYXlvdXQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi57yW6L6R6KeE5YiZXFxcXFxcXCIsXFxcXG4gICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9TZXR0aW5nL01vcmUudmlldyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoIz9zZXR0aW5nVHlwZT1yZXBsYWNlUnVsZVxcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgIGV4dHJhOntcXFxcbiAgICAgICAgaXNSZWZyZXNoOiB0cnVlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5mb3IgKGxldCBpID0gMCwgbGVuID0gcnVsZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcXFxcbiAgICBsZXQgcmVwbGFjZVJ1bGUgPSBydWxlTGlzdFtpXTtcXFxcbiAgICBsZXQgaXNUcnVlID0gYm9va0luZm8uc2VsZWN0ZWQuaW5jbHVkZXMocmVwbGFjZVJ1bGUuaWQpO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IChpc1RydWUgPyBcXFxcXFxcIuKXj1xcXFxcXFwiIDogXFxcXFxcXCLil4tcXFxcXFxcIikgKyByZXBsYWNlUnVsZS5uYW1lLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIixcXFxcbiAgICAgICAgeTogMCxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlzVHJ1ZTogaXNUcnVlLFxcXFxuICAgICAgICAgICAgaWQ6IGlkICsgaSxcXFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlvIDlkK9cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCRpZCwgcmVwbGFjZVJ1bGUsIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChmaW5kSXRlbSgkaWQpLmV4dHJhLmlzVHJ1ZSkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5byA5ZCvXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBjb25zdCBib29rSW5mbyA9IE9iamVjdC5hc3NpZ24oe1xcXFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBbXVxcXFxuICAgICAgICAgICAgfSwgSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIikgfHwgXFxcXFxcXCJ7fVxcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICBib29rSW5mby5zZWxlY3RlZC5wdXNoKHJlcGxhY2VSdWxlLmlkKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oJGlkLCB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4pePXFxcXFxcXCIgKyByZXBsYWNlUnVsZS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlzVHJ1ZTogdHJ1ZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICRpZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyBwYXRoICsgXFxcXFxcXCIvYm9va0luZm8uanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeShib29rSW5mbykpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiO1xcXFxuICAgICAgICB9LCBpZCArIGksIHJlcGxhY2VSdWxlLCBNWV9QQVJBTVMucGF0aCksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogXFxcXFxcXCLlhbPpl61cXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKCRpZCwgcmVwbGFjZVJ1bGUsIHBhdGgpID0+IHtcXFxcbiAgICAgICAgICAgIGlmICghZmluZEl0ZW0oJGlkKS5leHRyYS5pc1RydWUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suWFs+mXrVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgY29uc3QgYm9va0luZm8gPSBPYmplY3QuYXNzaWduKHtcXFxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogW11cXFxcbiAgICAgICAgICAgIH0sIEpTT04ucGFyc2UocmVxdWVzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGggKyBcXFxcXFxcIi9ib29rSW5mby5qc29uXFxcXFxcXCIpIHx8IFxcXFxcXFwie31cXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgYm9va0luZm8uc2VsZWN0ZWQuc3BsaWNlKGJvb2tJbmZvLnNlbGVjdGVkLmluZGV4T2YocmVwbGFjZVJ1bGUuaWQpLCAxKTtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oJGlkLCB7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4peLXFxcXFxcXCIgKyByZXBsYWNlUnVsZS5uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlzVHJ1ZTogZmFsc2UsXFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiAkaWQsXFxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiL2Jvb2tJbmZvLmpzb25cXFxcXFxcIiwgSlNPTi5zdHJpbmdpZnkoYm9va0luZm8pKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgfSwgaWQgKyBpLCByZXBsYWNlUnVsZSwgTVlfUEFSQU1TLnBhdGgpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcbnNldFJlc3VsdChsYXlvdXQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIiN2LuWkluWvvFRYVFxcXCIsXFxcInBhdGhcXFwiOlxcXCJleHRlcm5hbGltcG9ydFR4dC52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuZnVuY3Rpb24gdHh0VmlldyhsYXlvdXQpIHtcXFxcbiAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgY29uc3QgQ29uZmlnID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0NvbmZpZy5qc29uXFxcXFxcXCIpO1xcXFxuICAgIGxldCBmaWxlcyA9IEZpbGUuZ2V0RmlsZVBhdGgoQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCwgdW5kZWZpbmVkLCBcXFxcXFxcIi50eHRcXFxcXFxcIik7XFxcXG4gICAgc2V0UGFnZVRpdGxlKFxcXFxcXFwi5aSW5a+8VFhUXFxcXFxcXCIpO1xcXFxuICAgIC8vbGV0IGxheW91dCA9IFtdO1xcXFxuICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85YWlVFhUXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgICAgICB1cmw6ICQoW1xcXFxcXFwi57O757uf6YCJ5oup5ZmoXFxcXFxcXCIsIFxcXFxcXFwi5rW36ZiU6YCJ5oup5ZmoXFxcXFxcXCJdLCAxLCBcXFxcXFxcIumAieaLqeWZqOexu+Wei1xcXFxcXFwiKS5zZWxlY3QoKCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIuezu+e7n+mAieaLqeWZqFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiZmlsZVNlbGVjdDovL1xcXFxcXFwiICsgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICghLyhcXFxcXFxcXC50eHQpJC9pLnRlc3QoaW5wdXQpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2FzdChcXFxcXFxcIumAieaLqeS6humUmeivr+eahOaWh+S7tuexu+Wei1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25maWcgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvQ29uZmlnLmpzb25cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBub3ZlbE5hbWUgPSBpbnB1dC5tYXRjaCgvXFxcXFxcXFwvKFteXFxcXFxcXFwvXSo/KShcXFxcXFxcXC50eHQpJC9pKVsxXS5yZXBsYWNlKFxcXFxcXFwiX2ZpbGVTZWxlY3RfXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wYXRoID0gQ29uZmlnLmV4dGVybmFsSW1wb3J0UGF0aCArIG5vdmVsTmFtZSArIFxcXFxcXFwiLnR4dFxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IGlucHV0LnJlcGxhY2UoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgdG9wYXRoKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybSh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi5a+85YWl5o+Q56S6XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogXFxcXFxcXCLlt7LlrZjlnKhbXFxcXFxcXCIgKyBub3ZlbE5hbWUgKyBcXFxcXFxcIl3mmK/lkKbopobnm5Y/XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygocGF0aCwgdG9wYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5jb3B5RmlsZShwYXRoLCB0b3BhdGgsIHRydWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgdG9wYXRoICsgXFxcXFxcXCIuanNvblxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGggKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lr7zlhaXmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXRoLCB0b3BhdGgpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGUgPSAkLnJlcXVpcmUoXFxcXFxcXCJoaWtlcjovL3BhZ2UvRmlsZS5qc1xcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY29weUZpbGUocGF0aCwgdG9wYXRoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyB0b3BhdGggKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5kZWxldGVGaWxlcyh0b3BhdGggKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcXFxcXCLlr7zlhaXmiJDlip9cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVVcmwgPSBcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICBsZXQgZmlsZVNlbGVjdCA9IHJlcXVpcmUocmVxdWlyZVVybCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvblVyaSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbmZpZyA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9Db25maWcuanNvblxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3ZlbE5hbWUgPSBQQVRILm1hdGNoKC9cXFxcXFxcXC8oW15cXFxcXFxcXC9dKj8pKFxcXFxcXFxcLnR4dCkkL2kpWzFdO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvcGF0aCA9IENvbmZpZy5leHRlcm5hbEltcG9ydFBhdGggKyBub3ZlbE5hbWUgKyBcXFxcXFxcIi50eHRcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gUEFUSDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QoXFxcXFxcXCJmaWxlOi8vXFxcXFxcXCIgKyB0b3BhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcXFxcXCLlt7LlrZjlnKhbXFxcXFxcXCIgKyBub3ZlbE5hbWUgKyBcXFxcXFxcIl3mmK/lkKbopobnm5Y/XFxcXFxcXCIpLmNvbmZpcm0oKHBhdGgsIHRvcGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY29weUZpbGUocGF0aCwgdG9wYXRoLCB0cnVlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHRvcGF0aCArIFxcXFxcXFwiLmpzb25cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuZGVsZXRlRmlsZXModG9wYXRoICsgXFxcXFxcXCIuanNvblxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5a+85YWl5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGF0aCwgdG9wYXRoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZSA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vcGFnZS9GaWxlLmpzXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuY29weUZpbGUocGF0aCwgdG9wYXRoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgdG9wYXRoICsgXFxcXFxcXCIuanNvblxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHRvcGF0aCArIFxcXFxcXFwiLmpzb25cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2soKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WvvOWFpeaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZVVybDogcmVxdWlyZVVybCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGU6IFxcXFxcXFwiLnR4dFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrVHlwZTogXFxcXFxcXCJjb25maXJtXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgIG1lbW9yeTogXFxcXFxcXCJzZWxlY3RQYXRoQ2FjaGUxXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuICAgIGxldCBvcHRpb25zID0gW1xcXFxcXFwi6ZiF6K+7XFxcXFxcXCIsIFxcXFxcXFwi5YiG5LqrXFxcXFxcXCIsIFxcXFxcXFwi5Yig6ZmkXFxcXFxcXCIsIFxcXFxcXFwi5omT5byA5pa55byPXFxcXFxcXCJdO1xcXFxuXFxcXG4gICAgbGV0IHBhdHRlcm4gPSBnZXRNeVZhcihcXFxcXFxcIjp0eHRQYXR0ZXJuXFxcXFxcXCIsIG9wdGlvbnNbMF0pO1xcXFxuICAgIGxldCBpZCA9IERhdGUubm93KCkgKyBcXFxcXFxcIjrmqKHlvI9cXFxcXFxcIjtcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBwYXR0ZXJuLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKG9wdGlvbnMsIDEsIFxcXFxcXFwi5pON5L2c5qih5byPXFxcXFxcXCIpLnNlbGVjdCgoaWQpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiOnR4dFBhdHRlcm5cXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICAgICAgdXBkYXRlSXRlbShpZCwge1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpbnB1dFxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0sIGlkKSxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiBpZFxcXFxuICAgICAgICB9XFxcXG4gICAgfSlcXFxcbiAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgZnVuY3Rpb24gb3BlcmF0aW9uKHBhdGgsIG5hbWUpIHtcXFxcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBnZXRNeVZhcihcXFxcXFxcIjp0eHRQYXR0ZXJuXFxcXFxcXCIsIFxcXFxcXFwi6ZiF6K+7XFxcXFxcXCIpO1xcXFxuICAgICAgICBzd2l0Y2ggKHBhdHRlcm4pIHtcXFxcbiAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLliIbkuqtcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJzaGFyZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIGNhc2UgXFxcXFxcXCLliKDpmaRcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFxcXFxcIuehruiupOWIoOmZpFtcXFxcXFxcIiArIG5hbWUgKyBcXFxcXFxcIl1cXFxcXFxcIikuY29uZmlybSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL0ZpbGUuanNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLmRlbGV0ZUZpbGVzKHBhdGgpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0KFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aCArIFxcXFxcXFwiLmpzb25cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLmRlbGV0ZUZpbGVzKHBhdGggKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+WIoOmZpOWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSwgcGF0aCk7XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICBjYXNlIFxcXFxcXFwi6ZiF6K+7XFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3R4dFBhcnNlci52aWV3XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICBjYXNlIFxcXFxcXFwi5omT5byA5pa55byPXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwib3BlbkZpbGU6Ly9maWxlOi8vXFxcXFxcXCIgKyBwYXRoO1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgZm9yIChsZXQgbm92ZWwgb2YgZmlsZXMpIHtcXFxcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IG5vdmVsLm5hbWUsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShvcGVyYXRpb24sIG5vdmVsLnBhdGgsIG5vdmVsLm5hbWUpLFxcXFxuICAgICAgICAgICAgZGVzYzogXFxcXFxcXCLlpKflsI/vvJpcXFxcXFxcIiArIEZpbGUuZ2V0RmlsZVNpemUobm92ZWwucGF0aCkgKyBcXFxcXFxcIlxcXFxcXFxcbuS/ruaUueaXtumXtO+8mlxcXFxcXFwiICsgJC5kYXRlRm9ybWF0KG5vdmVsLmxhc3RNb2RpZmllZCwgXFxcXFxcXCJ5eXl5LU1NLWRkIEhIOm1tOnNzXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHBhdGg6IG5vdmVsLnBhdGgsXFxcXG4gICAgICAgICAgICAgICAgaXNDYWNoZTogdHJ1ZVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLorr7nva5cXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvU2V0dGluZy52aWV3I25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogTVlfUlVMRS52ZXJzaW9uXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOW4ruWKqeKAneKAnVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9oZWxwLnZpZXcjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/a2V5d29yZD10eHRcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJzxoMSBzdHlsZT1cXFxcXFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFxcXFxcIj7llaXpg73msqHmnInogLY8L2gxPicsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KGxheW91dCk7XFxcXG59XFxcXG5cXFxcbiQuZXhwb3J0cyA9IHR4dFZpZXc7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI3YuVFhU6Kej5p6Q5ZmoXFxcIixcXFwicGF0aFxcXCI6XFxcInR4dFBhcnNlci52aWV3XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuKGZ1bmN0aW9uKCkge1xcXFxuICAgIGxldCByZWdzID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3JlZ3VsYXJDaGFwdGVyLmZcXFxcXFxcIik7XFxcXG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJwYXRoXFxcXFxcXCIpIHx8IFxcXFxcXFwiXFxcXFxcXCIpIHx8IE1ZX1BBUkFNUy5wYXRoO1xcXFxuICAgIGxldCBjaGFyc3QgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcXFxcXCJjaGFyc3RcXFxcXFxcIikgfHwgXFxcXFxcXCJcXFxcXFxcIikgfHwgTVlfUEFSQU1TLmNoYXJzdCB8fCBcXFxcXFxcIlVURi04XFxcXFxcXCI7XFxcXG4gICAgbGV0IGlzQ2FjaGUgPSBNWV9QQVJBTVMuaXNDYWNoZTtcXFxcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIikpIHtcXFxcbiAgICAgICAgcGF0aCA9IFxcXFxcXFwiZmlsZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICB9XFxcXG4gICAgbGV0IGxheW91dCA9IFtdO1xcXFxuICAgIGxldCBjaGFwdGVyTmFtZXMgPSBbXTtcXFxcbiAgICBsZXQgaW50ZXJ2YWxzID0gW107XFxcXG4gICAgbGV0IGhhc1ByZWZhY2UgPSBmYWxzZTtcXFxcbiAgICBpZiAoZmlsZUV4aXN0KHBhdGggKyBcXFxcXFxcIi5qc29uXFxcXFxcXCIpICYmIGlzQ2FjaGUpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcblxcXFxuICAgICAgICAgICAgbGV0IGMgPSBKU09OLnBhcnNlKHJlcXVlc3QocGF0aCArIFxcXFxcXFwiLmpzb25cXFxcXFxcIikpO1xcXFxuICAgICAgICAgICAgY2hhcHRlck5hbWVzID0gYy5jaGFwdGVyTmFtZXM7XFxcXG4gICAgICAgICAgICBpbnRlcnZhbHMgPSBjLmludGVydmFscztcXFxcbiAgICAgICAgICAgIGhhc1ByZWZhY2UgPSBjLmhhc1ByZWZhY2U7XFxcXG4gICAgICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi6YeN5paw6Kej5p6Q55uu5b2VXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKChwYXRoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9LCBwYXRoK1xcXFxcXFwiLmpzb25cXFxcXFxcIiksXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6ZmFsc2VcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTpcXFxcXFxcImxpbmVfYmxhbmtcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICAgICAgc2V0UmVzdWx0KFt7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc4oCd4oCdPHN0cm9uZz7nm67lvZXop6PmnpDlpLHotKUo6YeN5paw6Kej5p6QKTwvc3Ryb25nPlxcXFxcXFwiLmJpZygpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgocGF0aCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSwgcGF0aCtcXFxcXFxcIi5qc29uXFxcXFxcXCIpLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH1dKTtcXFxcbiAgICAgICAgICAgIHJldHVybjtcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcXFxcXCLmraPlnKjop6PmnpDnm67lvZVcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCB0eHQgPSByZXF1ZXN0KHBhdGgsIHtcXFxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgICAgICAgICAvL1xcXFxcXFwiY29udGVudC10eXBlXFxcXFxcXCI6IFxcXFxcXFwidGV4dC9wbGFpbjsgY2hhcnN0PVxcXFxcXFwiICsgY2hhcnN0XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBsZXQgcGF0dGVybiA9IHJlZ3MuZ2V0VG9jUnVsZSh0eHQpO1xcXFxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcXFxcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgICAgICAgICBzZXRSZXN1bHQoW3tcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ08c3Ryb25nPuebruW9leino+aekOWksei0pTwvc3Ryb25nPlxcXFxcXFwiLmJpZygpLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfV0pO1xcXFxuICAgICAgICAgICAgcmV0dXJuO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKHR4dCk7XFxcXG4gICAgICAgIGxldCBwb2ludGVyID0gMDtcXFxcbiAgICAgICAgd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7XFxcXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBtYXRjaGVyLnN0YXJ0KCk7XFxcXG4gICAgICAgICAgICBsZXQgZW5kID0gbWF0Y2hlci5lbmQoKTtcXFxcbiAgICAgICAgICAgIGxldCB0ID0gbWF0Y2hlci5ncm91cCgpO1xcXFxuICAgICAgICAgICAgaWYgKHBvaW50ZXIgPT09IDAgJiYgc3RhcnQgPiAzMCkge1xcXFxuICAgICAgICAgICAgICAgIGhhc1ByZWZhY2UgPSB0cnVlO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgY2hhcHRlck5hbWVzLnB1c2godCk7XFxcXG4gICAgICAgICAgICBpbnRlcnZhbHMucHVzaChbcG9pbnRlciwgc3RhcnRdKTtcXFxcbiAgICAgICAgICAgIHBvaW50ZXIgPSBlbmQ7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaW50ZXJ2YWxzLnB1c2goW3BvaW50ZXIsIHR4dC5sZW5ndGhdKTtcXFxcbiAgICAgICAgaWYgKGlzQ2FjaGUpIHtcXFxcbiAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoICsgXFxcXFxcXCIuanNvblxcXFxcXFwiLCBKU09OLnN0cmluZ2lmeSh7XFxcXG4gICAgICAgICAgICAgICAgY2hhcHRlck5hbWVzOiBjaGFwdGVyTmFtZXMsXFxcXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWxzOiBpbnRlcnZhbHMsXFxcXG4gICAgICAgICAgICAgICAgaGFzUHJlZmFjZTogaGFzUHJlZmFjZVxcXFxuICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxcXG4gICAgfVxcXFxuXFxcXG5cXFxcbiAgICBpZiAoaGFzUHJlZmFjZSkge1xcXFxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBpbnRlcnZhbHNbMF07XFxcXG4gICAgICAgIGxheW91dC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIuW6j+iogFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8xXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1RYVFZpZXdlci52aWV3I2F1dG9QYWdlIyNyZWFkVGhlbWUjXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJOYW1lOiBcXFxcXFxcIuW6j+iogFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBpbnRlcnZhbFswXSxcXFxcbiAgICAgICAgICAgICAgICBlbmQ6IGludGVydmFsWzFdLFxcXFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXFxcXG4gICAgICAgICAgICAgICAgY2hhcnN0OiBjaGFyc3RcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcHRlck5hbWVzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgIGxldCBuYW1lID0gY2hhcHRlck5hbWVzW2ldO1xcXFxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBpbnRlcnZhbHNbaSArIDFdO1xcXFxuICAgICAgICBsYXlvdXQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogbmFtZSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9UWFRWaWV3ZXIudmlldyNhdXRvUGFnZSMjcmVhZFRoZW1lI1xcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBzdGFydDogaW50ZXJ2YWxbMF0sXFxcXG4gICAgICAgICAgICAgICAgZW5kOiBpbnRlcnZhbFsxXSxcXFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyTmFtZTogbmFtZSxcXFxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxcXFxuICAgICAgICAgICAgICAgIGNoYXJzdDogY2hhcnN0XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBzZXRSZXN1bHQobGF5b3V0KTtcXFxcbn0pKClcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjdi5UWFTmn6XnnIvlmahcXFwiLFxcXCJwYXRoXFxcIjpcXFwiVFhUVmlld2VyLnZpZXdcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgcGF0aCA9IE1ZX1BBUkFNUy5wYXRoO1xcXFxubGV0IGNoYXJzdCA9IE1ZX1BBUkFNUy5jaGFyc3Q7XFxcXG5sZXQgdHh0ID0gcmVxdWVzdChwYXRoLCB7XFxcXG4gICAgaGVhZGVyczoge1xcXFxuICAgICAgIC8vXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIjogXFxcXFxcXCJ0ZXh0L3BsYWluOyBjaGFyc3Q9XFxcXFxcXCIgKyBjaGFyc3RcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxubGV0IHRhcmdldFRleHRzID0gdHh0LnN1YnN0cmluZyhNWV9QQVJBTVMuc3RhcnQsIE1ZX1BBUkFNUy5lbmQpO1xcXFxuXFxcXG5sZXQgY29udGVudCA9IHRhcmdldFRleHRzLnNwbGl0KC9cXFxcXFxcXG4rLykuZmlsdGVyKGl0ID0+IGl0Lmxlbmd0aCA+IDEpLmpvaW4oXFxcXFxcXCI8YnI+XFxcXFxcXCIpO1xcXFxubGV0IGxheW91dCA9IFtdO1xcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgIHRpdGxlOiAoXFxcXFxcXCI8c3Ryb25nPlxcXFxcXFwiICsgTVlfUEFSQU1TLmNoYXB0ZXJOYW1lICsgXFxcXFxcXCI8L3N0cm9uZz5cXFxcXFxcIikuYmlnKCksXFxcXG59KTtcXFxcblxcXFxubGF5b3V0LnB1c2goe1xcXFxuICAgIHRpdGxlOiBjb250ZW50LFxcXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0ZXh0U2l6ZTogMTgsXFxcXG4gICAgICAgIGNsaWNrOiB0cnVlXFxcXG4gICAgfVxcXFxufSk7XFxcXG5zZXRSZXN1bHQobGF5b3V0KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIjai7nq6DoioLmraPliJlcXFwiLFxcXCJwYXRoXFxcIjpcXFwicmVndWxhckNoYXB0ZXIuZlxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBydWxlcyA9IFt7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTEsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuebruW9lSjljrvnqbrnmb0pXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1b44CAXFxcXFxcXFxcXFxcXFxcXHNdKSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXFxcXFxcXFxcc3swLDR9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSkpKS57MCwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuesrOS4gOeroCDlgYfoo4XnrKzkuIDnq6DliY3pnaLmnInnqbrnmb3kvYbmiJHkuI3opoFcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogMFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0yLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLnm67lvZVcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiXlsg44CAXFxcXFxcXFxcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnznrKw/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fVtcXFxcXFxcXFxcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n10rP1xcXFxcXFxcXFxcXFxcXFxzezAsNH0oPzrnq6B86IqCKD8h6K++KXzljbd86ZuGKD8hW+WQiOWSjF0pfOmDqCg/IVvliIbotZvmuLhdKXznr4coPyHlvKApKSkuezAsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLnrKzkuIDnq6Ag5qCH5YeG55qE57Kk6K+t5bCx5piv6L+Z5qC3XFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDFcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMyxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogZmFsc2UsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuebruW9lSjljLnphY3nroDku4spXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1b44CAXFxcXFxcXFxcXFxcXFxcXHNdKSg/Oig/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXFxcXFxcXFxcc3swLDR9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl856+HKD8h5bygKSkpLnswLDMwfSRcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwi566A5LuLIOiAgeWkq+ivuOiRm+adkeWkq1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAyXFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTQsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IGZhbHNlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLnm67lvZUo5Y+k5YW444CB6L275bCP6K+05aSH55SoKVxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fSg/OuW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfOesrD9cXFxcXFxcXFxcXFxcXFxcc3swLDR9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXSs/XFxcXFxcXFxcXFxcXFxcXHN7MCw0fSg/OueroHzoioIoPyHor74pfOWNt3zpm4YoPyFb5ZCI5ZKMXSl86YOoKD8hW+WIhui1m+a4uF0pfOWbnig/IVvlkIjmnaXkuovljrtdKXzlnLooPyFb5ZKM5ZCI5q+U55S15pivXSl86K+dfOevhyg/IeW8oCkpKS57MCwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuesrOS4gOeroCDmr5TkuIrpnaLlj6rlpJrkuoblm57lkozor51cXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogM1xcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC01LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi5pWw5a2XKOe6r+aVsOWtl+agh+mimClcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiKD88PVvjgIBcXFxcXFxcXFxcXFxcXFxcc10pXFxcXFxcXFxcXFxcXFxcXGQrXFxcXFxcXFxcXFxcXFxcXC4/WyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fSRcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwiMTJcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogNFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC02LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi5aSn5YaZ5pWw5a2XKOe6r+aVsOWtl+agh+mimClcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiKD88PVvjgIBcXFxcXFxcXFxcXFxcXFxcc10pW+OAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSwxMn1bIOOAgFxcXFxcXFxcXFxcXFxcXFx0XXswLDR9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLkuIDnmb7kuIPljYFcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogNFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC03LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLmlbDlrZcg5YiG6ZqU56ymIOagh+mimOWQjeensFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fVxcXFxcXFxcXFxcXFxcXFxkezEsNX1bOu+8miwu77yMIOOAgV/igJRcXFxcXFxcXFxcXFxcXFxcLV0uezEsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCIx44CB6L+Z5Liq5bCx5piv5qCH6aKYXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDVcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtOCxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogdHJ1ZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi5aSn5YaZ5pWw5a2XIOWIhumalOespiDmoIfpopjlkI3np7BcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJydWxlXFxcXFxcXCI6IFxcXFxcXFwiXlsg44CAXFxcXFxcXFxcXFxcXFxcXHRdezAsNH0oPzrluo/nq6B85qWU5a2QfOato+aWhyg/IeWujHznu5MpfOe7iOeroHzlkI7orrB85bC+5aOwfOeVquWklnxb44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9KVsg44CBX+KAlFxcXFxcXFxcXFxcXFxcXFwtXS57MSwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuS4gOOAgeWPquacieWJjemdoueahOaVsOWtl+acieW3ruWIq1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiA2XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTksXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuato+aWhyDmoIfpopgv5bqP5Y+3XFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIl5bIOOAgFxcXFxcXFxcXFxcXFxcXFx0XXswLDR95q2j5paHWyDjgIBdezEsNH0uezAsMjB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLmraPmlocg5oiR5aW25bi45bGx6LW15a2Q6b6ZXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDdcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTAsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIkNoYXB0ZXIvU2VjdGlvbi9QYXJ0L0VwaXNvZGUg5bqP5Y+3IOagh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyDjgIBcXFxcXFxcXFxcXFxcXFxcdF17MCw0fSg/OltDY11oYXB0ZXJ8W1NzXWVjdGlvbnxbUHBdYXJ0fO+8sO+8oe+8su+8tHxbTm5dW29PXVxcXFxcXFxcXFxcXFxcXFwufFtFZV1waXNvZGV8KD865YaF5a65fOaWh+eroCk/566A5LuLfOaWh+ahiHzliY3oqIB85bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJYpXFxcXFxcXFxcXFxcXFxcXHN7MCw0fVxcXFxcXFxcXFxcXFxcXFxkezEsNH0uezAsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCJDaGFwdGVyIDEgTXlHcmFuZG1hSXNOQlxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiA4XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTExLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwiQ2hhcHRlcijljrvnroDku4spXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIl5bIOOAgFxcXFxcXFxcXFxcXFxcXFx0XXswLDR9KD86W0NjXWhhcHRlcnxbU3NdZWN0aW9ufFtQcF1hcnR877yw77yh77yy77y0fFtObl1bT29dXFxcXFxcXFxcXFxcXFxcXC58W0VlXXBpc29kZSlcXFxcXFxcXFxcXFxcXFxcc3swLDR9XFxcXFxcXFxcXFxcXFxcXGR7MSw0fS57MCwzMH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIkNoYXB0ZXIgMSBNeUdyYW5kbWFJc05CXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDlcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTIsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIueJueauiuespuWPtyDluo/lj7cg5qCH6aKYXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1bXFxcXFxcXFxcXFxcXFxcXHPjgIBdKVvjgJDjgJTjgJbjgIzjgI7jgIjvvLtcXFxcXFxcXFxcXFxcXFxcW10oPzrnrKx8W0NjXWhhcHRlcilbXFxcXFxcXFxcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsMTB9W+eroOiKgl0uezAsMjB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLjgJDnrKzkuIDnq6Ag5ZCO6Z2i55qE56ym5Y+35Y+v5Lul5rKh5pyJXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDEwXFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTEzLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiBmYWxzZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi54m55q6K56ym5Y+3IOagh+mimCjmiJDlr7kpXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1bXFxcXFxcXFxcXFxcXFxcXHPjgIBdezAsNH0pKD86W1xcXFxcXFxcXFxcXFxcXFxb44CI44CM44CO44CW44CU44CK77yI44CQXFxcXFxcXFxcXFxcXFxcXChdLnsxLDMwfVtcXFxcXFxcXFxcXFxcXFxcKeOAke+8ieOAi+OAleOAl+OAj+OAjeOAiVxcXFxcXFxcXFxcXFxcXFxdXT98KD865YaF5a65fOaWh+eroCk/566A5LuLfOaWh+ahiHzliY3oqIB85bqP56ugfOallOWtkHzmraPmlocoPyHlrox857uTKXznu4jnq6B85ZCO6K6wfOWwvuWjsHznlarlpJYpWyDjgIBdezAsNH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuOAjuWKoOS4quebtOinkuW8leWPt+abtOS4k+S4muOAj1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxMVxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0xNCxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogdHJ1ZSxcXFxcbiAgICAgICAgXFxcXFxcXCJuYW1lXFxcXFxcXCI6IFxcXFxcXFwi54m55q6K56ym5Y+3IOagh+mimCjljZXkuKopXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/PD1bXFxcXFxcXFxcXFxcXFxcXHPjgIBdezAsNH0pKD86W+KYhuKYheKcpuKcp10uezEsMzB9fCg/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWKVsg44CAXXswLDR9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLimIbjgIHmmYvmsZ/kvZzogIXmnIDllpzmrKLnmoTmoLzlvI9cXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogMTJcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTUsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IHRydWUsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIueroC/ljbcg5bqP5Y+3IOagh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeWyBcXFxcXFxcXFxcXFxcXFxcdOOAgF17MCw0fSg/Oig/OuWGheWuuXzmlofnq6ApP+eugOS7i3zmlofmoYh85YmN6KiAfOW6j+eroHzmpZTlrZB85q2j5paHKD8h5a6MfOe7kyl857uI56ugfOWQjuiusHzlsL7lo7B855Wq5aSWfFvljbfnq6BdW1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9KVsg44CAXXswLDR9LnswLDMwfSRcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwi5Y235LqUIOW8gOa6kOebm+S4llxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxM1xcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0xNixcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogZmFsc2UsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIumhtuagvOagh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeXFxcXFxcXFxcXFxcXFxcXFMuezEsMjB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLkuI3otoXov4cyMOS4quWtl+mhtuagvOWGmeeahOmDveaYr+agh+mimFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxNFxcXFxuICAgIH0sXFxcXG4gICAge1xcXFxuICAgICAgICBcXFxcXFxcImlkXFxcXFxcXCI6IC0xNyxcXFxcbiAgICAgICAgXFxcXFxcXCJlbmFibGVcXFxcXFxcIjogZmFsc2UsXFxcXG4gICAgICAgIFxcXFxcXFwibmFtZVxcXFxcXFwiOiBcXFxcXFxcIuWPjOagh+mimCjliY3lkJEpXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIig/bSkoPzw9WyBcXFxcXFxcXFxcXFxcXFxcdOOAgF17MCw0fSnnrKxbXFxcXFxcXFxcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JCg/PVtcXFxcXFxcXFxcXFxcXFxcc+OAgF17MCw4feesrFtcXFxcXFxcXFxcXFxcXFxcZOmbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4feeroClcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJleGFtcGxlXFxcXFxcXCI6IFxcXFxcXFwi56ys5LiA56ugIOecn+ato+eahOagh+mimOW5tuWBh+ijheaNouihjOesrOS4gOeroCDov5nkuKrkuI3opoFcXFxcXFxcIixcXFxcbiAgICAgICAgXFxcXFxcXCJzZXJpYWxOdW1iZXJcXFxcXFxcIjogMTVcXFxcbiAgICB9LFxcXFxuICAgIHtcXFxcbiAgICAgICAgXFxcXFxcXCJpZFxcXFxcXFwiOiAtMTgsXFxcXG4gICAgICAgIFxcXFxcXFwiZW5hYmxlXFxcXFxcXCI6IGZhbHNlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLlj4zmoIfpopgo5ZCO5ZCRKVxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCIoP20pKD88PVsgXFxcXFxcXFxcXFxcXFxcXHTjgIBdezAsNH3nrKxbXFxcXFxcXFxcXFxcXFxcXGTjgIfpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JFtcXFxcXFxcXFxcXFxcXFxcc+OAgF17MCw4fSnnrKxbXFxcXFxcXFxcXFxcXFxcXGTpm7bkuIDkuozkuKTkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIflo7notLDlj4HogobkvI3pmYbmn5LmjYznjpbmi77kvbDku59dezEsOH3nq6AuezAsMzB9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLnrKzkuIDnq6Ag6L+Z5Liq5qCH6aKY5LiN6KaB5bm25YGH6KOF5o2i6KGM56ys5LiA56ug55yf5q2j55qE5qCH6aKYXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDE2XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTE5LFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLkuablkI0g5ous5Y+3IOW6j+WPt1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInJ1bGVcXFxcXFxcIjogXFxcXFxcXCJeLnsxLDIwfVso77yIXVtcXFxcXFxcXFxcXFxcXFxcZOOAh+mbtuS4gOS6jOS4pOS4ieWbm+S6lOWFreS4g+WFq+S5neWNgeeZvuWNg+S4h+Wjuei0sOWPgeiChuS8jemZhuafkuaNjOeOluaLvuS9sOS7n117MSw4fVsp77yJXVsg44CAXFxcXFxcXFx0XXswLDR9JFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcImV4YW1wbGVcXFxcXFxcIjogXFxcXFxcXCLmoIfpopjlkI7pnaLmlbDlrZfmnInmi6zlj7coMTIpXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwic2VyaWFsTnVtYmVyXFxcXFxcXCI6IDE3XFxcXG4gICAgfSxcXFxcbiAgICB7XFxcXG4gICAgICAgIFxcXFxcXFwiaWRcXFxcXFxcIjogLTIwLFxcXFxuICAgICAgICBcXFxcXFxcImVuYWJsZVxcXFxcXFwiOiB0cnVlLFxcXFxuICAgICAgICBcXFxcXFxcIm5hbWVcXFxcXFxcIjogXFxcXFxcXCLkuablkI0g5bqP5Y+3XFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwicnVsZVxcXFxcXFwiOiBcXFxcXFxcIl4uezEsMjB9W1xcXFxcXFxcXFxcXFxcXFxk44CH6Zu25LiA5LqM5Lik5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5aO56LSw5Y+B6IKG5LyN6ZmG5p+S5o2M546W5ou+5L2w5LufXXsxLDh9WyDjgIBcXFxcXFxcXHRdezAsNH0kXFxcXFxcXCIsXFxcXG4gICAgICAgIFxcXFxcXFwiZXhhbXBsZVxcXFxcXFwiOiBcXFxcXFxcIuagh+mimOWQjumdouaVsOWtl+ayoeacieaLrOWPtzEyNFxcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInNlcmlhbE51bWJlclxcXFxcXFwiOiAxOFxcXFxuICAgIH1cXFxcbl07XFxcXG5sZXQgTWF0Y2hlciA9IGphdmEudXRpbC5yZWdleC5NYXRjaGVyO1xcXFxubGV0IFBhdHRlcm4gPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybjtcXFxcblxcXFxuZnVuY3Rpb24gZ2V0VG9jUnVsZShjb250ZW50KSB7XFxcXG4gICAgbGV0IG1heENzID0gMTtcXFxcbiAgICBsZXQgdG9jUGF0dGVybiA9IG51bGw7XFxcXG4gICAgZm9yIChsZXQgdG9jUnVsZSBvZiBydWxlcykge1xcXFxuICAgICAgICBpZiAoIXRvY1J1bGUuZW5hYmxlKSBjb250aW51ZTtcXFxcbiAgICAgICAgbGV0IHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUodG9jUnVsZS5ydWxlLCBQYXR0ZXJuLk1VTFRJTElORSk7XFxcXG4gICAgICAgIGxldCBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGNvbnRlbnQpO1xcXFxuICAgICAgICBsZXQgY3MgPSAwO1xcXFxuICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHtcXFxcbiAgICAgICAgICAgIGNzKys7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKGNzID49IG1heENzKSB7XFxcXG4gICAgICAgICAgICBtYXhDcyA9IGNzO1xcXFxuICAgICAgICAgICAgdG9jUGF0dGVybiA9IHBhdHRlcm47XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIHRvY1BhdHRlcm47XFxcXG59XFxcXG4kLmV4cG9ydHMuZ2V0VG9jUnVsZSA9IGdldFRvY1J1bGU7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiI1Yu5biu5YqpXFxcIixcXFwicGF0aFxcXCI6XFxcImhlbHAudmlld1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBoZWxwVGV4dCA9IHtcXFxcbiAgICBcXFxcXFxcInR4dFxcXFxcXFwiOiBgXFxcXG4gICAgICAgIDxoMSBpZD1cXFxcXFxcInR4dOaYr+S7gOS5iFxcXFxcXFwiPlRYVOaYr+S7gOS5iD88L2gxPlxcXFxuICAgICAgICA8cD48YSBocmVmPVxcXFxcXFwiaHR0cHM6Ly9iYWlrZS5iYWlkdS5jb20vaXRlbS90eHQvMTIxNzMzMFxcXFxcXFwiPuaIkeW3sue7j+W4ruS9oOeZvuW6puS6hjwvYT7vvJvnroDljZXmnaXor7TlsLHmmK/kuIDnp43lgqjlrZjlsI/or7TnmoTmlofku7Yo5omp5bGV5ZCNOnR4dCnjgII8L3A+XFxcXG4gICAgICAgIDxoMSBpZD1cXFxcXFxcIuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtFxcXFxcXFwiPuWmguS9leeUqOivpeWwj+eoi+W6j+mYheivu3R4dOWwj+ivtD88L2gxPlxcXFxuICAgICAgICA8cD7lnKjkuLvpobXpnaIg4peJVFhUIOeVjOmdouS4i++8jOeCueWHu+WvvOWFpVRYVO+8jOmAieaLqeebruagh+Wwj+ivtOaWh+S7tih0eHTmlofku7bvvIw8ZW0+6K+l5pON5L2c5LiN5Lya5Yig6ZmkdHh05paH5Lu277yM6ICM5pivY29weeS4gOS7veWIsOWwj+eoi+W6j+eahOi3r+W+hOS4izwvZW0+Ke+8jOWvvOWFpeWQjuWGjeWcqCDil4lUWFQg55WM6Z2i5LiL6YCJ5oup5oOz6KaB6ZiF6K+755qE5bCP6K+05Y2z5Y+v44CCPC9wPlxcXFxuXFxcXG4gICAgYCxcXFxcbiAgICBcXFxcXFxcIm5vdmVsQ29taWNcXFxcXFxcIjogYFxcXFxuICAgICAgICA8aDEgaWQ9XFxcXFxcXCLov5nkuKrlsI/nqIvluo/mnInku4DkuYjnlKjvvJ9cXFxcXFxcIj7ov5nkuKrlsI/nqIvluo/mnInku4DkuYjnlKjvvJ88L2gxPlxcXFxuICAgICAgICA8dWw+XFxcXG4gICAgICAgIDxsaT48dT7ku6PnoIHkuIrkuLrlhbbku5blsI/nqIvluo8o5ryr55S757G7L+Wwj+ivtOexuynmj5DkvpvkuIvovb3mjqXlj6PjgII8L3U+PC9saT5cXFxcbiAgICAgICAgPGxpPjx1PuacrOS9k+WFheW9k+mYheivu+WZqO+8jOWPr+S7pea1j+iniOeUqOivpeWwj+eoi+W6j+aPkOS+m+eahOS4i+i9veaOpeWPoyjkuIrpnaIp77yM5LiL6L2955qE5ryr55S7L+Wwj+ivtOOAgjwvdT48L2xpPlxcXFxuICAgICAgICA8bGk+PHU+5o+Q5L6bVFhU5qC85byP5bCP6K+05paH5Lu26Kej5p6Q5Yqf6IO944CCPC91PlxcXFxuICAgICAgICA8aDEgaWQ9XFxcXFxcXCLkuLrku4DkuYjliJfooajph4zku4DkuYjpg73msqHnlKhcXFxcXFxcIj7kuLrku4DkuYjliJfooajph4zku4DkuYjpg73msqHnlKg/PC9oMT5cXFxcbiAgICAgICAgPHU+5Yid5qyh5L2/55So77yM5rKh5pyJ5b6I5q2j5bi45ZCn44CC8J+klDwvdT5cXFxcbiAgICAgICAgPGgxIGlkPVxcXFxcXFwi6K+l5aaC5L2V5re75Yqg5ryr55S75oiW5bCP6K+0XFxcXFxcXCI+6K+l5aaC5L2V5re75Yqg5ryr55S7KOaIluWwj+ivtCk/PC9oMT5cXFxcbiAgICAgICAgPHU+IOWcqOS4gOS4quacieS4i+i9veWKn+iDveeahOWwj+eoi+W6jyjmvKvnlLvnsbsv5bCP6K+057G7KeS4reS4i+i9veS4gOacrOa8q+eUuy/lsI/or7TvvIzov5Tlm57or6Xop4TliJnljbPlj6/mtY/op4jjgII8L3U+PC9saT5cXFxcbiAgICAgICAgPC91bD5cXFxcbiAgICBgXFxcXG59O1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi5biu5YqpXFxcXFxcXCIpO1xcXFxubGV0IGtleXdvcmQgPSBnZXRQYXJhbShcXFxcXFxcImtleXdvcmRcXFxcXFxcIik7XFxcXG5sZXQgdGV4dDtcXFxcbmlmIChrZXl3b3JkID09PSB1bmRlZmluZWQgfHwgISh0ZXh0ID0gaGVscFRleHRba2V5d29yZF0pKSB7XFxcXG4gICAgc2V0UmVzdWx0KFt7XFxcXG4gICAgICAgIHRpdGxlOiAnPGgxIHN0eWxlPVxcXFxcXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXFxcXFwiPui1hOaWmeS4jeingeWSrzwvaDE+JyxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9XSk7XFxcXG59IGVsc2Uge1xcXFxuICAgIHNldFJlc3VsdChbe1xcXFxuICAgICAgICB0aXRsZTogdGV4dCxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCJcXFxcbiAgICB9XSk7XFxcXG59XFxcIn1dXCIsXCJwcm94eVwiOlwiXCJ9IiwidGl0bGUiOiLpgInmi6nlmah8W+e7vF3nlKjnu7Plkb3mjqjplIDnmoTnlLfkurog5L2c6ICF77ya6YaJ6aWu6ZW/5q2MIn0=
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement