@valten/regulex-visualizer 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- (function(i,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],l):(i=typeof globalThis<"u"?globalThis:i||self,l(i.RegulexVisualizer={},i.Vue))})(this,(function(i,l){"use strict";const C="data:text/javascript;base64,LyoqDQogKiBAbGljZW5zZSBhbG1vbmQgMC4zLjAgQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqIEF2YWlsYWJsZSB2aWEgdGhlIE1JVCBvciBuZXcgQlNEIGxpY2Vuc2UuDQogKiBzZWU6IGh0dHA6Ly9naXRodWIuY29tL2pyYnVya2UvYWxtb25kIGZvciBkZXRhaWxzDQogKi8NCg0KLy8g4pSCIENvcHlyaWdodCDCqSAyMDA4LTIwMTIgRG1pdHJ5IEJhcmFub3Zza2l5IChodHRwOi8vcmFwaGFlbGpzLmNvbSkgICAg4pSCIFxcDQoNCi8vIOKUgiBDb3B5cmlnaHQgwqkgMjAwOC0yMDEyIFNlbmNoYSBMYWJzIChodHRwOi8vc2VuY2hhLmNvbSkgICAgICAgICAgICAgIOKUgiBcXA0KDQovLyDilIIgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoaHR0cDovL3JhcGhhZWxqcy5jb20vbGljZW5zZS5odG1sKSBsaWNlbnNlLuKUgiBcXA0KDQovLyBDb3B5cmlnaHQgKGMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQovLyDilIIgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgRG1pdHJ5IEJhcmFub3Zza2l5IChodHRwOi8vcmFwaGFlbGpzLmNvbSkgICDilIIgXFwNCg0KLy8g4pSCIENvcHlyaWdodCAoYykgMjAwOC0yMDExIFNlbmNoYSBMYWJzIChodHRwOi8vc2VuY2hhLmNvbSkgICAgICAgICAgICAg4pSCIFxcDQoNCi8vIOKUgiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIChodHRwOi8vcmFwaGFlbGpzLmNvbS9saWNlbnNlLmh0bWwpIGxpY2Vuc2UuIOKUgiBcXA0KDQp2YXIgcmVxdWlyZWpzLHJlcXVpcmUsZGVmaW5lO2lmKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdi5jYWxsKHQsZSl9ZnVuY3Rpb24gcih0LGUpe3ZhciByLG4saSxhLHMsbyxjLGgsdSxsLGYscD1lJiZlLnNwbGl0KCIvIiksZD1nLm1hcCx4PWQmJmRbIioiXXx8e307aWYodCYmIi4iPT09dC5jaGFyQXQoMCkpaWYoZSl7Zm9yKHA9cC5zbGljZSgwLHAubGVuZ3RoLTEpLHQ9dC5zcGxpdCgiLyIpLHM9dC5sZW5ndGgtMSxnLm5vZGVJZENvbXBhdCYmbS50ZXN0KHRbc10pJiYodFtzXT10W3NdLnJlcGxhY2UobSwiIikpLHQ9cC5jb25jYXQodCksdT0wO3U8dC5sZW5ndGg7dSs9MSlpZigiLiI9PT0oZj10W3VdKSl0LnNwbGljZSh1LDEpLHUtPTE7ZWxzZSBpZigiLi4iPT09Zil7aWYoMT09PXUmJigiLi4iPT09dFsyXXx8Ii4uIj09PXRbMF0pKWJyZWFrO3U+MCYmKHQuc3BsaWNlKHUtMSwyKSx1LT0yKX10PXQuam9pbigiLyIpfWVsc2UgMD09PXQuaW5kZXhPZigiLi8iKSYmKHQ9dC5zdWJzdHJpbmcoMikpO2lmKChwfHx4KSYmZCl7Zm9yKHI9dC5zcGxpdCgiLyIpLHU9ci5sZW5ndGg7dT4wO3UtPTEpe2lmKG49ci5zbGljZSgwLHUpLmpvaW4oIi8iKSxwKWZvcihsPXAubGVuZ3RoO2w+MDtsLT0xKWlmKChpPWRbcC5zbGljZSgwLGwpLmpvaW4oIi8iKV0pJiYoaT1pW25dKSl7YT1pLG89dTticmVha31pZihhKWJyZWFrOyFjJiZ4JiZ4W25dJiYoYz14W25dLGg9dSl9IWEmJmMmJihhPWMsbz1oKSxhJiYoci5zcGxpY2UoMCxvLGEpLHQ9ci5qb2luKCIvIikpfXJldHVybiB0fWZ1bmN0aW9uIG4oZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj15LmNhbGwoYXJndW1lbnRzLDApO3JldHVybiJzdHJpbmciIT10eXBlb2YgblswXSYmMT09PW4ubGVuZ3RoJiZuLnB1c2gobnVsbCksdS5hcHBseSh0LG4uY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiByKGUsdCl9fWZ1bmN0aW9uIGEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3BbdF09ZX19ZnVuY3Rpb24gcyhyKXtpZihlKGQscikpe3ZhciBuPWRbcl07ZGVsZXRlIGRbcl0seFtyXT0hMCxoLmFwcGx5KHQsbil9aWYoIWUocCxyKSYmIWUoeCxyKSl0aHJvdyBuZXcgRXJyb3IoIk5vICIrcik7cmV0dXJuIHBbcl19ZnVuY3Rpb24gbyh0KXt2YXIgZSxyPXQ/dC5pbmRleE9mKCIhIik6LTE7cmV0dXJuIHI+LTEmJihlPXQuc3Vic3RyaW5nKDAsciksdD10LnN1YnN0cmluZyhyKzEsdC5sZW5ndGgpKSxbZSx0XX1mdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBnJiZnLmNvbmZpZyYmZy5jb25maWdbdF18fHt9fX12YXIgaCx1LGwsZixwPXt9LGQ9e30sZz17fSx4PXt9LHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx5PVtdLnNsaWNlLG09L1wuanMkLztsPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1vKHQpLGM9YVswXTtyZXR1cm4gdD1hWzFdLGMmJihjPXIoYyxlKSxuPXMoYykpLGM/dD1uJiZuLm5vcm1hbGl6ZT9uLm5vcm1hbGl6ZSh0LGkoZSkpOnIodCxlKToodD1yKHQsZSksYT1vKHQpLGM9YVswXSx0PWFbMV0sYyYmKG49cyhjKSkpLHtmOmM/YysiISIrdDp0LG46dCxwcjpjLHA6bn19LGY9e3JlcXVpcmU6ZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9LGV4cG9ydHM6ZnVuY3Rpb24odCl7dmFyIGU9cFt0XTtyZXR1cm4gdm9pZCAwIT09ZT9lOnBbdF09e319LG1vZHVsZTpmdW5jdGlvbih0KXtyZXR1cm57aWQ6dCx1cmk6IiIsZXhwb3J0czpwW3RdLGNvbmZpZzpjKHQpfX19LGg9ZnVuY3Rpb24ocixpLG8sYyl7dmFyIGgsdSxnLHYseSxtLGI9W10sXz10eXBlb2YgbztpZihjPWN8fHIsInVuZGVmaW5lZCI9PT1ffHwiZnVuY3Rpb24iPT09Xyl7Zm9yKGk9IWkubGVuZ3RoJiZvLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06aSx5PTA7eTxpLmxlbmd0aDt5Kz0xKWlmKHY9bChpW3ldLGMpLCJyZXF1aXJlIj09PSh1PXYuZikpYlt5XT1mLnJlcXVpcmUocik7ZWxzZSBpZigiZXhwb3J0cyI9PT11KWJbeV09Zi5leHBvcnRzKHIpLG09ITA7ZWxzZSBpZigibW9kdWxlIj09PXUpaD1iW3ldPWYubW9kdWxlKHIpO2Vsc2UgaWYoZShwLHUpfHxlKGQsdSl8fGUoeCx1KSliW3ldPXModSk7ZWxzZXtpZighdi5wKXRocm93IG5ldyBFcnJvcihyKyIgbWlzc2luZyAiK3UpO3YucC5sb2FkKHYubixuKGMsITApLGEodSkse30pLGJbeV09cFt1XX1nPW8/by5hcHBseShwW3JdLGIpOnZvaWQgMCxyJiYoaCYmaC5leHBvcnRzIT09dCYmaC5leHBvcnRzIT09cFtyXT9wW3JdPWguZXhwb3J0czpnPT09dCYmbXx8KHBbcl09ZykpfWVsc2UgciYmKHBbcl09byl9LHJlcXVpcmVqcz1yZXF1aXJlPXU9ZnVuY3Rpb24oZSxyLG4saSxhKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGZbZV0/ZltlXShyKTpzKGwoZSxyKS5mKTtpZighZS5zcGxpY2Upe2lmKGc9ZSxnLmRlcHMmJnUoZy5kZXBzLGcuY2FsbGJhY2spLCFyKXJldHVybjtyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dH1yZXR1cm4gcj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPWksaT1hKSxpP2godCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe2godCxlLHIsbil9LDQpLHV9LHUuY29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB1KHQpfSxyZXF1aXJlanMuX2RlZmluZWQ9cCxkZWZpbmU9ZnVuY3Rpb24odCxyLG4pe3Iuc3BsaWNlfHwobj1yLHI9W10pLGUocCx0KXx8ZShkLHQpfHwoZFt0XT1bdCxyLG5dKX0sZGVmaW5lLmFtZD17alF1ZXJ5OiEwfX0oKSxkZWZpbmUoImxpYnMvYWxtb25kIixmdW5jdGlvbigpe30pLCJmdW5jdGlvbiIhPXR5cGVvZiBkZWZpbmUpdmFyIGRlZmluZT1yZXF1aXJlKCJhbWRlZmluZSIpKG1vZHVsZSk7aWYoZGVmaW5lKCJLaXQiLFtdLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGEpe3JldHVybiBlLl9TZXQ/ZTooYXx8KGU9bihlKSksZS5jb250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybiEhfnIoZSx0LG4pfSxlLmluZGV4T2Y9ZnVuY3Rpb24odCxuKXtyZXR1cm4gcihlLHQsbil9LGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiBpKGUpfSxlLnVuaW9uPWZ1bmN0aW9uKHIpe3I9dChyKTtmb3IodmFyIG49ZS5sZW5ndGgrci5sZW5ndGgsYT1uZXcgZS5jb25zdHJ1Y3RvcihuKSxzPTAsbz0wLGM9MDtjPG47YysrKWVbc109PT1yW29dPyhhW2NdPWVbcysrXSxvKyssbi0tKTplW3NdPHJbb10/YVtjXT1lW3MrK106YVtjXT1yW28rK107cmV0dXJuIGEubGVuZ3RoPW4sdChhLmxlbmd0aD09PW4/YTppKGEsbiksITApfSxlLmluc3BlY3Q9ZS50b0FycmF5LGUuX1NldD0hMCxlKX1mdW5jdGlvbiBlKHQsZSl7cmV0dXJuIHQ8ZT9FOnQ9PT1lP0M6a31mdW5jdGlvbiByKHQscixuKXt2YXIgaSxhLHM9MCxvPXQubGVuZ3RoLGM9by0xO2lmKG88MSlyZXR1cm4tMTtpZihuPW58fGUsMT09PW8pcmV0dXJuIG4ocix0W3NdKT09PUM/czotMTtpZihuKHIsdFtzXSk9PT1FfHxuKHIsdFtjXSk9PT1rKXJldHVybi0xO2Rve2lmKGk9cysoYy1zKzE+PjEpLChhPW4ocix0W2ldKSk9PT1DKXJldHVybiBpO2E9PT1FP2M9aS0xOnM9aSsxfXdoaWxlKHM8PWMpO3JldHVybi0xfWZ1bmN0aW9uIG4odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9MSlyZXR1cm4gdDtmb3IodmFyIHIsbixhLHM9MSxvPWUvM3wwO3M8bzspcz0zKnMrMTtmb3IoO3M+MDspe2ZvcihyPXM7cjxlO3IrKylmb3Iobj1yO24+PXMmJnRbbl08dFtuLXNdO24tPXMpYT10W25dLHRbbl09dFtuLXNdLHRbbi1zXT1hO3M9cy8zfDB9dmFyIGM9dFswXTtmb3Iocj0xLG49MTtyPGU7cisrKXRbcl0hPT1jJiYoYz10W24rK109dFtyXSk7cmV0dXJuIHQubGVuZ3RoPW4sdC5sZW5ndGg9PT1uP3Q6aSh0LG4pfWZ1bmN0aW9uIGkodCxlKXtlPXZvaWQgMD09PWU/dC5sZW5ndGg6ZTtmb3IodmFyIHI9bmV3IHQuY29uc3RydWN0b3IoZSksbj1lO24tLTspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlLHI9e30sbj0wLGk9MCxhPXQubGVuZ3RoO248YTtuKyspZT10W25dLHIuaGFzT3duUHJvcGVydHkoZSl8fChyW2VdPTEsdFtpKytdPWUpO3JldHVybiB0Lmxlbmd0aD1pLHR9ZnVuY3Rpb24gcyh0KXt2YXIgZSxyLG4saT10Lmxlbmd0aCxhPSgxZTEwKk1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDMyKSsoK25ldyBEYXRlKS50b1N0cmluZygzMik7Zm9yKGU9cj0wO2U8aTtlKyspbnVsbCE9KG49dFtlXSkmJihuLmhhc093blByb3BlcnR5KGEpfHwoT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sYSx7dmFsdWU6MSxlbnVtZXJhYmxlOiExfSksdFtyKytdPW4pKTtmb3IoZT1yO2UtLTspdFtlXVthXT12b2lkIDA7cmV0dXJuIHQubGVuZ3RoPXIsdH1mdW5jdGlvbiBvKHQpe3Q9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV0/dDp0K3R9KTt2YXIgZSxyLGksYSxzLG87dD1uKHQpLG89dC5sZW5ndGg7dmFyIGMsaCx1PU9iamVjdC5jcmVhdGUobnVsbCksbD1PYmplY3QuY3JlYXRlKG51bGwpLGY9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoZT0wO2U8bztlKyspZm9yKHM9dFtlXSxoPXNbMV0sbFtzWzBdXT0hMCxmW2hdPSEwLHI9ZTtyPG87cisrKWlmKChjPXRbcl1bMF0pPj1oKXtjPT09aCYmKHVbaF09ITApO2JyZWFrfXZhciBnPW4odC5qb2luKCIiKS5zcGxpdCgiIikpLHg9T2JqZWN0LmtleXModSksdj1nWzBdLHk9T2JqZWN0LmNyZWF0ZShudWxsKSxtPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGU9MDtlPG87ZSsrKXlbdFtlXV09W107aWYodVt2XSlmb3IoZT0wO2U8bztlKyspaWYocz10W2VdLHNbMF09PT12KXlbc10ucHVzaCh2KTtlbHNlIGlmKHNbMF0+dilicmVhaztmb3IoZT0wLGE9Zy5sZW5ndGgtMTtlPGE7ZSsrKXtpZihjPWdbZV0saD1nW2UrMV0sZltjXSYmKGM9ZChjKSksbFtoXSYmKGg9cChoKSksYzw9aClmb3Iodj1jPT09aD9jOmMraCxyPTA7cjxvJiYocz10W3JdLCEoc1swXT5oKSk7cisrKXNbMF08PWMmJmg8PXNbMV0mJih5W3NdLnB1c2godikseC5wdXNoKHYpKTtpZihjPWdbZV0saD1nW2UrMV0sdVtoXSlmb3Iocj0wO3I8byYmKHM9dFtyXSwhKHNbMF0+aCkpO3IrKylzWzBdPD1oJiZoPD1zWzFdJiZ5W3NdLnB1c2goaCl9eD1uKHgpO2ZvcihpIGluIHkpbVtpWzBdPT09aVsxXT9pWzBdOmldPXlbaV07cmV0dXJue3Jhbmdlczp4LG1hcDptfX1mdW5jdGlvbiBjKHQpe3ZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzUpO3Q9byh0KS5yYW5nZXM7dmFyIHI9W107aWYoIXQubGVuZ3RoKXJldHVybiByOyJcMCIhPT10WzBdWzBdJiZ0LnVuc2hpZnQoZSk7dmFyIG49dC5sZW5ndGgtMTtyZXR1cm4odFtuXVsxXXx8dFtuXVswXSkhPT1lJiZ0LnB1c2goIlwwIiksdC5yZWR1Y2UoZnVuY3Rpb24odCxlKXt2YXIgbj1kKHRbMV18fHRbMF0pLGk9cChlWzBdKTtyZXR1cm4gbjxpJiZyLnB1c2gobitpKSxuPT09aSYmci5wdXNoKG4pLGV9KSxyfWZ1bmN0aW9uIGgodCl7dD10LnNwbGl0KCIiKTt2YXIgZT1bXSxyPVtdLG49Il4iPT09dFswXSYmdC5sZW5ndGg+MSYmdC5zaGlmdCgpO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIi0iPT1lWzBdJiZlLmxlbmd0aD4xKXtpZihlWzFdPnQpdGhyb3cgbmV3IEVycm9yKCJDaGFyc2V0IHJhbmdlIG91dCBvZiBvcmRlcjoiK2VbMV0rIi0iK3QrIiEiKTtyLnB1c2goZVsxXSt0KSxlLnNwbGljZSgwLDIpfWVsc2UgZS51bnNoaWZ0KHQpfSkscj1yLmNvbmNhdChlKSxuP2Mocik6byhyKS5yYW5nZXN9ZnVuY3Rpb24gdSh0KXtpZighdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9W3RbMF1dO3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LHIpe3ZhciBuPWUubGVuZ3RoLTE7cmV0dXJuIHRbdC5sZW5ndGgtMV09PT1wKHJbMF0pP2Vbbl09ZVtuXVswXStyW3IubGVuZ3RoLTFdOihlLnB1c2gocikscil9KSxlLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiAyPT09ZS5sZW5ndGgmJmVbMF09PT1wKGVbMV0pPyh0LnB1c2goZVswXSksdC5wdXNoKGVbMV0pKTp0LnB1c2goZSksdH0sW10pfWZ1bmN0aW9uIGwodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4gdC5jaGFyQ29kZUF0KDApfWZ1bmN0aW9uIHAodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KDApLTEpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KDApKzEpfWZ1bmN0aW9uIGcodCxlKXt2YXIgcj0vW1x4MDAtXHgxRlx4N0YtXHg5Rl0vLG49L1tcdTAwOUYtXHVGRkZGXS87cmV0dXJuIHQ9dC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiFlJiZTLmhhc093blByb3BlcnR5KHQpP1NbdF06bi50ZXN0KHQpPyJcXHUiKygiMDAiK2YodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC00KTpyLnRlc3QodCk/IlxceCIrKCIwIitmKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtMik6dH0pLmpvaW4oIiIpfWZ1bmN0aW9uIHgodCl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLHQpfWZ1bmN0aW9uIHYodCxlKXtyZXR1cm4gbmV3IEFycmF5KGUrMSkuam9pbih0KX1mdW5jdGlvbiB5KCl7dmFyIHQ9Xy5jYWxsKGFyZ3VtZW50cyk7aWYodylGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkoY29uc29sZS5sb2csW2NvbnNvbGUsdF0pO2Vsc2V7dmFyIGU9cmVxdWlyZSgidXRpbCIpO3QuZm9yRWFjaChmdW5jdGlvbih0KXtjb25zb2xlLmxvZyhlLmluc3BlY3QodCx7c2hvd0hpZGRlbjohMSxjdXN0b21JbnNwZWN0OiEwLGRlcHRoOjY0LGNvbG9yczohMH0pKX0pfX1mdW5jdGlvbiBtKHQpe2Zvcih2YXIgZSxyPXQudG9TdHJpbmcoKSxuPS9eXHMrZnVuY3Rpb25ccysoW2EtekEtWl1cdyspXHMqXCgvZ20saT1bXTtlPW4uZXhlYyhyKTspaS5wdXNoKGVbMV0pO2Zvcih2YXIgdCxhPVtdO3Q9aS5wb3AoKTspYS5wdXNoKHQrIjoiK3QpO3JldHVybiJ7XG4iK2Euam9pbigiLFxuIikrIlxufSJ9dmFyIGI9QXJyYXkucHJvdG90eXBlLF89Yi5zbGljZSx3PWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgV2luZG93XSI9PT10aGlzLnRvU3RyaW5nKCl9KCksRT0tMSxDPTAsaz0xLFM9eyJcbiI6IlxcbiIsIlx0IjoiXFx0IiwiXGYiOiJcXGYiLCJcciI6IlxcciIsIiAiOiIgIiwiXFwiOiJcXFxcIiwiXDAiOiJcXDAifTtyZXR1cm57c29ydFVuaXF1ZTpuLGlkVW5pcXVlOnMsaGFzaFVuaXF1ZTphLFNldDp0LHJlcGVhdHM6dixuZWdhdGU6Yyxjb2FsZXNjZTp1LGNsYXNzaWZ5Om8scGFyc2VDaGFyc2V0OmgsY2hyOmwsb3JkOmYscHJlZDpwLHN1Y2M6ZCx0b1ByaW50OmcsZmxhdHRlbjI6eCxsb2c6eSxpc0Jyb3dzZXI6dyxsb2NhbHM6bX19KSwiZnVuY3Rpb24iIT10eXBlb2YgZGVmaW5lKXZhciBkZWZpbmU9cmVxdWlyZSgiYW1kZWZpbmUiKShtb2R1bGUpO2lmKGRlZmluZSgiTkZBIixbIi4vS2l0Il0sZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtlPWUuY29tcGFjdD9jKGUpOmU7dmFyIHMsbz17fSxoPWUudHJhbnMsdT17fTtmb3Iocz0wLG49ZS5hY2NlcHRzLmxlbmd0aDtzPG47cysrKW9bZS5hY2NlcHRzW3NdXT0hMDt2YXIgbDtmb3Iocz0wLG49aC5sZW5ndGg7czxuO3MrKylsPWhbc10sbC5jaGFyc2V0P2wucmFuZ2VzPSJzdHJpbmciPT10eXBlb2YgbC5jaGFyc2V0P3QucGFyc2VDaGFyc2V0KGwuY2hhcnNldCk6bC5jaGFyc2V0OmwuZU1vdmU9ITAsbC5mcm9tLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dVt0XT11W3RdfHx7ZU1vdmVTdGF0ZXM6W10sZU1vdmU6W10sY2hhck1vdmU6e30sdHJhbnM6W10scmFuZ2VzOltdfTtsLmVNb3ZlP2UuZU1vdmVTdGF0ZXM9ZS5lTW92ZVN0YXRlcy5jb25jYXQobC50byk6ZS5yYW5nZXM9ZS5yYW5nZXMuY29uY2F0KGwucmFuZ2VzKSxlLnRyYW5zLnB1c2gobCl9KTtyZXR1cm4gT2JqZWN0LmtleXModSkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj11W2VdLG49ci50cmFucyxpPXIuY2hhck1vdmUsYT1yLmVNb3ZlLHM9ci5yYW5nZXMsbz10LmNsYXNzaWZ5KHMpLGM9by5tYXA7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZU1vdmU/ZS50by5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EucHVzaCh7dG86dCxhY3Rpb246ZS5hY3Rpb24sYXNzZXJ0OmUuYXNzZXJ0LGVNb3ZlOiEwfSl9KTp0LmZsYXR0ZW4yKGUucmFuZ2VzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gY1t0XX0pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpeyhpW3RdPWlbdF18fFtdKS5wdXNoKGUpfSl9KSxzPXQuU2V0KG8ucmFuZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hIXRbMV19KSksci5yYW5nZXM9cyxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWlbdF0scj1bXTtuLmZvckVhY2goZnVuY3Rpb24odCl7dC50by5mb3JFYWNoKGZ1bmN0aW9uKG4peyh0LmVNb3ZlfHx+ZS5pbmRleE9mKHQpKSYmci5wdXNoKHt0bzpuLGFjdGlvbjp0LmFjdGlvbixhc3NlcnQ6dC5hc3NlcnQsZU1vdmU6dC5lTW92ZX0pfSl9KSxpW3RdPXJ9KSxkZWxldGUgci50cmFucyxkZWxldGUgci5lTW92ZVN0YXRlc30pLHthY2NlcHRzOm8scm91dGVyOnUsaW5wdXQ6YSxhc3NlcnRERkE6aSxhY2NlcHQ6cn19ZnVuY3Rpb24gcih0KXtyZXR1cm4gdGhpcy5hY2NlcHRzLmhhc093blByb3BlcnR5KHQpfWZ1bmN0aW9uIGkoKXtmb3IodmFyIGUscj10aGlzLnJvdXRlcixuPU9iamVjdC5rZXlzKHIpLGk9MCxhPW4ubGVuZ3RoO2k8YTtpKyspe2lmKGU9cltuW2ldXSxlLmVNb3ZlLmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcigiREZBIEFzc2VydGlvbiBGYWlsIVxuRnJvbSBzdGF0ZSBgIituW2ldKyJgIGNhbiBnb3RvIHRvIG11bHRpIM61LW1vdmUgc3RhdGVzISIpO2Zvcih2YXIgcz1lLmNoYXJNb3ZlLG89T2JqZWN0LmtleXMocyksYz0wLGg9by5sZW5ndGg7YzxoO2MrKyl7aWYoMSE9PXNbb1tjXV0ubGVuZ3RoKXRocm93IHQubG9nKHMpLG5ldyBFcnJvcigiREZBIEFzc2VydGlvbiBGYWlsIVxuRnJvbSBzdGF0ZSBgIituW2ldKyJgIHZpYSBjaGFyc2V0IGAiK29bY10rImAgY2FuIGdvdG8gdG8gbXVsdGkgc3RhdGVzISIpfWlmKG8ubGVuZ3RoJiZlLmVNb3ZlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRGQSBBc3NlcnRpb24gRmFpbCFcbkZyb20gc3RhdGUgYCIrbltpXSsiYCBjYW4gZ290byBleHRyYSDOtS1tb3ZlIHN0YXRlISIpfXJldHVybiEwfWZ1bmN0aW9uIGEoZSxyLG4pe2Z1bmN0aW9uIGkoZSxyLG8sYyxoKXt0OmZvcig7Oyl7dmFyIHUsbCxmLHAsZD1hLnJvdXRlcltvXTtpZighZClicmVhazt2YXIgZyx4PWQuZU1vdmUsdj1kLmNoYXJNb3ZlO3I8ZS5sZW5ndGg/KHU9ZVtyXSxnPXYuaGFzT3duUHJvcGVydHkodSk/dlt1XToobD1zKGQucmFuZ2VzLHUpKT92W2xdOngpOmc9eDtmb3IodmFyIHksbSxiLF89Yy5sZW5ndGgsdz1oLEU9MCxDPWcubGVuZ3RoO0U8QztFKyspe2lmKHk9Z1tFXSxmPXkuZU1vdmU/MDoxLGg9dyxjLnNwbGljZSgwLGMubGVuZ3RoLV8pLF89Yy5sZW5ndGgseS5hc3NlcnQpe2lmKCExPT09KG09eS5hc3NlcnQoYyx1LHIsbyxlKSkpY29udGludWU7Im51bWJlciI9PXR5cGVvZiBtJiYocis9bSxoKz1tKX1pZih5LmFjdGlvbiYmKGM9eS5hY3Rpb24oYyx1LHIsbyxlKXx8YyksaD15LmVNb3ZlP2g6cixuJiZ0LmxvZyh1KyI6IitvKyI+Iit5LnRvKSxFPT09Qy0xKXtyKz1mLG89eS50bztjb250aW51ZSB0fWlmKGI9aShlLHIrZix5LnRvLGMsaCksYi5hY2NlcHRhYmxlKXJldHVybiBiO3A9Yn1pZihwKXJldHVybiBwO2JyZWFrfXJldHVybntzdGFjazpjLGxhc3RJbmRleDpoLGxhc3RTdGF0ZTpvLGFjY2VwdGFibGU6YS5hY2NlcHQobyl9fXI9cnx8MDt2YXIgYT10aGlzO3JldHVybiBpKGUsciwic3RhcnQiLFtdLHItMSl9ZnVuY3Rpb24gcyh0LGUpe3ZhciByPXQuaW5kZXhPZihlLG8pO3JldHVybiEhfnImJnRbcl19ZnVuY3Rpb24gbyh0LGUpe3ZhciByPWVbMF07cmV0dXJuIHQ+ZVsxXT8xOnQ8cj8tMTowfWZ1bmN0aW9uIGModCl7dC5hY2NlcHRzPXQuYWNjZXB0cy5zcGxpdCgiLCIpO2Zvcih2YXIgZSxyLG4saSxhPXQudHJhbnMscz1hLmxlbmd0aDtzLS07KWU9YVtzXSxyPWVbMF0uc3BsaXQoIj4iKSxuPXJbMF0uc3BsaXQoIiwiKSxpPXJbMV0uc3BsaXQoIiwiKSxhW3NdPXtmcm9tOm4sdG86aSxjaGFyc2V0OmVbMV0sYWN0aW9uOmVbMl0sYXNzZXJ0OmVbM119O3JldHVybiB0LmNvbXBhY3Q9ITEsdH1yZXR1cm4gZX0pLCJmdW5jdGlvbiIhPXR5cGVvZiBkZWZpbmUpdmFyIGRlZmluZT1yZXF1aXJlKCJhbWRlZmluZSIpKG1vZHVsZSk7aWYoZGVmaW5lKCJwYXJzZSIsWyIuL05GQSIsIi4vS2l0Il0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dmFyIHQ9T2JqZWN0LmtleXMocCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0KyI9IitKU09OLnN0cmluZ2lmeShwW3RdKX0pLmpvaW4oIjsiKTsoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKCkuZXZhbCh0KX1mdW5jdGlvbiBuKHQpe3RoaXMucmF3PXQucmF3LHRoaXMudHJlZT10LnRyZWUsdGhpcy5ncm91cENvdW50PXQuZ3JvdXBDb3VudH1mdW5jdGlvbiBpKHQsZSl7ZD1lO3ZhciByLGkscyxwPWEoKTtyPXAuaW5wdXQodCwwLGUpLGk9ci5zdGFjayxpPXYuZW5kQ2hvaWNlKGkpLHM9ci5sYXN0U3RhdGU7dmFyIGc9ci5hY2NlcHRhYmxlJiZyLmxhc3RJbmRleD09PXQubGVuZ3RoLTE7aWYoIWcpe3ZhciB4O3N3aXRjaChzKXtjYXNlImNoYXJzZXRSYW5nZUVuZFdpdGhOdWxsQ2hhciI6eD17dHlwZToiQ2hhcnNldFJhbmdlRW5kV2l0aE51bGxDaGFyIixtZXNzYWdlOiJDaGFyc2V0IHJhbmdlIGVuZCB3aXRoIE5VTCBjaGFyIGRvZXMgbm90IG1ha2Ugc2Vuc2UhXG5CZWNhdXNlIFthLVxcMF0gaXMgbm90IGEgdmFsaWQgcmFuZ2UuXG5BbmQgW1xcMC1cXDBdIHNob3VsZCBiZSByZXdyaXR0ZW4gaW50byBbXFwwXS4ifTticmVhaztjYXNlInJlcGVhdEVycm9yRmluYWwiOng9e3R5cGU6Ik5vdGhpbmdSZXBlYXQiLG1lc3NhZ2U6Ik5vdGhpbmcgdG8gcmVwZWF0ISJ9O2JyZWFrO2Nhc2UiZGlnaXRGb2xsb3dOdWxsRXJyb3IiOng9e3R5cGU6IkRpZ2l0Rm9sbG93TnVsbEVycm9yIixtZXNzYWdlOiJUaGUgJ1xcMCcgcmVwcmVzZW50cyB0aGUgPE5VTD4gY2hhciBhbmQgY2Fubm90IGJlIGZvbGxvd2VkIGJ5IGEgZGVjaW1hbCBkaWdpdCEifTticmVhaztjYXNlImNoYXJzZXRSYW5nZUVuZENsYXNzIjp4PXt0eXBlOiJDaGFyc2V0UmFuZ2VFbmRDbGFzcyIsbWVzc2FnZTonQ2hhcnNldCByYW5nZSBlbmRzIHdpdGggY2xhc3Mgc3VjaCBhcyAiXFx3XFxXXFxkXFxEXFxzXFxTIiBpcyBpbnZhbGlkISd9O2JyZWFrO2Nhc2UiY2hhcnNldE9jdEVzY2FwZSI6eD17dHlwZToiRGVjaW1hbEVzY2FwZSIsbWVzc2FnZToiRGVjaW1hbCBlc2NhcGUgYXBwZWFycyBpbiBjaGFyc2V0IGlzIGludmFsaWQuQmVjYXVzZSBpdCBjYW4ndCBiZSBleHBsYWluZWQgYXMgIGJhY2tyZWZlcmVuY2UuQW5kIG9jdGFsIGVzY2FwZSBpcyBkZXByZWNhdGVkISJ9O2JyZWFrO2RlZmF1bHQ6MD09PXMuaW5kZXhPZigiY2hhcnNldCIpP3g9e3R5cGU6IlVuY2xvc2VkQ2hhcnNldCIsbWVzc2FnZToiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzcyEifToiKSI9PT10W3IubGFzdEluZGV4XT94PXt0eXBlOiJVbm1hdGNoZWRQYXJlbiIsbWVzc2FnZToiVW5tYXRjaGVkIGVuZCBwYXJlbnRoZXNpcyEifTooeD17dHlwZToiVW5leHBlY3RlZENoYXIiLG1lc3NhZ2U6IlVuZXhwZWN0ZWQgY2hhciEifSxyLmxhc3RJbmRleCsrKX1pZih4KXRocm93IHgubGFzdEluZGV4PXIubGFzdEluZGV4LHguYXN0U3RhY2s9ci5zdGFjayx4Lmxhc3RTdGF0ZT1zLG5ldyBmKHgpfWlmKGkuX3BhcmVudEdyb3VwKXRocm93IG5ldyBmKHt0eXBlOiJVbnRlcm1pbmF0ZWRHcm91cCIsbWVzc2FnZToiVW50ZXJtaW5hdGVkIGdyb3VwISIsbGFzdEluZGV4OmkuX3BhcmVudEdyb3VwLmluZGljZXNbMF0sbGFzdFN0YXRlOnMsYXN0U3RhY2s6aX0pO2lmKGcpe3ZhciB5PWkuZ3JvdXBDb3VudGVyP2kuZ3JvdXBDb3VudGVyLmk6MDtkZWxldGUgaS5ncm91cENvdW50ZXIsaChpLHQsdC5sZW5ndGgpLGk9byhpKTt2YXIgbT1uZXcgbih7cmF3OnQsZ3JvdXBDb3VudDp5LHRyZWU6aX0pO3JldHVybiBtLnRyYXZlcnNlKGwsQ0hBUlNFVF9OT0RFKSxtLnRyYXZlcnNlKHUsQVNTRVJUX05PREUpLGMoaSksZD0hMSxtfX1mdW5jdGlvbiBhKCl7cmV0dXJuIGd8fChnPXQoRSxkKSksZ31mdW5jdGlvbiBzKHQsZSxyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpyLGVudW1lcmFibGU6ZCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiBvKHQpe3JldHVybiB0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT1FWEFDVF9OT0RFJiZ0LmNvbmNhdFRlbXA/KGRlbGV0ZSB0LmNvbmNhdFRlbXAsISF0LmNoYXJzKToodC5zdWI/dC5zdWI9byh0LnN1Yik6dC5icmFuY2hlcyYmKHQuYnJhbmNoZXM9dC5icmFuY2hlcy5tYXAobykpLCEwKX0pfWZ1bmN0aW9uIGModCl7ZnVuY3Rpb24gZSh0KXt0LnN1Yj9jKHQuc3ViKTp0LmJyYW5jaGVzJiZ0LmJyYW5jaGVzLm1hcChjKX12YXIgcj10WzBdO2Uocik7Zm9yKHZhciBuLGk9MSxhPTEscz10Lmxlbmd0aDtpPHM7aSsrKXtpZihuPXRbaV0sbi50eXBlPT09RVhBQ1RfTk9ERSl7aWYoci50eXBlPT09RVhBQ1RfTk9ERSYmIXIucmVwZWF0JiYhbi5yZXBlYXQpe3IuaW5kaWNlc1sxXT1uLmluZGljZXNbMV0sci5yYXcrPW4ucmF3LHIuY2hhcnMrPW4uY2hhcnM7Y29udGludWV9fWVsc2UgZShuKTt0W2ErK109bixyPW59ciYmKHQubGVuZ3RoPWEpfWZ1bmN0aW9uIGgodCxlLHIpe2lmKCF0Lmxlbmd0aClyZXR1cm4gdm9pZCB0LnB1c2goe3R5cGU6RU1QVFlfTk9ERSxpbmRpY2VzOltyLHJdfSk7dC5yZWR1Y2UoZnVuY3Rpb24odCxyKXtyZXR1cm4gci5pbmRpY2VzLnB1c2godCksci5yYXc9ZS5zbGljZShyLmluZGljZXNbMF0sdCksci50eXBlPT09R1JPVVBfTk9ERXx8ci50eXBlPT09QVNTRVJUX05PREUmJnIuc3ViP2goci5zdWIsZSxyLmVuZFBhcmVuSW5kZXgpOnIudHlwZT09PUNIT0lDRV9OT0RFPyhyLmJyYW5jaGVzLnJlZHVjZShmdW5jdGlvbih0LHIpe2gocixlLHQpO3ZhciBuPXJbMF07cmV0dXJuKG4/bi5pbmRpY2VzWzBdOnQpLTF9LHQpLHIuYnJhbmNoZXMucmV2ZXJzZSgpKTpyLnR5cGU9PT1FWEFDVF9OT0RFJiYoci5jb25jYXRUZW1wfHwoci5jaGFycz1yLmNoYXJzfHxyLnJhdykpLHIuaW5kaWNlc1swXX0sciksdC5yZXZlcnNlKCl9ZnVuY3Rpb24gdSh0KXtpZih0LnJlcGVhdCl7dmFyIGU9dC5hc3NlcnRpb25UeXBlLHI9Ik5vdGhpbmcgdG8gcmVwZWF0ISBSZXBlYXQgYWZ0ZXIgYXNzZXJ0aW9uIGRvZXNuJ3QgbWFrZSBzZW5zZSEiO2lmKCJBc3NlcnRMb29rYWhlYWQiPT09ZXx8IkFzc2VydE5lZ2F0aXZlTG9va2FoZWFkIj09PWUpe3ZhciBuPSJBc3NlcnRMb29rYWhlYWQiPT09ZT8iPz0iOiI/ISIsaT0iKCIrbisiYikiO3IrPSJcbi9hIitpKyIrL+OAgS9hIitpKyJ7MSxufS8gYXJlIHRoZSBzYW1lIGFzIC9hIitpKyIv44CCXG4vYSIraSsiKi/jgIEvYSIraSsiezAsbn0v44CBL2EiK2krIj8vIGFyZSB0aGUgc2FtZSBhcyAvYS/jgIIifXRocm93IG5ldyBmKHt0eXBlOiJOb3RoaW5nUmVwZWF0IixsYXN0SW5kZXg6dC5pbmRpY2VzWzFdLTEsbWVzc2FnZTpyfSl9fWZ1bmN0aW9uIGwodCl7dC5yYW5nZXM9ZS5zb3J0VW5pcXVlKHQucmFuZ2VzLm1hcChmdW5jdGlvbih0KXtpZih0WzBdPnRbMV0pdGhyb3cgbmV3IGYoe3R5cGU6Ik91dE9mT3JkZXIiLGxhc3RJbmRleDp0Lmxhc3RJbmRleCxtZXNzYWdlOiJSYW5nZSBbIit0LmpvaW4oIi0iKSsiXSBvdXQgb2Ygb3JkZXIgaW4gY2hhcmFjdGVyIGNsYXNzISJ9KTtyZXR1cm4gdC5qb2luKCIiKX0pKX1mdW5jdGlvbiBmKHQpe3RoaXMubmFtZT0iUmVnZXhTeW50YXhFcnJvciIsdGhpcy50eXBlPXQudHlwZSx0aGlzLmxhc3RJbmRleD10Lmxhc3RJbmRleCx0aGlzLmxhc3RTdGF0ZT10Lmxhc3RTdGF0ZSx0aGlzLmFzdFN0YWNrPXQuYXN0U3RhY2ssdGhpcy5tZXNzYWdlPXQubWVzc2FnZSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhY2siLHt2YWx1ZTpuZXcgRXJyb3IodC5tZXNzYWdlKS5zdGFjayxlbnVtZXJhYmxlOiExfSl9dmFyIHA9e0VYQUNUX05PREU6ImV4YWN0IixDSEFSU0VUX05PREU6ImNoYXJzZXQiLENIT0lDRV9OT0RFOiJjaG9pY2UiLEdST1VQX05PREU6Imdyb3VwIixBU1NFUlRfTk9ERToiYXNzZXJ0IixET1RfTk9ERToiZG90IixCQUNLUkVGX05PREU6ImJhY2tyZWYiLEVNUFRZX05PREU6ImVtcHR5IixBc3NlcnRMb29rYWhlYWQ6IkFzc2VydExvb2thaGVhZCIsQXNzZXJ0TmVnYXRpdmVMb29rYWhlYWQ6IkFzc2VydE5lZ2F0aXZlTG9va2FoZWFkIixBc3NlcnROb25Xb3JkQm91bmRhcnk6IkFzc2VydE5vbldvcmRCb3VuZGFyeSIsQXNzZXJ0V29yZEJvdW5kYXJ5OiJBc3NlcnRXb3JkQm91bmRhcnkiLEFzc2VydEVuZDoiQXNzZXJ0RW5kIixBc3NlcnRCZWdpbjoiQXNzZXJ0QmVnaW4ifTtyKCksbi5wcm90b3R5cGUudHJhdmVyc2U9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQsbil7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UmJnQudHlwZSE9PWV8fG4odCksdC5zdWI/cih0LnN1YixuKTp0LmJyYW5jaGVzJiZ0LmJyYW5jaGVzLmZvckVhY2goZnVuY3Rpb24odCl7cih0LG4pfSl9KX1yKHRoaXMudHJlZSx0KX07dmFyIGQ7aS5Db25zdGFudHM9cCxpLmV4cG9ydENvbnN0YW50cz1yLGkuUmVnZXhTeW50YXhFcnJvcj1mLGkuZ2V0TkZBUGFyc2VyPWE7dmFyIGc7Zi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lKyIgIit0aGlzLnR5cGUrIjoiK3RoaXMubWVzc2FnZX07dmFyIHg9e246IlxuIixyOiJcciIsdDoiXHQiLHY6Ilx2IixmOiJcZiJ9LHY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxyKXt2YXIgbj10WzBdOyghbnx8bi50eXBlIT1FWEFDVF9OT0RFfHxuLnJlcGVhdHx8bi5jaGFycyYmIW4uY29uY2F0VGVtcCkmJnQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGluZGljZXM6W3JdfSksbiYmbi5jb25jYXRUZW1wJiYobi5jaGFycys9ZSl9ZnVuY3Rpb24gZSh0LGUscil7dC51bnNoaWZ0KHt0eXBlOkRPVF9OT0RFLGluZGljZXM6W3JdfSl9ZnVuY3Rpb24gcih0LGUscil7dC51bnNoaWZ0KHt0eXBlOkVYQUNUX05PREUsY2hhcnM6IlwwIixpbmRpY2VzOltyLTFdfSl9ZnVuY3Rpb24gbih0LGUscil7dC51bnNoaWZ0KHt0eXBlOkFTU0VSVF9OT0RFLGluZGljZXM6W3JdLGFzc2VydGlvblR5cGU6QXNzZXJ0QmVnaW59KX1mdW5jdGlvbiBpKHQsZSxyLG4saSl7dC51bnNoaWZ0KHt0eXBlOkFTU0VSVF9OT0RFLGluZGljZXM6W3JdLGFzc2VydGlvblR5cGU6QXNzZXJ0RW5kfSl9ZnVuY3Rpb24gYSh0LGUscil7dC51bnNoaWZ0KHt0eXBlOkFTU0VSVF9OT0RFLGluZGljZXM6W3ItMV0sYXNzZXJ0aW9uVHlwZToiYiI9PWU/QXNzZXJ0V29yZEJvdW5kYXJ5OkFzc2VydE5vbldvcmRCb3VuZGFyeX0pfWZ1bmN0aW9uIG8odCxlLHIpe3RbMF0udHlwZSE9PUVYQUNUX05PREUmJnQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGluZGljZXM6W3JdfSl9ZnVuY3Rpb24gYyh0LGUscil7cyh0WzBdLCJfY29tbWFJbmRleCIscil9ZnVuY3Rpb24gaCh0LGUscixuLGkpe3ZhciBhLHM9dFswXSxvPWkubGFzdEluZGV4T2YoInsiLHIpLGM9cGFyc2VJbnQoaS5zbGljZShvKzEscy5fY29tbWFJbmRleHx8ciksMTApO2lmKHMuX2NvbW1hSW5kZXgpe2lmKChhPXMuX2NvbW1hSW5kZXgrMT09cj8xLzA6cGFyc2VJbnQoaS5zbGljZShzLl9jb21tYUluZGV4KzEsciksMTApKTxjKXRocm93IG5ldyBmKHt0eXBlOiJPdXRPZk9yZGVyIixsYXN0U3RhdGU6bixsYXN0SW5kZXg6cixhc3RTdGFjazp0LG1lc3NhZ2U6Ik51bWJlcnMgb3V0IG9mIG9yZGVyIGluIHt9IHF1YW50aWZpZXIhIn0pO2RlbGV0ZSBzLl9jb21tYUluZGV4fWVsc2UgYT1jO3MuaW5kaWNlc1swXT49byYmdC5zaGlmdCgpLGQodCxjLGEsbyxpKX1mdW5jdGlvbiB1KHQsZSxyLG4saSl7ZCh0LDAsMS8wLHIsaSl9ZnVuY3Rpb24gbCh0LGUscixuLGkpe2QodCwwLDEscixpKX1mdW5jdGlvbiBwKHQsZSxyLG4saSl7ZCh0LDEsMS8wLHIsaSl9ZnVuY3Rpb24gZCh0LGUscixuLGkpe3ZhciBhPXRbMF0sbz17bWluOmUsbWF4OnIsbm9uR3JlZWR5OiExfSxjPW4tMTtpZihhLmNoYXJzJiYxPT09YS5jaGFycy5sZW5ndGgmJihjPWEuaW5kaWNlc1swXSksYS50eXBlPT09RVhBQ1RfTk9ERSl7dmFyIGg9e3R5cGU6RVhBQ1RfTk9ERSxyZXBlYXQ6byxjaGFyczphLmNoYXJzP2EuY2hhcnM6aVtjXSxpbmRpY2VzOltjXX07YS5pbmRpY2VzWzBdPT09YyYmdC5zaGlmdCgpLHQudW5zaGlmdChoKX1lbHNlIGEucmVwZWF0PW87cyhvLCJiZWdpbkluZGV4IixuLXRbMF0uaW5kaWNlc1swXSl9ZnVuY3Rpb24gZyh0KXt0WzBdLnJlcGVhdC5ub25HcmVlZHk9ITB9ZnVuY3Rpb24gdih0LGUscil7dC51bnNoaWZ0KHtjb25jYXRUZW1wOiEwLHR5cGU6RVhBQ1RfTk9ERSxjaGFyczoiIixpbmRpY2VzOltyXX0pfWZ1bmN0aW9uIHkodCxlLHIpe3guaGFzT3duUHJvcGVydHkoZSkmJihlPXhbZV0pLHQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGNoYXJzOmUsaW5kaWNlczpbci0xXX0pfWZ1bmN0aW9uIG0odCxlLHIpe3QudW5zaGlmdCh7dHlwZTpDSEFSU0VUX05PREUsaW5kaWNlczpbci0xXSxjaGFyczoiIixyYW5nZXM6W10sY2xhc3NlczpbZV0sZXhjbHVkZTohMX0pfWZ1bmN0aW9uIGIodCxlLHIsbixpKXtlPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaVtyLTFdK2UsMTYpKSx0LnNoaWZ0KCksdC51bnNoaWZ0KHt0eXBlOkVYQUNUX05PREUsY2hhcnM6ZSxpbmRpY2VzOltyLTNdfSl9ZnVuY3Rpb24gXyh0LGUscixuLGkpe2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChpLnNsaWNlKHItMyxyKzEpLDE2KSksdC5zaGlmdCgpLHQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGNoYXJzOmUsaW5kaWNlczpbci01XX0pfWZ1bmN0aW9uIHcodCxlLHIpe3ZhciBuPXQuZ3JvdXBDb3VudGVyPXQuZ3JvdXBDb3VudGVyfHx7aTowfTtuLmkrKzt2YXIgaT17dHlwZTpHUk9VUF9OT0RFLG51bTpuLmksc3ViOltdLGluZGljZXM6W3JdLF9wYXJlbnRTdGFjazp0fTtyZXR1cm4gdD1pLnN1YixzKHQsIl9wYXJlbnRHcm91cCIsaSksdC5ncm91cENvdW50ZXI9bix0fWZ1bmN0aW9uIEUodCl7dmFyIGU9dC5fcGFyZW50R3JvdXA7ZS5ub25DYXB0dXJlPSEwLGUubnVtPXZvaWQgMCx0Lmdyb3VwQ291bnRlci5pLS19ZnVuY3Rpb24gQyh0LGUscil7dmFyIG49dC5fcGFyZW50R3JvdXA7bi50eXBlPUFTU0VSVF9OT0RFLG4uYXNzZXJ0aW9uVHlwZT0iPSI9PWU/QXNzZXJ0TG9va2FoZWFkOkFzc2VydE5lZ2F0aXZlTG9va2FoZWFkLG4ubnVtPXZvaWQgMCx0Lmdyb3VwQ291bnRlci5pLS19ZnVuY3Rpb24gayh0LGUscixuLGkpe3Q9QSh0KTt2YXIgYT10Ll9wYXJlbnRHcm91cDtpZighYSl0aHJvdyBuZXcgZih7dHlwZToiVW5leHBlY3RlZENoYXIiLGxhc3RJbmRleDpyLGxhc3RTdGF0ZTpuLGFzdFN0YWNrOnQsbWVzc2FnZToiVW5leHBlY3RlZCBlbmQgcGFyZW50aGVzaXMhIn0pO3JldHVybiBkZWxldGUgdC5fcGFyZW50R3JvdXAsZGVsZXRlIHQuZ3JvdXBDb3VudGVyLHQ9YS5fcGFyZW50U3RhY2ssZGVsZXRlIGEuX3BhcmVudFN0YWNrLHQudW5zaGlmdChhKSxhLmVuZFBhcmVuSW5kZXg9cix0fWZ1bmN0aW9uIFModCxlLHIpe3ZhciBuLGk9W107aWYodC5fcGFyZW50Q2hvaWNlKW49dC5fcGFyZW50Q2hvaWNlLG4uYnJhbmNoZXMudW5zaGlmdChpKSxzKGksIl9wYXJlbnRDaG9pY2UiLG4pLHMoaSwiX3BhcmVudEdyb3VwIixuKSxpLmdyb3VwQ291bnRlcj10Lmdyb3VwQ291bnRlcixkZWxldGUgdC5fcGFyZW50Q2hvaWNlLGRlbGV0ZSB0Lmdyb3VwQ291bnRlcjtlbHNle3ZhciBhPXRbdC5sZW5ndGgtMV07bj17dHlwZTpDSE9JQ0VfTk9ERSxpbmRpY2VzOlthP2EuaW5kaWNlc1swXTpyLTFdLGJyYW5jaGVzOltdfSxzKG4sIl9wYXJlbnRTdGFjayIsdCksbi5icmFuY2hlcy51bnNoaWZ0KHQuc2xpY2UoKSksdC5sZW5ndGg9MCx0LnVuc2hpZnQobiksaS5ncm91cENvdW50ZXI9dC5ncm91cENvdW50ZXIscyhpLCJfcGFyZW50Q2hvaWNlIixuKSxzKGksIl9wYXJlbnRHcm91cCIsbiksbi5icmFuY2hlcy51bnNoaWZ0KGkpfXJldHVybiBpfWZ1bmN0aW9uIEEodCl7aWYodC5fcGFyZW50Q2hvaWNlKXt2YXIgZT10Ll9wYXJlbnRDaG9pY2U7ZGVsZXRlIHQuX3BhcmVudENob2ljZSxkZWxldGUgdC5fcGFyZW50R3JvdXAsZGVsZXRlIHQuZ3JvdXBDb3VudGVyO3ZhciByPWUuX3BhcmVudFN0YWNrO3JldHVybiBkZWxldGUgZS5fcGFyZW50U3RhY2sscn1yZXR1cm4gdH1mdW5jdGlvbiBCKHQsZSxyKXt0LnVuc2hpZnQoe3R5cGU6Q0hBUlNFVF9OT0RFLGluZGljZXM6W3JdLGNsYXNzZXM6W10scmFuZ2VzOltdLGNoYXJzOiIifSl9ZnVuY3Rpb24gTih0KXt0WzBdLmV4Y2x1ZGU9ITB9ZnVuY3Rpb24gTyh0LGUscil7dFswXS5jaGFycys9ZX1mdW5jdGlvbiBUKHQsZSxyKXt4Lmhhc093blByb3BlcnR5KGUpJiYoZT14W2VdKSx0WzBdLmNoYXJzKz1lfWZ1bmN0aW9uIFIodCxlLHIpe3RbMF0uY2hhcnMrPSJcMCJ9ZnVuY3Rpb24gSSh0LGUpe3RbMF0uY2xhc3Nlcy5wdXNoKGUpfWZ1bmN0aW9uIE0odCxlLHIsbixpKXt2YXIgYT10WzBdO2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChhLmNoYXJzLnNsaWNlKC0xKStlLDE2KSksYS5jaGFycz1hLmNoYXJzLnNsaWNlKDAsLTIpLGEuY2hhcnMrPWV9ZnVuY3Rpb24gRih0LGUscixuLGkpe3ZhciBhPXRbMF07ZT1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGEuY2hhcnMuc2xpY2UoLTMpK2UsMTYpKSxhLmNoYXJzPWEuY2hhcnMuc2xpY2UoMCwtNCksYS5jaGFycys9ZX1mdW5jdGlvbiBEKHQsZSxyLG4saSl7dmFyIGE9dFswXSxzPWEuY2hhcnMuc2xpY2UoLTIpO3M9W3NbMF0sZV0scy5sYXN0SW5kZXg9cixhLnJhbmdlcy5wdXNoKHMpLGEuY2hhcnM9YS5jaGFycy5zbGljZSgwLC0yKX1mdW5jdGlvbiBQKHQsZSl7eC5oYXNPd25Qcm9wZXJ0eShlKSYmKGU9eFtlXSksRC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gTCh0LGUscil7dmFyIG49dFswXSxpPW4uY2hhcnMuc2xpY2UoLTMpK2U7bi5jaGFycz1uLmNoYXJzLnNsaWNlKDAsLTMpO3ZhciBhPW4ucmFuZ2VzLnBvcCgpO2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChpLDE2KSksYT1bYVswXSxlXSxhLmxhc3RJbmRleD1yLG4ucmFuZ2VzLnB1c2goYSl9ZnVuY3Rpb24geih0LGUscil7dmFyIG49dFswXSxpPW4uY2hhcnMuc2xpY2UoLTEpK2U7bi5jaGFycz1uLmNoYXJzLnNsaWNlKDAsLTEpO3ZhciBhPW4ucmFuZ2VzLnBvcCgpO2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChpLDE2KSksYT1bYVswXSxlXSxhLmxhc3RJbmRleD1yLG4ucmFuZ2VzLnB1c2goYSl9ZnVuY3Rpb24gaih0LGUscixuKXtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuISFlLl9wYXJlbnRHcm91cCYmKGUuX3BhcmVudEdyb3VwLm51bT09dD90OmkodCxlLl9wYXJlbnRHcm91cC5fcGFyZW50U3RhY2spKX12YXIgYT10WzBdLHM9cGFyc2VJbnQoZSwxMCksbz0iZXNjYXBlIj09PW4sYz10Lmdyb3VwQ291bnRlcixoPWMmJmMuaXx8MDtpZihvPyhhPXt0eXBlOkJBQ0tSRUZfTk9ERSxpbmRpY2VzOltyLTFdfSx0LnVuc2hpZnQoYSkpOnM9cGFyc2VJbnQoYS5udW0rIiIrcywxMCkscz5oKXRocm93IG5ldyBmKHt0eXBlOiJJbnZhbGlkQmFja1JlZmVyZW5jZSIsbGFzdEluZGV4OnIsYXN0U3RhY2s6dCxsYXN0U3RhdGU6bixtZXNzYWdlOiJCYWNrIHJlZmVyZW5jZSBudW1iZXIoIitzKyIpIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGdyb3VwcyBjb3VudCgiK2grIikuIn0pO2lmKGkocyx0KSl0aHJvdyBuZXcgZih7dHlwZToiSW52YWxpZEJhY2tSZWZlcmVuY2UiLGxhc3RJbmRleDpyLGFzdFN0YWNrOnQsbGFzdFN0YXRlOm4sbWVzc2FnZToiUmVjdXJzaXZlIGJhY2sgcmVmZXJlbmNlIGluIGdyb3VwICgiK3MrIikgaXRzZWxmLiJ9KTthLm51bT1zfXJldHVybntlc2NhcGVTdGFydDp2LGV4YWN0OnQsZG90OmUsbnVsbENoYXI6cixhc3NlcnRCZWdpbjpuLGFzc2VydEVuZDppLGFzc2VydFdvcmRCb3VuZGFyeTphLHJlcGVhdG5TdGFydDpvLHJlcGVhdG5Db21tYTpjLHJlcGVhdE5vbkdyZWVkeTpnLHJlcGVhdG5FbmQ6aCxyZXBlYXQxOnAscmVwZWF0MDE6bCxyZXBlYXQwOnUsY2hhckNsYXNzRXNjYXBlOm0sbm9ybWFsRXNjYXBlOnksdW5pY29kZUVzY2FwZTpfLGhleEVzY2FwZTpiLGNoYXJDbGFzc0VzY2FwZTptLGdyb3VwU3RhcnQ6dyxncm91cE5vbkNhcHR1cmU6RSxiYWNrcmVmOmosZ3JvdXBUb0Fzc2VydGlvbjpDLGdyb3VwRW5kOmssY2hvaWNlOlMsZW5kQ2hvaWNlOkEsY2hhcnNldFN0YXJ0OkIsY2hhcnNldEV4Y2x1ZGU6TixjaGFyc2V0Q29udGVudDpPLGNoYXJzZXROdWxsQ2hhcjpSLGNoYXJzZXRDbGFzc0VzY2FwZTpJLGNoYXJzZXRIZXhFc2NhcGU6TSxjaGFyc2V0VW5pY29kZUVzY2FwZTpGLGNoYXJzZXRSYW5nZUVuZDpELGNoYXJzZXROb3JtYWxFc2NhcGU6VCxjaGFyc2V0UmFuZ2VFbmROb3JtYWxFc2NhcGU6UCxjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlOkwsY2hhcnNldFJhbmdlRW5kSGV4RXNjYXBlOnp9fSgpLHk9IjAtOWEtZkEtRiIsbT0icmVwZWF0blN0YXJ0LHJlcGVhdG5fMSxyZXBlYXRuXzIscmVwZWF0bkVycm9yU3RhcnQscmVwZWF0bkVycm9yXzEscmVwZWF0bkVycm9yXzIiLGI9ImhleEVzY2FwZTEsaGV4RXNjYXBlMiIsXz0idW5pY29kZUVzY2FwZTEsdW5pY29kZUVzY2FwZTIsdW5pY29kZUVzY2FwZTMsdW5pY29kZUVzY2FwZTQiLHc9ImNoYXJzZXRVbmljb2RlRXNjYXBlMSxjaGFyc2V0VW5pY29kZUVzY2FwZTIsY2hhcnNldFVuaWNvZGVFc2NhcGUzLGNoYXJzZXRVbmljb2RlRXNjYXBlNCxjaGFyc2V0SGV4RXNjYXBlMSxjaGFyc2V0SGV4RXNjYXBlMiIsRT17Y29tcGFjdDohMCxhY2NlcHRzOiJzdGFydCxiZWdpbixlbmQscmVwZWF0MCxyZXBlYXQxLGV4YWN0LHJlcGVhdG4scmVwZWF0MDEscmVwZWF0Tm9uR3JlZWR5LGNob2ljZSwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiLHRyYW5zOltbInN0YXJ0LGJlZ2luLGVuZCxleGFjdCxyZXBlYXROb25HcmVlZHkscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxjaG9pY2UscmVwZWF0bj5leGFjdCIsIl4rKj9eJC58KCl7W1xcIix2LmV4YWN0XSxbImhleEVzY2FwZTEsaGV4RXNjYXBlMix1bmljb2RlRXNjYXBlMSx1bmljb2RlRXNjYXBlMix1bmljb2RlRXNjYXBlMyx1bmljb2RlRXNjYXBlND5leGFjdCIsIl4rKj9eJC58KCl7W1xcMC05YS1mQS1GIix2LmV4YWN0XSxbIm51bGxDaGFyPmV4YWN0IiwiXisqP14kLnwoKXtbXFwwLTkiLHYuZXhhY3RdLFttKyIsbnVsbENoYXIsZGlnaXRCYWNrcmVmLCIrXysiLCIrYisiLHN0YXJ0LGJlZ2luLGVuZCxleGFjdCxyZXBlYXROb25HcmVlZHkscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxjaG9pY2UscmVwZWF0bj5leGFjdCIsIi4iLHYuZG90XSxbInN0YXJ0LGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxlbmQsYmVnaW4sZXhhY3QscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLHJlcGVhdG4scmVwZWF0Tm9uR3JlZWR5LGNob2ljZSwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+YmVnaW4iLCJeIix2LmFzc2VydEJlZ2luXSxbbSsiLG51bGxDaGFyLGRpZ2l0QmFja3JlZiwiK18rIiwiK2IrIixleGFjdD5yZXBlYXRuU3RhcnQiLCJ7Iix2LnJlcGVhdG5TdGFydF0sWyJzdGFydCxiZWdpbixlbmQsZ3JvdXBRdWFsaWZpZWRTdGFydCxncm91cFN0YXJ0LHJlcGVhdDAscmVwZWF0MSxyZXBlYXRuLHJlcGVhdDAxLHJlcGVhdE5vbkdyZWVkeSxjaG9pY2U+cmVwZWF0bkVycm9yU3RhcnQiLCJ7Iix2LmV4YWN0XSxbInJlcGVhdG5TdGFydD5yZXBlYXRuXzEiLCIwLTkiLHYuZXhhY3RdLFsicmVwZWF0bl8xPnJlcGVhdG5fMSIsIjAtOSIsdi5leGFjdF0sWyJyZXBlYXRuXzE+cmVwZWF0bl8yIiwiLCIsdi5yZXBlYXRuQ29tbWFdLFsicmVwZWF0bl8yPnJlcGVhdG5fMiIsIjAtOSIsdi5leGFjdF0sWyJyZXBlYXRuXzEscmVwZWF0bl8yPnJlcGVhdG4iLCJ9Iix2LnJlcGVhdG5FbmRdLFsicmVwZWF0blN0YXJ0LHJlcGVhdG5FcnJvclN0YXJ0PmV4YWN0IiwifSIsdi5leGFjdF0sWyJyZXBlYXRuU3RhcnQscmVwZWF0bkVycm9yU3RhcnQ+ZXhhY3QiLCJeKyo/XiQufCgpe1tcXDAtOX0iLHYuZXhhY3RdLFsicmVwZWF0bkVycm9yU3RhcnQ+cmVwZWF0bkVycm9yXzEiLCIwLTkiLHYuZXhhY3RdLFsicmVwZWF0bkVycm9yXzE+cmVwZWF0bkVycm9yXzEiLCIwLTkiLHYuZXhhY3RdLFsicmVwZWF0bkVycm9yXzE+cmVwZWF0bkVycm9yXzIiLCIsIix2LmV4YWN0XSxbInJlcGVhdG5FcnJvcl8yPnJlcGVhdG5FcnJvcl8yIiwiMC05Iix2LmV4YWN0XSxbInJlcGVhdG5FcnJvcl8yLHJlcGVhdG5FcnJvcl8xPnJlcGVhdEVycm9yRmluYWwiLCJ9Il0sWyJyZXBlYXRuXzEscmVwZWF0bkVycm9yXzE+ZXhhY3QiLCJeKyo/XiQufCgpe1tcXDAtOSx9Iix2LmV4YWN0XSxbInJlcGVhdG5fMixyZXBlYXRuRXJyb3JfMj5leGFjdCIsIl4rKj9eJC58KCl7W1xcMC05fSIsdi5leGFjdF0sWyJleGFjdCwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+cmVwZWF0MCIsIioiLHYucmVwZWF0MF0sWyJleGFjdCwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+cmVwZWF0MSIsIisiLHYucmVwZWF0MV0sWyJleGFjdCwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+cmVwZWF0MDEiLCI/Iix2LnJlcGVhdDAxXSxbImNob2ljZT5yZXBlYXRFcnJvckZpbmFsIiwiKis/Il0sWyJyZXBlYXQwLHJlcGVhdDEscmVwZWF0MDEscmVwZWF0bj5yZXBlYXROb25HcmVlZHkiLCI/Iix2LnJlcGVhdE5vbkdyZWVkeV0sWyJyZXBlYXQwLHJlcGVhdDEscmVwZWF0MDEscmVwZWF0bj5yZXBlYXRFcnJvckZpbmFsIiwiKyoiXSxbInN0YXJ0LGJlZ2luLGVuZCxncm91cFN0YXJ0LGdyb3VwUXVhbGlmaWVkU3RhcnQsZXhhY3QscmVwZWF0Tm9uR3JlZWR5LHJlcGVhdDAscmVwZWF0MSxyZXBlYXQwMSxyZXBlYXRuLGNob2ljZSwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+ZXNjYXBlIiwiXFwiLHYuZXNjYXBlU3RhcnRdLFsiZXNjYXBlPm51bGxDaGFyIiwiMCIsdi5udWxsQ2hhcl0sWyJudWxsQ2hhcj5kaWdpdEZvbGxvd051bGxFcnJvciIsIjAtOSJdLFsiZXNjYXBlPmV4YWN0IiwiXmREd1dzU3V4MC05YkIxLTkiLHYubm9ybWFsRXNjYXBlXSxbImVzY2FwZT5leGFjdCIsImJCIix2LmFzc2VydFdvcmRCb3VuZGFyeV0sWyJlc2NhcGU+ZXhhY3QiLCJkRHdXc1MiLHYuY2hhckNsYXNzRXNjYXBlXSxbImVzY2FwZT51bmljb2RlRXNjYXBlMSIsInUiLHYuZXhhY3RdLFsidW5pY29kZUVzY2FwZTE+dW5pY29kZUVzY2FwZTIiLHksdi5leGFjdF0sWyJ1bmljb2RlRXNjYXBlMj51bmljb2RlRXNjYXBlMyIseSx2LmV4YWN0XSxbInVuaWNvZGVFc2NhcGUzPnVuaWNvZGVFc2NhcGU0Iix5LHYuZXhhY3RdLFsidW5pY29kZUVzY2FwZTQ+ZXhhY3QiLHksdi51bmljb2RlRXNjYXBlXSxbImVzY2FwZT5oZXhFc2NhcGUxIiwieCIsdi5leGFjdF0sWyJoZXhFc2NhcGUxPmhleEVzY2FwZTIiLHksdi5leGFjdF0sWyJoZXhFc2NhcGUyPmV4YWN0Iix5LHYuaGV4RXNjYXBlXSxbImVzY2FwZT5kaWdpdEJhY2tyZWYiLCIxLTkiLHYuYmFja3JlZl0sWyJkaWdpdEJhY2tyZWY+ZGlnaXRCYWNrcmVmIiwiMC05Iix2LmJhY2tyZWZdLFsiZGlnaXRCYWNrcmVmPmV4YWN0IiwiXisqP14kLnwoKXtbXFwwLTkiLHYuZXhhY3RdLFsiZXhhY3QsYmVnaW4sZW5kLHJlcGVhdDAscmVwZWF0MSxyZXBlYXQwMSxyZXBlYXRuLHJlcGVhdE5vbkdyZWVkeSxzdGFydCxncm91cFN0YXJ0LGdyb3VwUXVhbGlmaWVkU3RhcnQsY2hvaWNlLCIrbSsiLG51bGxDaGFyLGRpZ2l0QmFja3JlZiwiK18rIiwiK2IrIj5ncm91cFN0YXJ0IiwiKCIsdi5ncm91cFN0YXJ0XSxbImdyb3VwU3RhcnQ+Z3JvdXBRdWFsaWZ5IiwiPyJdLFsiZ3JvdXBRdWFsaWZ5Pmdyb3VwUXVhbGlmaWVkU3RhcnQiLCI6Iix2Lmdyb3VwTm9uQ2FwdHVyZV0sWyJncm91cFF1YWxpZnk+Z3JvdXBRdWFsaWZpZWRTdGFydCIsIj0iLHYuZ3JvdXBUb0Fzc2VydGlvbl0sWyJncm91cFF1YWxpZnk+Z3JvdXBRdWFsaWZpZWRTdGFydCIsIiEiLHYuZ3JvdXBUb0Fzc2VydGlvbl0sW20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyIsZ3JvdXBTdGFydCxncm91cFF1YWxpZmllZFN0YXJ0LGJlZ2luLGVuZCxleGFjdCxyZXBlYXQxLHJlcGVhdDAscmVwZWF0MDEscmVwZWF0bixyZXBlYXROb25HcmVlZHksY2hvaWNlPmV4YWN0IiwiKSIsdi5ncm91cEVuZF0sWyJzdGFydCxiZWdpbixlbmQsZ3JvdXBTdGFydCxncm91cFF1YWxpZmllZFN0YXJ0LGV4YWN0LHJlcGVhdDAscmVwZWF0MSxyZXBlYXQwMSxyZXBlYXRuLHJlcGVhdE5vbkdyZWVkeSxjaG9pY2UsIittKyIsbnVsbENoYXIsZGlnaXRCYWNrcmVmLCIrXysiLCIrYisiPmNob2ljZSIsInwiLHYuY2hvaWNlXSxbInN0YXJ0LGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxiZWdpbixleGFjdCxyZXBlYXQwLHJlcGVhdDEscmVwZWF0MDEscmVwZWF0bixyZXBlYXROb25HcmVlZHksY2hvaWNlLCIrbSsiLG51bGxDaGFyLGRpZ2l0QmFja3JlZiwiK18rIiwiK2IrIj5lbmQiLCIkIix2LmFzc2VydEVuZF0sWyJleGFjdCxiZWdpbixlbmQscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLHJlcGVhdG4scmVwZWF0Tm9uR3JlZWR5LGdyb3VwUXVhbGlmaWVkU3RhcnQsZ3JvdXBTdGFydCxzdGFydCxjaG9pY2UsIittKyIsbnVsbENoYXIsZGlnaXRCYWNrcmVmLCIrXysiLCIrYisiPmNoYXJzZXRTdGFydCIsIlsiLHYuY2hhcnNldFN0YXJ0XSxbImNoYXJzZXRTdGFydD5jaGFyc2V0RXhjbHVkZSIsIl4iLHYuY2hhcnNldEV4Y2x1ZGVdLFsiY2hhcnNldFN0YXJ0PmNoYXJzZXRDb250ZW50IiwiXlxcXV4iLHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldEV4Y2x1ZGU+Y2hhcnNldENvbnRlbnQiLCJeXFxdIix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRDb250ZW50LGNoYXJzZXRDbGFzcz5jaGFyc2V0Q29udGVudCIsIl5cXF0tIix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRDbGFzcz5jaGFyc2V0Q29udGVudCIsIi0iLHYuY2hhcnNldENvbnRlbnRdLFt3KyIsY2hhcnNldFN0YXJ0LGNoYXJzZXRDb250ZW50LGNoYXJzZXROdWxsQ2hhcixjaGFyc2V0Q2xhc3MsY2hhcnNldEV4Y2x1ZGUsY2hhcnNldFJhbmdlRW5kPmNoYXJzZXRFc2NhcGUiLCJcXCJdLFsiY2hhcnNldEVzY2FwZT5jaGFyc2V0Q29udGVudCIsIl5kRHdXc1N1eDAtOSIsdi5jaGFyc2V0Tm9ybWFsRXNjYXBlXSxbImNoYXJzZXRFc2NhcGU+Y2hhcnNldE51bGxDaGFyIiwiMCIsdi5jaGFyc2V0TnVsbENoYXJdLFsiY2hhcnNldEVzY2FwZT5jaGFyc2V0T2N0RXNjYXBlIiwiMS05Il0sWyJjaGFyc2V0UmFuZ2VFbmRFc2NhcGU+Y2hhcnNldE9jdEVzY2FwZSIsIjEtOSJdLFsiY2hhcnNldE51bGxDaGFyPmRpZ2l0Rm9sbG93TnVsbEVycm9yIiwiMC05Il0sWyJjaGFyc2V0TnVsbENoYXI+Y2hhcnNldENvbnRlbnQiLCJeMC05XFxdLSIsdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0RXNjYXBlPmNoYXJzZXRDbGFzcyIsImREd1dzUyIsdi5jaGFyc2V0Q2xhc3NFc2NhcGVdLFsiY2hhcnNldEVzY2FwZT5jaGFyc2V0VW5pY29kZUVzY2FwZTEiLCJ1Iix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRVbmljb2RlRXNjYXBlMT5jaGFyc2V0VW5pY29kZUVzY2FwZTIiLHksdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0VW5pY29kZUVzY2FwZTI+Y2hhcnNldFVuaWNvZGVFc2NhcGUzIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldFVuaWNvZGVFc2NhcGUzPmNoYXJzZXRVbmljb2RlRXNjYXBlNCIseSx2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRVbmljb2RlRXNjYXBlND5jaGFyc2V0Q29udGVudCIseSx2LmNoYXJzZXRVbmljb2RlRXNjYXBlXSxbImNoYXJzZXRFc2NhcGU+Y2hhcnNldEhleEVzY2FwZTEiLCJ4Iix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRIZXhFc2NhcGUxPmNoYXJzZXRIZXhFc2NhcGUyIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldEhleEVzY2FwZTI+Y2hhcnNldENvbnRlbnQiLHksdi5jaGFyc2V0SGV4RXNjYXBlXSxbdysiPmNoYXJzZXRDb250ZW50IiwiXlxcXTAtOWEtZkEtRi0iLHYuY2hhcnNldENvbnRlbnRdLFt3KyIsY2hhcnNldE51bGxDaGFyLGNoYXJzZXRDb250ZW50PmNoYXJzZXRSYW5nZVN0YXJ0IiwiLSIsdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0UmFuZ2VTdGFydD5jaGFyc2V0UmFuZ2VFbmQiLCJeXFxdIix2LmNoYXJzZXRSYW5nZUVuZF0sWyJjaGFyc2V0UmFuZ2VFbmQ+Y2hhcnNldENvbnRlbnQiLCJeXFxdIix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRSYW5nZVN0YXJ0PmNoYXJzZXRSYW5nZUVuZEVzY2FwZSIsIlxcIl0sWyJjaGFyc2V0UmFuZ2VFbmRFc2NhcGU+Y2hhcnNldFJhbmdlRW5kIiwiXmREd1dzU3V4MC05YkIxLTkiLHYuY2hhcnNldFJhbmdlRW5kTm9ybWFsRXNjYXBlXSxbImNoYXJzZXRSYW5nZUVuZEVzY2FwZT5jaGFyc2V0UmFuZ2VFbmRXaXRoTnVsbENoYXIiLCIwIl0sWyJjaGFyc2V0UmFuZ2VFbmRFc2NhcGU+Y2hhcnNldFJhbmdlRW5kVW5pY29kZUVzY2FwZTEiLCJ1Iix2LmNoYXJzZXRSYW5nZUVuZF0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMT5jaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMiIseSx2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUyPmNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUzIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldFJhbmdlRW5kVW5pY29kZUVzY2FwZTM+Y2hhcnNldFJhbmdlRW5kVW5pY29kZUVzY2FwZTQiLHksdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlND5jaGFyc2V0UmFuZ2VFbmQiLHksdi5jaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlXSxbImNoYXJzZXRSYW5nZUVuZEVzY2FwZT5jaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUxIiwieCIsdi5jaGFyc2V0UmFuZ2VFbmRdLFsiY2hhcnNldFJhbmdlRW5kSGV4RXNjYXBlMT5jaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUyIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldFJhbmdlRW5kSGV4RXNjYXBlMj5jaGFyc2V0UmFuZ2VFbmQiLHksdi5jaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGVdLFsiY2hhcnNldFJhbmdlRW5kRXNjYXBlPmNoYXJzZXRSYW5nZUVuZENsYXNzIiwiZER3V3NTIl0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMSxjaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUxPmNoYXJzZXRDb250ZW50IiwiXlxcXTAtOWEtZkEtRiIsdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMixjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMyxjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlNCxjaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUyPmNoYXJzZXRSYW5nZVN0YXJ0IiwiLSIsdi5jaGFyc2V0Q29udGVudF0sW3crIixjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMSxjaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUxLGNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUyLGNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUzLGNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGU0LGNoYXJzZXRSYW5nZUVuZEhleEVzY2FwZTIsY2hhcnNldE51bGxDaGFyLGNoYXJzZXRSYW5nZVN0YXJ0LGNoYXJzZXRDb250ZW50LGNoYXJzZXRDbGFzcyxjaGFyc2V0RXhjbHVkZSxjaGFyc2V0UmFuZ2VFbmQ+ZXhhY3QiLCJdIl1dfTtyZXR1cm4gaX0pLCJmdW5jdGlvbiIhPXR5cGVvZiBkZWZpbmUpdmFyIGRlZmluZT1yZXF1aXJlKCJhbWRlZmluZSIpKG1vZHVsZSk7aWYoZGVmaW5lKCJSZWdFeHAiLFsiLi9wYXJzZSIsIi4vS2l0IiwiLi9ORkEiXSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbihlLHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG4pKXJldHVybiBuZXcgbihlLHIpO2UrPSIiO3ZhciBvPXt9OyJzdHJpbmciPT10eXBlb2Ygcj8ocj1yLnRvTG93ZXJDYXNlKCksfnIuaW5kZXhPZigiaSIpJiYoby5pZ25vcmVDYXNlPSEwKSx+ci5pbmRleE9mKCJtIikmJihvLm11bHRpbGluZT0hMCksfnIuaW5kZXhPZigiZyIpJiYoby5nbG9iYWw9ITApLH5yLmluZGV4T2YoImQiKSYmKG8uZGVidWc9ITApKTpvPXI7dmFyIGM9dGhpcy5hc3Q9dChlKTt0aGlzLnNvdXJjZT1lLHRoaXMubXVsdGlsaW5lPSEhby5tdWx0aWxpbmUsdGhpcy5nbG9iYWw9ISFvLmdsb2JhbCx0aGlzLmlnbm9yZUNhc2U9ISFvLmlnbm9yZUNhc2UsdGhpcy5kZWJ1Zz0hIW8uZGVidWcsdGhpcy5mbGFncz0iIix0aGlzLm11bHRpbGluZSYmKHRoaXMuZmxhZ3MrPSJtIiksdGhpcy5pZ25vcmVDYXNlJiYodGhpcy5mbGFncys9ImkiKSx0aGlzLmdsb2JhbCYmKHRoaXMuZmxhZ3MrPSJnIikscCh0aGlzLFsic291cmNlIiwib3B0aW9ucyIsIm11bHRpbGluZSIsImdsb2JhbCIsImlnbm9yZUNhc2UiLCJmbGFncyIsImRlYnVnIl0pO3ZhciBoPXRoaXMuaWdub3JlQ2FzZTtjLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3ModCxoKX0sQ0hBUlNFVF9OT0RFKSxjLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe2kodCxoKX0sRVhBQ1RfTk9ERSksdGhpcy5tdWx0aWxpbmUmJmMudHJhdmVyc2UoYSxBU1NFUlRfTk9ERSl9ZnVuY3Rpb24gaSh0LGUpe3ZhciByO3I9dC5jaGFycy5zcGxpdCgiIikscj1lP3IubWFwKGZ1bmN0aW9uKHQpe3JldHVybi9bYS16XS8udGVzdCh0KT9bdCx0LnRvVXBwZXJDYXNlKCldOi9bQS1aXS8udGVzdCh0KT9bdCx0LnRvTG93ZXJDYXNlKCldOlt0XX0pOnIubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pLHQuZXhwbGFpbmVkPXJ9ZnVuY3Rpb24gYSh0KXt2YXIgZT10LmFzc2VydGlvblR5cGU7ZSE9PUFzc2VydEJlZ2luJiZlIT09QXNzZXJ0RW5kfHwodC5tdWx0aWxpbmU9ITApfWZ1bmN0aW9uIHModCxyKXt2YXIgbj10LmNoYXJzLnNwbGl0KCIiKTtuPW4uY29uY2F0KGUuZmxhdHRlbjIodC5jbGFzc2VzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZ1t0XX0pKSksbj1uLmNvbmNhdCh0LnJhbmdlcyksciYmKG49byhuKSksbj1lLmNsYXNzaWZ5KG4pLnJhbmdlcyx0LmV4Y2x1ZGUmJihuPWUubmVnYXRlKG4pKSxuPWUuY29hbGVzY2UobiksdC5leHBsYWluZWQ9bn1mdW5jdGlvbiBvKHQpe3JldHVybiBlLmZsYXR0ZW4yKHQubWFwKGZ1bmN0aW9uKHQpe3ZhciByPWUuY2xhc3NpZnkoW3QsImF6IiwiQVoiXSkubWFwW3RdO3JldHVybiBlLmZsYXR0ZW4yKHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybi9bYS16XS8udGVzdCh0KT9bdCx0LnRvVXBwZXJDYXNlKCldOi9bQS1aXS8udGVzdCh0KT9bdCx0LnRvTG93ZXJDYXNlKCldOlt0XX0pKX0pKX1mdW5jdGlvbiBjKHQsZSl7dmFyIHIsbj1bXTtyZXR1cm4gZT1lfHxbInN0YXJ0Il0scj10LnJlZHVjZShmdW5jdGlvbih0LGUpe3ZhciByPWgoZSx0KTtyZXR1cm4gbj1uLmNvbmNhdChyLnRyYW5zKSxyLmFjY2VwdHN9LGUpLHthY2NlcHRzOnIsdHJhbnM6bn19ZnVuY3Rpb24gaCh0LGUpe3JldHVybiB0LnJlcGVhdD9mKHQsZSk6bVt0LnR5cGVdKHQsZSl9ZnVuY3Rpb24gdSh0LGUscil7Zm9yKHZhciBuLGksYSxzPTAsbz10Lmxlbmd0aDtzPG87cysrKWlmKGE9dFtzXSxhLm51bT09PWUpaWYoYS50eXBlPT09eSlpPWEuaW5kZXg7ZWxzZSBpZihhLnR5cGU9PT12KXtuPWEuaW5kZXg7YnJlYWt9aWYodm9pZCAwIT09biYmdm9pZCAwIT09aSlyZXR1cm4gci5zbGljZShuLGkpfWZ1bmN0aW9uIGwoKXtyZXR1cm4icSIreCsrfWZ1bmN0aW9uIGYodCxlKXt2YXIgcixuLGk9bVt0LnR5cGVdLGE9W10scz10LnJlcGVhdCxvPXMubWluLGM9cy5tYXg7Zm9yKG49bztuLS07KXI9aSh0LGUpLGE9YS5jb25jYXQoci50cmFucyksZT1yLmFjY2VwdHM7dmFyIGg9W10sdT1bXS5jb25jYXQoZSk7aWYoaXNGaW5pdGUoYykpZm9yKDtjPm87Yy0tKXI9aSh0LGUpLGg9aC5jb25jYXQoci50cmFucyksZT1yLmFjY2VwdHMsdT11LmNvbmNhdChyLmFjY2VwdHMpO2Vsc2V7dmFyIGY9ZS5zbGljZSgpO3I9aSh0LGUpLGg9aC5jb25jYXQoci50cmFucyksdT11LmNvbmNhdChyLmFjY2VwdHMpLGgucHVzaCh7ZnJvbTpyLmFjY2VwdHMsdG86ZixjaGFyc2V0OiExfSl9dmFyIHA9W2woKV07cmV0dXJuIHMubm9uR3JlZWR5PyhhLnB1c2goe2Zyb206dSx0bzpwLGNoYXJzZXQ6ITF9KSxhPWEuY29uY2F0KGgpKTooYT1hLmNvbmNhdChoKSxhLnB1c2goe2Zyb206dSx0bzpwLGNoYXJzZXQ6ITF9KSkse2FjY2VwdHM6cCx0cmFuczphfX1mdW5jdGlvbiBwKHQsZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3dyaXRhYmxlOiExLGVudW1lcmFibGU6ITB9KX0pfXQuZXhwb3J0Q29uc3RhbnRzKCksbi5ERUJVRz1uLkQ9MSxuLk1VTFRJTElORT1uLk09MixuLkdMT0JBTD1uLkc9NCxuLklHTk9SRUNBU0U9bi5JPTgsbi5wcm90b3R5cGU9e3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIi8iK3RoaXMuc291cmNlKyIvIit0aGlzLmZsYWdzfSx0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dGhpcy5leGVjKHQpfSxleGVjOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXMuZ2V0TkZBKCksbj10aGlzLmdsb2JhbD90aGlzLmxhc3RJbmRleHx8MDowLGk9dC5sZW5ndGg7bjxpJiYoZT1yLmlucHV0KHQsbiksIWUuYWNjZXB0YWJsZSk7bisrKTtpZighZXx8IWUuYWNjZXB0YWJsZSlyZXR1cm4gdGhpcy5sYXN0SW5kZXg9MCxudWxsO3ZhciBhPW5ldyBBcnJheSh0aGlzLmFzdC5ncm91cENvdW50KzEpO2FbMF09dC5zbGljZShuLGUubGFzdEluZGV4KzEpO2Zvcih2YXIgcz1lLnN0YWNrLG89MSxjPWEubGVuZ3RoO288YztvKyspYVtvXT11KHMsbyx0KTtyZXR1cm4gdGhpcy5sYXN0SW5kZXg9ZS5sYXN0SW5kZXgrMSxhLmluZGV4PW4sYS5pbnB1dD10LGF9LGdldE5GQTpmdW5jdGlvbigpe2lmKHRoaXMuX25mYSlyZXR1cm4gdGhpcy5fbmZhO3ZhciB0LGU9dGhpcy5hc3Q7cmV0dXJuIHg9MSx0PWMoZS50cmVlKSx0PXIodCx0aGlzLmRlYnVnKSx0aGlzLl9uZmE9dCx0fX07dmFyIGQ9ZS5wYXJzZUNoYXJzZXQoIl5cblxyXHUyMDI4XHUyMDI5IiksZz17ZDpbIjA5Il0sdzpbIkFaIiwiYXoiLCIwOSIsIl8iXSxzOiIgXGZcblxyXHRcduGagOGgjuKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAilx1MjAyOFx1MjAyOeKAr+KBn+OAgCIuc3BsaXQoIiIpfTtbImQiLCJ3IiwicyJdLmZvckVhY2goZnVuY3Rpb24odCl7Z1t0LnRvVXBwZXJDYXNlKCldPWUubmVnYXRlKGdbdF0pfSk7dmFyIHg9MCx2PSJHcm91cENhcHR1cmVTdGFydCIseT0iR3JvdXBDYXB0dXJlRW5kIixtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciByLG49W107cmV0dXJuIHQuZXhwbGFpbmVkLmZvckVhY2goZnVuY3Rpb24odCl7bi5wdXNoKHtmcm9tOmUsdG86cj1bbCgpXSxjaGFyc2V0OnR9KSxlPXJ9KSx7YWNjZXB0czpyLHRyYW5zOm59fWZ1bmN0aW9uIGUodCxlKXt2YXIgcj1bbCgpXTtyZXR1cm57YWNjZXB0czpyLHRyYW5zOlt7ZnJvbTplLHRvOnIsY2hhcnNldDp0LmV4cGxhaW5lZH1dfX1mdW5jdGlvbiBuKHQsZSl7dmFyIHI9W2woKV07cmV0dXJue2FjY2VwdHM6cix0cmFuczpbe2Zyb206ZSx0bzpyLGNoYXJzZXQ6ZH1dfX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9W2woKV07cmV0dXJue2FjY2VwdHM6cix0cmFuczpbe2Zyb206ZSx0bzpyLGNoYXJzZXQ6ITF9XX19ZnVuY3Rpb24gYSh0LGUpe3ZhciByPVtsKCldLG49W3tmcm9tOmUsdG86cixjaGFyc2V0OiExLA0KYWN0aW9uOiF0Lm5vbkNhcHR1cmUmJmZ1bmN0aW9uKGUscixuKXtlLnVuc2hpZnQoe3R5cGU6dixudW06dC5udW0saW5kZXg6bn0pfX1dO2U9cjt2YXIgaT1jKHQuc3ViLGUpO249bi5jb25jYXQoaS50cmFucyk7dmFyIGE9W2woKV07cmV0dXJuIG4ucHVzaCh7ZnJvbTppLmFjY2VwdHMsdG86YSxjaGFyc2V0OiExLGFjdGlvbjohdC5ub25DYXB0dXJlJiZmdW5jdGlvbihlLHIsbil7ZS51bnNoaWZ0KHt0eXBlOnksbnVtOnQubnVtLGluZGV4Om59KX19KSx7YWNjZXB0czphLHRyYW5zOm59fWZ1bmN0aW9uIHModCxlKXt2YXIgcj1bbCgpXSxuPXQubnVtO3JldHVybnthY2NlcHRzOnIsdHJhbnM6W3tmcm9tOmUsdG86cixjaGFyc2V0OiExLGFzc2VydDpmdW5jdGlvbih0LGUscixpLGEpe3ZhciBzPXUodCxuLGEpO3JldHVybiB2b2lkIDA9PT1zJiYocz0iIiksYS5zbGljZShyLHIrcy5sZW5ndGgpPT09cyYmcy5sZW5ndGh9fV19fWZ1bmN0aW9uIG8odCxlKXt2YXIgcj1bXSxuPVtdO3JldHVybiB0LmJyYW5jaGVzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9Yyh0LGUpO3I9ci5jb25jYXQoaS50cmFucyksbj1uLmNvbmNhdChpLmFjY2VwdHMpfSkse3RyYW5zOnIsYWNjZXB0czpufX1mdW5jdGlvbiBoKHQsZSl7ZnVuY3Rpb24gbih0KXt2YXIgZT1yKGModC5zdWIsWyJzdGFydCJdKSk7cmV0dXJuIGZ1bmN0aW9uKHQscixuLGksYSl7cmV0dXJuIGUuaW5wdXQoYSxuLG51bGwsdCkuYWNjZXB0YWJsZX19ZnVuY3Rpb24gaSh0LGUpe3JldHVybiEhKGEodC0xLGUpXmEodCxlKSl9ZnVuY3Rpb24gYSh0LGUpe3JldHVybi0xIT09dCYmdCE9PWUubGVuZ3RoJiYvXHcvLnRlc3QoZVt0XSl9ZnVuY3Rpb24gcyh0LGUscixuLGkpe3JldHVybiAwPT09cnx8IlxuIj09PWlbci0xXX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7cmV0dXJuIDA9PT1yfWZ1bmN0aW9uIGgodCxlLHIsbixpKXtyZXR1cm4gcj09PWkubGVuZ3RofHwiXG4iPT09ZX1mdW5jdGlvbiB1KHQsZSxyLG4saSl7cmV0dXJuIHI9PT1pLmxlbmd0aH12YXIgZjtzd2l0Y2godC5hc3NlcnRpb25UeXBlKXtjYXNlIEFzc2VydEJlZ2luOmY9dC5tdWx0aWxpbmU/czpvO2JyZWFrO2Nhc2UgQXNzZXJ0RW5kOmY9dC5tdWx0aWxpbmU/aDp1O2JyZWFrO2Nhc2UgQXNzZXJ0V29yZEJvdW5kYXJ5OmY9ZnVuY3Rpb24odCxlLHIsbixhKXtyZXR1cm4gaShyLGEpfTticmVhaztjYXNlIEFzc2VydE5vbldvcmRCb3VuZGFyeTpmPWZ1bmN0aW9uKHQsZSxyLG4sYSl7cmV0dXJuIWkocixhKX07YnJlYWs7Y2FzZSBBc3NlcnRMb29rYWhlYWQ6Zj1uKHQpO2JyZWFrO2Nhc2UgQXNzZXJ0TmVnYXRpdmVMb29rYWhlYWQ6Zj1mdW5jdGlvbih0KXt2YXIgZT1uKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiFlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KHQpfXJldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49W2woKV07cmV0dXJue2FjY2VwdHM6bix0cmFuczpbe2Zyb206ZSx0bzpuLGNoYXJzZXQ6ITEsYXNzZXJ0OnJ9XX19KHQsZSxmKX1yZXR1cm57YXNzZXJ0OmgsY2hvaWNlOm8sYmFja3JlZjpzLGdyb3VwOmEsZW1wdHk6aSxjaGFyc2V0OmUsZG90Om4sZXhhY3Q6dH19KCk7cmV0dXJuIG59KSwiZnVuY3Rpb24iIT10eXBlb2YgZGVmaW5lKXZhciBkZWZpbmU9cmVxdWlyZSgiYW1kZWZpbmUiKShtb2R1bGUpO2lmKGRlZmluZSgidmlzdWFsaXplIixbIi4vS2l0IiwiLi9wYXJzZSJdLGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LGUpe2lmKGU9ZXx8Im5vcm1hbCIsU1t0XSYmU1t0XVtlXSlyZXR1cm4gU1t0XVtlXTt5LmF0dHIoeyJmb250LXNpemUiOnQsImZvbnQtd2VpZ2h0IjplfSk7dmFyIHI9eS5nZXRCQm94KCk7cmV0dXJuIFNbdF09U1t0XXx8e30sU1t0XVtlXT17d2lkdGg6ci53aWR0aC8oKHkuYXR0cigidGV4dCIpLmxlbmd0aC0xKS8yKSxoZWlnaHQ6ci5oZWlnaHQvMn19ZnVuY3Rpb24gbih0KXt5PXQudGV4dCgtMWUzLC0xZTMsIlhnZlRsTXwucVxuWGdmVGxNfC5xIikuYXR0cih7ImZvbnQtZmFtaWx5IjpFLCJmb250LXNpemUiOm19KX1mdW5jdGlvbiBpKHQsZSxpKXtpLmNsZWFyKCksaS5zZXRTaXplKDAsMCk7dmFyIG89aS5yZWN0KDAsMCwwLDApO28uYXR0cigiZmlsbCIsdyksby5hdHRyKCJzdHJva2UiLHcpLG4oaSksQz0hIX5lLmluZGV4T2YoIm0iKTt2YXIgYz1kKHQudHJlZSk7Yy51bnNoaWZ0KHgoIi8iLEIuZGVsaW1pdGVyKSksYy51bnNoaWZ0KHgoIlJlZ0V4cDogIikpLGMucHVzaCh4KCIvIixCLmRlbGltaXRlcikpLGUmJmMucHVzaCh4KGUsQi5mbGFncykpO3ZhciBoPXIobSwiYm9sZCIpLHU9ayxsPWguaGVpZ2h0LzIrayxmPTAscD0wO2Y9Yy5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS54PXQsZS55PWwsdCtlLnRleHQubGVuZ3RoKmgud2lkdGh9LHUpLGYrPWsscD1oLmhlaWdodCsyKmssYz1pLmFkZChjKSxpLnNldFNpemUoZixoLmhlaWdodCsyKmspO3ZhciBnPWEodC50cmVlLDAsMCk7cD1NYXRoLm1heChnLmhlaWdodCszKmsraC5oZWlnaHQscCksZj1NYXRoLm1heChnLndpZHRoKzIqayxmKSxpLnNldFNpemUoZixwKSxvLmF0dHIoIndpZHRoIixmKSxvLmF0dHIoImhlaWdodCIscCkscyhnLml0ZW1zLGssMiprK2guaGVpZ2h0LWcueSksaS5hZGQoZy5pdGVtcyl9ZnVuY3Rpb24gYSh0LGUscil7cmV0dXJuIHQudW5zaGlmdCh7dHlwZToic3RhcnRQb2ludCJ9KSx0LnB1c2goe3R5cGU6ImVuZFBvaW50In0pLG8odCxlLHIpfWZ1bmN0aW9uIHModCxlLHIpe3QuZm9yRWFjaChmdW5jdGlvbih0KXt0Ll90cmFuc2xhdGU/dC5fdHJhbnNsYXRlKGUscik6KHQueCs9ZSx0LnkrPXIpfSl9ZnVuY3Rpb24gbyh0LGUscil7dmFyIG49W10saT1bXSxhPTAscz0wLG89ZSxjPXIsaD1yO2lmKCF0Lmxlbmd0aClyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlO2U9dC5yZXBlYXQ/QS5yZXBlYXQodCxvLHIpOkFbdC50eXBlXSh0LG8sciksbi5wdXNoKGUpLG8rPWUud2lkdGgrXyxhKz1lLndpZHRoLGM9TWF0aC5taW4oYyxlLnkpLGg9TWF0aC5tYXgoaCxlLnkrZS5oZWlnaHQpLGk9aS5jb25jYXQoZS5pdGVtcyl9KSxzPWgtYyxuLnJlZHVjZShmdW5jdGlvbih0LGUpe2ErPV87dmFyIG49dSh0LmxpbmVPdXRYLHIsZS5saW5lSW5YKTtyZXR1cm4gaS5wdXNoKG4pLGV9KTt2YXIgbD1uWzBdLmxpbmVJblgsZj1uW24ubGVuZ3RoLTFdLmxpbmVPdXRYO3JldHVybntpdGVtczppLHdpZHRoOmEsaGVpZ2h0OnMseDplLHk6YyxsaW5lSW5YOmwsbGluZU91dFg6Zn19ZnVuY3Rpb24gYyhlLG4saSxhLHMpe2U9dC50b1ByaW50KGUpO3ZhciBvPXIobSksYz1lLmxlbmd0aCpvLndpZHRoLGg9by5oZWlnaHQrMTIsdT1jKzEyLGw9e3R5cGU6InJlY3QiLHg6bix5OmktaC8yLHdpZHRoOnUsaGVpZ2h0Omgsc3Ryb2tlOiJub25lIixmaWxsOmF8fCJ0cmFuc3BhcmVudCJ9LGY9e3R5cGU6InRleHQiLHg6bit1LzIseTppLHRleHQ6ZSwiZm9udC1zaXplIjptLCJmb250LWZhbWlseSI6RSxmaWxsOnN8fCJibGFjayJ9O3JldHVybnt0ZXh0OmYscmVjdDpsLGl0ZW1zOltsLGZdLHdpZHRoOnUsaGVpZ2h0OmgseDpuLHk6bC55LGxpbmVJblg6bixsaW5lT3V0WDpuK3V9fWZ1bmN0aW9uIGgodCxlLG4saSl7dmFyIGEscz1yKGIpLG89bi5zcGxpdCgiXG4iKSxjPW8ubGVuZ3RoKnMuaGVpZ2h0O2E9by5sZW5ndGg+MT9NYXRoLm1heC5hcHBseShNYXRoLG8ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aH0pKTpuLmxlbmd0aCxhKj1zLndpZHRoO3JldHVybntsYWJlbDp7dHlwZToidGV4dCIseDp0LHk6ZS1jLzItNCx0ZXh0Om4sImZvbnQtc2l6ZSI6YiwiZm9udC1mYW1pbHkiOkUsZmlsbDppfHwiIzQ0NCJ9LHg6dC1hLzIseTplLWMtNCx3aWR0aDphLGhlaWdodDpjKzR9fWZ1bmN0aW9uIHUodCxlLHIpe3JldHVybnt0eXBlOiJwYXRoIix4OnQseTplLHBhdGg6WyJNIix0LGUsIkgiLHJdLCJzdHJva2UtbGluZWNhcCI6ImJ1dHQiLCJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsc3Ryb2tlOiIjMzMzIiwic3Ryb2tlLXdpZHRoIjoyLF90cmFuc2xhdGU6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnBhdGg7clsxXSs9dCxyWzJdKz1lLHJbNF0rPXR9fX1mdW5jdGlvbiBsKHQsZSxyLG4pe3ZhciBpLGEscz10PnI/LTE6MSxvPWU+bj8tMToxO3JldHVybiBNYXRoLmFicyhlLW4pPDE1PyhpPVsiTSIsdCxlLCJDIix0K01hdGgubWluKE1hdGguYWJzKHItdCkvMiwxMCkqcyxlLHItKHItdCkvMixuLHIsbl0sYT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMucGF0aDtyWzFdKz10LHJbMl0rPWUscls0XSs9dCxyWzVdKz1lLHJbNl0rPXQscls3XSs9ZSxyWzhdKz10LHJbOV0rPWV9KTooaT1bIk0iLHQsZSwiUSIsdCsxMCpzLGUsdCsxMCpzLGUrMTAqbywiViIsTWF0aC5hYnMoZS1uKTwyMD9lKzEwKm86bi0xMCpvLCJRIix0KzEwKnMsbix0KzEwKnMqMixuLCJIIixyXSxhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5wYXRoO3JbMV0rPXQsclsyXSs9ZSxyWzRdKz10LHJbNV0rPWUscls2XSs9dCxyWzddKz1lLHJbOV0rPWUsclsxMV0rPXQsclsxMl0rPWUsclsxM10rPXQsclsxNF0rPWUsclsxNl0rPXR9KSx7dHlwZToicGF0aCIscGF0aDppLCJzdHJva2UtbGluZWNhcCI6ImJ1dHQiLCJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsc3Ryb2tlOiIjMzMzIiwic3Ryb2tlLXdpZHRoIjoyLF90cmFuc2xhdGU6YX19ZnVuY3Rpb24gZih0LGUscil7cmV0dXJue2l0ZW1zOlt7dHlwZToiY2lyY2xlIixmaWxsOnIsY3g6dCsxMCxjeTplLHI6MTAsc3Ryb2tlOiJub25lIixfdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSl7dGhpcy5jeCs9dCx0aGlzLmN5Kz1lfX1dLHdpZHRoOjIwLGhlaWdodDoyMCx4OnQseTplLGxpbmVJblg6dCxsaW5lT3V0WDp0KzIwfX1mdW5jdGlvbiBwKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgZT10LHI9MDtyPGUubGVuZ3RoO3IrKylpZighcChlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgbj10O3JldHVybiBuLnR5cGU9PT1FTVBUWV9OT0RFfHwobi50eXBlPT09R1JPVVBfTk9ERSYmdm9pZCAwPT09bi5udW0/cChuLnN1Yik6bi50eXBlPT09Q0hPSUNFX05PREU/cChuLmJyYW5jaGVzKTp2b2lkIDApfWZ1bmN0aW9uIGQoZSl7dmFyIHI9W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLnN1YilyLnB1c2goeCgiKCIpKSxlLnR5cGU9PT1BU1NFUlRfTk9ERT9lLmFzc2VydGlvblR5cGU9PT1Bc3NlcnRMb29rYWhlYWQ/ci5wdXNoKHgoIj89IikpOnIucHVzaCh4KCI/ISIpKTplLm5vbkNhcHR1cmUmJnIucHVzaCh4KCI/OiIpKSxyPXIuY29uY2F0KGQoZS5zdWIpKSxyLnB1c2goeCgiKSIpKTtlbHNlIGlmKGUuYnJhbmNoZXMpZS5icmFuY2hlcy5tYXAoZCkuZm9yRWFjaChmdW5jdGlvbih0KXtyPXIuY29uY2F0KHQpLHIucHVzaCh4KCJ8IikpfSksci5wb3AoKTtlbHNle3ZhciBuPUJbZS50eXBlXXx8Qi5kZWZhdWx0cztzd2l0Y2goZS50eXBlKXtjYXNlIENIQVJTRVRfTk9ERTp2YXIgaT12KGUpOyghaXx8ZS5leGNsdWRlKSYmci5wdXNoKHgoIlsiKSksZS5leGNsdWRlJiZyLnB1c2goeCgiXiIsQi5jaGFyc2V0RXhjbHVkZSkpLGUucmFuZ2VzLmZvckVhY2goZnVuY3Rpb24odCl7ci5wdXNoKHgoZyh0WzBdKyItIit0WzFdKSxCLmNoYXJzZXRSYW5nZSkpfSksZS5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24odCl7ci5wdXNoKHgoIlxcIit0LEIuY2hhcnNldENsYXNzKSl9KSxyLnB1c2goeChnKGUuY2hhcnMpLEIuY2hhcnNldENoYXJzKSksKCFpfHxlLmV4Y2x1ZGUpJiZyLnB1c2goeCgiXSIpKTticmVhaztkZWZhdWx0OnZhciBhPWUucmF3fHwiIjtlLnJlcGVhdCYmKGE9YS5zbGljZSgwLGUucmVwZWF0LmJlZ2luSW5kZXgpKSxhPXQudG9QcmludChhLCEwKSxyLnB1c2goeChhLG4pKX19aWYoZS5yZXBlYXQpe3ZhciBzPWUucmVwZWF0Lm1pbixvPWUucmVwZWF0Lm1heDswPT09cyYmbz09PTEvMD9yLnB1c2goeCgiKiIpKToxPT09cyYmbz09PTEvMD9yLnB1c2goeCgiKyIpKTowPT09cyYmMT09PW8/ci5wdXNoKHgoIj8iKSk6KHIucHVzaCh4KCJ7IikpLHIucHVzaCh4KHMpKSxzPT09bz9yLnB1c2goeCgifSIpKTooci5wdXNoKHgoIiwiKSksaXNGaW5pdGUobykmJnIucHVzaCh4KG8pKSxyLnB1c2goeCgifSIpKSkpLGUucmVwZWF0Lm5vbkdyZWVkeSYmci5wdXNoKHgoIj8iLEIucmVwZWF0Tm9uR3JlZWR5KSl9fSkscn1mdW5jdGlvbiBnKGUpe3JldHVybiBlPXQudG9QcmludChlKSxlLnJlcGxhY2UoL1xbL2csIlxcWyIpLnJlcGxhY2UoL1xdL2csIlxcXSIpfWZ1bmN0aW9uIHgodCxlKXtyZXR1cm4gZT1lfHxCW3RdfHxCLmRlZmF1bHRzLHt0eXBlOiJ0ZXh0IiwiZm9udC1zaXplIjptLCJmb250LWZhbWlseSI6RSx0ZXh0OnQrIiIsZmlsbDplLCJ0ZXh0LWFuY2hvciI6InN0YXJ0IiwiZm9udC13ZWlnaHQiOiJib2xkIn19ZnVuY3Rpb24gdih0KXtyZXR1cm4hdC5jaGFycyYmIXQucmFuZ2VzLmxlbmd0aCYmMT09PXQuY2xhc3Nlcy5sZW5ndGh9ZS5leHBvcnRDb25zdGFudHMoKTt2YXIgeSxtPTE2LGI9MTQsXz0xNix3PSIjRUVFIixFPSJEZWphVnUgU2FucyBNb25vLG1vbm9zcGFjZSIsQz0hMSxrPTEwLFM9e30sQT17c3RhcnRQb2ludDpmdW5jdGlvbih0LGUscil7cmV0dXJuIGYoZSxyLCJyKDAuNSwwLjUpI0VGRS1ncmVlbiIpfSxlbmRQb2ludDpmdW5jdGlvbih0LGUscil7cmV0dXJuIGYoZSxyLCJyKDAuNSwwLjUpI0ZGRi0jMDAwIil9LGVtcHR5OmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm57aXRlbXM6W3UoZSxyLGUrMTApXSx3aWR0aDoxMCxoZWlnaHQ6Mix4OmUseTpyLGxpbmVJblg6ZSxsaW5lT3V0WDplKzEwfX0sZXhhY3Q6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBjKHQuY2hhcnMsZSxyLCJza3libHVlIil9LGRvdDpmdW5jdGlvbih0LGUscil7dmFyIG49YygiQW55Q2hhckV4Y2VwdE5ld0xpbmUiLGUsciwiRGFya0dyZWVuIiwid2hpdGUiKTtyZXR1cm4gbi5yZWN0LnI9MTAsbi5yZWN0LnRpcD0iQW55Q2hhciBleGNlcHQgQ1IgTEYiLG59LGJhY2tyZWY6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWMoIkJhY2tyZWYgIyIrdC5udW0sZSxyLCJuYXZ5Iiwid2hpdGUiKTtyZXR1cm4gbi5yZWN0LnI9OCxufSxyZXBlYXQ6ZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQrKHQ8Mj8iIHRpbWUiOiIgdGltZXMiKX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9dGhpcy5wYXRoO3JbMV0rPXQsclsyXSs9ZSxyWzRdKz10LHJbNV0rPWUscls2XSs9dCxyWzddKz1lLHJbOV0rPWUsclsxMV0rPXQsclsxMl0rPWUsclsxM10rPXQsclsxNF0rPWUsclsxNl0rPXQsclsxOF0rPXQsclsxOV0rPWUsclsyMF0rPXQsclsyMV0rPWUsclsyM10rPWUsclsyNV0rPXQsclsyNl0rPWUsclsyN10rPXQsclsyOF0rPWV9aWYocCh0KSlyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dmFyIGE9dC5yZXBlYXQsbz0iIixjPVtdO2lmKGEubWluPT09YS5tYXgmJjA9PT1hLm1pbilyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dmFyIHU9QVt0LnR5cGVdKHQsZSxyKSxsPXUud2lkdGgsZj11LmhlaWdodDtpZihhLm1pbj09PWEubWF4JiYxPT09YS5taW4pcmV0dXJuIHU7YS5taW49PT1hLm1heD9vKz1uKGEubWluKToobys9YS5taW4saXNGaW5pdGUoYS5tYXgpP28rPShhLm1heC1hLm1pbj4xPyIgdG8gIjoiIG9yICIpK24oYS5tYXgpOm8rPSIgb3IgbW9yZSB0aW1lcyIpO3ZhciBkPTEwLGc9MCx4PTEwLHY9dS55K3UuaGVpZ2h0LXIseT0yMCt1LndpZHRoO2w9eTt2YXIgbTsxIT09YS5tYXg/KHYrPTEwLGYrPTEwLG09e3R5cGU6InBhdGgiLHBhdGg6WyJNIix1LngrMTAsciwiUSIsZSxyLGUscit4LCJWIixyK3YteCwiUSIsZSxyK3YsZSt4LHIrdiwiSCIsZSt5LXgsIlEiLGUreSxyK3YsZSt5LHIrdi14LCJWIixyK3gsIlEiLGUreSxyLHUueCt1LndpZHRoKzEwLHJdLF90cmFuc2xhdGU6aSxzdHJva2U6Im1hcm9vbiIsInN0cm9rZS13aWR0aCI6Mn0sYS5ub25HcmVlZHkmJihtLnN0cm9rZT0iQnJvd24iLG1bInN0cm9rZS1kYXNoYXJyYXkiXT0iLSIpLGMucHVzaChtKSk6bz0hMTt2YXIgYjtpZigwPT09YS5taW4pe3ZhciBfPXItdS55KzEwLHc9eSsyMDtkKz0xMCxnPS0xMixsPXcsZis9MTAsYj17dHlwZToicGF0aCIscGF0aDpbIk0iLGUsciwiUSIsZSt4LHIsZSt4LHIteCwiViIsci1fK3gsIlEiLGUreCxyLV8sZSsyMCxyLV8sIkgiLGUrdy0yMCwiUSIsZSt3LXgsci1fLGUrdy14LHItXyt4LCJWIixyLXgsIlEiLGUrdy14LHIsZSt3LHJdLF90cmFuc2xhdGU6aSxzdHJva2U6YS5ub25HcmVlZHk/ImRhcmtncmVlbiI6IiMzMzMiLCJzdHJva2Utd2lkdGgiOjJ9LG0mJnMoW21dLDEwLDApLGMucHVzaChiKX1pZihvKXt2YXIgRT1oKGUrbC8yLHIsbyk7cyhbRS5sYWJlbF0sMCx2K0UuaGVpZ2h0KzQpLGMucHVzaChFLmxhYmVsKSxmKz00K0UuaGVpZ2h0O3ZhciBDPShNYXRoLm1heChFLndpZHRoLGwpLWwpLzI7QyYmcyhjLEMsMCksbD1NYXRoLm1heChFLndpZHRoLGwpLGQrPUN9cmV0dXJuIHModS5pdGVtcyxkLDApLGM9Yy5jb25jYXQodS5pdGVtcykse2l0ZW1zOmMsd2lkdGg6bCxoZWlnaHQ6Zix4OmUseTp1LnkrZyxsaW5lSW5YOnUubGluZUluWCtkLGxpbmVPdXRYOnUubGluZU91dFgrZH19LGNob2ljZTpmdW5jdGlvbih0LGUscil7aWYocCh0KSlyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dmFyIG49MCxpPTAsYT10LmJyYW5jaGVzLm1hcChmdW5jdGlvbih0KXt2YXIgYT1vKHQsZSxyKTtyZXR1cm4gbis9YS5oZWlnaHQsaT1NYXRoLm1heChpLGEud2lkdGgpLGF9KTtuKz02KihhLmxlbmd0aC0xKSs4LGkrPTQwO3ZhciBjPWUraS8yLGg9ci1uLzIrNCxmPWUraSxkPVtdO3JldHVybiBhLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49Yy10LndpZHRoLzI7cyh0Lml0ZW1zLG4tdC54LGgtdC55KSxkPWQuY29uY2F0KHQuaXRlbXMpO3ZhciBhPXIraC10Lnksbz1sKGUscixlKzIwLGEpLHA9bChmLHIsZStpLTIwLGEpO2QucHVzaChvLHApLGUrMjAhPT1uLXQueCt0LmxpbmVJblgmJmQucHVzaCh1KGUrMjAsYSxuLXQueCt0LmxpbmVJblgpKSx0LmxpbmVPdXRYK24tdC54IT1lK2ktMjAmJmQucHVzaCh1KHQubGluZU91dFgrbi10LngsYSxlK2ktMjApKSx0Lng9bix0Lnk9aCxoKz10LmhlaWdodCs2fSkse2l0ZW1zOmQsd2lkdGg6aSxoZWlnaHQ6bix4OmUseTpyLW4vMixsaW5lSW5YOmUsbGluZU91dFg6Zn19LGNoYXJzZXQ6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXtkOiJEaWdpdCIsRDoiTm9uRGlnaXQiLHc6IldvcmQiLFc6Ik5vbldvcmQiLHM6IldoaXRlU3BhY2UiLFM6Ik5vbldoaXRlU3BhY2UifSxpPXQuZXhjbHVkZT8iUGluayI6IktoYWtpIixhPXQuZXhjbHVkZT8iI0MwMCI6IiI7aWYodih0KSl7dmFyIG89YyhuW3QuY2xhc3Nlc1swXV0sZSxyLCJHcmVlbiIsIndoaXRlIik7aWYoby5yZWN0LnI9NSx0LmV4Y2x1ZGUpe3ZhciB1PWgoby54K28ud2lkdGgvMixvLnksIk5vbmUgb2Y6IixhKSxsPW8uaXRlbXM7bC5wdXNoKHUubGFiZWwpO3ZhciBmPW8ud2lkdGgscD1NYXRoLm1heCh1LndpZHRoLG8ud2lkdGgpLGQ9KHAtZikvMjtyZXR1cm4gcyhsLGQsMCkse2l0ZW1zOmwsd2lkdGg6cCxoZWlnaHQ6by5oZWlnaHQrdS5oZWlnaHQseDpNYXRoLm1pbih1Lngsby54KSx5OnUueSxsaW5lSW5YOmQrby54LGxpbmVPdXRYOmQrby54K28ud2lkdGh9fXJldHVybiBvfWlmKCF0LmNoYXJzJiYhdC5yYW5nZXMubGVuZ3RoJiYhdC5jbGFzc2VzLmxlbmd0aCl7dmFyIG89YygiQW55Q2hhciIsZSxyLCJncmVlbiIsIndoaXRlIik7cmV0dXJuIG8ucmVjdC5yPTUsb312YXIgZyx4LHk9W10scD0wLG09MDt0LmNoYXJzJiYoZz1jKHQuY2hhcnMsZSxyLCJMaWdodFNreUJsdWUiLCJibGFjayIpLGcucmVjdC5yPTUseS5wdXNoKGcpLHA9Zy53aWR0aCksdC5yYW5nZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0PXQuc3BsaXQoIiIpLmpvaW4oIi0iKTt2YXIgbj1jKHQsZSxyLCJ0ZWFsIiwid2hpdGUiKTtuLnJlY3Qucj01LHkucHVzaChuKSxwPU1hdGgubWF4KG4ud2lkdGgscCl9KSx0LmNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT1jKG5bdF0sZSxyLCJHcmVlbiIsIndoaXRlIik7aS5yZWN0LnI9NSx5LnB1c2goaSkscD1NYXRoLm1heChpLndpZHRoLHApfSkseD15WzBdLmhlaWdodDt2YXIgYj1bXSxfPVtdO3kuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLndpZHRoLXQud2lkdGh9KSx5LmZvckVhY2goZnVuY3Rpb24odCl7Mip0LndpZHRoKzQ+cD9iLnB1c2godCk6Xy5wdXNoKHQpfSkseT1iO2Zvcih2YXIgdyxFO18ubGVuZ3RoOyl7aWYodz1fLnBvcCgpLCEoRT1fLnBvcCgpKSl7eS5wdXNoKHcpO2JyZWFrfXcud2lkdGgtRS53aWR0aD4yPyh5LnB1c2godyksXy5wdXNoKEUpKToocyhFLml0ZW1zLHcud2lkdGgrNCwwKSx5LnB1c2goe2l0ZW1zOncuaXRlbXMuY29uY2F0KEUuaXRlbXMpLHdpZHRoOncud2lkdGgrRS53aWR0aCs0LGhlaWdodDp3LmhlaWdodCx4OncueCx5OncueX0pLG0tPXcuaGVpZ2h0KX1wKz0xMixtPTQqKHkubGVuZ3RoLTEpK3kubGVuZ3RoKngrMTI7dmFyIEM9e3R5cGU6InJlY3QiLHg6ZSx5OnItbS8yLHI6NCx3aWR0aDpwLGhlaWdodDptLHN0cm9rZToibm9uZSIsZmlsbDppfSxrPUMueSs2LGw9W0NdO3kuZm9yRWFjaChmdW5jdGlvbih0KXtzKHQuaXRlbXMsZS10LngrKHAtdC53aWR0aCkvMixrLXQueSksbD1sLmNvbmNhdCh0Lml0ZW1zKSxrKz10LmhlaWdodCs0fSk7dmFyIHU9aChDLngrQy53aWR0aC8yLEMueSwodC5leGNsdWRlPyJOb25lIjoiT25lIikrIiBvZjoiLGEpO2wucHVzaCh1LmxhYmVsKTt2YXIgZj1wO3A9TWF0aC5tYXgodS53aWR0aCxwKTt2YXIgZD0ocC1mKS8yO3JldHVybiBzKGwsZCwwKSx7aXRlbXM6bCx3aWR0aDpwLGhlaWdodDptK3UuaGVpZ2h0LHg6TWF0aC5taW4odS54LGUpLHk6dS55LGxpbmVJblg6ZCtlLGxpbmVPdXRYOmQrZStDLndpZHRofX0sZ3JvdXA6ZnVuY3Rpb24odCxlLHIpe2lmKHAodCkpcmV0dXJuIEEuZW1wdHkobnVsbCxlLHIpO3ZhciBuPW8odC5zdWIsZSxyKTtpZih0Lm51bSl7cyhuLml0ZW1zLDEwLDApO3ZhciBpPW4ud2lkdGgrMjAsYT1uLmhlaWdodCsyMCxjPXt0eXBlOiJyZWN0Iix4OmUseTpuLnktMTAscjo2LHdpZHRoOmksaGVpZ2h0OmEsInN0cm9rZS1kYXNoYXJyYXkiOiIuIixzdHJva2U6InNpbHZlciIsInN0cm9rZS13aWR0aCI6Mn0sdT1oKGMueCtjLndpZHRoLzIsYy55LTIsIkdyb3VwICMiK3QubnVtKSxsPW4uaXRlbXMuY29uY2F0KFtjLHUubGFiZWxdKSxmPU1hdGgubWF4KHUud2lkdGgsaSksZD0oZi1pKS8yO3JldHVybiBkJiZzKGwsZCwwKSx7aXRlbXM6bCx3aWR0aDpmLGhlaWdodDphK3UuaGVpZ2h0KzQseDplLHk6dS55LGxpbmVJblg6ZCtuLmxpbmVJblgrMTAsbGluZU91dFg6ZCtuLmxpbmVPdXRYKzEwfX1yZXR1cm4gbn0sYXNzZXJ0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpPXtBc3NlcnROb25Xb3JkQm91bmRhcnk6e2JnOiJtYXJvb24iLGZnOiJ3aGl0ZSJ9LEFzc2VydFdvcmRCb3VuZGFyeTp7Ymc6InB1cnBsZSIsZmc6IndoaXRlIn0sQXNzZXJ0RW5kOntiZzoiSW5kaWdvIixmZzoid2hpdGUifSxBc3NlcnRCZWdpbjp7Ymc6IkluZGlnbyIsZmc6IndoaXRlIn19LGE9dC5hc3NlcnRpb25UeXBlLG89YS5yZXBsYWNlKCJBc3NlcnQiLCIiKSsiISI7aWYobj1pW2FdKXJldHVybiFDfHwiQXNzZXJ0QmVnaW4iIT09YSYmIkFzc2VydEVuZCIhPT1hfHwobz0iTGluZSIrbyksYyhvLGUscixuLmJnLG4uZmcpO3ZhciB1LGw7YT09PUFzc2VydExvb2thaGVhZD8odT0iQ29ybmZsb3dlckJsdWUiLGw9ImRhcmtncmVlbiIsbz0iRm9sbG93ZWQgYnk6Iik6YT09PUFzc2VydE5lZ2F0aXZlTG9va2FoZWFkJiYodT0iI0Y2MyIsbD0iUHVycGxlIixvPSJOb3QgZm9sbG93ZWQgYnk6Iik7dmFyIGY9QS5ncm91cCh0LGUscikscD1mLmhlaWdodCsxNixkPWYud2lkdGgrMTYsZz17dHlwZToicmVjdCIseDplLHk6Zi55LTgscjo2LHdpZHRoOmQsaGVpZ2h0OnAsInN0cm9rZS1kYXNoYXJyYXkiOiItIixzdHJva2U6dSwic3Ryb2tlLXdpZHRoIjoyfSx4PWgoZy54K2QvMixnLnksbyxsKSx2PU1hdGgubWF4KGQseC53aWR0aCkseT0odi1kKS8yO3JldHVybiBzKGYuaXRlbXMseSs4LDApLHkmJnMoW2cseC5sYWJlbF0seSwwKSx7aXRlbXM6Zi5pdGVtcy5jb25jYXQoW2cseC5sYWJlbF0pLHdpZHRoOnYsaGVpZ2h0OmcuaGVpZ2h0K3guaGVpZ2h0LHg6ZSx5OngueSxsaW5lSW5YOnkrZi5saW5lSW5YKzgsbGluZU91dFg6eStmLmxpbmVPdXRYKzh9fX0sQj17ZGVsaW1pdGVyOiJJbmRpZ28iLGZsYWdzOiJkYXJrZ3JlZW4iLGV4YWN0OiIjMzM0Iixkb3Q6ImRhcmtibHVlIixiYWNrcmVmOiJ0ZWFsIiwkOiJwdXJwbGUiLCJeIjoicHVycGxlIiwiXFxiIjoiI0YzMCIsIlxcQiI6IiNGMzAiLCIoIjoiYmx1ZSIsIikiOiJibHVlIiwiPz0iOiJkYXJrZ3JlZW4iLCI/ISI6InJlZCIsIj86IjoiZ3JleSIsIlsiOiJuYXZ5IiwiXSI6Im5hdnkiLCJ8IjoiYmx1ZSIsInsiOiJtYXJvb24iLCIsIjoibWFyb29uIiwifSI6Im1hcm9vbiIsIioiOiJtYXJvb24iLCIrIjoibWFyb29uIiwiPyI6Im1hcm9vbiIscmVwZWF0Tm9uR3JlZWR5OiIjRjYxIixkZWZhdWx0czoiYmxhY2siLGNoYXJzZXRSYW5nZToib2xpdmUiLGNoYXJzZXRDbGFzczoibmF2eSIsY2hhcnNldEV4Y2x1ZGU6InJlZCIsY2hhcnNldENoYXJzOiIjNTM0In07cmV0dXJuIGl9KSxmdW5jdGlvbih0KXt2YXIgZSxyLG49Imhhc093blByb3BlcnR5IixpPS9bXC5cL10vLGE9ZnVuY3Rpb24oKXt9LHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSxvPXtuOnt9fSxjPWZ1bmN0aW9uKHQsbil7dD1TdHJpbmcodCk7dmFyIGksYT1yLG89QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLGg9Yy5saXN0ZW5lcnModCksdT0wLGw9W10sZj17fSxwPVtdLGQ9ZTtlPXQscj0wO2Zvcih2YXIgZz0wLHg9aC5sZW5ndGg7Zzx4O2crKykiekluZGV4ImluIGhbZ10mJihsLnB1c2goaFtnXS56SW5kZXgpLGhbZ10uekluZGV4PDAmJihmW2hbZ10uekluZGV4XT1oW2ddKSk7Zm9yKGwuc29ydChzKTtsW3VdPDA7KWlmKGk9ZltsW3UrK11dLHAucHVzaChpLmFwcGx5KG4sbykpLHIpcmV0dXJuIHI9YSxwO2ZvcihnPTA7Zzx4O2crKylpZigiekluZGV4ImluKGk9aFtnXSkpaWYoaS56SW5kZXg9PWxbdV0pe2lmKHAucHVzaChpLmFwcGx5KG4sbykpLHIpYnJlYWs7ZG97aWYodSsrLGk9ZltsW3VdXSxpJiZwLnB1c2goaS5hcHBseShuLG8pKSxyKWJyZWFrfXdoaWxlKGkpfWVsc2UgZltpLnpJbmRleF09aTtlbHNlIGlmKHAucHVzaChpLmFwcGx5KG4sbykpLHIpYnJlYWs7cmV0dXJuIHI9YSxlPWQscC5sZW5ndGg/cDpudWxsfTtjLl9ldmVudHM9byxjLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyLG4sYSxzLGMsaCx1LGw9dC5zcGxpdChpKSxmPW8scD1bZl0sZD1bXTtmb3IoYT0wLHM9bC5sZW5ndGg7YTxzO2ErKyl7Zm9yKHU9W10sYz0wLGg9cC5sZW5ndGg7YzxoO2MrKylmb3IoZj1wW2NdLm4scj1bZltsW2FdXSxmWyIqIl1dLG49MjtuLS07KShlPXJbbl0pJiYodS5wdXNoKGUpLGQ9ZC5jb25jYXQoZS5mfHxbXSkpO3A9dX1yZXR1cm4gZH0sYy5vbj1mdW5jdGlvbih0LGUpe2lmKHQ9U3RyaW5nKHQpLCJmdW5jdGlvbiIhPXR5cGVvZiBlKXJldHVybiBmdW5jdGlvbigpe307Zm9yKHZhciByPXQuc3BsaXQoaSksbj1vLHM9MCxjPXIubGVuZ3RoO3M8YztzKyspbj1uLm4sbj1uLmhhc093blByb3BlcnR5KHJbc10pJiZuW3Jbc11dfHwobltyW3NdXT17bjp7fX0pO2ZvcihuLmY9bi5mfHxbXSxzPTAsYz1uLmYubGVuZ3RoO3M8YztzKyspaWYobi5mW3NdPT1lKXJldHVybiBhO3JldHVybiBuLmYucHVzaChlKSxmdW5jdGlvbih0KXsrdD09K3QmJihlLnpJbmRleD0rdCl9fSxjLmY9ZnVuY3Rpb24odCl7dmFyIGU9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7Yy5hcHBseShudWxsLFt0LG51bGxdLmNvbmNhdChlKS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19LGMuc3RvcD1mdW5jdGlvbigpe3I9MX0sYy5udD1mdW5jdGlvbih0KXtyZXR1cm4gdD9uZXcgUmVnRXhwKCIoPzpcXC58XFwvfF4pIit0KyIoPzpcXC58XFwvfCQpIikudGVzdChlKTplfSxjLm50cz1mdW5jdGlvbigpe3JldHVybiBlLnNwbGl0KGkpfSxjLm9mZj1jLnVuYmluZD1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB2b2lkKGMuX2V2ZW50cz1vPXtuOnt9fSk7dmFyIHIsYSxzLGgsdSxsLGYscD10LnNwbGl0KGkpLGQ9W29dO2ZvcihoPTAsdT1wLmxlbmd0aDtoPHU7aCsrKWZvcihsPTA7bDxkLmxlbmd0aDtsKz1zLmxlbmd0aC0yKXtpZihzPVtsLDFdLHI9ZFtsXS5uLCIqIiE9cFtoXSlyW3BbaF1dJiZzLnB1c2gocltwW2hdXSk7ZWxzZSBmb3IoYSBpbiByKXJbbl0oYSkmJnMucHVzaChyW2FdKTtkLnNwbGljZS5hcHBseShkLHMpfWZvcihoPTAsdT1kLmxlbmd0aDtoPHU7aCsrKWZvcihyPWRbaF07ci5uOyl7aWYoZSl7aWYoci5mKXtmb3IobD0wLGY9ci5mLmxlbmd0aDtsPGY7bCsrKWlmKHIuZltsXT09ZSl7ci5mLnNwbGljZShsLDEpO2JyZWFrfSFyLmYubGVuZ3RoJiZkZWxldGUgci5mfWZvcihhIGluIHIubilpZihyLm5bbl0oYSkmJnIublthXS5mKXt2YXIgZz1yLm5bYV0uZjtmb3IobD0wLGY9Zy5sZW5ndGg7bDxmO2wrKylpZihnW2xdPT1lKXtnLnNwbGljZShsLDEpO2JyZWFrfSFnLmxlbmd0aCYmZGVsZXRlIHIublthXS5mfX1lbHNle2RlbGV0ZSByLmY7Zm9yKGEgaW4gci5uKXIubltuXShhKSYmci5uW2FdLmYmJmRlbGV0ZSByLm5bYV0uZn1yPXIubn19LGMub25jZT1mdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuIGMudW5iaW5kKHQsciksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBjLm9uKHQscil9LGMudmVyc2lvbj0iMC40LjIiLGMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iWW91IGFyZSBydW5uaW5nIEV2ZSAwLjQuMiJ9LCJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1jOnZvaWQgMCE9PWRlZmluZT9kZWZpbmUoImV2ZSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gY30pOnQuZXZlPWN9KHdpbmRvd3x8dGhpcyksZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSgibGlicy9yYXBoYWVsIixbImV2ZSJdLGZ1bmN0aW9uKHIpe3JldHVybiBlKHQscil9KTplKHQsdC5ldmUpfSh0aGlzLGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0KXtpZihyLmlzKHQsImZ1bmN0aW9uIikpcmV0dXJuIGI/dCgpOmUub24oInJhcGhhZWwuRE9NbG9hZCIsdCk7aWYoci5pcyh0LFcpKXJldHVybiByLl9lbmdpbmUuY3JlYXRlW05dKHIsdC5zcGxpY2UoMCwzK3IuaXModFswXSxIKSkpLmFkZCh0KTt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7aWYoci5pcyhuW24ubGVuZ3RoLTFdLCJmdW5jdGlvbiIpKXt2YXIgaT1uLnBvcCgpO3JldHVybiBiP2kuY2FsbChyLl9lbmdpbmUuY3JlYXRlW05dKHIsbikpOmUub24oInJhcGhhZWwuRE9NbG9hZCIsZnVuY3Rpb24oKXtpLmNhbGwoci5fZW5naW5lLmNyZWF0ZVtOXShyLG4pKX0pfXJldHVybiByLl9lbmdpbmUuY3JlYXRlW05dKHIsYXJndW1lbnRzKX1mdW5jdGlvbiBuKHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxPYmplY3QodCkhPT10KXJldHVybiB0O3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yO2Zvcih2YXIgciBpbiB0KXRba10ocikmJihlW3JdPW4odFtyXSkpO3JldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHQucHVzaCh0LnNwbGljZShyLDEpWzBdKX1mdW5jdGlvbiBhKHQsZSxyKXtmdW5jdGlvbiBuKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHM9YS5qb2luKCLikIAiKSxvPW4uY2FjaGU9bi5jYWNoZXx8e30sYz1uLmNvdW50PW4uY291bnR8fFtdO3JldHVybiBvW2tdKHMpPyhpKGMscykscj9yKG9bc10pOm9bc10pOihjLmxlbmd0aD49MWUzJiZkZWxldGUgb1tjLnNoaWZ0KCldLGMucHVzaChzKSxvW3NdPXRbTl0oZSxhKSxyP3Iob1tzXSk6b1tzXSl9cmV0dXJuIG59ZnVuY3Rpb24gcygpe3JldHVybiB0aGlzLmhleH1mdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciByPVtdLG49MCxpPXQubGVuZ3RoO2ktMiohZT5uO24rPTIpe3ZhciBhPVt7eDordFtuLTJdLHk6K3Rbbi0xXX0se3g6K3Rbbl0seTordFtuKzFdfSx7eDordFtuKzJdLHk6K3RbbiszXX0se3g6K3Rbbis0XSx5Oit0W24rNV19XTtlP24/aS00PT1uP2FbM109e3g6K3RbMF0seTordFsxXX06aS0yPT1uJiYoYVsyXT17eDordFswXSx5Oit0WzFdfSxhWzNdPXt4Oit0WzJdLHk6K3RbM119KTphWzBdPXt4Oit0W2ktMl0seTordFtpLTFdfTppLTQ9PW4/YVszXT1hWzJdOm58fChhWzBdPXt4Oit0W25dLHk6K3RbbisxXX0pLHIucHVzaChbIkMiLCgtYVswXS54KzYqYVsxXS54K2FbMl0ueCkvNiwoLWFbMF0ueSs2KmFbMV0ueSthWzJdLnkpLzYsKGFbMV0ueCs2KmFbMl0ueC1hWzNdLngpLzYsKGFbMV0ueSs2KmFbMl0ueS1hWzNdLnkpLzYsYVsyXS54LGFbMl0ueV0pfXJldHVybiByfWZ1bmN0aW9uIGModCxlLHIsbixpKXtyZXR1cm4gdCoodCooLTMqZSs5KnItOSpuKzMqaSkrNiplLTEyKnIrNipuKS0zKmUrMypyfWZ1bmN0aW9uIGgodCxlLHIsbixpLGEscyxvLGgpe251bGw9PWgmJihoPTEpLGg9aD4xPzE6aDwwPzA6aDtmb3IodmFyIHU9aC8yLGw9Wy0uMTI1MiwuMTI1MiwtLjM2NzgsLjM2NzgsLS41ODczLC41ODczLC0uNzY5OSwuNzY5OSwtLjkwNDEsLjkwNDEsLS45ODE2LC45ODE2XSxmPVsuMjQ5MSwuMjQ5MSwuMjMzNSwuMjMzNSwuMjAzMiwuMjAzMiwuMTYwMSwuMTYwMSwuMTA2OSwuMTA2OSwuMDQ3MiwuMDQ3Ml0scD0wLGQ9MDtkPDEyO2QrKyl7dmFyIGc9dSpsW2RdK3UseD1jKGcsdCxyLGkscyksdj1jKGcsZSxuLGEsbykseT14Kngrdip2O3ArPWZbZF0qei5zcXJ0KHkpfXJldHVybiB1KnB9ZnVuY3Rpb24gdSh0LGUscixuLGksYSxzLG8sYyl7aWYoIShjPDB8fGgodCxlLHIsbixpLGEscyxvKTxjKSl7dmFyIHUsbD0uNSxmPTEtbDtmb3IodT1oKHQsZSxyLG4saSxhLHMsbyxmKTtYKHUtYyk+LjAxOylsLz0yLGYrPSh1PGM/MTotMSkqbCx1PWgodCxlLHIsbixpLGEscyxvLGYpO3JldHVybiBmfX1mdW5jdGlvbiBsKHQsZSxyLG4saSxhLHMsbyl7aWYoIShqKHQscik8VShpLHMpfHxVKHQscik+aihpLHMpfHxqKGUsbik8VShhLG8pfHxVKGUsbik+aihhLG8pKSl7dmFyIGM9KHQqbi1lKnIpKihpLXMpLSh0LXIpKihpKm8tYSpzKSxoPSh0Km4tZSpyKSooYS1vKS0oZS1uKSooaSpvLWEqcyksdT0odC1yKSooYS1vKS0oZS1uKSooaS1zKTtpZih1KXt2YXIgbD1jL3UsZj1oL3UscD0rbC50b0ZpeGVkKDIpLGQ9K2YudG9GaXhlZCgyKTtpZighKHA8K1UodCxyKS50b0ZpeGVkKDIpfHxwPitqKHQscikudG9GaXhlZCgyKXx8cDwrVShpLHMpLnRvRml4ZWQoMil8fHA+K2ooaSxzKS50b0ZpeGVkKDIpfHxkPCtVKGUsbikudG9GaXhlZCgyKXx8ZD4raihlLG4pLnRvRml4ZWQoMil8fGQ8K1UoYSxvKS50b0ZpeGVkKDIpfHxkPitqKGEsbykudG9GaXhlZCgyKSkpcmV0dXJue3g6bCx5OmZ9fX19ZnVuY3Rpb24gZih0LGUsbil7dmFyIGk9ci5iZXppZXJCQm94KHQpLGE9ci5iZXppZXJCQm94KGUpO2lmKCFyLmlzQkJveEludGVyc2VjdChpLGEpKXJldHVybiBuPzA6W107Zm9yKHZhciBzPWguYXBwbHkoMCx0KSxvPWguYXBwbHkoMCxlKSxjPWoofn4ocy81KSwxKSx1PWoofn4oby81KSwxKSxmPVtdLHA9W10sZD17fSxnPW4/MDpbXSx4PTA7eDxjKzE7eCsrKXt2YXIgdj1yLmZpbmREb3RzQXRTZWdtZW50LmFwcGx5KHIsdC5jb25jYXQoeC9jKSk7Zi5wdXNoKHt4OnYueCx5OnYueSx0OngvY30pfWZvcih4PTA7eDx1KzE7eCsrKXY9ci5maW5kRG90c0F0U2VnbWVudC5hcHBseShyLGUuY29uY2F0KHgvdSkpLHAucHVzaCh7eDp2LngseTp2LnksdDp4L3V9KTtmb3IoeD0wO3g8Yzt4KyspZm9yKHZhciB5PTA7eTx1O3krKyl7dmFyIG09Zlt4XSxiPWZbeCsxXSxfPXBbeV0sdz1wW3krMV0sRT1YKGIueC1tLngpPC4wMDE/InkiOiJ4IixDPVgody54LV8ueCk8LjAwMT8ieSI6IngiLGs9bChtLngsbS55LGIueCxiLnksXy54LF8ueSx3Lngsdy55KTtpZihrKXtpZihkW2sueC50b0ZpeGVkKDQpXT09ay55LnRvRml4ZWQoNCkpY29udGludWU7ZFtrLngudG9GaXhlZCg0KV09ay55LnRvRml4ZWQoNCk7dmFyIFM9bS50K1goKGtbRV0tbVtFXSkvKGJbRV0tbVtFXSkpKihiLnQtbS50KSxBPV8udCtYKChrW0NdLV9bQ10pLyh3W0NdLV9bQ10pKSoody50LV8udCk7Uz49MCYmUzw9MS4wMDEmJkE+PTAmJkE8PTEuMDAxJiYobj9nKys6Zy5wdXNoKHt4OmsueCx5OmsueSx0MTpVKFMsMSksdDI6VShBLDEpfSkpfX1yZXR1cm4gZ31mdW5jdGlvbiBwKHQsZSxuKXt0PXIuX3BhdGgyY3VydmUodCksZT1yLl9wYXRoMmN1cnZlKGUpO2Zvcih2YXIgaSxhLHMsbyxjLGgsdSxsLHAsZCxnPW4/MDpbXSx4PTAsdj10Lmxlbmd0aDt4PHY7eCsrKXt2YXIgeT10W3hdO2lmKCJNIj09eVswXSlpPWM9eVsxXSxhPWg9eVsyXTtlbHNleyJDIj09eVswXT8ocD1baSxhXS5jb25jYXQoeS5zbGljZSgxKSksaT1wWzZdLGE9cFs3XSk6KHA9W2ksYSxpLGEsYyxoLGMsaF0saT1jLGE9aCk7Zm9yKHZhciBtPTAsYj1lLmxlbmd0aDttPGI7bSsrKXt2YXIgXz1lW21dO2lmKCJNIj09X1swXSlzPXU9X1sxXSxvPWw9X1syXTtlbHNleyJDIj09X1swXT8oZD1bcyxvXS5jb25jYXQoXy5zbGljZSgxKSkscz1kWzZdLG89ZFs3XSk6KGQ9W3MsbyxzLG8sdSxsLHUsbF0scz11LG89bCk7dmFyIHc9ZihwLGQsbik7aWYobilnKz13O2Vsc2V7Zm9yKHZhciBFPTAsQz13Lmxlbmd0aDtFPEM7RSsrKXdbRV0uc2VnbWVudDE9eCx3W0VdLnNlZ21lbnQyPW0sd1tFXS5iZXoxPXAsd1tFXS5iZXoyPWQ7Zz1nLmNvbmNhdCh3KX19fX19cmV0dXJuIGd9ZnVuY3Rpb24gZCh0LGUscixuLGksYSl7bnVsbCE9dD8odGhpcy5hPSt0LHRoaXMuYj0rZSx0aGlzLmM9K3IsdGhpcy5kPStuLHRoaXMuZT0raSx0aGlzLmY9K2EpOih0aGlzLmE9MSx0aGlzLmI9MCx0aGlzLmM9MCx0aGlzLmQ9MSx0aGlzLmU9MCx0aGlzLmY9MCl9ZnVuY3Rpb24gZygpe3JldHVybiB0aGlzLngrSSt0aGlzLnkrSSt0aGlzLndpZHRoKyIgw5cgIit0aGlzLmhlaWdodH1mdW5jdGlvbiB4KHQsZSxyLG4saSxhKXtmdW5jdGlvbiBzKHQpe3JldHVybigodSp0K2gpKnQrYykqdH1mdW5jdGlvbiBvKHQsZSl7dmFyIHIsbixpLGEsbyxsO2ZvcihpPXQsbD0wO2w8ODtsKyspe2lmKGE9cyhpKS10LFgoYSk8ZSlyZXR1cm4gaTtpZihvPSgzKnUqaSsyKmgpKmkrYyxYKG8pPDFlLTYpYnJlYWs7aS09YS9vfWlmKHI9MCxuPTEsKGk9dCk8cilyZXR1cm4gcjtpZihpPm4pcmV0dXJuIG47Zm9yKDtyPG47KXtpZihhPXMoaSksWChhLXQpPGUpcmV0dXJuIGk7dD5hP3I9aTpuPWksaT0obi1yKS8yK3J9cmV0dXJuIGl9dmFyIGM9MyplLGg9Myoobi1lKS1jLHU9MS1jLWgsbD0zKnIsZj0zKihpLXIpLWwscD0xLWwtZjtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgcj1vKHQsZSk7cmV0dXJuKChwKnIrZikqcitsKSpyfSh0LDEvKDIwMCphKSl9ZnVuY3Rpb24gdih0LGUpe3ZhciByPVtdLG49e307aWYodGhpcy5tcz1lLHRoaXMudGltZXM9MSx0KXtmb3IodmFyIGkgaW4gdCl0W2tdKGkpJiYobltaKGkpXT10W2ldLHIucHVzaChaKGkpKSk7ci5zb3J0KHV0KX10aGlzLmFuaW09bix0aGlzLnRvcD1yW3IubGVuZ3RoLTFdLHRoaXMucGVyY2VudHM9cn1mdW5jdGlvbiB5KHQsbixpLGEscyxvKXtpPVooaSk7dmFyIGMsaCx1LGwsZixwLGc9dC5tcyx2PXt9LHk9e30sbT17fTtpZihhKWZvcihfPTAsRT1vZS5sZW5ndGg7XzxFO18rKyl7dmFyIGI9b2VbX107aWYoYi5lbC5pZD09bi5pZCYmYi5hbmltPT10KXtiLnBlcmNlbnQhPWk/KG9lLnNwbGljZShfLDEpLHU9MSk6aD1iLG4uYXR0cihiLnRvdGFsT3JpZ2luKTticmVha319ZWxzZSBhPSt5O2Zvcih2YXIgXz0wLEU9dC5wZXJjZW50cy5sZW5ndGg7XzxFO18rKyl7aWYodC5wZXJjZW50c1tfXT09aXx8dC5wZXJjZW50c1tfXT5hKnQudG9wKXtpPXQucGVyY2VudHNbX10sZj10LnBlcmNlbnRzW18tMV18fDAsZz1nL3QudG9wKihpLWYpLGw9dC5wZXJjZW50c1tfKzFdLGM9dC5hbmltW2ldO2JyZWFrfWEmJm4uYXR0cih0LmFuaW1bdC5wZXJjZW50c1tfXV0pfWlmKGMpe2lmKGgpaC5pbml0c3RhdHVzPWEsaC5zdGFydD1uZXcgRGF0ZS1oLm1zKmE7ZWxzZXtmb3IodmFyIEMgaW4gYylpZihjW2tdKEMpJiYocnRba10oQyl8fG4ucGFwZXIuY3VzdG9tQXR0cmlidXRlc1trXShDKSkpc3dpdGNoKHZbQ109bi5hdHRyKEMpLG51bGw9PXZbQ10mJih2W0NdPWV0W0NdKSx5W0NdPWNbQ10scnRbQ10pe2Nhc2UgSDptW0NdPSh5W0NdLXZbQ10pL2c7YnJlYWs7Y2FzZSJjb2xvdXIiOnZbQ109ci5nZXRSR0IodltDXSk7dmFyIFM9ci5nZXRSR0IoeVtDXSk7bVtDXT17cjooUy5yLXZbQ10ucikvZyxnOihTLmctdltDXS5nKS9nLGI6KFMuYi12W0NdLmIpL2d9O2JyZWFrO2Nhc2UicGF0aCI6dmFyIEE9RnQodltDXSx5W0NdKSxCPUFbMV07Zm9yKHZbQ109QVswXSxtW0NdPVtdLF89MCxFPXZbQ10ubGVuZ3RoO188RTtfKyspe21bQ11bX109WzBdO2Zvcih2YXIgTj0xLFQ9dltDXVtfXS5sZW5ndGg7TjxUO04rKyltW0NdW19dW05dPShCW19dW05dLXZbQ11bX11bTl0pL2d9YnJlYWs7Y2FzZSJ0cmFuc2Zvcm0iOnZhciBSPW4uXyxJPWp0KFJbQ10seVtDXSk7aWYoSSlmb3IodltDXT1JLmZyb20seVtDXT1JLnRvLG1bQ109W10sbVtDXS5yZWFsPSEwLF89MCxFPXZbQ10ubGVuZ3RoO188RTtfKyspZm9yKG1bQ11bX109W3ZbQ11bX11bMF1dLE49MSxUPXZbQ11bX10ubGVuZ3RoO048VDtOKyspbVtDXVtfXVtOXT0oeVtDXVtfXVtOXS12W0NdW19dW05dKS9nO2Vsc2V7dmFyIEQ9bi5tYXRyaXh8fG5ldyBkLFA9e186e3RyYW5zZm9ybTpSLnRyYW5zZm9ybX0sZ2V0QkJveDpmdW5jdGlvbigpe3JldHVybiBuLmdldEJCb3goMSl9fTt2W0NdPVtELmEsRC5iLEQuYyxELmQsRC5lLEQuZl0sTHQoUCx5W0NdKSx5W0NdPVAuXy50cmFuc2Zvcm0sbVtDXT1bKFAubWF0cml4LmEtRC5hKS9nLChQLm1hdHJpeC5iLUQuYikvZywoUC5tYXRyaXguYy1ELmMpL2csKFAubWF0cml4LmQtRC5kKS9nLChQLm1hdHJpeC5lLUQuZSkvZywoUC5tYXRyaXguZi1ELmYpL2ddfWJyZWFrO2Nhc2UiY3N2Ijp2YXIgTD1NKGNbQ10pW0ZdKHcpLHo9TSh2W0NdKVtGXSh3KTtpZigiY2xpcC1yZWN0Ij09Qylmb3IodltDXT16LG1bQ109W10sXz16Lmxlbmd0aDtfLS07KW1bQ11bX109KExbX10tdltDXVtfXSkvZzt5W0NdPUw7YnJlYWs7ZGVmYXVsdDpmb3IoTD1bXVtPXShjW0NdKSx6PVtdW09dKHZbQ10pLG1bQ109W10sXz1uLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbQ10ubGVuZ3RoO18tLTspbVtDXVtfXT0oKExbX118fDApLSh6W19dfHwwKSkvZ312YXIgaj1jLmVhc2luZyxVPXIuZWFzaW5nX2Zvcm11bGFzW2pdO2lmKCFVKWlmKChVPU0oaikubWF0Y2goJCkpJiY1PT1VLmxlbmd0aCl7dmFyIFg9VTtVPWZ1bmN0aW9uKHQpe3JldHVybiB4KHQsK1hbMV0sK1hbMl0sK1hbM10sK1hbNF0sZyl9fWVsc2UgVT1mdDtpZihwPWMuc3RhcnR8fHQuc3RhcnR8fCtuZXcgRGF0ZSxiPXthbmltOnQscGVyY2VudDppLHRpbWVzdGFtcDpwLHN0YXJ0OnArKHQuZGVsfHwwKSxzdGF0dXM6MCxpbml0c3RhdHVzOmF8fDAsc3RvcDohMSxtczpnLGVhc2luZzpVLGZyb206dixkaWZmOm0sdG86eSxlbDpuLGNhbGxiYWNrOmMuY2FsbGJhY2sscHJldjpmLG5leHQ6bCxyZXBlYXQ6b3x8dC50aW1lcyxvcmlnaW46bi5hdHRyKCksdG90YWxPcmlnaW46c30sb2UucHVzaChiKSxhJiYhaCYmIXUmJihiLnN0b3A9ITAsYi5zdGFydD1uZXcgRGF0ZS1nKmEsMT09b2UubGVuZ3RoKSlyZXR1cm4gaGUoKTt1JiYoYi5zdGFydD1uZXcgRGF0ZS1iLm1zKmEpLDE9PW9lLmxlbmd0aCYmY2UoaGUpfWUoInJhcGhhZWwuYW5pbS5zdGFydC4iK24uaWQsbix0KX19ZnVuY3Rpb24gbSh0KXtmb3IodmFyIGU9MDtlPG9lLmxlbmd0aDtlKyspb2VbZV0uZWwucGFwZXI9PXQmJm9lLnNwbGljZShlLS0sMSl9ci52ZXJzaW9uPSIyLjEuMiIsci5ldmU9ZTt2YXIgYixfLHc9L1ssIF0rLyxFPXtjaXJjbGU6MSxyZWN0OjEscGF0aDoxLGVsbGlwc2U6MSx0ZXh0OjEsaW1hZ2U6MX0sQz0vXHsoXGQrKVx9L2csaz0iaGFzT3duUHJvcGVydHkiLFM9e2RvYzpkb2N1bWVudCx3aW46dH0sQT17d2FzOk9iamVjdC5wcm90b3R5cGVba10uY2FsbChTLndpbiwiUmFwaGFlbCIpLGlzOlMud2luLlJhcGhhZWx9LEI9ZnVuY3Rpb24oKXt0aGlzLmNhPXRoaXMuY3VzdG9tQXR0cmlidXRlcz17fX0sTj0iYXBwbHkiLE89ImNvbmNhdCIsVD0ib250b3VjaHN0YXJ0ImluIFMud2lufHxTLndpbi5Eb2N1bWVudFRvdWNoJiZTLmRvYyBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2gsUj0iIixJPSIgIixNPVN0cmluZyxGPSJzcGxpdCIsRD0iY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNlbW92ZSBtb3VzZW91dCBtb3VzZW92ZXIgbW91c2V1cCB0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCJbRl0oSSksUD17bW91c2Vkb3duOiJ0b3VjaHN0YXJ0Iixtb3VzZW1vdmU6InRvdWNobW92ZSIsbW91c2V1cDoidG91Y2hlbmQifSxMPU0ucHJvdG90eXBlLnRvTG93ZXJDYXNlLHo9TWF0aCxqPXoubWF4LFU9ei5taW4sWD16LmFicyxHPXoucG93LHE9ei5QSSxIPSJudW1iZXIiLFc9ImFycmF5IixWPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsUT0oci5fSVNVUkw9L151cmxcKFsnIl0/KFteXCldKz8pWyciXT9cKSQvaSwvXlxzKigoI1thLWZcZF17Nn0pfCgjW2EtZlxkXXszfSl8cmdiYT9cKFxzKihbXGRcLl0rJT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSslPyg/OlxzKixccypbXGRcLl0rJT8pPylccypcKXxoc2JhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8pJT9ccypcKXxoc2xhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8pJT9ccypcKSlccyokL2kpLFk9e05hTjoxLEluZmluaXR5OjEsIi1JbmZpbml0eSI6MX0sJD0vXig/OmN1YmljLSk/YmV6aWVyXCgoW14sXSspLChbXixdKyksKFteLF0rKSwoW15cKV0rKVwpLyxLPXoucm91bmQsWj1wYXJzZUZsb2F0LEo9cGFyc2VJbnQsdHQ9TS5wcm90b3R5cGUudG9VcHBlckNhc2UsZXQ9ci5fYXZhaWxhYmxlQXR0cnM9eyJhcnJvdy1lbmQiOiJub25lIiwiYXJyb3ctc3RhcnQiOiJub25lIixibHVyOjAsImNsaXAtcmVjdCI6IjAgMCAxZTkgMWU5IixjdXJzb3I6ImRlZmF1bHQiLGN4OjAsY3k6MCxmaWxsOiIjZmZmIiwiZmlsbC1vcGFjaXR5IjoxLGZvbnQ6JzEwcHggIkFyaWFsIicsImZvbnQtZmFtaWx5IjonIkFyaWFsIicsImZvbnQtc2l6ZSI6IjEwIiwiZm9udC1zdHlsZSI6Im5vcm1hbCIsImZvbnQtd2VpZ2h0Ijo0MDAsZ3JhZGllbnQ6MCxoZWlnaHQ6MCxocmVmOiJodHRwOi8vcmFwaGFlbGpzLmNvbS8iLCJsZXR0ZXItc3BhY2luZyI6MCxvcGFjaXR5OjEscGF0aDoiTTAsMCIscjowLHJ4OjAscnk6MCxzcmM6IiIsc3Ryb2tlOiIjMDAwIiwic3Ryb2tlLWRhc2hhcnJheSI6IiIsInN0cm9rZS1saW5lY2FwIjoiYnV0dCIsInN0cm9rZS1saW5lam9pbiI6ImJ1dHQiLCJzdHJva2UtbWl0ZXJsaW1pdCI6MCwic3Ryb2tlLW9wYWNpdHkiOjEsInN0cm9rZS13aWR0aCI6MSx0YXJnZXQ6Il9ibGFuayIsInRleHQtYW5jaG9yIjoibWlkZGxlIix0aXRsZToiUmFwaGFlbCIsdHJhbnNmb3JtOiIiLHdpZHRoOjAseDowLHk6MH0scnQ9ci5fYXZhaWxhYmxlQW5pbUF0dHJzPXtibHVyOkgsImNsaXAtcmVjdCI6ImNzdiIsY3g6SCxjeTpILGZpbGw6ImNvbG91ciIsImZpbGwtb3BhY2l0eSI6SCwiZm9udC1zaXplIjpILGhlaWdodDpILG9wYWNpdHk6SCxwYXRoOiJwYXRoIixyOkgscng6SCxyeTpILHN0cm9rZToiY29sb3VyIiwic3Ryb2tlLW9wYWNpdHkiOkgsInN0cm9rZS13aWR0aCI6SCx0cmFuc2Zvcm06InRyYW5zZm9ybSIsd2lkdGg6SCx4OkgseTpIfSxudD0vW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKixbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qLyxpdD17aHM6MSxyZzoxfSxhdD0vLD8oW2FjaGxtcXJzdHZ4el0pLD8vZ2ksc3Q9LyhbYWNobG1ycXN0dnpdKVtceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5LF0qKCgtP1xkKlwuP1xkKig/OmVbXC0rXT9cZCspP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSosP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSopKykvZ2ksb3Q9LyhbcnN0bV0pW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjksXSooKC0/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/W1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKiw/W1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKikrKS9naSxjdD0vKC0/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/KVtceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSosP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSovZ2ksaHQ9KHIuX3JhZGlhbF9ncmFkaWVudD0vXnIoPzpcKChbXixdKz8pW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKixbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qKFteXCldKz8pXCkpPy8se30pLHV0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFoodCktWihlKX0sbHQ9ZnVuY3Rpb24oKXt9LGZ0PWZ1bmN0aW9uKHQpe3JldHVybiB0fSxwdD1yLl9yZWN0UGF0aD1mdW5jdGlvbih0LGUscixuLGkpe3JldHVybiBpP1tbIk0iLHQraSxlXSxbImwiLHItMippLDBdLFsiYSIsaSxpLDAsMCwxLGksaV0sWyJsIiwwLG4tMippXSxbImEiLGksaSwwLDAsMSwtaSxpXSxbImwiLDIqaS1yLDBdLFsiYSIsaSxpLDAsMCwxLC1pLC1pXSxbImwiLDAsMippLW5dLFsiYSIsaSxpLDAsMCwxLGksLWldLFsieiJdXTpbWyJNIix0LGVdLFsibCIsciwwXSxbImwiLDAsbl0sWyJsIiwtciwwXSxbInoiXV19LGR0PWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBudWxsPT1uJiYobj1yKSxbWyJNIix0LGVdLFsibSIsMCwtbl0sWyJhIixyLG4sMCwxLDEsMCwyKm5dLFsiYSIscixuLDAsMSwxLDAsLTIqbl0sWyJ6Il1dfSxndD1yLl9nZXRQYXRoPXtwYXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0LmF0dHIoInBhdGgiKX0sY2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIGR0KGUuY3gsZS5jeSxlLnIpfSxlbGxpcHNlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIGR0KGUuY3gsZS5jeSxlLnJ4LGUucnkpfSxyZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIHB0KGUueCxlLnksZS53aWR0aCxlLmhlaWdodCxlLnIpfSxpbWFnZTpmdW5jdGlvbih0KXt2YXIgZT10LmF0dHJzO3JldHVybiBwdChlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpfSx0ZXh0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2dldEJCb3goKTtyZXR1cm4gcHQoZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0KX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2dldEJCb3goKTtyZXR1cm4gcHQoZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0KX19LHh0PXIubWFwUGF0aD1mdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybiB0O3ZhciByLG4saSxhLHMsbyxjO2Zvcih0PUZ0KHQpLGk9MCxzPXQubGVuZ3RoO2k8cztpKyspZm9yKGM9dFtpXSxhPTEsbz1jLmxlbmd0aDthPG87YSs9MilyPWUueChjW2FdLGNbYSsxXSksbj1lLnkoY1thXSxjW2ErMV0pLGNbYV09cixjW2ErMV09bjtyZXR1cm4gdH07aWYoci5fZz1TLHIudHlwZT1TLndpbi5TVkdBbmdsZXx8Uy5kb2MuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNCYXNpY1N0cnVjdHVyZSIsIjEuMSIpPyJTVkciOiJWTUwiLCJWTUwiPT1yLnR5cGUpe3ZhciB2dCx5dD1TLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZih5dC5pbm5lckhUTUw9Jzx2OnNoYXBlIGFkaj0iMSIvPicsdnQ9eXQuZmlyc3RDaGlsZCx2dC5zdHlsZS5iZWhhdmlvcj0idXJsKCNkZWZhdWx0I1ZNTCkiLCF2dHx8Im9iamVjdCIhPXR5cGVvZiB2dC5hZGopcmV0dXJuIHIudHlwZT1SO3l0PW51bGx9ci5zdmc9IShyLnZtbD0iVk1MIj09ci50eXBlKSxyLl9QYXBlcj1CLHIuZm49Xz1CLnByb3RvdHlwZT1yLnByb3RvdHlwZSxyLl9pZD0wLHIuX29pZD0wLHIuaXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1MLmNhbGwoZSksImZpbml0ZSI9PWU/IVlba10oK3QpOiJhcnJheSI9PWU/dCBpbnN0YW5jZW9mIEFycmF5OiJudWxsIj09ZSYmbnVsbD09PXR8fGU9PXR5cGVvZiB0JiZudWxsIT09dHx8Im9iamVjdCI9PWUmJnQ9PT1PYmplY3QodCl8fCJhcnJheSI9PWUmJkFycmF5LmlzQXJyYXkmJkFycmF5LmlzQXJyYXkodCl8fFYuY2FsbCh0KS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpPT1lfSxyLmFuZ2xlPWZ1bmN0aW9uKHQsZSxuLGksYSxzKXtpZihudWxsPT1hKXt2YXIgbz10LW4sYz1lLWk7cmV0dXJuIG98fGM/KDE4MCsxODAqei5hdGFuMigtYywtbykvcSszNjApJTM2MDowfXJldHVybiByLmFuZ2xlKHQsZSxhLHMpLXIuYW5nbGUobixpLGEscyl9LHIucmFkPWZ1bmN0aW9uKHQpe3JldHVybiB0JTM2MCpxLzE4MH0sci5kZWc9ZnVuY3Rpb24odCl7cmV0dXJuIDE4MCp0L3ElMzYwfSxyLnNuYXBUbz1mdW5jdGlvbih0LGUsbil7aWYobj1yLmlzKG4sImZpbml0ZSIpP246MTAsci5pcyh0LFcpKXtmb3IodmFyIGk9dC5sZW5ndGg7aS0tOylpZihYKHRbaV0tZSk8PW4pcmV0dXJuIHRbaV19ZWxzZXt0PSt0O3ZhciBhPWUldDtpZihhPG4pcmV0dXJuIGUtYTtpZihhPnQtbilyZXR1cm4gZS1hK3R9cmV0dXJuIGV9O3IuY3JlYXRlVVVJRD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UodCxlKS50b1VwcGVyQ2FzZSgpfX0oL1t4eV0vZyxmdW5jdGlvbih0KXt2YXIgZT0xNip6LnJhbmRvbSgpfDA7cmV0dXJuKCJ4Ij09dD9lOjMmZXw4KS50b1N0cmluZygxNil9KTtyLnNldFdpbmRvdz1mdW5jdGlvbih0KXtlKCJyYXBoYWVsLnNldFdpbmRvdyIscixTLndpbix0KSxTLndpbj10LFMuZG9jPVMud2luLmRvY3VtZW50LHIuX2VuZ2luZS5pbml0V2luJiZyLl9lbmdpbmUuaW5pdFdpbihTLndpbil9O3ZhciBtdD1mdW5jdGlvbih0KXtpZihyLnZtbCl7dmFyIGUsbj0vXlxzK3xccyskL2c7dHJ5e3ZhciBpPW5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpO2kud3JpdGUoIjxib2R5PiIpLGkuY2xvc2UoKSxlPWkuYm9keX1jYXRjaCh0KXtlPWNyZWF0ZVBvcHVwKCkuZG9jdW1lbnQuYm9keX12YXIgcz1lLmNyZWF0ZVRleHRSYW5nZSgpO210PWEoZnVuY3Rpb24odCl7dHJ5e2Uuc3R5bGUuY29sb3I9TSh0KS5yZXBsYWNlKG4sUik7dmFyIHI9cy5xdWVyeUNvbW1hbmRWYWx1ZSgiRm9yZUNvbG9yIik7cmV0dXJuIHI9KDI1NSZyKTw8MTZ8NjUyODAmcnwoMTY3MTE2ODAmcik+Pj4xNiwiIyIrKCIwMDAwMDAiK3IudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Y2F0Y2godCl7cmV0dXJuIm5vbmUifX0pfWVsc2V7dmFyIG89Uy5kb2MuY3JlYXRlRWxlbWVudCgiaSIpO28udGl0bGU9IlJhcGhhw6tsIENvbG91ciBQaWNrZXIiLG8uc3R5bGUuZGlzcGxheT0ibm9uZSIsUy5kb2MuYm9keS5hcHBlbmRDaGlsZChvKSxtdD1hKGZ1bmN0aW9uKHQpe3JldHVybiBvLnN0eWxlLmNvbG9yPXQsUy5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShvLFIpLmdldFByb3BlcnR5VmFsdWUoImNvbG9yIil9KX1yZXR1cm4gbXQodCl9LGJ0PWZ1bmN0aW9uKCl7cmV0dXJuImhzYigiK1t0aGlzLmgsdGhpcy5zLHRoaXMuYl0rIikifSxfdD1mdW5jdGlvbigpe3JldHVybiJoc2woIitbdGhpcy5oLHRoaXMucyx0aGlzLmxdKyIpIn0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZXh9LEV0PWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT1lJiZyLmlzKHQsIm9iamVjdCIpJiYiciJpbiB0JiYiZyJpbiB0JiYiYiJpbiB0JiYobj10LmIsZT10LmcsdD10LnIpLG51bGw9PWUmJnIuaXModCwic3RyaW5nIikpe3ZhciBpPXIuZ2V0UkdCKHQpO3Q9aS5yLGU9aS5nLG49aS5ifXJldHVybih0PjF8fGU+MXx8bj4xKSYmKHQvPTI1NSxlLz0yNTUsbi89MjU1KSxbdCxlLG5dfSxDdD1mdW5jdGlvbih0LGUsbixpKXt0Kj0yNTUsZSo9MjU1LG4qPTI1NTt2YXIgYT17cjp0LGc6ZSxiOm4saGV4OnIucmdiKHQsZSxuKSx0b1N0cmluZzp3dH07cmV0dXJuIHIuaXMoaSwiZmluaXRlIikmJihhLm9wYWNpdHk9aSksYX07ci5jb2xvcj1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gci5pcyh0LCJvYmplY3QiKSYmImgiaW4gdCYmInMiaW4gdCYmImIiaW4gdD8oZT1yLmhzYjJyZ2IodCksdC5yPWUucix0Lmc9ZS5nLHQuYj1lLmIsdC5oZXg9ZS5oZXgpOnIuaXModCwib2JqZWN0IikmJiJoImluIHQmJiJzImluIHQmJiJsImluIHQ/KGU9ci5oc2wycmdiKHQpLHQucj1lLnIsdC5nPWUuZyx0LmI9ZS5iLHQuaGV4PWUuaGV4KTooci5pcyh0LCJzdHJpbmciKSYmKHQ9ci5nZXRSR0IodCkpLHIuaXModCwib2JqZWN0IikmJiJyImluIHQmJiJnImluIHQmJiJiImluIHQ/KGU9ci5yZ2IyaHNsKHQpLHQuaD1lLmgsdC5zPWUucyx0Lmw9ZS5sLGU9ci5yZ2IyaHNiKHQpLHQudj1lLmIpOih0PXtoZXg6Im5vbmUifSx0LnI9dC5nPXQuYj10Lmg9dC5zPXQudj10Lmw9LTEpKSx0LnRvU3RyaW5nPXd0LHR9LHIuaHNiMnJnYj1mdW5jdGlvbih0LGUscixuKXt0aGlzLmlzKHQsIm9iamVjdCIpJiYiaCJpbiB0JiYicyJpbiB0JiYiYiJpbiB0JiYocj10LmIsZT10LnMsdD10Lmgsbj10Lm8pLHQqPTM2MDt2YXIgaSxhLHMsbyxjO3JldHVybiB0PXQlMzYwLzYwLGM9ciplLG89YyooMS1YKHQlMi0xKSksaT1hPXM9ci1jLHQ9fn50LGkrPVtjLG8sMCwwLG8sY11bdF0sYSs9W28sYyxjLG8sMCwwXVt0XSxzKz1bMCwwLG8sYyxjLG9dW3RdLEN0KGksYSxzLG4pfSxyLmhzbDJyZ2I9ZnVuY3Rpb24odCxlLHIsbil7dGhpcy5pcyh0LCJvYmplY3QiKSYmImgiaW4gdCYmInMiaW4gdCYmImwiaW4gdCYmKHI9dC5sLGU9dC5zLHQ9dC5oKSwodD4xfHxlPjF8fHI+MSkmJih0Lz0zNjAsZS89MTAwLHIvPTEwMCksdCo9MzYwO3ZhciBpLGEscyxvLGM7cmV0dXJuIHQ9dCUzNjAvNjAsYz0yKmUqKHI8LjU/cjoxLXIpLG89YyooMS1YKHQlMi0xKSksaT1hPXM9ci1jLzIsdD1+fnQsaSs9W2MsbywwLDAsbyxjXVt0XSxhKz1bbyxjLGMsbywwLDBdW3RdLHMrPVswLDAsbyxjLGMsb11bdF0sQ3QoaSxhLHMsbil9LHIucmdiMmhzYj1mdW5jdGlvbih0LGUscil7cj1FdCh0LGUsciksdD1yWzBdLGU9clsxXSxyPXJbMl07dmFyIG4saSxhLHM7cmV0dXJuIGE9aih0LGUscikscz1hLVUodCxlLHIpLG49MD09cz9udWxsOmE9PXQ/KGUtcikvczphPT1lPyhyLXQpL3MrMjoodC1lKS9zKzQsbj0obiszNjApJTYqNjAvMzYwLGk9MD09cz8wOnMvYSx7aDpuLHM6aSxiOmEsdG9TdHJpbmc6YnR9fSxyLnJnYjJoc2w9ZnVuY3Rpb24odCxlLHIpe3I9RXQodCxlLHIpLHQ9clswXSxlPXJbMV0scj1yWzJdO3ZhciBuLGksYSxzLG8sYztyZXR1cm4gcz1qKHQsZSxyKSxvPVUodCxlLHIpLGM9cy1vLG49MD09Yz9udWxsOnM9PXQ/KGUtcikvYzpzPT1lPyhyLXQpL2MrMjoodC1lKS9jKzQsbj0obiszNjApJTYqNjAvMzYwLGE9KHMrbykvMixpPTA9PWM/MDphPC41P2MvKDIqYSk6Yy8oMi0yKmEpLHtoOm4sczppLGw6YSx0b1N0cmluZzpfdH19LHIuX3BhdGgyc3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pbigiLCIpLnJlcGxhY2UoYXQsIiQxIil9O3IuX3ByZWxvYWQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1TLmRvYy5jcmVhdGVFbGVtZW50KCJpbWciKTtyLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbSIsci5vbmxvYWQ9ZnVuY3Rpb24oKXtlLmNhbGwodGhpcyksdGhpcy5vbmxvYWQ9bnVsbCxTLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtTLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxTLmRvYy5ib2R5LmFwcGVuZENoaWxkKHIpLHIuc3JjPXR9O3IuZ2V0UkdCPWEoZnVuY3Rpb24odCl7aWYoIXR8fCh0PU0odCkpLmluZGV4T2YoIi0iKSsxKXJldHVybntyOi0xLGc6LTEsYjotMSxoZXg6Im5vbmUiLGVycm9yOjEsdG9TdHJpbmc6c307aWYoIm5vbmUiPT10KXJldHVybntyOi0xLGc6LTEsYjotMSxoZXg6Im5vbmUiLHRvU3RyaW5nOnN9OyEoaXRba10odC50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZygwLDIpKXx8IiMiPT10LmNoYXJBdCgpKSYmKHQ9bXQodCkpO3ZhciBlLG4saSxhLG8sYyxoPXQubWF0Y2goUSk7cmV0dXJuIGg/KGhbMl0mJihpPUooaFsyXS5zdWJzdHJpbmcoNSksMTYpLG49SihoWzJdLnN1YnN0cmluZygzLDUpLDE2KSxlPUooaFsyXS5zdWJzdHJpbmcoMSwzKSwxNikpLGhbM10mJihpPUooKG89aFszXS5jaGFyQXQoMykpK28sMTYpLA0Kbj1KKChvPWhbM10uY2hhckF0KDIpKStvLDE2KSxlPUooKG89aFszXS5jaGFyQXQoMSkpK28sMTYpKSxoWzRdJiYoYz1oWzRdW0ZdKG50KSxlPVooY1swXSksIiUiPT1jWzBdLnNsaWNlKC0xKSYmKGUqPTIuNTUpLG49WihjWzFdKSwiJSI9PWNbMV0uc2xpY2UoLTEpJiYobio9Mi41NSksaT1aKGNbMl0pLCIlIj09Y1syXS5zbGljZSgtMSkmJihpKj0yLjU1KSwicmdiYSI9PWhbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpJiYoYT1aKGNbM10pKSxjWzNdJiYiJSI9PWNbM10uc2xpY2UoLTEpJiYoYS89MTAwKSksaFs1XT8oYz1oWzVdW0ZdKG50KSxlPVooY1swXSksIiUiPT1jWzBdLnNsaWNlKC0xKSYmKGUqPTIuNTUpLG49WihjWzFdKSwiJSI9PWNbMV0uc2xpY2UoLTEpJiYobio9Mi41NSksaT1aKGNbMl0pLCIlIj09Y1syXS5zbGljZSgtMSkmJihpKj0yLjU1KSwoImRlZyI9PWNbMF0uc2xpY2UoLTMpfHwiwrAiPT1jWzBdLnNsaWNlKC0xKSkmJihlLz0zNjApLCJoc2JhIj09aFsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihhPVooY1szXSkpLGNbM10mJiIlIj09Y1szXS5zbGljZSgtMSkmJihhLz0xMDApLHIuaHNiMnJnYihlLG4saSxhKSk6aFs2XT8oYz1oWzZdW0ZdKG50KSxlPVooY1swXSksIiUiPT1jWzBdLnNsaWNlKC0xKSYmKGUqPTIuNTUpLG49WihjWzFdKSwiJSI9PWNbMV0uc2xpY2UoLTEpJiYobio9Mi41NSksaT1aKGNbMl0pLCIlIj09Y1syXS5zbGljZSgtMSkmJihpKj0yLjU1KSwoImRlZyI9PWNbMF0uc2xpY2UoLTMpfHwiwrAiPT1jWzBdLnNsaWNlKC0xKSkmJihlLz0zNjApLCJoc2xhIj09aFsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihhPVooY1szXSkpLGNbM10mJiIlIj09Y1szXS5zbGljZSgtMSkmJihhLz0xMDApLHIuaHNsMnJnYihlLG4saSxhKSk6KGg9e3I6ZSxnOm4sYjppLHRvU3RyaW5nOnN9LGguaGV4PSIjIisoMTY3NzcyMTZ8aXxuPDw4fGU8PDE2KS50b1N0cmluZygxNikuc2xpY2UoMSksci5pcyhhLCJmaW5pdGUiKSYmKGgub3BhY2l0eT1hKSxoKSk6e3I6LTEsZzotMSxiOi0xLGhleDoibm9uZSIsZXJyb3I6MSx0b1N0cmluZzpzfX0sciksci5oc2I9YShmdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuaHNiMnJnYih0LGUsbikuaGV4fSksci5oc2w9YShmdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuaHNsMnJnYih0LGUsbikuaGV4fSksci5yZ2I9YShmdW5jdGlvbih0LGUscil7cmV0dXJuIiMiKygxNjc3NzIxNnxyfGU8PDh8dDw8MTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0pLHIuZ2V0Q29sb3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRDb2xvci5zdGFydD10aGlzLmdldENvbG9yLnN0YXJ0fHx7aDowLHM6MSxiOnR8fC43NX0scj10aGlzLmhzYjJyZ2IoZS5oLGUucyxlLmIpO3JldHVybiBlLmgrPS4wNzUsZS5oPjEmJihlLmg9MCxlLnMtPS4yLGUuczw9MCYmKHRoaXMuZ2V0Q29sb3Iuc3RhcnQ9e2g6MCxzOjEsYjplLmJ9KSksci5oZXh9LHIuZ2V0Q29sb3IucmVzZXQ9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5zdGFydH0sci5wYXJzZVBhdGhTdHJpbmc9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGU9a3QodCk7aWYoZS5hcnIpcmV0dXJuIEF0KGUuYXJyKTt2YXIgbj17YTo3LGM6NixoOjEsbDoyLG06MixyOjQscTo0LHM6NCx0OjIsdjoxLHo6MH0saT1bXTtyZXR1cm4gci5pcyh0LFcpJiZyLmlzKHRbMF0sVykmJihpPUF0KHQpKSxpLmxlbmd0aHx8TSh0KS5yZXBsYWNlKHN0LGZ1bmN0aW9uKHQsZSxyKXt2YXIgYT1bXSxzPWUudG9Mb3dlckNhc2UoKTtpZihyLnJlcGxhY2UoY3QsZnVuY3Rpb24odCxlKXtlJiZhLnB1c2goK2UpfSksIm0iPT1zJiZhLmxlbmd0aD4yJiYoaS5wdXNoKFtlXVtPXShhLnNwbGljZSgwLDIpKSkscz0ibCIsZT0ibSI9PWU/ImwiOiJMIiksInIiPT1zKWkucHVzaChbZV1bT10oYSkpO2Vsc2UgZm9yKDthLmxlbmd0aD49bltzXSYmKGkucHVzaChbZV1bT10oYS5zcGxpY2UoMCxuW3NdKSkpLG5bc10pOyk7fSksaS50b1N0cmluZz1yLl9wYXRoMnN0cmluZyxlLmFycj1BdChpKSxpfSxyLnBhcnNlVHJhbnNmb3JtU3RyaW5nPWEoZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGU9W107cmV0dXJuIHIuaXModCxXKSYmci5pcyh0WzBdLFcpJiYoZT1BdCh0KSksZS5sZW5ndGh8fE0odCkucmVwbGFjZShvdCxmdW5jdGlvbih0LHIsbil7dmFyIGk9W107TC5jYWxsKHIpO24ucmVwbGFjZShjdCxmdW5jdGlvbih0LGUpe2UmJmkucHVzaCgrZSl9KSxlLnB1c2goW3JdW09dKGkpKX0pLGUudG9TdHJpbmc9ci5fcGF0aDJzdHJpbmcsZX0pO3ZhciBrdD1mdW5jdGlvbih0KXt2YXIgZT1rdC5wcz1rdC5wc3x8e307cmV0dXJuIGVbdF0/ZVt0XS5zbGVlcD0xMDA6ZVt0XT17c2xlZXA6MTAwfSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zm9yKHZhciByIGluIGUpZVtrXShyKSYmciE9dCYmIS0tZVtyXS5zbGVlcCYmZGVsZXRlIGVbcl19KSxlW3RdfTtyLmZpbmREb3RzQXRTZWdtZW50PWZ1bmN0aW9uKHQsZSxyLG4saSxhLHMsbyxjKXt2YXIgaD0xLWMsdT1HKGgsMyksbD1HKGgsMiksZj1jKmMscD1mKmMsZD11KnQrMypsKmMqciszKmgqYypjKmkrcCpzLGc9dSplKzMqbCpjKm4rMypoKmMqYyphK3Aqbyx4PXQrMipjKihyLXQpK2YqKGktMipyK3QpLHY9ZSsyKmMqKG4tZSkrZiooYS0yKm4rZSkseT1yKzIqYyooaS1yKStmKihzLTIqaStyKSxtPW4rMipjKihhLW4pK2YqKG8tMiphK24pLGI9aCp0K2MqcixfPWgqZStjKm4sdz1oKmkrYypzLEU9aCphK2MqbyxDPTkwLTE4MCp6LmF0YW4yKHgteSx2LW0pL3E7cmV0dXJuKHg+eXx8djxtKSYmKEMrPTE4MCkse3g6ZCx5OmcsbTp7eDp4LHk6dn0sbjp7eDp5LHk6bX0sc3RhcnQ6e3g6Yix5Ol99LGVuZDp7eDp3LHk6RX0sYWxwaGE6Q319LHIuYmV6aWVyQkJveD1mdW5jdGlvbih0LGUsbixpLGEscyxvLGMpe3IuaXModCwiYXJyYXkiKXx8KHQ9W3QsZSxuLGksYSxzLG8sY10pO3ZhciBoPU10LmFwcGx5KG51bGwsdCk7cmV0dXJue3g6aC5taW4ueCx5OmgubWluLnkseDI6aC5tYXgueCx5MjpoLm1heC55LHdpZHRoOmgubWF4LngtaC5taW4ueCxoZWlnaHQ6aC5tYXgueS1oLm1pbi55fX0sci5pc1BvaW50SW5zaWRlQkJveD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU+PXQueCYmZTw9dC54MiYmcj49dC55JiZyPD10LnkyfSxyLmlzQkJveEludGVyc2VjdD1mdW5jdGlvbih0LGUpe3ZhciBuPXIuaXNQb2ludEluc2lkZUJCb3g7cmV0dXJuIG4oZSx0LngsdC55KXx8bihlLHQueDIsdC55KXx8bihlLHQueCx0LnkyKXx8bihlLHQueDIsdC55Mil8fG4odCxlLngsZS55KXx8bih0LGUueDIsZS55KXx8bih0LGUueCxlLnkyKXx8bih0LGUueDIsZS55Mil8fCh0Lng8ZS54MiYmdC54PmUueHx8ZS54PHQueDImJmUueD50LngpJiYodC55PGUueTImJnQueT5lLnl8fGUueTx0LnkyJiZlLnk+dC55KX0sci5wYXRoSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAodCxlKX0sci5wYXRoSW50ZXJzZWN0aW9uTnVtYmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAodCxlLDEpfSxyLmlzUG9pbnRJbnNpZGVQYXRoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1yLnBhdGhCQm94KHQpO3JldHVybiByLmlzUG9pbnRJbnNpZGVCQm94KGksZSxuKSYmcCh0LFtbIk0iLGUsbl0sWyJIIixpLngyKzEwXV0sMSklMj09MX0sci5fcmVtb3ZlZEZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSgicmFwaGFlbC5sb2ciLG51bGwsIlJhcGhhw6tsOiB5b3UgYXJlIGNhbGxpbmcgdG8gbWV0aG9kIOKAnCIrdCsi4oCdIG9mIHJlbW92ZWQgb2JqZWN0Iix0KX19O3ZhciBTdD1yLnBhdGhCQm94PWZ1bmN0aW9uKHQpe3ZhciBlPWt0KHQpO2lmKGUuYmJveClyZXR1cm4gbihlLmJib3gpO2lmKCF0KXJldHVybnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjAseDI6MCx5MjowfTt0PUZ0KHQpO2Zvcih2YXIgcixpPTAsYT0wLHM9W10sbz1bXSxjPTAsaD10Lmxlbmd0aDtjPGg7YysrKWlmKHI9dFtjXSwiTSI9PXJbMF0paT1yWzFdLGE9clsyXSxzLnB1c2goaSksby5wdXNoKGEpO2Vsc2V7dmFyIHU9TXQoaSxhLHJbMV0sclsyXSxyWzNdLHJbNF0scls1XSxyWzZdKTtzPXNbT10odS5taW4ueCx1Lm1heC54KSxvPW9bT10odS5taW4ueSx1Lm1heC55KSxpPXJbNV0sYT1yWzZdfXZhciBsPVVbTl0oMCxzKSxmPVVbTl0oMCxvKSxwPWpbTl0oMCxzKSxkPWpbTl0oMCxvKSxnPXAtbCx4PWQtZix2PXt4OmwseTpmLHgyOnAseTI6ZCx3aWR0aDpnLGhlaWdodDp4LGN4OmwrZy8yLGN5OmYreC8yfTtyZXR1cm4gZS5iYm94PW4odiksdn0sQXQ9ZnVuY3Rpb24odCl7dmFyIGU9bih0KTtyZXR1cm4gZS50b1N0cmluZz1yLl9wYXRoMnN0cmluZyxlfSxCdD1yLl9wYXRoVG9SZWxhdGl2ZT1mdW5jdGlvbih0KXt2YXIgZT1rdCh0KTtpZihlLnJlbClyZXR1cm4gQXQoZS5yZWwpO3IuaXModCxXKSYmci5pcyh0JiZ0WzBdLFcpfHwodD1yLnBhcnNlUGF0aFN0cmluZyh0KSk7dmFyIG49W10saT0wLGE9MCxzPTAsbz0wLGM9MDsiTSI9PXRbMF1bMF0mJihpPXRbMF1bMV0sYT10WzBdWzJdLHM9aSxvPWEsYysrLG4ucHVzaChbIk0iLGksYV0pKTtmb3IodmFyIGg9Yyx1PXQubGVuZ3RoO2g8dTtoKyspe3ZhciBsPW5baF09W10sZj10W2hdO2lmKGZbMF0hPUwuY2FsbChmWzBdKSlzd2l0Y2gobFswXT1MLmNhbGwoZlswXSksbFswXSl7Y2FzZSJhIjpsWzFdPWZbMV0sbFsyXT1mWzJdLGxbM109ZlszXSxsWzRdPWZbNF0sbFs1XT1mWzVdLGxbNl09KyhmWzZdLWkpLnRvRml4ZWQoMyksbFs3XT0rKGZbN10tYSkudG9GaXhlZCgzKTticmVhaztjYXNlInYiOmxbMV09KyhmWzFdLWEpLnRvRml4ZWQoMyk7YnJlYWs7Y2FzZSJtIjpzPWZbMV0sbz1mWzJdO2RlZmF1bHQ6Zm9yKHZhciBwPTEsZD1mLmxlbmd0aDtwPGQ7cCsrKWxbcF09KyhmW3BdLShwJTI/aTphKSkudG9GaXhlZCgzKX1lbHNle2w9bltoXT1bXSwibSI9PWZbMF0mJihzPWZbMV0raSxvPWZbMl0rYSk7Zm9yKHZhciBnPTAseD1mLmxlbmd0aDtnPHg7ZysrKW5baF1bZ109ZltnXX12YXIgdj1uW2hdLmxlbmd0aDtzd2l0Y2gobltoXVswXSl7Y2FzZSJ6IjppPXMsYT1vO2JyZWFrO2Nhc2UiaCI6aSs9K25baF1bdi0xXTticmVhaztjYXNlInYiOmErPStuW2hdW3YtMV07YnJlYWs7ZGVmYXVsdDppKz0rbltoXVt2LTJdLGErPStuW2hdW3YtMV19fXJldHVybiBuLnRvU3RyaW5nPXIuX3BhdGgyc3RyaW5nLGUucmVsPUF0KG4pLG59LE50PXIuX3BhdGhUb0Fic29sdXRlPWZ1bmN0aW9uKHQpe3ZhciBlPWt0KHQpO2lmKGUuYWJzKXJldHVybiBBdChlLmFicyk7aWYoci5pcyh0LFcpJiZyLmlzKHQmJnRbMF0sVyl8fCh0PXIucGFyc2VQYXRoU3RyaW5nKHQpKSwhdHx8IXQubGVuZ3RoKXJldHVybltbIk0iLDAsMF1dO3ZhciBuPVtdLGk9MCxhPTAscz0wLGM9MCxoPTA7Ik0iPT10WzBdWzBdJiYoaT0rdFswXVsxXSxhPSt0WzBdWzJdLHM9aSxjPWEsaCsrLG5bMF09WyJNIixpLGFdKTtmb3IodmFyIHUsbCxmPTM9PXQubGVuZ3RoJiYiTSI9PXRbMF1bMF0mJiJSIj09dFsxXVswXS50b1VwcGVyQ2FzZSgpJiYiWiI9PXRbMl1bMF0udG9VcHBlckNhc2UoKSxwPWgsZD10Lmxlbmd0aDtwPGQ7cCsrKXtpZihuLnB1c2godT1bXSksbD10W3BdLGxbMF0hPXR0LmNhbGwobFswXSkpc3dpdGNoKHVbMF09dHQuY2FsbChsWzBdKSx1WzBdKXtjYXNlIkEiOnVbMV09bFsxXSx1WzJdPWxbMl0sdVszXT1sWzNdLHVbNF09bFs0XSx1WzVdPWxbNV0sdVs2XT0rKGxbNl0raSksdVs3XT0rKGxbN10rYSk7YnJlYWs7Y2FzZSJWIjp1WzFdPStsWzFdK2E7YnJlYWs7Y2FzZSJIIjp1WzFdPStsWzFdK2k7YnJlYWs7Y2FzZSJSIjpmb3IodmFyIGc9W2ksYV1bT10obC5zbGljZSgxKSkseD0yLHY9Zy5sZW5ndGg7eDx2O3grKylnW3hdPStnW3hdK2ksZ1srK3hdPStnW3hdK2E7bi5wb3AoKSxuPW5bT10obyhnLGYpKTticmVhaztjYXNlIk0iOnM9K2xbMV0raSxjPStsWzJdK2E7ZGVmYXVsdDpmb3IoeD0xLHY9bC5sZW5ndGg7eDx2O3grKyl1W3hdPStsW3hdKyh4JTI/aTphKX1lbHNlIGlmKCJSIj09bFswXSlnPVtpLGFdW09dKGwuc2xpY2UoMSkpLG4ucG9wKCksbj1uW09dKG8oZyxmKSksdT1bIlIiXVtPXShsLnNsaWNlKC0yKSk7ZWxzZSBmb3IodmFyIHk9MCxtPWwubGVuZ3RoO3k8bTt5KyspdVt5XT1sW3ldO3N3aXRjaCh1WzBdKXtjYXNlIloiOmk9cyxhPWM7YnJlYWs7Y2FzZSJIIjppPXVbMV07YnJlYWs7Y2FzZSJWIjphPXVbMV07YnJlYWs7Y2FzZSJNIjpzPXVbdS5sZW5ndGgtMl0sYz11W3UubGVuZ3RoLTFdO2RlZmF1bHQ6aT11W3UubGVuZ3RoLTJdLGE9dVt1Lmxlbmd0aC0xXX19cmV0dXJuIG4udG9TdHJpbmc9ci5fcGF0aDJzdHJpbmcsZS5hYnM9QXQobiksbn0sT3Q9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuW3QsZSxyLG4scixuXX0sVHQ9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3JldHVyblsxLzMqdCsyLzMqciwxLzMqZSsyLzMqbiwxLzMqaSsyLzMqciwxLzMqYSsyLzMqbixpLGFdfSxSdD1mdW5jdGlvbih0LGUscixuLGkscyxvLGMsaCx1KXt2YXIgbCxmPTEyMCpxLzE4MCxwPXEvMTgwKigraXx8MCksZD1bXSxnPWEoZnVuY3Rpb24odCxlLHIpe3JldHVybnt4OnQqei5jb3MociktZSp6LnNpbihyKSx5OnQqei5zaW4ocikrZSp6LmNvcyhyKX19KTtpZih1KUM9dVswXSxrPXVbMV0sdz11WzJdLEU9dVszXTtlbHNle2w9Zyh0LGUsLXApLHQ9bC54LGU9bC55LGw9ZyhjLGgsLXApLGM9bC54LGg9bC55O3ZhciB4PSh6LmNvcyhxLzE4MCppKSx6LnNpbihxLzE4MCppKSwodC1jKS8yKSx2PShlLWgpLzIseT14KngvKHIqcikrdip2LyhuKm4pO3k+MSYmKHk9ei5zcXJ0KHkpLHIqPXksbio9eSk7dmFyIG09cipyLGI9bipuLF89KHM9PW8/LTE6MSkqei5zcXJ0KFgoKG0qYi1tKnYqdi1iKngqeCkvKG0qdip2K2IqeCp4KSkpLHc9XypyKnYvbisodCtjKS8yLEU9Xyotbip4L3IrKGUraCkvMixDPXouYXNpbigoKGUtRSkvbikudG9GaXhlZCg5KSksaz16LmFzaW4oKChoLUUpL24pLnRvRml4ZWQoOSkpO0M9dDx3P3EtQzpDLGs9Yzx3P3EtazprLEM8MCYmKEM9MipxK0MpLGs8MCYmKGs9MipxK2spLG8mJkM+ayYmKEMtPTIqcSksIW8mJms+QyYmKGstPTIqcSl9dmFyIFM9ay1DO2lmKFgoUyk+Zil7dmFyIEE9ayxCPWMsTj1oO2s9QytmKihvJiZrPkM/MTotMSksYz13K3Iqei5jb3MoayksaD1FK24qei5zaW4oayksZD1SdChjLGgscixuLGksMCxvLEIsTixbayxBLHcsRV0pfVM9ay1DO3ZhciBUPXouY29zKEMpLFI9ei5zaW4oQyksST16LmNvcyhrKSxNPXouc2luKGspLEQ9ei50YW4oUy80KSxQPTQvMypyKkQsTD00LzMqbipELGo9W3QsZV0sVT1bdCtQKlIsZS1MKlRdLEc9W2MrUCpNLGgtTCpJXSxIPVtjLGhdO2lmKFVbMF09MipqWzBdLVVbMF0sVVsxXT0yKmpbMV0tVVsxXSx1KXJldHVybltVLEcsSF1bT10oZCk7ZD1bVSxHLEhdW09dKGQpLmpvaW4oKVtGXSgiLCIpO2Zvcih2YXIgVz1bXSxWPTAsUT1kLmxlbmd0aDtWPFE7VisrKVdbVl09ViUyP2coZFtWLTFdLGRbVl0scCkueTpnKGRbVl0sZFtWKzFdLHApLng7cmV0dXJuIFd9LEl0PWZ1bmN0aW9uKHQsZSxyLG4saSxhLHMsbyxjKXt2YXIgaD0xLWM7cmV0dXJue3g6RyhoLDMpKnQrMypHKGgsMikqYypyKzMqaCpjKmMqaStHKGMsMykqcyx5OkcoaCwzKSplKzMqRyhoLDIpKmMqbiszKmgqYypjKmErRyhjLDMpKm99fSxNdD1hKGZ1bmN0aW9uKHQsZSxyLG4saSxhLHMsbyl7dmFyIGMsaD1pLTIqcit0LShzLTIqaStyKSx1PTIqKHItdCktMiooaS1yKSxsPXQtcixmPSgtdSt6LnNxcnQodSp1LTQqaCpsKSkvMi9oLHA9KC11LXouc3FydCh1KnUtNCpoKmwpKS8yL2gsZD1bZSxvXSxnPVt0LHNdO3JldHVybiBYKGYpPiIxZTEyIiYmKGY9LjUpLFgocCk+IjFlMTIiJiYocD0uNSksZj4wJiZmPDEmJihjPUl0KHQsZSxyLG4saSxhLHMsbyxmKSxnLnB1c2goYy54KSxkLnB1c2goYy55KSkscD4wJiZwPDEmJihjPUl0KHQsZSxyLG4saSxhLHMsbyxwKSxnLnB1c2goYy54KSxkLnB1c2goYy55KSksaD1hLTIqbitlLShvLTIqYStuKSx1PTIqKG4tZSktMiooYS1uKSxsPWUtbixmPSgtdSt6LnNxcnQodSp1LTQqaCpsKSkvMi9oLHA9KC11LXouc3FydCh1KnUtNCpoKmwpKS8yL2gsWChmKT4iMWUxMiImJihmPS41KSxYKHApPiIxZTEyIiYmKHA9LjUpLGY+MCYmZjwxJiYoYz1JdCh0LGUscixuLGksYSxzLG8sZiksZy5wdXNoKGMueCksZC5wdXNoKGMueSkpLHA+MCYmcDwxJiYoYz1JdCh0LGUscixuLGksYSxzLG8scCksZy5wdXNoKGMueCksZC5wdXNoKGMueSkpLHttaW46e3g6VVtOXSgwLGcpLHk6VVtOXSgwLGQpfSxtYXg6e3g6altOXSgwLGcpLHk6altOXSgwLGQpfX19KSxGdD1yLl9wYXRoMmN1cnZlPWEoZnVuY3Rpb24odCxlKXt2YXIgcj0hZSYma3QodCk7aWYoIWUmJnIuY3VydmUpcmV0dXJuIEF0KHIuY3VydmUpO2Zvcih2YXIgbj1OdCh0KSxpPWUmJk50KGUpLGE9e3g6MCx5OjAsYng6MCxieTowLFg6MCxZOjAscXg6bnVsbCxxeTpudWxsfSxzPXt4OjAseTowLGJ4OjAsYnk6MCxYOjAsWTowLHF4Om51bGwscXk6bnVsbH0sbz0oZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYT17VDoxLFE6MX07aWYoIXQpcmV0dXJuWyJDIixlLngsZS55LGUueCxlLnksZS54LGUueV07c3dpdGNoKCEodFswXWluIGEpJiYoZS5xeD1lLnF5PW51bGwpLHRbMF0pe2Nhc2UiTSI6ZS5YPXRbMV0sZS5ZPXRbMl07YnJlYWs7Y2FzZSJBIjp0PVsiQyJdW09dKFJ0W05dKDAsW2UueCxlLnldW09dKHQuc2xpY2UoMSkpKSk7YnJlYWs7Y2FzZSJTIjoiQyI9PXJ8fCJTIj09cj8obj0yKmUueC1lLmJ4LGk9MiplLnktZS5ieSk6KG49ZS54LGk9ZS55KSx0PVsiQyIsbixpXVtPXSh0LnNsaWNlKDEpKTticmVhaztjYXNlIlQiOiJRIj09cnx8IlQiPT1yPyhlLnF4PTIqZS54LWUucXgsZS5xeT0yKmUueS1lLnF5KTooZS5xeD1lLngsZS5xeT1lLnkpLHQ9WyJDIl1bT10oVHQoZS54LGUueSxlLnF4LGUucXksdFsxXSx0WzJdKSk7YnJlYWs7Y2FzZSJRIjplLnF4PXRbMV0sZS5xeT10WzJdLHQ9WyJDIl1bT10oVHQoZS54LGUueSx0WzFdLHRbMl0sdFszXSx0WzRdKSk7YnJlYWs7Y2FzZSJMIjp0PVsiQyJdW09dKE90KGUueCxlLnksdFsxXSx0WzJdKSk7YnJlYWs7Y2FzZSJIIjp0PVsiQyJdW09dKE90KGUueCxlLnksdFsxXSxlLnkpKTticmVhaztjYXNlIlYiOnQ9WyJDIl1bT10oT3QoZS54LGUueSxlLngsdFsxXSkpO2JyZWFrO2Nhc2UiWiI6dD1bIkMiXVtPXShPdChlLngsZS55LGUuWCxlLlkpKX1yZXR1cm4gdH0pLGM9ZnVuY3Rpb24odCxlKXtpZih0W2VdLmxlbmd0aD43KXt0W2VdLnNoaWZ0KCk7Zm9yKHZhciByPXRbZV07ci5sZW5ndGg7KXQuc3BsaWNlKGUrKywwLFsiQyJdW09dKHIuc3BsaWNlKDAsNikpKTt0LnNwbGljZShlLDEpLGw9aihuLmxlbmd0aCxpJiZpLmxlbmd0aHx8MCl9fSxoPWZ1bmN0aW9uKHQsZSxyLGEscyl7dCYmZSYmIk0iPT10W3NdWzBdJiYiTSIhPWVbc11bMF0mJihlLnNwbGljZShzLDAsWyJNIixhLngsYS55XSksci5ieD0wLHIuYnk9MCxyLng9dFtzXVsxXSxyLnk9dFtzXVsyXSxsPWoobi5sZW5ndGgsaSYmaS5sZW5ndGh8fDApKX0sdT0wLGw9aihuLmxlbmd0aCxpJiZpLmxlbmd0aHx8MCk7dTxsO3UrKyl7blt1XT1vKG5bdV0sYSksYyhuLHUpLGkmJihpW3VdPW8oaVt1XSxzKSksaSYmYyhpLHUpLGgobixpLGEscyx1KSxoKGksbixzLGEsdSk7dmFyIGY9blt1XSxwPWkmJmlbdV0sZD1mLmxlbmd0aCxnPWkmJnAubGVuZ3RoO2EueD1mW2QtMl0sYS55PWZbZC0xXSxhLmJ4PVooZltkLTRdKXx8YS54LGEuYnk9WihmW2QtM10pfHxhLnkscy5ieD1pJiYoWihwW2ctNF0pfHxzLngpLHMuYnk9aSYmKFoocFtnLTNdKXx8cy55KSxzLng9aSYmcFtnLTJdLHMueT1pJiZwW2ctMV19cmV0dXJuIGl8fChyLmN1cnZlPUF0KG4pKSxpP1tuLGldOm59LG51bGwsQXQpLER0PShyLl9wYXJzZURvdHM9YShmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7dmFyIGE9e30scz10W25dLm1hdGNoKC9eKFteOl0qKTo/KFtcZFwuXSopLyk7aWYoYS5jb2xvcj1yLmdldFJHQihzWzFdKSxhLmNvbG9yLmVycm9yKXJldHVybiBudWxsO2EuY29sb3I9YS5jb2xvci5oZXgsc1syXSYmKGEub2Zmc2V0PXNbMl0rIiUiKSxlLnB1c2goYSl9Zm9yKG49MSxpPWUubGVuZ3RoLTE7bjxpO24rKylpZighZVtuXS5vZmZzZXQpe2Zvcih2YXIgbz1aKGVbbi0xXS5vZmZzZXR8fDApLGM9MCxoPW4rMTtoPGk7aCsrKWlmKGVbaF0ub2Zmc2V0KXtjPWVbaF0ub2Zmc2V0O2JyZWFrfWN8fChjPTEwMCxoPWkpLGM9WihjKTtmb3IodmFyIHU9KGMtbykvKGgtbisxKTtuPGg7bisrKW8rPXUsZVtuXS5vZmZzZXQ9bysiJSJ9cmV0dXJuIGV9KSxyLl90ZWFyPWZ1bmN0aW9uKHQsZSl7dD09ZS50b3AmJihlLnRvcD10LnByZXYpLHQ9PWUuYm90dG9tJiYoZS5ib3R0b209dC5uZXh0KSx0Lm5leHQmJih0Lm5leHQucHJldj10LnByZXYpLHQucHJldiYmKHQucHJldi5uZXh0PXQubmV4dCl9KSxQdD0oci5fdG9mcm9udD1mdW5jdGlvbih0LGUpe2UudG9wIT09dCYmKER0KHQsZSksdC5uZXh0PW51bGwsdC5wcmV2PWUudG9wLGUudG9wLm5leHQ9dCxlLnRvcD10KX0sci5fdG9iYWNrPWZ1bmN0aW9uKHQsZSl7ZS5ib3R0b20hPT10JiYoRHQodCxlKSx0Lm5leHQ9ZS5ib3R0b20sdC5wcmV2PW51bGwsZS5ib3R0b20ucHJldj10LGUuYm90dG9tPXQpfSxyLl9pbnNlcnRhZnRlcj1mdW5jdGlvbih0LGUscil7RHQodCxyKSxlPT1yLnRvcCYmKHIudG9wPXQpLGUubmV4dCYmKGUubmV4dC5wcmV2PXQpLHQubmV4dD1lLm5leHQsdC5wcmV2PWUsZS5uZXh0PXR9LHIuX2luc2VydGJlZm9yZT1mdW5jdGlvbih0LGUscil7RHQodCxyKSxlPT1yLmJvdHRvbSYmKHIuYm90dG9tPXQpLGUucHJldiYmKGUucHJldi5uZXh0PXQpLHQucHJldj1lLnByZXYsZS5wcmV2PXQsdC5uZXh0PWV9LHIudG9NYXRyaXg9ZnVuY3Rpb24odCxlKXt2YXIgcj1TdCh0KSxuPXtfOnt0cmFuc2Zvcm06Un0sZ2V0QkJveDpmdW5jdGlvbigpe3JldHVybiByfX07cmV0dXJuIEx0KG4sZSksbi5tYXRyaXh9KSxMdD0oci50cmFuc2Zvcm1QYXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHh0KHQsUHQodCxlKSl9LHIuX2V4dHJhY3RUcmFuc2Zvcm09ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0Ll8udHJhbnNmb3JtO2U9TShlKS5yZXBsYWNlKC9cLnszfXxcdTIwMjYvZyx0Ll8udHJhbnNmb3JtfHxSKTt2YXIgbj1yLnBhcnNlVHJhbnNmb3JtU3RyaW5nKGUpLGk9MCxhPTAscz0wLG89MSxjPTEsaD10Ll8sdT1uZXcgZDtpZihoLnRyYW5zZm9ybT1ufHxbXSxuKWZvcih2YXIgbD0wLGY9bi5sZW5ndGg7bDxmO2wrKyl7dmFyIHAsZyx4LHYseSxtPW5bbF0sYj1tLmxlbmd0aCxfPU0obVswXSkudG9Mb3dlckNhc2UoKSx3PW1bMF0hPV8sRT13P3UuaW52ZXJ0KCk6MDsidCI9PV8mJjM9PWI/dz8ocD1FLngoMCwwKSxnPUUueSgwLDApLHg9RS54KG1bMV0sbVsyXSksdj1FLnkobVsxXSxtWzJdKSx1LnRyYW5zbGF0ZSh4LXAsdi1nKSk6dS50cmFuc2xhdGUobVsxXSxtWzJdKToiciI9PV8/Mj09Yj8oeT15fHx0LmdldEJCb3goMSksdS5yb3RhdGUobVsxXSx5LngreS53aWR0aC8yLHkueSt5LmhlaWdodC8yKSxpKz1tWzFdKTo0PT1iJiYodz8oeD1FLngobVsyXSxtWzNdKSx2PUUueShtWzJdLG1bM10pLHUucm90YXRlKG1bMV0seCx2KSk6dS5yb3RhdGUobVsxXSxtWzJdLG1bM10pLGkrPW1bMV0pOiJzIj09Xz8yPT1ifHwzPT1iPyh5PXl8fHQuZ2V0QkJveCgxKSx1LnNjYWxlKG1bMV0sbVtiLTFdLHkueCt5LndpZHRoLzIseS55K3kuaGVpZ2h0LzIpLG8qPW1bMV0sYyo9bVtiLTFdKTo1PT1iJiYodz8oeD1FLngobVszXSxtWzRdKSx2PUUueShtWzNdLG1bNF0pLHUuc2NhbGUobVsxXSxtWzJdLHgsdikpOnUuc2NhbGUobVsxXSxtWzJdLG1bM10sbVs0XSksbyo9bVsxXSxjKj1tWzJdKToibSI9PV8mJjc9PWImJnUuYWRkKG1bMV0sbVsyXSxtWzNdLG1bNF0sbVs1XSxtWzZdKSxoLmRpcnR5VD0xLHQubWF0cml4PXV9dC5tYXRyaXg9dSxoLnN4PW8saC5zeT1jLGguZGVnPWksaC5keD1hPXUuZSxoLmR5PXM9dS5mLDE9PW8mJjE9PWMmJiFpJiZoLmJib3g/KGguYmJveC54Kz0rYSxoLmJib3gueSs9K3MpOmguZGlydHlUPTF9KSx6dD1mdW5jdGlvbih0KXt2YXIgZT10WzBdO3N3aXRjaChlLnRvTG93ZXJDYXNlKCkpe2Nhc2UidCI6cmV0dXJuW2UsMCwwXTtjYXNlIm0iOnJldHVybltlLDEsMCwwLDEsMCwwXTtjYXNlInIiOnJldHVybiA0PT10Lmxlbmd0aD9bZSwwLHRbMl0sdFszXV06W2UsMF07Y2FzZSJzIjpyZXR1cm4gNT09dC5sZW5ndGg/W2UsMSwxLHRbM10sdFs0XV06Mz09dC5sZW5ndGg/W2UsMSwxXTpbZSwxXX19LGp0PXIuX2VxdWFsaXNlVHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSl7ZT1NKGUpLnJlcGxhY2UoL1wuezN9fFx1MjAyNi9nLHQpLHQ9ci5wYXJzZVRyYW5zZm9ybVN0cmluZyh0KXx8W10sZT1yLnBhcnNlVHJhbnNmb3JtU3RyaW5nKGUpfHxbXTtmb3IodmFyIG4saSxhLHMsbz1qKHQubGVuZ3RoLGUubGVuZ3RoKSxjPVtdLGg9W10sdT0wO3U8bzt1Kyspe2lmKGE9dFt1XXx8enQoZVt1XSkscz1lW3VdfHx6dChhKSxhWzBdIT1zWzBdfHwiciI9PWFbMF0udG9Mb3dlckNhc2UoKSYmKGFbMl0hPXNbMl18fGFbM10hPXNbM10pfHwicyI9PWFbMF0udG9Mb3dlckNhc2UoKSYmKGFbM10hPXNbM118fGFbNF0hPXNbNF0pKXJldHVybjtmb3IoY1t1XT1bXSxoW3VdPVtdLG49MCxpPWooYS5sZW5ndGgscy5sZW5ndGgpO248aTtuKyspbiBpbiBhJiYoY1t1XVtuXT1hW25dKSxuIGluIHMmJihoW3VdW25dPXNbbl0pfXJldHVybntmcm9tOmMsdG86aH19O3IuX2dldENvbnRhaW5lcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgYTtpZihudWxsIT0oYT1udWxsIT1pfHxyLmlzKHQsIm9iamVjdCIpP3Q6Uy5kb2MuZ2V0RWxlbWVudEJ5SWQodCkpKXJldHVybiBhLnRhZ05hbWU/bnVsbD09ZT97Y29udGFpbmVyOmEsd2lkdGg6YS5zdHlsZS5waXhlbFdpZHRofHxhLm9mZnNldFdpZHRoLGhlaWdodDphLnN0eWxlLnBpeGVsSGVpZ2h0fHxhLm9mZnNldEhlaWdodH06e2NvbnRhaW5lcjphLHdpZHRoOmUsaGVpZ2h0Om59Ontjb250YWluZXI6MSx4OnQseTplLHdpZHRoOm4saGVpZ2h0Oml9fSxyLnBhdGhUb1JlbGF0aXZlPUJ0LHIuX2VuZ2luZT17fSxyLnBhdGgyY3VydmU9RnQsci5tYXRyaXg9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3JldHVybiBuZXcgZCh0LGUscixuLGksYSl9LGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHRbMF0qdFswXSt0WzFdKnRbMV19ZnVuY3Rpb24gbih0KXt2YXIgcj16LnNxcnQoZSh0KSk7dFswXSYmKHRbMF0vPXIpLHRbMV0mJih0WzFdLz1yKX10LmFkZD1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIHMsbyxjLGgsdT1bW10sW10sW11dLGw9W1t0aGlzLmEsdGhpcy5jLHRoaXMuZV0sW3RoaXMuYix0aGlzLmQsdGhpcy5mXSxbMCwwLDFdXSxmPVtbdCxyLGldLFtlLG4sYV0sWzAsMCwxXV07Zm9yKHQmJnQgaW5zdGFuY2VvZiBkJiYoZj1bW3QuYSx0LmMsdC5lXSxbdC5iLHQuZCx0LmZdLFswLDAsMV1dKSxzPTA7czwzO3MrKylmb3Iobz0wO288MztvKyspe2ZvcihoPTAsYz0wO2M8MztjKyspaCs9bFtzXVtjXSpmW2NdW29dO3Vbc11bb109aH10aGlzLmE9dVswXVswXSx0aGlzLmI9dVsxXVswXSx0aGlzLmM9dVswXVsxXSx0aGlzLmQ9dVsxXVsxXSx0aGlzLmU9dVswXVsyXSx0aGlzLmY9dVsxXVsyXX0sdC5pbnZlcnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5hKnQuZC10LmIqdC5jO3JldHVybiBuZXcgZCh0LmQvZSwtdC5iL2UsLXQuYy9lLHQuYS9lLCh0LmMqdC5mLXQuZCp0LmUpL2UsKHQuYip0LmUtdC5hKnQuZikvZSl9LHQuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGQodGhpcy5hLHRoaXMuYix0aGlzLmMsdGhpcy5kLHRoaXMuZSx0aGlzLmYpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuYWRkKDEsMCwwLDEsdCxlKX0sdC5zY2FsZT1mdW5jdGlvbih0LGUscixuKXtudWxsPT1lJiYoZT10KSwocnx8bikmJnRoaXMuYWRkKDEsMCwwLDEscixuKSx0aGlzLmFkZCh0LDAsMCxlLDAsMCksKHJ8fG4pJiZ0aGlzLmFkZCgxLDAsMCwxLC1yLC1uKX0sdC5yb3RhdGU9ZnVuY3Rpb24odCxlLG4pe3Q9ci5yYWQodCksZT1lfHwwLG49bnx8MDt2YXIgaT0rei5jb3ModCkudG9GaXhlZCg5KSxhPSt6LnNpbih0KS50b0ZpeGVkKDkpO3RoaXMuYWRkKGksYSwtYSxpLGUsbiksdGhpcy5hZGQoMSwwLDAsMSwtZSwtbil9LHQueD1mdW5jdGlvbih0LGUpe3JldHVybiB0KnRoaXMuYStlKnRoaXMuYyt0aGlzLmV9LHQueT1mdW5jdGlvbih0LGUpe3JldHVybiB0KnRoaXMuYitlKnRoaXMuZCt0aGlzLmZ9LHQuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybit0aGlzW00uZnJvbUNoYXJDb2RlKDk3K3QpXS50b0ZpeGVkKDQpfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHIuc3ZnPyJtYXRyaXgoIitbdGhpcy5nZXQoMCksdGhpcy5nZXQoMSksdGhpcy5nZXQoMiksdGhpcy5nZXQoMyksdGhpcy5nZXQoNCksdGhpcy5nZXQoNSldLmpvaW4oKSsiKSI6W3RoaXMuZ2V0KDApLHRoaXMuZ2V0KDIpLHRoaXMuZ2V0KDEpLHRoaXMuZ2V0KDMpLDAsMF0uam9pbigpfSx0LnRvRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5NYXRyaXgoTTExPSIrdGhpcy5nZXQoMCkrIiwgTTEyPSIrdGhpcy5nZXQoMikrIiwgTTIxPSIrdGhpcy5nZXQoMSkrIiwgTTIyPSIrdGhpcy5nZXQoMykrIiwgRHg9Iit0aGlzLmdldCg0KSsiLCBEeT0iK3RoaXMuZ2V0KDUpKyIsIHNpemluZ21ldGhvZD0nYXV0byBleHBhbmQnKSJ9LHQub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZS50b0ZpeGVkKDQpLHRoaXMuZi50b0ZpeGVkKDQpXX0sdC5zcGxpdD1mdW5jdGlvbigpe3ZhciB0PXt9O3QuZHg9dGhpcy5lLHQuZHk9dGhpcy5mO3ZhciBpPVtbdGhpcy5hLHRoaXMuY10sW3RoaXMuYix0aGlzLmRdXTt0LnNjYWxleD16LnNxcnQoZShpWzBdKSksbihpWzBdKSx0LnNoZWFyPWlbMF1bMF0qaVsxXVswXStpWzBdWzFdKmlbMV1bMV0saVsxXT1baVsxXVswXS1pWzBdWzBdKnQuc2hlYXIsaVsxXVsxXS1pWzBdWzFdKnQuc2hlYXJdLHQuc2NhbGV5PXouc3FydChlKGlbMV0pKSxuKGlbMV0pLHQuc2hlYXIvPXQuc2NhbGV5O3ZhciBhPS1pWzBdWzFdLHM9aVsxXVsxXTtyZXR1cm4gczwwPyh0LnJvdGF0ZT1yLmRlZyh6LmFjb3MocykpLGE8MCYmKHQucm90YXRlPTM2MC10LnJvdGF0ZSkpOnQucm90YXRlPXIuZGVnKHouYXNpbihhKSksdC5pc1NpbXBsZT0hKCt0LnNoZWFyLnRvRml4ZWQoOSl8fHQuc2NhbGV4LnRvRml4ZWQoOSkhPXQuc2NhbGV5LnRvRml4ZWQoOSkmJnQucm90YXRlKSx0LmlzU3VwZXJTaW1wbGU9ISt0LnNoZWFyLnRvRml4ZWQoOSkmJnQuc2NhbGV4LnRvRml4ZWQoOSk9PXQuc2NhbGV5LnRvRml4ZWQoOSkmJiF0LnJvdGF0ZSx0Lm5vUm90YXRpb249ISt0LnNoZWFyLnRvRml4ZWQoOSkmJiF0LnJvdGF0ZSx0fSx0LnRvVHJhbnNmb3JtU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXR8fHRoaXNbRl0oKTtyZXR1cm4gZS5pc1NpbXBsZT8oZS5zY2FsZXg9K2Uuc2NhbGV4LnRvRml4ZWQoNCksZS5zY2FsZXk9K2Uuc2NhbGV5LnRvRml4ZWQoNCksZS5yb3RhdGU9K2Uucm90YXRlLnRvRml4ZWQoNCksKGUuZHh8fGUuZHk/InQiK1tlLmR4LGUuZHldOlIpKygxIT1lLnNjYWxleHx8MSE9ZS5zY2FsZXk/InMiK1tlLnNjYWxleCxlLnNjYWxleSwwLDBdOlIpKyhlLnJvdGF0ZT8iciIrW2Uucm90YXRlLDAsMF06UikpOiJtIitbdGhpcy5nZXQoMCksdGhpcy5nZXQoMSksdGhpcy5nZXQoMiksdGhpcy5nZXQoMyksdGhpcy5nZXQoNCksdGhpcy5nZXQoNSldfX0oZC5wcm90b3R5cGUpO3ZhciBVdD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXC8oLio/KVxzLyl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFxkKykvKTsiQXBwbGUgQ29tcHV0ZXIsIEluYy4iPT1uYXZpZ2F0b3IudmVuZG9yJiYoVXQmJlV0WzFdPDR8fCJpUCI9PW5hdmlnYXRvci5wbGF0Zm9ybS5zbGljZSgwLDIpKXx8Ikdvb2dsZSBJbmMuIj09bmF2aWdhdG9yLnZlbmRvciYmVXQmJlV0WzFdPDg/Xy5zYWZhcmk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlY3QoLTk5LC05OSx0aGlzLndpZHRoKzk5LHRoaXMuaGVpZ2h0Kzk5KS5hdHRyKHtzdHJva2U6Im5vbmUifSk7c2V0VGltZW91dChmdW5jdGlvbigpe3QucmVtb3ZlKCl9KX06Xy5zYWZhcmk9bHQ7Zm9yKHZhciBYdD1mdW5jdGlvbigpe3RoaXMucmV0dXJuVmFsdWU9ITF9LEd0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxxdD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsQnViYmxlPSEwfSxIdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9LFd0PWZ1bmN0aW9uKHQpe3ZhciBlPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLHI9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdDtyZXR1cm57eDp0LmNsaWVudFgrcix5OnQuY2xpZW50WStlfX0sVnQ9ZnVuY3Rpb24oKXtyZXR1cm4gUy5kb2MuYWRkRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbih0LGUscixuKXt2YXIgaT1mdW5jdGlvbih0KXt2YXIgZT1XdCh0KTtyZXR1cm4gci5jYWxsKG4sdCxlLngsZS55KX07aWYodC5hZGRFdmVudExpc3RlbmVyKGUsaSwhMSksVCYmUFtlXSl7dmFyIGE9ZnVuY3Rpb24oZSl7Zm9yKHZhciBpPVd0KGUpLGE9ZSxzPTAsbz1lLnRhcmdldFRvdWNoZXMmJmUudGFyZ2V0VG91Y2hlcy5sZW5ndGg7czxvO3MrKylpZihlLnRhcmdldFRvdWNoZXNbc10udGFyZ2V0PT10KXtlPWUudGFyZ2V0VG91Y2hlc1tzXSxlLm9yaWdpbmFsRXZlbnQ9YSxlLnByZXZlbnREZWZhdWx0PUd0LGUuc3RvcFByb3BhZ2F0aW9uPUh0O2JyZWFrfXJldHVybiByLmNhbGwobixlLGkueCxpLnkpfTt0LmFkZEV2ZW50TGlzdGVuZXIoUFtlXSxhLCExKX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsaSwhMSksVCYmUFtlXSYmdC5yZW1vdmVFdmVudExpc3RlbmVyKFBbZV0saSwhMSksITB9fTpTLmRvYy5hdHRhY2hFdmVudD9mdW5jdGlvbih0LGUscixuKXt2YXIgaT1mdW5jdGlvbih0KXt0PXR8fFMud2luLmV2ZW50O3ZhciBlPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLGk9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdCxhPXQuY2xpZW50WCtpLHM9dC5jbGllbnRZK2U7cmV0dXJuIHQucHJldmVudERlZmF1bHQ9dC5wcmV2ZW50RGVmYXVsdHx8WHQsdC5zdG9wUHJvcGFnYXRpb249dC5zdG9wUHJvcGFnYXRpb258fHF0LHIuY2FsbChuLHQsYSxzKX07cmV0dXJuIHQuYXR0YWNoRXZlbnQoIm9uIitlLGkpLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGV0YWNoRXZlbnQoIm9uIitlLGkpLCEwfX06dm9pZCAwfSgpLFF0PVtdLFl0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgcixuPXQuY2xpZW50WCxpPXQuY2xpZW50WSxhPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLHM9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdCxvPVF0Lmxlbmd0aDtvLS07KXtpZihyPVF0W29dLFQmJnQudG91Y2hlcyl7Zm9yKHZhciBjLGg9dC50b3VjaGVzLmxlbmd0aDtoLS07KWlmKGM9dC50b3VjaGVzW2hdLGMuaWRlbnRpZmllcj09ci5lbC5fZHJhZy5pZCl7bj1jLmNsaWVudFgsaT1jLmNsaWVudFksKHQub3JpZ2luYWxFdmVudD90Lm9yaWdpbmFsRXZlbnQ6dCkucHJldmVudERlZmF1bHQoKTticmVha319ZWxzZSB0LnByZXZlbnREZWZhdWx0KCk7dmFyIHUsbD1yLmVsLm5vZGUsZj1sLm5leHRTaWJsaW5nLHA9bC5wYXJlbnROb2RlLGQ9bC5zdHlsZS5kaXNwbGF5O1Mud2luLm9wZXJhJiZwLnJlbW92ZUNoaWxkKGwpLGwuc3R5bGUuZGlzcGxheT0ibm9uZSIsdT1yLmVsLnBhcGVyLmdldEVsZW1lbnRCeVBvaW50KG4saSksbC5zdHlsZS5kaXNwbGF5PWQsUy53aW4ub3BlcmEmJihmP3AuaW5zZXJ0QmVmb3JlKGwsZik6cC5hcHBlbmRDaGlsZChsKSksdSYmZSgicmFwaGFlbC5kcmFnLm92ZXIuIityLmVsLmlkLHIuZWwsdSksZSgicmFwaGFlbC5kcmFnLm1vdmUuIityLmVsLmlkLHIubW92ZV9zY29wZXx8ci5lbCxuK3Mtci5lbC5fZHJhZy54LGkrYS1yLmVsLl9kcmFnLnksbitzLGkrYSx0KX19LCR0PWZ1bmN0aW9uKHQpe3IudW5tb3VzZW1vdmUoWXQpLnVubW91c2V1cCgkdCk7Zm9yKHZhciBuLGk9UXQubGVuZ3RoO2ktLTspbj1RdFtpXSxuLmVsLl9kcmFnPXt9LGUoInJhcGhhZWwuZHJhZy5lbmQuIituLmVsLmlkLG4uZW5kX3Njb3BlfHxuLnN0YXJ0X3Njb3BlfHxuLm1vdmVfc2NvcGV8fG4uZWwsdCk7UXQ9W119LEt0PXIuZWw9e30sWnQ9RC5sZW5ndGg7WnQtLTspIWZ1bmN0aW9uKHQpe3JbdF09S3RbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gci5pcyhlLCJmdW5jdGlvbiIpJiYodGhpcy5ldmVudHM9dGhpcy5ldmVudHN8fFtdLHRoaXMuZXZlbnRzLnB1c2goe25hbWU6dCxmOmUsdW5iaW5kOlZ0KHRoaXMuc2hhcGV8fHRoaXMubm9kZXx8Uy5kb2MsdCxlLG58fHRoaXMpfSkpLHRoaXN9LHJbInVuIit0XT1LdFsidW4iK3RdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10aGlzLmV2ZW50c3x8W10saT1uLmxlbmd0aDtpLS07KW5baV0ubmFtZSE9dHx8IXIuaXMoZSwidW5kZWZpbmVkIikmJm5baV0uZiE9ZXx8KG5baV0udW5iaW5kKCksbi5zcGxpY2UoaSwxKSwhbi5sZW5ndGgmJmRlbGV0ZSB0aGlzLmV2ZW50cyk7cmV0dXJuIHRoaXN9fShEW1p0XSk7S3QuZGF0YT1mdW5jdGlvbih0LG4pe3ZhciBpPWh0W3RoaXMuaWRdPWh0W3RoaXMuaWRdfHx7fTtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBpO2lmKDE9PWFyZ3VtZW50cy5sZW5ndGgpe2lmKHIuaXModCwib2JqZWN0Iikpe2Zvcih2YXIgYSBpbiB0KXRba10oYSkmJnRoaXMuZGF0YShhLHRbYV0pO3JldHVybiB0aGlzfXJldHVybiBlKCJyYXBoYWVsLmRhdGEuZ2V0LiIrdGhpcy5pZCx0aGlzLGlbdF0sdCksaVt0XX1yZXR1cm4gaVt0XT1uLGUoInJhcGhhZWwuZGF0YS5zZXQuIit0aGlzLmlkLHRoaXMsbix0KSx0aGlzfSxLdC5yZW1vdmVEYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P2h0W3RoaXMuaWRdPXt9Omh0W3RoaXMuaWRdJiZkZWxldGUgaHRbdGhpcy5pZF1bdF0sdGhpc30sS3QuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiBuKGh0W3RoaXMuaWRdfHx7fSl9LEt0LmhvdmVyPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0aGlzLm1vdXNlb3Zlcih0LHIpLm1vdXNlb3V0KGUsbnx8cil9LEt0LnVuaG92ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy51bm1vdXNlb3Zlcih0KS51bm1vdXNlb3V0KGUpfTt2YXIgSnQ9W107S3QuZHJhZz1mdW5jdGlvbih0LG4saSxhLHMsbyl7ZnVuY3Rpb24gYyhjKXsoYy5vcmlnaW5hbEV2ZW50fHxjKS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBoPWMuY2xpZW50WCx1PWMuY2xpZW50WSxsPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLGY9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdDtpZih0aGlzLl9kcmFnLmlkPWMuaWRlbnRpZmllcixUJiZjLnRvdWNoZXMpZm9yKHZhciBwLGQ9Yy50b3VjaGVzLmxlbmd0aDtkLS07KWlmKHA9Yy50b3VjaGVzW2RdLHRoaXMuX2RyYWcuaWQ9cC5pZGVudGlmaWVyLHAuaWRlbnRpZmllcj09dGhpcy5fZHJhZy5pZCl7aD1wLmNsaWVudFgsdT1wLmNsaWVudFk7YnJlYWt9dGhpcy5fZHJhZy54PWgrZix0aGlzLl9kcmFnLnk9dStsLCFRdC5sZW5ndGgmJnIubW91c2Vtb3ZlKFl0KS5tb3VzZXVwKCR0KSxRdC5wdXNoKHtlbDp0aGlzLG1vdmVfc2NvcGU6YSxzdGFydF9zY29wZTpzLGVuZF9zY29wZTpvfSksbiYmZS5vbigicmFwaGFlbC5kcmFnLnN0YXJ0LiIrdGhpcy5pZCxuKSx0JiZlLm9uKCJyYXBoYWVsLmRyYWcubW92ZS4iK3RoaXMuaWQsdCksaSYmZS5vbigicmFwaGFlbC5kcmFnLmVuZC4iK3RoaXMuaWQsaSksZSgicmFwaGFlbC5kcmFnLnN0YXJ0LiIrdGhpcy5pZCxzfHxhfHx0aGlzLGMuY2xpZW50WCtmLGMuY2xpZW50WStsLGMpfXJldHVybiB0aGlzLl9kcmFnPXt9LEp0LnB1c2goe2VsOnRoaXMsc3RhcnQ6Y30pLHRoaXMubW91c2Vkb3duKGMpLHRoaXN9LEt0Lm9uRHJhZ092ZXI9ZnVuY3Rpb24odCl7dD9lLm9uKCJyYXBoYWVsLmRyYWcub3Zlci4iK3RoaXMuaWQsdCk6ZS51bmJpbmQoInJhcGhhZWwuZHJhZy5vdmVyLiIrdGhpcy5pZCl9LEt0LnVuZHJhZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1KdC5sZW5ndGg7dC0tOylKdFt0XS5lbD09dGhpcyYmKHRoaXMudW5tb3VzZWRvd24oSnRbdF0uc3RhcnQpLEp0LnNwbGljZSh0LDEpLGUudW5iaW5kKCJyYXBoYWVsLmRyYWcuKi4iK3RoaXMuaWQpKTshSnQubGVuZ3RoJiZyLnVubW91c2Vtb3ZlKFl0KS51bm1vdXNldXAoJHQpLFF0PVtdfSxfLmNpcmNsZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9ci5fZW5naW5lLmNpcmNsZSh0aGlzLHR8fDAsZXx8MCxufHwwKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChpKSxpfSxfLnJlY3Q9ZnVuY3Rpb24odCxlLG4saSxhKXt2YXIgcz1yLl9lbmdpbmUucmVjdCh0aGlzLHR8fDAsZXx8MCxufHwwLGl8fDAsYXx8MCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2gocyksc30sXy5lbGxpcHNlPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBhPXIuX2VuZ2luZS5lbGxpcHNlKHRoaXMsdHx8MCxlfHwwLG58fDAsaXx8MCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2goYSksYX0sXy5wYXRoPWZ1bmN0aW9uKHQpe3QmJiFyLmlzKHQsInN0cmluZyIpJiYhci5pcyh0WzBdLFcpJiYodCs9Uik7dmFyIGU9ci5fZW5naW5lLnBhdGgoci5mb3JtYXRbTl0ocixhcmd1bWVudHMpLHRoaXMpO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKGUpLGV9LF8uaW1hZ2U9ZnVuY3Rpb24odCxlLG4saSxhKXt2YXIgcz1yLl9lbmdpbmUuaW1hZ2UodGhpcyx0fHwiYWJvdXQ6YmxhbmsiLGV8fDAsbnx8MCxpfHwwLGF8fDApO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKHMpLHN9LF8udGV4dD1mdW5jdGlvbih0LGUsbil7dmFyIGk9ci5fZW5naW5lLnRleHQodGhpcyx0fHwwLGV8fDAsTShuKSk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2goaSksaX0sXy5zZXQ9ZnVuY3Rpb24odCl7IXIuaXModCwiYXJyYXkiKSYmKHQ9QXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywwLGFyZ3VtZW50cy5sZW5ndGgpKTt2YXIgZT1uZXcgbGUodCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2goZSksZS5wYXBlcj10aGlzLGUudHlwZT0ic2V0IixlfSxfLnNldFN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX19zZXRfXz10fHx0aGlzLnNldCgpfSxfLnNldEZpbmlzaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fc2V0X187cmV0dXJuIGRlbGV0ZSB0aGlzLl9fc2V0X18sZX0sXy5zZXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuX2VuZ2luZS5zZXRTaXplLmNhbGwodGhpcyx0LGUpfSxfLnNldFZpZXdCb3g9ZnVuY3Rpb24odCxlLG4saSxhKXtyZXR1cm4gci5fZW5naW5lLnNldFZpZXdCb3guY2FsbCh0aGlzLHQsZSxuLGksYSl9LF8udG9wPV8uYm90dG9tPW51bGwsXy5yYXBoYWVsPXI7dmFyIHRlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj10Lm93bmVyRG9jdW1lbnQsbj1yLmJvZHksaT1yLmRvY3VtZW50RWxlbWVudCxhPWkuY2xpZW50VG9wfHxuLmNsaWVudFRvcHx8MCxzPWkuY2xpZW50TGVmdHx8bi5jbGllbnRMZWZ0fHwwO3JldHVybnt5OmUudG9wKyhTLndpbi5wYWdlWU9mZnNldHx8aS5zY3JvbGxUb3B8fG4uc2Nyb2xsVG9wKS1hLHg6ZS5sZWZ0KyhTLndpbi5wYWdlWE9mZnNldHx8aS5zY3JvbGxMZWZ0fHxuLnNjcm9sbExlZnQpLXN9fTtfLmdldEVsZW1lbnRCeVBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXIuY2FudmFzLGk9Uy5kb2MuZWxlbWVudEZyb21Qb2ludCh0LGUpO2lmKFMud2luLm9wZXJhJiYic3ZnIj09aS50YWdOYW1lKXt2YXIgYT10ZShuKSxzPW4uY3JlYXRlU1ZHUmVjdCgpO3MueD10LWEueCxzLnk9ZS1hLnkscy53aWR0aD1zLmhlaWdodD0xO3ZhciBvPW4uZ2V0SW50ZXJzZWN0aW9uTGlzdChzLG51bGwpO28ubGVuZ3RoJiYoaT1vW28ubGVuZ3RoLTFdKX1pZighaSlyZXR1cm4gbnVsbDtmb3IoO2kucGFyZW50Tm9kZSYmaSE9bi5wYXJlbnROb2RlJiYhaS5yYXBoYWVsOylpPWkucGFyZW50Tm9kZTtyZXR1cm4gaT09ci5jYW52YXMucGFyZW50Tm9kZSYmKGk9biksaT1pJiZpLnJhcGhhZWw/ci5nZXRCeUlkKGkucmFwaGFlbGlkKTpudWxsfSxfLmdldEVsZW1lbnRzQnlCQm94PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2V0KCk7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihuKXtyLmlzQkJveEludGVyc2VjdChuLmdldEJCb3goKSx0KSYmZS5wdXNoKG4pfSksZX0sXy5nZXRCeUlkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmJvdHRvbTtlOyl7aWYoZS5pZD09dClyZXR1cm4gZTtlPWUubmV4dH1yZXR1cm4gbnVsbH0sXy5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuYm90dG9tO3I7KXtpZighMT09PXQuY2FsbChlLHIpKXJldHVybiB0aGlzO3I9ci5uZXh0fXJldHVybiB0aGlzfSxfLmdldEVsZW1lbnRzQnlQb2ludD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuc2V0KCk7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihuKXtuLmlzUG9pbnRJbnNpZGUodCxlKSYmci5wdXNoKG4pfSkscn0sS3QuaXNQb2ludEluc2lkZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucmVhbFBhdGg9Z3RbdGhpcy50eXBlXSh0aGlzKTtyZXR1cm4gdGhpcy5hdHRyKCJ0cmFuc2Zvcm0iKSYmdGhpcy5hdHRyKCJ0cmFuc2Zvcm0iKS5sZW5ndGgmJihuPXIudHJhbnNmb3JtUGF0aChuLHRoaXMuYXR0cigidHJhbnNmb3JtIikpKSxyLmlzUG9pbnRJbnNpZGVQYXRoKG4sdCxlKX0sS3QuZ2V0QkJveD1mdW5jdGlvbih0KXtpZih0aGlzLnJlbW92ZWQpcmV0dXJue307dmFyIGU9dGhpcy5fO3JldHVybiB0PyghZS5kaXJ0eSYmZS5iYm94d3R8fCh0aGlzLnJlYWxQYXRoPWd0W3RoaXMudHlwZV0odGhpcyksZS5iYm94d3Q9U3QodGhpcy5yZWFsUGF0aCksZS5iYm94d3QudG9TdHJpbmc9ZyxlLmRpcnR5PTApLGUuYmJveHd0KTooKGUuZGlydHl8fGUuZGlydHlUfHwhZS5iYm94KSYmKCFlLmRpcnR5JiZ0aGlzLnJlYWxQYXRofHwoZS5iYm94d3Q9MCx0aGlzLnJlYWxQYXRoPWd0W3RoaXMudHlwZV0odGhpcykpLGUuYmJveD1TdCh4dCh0aGlzLnJlYWxQYXRoLHRoaXMubWF0cml4KSksZS5iYm94LnRvU3RyaW5nPWcsZS5kaXJ0eT1lLmRpcnR5VD0wKSxlLmJib3gpfSxLdC5jbG9uZT1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gbnVsbDt2YXIgdD10aGlzLnBhcGVyW3RoaXMudHlwZV0oKS5hdHRyKHRoaXMuYXR0cigpKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaCh0KSx0fSxLdC5nbG93PWZ1bmN0aW9uKHQpe2lmKCJ0ZXh0Ij09dGhpcy50eXBlKXJldHVybiBudWxsO3Q9dHx8e307dmFyIGU9e3dpZHRoOih0LndpZHRofHwxMCkrKCt0aGlzLmF0dHIoInN0cm9rZS13aWR0aCIpfHwxKSxmaWxsOnQuZmlsbHx8ITEsb3BhY2l0eTp0Lm9wYWNpdHl8fC41LG9mZnNldHg6dC5vZmZzZXR4fHwwLG9mZnNldHk6dC5vZmZzZXR5fHwwLGNvbG9yOnQuY29sb3J8fCIjMDAwIn0scj1lLndpZHRoLzIsbj10aGlzLnBhcGVyLGk9bi5zZXQoKSxhPXRoaXMucmVhbFBhdGh8fGd0W3RoaXMudHlwZV0odGhpcyk7YT10aGlzLm1hdHJpeD94dChhLHRoaXMubWF0cml4KTphO2Zvcih2YXIgcz0xO3M8cisxO3MrKylpLnB1c2gobi5wYXRoKGEpLmF0dHIoe3N0cm9rZTplLmNvbG9yLGZpbGw6ZS5maWxsP2UuY29sb3I6Im5vbmUiLCJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsInN0cm9rZS1saW5lY2FwIjoicm91bmQiLCJzdHJva2Utd2lkdGgiOisoZS53aWR0aC9yKnMpLnRvRml4ZWQoMyksb3BhY2l0eTorKGUub3BhY2l0eS9yKS50b0ZpeGVkKDMpfSkpO3JldHVybiBpLmluc2VydEJlZm9yZSh0aGlzKS50cmFuc2xhdGUoZS5vZmZzZXR4LGUub2Zmc2V0eSl9O3ZhciBlZT1mdW5jdGlvbih0LGUsbixpLGEscyxvLGMsbCl7cmV0dXJuIG51bGw9PWw/aCh0LGUsbixpLGEscyxvLGMpOnIuZmluZERvdHNBdFNlZ21lbnQodCxlLG4saSxhLHMsbyxjLHUodCxlLG4saSxhLHMsbyxjLGwpKX0scmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixpLGEpe249RnQobik7Zm9yKHZhciBzLG8sYyxoLHUsbD0iIixmPXt9LHA9MCxkPTAsZz1uLmxlbmd0aDtkPGc7ZCsrKXtpZihjPW5bZF0sIk0iPT1jWzBdKXM9K2NbMV0sbz0rY1syXTtlbHNle2lmKGg9ZWUocyxvLGNbMV0sY1syXSxjWzNdLGNbNF0sY1s1XSxjWzZdKSxwK2g+aSl7aWYoZSYmIWYuc3RhcnQpe2lmKHU9ZWUocyxvLGNbMV0sY1syXSxjWzNdLGNbNF0sY1s1XSxjWzZdLGktcCksbCs9WyJDIit1LnN0YXJ0LngsdS5zdGFydC55LHUubS54LHUubS55LHUueCx1LnldLGEpcmV0dXJuIGw7Zi5zdGFydD1sLGw9WyJNIit1LngsdS55KyJDIit1Lm4ueCx1Lm4ueSx1LmVuZC54LHUuZW5kLnksY1s1XSxjWzZdXS5qb2luKCkscCs9aCxzPStjWzVdLG89K2NbNl07Y29udGludWV9aWYoIXQmJiFlKXJldHVybiB1PWVlKHMsbyxjWzFdLGNbMl0sY1szXSxjWzRdLGNbNV0sY1s2XSxpLXApLHt4OnUueCx5OnUueSxhbHBoYTp1LmFscGhhfX1wKz1oLHM9K2NbNV0sbz0rY1s2XX1sKz1jLnNoaWZ0KCkrY31yZXR1cm4gZi5lbmQ9bCx1PXQ/cDplP2Y6ci5maW5kRG90c0F0U2VnbWVudChzLG8sY1swXSxjWzFdLGNbMl0sY1szXSxjWzRdLGNbNV0sMSksdS5hbHBoYSYmKHU9e3g6dS54LHk6dS55LGFscGhhOnUuYWxwaGF9KSx1fX0sbmU9cmUoMSksaWU9cmUoKSxhZT1yZSgwLDEpO3IuZ2V0VG90YWxMZW5ndGg9bmUsci5nZXRQb2ludEF0TGVuZ3RoPWllLHIuZ2V0U3VicGF0aD1mdW5jdGlvbih0LGUscil7aWYodGhpcy5nZXRUb3RhbExlbmd0aCh0KS1yPDFlLTYpcmV0dXJuIGFlKHQsZSkuZW5kO3ZhciBuPWFlKHQsciwxKTtyZXR1cm4gZT9hZShuLGUpLmVuZDpufSxLdC5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0UGF0aCgpO2lmKHQpcmV0dXJuIHRoaXMubm9kZS5nZXRUb3RhbExlbmd0aD90aGlzLm5vZGUuZ2V0VG90YWxMZW5ndGgoKTpuZSh0KX0sS3QuZ2V0UG9pbnRBdExlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBhdGgoKTtpZihlKXJldHVybiBpZShlLHQpfSxLdC5nZXRQYXRoPWZ1bmN0aW9uKCl7dmFyIHQsZT1yLl9nZXRQYXRoW3RoaXMudHlwZV07aWYoInRleHQiIT10aGlzLnR5cGUmJiJzZXQiIT10aGlzLnR5cGUpcmV0dXJuIGUmJih0PWUodGhpcykpLHR9LEt0LmdldFN1YnBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFBhdGgoKTtpZihuKXJldHVybiByLmdldFN1YnBhdGgobix0LGUpfTt2YXIgc2U9ci5lYXNpbmdfZm9ybXVsYXM9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sIjwiOmZ1bmN0aW9uKHQpe3JldHVybiBHKHQsMS43KX0sIj4iOmZ1bmN0aW9uKHQpe3JldHVybiBHKHQsLjQ4KX0sIjw+IjpmdW5jdGlvbih0KXt2YXIgZT0uNDgtdC8xLjA0LHI9ei5zcXJ0KC4xNzM0K2UqZSksbj1yLWUsaT1HKFgobiksMS8zKSoobjwwPy0xOjEpLGE9LXItZSxzPUcoWChhKSwxLzMpKihhPDA/LTE6MSksbz1pK3MrLjU7cmV0dXJuIDMqKDEtbykqbypvK28qbypvfSxiYWNrSW46ZnVuY3Rpb24odCl7dmFyIGU9MS43MDE1ODtyZXR1cm4gdCp0KigoZSsxKSp0LWUpfSxiYWNrT3V0OmZ1bmN0aW9uKHQpe3QtPTE7dmFyIGU9MS43MDE1ODtyZXR1cm4gdCp0KigoZSsxKSp0K2UpKzF9LGVsYXN0aWM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PSEhdD90OkcoMiwtMTAqdCkqei5zaW4oMipxKih0LS4wNzUpLy4zKSsxfSxib3VuY2U6ZnVuY3Rpb24odCl7dmFyIGUscj03LjU2MjUsbj0yLjc1O3JldHVybiB0PDEvbj9lPXIqdCp0OnQ8Mi9uPyh0LT0xLjUvbixlPXIqdCp0Ky43NSk6dDwyLjUvbj8odC09Mi4yNS9uLGU9cip0KnQrLjkzNzUpOih0LT0yLjYyNS9uLGU9cip0KnQrLjk4NDM3NSksZX19O3NlLmVhc2VJbj1zZVsiZWFzZS1pbiJdPXNlWyI8Il0sc2UuZWFzZU91dD1zZVsiZWFzZS1vdXQiXT1zZVsiPiJdLHNlLmVhc2VJbk91dD1zZVsiZWFzZS1pbi1vdXQiXT1zZVsiPD4iXSxzZVsiYmFjay1pbiJdPXNlLmJhY2tJbixzZVsiYmFjay1vdXQiXT1zZS5iYWNrT3V0O3ZhciBvZT1bXSxjZT10LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8dC53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHQubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx0Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHQubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNil9LGhlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PStuZXcgRGF0ZSxuPTA7bjxvZS5sZW5ndGg7bisrKXt2YXIgaT1vZVtuXTtpZighaS5lbC5yZW1vdmVkJiYhaS5wYXVzZWQpe3ZhciBhLHMsbz10LWkuc3RhcnQsYz1pLm1zLGg9aS5lYXNpbmcsdT1pLmZyb20sbD1pLmRpZmYsZj1pLnRvLHA9KGkudCxpLmVsKSxkPXt9LGc9e307aWYoaS5pbml0c3RhdHVzPyhvPShpLmluaXRzdGF0dXMqaS5hbmltLnRvcC1pLnByZXYpLyhpLnBlcmNlbnQtaS5wcmV2KSpjLGkuc3RhdHVzPWkuaW5pdHN0YXR1cyxkZWxldGUgaS5pbml0c3RhdHVzLGkuc3RvcCYmb2Uuc3BsaWNlKG4tLSwxKSk6aS5zdGF0dXM9KGkucHJldisoaS5wZXJjZW50LWkucHJldikqKG8vYykpL2kuYW5pbS50b3AsIShvPDApKWlmKG88Yyl7dmFyIHg9aChvL2MpO2Zvcih2YXIgdiBpbiB1KWlmKHVba10odikpe3N3aXRjaChydFt2XSl7Y2FzZSBIOmE9K3Vbdl0reCpjKmxbdl07YnJlYWs7Y2FzZSJjb2xvdXIiOmE9InJnYigiK1t1ZShLKHVbdl0ucit4KmMqbFt2XS5yKSksdWUoSyh1W3ZdLmcreCpjKmxbdl0uZykpLHVlKEsodVt2XS5iK3gqYypsW3ZdLmIpKV0uam9pbigiLCIpKyIpIjticmVhaztjYXNlInBhdGgiOmE9W107Zm9yKHZhciBtPTAsYj11W3ZdLmxlbmd0aDttPGI7bSsrKXthW21dPVt1W3ZdW21dWzBdXTtmb3IodmFyIF89MSx3PXVbdl1bbV0ubGVuZ3RoO188dztfKyspYVttXVtfXT0rdVt2XVttXVtfXSt4KmMqbFt2XVttXVtfXTthW21dPWFbbV0uam9pbihJKX1hPWEuam9pbihJKTticmVhaztjYXNlInRyYW5zZm9ybSI6aWYobFt2XS5yZWFsKWZvcihhPVtdLG09MCxiPXVbdl0ubGVuZ3RoO208YjttKyspZm9yKGFbbV09W3Vbdl1bbV1bMF1dLF89MSx3PXVbdl1bbV0ubGVuZ3RoO188dztfKyspYVttXVtfXT11W3ZdW21dW19dK3gqYypsW3ZdW21dW19dO2Vsc2V7dmFyIEU9ZnVuY3Rpb24odCl7cmV0dXJuK3Vbdl1bdF0reCpjKmxbdl1bdF19O2E9W1sibSIsRSgwKSxFKDEpLEUoMiksRSgzKSxFKDQpLEUoNSldXX1icmVhaztjYXNlImNzdiI6aWYoImNsaXAtcmVjdCI9PXYpZm9yKGE9W10sbT00O20tLTspYVttXT0rdVt2XVttXSt4KmMqbFt2XVttXTticmVhaztkZWZhdWx0OnZhciBDPVtdW09dKHVbdl0pO2ZvcihhPVtdLG09cC5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW3ZdLmxlbmd0aDttLS07KWFbbV09K0NbbV0reCpjKmxbdl1bbV19ZFt2XT1hfXAuYXR0cihkKSxmdW5jdGlvbih0LHIsbil7c2V0VGltZW91dChmdW5jdGlvbigpe2UoInJhcGhhZWwuYW5pbS5mcmFtZS4iK3QscixuKX0pfShwLmlkLHAsaS5hbmltKX1lbHNle2lmKGZ1bmN0aW9uKHQsbixpKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSgicmFwaGFlbC5hbmltLmZyYW1lLiIrbi5pZCxuLGkpLGUoInJhcGhhZWwuYW5pbS5maW5pc2guIituLmlkLG4saSksci5pcyh0LCJmdW5jdGlvbiIpJiZ0LmNhbGwobil9KX0oaS5jYWxsYmFjayxwLGkuYW5pbSkscC5hdHRyKGYpLG9lLnNwbGljZShuLS0sMSksaS5yZXBlYXQ+MSYmIWkubmV4dCl7Zm9yKHMgaW4gZilmW2tdKHMpJiYoZ1tzXT1pLnRvdGFsT3JpZ2luW3NdKTtpLmVsLmF0dHIoZykseShpLmFuaW0saS5lbCxpLmFuaW0ucGVyY2VudHNbMF0sbnVsbCxpLnRvdGFsT3JpZ2luLGkucmVwZWF0LTEpfWkubmV4dCYmIWkuc3RvcCYmeShpLmFuaW0saS5lbCxpLm5leHQsbnVsbCxpLnRvdGFsT3JpZ2luLGkucmVwZWF0KX19fXIuc3ZnJiZwJiZwLnBhcGVyJiZwLnBhcGVyLnNhZmFyaSgpLG9lLmxlbmd0aCYmY2UoaGUpfSx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD4yNTU/MjU1OnQ8MD8wOnR9O0t0LmFuaW1hdGVXaXRoPWZ1bmN0aW9uKHQsZSxuLGksYSxzKXt2YXIgbz10aGlzO2lmKG8ucmVtb3ZlZClyZXR1cm4gcyYmcy5jYWxsKG8pLG87dmFyIGM9biBpbnN0YW5jZW9mIHY/bjpyLmFuaW1hdGlvbihuLGksYSxzKTt5KGMsbyxjLnBlcmNlbnRzWzBdLG51bGwsby5hdHRyKCkpO2Zvcih2YXIgaD0wLHU9b2UubGVuZ3RoO2g8dTtoKyspaWYob2VbaF0uYW5pbT09ZSYmb2VbaF0uZWw9PXQpe29lW3UtMV0uc3RhcnQ9b2VbaF0uc3RhcnQ7YnJlYWt9cmV0dXJuIG99LEt0Lm9uQW5pbWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0P2Uub24oInJhcGhhZWwuYW5pbS5mcmFtZS4iK3RoaXMuaWQsdCk6ZS51bmJpbmQoInJhcGhhZWwuYW5pbS5mcmFtZS4iK3RoaXMuaWQpLHRoaXN9LHYucHJvdG90eXBlLmRlbGF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2KHRoaXMuYW5pbSx0aGlzLm1zKTtyZXR1cm4gZS50aW1lcz10aGlzLnRpbWVzLGUuZGVsPSt0fHwwLGV9LHYucHJvdG90eXBlLnJlcGVhdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdih0aGlzLmFuaW0sdGhpcy5tcyk7cmV0dXJuIGUuZGVsPXRoaXMuZGVsLGUudGltZXM9ei5mbG9vcihqKHQsMCkpfHwxLGV9LHIuYW5pbWF0aW9uPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQgaW5zdGFuY2VvZiB2KXJldHVybiB0OyFyLmlzKG4sImZ1bmN0aW9uIikmJm58fChpPWl8fG58fG51bGwsbj1udWxsKSx0PU9iamVjdCh0KSxlPStlfHwwO3ZhciBhLHMsbz17fTtmb3IocyBpbiB0KXRba10ocykmJloocykhPXMmJloocykrIiUiIT1zJiYoYT0hMCxvW3NdPXRbc10pO3JldHVybiBhPyhuJiYoby5lYXNpbmc9biksaSYmKG8uY2FsbGJhY2s9aSksbmV3IHYoezEwMDpvfSxlKSk6bmV3IHYodCxlKX0sS3QuYW5pbWF0ZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgYT10aGlzO2lmKGEucmVtb3ZlZClyZXR1cm4gaSYmaS5jYWxsKGEpLGE7dmFyIHM9dCBpbnN0YW5jZW9mIHY/dDpyLmFuaW1hdGlvbih0LGUsbixpKTtyZXR1cm4geShzLGEscy5wZXJjZW50c1swXSxudWxsLGEuYXR0cigpKSxhfSxLdC5zZXRUaW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJm51bGwhPWUmJnRoaXMuc3RhdHVzKHQsVShlLHQubXMpL3QubXMpLHRoaXN9LEt0LnN0YXR1cz1mdW5jdGlvbih0LGUpe3ZhciByLG4saT1bXSxhPTA7aWYobnVsbCE9ZSlyZXR1cm4geSh0LHRoaXMsLTEsVShlLDEpKSx0aGlzO2ZvcihyPW9lLmxlbmd0aDthPHI7YSsrKWlmKG49b2VbYV0sbi5lbC5pZD09dGhpcy5pZCYmKCF0fHxuLmFuaW09PXQpKXtpZih0KXJldHVybiBuLnN0YXR1cztpLnB1c2goe2FuaW06bi5hbmltLHN0YXR1czpuLnN0YXR1c30pfXJldHVybiB0PzA6aX0sS3QucGF1c2U9ZnVuY3Rpb24odCl7Zm9yKHZhciByPTA7cjxvZS5sZW5ndGg7cisrKW9lW3JdLmVsLmlkIT10aGlzLmlkfHx0JiZvZVtyXS5hbmltIT10fHwhMSE9PWUoInJhcGhhZWwuYW5pbS5wYXVzZS4iK3RoaXMuaWQsdGhpcyxvZVtyXS5hbmltKSYmKG9lW3JdLnBhdXNlZD0hMCk7cmV0dXJuIHRoaXN9LEt0LnJlc3VtZT1mdW5jdGlvbih0KXtmb3IodmFyIHI9MDtyPG9lLmxlbmd0aDtyKyspaWYob2Vbcl0uZWwuaWQ9PXRoaXMuaWQmJighdHx8b2Vbcl0uYW5pbT09dCkpe3ZhciBuPW9lW3JdOyExIT09ZSgicmFwaGFlbC5hbmltLnJlc3VtZS4iK3RoaXMuaWQsdGhpcyxuLmFuaW0pJiYoZGVsZXRlIG4ucGF1c2VkLHRoaXMuc3RhdHVzKG4uYW5pbSxuLnN0YXR1cykpfXJldHVybiB0aGlzfSxLdC5zdG9wPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8b2UubGVuZ3RoO3IrKylvZVtyXS5lbC5pZCE9dGhpcy5pZHx8dCYmb2Vbcl0uYW5pbSE9dHx8ITEhPT1lKCJyYXBoYWVsLmFuaW0uc3RvcC4iK3RoaXMuaWQsdGhpcyxvZVtyXS5hbmltKSYmb2Uuc3BsaWNlKHItLSwxKTtyZXR1cm4gdGhpc30sZS5vbigicmFwaGFlbC5yZW1vdmUiLG0pLGUub24oInJhcGhhZWwuY2xlYXIiLG0pLEt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlJhcGhhw6ts4oCZcyBvYmplY3QifTt2YXIgbGU9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtcz1bXSx0aGlzLmxlbmd0aD0wLHRoaXMudHlwZT0ic2V0Iix0KWZvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKykhdFtlXXx8dFtlXS5jb25zdHJ1Y3RvciE9S3QuY29uc3RydWN0b3ImJnRbZV0uY29uc3RydWN0b3IhPWxlfHwodGhpc1t0aGlzLml0ZW1zLmxlbmd0aF09dGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aF09dFtlXSx0aGlzLmxlbmd0aCsrKX0sZmU9bGUucHJvdG90eXBlO2ZlLnB1c2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxyPTAsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspISh0PWFyZ3VtZW50c1tyXSl8fHQuY29uc3RydWN0b3IhPUt0LmNvbnN0cnVjdG9yJiZ0LmNvbnN0cnVjdG9yIT1sZXx8KGU9dGhpcy5pdGVtcy5sZW5ndGgsdGhpc1tlXT10aGlzLml0ZW1zW2VdPXQsdGhpcy5sZW5ndGgrKyk7cmV0dXJuIHRoaXN9LGZlLnBvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aCYmZGVsZXRlIHRoaXNbdGhpcy5sZW5ndGgtLV0sdGhpcy5pdGVtcy5wb3AoKX0sZmUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dGhpcy5pdGVtcy5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlLHRoaXMuaXRlbXNbcl0scikpcmV0dXJuIHRoaXM7cmV0dXJuIHRoaXN9O2Zvcih2YXIgcGUgaW4gS3QpS3Rba10ocGUpJiYoZmVbcGVdPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbdF1bTl0ocixlKX0pfX0ocGUpKTtyZXR1cm4gZmUuYXR0cj1mdW5jdGlvbih0LGUpe2lmKHQmJnIuaXModCxXKSYmci5pcyh0WzBdLCJvYmplY3QiKSlmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspdGhpcy5pdGVtc1tuXS5hdHRyKHRbbl0pO2Vsc2UgZm9yKHZhciBhPTAscz10aGlzLml0ZW1zLmxlbmd0aDthPHM7YSsrKXRoaXMuaXRlbXNbYV0uYXR0cih0LGUpO3JldHVybiB0aGlzfSxmZS5jbGVhcj1mdW5jdGlvbigpe2Zvcig7dGhpcy5sZW5ndGg7KXRoaXMucG9wKCl9LGZlLnNwbGljZT1mdW5jdGlvbih0LGUscil7dD10PDA/aih0aGlzLmxlbmd0aCt0LDApOnQsZT1qKDAsVSh0aGlzLmxlbmd0aC10LGUpKTt2YXIgbixpPVtdLGE9W10scz1bXTtmb3Iobj0yO248YXJndW1lbnRzLmxlbmd0aDtuKyspcy5wdXNoKGFyZ3VtZW50c1tuXSk7Zm9yKG49MDtuPGU7bisrKWEucHVzaCh0aGlzW3Qrbl0pO2Zvcig7bjx0aGlzLmxlbmd0aC10O24rKylpLnB1c2godGhpc1t0K25dKTt2YXIgbz1zLmxlbmd0aDtmb3Iobj0wO248bytpLmxlbmd0aDtuKyspdGhpcy5pdGVtc1t0K25dPXRoaXNbdCtuXT1uPG8/c1tuXTppW24tb107Zm9yKG49dGhpcy5pdGVtcy5sZW5ndGg9dGhpcy5sZW5ndGgtPWUtbzt0aGlzW25dOylkZWxldGUgdGhpc1tuKytdO3JldHVybiBuZXcgbGUoYSl9LGZlLmV4Y2x1ZGU9ZnVuY3Rpb24odCl7DQpmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoO2U8cjtlKyspaWYodGhpc1tlXT09dClyZXR1cm4gdGhpcy5zcGxpY2UoZSwxKSwhMH0sZmUuYW5pbWF0ZT1mdW5jdGlvbih0LGUsbixpKXsoci5pcyhuLCJmdW5jdGlvbiIpfHwhbikmJihpPW58fG51bGwpO3ZhciBhLHMsbz10aGlzLml0ZW1zLmxlbmd0aCxjPW8saD10aGlzO2lmKCFvKXJldHVybiB0aGlzO2kmJihzPWZ1bmN0aW9uKCl7IS0tbyYmaS5jYWxsKGgpfSksbj1yLmlzKG4sInN0cmluZyIpP246czt2YXIgdT1yLmFuaW1hdGlvbih0LGUsbixzKTtmb3IoYT10aGlzLml0ZW1zWy0tY10uYW5pbWF0ZSh1KTtjLS07KXRoaXMuaXRlbXNbY10mJiF0aGlzLml0ZW1zW2NdLnJlbW92ZWQmJnRoaXMuaXRlbXNbY10uYW5pbWF0ZVdpdGgoYSx1LHUpLHRoaXMuaXRlbXNbY10mJiF0aGlzLml0ZW1zW2NdLnJlbW92ZWR8fG8tLTtyZXR1cm4gdGhpc30sZmUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlbXMubGVuZ3RoO2UtLTspdGhpcy5pdGVtc1tlXS5pbnNlcnRBZnRlcih0KTtyZXR1cm4gdGhpc30sZmUuZ2V0QkJveD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPVtdLHI9W10sbj1bXSxpPXRoaXMuaXRlbXMubGVuZ3RoO2ktLTspaWYoIXRoaXMuaXRlbXNbaV0ucmVtb3ZlZCl7dmFyIGE9dGhpcy5pdGVtc1tpXS5nZXRCQm94KCk7dC5wdXNoKGEueCksZS5wdXNoKGEueSksci5wdXNoKGEueCthLndpZHRoKSxuLnB1c2goYS55K2EuaGVpZ2h0KX1yZXR1cm4gdD1VW05dKDAsdCksZT1VW05dKDAsZSkscj1qW05dKDAsciksbj1qW05dKDAsbikse3g6dCx5OmUseDI6cix5MjpuLHdpZHRoOnItdCxoZWlnaHQ6bi1lfX0sZmUuY2xvbmU9ZnVuY3Rpb24odCl7dD10aGlzLnBhcGVyLnNldCgpO2Zvcih2YXIgZT0wLHI9dGhpcy5pdGVtcy5sZW5ndGg7ZTxyO2UrKyl0LnB1c2godGhpcy5pdGVtc1tlXS5jbG9uZSgpKTtyZXR1cm4gdH0sZmUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmFwaGHDq2zigJhzIHNldCJ9LGZlLmdsb3c9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXBlci5zZXQoKTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIsbil7dmFyIGk9ci5nbG93KHQpO251bGwhPWkmJmkuZm9yRWFjaChmdW5jdGlvbih0LHIpe2UucHVzaCh0KX0pfSksZX0sZmUuaXNQb2ludEluc2lkZT1mdW5jdGlvbih0LGUpe3ZhciByPSExO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24obil7aWYobi5pc1BvaW50SW5zaWRlKHQsZSkpcmV0dXJuIHI9ITAsITF9KSxyfSxyLnJlZ2lzdGVyRm9udD1mdW5jdGlvbih0KXtpZighdC5mYWNlKXJldHVybiB0O3RoaXMuZm9udHM9dGhpcy5mb250c3x8e307dmFyIGU9e3c6dC53LGZhY2U6e30sZ2x5cGhzOnt9fSxyPXQuZmFjZVsiZm9udC1mYW1pbHkiXTtmb3IodmFyIG4gaW4gdC5mYWNlKXQuZmFjZVtrXShuKSYmKGUuZmFjZVtuXT10LmZhY2Vbbl0pO2lmKHRoaXMuZm9udHNbcl0/dGhpcy5mb250c1tyXS5wdXNoKGUpOnRoaXMuZm9udHNbcl09W2VdLCF0LnN2Zyl7ZS5mYWNlWyJ1bml0cy1wZXItZW0iXT1KKHQuZmFjZVsidW5pdHMtcGVyLWVtIl0sMTApO2Zvcih2YXIgaSBpbiB0LmdseXBocylpZih0LmdseXBoc1trXShpKSl7dmFyIGE9dC5nbHlwaHNbaV07aWYoZS5nbHlwaHNbaV09e3c6YS53LGs6e30sZDphLmQmJiJNIithLmQucmVwbGFjZSgvW21sY3h0cnZdL2csZnVuY3Rpb24odCl7cmV0dXJue2w6IkwiLGM6IkMiLHg6InoiLHQ6Im0iLHI6ImwiLHY6ImMifVt0XXx8Ik0ifSkrInoifSxhLmspZm9yKHZhciBzIGluIGEuaylhW2tdKHMpJiYoZS5nbHlwaHNbaV0ua1tzXT1hLmtbc10pfX1yZXR1cm4gdH0sXy5nZXRGb250PWZ1bmN0aW9uKHQsZSxuLGkpe2lmKGk9aXx8Im5vcm1hbCIsbj1ufHwibm9ybWFsIixlPStlfHx7bm9ybWFsOjQwMCxib2xkOjcwMCxsaWdodGVyOjMwMCxib2xkZXI6ODAwfVtlXXx8NDAwLHIuZm9udHMpe3ZhciBhPXIuZm9udHNbdF07aWYoIWEpe3ZhciBzPW5ldyBSZWdFeHAoIihefFxccykiK3QucmVwbGFjZSgvW15cd1xkXHMrIX4uOl8tXS9nLFIpKyIoXFxzfCQpIiwiaSIpO2Zvcih2YXIgbyBpbiByLmZvbnRzKWlmKHIuZm9udHNba10obykmJnMudGVzdChvKSl7YT1yLmZvbnRzW29dO2JyZWFrfX12YXIgYztpZihhKWZvcih2YXIgaD0wLHU9YS5sZW5ndGg7aDx1JiYoYz1hW2hdLGMuZmFjZVsiZm9udC13ZWlnaHQiXSE9ZXx8Yy5mYWNlWyJmb250LXN0eWxlIl0hPW4mJmMuZmFjZVsiZm9udC1zdHlsZSJdfHxjLmZhY2VbImZvbnQtc3RyZXRjaCJdIT1pKTtoKyspO3JldHVybiBjfX0sXy5wcmludD1mdW5jdGlvbih0LGUsbixpLGEscyxvLGMpe3M9c3x8Im1pZGRsZSIsbz1qKFUob3x8MCwxKSwtMSksYz1qKFUoY3x8MSwzKSwxKTt2YXIgaCx1PU0obilbRl0oUiksbD0wLGY9MCxwPVI7aWYoci5pcyhpLCJzdHJpbmciKSYmKGk9dGhpcy5nZXRGb250KGkpKSxpKXtoPShhfHwxNikvaS5mYWNlWyJ1bml0cy1wZXItZW0iXTtmb3IodmFyIGQ9aS5mYWNlLmJib3hbRl0odyksZz0rZFswXSx4PWRbM10tZFsxXSx2PTAseT0rZFsxXSsoImJhc2VsaW5lIj09cz94KyAraS5mYWNlLmRlc2NlbnQ6eC8yKSxtPTAsYj11Lmxlbmd0aDttPGI7bSsrKXtpZigiXG4iPT11W21dKWw9MCxFPTAsZj0wLHYrPXgqYztlbHNle3ZhciBfPWYmJmkuZ2x5cGhzW3VbbS0xXV18fHt9LEU9aS5nbHlwaHNbdVttXV07bCs9Zj8oXy53fHxpLncpKyhfLmsmJl8ua1t1W21dXXx8MCkraS53Km86MCxmPTF9RSYmRS5kJiYocCs9ci50cmFuc2Zvcm1QYXRoKEUuZCxbInQiLGwqaCx2KmgsInMiLGgsaCxnLHksInQiLCh0LWcpL2gsKGUteSkvaF0pKX19cmV0dXJuIHRoaXMucGF0aChwKS5hdHRyKHtmaWxsOiIjMDAwIixzdHJva2U6Im5vbmUifSl9LF8uYWRkPWZ1bmN0aW9uKHQpe2lmKHIuaXModCwiYXJyYXkiKSlmb3IodmFyIGUsbj10aGlzLnNldCgpLGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspZT10W2ldfHx7fSxFW2tdKGUudHlwZSkmJm4ucHVzaCh0aGlzW2UudHlwZV0oKS5hdHRyKGUpKTtyZXR1cm4gbn0sci5mb3JtYXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLmlzKGUsVyk/WzBdW09dKGUpOmFyZ3VtZW50cztyZXR1cm4gdCYmci5pcyh0LCJzdHJpbmciKSYmbi5sZW5ndGgtMSYmKHQ9dC5yZXBsYWNlKEMsZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09blsrK2VdP1I6bltlXX0pKSx0fHxSfSxyLmZ1bGxmaWxsPWZ1bmN0aW9uKCl7dmFyIHQ9L1x7KFteXH1dKylcfS9nLGU9Lyg/Oig/Ol58XC4pKC4rPykoPz1cW3xcLnwkfFwoKXxcWygnfCIpKC4rPylcMlxdKShcKFwpKT8vZyxyPWZ1bmN0aW9uKHQscixuKXt2YXIgaT1uO3JldHVybiByLnJlcGxhY2UoZSxmdW5jdGlvbih0LGUscixuLGEpe2U9ZXx8bixpJiYoZSBpbiBpJiYoaT1pW2VdKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmYSYmKGk9aSgpKSl9KSxpPShudWxsPT1pfHxpPT1uP3Q6aSkrIiJ9O3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZSh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCxlLG4pfSl9fSgpLHIubmluamE9ZnVuY3Rpb24oKXtyZXR1cm4gQS53YXM/Uy53aW4uUmFwaGFlbD1BLmlzOmRlbGV0ZSBSYXBoYWVsLHJ9LHIuc3Q9ZmUsZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIGkoKXsvaW4vLnRlc3QodC5yZWFkeVN0YXRlKT9zZXRUaW1lb3V0KGksOSk6ci5ldmUoInJhcGhhZWwuRE9NbG9hZCIpfW51bGw9PXQucmVhZHlTdGF0ZSYmdC5hZGRFdmVudExpc3RlbmVyJiYodC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixuPWZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixuLCExKSx0LnJlYWR5U3RhdGU9ImNvbXBsZXRlIn0sITEpLHQucmVhZHlTdGF0ZT0ibG9hZGluZyIpLGkoKX0oZG9jdW1lbnQpLGUub24oInJhcGhhZWwuRE9NbG9hZCIsZnVuY3Rpb24oKXtiPSEwfSksZnVuY3Rpb24oKXtpZihyLnN2Zyl7dmFyIHQ9Imhhc093blByb3BlcnR5IixlPVN0cmluZyxuPXBhcnNlRmxvYXQsaT1wYXJzZUludCxhPU1hdGgscz1hLm1heCxvPWEuYWJzLGM9YS5wb3csaD0vWywgXSsvLHU9ci5ldmUsbD0iIixmPSIgIixwPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIixkPXtibG9jazoiTTUsMCAwLDIuNSA1LDV6IixjbGFzc2ljOiJNNSwwIDAsMi41IDUsNSAzLjUsMyAzLjUsMnoiLGRpYW1vbmQ6Ik0yLjUsMCA1LDIuNSAyLjUsNSAwLDIuNXoiLG9wZW46Ik02LDEgMSwzLjUgNiw2IixvdmFsOiJNMi41LDBBMi41LDIuNSwwLDAsMSwyLjUsNSAyLjUsMi41LDAsMCwxLDIuNSwweiJ9LGc9e307ci50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJZb3VyIGJyb3dzZXIgc3VwcG9ydHMgU1ZHLlxuWW91IGFyZSBydW5uaW5nIFJhcGhhw6tsICIrdGhpcy52ZXJzaW9ufTt2YXIgeD1mdW5jdGlvbihuLGkpe2lmKGkpeyJzdHJpbmciPT10eXBlb2YgbiYmKG49eChuKSk7Zm9yKHZhciBhIGluIGkpaVt0XShhKSYmKCJ4bGluazoiPT1hLnN1YnN0cmluZygwLDYpP24uc2V0QXR0cmlidXRlTlMocCxhLnN1YnN0cmluZyg2KSxlKGlbYV0pKTpuLnNldEF0dHJpYnV0ZShhLGUoaVthXSkpKX1lbHNlIG49ci5fZy5kb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsbiksbi5zdHlsZSYmKG4uc3R5bGUud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9InJnYmEoMCwwLDAsMCkiKTtyZXR1cm4gbn0sdj1mdW5jdGlvbih0LGkpe3ZhciBoPSJsaW5lYXIiLHU9dC5pZCtpLGY9LjUscD0uNSxkPXQubm9kZSxnPXQucGFwZXIsdj1kLnN0eWxlLHk9ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQodSk7aWYoIXkpe2lmKGk9ZShpKS5yZXBsYWNlKHIuX3JhZGlhbF9ncmFkaWVudCxmdW5jdGlvbih0LGUscil7aWYoaD0icmFkaWFsIixlJiZyKXtmPW4oZSkscD1uKHIpO3ZhciBpPTIqKHA+LjUpLTE7YyhmLS41LDIpK2MocC0uNSwyKT4uMjUmJihwPWEuc3FydCguMjUtYyhmLS41LDIpKSppKy41KSYmLjUhPXAmJihwPXAudG9GaXhlZCg1KS0xZS01KmkpfXJldHVybiBsfSksaT1pLnNwbGl0KC9ccypcLVxzKi8pLCJsaW5lYXIiPT1oKXt2YXIgbT1pLnNoaWZ0KCk7aWYobT0tbihtKSxpc05hTihtKSlyZXR1cm4gbnVsbDt2YXIgYj1bMCwwLGEuY29zKHIucmFkKG0pKSxhLnNpbihyLnJhZChtKSldLF89MS8ocyhvKGJbMl0pLG8oYlszXSkpfHwxKTtiWzJdKj1fLGJbM10qPV8sYlsyXTwwJiYoYlswXT0tYlsyXSxiWzJdPTApLGJbM108MCYmKGJbMV09LWJbM10sYlszXT0wKX12YXIgdz1yLl9wYXJzZURvdHMoaSk7aWYoIXcpcmV0dXJuIG51bGw7aWYodT11LnJlcGxhY2UoL1tcKFwpXHMsXHhiMCNdL2csIl8iKSx0LmdyYWRpZW50JiZ1IT10LmdyYWRpZW50LmlkJiYoZy5kZWZzLnJlbW92ZUNoaWxkKHQuZ3JhZGllbnQpLGRlbGV0ZSB0LmdyYWRpZW50KSwhdC5ncmFkaWVudCl7eT14KGgrIkdyYWRpZW50Iix7aWQ6dX0pLHQuZ3JhZGllbnQ9eSx4KHksInJhZGlhbCI9PWg/e2Z4OmYsZnk6cH06e3gxOmJbMF0seTE6YlsxXSx4MjpiWzJdLHkyOmJbM10sZ3JhZGllbnRUcmFuc2Zvcm06dC5tYXRyaXguaW52ZXJ0KCl9KSxnLmRlZnMuYXBwZW5kQ2hpbGQoeSk7Zm9yKHZhciBFPTAsQz13Lmxlbmd0aDtFPEM7RSsrKXkuYXBwZW5kQ2hpbGQoeCgic3RvcCIse29mZnNldDp3W0VdLm9mZnNldD93W0VdLm9mZnNldDpFPyIxMDAlIjoiMCUiLCJzdG9wLWNvbG9yIjp3W0VdLmNvbG9yfHwiI2ZmZiJ9KSl9fXJldHVybiB4KGQse2ZpbGw6InVybCgjIit1KyIpIixvcGFjaXR5OjEsImZpbGwtb3BhY2l0eSI6MX0pLHYuZmlsbD1sLHYub3BhY2l0eT0xLHYuZmlsbE9wYWNpdHk9MSwxfSx5PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QkJveCgxKTt4KHQucGF0dGVybix7cGF0dGVyblRyYW5zZm9ybTp0Lm1hdHJpeC5pbnZlcnQoKSsiIHRyYW5zbGF0ZSgiK2UueCsiLCIrZS55KyIpIn0pfSxtPWZ1bmN0aW9uKG4saSxhKXtpZigicGF0aCI9PW4udHlwZSl7Zm9yKHZhciBzLG8sYyxoLHUsZj1lKGkpLnRvTG93ZXJDYXNlKCkuc3BsaXQoIi0iKSxwPW4ucGFwZXIsdj1hPyJlbmQiOiJzdGFydCIseT1uLm5vZGUsbT1uLmF0dHJzLGI9bVsic3Ryb2tlLXdpZHRoIl0sXz1mLmxlbmd0aCx3PSJjbGFzc2ljIixFPTMsQz0zLGs9NTtfLS07KXN3aXRjaChmW19dKXtjYXNlImJsb2NrIjpjYXNlImNsYXNzaWMiOmNhc2Uib3ZhbCI6Y2FzZSJkaWFtb25kIjpjYXNlIm9wZW4iOmNhc2Uibm9uZSI6dz1mW19dO2JyZWFrO2Nhc2Uid2lkZSI6Qz01O2JyZWFrO2Nhc2UibmFycm93IjpDPTI7YnJlYWs7Y2FzZSJsb25nIjpFPTU7YnJlYWs7Y2FzZSJzaG9ydCI6RT0yfWlmKCJvcGVuIj09dz8oRSs9MixDKz0yLGsrPTIsYz0xLGg9YT80OjEsdT17ZmlsbDoibm9uZSIsc3Ryb2tlOm0uc3Ryb2tlfSk6KGg9Yz1FLzIsdT17ZmlsbDptLnN0cm9rZSxzdHJva2U6Im5vbmUifSksbi5fLmFycm93cz9hPyhuLl8uYXJyb3dzLmVuZFBhdGgmJmdbbi5fLmFycm93cy5lbmRQYXRoXS0tLG4uXy5hcnJvd3MuZW5kTWFya2VyJiZnW24uXy5hcnJvd3MuZW5kTWFya2VyXS0tKToobi5fLmFycm93cy5zdGFydFBhdGgmJmdbbi5fLmFycm93cy5zdGFydFBhdGhdLS0sbi5fLmFycm93cy5zdGFydE1hcmtlciYmZ1tuLl8uYXJyb3dzLnN0YXJ0TWFya2VyXS0tKTpuLl8uYXJyb3dzPXt9LCJub25lIiE9dyl7dmFyIFM9InJhcGhhZWwtbWFya2VyLSIrdyxBPSJyYXBoYWVsLW1hcmtlci0iK3YrdytFK0M7ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoUyk/Z1tTXSsrOihwLmRlZnMuYXBwZW5kQ2hpbGQoeCh4KCJwYXRoIikseyJzdHJva2UtbGluZWNhcCI6InJvdW5kIixkOmRbd10saWQ6U30pKSxnW1NdPTEpO3ZhciBCLE49ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoQSk7Tj8oZ1tBXSsrLEI9Ti5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlIilbMF0pOihOPXgoeCgibWFya2VyIikse2lkOkEsbWFya2VySGVpZ2h0OkMsbWFya2VyV2lkdGg6RSxvcmllbnQ6ImF1dG8iLHJlZlg6aCxyZWZZOkMvMn0pLEI9eCh4KCJ1c2UiKSx7InhsaW5rOmhyZWYiOiIjIitTLHRyYW5zZm9ybTooYT8icm90YXRlKDE4MCAiK0UvMisiICIrQy8yKyIpICI6bCkrInNjYWxlKCIrRS9rKyIsIitDL2srIikiLCJzdHJva2Utd2lkdGgiOigxLygoRS9rK0MvaykvMikpLnRvRml4ZWQoNCl9KSxOLmFwcGVuZENoaWxkKEIpLHAuZGVmcy5hcHBlbmRDaGlsZChOKSxnW0FdPTEpLHgoQix1KTt2YXIgTz1jKigiZGlhbW9uZCIhPXcmJiJvdmFsIiE9dyk7YT8ocz1uLl8uYXJyb3dzLnN0YXJ0ZHgqYnx8MCxvPXIuZ2V0VG90YWxMZW5ndGgobS5wYXRoKS1PKmIpOihzPU8qYixvPXIuZ2V0VG90YWxMZW5ndGgobS5wYXRoKS0obi5fLmFycm93cy5lbmRkeCpifHwwKSksdT17fSx1WyJtYXJrZXItIit2XT0idXJsKCMiK0ErIikiLChvfHxzKSYmKHUuZD1yLmdldFN1YnBhdGgobS5wYXRoLHMsbykpLHgoeSx1KSxuLl8uYXJyb3dzW3YrIlBhdGgiXT1TLG4uXy5hcnJvd3NbdisiTWFya2VyIl09QSxuLl8uYXJyb3dzW3YrImR4Il09TyxuLl8uYXJyb3dzW3YrIlR5cGUiXT13LG4uXy5hcnJvd3NbdisiU3RyaW5nIl09aX1lbHNlIGE/KHM9bi5fLmFycm93cy5zdGFydGR4KmJ8fDAsbz1yLmdldFRvdGFsTGVuZ3RoKG0ucGF0aCktcyk6KHM9MCxvPXIuZ2V0VG90YWxMZW5ndGgobS5wYXRoKS0obi5fLmFycm93cy5lbmRkeCpifHwwKSksbi5fLmFycm93c1t2KyJQYXRoIl0mJngoeSx7ZDpyLmdldFN1YnBhdGgobS5wYXRoLHMsbyl9KSxkZWxldGUgbi5fLmFycm93c1t2KyJQYXRoIl0sZGVsZXRlIG4uXy5hcnJvd3NbdisiTWFya2VyIl0sZGVsZXRlIG4uXy5hcnJvd3NbdisiZHgiXSxkZWxldGUgbi5fLmFycm93c1t2KyJUeXBlIl0sZGVsZXRlIG4uXy5hcnJvd3NbdisiU3RyaW5nIl07Zm9yKHUgaW4gZylpZihnW3RdKHUpJiYhZ1t1XSl7dmFyIFQ9ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQodSk7VCYmVC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKFQpfX19LGI9eyIiOlswXSxub25lOlswXSwiLSI6WzMsMV0sIi4iOlsxLDFdLCItLiI6WzMsMSwxLDFdLCItLi4iOlszLDEsMSwxLDEsMV0sIi4gIjpbMSwzXSwiLSAiOls0LDNdLCItLSI6WzgsM10sIi0gLiI6WzQsMywxLDNdLCItLS4iOls4LDMsMSwzXSwiLS0uLiI6WzgsMywxLDMsMSwzXX0sXz1mdW5jdGlvbih0LHIsbil7aWYocj1iW2UocikudG9Mb3dlckNhc2UoKV0pe2Zvcih2YXIgaT10LmF0dHJzWyJzdHJva2Utd2lkdGgiXXx8IjEiLGE9e3JvdW5kOmksc3F1YXJlOmksYnV0dDowfVt0LmF0dHJzWyJzdHJva2UtbGluZWNhcCJdfHxuWyJzdHJva2UtbGluZWNhcCJdXXx8MCxzPVtdLG89ci5sZW5ndGg7by0tOylzW29dPXJbb10qaSsobyUyPzE6LTEpKmE7eCh0Lm5vZGUseyJzdHJva2UtZGFzaGFycmF5IjpzLmpvaW4oIiwiKX0pfX0sdz1mdW5jdGlvbihuLGEpe3ZhciBjPW4ubm9kZSx1PW4uYXR0cnMsZj1jLnN0eWxlLnZpc2liaWxpdHk7Yy5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO2Zvcih2YXIgZCBpbiBhKWlmKGFbdF0oZCkpe2lmKCFyLl9hdmFpbGFibGVBdHRyc1t0XShkKSljb250aW51ZTt2YXIgZz1hW2RdO3N3aXRjaCh1W2RdPWcsZCl7Y2FzZSJibHVyIjpuLmJsdXIoZyk7YnJlYWs7Y2FzZSJ0aXRsZSI6dmFyIGI9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGl0bGUiKTtpZihiLmxlbmd0aCYmKGI9YlswXSkpYi5maXJzdENoaWxkLm5vZGVWYWx1ZT1nO2Vsc2V7Yj14KCJ0aXRsZSIpO3ZhciB3PXIuX2cuZG9jLmNyZWF0ZVRleHROb2RlKGcpO2IuYXBwZW5kQ2hpbGQodyksYy5hcHBlbmRDaGlsZChiKX1icmVhaztjYXNlImhyZWYiOmNhc2UidGFyZ2V0Ijp2YXIgQz1jLnBhcmVudE5vZGU7aWYoImEiIT1DLnRhZ05hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGs9eCgiYSIpO0MuaW5zZXJ0QmVmb3JlKGssYyksay5hcHBlbmRDaGlsZChjKSxDPWt9InRhcmdldCI9PWQ/Qy5zZXRBdHRyaWJ1dGVOUyhwLCJzaG93IiwiYmxhbmsiPT1nPyJuZXciOmcpOkMuc2V0QXR0cmlidXRlTlMocCxkLGcpO2JyZWFrO2Nhc2UiY3Vyc29yIjpjLnN0eWxlLmN1cnNvcj1nO2JyZWFrO2Nhc2UidHJhbnNmb3JtIjpuLnRyYW5zZm9ybShnKTticmVhaztjYXNlImFycm93LXN0YXJ0IjptKG4sZyk7YnJlYWs7Y2FzZSJhcnJvdy1lbmQiOm0obixnLDEpO2JyZWFrO2Nhc2UiY2xpcC1yZWN0Ijp2YXIgUz1lKGcpLnNwbGl0KGgpO2lmKDQ9PVMubGVuZ3RoKXtuLmNsaXAmJm4uY2xpcC5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobi5jbGlwLnBhcmVudE5vZGUpO3ZhciBBPXgoImNsaXBQYXRoIiksQj14KCJyZWN0Iik7QS5pZD1yLmNyZWF0ZVVVSUQoKSx4KEIse3g6U1swXSx5OlNbMV0sd2lkdGg6U1syXSxoZWlnaHQ6U1szXX0pLEEuYXBwZW5kQ2hpbGQoQiksbi5wYXBlci5kZWZzLmFwcGVuZENoaWxkKEEpLHgoYyx7ImNsaXAtcGF0aCI6InVybCgjIitBLmlkKyIpIn0pLG4uY2xpcD1CfWlmKCFnKXt2YXIgTj1jLmdldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIik7aWYoTil7dmFyIE89ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoTi5yZXBsYWNlKC8oXnVybFwoI3xcKSQpL2csbCkpO08mJk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChPKSx4KGMseyJjbGlwLXBhdGgiOmx9KSxkZWxldGUgbi5jbGlwfX1icmVhaztjYXNlInBhdGgiOiJwYXRoIj09bi50eXBlJiYoeChjLHtkOmc/dS5wYXRoPXIuX3BhdGhUb0Fic29sdXRlKGcpOiJNMCwwIn0pLG4uXy5kaXJ0eT0xLG4uXy5hcnJvd3MmJigic3RhcnRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3Muc3RhcnRTdHJpbmcpLCJlbmRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3MuZW5kU3RyaW5nLDEpKSk7YnJlYWs7Y2FzZSJ3aWR0aCI6aWYoYy5zZXRBdHRyaWJ1dGUoZCxnKSxuLl8uZGlydHk9MSwhdS5meClicmVhaztkPSJ4IixnPXUueDtjYXNlIngiOnUuZngmJihnPS11LngtKHUud2lkdGh8fDApKTtjYXNlInJ4IjppZigicngiPT1kJiYicmVjdCI9PW4udHlwZSlicmVhaztjYXNlImN4IjpjLnNldEF0dHJpYnV0ZShkLGcpLG4ucGF0dGVybiYmeShuKSxuLl8uZGlydHk9MTticmVhaztjYXNlImhlaWdodCI6aWYoYy5zZXRBdHRyaWJ1dGUoZCxnKSxuLl8uZGlydHk9MSwhdS5meSlicmVhaztkPSJ5IixnPXUueTtjYXNlInkiOnUuZnkmJihnPS11LnktKHUuaGVpZ2h0fHwwKSk7Y2FzZSJyeSI6aWYoInJ5Ij09ZCYmInJlY3QiPT1uLnR5cGUpYnJlYWs7Y2FzZSJjeSI6Yy5zZXRBdHRyaWJ1dGUoZCxnKSxuLnBhdHRlcm4mJnkobiksbi5fLmRpcnR5PTE7YnJlYWs7Y2FzZSJyIjoicmVjdCI9PW4udHlwZT94KGMse3J4Omcscnk6Z30pOmMuc2V0QXR0cmlidXRlKGQsZyksbi5fLmRpcnR5PTE7YnJlYWs7Y2FzZSJzcmMiOiJpbWFnZSI9PW4udHlwZSYmYy5zZXRBdHRyaWJ1dGVOUyhwLCJocmVmIixnKTticmVhaztjYXNlInN0cm9rZS13aWR0aCI6MT09bi5fLnN4JiYxPT1uLl8uc3l8fChnLz1zKG8obi5fLnN4KSxvKG4uXy5zeSkpfHwxKSxuLnBhcGVyLl92YlNpemUmJihnKj1uLnBhcGVyLl92YlNpemUpLGMuc2V0QXR0cmlidXRlKGQsZyksdVsic3Ryb2tlLWRhc2hhcnJheSJdJiZfKG4sdVsic3Ryb2tlLWRhc2hhcnJheSJdLGEpLG4uXy5hcnJvd3MmJigic3RhcnRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3Muc3RhcnRTdHJpbmcpLCJlbmRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3MuZW5kU3RyaW5nLDEpKTticmVhaztjYXNlInN0cm9rZS1kYXNoYXJyYXkiOl8obixnLGEpO2JyZWFrO2Nhc2UiZmlsbCI6dmFyIFQ9ZShnKS5tYXRjaChyLl9JU1VSTCk7aWYoVCl7QT14KCJwYXR0ZXJuIik7dmFyIFI9eCgiaW1hZ2UiKTtBLmlkPXIuY3JlYXRlVVVJRCgpLHgoQSx7eDowLHk6MCxwYXR0ZXJuVW5pdHM6InVzZXJTcGFjZU9uVXNlIixoZWlnaHQ6MSx3aWR0aDoxfSkseChSLHt4OjAseTowLCJ4bGluazpocmVmIjpUWzFdfSksQS5hcHBlbmRDaGlsZChSKSxmdW5jdGlvbih0KXtyLl9wcmVsb2FkKFRbMV0sZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFdpZHRoLHI9dGhpcy5vZmZzZXRIZWlnaHQ7eCh0LHt3aWR0aDplLGhlaWdodDpyfSkseChSLHt3aWR0aDplLGhlaWdodDpyfSksbi5wYXBlci5zYWZhcmkoKX0pfShBKSxuLnBhcGVyLmRlZnMuYXBwZW5kQ2hpbGQoQSkseChjLHtmaWxsOiJ1cmwoIyIrQS5pZCsiKSJ9KSxuLnBhdHRlcm49QSxuLnBhdHRlcm4mJnkobik7YnJlYWt9dmFyIEk9ci5nZXRSR0IoZyk7aWYoSS5lcnJvcil7aWYoKCJjaXJjbGUiPT1uLnR5cGV8fCJlbGxpcHNlIj09bi50eXBlfHwiciIhPWUoZykuY2hhckF0KCkpJiZ2KG4sZykpe2lmKCJvcGFjaXR5ImluIHV8fCJmaWxsLW9wYWNpdHkiaW4gdSl7dmFyIE09ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoYy5nZXRBdHRyaWJ1dGUoImZpbGwiKS5yZXBsYWNlKC9edXJsXCgjfFwpJC9nLGwpKTtpZihNKXt2YXIgRj1NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdG9wIik7eChGW0YubGVuZ3RoLTFdLHsic3RvcC1vcGFjaXR5IjooIm9wYWNpdHkiaW4gdT91Lm9wYWNpdHk6MSkqKCJmaWxsLW9wYWNpdHkiaW4gdT91WyJmaWxsLW9wYWNpdHkiXToxKX0pfX11LmdyYWRpZW50PWcsdS5maWxsPSJub25lIjticmVha319ZWxzZSBkZWxldGUgYS5ncmFkaWVudCxkZWxldGUgdS5ncmFkaWVudCwhci5pcyh1Lm9wYWNpdHksInVuZGVmaW5lZCIpJiZyLmlzKGEub3BhY2l0eSwidW5kZWZpbmVkIikmJngoYyx7b3BhY2l0eTp1Lm9wYWNpdHl9KSwhci5pcyh1WyJmaWxsLW9wYWNpdHkiXSwidW5kZWZpbmVkIikmJnIuaXMoYVsiZmlsbC1vcGFjaXR5Il0sInVuZGVmaW5lZCIpJiZ4KGMseyJmaWxsLW9wYWNpdHkiOnVbImZpbGwtb3BhY2l0eSJdfSk7SVt0XSgib3BhY2l0eSIpJiZ4KGMseyJmaWxsLW9wYWNpdHkiOkkub3BhY2l0eT4xP0kub3BhY2l0eS8xMDA6SS5vcGFjaXR5fSk7Y2FzZSJzdHJva2UiOkk9ci5nZXRSR0IoZyksYy5zZXRBdHRyaWJ1dGUoZCxJLmhleCksInN0cm9rZSI9PWQmJklbdF0oIm9wYWNpdHkiKSYmeChjLHsic3Ryb2tlLW9wYWNpdHkiOkkub3BhY2l0eT4xP0kub3BhY2l0eS8xMDA6SS5vcGFjaXR5fSksInN0cm9rZSI9PWQmJm4uXy5hcnJvd3MmJigic3RhcnRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3Muc3RhcnRTdHJpbmcpLCJlbmRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3MuZW5kU3RyaW5nLDEpKTticmVhaztjYXNlImdyYWRpZW50IjooImNpcmNsZSI9PW4udHlwZXx8ImVsbGlwc2UiPT1uLnR5cGV8fCJyIiE9ZShnKS5jaGFyQXQoKSkmJnYobixnKTticmVhaztjYXNlIm9wYWNpdHkiOnUuZ3JhZGllbnQmJiF1W3RdKCJzdHJva2Utb3BhY2l0eSIpJiZ4KGMseyJzdHJva2Utb3BhY2l0eSI6Zz4xP2cvMTAwOmd9KTtjYXNlImZpbGwtb3BhY2l0eSI6aWYodS5ncmFkaWVudCl7TT1yLl9nLmRvYy5nZXRFbGVtZW50QnlJZChjLmdldEF0dHJpYnV0ZSgiZmlsbCIpLnJlcGxhY2UoL151cmxcKCN8XCkkL2csbCkpLE0mJihGPU0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0b3AiKSx4KEZbRi5sZW5ndGgtMV0seyJzdG9wLW9wYWNpdHkiOmd9KSk7YnJlYWt9ZGVmYXVsdDoiZm9udC1zaXplIj09ZCYmKGc9aShnLDEwKSsicHgiKTt2YXIgRD1kLnJlcGxhY2UoLyhcLS4pL2csZnVuY3Rpb24odCl7cmV0dXJuIHQuc3Vic3RyaW5nKDEpLnRvVXBwZXJDYXNlKCl9KTtjLnN0eWxlW0RdPWcsbi5fLmRpcnR5PTEsYy5zZXRBdHRyaWJ1dGUoZCxnKX19RShuLGEpLGMuc3R5bGUudmlzaWJpbGl0eT1mfSxFPWZ1bmN0aW9uKG4sYSl7aWYoInRleHQiPT1uLnR5cGUmJihhW3RdKCJ0ZXh0Iil8fGFbdF0oImZvbnQiKXx8YVt0XSgiZm9udC1zaXplIil8fGFbdF0oIngiKXx8YVt0XSgieSIpKSl7dmFyIHM9bi5hdHRycyxvPW4ubm9kZSxjPW8uZmlyc3RDaGlsZD9pKHIuX2cuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoby5maXJzdENoaWxkLGwpLmdldFByb3BlcnR5VmFsdWUoImZvbnQtc2l6ZSIpLDEwKToxMDtpZihhW3RdKCJ0ZXh0Iikpe2ZvcihzLnRleHQ9YS50ZXh0O28uZmlyc3RDaGlsZDspby5yZW1vdmVDaGlsZChvLmZpcnN0Q2hpbGQpO2Zvcih2YXIgaCx1PWUoYS50ZXh0KS5zcGxpdCgiXG4iKSxmPVtdLHA9MCxkPXUubGVuZ3RoO3A8ZDtwKyspaD14KCJ0c3BhbiIpLHAmJngoaCx7ZHk6MS4yKmMseDpzLnh9KSxoLmFwcGVuZENoaWxkKHIuX2cuZG9jLmNyZWF0ZVRleHROb2RlKHVbcF0pKSxvLmFwcGVuZENoaWxkKGgpLGZbcF09aH1lbHNlIGZvcihmPW8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRzcGFuIikscD0wLGQ9Zi5sZW5ndGg7cDxkO3ArKylwP3goZltwXSx7ZHk6MS4yKmMseDpzLnh9KTp4KGZbMF0se2R5OjB9KTt4KG8se3g6cy54LHk6cy55fSksbi5fLmRpcnR5PTE7dmFyIGc9bi5fZ2V0QkJveCgpLHY9cy55LShnLnkrZy5oZWlnaHQvMik7diYmci5pcyh2LCJmaW5pdGUiKSYmeChmWzBdLHtkeTp2fSl9fSxDPWZ1bmN0aW9uKHQsZSl7dGhpc1swXT10aGlzLm5vZGU9dCx0LnJhcGhhZWw9ITAsdGhpcy5pZD1yLl9vaWQrKyx0LnJhcGhhZWxpZD10aGlzLmlkLHRoaXMubWF0cml4PXIubWF0cml4KCksdGhpcy5yZWFsUGF0aD1udWxsLHRoaXMucGFwZXI9ZSx0aGlzLmF0dHJzPXRoaXMuYXR0cnN8fHt9LHRoaXMuXz17dHJhbnNmb3JtOltdLHN4OjEsc3k6MSxkZWc6MCxkeDowLGR5OjAsZGlydHk6MX0sIWUuYm90dG9tJiYoZS5ib3R0b209dGhpcyksdGhpcy5wcmV2PWUudG9wLGUudG9wJiYoZS50b3AubmV4dD10aGlzKSxlLnRvcD10aGlzLHRoaXMubmV4dD1udWxsfSxrPXIuZWw7Qy5wcm90b3R5cGU9ayxrLmNvbnN0cnVjdG9yPUMsci5fZW5naW5lLnBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgcj14KCJwYXRoIik7ZS5jYW52YXMmJmUuY2FudmFzLmFwcGVuZENoaWxkKHIpO3ZhciBuPW5ldyBDKHIsZSk7cmV0dXJuIG4udHlwZT0icGF0aCIsdyhuLHtmaWxsOiJub25lIixzdHJva2U6IiMwMDAiLHBhdGg6dH0pLG59LGsucm90YXRlPWZ1bmN0aW9uKHQscixpKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYodD1lKHQpLnNwbGl0KGgpLHQubGVuZ3RoLTEmJihyPW4odFsxXSksaT1uKHRbMl0pKSx0PW4odFswXSksbnVsbD09aSYmKHI9aSksbnVsbD09cnx8bnVsbD09aSl7dmFyIGE9dGhpcy5nZXRCQm94KDEpO3I9YS54K2Eud2lkdGgvMixpPWEueSthLmhlaWdodC8yfXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbWyJyIix0LHIsaV1dKSksdGhpc30say5zY2FsZT1mdW5jdGlvbih0LHIsaSxhKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYodD1lKHQpLnNwbGl0KGgpLHQubGVuZ3RoLTEmJihyPW4odFsxXSksaT1uKHRbMl0pLGE9bih0WzNdKSksdD1uKHRbMF0pLG51bGw9PXImJihyPXQpLG51bGw9PWEmJihpPWEpLG51bGw9PWl8fG51bGw9PWEpdmFyIHM9dGhpcy5nZXRCQm94KDEpO3JldHVybiBpPW51bGw9PWk/cy54K3Mud2lkdGgvMjppLGE9bnVsbD09YT9zLnkrcy5oZWlnaHQvMjphLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInMiLHQscixpLGFdXSkpLHRoaXN9LGsudHJhbnNsYXRlPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0PWUodCkuc3BsaXQoaCksdC5sZW5ndGgtMSYmKHI9bih0WzFdKSksdD1uKHRbMF0pfHwwLHI9K3J8fDAsdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1sidCIsdCxyXV0pKSx0aGlzKX0say50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5fO2lmKG51bGw9PWUpcmV0dXJuIG4udHJhbnNmb3JtO2lmKHIuX2V4dHJhY3RUcmFuc2Zvcm0odGhpcyxlKSx0aGlzLmNsaXAmJngodGhpcy5jbGlwLHt0cmFuc2Zvcm06dGhpcy5tYXRyaXguaW52ZXJ0KCl9KSx0aGlzLnBhdHRlcm4mJnkodGhpcyksdGhpcy5ub2RlJiZ4KHRoaXMubm9kZSx7dHJhbnNmb3JtOnRoaXMubWF0cml4fSksMSE9bi5zeHx8MSE9bi5zeSl7dmFyIGk9dGhpcy5hdHRyc1t0XSgic3Ryb2tlLXdpZHRoIik/dGhpcy5hdHRyc1sic3Ryb2tlLXdpZHRoIl06MTt0aGlzLmF0dHIoeyJzdHJva2Utd2lkdGgiOml9KX1yZXR1cm4gdGhpc30say5oaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucmVtb3ZlZCYmdGhpcy5wYXBlci5zYWZhcmkodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzfSxrLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiZ0aGlzLnBhcGVyLnNhZmFyaSh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheT0iIiksdGhpc30say5yZW1vdmU9ZnVuY3Rpb24oKXtpZighdGhpcy5yZW1vdmVkJiZ0aGlzLm5vZGUucGFyZW50Tm9kZSl7dmFyIHQ9dGhpcy5wYXBlcjt0Ll9fc2V0X18mJnQuX19zZXRfXy5leGNsdWRlKHRoaXMpLHUudW5iaW5kKCJyYXBoYWVsLiouKi4iK3RoaXMuaWQpLHRoaXMuZ3JhZGllbnQmJnQuZGVmcy5yZW1vdmVDaGlsZCh0aGlzLmdyYWRpZW50KSxyLl90ZWFyKHRoaXMsdCksImEiPT10aGlzLm5vZGUucGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk/dGhpcy5ub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUucGFyZW50Tm9kZSk6dGhpcy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKTtmb3IodmFyIGUgaW4gdGhpcyl0aGlzW2VdPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzW2VdP3IuX3JlbW92ZWRGYWN0b3J5KGUpOm51bGw7dGhpcy5yZW1vdmVkPSEwfX0say5fZ2V0QkJveD1mdW5jdGlvbigpe2lmKCJub25lIj09dGhpcy5ub2RlLnN0eWxlLmRpc3BsYXkpe3RoaXMuc2hvdygpO3ZhciB0PSEwfXZhciBlPXt9O3RyeXtlPXRoaXMubm9kZS5nZXRCQm94KCl9Y2F0Y2godCl7fWZpbmFsbHl7ZT1lfHx7fX1yZXR1cm4gdCYmdGhpcy5oaWRlKCksZX0say5hdHRyPWZ1bmN0aW9uKGUsbil7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKG51bGw9PWUpe3ZhciBpPXt9O2Zvcih2YXIgYSBpbiB0aGlzLmF0dHJzKXRoaXMuYXR0cnNbdF0oYSkmJihpW2FdPXRoaXMuYXR0cnNbYV0pO3JldHVybiBpLmdyYWRpZW50JiYibm9uZSI9PWkuZmlsbCYmKGkuZmlsbD1pLmdyYWRpZW50KSYmZGVsZXRlIGkuZ3JhZGllbnQsaS50cmFuc2Zvcm09dGhpcy5fLnRyYW5zZm9ybSxpfWlmKG51bGw9PW4mJnIuaXMoZSwic3RyaW5nIikpe2lmKCJmaWxsIj09ZSYmIm5vbmUiPT10aGlzLmF0dHJzLmZpbGwmJnRoaXMuYXR0cnMuZ3JhZGllbnQpcmV0dXJuIHRoaXMuYXR0cnMuZ3JhZGllbnQ7aWYoInRyYW5zZm9ybSI9PWUpcmV0dXJuIHRoaXMuXy50cmFuc2Zvcm07Zm9yKHZhciBzPWUuc3BsaXQoaCksbz17fSxjPTAsbD1zLmxlbmd0aDtjPGw7YysrKWU9c1tjXSxlIGluIHRoaXMuYXR0cnM/b1tlXT10aGlzLmF0dHJzW2VdOnIuaXModGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2VdLCJmdW5jdGlvbiIpP29bZV09dGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2VdLmRlZjpvW2VdPXIuX2F2YWlsYWJsZUF0dHJzW2VdO3JldHVybiBsLTE/bzpvW3NbMF1dfWlmKG51bGw9PW4mJnIuaXMoZSwiYXJyYXkiKSl7Zm9yKG89e30sYz0wLGw9ZS5sZW5ndGg7YzxsO2MrKylvW2VbY11dPXRoaXMuYXR0cihlW2NdKTtyZXR1cm4gb31pZihudWxsIT1uKXt2YXIgZj17fTtmW2VdPW59ZWxzZSBudWxsIT1lJiZyLmlzKGUsIm9iamVjdCIpJiYoZj1lKTtmb3IodmFyIHAgaW4gZil1KCJyYXBoYWVsLmF0dHIuIitwKyIuIit0aGlzLmlkLHRoaXMsZltwXSk7Zm9yKHAgaW4gdGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzKWlmKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1t0XShwKSYmZlt0XShwKSYmci5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcF0sImZ1bmN0aW9uIikpe3ZhciBkPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1twXS5hcHBseSh0aGlzLFtdLmNvbmNhdChmW3BdKSk7dGhpcy5hdHRyc1twXT1mW3BdO2Zvcih2YXIgZyBpbiBkKWRbdF0oZykmJihmW2ddPWRbZ10pfXJldHVybiB3KHRoaXMsZiksdGhpc30say50b0Zyb250PWZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzOyJhIj09dGhpcy5ub2RlLnBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpP3RoaXMubm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlLnBhcmVudE5vZGUpOnRoaXMubm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMubm9kZSk7dmFyIHQ9dGhpcy5wYXBlcjtyZXR1cm4gdC50b3AhPXRoaXMmJnIuX3RvZnJvbnQodGhpcyx0KSx0aGlzfSxrLnRvQmFjaz1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpczt2YXIgdD10aGlzLm5vZGUucGFyZW50Tm9kZTsiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpP3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLnBhcmVudE5vZGUsdGhpcy5ub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkKTp0LmZpcnN0Q2hpbGQhPXRoaXMubm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpLHIuX3RvYmFjayh0aGlzLHRoaXMucGFwZXIpO3RoaXMucGFwZXI7cmV0dXJuIHRoaXN9LGsuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO3ZhciBlPXQubm9kZXx8dFt0Lmxlbmd0aC0xXS5ub2RlO3JldHVybiBlLm5leHRTaWJsaW5nP2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGUubmV4dFNpYmxpbmcpOmUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLHIuX2luc2VydGFmdGVyKHRoaXMsdCx0aGlzLnBhcGVyKSx0aGlzfSxrLmluc2VydEJlZm9yZT1mdW5jdGlvbih0KXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7dmFyIGU9dC5ub2RlfHx0WzBdLm5vZGU7cmV0dXJuIGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGUpLHIuX2luc2VydGJlZm9yZSh0aGlzLHQsdGhpcy5wYXBlciksdGhpc30say5ibHVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoMCE9K3Qpe3ZhciBuPXgoImZpbHRlciIpLGk9eCgiZmVHYXVzc2lhbkJsdXIiKTtlLmF0dHJzLmJsdXI9dCxuLmlkPXIuY3JlYXRlVVVJRCgpLHgoaSx7c3RkRGV2aWF0aW9uOit0fHwxLjV9KSxuLmFwcGVuZENoaWxkKGkpLGUucGFwZXIuZGVmcy5hcHBlbmRDaGlsZChuKSxlLl9ibHVyPW4seChlLm5vZGUse2ZpbHRlcjoidXJsKCMiK24uaWQrIikifSl9ZWxzZSBlLl9ibHVyJiYoZS5fYmx1ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuX2JsdXIpLGRlbGV0ZSBlLl9ibHVyLGRlbGV0ZSBlLmF0dHJzLmJsdXIpLGUubm9kZS5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO3JldHVybiBlfSxyLl9lbmdpbmUuY2lyY2xlPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXgoImNpcmNsZSIpO3QuY2FudmFzJiZ0LmNhbnZhcy5hcHBlbmRDaGlsZChpKTt2YXIgYT1uZXcgQyhpLHQpO3JldHVybiBhLmF0dHJzPXtjeDplLGN5OnIscjpuLGZpbGw6Im5vbmUiLHN0cm9rZToiIzAwMCJ9LGEudHlwZT0iY2lyY2xlIix4KGksYS5hdHRycyksYX0sci5fZW5naW5lLnJlY3Q9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3ZhciBzPXgoInJlY3QiKTt0LmNhbnZhcyYmdC5jYW52YXMuYXBwZW5kQ2hpbGQocyk7dmFyIG89bmV3IEMocyx0KTtyZXR1cm4gby5hdHRycz17eDplLHk6cix3aWR0aDpuLGhlaWdodDppLHI6YXx8MCxyeDphfHwwLHJ5OmF8fDAsZmlsbDoibm9uZSIsc3Ryb2tlOiIjMDAwIn0sby50eXBlPSJyZWN0Iix4KHMsby5hdHRycyksb30sci5fZW5naW5lLmVsbGlwc2U9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT14KCJlbGxpcHNlIik7dC5jYW52YXMmJnQuY2FudmFzLmFwcGVuZENoaWxkKGEpO3ZhciBzPW5ldyBDKGEsdCk7cmV0dXJuIHMuYXR0cnM9e2N4OmUsY3k6cixyeDpuLHJ5OmksZmlsbDoibm9uZSIsc3Ryb2tlOiIjMDAwIn0scy50eXBlPSJlbGxpcHNlIix4KGEscy5hdHRycyksc30sci5fZW5naW5lLmltYWdlPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt2YXIgcz14KCJpbWFnZSIpO3gocyx7eDpyLHk6bix3aWR0aDppLGhlaWdodDphLHByZXNlcnZlQXNwZWN0UmF0aW86Im5vbmUifSkscy5zZXRBdHRyaWJ1dGVOUyhwLCJocmVmIixlKSx0LmNhbnZhcyYmdC5jYW52YXMuYXBwZW5kQ2hpbGQocyk7dmFyIG89bmV3IEMocyx0KTtyZXR1cm4gby5hdHRycz17eDpyLHk6bix3aWR0aDppLGhlaWdodDphLHNyYzplfSxvLnR5cGU9ImltYWdlIixvfSxyLl9lbmdpbmUudGV4dD1mdW5jdGlvbih0LGUsbixpKXt2YXIgYT14KCJ0ZXh0Iik7dC5jYW52YXMmJnQuY2FudmFzLmFwcGVuZENoaWxkKGEpO3ZhciBzPW5ldyBDKGEsdCk7cmV0dXJuIHMuYXR0cnM9e3g6ZSx5Om4sInRleHQtYW5jaG9yIjoibWlkZGxlIix0ZXh0OmksZm9udDpyLl9hdmFpbGFibGVBdHRycy5mb250LHN0cm9rZToibm9uZSIsZmlsbDoiIzAwMCJ9LHMudHlwZT0idGV4dCIsdyhzLHMuYXR0cnMpLHN9LHIuX2VuZ2luZS5zZXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMud2lkdGg9dHx8dGhpcy53aWR0aCx0aGlzLmhlaWdodD1lfHx0aGlzLmhlaWdodCx0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLndpZHRoKSx0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdGhpcy5oZWlnaHQpLHRoaXMuX3ZpZXdCb3gmJnRoaXMuc2V0Vmlld0JveC5hcHBseSh0aGlzLHRoaXMuX3ZpZXdCb3gpLHRoaXN9LHIuX2VuZ2luZS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1yLl9nZXRDb250YWluZXIuYXBwbHkoMCxhcmd1bWVudHMpLGU9dCYmdC5jb250YWluZXIsbj10LngsaT10LnksYT10LndpZHRoLHM9dC5oZWlnaHQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJTVkcgY29udGFpbmVyIG5vdCBmb3VuZC4iKTt2YXIgbyxjPXgoInN2ZyIpLGg9Im92ZXJmbG93OmhpZGRlbjsiO3JldHVybiBuPW58fDAsaT1pfHwwLGE9YXx8NTEyLHM9c3x8MzQyLHgoYyx7aGVpZ2h0OnMsdmVyc2lvbjoxLjEsd2lkdGg6YSx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifSksMT09ZT8oYy5zdHlsZS5jc3NUZXh0PWgrInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6IituKyJweDt0b3A6IitpKyJweCIsci5fZy5kb2MuYm9keS5hcHBlbmRDaGlsZChjKSxvPTEpOihjLnN0eWxlLmNzc1RleHQ9aCsicG9zaXRpb246cmVsYXRpdmUiLGUuZmlyc3RDaGlsZD9lLmluc2VydEJlZm9yZShjLGUuZmlyc3RDaGlsZCk6ZS5hcHBlbmRDaGlsZChjKSksZT1uZXcgci5fUGFwZXIsZS53aWR0aD1hLGUuaGVpZ2h0PXMsZS5jYW52YXM9YyxlLmNsZWFyKCksZS5fbGVmdD1lLl90b3A9MCxvJiYoZS5yZW5kZXJmaXg9ZnVuY3Rpb24oKXt9KSxlLnJlbmRlcmZpeCgpLGV9LHIuX2VuZ2luZS5zZXRWaWV3Qm94PWZ1bmN0aW9uKHQsZSxyLG4saSl7dSgicmFwaGFlbC5zZXRWaWV3Qm94Iix0aGlzLHRoaXMuX3ZpZXdCb3gsW3QsZSxyLG4saV0pO3ZhciBhLG8sYz1zKHIvdGhpcy53aWR0aCxuL3RoaXMuaGVpZ2h0KSxoPXRoaXMudG9wLGw9aT8ieE1pZFlNaWQgbWVldCI6InhNaW5ZTWluIjtmb3IobnVsbD09dD8odGhpcy5fdmJTaXplJiYoYz0xKSxkZWxldGUgdGhpcy5fdmJTaXplLGE9IjAgMCAiK3RoaXMud2lkdGgrZit0aGlzLmhlaWdodCk6KHRoaXMuX3ZiU2l6ZT1jLGE9dCtmK2UrZityK2YrbikseCh0aGlzLmNhbnZhcyx7dmlld0JveDphLHByZXNlcnZlQXNwZWN0UmF0aW86bH0pO2MmJmg7KW89InN0cm9rZS13aWR0aCJpbiBoLmF0dHJzP2guYXR0cnNbInN0cm9rZS13aWR0aCJdOjEsaC5hdHRyKHsic3Ryb2tlLXdpZHRoIjpvfSksaC5fLmRpcnR5PTEsaC5fLmRpcnR5VD0xLGg9aC5wcmV2O3JldHVybiB0aGlzLl92aWV3Qm94PVt0LGUscixuLCEhaV0sdGhpc30sci5wcm90b3R5cGUucmVuZGVyZml4PWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmNhbnZhcyxyPWUuc3R5bGU7dHJ5e3Q9ZS5nZXRTY3JlZW5DVE0oKXx8ZS5jcmVhdGVTVkdNYXRyaXgoKX1jYXRjaChyKXt0PWUuY3JlYXRlU1ZHTWF0cml4KCl9dmFyIG49LXQuZSUxLGk9LXQuZiUxOyhufHxpKSYmKG4mJih0aGlzLl9sZWZ0PSh0aGlzLl9sZWZ0K24pJTEsci5sZWZ0PXRoaXMuX2xlZnQrInB4IiksaSYmKHRoaXMuX3RvcD0odGhpcy5fdG9wK2kpJTEsci50b3A9dGhpcy5fdG9wKyJweCIpKX0sci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyLmV2ZSgicmFwaGFlbC5jbGVhciIsdGhpcyk7Zm9yKHZhciB0PXRoaXMuY2FudmFzO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3RoaXMuYm90dG9tPXRoaXMudG9wPW51bGwsKHRoaXMuZGVzYz14KCJkZXNjIikpLmFwcGVuZENoaWxkKHIuX2cuZG9jLmNyZWF0ZVRleHROb2RlKCJDcmVhdGVkIHdpdGggUmFwaGHDq2wgIityLnZlcnNpb24pKSx0LmFwcGVuZENoaWxkKHRoaXMuZGVzYyksdC5hcHBlbmRDaGlsZCh0aGlzLmRlZnM9eCgiZGVmcyIpKX0sci5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dSgicmFwaGFlbC5yZW1vdmUiLHRoaXMpLHRoaXMuY2FudmFzLnBhcmVudE5vZGUmJnRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO2Zvcih2YXIgdCBpbiB0aGlzKXRoaXNbdF09ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXNbdF0/ci5fcmVtb3ZlZEZhY3RvcnkodCk6bnVsbH07dmFyIFM9ci5zdDtmb3IodmFyIEEgaW4gaylrW3RdKEEpJiYhU1t0XShBKSYmKFNbQV09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24ocil7clt0XS5hcHBseShyLGUpfSl9fShBKSl9fSgpLGZ1bmN0aW9uKCl7aWYoci52bWwpe3ZhciB0PSJoYXNPd25Qcm9wZXJ0eSIsZT1TdHJpbmcsbj1wYXJzZUZsb2F0LGk9TWF0aCxhPWkucm91bmQscz1pLm1heCxvPWkubWluLGM9aS5hYnMsaD0vWywgXSsvLHU9ci5ldmUsbD0iICIsZj0iIixwPXtNOiJtIixMOiJsIixDOiJjIixaOiJ4IixtOiJ0IixsOiJyIixjOiJ2Iix6OiJ4In0sZD0vKFtjbG16XSksPyhbXmNsbXpdKikvZ2ksZz0vIHByb2dpZDpcUytCbHVyXChbXlwpXStcKS9nLHg9Ly0/W14sXHMtXSsvZyx2PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7d2lkdGg6MXB4O2hlaWdodDoxcHgiLHk9MjE2MDAsbT17cGF0aDoxLHJlY3Q6MSxpbWFnZToxfSxiPXtjaXJjbGU6MSxlbGxpcHNlOjF9LF89ZnVuY3Rpb24odCl7dmFyIG49L1thaHFzdHZdL2dpLGk9ci5fcGF0aFRvQWJzb2x1dGU7aWYoZSh0KS5tYXRjaChuKSYmKGk9ci5fcGF0aDJjdXJ2ZSksbj0vW2NsbXpdL2csaT09ci5fcGF0aFRvQWJzb2x1dGUmJiFlKHQpLm1hdGNoKG4pKXt2YXIgcz1lKHQpLnJlcGxhY2UoZCxmdW5jdGlvbih0LGUscil7dmFyIG49W10saT0ibSI9PWUudG9Mb3dlckNhc2UoKSxzPXBbZV07cmV0dXJuIHIucmVwbGFjZSh4LGZ1bmN0aW9uKHQpe2kmJjI9PW4ubGVuZ3RoJiYocys9bitwWyJtIj09ZT8ibCI6IkwiXSxuPVtdKSxuLnB1c2goYSh0KnkpKX0pLHMrbn0pO3JldHVybiBzfXZhciBvLGMsaD1pKHQpO3M9W107Zm9yKHZhciB1PTAsZz1oLmxlbmd0aDt1PGc7dSsrKXtvPWhbdV0sYz1oW3VdWzBdLnRvTG93ZXJDYXNlKCksInoiPT1jJiYoYz0ieCIpO2Zvcih2YXIgdj0xLG09by5sZW5ndGg7djxtO3YrKyljKz1hKG9bdl0qeSkrKHYhPW0tMT8iLCI6Zik7cy5wdXNoKGMpfXJldHVybiBzLmpvaW4obCl9LHc9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXIubWF0cml4KCk7cmV0dXJuIGkucm90YXRlKC10LC41LC41KSx7ZHg6aS54KGUsbiksZHk6aS55KGUsbil9fSxFPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt2YXIgcz10Ll8sbz10Lm1hdHJpeCxoPXMuZmlsbHBvcyx1PXQubm9kZSxmPXUuc3R5bGUscD0xLGQ9IiIsZz15L2UseD15L3I7aWYoZi52aXNpYmlsaXR5PSJoaWRkZW4iLGUmJnIpe2lmKHUuY29vcmRzaXplPWMoZykrbCtjKHgpLGYucm90YXRpb249YSooZSpyPDA/LTE6MSksYSl7dmFyIHY9dyhhLG4saSk7bj12LmR4LGk9di5keX1pZihlPDAmJihkKz0ieCIpLHI8MCYmKGQrPSIgeSIpJiYocD0tMSksZi5mbGlwPWQsdS5jb29yZG9yaWdpbj1uKi1nK2wraSoteCxofHxzLmZpbGxzaXplKXt2YXIgbT11LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmaWxsIik7bT1tJiZtWzBdLHUucmVtb3ZlQ2hpbGQobSksaCYmKHY9dyhhLG8ueChoWzBdLGhbMV0pLG8ueShoWzBdLGhbMV0pKSxtLnBvc2l0aW9uPXYuZHgqcCtsK3YuZHkqcCkscy5maWxsc2l6ZSYmKG0uc2l6ZT1zLmZpbGxzaXplWzBdKmMoZSkrbCtzLmZpbGxzaXplWzFdKmMocikpLHUuYXBwZW5kQ2hpbGQobSl9Zi52aXNpYmlsaXR5PSJ2aXNpYmxlIn19O3IudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iWW91ciBicm93c2VyIGRvZXNu4oCZdCBzdXBwb3J0IFNWRy4gRmFsbGluZyBkb3duIHRvIFZNTC5cbllvdSBhcmUgcnVubmluZyBSYXBoYcOrbCAiK3RoaXMudmVyc2lvbn07dmFyIEM9ZnVuY3Rpb24odCxyLG4pe2Zvcih2YXIgaT1lKHIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoIi0iKSxhPW4/ImVuZCI6InN0YXJ0IixzPWkubGVuZ3RoLG89ImNsYXNzaWMiLGM9Im1lZGl1bSIsaD0ibWVkaXVtIjtzLS07KXN3aXRjaChpW3NdKXtjYXNlImJsb2NrIjpjYXNlImNsYXNzaWMiOmNhc2Uib3ZhbCI6Y2FzZSJkaWFtb25kIjpjYXNlIm9wZW4iOmNhc2Uibm9uZSI6bz1pW3NdO2JyZWFrO2Nhc2Uid2lkZSI6Y2FzZSJuYXJyb3ciOmg9aVtzXTticmVhaztjYXNlImxvbmciOmNhc2Uic2hvcnQiOmM9aVtzXX12YXIgdT10Lm5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0cm9rZSIpWzBdO3VbYSsiYXJyb3ciXT1vLHVbYSsiYXJyb3dsZW5ndGgiXT1jLHVbYSsiYXJyb3d3aWR0aCJdPWh9LGs9ZnVuY3Rpb24oaSxjKXtpLmF0dHJzPWkuYXR0cnN8fHt9O3ZhciB1PWkubm9kZSxwPWkuYXR0cnMsZD11LnN0eWxlLGc9bVtpLnR5cGVdJiYoYy54IT1wLnh8fGMueSE9cC55fHxjLndpZHRoIT1wLndpZHRofHxjLmhlaWdodCE9cC5oZWlnaHR8fGMuY3ghPXAuY3h8fGMuY3khPXAuY3l8fGMucnghPXAucnh8fGMucnkhPXAucnl8fGMuciE9cC5yKSx4PWJbaS50eXBlXSYmKHAuY3ghPWMuY3h8fHAuY3khPWMuY3l8fHAuciE9Yy5yfHxwLnJ4IT1jLnJ4fHxwLnJ5IT1jLnJ5KSx2PWk7Zm9yKHZhciB3IGluIGMpY1t0XSh3KSYmKHBbd109Y1t3XSk7aWYoZyYmKHAucGF0aD1yLl9nZXRQYXRoW2kudHlwZV0oaSksaS5fLmRpcnR5PTEpLGMuaHJlZiYmKHUuaHJlZj1jLmhyZWYpLGMudGl0bGUmJih1LnRpdGxlPWMudGl0bGUpLGMudGFyZ2V0JiYodS50YXJnZXQ9Yy50YXJnZXQpLGMuY3Vyc29yJiYoZC5jdXJzb3I9Yy5jdXJzb3IpLCJibHVyImluIGMmJmkuYmx1cihjLmJsdXIpLChjLnBhdGgmJiJwYXRoIj09aS50eXBlfHxnKSYmKHUucGF0aD1fKH5lKHAucGF0aCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJyIik/ci5fcGF0aFRvQWJzb2x1dGUocC5wYXRoKTpwLnBhdGgpLCJpbWFnZSI9PWkudHlwZSYmKGkuXy5maWxscG9zPVtwLngscC55XSxpLl8uZmlsbHNpemU9W3Aud2lkdGgscC5oZWlnaHRdLEUoaSwxLDEsMCwwLDApKSksInRyYW5zZm9ybSJpbiBjJiZpLnRyYW5zZm9ybShjLnRyYW5zZm9ybSkseCl7dmFyIGs9K3AuY3gsQT0rcC5jeSxCPStwLnJ4fHwrcC5yfHwwLE89K3Aucnl8fCtwLnJ8fDA7dS5wYXRoPXIuZm9ybWF0KCJhcnswfSx7MX0sezJ9LHszfSx7NH0sezF9LHs0fSx7MX14IixhKChrLUIpKnkpLGEoKEEtTykqeSksYSgoaytCKSp5KSxhKChBK08pKnkpLGEoayp5KSksaS5fLmRpcnR5PTF9aWYoImNsaXAtcmVjdCJpbiBjKXt2YXIgVD1lKGNbImNsaXAtcmVjdCJdKS5zcGxpdChoKTtpZig0PT1ULmxlbmd0aCl7VFsyXT0rVFsyXSsgK1RbMF0sVFszXT0rVFszXSsgK1RbMV07dmFyIFI9dS5jbGlwUmVjdHx8ci5fZy5kb2MuY3JlYXRlRWxlbWVudCgiZGl2IiksST1SLnN0eWxlO0kuY2xpcD1yLmZvcm1hdCgicmVjdCh7MX1weCB7Mn1weCB7M31weCB7MH1weCkiLFQpLHUuY2xpcFJlY3R8fChJLnBvc2l0aW9uPSJhYnNvbHV0ZSIsSS50b3A9MCxJLmxlZnQ9MCxJLndpZHRoPWkucGFwZXIud2lkdGgrInB4IixJLmhlaWdodD1pLnBhcGVyLmhlaWdodCsicHgiLHUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoUix1KSxSLmFwcGVuZENoaWxkKHUpLHUuY2xpcFJlY3Q9Uil9Y1siY2xpcC1yZWN0Il18fHUuY2xpcFJlY3QmJih1LmNsaXBSZWN0LnN0eWxlLmNsaXA9ImF1dG8iKX1pZihpLnRleHRwYXRoKXt2YXIgTT1pLnRleHRwYXRoLnN0eWxlO2MuZm9udCYmKE0uZm9udD1jLmZvbnQpLGNbImZvbnQtZmFtaWx5Il0mJihNLmZvbnRGYW1pbHk9JyInK2NbImZvbnQtZmFtaWx5Il0uc3BsaXQoIiwiKVswXS5yZXBsYWNlKC9eWyciXSt8WyciXSskL2csZikrJyInKSxjWyJmb250LXNpemUiXSYmKE0uZm9udFNpemU9Y1siZm9udC1zaXplIl0pLGNbImZvbnQtd2VpZ2h0Il0mJihNLmZvbnRXZWlnaHQ9Y1siZm9udC13ZWlnaHQiXSksY1siZm9udC1zdHlsZSJdJiYoTS5mb250U3R5bGU9Y1siZm9udC1zdHlsZSJdKX1pZigiYXJyb3ctc3RhcnQiaW4gYyYmQyh2LGNbImFycm93LXN0YXJ0Il0pLCJhcnJvdy1lbmQiaW4gYyYmQyh2LGNbImFycm93LWVuZCJdLDEpLG51bGwhPWMub3BhY2l0eXx8bnVsbCE9Y1sic3Ryb2tlLXdpZHRoIl18fG51bGwhPWMuZmlsbHx8bnVsbCE9Yy5zcmN8fG51bGwhPWMuc3Ryb2tlfHxudWxsIT1jWyJzdHJva2Utd2lkdGgiXXx8bnVsbCE9Y1sic3Ryb2tlLW9wYWNpdHkiXXx8bnVsbCE9Y1siZmlsbC1vcGFjaXR5Il18fG51bGwhPWNbInN0cm9rZS1kYXNoYXJyYXkiXXx8bnVsbCE9Y1sic3Ryb2tlLW1pdGVybGltaXQiXXx8bnVsbCE9Y1sic3Ryb2tlLWxpbmVqb2luIl18fG51bGwhPWNbInN0cm9rZS1saW5lY2FwIl0pe3ZhciBGPXUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZpbGwiKTtpZihGPUYmJkZbMF0sIUYmJihGPU4oImZpbGwiKSksImltYWdlIj09aS50eXBlJiZjLnNyYyYmKEYuc3JjPWMuc3JjKSxjLmZpbGwmJihGLm9uPSEwKSxudWxsIT1GLm9uJiYibm9uZSIhPWMuZmlsbCYmbnVsbCE9PWMuZmlsbHx8KEYub249ITEpLEYub24mJmMuZmlsbCl7dmFyIEQ9ZShjLmZpbGwpLm1hdGNoKHIuX0lTVVJMKTtpZihEKXtGLnBhcmVudE5vZGU9PXUmJnUucmVtb3ZlQ2hpbGQoRiksRi5yb3RhdGU9ITAsRi5zcmM9RFsxXSxGLnR5cGU9InRpbGUiO3ZhciBQPWkuZ2V0QkJveCgxKTtGLnBvc2l0aW9uPVAueCtsK1AueSxpLl8uZmlsbHBvcz1bUC54LFAueV0sci5fcHJlbG9hZChEWzFdLGZ1bmN0aW9uKCl7aS5fLmZpbGxzaXplPVt0aGlzLm9mZnNldFdpZHRoLHRoaXMub2Zmc2V0SGVpZ2h0XX0pfWVsc2UgRi5jb2xvcj1yLmdldFJHQihjLmZpbGwpLmhleCxGLnNyYz1mLEYudHlwZT0ic29saWQiLHIuZ2V0UkdCKGMuZmlsbCkuZXJyb3ImJih2LnR5cGUgaW57Y2lyY2xlOjEsZWxsaXBzZToxfXx8InIiIT1lKGMuZmlsbCkuY2hhckF0KCkpJiZTKHYsYy5maWxsLEYpJiYocC5maWxsPSJub25lIixwLmdyYWRpZW50PWMuZmlsbCxGLnJvdGF0ZT0hMSl9aWYoImZpbGwtb3BhY2l0eSJpbiBjfHwib3BhY2l0eSJpbiBjKXt2YXIgTD0oKCtwWyJmaWxsLW9wYWNpdHkiXSsxfHwyKS0xKSooKCtwLm9wYWNpdHkrMXx8MiktMSkqKCgrci5nZXRSR0IoYy5maWxsKS5vKzF8fDIpLTEpO0w9byhzKEwsMCksMSksRi5vcGFjaXR5PUwsRi5zcmMmJihGLmNvbG9yPSJub25lIil9dS5hcHBlbmRDaGlsZChGKTt2YXIgej11LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHJva2UiKSYmdS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3Ryb2tlIilbMF0saj0hMTsheiYmKGo9ej1OKCJzdHJva2UiKSksKGMuc3Ryb2tlJiYibm9uZSIhPWMuc3Ryb2tlfHxjWyJzdHJva2Utd2lkdGgiXXx8bnVsbCE9Y1sic3Ryb2tlLW9wYWNpdHkiXXx8Y1sic3Ryb2tlLWRhc2hhcnJheSJdfHxjWyJzdHJva2UtbWl0ZXJsaW1pdCJdfHxjWyJzdHJva2UtbGluZWpvaW4iXXx8Y1sic3Ryb2tlLWxpbmVjYXAiXSkmJih6Lm9uPSEwKSwoIm5vbmUiPT1jLnN0cm9rZXx8bnVsbD09PWMuc3Ryb2tlfHxudWxsPT16Lm9ufHwwPT1jLnN0cm9rZXx8MD09Y1sic3Ryb2tlLXdpZHRoIl0pJiYoei5vbj0hMSk7dmFyIFU9ci5nZXRSR0IoYy5zdHJva2UpO3oub24mJmMuc3Ryb2tlJiYoei5jb2xvcj1VLmhleCksTD0oKCtwWyJzdHJva2Utb3BhY2l0eSJdKzF8fDIpLTEpKigoK3Aub3BhY2l0eSsxfHwyKS0xKSooKCtVLm8rMXx8MiktMSk7dmFyIFg9Ljc1KihuKGNbInN0cm9rZS13aWR0aCJdKXx8MSk7aWYoTD1vKHMoTCwwKSwxKSxudWxsPT1jWyJzdHJva2Utd2lkdGgiXSYmKFg9cFsic3Ryb2tlLXdpZHRoIl0pLGNbInN0cm9rZS13aWR0aCJdJiYoei53ZWlnaHQ9WCksWCYmWDwxJiYoTCo9WCkmJih6LndlaWdodD0xKSx6Lm9wYWNpdHk9TCxjWyJzdHJva2UtbGluZWpvaW4iXSYmKHouam9pbnN0eWxlPWNbInN0cm9rZS1saW5lam9pbiJdfHwibWl0ZXIiKSx6Lm1pdGVybGltaXQ9Y1sic3Ryb2tlLW1pdGVybGltaXQiXXx8OCxjWyJzdHJva2UtbGluZWNhcCJdJiYoei5lbmRjYXA9ImJ1dHQiPT1jWyJzdHJva2UtbGluZWNhcCJdPyJmbGF0Ijoic3F1YXJlIj09Y1sic3Ryb2tlLWxpbmVjYXAiXT8ic3F1YXJlIjoicm91bmQiKSwic3Ryb2tlLWRhc2hhcnJheSJpbiBjKXt2YXIgRz17Ii0iOiJzaG9ydGRhc2giLCIuIjoic2hvcnRkb3QiLCItLiI6InNob3J0ZGFzaGRvdCIsIi0uLiI6InNob3J0ZGFzaGRvdGRvdCIsIi4gIjoiZG90IiwiLSAiOiJkYXNoIiwiLS0iOiJsb25nZGFzaCIsIi0gLiI6ImRhc2hkb3QiLCItLS4iOiJsb25nZGFzaGRvdCIsIi0tLi4iOiJsb25nZGFzaGRvdGRvdCJ9O3ouZGFzaHN0eWxlPUdbdF0oY1sic3Ryb2tlLWRhc2hhcnJheSJdKT9HW2NbInN0cm9rZS1kYXNoYXJyYXkiXV06Zn1qJiZ1LmFwcGVuZENoaWxkKHopfWlmKCJ0ZXh0Ij09di50eXBlKXt2LnBhcGVyLmNhbnZhcy5zdHlsZS5kaXNwbGF5PWY7dmFyIHE9di5wYXBlci5zcGFuLEg9cC5mb250JiZwLmZvbnQubWF0Y2goL1xkKyg/OlwuXGQqKT8oPz1weCkvKTtkPXEuc3R5bGUscC5mb250JiYoZC5mb250PXAuZm9udCkscFsiZm9udC1mYW1pbHkiXSYmKGQuZm9udEZhbWlseT1wWyJmb250LWZhbWlseSJdKSxwWyJmb250LXdlaWdodCJdJiYoZC5mb250V2VpZ2h0PXBbImZvbnQtd2VpZ2h0Il0pLHBbImZvbnQtc3R5bGUiXSYmKGQuZm9udFN0eWxlPXBbImZvbnQtc3R5bGUiXSksSD1uKHBbImZvbnQtc2l6ZSJdfHxIJiZIWzBdKXx8MTAsZC5mb250U2l6ZT0xMDAqSCsicHgiLHYudGV4dHBhdGguc3RyaW5nJiYocS5pbm5lckhUTUw9ZSh2LnRleHRwYXRoLnN0cmluZykucmVwbGFjZSgvPC9nLCImIzYwOyIpLnJlcGxhY2UoLyYvZywiJiMzODsiKS5yZXBsYWNlKC9cbi9nLCI8YnI+IikpO3ZhciBXPXEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7di5XPXAudz0oVy5yaWdodC1XLmxlZnQpLzEwMCx2Lkg9cC5oPShXLmJvdHRvbS1XLnRvcCkvMTAwLHYuWD1wLngsdi5ZPXAueSt2LkgvMiwoIngiaW4gY3x8InkiaW4gYykmJih2LnBhdGgudj1yLmZvcm1hdCgibXswfSx7MX1sezJ9LHsxfSIsYShwLngqeSksYShwLnkqeSksYShwLngqeSkrMSkpO2Zvcih2YXIgVj1bIngiLCJ5IiwidGV4dCIsImZvbnQiLCJmb250LWZhbWlseSIsImZvbnQtd2VpZ2h0IiwiZm9udC1zdHlsZSIsImZvbnQtc2l6ZSJdLFE9MCxZPVYubGVuZ3RoO1E8WTtRKyspaWYoVltRXWluIGMpe3YuXy5kaXJ0eT0xO2JyZWFrfXN3aXRjaChwWyJ0ZXh0LWFuY2hvciJdKXtjYXNlInN0YXJ0Ijp2LnRleHRwYXRoLnN0eWxlWyJ2LXRleHQtYWxpZ24iXT0ibGVmdCIsdi5iYng9di5XLzI7YnJlYWs7Y2FzZSJlbmQiOnYudGV4dHBhdGguc3R5bGVbInYtdGV4dC1hbGlnbiJdPSJyaWdodCIsdi5iYng9LXYuVy8yO2JyZWFrO2RlZmF1bHQ6di50ZXh0cGF0aC5zdHlsZVsidi10ZXh0LWFsaWduIl09ImNlbnRlciIsdi5iYng9MH12LnRleHRwYXRoLnN0eWxlWyJ2LXRleHQta2VybiJdPSEwfX0sUz1mdW5jdGlvbih0LGEscyl7dC5hdHRycz10LmF0dHJzfHx7fTt2YXIgbz0odC5hdHRycyxNYXRoLnBvdyksYz0ibGluZWFyIixoPSIuNSAuNSI7aWYodC5hdHRycy5ncmFkaWVudD1hLGE9ZShhKS5yZXBsYWNlKHIuX3JhZGlhbF9ncmFkaWVudCxmdW5jdGlvbih0LGUscil7cmV0dXJuIGM9InJhZGlhbCIsZSYmciYmKGU9bihlKSxyPW4ociksbyhlLS41LDIpK28oci0uNSwyKT4uMjUmJihyPWkuc3FydCguMjUtbyhlLS41LDIpKSooMioocj4uNSktMSkrLjUpLGg9ZStsK3IpLGZ9KSxhPWEuc3BsaXQoL1xzKlwtXHMqLyksImxpbmVhciI9PWMpe3ZhciB1PWEuc2hpZnQoKTtpZih1PS1uKHUpLGlzTmFOKHUpKXJldHVybiBudWxsfXZhciBwPXIuX3BhcnNlRG90cyhhKTtpZighcClyZXR1cm4gbnVsbDtpZih0PXQuc2hhcGV8fHQubm9kZSxwLmxlbmd0aCl7dC5yZW1vdmVDaGlsZChzKSxzLm9uPSEwLHMubWV0aG9kPSJub25lIixzLmNvbG9yPXBbMF0uY29sb3Iscy5jb2xvcjI9cFtwLmxlbmd0aC0xXS5jb2xvcjtmb3IodmFyIGQ9W10sZz0wLHg9cC5sZW5ndGg7Zzx4O2crKylwW2ddLm9mZnNldCYmZC5wdXNoKHBbZ10ub2Zmc2V0K2wrcFtnXS5jb2xvcik7cy5jb2xvcnM9ZC5sZW5ndGg/ZC5qb2luKCk6IjAlICIrcy5jb2xvciwicmFkaWFsIj09Yz8ocy50eXBlPSJncmFkaWVudFRpdGxlIixzLmZvY3VzPSIxMDAlIixzLmZvY3Vzc2l6ZT0iMCAwIixzLmZvY3VzcG9zaXRpb249aCxzLmFuZ2xlPTApOihzLnR5cGU9ImdyYWRpZW50IixzLmFuZ2xlPSgyNzAtdSklMzYwKSx0LmFwcGVuZENoaWxkKHMpfXJldHVybiAxfSxBPWZ1bmN0aW9uKHQsZSl7dGhpc1swXT10aGlzLm5vZGU9dCx0LnJhcGhhZWw9ITAsdGhpcy5pZD1yLl9vaWQrKyx0LnJhcGhhZWxpZD10aGlzLmlkLHRoaXMuWD0wLHRoaXMuWT0wLHRoaXMuYXR0cnM9e30sdGhpcy5wYXBlcj1lLHRoaXMubWF0cml4PXIubWF0cml4KCksdGhpcy5fPXt0cmFuc2Zvcm06W10sc3g6MSxzeToxLGR4OjAsZHk6MCxkZWc6MCxkaXJ0eToxLGRpcnR5VDoxfSwhZS5ib3R0b20mJihlLmJvdHRvbT10aGlzKSx0aGlzLnByZXY9ZS50b3AsZS50b3AmJihlLnRvcC5uZXh0PXRoaXMpLGUudG9wPXRoaXMsdGhpcy5uZXh0PW51bGx9LEI9ci5lbDtBLnByb3RvdHlwZT1CLEIuY29uc3RydWN0b3I9QSxCLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl8udHJhbnNmb3JtO3ZhciBuLGk9dGhpcy5wYXBlci5fdmlld0JveFNoaWZ0LGE9aT8icyIrW2kuc2NhbGUsaS5zY2FsZV0rIi0xLTF0IitbaS5keCxpLmR5XTpmO2kmJihuPXQ9ZSh0KS5yZXBsYWNlKC9cLnszfXxcdTIwMjYvZyx0aGlzLl8udHJhbnNmb3JtfHxmKSksci5fZXh0cmFjdFRyYW5zZm9ybSh0aGlzLGErdCk7dmFyIHMsbz10aGlzLm1hdHJpeC5jbG9uZSgpLGM9dGhpcy5za2V3LGg9dGhpcy5ub2RlLHU9fmUodGhpcy5hdHRycy5maWxsKS5pbmRleE9mKCItIikscD0hZSh0aGlzLmF0dHJzLmZpbGwpLmluZGV4T2YoInVybCgiKTtpZihvLnRyYW5zbGF0ZSgxLDEpLHB8fHV8fCJpbWFnZSI9PXRoaXMudHlwZSlpZihjLm1hdHJpeD0iMSAwIDAgMSIsYy5vZmZzZXQ9IjAgMCIscz1vLnNwbGl0KCksdSYmcy5ub1JvdGF0aW9ufHwhcy5pc1NpbXBsZSl7aC5zdHlsZS5maWx0ZXI9by50b0ZpbHRlcigpO3ZhciBkPXRoaXMuZ2V0QkJveCgpLGc9dGhpcy5nZXRCQm94KDEpLHg9ZC54LWcueCx2PWQueS1nLnk7aC5jb29yZG9yaWdpbj14Ki15K2wrdioteSxFKHRoaXMsMSwxLHgsdiwwKX1lbHNlIGguc3R5bGUuZmlsdGVyPWYsRSh0aGlzLHMuc2NhbGV4LHMuc2NhbGV5LHMuZHgscy5keSxzLnJvdGF0ZSk7ZWxzZSBoLnN0eWxlLmZpbHRlcj1mLGMubWF0cml4PWUobyksYy5vZmZzZXQ9by5vZmZzZXQoKTtyZXR1cm4gbiYmKHRoaXMuXy50cmFuc2Zvcm09biksdGhpc30sQi5yb3RhdGU9ZnVuY3Rpb24odCxyLGkpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZihudWxsIT10KXtpZih0PWUodCkuc3BsaXQoaCksdC5sZW5ndGgtMSYmKHI9bih0WzFdKSxpPW4odFsyXSkpLHQ9bih0WzBdKSxudWxsPT1pJiYocj1pKSxudWxsPT1yfHxudWxsPT1pKXt2YXIgYT10aGlzLmdldEJCb3goMSk7cj1hLngrYS53aWR0aC8yLGk9YS55K2EuaGVpZ2h0LzJ9cmV0dXJuIHRoaXMuXy5kaXJ0eVQ9MSx0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbWyJyIix0LHIsaV1dKSksdGhpc319LEIudHJhbnNsYXRlPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0PWUodCkuc3BsaXQoaCksdC5sZW5ndGgtMSYmKHI9bih0WzFdKSksdD1uKHRbMF0pfHwwLHI9K3J8fDAsdGhpcy5fLmJib3gmJih0aGlzLl8uYmJveC54Kz10LHRoaXMuXy5iYm94LnkrPXIpLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInQiLHQscl1dKSksdGhpcyl9LEIuc2NhbGU9ZnVuY3Rpb24odCxyLGksYSl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKHQ9ZSh0KS5zcGxpdChoKSx0Lmxlbmd0aC0xJiYocj1uKHRbMV0pLGk9bih0WzJdKSxhPW4odFszXSksaXNOYU4oaSkmJihpPW51bGwpLGlzTmFOKGEpJiYoYT1udWxsKSksdD1uKHRbMF0pLG51bGw9PXImJihyPXQpLG51bGw9PWEmJihpPWEpLG51bGw9PWl8fG51bGw9PWEpdmFyIHM9dGhpcy5nZXRCQm94KDEpO3JldHVybiBpPW51bGw9PWk/cy54K3Mud2lkdGgvMjppLGE9bnVsbD09YT9zLnkrcy5oZWlnaHQvMjphLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInMiLHQscixpLGFdXSkpLHRoaXMuXy5kaXJ0eVQ9MSx0aGlzfSxCLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiYodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzfSxCLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiYodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9ZiksdGhpc30sQi5fZ2V0QkJveD1mdW5jdGlvbigpew0KcmV0dXJuIHRoaXMucmVtb3ZlZD97fTp7eDp0aGlzLlgrKHRoaXMuYmJ4fHwwKS10aGlzLlcvMix5OnRoaXMuWS10aGlzLkgsd2lkdGg6dGhpcy5XLGhlaWdodDp0aGlzLkh9fSxCLnJlbW92ZT1mdW5jdGlvbigpe2lmKCF0aGlzLnJlbW92ZWQmJnRoaXMubm9kZS5wYXJlbnROb2RlKXt0aGlzLnBhcGVyLl9fc2V0X18mJnRoaXMucGFwZXIuX19zZXRfXy5leGNsdWRlKHRoaXMpLHIuZXZlLnVuYmluZCgicmFwaGFlbC4qLiouIit0aGlzLmlkKSxyLl90ZWFyKHRoaXMsdGhpcy5wYXBlciksdGhpcy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKSx0aGlzLnNoYXBlJiZ0aGlzLnNoYXBlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zaGFwZSk7Zm9yKHZhciB0IGluIHRoaXMpdGhpc1t0XT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpc1t0XT9yLl9yZW1vdmVkRmFjdG9yeSh0KTpudWxsO3RoaXMucmVtb3ZlZD0hMH19LEIuYXR0cj1mdW5jdGlvbihlLG4pe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZihudWxsPT1lKXt2YXIgaT17fTtmb3IodmFyIGEgaW4gdGhpcy5hdHRycyl0aGlzLmF0dHJzW3RdKGEpJiYoaVthXT10aGlzLmF0dHJzW2FdKTtyZXR1cm4gaS5ncmFkaWVudCYmIm5vbmUiPT1pLmZpbGwmJihpLmZpbGw9aS5ncmFkaWVudCkmJmRlbGV0ZSBpLmdyYWRpZW50LGkudHJhbnNmb3JtPXRoaXMuXy50cmFuc2Zvcm0saX1pZihudWxsPT1uJiZyLmlzKGUsInN0cmluZyIpKXtpZigiZmlsbCI9PWUmJiJub25lIj09dGhpcy5hdHRycy5maWxsJiZ0aGlzLmF0dHJzLmdyYWRpZW50KXJldHVybiB0aGlzLmF0dHJzLmdyYWRpZW50O2Zvcih2YXIgcz1lLnNwbGl0KGgpLG89e30sYz0wLGw9cy5sZW5ndGg7YzxsO2MrKyllPXNbY10sZSBpbiB0aGlzLmF0dHJzP29bZV09dGhpcy5hdHRyc1tlXTpyLmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tlXSwiZnVuY3Rpb24iKT9vW2VdPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tlXS5kZWY6b1tlXT1yLl9hdmFpbGFibGVBdHRyc1tlXTtyZXR1cm4gbC0xP286b1tzWzBdXX1pZih0aGlzLmF0dHJzJiZudWxsPT1uJiZyLmlzKGUsImFycmF5Iikpe2ZvcihvPXt9LGM9MCxsPWUubGVuZ3RoO2M8bDtjKyspb1tlW2NdXT10aGlzLmF0dHIoZVtjXSk7cmV0dXJuIG99dmFyIGY7bnVsbCE9biYmKGY9e30sZltlXT1uKSxudWxsPT1uJiZyLmlzKGUsIm9iamVjdCIpJiYoZj1lKTtmb3IodmFyIHAgaW4gZil1KCJyYXBoYWVsLmF0dHIuIitwKyIuIit0aGlzLmlkLHRoaXMsZltwXSk7aWYoZil7Zm9yKHAgaW4gdGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzKWlmKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1t0XShwKSYmZlt0XShwKSYmci5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcF0sImZ1bmN0aW9uIikpe3ZhciBkPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1twXS5hcHBseSh0aGlzLFtdLmNvbmNhdChmW3BdKSk7dGhpcy5hdHRyc1twXT1mW3BdO2Zvcih2YXIgZyBpbiBkKWRbdF0oZykmJihmW2ddPWRbZ10pfWYudGV4dCYmInRleHQiPT10aGlzLnR5cGUmJih0aGlzLnRleHRwYXRoLnN0cmluZz1mLnRleHQpLGsodGhpcyxmKX1yZXR1cm4gdGhpc30sQi50b0Zyb250PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucmVtb3ZlZCYmdGhpcy5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSx0aGlzLnBhcGVyJiZ0aGlzLnBhcGVyLnRvcCE9dGhpcyYmci5fdG9mcm9udCh0aGlzLHRoaXMucGFwZXIpLHRoaXN9LEIudG9CYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0aGlzLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkIT10aGlzLm5vZGUmJih0aGlzLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpLHIuX3RvYmFjayh0aGlzLHRoaXMucGFwZXIpKSx0aGlzKX0sQi5pbnNlcnRBZnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZW1vdmVkP3RoaXM6KHQuY29uc3RydWN0b3I9PXIuc3QuY29uc3RydWN0b3ImJih0PXRbdC5sZW5ndGgtMV0pLHQubm9kZS5uZXh0U2libGluZz90Lm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHQubm9kZS5uZXh0U2libGluZyk6dC5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSxyLl9pbnNlcnRhZnRlcih0aGlzLHQsdGhpcy5wYXBlciksdGhpcyl9LEIuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlbW92ZWQ/dGhpczoodC5jb25zdHJ1Y3Rvcj09ci5zdC5jb25zdHJ1Y3RvciYmKHQ9dFswXSksdC5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZSx0Lm5vZGUpLHIuX2luc2VydGJlZm9yZSh0aGlzLHQsdGhpcy5wYXBlciksdGhpcyl9LEIuYmx1cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm5vZGUucnVudGltZVN0eWxlLG49ZS5maWx0ZXI7cmV0dXJuIG49bi5yZXBsYWNlKGcsZiksMCE9K3Q/KHRoaXMuYXR0cnMuYmx1cj10LGUuZmlsdGVyPW4rbCsiIHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CbHVyKHBpeGVscmFkaXVzPSIrKCt0fHwxLjUpKyIpIixlLm1hcmdpbj1yLmZvcm1hdCgiLXswfXB4IDAgMCAtezB9cHgiLGEoK3R8fDEuNSkpKTooZS5maWx0ZXI9bixlLm1hcmdpbj0wLGRlbGV0ZSB0aGlzLmF0dHJzLmJsdXIpLHRoaXN9LHIuX2VuZ2luZS5wYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9Tigic2hhcGUiKTtyLnN0eWxlLmNzc1RleHQ9dixyLmNvb3Jkc2l6ZT15K2wreSxyLmNvb3Jkb3JpZ2luPWUuY29vcmRvcmlnaW47dmFyIG49bmV3IEEocixlKSxpPXtmaWxsOiJub25lIixzdHJva2U6IiMwMDAifTt0JiYoaS5wYXRoPXQpLG4udHlwZT0icGF0aCIsbi5wYXRoPVtdLG4uUGF0aD1mLGsobixpKSxlLmNhbnZhcy5hcHBlbmRDaGlsZChyKTt2YXIgYT1OKCJza2V3Iik7cmV0dXJuIGEub249ITAsci5hcHBlbmRDaGlsZChhKSxuLnNrZXc9YSxuLnRyYW5zZm9ybShmKSxufSxyLl9lbmdpbmUucmVjdD1mdW5jdGlvbih0LGUsbixpLGEscyl7dmFyIG89ci5fcmVjdFBhdGgoZSxuLGksYSxzKSxjPXQucGF0aChvKSxoPWMuYXR0cnM7cmV0dXJuIGMuWD1oLng9ZSxjLlk9aC55PW4sYy5XPWgud2lkdGg9aSxjLkg9aC5oZWlnaHQ9YSxoLnI9cyxoLnBhdGg9byxjLnR5cGU9InJlY3QiLGN9LHIuX2VuZ2luZS5lbGxpcHNlPWZ1bmN0aW9uKHQsZSxyLG4saSl7dmFyIGE9dC5wYXRoKCk7YS5hdHRycztyZXR1cm4gYS5YPWUtbixhLlk9ci1pLGEuVz0yKm4sYS5IPTIqaSxhLnR5cGU9ImVsbGlwc2UiLGsoYSx7Y3g6ZSxjeTpyLHJ4Om4scnk6aX0pLGF9LHIuX2VuZ2luZS5jaXJjbGU9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9dC5wYXRoKCk7aS5hdHRycztyZXR1cm4gaS5YPWUtbixpLlk9ci1uLGkuVz1pLkg9MipuLGkudHlwZT0iY2lyY2xlIixrKGkse2N4OmUsY3k6cixyOm59KSxpfSxyLl9lbmdpbmUuaW1hZ2U9ZnVuY3Rpb24odCxlLG4saSxhLHMpe3ZhciBvPXIuX3JlY3RQYXRoKG4saSxhLHMpLGM9dC5wYXRoKG8pLmF0dHIoe3N0cm9rZToibm9uZSJ9KSxoPWMuYXR0cnMsdT1jLm5vZGUsbD11LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmaWxsIilbMF07cmV0dXJuIGguc3JjPWUsYy5YPWgueD1uLGMuWT1oLnk9aSxjLlc9aC53aWR0aD1hLGMuSD1oLmhlaWdodD1zLGgucGF0aD1vLGMudHlwZT0iaW1hZ2UiLGwucGFyZW50Tm9kZT09dSYmdS5yZW1vdmVDaGlsZChsKSxsLnJvdGF0ZT0hMCxsLnNyYz1lLGwudHlwZT0idGlsZSIsYy5fLmZpbGxwb3M9W24saV0sYy5fLmZpbGxzaXplPVthLHNdLHUuYXBwZW5kQ2hpbGQobCksRShjLDEsMSwwLDAsMCksY30sci5fZW5naW5lLnRleHQ9ZnVuY3Rpb24odCxuLGkscyl7dmFyIG89Tigic2hhcGUiKSxjPU4oInBhdGgiKSxoPU4oInRleHRwYXRoIik7bj1ufHwwLGk9aXx8MCxzPXN8fCIiLGMudj1yLmZvcm1hdCgibXswfSx7MX1sezJ9LHsxfSIsYShuKnkpLGEoaSp5KSxhKG4qeSkrMSksYy50ZXh0cGF0aG9rPSEwLGguc3RyaW5nPWUocyksaC5vbj0hMCxvLnN0eWxlLmNzc1RleHQ9dixvLmNvb3Jkc2l6ZT15K2wreSxvLmNvb3Jkb3JpZ2luPSIwIDAiO3ZhciB1PW5ldyBBKG8sdCkscD17ZmlsbDoiIzAwMCIsc3Ryb2tlOiJub25lIixmb250OnIuX2F2YWlsYWJsZUF0dHJzLmZvbnQsdGV4dDpzfTt1LnNoYXBlPW8sdS5wYXRoPWMsdS50ZXh0cGF0aD1oLHUudHlwZT0idGV4dCIsdS5hdHRycy50ZXh0PWUocyksdS5hdHRycy54PW4sdS5hdHRycy55PWksdS5hdHRycy53PTEsdS5hdHRycy5oPTEsayh1LHApLG8uYXBwZW5kQ2hpbGQoaCksby5hcHBlbmRDaGlsZChjKSx0LmNhbnZhcy5hcHBlbmRDaGlsZChvKTt2YXIgZD1OKCJza2V3Iik7cmV0dXJuIGQub249ITAsby5hcHBlbmRDaGlsZChkKSx1LnNrZXc9ZCx1LnRyYW5zZm9ybShmKSx1fSxyLl9lbmdpbmUuc2V0U2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY2FudmFzLnN0eWxlO3JldHVybiB0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0PT0rdCYmKHQrPSJweCIpLGU9PStlJiYoZSs9InB4Iiksbi53aWR0aD10LG4uaGVpZ2h0PWUsbi5jbGlwPSJyZWN0KDAgIit0KyIgIitlKyIgMCkiLHRoaXMuX3ZpZXdCb3gmJnIuX2VuZ2luZS5zZXRWaWV3Qm94LmFwcGx5KHRoaXMsdGhpcy5fdmlld0JveCksdGhpc30sci5fZW5naW5lLnNldFZpZXdCb3g9ZnVuY3Rpb24odCxlLG4saSxhKXtyLmV2ZSgicmFwaGFlbC5zZXRWaWV3Qm94Iix0aGlzLHRoaXMuX3ZpZXdCb3gsW3QsZSxuLGksYV0pO3ZhciBvLGMsaD10aGlzLndpZHRoLHU9dGhpcy5oZWlnaHQsbD0xL3Mobi9oLGkvdSk7cmV0dXJuIGEmJihvPXUvaSxjPWgvbixuKm88aCYmKHQtPShoLW4qbykvMi9vKSxpKmM8dSYmKGUtPSh1LWkqYykvMi9jKSksdGhpcy5fdmlld0JveD1bdCxlLG4saSwhIWFdLHRoaXMuX3ZpZXdCb3hTaGlmdD17ZHg6LXQsZHk6LWUsc2NhbGU6bH0sdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QudHJhbnNmb3JtKCIuLi4iKX0pLHRoaXN9O3ZhciBOO3IuX2VuZ2luZS5pbml0V2luPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZG9jdW1lbnQ7ZS5jcmVhdGVTdHlsZVNoZWV0KCkuYWRkUnVsZSgiLnJ2bWwiLCJiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKSIpO3RyeXshZS5uYW1lc3BhY2VzLnJ2bWwmJmUubmFtZXNwYWNlcy5hZGQoInJ2bWwiLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpLE49ZnVuY3Rpb24odCl7cmV0dXJuIGUuY3JlYXRlRWxlbWVudCgiPHJ2bWw6Iit0KycgY2xhc3M9InJ2bWwiPicpfX1jYXRjaCh0KXtOPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNyZWF0ZUVsZW1lbnQoIjwiK3QrJyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LmNvbTp2bWwiIGNsYXNzPSJydm1sIj4nKX19fSxyLl9lbmdpbmUuaW5pdFdpbihyLl9nLndpbiksci5fZW5naW5lLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PXIuX2dldENvbnRhaW5lci5hcHBseSgwLGFyZ3VtZW50cyksZT10LmNvbnRhaW5lcixuPXQuaGVpZ2h0LGk9dC53aWR0aCxhPXQueCxzPXQueTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlZNTCBjb250YWluZXIgbm90IGZvdW5kLiIpO3ZhciBvPW5ldyByLl9QYXBlcixjPW8uY2FudmFzPXIuX2cuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGg9Yy5zdHlsZTtyZXR1cm4gYT1hfHwwLHM9c3x8MCxpPWl8fDUxMixuPW58fDM0MixvLndpZHRoPWksby5oZWlnaHQ9bixpPT0raSYmKGkrPSJweCIpLG49PStuJiYobis9InB4Iiksby5jb29yZHNpemU9MjE2ZTUrbCsyMTZlNSxvLmNvb3Jkb3JpZ2luPSIwIDAiLG8uc3Bhbj1yLl9nLmRvYy5jcmVhdGVFbGVtZW50KCJzcGFuIiksby5zcGFuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbTtwYWRkaW5nOjA7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MTsiLGMuYXBwZW5kQ2hpbGQoby5zcGFuKSxoLmNzc1RleHQ9ci5mb3JtYXQoInRvcDowO2xlZnQ6MDt3aWR0aDp7MH07aGVpZ2h0OnsxfTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtjbGlwOnJlY3QoMCB7MH0gezF9IDApO292ZXJmbG93OmhpZGRlbiIsaSxuKSwxPT1lPyhyLl9nLmRvYy5ib2R5LmFwcGVuZENoaWxkKGMpLGgubGVmdD1hKyJweCIsaC50b3A9cysicHgiLGgucG9zaXRpb249ImFic29sdXRlIik6ZS5maXJzdENoaWxkP2UuaW5zZXJ0QmVmb3JlKGMsZS5maXJzdENoaWxkKTplLmFwcGVuZENoaWxkKGMpLG8ucmVuZGVyZml4PWZ1bmN0aW9uKCl7fSxvfSxyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3IuZXZlKCJyYXBoYWVsLmNsZWFyIix0aGlzKSx0aGlzLmNhbnZhcy5pbm5lckhUTUw9Zix0aGlzLnNwYW49ci5fZy5kb2MuY3JlYXRlRWxlbWVudCgic3BhbiIpLHRoaXMuc3Bhbi5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5ZW07dG9wOi05OTk5ZW07cGFkZGluZzowO21hcmdpbjowO2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTppbmxpbmU7Iix0aGlzLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLnNwYW4pLHRoaXMuYm90dG9tPXRoaXMudG9wPW51bGx9LHIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3IuZXZlKCJyYXBoYWVsLnJlbW92ZSIsdGhpcyksdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7Zm9yKHZhciB0IGluIHRoaXMpdGhpc1t0XT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpc1t0XT9yLl9yZW1vdmVkRmFjdG9yeSh0KTpudWxsO3JldHVybiEwfTt2YXIgTz1yLnN0O2Zvcih2YXIgVCBpbiBCKUJbdF0oVCkmJiFPW3RdKFQpJiYoT1tUXT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihyKXtyW3RdLmFwcGx5KHIsZSl9KX19KFQpKX19KCksQS53YXM/Uy53aW4uUmFwaGFlbD1yOlJhcGhhZWw9cixyfSksImZ1bmN0aW9uIiE9dHlwZW9mIGRlZmluZSl2YXIgZGVmaW5lPXJlcXVpcmUoImFtZGVmaW5lIikobW9kdWxlKTtkZWZpbmUoInJlZ3VsZXgiLFsiLi9LaXQiLCIuL05GQSIsIi4vUmVnRXhwIiwiLi9wYXJzZSIsIi4vdmlzdWFsaXplIiwiLi9saWJzL3JhcGhhZWwiXSxmdW5jdGlvbih0LGUscixuLGksYSl7cmV0dXJue0tpdDp0LE5GQTplLFJlZ0V4cDpyLHBhcnNlOm4sUmFwaGFlbDphLHZpc3VhbGl6ZTppfX0pOw==",t={class:"visualizer-container"},z={class:"visualizer-content"},k={class:"visualizer-regex-input code"},M={style:{width:"3em"}},N={class:"visualizer-flag-options"},w={class:"visualizer-flag-label"},T={class:"visualizer-flag-label"},U={class:"visualizer-flag-label"},j={key:0,class:"visualizer-error-box code"},e=l.defineComponent({__name:"RegulexVisualizer",props:{pattern:{}},emits:["update:pattern"],setup(g,{emit:P}){const S=g,Q=P,X=l.ref(S.pattern||"^(a|b)*?$"),W=l.ref(!1),y=l.ref(!1),u=l.ref(!1),s=l.ref(""),p=l.ref(null),a=l.ref(null),G=l.ref(null),c=l.ref({embed:!1,re:"",highlight:!0,flags:"",debug:!1}),x=l.computed(()=>{let d="";return W.value&&(d+="i"),y.value&&(d+="m"),u.value&&(d+="g"),d});l.watch(X,d=>{Q("update:pattern",`/${d}/${x.value}`),h()}),l.watch(()=>S.pattern,d=>{d!==X.value&&o(d)});function R(d){return d.replace(/^\s+/,"").replace(/\s+$/,"")}function o(d){const Z=d.match(/^\/(.*)\/([gimsuy]*)$/);if(Z){X.value=Z[1];const m=Z[2];W.value=m.includes("i"),y.value=m.includes("m"),u.value=m.includes("g")}else X.value=d,W.value=!1,y.value=!1,u.value=!1}function v(){const d=location.hash;if(!d||d.length<2)return{embed:!1,re:"",highlight:!0,flags:""};const m=d.slice(2).split("&").reduce((b,K)=>{const L=K.split("=");return b[L[0]]=L[1],b},{});return{embed:m.embed==="true",flags:m.flags||"",re:m.re?R(decodeURIComponent(m.re)):"",debug:m.debug==="true",cmd:m.cmd||""}}function B(){const d=R(X.value),Z=x.value;return"#!"+(c.value.debug?"debug=true&":"")+(c.value.embed?"embed=true&":"")+"flags="+Z+"&re="+encodeURIComponent(d)}function J(){location.hash=B()}function D(){s.value=""}function O(d,Z){let m=["Error:"+Z.message,""];typeof Z.lastIndex=="number"&&(m.push(d),m.push("-".repeat(Z.lastIndex)+"^")),s.value=m.join(`
2
- `)}function H(){try{if(typeof window<"u"&&window.require)try{const d=window.require("regulex");if(d)return{parse:d.parse,visualize:d.visualize,Raphael:d.Raphael,Kit:d.Kit}}catch(d){console.error("Require method failed:",d)}return null}catch(d){return console.error("Failed to load Regulex dependencies:",d),null}}function E(){return new Promise((d,Z)=>{if(window.regulexLoaded){const b=H();b?d(b):Z(new Error("Regulex not found after previous load"));return}const m=document.createElement("script");m.type="text/javascript",m.src=C,m.onload=()=>{window.regulexLoaded=!0;const b=H();b?d(b):Z(new Error("Failed to load Regulex dependencies"))},m.onerror=()=>{Z(new Error("Failed to load Regulex script"))},document.head.appendChild(m)})}function h(d=!1){if(!G.value)return console.error("Regulex dependencies not available"),!1;if(!p.value)return console.error("Graph container not available"),!1;const Z=R(X.value);J(),D();try{a.value||(a.value=G.value.Raphael(p.value,10,10));const m=G.value.parse(Z);return G.value.visualize(m,x.value,a.value),!0}catch(m){return d||O(Z,m),!1}}function n(){h(),J()}function f(d){d.keyCode!==13&&(clearTimeout(window.onKeyupTid),window.onKeyupTid=setTimeout(()=>{h()},100))}function r(d){d.keyCode===13&&(d.preventDefault(),d.stopPropagation(),h())}function A(d){if(!d)return;d.addEventListener("mousedown",Z);function Z(m){q();let b=m.clientX,K=m.clientY;d.addEventListener("mousemove",F),document.addEventListener("mouseup",L,!0),window.addEventListener("mouseup",L,!0);function L(Y){d.removeEventListener("mousemove",F),document.removeEventListener("mouseup",L,!0),window.removeEventListener("mouseup",L,!0)}function F(Y){let I=b-Y.clientX,V=K-Y.clientY;I>0&&d.scrollWidth-d.scrollLeft-d.clientWidth<2||I<0&&d.scrollLeft<1?(document.documentElement.scrollLeft+=I,document.body.scrollLeft+=I):d.scrollLeft+=I,V>0&&d.scrollHeight-d.scrollTop-d.clientHeight<2||V<0&&d.scrollTop<1?(document.documentElement.scrollTop+=V,document.body.scrollTop+=V):d.scrollTop+=V,b=Y.clientX,K=Y.clientY}}}function q(){var d,Z;window.getSelection?window.getSelection().empty?window.getSelection().empty():(d=window.getSelection())!=null&&d.removeAllRanges&&((Z=window.getSelection())==null||Z.removeAllRanges()):document.selection&&document.selection.empty()}return l.onMounted(async()=>{try{if(G.value=H(),G.value||(G.value=await E()),!G.value){s.value="Error: Failed to load Regulex dependencies";return}const d=v();Object.assign(c.value,d),S.pattern?o(S.pattern):c.value.re&&o(c.value.re),c.value.flags&&(W.value=c.value.flags.includes("i"),y.value=c.value.flags.includes("m"),u.value=c.value.flags.includes("g")),await l.nextTick(),h(),p.value&&A(p.value)}catch(d){s.value="Error: Failed to load Regulex dependencies",console.error("Failed to initialize RegexVisualizer:",d)}}),(d,Z)=>(l.openBlock(),l.createElementBlock("div",t,[l.createElementVNode("div",z,[l.createElementVNode("div",k,[l.createElementVNode("table",null,[l.createElementVNode("tbody",null,[l.createElementVNode("tr",null,[Z[4]||(Z[4]=l.createElementVNode("td",{style:{width:"1em"}},"/",-1)),l.createElementVNode("td",null,[l.withDirectives(l.createElementVNode("input",{"onUpdate:modelValue":Z[0]||(Z[0]=m=>X.value=m),class:"input",onKeyup:f,onKeydown:r,placeholder:"输入正则表达式"},null,544),[[l.vModelText,X.value]])]),Z[5]||(Z[5]=l.createElementVNode("td",{style:{width:"1em"}},"/",-1)),l.createElementVNode("td",M,l.toDisplayString(x.value),1)])])])]),l.createElementVNode("div",N,[l.createElementVNode("label",w,[l.withDirectives(l.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":Z[1]||(Z[1]=m=>W.value=m),onChange:n},null,544),[[l.vModelCheckbox,W.value]]),Z[6]||(Z[6]=l.createTextVNode("IgnoreCase ",-1))]),l.createElementVNode("label",T,[l.withDirectives(l.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":Z[2]||(Z[2]=m=>y.value=m),onChange:n},null,544),[[l.vModelCheckbox,y.value]]),Z[7]||(Z[7]=l.createTextVNode("Multiline ",-1))]),l.createElementVNode("label",U,[l.withDirectives(l.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":Z[3]||(Z[3]=m=>u.value=m),onChange:n},null,544),[[l.vModelCheckbox,u.value]]),Z[8]||(Z[8]=l.createTextVNode("GlobalMatch ",-1))])]),s.value?(l.openBlock(),l.createElementBlock("p",j,l.toDisplayString(s.value),1)):l.createCommentVNode("",!0),l.createElementVNode("div",{ref_key:"graphContainer",ref:p,class:"visualizer-graph-container code"},null,512)])]))}});i.RegulexVisualizer=e,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(i,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],l):(i=typeof globalThis<"u"?globalThis:i||self,l(i.RegulexVisualizer={},i.Vue))})(this,(function(i,l){"use strict";const C="data:text/javascript;base64,LyoqDQogKiBAbGljZW5zZSBhbG1vbmQgMC4zLjAgQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqIEF2YWlsYWJsZSB2aWEgdGhlIE1JVCBvciBuZXcgQlNEIGxpY2Vuc2UuDQogKiBzZWU6IGh0dHA6Ly9naXRodWIuY29tL2pyYnVya2UvYWxtb25kIGZvciBkZXRhaWxzDQogKi8NCg0KLy8g4pSCIENvcHlyaWdodCDCqSAyMDA4LTIwMTIgRG1pdHJ5IEJhcmFub3Zza2l5IChodHRwOi8vcmFwaGFlbGpzLmNvbSkgICAg4pSCIFxcDQoNCi8vIOKUgiBDb3B5cmlnaHQgwqkgMjAwOC0yMDEyIFNlbmNoYSBMYWJzIChodHRwOi8vc2VuY2hhLmNvbSkgICAgICAgICAgICAgIOKUgiBcXA0KDQovLyDilIIgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoaHR0cDovL3JhcGhhZWxqcy5jb20vbGljZW5zZS5odG1sKSBsaWNlbnNlLuKUgiBcXA0KDQovLyBDb3B5cmlnaHQgKGMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQovLyDilIIgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgRG1pdHJ5IEJhcmFub3Zza2l5IChodHRwOi8vcmFwaGFlbGpzLmNvbSkgICDilIIgXFwNCg0KLy8g4pSCIENvcHlyaWdodCAoYykgMjAwOC0yMDExIFNlbmNoYSBMYWJzIChodHRwOi8vc2VuY2hhLmNvbSkgICAgICAgICAgICAg4pSCIFxcDQoNCi8vIOKUgiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIChodHRwOi8vcmFwaGFlbGpzLmNvbS9saWNlbnNlLmh0bWwpIGxpY2Vuc2UuIOKUgiBcXA0KDQp2YXIgcmVxdWlyZWpzLHJlcXVpcmUsZGVmaW5lO2lmKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdi5jYWxsKHQsZSl9ZnVuY3Rpb24gcih0LGUpe3ZhciByLG4saSxhLHMsbyxjLGgsdSxsLGYscD1lJiZlLnNwbGl0KCIvIiksZD1nLm1hcCx4PWQmJmRbIioiXXx8e307aWYodCYmIi4iPT09dC5jaGFyQXQoMCkpaWYoZSl7Zm9yKHA9cC5zbGljZSgwLHAubGVuZ3RoLTEpLHQ9dC5zcGxpdCgiLyIpLHM9dC5sZW5ndGgtMSxnLm5vZGVJZENvbXBhdCYmbS50ZXN0KHRbc10pJiYodFtzXT10W3NdLnJlcGxhY2UobSwiIikpLHQ9cC5jb25jYXQodCksdT0wO3U8dC5sZW5ndGg7dSs9MSlpZigiLiI9PT0oZj10W3VdKSl0LnNwbGljZSh1LDEpLHUtPTE7ZWxzZSBpZigiLi4iPT09Zil7aWYoMT09PXUmJigiLi4iPT09dFsyXXx8Ii4uIj09PXRbMF0pKWJyZWFrO3U+MCYmKHQuc3BsaWNlKHUtMSwyKSx1LT0yKX10PXQuam9pbigiLyIpfWVsc2UgMD09PXQuaW5kZXhPZigiLi8iKSYmKHQ9dC5zdWJzdHJpbmcoMikpO2lmKChwfHx4KSYmZCl7Zm9yKHI9dC5zcGxpdCgiLyIpLHU9ci5sZW5ndGg7dT4wO3UtPTEpe2lmKG49ci5zbGljZSgwLHUpLmpvaW4oIi8iKSxwKWZvcihsPXAubGVuZ3RoO2w+MDtsLT0xKWlmKChpPWRbcC5zbGljZSgwLGwpLmpvaW4oIi8iKV0pJiYoaT1pW25dKSl7YT1pLG89dTticmVha31pZihhKWJyZWFrOyFjJiZ4JiZ4W25dJiYoYz14W25dLGg9dSl9IWEmJmMmJihhPWMsbz1oKSxhJiYoci5zcGxpY2UoMCxvLGEpLHQ9ci5qb2luKCIvIikpfXJldHVybiB0fWZ1bmN0aW9uIG4oZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj15LmNhbGwoYXJndW1lbnRzLDApO3JldHVybiJzdHJpbmciIT10eXBlb2YgblswXSYmMT09PW4ubGVuZ3RoJiZuLnB1c2gobnVsbCksdS5hcHBseSh0LG4uY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiByKGUsdCl9fWZ1bmN0aW9uIGEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3BbdF09ZX19ZnVuY3Rpb24gcyhyKXtpZihlKGQscikpe3ZhciBuPWRbcl07ZGVsZXRlIGRbcl0seFtyXT0hMCxoLmFwcGx5KHQsbil9aWYoIWUocCxyKSYmIWUoeCxyKSl0aHJvdyBuZXcgRXJyb3IoIk5vICIrcik7cmV0dXJuIHBbcl19ZnVuY3Rpb24gbyh0KXt2YXIgZSxyPXQ/dC5pbmRleE9mKCIhIik6LTE7cmV0dXJuIHI+LTEmJihlPXQuc3Vic3RyaW5nKDAsciksdD10LnN1YnN0cmluZyhyKzEsdC5sZW5ndGgpKSxbZSx0XX1mdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBnJiZnLmNvbmZpZyYmZy5jb25maWdbdF18fHt9fX12YXIgaCx1LGwsZixwPXt9LGQ9e30sZz17fSx4PXt9LHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx5PVtdLnNsaWNlLG09L1wuanMkLztsPWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1vKHQpLGM9YVswXTtyZXR1cm4gdD1hWzFdLGMmJihjPXIoYyxlKSxuPXMoYykpLGM/dD1uJiZuLm5vcm1hbGl6ZT9uLm5vcm1hbGl6ZSh0LGkoZSkpOnIodCxlKToodD1yKHQsZSksYT1vKHQpLGM9YVswXSx0PWFbMV0sYyYmKG49cyhjKSkpLHtmOmM/YysiISIrdDp0LG46dCxwcjpjLHA6bn19LGY9e3JlcXVpcmU6ZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9LGV4cG9ydHM6ZnVuY3Rpb24odCl7dmFyIGU9cFt0XTtyZXR1cm4gdm9pZCAwIT09ZT9lOnBbdF09e319LG1vZHVsZTpmdW5jdGlvbih0KXtyZXR1cm57aWQ6dCx1cmk6IiIsZXhwb3J0czpwW3RdLGNvbmZpZzpjKHQpfX19LGg9ZnVuY3Rpb24ocixpLG8sYyl7dmFyIGgsdSxnLHYseSxtLGI9W10sXz10eXBlb2YgbztpZihjPWN8fHIsInVuZGVmaW5lZCI9PT1ffHwiZnVuY3Rpb24iPT09Xyl7Zm9yKGk9IWkubGVuZ3RoJiZvLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06aSx5PTA7eTxpLmxlbmd0aDt5Kz0xKWlmKHY9bChpW3ldLGMpLCJyZXF1aXJlIj09PSh1PXYuZikpYlt5XT1mLnJlcXVpcmUocik7ZWxzZSBpZigiZXhwb3J0cyI9PT11KWJbeV09Zi5leHBvcnRzKHIpLG09ITA7ZWxzZSBpZigibW9kdWxlIj09PXUpaD1iW3ldPWYubW9kdWxlKHIpO2Vsc2UgaWYoZShwLHUpfHxlKGQsdSl8fGUoeCx1KSliW3ldPXModSk7ZWxzZXtpZighdi5wKXRocm93IG5ldyBFcnJvcihyKyIgbWlzc2luZyAiK3UpO3YucC5sb2FkKHYubixuKGMsITApLGEodSkse30pLGJbeV09cFt1XX1nPW8/by5hcHBseShwW3JdLGIpOnZvaWQgMCxyJiYoaCYmaC5leHBvcnRzIT09dCYmaC5leHBvcnRzIT09cFtyXT9wW3JdPWguZXhwb3J0czpnPT09dCYmbXx8KHBbcl09ZykpfWVsc2UgciYmKHBbcl09byl9LHJlcXVpcmVqcz1yZXF1aXJlPXU9ZnVuY3Rpb24oZSxyLG4saSxhKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGZbZV0/ZltlXShyKTpzKGwoZSxyKS5mKTtpZighZS5zcGxpY2Upe2lmKGc9ZSxnLmRlcHMmJnUoZy5kZXBzLGcuY2FsbGJhY2spLCFyKXJldHVybjtyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dH1yZXR1cm4gcj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPWksaT1hKSxpP2godCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe2godCxlLHIsbil9LDQpLHV9LHUuY29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB1KHQpfSxyZXF1aXJlanMuX2RlZmluZWQ9cCxkZWZpbmU9ZnVuY3Rpb24odCxyLG4pe3Iuc3BsaWNlfHwobj1yLHI9W10pLGUocCx0KXx8ZShkLHQpfHwoZFt0XT1bdCxyLG5dKX0sZGVmaW5lLmFtZD17alF1ZXJ5OiEwfX0oKSxkZWZpbmUoImxpYnMvYWxtb25kIixmdW5jdGlvbigpe30pLCJmdW5jdGlvbiIhPXR5cGVvZiBkZWZpbmUpdmFyIGRlZmluZT1yZXF1aXJlKCJhbWRlZmluZSIpKG1vZHVsZSk7aWYoZGVmaW5lKCJLaXQiLFtdLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGEpe3JldHVybiBlLl9TZXQ/ZTooYXx8KGU9bihlKSksZS5jb250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybiEhfnIoZSx0LG4pfSxlLmluZGV4T2Y9ZnVuY3Rpb24odCxuKXtyZXR1cm4gcihlLHQsbil9LGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiBpKGUpfSxlLnVuaW9uPWZ1bmN0aW9uKHIpe3I9dChyKTtmb3IodmFyIG49ZS5sZW5ndGgrci5sZW5ndGgsYT1uZXcgZS5jb25zdHJ1Y3RvcihuKSxzPTAsbz0wLGM9MDtjPG47YysrKWVbc109PT1yW29dPyhhW2NdPWVbcysrXSxvKyssbi0tKTplW3NdPHJbb10/YVtjXT1lW3MrK106YVtjXT1yW28rK107cmV0dXJuIGEubGVuZ3RoPW4sdChhLmxlbmd0aD09PW4/YTppKGEsbiksITApfSxlLmluc3BlY3Q9ZS50b0FycmF5LGUuX1NldD0hMCxlKX1mdW5jdGlvbiBlKHQsZSl7cmV0dXJuIHQ8ZT9FOnQ9PT1lP0M6a31mdW5jdGlvbiByKHQscixuKXt2YXIgaSxhLHM9MCxvPXQubGVuZ3RoLGM9by0xO2lmKG88MSlyZXR1cm4tMTtpZihuPW58fGUsMT09PW8pcmV0dXJuIG4ocix0W3NdKT09PUM/czotMTtpZihuKHIsdFtzXSk9PT1FfHxuKHIsdFtjXSk9PT1rKXJldHVybi0xO2Rve2lmKGk9cysoYy1zKzE+PjEpLChhPW4ocix0W2ldKSk9PT1DKXJldHVybiBpO2E9PT1FP2M9aS0xOnM9aSsxfXdoaWxlKHM8PWMpO3JldHVybi0xfWZ1bmN0aW9uIG4odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9MSlyZXR1cm4gdDtmb3IodmFyIHIsbixhLHM9MSxvPWUvM3wwO3M8bzspcz0zKnMrMTtmb3IoO3M+MDspe2ZvcihyPXM7cjxlO3IrKylmb3Iobj1yO24+PXMmJnRbbl08dFtuLXNdO24tPXMpYT10W25dLHRbbl09dFtuLXNdLHRbbi1zXT1hO3M9cy8zfDB9dmFyIGM9dFswXTtmb3Iocj0xLG49MTtyPGU7cisrKXRbcl0hPT1jJiYoYz10W24rK109dFtyXSk7cmV0dXJuIHQubGVuZ3RoPW4sdC5sZW5ndGg9PT1uP3Q6aSh0LG4pfWZ1bmN0aW9uIGkodCxlKXtlPXZvaWQgMD09PWU/dC5sZW5ndGg6ZTtmb3IodmFyIHI9bmV3IHQuY29uc3RydWN0b3IoZSksbj1lO24tLTspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlLHI9e30sbj0wLGk9MCxhPXQubGVuZ3RoO248YTtuKyspZT10W25dLHIuaGFzT3duUHJvcGVydHkoZSl8fChyW2VdPTEsdFtpKytdPWUpO3JldHVybiB0Lmxlbmd0aD1pLHR9ZnVuY3Rpb24gcyh0KXt2YXIgZSxyLG4saT10Lmxlbmd0aCxhPSgxZTEwKk1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDMyKSsoK25ldyBEYXRlKS50b1N0cmluZygzMik7Zm9yKGU9cj0wO2U8aTtlKyspbnVsbCE9KG49dFtlXSkmJihuLmhhc093blByb3BlcnR5KGEpfHwoT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sYSx7dmFsdWU6MSxlbnVtZXJhYmxlOiExfSksdFtyKytdPW4pKTtmb3IoZT1yO2UtLTspdFtlXVthXT12b2lkIDA7cmV0dXJuIHQubGVuZ3RoPXIsdH1mdW5jdGlvbiBvKHQpe3Q9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV0/dDp0K3R9KTt2YXIgZSxyLGksYSxzLG87dD1uKHQpLG89dC5sZW5ndGg7dmFyIGMsaCx1PU9iamVjdC5jcmVhdGUobnVsbCksbD1PYmplY3QuY3JlYXRlKG51bGwpLGY9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoZT0wO2U8bztlKyspZm9yKHM9dFtlXSxoPXNbMV0sbFtzWzBdXT0hMCxmW2hdPSEwLHI9ZTtyPG87cisrKWlmKChjPXRbcl1bMF0pPj1oKXtjPT09aCYmKHVbaF09ITApO2JyZWFrfXZhciBnPW4odC5qb2luKCIiKS5zcGxpdCgiIikpLHg9T2JqZWN0LmtleXModSksdj1nWzBdLHk9T2JqZWN0LmNyZWF0ZShudWxsKSxtPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGU9MDtlPG87ZSsrKXlbdFtlXV09W107aWYodVt2XSlmb3IoZT0wO2U8bztlKyspaWYocz10W2VdLHNbMF09PT12KXlbc10ucHVzaCh2KTtlbHNlIGlmKHNbMF0+dilicmVhaztmb3IoZT0wLGE9Zy5sZW5ndGgtMTtlPGE7ZSsrKXtpZihjPWdbZV0saD1nW2UrMV0sZltjXSYmKGM9ZChjKSksbFtoXSYmKGg9cChoKSksYzw9aClmb3Iodj1jPT09aD9jOmMraCxyPTA7cjxvJiYocz10W3JdLCEoc1swXT5oKSk7cisrKXNbMF08PWMmJmg8PXNbMV0mJih5W3NdLnB1c2godikseC5wdXNoKHYpKTtpZihjPWdbZV0saD1nW2UrMV0sdVtoXSlmb3Iocj0wO3I8byYmKHM9dFtyXSwhKHNbMF0+aCkpO3IrKylzWzBdPD1oJiZoPD1zWzFdJiZ5W3NdLnB1c2goaCl9eD1uKHgpO2ZvcihpIGluIHkpbVtpWzBdPT09aVsxXT9pWzBdOmldPXlbaV07cmV0dXJue3Jhbmdlczp4LG1hcDptfX1mdW5jdGlvbiBjKHQpe3ZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzUpO3Q9byh0KS5yYW5nZXM7dmFyIHI9W107aWYoIXQubGVuZ3RoKXJldHVybiByOyJcMCIhPT10WzBdWzBdJiZ0LnVuc2hpZnQoZSk7dmFyIG49dC5sZW5ndGgtMTtyZXR1cm4odFtuXVsxXXx8dFtuXVswXSkhPT1lJiZ0LnB1c2goIlwwIiksdC5yZWR1Y2UoZnVuY3Rpb24odCxlKXt2YXIgbj1kKHRbMV18fHRbMF0pLGk9cChlWzBdKTtyZXR1cm4gbjxpJiZyLnB1c2gobitpKSxuPT09aSYmci5wdXNoKG4pLGV9KSxyfWZ1bmN0aW9uIGgodCl7dD10LnNwbGl0KCIiKTt2YXIgZT1bXSxyPVtdLG49Il4iPT09dFswXSYmdC5sZW5ndGg+MSYmdC5zaGlmdCgpO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIi0iPT1lWzBdJiZlLmxlbmd0aD4xKXtpZihlWzFdPnQpdGhyb3cgbmV3IEVycm9yKCJDaGFyc2V0IHJhbmdlIG91dCBvZiBvcmRlcjoiK2VbMV0rIi0iK3QrIiEiKTtyLnB1c2goZVsxXSt0KSxlLnNwbGljZSgwLDIpfWVsc2UgZS51bnNoaWZ0KHQpfSkscj1yLmNvbmNhdChlKSxuP2Mocik6byhyKS5yYW5nZXN9ZnVuY3Rpb24gdSh0KXtpZighdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9W3RbMF1dO3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LHIpe3ZhciBuPWUubGVuZ3RoLTE7cmV0dXJuIHRbdC5sZW5ndGgtMV09PT1wKHJbMF0pP2Vbbl09ZVtuXVswXStyW3IubGVuZ3RoLTFdOihlLnB1c2gocikscil9KSxlLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiAyPT09ZS5sZW5ndGgmJmVbMF09PT1wKGVbMV0pPyh0LnB1c2goZVswXSksdC5wdXNoKGVbMV0pKTp0LnB1c2goZSksdH0sW10pfWZ1bmN0aW9uIGwodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4gdC5jaGFyQ29kZUF0KDApfWZ1bmN0aW9uIHAodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KDApLTEpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZUF0KDApKzEpfWZ1bmN0aW9uIGcodCxlKXt2YXIgcj0vW1x4MDAtXHgxRlx4N0YtXHg5Rl0vLG49L1tcdTAwOUYtXHVGRkZGXS87cmV0dXJuIHQ9dC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiFlJiZTLmhhc093blByb3BlcnR5KHQpP1NbdF06bi50ZXN0KHQpPyJcXHUiKygiMDAiK2YodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC00KTpyLnRlc3QodCk/IlxceCIrKCIwIitmKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtMik6dH0pLmpvaW4oIiIpfWZ1bmN0aW9uIHgodCl7cmV0dXJuW10uY29uY2F0LmFwcGx5KFtdLHQpfWZ1bmN0aW9uIHYodCxlKXtyZXR1cm4gbmV3IEFycmF5KGUrMSkuam9pbih0KX1mdW5jdGlvbiB5KCl7dmFyIHQ9Xy5jYWxsKGFyZ3VtZW50cyk7aWYodylGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkoY29uc29sZS5sb2csW2NvbnNvbGUsdF0pO2Vsc2V7dmFyIGU9cmVxdWlyZSgidXRpbCIpO3QuZm9yRWFjaChmdW5jdGlvbih0KXtjb25zb2xlLmxvZyhlLmluc3BlY3QodCx7c2hvd0hpZGRlbjohMSxjdXN0b21JbnNwZWN0OiEwLGRlcHRoOjY0LGNvbG9yczohMH0pKX0pfX1mdW5jdGlvbiBtKHQpe2Zvcih2YXIgZSxyPXQudG9TdHJpbmcoKSxuPS9eXHMrZnVuY3Rpb25ccysoW2EtekEtWl1cdyspXHMqXCgvZ20saT1bXTtlPW4uZXhlYyhyKTspaS5wdXNoKGVbMV0pO2Zvcih2YXIgdCxhPVtdO3Q9aS5wb3AoKTspYS5wdXNoKHQrIjoiK3QpO3JldHVybiJ7XG4iK2Euam9pbigiLFxuIikrIlxufSJ9dmFyIGI9QXJyYXkucHJvdG90eXBlLF89Yi5zbGljZSx3PWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgV2luZG93XSI9PT10aGlzLnRvU3RyaW5nKCl9KCksRT0tMSxDPTAsaz0xLFM9eyJcbiI6IlxcbiIsIlx0IjoiXFx0IiwiXGYiOiJcXGYiLCJcciI6IlxcciIsIiAiOiIgIiwiXFwiOiJcXFxcIiwiXDAiOiJcXDAifTtyZXR1cm57c29ydFVuaXF1ZTpuLGlkVW5pcXVlOnMsaGFzaFVuaXF1ZTphLFNldDp0LHJlcGVhdHM6dixuZWdhdGU6Yyxjb2FsZXNjZTp1LGNsYXNzaWZ5Om8scGFyc2VDaGFyc2V0OmgsY2hyOmwsb3JkOmYscHJlZDpwLHN1Y2M6ZCx0b1ByaW50OmcsZmxhdHRlbjI6eCxsb2c6eSxpc0Jyb3dzZXI6dyxsb2NhbHM6bX19KSwiZnVuY3Rpb24iIT10eXBlb2YgZGVmaW5lKXZhciBkZWZpbmU9cmVxdWlyZSgiYW1kZWZpbmUiKShtb2R1bGUpO2lmKGRlZmluZSgiTkZBIixbIi4vS2l0Il0sZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtlPWUuY29tcGFjdD9jKGUpOmU7dmFyIHMsbz17fSxoPWUudHJhbnMsdT17fTtmb3Iocz0wLG49ZS5hY2NlcHRzLmxlbmd0aDtzPG47cysrKW9bZS5hY2NlcHRzW3NdXT0hMDt2YXIgbDtmb3Iocz0wLG49aC5sZW5ndGg7czxuO3MrKylsPWhbc10sbC5jaGFyc2V0P2wucmFuZ2VzPSJzdHJpbmciPT10eXBlb2YgbC5jaGFyc2V0P3QucGFyc2VDaGFyc2V0KGwuY2hhcnNldCk6bC5jaGFyc2V0OmwuZU1vdmU9ITAsbC5mcm9tLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dVt0XT11W3RdfHx7ZU1vdmVTdGF0ZXM6W10sZU1vdmU6W10sY2hhck1vdmU6e30sdHJhbnM6W10scmFuZ2VzOltdfTtsLmVNb3ZlP2UuZU1vdmVTdGF0ZXM9ZS5lTW92ZVN0YXRlcy5jb25jYXQobC50byk6ZS5yYW5nZXM9ZS5yYW5nZXMuY29uY2F0KGwucmFuZ2VzKSxlLnRyYW5zLnB1c2gobCl9KTtyZXR1cm4gT2JqZWN0LmtleXModSkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj11W2VdLG49ci50cmFucyxpPXIuY2hhck1vdmUsYT1yLmVNb3ZlLHM9ci5yYW5nZXMsbz10LmNsYXNzaWZ5KHMpLGM9by5tYXA7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZU1vdmU/ZS50by5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EucHVzaCh7dG86dCxhY3Rpb246ZS5hY3Rpb24sYXNzZXJ0OmUuYXNzZXJ0LGVNb3ZlOiEwfSl9KTp0LmZsYXR0ZW4yKGUucmFuZ2VzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gY1t0XX0pKS5mb3JFYWNoKGZ1bmN0aW9uKHQpeyhpW3RdPWlbdF18fFtdKS5wdXNoKGUpfSl9KSxzPXQuU2V0KG8ucmFuZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hIXRbMV19KSksci5yYW5nZXM9cyxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWlbdF0scj1bXTtuLmZvckVhY2goZnVuY3Rpb24odCl7dC50by5mb3JFYWNoKGZ1bmN0aW9uKG4peyh0LmVNb3ZlfHx+ZS5pbmRleE9mKHQpKSYmci5wdXNoKHt0bzpuLGFjdGlvbjp0LmFjdGlvbixhc3NlcnQ6dC5hc3NlcnQsZU1vdmU6dC5lTW92ZX0pfSl9KSxpW3RdPXJ9KSxkZWxldGUgci50cmFucyxkZWxldGUgci5lTW92ZVN0YXRlc30pLHthY2NlcHRzOm8scm91dGVyOnUsaW5wdXQ6YSxhc3NlcnRERkE6aSxhY2NlcHQ6cn19ZnVuY3Rpb24gcih0KXtyZXR1cm4gdGhpcy5hY2NlcHRzLmhhc093blByb3BlcnR5KHQpfWZ1bmN0aW9uIGkoKXtmb3IodmFyIGUscj10aGlzLnJvdXRlcixuPU9iamVjdC5rZXlzKHIpLGk9MCxhPW4ubGVuZ3RoO2k8YTtpKyspe2lmKGU9cltuW2ldXSxlLmVNb3ZlLmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcigiREZBIEFzc2VydGlvbiBGYWlsIVxuRnJvbSBzdGF0ZSBgIituW2ldKyJgIGNhbiBnb3RvIHRvIG11bHRpIM61LW1vdmUgc3RhdGVzISIpO2Zvcih2YXIgcz1lLmNoYXJNb3ZlLG89T2JqZWN0LmtleXMocyksYz0wLGg9by5sZW5ndGg7YzxoO2MrKyl7aWYoMSE9PXNbb1tjXV0ubGVuZ3RoKXRocm93IHQubG9nKHMpLG5ldyBFcnJvcigiREZBIEFzc2VydGlvbiBGYWlsIVxuRnJvbSBzdGF0ZSBgIituW2ldKyJgIHZpYSBjaGFyc2V0IGAiK29bY10rImAgY2FuIGdvdG8gdG8gbXVsdGkgc3RhdGVzISIpfWlmKG8ubGVuZ3RoJiZlLmVNb3ZlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRGQSBBc3NlcnRpb24gRmFpbCFcbkZyb20gc3RhdGUgYCIrbltpXSsiYCBjYW4gZ290byBleHRyYSDOtS1tb3ZlIHN0YXRlISIpfXJldHVybiEwfWZ1bmN0aW9uIGEoZSxyLG4pe2Z1bmN0aW9uIGkoZSxyLG8sYyxoKXt0OmZvcig7Oyl7dmFyIHUsbCxmLHAsZD1hLnJvdXRlcltvXTtpZighZClicmVhazt2YXIgZyx4PWQuZU1vdmUsdj1kLmNoYXJNb3ZlO3I8ZS5sZW5ndGg/KHU9ZVtyXSxnPXYuaGFzT3duUHJvcGVydHkodSk/dlt1XToobD1zKGQucmFuZ2VzLHUpKT92W2xdOngpOmc9eDtmb3IodmFyIHksbSxiLF89Yy5sZW5ndGgsdz1oLEU9MCxDPWcubGVuZ3RoO0U8QztFKyspe2lmKHk9Z1tFXSxmPXkuZU1vdmU/MDoxLGg9dyxjLnNwbGljZSgwLGMubGVuZ3RoLV8pLF89Yy5sZW5ndGgseS5hc3NlcnQpe2lmKCExPT09KG09eS5hc3NlcnQoYyx1LHIsbyxlKSkpY29udGludWU7Im51bWJlciI9PXR5cGVvZiBtJiYocis9bSxoKz1tKX1pZih5LmFjdGlvbiYmKGM9eS5hY3Rpb24oYyx1LHIsbyxlKXx8YyksaD15LmVNb3ZlP2g6cixuJiZ0LmxvZyh1KyI6IitvKyI+Iit5LnRvKSxFPT09Qy0xKXtyKz1mLG89eS50bztjb250aW51ZSB0fWlmKGI9aShlLHIrZix5LnRvLGMsaCksYi5hY2NlcHRhYmxlKXJldHVybiBiO3A9Yn1pZihwKXJldHVybiBwO2JyZWFrfXJldHVybntzdGFjazpjLGxhc3RJbmRleDpoLGxhc3RTdGF0ZTpvLGFjY2VwdGFibGU6YS5hY2NlcHQobyl9fXI9cnx8MDt2YXIgYT10aGlzO3JldHVybiBpKGUsciwic3RhcnQiLFtdLHItMSl9ZnVuY3Rpb24gcyh0LGUpe3ZhciByPXQuaW5kZXhPZihlLG8pO3JldHVybiEhfnImJnRbcl19ZnVuY3Rpb24gbyh0LGUpe3ZhciByPWVbMF07cmV0dXJuIHQ+ZVsxXT8xOnQ8cj8tMTowfWZ1bmN0aW9uIGModCl7dC5hY2NlcHRzPXQuYWNjZXB0cy5zcGxpdCgiLCIpO2Zvcih2YXIgZSxyLG4saSxhPXQudHJhbnMscz1hLmxlbmd0aDtzLS07KWU9YVtzXSxyPWVbMF0uc3BsaXQoIj4iKSxuPXJbMF0uc3BsaXQoIiwiKSxpPXJbMV0uc3BsaXQoIiwiKSxhW3NdPXtmcm9tOm4sdG86aSxjaGFyc2V0OmVbMV0sYWN0aW9uOmVbMl0sYXNzZXJ0OmVbM119O3JldHVybiB0LmNvbXBhY3Q9ITEsdH1yZXR1cm4gZX0pLCJmdW5jdGlvbiIhPXR5cGVvZiBkZWZpbmUpdmFyIGRlZmluZT1yZXF1aXJlKCJhbWRlZmluZSIpKG1vZHVsZSk7aWYoZGVmaW5lKCJwYXJzZSIsWyIuL05GQSIsIi4vS2l0Il0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dmFyIHQ9T2JqZWN0LmtleXMocCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0KyI9IitKU09OLnN0cmluZ2lmeShwW3RdKX0pLmpvaW4oIjsiKTsoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKCkuZXZhbCh0KX1mdW5jdGlvbiBuKHQpe3RoaXMucmF3PXQucmF3LHRoaXMudHJlZT10LnRyZWUsdGhpcy5ncm91cENvdW50PXQuZ3JvdXBDb3VudH1mdW5jdGlvbiBpKHQsZSl7ZD1lO3ZhciByLGkscyxwPWEoKTtyPXAuaW5wdXQodCwwLGUpLGk9ci5zdGFjayxpPXYuZW5kQ2hvaWNlKGkpLHM9ci5sYXN0U3RhdGU7dmFyIGc9ci5hY2NlcHRhYmxlJiZyLmxhc3RJbmRleD09PXQubGVuZ3RoLTE7aWYoIWcpe3ZhciB4O3N3aXRjaChzKXtjYXNlImNoYXJzZXRSYW5nZUVuZFdpdGhOdWxsQ2hhciI6eD17dHlwZToiQ2hhcnNldFJhbmdlRW5kV2l0aE51bGxDaGFyIixtZXNzYWdlOiJDaGFyc2V0IHJhbmdlIGVuZCB3aXRoIE5VTCBjaGFyIGRvZXMgbm90IG1ha2Ugc2Vuc2UhXG5CZWNhdXNlIFthLVxcMF0gaXMgbm90IGEgdmFsaWQgcmFuZ2UuXG5BbmQgW1xcMC1cXDBdIHNob3VsZCBiZSByZXdyaXR0ZW4gaW50byBbXFwwXS4ifTticmVhaztjYXNlInJlcGVhdEVycm9yRmluYWwiOng9e3R5cGU6Ik5vdGhpbmdSZXBlYXQiLG1lc3NhZ2U6Ik5vdGhpbmcgdG8gcmVwZWF0ISJ9O2JyZWFrO2Nhc2UiZGlnaXRGb2xsb3dOdWxsRXJyb3IiOng9e3R5cGU6IkRpZ2l0Rm9sbG93TnVsbEVycm9yIixtZXNzYWdlOiJUaGUgJ1xcMCcgcmVwcmVzZW50cyB0aGUgPE5VTD4gY2hhciBhbmQgY2Fubm90IGJlIGZvbGxvd2VkIGJ5IGEgZGVjaW1hbCBkaWdpdCEifTticmVhaztjYXNlImNoYXJzZXRSYW5nZUVuZENsYXNzIjp4PXt0eXBlOiJDaGFyc2V0UmFuZ2VFbmRDbGFzcyIsbWVzc2FnZTonQ2hhcnNldCByYW5nZSBlbmRzIHdpdGggY2xhc3Mgc3VjaCBhcyAiXFx3XFxXXFxkXFxEXFxzXFxTIiBpcyBpbnZhbGlkISd9O2JyZWFrO2Nhc2UiY2hhcnNldE9jdEVzY2FwZSI6eD17dHlwZToiRGVjaW1hbEVzY2FwZSIsbWVzc2FnZToiRGVjaW1hbCBlc2NhcGUgYXBwZWFycyBpbiBjaGFyc2V0IGlzIGludmFsaWQuQmVjYXVzZSBpdCBjYW4ndCBiZSBleHBsYWluZWQgYXMgIGJhY2tyZWZlcmVuY2UuQW5kIG9jdGFsIGVzY2FwZSBpcyBkZXByZWNhdGVkISJ9O2JyZWFrO2RlZmF1bHQ6MD09PXMuaW5kZXhPZigiY2hhcnNldCIpP3g9e3R5cGU6IlVuY2xvc2VkQ2hhcnNldCIsbWVzc2FnZToiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzcyEifToiKSI9PT10W3IubGFzdEluZGV4XT94PXt0eXBlOiJVbm1hdGNoZWRQYXJlbiIsbWVzc2FnZToiVW5tYXRjaGVkIGVuZCBwYXJlbnRoZXNpcyEifTooeD17dHlwZToiVW5leHBlY3RlZENoYXIiLG1lc3NhZ2U6IlVuZXhwZWN0ZWQgY2hhciEifSxyLmxhc3RJbmRleCsrKX1pZih4KXRocm93IHgubGFzdEluZGV4PXIubGFzdEluZGV4LHguYXN0U3RhY2s9ci5zdGFjayx4Lmxhc3RTdGF0ZT1zLG5ldyBmKHgpfWlmKGkuX3BhcmVudEdyb3VwKXRocm93IG5ldyBmKHt0eXBlOiJVbnRlcm1pbmF0ZWRHcm91cCIsbWVzc2FnZToiVW50ZXJtaW5hdGVkIGdyb3VwISIsbGFzdEluZGV4OmkuX3BhcmVudEdyb3VwLmluZGljZXNbMF0sbGFzdFN0YXRlOnMsYXN0U3RhY2s6aX0pO2lmKGcpe3ZhciB5PWkuZ3JvdXBDb3VudGVyP2kuZ3JvdXBDb3VudGVyLmk6MDtkZWxldGUgaS5ncm91cENvdW50ZXIsaChpLHQsdC5sZW5ndGgpLGk9byhpKTt2YXIgbT1uZXcgbih7cmF3OnQsZ3JvdXBDb3VudDp5LHRyZWU6aX0pO3JldHVybiBtLnRyYXZlcnNlKGwsQ0hBUlNFVF9OT0RFKSxtLnRyYXZlcnNlKHUsQVNTRVJUX05PREUpLGMoaSksZD0hMSxtfX1mdW5jdGlvbiBhKCl7cmV0dXJuIGd8fChnPXQoRSxkKSksZ31mdW5jdGlvbiBzKHQsZSxyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpyLGVudW1lcmFibGU6ZCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiBvKHQpe3JldHVybiB0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlPT1FWEFDVF9OT0RFJiZ0LmNvbmNhdFRlbXA/KGRlbGV0ZSB0LmNvbmNhdFRlbXAsISF0LmNoYXJzKToodC5zdWI/dC5zdWI9byh0LnN1Yik6dC5icmFuY2hlcyYmKHQuYnJhbmNoZXM9dC5icmFuY2hlcy5tYXAobykpLCEwKX0pfWZ1bmN0aW9uIGModCl7ZnVuY3Rpb24gZSh0KXt0LnN1Yj9jKHQuc3ViKTp0LmJyYW5jaGVzJiZ0LmJyYW5jaGVzLm1hcChjKX12YXIgcj10WzBdO2Uocik7Zm9yKHZhciBuLGk9MSxhPTEscz10Lmxlbmd0aDtpPHM7aSsrKXtpZihuPXRbaV0sbi50eXBlPT09RVhBQ1RfTk9ERSl7aWYoci50eXBlPT09RVhBQ1RfTk9ERSYmIXIucmVwZWF0JiYhbi5yZXBlYXQpe3IuaW5kaWNlc1sxXT1uLmluZGljZXNbMV0sci5yYXcrPW4ucmF3LHIuY2hhcnMrPW4uY2hhcnM7Y29udGludWV9fWVsc2UgZShuKTt0W2ErK109bixyPW59ciYmKHQubGVuZ3RoPWEpfWZ1bmN0aW9uIGgodCxlLHIpe2lmKCF0Lmxlbmd0aClyZXR1cm4gdm9pZCB0LnB1c2goe3R5cGU6RU1QVFlfTk9ERSxpbmRpY2VzOltyLHJdfSk7dC5yZWR1Y2UoZnVuY3Rpb24odCxyKXtyZXR1cm4gci5pbmRpY2VzLnB1c2godCksci5yYXc9ZS5zbGljZShyLmluZGljZXNbMF0sdCksci50eXBlPT09R1JPVVBfTk9ERXx8ci50eXBlPT09QVNTRVJUX05PREUmJnIuc3ViP2goci5zdWIsZSxyLmVuZFBhcmVuSW5kZXgpOnIudHlwZT09PUNIT0lDRV9OT0RFPyhyLmJyYW5jaGVzLnJlZHVjZShmdW5jdGlvbih0LHIpe2gocixlLHQpO3ZhciBuPXJbMF07cmV0dXJuKG4/bi5pbmRpY2VzWzBdOnQpLTF9LHQpLHIuYnJhbmNoZXMucmV2ZXJzZSgpKTpyLnR5cGU9PT1FWEFDVF9OT0RFJiYoci5jb25jYXRUZW1wfHwoci5jaGFycz1yLmNoYXJzfHxyLnJhdykpLHIuaW5kaWNlc1swXX0sciksdC5yZXZlcnNlKCl9ZnVuY3Rpb24gdSh0KXtpZih0LnJlcGVhdCl7dmFyIGU9dC5hc3NlcnRpb25UeXBlLHI9Ik5vdGhpbmcgdG8gcmVwZWF0ISBSZXBlYXQgYWZ0ZXIgYXNzZXJ0aW9uIGRvZXNuJ3QgbWFrZSBzZW5zZSEiO2lmKCJBc3NlcnRMb29rYWhlYWQiPT09ZXx8IkFzc2VydE5lZ2F0aXZlTG9va2FoZWFkIj09PWUpe3ZhciBuPSJBc3NlcnRMb29rYWhlYWQiPT09ZT8iPz0iOiI/ISIsaT0iKCIrbisiYikiO3IrPSJcbi9hIitpKyIrL+OAgS9hIitpKyJ7MSxufS8gYXJlIHRoZSBzYW1lIGFzIC9hIitpKyIv44CCXG4vYSIraSsiKi/jgIEvYSIraSsiezAsbn0v44CBL2EiK2krIj8vIGFyZSB0aGUgc2FtZSBhcyAvYS/jgIIifXRocm93IG5ldyBmKHt0eXBlOiJOb3RoaW5nUmVwZWF0IixsYXN0SW5kZXg6dC5pbmRpY2VzWzFdLTEsbWVzc2FnZTpyfSl9fWZ1bmN0aW9uIGwodCl7dC5yYW5nZXM9ZS5zb3J0VW5pcXVlKHQucmFuZ2VzLm1hcChmdW5jdGlvbih0KXtpZih0WzBdPnRbMV0pdGhyb3cgbmV3IGYoe3R5cGU6Ik91dE9mT3JkZXIiLGxhc3RJbmRleDp0Lmxhc3RJbmRleCxtZXNzYWdlOiJSYW5nZSBbIit0LmpvaW4oIi0iKSsiXSBvdXQgb2Ygb3JkZXIgaW4gY2hhcmFjdGVyIGNsYXNzISJ9KTtyZXR1cm4gdC5qb2luKCIiKX0pKX1mdW5jdGlvbiBmKHQpe3RoaXMubmFtZT0iUmVnZXhTeW50YXhFcnJvciIsdGhpcy50eXBlPXQudHlwZSx0aGlzLmxhc3RJbmRleD10Lmxhc3RJbmRleCx0aGlzLmxhc3RTdGF0ZT10Lmxhc3RTdGF0ZSx0aGlzLmFzdFN0YWNrPXQuYXN0U3RhY2ssdGhpcy5tZXNzYWdlPXQubWVzc2FnZSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhY2siLHt2YWx1ZTpuZXcgRXJyb3IodC5tZXNzYWdlKS5zdGFjayxlbnVtZXJhYmxlOiExfSl9dmFyIHA9e0VYQUNUX05PREU6ImV4YWN0IixDSEFSU0VUX05PREU6ImNoYXJzZXQiLENIT0lDRV9OT0RFOiJjaG9pY2UiLEdST1VQX05PREU6Imdyb3VwIixBU1NFUlRfTk9ERToiYXNzZXJ0IixET1RfTk9ERToiZG90IixCQUNLUkVGX05PREU6ImJhY2tyZWYiLEVNUFRZX05PREU6ImVtcHR5IixBc3NlcnRMb29rYWhlYWQ6IkFzc2VydExvb2thaGVhZCIsQXNzZXJ0TmVnYXRpdmVMb29rYWhlYWQ6IkFzc2VydE5lZ2F0aXZlTG9va2FoZWFkIixBc3NlcnROb25Xb3JkQm91bmRhcnk6IkFzc2VydE5vbldvcmRCb3VuZGFyeSIsQXNzZXJ0V29yZEJvdW5kYXJ5OiJBc3NlcnRXb3JkQm91bmRhcnkiLEFzc2VydEVuZDoiQXNzZXJ0RW5kIixBc3NlcnRCZWdpbjoiQXNzZXJ0QmVnaW4ifTtyKCksbi5wcm90b3R5cGUudHJhdmVyc2U9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQsbil7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UmJnQudHlwZSE9PWV8fG4odCksdC5zdWI/cih0LnN1YixuKTp0LmJyYW5jaGVzJiZ0LmJyYW5jaGVzLmZvckVhY2goZnVuY3Rpb24odCl7cih0LG4pfSl9KX1yKHRoaXMudHJlZSx0KX07dmFyIGQ7aS5Db25zdGFudHM9cCxpLmV4cG9ydENvbnN0YW50cz1yLGkuUmVnZXhTeW50YXhFcnJvcj1mLGkuZ2V0TkZBUGFyc2VyPWE7dmFyIGc7Zi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lKyIgIit0aGlzLnR5cGUrIjoiK3RoaXMubWVzc2FnZX07dmFyIHg9e246IlxuIixyOiJcciIsdDoiXHQiLHY6Ilx2IixmOiJcZiJ9LHY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxyKXt2YXIgbj10WzBdOyghbnx8bi50eXBlIT1FWEFDVF9OT0RFfHxuLnJlcGVhdHx8bi5jaGFycyYmIW4uY29uY2F0VGVtcCkmJnQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGluZGljZXM6W3JdfSksbiYmbi5jb25jYXRUZW1wJiYobi5jaGFycys9ZSl9ZnVuY3Rpb24gZSh0LGUscil7dC51bnNoaWZ0KHt0eXBlOkRPVF9OT0RFLGluZGljZXM6W3JdfSl9ZnVuY3Rpb24gcih0LGUscil7dC51bnNoaWZ0KHt0eXBlOkVYQUNUX05PREUsY2hhcnM6IlwwIixpbmRpY2VzOltyLTFdfSl9ZnVuY3Rpb24gbih0LGUscil7dC51bnNoaWZ0KHt0eXBlOkFTU0VSVF9OT0RFLGluZGljZXM6W3JdLGFzc2VydGlvblR5cGU6QXNzZXJ0QmVnaW59KX1mdW5jdGlvbiBpKHQsZSxyLG4saSl7dC51bnNoaWZ0KHt0eXBlOkFTU0VSVF9OT0RFLGluZGljZXM6W3JdLGFzc2VydGlvblR5cGU6QXNzZXJ0RW5kfSl9ZnVuY3Rpb24gYSh0LGUscil7dC51bnNoaWZ0KHt0eXBlOkFTU0VSVF9OT0RFLGluZGljZXM6W3ItMV0sYXNzZXJ0aW9uVHlwZToiYiI9PWU/QXNzZXJ0V29yZEJvdW5kYXJ5OkFzc2VydE5vbldvcmRCb3VuZGFyeX0pfWZ1bmN0aW9uIG8odCxlLHIpe3RbMF0udHlwZSE9PUVYQUNUX05PREUmJnQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGluZGljZXM6W3JdfSl9ZnVuY3Rpb24gYyh0LGUscil7cyh0WzBdLCJfY29tbWFJbmRleCIscil9ZnVuY3Rpb24gaCh0LGUscixuLGkpe3ZhciBhLHM9dFswXSxvPWkubGFzdEluZGV4T2YoInsiLHIpLGM9cGFyc2VJbnQoaS5zbGljZShvKzEscy5fY29tbWFJbmRleHx8ciksMTApO2lmKHMuX2NvbW1hSW5kZXgpe2lmKChhPXMuX2NvbW1hSW5kZXgrMT09cj8xLzA6cGFyc2VJbnQoaS5zbGljZShzLl9jb21tYUluZGV4KzEsciksMTApKTxjKXRocm93IG5ldyBmKHt0eXBlOiJPdXRPZk9yZGVyIixsYXN0U3RhdGU6bixsYXN0SW5kZXg6cixhc3RTdGFjazp0LG1lc3NhZ2U6Ik51bWJlcnMgb3V0IG9mIG9yZGVyIGluIHt9IHF1YW50aWZpZXIhIn0pO2RlbGV0ZSBzLl9jb21tYUluZGV4fWVsc2UgYT1jO3MuaW5kaWNlc1swXT49byYmdC5zaGlmdCgpLGQodCxjLGEsbyxpKX1mdW5jdGlvbiB1KHQsZSxyLG4saSl7ZCh0LDAsMS8wLHIsaSl9ZnVuY3Rpb24gbCh0LGUscixuLGkpe2QodCwwLDEscixpKX1mdW5jdGlvbiBwKHQsZSxyLG4saSl7ZCh0LDEsMS8wLHIsaSl9ZnVuY3Rpb24gZCh0LGUscixuLGkpe3ZhciBhPXRbMF0sbz17bWluOmUsbWF4OnIsbm9uR3JlZWR5OiExfSxjPW4tMTtpZihhLmNoYXJzJiYxPT09YS5jaGFycy5sZW5ndGgmJihjPWEuaW5kaWNlc1swXSksYS50eXBlPT09RVhBQ1RfTk9ERSl7dmFyIGg9e3R5cGU6RVhBQ1RfTk9ERSxyZXBlYXQ6byxjaGFyczphLmNoYXJzP2EuY2hhcnM6aVtjXSxpbmRpY2VzOltjXX07YS5pbmRpY2VzWzBdPT09YyYmdC5zaGlmdCgpLHQudW5zaGlmdChoKX1lbHNlIGEucmVwZWF0PW87cyhvLCJiZWdpbkluZGV4IixuLXRbMF0uaW5kaWNlc1swXSl9ZnVuY3Rpb24gZyh0KXt0WzBdLnJlcGVhdC5ub25HcmVlZHk9ITB9ZnVuY3Rpb24gdih0LGUscil7dC51bnNoaWZ0KHtjb25jYXRUZW1wOiEwLHR5cGU6RVhBQ1RfTk9ERSxjaGFyczoiIixpbmRpY2VzOltyXX0pfWZ1bmN0aW9uIHkodCxlLHIpe3guaGFzT3duUHJvcGVydHkoZSkmJihlPXhbZV0pLHQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGNoYXJzOmUsaW5kaWNlczpbci0xXX0pfWZ1bmN0aW9uIG0odCxlLHIpe3QudW5zaGlmdCh7dHlwZTpDSEFSU0VUX05PREUsaW5kaWNlczpbci0xXSxjaGFyczoiIixyYW5nZXM6W10sY2xhc3NlczpbZV0sZXhjbHVkZTohMX0pfWZ1bmN0aW9uIGIodCxlLHIsbixpKXtlPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaVtyLTFdK2UsMTYpKSx0LnNoaWZ0KCksdC51bnNoaWZ0KHt0eXBlOkVYQUNUX05PREUsY2hhcnM6ZSxpbmRpY2VzOltyLTNdfSl9ZnVuY3Rpb24gXyh0LGUscixuLGkpe2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChpLnNsaWNlKHItMyxyKzEpLDE2KSksdC5zaGlmdCgpLHQudW5zaGlmdCh7dHlwZTpFWEFDVF9OT0RFLGNoYXJzOmUsaW5kaWNlczpbci01XX0pfWZ1bmN0aW9uIHcodCxlLHIpe3ZhciBuPXQuZ3JvdXBDb3VudGVyPXQuZ3JvdXBDb3VudGVyfHx7aTowfTtuLmkrKzt2YXIgaT17dHlwZTpHUk9VUF9OT0RFLG51bTpuLmksc3ViOltdLGluZGljZXM6W3JdLF9wYXJlbnRTdGFjazp0fTtyZXR1cm4gdD1pLnN1YixzKHQsIl9wYXJlbnRHcm91cCIsaSksdC5ncm91cENvdW50ZXI9bix0fWZ1bmN0aW9uIEUodCl7dmFyIGU9dC5fcGFyZW50R3JvdXA7ZS5ub25DYXB0dXJlPSEwLGUubnVtPXZvaWQgMCx0Lmdyb3VwQ291bnRlci5pLS19ZnVuY3Rpb24gQyh0LGUscil7dmFyIG49dC5fcGFyZW50R3JvdXA7bi50eXBlPUFTU0VSVF9OT0RFLG4uYXNzZXJ0aW9uVHlwZT0iPSI9PWU/QXNzZXJ0TG9va2FoZWFkOkFzc2VydE5lZ2F0aXZlTG9va2FoZWFkLG4ubnVtPXZvaWQgMCx0Lmdyb3VwQ291bnRlci5pLS19ZnVuY3Rpb24gayh0LGUscixuLGkpe3Q9QSh0KTt2YXIgYT10Ll9wYXJlbnRHcm91cDtpZighYSl0aHJvdyBuZXcgZih7dHlwZToiVW5leHBlY3RlZENoYXIiLGxhc3RJbmRleDpyLGxhc3RTdGF0ZTpuLGFzdFN0YWNrOnQsbWVzc2FnZToiVW5leHBlY3RlZCBlbmQgcGFyZW50aGVzaXMhIn0pO3JldHVybiBkZWxldGUgdC5fcGFyZW50R3JvdXAsZGVsZXRlIHQuZ3JvdXBDb3VudGVyLHQ9YS5fcGFyZW50U3RhY2ssZGVsZXRlIGEuX3BhcmVudFN0YWNrLHQudW5zaGlmdChhKSxhLmVuZFBhcmVuSW5kZXg9cix0fWZ1bmN0aW9uIFModCxlLHIpe3ZhciBuLGk9W107aWYodC5fcGFyZW50Q2hvaWNlKW49dC5fcGFyZW50Q2hvaWNlLG4uYnJhbmNoZXMudW5zaGlmdChpKSxzKGksIl9wYXJlbnRDaG9pY2UiLG4pLHMoaSwiX3BhcmVudEdyb3VwIixuKSxpLmdyb3VwQ291bnRlcj10Lmdyb3VwQ291bnRlcixkZWxldGUgdC5fcGFyZW50Q2hvaWNlLGRlbGV0ZSB0Lmdyb3VwQ291bnRlcjtlbHNle3ZhciBhPXRbdC5sZW5ndGgtMV07bj17dHlwZTpDSE9JQ0VfTk9ERSxpbmRpY2VzOlthP2EuaW5kaWNlc1swXTpyLTFdLGJyYW5jaGVzOltdfSxzKG4sIl9wYXJlbnRTdGFjayIsdCksbi5icmFuY2hlcy51bnNoaWZ0KHQuc2xpY2UoKSksdC5sZW5ndGg9MCx0LnVuc2hpZnQobiksaS5ncm91cENvdW50ZXI9dC5ncm91cENvdW50ZXIscyhpLCJfcGFyZW50Q2hvaWNlIixuKSxzKGksIl9wYXJlbnRHcm91cCIsbiksbi5icmFuY2hlcy51bnNoaWZ0KGkpfXJldHVybiBpfWZ1bmN0aW9uIEEodCl7aWYodC5fcGFyZW50Q2hvaWNlKXt2YXIgZT10Ll9wYXJlbnRDaG9pY2U7ZGVsZXRlIHQuX3BhcmVudENob2ljZSxkZWxldGUgdC5fcGFyZW50R3JvdXAsZGVsZXRlIHQuZ3JvdXBDb3VudGVyO3ZhciByPWUuX3BhcmVudFN0YWNrO3JldHVybiBkZWxldGUgZS5fcGFyZW50U3RhY2sscn1yZXR1cm4gdH1mdW5jdGlvbiBCKHQsZSxyKXt0LnVuc2hpZnQoe3R5cGU6Q0hBUlNFVF9OT0RFLGluZGljZXM6W3JdLGNsYXNzZXM6W10scmFuZ2VzOltdLGNoYXJzOiIifSl9ZnVuY3Rpb24gTih0KXt0WzBdLmV4Y2x1ZGU9ITB9ZnVuY3Rpb24gTyh0LGUscil7dFswXS5jaGFycys9ZX1mdW5jdGlvbiBUKHQsZSxyKXt4Lmhhc093blByb3BlcnR5KGUpJiYoZT14W2VdKSx0WzBdLmNoYXJzKz1lfWZ1bmN0aW9uIFIodCxlLHIpe3RbMF0uY2hhcnMrPSJcMCJ9ZnVuY3Rpb24gSSh0LGUpe3RbMF0uY2xhc3Nlcy5wdXNoKGUpfWZ1bmN0aW9uIE0odCxlLHIsbixpKXt2YXIgYT10WzBdO2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChhLmNoYXJzLnNsaWNlKC0xKStlLDE2KSksYS5jaGFycz1hLmNoYXJzLnNsaWNlKDAsLTIpLGEuY2hhcnMrPWV9ZnVuY3Rpb24gRih0LGUscixuLGkpe3ZhciBhPXRbMF07ZT1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGEuY2hhcnMuc2xpY2UoLTMpK2UsMTYpKSxhLmNoYXJzPWEuY2hhcnMuc2xpY2UoMCwtNCksYS5jaGFycys9ZX1mdW5jdGlvbiBEKHQsZSxyLG4saSl7dmFyIGE9dFswXSxzPWEuY2hhcnMuc2xpY2UoLTIpO3M9W3NbMF0sZV0scy5sYXN0SW5kZXg9cixhLnJhbmdlcy5wdXNoKHMpLGEuY2hhcnM9YS5jaGFycy5zbGljZSgwLC0yKX1mdW5jdGlvbiBQKHQsZSl7eC5oYXNPd25Qcm9wZXJ0eShlKSYmKGU9eFtlXSksRC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gTCh0LGUscil7dmFyIG49dFswXSxpPW4uY2hhcnMuc2xpY2UoLTMpK2U7bi5jaGFycz1uLmNoYXJzLnNsaWNlKDAsLTMpO3ZhciBhPW4ucmFuZ2VzLnBvcCgpO2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChpLDE2KSksYT1bYVswXSxlXSxhLmxhc3RJbmRleD1yLG4ucmFuZ2VzLnB1c2goYSl9ZnVuY3Rpb24geih0LGUscil7dmFyIG49dFswXSxpPW4uY2hhcnMuc2xpY2UoLTEpK2U7bi5jaGFycz1uLmNoYXJzLnNsaWNlKDAsLTEpO3ZhciBhPW4ucmFuZ2VzLnBvcCgpO2U9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChpLDE2KSksYT1bYVswXSxlXSxhLmxhc3RJbmRleD1yLG4ucmFuZ2VzLnB1c2goYSl9ZnVuY3Rpb24gaih0LGUscixuKXtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuISFlLl9wYXJlbnRHcm91cCYmKGUuX3BhcmVudEdyb3VwLm51bT09dD90OmkodCxlLl9wYXJlbnRHcm91cC5fcGFyZW50U3RhY2spKX12YXIgYT10WzBdLHM9cGFyc2VJbnQoZSwxMCksbz0iZXNjYXBlIj09PW4sYz10Lmdyb3VwQ291bnRlcixoPWMmJmMuaXx8MDtpZihvPyhhPXt0eXBlOkJBQ0tSRUZfTk9ERSxpbmRpY2VzOltyLTFdfSx0LnVuc2hpZnQoYSkpOnM9cGFyc2VJbnQoYS5udW0rIiIrcywxMCkscz5oKXRocm93IG5ldyBmKHt0eXBlOiJJbnZhbGlkQmFja1JlZmVyZW5jZSIsbGFzdEluZGV4OnIsYXN0U3RhY2s6dCxsYXN0U3RhdGU6bixtZXNzYWdlOiJCYWNrIHJlZmVyZW5jZSBudW1iZXIoIitzKyIpIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGdyb3VwcyBjb3VudCgiK2grIikuIn0pO2lmKGkocyx0KSl0aHJvdyBuZXcgZih7dHlwZToiSW52YWxpZEJhY2tSZWZlcmVuY2UiLGxhc3RJbmRleDpyLGFzdFN0YWNrOnQsbGFzdFN0YXRlOm4sbWVzc2FnZToiUmVjdXJzaXZlIGJhY2sgcmVmZXJlbmNlIGluIGdyb3VwICgiK3MrIikgaXRzZWxmLiJ9KTthLm51bT1zfXJldHVybntlc2NhcGVTdGFydDp2LGV4YWN0OnQsZG90OmUsbnVsbENoYXI6cixhc3NlcnRCZWdpbjpuLGFzc2VydEVuZDppLGFzc2VydFdvcmRCb3VuZGFyeTphLHJlcGVhdG5TdGFydDpvLHJlcGVhdG5Db21tYTpjLHJlcGVhdE5vbkdyZWVkeTpnLHJlcGVhdG5FbmQ6aCxyZXBlYXQxOnAscmVwZWF0MDE6bCxyZXBlYXQwOnUsY2hhckNsYXNzRXNjYXBlOm0sbm9ybWFsRXNjYXBlOnksdW5pY29kZUVzY2FwZTpfLGhleEVzY2FwZTpiLGNoYXJDbGFzc0VzY2FwZTptLGdyb3VwU3RhcnQ6dyxncm91cE5vbkNhcHR1cmU6RSxiYWNrcmVmOmosZ3JvdXBUb0Fzc2VydGlvbjpDLGdyb3VwRW5kOmssY2hvaWNlOlMsZW5kQ2hvaWNlOkEsY2hhcnNldFN0YXJ0OkIsY2hhcnNldEV4Y2x1ZGU6TixjaGFyc2V0Q29udGVudDpPLGNoYXJzZXROdWxsQ2hhcjpSLGNoYXJzZXRDbGFzc0VzY2FwZTpJLGNoYXJzZXRIZXhFc2NhcGU6TSxjaGFyc2V0VW5pY29kZUVzY2FwZTpGLGNoYXJzZXRSYW5nZUVuZDpELGNoYXJzZXROb3JtYWxFc2NhcGU6VCxjaGFyc2V0UmFuZ2VFbmROb3JtYWxFc2NhcGU6UCxjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlOkwsY2hhcnNldFJhbmdlRW5kSGV4RXNjYXBlOnp9fSgpLHk9IjAtOWEtZkEtRiIsbT0icmVwZWF0blN0YXJ0LHJlcGVhdG5fMSxyZXBlYXRuXzIscmVwZWF0bkVycm9yU3RhcnQscmVwZWF0bkVycm9yXzEscmVwZWF0bkVycm9yXzIiLGI9ImhleEVzY2FwZTEsaGV4RXNjYXBlMiIsXz0idW5pY29kZUVzY2FwZTEsdW5pY29kZUVzY2FwZTIsdW5pY29kZUVzY2FwZTMsdW5pY29kZUVzY2FwZTQiLHc9ImNoYXJzZXRVbmljb2RlRXNjYXBlMSxjaGFyc2V0VW5pY29kZUVzY2FwZTIsY2hhcnNldFVuaWNvZGVFc2NhcGUzLGNoYXJzZXRVbmljb2RlRXNjYXBlNCxjaGFyc2V0SGV4RXNjYXBlMSxjaGFyc2V0SGV4RXNjYXBlMiIsRT17Y29tcGFjdDohMCxhY2NlcHRzOiJzdGFydCxiZWdpbixlbmQscmVwZWF0MCxyZXBlYXQxLGV4YWN0LHJlcGVhdG4scmVwZWF0MDEscmVwZWF0Tm9uR3JlZWR5LGNob2ljZSwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiLHRyYW5zOltbInN0YXJ0LGJlZ2luLGVuZCxleGFjdCxyZXBlYXROb25HcmVlZHkscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxjaG9pY2UscmVwZWF0bj5leGFjdCIsIl4rKj9eJC58KCl7W1xcIix2LmV4YWN0XSxbImhleEVzY2FwZTEsaGV4RXNjYXBlMix1bmljb2RlRXNjYXBlMSx1bmljb2RlRXNjYXBlMix1bmljb2RlRXNjYXBlMyx1bmljb2RlRXNjYXBlND5leGFjdCIsIl4rKj9eJC58KCl7W1xcMC05YS1mQS1GIix2LmV4YWN0XSxbIm51bGxDaGFyPmV4YWN0IiwiXisqP14kLnwoKXtbXFwwLTkiLHYuZXhhY3RdLFttKyIsbnVsbENoYXIsZGlnaXRCYWNrcmVmLCIrXysiLCIrYisiLHN0YXJ0LGJlZ2luLGVuZCxleGFjdCxyZXBlYXROb25HcmVlZHkscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxjaG9pY2UscmVwZWF0bj5leGFjdCIsIi4iLHYuZG90XSxbInN0YXJ0LGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxlbmQsYmVnaW4sZXhhY3QscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLHJlcGVhdG4scmVwZWF0Tm9uR3JlZWR5LGNob2ljZSwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+YmVnaW4iLCJeIix2LmFzc2VydEJlZ2luXSxbbSsiLG51bGxDaGFyLGRpZ2l0QmFja3JlZiwiK18rIiwiK2IrIixleGFjdD5yZXBlYXRuU3RhcnQiLCJ7Iix2LnJlcGVhdG5TdGFydF0sWyJzdGFydCxiZWdpbixlbmQsZ3JvdXBRdWFsaWZpZWRTdGFydCxncm91cFN0YXJ0LHJlcGVhdDAscmVwZWF0MSxyZXBlYXRuLHJlcGVhdDAxLHJlcGVhdE5vbkdyZWVkeSxjaG9pY2U+cmVwZWF0bkVycm9yU3RhcnQiLCJ7Iix2LmV4YWN0XSxbInJlcGVhdG5TdGFydD5yZXBlYXRuXzEiLCIwLTkiLHYuZXhhY3RdLFsicmVwZWF0bl8xPnJlcGVhdG5fMSIsIjAtOSIsdi5leGFjdF0sWyJyZXBlYXRuXzE+cmVwZWF0bl8yIiwiLCIsdi5yZXBlYXRuQ29tbWFdLFsicmVwZWF0bl8yPnJlcGVhdG5fMiIsIjAtOSIsdi5leGFjdF0sWyJyZXBlYXRuXzEscmVwZWF0bl8yPnJlcGVhdG4iLCJ9Iix2LnJlcGVhdG5FbmRdLFsicmVwZWF0blN0YXJ0LHJlcGVhdG5FcnJvclN0YXJ0PmV4YWN0IiwifSIsdi5leGFjdF0sWyJyZXBlYXRuU3RhcnQscmVwZWF0bkVycm9yU3RhcnQ+ZXhhY3QiLCJeKyo/XiQufCgpe1tcXDAtOX0iLHYuZXhhY3RdLFsicmVwZWF0bkVycm9yU3RhcnQ+cmVwZWF0bkVycm9yXzEiLCIwLTkiLHYuZXhhY3RdLFsicmVwZWF0bkVycm9yXzE+cmVwZWF0bkVycm9yXzEiLCIwLTkiLHYuZXhhY3RdLFsicmVwZWF0bkVycm9yXzE+cmVwZWF0bkVycm9yXzIiLCIsIix2LmV4YWN0XSxbInJlcGVhdG5FcnJvcl8yPnJlcGVhdG5FcnJvcl8yIiwiMC05Iix2LmV4YWN0XSxbInJlcGVhdG5FcnJvcl8yLHJlcGVhdG5FcnJvcl8xPnJlcGVhdEVycm9yRmluYWwiLCJ9Il0sWyJyZXBlYXRuXzEscmVwZWF0bkVycm9yXzE+ZXhhY3QiLCJeKyo/XiQufCgpe1tcXDAtOSx9Iix2LmV4YWN0XSxbInJlcGVhdG5fMixyZXBlYXRuRXJyb3JfMj5leGFjdCIsIl4rKj9eJC58KCl7W1xcMC05fSIsdi5leGFjdF0sWyJleGFjdCwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+cmVwZWF0MCIsIioiLHYucmVwZWF0MF0sWyJleGFjdCwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+cmVwZWF0MSIsIisiLHYucmVwZWF0MV0sWyJleGFjdCwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+cmVwZWF0MDEiLCI/Iix2LnJlcGVhdDAxXSxbImNob2ljZT5yZXBlYXRFcnJvckZpbmFsIiwiKis/Il0sWyJyZXBlYXQwLHJlcGVhdDEscmVwZWF0MDEscmVwZWF0bj5yZXBlYXROb25HcmVlZHkiLCI/Iix2LnJlcGVhdE5vbkdyZWVkeV0sWyJyZXBlYXQwLHJlcGVhdDEscmVwZWF0MDEscmVwZWF0bj5yZXBlYXRFcnJvckZpbmFsIiwiKyoiXSxbInN0YXJ0LGJlZ2luLGVuZCxncm91cFN0YXJ0LGdyb3VwUXVhbGlmaWVkU3RhcnQsZXhhY3QscmVwZWF0Tm9uR3JlZWR5LHJlcGVhdDAscmVwZWF0MSxyZXBlYXQwMSxyZXBlYXRuLGNob2ljZSwiK20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyI+ZXNjYXBlIiwiXFwiLHYuZXNjYXBlU3RhcnRdLFsiZXNjYXBlPm51bGxDaGFyIiwiMCIsdi5udWxsQ2hhcl0sWyJudWxsQ2hhcj5kaWdpdEZvbGxvd051bGxFcnJvciIsIjAtOSJdLFsiZXNjYXBlPmV4YWN0IiwiXmREd1dzU3V4MC05YkIxLTkiLHYubm9ybWFsRXNjYXBlXSxbImVzY2FwZT5leGFjdCIsImJCIix2LmFzc2VydFdvcmRCb3VuZGFyeV0sWyJlc2NhcGU+ZXhhY3QiLCJkRHdXc1MiLHYuY2hhckNsYXNzRXNjYXBlXSxbImVzY2FwZT51bmljb2RlRXNjYXBlMSIsInUiLHYuZXhhY3RdLFsidW5pY29kZUVzY2FwZTE+dW5pY29kZUVzY2FwZTIiLHksdi5leGFjdF0sWyJ1bmljb2RlRXNjYXBlMj51bmljb2RlRXNjYXBlMyIseSx2LmV4YWN0XSxbInVuaWNvZGVFc2NhcGUzPnVuaWNvZGVFc2NhcGU0Iix5LHYuZXhhY3RdLFsidW5pY29kZUVzY2FwZTQ+ZXhhY3QiLHksdi51bmljb2RlRXNjYXBlXSxbImVzY2FwZT5oZXhFc2NhcGUxIiwieCIsdi5leGFjdF0sWyJoZXhFc2NhcGUxPmhleEVzY2FwZTIiLHksdi5leGFjdF0sWyJoZXhFc2NhcGUyPmV4YWN0Iix5LHYuaGV4RXNjYXBlXSxbImVzY2FwZT5kaWdpdEJhY2tyZWYiLCIxLTkiLHYuYmFja3JlZl0sWyJkaWdpdEJhY2tyZWY+ZGlnaXRCYWNrcmVmIiwiMC05Iix2LmJhY2tyZWZdLFsiZGlnaXRCYWNrcmVmPmV4YWN0IiwiXisqP14kLnwoKXtbXFwwLTkiLHYuZXhhY3RdLFsiZXhhY3QsYmVnaW4sZW5kLHJlcGVhdDAscmVwZWF0MSxyZXBlYXQwMSxyZXBlYXRuLHJlcGVhdE5vbkdyZWVkeSxzdGFydCxncm91cFN0YXJ0LGdyb3VwUXVhbGlmaWVkU3RhcnQsY2hvaWNlLCIrbSsiLG51bGxDaGFyLGRpZ2l0QmFja3JlZiwiK18rIiwiK2IrIj5ncm91cFN0YXJ0IiwiKCIsdi5ncm91cFN0YXJ0XSxbImdyb3VwU3RhcnQ+Z3JvdXBRdWFsaWZ5IiwiPyJdLFsiZ3JvdXBRdWFsaWZ5Pmdyb3VwUXVhbGlmaWVkU3RhcnQiLCI6Iix2Lmdyb3VwTm9uQ2FwdHVyZV0sWyJncm91cFF1YWxpZnk+Z3JvdXBRdWFsaWZpZWRTdGFydCIsIj0iLHYuZ3JvdXBUb0Fzc2VydGlvbl0sWyJncm91cFF1YWxpZnk+Z3JvdXBRdWFsaWZpZWRTdGFydCIsIiEiLHYuZ3JvdXBUb0Fzc2VydGlvbl0sW20rIixudWxsQ2hhcixkaWdpdEJhY2tyZWYsIitfKyIsIitiKyIsZ3JvdXBTdGFydCxncm91cFF1YWxpZmllZFN0YXJ0LGJlZ2luLGVuZCxleGFjdCxyZXBlYXQxLHJlcGVhdDAscmVwZWF0MDEscmVwZWF0bixyZXBlYXROb25HcmVlZHksY2hvaWNlPmV4YWN0IiwiKSIsdi5ncm91cEVuZF0sWyJzdGFydCxiZWdpbixlbmQsZ3JvdXBTdGFydCxncm91cFF1YWxpZmllZFN0YXJ0LGV4YWN0LHJlcGVhdDAscmVwZWF0MSxyZXBlYXQwMSxyZXBlYXRuLHJlcGVhdE5vbkdyZWVkeSxjaG9pY2UsIittKyIsbnVsbENoYXIsZGlnaXRCYWNrcmVmLCIrXysiLCIrYisiPmNob2ljZSIsInwiLHYuY2hvaWNlXSxbInN0YXJ0LGdyb3VwU3RhcnQsZ3JvdXBRdWFsaWZpZWRTdGFydCxiZWdpbixleGFjdCxyZXBlYXQwLHJlcGVhdDEscmVwZWF0MDEscmVwZWF0bixyZXBlYXROb25HcmVlZHksY2hvaWNlLCIrbSsiLG51bGxDaGFyLGRpZ2l0QmFja3JlZiwiK18rIiwiK2IrIj5lbmQiLCIkIix2LmFzc2VydEVuZF0sWyJleGFjdCxiZWdpbixlbmQscmVwZWF0MCxyZXBlYXQxLHJlcGVhdDAxLHJlcGVhdG4scmVwZWF0Tm9uR3JlZWR5LGdyb3VwUXVhbGlmaWVkU3RhcnQsZ3JvdXBTdGFydCxzdGFydCxjaG9pY2UsIittKyIsbnVsbENoYXIsZGlnaXRCYWNrcmVmLCIrXysiLCIrYisiPmNoYXJzZXRTdGFydCIsIlsiLHYuY2hhcnNldFN0YXJ0XSxbImNoYXJzZXRTdGFydD5jaGFyc2V0RXhjbHVkZSIsIl4iLHYuY2hhcnNldEV4Y2x1ZGVdLFsiY2hhcnNldFN0YXJ0PmNoYXJzZXRDb250ZW50IiwiXlxcXV4iLHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldEV4Y2x1ZGU+Y2hhcnNldENvbnRlbnQiLCJeXFxdIix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRDb250ZW50LGNoYXJzZXRDbGFzcz5jaGFyc2V0Q29udGVudCIsIl5cXF0tIix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRDbGFzcz5jaGFyc2V0Q29udGVudCIsIi0iLHYuY2hhcnNldENvbnRlbnRdLFt3KyIsY2hhcnNldFN0YXJ0LGNoYXJzZXRDb250ZW50LGNoYXJzZXROdWxsQ2hhcixjaGFyc2V0Q2xhc3MsY2hhcnNldEV4Y2x1ZGUsY2hhcnNldFJhbmdlRW5kPmNoYXJzZXRFc2NhcGUiLCJcXCJdLFsiY2hhcnNldEVzY2FwZT5jaGFyc2V0Q29udGVudCIsIl5kRHdXc1N1eDAtOSIsdi5jaGFyc2V0Tm9ybWFsRXNjYXBlXSxbImNoYXJzZXRFc2NhcGU+Y2hhcnNldE51bGxDaGFyIiwiMCIsdi5jaGFyc2V0TnVsbENoYXJdLFsiY2hhcnNldEVzY2FwZT5jaGFyc2V0T2N0RXNjYXBlIiwiMS05Il0sWyJjaGFyc2V0UmFuZ2VFbmRFc2NhcGU+Y2hhcnNldE9jdEVzY2FwZSIsIjEtOSJdLFsiY2hhcnNldE51bGxDaGFyPmRpZ2l0Rm9sbG93TnVsbEVycm9yIiwiMC05Il0sWyJjaGFyc2V0TnVsbENoYXI+Y2hhcnNldENvbnRlbnQiLCJeMC05XFxdLSIsdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0RXNjYXBlPmNoYXJzZXRDbGFzcyIsImREd1dzUyIsdi5jaGFyc2V0Q2xhc3NFc2NhcGVdLFsiY2hhcnNldEVzY2FwZT5jaGFyc2V0VW5pY29kZUVzY2FwZTEiLCJ1Iix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRVbmljb2RlRXNjYXBlMT5jaGFyc2V0VW5pY29kZUVzY2FwZTIiLHksdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0VW5pY29kZUVzY2FwZTI+Y2hhcnNldFVuaWNvZGVFc2NhcGUzIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldFVuaWNvZGVFc2NhcGUzPmNoYXJzZXRVbmljb2RlRXNjYXBlNCIseSx2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRVbmljb2RlRXNjYXBlND5jaGFyc2V0Q29udGVudCIseSx2LmNoYXJzZXRVbmljb2RlRXNjYXBlXSxbImNoYXJzZXRFc2NhcGU+Y2hhcnNldEhleEVzY2FwZTEiLCJ4Iix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRIZXhFc2NhcGUxPmNoYXJzZXRIZXhFc2NhcGUyIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldEhleEVzY2FwZTI+Y2hhcnNldENvbnRlbnQiLHksdi5jaGFyc2V0SGV4RXNjYXBlXSxbdysiPmNoYXJzZXRDb250ZW50IiwiXlxcXTAtOWEtZkEtRi0iLHYuY2hhcnNldENvbnRlbnRdLFt3KyIsY2hhcnNldE51bGxDaGFyLGNoYXJzZXRDb250ZW50PmNoYXJzZXRSYW5nZVN0YXJ0IiwiLSIsdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0UmFuZ2VTdGFydD5jaGFyc2V0UmFuZ2VFbmQiLCJeXFxdIix2LmNoYXJzZXRSYW5nZUVuZF0sWyJjaGFyc2V0UmFuZ2VFbmQ+Y2hhcnNldENvbnRlbnQiLCJeXFxdIix2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRSYW5nZVN0YXJ0PmNoYXJzZXRSYW5nZUVuZEVzY2FwZSIsIlxcIl0sWyJjaGFyc2V0UmFuZ2VFbmRFc2NhcGU+Y2hhcnNldFJhbmdlRW5kIiwiXmREd1dzU3V4MC05YkIxLTkiLHYuY2hhcnNldFJhbmdlRW5kTm9ybWFsRXNjYXBlXSxbImNoYXJzZXRSYW5nZUVuZEVzY2FwZT5jaGFyc2V0UmFuZ2VFbmRXaXRoTnVsbENoYXIiLCIwIl0sWyJjaGFyc2V0UmFuZ2VFbmRFc2NhcGU+Y2hhcnNldFJhbmdlRW5kVW5pY29kZUVzY2FwZTEiLCJ1Iix2LmNoYXJzZXRSYW5nZUVuZF0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMT5jaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMiIseSx2LmNoYXJzZXRDb250ZW50XSxbImNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUyPmNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUzIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldFJhbmdlRW5kVW5pY29kZUVzY2FwZTM+Y2hhcnNldFJhbmdlRW5kVW5pY29kZUVzY2FwZTQiLHksdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlND5jaGFyc2V0UmFuZ2VFbmQiLHksdi5jaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlXSxbImNoYXJzZXRSYW5nZUVuZEVzY2FwZT5jaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUxIiwieCIsdi5jaGFyc2V0UmFuZ2VFbmRdLFsiY2hhcnNldFJhbmdlRW5kSGV4RXNjYXBlMT5jaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUyIix5LHYuY2hhcnNldENvbnRlbnRdLFsiY2hhcnNldFJhbmdlRW5kSGV4RXNjYXBlMj5jaGFyc2V0UmFuZ2VFbmQiLHksdi5jaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGVdLFsiY2hhcnNldFJhbmdlRW5kRXNjYXBlPmNoYXJzZXRSYW5nZUVuZENsYXNzIiwiZER3V3NTIl0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMSxjaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUxPmNoYXJzZXRDb250ZW50IiwiXlxcXTAtOWEtZkEtRiIsdi5jaGFyc2V0Q29udGVudF0sWyJjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMixjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMyxjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlNCxjaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUyPmNoYXJzZXRSYW5nZVN0YXJ0IiwiLSIsdi5jaGFyc2V0Q29udGVudF0sW3crIixjaGFyc2V0UmFuZ2VFbmRVbmljb2RlRXNjYXBlMSxjaGFyc2V0UmFuZ2VFbmRIZXhFc2NhcGUxLGNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUyLGNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGUzLGNoYXJzZXRSYW5nZUVuZFVuaWNvZGVFc2NhcGU0LGNoYXJzZXRSYW5nZUVuZEhleEVzY2FwZTIsY2hhcnNldE51bGxDaGFyLGNoYXJzZXRSYW5nZVN0YXJ0LGNoYXJzZXRDb250ZW50LGNoYXJzZXRDbGFzcyxjaGFyc2V0RXhjbHVkZSxjaGFyc2V0UmFuZ2VFbmQ+ZXhhY3QiLCJdIl1dfTtyZXR1cm4gaX0pLCJmdW5jdGlvbiIhPXR5cGVvZiBkZWZpbmUpdmFyIGRlZmluZT1yZXF1aXJlKCJhbWRlZmluZSIpKG1vZHVsZSk7aWYoZGVmaW5lKCJSZWdFeHAiLFsiLi9wYXJzZSIsIi4vS2l0IiwiLi9ORkEiXSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbihlLHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG4pKXJldHVybiBuZXcgbihlLHIpO2UrPSIiO3ZhciBvPXt9OyJzdHJpbmciPT10eXBlb2Ygcj8ocj1yLnRvTG93ZXJDYXNlKCksfnIuaW5kZXhPZigiaSIpJiYoby5pZ25vcmVDYXNlPSEwKSx+ci5pbmRleE9mKCJtIikmJihvLm11bHRpbGluZT0hMCksfnIuaW5kZXhPZigiZyIpJiYoby5nbG9iYWw9ITApLH5yLmluZGV4T2YoImQiKSYmKG8uZGVidWc9ITApKTpvPXI7dmFyIGM9dGhpcy5hc3Q9dChlKTt0aGlzLnNvdXJjZT1lLHRoaXMubXVsdGlsaW5lPSEhby5tdWx0aWxpbmUsdGhpcy5nbG9iYWw9ISFvLmdsb2JhbCx0aGlzLmlnbm9yZUNhc2U9ISFvLmlnbm9yZUNhc2UsdGhpcy5kZWJ1Zz0hIW8uZGVidWcsdGhpcy5mbGFncz0iIix0aGlzLm11bHRpbGluZSYmKHRoaXMuZmxhZ3MrPSJtIiksdGhpcy5pZ25vcmVDYXNlJiYodGhpcy5mbGFncys9ImkiKSx0aGlzLmdsb2JhbCYmKHRoaXMuZmxhZ3MrPSJnIikscCh0aGlzLFsic291cmNlIiwib3B0aW9ucyIsIm11bHRpbGluZSIsImdsb2JhbCIsImlnbm9yZUNhc2UiLCJmbGFncyIsImRlYnVnIl0pO3ZhciBoPXRoaXMuaWdub3JlQ2FzZTtjLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3ModCxoKX0sQ0hBUlNFVF9OT0RFKSxjLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe2kodCxoKX0sRVhBQ1RfTk9ERSksdGhpcy5tdWx0aWxpbmUmJmMudHJhdmVyc2UoYSxBU1NFUlRfTk9ERSl9ZnVuY3Rpb24gaSh0LGUpe3ZhciByO3I9dC5jaGFycy5zcGxpdCgiIikscj1lP3IubWFwKGZ1bmN0aW9uKHQpe3JldHVybi9bYS16XS8udGVzdCh0KT9bdCx0LnRvVXBwZXJDYXNlKCldOi9bQS1aXS8udGVzdCh0KT9bdCx0LnRvTG93ZXJDYXNlKCldOlt0XX0pOnIubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pLHQuZXhwbGFpbmVkPXJ9ZnVuY3Rpb24gYSh0KXt2YXIgZT10LmFzc2VydGlvblR5cGU7ZSE9PUFzc2VydEJlZ2luJiZlIT09QXNzZXJ0RW5kfHwodC5tdWx0aWxpbmU9ITApfWZ1bmN0aW9uIHModCxyKXt2YXIgbj10LmNoYXJzLnNwbGl0KCIiKTtuPW4uY29uY2F0KGUuZmxhdHRlbjIodC5jbGFzc2VzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZ1t0XX0pKSksbj1uLmNvbmNhdCh0LnJhbmdlcyksciYmKG49byhuKSksbj1lLmNsYXNzaWZ5KG4pLnJhbmdlcyx0LmV4Y2x1ZGUmJihuPWUubmVnYXRlKG4pKSxuPWUuY29hbGVzY2UobiksdC5leHBsYWluZWQ9bn1mdW5jdGlvbiBvKHQpe3JldHVybiBlLmZsYXR0ZW4yKHQubWFwKGZ1bmN0aW9uKHQpe3ZhciByPWUuY2xhc3NpZnkoW3QsImF6IiwiQVoiXSkubWFwW3RdO3JldHVybiBlLmZsYXR0ZW4yKHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybi9bYS16XS8udGVzdCh0KT9bdCx0LnRvVXBwZXJDYXNlKCldOi9bQS1aXS8udGVzdCh0KT9bdCx0LnRvTG93ZXJDYXNlKCldOlt0XX0pKX0pKX1mdW5jdGlvbiBjKHQsZSl7dmFyIHIsbj1bXTtyZXR1cm4gZT1lfHxbInN0YXJ0Il0scj10LnJlZHVjZShmdW5jdGlvbih0LGUpe3ZhciByPWgoZSx0KTtyZXR1cm4gbj1uLmNvbmNhdChyLnRyYW5zKSxyLmFjY2VwdHN9LGUpLHthY2NlcHRzOnIsdHJhbnM6bn19ZnVuY3Rpb24gaCh0LGUpe3JldHVybiB0LnJlcGVhdD9mKHQsZSk6bVt0LnR5cGVdKHQsZSl9ZnVuY3Rpb24gdSh0LGUscil7Zm9yKHZhciBuLGksYSxzPTAsbz10Lmxlbmd0aDtzPG87cysrKWlmKGE9dFtzXSxhLm51bT09PWUpaWYoYS50eXBlPT09eSlpPWEuaW5kZXg7ZWxzZSBpZihhLnR5cGU9PT12KXtuPWEuaW5kZXg7YnJlYWt9aWYodm9pZCAwIT09biYmdm9pZCAwIT09aSlyZXR1cm4gci5zbGljZShuLGkpfWZ1bmN0aW9uIGwoKXtyZXR1cm4icSIreCsrfWZ1bmN0aW9uIGYodCxlKXt2YXIgcixuLGk9bVt0LnR5cGVdLGE9W10scz10LnJlcGVhdCxvPXMubWluLGM9cy5tYXg7Zm9yKG49bztuLS07KXI9aSh0LGUpLGE9YS5jb25jYXQoci50cmFucyksZT1yLmFjY2VwdHM7dmFyIGg9W10sdT1bXS5jb25jYXQoZSk7aWYoaXNGaW5pdGUoYykpZm9yKDtjPm87Yy0tKXI9aSh0LGUpLGg9aC5jb25jYXQoci50cmFucyksZT1yLmFjY2VwdHMsdT11LmNvbmNhdChyLmFjY2VwdHMpO2Vsc2V7dmFyIGY9ZS5zbGljZSgpO3I9aSh0LGUpLGg9aC5jb25jYXQoci50cmFucyksdT11LmNvbmNhdChyLmFjY2VwdHMpLGgucHVzaCh7ZnJvbTpyLmFjY2VwdHMsdG86ZixjaGFyc2V0OiExfSl9dmFyIHA9W2woKV07cmV0dXJuIHMubm9uR3JlZWR5PyhhLnB1c2goe2Zyb206dSx0bzpwLGNoYXJzZXQ6ITF9KSxhPWEuY29uY2F0KGgpKTooYT1hLmNvbmNhdChoKSxhLnB1c2goe2Zyb206dSx0bzpwLGNoYXJzZXQ6ITF9KSkse2FjY2VwdHM6cCx0cmFuczphfX1mdW5jdGlvbiBwKHQsZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3dyaXRhYmxlOiExLGVudW1lcmFibGU6ITB9KX0pfXQuZXhwb3J0Q29uc3RhbnRzKCksbi5ERUJVRz1uLkQ9MSxuLk1VTFRJTElORT1uLk09MixuLkdMT0JBTD1uLkc9NCxuLklHTk9SRUNBU0U9bi5JPTgsbi5wcm90b3R5cGU9e3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIi8iK3RoaXMuc291cmNlKyIvIit0aGlzLmZsYWdzfSx0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dGhpcy5leGVjKHQpfSxleGVjOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXMuZ2V0TkZBKCksbj10aGlzLmdsb2JhbD90aGlzLmxhc3RJbmRleHx8MDowLGk9dC5sZW5ndGg7bjxpJiYoZT1yLmlucHV0KHQsbiksIWUuYWNjZXB0YWJsZSk7bisrKTtpZighZXx8IWUuYWNjZXB0YWJsZSlyZXR1cm4gdGhpcy5sYXN0SW5kZXg9MCxudWxsO3ZhciBhPW5ldyBBcnJheSh0aGlzLmFzdC5ncm91cENvdW50KzEpO2FbMF09dC5zbGljZShuLGUubGFzdEluZGV4KzEpO2Zvcih2YXIgcz1lLnN0YWNrLG89MSxjPWEubGVuZ3RoO288YztvKyspYVtvXT11KHMsbyx0KTtyZXR1cm4gdGhpcy5sYXN0SW5kZXg9ZS5sYXN0SW5kZXgrMSxhLmluZGV4PW4sYS5pbnB1dD10LGF9LGdldE5GQTpmdW5jdGlvbigpe2lmKHRoaXMuX25mYSlyZXR1cm4gdGhpcy5fbmZhO3ZhciB0LGU9dGhpcy5hc3Q7cmV0dXJuIHg9MSx0PWMoZS50cmVlKSx0PXIodCx0aGlzLmRlYnVnKSx0aGlzLl9uZmE9dCx0fX07dmFyIGQ9ZS5wYXJzZUNoYXJzZXQoIl5cblxyXHUyMDI4XHUyMDI5IiksZz17ZDpbIjA5Il0sdzpbIkFaIiwiYXoiLCIwOSIsIl8iXSxzOiIgXGZcblxyXHRcduGagOGgjuKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAilx1MjAyOFx1MjAyOeKAr+KBn+OAgCIuc3BsaXQoIiIpfTtbImQiLCJ3IiwicyJdLmZvckVhY2goZnVuY3Rpb24odCl7Z1t0LnRvVXBwZXJDYXNlKCldPWUubmVnYXRlKGdbdF0pfSk7dmFyIHg9MCx2PSJHcm91cENhcHR1cmVTdGFydCIseT0iR3JvdXBDYXB0dXJlRW5kIixtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciByLG49W107cmV0dXJuIHQuZXhwbGFpbmVkLmZvckVhY2goZnVuY3Rpb24odCl7bi5wdXNoKHtmcm9tOmUsdG86cj1bbCgpXSxjaGFyc2V0OnR9KSxlPXJ9KSx7YWNjZXB0czpyLHRyYW5zOm59fWZ1bmN0aW9uIGUodCxlKXt2YXIgcj1bbCgpXTtyZXR1cm57YWNjZXB0czpyLHRyYW5zOlt7ZnJvbTplLHRvOnIsY2hhcnNldDp0LmV4cGxhaW5lZH1dfX1mdW5jdGlvbiBuKHQsZSl7dmFyIHI9W2woKV07cmV0dXJue2FjY2VwdHM6cix0cmFuczpbe2Zyb206ZSx0bzpyLGNoYXJzZXQ6ZH1dfX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9W2woKV07cmV0dXJue2FjY2VwdHM6cix0cmFuczpbe2Zyb206ZSx0bzpyLGNoYXJzZXQ6ITF9XX19ZnVuY3Rpb24gYSh0LGUpe3ZhciByPVtsKCldLG49W3tmcm9tOmUsdG86cixjaGFyc2V0OiExLA0KYWN0aW9uOiF0Lm5vbkNhcHR1cmUmJmZ1bmN0aW9uKGUscixuKXtlLnVuc2hpZnQoe3R5cGU6dixudW06dC5udW0saW5kZXg6bn0pfX1dO2U9cjt2YXIgaT1jKHQuc3ViLGUpO249bi5jb25jYXQoaS50cmFucyk7dmFyIGE9W2woKV07cmV0dXJuIG4ucHVzaCh7ZnJvbTppLmFjY2VwdHMsdG86YSxjaGFyc2V0OiExLGFjdGlvbjohdC5ub25DYXB0dXJlJiZmdW5jdGlvbihlLHIsbil7ZS51bnNoaWZ0KHt0eXBlOnksbnVtOnQubnVtLGluZGV4Om59KX19KSx7YWNjZXB0czphLHRyYW5zOm59fWZ1bmN0aW9uIHModCxlKXt2YXIgcj1bbCgpXSxuPXQubnVtO3JldHVybnthY2NlcHRzOnIsdHJhbnM6W3tmcm9tOmUsdG86cixjaGFyc2V0OiExLGFzc2VydDpmdW5jdGlvbih0LGUscixpLGEpe3ZhciBzPXUodCxuLGEpO3JldHVybiB2b2lkIDA9PT1zJiYocz0iIiksYS5zbGljZShyLHIrcy5sZW5ndGgpPT09cyYmcy5sZW5ndGh9fV19fWZ1bmN0aW9uIG8odCxlKXt2YXIgcj1bXSxuPVtdO3JldHVybiB0LmJyYW5jaGVzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9Yyh0LGUpO3I9ci5jb25jYXQoaS50cmFucyksbj1uLmNvbmNhdChpLmFjY2VwdHMpfSkse3RyYW5zOnIsYWNjZXB0czpufX1mdW5jdGlvbiBoKHQsZSl7ZnVuY3Rpb24gbih0KXt2YXIgZT1yKGModC5zdWIsWyJzdGFydCJdKSk7cmV0dXJuIGZ1bmN0aW9uKHQscixuLGksYSl7cmV0dXJuIGUuaW5wdXQoYSxuLG51bGwsdCkuYWNjZXB0YWJsZX19ZnVuY3Rpb24gaSh0LGUpe3JldHVybiEhKGEodC0xLGUpXmEodCxlKSl9ZnVuY3Rpb24gYSh0LGUpe3JldHVybi0xIT09dCYmdCE9PWUubGVuZ3RoJiYvXHcvLnRlc3QoZVt0XSl9ZnVuY3Rpb24gcyh0LGUscixuLGkpe3JldHVybiAwPT09cnx8IlxuIj09PWlbci0xXX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7cmV0dXJuIDA9PT1yfWZ1bmN0aW9uIGgodCxlLHIsbixpKXtyZXR1cm4gcj09PWkubGVuZ3RofHwiXG4iPT09ZX1mdW5jdGlvbiB1KHQsZSxyLG4saSl7cmV0dXJuIHI9PT1pLmxlbmd0aH12YXIgZjtzd2l0Y2godC5hc3NlcnRpb25UeXBlKXtjYXNlIEFzc2VydEJlZ2luOmY9dC5tdWx0aWxpbmU/czpvO2JyZWFrO2Nhc2UgQXNzZXJ0RW5kOmY9dC5tdWx0aWxpbmU/aDp1O2JyZWFrO2Nhc2UgQXNzZXJ0V29yZEJvdW5kYXJ5OmY9ZnVuY3Rpb24odCxlLHIsbixhKXtyZXR1cm4gaShyLGEpfTticmVhaztjYXNlIEFzc2VydE5vbldvcmRCb3VuZGFyeTpmPWZ1bmN0aW9uKHQsZSxyLG4sYSl7cmV0dXJuIWkocixhKX07YnJlYWs7Y2FzZSBBc3NlcnRMb29rYWhlYWQ6Zj1uKHQpO2JyZWFrO2Nhc2UgQXNzZXJ0TmVnYXRpdmVMb29rYWhlYWQ6Zj1mdW5jdGlvbih0KXt2YXIgZT1uKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiFlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KHQpfXJldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49W2woKV07cmV0dXJue2FjY2VwdHM6bix0cmFuczpbe2Zyb206ZSx0bzpuLGNoYXJzZXQ6ITEsYXNzZXJ0OnJ9XX19KHQsZSxmKX1yZXR1cm57YXNzZXJ0OmgsY2hvaWNlOm8sYmFja3JlZjpzLGdyb3VwOmEsZW1wdHk6aSxjaGFyc2V0OmUsZG90Om4sZXhhY3Q6dH19KCk7cmV0dXJuIG59KSwiZnVuY3Rpb24iIT10eXBlb2YgZGVmaW5lKXZhciBkZWZpbmU9cmVxdWlyZSgiYW1kZWZpbmUiKShtb2R1bGUpO2lmKGRlZmluZSgidmlzdWFsaXplIixbIi4vS2l0IiwiLi9wYXJzZSJdLGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LGUpe2lmKGU9ZXx8Im5vcm1hbCIsU1t0XSYmU1t0XVtlXSlyZXR1cm4gU1t0XVtlXTt5LmF0dHIoeyJmb250LXNpemUiOnQsImZvbnQtd2VpZ2h0IjplfSk7dmFyIHI9eS5nZXRCQm94KCk7cmV0dXJuIFNbdF09U1t0XXx8e30sU1t0XVtlXT17d2lkdGg6ci53aWR0aC8oKHkuYXR0cigidGV4dCIpLmxlbmd0aC0xKS8yKSxoZWlnaHQ6ci5oZWlnaHQvMn19ZnVuY3Rpb24gbih0KXt5PXQudGV4dCgtMWUzLC0xZTMsIlhnZlRsTXwucVxuWGdmVGxNfC5xIikuYXR0cih7ImZvbnQtZmFtaWx5IjpFLCJmb250LXNpemUiOm19KX1mdW5jdGlvbiBpKHQsZSxpKXtpLmNsZWFyKCksaS5zZXRTaXplKDAsMCk7dmFyIG89aS5yZWN0KDAsMCwwLDApO28uYXR0cigiZmlsbCIsdyksby5hdHRyKCJzdHJva2UiLHcpLG4oaSksQz0hIX5lLmluZGV4T2YoIm0iKTt2YXIgYz1kKHQudHJlZSk7Yy51bnNoaWZ0KHgoIi8iLEIuZGVsaW1pdGVyKSksYy51bnNoaWZ0KHgoIlJlZ0V4cDogIikpLGMucHVzaCh4KCIvIixCLmRlbGltaXRlcikpLGUmJmMucHVzaCh4KGUsQi5mbGFncykpO3ZhciBoPXIobSwiYm9sZCIpLHU9ayxsPWguaGVpZ2h0LzIrayxmPTAscD0wO2Y9Yy5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS54PXQsZS55PWwsdCtlLnRleHQubGVuZ3RoKmgud2lkdGh9LHUpLGYrPWsscD1oLmhlaWdodCsyKmssYz1pLmFkZChjKSxpLnNldFNpemUoZixoLmhlaWdodCsyKmspO3ZhciBnPWEodC50cmVlLDAsMCk7cD1NYXRoLm1heChnLmhlaWdodCszKmsraC5oZWlnaHQscCksZj1NYXRoLm1heChnLndpZHRoKzIqayxmKSxpLnNldFNpemUoZixwKSxvLmF0dHIoIndpZHRoIixmKSxvLmF0dHIoImhlaWdodCIscCkscyhnLml0ZW1zLGssMiprK2guaGVpZ2h0LWcueSksaS5hZGQoZy5pdGVtcyl9ZnVuY3Rpb24gYSh0LGUscil7cmV0dXJuIHQudW5zaGlmdCh7dHlwZToic3RhcnRQb2ludCJ9KSx0LnB1c2goe3R5cGU6ImVuZFBvaW50In0pLG8odCxlLHIpfWZ1bmN0aW9uIHModCxlLHIpe3QuZm9yRWFjaChmdW5jdGlvbih0KXt0Ll90cmFuc2xhdGU/dC5fdHJhbnNsYXRlKGUscik6KHQueCs9ZSx0LnkrPXIpfSl9ZnVuY3Rpb24gbyh0LGUscil7dmFyIG49W10saT1bXSxhPTAscz0wLG89ZSxjPXIsaD1yO2lmKCF0Lmxlbmd0aClyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlO2U9dC5yZXBlYXQ/QS5yZXBlYXQodCxvLHIpOkFbdC50eXBlXSh0LG8sciksbi5wdXNoKGUpLG8rPWUud2lkdGgrXyxhKz1lLndpZHRoLGM9TWF0aC5taW4oYyxlLnkpLGg9TWF0aC5tYXgoaCxlLnkrZS5oZWlnaHQpLGk9aS5jb25jYXQoZS5pdGVtcyl9KSxzPWgtYyxuLnJlZHVjZShmdW5jdGlvbih0LGUpe2ErPV87dmFyIG49dSh0LmxpbmVPdXRYLHIsZS5saW5lSW5YKTtyZXR1cm4gaS5wdXNoKG4pLGV9KTt2YXIgbD1uWzBdLmxpbmVJblgsZj1uW24ubGVuZ3RoLTFdLmxpbmVPdXRYO3JldHVybntpdGVtczppLHdpZHRoOmEsaGVpZ2h0OnMseDplLHk6YyxsaW5lSW5YOmwsbGluZU91dFg6Zn19ZnVuY3Rpb24gYyhlLG4saSxhLHMpe2U9dC50b1ByaW50KGUpO3ZhciBvPXIobSksYz1lLmxlbmd0aCpvLndpZHRoLGg9by5oZWlnaHQrMTIsdT1jKzEyLGw9e3R5cGU6InJlY3QiLHg6bix5OmktaC8yLHdpZHRoOnUsaGVpZ2h0Omgsc3Ryb2tlOiJub25lIixmaWxsOmF8fCJ0cmFuc3BhcmVudCJ9LGY9e3R5cGU6InRleHQiLHg6bit1LzIseTppLHRleHQ6ZSwiZm9udC1zaXplIjptLCJmb250LWZhbWlseSI6RSxmaWxsOnN8fCJibGFjayJ9O3JldHVybnt0ZXh0OmYscmVjdDpsLGl0ZW1zOltsLGZdLHdpZHRoOnUsaGVpZ2h0OmgseDpuLHk6bC55LGxpbmVJblg6bixsaW5lT3V0WDpuK3V9fWZ1bmN0aW9uIGgodCxlLG4saSl7dmFyIGEscz1yKGIpLG89bi5zcGxpdCgiXG4iKSxjPW8ubGVuZ3RoKnMuaGVpZ2h0O2E9by5sZW5ndGg+MT9NYXRoLm1heC5hcHBseShNYXRoLG8ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aH0pKTpuLmxlbmd0aCxhKj1zLndpZHRoO3JldHVybntsYWJlbDp7dHlwZToidGV4dCIseDp0LHk6ZS1jLzItNCx0ZXh0Om4sImZvbnQtc2l6ZSI6YiwiZm9udC1mYW1pbHkiOkUsZmlsbDppfHwiIzQ0NCJ9LHg6dC1hLzIseTplLWMtNCx3aWR0aDphLGhlaWdodDpjKzR9fWZ1bmN0aW9uIHUodCxlLHIpe3JldHVybnt0eXBlOiJwYXRoIix4OnQseTplLHBhdGg6WyJNIix0LGUsIkgiLHJdLCJzdHJva2UtbGluZWNhcCI6ImJ1dHQiLCJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsc3Ryb2tlOiIjMzMzIiwic3Ryb2tlLXdpZHRoIjoyLF90cmFuc2xhdGU6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnBhdGg7clsxXSs9dCxyWzJdKz1lLHJbNF0rPXR9fX1mdW5jdGlvbiBsKHQsZSxyLG4pe3ZhciBpLGEscz10PnI/LTE6MSxvPWU+bj8tMToxO3JldHVybiBNYXRoLmFicyhlLW4pPDE1PyhpPVsiTSIsdCxlLCJDIix0K01hdGgubWluKE1hdGguYWJzKHItdCkvMiwxMCkqcyxlLHItKHItdCkvMixuLHIsbl0sYT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMucGF0aDtyWzFdKz10LHJbMl0rPWUscls0XSs9dCxyWzVdKz1lLHJbNl0rPXQscls3XSs9ZSxyWzhdKz10LHJbOV0rPWV9KTooaT1bIk0iLHQsZSwiUSIsdCsxMCpzLGUsdCsxMCpzLGUrMTAqbywiViIsTWF0aC5hYnMoZS1uKTwyMD9lKzEwKm86bi0xMCpvLCJRIix0KzEwKnMsbix0KzEwKnMqMixuLCJIIixyXSxhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5wYXRoO3JbMV0rPXQsclsyXSs9ZSxyWzRdKz10LHJbNV0rPWUscls2XSs9dCxyWzddKz1lLHJbOV0rPWUsclsxMV0rPXQsclsxMl0rPWUsclsxM10rPXQsclsxNF0rPWUsclsxNl0rPXR9KSx7dHlwZToicGF0aCIscGF0aDppLCJzdHJva2UtbGluZWNhcCI6ImJ1dHQiLCJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsc3Ryb2tlOiIjMzMzIiwic3Ryb2tlLXdpZHRoIjoyLF90cmFuc2xhdGU6YX19ZnVuY3Rpb24gZih0LGUscil7cmV0dXJue2l0ZW1zOlt7dHlwZToiY2lyY2xlIixmaWxsOnIsY3g6dCsxMCxjeTplLHI6MTAsc3Ryb2tlOiJub25lIixfdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSl7dGhpcy5jeCs9dCx0aGlzLmN5Kz1lfX1dLHdpZHRoOjIwLGhlaWdodDoyMCx4OnQseTplLGxpbmVJblg6dCxsaW5lT3V0WDp0KzIwfX1mdW5jdGlvbiBwKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgZT10LHI9MDtyPGUubGVuZ3RoO3IrKylpZighcChlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgbj10O3JldHVybiBuLnR5cGU9PT1FTVBUWV9OT0RFfHwobi50eXBlPT09R1JPVVBfTk9ERSYmdm9pZCAwPT09bi5udW0/cChuLnN1Yik6bi50eXBlPT09Q0hPSUNFX05PREU/cChuLmJyYW5jaGVzKTp2b2lkIDApfWZ1bmN0aW9uIGQoZSl7dmFyIHI9W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLnN1YilyLnB1c2goeCgiKCIpKSxlLnR5cGU9PT1BU1NFUlRfTk9ERT9lLmFzc2VydGlvblR5cGU9PT1Bc3NlcnRMb29rYWhlYWQ/ci5wdXNoKHgoIj89IikpOnIucHVzaCh4KCI/ISIpKTplLm5vbkNhcHR1cmUmJnIucHVzaCh4KCI/OiIpKSxyPXIuY29uY2F0KGQoZS5zdWIpKSxyLnB1c2goeCgiKSIpKTtlbHNlIGlmKGUuYnJhbmNoZXMpZS5icmFuY2hlcy5tYXAoZCkuZm9yRWFjaChmdW5jdGlvbih0KXtyPXIuY29uY2F0KHQpLHIucHVzaCh4KCJ8IikpfSksci5wb3AoKTtlbHNle3ZhciBuPUJbZS50eXBlXXx8Qi5kZWZhdWx0cztzd2l0Y2goZS50eXBlKXtjYXNlIENIQVJTRVRfTk9ERTp2YXIgaT12KGUpOyghaXx8ZS5leGNsdWRlKSYmci5wdXNoKHgoIlsiKSksZS5leGNsdWRlJiZyLnB1c2goeCgiXiIsQi5jaGFyc2V0RXhjbHVkZSkpLGUucmFuZ2VzLmZvckVhY2goZnVuY3Rpb24odCl7ci5wdXNoKHgoZyh0WzBdKyItIit0WzFdKSxCLmNoYXJzZXRSYW5nZSkpfSksZS5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24odCl7ci5wdXNoKHgoIlxcIit0LEIuY2hhcnNldENsYXNzKSl9KSxyLnB1c2goeChnKGUuY2hhcnMpLEIuY2hhcnNldENoYXJzKSksKCFpfHxlLmV4Y2x1ZGUpJiZyLnB1c2goeCgiXSIpKTticmVhaztkZWZhdWx0OnZhciBhPWUucmF3fHwiIjtlLnJlcGVhdCYmKGE9YS5zbGljZSgwLGUucmVwZWF0LmJlZ2luSW5kZXgpKSxhPXQudG9QcmludChhLCEwKSxyLnB1c2goeChhLG4pKX19aWYoZS5yZXBlYXQpe3ZhciBzPWUucmVwZWF0Lm1pbixvPWUucmVwZWF0Lm1heDswPT09cyYmbz09PTEvMD9yLnB1c2goeCgiKiIpKToxPT09cyYmbz09PTEvMD9yLnB1c2goeCgiKyIpKTowPT09cyYmMT09PW8/ci5wdXNoKHgoIj8iKSk6KHIucHVzaCh4KCJ7IikpLHIucHVzaCh4KHMpKSxzPT09bz9yLnB1c2goeCgifSIpKTooci5wdXNoKHgoIiwiKSksaXNGaW5pdGUobykmJnIucHVzaCh4KG8pKSxyLnB1c2goeCgifSIpKSkpLGUucmVwZWF0Lm5vbkdyZWVkeSYmci5wdXNoKHgoIj8iLEIucmVwZWF0Tm9uR3JlZWR5KSl9fSkscn1mdW5jdGlvbiBnKGUpe3JldHVybiBlPXQudG9QcmludChlKSxlLnJlcGxhY2UoL1xbL2csIlxcWyIpLnJlcGxhY2UoL1xdL2csIlxcXSIpfWZ1bmN0aW9uIHgodCxlKXtyZXR1cm4gZT1lfHxCW3RdfHxCLmRlZmF1bHRzLHt0eXBlOiJ0ZXh0IiwiZm9udC1zaXplIjptLCJmb250LWZhbWlseSI6RSx0ZXh0OnQrIiIsZmlsbDplLCJ0ZXh0LWFuY2hvciI6InN0YXJ0IiwiZm9udC13ZWlnaHQiOiJib2xkIn19ZnVuY3Rpb24gdih0KXtyZXR1cm4hdC5jaGFycyYmIXQucmFuZ2VzLmxlbmd0aCYmMT09PXQuY2xhc3Nlcy5sZW5ndGh9ZS5leHBvcnRDb25zdGFudHMoKTt2YXIgeSxtPTE2LGI9MTQsXz0xNix3PSIjRUVFIixFPSJEZWphVnUgU2FucyBNb25vLG1vbm9zcGFjZSIsQz0hMSxrPTEwLFM9e30sQT17c3RhcnRQb2ludDpmdW5jdGlvbih0LGUscil7cmV0dXJuIGYoZSxyLCJyKDAuNSwwLjUpI0VGRS1ncmVlbiIpfSxlbmRQb2ludDpmdW5jdGlvbih0LGUscil7cmV0dXJuIGYoZSxyLCJyKDAuNSwwLjUpI0ZGRi0jMDAwIil9LGVtcHR5OmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm57aXRlbXM6W3UoZSxyLGUrMTApXSx3aWR0aDoxMCxoZWlnaHQ6Mix4OmUseTpyLGxpbmVJblg6ZSxsaW5lT3V0WDplKzEwfX0sZXhhY3Q6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBjKHQuY2hhcnMsZSxyLCJza3libHVlIil9LGRvdDpmdW5jdGlvbih0LGUscil7dmFyIG49YygiQW55Q2hhckV4Y2VwdE5ld0xpbmUiLGUsciwiRGFya0dyZWVuIiwid2hpdGUiKTtyZXR1cm4gbi5yZWN0LnI9MTAsbi5yZWN0LnRpcD0iQW55Q2hhciBleGNlcHQgQ1IgTEYiLG59LGJhY2tyZWY6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWMoIkJhY2tyZWYgIyIrdC5udW0sZSxyLCJuYXZ5Iiwid2hpdGUiKTtyZXR1cm4gbi5yZWN0LnI9OCxufSxyZXBlYXQ6ZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQrKHQ8Mj8iIHRpbWUiOiIgdGltZXMiKX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9dGhpcy5wYXRoO3JbMV0rPXQsclsyXSs9ZSxyWzRdKz10LHJbNV0rPWUscls2XSs9dCxyWzddKz1lLHJbOV0rPWUsclsxMV0rPXQsclsxMl0rPWUsclsxM10rPXQsclsxNF0rPWUsclsxNl0rPXQsclsxOF0rPXQsclsxOV0rPWUsclsyMF0rPXQsclsyMV0rPWUsclsyM10rPWUsclsyNV0rPXQsclsyNl0rPWUsclsyN10rPXQsclsyOF0rPWV9aWYocCh0KSlyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dmFyIGE9dC5yZXBlYXQsbz0iIixjPVtdO2lmKGEubWluPT09YS5tYXgmJjA9PT1hLm1pbilyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dmFyIHU9QVt0LnR5cGVdKHQsZSxyKSxsPXUud2lkdGgsZj11LmhlaWdodDtpZihhLm1pbj09PWEubWF4JiYxPT09YS5taW4pcmV0dXJuIHU7YS5taW49PT1hLm1heD9vKz1uKGEubWluKToobys9YS5taW4saXNGaW5pdGUoYS5tYXgpP28rPShhLm1heC1hLm1pbj4xPyIgdG8gIjoiIG9yICIpK24oYS5tYXgpOm8rPSIgb3IgbW9yZSB0aW1lcyIpO3ZhciBkPTEwLGc9MCx4PTEwLHY9dS55K3UuaGVpZ2h0LXIseT0yMCt1LndpZHRoO2w9eTt2YXIgbTsxIT09YS5tYXg/KHYrPTEwLGYrPTEwLG09e3R5cGU6InBhdGgiLHBhdGg6WyJNIix1LngrMTAsciwiUSIsZSxyLGUscit4LCJWIixyK3YteCwiUSIsZSxyK3YsZSt4LHIrdiwiSCIsZSt5LXgsIlEiLGUreSxyK3YsZSt5LHIrdi14LCJWIixyK3gsIlEiLGUreSxyLHUueCt1LndpZHRoKzEwLHJdLF90cmFuc2xhdGU6aSxzdHJva2U6Im1hcm9vbiIsInN0cm9rZS13aWR0aCI6Mn0sYS5ub25HcmVlZHkmJihtLnN0cm9rZT0iQnJvd24iLG1bInN0cm9rZS1kYXNoYXJyYXkiXT0iLSIpLGMucHVzaChtKSk6bz0hMTt2YXIgYjtpZigwPT09YS5taW4pe3ZhciBfPXItdS55KzEwLHc9eSsyMDtkKz0xMCxnPS0xMixsPXcsZis9MTAsYj17dHlwZToicGF0aCIscGF0aDpbIk0iLGUsciwiUSIsZSt4LHIsZSt4LHIteCwiViIsci1fK3gsIlEiLGUreCxyLV8sZSsyMCxyLV8sIkgiLGUrdy0yMCwiUSIsZSt3LXgsci1fLGUrdy14LHItXyt4LCJWIixyLXgsIlEiLGUrdy14LHIsZSt3LHJdLF90cmFuc2xhdGU6aSxzdHJva2U6YS5ub25HcmVlZHk/ImRhcmtncmVlbiI6IiMzMzMiLCJzdHJva2Utd2lkdGgiOjJ9LG0mJnMoW21dLDEwLDApLGMucHVzaChiKX1pZihvKXt2YXIgRT1oKGUrbC8yLHIsbyk7cyhbRS5sYWJlbF0sMCx2K0UuaGVpZ2h0KzQpLGMucHVzaChFLmxhYmVsKSxmKz00K0UuaGVpZ2h0O3ZhciBDPShNYXRoLm1heChFLndpZHRoLGwpLWwpLzI7QyYmcyhjLEMsMCksbD1NYXRoLm1heChFLndpZHRoLGwpLGQrPUN9cmV0dXJuIHModS5pdGVtcyxkLDApLGM9Yy5jb25jYXQodS5pdGVtcykse2l0ZW1zOmMsd2lkdGg6bCxoZWlnaHQ6Zix4OmUseTp1LnkrZyxsaW5lSW5YOnUubGluZUluWCtkLGxpbmVPdXRYOnUubGluZU91dFgrZH19LGNob2ljZTpmdW5jdGlvbih0LGUscil7aWYocCh0KSlyZXR1cm4gQS5lbXB0eShudWxsLGUscik7dmFyIG49MCxpPTAsYT10LmJyYW5jaGVzLm1hcChmdW5jdGlvbih0KXt2YXIgYT1vKHQsZSxyKTtyZXR1cm4gbis9YS5oZWlnaHQsaT1NYXRoLm1heChpLGEud2lkdGgpLGF9KTtuKz02KihhLmxlbmd0aC0xKSs4LGkrPTQwO3ZhciBjPWUraS8yLGg9ci1uLzIrNCxmPWUraSxkPVtdO3JldHVybiBhLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49Yy10LndpZHRoLzI7cyh0Lml0ZW1zLG4tdC54LGgtdC55KSxkPWQuY29uY2F0KHQuaXRlbXMpO3ZhciBhPXIraC10Lnksbz1sKGUscixlKzIwLGEpLHA9bChmLHIsZStpLTIwLGEpO2QucHVzaChvLHApLGUrMjAhPT1uLXQueCt0LmxpbmVJblgmJmQucHVzaCh1KGUrMjAsYSxuLXQueCt0LmxpbmVJblgpKSx0LmxpbmVPdXRYK24tdC54IT1lK2ktMjAmJmQucHVzaCh1KHQubGluZU91dFgrbi10LngsYSxlK2ktMjApKSx0Lng9bix0Lnk9aCxoKz10LmhlaWdodCs2fSkse2l0ZW1zOmQsd2lkdGg6aSxoZWlnaHQ6bix4OmUseTpyLW4vMixsaW5lSW5YOmUsbGluZU91dFg6Zn19LGNoYXJzZXQ6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXtkOiJEaWdpdCIsRDoiTm9uRGlnaXQiLHc6IldvcmQiLFc6Ik5vbldvcmQiLHM6IldoaXRlU3BhY2UiLFM6Ik5vbldoaXRlU3BhY2UifSxpPXQuZXhjbHVkZT8iUGluayI6IktoYWtpIixhPXQuZXhjbHVkZT8iI0MwMCI6IiI7aWYodih0KSl7dmFyIG89YyhuW3QuY2xhc3Nlc1swXV0sZSxyLCJHcmVlbiIsIndoaXRlIik7aWYoby5yZWN0LnI9NSx0LmV4Y2x1ZGUpe3ZhciB1PWgoby54K28ud2lkdGgvMixvLnksIk5vbmUgb2Y6IixhKSxsPW8uaXRlbXM7bC5wdXNoKHUubGFiZWwpO3ZhciBmPW8ud2lkdGgscD1NYXRoLm1heCh1LndpZHRoLG8ud2lkdGgpLGQ9KHAtZikvMjtyZXR1cm4gcyhsLGQsMCkse2l0ZW1zOmwsd2lkdGg6cCxoZWlnaHQ6by5oZWlnaHQrdS5oZWlnaHQseDpNYXRoLm1pbih1Lngsby54KSx5OnUueSxsaW5lSW5YOmQrby54LGxpbmVPdXRYOmQrby54K28ud2lkdGh9fXJldHVybiBvfWlmKCF0LmNoYXJzJiYhdC5yYW5nZXMubGVuZ3RoJiYhdC5jbGFzc2VzLmxlbmd0aCl7dmFyIG89YygiQW55Q2hhciIsZSxyLCJncmVlbiIsIndoaXRlIik7cmV0dXJuIG8ucmVjdC5yPTUsb312YXIgZyx4LHk9W10scD0wLG09MDt0LmNoYXJzJiYoZz1jKHQuY2hhcnMsZSxyLCJMaWdodFNreUJsdWUiLCJibGFjayIpLGcucmVjdC5yPTUseS5wdXNoKGcpLHA9Zy53aWR0aCksdC5yYW5nZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0PXQuc3BsaXQoIiIpLmpvaW4oIi0iKTt2YXIgbj1jKHQsZSxyLCJ0ZWFsIiwid2hpdGUiKTtuLnJlY3Qucj01LHkucHVzaChuKSxwPU1hdGgubWF4KG4ud2lkdGgscCl9KSx0LmNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT1jKG5bdF0sZSxyLCJHcmVlbiIsIndoaXRlIik7aS5yZWN0LnI9NSx5LnB1c2goaSkscD1NYXRoLm1heChpLndpZHRoLHApfSkseD15WzBdLmhlaWdodDt2YXIgYj1bXSxfPVtdO3kuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLndpZHRoLXQud2lkdGh9KSx5LmZvckVhY2goZnVuY3Rpb24odCl7Mip0LndpZHRoKzQ+cD9iLnB1c2godCk6Xy5wdXNoKHQpfSkseT1iO2Zvcih2YXIgdyxFO18ubGVuZ3RoOyl7aWYodz1fLnBvcCgpLCEoRT1fLnBvcCgpKSl7eS5wdXNoKHcpO2JyZWFrfXcud2lkdGgtRS53aWR0aD4yPyh5LnB1c2godyksXy5wdXNoKEUpKToocyhFLml0ZW1zLHcud2lkdGgrNCwwKSx5LnB1c2goe2l0ZW1zOncuaXRlbXMuY29uY2F0KEUuaXRlbXMpLHdpZHRoOncud2lkdGgrRS53aWR0aCs0LGhlaWdodDp3LmhlaWdodCx4OncueCx5OncueX0pLG0tPXcuaGVpZ2h0KX1wKz0xMixtPTQqKHkubGVuZ3RoLTEpK3kubGVuZ3RoKngrMTI7dmFyIEM9e3R5cGU6InJlY3QiLHg6ZSx5OnItbS8yLHI6NCx3aWR0aDpwLGhlaWdodDptLHN0cm9rZToibm9uZSIsZmlsbDppfSxrPUMueSs2LGw9W0NdO3kuZm9yRWFjaChmdW5jdGlvbih0KXtzKHQuaXRlbXMsZS10LngrKHAtdC53aWR0aCkvMixrLXQueSksbD1sLmNvbmNhdCh0Lml0ZW1zKSxrKz10LmhlaWdodCs0fSk7dmFyIHU9aChDLngrQy53aWR0aC8yLEMueSwodC5leGNsdWRlPyJOb25lIjoiT25lIikrIiBvZjoiLGEpO2wucHVzaCh1LmxhYmVsKTt2YXIgZj1wO3A9TWF0aC5tYXgodS53aWR0aCxwKTt2YXIgZD0ocC1mKS8yO3JldHVybiBzKGwsZCwwKSx7aXRlbXM6bCx3aWR0aDpwLGhlaWdodDptK3UuaGVpZ2h0LHg6TWF0aC5taW4odS54LGUpLHk6dS55LGxpbmVJblg6ZCtlLGxpbmVPdXRYOmQrZStDLndpZHRofX0sZ3JvdXA6ZnVuY3Rpb24odCxlLHIpe2lmKHAodCkpcmV0dXJuIEEuZW1wdHkobnVsbCxlLHIpO3ZhciBuPW8odC5zdWIsZSxyKTtpZih0Lm51bSl7cyhuLml0ZW1zLDEwLDApO3ZhciBpPW4ud2lkdGgrMjAsYT1uLmhlaWdodCsyMCxjPXt0eXBlOiJyZWN0Iix4OmUseTpuLnktMTAscjo2LHdpZHRoOmksaGVpZ2h0OmEsInN0cm9rZS1kYXNoYXJyYXkiOiIuIixzdHJva2U6InNpbHZlciIsInN0cm9rZS13aWR0aCI6Mn0sdT1oKGMueCtjLndpZHRoLzIsYy55LTIsIkdyb3VwICMiK3QubnVtKSxsPW4uaXRlbXMuY29uY2F0KFtjLHUubGFiZWxdKSxmPU1hdGgubWF4KHUud2lkdGgsaSksZD0oZi1pKS8yO3JldHVybiBkJiZzKGwsZCwwKSx7aXRlbXM6bCx3aWR0aDpmLGhlaWdodDphK3UuaGVpZ2h0KzQseDplLHk6dS55LGxpbmVJblg6ZCtuLmxpbmVJblgrMTAsbGluZU91dFg6ZCtuLmxpbmVPdXRYKzEwfX1yZXR1cm4gbn0sYXNzZXJ0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpPXtBc3NlcnROb25Xb3JkQm91bmRhcnk6e2JnOiJtYXJvb24iLGZnOiJ3aGl0ZSJ9LEFzc2VydFdvcmRCb3VuZGFyeTp7Ymc6InB1cnBsZSIsZmc6IndoaXRlIn0sQXNzZXJ0RW5kOntiZzoiSW5kaWdvIixmZzoid2hpdGUifSxBc3NlcnRCZWdpbjp7Ymc6IkluZGlnbyIsZmc6IndoaXRlIn19LGE9dC5hc3NlcnRpb25UeXBlLG89YS5yZXBsYWNlKCJBc3NlcnQiLCIiKSsiISI7aWYobj1pW2FdKXJldHVybiFDfHwiQXNzZXJ0QmVnaW4iIT09YSYmIkFzc2VydEVuZCIhPT1hfHwobz0iTGluZSIrbyksYyhvLGUscixuLmJnLG4uZmcpO3ZhciB1LGw7YT09PUFzc2VydExvb2thaGVhZD8odT0iQ29ybmZsb3dlckJsdWUiLGw9ImRhcmtncmVlbiIsbz0iRm9sbG93ZWQgYnk6Iik6YT09PUFzc2VydE5lZ2F0aXZlTG9va2FoZWFkJiYodT0iI0Y2MyIsbD0iUHVycGxlIixvPSJOb3QgZm9sbG93ZWQgYnk6Iik7dmFyIGY9QS5ncm91cCh0LGUscikscD1mLmhlaWdodCsxNixkPWYud2lkdGgrMTYsZz17dHlwZToicmVjdCIseDplLHk6Zi55LTgscjo2LHdpZHRoOmQsaGVpZ2h0OnAsInN0cm9rZS1kYXNoYXJyYXkiOiItIixzdHJva2U6dSwic3Ryb2tlLXdpZHRoIjoyfSx4PWgoZy54K2QvMixnLnksbyxsKSx2PU1hdGgubWF4KGQseC53aWR0aCkseT0odi1kKS8yO3JldHVybiBzKGYuaXRlbXMseSs4LDApLHkmJnMoW2cseC5sYWJlbF0seSwwKSx7aXRlbXM6Zi5pdGVtcy5jb25jYXQoW2cseC5sYWJlbF0pLHdpZHRoOnYsaGVpZ2h0OmcuaGVpZ2h0K3guaGVpZ2h0LHg6ZSx5OngueSxsaW5lSW5YOnkrZi5saW5lSW5YKzgsbGluZU91dFg6eStmLmxpbmVPdXRYKzh9fX0sQj17ZGVsaW1pdGVyOiJJbmRpZ28iLGZsYWdzOiJkYXJrZ3JlZW4iLGV4YWN0OiIjMzM0Iixkb3Q6ImRhcmtibHVlIixiYWNrcmVmOiJ0ZWFsIiwkOiJwdXJwbGUiLCJeIjoicHVycGxlIiwiXFxiIjoiI0YzMCIsIlxcQiI6IiNGMzAiLCIoIjoiYmx1ZSIsIikiOiJibHVlIiwiPz0iOiJkYXJrZ3JlZW4iLCI/ISI6InJlZCIsIj86IjoiZ3JleSIsIlsiOiJuYXZ5IiwiXSI6Im5hdnkiLCJ8IjoiYmx1ZSIsInsiOiJtYXJvb24iLCIsIjoibWFyb29uIiwifSI6Im1hcm9vbiIsIioiOiJtYXJvb24iLCIrIjoibWFyb29uIiwiPyI6Im1hcm9vbiIscmVwZWF0Tm9uR3JlZWR5OiIjRjYxIixkZWZhdWx0czoiYmxhY2siLGNoYXJzZXRSYW5nZToib2xpdmUiLGNoYXJzZXRDbGFzczoibmF2eSIsY2hhcnNldEV4Y2x1ZGU6InJlZCIsY2hhcnNldENoYXJzOiIjNTM0In07cmV0dXJuIGl9KSxmdW5jdGlvbih0KXt2YXIgZSxyLG49Imhhc093blByb3BlcnR5IixpPS9bXC5cL10vLGE9ZnVuY3Rpb24oKXt9LHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSxvPXtuOnt9fSxjPWZ1bmN0aW9uKHQsbil7dD1TdHJpbmcodCk7dmFyIGksYT1yLG89QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLGg9Yy5saXN0ZW5lcnModCksdT0wLGw9W10sZj17fSxwPVtdLGQ9ZTtlPXQscj0wO2Zvcih2YXIgZz0wLHg9aC5sZW5ndGg7Zzx4O2crKykiekluZGV4ImluIGhbZ10mJihsLnB1c2goaFtnXS56SW5kZXgpLGhbZ10uekluZGV4PDAmJihmW2hbZ10uekluZGV4XT1oW2ddKSk7Zm9yKGwuc29ydChzKTtsW3VdPDA7KWlmKGk9ZltsW3UrK11dLHAucHVzaChpLmFwcGx5KG4sbykpLHIpcmV0dXJuIHI9YSxwO2ZvcihnPTA7Zzx4O2crKylpZigiekluZGV4ImluKGk9aFtnXSkpaWYoaS56SW5kZXg9PWxbdV0pe2lmKHAucHVzaChpLmFwcGx5KG4sbykpLHIpYnJlYWs7ZG97aWYodSsrLGk9ZltsW3VdXSxpJiZwLnB1c2goaS5hcHBseShuLG8pKSxyKWJyZWFrfXdoaWxlKGkpfWVsc2UgZltpLnpJbmRleF09aTtlbHNlIGlmKHAucHVzaChpLmFwcGx5KG4sbykpLHIpYnJlYWs7cmV0dXJuIHI9YSxlPWQscC5sZW5ndGg/cDpudWxsfTtjLl9ldmVudHM9byxjLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyLG4sYSxzLGMsaCx1LGw9dC5zcGxpdChpKSxmPW8scD1bZl0sZD1bXTtmb3IoYT0wLHM9bC5sZW5ndGg7YTxzO2ErKyl7Zm9yKHU9W10sYz0wLGg9cC5sZW5ndGg7YzxoO2MrKylmb3IoZj1wW2NdLm4scj1bZltsW2FdXSxmWyIqIl1dLG49MjtuLS07KShlPXJbbl0pJiYodS5wdXNoKGUpLGQ9ZC5jb25jYXQoZS5mfHxbXSkpO3A9dX1yZXR1cm4gZH0sYy5vbj1mdW5jdGlvbih0LGUpe2lmKHQ9U3RyaW5nKHQpLCJmdW5jdGlvbiIhPXR5cGVvZiBlKXJldHVybiBmdW5jdGlvbigpe307Zm9yKHZhciByPXQuc3BsaXQoaSksbj1vLHM9MCxjPXIubGVuZ3RoO3M8YztzKyspbj1uLm4sbj1uLmhhc093blByb3BlcnR5KHJbc10pJiZuW3Jbc11dfHwobltyW3NdXT17bjp7fX0pO2ZvcihuLmY9bi5mfHxbXSxzPTAsYz1uLmYubGVuZ3RoO3M8YztzKyspaWYobi5mW3NdPT1lKXJldHVybiBhO3JldHVybiBuLmYucHVzaChlKSxmdW5jdGlvbih0KXsrdD09K3QmJihlLnpJbmRleD0rdCl9fSxjLmY9ZnVuY3Rpb24odCl7dmFyIGU9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7Yy5hcHBseShudWxsLFt0LG51bGxdLmNvbmNhdChlKS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19LGMuc3RvcD1mdW5jdGlvbigpe3I9MX0sYy5udD1mdW5jdGlvbih0KXtyZXR1cm4gdD9uZXcgUmVnRXhwKCIoPzpcXC58XFwvfF4pIit0KyIoPzpcXC58XFwvfCQpIikudGVzdChlKTplfSxjLm50cz1mdW5jdGlvbigpe3JldHVybiBlLnNwbGl0KGkpfSxjLm9mZj1jLnVuYmluZD1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB2b2lkKGMuX2V2ZW50cz1vPXtuOnt9fSk7dmFyIHIsYSxzLGgsdSxsLGYscD10LnNwbGl0KGkpLGQ9W29dO2ZvcihoPTAsdT1wLmxlbmd0aDtoPHU7aCsrKWZvcihsPTA7bDxkLmxlbmd0aDtsKz1zLmxlbmd0aC0yKXtpZihzPVtsLDFdLHI9ZFtsXS5uLCIqIiE9cFtoXSlyW3BbaF1dJiZzLnB1c2gocltwW2hdXSk7ZWxzZSBmb3IoYSBpbiByKXJbbl0oYSkmJnMucHVzaChyW2FdKTtkLnNwbGljZS5hcHBseShkLHMpfWZvcihoPTAsdT1kLmxlbmd0aDtoPHU7aCsrKWZvcihyPWRbaF07ci5uOyl7aWYoZSl7aWYoci5mKXtmb3IobD0wLGY9ci5mLmxlbmd0aDtsPGY7bCsrKWlmKHIuZltsXT09ZSl7ci5mLnNwbGljZShsLDEpO2JyZWFrfSFyLmYubGVuZ3RoJiZkZWxldGUgci5mfWZvcihhIGluIHIubilpZihyLm5bbl0oYSkmJnIublthXS5mKXt2YXIgZz1yLm5bYV0uZjtmb3IobD0wLGY9Zy5sZW5ndGg7bDxmO2wrKylpZihnW2xdPT1lKXtnLnNwbGljZShsLDEpO2JyZWFrfSFnLmxlbmd0aCYmZGVsZXRlIHIublthXS5mfX1lbHNle2RlbGV0ZSByLmY7Zm9yKGEgaW4gci5uKXIubltuXShhKSYmci5uW2FdLmYmJmRlbGV0ZSByLm5bYV0uZn1yPXIubn19LGMub25jZT1mdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuIGMudW5iaW5kKHQsciksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBjLm9uKHQscil9LGMudmVyc2lvbj0iMC40LjIiLGMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iWW91IGFyZSBydW5uaW5nIEV2ZSAwLjQuMiJ9LCJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1jOnZvaWQgMCE9PWRlZmluZT9kZWZpbmUoImV2ZSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gY30pOnQuZXZlPWN9KHdpbmRvd3x8dGhpcyksZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSgibGlicy9yYXBoYWVsIixbImV2ZSJdLGZ1bmN0aW9uKHIpe3JldHVybiBlKHQscil9KTplKHQsdC5ldmUpfSh0aGlzLGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0KXtpZihyLmlzKHQsImZ1bmN0aW9uIikpcmV0dXJuIGI/dCgpOmUub24oInJhcGhhZWwuRE9NbG9hZCIsdCk7aWYoci5pcyh0LFcpKXJldHVybiByLl9lbmdpbmUuY3JlYXRlW05dKHIsdC5zcGxpY2UoMCwzK3IuaXModFswXSxIKSkpLmFkZCh0KTt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7aWYoci5pcyhuW24ubGVuZ3RoLTFdLCJmdW5jdGlvbiIpKXt2YXIgaT1uLnBvcCgpO3JldHVybiBiP2kuY2FsbChyLl9lbmdpbmUuY3JlYXRlW05dKHIsbikpOmUub24oInJhcGhhZWwuRE9NbG9hZCIsZnVuY3Rpb24oKXtpLmNhbGwoci5fZW5naW5lLmNyZWF0ZVtOXShyLG4pKX0pfXJldHVybiByLl9lbmdpbmUuY3JlYXRlW05dKHIsYXJndW1lbnRzKX1mdW5jdGlvbiBuKHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxPYmplY3QodCkhPT10KXJldHVybiB0O3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yO2Zvcih2YXIgciBpbiB0KXRba10ocikmJihlW3JdPW4odFtyXSkpO3JldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHQucHVzaCh0LnNwbGljZShyLDEpWzBdKX1mdW5jdGlvbiBhKHQsZSxyKXtmdW5jdGlvbiBuKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHM9YS5qb2luKCLikIAiKSxvPW4uY2FjaGU9bi5jYWNoZXx8e30sYz1uLmNvdW50PW4uY291bnR8fFtdO3JldHVybiBvW2tdKHMpPyhpKGMscykscj9yKG9bc10pOm9bc10pOihjLmxlbmd0aD49MWUzJiZkZWxldGUgb1tjLnNoaWZ0KCldLGMucHVzaChzKSxvW3NdPXRbTl0oZSxhKSxyP3Iob1tzXSk6b1tzXSl9cmV0dXJuIG59ZnVuY3Rpb24gcygpe3JldHVybiB0aGlzLmhleH1mdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciByPVtdLG49MCxpPXQubGVuZ3RoO2ktMiohZT5uO24rPTIpe3ZhciBhPVt7eDordFtuLTJdLHk6K3Rbbi0xXX0se3g6K3Rbbl0seTordFtuKzFdfSx7eDordFtuKzJdLHk6K3RbbiszXX0se3g6K3Rbbis0XSx5Oit0W24rNV19XTtlP24/aS00PT1uP2FbM109e3g6K3RbMF0seTordFsxXX06aS0yPT1uJiYoYVsyXT17eDordFswXSx5Oit0WzFdfSxhWzNdPXt4Oit0WzJdLHk6K3RbM119KTphWzBdPXt4Oit0W2ktMl0seTordFtpLTFdfTppLTQ9PW4/YVszXT1hWzJdOm58fChhWzBdPXt4Oit0W25dLHk6K3RbbisxXX0pLHIucHVzaChbIkMiLCgtYVswXS54KzYqYVsxXS54K2FbMl0ueCkvNiwoLWFbMF0ueSs2KmFbMV0ueSthWzJdLnkpLzYsKGFbMV0ueCs2KmFbMl0ueC1hWzNdLngpLzYsKGFbMV0ueSs2KmFbMl0ueS1hWzNdLnkpLzYsYVsyXS54LGFbMl0ueV0pfXJldHVybiByfWZ1bmN0aW9uIGModCxlLHIsbixpKXtyZXR1cm4gdCoodCooLTMqZSs5KnItOSpuKzMqaSkrNiplLTEyKnIrNipuKS0zKmUrMypyfWZ1bmN0aW9uIGgodCxlLHIsbixpLGEscyxvLGgpe251bGw9PWgmJihoPTEpLGg9aD4xPzE6aDwwPzA6aDtmb3IodmFyIHU9aC8yLGw9Wy0uMTI1MiwuMTI1MiwtLjM2NzgsLjM2NzgsLS41ODczLC41ODczLC0uNzY5OSwuNzY5OSwtLjkwNDEsLjkwNDEsLS45ODE2LC45ODE2XSxmPVsuMjQ5MSwuMjQ5MSwuMjMzNSwuMjMzNSwuMjAzMiwuMjAzMiwuMTYwMSwuMTYwMSwuMTA2OSwuMTA2OSwuMDQ3MiwuMDQ3Ml0scD0wLGQ9MDtkPDEyO2QrKyl7dmFyIGc9dSpsW2RdK3UseD1jKGcsdCxyLGkscyksdj1jKGcsZSxuLGEsbykseT14Kngrdip2O3ArPWZbZF0qei5zcXJ0KHkpfXJldHVybiB1KnB9ZnVuY3Rpb24gdSh0LGUscixuLGksYSxzLG8sYyl7aWYoIShjPDB8fGgodCxlLHIsbixpLGEscyxvKTxjKSl7dmFyIHUsbD0uNSxmPTEtbDtmb3IodT1oKHQsZSxyLG4saSxhLHMsbyxmKTtYKHUtYyk+LjAxOylsLz0yLGYrPSh1PGM/MTotMSkqbCx1PWgodCxlLHIsbixpLGEscyxvLGYpO3JldHVybiBmfX1mdW5jdGlvbiBsKHQsZSxyLG4saSxhLHMsbyl7aWYoIShqKHQscik8VShpLHMpfHxVKHQscik+aihpLHMpfHxqKGUsbik8VShhLG8pfHxVKGUsbik+aihhLG8pKSl7dmFyIGM9KHQqbi1lKnIpKihpLXMpLSh0LXIpKihpKm8tYSpzKSxoPSh0Km4tZSpyKSooYS1vKS0oZS1uKSooaSpvLWEqcyksdT0odC1yKSooYS1vKS0oZS1uKSooaS1zKTtpZih1KXt2YXIgbD1jL3UsZj1oL3UscD0rbC50b0ZpeGVkKDIpLGQ9K2YudG9GaXhlZCgyKTtpZighKHA8K1UodCxyKS50b0ZpeGVkKDIpfHxwPitqKHQscikudG9GaXhlZCgyKXx8cDwrVShpLHMpLnRvRml4ZWQoMil8fHA+K2ooaSxzKS50b0ZpeGVkKDIpfHxkPCtVKGUsbikudG9GaXhlZCgyKXx8ZD4raihlLG4pLnRvRml4ZWQoMil8fGQ8K1UoYSxvKS50b0ZpeGVkKDIpfHxkPitqKGEsbykudG9GaXhlZCgyKSkpcmV0dXJue3g6bCx5OmZ9fX19ZnVuY3Rpb24gZih0LGUsbil7dmFyIGk9ci5iZXppZXJCQm94KHQpLGE9ci5iZXppZXJCQm94KGUpO2lmKCFyLmlzQkJveEludGVyc2VjdChpLGEpKXJldHVybiBuPzA6W107Zm9yKHZhciBzPWguYXBwbHkoMCx0KSxvPWguYXBwbHkoMCxlKSxjPWoofn4ocy81KSwxKSx1PWoofn4oby81KSwxKSxmPVtdLHA9W10sZD17fSxnPW4/MDpbXSx4PTA7eDxjKzE7eCsrKXt2YXIgdj1yLmZpbmREb3RzQXRTZWdtZW50LmFwcGx5KHIsdC5jb25jYXQoeC9jKSk7Zi5wdXNoKHt4OnYueCx5OnYueSx0OngvY30pfWZvcih4PTA7eDx1KzE7eCsrKXY9ci5maW5kRG90c0F0U2VnbWVudC5hcHBseShyLGUuY29uY2F0KHgvdSkpLHAucHVzaCh7eDp2LngseTp2LnksdDp4L3V9KTtmb3IoeD0wO3g8Yzt4KyspZm9yKHZhciB5PTA7eTx1O3krKyl7dmFyIG09Zlt4XSxiPWZbeCsxXSxfPXBbeV0sdz1wW3krMV0sRT1YKGIueC1tLngpPC4wMDE/InkiOiJ4IixDPVgody54LV8ueCk8LjAwMT8ieSI6IngiLGs9bChtLngsbS55LGIueCxiLnksXy54LF8ueSx3Lngsdy55KTtpZihrKXtpZihkW2sueC50b0ZpeGVkKDQpXT09ay55LnRvRml4ZWQoNCkpY29udGludWU7ZFtrLngudG9GaXhlZCg0KV09ay55LnRvRml4ZWQoNCk7dmFyIFM9bS50K1goKGtbRV0tbVtFXSkvKGJbRV0tbVtFXSkpKihiLnQtbS50KSxBPV8udCtYKChrW0NdLV9bQ10pLyh3W0NdLV9bQ10pKSoody50LV8udCk7Uz49MCYmUzw9MS4wMDEmJkE+PTAmJkE8PTEuMDAxJiYobj9nKys6Zy5wdXNoKHt4OmsueCx5OmsueSx0MTpVKFMsMSksdDI6VShBLDEpfSkpfX1yZXR1cm4gZ31mdW5jdGlvbiBwKHQsZSxuKXt0PXIuX3BhdGgyY3VydmUodCksZT1yLl9wYXRoMmN1cnZlKGUpO2Zvcih2YXIgaSxhLHMsbyxjLGgsdSxsLHAsZCxnPW4/MDpbXSx4PTAsdj10Lmxlbmd0aDt4PHY7eCsrKXt2YXIgeT10W3hdO2lmKCJNIj09eVswXSlpPWM9eVsxXSxhPWg9eVsyXTtlbHNleyJDIj09eVswXT8ocD1baSxhXS5jb25jYXQoeS5zbGljZSgxKSksaT1wWzZdLGE9cFs3XSk6KHA9W2ksYSxpLGEsYyxoLGMsaF0saT1jLGE9aCk7Zm9yKHZhciBtPTAsYj1lLmxlbmd0aDttPGI7bSsrKXt2YXIgXz1lW21dO2lmKCJNIj09X1swXSlzPXU9X1sxXSxvPWw9X1syXTtlbHNleyJDIj09X1swXT8oZD1bcyxvXS5jb25jYXQoXy5zbGljZSgxKSkscz1kWzZdLG89ZFs3XSk6KGQ9W3MsbyxzLG8sdSxsLHUsbF0scz11LG89bCk7dmFyIHc9ZihwLGQsbik7aWYobilnKz13O2Vsc2V7Zm9yKHZhciBFPTAsQz13Lmxlbmd0aDtFPEM7RSsrKXdbRV0uc2VnbWVudDE9eCx3W0VdLnNlZ21lbnQyPW0sd1tFXS5iZXoxPXAsd1tFXS5iZXoyPWQ7Zz1nLmNvbmNhdCh3KX19fX19cmV0dXJuIGd9ZnVuY3Rpb24gZCh0LGUscixuLGksYSl7bnVsbCE9dD8odGhpcy5hPSt0LHRoaXMuYj0rZSx0aGlzLmM9K3IsdGhpcy5kPStuLHRoaXMuZT0raSx0aGlzLmY9K2EpOih0aGlzLmE9MSx0aGlzLmI9MCx0aGlzLmM9MCx0aGlzLmQ9MSx0aGlzLmU9MCx0aGlzLmY9MCl9ZnVuY3Rpb24gZygpe3JldHVybiB0aGlzLngrSSt0aGlzLnkrSSt0aGlzLndpZHRoKyIgw5cgIit0aGlzLmhlaWdodH1mdW5jdGlvbiB4KHQsZSxyLG4saSxhKXtmdW5jdGlvbiBzKHQpe3JldHVybigodSp0K2gpKnQrYykqdH1mdW5jdGlvbiBvKHQsZSl7dmFyIHIsbixpLGEsbyxsO2ZvcihpPXQsbD0wO2w8ODtsKyspe2lmKGE9cyhpKS10LFgoYSk8ZSlyZXR1cm4gaTtpZihvPSgzKnUqaSsyKmgpKmkrYyxYKG8pPDFlLTYpYnJlYWs7aS09YS9vfWlmKHI9MCxuPTEsKGk9dCk8cilyZXR1cm4gcjtpZihpPm4pcmV0dXJuIG47Zm9yKDtyPG47KXtpZihhPXMoaSksWChhLXQpPGUpcmV0dXJuIGk7dD5hP3I9aTpuPWksaT0obi1yKS8yK3J9cmV0dXJuIGl9dmFyIGM9MyplLGg9Myoobi1lKS1jLHU9MS1jLWgsbD0zKnIsZj0zKihpLXIpLWwscD0xLWwtZjtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgcj1vKHQsZSk7cmV0dXJuKChwKnIrZikqcitsKSpyfSh0LDEvKDIwMCphKSl9ZnVuY3Rpb24gdih0LGUpe3ZhciByPVtdLG49e307aWYodGhpcy5tcz1lLHRoaXMudGltZXM9MSx0KXtmb3IodmFyIGkgaW4gdCl0W2tdKGkpJiYobltaKGkpXT10W2ldLHIucHVzaChaKGkpKSk7ci5zb3J0KHV0KX10aGlzLmFuaW09bix0aGlzLnRvcD1yW3IubGVuZ3RoLTFdLHRoaXMucGVyY2VudHM9cn1mdW5jdGlvbiB5KHQsbixpLGEscyxvKXtpPVooaSk7dmFyIGMsaCx1LGwsZixwLGc9dC5tcyx2PXt9LHk9e30sbT17fTtpZihhKWZvcihfPTAsRT1vZS5sZW5ndGg7XzxFO18rKyl7dmFyIGI9b2VbX107aWYoYi5lbC5pZD09bi5pZCYmYi5hbmltPT10KXtiLnBlcmNlbnQhPWk/KG9lLnNwbGljZShfLDEpLHU9MSk6aD1iLG4uYXR0cihiLnRvdGFsT3JpZ2luKTticmVha319ZWxzZSBhPSt5O2Zvcih2YXIgXz0wLEU9dC5wZXJjZW50cy5sZW5ndGg7XzxFO18rKyl7aWYodC5wZXJjZW50c1tfXT09aXx8dC5wZXJjZW50c1tfXT5hKnQudG9wKXtpPXQucGVyY2VudHNbX10sZj10LnBlcmNlbnRzW18tMV18fDAsZz1nL3QudG9wKihpLWYpLGw9dC5wZXJjZW50c1tfKzFdLGM9dC5hbmltW2ldO2JyZWFrfWEmJm4uYXR0cih0LmFuaW1bdC5wZXJjZW50c1tfXV0pfWlmKGMpe2lmKGgpaC5pbml0c3RhdHVzPWEsaC5zdGFydD1uZXcgRGF0ZS1oLm1zKmE7ZWxzZXtmb3IodmFyIEMgaW4gYylpZihjW2tdKEMpJiYocnRba10oQyl8fG4ucGFwZXIuY3VzdG9tQXR0cmlidXRlc1trXShDKSkpc3dpdGNoKHZbQ109bi5hdHRyKEMpLG51bGw9PXZbQ10mJih2W0NdPWV0W0NdKSx5W0NdPWNbQ10scnRbQ10pe2Nhc2UgSDptW0NdPSh5W0NdLXZbQ10pL2c7YnJlYWs7Y2FzZSJjb2xvdXIiOnZbQ109ci5nZXRSR0IodltDXSk7dmFyIFM9ci5nZXRSR0IoeVtDXSk7bVtDXT17cjooUy5yLXZbQ10ucikvZyxnOihTLmctdltDXS5nKS9nLGI6KFMuYi12W0NdLmIpL2d9O2JyZWFrO2Nhc2UicGF0aCI6dmFyIEE9RnQodltDXSx5W0NdKSxCPUFbMV07Zm9yKHZbQ109QVswXSxtW0NdPVtdLF89MCxFPXZbQ10ubGVuZ3RoO188RTtfKyspe21bQ11bX109WzBdO2Zvcih2YXIgTj0xLFQ9dltDXVtfXS5sZW5ndGg7TjxUO04rKyltW0NdW19dW05dPShCW19dW05dLXZbQ11bX11bTl0pL2d9YnJlYWs7Y2FzZSJ0cmFuc2Zvcm0iOnZhciBSPW4uXyxJPWp0KFJbQ10seVtDXSk7aWYoSSlmb3IodltDXT1JLmZyb20seVtDXT1JLnRvLG1bQ109W10sbVtDXS5yZWFsPSEwLF89MCxFPXZbQ10ubGVuZ3RoO188RTtfKyspZm9yKG1bQ11bX109W3ZbQ11bX11bMF1dLE49MSxUPXZbQ11bX10ubGVuZ3RoO048VDtOKyspbVtDXVtfXVtOXT0oeVtDXVtfXVtOXS12W0NdW19dW05dKS9nO2Vsc2V7dmFyIEQ9bi5tYXRyaXh8fG5ldyBkLFA9e186e3RyYW5zZm9ybTpSLnRyYW5zZm9ybX0sZ2V0QkJveDpmdW5jdGlvbigpe3JldHVybiBuLmdldEJCb3goMSl9fTt2W0NdPVtELmEsRC5iLEQuYyxELmQsRC5lLEQuZl0sTHQoUCx5W0NdKSx5W0NdPVAuXy50cmFuc2Zvcm0sbVtDXT1bKFAubWF0cml4LmEtRC5hKS9nLChQLm1hdHJpeC5iLUQuYikvZywoUC5tYXRyaXguYy1ELmMpL2csKFAubWF0cml4LmQtRC5kKS9nLChQLm1hdHJpeC5lLUQuZSkvZywoUC5tYXRyaXguZi1ELmYpL2ddfWJyZWFrO2Nhc2UiY3N2Ijp2YXIgTD1NKGNbQ10pW0ZdKHcpLHo9TSh2W0NdKVtGXSh3KTtpZigiY2xpcC1yZWN0Ij09Qylmb3IodltDXT16LG1bQ109W10sXz16Lmxlbmd0aDtfLS07KW1bQ11bX109KExbX10tdltDXVtfXSkvZzt5W0NdPUw7YnJlYWs7ZGVmYXVsdDpmb3IoTD1bXVtPXShjW0NdKSx6PVtdW09dKHZbQ10pLG1bQ109W10sXz1uLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbQ10ubGVuZ3RoO18tLTspbVtDXVtfXT0oKExbX118fDApLSh6W19dfHwwKSkvZ312YXIgaj1jLmVhc2luZyxVPXIuZWFzaW5nX2Zvcm11bGFzW2pdO2lmKCFVKWlmKChVPU0oaikubWF0Y2goJCkpJiY1PT1VLmxlbmd0aCl7dmFyIFg9VTtVPWZ1bmN0aW9uKHQpe3JldHVybiB4KHQsK1hbMV0sK1hbMl0sK1hbM10sK1hbNF0sZyl9fWVsc2UgVT1mdDtpZihwPWMuc3RhcnR8fHQuc3RhcnR8fCtuZXcgRGF0ZSxiPXthbmltOnQscGVyY2VudDppLHRpbWVzdGFtcDpwLHN0YXJ0OnArKHQuZGVsfHwwKSxzdGF0dXM6MCxpbml0c3RhdHVzOmF8fDAsc3RvcDohMSxtczpnLGVhc2luZzpVLGZyb206dixkaWZmOm0sdG86eSxlbDpuLGNhbGxiYWNrOmMuY2FsbGJhY2sscHJldjpmLG5leHQ6bCxyZXBlYXQ6b3x8dC50aW1lcyxvcmlnaW46bi5hdHRyKCksdG90YWxPcmlnaW46c30sb2UucHVzaChiKSxhJiYhaCYmIXUmJihiLnN0b3A9ITAsYi5zdGFydD1uZXcgRGF0ZS1nKmEsMT09b2UubGVuZ3RoKSlyZXR1cm4gaGUoKTt1JiYoYi5zdGFydD1uZXcgRGF0ZS1iLm1zKmEpLDE9PW9lLmxlbmd0aCYmY2UoaGUpfWUoInJhcGhhZWwuYW5pbS5zdGFydC4iK24uaWQsbix0KX19ZnVuY3Rpb24gbSh0KXtmb3IodmFyIGU9MDtlPG9lLmxlbmd0aDtlKyspb2VbZV0uZWwucGFwZXI9PXQmJm9lLnNwbGljZShlLS0sMSl9ci52ZXJzaW9uPSIyLjEuMiIsci5ldmU9ZTt2YXIgYixfLHc9L1ssIF0rLyxFPXtjaXJjbGU6MSxyZWN0OjEscGF0aDoxLGVsbGlwc2U6MSx0ZXh0OjEsaW1hZ2U6MX0sQz0vXHsoXGQrKVx9L2csaz0iaGFzT3duUHJvcGVydHkiLFM9e2RvYzpkb2N1bWVudCx3aW46dH0sQT17d2FzOk9iamVjdC5wcm90b3R5cGVba10uY2FsbChTLndpbiwiUmFwaGFlbCIpLGlzOlMud2luLlJhcGhhZWx9LEI9ZnVuY3Rpb24oKXt0aGlzLmNhPXRoaXMuY3VzdG9tQXR0cmlidXRlcz17fX0sTj0iYXBwbHkiLE89ImNvbmNhdCIsVD0ib250b3VjaHN0YXJ0ImluIFMud2lufHxTLndpbi5Eb2N1bWVudFRvdWNoJiZTLmRvYyBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2gsUj0iIixJPSIgIixNPVN0cmluZyxGPSJzcGxpdCIsRD0iY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNlbW92ZSBtb3VzZW91dCBtb3VzZW92ZXIgbW91c2V1cCB0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCJbRl0oSSksUD17bW91c2Vkb3duOiJ0b3VjaHN0YXJ0Iixtb3VzZW1vdmU6InRvdWNobW92ZSIsbW91c2V1cDoidG91Y2hlbmQifSxMPU0ucHJvdG90eXBlLnRvTG93ZXJDYXNlLHo9TWF0aCxqPXoubWF4LFU9ei5taW4sWD16LmFicyxHPXoucG93LHE9ei5QSSxIPSJudW1iZXIiLFc9ImFycmF5IixWPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsUT0oci5fSVNVUkw9L151cmxcKFsnIl0/KFteXCldKz8pWyciXT9cKSQvaSwvXlxzKigoI1thLWZcZF17Nn0pfCgjW2EtZlxkXXszfSl8cmdiYT9cKFxzKihbXGRcLl0rJT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSslPyg/OlxzKixccypbXGRcLl0rJT8pPylccypcKXxoc2JhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8pJT9ccypcKXxoc2xhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8pJT9ccypcKSlccyokL2kpLFk9e05hTjoxLEluZmluaXR5OjEsIi1JbmZpbml0eSI6MX0sJD0vXig/OmN1YmljLSk/YmV6aWVyXCgoW14sXSspLChbXixdKyksKFteLF0rKSwoW15cKV0rKVwpLyxLPXoucm91bmQsWj1wYXJzZUZsb2F0LEo9cGFyc2VJbnQsdHQ9TS5wcm90b3R5cGUudG9VcHBlckNhc2UsZXQ9ci5fYXZhaWxhYmxlQXR0cnM9eyJhcnJvdy1lbmQiOiJub25lIiwiYXJyb3ctc3RhcnQiOiJub25lIixibHVyOjAsImNsaXAtcmVjdCI6IjAgMCAxZTkgMWU5IixjdXJzb3I6ImRlZmF1bHQiLGN4OjAsY3k6MCxmaWxsOiIjZmZmIiwiZmlsbC1vcGFjaXR5IjoxLGZvbnQ6JzEwcHggIkFyaWFsIicsImZvbnQtZmFtaWx5IjonIkFyaWFsIicsImZvbnQtc2l6ZSI6IjEwIiwiZm9udC1zdHlsZSI6Im5vcm1hbCIsImZvbnQtd2VpZ2h0Ijo0MDAsZ3JhZGllbnQ6MCxoZWlnaHQ6MCxocmVmOiJodHRwOi8vcmFwaGFlbGpzLmNvbS8iLCJsZXR0ZXItc3BhY2luZyI6MCxvcGFjaXR5OjEscGF0aDoiTTAsMCIscjowLHJ4OjAscnk6MCxzcmM6IiIsc3Ryb2tlOiIjMDAwIiwic3Ryb2tlLWRhc2hhcnJheSI6IiIsInN0cm9rZS1saW5lY2FwIjoiYnV0dCIsInN0cm9rZS1saW5lam9pbiI6ImJ1dHQiLCJzdHJva2UtbWl0ZXJsaW1pdCI6MCwic3Ryb2tlLW9wYWNpdHkiOjEsInN0cm9rZS13aWR0aCI6MSx0YXJnZXQ6Il9ibGFuayIsInRleHQtYW5jaG9yIjoibWlkZGxlIix0aXRsZToiUmFwaGFlbCIsdHJhbnNmb3JtOiIiLHdpZHRoOjAseDowLHk6MH0scnQ9ci5fYXZhaWxhYmxlQW5pbUF0dHJzPXtibHVyOkgsImNsaXAtcmVjdCI6ImNzdiIsY3g6SCxjeTpILGZpbGw6ImNvbG91ciIsImZpbGwtb3BhY2l0eSI6SCwiZm9udC1zaXplIjpILGhlaWdodDpILG9wYWNpdHk6SCxwYXRoOiJwYXRoIixyOkgscng6SCxyeTpILHN0cm9rZToiY29sb3VyIiwic3Ryb2tlLW9wYWNpdHkiOkgsInN0cm9rZS13aWR0aCI6SCx0cmFuc2Zvcm06InRyYW5zZm9ybSIsd2lkdGg6SCx4OkgseTpIfSxudD0vW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKixbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qLyxpdD17aHM6MSxyZzoxfSxhdD0vLD8oW2FjaGxtcXJzdHZ4el0pLD8vZ2ksc3Q9LyhbYWNobG1ycXN0dnpdKVtceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5LF0qKCgtP1xkKlwuP1xkKig/OmVbXC0rXT9cZCspP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSosP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSopKykvZ2ksb3Q9LyhbcnN0bV0pW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjksXSooKC0/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/W1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKiw/W1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKikrKS9naSxjdD0vKC0/XGQqXC4/XGQqKD86ZVtcLStdP1xkKyk/KVtceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSosP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSovZ2ksaHQ9KHIuX3JhZGlhbF9ncmFkaWVudD0vXnIoPzpcKChbXixdKz8pW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKixbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qKFteXCldKz8pXCkpPy8se30pLHV0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFoodCktWihlKX0sbHQ9ZnVuY3Rpb24oKXt9LGZ0PWZ1bmN0aW9uKHQpe3JldHVybiB0fSxwdD1yLl9yZWN0UGF0aD1mdW5jdGlvbih0LGUscixuLGkpe3JldHVybiBpP1tbIk0iLHQraSxlXSxbImwiLHItMippLDBdLFsiYSIsaSxpLDAsMCwxLGksaV0sWyJsIiwwLG4tMippXSxbImEiLGksaSwwLDAsMSwtaSxpXSxbImwiLDIqaS1yLDBdLFsiYSIsaSxpLDAsMCwxLC1pLC1pXSxbImwiLDAsMippLW5dLFsiYSIsaSxpLDAsMCwxLGksLWldLFsieiJdXTpbWyJNIix0LGVdLFsibCIsciwwXSxbImwiLDAsbl0sWyJsIiwtciwwXSxbInoiXV19LGR0PWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBudWxsPT1uJiYobj1yKSxbWyJNIix0LGVdLFsibSIsMCwtbl0sWyJhIixyLG4sMCwxLDEsMCwyKm5dLFsiYSIscixuLDAsMSwxLDAsLTIqbl0sWyJ6Il1dfSxndD1yLl9nZXRQYXRoPXtwYXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0LmF0dHIoInBhdGgiKX0sY2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIGR0KGUuY3gsZS5jeSxlLnIpfSxlbGxpcHNlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIGR0KGUuY3gsZS5jeSxlLnJ4LGUucnkpfSxyZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIHB0KGUueCxlLnksZS53aWR0aCxlLmhlaWdodCxlLnIpfSxpbWFnZTpmdW5jdGlvbih0KXt2YXIgZT10LmF0dHJzO3JldHVybiBwdChlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpfSx0ZXh0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2dldEJCb3goKTtyZXR1cm4gcHQoZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0KX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2dldEJCb3goKTtyZXR1cm4gcHQoZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0KX19LHh0PXIubWFwUGF0aD1mdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybiB0O3ZhciByLG4saSxhLHMsbyxjO2Zvcih0PUZ0KHQpLGk9MCxzPXQubGVuZ3RoO2k8cztpKyspZm9yKGM9dFtpXSxhPTEsbz1jLmxlbmd0aDthPG87YSs9MilyPWUueChjW2FdLGNbYSsxXSksbj1lLnkoY1thXSxjW2ErMV0pLGNbYV09cixjW2ErMV09bjtyZXR1cm4gdH07aWYoci5fZz1TLHIudHlwZT1TLndpbi5TVkdBbmdsZXx8Uy5kb2MuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNCYXNpY1N0cnVjdHVyZSIsIjEuMSIpPyJTVkciOiJWTUwiLCJWTUwiPT1yLnR5cGUpe3ZhciB2dCx5dD1TLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZih5dC5pbm5lckhUTUw9Jzx2OnNoYXBlIGFkaj0iMSIvPicsdnQ9eXQuZmlyc3RDaGlsZCx2dC5zdHlsZS5iZWhhdmlvcj0idXJsKCNkZWZhdWx0I1ZNTCkiLCF2dHx8Im9iamVjdCIhPXR5cGVvZiB2dC5hZGopcmV0dXJuIHIudHlwZT1SO3l0PW51bGx9ci5zdmc9IShyLnZtbD0iVk1MIj09ci50eXBlKSxyLl9QYXBlcj1CLHIuZm49Xz1CLnByb3RvdHlwZT1yLnByb3RvdHlwZSxyLl9pZD0wLHIuX29pZD0wLHIuaXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1MLmNhbGwoZSksImZpbml0ZSI9PWU/IVlba10oK3QpOiJhcnJheSI9PWU/dCBpbnN0YW5jZW9mIEFycmF5OiJudWxsIj09ZSYmbnVsbD09PXR8fGU9PXR5cGVvZiB0JiZudWxsIT09dHx8Im9iamVjdCI9PWUmJnQ9PT1PYmplY3QodCl8fCJhcnJheSI9PWUmJkFycmF5LmlzQXJyYXkmJkFycmF5LmlzQXJyYXkodCl8fFYuY2FsbCh0KS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpPT1lfSxyLmFuZ2xlPWZ1bmN0aW9uKHQsZSxuLGksYSxzKXtpZihudWxsPT1hKXt2YXIgbz10LW4sYz1lLWk7cmV0dXJuIG98fGM/KDE4MCsxODAqei5hdGFuMigtYywtbykvcSszNjApJTM2MDowfXJldHVybiByLmFuZ2xlKHQsZSxhLHMpLXIuYW5nbGUobixpLGEscyl9LHIucmFkPWZ1bmN0aW9uKHQpe3JldHVybiB0JTM2MCpxLzE4MH0sci5kZWc9ZnVuY3Rpb24odCl7cmV0dXJuIDE4MCp0L3ElMzYwfSxyLnNuYXBUbz1mdW5jdGlvbih0LGUsbil7aWYobj1yLmlzKG4sImZpbml0ZSIpP246MTAsci5pcyh0LFcpKXtmb3IodmFyIGk9dC5sZW5ndGg7aS0tOylpZihYKHRbaV0tZSk8PW4pcmV0dXJuIHRbaV19ZWxzZXt0PSt0O3ZhciBhPWUldDtpZihhPG4pcmV0dXJuIGUtYTtpZihhPnQtbilyZXR1cm4gZS1hK3R9cmV0dXJuIGV9O3IuY3JlYXRlVVVJRD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UodCxlKS50b1VwcGVyQ2FzZSgpfX0oL1t4eV0vZyxmdW5jdGlvbih0KXt2YXIgZT0xNip6LnJhbmRvbSgpfDA7cmV0dXJuKCJ4Ij09dD9lOjMmZXw4KS50b1N0cmluZygxNil9KTtyLnNldFdpbmRvdz1mdW5jdGlvbih0KXtlKCJyYXBoYWVsLnNldFdpbmRvdyIscixTLndpbix0KSxTLndpbj10LFMuZG9jPVMud2luLmRvY3VtZW50LHIuX2VuZ2luZS5pbml0V2luJiZyLl9lbmdpbmUuaW5pdFdpbihTLndpbil9O3ZhciBtdD1mdW5jdGlvbih0KXtpZihyLnZtbCl7dmFyIGUsbj0vXlxzK3xccyskL2c7dHJ5e3ZhciBpPW5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpO2kud3JpdGUoIjxib2R5PiIpLGkuY2xvc2UoKSxlPWkuYm9keX1jYXRjaCh0KXtlPWNyZWF0ZVBvcHVwKCkuZG9jdW1lbnQuYm9keX12YXIgcz1lLmNyZWF0ZVRleHRSYW5nZSgpO210PWEoZnVuY3Rpb24odCl7dHJ5e2Uuc3R5bGUuY29sb3I9TSh0KS5yZXBsYWNlKG4sUik7dmFyIHI9cy5xdWVyeUNvbW1hbmRWYWx1ZSgiRm9yZUNvbG9yIik7cmV0dXJuIHI9KDI1NSZyKTw8MTZ8NjUyODAmcnwoMTY3MTE2ODAmcik+Pj4xNiwiIyIrKCIwMDAwMDAiK3IudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Y2F0Y2godCl7cmV0dXJuIm5vbmUifX0pfWVsc2V7dmFyIG89Uy5kb2MuY3JlYXRlRWxlbWVudCgiaSIpO28udGl0bGU9IlJhcGhhw6tsIENvbG91ciBQaWNrZXIiLG8uc3R5bGUuZGlzcGxheT0ibm9uZSIsUy5kb2MuYm9keS5hcHBlbmRDaGlsZChvKSxtdD1hKGZ1bmN0aW9uKHQpe3JldHVybiBvLnN0eWxlLmNvbG9yPXQsUy5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShvLFIpLmdldFByb3BlcnR5VmFsdWUoImNvbG9yIil9KX1yZXR1cm4gbXQodCl9LGJ0PWZ1bmN0aW9uKCl7cmV0dXJuImhzYigiK1t0aGlzLmgsdGhpcy5zLHRoaXMuYl0rIikifSxfdD1mdW5jdGlvbigpe3JldHVybiJoc2woIitbdGhpcy5oLHRoaXMucyx0aGlzLmxdKyIpIn0sd3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZXh9LEV0PWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT1lJiZyLmlzKHQsIm9iamVjdCIpJiYiciJpbiB0JiYiZyJpbiB0JiYiYiJpbiB0JiYobj10LmIsZT10LmcsdD10LnIpLG51bGw9PWUmJnIuaXModCwic3RyaW5nIikpe3ZhciBpPXIuZ2V0UkdCKHQpO3Q9aS5yLGU9aS5nLG49aS5ifXJldHVybih0PjF8fGU+MXx8bj4xKSYmKHQvPTI1NSxlLz0yNTUsbi89MjU1KSxbdCxlLG5dfSxDdD1mdW5jdGlvbih0LGUsbixpKXt0Kj0yNTUsZSo9MjU1LG4qPTI1NTt2YXIgYT17cjp0LGc6ZSxiOm4saGV4OnIucmdiKHQsZSxuKSx0b1N0cmluZzp3dH07cmV0dXJuIHIuaXMoaSwiZmluaXRlIikmJihhLm9wYWNpdHk9aSksYX07ci5jb2xvcj1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gci5pcyh0LCJvYmplY3QiKSYmImgiaW4gdCYmInMiaW4gdCYmImIiaW4gdD8oZT1yLmhzYjJyZ2IodCksdC5yPWUucix0Lmc9ZS5nLHQuYj1lLmIsdC5oZXg9ZS5oZXgpOnIuaXModCwib2JqZWN0IikmJiJoImluIHQmJiJzImluIHQmJiJsImluIHQ/KGU9ci5oc2wycmdiKHQpLHQucj1lLnIsdC5nPWUuZyx0LmI9ZS5iLHQuaGV4PWUuaGV4KTooci5pcyh0LCJzdHJpbmciKSYmKHQ9ci5nZXRSR0IodCkpLHIuaXModCwib2JqZWN0IikmJiJyImluIHQmJiJnImluIHQmJiJiImluIHQ/KGU9ci5yZ2IyaHNsKHQpLHQuaD1lLmgsdC5zPWUucyx0Lmw9ZS5sLGU9ci5yZ2IyaHNiKHQpLHQudj1lLmIpOih0PXtoZXg6Im5vbmUifSx0LnI9dC5nPXQuYj10Lmg9dC5zPXQudj10Lmw9LTEpKSx0LnRvU3RyaW5nPXd0LHR9LHIuaHNiMnJnYj1mdW5jdGlvbih0LGUscixuKXt0aGlzLmlzKHQsIm9iamVjdCIpJiYiaCJpbiB0JiYicyJpbiB0JiYiYiJpbiB0JiYocj10LmIsZT10LnMsdD10Lmgsbj10Lm8pLHQqPTM2MDt2YXIgaSxhLHMsbyxjO3JldHVybiB0PXQlMzYwLzYwLGM9ciplLG89YyooMS1YKHQlMi0xKSksaT1hPXM9ci1jLHQ9fn50LGkrPVtjLG8sMCwwLG8sY11bdF0sYSs9W28sYyxjLG8sMCwwXVt0XSxzKz1bMCwwLG8sYyxjLG9dW3RdLEN0KGksYSxzLG4pfSxyLmhzbDJyZ2I9ZnVuY3Rpb24odCxlLHIsbil7dGhpcy5pcyh0LCJvYmplY3QiKSYmImgiaW4gdCYmInMiaW4gdCYmImwiaW4gdCYmKHI9dC5sLGU9dC5zLHQ9dC5oKSwodD4xfHxlPjF8fHI+MSkmJih0Lz0zNjAsZS89MTAwLHIvPTEwMCksdCo9MzYwO3ZhciBpLGEscyxvLGM7cmV0dXJuIHQ9dCUzNjAvNjAsYz0yKmUqKHI8LjU/cjoxLXIpLG89YyooMS1YKHQlMi0xKSksaT1hPXM9ci1jLzIsdD1+fnQsaSs9W2MsbywwLDAsbyxjXVt0XSxhKz1bbyxjLGMsbywwLDBdW3RdLHMrPVswLDAsbyxjLGMsb11bdF0sQ3QoaSxhLHMsbil9LHIucmdiMmhzYj1mdW5jdGlvbih0LGUscil7cj1FdCh0LGUsciksdD1yWzBdLGU9clsxXSxyPXJbMl07dmFyIG4saSxhLHM7cmV0dXJuIGE9aih0LGUscikscz1hLVUodCxlLHIpLG49MD09cz9udWxsOmE9PXQ/KGUtcikvczphPT1lPyhyLXQpL3MrMjoodC1lKS9zKzQsbj0obiszNjApJTYqNjAvMzYwLGk9MD09cz8wOnMvYSx7aDpuLHM6aSxiOmEsdG9TdHJpbmc6YnR9fSxyLnJnYjJoc2w9ZnVuY3Rpb24odCxlLHIpe3I9RXQodCxlLHIpLHQ9clswXSxlPXJbMV0scj1yWzJdO3ZhciBuLGksYSxzLG8sYztyZXR1cm4gcz1qKHQsZSxyKSxvPVUodCxlLHIpLGM9cy1vLG49MD09Yz9udWxsOnM9PXQ/KGUtcikvYzpzPT1lPyhyLXQpL2MrMjoodC1lKS9jKzQsbj0obiszNjApJTYqNjAvMzYwLGE9KHMrbykvMixpPTA9PWM/MDphPC41P2MvKDIqYSk6Yy8oMi0yKmEpLHtoOm4sczppLGw6YSx0b1N0cmluZzpfdH19LHIuX3BhdGgyc3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pbigiLCIpLnJlcGxhY2UoYXQsIiQxIil9O3IuX3ByZWxvYWQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1TLmRvYy5jcmVhdGVFbGVtZW50KCJpbWciKTtyLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbSIsci5vbmxvYWQ9ZnVuY3Rpb24oKXtlLmNhbGwodGhpcyksdGhpcy5vbmxvYWQ9bnVsbCxTLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtTLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxTLmRvYy5ib2R5LmFwcGVuZENoaWxkKHIpLHIuc3JjPXR9O3IuZ2V0UkdCPWEoZnVuY3Rpb24odCl7aWYoIXR8fCh0PU0odCkpLmluZGV4T2YoIi0iKSsxKXJldHVybntyOi0xLGc6LTEsYjotMSxoZXg6Im5vbmUiLGVycm9yOjEsdG9TdHJpbmc6c307aWYoIm5vbmUiPT10KXJldHVybntyOi0xLGc6LTEsYjotMSxoZXg6Im5vbmUiLHRvU3RyaW5nOnN9OyEoaXRba10odC50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZygwLDIpKXx8IiMiPT10LmNoYXJBdCgpKSYmKHQ9bXQodCkpO3ZhciBlLG4saSxhLG8sYyxoPXQubWF0Y2goUSk7cmV0dXJuIGg/KGhbMl0mJihpPUooaFsyXS5zdWJzdHJpbmcoNSksMTYpLG49SihoWzJdLnN1YnN0cmluZygzLDUpLDE2KSxlPUooaFsyXS5zdWJzdHJpbmcoMSwzKSwxNikpLGhbM10mJihpPUooKG89aFszXS5jaGFyQXQoMykpK28sMTYpLA0Kbj1KKChvPWhbM10uY2hhckF0KDIpKStvLDE2KSxlPUooKG89aFszXS5jaGFyQXQoMSkpK28sMTYpKSxoWzRdJiYoYz1oWzRdW0ZdKG50KSxlPVooY1swXSksIiUiPT1jWzBdLnNsaWNlKC0xKSYmKGUqPTIuNTUpLG49WihjWzFdKSwiJSI9PWNbMV0uc2xpY2UoLTEpJiYobio9Mi41NSksaT1aKGNbMl0pLCIlIj09Y1syXS5zbGljZSgtMSkmJihpKj0yLjU1KSwicmdiYSI9PWhbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpJiYoYT1aKGNbM10pKSxjWzNdJiYiJSI9PWNbM10uc2xpY2UoLTEpJiYoYS89MTAwKSksaFs1XT8oYz1oWzVdW0ZdKG50KSxlPVooY1swXSksIiUiPT1jWzBdLnNsaWNlKC0xKSYmKGUqPTIuNTUpLG49WihjWzFdKSwiJSI9PWNbMV0uc2xpY2UoLTEpJiYobio9Mi41NSksaT1aKGNbMl0pLCIlIj09Y1syXS5zbGljZSgtMSkmJihpKj0yLjU1KSwoImRlZyI9PWNbMF0uc2xpY2UoLTMpfHwiwrAiPT1jWzBdLnNsaWNlKC0xKSkmJihlLz0zNjApLCJoc2JhIj09aFsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihhPVooY1szXSkpLGNbM10mJiIlIj09Y1szXS5zbGljZSgtMSkmJihhLz0xMDApLHIuaHNiMnJnYihlLG4saSxhKSk6aFs2XT8oYz1oWzZdW0ZdKG50KSxlPVooY1swXSksIiUiPT1jWzBdLnNsaWNlKC0xKSYmKGUqPTIuNTUpLG49WihjWzFdKSwiJSI9PWNbMV0uc2xpY2UoLTEpJiYobio9Mi41NSksaT1aKGNbMl0pLCIlIj09Y1syXS5zbGljZSgtMSkmJihpKj0yLjU1KSwoImRlZyI9PWNbMF0uc2xpY2UoLTMpfHwiwrAiPT1jWzBdLnNsaWNlKC0xKSkmJihlLz0zNjApLCJoc2xhIj09aFsxXS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNCkmJihhPVooY1szXSkpLGNbM10mJiIlIj09Y1szXS5zbGljZSgtMSkmJihhLz0xMDApLHIuaHNsMnJnYihlLG4saSxhKSk6KGg9e3I6ZSxnOm4sYjppLHRvU3RyaW5nOnN9LGguaGV4PSIjIisoMTY3NzcyMTZ8aXxuPDw4fGU8PDE2KS50b1N0cmluZygxNikuc2xpY2UoMSksci5pcyhhLCJmaW5pdGUiKSYmKGgub3BhY2l0eT1hKSxoKSk6e3I6LTEsZzotMSxiOi0xLGhleDoibm9uZSIsZXJyb3I6MSx0b1N0cmluZzpzfX0sciksci5oc2I9YShmdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuaHNiMnJnYih0LGUsbikuaGV4fSksci5oc2w9YShmdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuaHNsMnJnYih0LGUsbikuaGV4fSksci5yZ2I9YShmdW5jdGlvbih0LGUscil7cmV0dXJuIiMiKygxNjc3NzIxNnxyfGU8PDh8dDw8MTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0pLHIuZ2V0Q29sb3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRDb2xvci5zdGFydD10aGlzLmdldENvbG9yLnN0YXJ0fHx7aDowLHM6MSxiOnR8fC43NX0scj10aGlzLmhzYjJyZ2IoZS5oLGUucyxlLmIpO3JldHVybiBlLmgrPS4wNzUsZS5oPjEmJihlLmg9MCxlLnMtPS4yLGUuczw9MCYmKHRoaXMuZ2V0Q29sb3Iuc3RhcnQ9e2g6MCxzOjEsYjplLmJ9KSksci5oZXh9LHIuZ2V0Q29sb3IucmVzZXQ9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5zdGFydH0sci5wYXJzZVBhdGhTdHJpbmc9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGU9a3QodCk7aWYoZS5hcnIpcmV0dXJuIEF0KGUuYXJyKTt2YXIgbj17YTo3LGM6NixoOjEsbDoyLG06MixyOjQscTo0LHM6NCx0OjIsdjoxLHo6MH0saT1bXTtyZXR1cm4gci5pcyh0LFcpJiZyLmlzKHRbMF0sVykmJihpPUF0KHQpKSxpLmxlbmd0aHx8TSh0KS5yZXBsYWNlKHN0LGZ1bmN0aW9uKHQsZSxyKXt2YXIgYT1bXSxzPWUudG9Mb3dlckNhc2UoKTtpZihyLnJlcGxhY2UoY3QsZnVuY3Rpb24odCxlKXtlJiZhLnB1c2goK2UpfSksIm0iPT1zJiZhLmxlbmd0aD4yJiYoaS5wdXNoKFtlXVtPXShhLnNwbGljZSgwLDIpKSkscz0ibCIsZT0ibSI9PWU/ImwiOiJMIiksInIiPT1zKWkucHVzaChbZV1bT10oYSkpO2Vsc2UgZm9yKDthLmxlbmd0aD49bltzXSYmKGkucHVzaChbZV1bT10oYS5zcGxpY2UoMCxuW3NdKSkpLG5bc10pOyk7fSksaS50b1N0cmluZz1yLl9wYXRoMnN0cmluZyxlLmFycj1BdChpKSxpfSxyLnBhcnNlVHJhbnNmb3JtU3RyaW5nPWEoZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGU9W107cmV0dXJuIHIuaXModCxXKSYmci5pcyh0WzBdLFcpJiYoZT1BdCh0KSksZS5sZW5ndGh8fE0odCkucmVwbGFjZShvdCxmdW5jdGlvbih0LHIsbil7dmFyIGk9W107TC5jYWxsKHIpO24ucmVwbGFjZShjdCxmdW5jdGlvbih0LGUpe2UmJmkucHVzaCgrZSl9KSxlLnB1c2goW3JdW09dKGkpKX0pLGUudG9TdHJpbmc9ci5fcGF0aDJzdHJpbmcsZX0pO3ZhciBrdD1mdW5jdGlvbih0KXt2YXIgZT1rdC5wcz1rdC5wc3x8e307cmV0dXJuIGVbdF0/ZVt0XS5zbGVlcD0xMDA6ZVt0XT17c2xlZXA6MTAwfSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zm9yKHZhciByIGluIGUpZVtrXShyKSYmciE9dCYmIS0tZVtyXS5zbGVlcCYmZGVsZXRlIGVbcl19KSxlW3RdfTtyLmZpbmREb3RzQXRTZWdtZW50PWZ1bmN0aW9uKHQsZSxyLG4saSxhLHMsbyxjKXt2YXIgaD0xLWMsdT1HKGgsMyksbD1HKGgsMiksZj1jKmMscD1mKmMsZD11KnQrMypsKmMqciszKmgqYypjKmkrcCpzLGc9dSplKzMqbCpjKm4rMypoKmMqYyphK3Aqbyx4PXQrMipjKihyLXQpK2YqKGktMipyK3QpLHY9ZSsyKmMqKG4tZSkrZiooYS0yKm4rZSkseT1yKzIqYyooaS1yKStmKihzLTIqaStyKSxtPW4rMipjKihhLW4pK2YqKG8tMiphK24pLGI9aCp0K2MqcixfPWgqZStjKm4sdz1oKmkrYypzLEU9aCphK2MqbyxDPTkwLTE4MCp6LmF0YW4yKHgteSx2LW0pL3E7cmV0dXJuKHg+eXx8djxtKSYmKEMrPTE4MCkse3g6ZCx5OmcsbTp7eDp4LHk6dn0sbjp7eDp5LHk6bX0sc3RhcnQ6e3g6Yix5Ol99LGVuZDp7eDp3LHk6RX0sYWxwaGE6Q319LHIuYmV6aWVyQkJveD1mdW5jdGlvbih0LGUsbixpLGEscyxvLGMpe3IuaXModCwiYXJyYXkiKXx8KHQ9W3QsZSxuLGksYSxzLG8sY10pO3ZhciBoPU10LmFwcGx5KG51bGwsdCk7cmV0dXJue3g6aC5taW4ueCx5OmgubWluLnkseDI6aC5tYXgueCx5MjpoLm1heC55LHdpZHRoOmgubWF4LngtaC5taW4ueCxoZWlnaHQ6aC5tYXgueS1oLm1pbi55fX0sci5pc1BvaW50SW5zaWRlQkJveD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU+PXQueCYmZTw9dC54MiYmcj49dC55JiZyPD10LnkyfSxyLmlzQkJveEludGVyc2VjdD1mdW5jdGlvbih0LGUpe3ZhciBuPXIuaXNQb2ludEluc2lkZUJCb3g7cmV0dXJuIG4oZSx0LngsdC55KXx8bihlLHQueDIsdC55KXx8bihlLHQueCx0LnkyKXx8bihlLHQueDIsdC55Mil8fG4odCxlLngsZS55KXx8bih0LGUueDIsZS55KXx8bih0LGUueCxlLnkyKXx8bih0LGUueDIsZS55Mil8fCh0Lng8ZS54MiYmdC54PmUueHx8ZS54PHQueDImJmUueD50LngpJiYodC55PGUueTImJnQueT5lLnl8fGUueTx0LnkyJiZlLnk+dC55KX0sci5wYXRoSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAodCxlKX0sci5wYXRoSW50ZXJzZWN0aW9uTnVtYmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAodCxlLDEpfSxyLmlzUG9pbnRJbnNpZGVQYXRoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1yLnBhdGhCQm94KHQpO3JldHVybiByLmlzUG9pbnRJbnNpZGVCQm94KGksZSxuKSYmcCh0LFtbIk0iLGUsbl0sWyJIIixpLngyKzEwXV0sMSklMj09MX0sci5fcmVtb3ZlZEZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSgicmFwaGFlbC5sb2ciLG51bGwsIlJhcGhhw6tsOiB5b3UgYXJlIGNhbGxpbmcgdG8gbWV0aG9kIOKAnCIrdCsi4oCdIG9mIHJlbW92ZWQgb2JqZWN0Iix0KX19O3ZhciBTdD1yLnBhdGhCQm94PWZ1bmN0aW9uKHQpe3ZhciBlPWt0KHQpO2lmKGUuYmJveClyZXR1cm4gbihlLmJib3gpO2lmKCF0KXJldHVybnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjAseDI6MCx5MjowfTt0PUZ0KHQpO2Zvcih2YXIgcixpPTAsYT0wLHM9W10sbz1bXSxjPTAsaD10Lmxlbmd0aDtjPGg7YysrKWlmKHI9dFtjXSwiTSI9PXJbMF0paT1yWzFdLGE9clsyXSxzLnB1c2goaSksby5wdXNoKGEpO2Vsc2V7dmFyIHU9TXQoaSxhLHJbMV0sclsyXSxyWzNdLHJbNF0scls1XSxyWzZdKTtzPXNbT10odS5taW4ueCx1Lm1heC54KSxvPW9bT10odS5taW4ueSx1Lm1heC55KSxpPXJbNV0sYT1yWzZdfXZhciBsPVVbTl0oMCxzKSxmPVVbTl0oMCxvKSxwPWpbTl0oMCxzKSxkPWpbTl0oMCxvKSxnPXAtbCx4PWQtZix2PXt4OmwseTpmLHgyOnAseTI6ZCx3aWR0aDpnLGhlaWdodDp4LGN4OmwrZy8yLGN5OmYreC8yfTtyZXR1cm4gZS5iYm94PW4odiksdn0sQXQ9ZnVuY3Rpb24odCl7dmFyIGU9bih0KTtyZXR1cm4gZS50b1N0cmluZz1yLl9wYXRoMnN0cmluZyxlfSxCdD1yLl9wYXRoVG9SZWxhdGl2ZT1mdW5jdGlvbih0KXt2YXIgZT1rdCh0KTtpZihlLnJlbClyZXR1cm4gQXQoZS5yZWwpO3IuaXModCxXKSYmci5pcyh0JiZ0WzBdLFcpfHwodD1yLnBhcnNlUGF0aFN0cmluZyh0KSk7dmFyIG49W10saT0wLGE9MCxzPTAsbz0wLGM9MDsiTSI9PXRbMF1bMF0mJihpPXRbMF1bMV0sYT10WzBdWzJdLHM9aSxvPWEsYysrLG4ucHVzaChbIk0iLGksYV0pKTtmb3IodmFyIGg9Yyx1PXQubGVuZ3RoO2g8dTtoKyspe3ZhciBsPW5baF09W10sZj10W2hdO2lmKGZbMF0hPUwuY2FsbChmWzBdKSlzd2l0Y2gobFswXT1MLmNhbGwoZlswXSksbFswXSl7Y2FzZSJhIjpsWzFdPWZbMV0sbFsyXT1mWzJdLGxbM109ZlszXSxsWzRdPWZbNF0sbFs1XT1mWzVdLGxbNl09KyhmWzZdLWkpLnRvRml4ZWQoMyksbFs3XT0rKGZbN10tYSkudG9GaXhlZCgzKTticmVhaztjYXNlInYiOmxbMV09KyhmWzFdLWEpLnRvRml4ZWQoMyk7YnJlYWs7Y2FzZSJtIjpzPWZbMV0sbz1mWzJdO2RlZmF1bHQ6Zm9yKHZhciBwPTEsZD1mLmxlbmd0aDtwPGQ7cCsrKWxbcF09KyhmW3BdLShwJTI/aTphKSkudG9GaXhlZCgzKX1lbHNle2w9bltoXT1bXSwibSI9PWZbMF0mJihzPWZbMV0raSxvPWZbMl0rYSk7Zm9yKHZhciBnPTAseD1mLmxlbmd0aDtnPHg7ZysrKW5baF1bZ109ZltnXX12YXIgdj1uW2hdLmxlbmd0aDtzd2l0Y2gobltoXVswXSl7Y2FzZSJ6IjppPXMsYT1vO2JyZWFrO2Nhc2UiaCI6aSs9K25baF1bdi0xXTticmVhaztjYXNlInYiOmErPStuW2hdW3YtMV07YnJlYWs7ZGVmYXVsdDppKz0rbltoXVt2LTJdLGErPStuW2hdW3YtMV19fXJldHVybiBuLnRvU3RyaW5nPXIuX3BhdGgyc3RyaW5nLGUucmVsPUF0KG4pLG59LE50PXIuX3BhdGhUb0Fic29sdXRlPWZ1bmN0aW9uKHQpe3ZhciBlPWt0KHQpO2lmKGUuYWJzKXJldHVybiBBdChlLmFicyk7aWYoci5pcyh0LFcpJiZyLmlzKHQmJnRbMF0sVyl8fCh0PXIucGFyc2VQYXRoU3RyaW5nKHQpKSwhdHx8IXQubGVuZ3RoKXJldHVybltbIk0iLDAsMF1dO3ZhciBuPVtdLGk9MCxhPTAscz0wLGM9MCxoPTA7Ik0iPT10WzBdWzBdJiYoaT0rdFswXVsxXSxhPSt0WzBdWzJdLHM9aSxjPWEsaCsrLG5bMF09WyJNIixpLGFdKTtmb3IodmFyIHUsbCxmPTM9PXQubGVuZ3RoJiYiTSI9PXRbMF1bMF0mJiJSIj09dFsxXVswXS50b1VwcGVyQ2FzZSgpJiYiWiI9PXRbMl1bMF0udG9VcHBlckNhc2UoKSxwPWgsZD10Lmxlbmd0aDtwPGQ7cCsrKXtpZihuLnB1c2godT1bXSksbD10W3BdLGxbMF0hPXR0LmNhbGwobFswXSkpc3dpdGNoKHVbMF09dHQuY2FsbChsWzBdKSx1WzBdKXtjYXNlIkEiOnVbMV09bFsxXSx1WzJdPWxbMl0sdVszXT1sWzNdLHVbNF09bFs0XSx1WzVdPWxbNV0sdVs2XT0rKGxbNl0raSksdVs3XT0rKGxbN10rYSk7YnJlYWs7Y2FzZSJWIjp1WzFdPStsWzFdK2E7YnJlYWs7Y2FzZSJIIjp1WzFdPStsWzFdK2k7YnJlYWs7Y2FzZSJSIjpmb3IodmFyIGc9W2ksYV1bT10obC5zbGljZSgxKSkseD0yLHY9Zy5sZW5ndGg7eDx2O3grKylnW3hdPStnW3hdK2ksZ1srK3hdPStnW3hdK2E7bi5wb3AoKSxuPW5bT10obyhnLGYpKTticmVhaztjYXNlIk0iOnM9K2xbMV0raSxjPStsWzJdK2E7ZGVmYXVsdDpmb3IoeD0xLHY9bC5sZW5ndGg7eDx2O3grKyl1W3hdPStsW3hdKyh4JTI/aTphKX1lbHNlIGlmKCJSIj09bFswXSlnPVtpLGFdW09dKGwuc2xpY2UoMSkpLG4ucG9wKCksbj1uW09dKG8oZyxmKSksdT1bIlIiXVtPXShsLnNsaWNlKC0yKSk7ZWxzZSBmb3IodmFyIHk9MCxtPWwubGVuZ3RoO3k8bTt5KyspdVt5XT1sW3ldO3N3aXRjaCh1WzBdKXtjYXNlIloiOmk9cyxhPWM7YnJlYWs7Y2FzZSJIIjppPXVbMV07YnJlYWs7Y2FzZSJWIjphPXVbMV07YnJlYWs7Y2FzZSJNIjpzPXVbdS5sZW5ndGgtMl0sYz11W3UubGVuZ3RoLTFdO2RlZmF1bHQ6aT11W3UubGVuZ3RoLTJdLGE9dVt1Lmxlbmd0aC0xXX19cmV0dXJuIG4udG9TdHJpbmc9ci5fcGF0aDJzdHJpbmcsZS5hYnM9QXQobiksbn0sT3Q9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuW3QsZSxyLG4scixuXX0sVHQ9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3JldHVyblsxLzMqdCsyLzMqciwxLzMqZSsyLzMqbiwxLzMqaSsyLzMqciwxLzMqYSsyLzMqbixpLGFdfSxSdD1mdW5jdGlvbih0LGUscixuLGkscyxvLGMsaCx1KXt2YXIgbCxmPTEyMCpxLzE4MCxwPXEvMTgwKigraXx8MCksZD1bXSxnPWEoZnVuY3Rpb24odCxlLHIpe3JldHVybnt4OnQqei5jb3MociktZSp6LnNpbihyKSx5OnQqei5zaW4ocikrZSp6LmNvcyhyKX19KTtpZih1KUM9dVswXSxrPXVbMV0sdz11WzJdLEU9dVszXTtlbHNle2w9Zyh0LGUsLXApLHQ9bC54LGU9bC55LGw9ZyhjLGgsLXApLGM9bC54LGg9bC55O3ZhciB4PSh6LmNvcyhxLzE4MCppKSx6LnNpbihxLzE4MCppKSwodC1jKS8yKSx2PShlLWgpLzIseT14KngvKHIqcikrdip2LyhuKm4pO3k+MSYmKHk9ei5zcXJ0KHkpLHIqPXksbio9eSk7dmFyIG09cipyLGI9bipuLF89KHM9PW8/LTE6MSkqei5zcXJ0KFgoKG0qYi1tKnYqdi1iKngqeCkvKG0qdip2K2IqeCp4KSkpLHc9XypyKnYvbisodCtjKS8yLEU9Xyotbip4L3IrKGUraCkvMixDPXouYXNpbigoKGUtRSkvbikudG9GaXhlZCg5KSksaz16LmFzaW4oKChoLUUpL24pLnRvRml4ZWQoOSkpO0M9dDx3P3EtQzpDLGs9Yzx3P3EtazprLEM8MCYmKEM9MipxK0MpLGs8MCYmKGs9MipxK2spLG8mJkM+ayYmKEMtPTIqcSksIW8mJms+QyYmKGstPTIqcSl9dmFyIFM9ay1DO2lmKFgoUyk+Zil7dmFyIEE9ayxCPWMsTj1oO2s9QytmKihvJiZrPkM/MTotMSksYz13K3Iqei5jb3MoayksaD1FK24qei5zaW4oayksZD1SdChjLGgscixuLGksMCxvLEIsTixbayxBLHcsRV0pfVM9ay1DO3ZhciBUPXouY29zKEMpLFI9ei5zaW4oQyksST16LmNvcyhrKSxNPXouc2luKGspLEQ9ei50YW4oUy80KSxQPTQvMypyKkQsTD00LzMqbipELGo9W3QsZV0sVT1bdCtQKlIsZS1MKlRdLEc9W2MrUCpNLGgtTCpJXSxIPVtjLGhdO2lmKFVbMF09MipqWzBdLVVbMF0sVVsxXT0yKmpbMV0tVVsxXSx1KXJldHVybltVLEcsSF1bT10oZCk7ZD1bVSxHLEhdW09dKGQpLmpvaW4oKVtGXSgiLCIpO2Zvcih2YXIgVz1bXSxWPTAsUT1kLmxlbmd0aDtWPFE7VisrKVdbVl09ViUyP2coZFtWLTFdLGRbVl0scCkueTpnKGRbVl0sZFtWKzFdLHApLng7cmV0dXJuIFd9LEl0PWZ1bmN0aW9uKHQsZSxyLG4saSxhLHMsbyxjKXt2YXIgaD0xLWM7cmV0dXJue3g6RyhoLDMpKnQrMypHKGgsMikqYypyKzMqaCpjKmMqaStHKGMsMykqcyx5OkcoaCwzKSplKzMqRyhoLDIpKmMqbiszKmgqYypjKmErRyhjLDMpKm99fSxNdD1hKGZ1bmN0aW9uKHQsZSxyLG4saSxhLHMsbyl7dmFyIGMsaD1pLTIqcit0LShzLTIqaStyKSx1PTIqKHItdCktMiooaS1yKSxsPXQtcixmPSgtdSt6LnNxcnQodSp1LTQqaCpsKSkvMi9oLHA9KC11LXouc3FydCh1KnUtNCpoKmwpKS8yL2gsZD1bZSxvXSxnPVt0LHNdO3JldHVybiBYKGYpPiIxZTEyIiYmKGY9LjUpLFgocCk+IjFlMTIiJiYocD0uNSksZj4wJiZmPDEmJihjPUl0KHQsZSxyLG4saSxhLHMsbyxmKSxnLnB1c2goYy54KSxkLnB1c2goYy55KSkscD4wJiZwPDEmJihjPUl0KHQsZSxyLG4saSxhLHMsbyxwKSxnLnB1c2goYy54KSxkLnB1c2goYy55KSksaD1hLTIqbitlLShvLTIqYStuKSx1PTIqKG4tZSktMiooYS1uKSxsPWUtbixmPSgtdSt6LnNxcnQodSp1LTQqaCpsKSkvMi9oLHA9KC11LXouc3FydCh1KnUtNCpoKmwpKS8yL2gsWChmKT4iMWUxMiImJihmPS41KSxYKHApPiIxZTEyIiYmKHA9LjUpLGY+MCYmZjwxJiYoYz1JdCh0LGUscixuLGksYSxzLG8sZiksZy5wdXNoKGMueCksZC5wdXNoKGMueSkpLHA+MCYmcDwxJiYoYz1JdCh0LGUscixuLGksYSxzLG8scCksZy5wdXNoKGMueCksZC5wdXNoKGMueSkpLHttaW46e3g6VVtOXSgwLGcpLHk6VVtOXSgwLGQpfSxtYXg6e3g6altOXSgwLGcpLHk6altOXSgwLGQpfX19KSxGdD1yLl9wYXRoMmN1cnZlPWEoZnVuY3Rpb24odCxlKXt2YXIgcj0hZSYma3QodCk7aWYoIWUmJnIuY3VydmUpcmV0dXJuIEF0KHIuY3VydmUpO2Zvcih2YXIgbj1OdCh0KSxpPWUmJk50KGUpLGE9e3g6MCx5OjAsYng6MCxieTowLFg6MCxZOjAscXg6bnVsbCxxeTpudWxsfSxzPXt4OjAseTowLGJ4OjAsYnk6MCxYOjAsWTowLHF4Om51bGwscXk6bnVsbH0sbz0oZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYT17VDoxLFE6MX07aWYoIXQpcmV0dXJuWyJDIixlLngsZS55LGUueCxlLnksZS54LGUueV07c3dpdGNoKCEodFswXWluIGEpJiYoZS5xeD1lLnF5PW51bGwpLHRbMF0pe2Nhc2UiTSI6ZS5YPXRbMV0sZS5ZPXRbMl07YnJlYWs7Y2FzZSJBIjp0PVsiQyJdW09dKFJ0W05dKDAsW2UueCxlLnldW09dKHQuc2xpY2UoMSkpKSk7YnJlYWs7Y2FzZSJTIjoiQyI9PXJ8fCJTIj09cj8obj0yKmUueC1lLmJ4LGk9MiplLnktZS5ieSk6KG49ZS54LGk9ZS55KSx0PVsiQyIsbixpXVtPXSh0LnNsaWNlKDEpKTticmVhaztjYXNlIlQiOiJRIj09cnx8IlQiPT1yPyhlLnF4PTIqZS54LWUucXgsZS5xeT0yKmUueS1lLnF5KTooZS5xeD1lLngsZS5xeT1lLnkpLHQ9WyJDIl1bT10oVHQoZS54LGUueSxlLnF4LGUucXksdFsxXSx0WzJdKSk7YnJlYWs7Y2FzZSJRIjplLnF4PXRbMV0sZS5xeT10WzJdLHQ9WyJDIl1bT10oVHQoZS54LGUueSx0WzFdLHRbMl0sdFszXSx0WzRdKSk7YnJlYWs7Y2FzZSJMIjp0PVsiQyJdW09dKE90KGUueCxlLnksdFsxXSx0WzJdKSk7YnJlYWs7Y2FzZSJIIjp0PVsiQyJdW09dKE90KGUueCxlLnksdFsxXSxlLnkpKTticmVhaztjYXNlIlYiOnQ9WyJDIl1bT10oT3QoZS54LGUueSxlLngsdFsxXSkpO2JyZWFrO2Nhc2UiWiI6dD1bIkMiXVtPXShPdChlLngsZS55LGUuWCxlLlkpKX1yZXR1cm4gdH0pLGM9ZnVuY3Rpb24odCxlKXtpZih0W2VdLmxlbmd0aD43KXt0W2VdLnNoaWZ0KCk7Zm9yKHZhciByPXRbZV07ci5sZW5ndGg7KXQuc3BsaWNlKGUrKywwLFsiQyJdW09dKHIuc3BsaWNlKDAsNikpKTt0LnNwbGljZShlLDEpLGw9aihuLmxlbmd0aCxpJiZpLmxlbmd0aHx8MCl9fSxoPWZ1bmN0aW9uKHQsZSxyLGEscyl7dCYmZSYmIk0iPT10W3NdWzBdJiYiTSIhPWVbc11bMF0mJihlLnNwbGljZShzLDAsWyJNIixhLngsYS55XSksci5ieD0wLHIuYnk9MCxyLng9dFtzXVsxXSxyLnk9dFtzXVsyXSxsPWoobi5sZW5ndGgsaSYmaS5sZW5ndGh8fDApKX0sdT0wLGw9aihuLmxlbmd0aCxpJiZpLmxlbmd0aHx8MCk7dTxsO3UrKyl7blt1XT1vKG5bdV0sYSksYyhuLHUpLGkmJihpW3VdPW8oaVt1XSxzKSksaSYmYyhpLHUpLGgobixpLGEscyx1KSxoKGksbixzLGEsdSk7dmFyIGY9blt1XSxwPWkmJmlbdV0sZD1mLmxlbmd0aCxnPWkmJnAubGVuZ3RoO2EueD1mW2QtMl0sYS55PWZbZC0xXSxhLmJ4PVooZltkLTRdKXx8YS54LGEuYnk9WihmW2QtM10pfHxhLnkscy5ieD1pJiYoWihwW2ctNF0pfHxzLngpLHMuYnk9aSYmKFoocFtnLTNdKXx8cy55KSxzLng9aSYmcFtnLTJdLHMueT1pJiZwW2ctMV19cmV0dXJuIGl8fChyLmN1cnZlPUF0KG4pKSxpP1tuLGldOm59LG51bGwsQXQpLER0PShyLl9wYXJzZURvdHM9YShmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7dmFyIGE9e30scz10W25dLm1hdGNoKC9eKFteOl0qKTo/KFtcZFwuXSopLyk7aWYoYS5jb2xvcj1yLmdldFJHQihzWzFdKSxhLmNvbG9yLmVycm9yKXJldHVybiBudWxsO2EuY29sb3I9YS5jb2xvci5oZXgsc1syXSYmKGEub2Zmc2V0PXNbMl0rIiUiKSxlLnB1c2goYSl9Zm9yKG49MSxpPWUubGVuZ3RoLTE7bjxpO24rKylpZighZVtuXS5vZmZzZXQpe2Zvcih2YXIgbz1aKGVbbi0xXS5vZmZzZXR8fDApLGM9MCxoPW4rMTtoPGk7aCsrKWlmKGVbaF0ub2Zmc2V0KXtjPWVbaF0ub2Zmc2V0O2JyZWFrfWN8fChjPTEwMCxoPWkpLGM9WihjKTtmb3IodmFyIHU9KGMtbykvKGgtbisxKTtuPGg7bisrKW8rPXUsZVtuXS5vZmZzZXQ9bysiJSJ9cmV0dXJuIGV9KSxyLl90ZWFyPWZ1bmN0aW9uKHQsZSl7dD09ZS50b3AmJihlLnRvcD10LnByZXYpLHQ9PWUuYm90dG9tJiYoZS5ib3R0b209dC5uZXh0KSx0Lm5leHQmJih0Lm5leHQucHJldj10LnByZXYpLHQucHJldiYmKHQucHJldi5uZXh0PXQubmV4dCl9KSxQdD0oci5fdG9mcm9udD1mdW5jdGlvbih0LGUpe2UudG9wIT09dCYmKER0KHQsZSksdC5uZXh0PW51bGwsdC5wcmV2PWUudG9wLGUudG9wLm5leHQ9dCxlLnRvcD10KX0sci5fdG9iYWNrPWZ1bmN0aW9uKHQsZSl7ZS5ib3R0b20hPT10JiYoRHQodCxlKSx0Lm5leHQ9ZS5ib3R0b20sdC5wcmV2PW51bGwsZS5ib3R0b20ucHJldj10LGUuYm90dG9tPXQpfSxyLl9pbnNlcnRhZnRlcj1mdW5jdGlvbih0LGUscil7RHQodCxyKSxlPT1yLnRvcCYmKHIudG9wPXQpLGUubmV4dCYmKGUubmV4dC5wcmV2PXQpLHQubmV4dD1lLm5leHQsdC5wcmV2PWUsZS5uZXh0PXR9LHIuX2luc2VydGJlZm9yZT1mdW5jdGlvbih0LGUscil7RHQodCxyKSxlPT1yLmJvdHRvbSYmKHIuYm90dG9tPXQpLGUucHJldiYmKGUucHJldi5uZXh0PXQpLHQucHJldj1lLnByZXYsZS5wcmV2PXQsdC5uZXh0PWV9LHIudG9NYXRyaXg9ZnVuY3Rpb24odCxlKXt2YXIgcj1TdCh0KSxuPXtfOnt0cmFuc2Zvcm06Un0sZ2V0QkJveDpmdW5jdGlvbigpe3JldHVybiByfX07cmV0dXJuIEx0KG4sZSksbi5tYXRyaXh9KSxMdD0oci50cmFuc2Zvcm1QYXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHh0KHQsUHQodCxlKSl9LHIuX2V4dHJhY3RUcmFuc2Zvcm09ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0Ll8udHJhbnNmb3JtO2U9TShlKS5yZXBsYWNlKC9cLnszfXxcdTIwMjYvZyx0Ll8udHJhbnNmb3JtfHxSKTt2YXIgbj1yLnBhcnNlVHJhbnNmb3JtU3RyaW5nKGUpLGk9MCxhPTAscz0wLG89MSxjPTEsaD10Ll8sdT1uZXcgZDtpZihoLnRyYW5zZm9ybT1ufHxbXSxuKWZvcih2YXIgbD0wLGY9bi5sZW5ndGg7bDxmO2wrKyl7dmFyIHAsZyx4LHYseSxtPW5bbF0sYj1tLmxlbmd0aCxfPU0obVswXSkudG9Mb3dlckNhc2UoKSx3PW1bMF0hPV8sRT13P3UuaW52ZXJ0KCk6MDsidCI9PV8mJjM9PWI/dz8ocD1FLngoMCwwKSxnPUUueSgwLDApLHg9RS54KG1bMV0sbVsyXSksdj1FLnkobVsxXSxtWzJdKSx1LnRyYW5zbGF0ZSh4LXAsdi1nKSk6dS50cmFuc2xhdGUobVsxXSxtWzJdKToiciI9PV8/Mj09Yj8oeT15fHx0LmdldEJCb3goMSksdS5yb3RhdGUobVsxXSx5LngreS53aWR0aC8yLHkueSt5LmhlaWdodC8yKSxpKz1tWzFdKTo0PT1iJiYodz8oeD1FLngobVsyXSxtWzNdKSx2PUUueShtWzJdLG1bM10pLHUucm90YXRlKG1bMV0seCx2KSk6dS5yb3RhdGUobVsxXSxtWzJdLG1bM10pLGkrPW1bMV0pOiJzIj09Xz8yPT1ifHwzPT1iPyh5PXl8fHQuZ2V0QkJveCgxKSx1LnNjYWxlKG1bMV0sbVtiLTFdLHkueCt5LndpZHRoLzIseS55K3kuaGVpZ2h0LzIpLG8qPW1bMV0sYyo9bVtiLTFdKTo1PT1iJiYodz8oeD1FLngobVszXSxtWzRdKSx2PUUueShtWzNdLG1bNF0pLHUuc2NhbGUobVsxXSxtWzJdLHgsdikpOnUuc2NhbGUobVsxXSxtWzJdLG1bM10sbVs0XSksbyo9bVsxXSxjKj1tWzJdKToibSI9PV8mJjc9PWImJnUuYWRkKG1bMV0sbVsyXSxtWzNdLG1bNF0sbVs1XSxtWzZdKSxoLmRpcnR5VD0xLHQubWF0cml4PXV9dC5tYXRyaXg9dSxoLnN4PW8saC5zeT1jLGguZGVnPWksaC5keD1hPXUuZSxoLmR5PXM9dS5mLDE9PW8mJjE9PWMmJiFpJiZoLmJib3g/KGguYmJveC54Kz0rYSxoLmJib3gueSs9K3MpOmguZGlydHlUPTF9KSx6dD1mdW5jdGlvbih0KXt2YXIgZT10WzBdO3N3aXRjaChlLnRvTG93ZXJDYXNlKCkpe2Nhc2UidCI6cmV0dXJuW2UsMCwwXTtjYXNlIm0iOnJldHVybltlLDEsMCwwLDEsMCwwXTtjYXNlInIiOnJldHVybiA0PT10Lmxlbmd0aD9bZSwwLHRbMl0sdFszXV06W2UsMF07Y2FzZSJzIjpyZXR1cm4gNT09dC5sZW5ndGg/W2UsMSwxLHRbM10sdFs0XV06Mz09dC5sZW5ndGg/W2UsMSwxXTpbZSwxXX19LGp0PXIuX2VxdWFsaXNlVHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSl7ZT1NKGUpLnJlcGxhY2UoL1wuezN9fFx1MjAyNi9nLHQpLHQ9ci5wYXJzZVRyYW5zZm9ybVN0cmluZyh0KXx8W10sZT1yLnBhcnNlVHJhbnNmb3JtU3RyaW5nKGUpfHxbXTtmb3IodmFyIG4saSxhLHMsbz1qKHQubGVuZ3RoLGUubGVuZ3RoKSxjPVtdLGg9W10sdT0wO3U8bzt1Kyspe2lmKGE9dFt1XXx8enQoZVt1XSkscz1lW3VdfHx6dChhKSxhWzBdIT1zWzBdfHwiciI9PWFbMF0udG9Mb3dlckNhc2UoKSYmKGFbMl0hPXNbMl18fGFbM10hPXNbM10pfHwicyI9PWFbMF0udG9Mb3dlckNhc2UoKSYmKGFbM10hPXNbM118fGFbNF0hPXNbNF0pKXJldHVybjtmb3IoY1t1XT1bXSxoW3VdPVtdLG49MCxpPWooYS5sZW5ndGgscy5sZW5ndGgpO248aTtuKyspbiBpbiBhJiYoY1t1XVtuXT1hW25dKSxuIGluIHMmJihoW3VdW25dPXNbbl0pfXJldHVybntmcm9tOmMsdG86aH19O3IuX2dldENvbnRhaW5lcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgYTtpZihudWxsIT0oYT1udWxsIT1pfHxyLmlzKHQsIm9iamVjdCIpP3Q6Uy5kb2MuZ2V0RWxlbWVudEJ5SWQodCkpKXJldHVybiBhLnRhZ05hbWU/bnVsbD09ZT97Y29udGFpbmVyOmEsd2lkdGg6YS5zdHlsZS5waXhlbFdpZHRofHxhLm9mZnNldFdpZHRoLGhlaWdodDphLnN0eWxlLnBpeGVsSGVpZ2h0fHxhLm9mZnNldEhlaWdodH06e2NvbnRhaW5lcjphLHdpZHRoOmUsaGVpZ2h0Om59Ontjb250YWluZXI6MSx4OnQseTplLHdpZHRoOm4saGVpZ2h0Oml9fSxyLnBhdGhUb1JlbGF0aXZlPUJ0LHIuX2VuZ2luZT17fSxyLnBhdGgyY3VydmU9RnQsci5tYXRyaXg9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3JldHVybiBuZXcgZCh0LGUscixuLGksYSl9LGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHRbMF0qdFswXSt0WzFdKnRbMV19ZnVuY3Rpb24gbih0KXt2YXIgcj16LnNxcnQoZSh0KSk7dFswXSYmKHRbMF0vPXIpLHRbMV0mJih0WzFdLz1yKX10LmFkZD1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIHMsbyxjLGgsdT1bW10sW10sW11dLGw9W1t0aGlzLmEsdGhpcy5jLHRoaXMuZV0sW3RoaXMuYix0aGlzLmQsdGhpcy5mXSxbMCwwLDFdXSxmPVtbdCxyLGldLFtlLG4sYV0sWzAsMCwxXV07Zm9yKHQmJnQgaW5zdGFuY2VvZiBkJiYoZj1bW3QuYSx0LmMsdC5lXSxbdC5iLHQuZCx0LmZdLFswLDAsMV1dKSxzPTA7czwzO3MrKylmb3Iobz0wO288MztvKyspe2ZvcihoPTAsYz0wO2M8MztjKyspaCs9bFtzXVtjXSpmW2NdW29dO3Vbc11bb109aH10aGlzLmE9dVswXVswXSx0aGlzLmI9dVsxXVswXSx0aGlzLmM9dVswXVsxXSx0aGlzLmQ9dVsxXVsxXSx0aGlzLmU9dVswXVsyXSx0aGlzLmY9dVsxXVsyXX0sdC5pbnZlcnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5hKnQuZC10LmIqdC5jO3JldHVybiBuZXcgZCh0LmQvZSwtdC5iL2UsLXQuYy9lLHQuYS9lLCh0LmMqdC5mLXQuZCp0LmUpL2UsKHQuYip0LmUtdC5hKnQuZikvZSl9LHQuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGQodGhpcy5hLHRoaXMuYix0aGlzLmMsdGhpcy5kLHRoaXMuZSx0aGlzLmYpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuYWRkKDEsMCwwLDEsdCxlKX0sdC5zY2FsZT1mdW5jdGlvbih0LGUscixuKXtudWxsPT1lJiYoZT10KSwocnx8bikmJnRoaXMuYWRkKDEsMCwwLDEscixuKSx0aGlzLmFkZCh0LDAsMCxlLDAsMCksKHJ8fG4pJiZ0aGlzLmFkZCgxLDAsMCwxLC1yLC1uKX0sdC5yb3RhdGU9ZnVuY3Rpb24odCxlLG4pe3Q9ci5yYWQodCksZT1lfHwwLG49bnx8MDt2YXIgaT0rei5jb3ModCkudG9GaXhlZCg5KSxhPSt6LnNpbih0KS50b0ZpeGVkKDkpO3RoaXMuYWRkKGksYSwtYSxpLGUsbiksdGhpcy5hZGQoMSwwLDAsMSwtZSwtbil9LHQueD1mdW5jdGlvbih0LGUpe3JldHVybiB0KnRoaXMuYStlKnRoaXMuYyt0aGlzLmV9LHQueT1mdW5jdGlvbih0LGUpe3JldHVybiB0KnRoaXMuYitlKnRoaXMuZCt0aGlzLmZ9LHQuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybit0aGlzW00uZnJvbUNoYXJDb2RlKDk3K3QpXS50b0ZpeGVkKDQpfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHIuc3ZnPyJtYXRyaXgoIitbdGhpcy5nZXQoMCksdGhpcy5nZXQoMSksdGhpcy5nZXQoMiksdGhpcy5nZXQoMyksdGhpcy5nZXQoNCksdGhpcy5nZXQoNSldLmpvaW4oKSsiKSI6W3RoaXMuZ2V0KDApLHRoaXMuZ2V0KDIpLHRoaXMuZ2V0KDEpLHRoaXMuZ2V0KDMpLDAsMF0uam9pbigpfSx0LnRvRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5NYXRyaXgoTTExPSIrdGhpcy5nZXQoMCkrIiwgTTEyPSIrdGhpcy5nZXQoMikrIiwgTTIxPSIrdGhpcy5nZXQoMSkrIiwgTTIyPSIrdGhpcy5nZXQoMykrIiwgRHg9Iit0aGlzLmdldCg0KSsiLCBEeT0iK3RoaXMuZ2V0KDUpKyIsIHNpemluZ21ldGhvZD0nYXV0byBleHBhbmQnKSJ9LHQub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZS50b0ZpeGVkKDQpLHRoaXMuZi50b0ZpeGVkKDQpXX0sdC5zcGxpdD1mdW5jdGlvbigpe3ZhciB0PXt9O3QuZHg9dGhpcy5lLHQuZHk9dGhpcy5mO3ZhciBpPVtbdGhpcy5hLHRoaXMuY10sW3RoaXMuYix0aGlzLmRdXTt0LnNjYWxleD16LnNxcnQoZShpWzBdKSksbihpWzBdKSx0LnNoZWFyPWlbMF1bMF0qaVsxXVswXStpWzBdWzFdKmlbMV1bMV0saVsxXT1baVsxXVswXS1pWzBdWzBdKnQuc2hlYXIsaVsxXVsxXS1pWzBdWzFdKnQuc2hlYXJdLHQuc2NhbGV5PXouc3FydChlKGlbMV0pKSxuKGlbMV0pLHQuc2hlYXIvPXQuc2NhbGV5O3ZhciBhPS1pWzBdWzFdLHM9aVsxXVsxXTtyZXR1cm4gczwwPyh0LnJvdGF0ZT1yLmRlZyh6LmFjb3MocykpLGE8MCYmKHQucm90YXRlPTM2MC10LnJvdGF0ZSkpOnQucm90YXRlPXIuZGVnKHouYXNpbihhKSksdC5pc1NpbXBsZT0hKCt0LnNoZWFyLnRvRml4ZWQoOSl8fHQuc2NhbGV4LnRvRml4ZWQoOSkhPXQuc2NhbGV5LnRvRml4ZWQoOSkmJnQucm90YXRlKSx0LmlzU3VwZXJTaW1wbGU9ISt0LnNoZWFyLnRvRml4ZWQoOSkmJnQuc2NhbGV4LnRvRml4ZWQoOSk9PXQuc2NhbGV5LnRvRml4ZWQoOSkmJiF0LnJvdGF0ZSx0Lm5vUm90YXRpb249ISt0LnNoZWFyLnRvRml4ZWQoOSkmJiF0LnJvdGF0ZSx0fSx0LnRvVHJhbnNmb3JtU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXR8fHRoaXNbRl0oKTtyZXR1cm4gZS5pc1NpbXBsZT8oZS5zY2FsZXg9K2Uuc2NhbGV4LnRvRml4ZWQoNCksZS5zY2FsZXk9K2Uuc2NhbGV5LnRvRml4ZWQoNCksZS5yb3RhdGU9K2Uucm90YXRlLnRvRml4ZWQoNCksKGUuZHh8fGUuZHk/InQiK1tlLmR4LGUuZHldOlIpKygxIT1lLnNjYWxleHx8MSE9ZS5zY2FsZXk/InMiK1tlLnNjYWxleCxlLnNjYWxleSwwLDBdOlIpKyhlLnJvdGF0ZT8iciIrW2Uucm90YXRlLDAsMF06UikpOiJtIitbdGhpcy5nZXQoMCksdGhpcy5nZXQoMSksdGhpcy5nZXQoMiksdGhpcy5nZXQoMyksdGhpcy5nZXQoNCksdGhpcy5nZXQoNSldfX0oZC5wcm90b3R5cGUpO3ZhciBVdD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXC8oLio/KVxzLyl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFxkKykvKTsiQXBwbGUgQ29tcHV0ZXIsIEluYy4iPT1uYXZpZ2F0b3IudmVuZG9yJiYoVXQmJlV0WzFdPDR8fCJpUCI9PW5hdmlnYXRvci5wbGF0Zm9ybS5zbGljZSgwLDIpKXx8Ikdvb2dsZSBJbmMuIj09bmF2aWdhdG9yLnZlbmRvciYmVXQmJlV0WzFdPDg/Xy5zYWZhcmk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlY3QoLTk5LC05OSx0aGlzLndpZHRoKzk5LHRoaXMuaGVpZ2h0Kzk5KS5hdHRyKHtzdHJva2U6Im5vbmUifSk7c2V0VGltZW91dChmdW5jdGlvbigpe3QucmVtb3ZlKCl9KX06Xy5zYWZhcmk9bHQ7Zm9yKHZhciBYdD1mdW5jdGlvbigpe3RoaXMucmV0dXJuVmFsdWU9ITF9LEd0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxxdD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsQnViYmxlPSEwfSxIdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9LFd0PWZ1bmN0aW9uKHQpe3ZhciBlPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLHI9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdDtyZXR1cm57eDp0LmNsaWVudFgrcix5OnQuY2xpZW50WStlfX0sVnQ9ZnVuY3Rpb24oKXtyZXR1cm4gUy5kb2MuYWRkRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbih0LGUscixuKXt2YXIgaT1mdW5jdGlvbih0KXt2YXIgZT1XdCh0KTtyZXR1cm4gci5jYWxsKG4sdCxlLngsZS55KX07aWYodC5hZGRFdmVudExpc3RlbmVyKGUsaSwhMSksVCYmUFtlXSl7dmFyIGE9ZnVuY3Rpb24oZSl7Zm9yKHZhciBpPVd0KGUpLGE9ZSxzPTAsbz1lLnRhcmdldFRvdWNoZXMmJmUudGFyZ2V0VG91Y2hlcy5sZW5ndGg7czxvO3MrKylpZihlLnRhcmdldFRvdWNoZXNbc10udGFyZ2V0PT10KXtlPWUudGFyZ2V0VG91Y2hlc1tzXSxlLm9yaWdpbmFsRXZlbnQ9YSxlLnByZXZlbnREZWZhdWx0PUd0LGUuc3RvcFByb3BhZ2F0aW9uPUh0O2JyZWFrfXJldHVybiByLmNhbGwobixlLGkueCxpLnkpfTt0LmFkZEV2ZW50TGlzdGVuZXIoUFtlXSxhLCExKX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsaSwhMSksVCYmUFtlXSYmdC5yZW1vdmVFdmVudExpc3RlbmVyKFBbZV0saSwhMSksITB9fTpTLmRvYy5hdHRhY2hFdmVudD9mdW5jdGlvbih0LGUscixuKXt2YXIgaT1mdW5jdGlvbih0KXt0PXR8fFMud2luLmV2ZW50O3ZhciBlPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLGk9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdCxhPXQuY2xpZW50WCtpLHM9dC5jbGllbnRZK2U7cmV0dXJuIHQucHJldmVudERlZmF1bHQ9dC5wcmV2ZW50RGVmYXVsdHx8WHQsdC5zdG9wUHJvcGFnYXRpb249dC5zdG9wUHJvcGFnYXRpb258fHF0LHIuY2FsbChuLHQsYSxzKX07cmV0dXJuIHQuYXR0YWNoRXZlbnQoIm9uIitlLGkpLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGV0YWNoRXZlbnQoIm9uIitlLGkpLCEwfX06dm9pZCAwfSgpLFF0PVtdLFl0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgcixuPXQuY2xpZW50WCxpPXQuY2xpZW50WSxhPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLHM9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdCxvPVF0Lmxlbmd0aDtvLS07KXtpZihyPVF0W29dLFQmJnQudG91Y2hlcyl7Zm9yKHZhciBjLGg9dC50b3VjaGVzLmxlbmd0aDtoLS07KWlmKGM9dC50b3VjaGVzW2hdLGMuaWRlbnRpZmllcj09ci5lbC5fZHJhZy5pZCl7bj1jLmNsaWVudFgsaT1jLmNsaWVudFksKHQub3JpZ2luYWxFdmVudD90Lm9yaWdpbmFsRXZlbnQ6dCkucHJldmVudERlZmF1bHQoKTticmVha319ZWxzZSB0LnByZXZlbnREZWZhdWx0KCk7dmFyIHUsbD1yLmVsLm5vZGUsZj1sLm5leHRTaWJsaW5nLHA9bC5wYXJlbnROb2RlLGQ9bC5zdHlsZS5kaXNwbGF5O1Mud2luLm9wZXJhJiZwLnJlbW92ZUNoaWxkKGwpLGwuc3R5bGUuZGlzcGxheT0ibm9uZSIsdT1yLmVsLnBhcGVyLmdldEVsZW1lbnRCeVBvaW50KG4saSksbC5zdHlsZS5kaXNwbGF5PWQsUy53aW4ub3BlcmEmJihmP3AuaW5zZXJ0QmVmb3JlKGwsZik6cC5hcHBlbmRDaGlsZChsKSksdSYmZSgicmFwaGFlbC5kcmFnLm92ZXIuIityLmVsLmlkLHIuZWwsdSksZSgicmFwaGFlbC5kcmFnLm1vdmUuIityLmVsLmlkLHIubW92ZV9zY29wZXx8ci5lbCxuK3Mtci5lbC5fZHJhZy54LGkrYS1yLmVsLl9kcmFnLnksbitzLGkrYSx0KX19LCR0PWZ1bmN0aW9uKHQpe3IudW5tb3VzZW1vdmUoWXQpLnVubW91c2V1cCgkdCk7Zm9yKHZhciBuLGk9UXQubGVuZ3RoO2ktLTspbj1RdFtpXSxuLmVsLl9kcmFnPXt9LGUoInJhcGhhZWwuZHJhZy5lbmQuIituLmVsLmlkLG4uZW5kX3Njb3BlfHxuLnN0YXJ0X3Njb3BlfHxuLm1vdmVfc2NvcGV8fG4uZWwsdCk7UXQ9W119LEt0PXIuZWw9e30sWnQ9RC5sZW5ndGg7WnQtLTspIWZ1bmN0aW9uKHQpe3JbdF09S3RbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gci5pcyhlLCJmdW5jdGlvbiIpJiYodGhpcy5ldmVudHM9dGhpcy5ldmVudHN8fFtdLHRoaXMuZXZlbnRzLnB1c2goe25hbWU6dCxmOmUsdW5iaW5kOlZ0KHRoaXMuc2hhcGV8fHRoaXMubm9kZXx8Uy5kb2MsdCxlLG58fHRoaXMpfSkpLHRoaXN9LHJbInVuIit0XT1LdFsidW4iK3RdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10aGlzLmV2ZW50c3x8W10saT1uLmxlbmd0aDtpLS07KW5baV0ubmFtZSE9dHx8IXIuaXMoZSwidW5kZWZpbmVkIikmJm5baV0uZiE9ZXx8KG5baV0udW5iaW5kKCksbi5zcGxpY2UoaSwxKSwhbi5sZW5ndGgmJmRlbGV0ZSB0aGlzLmV2ZW50cyk7cmV0dXJuIHRoaXN9fShEW1p0XSk7S3QuZGF0YT1mdW5jdGlvbih0LG4pe3ZhciBpPWh0W3RoaXMuaWRdPWh0W3RoaXMuaWRdfHx7fTtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBpO2lmKDE9PWFyZ3VtZW50cy5sZW5ndGgpe2lmKHIuaXModCwib2JqZWN0Iikpe2Zvcih2YXIgYSBpbiB0KXRba10oYSkmJnRoaXMuZGF0YShhLHRbYV0pO3JldHVybiB0aGlzfXJldHVybiBlKCJyYXBoYWVsLmRhdGEuZ2V0LiIrdGhpcy5pZCx0aGlzLGlbdF0sdCksaVt0XX1yZXR1cm4gaVt0XT1uLGUoInJhcGhhZWwuZGF0YS5zZXQuIit0aGlzLmlkLHRoaXMsbix0KSx0aGlzfSxLdC5yZW1vdmVEYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P2h0W3RoaXMuaWRdPXt9Omh0W3RoaXMuaWRdJiZkZWxldGUgaHRbdGhpcy5pZF1bdF0sdGhpc30sS3QuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiBuKGh0W3RoaXMuaWRdfHx7fSl9LEt0LmhvdmVyPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0aGlzLm1vdXNlb3Zlcih0LHIpLm1vdXNlb3V0KGUsbnx8cil9LEt0LnVuaG92ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy51bm1vdXNlb3Zlcih0KS51bm1vdXNlb3V0KGUpfTt2YXIgSnQ9W107S3QuZHJhZz1mdW5jdGlvbih0LG4saSxhLHMsbyl7ZnVuY3Rpb24gYyhjKXsoYy5vcmlnaW5hbEV2ZW50fHxjKS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBoPWMuY2xpZW50WCx1PWMuY2xpZW50WSxsPVMuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fFMuZG9jLmJvZHkuc2Nyb2xsVG9wLGY9Uy5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fFMuZG9jLmJvZHkuc2Nyb2xsTGVmdDtpZih0aGlzLl9kcmFnLmlkPWMuaWRlbnRpZmllcixUJiZjLnRvdWNoZXMpZm9yKHZhciBwLGQ9Yy50b3VjaGVzLmxlbmd0aDtkLS07KWlmKHA9Yy50b3VjaGVzW2RdLHRoaXMuX2RyYWcuaWQ9cC5pZGVudGlmaWVyLHAuaWRlbnRpZmllcj09dGhpcy5fZHJhZy5pZCl7aD1wLmNsaWVudFgsdT1wLmNsaWVudFk7YnJlYWt9dGhpcy5fZHJhZy54PWgrZix0aGlzLl9kcmFnLnk9dStsLCFRdC5sZW5ndGgmJnIubW91c2Vtb3ZlKFl0KS5tb3VzZXVwKCR0KSxRdC5wdXNoKHtlbDp0aGlzLG1vdmVfc2NvcGU6YSxzdGFydF9zY29wZTpzLGVuZF9zY29wZTpvfSksbiYmZS5vbigicmFwaGFlbC5kcmFnLnN0YXJ0LiIrdGhpcy5pZCxuKSx0JiZlLm9uKCJyYXBoYWVsLmRyYWcubW92ZS4iK3RoaXMuaWQsdCksaSYmZS5vbigicmFwaGFlbC5kcmFnLmVuZC4iK3RoaXMuaWQsaSksZSgicmFwaGFlbC5kcmFnLnN0YXJ0LiIrdGhpcy5pZCxzfHxhfHx0aGlzLGMuY2xpZW50WCtmLGMuY2xpZW50WStsLGMpfXJldHVybiB0aGlzLl9kcmFnPXt9LEp0LnB1c2goe2VsOnRoaXMsc3RhcnQ6Y30pLHRoaXMubW91c2Vkb3duKGMpLHRoaXN9LEt0Lm9uRHJhZ092ZXI9ZnVuY3Rpb24odCl7dD9lLm9uKCJyYXBoYWVsLmRyYWcub3Zlci4iK3RoaXMuaWQsdCk6ZS51bmJpbmQoInJhcGhhZWwuZHJhZy5vdmVyLiIrdGhpcy5pZCl9LEt0LnVuZHJhZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1KdC5sZW5ndGg7dC0tOylKdFt0XS5lbD09dGhpcyYmKHRoaXMudW5tb3VzZWRvd24oSnRbdF0uc3RhcnQpLEp0LnNwbGljZSh0LDEpLGUudW5iaW5kKCJyYXBoYWVsLmRyYWcuKi4iK3RoaXMuaWQpKTshSnQubGVuZ3RoJiZyLnVubW91c2Vtb3ZlKFl0KS51bm1vdXNldXAoJHQpLFF0PVtdfSxfLmNpcmNsZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9ci5fZW5naW5lLmNpcmNsZSh0aGlzLHR8fDAsZXx8MCxufHwwKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChpKSxpfSxfLnJlY3Q9ZnVuY3Rpb24odCxlLG4saSxhKXt2YXIgcz1yLl9lbmdpbmUucmVjdCh0aGlzLHR8fDAsZXx8MCxufHwwLGl8fDAsYXx8MCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2gocyksc30sXy5lbGxpcHNlPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBhPXIuX2VuZ2luZS5lbGxpcHNlKHRoaXMsdHx8MCxlfHwwLG58fDAsaXx8MCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2goYSksYX0sXy5wYXRoPWZ1bmN0aW9uKHQpe3QmJiFyLmlzKHQsInN0cmluZyIpJiYhci5pcyh0WzBdLFcpJiYodCs9Uik7dmFyIGU9ci5fZW5naW5lLnBhdGgoci5mb3JtYXRbTl0ocixhcmd1bWVudHMpLHRoaXMpO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKGUpLGV9LF8uaW1hZ2U9ZnVuY3Rpb24odCxlLG4saSxhKXt2YXIgcz1yLl9lbmdpbmUuaW1hZ2UodGhpcyx0fHwiYWJvdXQ6YmxhbmsiLGV8fDAsbnx8MCxpfHwwLGF8fDApO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKHMpLHN9LF8udGV4dD1mdW5jdGlvbih0LGUsbil7dmFyIGk9ci5fZW5naW5lLnRleHQodGhpcyx0fHwwLGV8fDAsTShuKSk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2goaSksaX0sXy5zZXQ9ZnVuY3Rpb24odCl7IXIuaXModCwiYXJyYXkiKSYmKHQ9QXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywwLGFyZ3VtZW50cy5sZW5ndGgpKTt2YXIgZT1uZXcgbGUodCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2goZSksZS5wYXBlcj10aGlzLGUudHlwZT0ic2V0IixlfSxfLnNldFN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX19zZXRfXz10fHx0aGlzLnNldCgpfSxfLnNldEZpbmlzaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fc2V0X187cmV0dXJuIGRlbGV0ZSB0aGlzLl9fc2V0X18sZX0sXy5zZXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuX2VuZ2luZS5zZXRTaXplLmNhbGwodGhpcyx0LGUpfSxfLnNldFZpZXdCb3g9ZnVuY3Rpb24odCxlLG4saSxhKXtyZXR1cm4gci5fZW5naW5lLnNldFZpZXdCb3guY2FsbCh0aGlzLHQsZSxuLGksYSl9LF8udG9wPV8uYm90dG9tPW51bGwsXy5yYXBoYWVsPXI7dmFyIHRlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj10Lm93bmVyRG9jdW1lbnQsbj1yLmJvZHksaT1yLmRvY3VtZW50RWxlbWVudCxhPWkuY2xpZW50VG9wfHxuLmNsaWVudFRvcHx8MCxzPWkuY2xpZW50TGVmdHx8bi5jbGllbnRMZWZ0fHwwO3JldHVybnt5OmUudG9wKyhTLndpbi5wYWdlWU9mZnNldHx8aS5zY3JvbGxUb3B8fG4uc2Nyb2xsVG9wKS1hLHg6ZS5sZWZ0KyhTLndpbi5wYWdlWE9mZnNldHx8aS5zY3JvbGxMZWZ0fHxuLnNjcm9sbExlZnQpLXN9fTtfLmdldEVsZW1lbnRCeVBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXIuY2FudmFzLGk9Uy5kb2MuZWxlbWVudEZyb21Qb2ludCh0LGUpO2lmKFMud2luLm9wZXJhJiYic3ZnIj09aS50YWdOYW1lKXt2YXIgYT10ZShuKSxzPW4uY3JlYXRlU1ZHUmVjdCgpO3MueD10LWEueCxzLnk9ZS1hLnkscy53aWR0aD1zLmhlaWdodD0xO3ZhciBvPW4uZ2V0SW50ZXJzZWN0aW9uTGlzdChzLG51bGwpO28ubGVuZ3RoJiYoaT1vW28ubGVuZ3RoLTFdKX1pZighaSlyZXR1cm4gbnVsbDtmb3IoO2kucGFyZW50Tm9kZSYmaSE9bi5wYXJlbnROb2RlJiYhaS5yYXBoYWVsOylpPWkucGFyZW50Tm9kZTtyZXR1cm4gaT09ci5jYW52YXMucGFyZW50Tm9kZSYmKGk9biksaT1pJiZpLnJhcGhhZWw/ci5nZXRCeUlkKGkucmFwaGFlbGlkKTpudWxsfSxfLmdldEVsZW1lbnRzQnlCQm94PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2V0KCk7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihuKXtyLmlzQkJveEludGVyc2VjdChuLmdldEJCb3goKSx0KSYmZS5wdXNoKG4pfSksZX0sXy5nZXRCeUlkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmJvdHRvbTtlOyl7aWYoZS5pZD09dClyZXR1cm4gZTtlPWUubmV4dH1yZXR1cm4gbnVsbH0sXy5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuYm90dG9tO3I7KXtpZighMT09PXQuY2FsbChlLHIpKXJldHVybiB0aGlzO3I9ci5uZXh0fXJldHVybiB0aGlzfSxfLmdldEVsZW1lbnRzQnlQb2ludD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuc2V0KCk7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihuKXtuLmlzUG9pbnRJbnNpZGUodCxlKSYmci5wdXNoKG4pfSkscn0sS3QuaXNQb2ludEluc2lkZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucmVhbFBhdGg9Z3RbdGhpcy50eXBlXSh0aGlzKTtyZXR1cm4gdGhpcy5hdHRyKCJ0cmFuc2Zvcm0iKSYmdGhpcy5hdHRyKCJ0cmFuc2Zvcm0iKS5sZW5ndGgmJihuPXIudHJhbnNmb3JtUGF0aChuLHRoaXMuYXR0cigidHJhbnNmb3JtIikpKSxyLmlzUG9pbnRJbnNpZGVQYXRoKG4sdCxlKX0sS3QuZ2V0QkJveD1mdW5jdGlvbih0KXtpZih0aGlzLnJlbW92ZWQpcmV0dXJue307dmFyIGU9dGhpcy5fO3JldHVybiB0PyghZS5kaXJ0eSYmZS5iYm94d3R8fCh0aGlzLnJlYWxQYXRoPWd0W3RoaXMudHlwZV0odGhpcyksZS5iYm94d3Q9U3QodGhpcy5yZWFsUGF0aCksZS5iYm94d3QudG9TdHJpbmc9ZyxlLmRpcnR5PTApLGUuYmJveHd0KTooKGUuZGlydHl8fGUuZGlydHlUfHwhZS5iYm94KSYmKCFlLmRpcnR5JiZ0aGlzLnJlYWxQYXRofHwoZS5iYm94d3Q9MCx0aGlzLnJlYWxQYXRoPWd0W3RoaXMudHlwZV0odGhpcykpLGUuYmJveD1TdCh4dCh0aGlzLnJlYWxQYXRoLHRoaXMubWF0cml4KSksZS5iYm94LnRvU3RyaW5nPWcsZS5kaXJ0eT1lLmRpcnR5VD0wKSxlLmJib3gpfSxLdC5jbG9uZT1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gbnVsbDt2YXIgdD10aGlzLnBhcGVyW3RoaXMudHlwZV0oKS5hdHRyKHRoaXMuYXR0cigpKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaCh0KSx0fSxLdC5nbG93PWZ1bmN0aW9uKHQpe2lmKCJ0ZXh0Ij09dGhpcy50eXBlKXJldHVybiBudWxsO3Q9dHx8e307dmFyIGU9e3dpZHRoOih0LndpZHRofHwxMCkrKCt0aGlzLmF0dHIoInN0cm9rZS13aWR0aCIpfHwxKSxmaWxsOnQuZmlsbHx8ITEsb3BhY2l0eTp0Lm9wYWNpdHl8fC41LG9mZnNldHg6dC5vZmZzZXR4fHwwLG9mZnNldHk6dC5vZmZzZXR5fHwwLGNvbG9yOnQuY29sb3J8fCIjMDAwIn0scj1lLndpZHRoLzIsbj10aGlzLnBhcGVyLGk9bi5zZXQoKSxhPXRoaXMucmVhbFBhdGh8fGd0W3RoaXMudHlwZV0odGhpcyk7YT10aGlzLm1hdHJpeD94dChhLHRoaXMubWF0cml4KTphO2Zvcih2YXIgcz0xO3M8cisxO3MrKylpLnB1c2gobi5wYXRoKGEpLmF0dHIoe3N0cm9rZTplLmNvbG9yLGZpbGw6ZS5maWxsP2UuY29sb3I6Im5vbmUiLCJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsInN0cm9rZS1saW5lY2FwIjoicm91bmQiLCJzdHJva2Utd2lkdGgiOisoZS53aWR0aC9yKnMpLnRvRml4ZWQoMyksb3BhY2l0eTorKGUub3BhY2l0eS9yKS50b0ZpeGVkKDMpfSkpO3JldHVybiBpLmluc2VydEJlZm9yZSh0aGlzKS50cmFuc2xhdGUoZS5vZmZzZXR4LGUub2Zmc2V0eSl9O3ZhciBlZT1mdW5jdGlvbih0LGUsbixpLGEscyxvLGMsbCl7cmV0dXJuIG51bGw9PWw/aCh0LGUsbixpLGEscyxvLGMpOnIuZmluZERvdHNBdFNlZ21lbnQodCxlLG4saSxhLHMsbyxjLHUodCxlLG4saSxhLHMsbyxjLGwpKX0scmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixpLGEpe249RnQobik7Zm9yKHZhciBzLG8sYyxoLHUsbD0iIixmPXt9LHA9MCxkPTAsZz1uLmxlbmd0aDtkPGc7ZCsrKXtpZihjPW5bZF0sIk0iPT1jWzBdKXM9K2NbMV0sbz0rY1syXTtlbHNle2lmKGg9ZWUocyxvLGNbMV0sY1syXSxjWzNdLGNbNF0sY1s1XSxjWzZdKSxwK2g+aSl7aWYoZSYmIWYuc3RhcnQpe2lmKHU9ZWUocyxvLGNbMV0sY1syXSxjWzNdLGNbNF0sY1s1XSxjWzZdLGktcCksbCs9WyJDIit1LnN0YXJ0LngsdS5zdGFydC55LHUubS54LHUubS55LHUueCx1LnldLGEpcmV0dXJuIGw7Zi5zdGFydD1sLGw9WyJNIit1LngsdS55KyJDIit1Lm4ueCx1Lm4ueSx1LmVuZC54LHUuZW5kLnksY1s1XSxjWzZdXS5qb2luKCkscCs9aCxzPStjWzVdLG89K2NbNl07Y29udGludWV9aWYoIXQmJiFlKXJldHVybiB1PWVlKHMsbyxjWzFdLGNbMl0sY1szXSxjWzRdLGNbNV0sY1s2XSxpLXApLHt4OnUueCx5OnUueSxhbHBoYTp1LmFscGhhfX1wKz1oLHM9K2NbNV0sbz0rY1s2XX1sKz1jLnNoaWZ0KCkrY31yZXR1cm4gZi5lbmQ9bCx1PXQ/cDplP2Y6ci5maW5kRG90c0F0U2VnbWVudChzLG8sY1swXSxjWzFdLGNbMl0sY1szXSxjWzRdLGNbNV0sMSksdS5hbHBoYSYmKHU9e3g6dS54LHk6dS55LGFscGhhOnUuYWxwaGF9KSx1fX0sbmU9cmUoMSksaWU9cmUoKSxhZT1yZSgwLDEpO3IuZ2V0VG90YWxMZW5ndGg9bmUsci5nZXRQb2ludEF0TGVuZ3RoPWllLHIuZ2V0U3VicGF0aD1mdW5jdGlvbih0LGUscil7aWYodGhpcy5nZXRUb3RhbExlbmd0aCh0KS1yPDFlLTYpcmV0dXJuIGFlKHQsZSkuZW5kO3ZhciBuPWFlKHQsciwxKTtyZXR1cm4gZT9hZShuLGUpLmVuZDpufSxLdC5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0UGF0aCgpO2lmKHQpcmV0dXJuIHRoaXMubm9kZS5nZXRUb3RhbExlbmd0aD90aGlzLm5vZGUuZ2V0VG90YWxMZW5ndGgoKTpuZSh0KX0sS3QuZ2V0UG9pbnRBdExlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBhdGgoKTtpZihlKXJldHVybiBpZShlLHQpfSxLdC5nZXRQYXRoPWZ1bmN0aW9uKCl7dmFyIHQsZT1yLl9nZXRQYXRoW3RoaXMudHlwZV07aWYoInRleHQiIT10aGlzLnR5cGUmJiJzZXQiIT10aGlzLnR5cGUpcmV0dXJuIGUmJih0PWUodGhpcykpLHR9LEt0LmdldFN1YnBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFBhdGgoKTtpZihuKXJldHVybiByLmdldFN1YnBhdGgobix0LGUpfTt2YXIgc2U9ci5lYXNpbmdfZm9ybXVsYXM9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sIjwiOmZ1bmN0aW9uKHQpe3JldHVybiBHKHQsMS43KX0sIj4iOmZ1bmN0aW9uKHQpe3JldHVybiBHKHQsLjQ4KX0sIjw+IjpmdW5jdGlvbih0KXt2YXIgZT0uNDgtdC8xLjA0LHI9ei5zcXJ0KC4xNzM0K2UqZSksbj1yLWUsaT1HKFgobiksMS8zKSoobjwwPy0xOjEpLGE9LXItZSxzPUcoWChhKSwxLzMpKihhPDA/LTE6MSksbz1pK3MrLjU7cmV0dXJuIDMqKDEtbykqbypvK28qbypvfSxiYWNrSW46ZnVuY3Rpb24odCl7dmFyIGU9MS43MDE1ODtyZXR1cm4gdCp0KigoZSsxKSp0LWUpfSxiYWNrT3V0OmZ1bmN0aW9uKHQpe3QtPTE7dmFyIGU9MS43MDE1ODtyZXR1cm4gdCp0KigoZSsxKSp0K2UpKzF9LGVsYXN0aWM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PSEhdD90OkcoMiwtMTAqdCkqei5zaW4oMipxKih0LS4wNzUpLy4zKSsxfSxib3VuY2U6ZnVuY3Rpb24odCl7dmFyIGUscj03LjU2MjUsbj0yLjc1O3JldHVybiB0PDEvbj9lPXIqdCp0OnQ8Mi9uPyh0LT0xLjUvbixlPXIqdCp0Ky43NSk6dDwyLjUvbj8odC09Mi4yNS9uLGU9cip0KnQrLjkzNzUpOih0LT0yLjYyNS9uLGU9cip0KnQrLjk4NDM3NSksZX19O3NlLmVhc2VJbj1zZVsiZWFzZS1pbiJdPXNlWyI8Il0sc2UuZWFzZU91dD1zZVsiZWFzZS1vdXQiXT1zZVsiPiJdLHNlLmVhc2VJbk91dD1zZVsiZWFzZS1pbi1vdXQiXT1zZVsiPD4iXSxzZVsiYmFjay1pbiJdPXNlLmJhY2tJbixzZVsiYmFjay1vdXQiXT1zZS5iYWNrT3V0O3ZhciBvZT1bXSxjZT10LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8dC53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHQubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx0Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHQubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNil9LGhlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PStuZXcgRGF0ZSxuPTA7bjxvZS5sZW5ndGg7bisrKXt2YXIgaT1vZVtuXTtpZighaS5lbC5yZW1vdmVkJiYhaS5wYXVzZWQpe3ZhciBhLHMsbz10LWkuc3RhcnQsYz1pLm1zLGg9aS5lYXNpbmcsdT1pLmZyb20sbD1pLmRpZmYsZj1pLnRvLHA9KGkudCxpLmVsKSxkPXt9LGc9e307aWYoaS5pbml0c3RhdHVzPyhvPShpLmluaXRzdGF0dXMqaS5hbmltLnRvcC1pLnByZXYpLyhpLnBlcmNlbnQtaS5wcmV2KSpjLGkuc3RhdHVzPWkuaW5pdHN0YXR1cyxkZWxldGUgaS5pbml0c3RhdHVzLGkuc3RvcCYmb2Uuc3BsaWNlKG4tLSwxKSk6aS5zdGF0dXM9KGkucHJldisoaS5wZXJjZW50LWkucHJldikqKG8vYykpL2kuYW5pbS50b3AsIShvPDApKWlmKG88Yyl7dmFyIHg9aChvL2MpO2Zvcih2YXIgdiBpbiB1KWlmKHVba10odikpe3N3aXRjaChydFt2XSl7Y2FzZSBIOmE9K3Vbdl0reCpjKmxbdl07YnJlYWs7Y2FzZSJjb2xvdXIiOmE9InJnYigiK1t1ZShLKHVbdl0ucit4KmMqbFt2XS5yKSksdWUoSyh1W3ZdLmcreCpjKmxbdl0uZykpLHVlKEsodVt2XS5iK3gqYypsW3ZdLmIpKV0uam9pbigiLCIpKyIpIjticmVhaztjYXNlInBhdGgiOmE9W107Zm9yKHZhciBtPTAsYj11W3ZdLmxlbmd0aDttPGI7bSsrKXthW21dPVt1W3ZdW21dWzBdXTtmb3IodmFyIF89MSx3PXVbdl1bbV0ubGVuZ3RoO188dztfKyspYVttXVtfXT0rdVt2XVttXVtfXSt4KmMqbFt2XVttXVtfXTthW21dPWFbbV0uam9pbihJKX1hPWEuam9pbihJKTticmVhaztjYXNlInRyYW5zZm9ybSI6aWYobFt2XS5yZWFsKWZvcihhPVtdLG09MCxiPXVbdl0ubGVuZ3RoO208YjttKyspZm9yKGFbbV09W3Vbdl1bbV1bMF1dLF89MSx3PXVbdl1bbV0ubGVuZ3RoO188dztfKyspYVttXVtfXT11W3ZdW21dW19dK3gqYypsW3ZdW21dW19dO2Vsc2V7dmFyIEU9ZnVuY3Rpb24odCl7cmV0dXJuK3Vbdl1bdF0reCpjKmxbdl1bdF19O2E9W1sibSIsRSgwKSxFKDEpLEUoMiksRSgzKSxFKDQpLEUoNSldXX1icmVhaztjYXNlImNzdiI6aWYoImNsaXAtcmVjdCI9PXYpZm9yKGE9W10sbT00O20tLTspYVttXT0rdVt2XVttXSt4KmMqbFt2XVttXTticmVhaztkZWZhdWx0OnZhciBDPVtdW09dKHVbdl0pO2ZvcihhPVtdLG09cC5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW3ZdLmxlbmd0aDttLS07KWFbbV09K0NbbV0reCpjKmxbdl1bbV19ZFt2XT1hfXAuYXR0cihkKSxmdW5jdGlvbih0LHIsbil7c2V0VGltZW91dChmdW5jdGlvbigpe2UoInJhcGhhZWwuYW5pbS5mcmFtZS4iK3QscixuKX0pfShwLmlkLHAsaS5hbmltKX1lbHNle2lmKGZ1bmN0aW9uKHQsbixpKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSgicmFwaGFlbC5hbmltLmZyYW1lLiIrbi5pZCxuLGkpLGUoInJhcGhhZWwuYW5pbS5maW5pc2guIituLmlkLG4saSksci5pcyh0LCJmdW5jdGlvbiIpJiZ0LmNhbGwobil9KX0oaS5jYWxsYmFjayxwLGkuYW5pbSkscC5hdHRyKGYpLG9lLnNwbGljZShuLS0sMSksaS5yZXBlYXQ+MSYmIWkubmV4dCl7Zm9yKHMgaW4gZilmW2tdKHMpJiYoZ1tzXT1pLnRvdGFsT3JpZ2luW3NdKTtpLmVsLmF0dHIoZykseShpLmFuaW0saS5lbCxpLmFuaW0ucGVyY2VudHNbMF0sbnVsbCxpLnRvdGFsT3JpZ2luLGkucmVwZWF0LTEpfWkubmV4dCYmIWkuc3RvcCYmeShpLmFuaW0saS5lbCxpLm5leHQsbnVsbCxpLnRvdGFsT3JpZ2luLGkucmVwZWF0KX19fXIuc3ZnJiZwJiZwLnBhcGVyJiZwLnBhcGVyLnNhZmFyaSgpLG9lLmxlbmd0aCYmY2UoaGUpfSx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD4yNTU/MjU1OnQ8MD8wOnR9O0t0LmFuaW1hdGVXaXRoPWZ1bmN0aW9uKHQsZSxuLGksYSxzKXt2YXIgbz10aGlzO2lmKG8ucmVtb3ZlZClyZXR1cm4gcyYmcy5jYWxsKG8pLG87dmFyIGM9biBpbnN0YW5jZW9mIHY/bjpyLmFuaW1hdGlvbihuLGksYSxzKTt5KGMsbyxjLnBlcmNlbnRzWzBdLG51bGwsby5hdHRyKCkpO2Zvcih2YXIgaD0wLHU9b2UubGVuZ3RoO2g8dTtoKyspaWYob2VbaF0uYW5pbT09ZSYmb2VbaF0uZWw9PXQpe29lW3UtMV0uc3RhcnQ9b2VbaF0uc3RhcnQ7YnJlYWt9cmV0dXJuIG99LEt0Lm9uQW5pbWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0P2Uub24oInJhcGhhZWwuYW5pbS5mcmFtZS4iK3RoaXMuaWQsdCk6ZS51bmJpbmQoInJhcGhhZWwuYW5pbS5mcmFtZS4iK3RoaXMuaWQpLHRoaXN9LHYucHJvdG90eXBlLmRlbGF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2KHRoaXMuYW5pbSx0aGlzLm1zKTtyZXR1cm4gZS50aW1lcz10aGlzLnRpbWVzLGUuZGVsPSt0fHwwLGV9LHYucHJvdG90eXBlLnJlcGVhdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdih0aGlzLmFuaW0sdGhpcy5tcyk7cmV0dXJuIGUuZGVsPXRoaXMuZGVsLGUudGltZXM9ei5mbG9vcihqKHQsMCkpfHwxLGV9LHIuYW5pbWF0aW9uPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHQgaW5zdGFuY2VvZiB2KXJldHVybiB0OyFyLmlzKG4sImZ1bmN0aW9uIikmJm58fChpPWl8fG58fG51bGwsbj1udWxsKSx0PU9iamVjdCh0KSxlPStlfHwwO3ZhciBhLHMsbz17fTtmb3IocyBpbiB0KXRba10ocykmJloocykhPXMmJloocykrIiUiIT1zJiYoYT0hMCxvW3NdPXRbc10pO3JldHVybiBhPyhuJiYoby5lYXNpbmc9biksaSYmKG8uY2FsbGJhY2s9aSksbmV3IHYoezEwMDpvfSxlKSk6bmV3IHYodCxlKX0sS3QuYW5pbWF0ZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgYT10aGlzO2lmKGEucmVtb3ZlZClyZXR1cm4gaSYmaS5jYWxsKGEpLGE7dmFyIHM9dCBpbnN0YW5jZW9mIHY/dDpyLmFuaW1hdGlvbih0LGUsbixpKTtyZXR1cm4geShzLGEscy5wZXJjZW50c1swXSxudWxsLGEuYXR0cigpKSxhfSxLdC5zZXRUaW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJm51bGwhPWUmJnRoaXMuc3RhdHVzKHQsVShlLHQubXMpL3QubXMpLHRoaXN9LEt0LnN0YXR1cz1mdW5jdGlvbih0LGUpe3ZhciByLG4saT1bXSxhPTA7aWYobnVsbCE9ZSlyZXR1cm4geSh0LHRoaXMsLTEsVShlLDEpKSx0aGlzO2ZvcihyPW9lLmxlbmd0aDthPHI7YSsrKWlmKG49b2VbYV0sbi5lbC5pZD09dGhpcy5pZCYmKCF0fHxuLmFuaW09PXQpKXtpZih0KXJldHVybiBuLnN0YXR1cztpLnB1c2goe2FuaW06bi5hbmltLHN0YXR1czpuLnN0YXR1c30pfXJldHVybiB0PzA6aX0sS3QucGF1c2U9ZnVuY3Rpb24odCl7Zm9yKHZhciByPTA7cjxvZS5sZW5ndGg7cisrKW9lW3JdLmVsLmlkIT10aGlzLmlkfHx0JiZvZVtyXS5hbmltIT10fHwhMSE9PWUoInJhcGhhZWwuYW5pbS5wYXVzZS4iK3RoaXMuaWQsdGhpcyxvZVtyXS5hbmltKSYmKG9lW3JdLnBhdXNlZD0hMCk7cmV0dXJuIHRoaXN9LEt0LnJlc3VtZT1mdW5jdGlvbih0KXtmb3IodmFyIHI9MDtyPG9lLmxlbmd0aDtyKyspaWYob2Vbcl0uZWwuaWQ9PXRoaXMuaWQmJighdHx8b2Vbcl0uYW5pbT09dCkpe3ZhciBuPW9lW3JdOyExIT09ZSgicmFwaGFlbC5hbmltLnJlc3VtZS4iK3RoaXMuaWQsdGhpcyxuLmFuaW0pJiYoZGVsZXRlIG4ucGF1c2VkLHRoaXMuc3RhdHVzKG4uYW5pbSxuLnN0YXR1cykpfXJldHVybiB0aGlzfSxLdC5zdG9wPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8b2UubGVuZ3RoO3IrKylvZVtyXS5lbC5pZCE9dGhpcy5pZHx8dCYmb2Vbcl0uYW5pbSE9dHx8ITEhPT1lKCJyYXBoYWVsLmFuaW0uc3RvcC4iK3RoaXMuaWQsdGhpcyxvZVtyXS5hbmltKSYmb2Uuc3BsaWNlKHItLSwxKTtyZXR1cm4gdGhpc30sZS5vbigicmFwaGFlbC5yZW1vdmUiLG0pLGUub24oInJhcGhhZWwuY2xlYXIiLG0pLEt0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlJhcGhhw6ts4oCZcyBvYmplY3QifTt2YXIgbGU9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtcz1bXSx0aGlzLmxlbmd0aD0wLHRoaXMudHlwZT0ic2V0Iix0KWZvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKykhdFtlXXx8dFtlXS5jb25zdHJ1Y3RvciE9S3QuY29uc3RydWN0b3ImJnRbZV0uY29uc3RydWN0b3IhPWxlfHwodGhpc1t0aGlzLml0ZW1zLmxlbmd0aF09dGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aF09dFtlXSx0aGlzLmxlbmd0aCsrKX0sZmU9bGUucHJvdG90eXBlO2ZlLnB1c2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxyPTAsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspISh0PWFyZ3VtZW50c1tyXSl8fHQuY29uc3RydWN0b3IhPUt0LmNvbnN0cnVjdG9yJiZ0LmNvbnN0cnVjdG9yIT1sZXx8KGU9dGhpcy5pdGVtcy5sZW5ndGgsdGhpc1tlXT10aGlzLml0ZW1zW2VdPXQsdGhpcy5sZW5ndGgrKyk7cmV0dXJuIHRoaXN9LGZlLnBvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aCYmZGVsZXRlIHRoaXNbdGhpcy5sZW5ndGgtLV0sdGhpcy5pdGVtcy5wb3AoKX0sZmUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dGhpcy5pdGVtcy5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlLHRoaXMuaXRlbXNbcl0scikpcmV0dXJuIHRoaXM7cmV0dXJuIHRoaXN9O2Zvcih2YXIgcGUgaW4gS3QpS3Rba10ocGUpJiYoZmVbcGVdPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbdF1bTl0ocixlKX0pfX0ocGUpKTtyZXR1cm4gZmUuYXR0cj1mdW5jdGlvbih0LGUpe2lmKHQmJnIuaXModCxXKSYmci5pcyh0WzBdLCJvYmplY3QiKSlmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspdGhpcy5pdGVtc1tuXS5hdHRyKHRbbl0pO2Vsc2UgZm9yKHZhciBhPTAscz10aGlzLml0ZW1zLmxlbmd0aDthPHM7YSsrKXRoaXMuaXRlbXNbYV0uYXR0cih0LGUpO3JldHVybiB0aGlzfSxmZS5jbGVhcj1mdW5jdGlvbigpe2Zvcig7dGhpcy5sZW5ndGg7KXRoaXMucG9wKCl9LGZlLnNwbGljZT1mdW5jdGlvbih0LGUscil7dD10PDA/aih0aGlzLmxlbmd0aCt0LDApOnQsZT1qKDAsVSh0aGlzLmxlbmd0aC10LGUpKTt2YXIgbixpPVtdLGE9W10scz1bXTtmb3Iobj0yO248YXJndW1lbnRzLmxlbmd0aDtuKyspcy5wdXNoKGFyZ3VtZW50c1tuXSk7Zm9yKG49MDtuPGU7bisrKWEucHVzaCh0aGlzW3Qrbl0pO2Zvcig7bjx0aGlzLmxlbmd0aC10O24rKylpLnB1c2godGhpc1t0K25dKTt2YXIgbz1zLmxlbmd0aDtmb3Iobj0wO248bytpLmxlbmd0aDtuKyspdGhpcy5pdGVtc1t0K25dPXRoaXNbdCtuXT1uPG8/c1tuXTppW24tb107Zm9yKG49dGhpcy5pdGVtcy5sZW5ndGg9dGhpcy5sZW5ndGgtPWUtbzt0aGlzW25dOylkZWxldGUgdGhpc1tuKytdO3JldHVybiBuZXcgbGUoYSl9LGZlLmV4Y2x1ZGU9ZnVuY3Rpb24odCl7DQpmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoO2U8cjtlKyspaWYodGhpc1tlXT09dClyZXR1cm4gdGhpcy5zcGxpY2UoZSwxKSwhMH0sZmUuYW5pbWF0ZT1mdW5jdGlvbih0LGUsbixpKXsoci5pcyhuLCJmdW5jdGlvbiIpfHwhbikmJihpPW58fG51bGwpO3ZhciBhLHMsbz10aGlzLml0ZW1zLmxlbmd0aCxjPW8saD10aGlzO2lmKCFvKXJldHVybiB0aGlzO2kmJihzPWZ1bmN0aW9uKCl7IS0tbyYmaS5jYWxsKGgpfSksbj1yLmlzKG4sInN0cmluZyIpP246czt2YXIgdT1yLmFuaW1hdGlvbih0LGUsbixzKTtmb3IoYT10aGlzLml0ZW1zWy0tY10uYW5pbWF0ZSh1KTtjLS07KXRoaXMuaXRlbXNbY10mJiF0aGlzLml0ZW1zW2NdLnJlbW92ZWQmJnRoaXMuaXRlbXNbY10uYW5pbWF0ZVdpdGgoYSx1LHUpLHRoaXMuaXRlbXNbY10mJiF0aGlzLml0ZW1zW2NdLnJlbW92ZWR8fG8tLTtyZXR1cm4gdGhpc30sZmUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlbXMubGVuZ3RoO2UtLTspdGhpcy5pdGVtc1tlXS5pbnNlcnRBZnRlcih0KTtyZXR1cm4gdGhpc30sZmUuZ2V0QkJveD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPVtdLHI9W10sbj1bXSxpPXRoaXMuaXRlbXMubGVuZ3RoO2ktLTspaWYoIXRoaXMuaXRlbXNbaV0ucmVtb3ZlZCl7dmFyIGE9dGhpcy5pdGVtc1tpXS5nZXRCQm94KCk7dC5wdXNoKGEueCksZS5wdXNoKGEueSksci5wdXNoKGEueCthLndpZHRoKSxuLnB1c2goYS55K2EuaGVpZ2h0KX1yZXR1cm4gdD1VW05dKDAsdCksZT1VW05dKDAsZSkscj1qW05dKDAsciksbj1qW05dKDAsbikse3g6dCx5OmUseDI6cix5MjpuLHdpZHRoOnItdCxoZWlnaHQ6bi1lfX0sZmUuY2xvbmU9ZnVuY3Rpb24odCl7dD10aGlzLnBhcGVyLnNldCgpO2Zvcih2YXIgZT0wLHI9dGhpcy5pdGVtcy5sZW5ndGg7ZTxyO2UrKyl0LnB1c2godGhpcy5pdGVtc1tlXS5jbG9uZSgpKTtyZXR1cm4gdH0sZmUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmFwaGHDq2zigJhzIHNldCJ9LGZlLmdsb3c9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXBlci5zZXQoKTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIsbil7dmFyIGk9ci5nbG93KHQpO251bGwhPWkmJmkuZm9yRWFjaChmdW5jdGlvbih0LHIpe2UucHVzaCh0KX0pfSksZX0sZmUuaXNQb2ludEluc2lkZT1mdW5jdGlvbih0LGUpe3ZhciByPSExO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24obil7aWYobi5pc1BvaW50SW5zaWRlKHQsZSkpcmV0dXJuIHI9ITAsITF9KSxyfSxyLnJlZ2lzdGVyRm9udD1mdW5jdGlvbih0KXtpZighdC5mYWNlKXJldHVybiB0O3RoaXMuZm9udHM9dGhpcy5mb250c3x8e307dmFyIGU9e3c6dC53LGZhY2U6e30sZ2x5cGhzOnt9fSxyPXQuZmFjZVsiZm9udC1mYW1pbHkiXTtmb3IodmFyIG4gaW4gdC5mYWNlKXQuZmFjZVtrXShuKSYmKGUuZmFjZVtuXT10LmZhY2Vbbl0pO2lmKHRoaXMuZm9udHNbcl0/dGhpcy5mb250c1tyXS5wdXNoKGUpOnRoaXMuZm9udHNbcl09W2VdLCF0LnN2Zyl7ZS5mYWNlWyJ1bml0cy1wZXItZW0iXT1KKHQuZmFjZVsidW5pdHMtcGVyLWVtIl0sMTApO2Zvcih2YXIgaSBpbiB0LmdseXBocylpZih0LmdseXBoc1trXShpKSl7dmFyIGE9dC5nbHlwaHNbaV07aWYoZS5nbHlwaHNbaV09e3c6YS53LGs6e30sZDphLmQmJiJNIithLmQucmVwbGFjZSgvW21sY3h0cnZdL2csZnVuY3Rpb24odCl7cmV0dXJue2w6IkwiLGM6IkMiLHg6InoiLHQ6Im0iLHI6ImwiLHY6ImMifVt0XXx8Ik0ifSkrInoifSxhLmspZm9yKHZhciBzIGluIGEuaylhW2tdKHMpJiYoZS5nbHlwaHNbaV0ua1tzXT1hLmtbc10pfX1yZXR1cm4gdH0sXy5nZXRGb250PWZ1bmN0aW9uKHQsZSxuLGkpe2lmKGk9aXx8Im5vcm1hbCIsbj1ufHwibm9ybWFsIixlPStlfHx7bm9ybWFsOjQwMCxib2xkOjcwMCxsaWdodGVyOjMwMCxib2xkZXI6ODAwfVtlXXx8NDAwLHIuZm9udHMpe3ZhciBhPXIuZm9udHNbdF07aWYoIWEpe3ZhciBzPW5ldyBSZWdFeHAoIihefFxccykiK3QucmVwbGFjZSgvW15cd1xkXHMrIX4uOl8tXS9nLFIpKyIoXFxzfCQpIiwiaSIpO2Zvcih2YXIgbyBpbiByLmZvbnRzKWlmKHIuZm9udHNba10obykmJnMudGVzdChvKSl7YT1yLmZvbnRzW29dO2JyZWFrfX12YXIgYztpZihhKWZvcih2YXIgaD0wLHU9YS5sZW5ndGg7aDx1JiYoYz1hW2hdLGMuZmFjZVsiZm9udC13ZWlnaHQiXSE9ZXx8Yy5mYWNlWyJmb250LXN0eWxlIl0hPW4mJmMuZmFjZVsiZm9udC1zdHlsZSJdfHxjLmZhY2VbImZvbnQtc3RyZXRjaCJdIT1pKTtoKyspO3JldHVybiBjfX0sXy5wcmludD1mdW5jdGlvbih0LGUsbixpLGEscyxvLGMpe3M9c3x8Im1pZGRsZSIsbz1qKFUob3x8MCwxKSwtMSksYz1qKFUoY3x8MSwzKSwxKTt2YXIgaCx1PU0obilbRl0oUiksbD0wLGY9MCxwPVI7aWYoci5pcyhpLCJzdHJpbmciKSYmKGk9dGhpcy5nZXRGb250KGkpKSxpKXtoPShhfHwxNikvaS5mYWNlWyJ1bml0cy1wZXItZW0iXTtmb3IodmFyIGQ9aS5mYWNlLmJib3hbRl0odyksZz0rZFswXSx4PWRbM10tZFsxXSx2PTAseT0rZFsxXSsoImJhc2VsaW5lIj09cz94KyAraS5mYWNlLmRlc2NlbnQ6eC8yKSxtPTAsYj11Lmxlbmd0aDttPGI7bSsrKXtpZigiXG4iPT11W21dKWw9MCxFPTAsZj0wLHYrPXgqYztlbHNle3ZhciBfPWYmJmkuZ2x5cGhzW3VbbS0xXV18fHt9LEU9aS5nbHlwaHNbdVttXV07bCs9Zj8oXy53fHxpLncpKyhfLmsmJl8ua1t1W21dXXx8MCkraS53Km86MCxmPTF9RSYmRS5kJiYocCs9ci50cmFuc2Zvcm1QYXRoKEUuZCxbInQiLGwqaCx2KmgsInMiLGgsaCxnLHksInQiLCh0LWcpL2gsKGUteSkvaF0pKX19cmV0dXJuIHRoaXMucGF0aChwKS5hdHRyKHtmaWxsOiIjMDAwIixzdHJva2U6Im5vbmUifSl9LF8uYWRkPWZ1bmN0aW9uKHQpe2lmKHIuaXModCwiYXJyYXkiKSlmb3IodmFyIGUsbj10aGlzLnNldCgpLGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspZT10W2ldfHx7fSxFW2tdKGUudHlwZSkmJm4ucHVzaCh0aGlzW2UudHlwZV0oKS5hdHRyKGUpKTtyZXR1cm4gbn0sci5mb3JtYXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLmlzKGUsVyk/WzBdW09dKGUpOmFyZ3VtZW50cztyZXR1cm4gdCYmci5pcyh0LCJzdHJpbmciKSYmbi5sZW5ndGgtMSYmKHQ9dC5yZXBsYWNlKEMsZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09blsrK2VdP1I6bltlXX0pKSx0fHxSfSxyLmZ1bGxmaWxsPWZ1bmN0aW9uKCl7dmFyIHQ9L1x7KFteXH1dKylcfS9nLGU9Lyg/Oig/Ol58XC4pKC4rPykoPz1cW3xcLnwkfFwoKXxcWygnfCIpKC4rPylcMlxdKShcKFwpKT8vZyxyPWZ1bmN0aW9uKHQscixuKXt2YXIgaT1uO3JldHVybiByLnJlcGxhY2UoZSxmdW5jdGlvbih0LGUscixuLGEpe2U9ZXx8bixpJiYoZSBpbiBpJiYoaT1pW2VdKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmYSYmKGk9aSgpKSl9KSxpPShudWxsPT1pfHxpPT1uP3Q6aSkrIiJ9O3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZSh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCxlLG4pfSl9fSgpLHIubmluamE9ZnVuY3Rpb24oKXtyZXR1cm4gQS53YXM/Uy53aW4uUmFwaGFlbD1BLmlzOmRlbGV0ZSBSYXBoYWVsLHJ9LHIuc3Q9ZmUsZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIGkoKXsvaW4vLnRlc3QodC5yZWFkeVN0YXRlKT9zZXRUaW1lb3V0KGksOSk6ci5ldmUoInJhcGhhZWwuRE9NbG9hZCIpfW51bGw9PXQucmVhZHlTdGF0ZSYmdC5hZGRFdmVudExpc3RlbmVyJiYodC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixuPWZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixuLCExKSx0LnJlYWR5U3RhdGU9ImNvbXBsZXRlIn0sITEpLHQucmVhZHlTdGF0ZT0ibG9hZGluZyIpLGkoKX0oZG9jdW1lbnQpLGUub24oInJhcGhhZWwuRE9NbG9hZCIsZnVuY3Rpb24oKXtiPSEwfSksZnVuY3Rpb24oKXtpZihyLnN2Zyl7dmFyIHQ9Imhhc093blByb3BlcnR5IixlPVN0cmluZyxuPXBhcnNlRmxvYXQsaT1wYXJzZUludCxhPU1hdGgscz1hLm1heCxvPWEuYWJzLGM9YS5wb3csaD0vWywgXSsvLHU9ci5ldmUsbD0iIixmPSIgIixwPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIixkPXtibG9jazoiTTUsMCAwLDIuNSA1LDV6IixjbGFzc2ljOiJNNSwwIDAsMi41IDUsNSAzLjUsMyAzLjUsMnoiLGRpYW1vbmQ6Ik0yLjUsMCA1LDIuNSAyLjUsNSAwLDIuNXoiLG9wZW46Ik02LDEgMSwzLjUgNiw2IixvdmFsOiJNMi41LDBBMi41LDIuNSwwLDAsMSwyLjUsNSAyLjUsMi41LDAsMCwxLDIuNSwweiJ9LGc9e307ci50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJZb3VyIGJyb3dzZXIgc3VwcG9ydHMgU1ZHLlxuWW91IGFyZSBydW5uaW5nIFJhcGhhw6tsICIrdGhpcy52ZXJzaW9ufTt2YXIgeD1mdW5jdGlvbihuLGkpe2lmKGkpeyJzdHJpbmciPT10eXBlb2YgbiYmKG49eChuKSk7Zm9yKHZhciBhIGluIGkpaVt0XShhKSYmKCJ4bGluazoiPT1hLnN1YnN0cmluZygwLDYpP24uc2V0QXR0cmlidXRlTlMocCxhLnN1YnN0cmluZyg2KSxlKGlbYV0pKTpuLnNldEF0dHJpYnV0ZShhLGUoaVthXSkpKX1lbHNlIG49ci5fZy5kb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsbiksbi5zdHlsZSYmKG4uc3R5bGUud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9InJnYmEoMCwwLDAsMCkiKTtyZXR1cm4gbn0sdj1mdW5jdGlvbih0LGkpe3ZhciBoPSJsaW5lYXIiLHU9dC5pZCtpLGY9LjUscD0uNSxkPXQubm9kZSxnPXQucGFwZXIsdj1kLnN0eWxlLHk9ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQodSk7aWYoIXkpe2lmKGk9ZShpKS5yZXBsYWNlKHIuX3JhZGlhbF9ncmFkaWVudCxmdW5jdGlvbih0LGUscil7aWYoaD0icmFkaWFsIixlJiZyKXtmPW4oZSkscD1uKHIpO3ZhciBpPTIqKHA+LjUpLTE7YyhmLS41LDIpK2MocC0uNSwyKT4uMjUmJihwPWEuc3FydCguMjUtYyhmLS41LDIpKSppKy41KSYmLjUhPXAmJihwPXAudG9GaXhlZCg1KS0xZS01KmkpfXJldHVybiBsfSksaT1pLnNwbGl0KC9ccypcLVxzKi8pLCJsaW5lYXIiPT1oKXt2YXIgbT1pLnNoaWZ0KCk7aWYobT0tbihtKSxpc05hTihtKSlyZXR1cm4gbnVsbDt2YXIgYj1bMCwwLGEuY29zKHIucmFkKG0pKSxhLnNpbihyLnJhZChtKSldLF89MS8ocyhvKGJbMl0pLG8oYlszXSkpfHwxKTtiWzJdKj1fLGJbM10qPV8sYlsyXTwwJiYoYlswXT0tYlsyXSxiWzJdPTApLGJbM108MCYmKGJbMV09LWJbM10sYlszXT0wKX12YXIgdz1yLl9wYXJzZURvdHMoaSk7aWYoIXcpcmV0dXJuIG51bGw7aWYodT11LnJlcGxhY2UoL1tcKFwpXHMsXHhiMCNdL2csIl8iKSx0LmdyYWRpZW50JiZ1IT10LmdyYWRpZW50LmlkJiYoZy5kZWZzLnJlbW92ZUNoaWxkKHQuZ3JhZGllbnQpLGRlbGV0ZSB0LmdyYWRpZW50KSwhdC5ncmFkaWVudCl7eT14KGgrIkdyYWRpZW50Iix7aWQ6dX0pLHQuZ3JhZGllbnQ9eSx4KHksInJhZGlhbCI9PWg/e2Z4OmYsZnk6cH06e3gxOmJbMF0seTE6YlsxXSx4MjpiWzJdLHkyOmJbM10sZ3JhZGllbnRUcmFuc2Zvcm06dC5tYXRyaXguaW52ZXJ0KCl9KSxnLmRlZnMuYXBwZW5kQ2hpbGQoeSk7Zm9yKHZhciBFPTAsQz13Lmxlbmd0aDtFPEM7RSsrKXkuYXBwZW5kQ2hpbGQoeCgic3RvcCIse29mZnNldDp3W0VdLm9mZnNldD93W0VdLm9mZnNldDpFPyIxMDAlIjoiMCUiLCJzdG9wLWNvbG9yIjp3W0VdLmNvbG9yfHwiI2ZmZiJ9KSl9fXJldHVybiB4KGQse2ZpbGw6InVybCgjIit1KyIpIixvcGFjaXR5OjEsImZpbGwtb3BhY2l0eSI6MX0pLHYuZmlsbD1sLHYub3BhY2l0eT0xLHYuZmlsbE9wYWNpdHk9MSwxfSx5PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QkJveCgxKTt4KHQucGF0dGVybix7cGF0dGVyblRyYW5zZm9ybTp0Lm1hdHJpeC5pbnZlcnQoKSsiIHRyYW5zbGF0ZSgiK2UueCsiLCIrZS55KyIpIn0pfSxtPWZ1bmN0aW9uKG4saSxhKXtpZigicGF0aCI9PW4udHlwZSl7Zm9yKHZhciBzLG8sYyxoLHUsZj1lKGkpLnRvTG93ZXJDYXNlKCkuc3BsaXQoIi0iKSxwPW4ucGFwZXIsdj1hPyJlbmQiOiJzdGFydCIseT1uLm5vZGUsbT1uLmF0dHJzLGI9bVsic3Ryb2tlLXdpZHRoIl0sXz1mLmxlbmd0aCx3PSJjbGFzc2ljIixFPTMsQz0zLGs9NTtfLS07KXN3aXRjaChmW19dKXtjYXNlImJsb2NrIjpjYXNlImNsYXNzaWMiOmNhc2Uib3ZhbCI6Y2FzZSJkaWFtb25kIjpjYXNlIm9wZW4iOmNhc2Uibm9uZSI6dz1mW19dO2JyZWFrO2Nhc2Uid2lkZSI6Qz01O2JyZWFrO2Nhc2UibmFycm93IjpDPTI7YnJlYWs7Y2FzZSJsb25nIjpFPTU7YnJlYWs7Y2FzZSJzaG9ydCI6RT0yfWlmKCJvcGVuIj09dz8oRSs9MixDKz0yLGsrPTIsYz0xLGg9YT80OjEsdT17ZmlsbDoibm9uZSIsc3Ryb2tlOm0uc3Ryb2tlfSk6KGg9Yz1FLzIsdT17ZmlsbDptLnN0cm9rZSxzdHJva2U6Im5vbmUifSksbi5fLmFycm93cz9hPyhuLl8uYXJyb3dzLmVuZFBhdGgmJmdbbi5fLmFycm93cy5lbmRQYXRoXS0tLG4uXy5hcnJvd3MuZW5kTWFya2VyJiZnW24uXy5hcnJvd3MuZW5kTWFya2VyXS0tKToobi5fLmFycm93cy5zdGFydFBhdGgmJmdbbi5fLmFycm93cy5zdGFydFBhdGhdLS0sbi5fLmFycm93cy5zdGFydE1hcmtlciYmZ1tuLl8uYXJyb3dzLnN0YXJ0TWFya2VyXS0tKTpuLl8uYXJyb3dzPXt9LCJub25lIiE9dyl7dmFyIFM9InJhcGhhZWwtbWFya2VyLSIrdyxBPSJyYXBoYWVsLW1hcmtlci0iK3YrdytFK0M7ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoUyk/Z1tTXSsrOihwLmRlZnMuYXBwZW5kQ2hpbGQoeCh4KCJwYXRoIikseyJzdHJva2UtbGluZWNhcCI6InJvdW5kIixkOmRbd10saWQ6U30pKSxnW1NdPTEpO3ZhciBCLE49ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoQSk7Tj8oZ1tBXSsrLEI9Ti5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlIilbMF0pOihOPXgoeCgibWFya2VyIikse2lkOkEsbWFya2VySGVpZ2h0OkMsbWFya2VyV2lkdGg6RSxvcmllbnQ6ImF1dG8iLHJlZlg6aCxyZWZZOkMvMn0pLEI9eCh4KCJ1c2UiKSx7InhsaW5rOmhyZWYiOiIjIitTLHRyYW5zZm9ybTooYT8icm90YXRlKDE4MCAiK0UvMisiICIrQy8yKyIpICI6bCkrInNjYWxlKCIrRS9rKyIsIitDL2srIikiLCJzdHJva2Utd2lkdGgiOigxLygoRS9rK0MvaykvMikpLnRvRml4ZWQoNCl9KSxOLmFwcGVuZENoaWxkKEIpLHAuZGVmcy5hcHBlbmRDaGlsZChOKSxnW0FdPTEpLHgoQix1KTt2YXIgTz1jKigiZGlhbW9uZCIhPXcmJiJvdmFsIiE9dyk7YT8ocz1uLl8uYXJyb3dzLnN0YXJ0ZHgqYnx8MCxvPXIuZ2V0VG90YWxMZW5ndGgobS5wYXRoKS1PKmIpOihzPU8qYixvPXIuZ2V0VG90YWxMZW5ndGgobS5wYXRoKS0obi5fLmFycm93cy5lbmRkeCpifHwwKSksdT17fSx1WyJtYXJrZXItIit2XT0idXJsKCMiK0ErIikiLChvfHxzKSYmKHUuZD1yLmdldFN1YnBhdGgobS5wYXRoLHMsbykpLHgoeSx1KSxuLl8uYXJyb3dzW3YrIlBhdGgiXT1TLG4uXy5hcnJvd3NbdisiTWFya2VyIl09QSxuLl8uYXJyb3dzW3YrImR4Il09TyxuLl8uYXJyb3dzW3YrIlR5cGUiXT13LG4uXy5hcnJvd3NbdisiU3RyaW5nIl09aX1lbHNlIGE/KHM9bi5fLmFycm93cy5zdGFydGR4KmJ8fDAsbz1yLmdldFRvdGFsTGVuZ3RoKG0ucGF0aCktcyk6KHM9MCxvPXIuZ2V0VG90YWxMZW5ndGgobS5wYXRoKS0obi5fLmFycm93cy5lbmRkeCpifHwwKSksbi5fLmFycm93c1t2KyJQYXRoIl0mJngoeSx7ZDpyLmdldFN1YnBhdGgobS5wYXRoLHMsbyl9KSxkZWxldGUgbi5fLmFycm93c1t2KyJQYXRoIl0sZGVsZXRlIG4uXy5hcnJvd3NbdisiTWFya2VyIl0sZGVsZXRlIG4uXy5hcnJvd3NbdisiZHgiXSxkZWxldGUgbi5fLmFycm93c1t2KyJUeXBlIl0sZGVsZXRlIG4uXy5hcnJvd3NbdisiU3RyaW5nIl07Zm9yKHUgaW4gZylpZihnW3RdKHUpJiYhZ1t1XSl7dmFyIFQ9ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQodSk7VCYmVC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKFQpfX19LGI9eyIiOlswXSxub25lOlswXSwiLSI6WzMsMV0sIi4iOlsxLDFdLCItLiI6WzMsMSwxLDFdLCItLi4iOlszLDEsMSwxLDEsMV0sIi4gIjpbMSwzXSwiLSAiOls0LDNdLCItLSI6WzgsM10sIi0gLiI6WzQsMywxLDNdLCItLS4iOls4LDMsMSwzXSwiLS0uLiI6WzgsMywxLDMsMSwzXX0sXz1mdW5jdGlvbih0LHIsbil7aWYocj1iW2UocikudG9Mb3dlckNhc2UoKV0pe2Zvcih2YXIgaT10LmF0dHJzWyJzdHJva2Utd2lkdGgiXXx8IjEiLGE9e3JvdW5kOmksc3F1YXJlOmksYnV0dDowfVt0LmF0dHJzWyJzdHJva2UtbGluZWNhcCJdfHxuWyJzdHJva2UtbGluZWNhcCJdXXx8MCxzPVtdLG89ci5sZW5ndGg7by0tOylzW29dPXJbb10qaSsobyUyPzE6LTEpKmE7eCh0Lm5vZGUseyJzdHJva2UtZGFzaGFycmF5IjpzLmpvaW4oIiwiKX0pfX0sdz1mdW5jdGlvbihuLGEpe3ZhciBjPW4ubm9kZSx1PW4uYXR0cnMsZj1jLnN0eWxlLnZpc2liaWxpdHk7Yy5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO2Zvcih2YXIgZCBpbiBhKWlmKGFbdF0oZCkpe2lmKCFyLl9hdmFpbGFibGVBdHRyc1t0XShkKSljb250aW51ZTt2YXIgZz1hW2RdO3N3aXRjaCh1W2RdPWcsZCl7Y2FzZSJibHVyIjpuLmJsdXIoZyk7YnJlYWs7Y2FzZSJ0aXRsZSI6dmFyIGI9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGl0bGUiKTtpZihiLmxlbmd0aCYmKGI9YlswXSkpYi5maXJzdENoaWxkLm5vZGVWYWx1ZT1nO2Vsc2V7Yj14KCJ0aXRsZSIpO3ZhciB3PXIuX2cuZG9jLmNyZWF0ZVRleHROb2RlKGcpO2IuYXBwZW5kQ2hpbGQodyksYy5hcHBlbmRDaGlsZChiKX1icmVhaztjYXNlImhyZWYiOmNhc2UidGFyZ2V0Ijp2YXIgQz1jLnBhcmVudE5vZGU7aWYoImEiIT1DLnRhZ05hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGs9eCgiYSIpO0MuaW5zZXJ0QmVmb3JlKGssYyksay5hcHBlbmRDaGlsZChjKSxDPWt9InRhcmdldCI9PWQ/Qy5zZXRBdHRyaWJ1dGVOUyhwLCJzaG93IiwiYmxhbmsiPT1nPyJuZXciOmcpOkMuc2V0QXR0cmlidXRlTlMocCxkLGcpO2JyZWFrO2Nhc2UiY3Vyc29yIjpjLnN0eWxlLmN1cnNvcj1nO2JyZWFrO2Nhc2UidHJhbnNmb3JtIjpuLnRyYW5zZm9ybShnKTticmVhaztjYXNlImFycm93LXN0YXJ0IjptKG4sZyk7YnJlYWs7Y2FzZSJhcnJvdy1lbmQiOm0obixnLDEpO2JyZWFrO2Nhc2UiY2xpcC1yZWN0Ijp2YXIgUz1lKGcpLnNwbGl0KGgpO2lmKDQ9PVMubGVuZ3RoKXtuLmNsaXAmJm4uY2xpcC5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobi5jbGlwLnBhcmVudE5vZGUpO3ZhciBBPXgoImNsaXBQYXRoIiksQj14KCJyZWN0Iik7QS5pZD1yLmNyZWF0ZVVVSUQoKSx4KEIse3g6U1swXSx5OlNbMV0sd2lkdGg6U1syXSxoZWlnaHQ6U1szXX0pLEEuYXBwZW5kQ2hpbGQoQiksbi5wYXBlci5kZWZzLmFwcGVuZENoaWxkKEEpLHgoYyx7ImNsaXAtcGF0aCI6InVybCgjIitBLmlkKyIpIn0pLG4uY2xpcD1CfWlmKCFnKXt2YXIgTj1jLmdldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIik7aWYoTil7dmFyIE89ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoTi5yZXBsYWNlKC8oXnVybFwoI3xcKSQpL2csbCkpO08mJk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChPKSx4KGMseyJjbGlwLXBhdGgiOmx9KSxkZWxldGUgbi5jbGlwfX1icmVhaztjYXNlInBhdGgiOiJwYXRoIj09bi50eXBlJiYoeChjLHtkOmc/dS5wYXRoPXIuX3BhdGhUb0Fic29sdXRlKGcpOiJNMCwwIn0pLG4uXy5kaXJ0eT0xLG4uXy5hcnJvd3MmJigic3RhcnRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3Muc3RhcnRTdHJpbmcpLCJlbmRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3MuZW5kU3RyaW5nLDEpKSk7YnJlYWs7Y2FzZSJ3aWR0aCI6aWYoYy5zZXRBdHRyaWJ1dGUoZCxnKSxuLl8uZGlydHk9MSwhdS5meClicmVhaztkPSJ4IixnPXUueDtjYXNlIngiOnUuZngmJihnPS11LngtKHUud2lkdGh8fDApKTtjYXNlInJ4IjppZigicngiPT1kJiYicmVjdCI9PW4udHlwZSlicmVhaztjYXNlImN4IjpjLnNldEF0dHJpYnV0ZShkLGcpLG4ucGF0dGVybiYmeShuKSxuLl8uZGlydHk9MTticmVhaztjYXNlImhlaWdodCI6aWYoYy5zZXRBdHRyaWJ1dGUoZCxnKSxuLl8uZGlydHk9MSwhdS5meSlicmVhaztkPSJ5IixnPXUueTtjYXNlInkiOnUuZnkmJihnPS11LnktKHUuaGVpZ2h0fHwwKSk7Y2FzZSJyeSI6aWYoInJ5Ij09ZCYmInJlY3QiPT1uLnR5cGUpYnJlYWs7Y2FzZSJjeSI6Yy5zZXRBdHRyaWJ1dGUoZCxnKSxuLnBhdHRlcm4mJnkobiksbi5fLmRpcnR5PTE7YnJlYWs7Y2FzZSJyIjoicmVjdCI9PW4udHlwZT94KGMse3J4Omcscnk6Z30pOmMuc2V0QXR0cmlidXRlKGQsZyksbi5fLmRpcnR5PTE7YnJlYWs7Y2FzZSJzcmMiOiJpbWFnZSI9PW4udHlwZSYmYy5zZXRBdHRyaWJ1dGVOUyhwLCJocmVmIixnKTticmVhaztjYXNlInN0cm9rZS13aWR0aCI6MT09bi5fLnN4JiYxPT1uLl8uc3l8fChnLz1zKG8obi5fLnN4KSxvKG4uXy5zeSkpfHwxKSxuLnBhcGVyLl92YlNpemUmJihnKj1uLnBhcGVyLl92YlNpemUpLGMuc2V0QXR0cmlidXRlKGQsZyksdVsic3Ryb2tlLWRhc2hhcnJheSJdJiZfKG4sdVsic3Ryb2tlLWRhc2hhcnJheSJdLGEpLG4uXy5hcnJvd3MmJigic3RhcnRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3Muc3RhcnRTdHJpbmcpLCJlbmRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3MuZW5kU3RyaW5nLDEpKTticmVhaztjYXNlInN0cm9rZS1kYXNoYXJyYXkiOl8obixnLGEpO2JyZWFrO2Nhc2UiZmlsbCI6dmFyIFQ9ZShnKS5tYXRjaChyLl9JU1VSTCk7aWYoVCl7QT14KCJwYXR0ZXJuIik7dmFyIFI9eCgiaW1hZ2UiKTtBLmlkPXIuY3JlYXRlVVVJRCgpLHgoQSx7eDowLHk6MCxwYXR0ZXJuVW5pdHM6InVzZXJTcGFjZU9uVXNlIixoZWlnaHQ6MSx3aWR0aDoxfSkseChSLHt4OjAseTowLCJ4bGluazpocmVmIjpUWzFdfSksQS5hcHBlbmRDaGlsZChSKSxmdW5jdGlvbih0KXtyLl9wcmVsb2FkKFRbMV0sZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFdpZHRoLHI9dGhpcy5vZmZzZXRIZWlnaHQ7eCh0LHt3aWR0aDplLGhlaWdodDpyfSkseChSLHt3aWR0aDplLGhlaWdodDpyfSksbi5wYXBlci5zYWZhcmkoKX0pfShBKSxuLnBhcGVyLmRlZnMuYXBwZW5kQ2hpbGQoQSkseChjLHtmaWxsOiJ1cmwoIyIrQS5pZCsiKSJ9KSxuLnBhdHRlcm49QSxuLnBhdHRlcm4mJnkobik7YnJlYWt9dmFyIEk9ci5nZXRSR0IoZyk7aWYoSS5lcnJvcil7aWYoKCJjaXJjbGUiPT1uLnR5cGV8fCJlbGxpcHNlIj09bi50eXBlfHwiciIhPWUoZykuY2hhckF0KCkpJiZ2KG4sZykpe2lmKCJvcGFjaXR5ImluIHV8fCJmaWxsLW9wYWNpdHkiaW4gdSl7dmFyIE09ci5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoYy5nZXRBdHRyaWJ1dGUoImZpbGwiKS5yZXBsYWNlKC9edXJsXCgjfFwpJC9nLGwpKTtpZihNKXt2YXIgRj1NLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdG9wIik7eChGW0YubGVuZ3RoLTFdLHsic3RvcC1vcGFjaXR5IjooIm9wYWNpdHkiaW4gdT91Lm9wYWNpdHk6MSkqKCJmaWxsLW9wYWNpdHkiaW4gdT91WyJmaWxsLW9wYWNpdHkiXToxKX0pfX11LmdyYWRpZW50PWcsdS5maWxsPSJub25lIjticmVha319ZWxzZSBkZWxldGUgYS5ncmFkaWVudCxkZWxldGUgdS5ncmFkaWVudCwhci5pcyh1Lm9wYWNpdHksInVuZGVmaW5lZCIpJiZyLmlzKGEub3BhY2l0eSwidW5kZWZpbmVkIikmJngoYyx7b3BhY2l0eTp1Lm9wYWNpdHl9KSwhci5pcyh1WyJmaWxsLW9wYWNpdHkiXSwidW5kZWZpbmVkIikmJnIuaXMoYVsiZmlsbC1vcGFjaXR5Il0sInVuZGVmaW5lZCIpJiZ4KGMseyJmaWxsLW9wYWNpdHkiOnVbImZpbGwtb3BhY2l0eSJdfSk7SVt0XSgib3BhY2l0eSIpJiZ4KGMseyJmaWxsLW9wYWNpdHkiOkkub3BhY2l0eT4xP0kub3BhY2l0eS8xMDA6SS5vcGFjaXR5fSk7Y2FzZSJzdHJva2UiOkk9ci5nZXRSR0IoZyksYy5zZXRBdHRyaWJ1dGUoZCxJLmhleCksInN0cm9rZSI9PWQmJklbdF0oIm9wYWNpdHkiKSYmeChjLHsic3Ryb2tlLW9wYWNpdHkiOkkub3BhY2l0eT4xP0kub3BhY2l0eS8xMDA6SS5vcGFjaXR5fSksInN0cm9rZSI9PWQmJm4uXy5hcnJvd3MmJigic3RhcnRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3Muc3RhcnRTdHJpbmcpLCJlbmRTdHJpbmciaW4gbi5fLmFycm93cyYmbShuLG4uXy5hcnJvd3MuZW5kU3RyaW5nLDEpKTticmVhaztjYXNlImdyYWRpZW50IjooImNpcmNsZSI9PW4udHlwZXx8ImVsbGlwc2UiPT1uLnR5cGV8fCJyIiE9ZShnKS5jaGFyQXQoKSkmJnYobixnKTticmVhaztjYXNlIm9wYWNpdHkiOnUuZ3JhZGllbnQmJiF1W3RdKCJzdHJva2Utb3BhY2l0eSIpJiZ4KGMseyJzdHJva2Utb3BhY2l0eSI6Zz4xP2cvMTAwOmd9KTtjYXNlImZpbGwtb3BhY2l0eSI6aWYodS5ncmFkaWVudCl7TT1yLl9nLmRvYy5nZXRFbGVtZW50QnlJZChjLmdldEF0dHJpYnV0ZSgiZmlsbCIpLnJlcGxhY2UoL151cmxcKCN8XCkkL2csbCkpLE0mJihGPU0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0b3AiKSx4KEZbRi5sZW5ndGgtMV0seyJzdG9wLW9wYWNpdHkiOmd9KSk7YnJlYWt9ZGVmYXVsdDoiZm9udC1zaXplIj09ZCYmKGc9aShnLDEwKSsicHgiKTt2YXIgRD1kLnJlcGxhY2UoLyhcLS4pL2csZnVuY3Rpb24odCl7cmV0dXJuIHQuc3Vic3RyaW5nKDEpLnRvVXBwZXJDYXNlKCl9KTtjLnN0eWxlW0RdPWcsbi5fLmRpcnR5PTEsYy5zZXRBdHRyaWJ1dGUoZCxnKX19RShuLGEpLGMuc3R5bGUudmlzaWJpbGl0eT1mfSxFPWZ1bmN0aW9uKG4sYSl7aWYoInRleHQiPT1uLnR5cGUmJihhW3RdKCJ0ZXh0Iil8fGFbdF0oImZvbnQiKXx8YVt0XSgiZm9udC1zaXplIil8fGFbdF0oIngiKXx8YVt0XSgieSIpKSl7dmFyIHM9bi5hdHRycyxvPW4ubm9kZSxjPW8uZmlyc3RDaGlsZD9pKHIuX2cuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoby5maXJzdENoaWxkLGwpLmdldFByb3BlcnR5VmFsdWUoImZvbnQtc2l6ZSIpLDEwKToxMDtpZihhW3RdKCJ0ZXh0Iikpe2ZvcihzLnRleHQ9YS50ZXh0O28uZmlyc3RDaGlsZDspby5yZW1vdmVDaGlsZChvLmZpcnN0Q2hpbGQpO2Zvcih2YXIgaCx1PWUoYS50ZXh0KS5zcGxpdCgiXG4iKSxmPVtdLHA9MCxkPXUubGVuZ3RoO3A8ZDtwKyspaD14KCJ0c3BhbiIpLHAmJngoaCx7ZHk6MS4yKmMseDpzLnh9KSxoLmFwcGVuZENoaWxkKHIuX2cuZG9jLmNyZWF0ZVRleHROb2RlKHVbcF0pKSxvLmFwcGVuZENoaWxkKGgpLGZbcF09aH1lbHNlIGZvcihmPW8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRzcGFuIikscD0wLGQ9Zi5sZW5ndGg7cDxkO3ArKylwP3goZltwXSx7ZHk6MS4yKmMseDpzLnh9KTp4KGZbMF0se2R5OjB9KTt4KG8se3g6cy54LHk6cy55fSksbi5fLmRpcnR5PTE7dmFyIGc9bi5fZ2V0QkJveCgpLHY9cy55LShnLnkrZy5oZWlnaHQvMik7diYmci5pcyh2LCJmaW5pdGUiKSYmeChmWzBdLHtkeTp2fSl9fSxDPWZ1bmN0aW9uKHQsZSl7dGhpc1swXT10aGlzLm5vZGU9dCx0LnJhcGhhZWw9ITAsdGhpcy5pZD1yLl9vaWQrKyx0LnJhcGhhZWxpZD10aGlzLmlkLHRoaXMubWF0cml4PXIubWF0cml4KCksdGhpcy5yZWFsUGF0aD1udWxsLHRoaXMucGFwZXI9ZSx0aGlzLmF0dHJzPXRoaXMuYXR0cnN8fHt9LHRoaXMuXz17dHJhbnNmb3JtOltdLHN4OjEsc3k6MSxkZWc6MCxkeDowLGR5OjAsZGlydHk6MX0sIWUuYm90dG9tJiYoZS5ib3R0b209dGhpcyksdGhpcy5wcmV2PWUudG9wLGUudG9wJiYoZS50b3AubmV4dD10aGlzKSxlLnRvcD10aGlzLHRoaXMubmV4dD1udWxsfSxrPXIuZWw7Qy5wcm90b3R5cGU9ayxrLmNvbnN0cnVjdG9yPUMsci5fZW5naW5lLnBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgcj14KCJwYXRoIik7ZS5jYW52YXMmJmUuY2FudmFzLmFwcGVuZENoaWxkKHIpO3ZhciBuPW5ldyBDKHIsZSk7cmV0dXJuIG4udHlwZT0icGF0aCIsdyhuLHtmaWxsOiJub25lIixzdHJva2U6IiMwMDAiLHBhdGg6dH0pLG59LGsucm90YXRlPWZ1bmN0aW9uKHQscixpKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYodD1lKHQpLnNwbGl0KGgpLHQubGVuZ3RoLTEmJihyPW4odFsxXSksaT1uKHRbMl0pKSx0PW4odFswXSksbnVsbD09aSYmKHI9aSksbnVsbD09cnx8bnVsbD09aSl7dmFyIGE9dGhpcy5nZXRCQm94KDEpO3I9YS54K2Eud2lkdGgvMixpPWEueSthLmhlaWdodC8yfXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbWyJyIix0LHIsaV1dKSksdGhpc30say5zY2FsZT1mdW5jdGlvbih0LHIsaSxhKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYodD1lKHQpLnNwbGl0KGgpLHQubGVuZ3RoLTEmJihyPW4odFsxXSksaT1uKHRbMl0pLGE9bih0WzNdKSksdD1uKHRbMF0pLG51bGw9PXImJihyPXQpLG51bGw9PWEmJihpPWEpLG51bGw9PWl8fG51bGw9PWEpdmFyIHM9dGhpcy5nZXRCQm94KDEpO3JldHVybiBpPW51bGw9PWk/cy54K3Mud2lkdGgvMjppLGE9bnVsbD09YT9zLnkrcy5oZWlnaHQvMjphLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInMiLHQscixpLGFdXSkpLHRoaXN9LGsudHJhbnNsYXRlPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0PWUodCkuc3BsaXQoaCksdC5sZW5ndGgtMSYmKHI9bih0WzFdKSksdD1uKHRbMF0pfHwwLHI9K3J8fDAsdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1sidCIsdCxyXV0pKSx0aGlzKX0say50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5fO2lmKG51bGw9PWUpcmV0dXJuIG4udHJhbnNmb3JtO2lmKHIuX2V4dHJhY3RUcmFuc2Zvcm0odGhpcyxlKSx0aGlzLmNsaXAmJngodGhpcy5jbGlwLHt0cmFuc2Zvcm06dGhpcy5tYXRyaXguaW52ZXJ0KCl9KSx0aGlzLnBhdHRlcm4mJnkodGhpcyksdGhpcy5ub2RlJiZ4KHRoaXMubm9kZSx7dHJhbnNmb3JtOnRoaXMubWF0cml4fSksMSE9bi5zeHx8MSE9bi5zeSl7dmFyIGk9dGhpcy5hdHRyc1t0XSgic3Ryb2tlLXdpZHRoIik/dGhpcy5hdHRyc1sic3Ryb2tlLXdpZHRoIl06MTt0aGlzLmF0dHIoeyJzdHJva2Utd2lkdGgiOml9KX1yZXR1cm4gdGhpc30say5oaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucmVtb3ZlZCYmdGhpcy5wYXBlci5zYWZhcmkodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzfSxrLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiZ0aGlzLnBhcGVyLnNhZmFyaSh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheT0iIiksdGhpc30say5yZW1vdmU9ZnVuY3Rpb24oKXtpZighdGhpcy5yZW1vdmVkJiZ0aGlzLm5vZGUucGFyZW50Tm9kZSl7dmFyIHQ9dGhpcy5wYXBlcjt0Ll9fc2V0X18mJnQuX19zZXRfXy5leGNsdWRlKHRoaXMpLHUudW5iaW5kKCJyYXBoYWVsLiouKi4iK3RoaXMuaWQpLHRoaXMuZ3JhZGllbnQmJnQuZGVmcy5yZW1vdmVDaGlsZCh0aGlzLmdyYWRpZW50KSxyLl90ZWFyKHRoaXMsdCksImEiPT10aGlzLm5vZGUucGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk/dGhpcy5ub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUucGFyZW50Tm9kZSk6dGhpcy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKTtmb3IodmFyIGUgaW4gdGhpcyl0aGlzW2VdPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzW2VdP3IuX3JlbW92ZWRGYWN0b3J5KGUpOm51bGw7dGhpcy5yZW1vdmVkPSEwfX0say5fZ2V0QkJveD1mdW5jdGlvbigpe2lmKCJub25lIj09dGhpcy5ub2RlLnN0eWxlLmRpc3BsYXkpe3RoaXMuc2hvdygpO3ZhciB0PSEwfXZhciBlPXt9O3RyeXtlPXRoaXMubm9kZS5nZXRCQm94KCl9Y2F0Y2godCl7fWZpbmFsbHl7ZT1lfHx7fX1yZXR1cm4gdCYmdGhpcy5oaWRlKCksZX0say5hdHRyPWZ1bmN0aW9uKGUsbil7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKG51bGw9PWUpe3ZhciBpPXt9O2Zvcih2YXIgYSBpbiB0aGlzLmF0dHJzKXRoaXMuYXR0cnNbdF0oYSkmJihpW2FdPXRoaXMuYXR0cnNbYV0pO3JldHVybiBpLmdyYWRpZW50JiYibm9uZSI9PWkuZmlsbCYmKGkuZmlsbD1pLmdyYWRpZW50KSYmZGVsZXRlIGkuZ3JhZGllbnQsaS50cmFuc2Zvcm09dGhpcy5fLnRyYW5zZm9ybSxpfWlmKG51bGw9PW4mJnIuaXMoZSwic3RyaW5nIikpe2lmKCJmaWxsIj09ZSYmIm5vbmUiPT10aGlzLmF0dHJzLmZpbGwmJnRoaXMuYXR0cnMuZ3JhZGllbnQpcmV0dXJuIHRoaXMuYXR0cnMuZ3JhZGllbnQ7aWYoInRyYW5zZm9ybSI9PWUpcmV0dXJuIHRoaXMuXy50cmFuc2Zvcm07Zm9yKHZhciBzPWUuc3BsaXQoaCksbz17fSxjPTAsbD1zLmxlbmd0aDtjPGw7YysrKWU9c1tjXSxlIGluIHRoaXMuYXR0cnM/b1tlXT10aGlzLmF0dHJzW2VdOnIuaXModGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2VdLCJmdW5jdGlvbiIpP29bZV09dGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2VdLmRlZjpvW2VdPXIuX2F2YWlsYWJsZUF0dHJzW2VdO3JldHVybiBsLTE/bzpvW3NbMF1dfWlmKG51bGw9PW4mJnIuaXMoZSwiYXJyYXkiKSl7Zm9yKG89e30sYz0wLGw9ZS5sZW5ndGg7YzxsO2MrKylvW2VbY11dPXRoaXMuYXR0cihlW2NdKTtyZXR1cm4gb31pZihudWxsIT1uKXt2YXIgZj17fTtmW2VdPW59ZWxzZSBudWxsIT1lJiZyLmlzKGUsIm9iamVjdCIpJiYoZj1lKTtmb3IodmFyIHAgaW4gZil1KCJyYXBoYWVsLmF0dHIuIitwKyIuIit0aGlzLmlkLHRoaXMsZltwXSk7Zm9yKHAgaW4gdGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzKWlmKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1t0XShwKSYmZlt0XShwKSYmci5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcF0sImZ1bmN0aW9uIikpe3ZhciBkPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1twXS5hcHBseSh0aGlzLFtdLmNvbmNhdChmW3BdKSk7dGhpcy5hdHRyc1twXT1mW3BdO2Zvcih2YXIgZyBpbiBkKWRbdF0oZykmJihmW2ddPWRbZ10pfXJldHVybiB3KHRoaXMsZiksdGhpc30say50b0Zyb250PWZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzOyJhIj09dGhpcy5ub2RlLnBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpP3RoaXMubm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlLnBhcmVudE5vZGUpOnRoaXMubm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMubm9kZSk7dmFyIHQ9dGhpcy5wYXBlcjtyZXR1cm4gdC50b3AhPXRoaXMmJnIuX3RvZnJvbnQodGhpcyx0KSx0aGlzfSxrLnRvQmFjaz1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpczt2YXIgdD10aGlzLm5vZGUucGFyZW50Tm9kZTsiYSI9PXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpP3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLnBhcmVudE5vZGUsdGhpcy5ub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkKTp0LmZpcnN0Q2hpbGQhPXRoaXMubm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpLHIuX3RvYmFjayh0aGlzLHRoaXMucGFwZXIpO3RoaXMucGFwZXI7cmV0dXJuIHRoaXN9LGsuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO3ZhciBlPXQubm9kZXx8dFt0Lmxlbmd0aC0xXS5ub2RlO3JldHVybiBlLm5leHRTaWJsaW5nP2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGUubmV4dFNpYmxpbmcpOmUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLHIuX2luc2VydGFmdGVyKHRoaXMsdCx0aGlzLnBhcGVyKSx0aGlzfSxrLmluc2VydEJlZm9yZT1mdW5jdGlvbih0KXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7dmFyIGU9dC5ub2RlfHx0WzBdLm5vZGU7cmV0dXJuIGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGUpLHIuX2luc2VydGJlZm9yZSh0aGlzLHQsdGhpcy5wYXBlciksdGhpc30say5ibHVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoMCE9K3Qpe3ZhciBuPXgoImZpbHRlciIpLGk9eCgiZmVHYXVzc2lhbkJsdXIiKTtlLmF0dHJzLmJsdXI9dCxuLmlkPXIuY3JlYXRlVVVJRCgpLHgoaSx7c3RkRGV2aWF0aW9uOit0fHwxLjV9KSxuLmFwcGVuZENoaWxkKGkpLGUucGFwZXIuZGVmcy5hcHBlbmRDaGlsZChuKSxlLl9ibHVyPW4seChlLm5vZGUse2ZpbHRlcjoidXJsKCMiK24uaWQrIikifSl9ZWxzZSBlLl9ibHVyJiYoZS5fYmx1ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuX2JsdXIpLGRlbGV0ZSBlLl9ibHVyLGRlbGV0ZSBlLmF0dHJzLmJsdXIpLGUubm9kZS5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO3JldHVybiBlfSxyLl9lbmdpbmUuY2lyY2xlPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXgoImNpcmNsZSIpO3QuY2FudmFzJiZ0LmNhbnZhcy5hcHBlbmRDaGlsZChpKTt2YXIgYT1uZXcgQyhpLHQpO3JldHVybiBhLmF0dHJzPXtjeDplLGN5OnIscjpuLGZpbGw6Im5vbmUiLHN0cm9rZToiIzAwMCJ9LGEudHlwZT0iY2lyY2xlIix4KGksYS5hdHRycyksYX0sci5fZW5naW5lLnJlY3Q9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3ZhciBzPXgoInJlY3QiKTt0LmNhbnZhcyYmdC5jYW52YXMuYXBwZW5kQ2hpbGQocyk7dmFyIG89bmV3IEMocyx0KTtyZXR1cm4gby5hdHRycz17eDplLHk6cix3aWR0aDpuLGhlaWdodDppLHI6YXx8MCxyeDphfHwwLHJ5OmF8fDAsZmlsbDoibm9uZSIsc3Ryb2tlOiIjMDAwIn0sby50eXBlPSJyZWN0Iix4KHMsby5hdHRycyksb30sci5fZW5naW5lLmVsbGlwc2U9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT14KCJlbGxpcHNlIik7dC5jYW52YXMmJnQuY2FudmFzLmFwcGVuZENoaWxkKGEpO3ZhciBzPW5ldyBDKGEsdCk7cmV0dXJuIHMuYXR0cnM9e2N4OmUsY3k6cixyeDpuLHJ5OmksZmlsbDoibm9uZSIsc3Ryb2tlOiIjMDAwIn0scy50eXBlPSJlbGxpcHNlIix4KGEscy5hdHRycyksc30sci5fZW5naW5lLmltYWdlPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt2YXIgcz14KCJpbWFnZSIpO3gocyx7eDpyLHk6bix3aWR0aDppLGhlaWdodDphLHByZXNlcnZlQXNwZWN0UmF0aW86Im5vbmUifSkscy5zZXRBdHRyaWJ1dGVOUyhwLCJocmVmIixlKSx0LmNhbnZhcyYmdC5jYW52YXMuYXBwZW5kQ2hpbGQocyk7dmFyIG89bmV3IEMocyx0KTtyZXR1cm4gby5hdHRycz17eDpyLHk6bix3aWR0aDppLGhlaWdodDphLHNyYzplfSxvLnR5cGU9ImltYWdlIixvfSxyLl9lbmdpbmUudGV4dD1mdW5jdGlvbih0LGUsbixpKXt2YXIgYT14KCJ0ZXh0Iik7dC5jYW52YXMmJnQuY2FudmFzLmFwcGVuZENoaWxkKGEpO3ZhciBzPW5ldyBDKGEsdCk7cmV0dXJuIHMuYXR0cnM9e3g6ZSx5Om4sInRleHQtYW5jaG9yIjoibWlkZGxlIix0ZXh0OmksZm9udDpyLl9hdmFpbGFibGVBdHRycy5mb250LHN0cm9rZToibm9uZSIsZmlsbDoiIzAwMCJ9LHMudHlwZT0idGV4dCIsdyhzLHMuYXR0cnMpLHN9LHIuX2VuZ2luZS5zZXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMud2lkdGg9dHx8dGhpcy53aWR0aCx0aGlzLmhlaWdodD1lfHx0aGlzLmhlaWdodCx0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLndpZHRoKSx0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdGhpcy5oZWlnaHQpLHRoaXMuX3ZpZXdCb3gmJnRoaXMuc2V0Vmlld0JveC5hcHBseSh0aGlzLHRoaXMuX3ZpZXdCb3gpLHRoaXN9LHIuX2VuZ2luZS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1yLl9nZXRDb250YWluZXIuYXBwbHkoMCxhcmd1bWVudHMpLGU9dCYmdC5jb250YWluZXIsbj10LngsaT10LnksYT10LndpZHRoLHM9dC5oZWlnaHQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJTVkcgY29udGFpbmVyIG5vdCBmb3VuZC4iKTt2YXIgbyxjPXgoInN2ZyIpLGg9Im92ZXJmbG93OmhpZGRlbjsiO3JldHVybiBuPW58fDAsaT1pfHwwLGE9YXx8NTEyLHM9c3x8MzQyLHgoYyx7aGVpZ2h0OnMsdmVyc2lvbjoxLjEsd2lkdGg6YSx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifSksMT09ZT8oYy5zdHlsZS5jc3NUZXh0PWgrInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6IituKyJweDt0b3A6IitpKyJweCIsci5fZy5kb2MuYm9keS5hcHBlbmRDaGlsZChjKSxvPTEpOihjLnN0eWxlLmNzc1RleHQ9aCsicG9zaXRpb246cmVsYXRpdmUiLGUuZmlyc3RDaGlsZD9lLmluc2VydEJlZm9yZShjLGUuZmlyc3RDaGlsZCk6ZS5hcHBlbmRDaGlsZChjKSksZT1uZXcgci5fUGFwZXIsZS53aWR0aD1hLGUuaGVpZ2h0PXMsZS5jYW52YXM9YyxlLmNsZWFyKCksZS5fbGVmdD1lLl90b3A9MCxvJiYoZS5yZW5kZXJmaXg9ZnVuY3Rpb24oKXt9KSxlLnJlbmRlcmZpeCgpLGV9LHIuX2VuZ2luZS5zZXRWaWV3Qm94PWZ1bmN0aW9uKHQsZSxyLG4saSl7dSgicmFwaGFlbC5zZXRWaWV3Qm94Iix0aGlzLHRoaXMuX3ZpZXdCb3gsW3QsZSxyLG4saV0pO3ZhciBhLG8sYz1zKHIvdGhpcy53aWR0aCxuL3RoaXMuaGVpZ2h0KSxoPXRoaXMudG9wLGw9aT8ieE1pZFlNaWQgbWVldCI6InhNaW5ZTWluIjtmb3IobnVsbD09dD8odGhpcy5fdmJTaXplJiYoYz0xKSxkZWxldGUgdGhpcy5fdmJTaXplLGE9IjAgMCAiK3RoaXMud2lkdGgrZit0aGlzLmhlaWdodCk6KHRoaXMuX3ZiU2l6ZT1jLGE9dCtmK2UrZityK2YrbikseCh0aGlzLmNhbnZhcyx7dmlld0JveDphLHByZXNlcnZlQXNwZWN0UmF0aW86bH0pO2MmJmg7KW89InN0cm9rZS13aWR0aCJpbiBoLmF0dHJzP2guYXR0cnNbInN0cm9rZS13aWR0aCJdOjEsaC5hdHRyKHsic3Ryb2tlLXdpZHRoIjpvfSksaC5fLmRpcnR5PTEsaC5fLmRpcnR5VD0xLGg9aC5wcmV2O3JldHVybiB0aGlzLl92aWV3Qm94PVt0LGUscixuLCEhaV0sdGhpc30sci5wcm90b3R5cGUucmVuZGVyZml4PWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmNhbnZhcyxyPWUuc3R5bGU7dHJ5e3Q9ZS5nZXRTY3JlZW5DVE0oKXx8ZS5jcmVhdGVTVkdNYXRyaXgoKX1jYXRjaChyKXt0PWUuY3JlYXRlU1ZHTWF0cml4KCl9dmFyIG49LXQuZSUxLGk9LXQuZiUxOyhufHxpKSYmKG4mJih0aGlzLl9sZWZ0PSh0aGlzLl9sZWZ0K24pJTEsci5sZWZ0PXRoaXMuX2xlZnQrInB4IiksaSYmKHRoaXMuX3RvcD0odGhpcy5fdG9wK2kpJTEsci50b3A9dGhpcy5fdG9wKyJweCIpKX0sci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyLmV2ZSgicmFwaGFlbC5jbGVhciIsdGhpcyk7Zm9yKHZhciB0PXRoaXMuY2FudmFzO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3RoaXMuYm90dG9tPXRoaXMudG9wPW51bGwsKHRoaXMuZGVzYz14KCJkZXNjIikpLmFwcGVuZENoaWxkKHIuX2cuZG9jLmNyZWF0ZVRleHROb2RlKCJDcmVhdGVkIHdpdGggUmFwaGHDq2wgIityLnZlcnNpb24pKSx0LmFwcGVuZENoaWxkKHRoaXMuZGVzYyksdC5hcHBlbmRDaGlsZCh0aGlzLmRlZnM9eCgiZGVmcyIpKX0sci5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dSgicmFwaGFlbC5yZW1vdmUiLHRoaXMpLHRoaXMuY2FudmFzLnBhcmVudE5vZGUmJnRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO2Zvcih2YXIgdCBpbiB0aGlzKXRoaXNbdF09ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXNbdF0/ci5fcmVtb3ZlZEZhY3RvcnkodCk6bnVsbH07dmFyIFM9ci5zdDtmb3IodmFyIEEgaW4gaylrW3RdKEEpJiYhU1t0XShBKSYmKFNbQV09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24ocil7clt0XS5hcHBseShyLGUpfSl9fShBKSl9fSgpLGZ1bmN0aW9uKCl7aWYoci52bWwpe3ZhciB0PSJoYXNPd25Qcm9wZXJ0eSIsZT1TdHJpbmcsbj1wYXJzZUZsb2F0LGk9TWF0aCxhPWkucm91bmQscz1pLm1heCxvPWkubWluLGM9aS5hYnMsaD0vWywgXSsvLHU9ci5ldmUsbD0iICIsZj0iIixwPXtNOiJtIixMOiJsIixDOiJjIixaOiJ4IixtOiJ0IixsOiJyIixjOiJ2Iix6OiJ4In0sZD0vKFtjbG16XSksPyhbXmNsbXpdKikvZ2ksZz0vIHByb2dpZDpcUytCbHVyXChbXlwpXStcKS9nLHg9Ly0/W14sXHMtXSsvZyx2PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7d2lkdGg6MXB4O2hlaWdodDoxcHgiLHk9MjE2MDAsbT17cGF0aDoxLHJlY3Q6MSxpbWFnZToxfSxiPXtjaXJjbGU6MSxlbGxpcHNlOjF9LF89ZnVuY3Rpb24odCl7dmFyIG49L1thaHFzdHZdL2dpLGk9ci5fcGF0aFRvQWJzb2x1dGU7aWYoZSh0KS5tYXRjaChuKSYmKGk9ci5fcGF0aDJjdXJ2ZSksbj0vW2NsbXpdL2csaT09ci5fcGF0aFRvQWJzb2x1dGUmJiFlKHQpLm1hdGNoKG4pKXt2YXIgcz1lKHQpLnJlcGxhY2UoZCxmdW5jdGlvbih0LGUscil7dmFyIG49W10saT0ibSI9PWUudG9Mb3dlckNhc2UoKSxzPXBbZV07cmV0dXJuIHIucmVwbGFjZSh4LGZ1bmN0aW9uKHQpe2kmJjI9PW4ubGVuZ3RoJiYocys9bitwWyJtIj09ZT8ibCI6IkwiXSxuPVtdKSxuLnB1c2goYSh0KnkpKX0pLHMrbn0pO3JldHVybiBzfXZhciBvLGMsaD1pKHQpO3M9W107Zm9yKHZhciB1PTAsZz1oLmxlbmd0aDt1PGc7dSsrKXtvPWhbdV0sYz1oW3VdWzBdLnRvTG93ZXJDYXNlKCksInoiPT1jJiYoYz0ieCIpO2Zvcih2YXIgdj0xLG09by5sZW5ndGg7djxtO3YrKyljKz1hKG9bdl0qeSkrKHYhPW0tMT8iLCI6Zik7cy5wdXNoKGMpfXJldHVybiBzLmpvaW4obCl9LHc9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXIubWF0cml4KCk7cmV0dXJuIGkucm90YXRlKC10LC41LC41KSx7ZHg6aS54KGUsbiksZHk6aS55KGUsbil9fSxFPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt2YXIgcz10Ll8sbz10Lm1hdHJpeCxoPXMuZmlsbHBvcyx1PXQubm9kZSxmPXUuc3R5bGUscD0xLGQ9IiIsZz15L2UseD15L3I7aWYoZi52aXNpYmlsaXR5PSJoaWRkZW4iLGUmJnIpe2lmKHUuY29vcmRzaXplPWMoZykrbCtjKHgpLGYucm90YXRpb249YSooZSpyPDA/LTE6MSksYSl7dmFyIHY9dyhhLG4saSk7bj12LmR4LGk9di5keX1pZihlPDAmJihkKz0ieCIpLHI8MCYmKGQrPSIgeSIpJiYocD0tMSksZi5mbGlwPWQsdS5jb29yZG9yaWdpbj1uKi1nK2wraSoteCxofHxzLmZpbGxzaXplKXt2YXIgbT11LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmaWxsIik7bT1tJiZtWzBdLHUucmVtb3ZlQ2hpbGQobSksaCYmKHY9dyhhLG8ueChoWzBdLGhbMV0pLG8ueShoWzBdLGhbMV0pKSxtLnBvc2l0aW9uPXYuZHgqcCtsK3YuZHkqcCkscy5maWxsc2l6ZSYmKG0uc2l6ZT1zLmZpbGxzaXplWzBdKmMoZSkrbCtzLmZpbGxzaXplWzFdKmMocikpLHUuYXBwZW5kQ2hpbGQobSl9Zi52aXNpYmlsaXR5PSJ2aXNpYmxlIn19O3IudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iWW91ciBicm93c2VyIGRvZXNu4oCZdCBzdXBwb3J0IFNWRy4gRmFsbGluZyBkb3duIHRvIFZNTC5cbllvdSBhcmUgcnVubmluZyBSYXBoYcOrbCAiK3RoaXMudmVyc2lvbn07dmFyIEM9ZnVuY3Rpb24odCxyLG4pe2Zvcih2YXIgaT1lKHIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoIi0iKSxhPW4/ImVuZCI6InN0YXJ0IixzPWkubGVuZ3RoLG89ImNsYXNzaWMiLGM9Im1lZGl1bSIsaD0ibWVkaXVtIjtzLS07KXN3aXRjaChpW3NdKXtjYXNlImJsb2NrIjpjYXNlImNsYXNzaWMiOmNhc2Uib3ZhbCI6Y2FzZSJkaWFtb25kIjpjYXNlIm9wZW4iOmNhc2Uibm9uZSI6bz1pW3NdO2JyZWFrO2Nhc2Uid2lkZSI6Y2FzZSJuYXJyb3ciOmg9aVtzXTticmVhaztjYXNlImxvbmciOmNhc2Uic2hvcnQiOmM9aVtzXX12YXIgdT10Lm5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0cm9rZSIpWzBdO3VbYSsiYXJyb3ciXT1vLHVbYSsiYXJyb3dsZW5ndGgiXT1jLHVbYSsiYXJyb3d3aWR0aCJdPWh9LGs9ZnVuY3Rpb24oaSxjKXtpLmF0dHJzPWkuYXR0cnN8fHt9O3ZhciB1PWkubm9kZSxwPWkuYXR0cnMsZD11LnN0eWxlLGc9bVtpLnR5cGVdJiYoYy54IT1wLnh8fGMueSE9cC55fHxjLndpZHRoIT1wLndpZHRofHxjLmhlaWdodCE9cC5oZWlnaHR8fGMuY3ghPXAuY3h8fGMuY3khPXAuY3l8fGMucnghPXAucnh8fGMucnkhPXAucnl8fGMuciE9cC5yKSx4PWJbaS50eXBlXSYmKHAuY3ghPWMuY3h8fHAuY3khPWMuY3l8fHAuciE9Yy5yfHxwLnJ4IT1jLnJ4fHxwLnJ5IT1jLnJ5KSx2PWk7Zm9yKHZhciB3IGluIGMpY1t0XSh3KSYmKHBbd109Y1t3XSk7aWYoZyYmKHAucGF0aD1yLl9nZXRQYXRoW2kudHlwZV0oaSksaS5fLmRpcnR5PTEpLGMuaHJlZiYmKHUuaHJlZj1jLmhyZWYpLGMudGl0bGUmJih1LnRpdGxlPWMudGl0bGUpLGMudGFyZ2V0JiYodS50YXJnZXQ9Yy50YXJnZXQpLGMuY3Vyc29yJiYoZC5jdXJzb3I9Yy5jdXJzb3IpLCJibHVyImluIGMmJmkuYmx1cihjLmJsdXIpLChjLnBhdGgmJiJwYXRoIj09aS50eXBlfHxnKSYmKHUucGF0aD1fKH5lKHAucGF0aCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJyIik/ci5fcGF0aFRvQWJzb2x1dGUocC5wYXRoKTpwLnBhdGgpLCJpbWFnZSI9PWkudHlwZSYmKGkuXy5maWxscG9zPVtwLngscC55XSxpLl8uZmlsbHNpemU9W3Aud2lkdGgscC5oZWlnaHRdLEUoaSwxLDEsMCwwLDApKSksInRyYW5zZm9ybSJpbiBjJiZpLnRyYW5zZm9ybShjLnRyYW5zZm9ybSkseCl7dmFyIGs9K3AuY3gsQT0rcC5jeSxCPStwLnJ4fHwrcC5yfHwwLE89K3Aucnl8fCtwLnJ8fDA7dS5wYXRoPXIuZm9ybWF0KCJhcnswfSx7MX0sezJ9LHszfSx7NH0sezF9LHs0fSx7MX14IixhKChrLUIpKnkpLGEoKEEtTykqeSksYSgoaytCKSp5KSxhKChBK08pKnkpLGEoayp5KSksaS5fLmRpcnR5PTF9aWYoImNsaXAtcmVjdCJpbiBjKXt2YXIgVD1lKGNbImNsaXAtcmVjdCJdKS5zcGxpdChoKTtpZig0PT1ULmxlbmd0aCl7VFsyXT0rVFsyXSsgK1RbMF0sVFszXT0rVFszXSsgK1RbMV07dmFyIFI9dS5jbGlwUmVjdHx8ci5fZy5kb2MuY3JlYXRlRWxlbWVudCgiZGl2IiksST1SLnN0eWxlO0kuY2xpcD1yLmZvcm1hdCgicmVjdCh7MX1weCB7Mn1weCB7M31weCB7MH1weCkiLFQpLHUuY2xpcFJlY3R8fChJLnBvc2l0aW9uPSJhYnNvbHV0ZSIsSS50b3A9MCxJLmxlZnQ9MCxJLndpZHRoPWkucGFwZXIud2lkdGgrInB4IixJLmhlaWdodD1pLnBhcGVyLmhlaWdodCsicHgiLHUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoUix1KSxSLmFwcGVuZENoaWxkKHUpLHUuY2xpcFJlY3Q9Uil9Y1siY2xpcC1yZWN0Il18fHUuY2xpcFJlY3QmJih1LmNsaXBSZWN0LnN0eWxlLmNsaXA9ImF1dG8iKX1pZihpLnRleHRwYXRoKXt2YXIgTT1pLnRleHRwYXRoLnN0eWxlO2MuZm9udCYmKE0uZm9udD1jLmZvbnQpLGNbImZvbnQtZmFtaWx5Il0mJihNLmZvbnRGYW1pbHk9JyInK2NbImZvbnQtZmFtaWx5Il0uc3BsaXQoIiwiKVswXS5yZXBsYWNlKC9eWyciXSt8WyciXSskL2csZikrJyInKSxjWyJmb250LXNpemUiXSYmKE0uZm9udFNpemU9Y1siZm9udC1zaXplIl0pLGNbImZvbnQtd2VpZ2h0Il0mJihNLmZvbnRXZWlnaHQ9Y1siZm9udC13ZWlnaHQiXSksY1siZm9udC1zdHlsZSJdJiYoTS5mb250U3R5bGU9Y1siZm9udC1zdHlsZSJdKX1pZigiYXJyb3ctc3RhcnQiaW4gYyYmQyh2LGNbImFycm93LXN0YXJ0Il0pLCJhcnJvdy1lbmQiaW4gYyYmQyh2LGNbImFycm93LWVuZCJdLDEpLG51bGwhPWMub3BhY2l0eXx8bnVsbCE9Y1sic3Ryb2tlLXdpZHRoIl18fG51bGwhPWMuZmlsbHx8bnVsbCE9Yy5zcmN8fG51bGwhPWMuc3Ryb2tlfHxudWxsIT1jWyJzdHJva2Utd2lkdGgiXXx8bnVsbCE9Y1sic3Ryb2tlLW9wYWNpdHkiXXx8bnVsbCE9Y1siZmlsbC1vcGFjaXR5Il18fG51bGwhPWNbInN0cm9rZS1kYXNoYXJyYXkiXXx8bnVsbCE9Y1sic3Ryb2tlLW1pdGVybGltaXQiXXx8bnVsbCE9Y1sic3Ryb2tlLWxpbmVqb2luIl18fG51bGwhPWNbInN0cm9rZS1saW5lY2FwIl0pe3ZhciBGPXUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZpbGwiKTtpZihGPUYmJkZbMF0sIUYmJihGPU4oImZpbGwiKSksImltYWdlIj09aS50eXBlJiZjLnNyYyYmKEYuc3JjPWMuc3JjKSxjLmZpbGwmJihGLm9uPSEwKSxudWxsIT1GLm9uJiYibm9uZSIhPWMuZmlsbCYmbnVsbCE9PWMuZmlsbHx8KEYub249ITEpLEYub24mJmMuZmlsbCl7dmFyIEQ9ZShjLmZpbGwpLm1hdGNoKHIuX0lTVVJMKTtpZihEKXtGLnBhcmVudE5vZGU9PXUmJnUucmVtb3ZlQ2hpbGQoRiksRi5yb3RhdGU9ITAsRi5zcmM9RFsxXSxGLnR5cGU9InRpbGUiO3ZhciBQPWkuZ2V0QkJveCgxKTtGLnBvc2l0aW9uPVAueCtsK1AueSxpLl8uZmlsbHBvcz1bUC54LFAueV0sci5fcHJlbG9hZChEWzFdLGZ1bmN0aW9uKCl7aS5fLmZpbGxzaXplPVt0aGlzLm9mZnNldFdpZHRoLHRoaXMub2Zmc2V0SGVpZ2h0XX0pfWVsc2UgRi5jb2xvcj1yLmdldFJHQihjLmZpbGwpLmhleCxGLnNyYz1mLEYudHlwZT0ic29saWQiLHIuZ2V0UkdCKGMuZmlsbCkuZXJyb3ImJih2LnR5cGUgaW57Y2lyY2xlOjEsZWxsaXBzZToxfXx8InIiIT1lKGMuZmlsbCkuY2hhckF0KCkpJiZTKHYsYy5maWxsLEYpJiYocC5maWxsPSJub25lIixwLmdyYWRpZW50PWMuZmlsbCxGLnJvdGF0ZT0hMSl9aWYoImZpbGwtb3BhY2l0eSJpbiBjfHwib3BhY2l0eSJpbiBjKXt2YXIgTD0oKCtwWyJmaWxsLW9wYWNpdHkiXSsxfHwyKS0xKSooKCtwLm9wYWNpdHkrMXx8MiktMSkqKCgrci5nZXRSR0IoYy5maWxsKS5vKzF8fDIpLTEpO0w9byhzKEwsMCksMSksRi5vcGFjaXR5PUwsRi5zcmMmJihGLmNvbG9yPSJub25lIil9dS5hcHBlbmRDaGlsZChGKTt2YXIgej11LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHJva2UiKSYmdS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3Ryb2tlIilbMF0saj0hMTsheiYmKGo9ej1OKCJzdHJva2UiKSksKGMuc3Ryb2tlJiYibm9uZSIhPWMuc3Ryb2tlfHxjWyJzdHJva2Utd2lkdGgiXXx8bnVsbCE9Y1sic3Ryb2tlLW9wYWNpdHkiXXx8Y1sic3Ryb2tlLWRhc2hhcnJheSJdfHxjWyJzdHJva2UtbWl0ZXJsaW1pdCJdfHxjWyJzdHJva2UtbGluZWpvaW4iXXx8Y1sic3Ryb2tlLWxpbmVjYXAiXSkmJih6Lm9uPSEwKSwoIm5vbmUiPT1jLnN0cm9rZXx8bnVsbD09PWMuc3Ryb2tlfHxudWxsPT16Lm9ufHwwPT1jLnN0cm9rZXx8MD09Y1sic3Ryb2tlLXdpZHRoIl0pJiYoei5vbj0hMSk7dmFyIFU9ci5nZXRSR0IoYy5zdHJva2UpO3oub24mJmMuc3Ryb2tlJiYoei5jb2xvcj1VLmhleCksTD0oKCtwWyJzdHJva2Utb3BhY2l0eSJdKzF8fDIpLTEpKigoK3Aub3BhY2l0eSsxfHwyKS0xKSooKCtVLm8rMXx8MiktMSk7dmFyIFg9Ljc1KihuKGNbInN0cm9rZS13aWR0aCJdKXx8MSk7aWYoTD1vKHMoTCwwKSwxKSxudWxsPT1jWyJzdHJva2Utd2lkdGgiXSYmKFg9cFsic3Ryb2tlLXdpZHRoIl0pLGNbInN0cm9rZS13aWR0aCJdJiYoei53ZWlnaHQ9WCksWCYmWDwxJiYoTCo9WCkmJih6LndlaWdodD0xKSx6Lm9wYWNpdHk9TCxjWyJzdHJva2UtbGluZWpvaW4iXSYmKHouam9pbnN0eWxlPWNbInN0cm9rZS1saW5lam9pbiJdfHwibWl0ZXIiKSx6Lm1pdGVybGltaXQ9Y1sic3Ryb2tlLW1pdGVybGltaXQiXXx8OCxjWyJzdHJva2UtbGluZWNhcCJdJiYoei5lbmRjYXA9ImJ1dHQiPT1jWyJzdHJva2UtbGluZWNhcCJdPyJmbGF0Ijoic3F1YXJlIj09Y1sic3Ryb2tlLWxpbmVjYXAiXT8ic3F1YXJlIjoicm91bmQiKSwic3Ryb2tlLWRhc2hhcnJheSJpbiBjKXt2YXIgRz17Ii0iOiJzaG9ydGRhc2giLCIuIjoic2hvcnRkb3QiLCItLiI6InNob3J0ZGFzaGRvdCIsIi0uLiI6InNob3J0ZGFzaGRvdGRvdCIsIi4gIjoiZG90IiwiLSAiOiJkYXNoIiwiLS0iOiJsb25nZGFzaCIsIi0gLiI6ImRhc2hkb3QiLCItLS4iOiJsb25nZGFzaGRvdCIsIi0tLi4iOiJsb25nZGFzaGRvdGRvdCJ9O3ouZGFzaHN0eWxlPUdbdF0oY1sic3Ryb2tlLWRhc2hhcnJheSJdKT9HW2NbInN0cm9rZS1kYXNoYXJyYXkiXV06Zn1qJiZ1LmFwcGVuZENoaWxkKHopfWlmKCJ0ZXh0Ij09di50eXBlKXt2LnBhcGVyLmNhbnZhcy5zdHlsZS5kaXNwbGF5PWY7dmFyIHE9di5wYXBlci5zcGFuLEg9cC5mb250JiZwLmZvbnQubWF0Y2goL1xkKyg/OlwuXGQqKT8oPz1weCkvKTtkPXEuc3R5bGUscC5mb250JiYoZC5mb250PXAuZm9udCkscFsiZm9udC1mYW1pbHkiXSYmKGQuZm9udEZhbWlseT1wWyJmb250LWZhbWlseSJdKSxwWyJmb250LXdlaWdodCJdJiYoZC5mb250V2VpZ2h0PXBbImZvbnQtd2VpZ2h0Il0pLHBbImZvbnQtc3R5bGUiXSYmKGQuZm9udFN0eWxlPXBbImZvbnQtc3R5bGUiXSksSD1uKHBbImZvbnQtc2l6ZSJdfHxIJiZIWzBdKXx8MTAsZC5mb250U2l6ZT0xMDAqSCsicHgiLHYudGV4dHBhdGguc3RyaW5nJiYocS5pbm5lckhUTUw9ZSh2LnRleHRwYXRoLnN0cmluZykucmVwbGFjZSgvPC9nLCImIzYwOyIpLnJlcGxhY2UoLyYvZywiJiMzODsiKS5yZXBsYWNlKC9cbi9nLCI8YnI+IikpO3ZhciBXPXEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7di5XPXAudz0oVy5yaWdodC1XLmxlZnQpLzEwMCx2Lkg9cC5oPShXLmJvdHRvbS1XLnRvcCkvMTAwLHYuWD1wLngsdi5ZPXAueSt2LkgvMiwoIngiaW4gY3x8InkiaW4gYykmJih2LnBhdGgudj1yLmZvcm1hdCgibXswfSx7MX1sezJ9LHsxfSIsYShwLngqeSksYShwLnkqeSksYShwLngqeSkrMSkpO2Zvcih2YXIgVj1bIngiLCJ5IiwidGV4dCIsImZvbnQiLCJmb250LWZhbWlseSIsImZvbnQtd2VpZ2h0IiwiZm9udC1zdHlsZSIsImZvbnQtc2l6ZSJdLFE9MCxZPVYubGVuZ3RoO1E8WTtRKyspaWYoVltRXWluIGMpe3YuXy5kaXJ0eT0xO2JyZWFrfXN3aXRjaChwWyJ0ZXh0LWFuY2hvciJdKXtjYXNlInN0YXJ0Ijp2LnRleHRwYXRoLnN0eWxlWyJ2LXRleHQtYWxpZ24iXT0ibGVmdCIsdi5iYng9di5XLzI7YnJlYWs7Y2FzZSJlbmQiOnYudGV4dHBhdGguc3R5bGVbInYtdGV4dC1hbGlnbiJdPSJyaWdodCIsdi5iYng9LXYuVy8yO2JyZWFrO2RlZmF1bHQ6di50ZXh0cGF0aC5zdHlsZVsidi10ZXh0LWFsaWduIl09ImNlbnRlciIsdi5iYng9MH12LnRleHRwYXRoLnN0eWxlWyJ2LXRleHQta2VybiJdPSEwfX0sUz1mdW5jdGlvbih0LGEscyl7dC5hdHRycz10LmF0dHJzfHx7fTt2YXIgbz0odC5hdHRycyxNYXRoLnBvdyksYz0ibGluZWFyIixoPSIuNSAuNSI7aWYodC5hdHRycy5ncmFkaWVudD1hLGE9ZShhKS5yZXBsYWNlKHIuX3JhZGlhbF9ncmFkaWVudCxmdW5jdGlvbih0LGUscil7cmV0dXJuIGM9InJhZGlhbCIsZSYmciYmKGU9bihlKSxyPW4ociksbyhlLS41LDIpK28oci0uNSwyKT4uMjUmJihyPWkuc3FydCguMjUtbyhlLS41LDIpKSooMioocj4uNSktMSkrLjUpLGg9ZStsK3IpLGZ9KSxhPWEuc3BsaXQoL1xzKlwtXHMqLyksImxpbmVhciI9PWMpe3ZhciB1PWEuc2hpZnQoKTtpZih1PS1uKHUpLGlzTmFOKHUpKXJldHVybiBudWxsfXZhciBwPXIuX3BhcnNlRG90cyhhKTtpZighcClyZXR1cm4gbnVsbDtpZih0PXQuc2hhcGV8fHQubm9kZSxwLmxlbmd0aCl7dC5yZW1vdmVDaGlsZChzKSxzLm9uPSEwLHMubWV0aG9kPSJub25lIixzLmNvbG9yPXBbMF0uY29sb3Iscy5jb2xvcjI9cFtwLmxlbmd0aC0xXS5jb2xvcjtmb3IodmFyIGQ9W10sZz0wLHg9cC5sZW5ndGg7Zzx4O2crKylwW2ddLm9mZnNldCYmZC5wdXNoKHBbZ10ub2Zmc2V0K2wrcFtnXS5jb2xvcik7cy5jb2xvcnM9ZC5sZW5ndGg/ZC5qb2luKCk6IjAlICIrcy5jb2xvciwicmFkaWFsIj09Yz8ocy50eXBlPSJncmFkaWVudFRpdGxlIixzLmZvY3VzPSIxMDAlIixzLmZvY3Vzc2l6ZT0iMCAwIixzLmZvY3VzcG9zaXRpb249aCxzLmFuZ2xlPTApOihzLnR5cGU9ImdyYWRpZW50IixzLmFuZ2xlPSgyNzAtdSklMzYwKSx0LmFwcGVuZENoaWxkKHMpfXJldHVybiAxfSxBPWZ1bmN0aW9uKHQsZSl7dGhpc1swXT10aGlzLm5vZGU9dCx0LnJhcGhhZWw9ITAsdGhpcy5pZD1yLl9vaWQrKyx0LnJhcGhhZWxpZD10aGlzLmlkLHRoaXMuWD0wLHRoaXMuWT0wLHRoaXMuYXR0cnM9e30sdGhpcy5wYXBlcj1lLHRoaXMubWF0cml4PXIubWF0cml4KCksdGhpcy5fPXt0cmFuc2Zvcm06W10sc3g6MSxzeToxLGR4OjAsZHk6MCxkZWc6MCxkaXJ0eToxLGRpcnR5VDoxfSwhZS5ib3R0b20mJihlLmJvdHRvbT10aGlzKSx0aGlzLnByZXY9ZS50b3AsZS50b3AmJihlLnRvcC5uZXh0PXRoaXMpLGUudG9wPXRoaXMsdGhpcy5uZXh0PW51bGx9LEI9ci5lbDtBLnByb3RvdHlwZT1CLEIuY29uc3RydWN0b3I9QSxCLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl8udHJhbnNmb3JtO3ZhciBuLGk9dGhpcy5wYXBlci5fdmlld0JveFNoaWZ0LGE9aT8icyIrW2kuc2NhbGUsaS5zY2FsZV0rIi0xLTF0IitbaS5keCxpLmR5XTpmO2kmJihuPXQ9ZSh0KS5yZXBsYWNlKC9cLnszfXxcdTIwMjYvZyx0aGlzLl8udHJhbnNmb3JtfHxmKSksci5fZXh0cmFjdFRyYW5zZm9ybSh0aGlzLGErdCk7dmFyIHMsbz10aGlzLm1hdHJpeC5jbG9uZSgpLGM9dGhpcy5za2V3LGg9dGhpcy5ub2RlLHU9fmUodGhpcy5hdHRycy5maWxsKS5pbmRleE9mKCItIikscD0hZSh0aGlzLmF0dHJzLmZpbGwpLmluZGV4T2YoInVybCgiKTtpZihvLnRyYW5zbGF0ZSgxLDEpLHB8fHV8fCJpbWFnZSI9PXRoaXMudHlwZSlpZihjLm1hdHJpeD0iMSAwIDAgMSIsYy5vZmZzZXQ9IjAgMCIscz1vLnNwbGl0KCksdSYmcy5ub1JvdGF0aW9ufHwhcy5pc1NpbXBsZSl7aC5zdHlsZS5maWx0ZXI9by50b0ZpbHRlcigpO3ZhciBkPXRoaXMuZ2V0QkJveCgpLGc9dGhpcy5nZXRCQm94KDEpLHg9ZC54LWcueCx2PWQueS1nLnk7aC5jb29yZG9yaWdpbj14Ki15K2wrdioteSxFKHRoaXMsMSwxLHgsdiwwKX1lbHNlIGguc3R5bGUuZmlsdGVyPWYsRSh0aGlzLHMuc2NhbGV4LHMuc2NhbGV5LHMuZHgscy5keSxzLnJvdGF0ZSk7ZWxzZSBoLnN0eWxlLmZpbHRlcj1mLGMubWF0cml4PWUobyksYy5vZmZzZXQ9by5vZmZzZXQoKTtyZXR1cm4gbiYmKHRoaXMuXy50cmFuc2Zvcm09biksdGhpc30sQi5yb3RhdGU9ZnVuY3Rpb24odCxyLGkpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZihudWxsIT10KXtpZih0PWUodCkuc3BsaXQoaCksdC5sZW5ndGgtMSYmKHI9bih0WzFdKSxpPW4odFsyXSkpLHQ9bih0WzBdKSxudWxsPT1pJiYocj1pKSxudWxsPT1yfHxudWxsPT1pKXt2YXIgYT10aGlzLmdldEJCb3goMSk7cj1hLngrYS53aWR0aC8yLGk9YS55K2EuaGVpZ2h0LzJ9cmV0dXJuIHRoaXMuXy5kaXJ0eVQ9MSx0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbWyJyIix0LHIsaV1dKSksdGhpc319LEIudHJhbnNsYXRlPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0PWUodCkuc3BsaXQoaCksdC5sZW5ndGgtMSYmKHI9bih0WzFdKSksdD1uKHRbMF0pfHwwLHI9K3J8fDAsdGhpcy5fLmJib3gmJih0aGlzLl8uYmJveC54Kz10LHRoaXMuXy5iYm94LnkrPXIpLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInQiLHQscl1dKSksdGhpcyl9LEIuc2NhbGU9ZnVuY3Rpb24odCxyLGksYSl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKHQ9ZSh0KS5zcGxpdChoKSx0Lmxlbmd0aC0xJiYocj1uKHRbMV0pLGk9bih0WzJdKSxhPW4odFszXSksaXNOYU4oaSkmJihpPW51bGwpLGlzTmFOKGEpJiYoYT1udWxsKSksdD1uKHRbMF0pLG51bGw9PXImJihyPXQpLG51bGw9PWEmJihpPWEpLG51bGw9PWl8fG51bGw9PWEpdmFyIHM9dGhpcy5nZXRCQm94KDEpO3JldHVybiBpPW51bGw9PWk/cy54K3Mud2lkdGgvMjppLGE9bnVsbD09YT9zLnkrcy5oZWlnaHQvMjphLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInMiLHQscixpLGFdXSkpLHRoaXMuXy5kaXJ0eVQ9MSx0aGlzfSxCLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiYodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzfSxCLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiYodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9ZiksdGhpc30sQi5fZ2V0QkJveD1mdW5jdGlvbigpew0KcmV0dXJuIHRoaXMucmVtb3ZlZD97fTp7eDp0aGlzLlgrKHRoaXMuYmJ4fHwwKS10aGlzLlcvMix5OnRoaXMuWS10aGlzLkgsd2lkdGg6dGhpcy5XLGhlaWdodDp0aGlzLkh9fSxCLnJlbW92ZT1mdW5jdGlvbigpe2lmKCF0aGlzLnJlbW92ZWQmJnRoaXMubm9kZS5wYXJlbnROb2RlKXt0aGlzLnBhcGVyLl9fc2V0X18mJnRoaXMucGFwZXIuX19zZXRfXy5leGNsdWRlKHRoaXMpLHIuZXZlLnVuYmluZCgicmFwaGFlbC4qLiouIit0aGlzLmlkKSxyLl90ZWFyKHRoaXMsdGhpcy5wYXBlciksdGhpcy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKSx0aGlzLnNoYXBlJiZ0aGlzLnNoYXBlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zaGFwZSk7Zm9yKHZhciB0IGluIHRoaXMpdGhpc1t0XT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpc1t0XT9yLl9yZW1vdmVkRmFjdG9yeSh0KTpudWxsO3RoaXMucmVtb3ZlZD0hMH19LEIuYXR0cj1mdW5jdGlvbihlLG4pe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZihudWxsPT1lKXt2YXIgaT17fTtmb3IodmFyIGEgaW4gdGhpcy5hdHRycyl0aGlzLmF0dHJzW3RdKGEpJiYoaVthXT10aGlzLmF0dHJzW2FdKTtyZXR1cm4gaS5ncmFkaWVudCYmIm5vbmUiPT1pLmZpbGwmJihpLmZpbGw9aS5ncmFkaWVudCkmJmRlbGV0ZSBpLmdyYWRpZW50LGkudHJhbnNmb3JtPXRoaXMuXy50cmFuc2Zvcm0saX1pZihudWxsPT1uJiZyLmlzKGUsInN0cmluZyIpKXtpZigiZmlsbCI9PWUmJiJub25lIj09dGhpcy5hdHRycy5maWxsJiZ0aGlzLmF0dHJzLmdyYWRpZW50KXJldHVybiB0aGlzLmF0dHJzLmdyYWRpZW50O2Zvcih2YXIgcz1lLnNwbGl0KGgpLG89e30sYz0wLGw9cy5sZW5ndGg7YzxsO2MrKyllPXNbY10sZSBpbiB0aGlzLmF0dHJzP29bZV09dGhpcy5hdHRyc1tlXTpyLmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tlXSwiZnVuY3Rpb24iKT9vW2VdPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tlXS5kZWY6b1tlXT1yLl9hdmFpbGFibGVBdHRyc1tlXTtyZXR1cm4gbC0xP286b1tzWzBdXX1pZih0aGlzLmF0dHJzJiZudWxsPT1uJiZyLmlzKGUsImFycmF5Iikpe2ZvcihvPXt9LGM9MCxsPWUubGVuZ3RoO2M8bDtjKyspb1tlW2NdXT10aGlzLmF0dHIoZVtjXSk7cmV0dXJuIG99dmFyIGY7bnVsbCE9biYmKGY9e30sZltlXT1uKSxudWxsPT1uJiZyLmlzKGUsIm9iamVjdCIpJiYoZj1lKTtmb3IodmFyIHAgaW4gZil1KCJyYXBoYWVsLmF0dHIuIitwKyIuIit0aGlzLmlkLHRoaXMsZltwXSk7aWYoZil7Zm9yKHAgaW4gdGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzKWlmKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1t0XShwKSYmZlt0XShwKSYmci5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcF0sImZ1bmN0aW9uIikpe3ZhciBkPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1twXS5hcHBseSh0aGlzLFtdLmNvbmNhdChmW3BdKSk7dGhpcy5hdHRyc1twXT1mW3BdO2Zvcih2YXIgZyBpbiBkKWRbdF0oZykmJihmW2ddPWRbZ10pfWYudGV4dCYmInRleHQiPT10aGlzLnR5cGUmJih0aGlzLnRleHRwYXRoLnN0cmluZz1mLnRleHQpLGsodGhpcyxmKX1yZXR1cm4gdGhpc30sQi50b0Zyb250PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucmVtb3ZlZCYmdGhpcy5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSx0aGlzLnBhcGVyJiZ0aGlzLnBhcGVyLnRvcCE9dGhpcyYmci5fdG9mcm9udCh0aGlzLHRoaXMucGFwZXIpLHRoaXN9LEIudG9CYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0aGlzLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkIT10aGlzLm5vZGUmJih0aGlzLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpLHIuX3RvYmFjayh0aGlzLHRoaXMucGFwZXIpKSx0aGlzKX0sQi5pbnNlcnRBZnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZW1vdmVkP3RoaXM6KHQuY29uc3RydWN0b3I9PXIuc3QuY29uc3RydWN0b3ImJih0PXRbdC5sZW5ndGgtMV0pLHQubm9kZS5uZXh0U2libGluZz90Lm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHQubm9kZS5uZXh0U2libGluZyk6dC5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSxyLl9pbnNlcnRhZnRlcih0aGlzLHQsdGhpcy5wYXBlciksdGhpcyl9LEIuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlbW92ZWQ/dGhpczoodC5jb25zdHJ1Y3Rvcj09ci5zdC5jb25zdHJ1Y3RvciYmKHQ9dFswXSksdC5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZSx0Lm5vZGUpLHIuX2luc2VydGJlZm9yZSh0aGlzLHQsdGhpcy5wYXBlciksdGhpcyl9LEIuYmx1cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm5vZGUucnVudGltZVN0eWxlLG49ZS5maWx0ZXI7cmV0dXJuIG49bi5yZXBsYWNlKGcsZiksMCE9K3Q/KHRoaXMuYXR0cnMuYmx1cj10LGUuZmlsdGVyPW4rbCsiIHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CbHVyKHBpeGVscmFkaXVzPSIrKCt0fHwxLjUpKyIpIixlLm1hcmdpbj1yLmZvcm1hdCgiLXswfXB4IDAgMCAtezB9cHgiLGEoK3R8fDEuNSkpKTooZS5maWx0ZXI9bixlLm1hcmdpbj0wLGRlbGV0ZSB0aGlzLmF0dHJzLmJsdXIpLHRoaXN9LHIuX2VuZ2luZS5wYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9Tigic2hhcGUiKTtyLnN0eWxlLmNzc1RleHQ9dixyLmNvb3Jkc2l6ZT15K2wreSxyLmNvb3Jkb3JpZ2luPWUuY29vcmRvcmlnaW47dmFyIG49bmV3IEEocixlKSxpPXtmaWxsOiJub25lIixzdHJva2U6IiMwMDAifTt0JiYoaS5wYXRoPXQpLG4udHlwZT0icGF0aCIsbi5wYXRoPVtdLG4uUGF0aD1mLGsobixpKSxlLmNhbnZhcy5hcHBlbmRDaGlsZChyKTt2YXIgYT1OKCJza2V3Iik7cmV0dXJuIGEub249ITAsci5hcHBlbmRDaGlsZChhKSxuLnNrZXc9YSxuLnRyYW5zZm9ybShmKSxufSxyLl9lbmdpbmUucmVjdD1mdW5jdGlvbih0LGUsbixpLGEscyl7dmFyIG89ci5fcmVjdFBhdGgoZSxuLGksYSxzKSxjPXQucGF0aChvKSxoPWMuYXR0cnM7cmV0dXJuIGMuWD1oLng9ZSxjLlk9aC55PW4sYy5XPWgud2lkdGg9aSxjLkg9aC5oZWlnaHQ9YSxoLnI9cyxoLnBhdGg9byxjLnR5cGU9InJlY3QiLGN9LHIuX2VuZ2luZS5lbGxpcHNlPWZ1bmN0aW9uKHQsZSxyLG4saSl7dmFyIGE9dC5wYXRoKCk7YS5hdHRycztyZXR1cm4gYS5YPWUtbixhLlk9ci1pLGEuVz0yKm4sYS5IPTIqaSxhLnR5cGU9ImVsbGlwc2UiLGsoYSx7Y3g6ZSxjeTpyLHJ4Om4scnk6aX0pLGF9LHIuX2VuZ2luZS5jaXJjbGU9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9dC5wYXRoKCk7aS5hdHRycztyZXR1cm4gaS5YPWUtbixpLlk9ci1uLGkuVz1pLkg9MipuLGkudHlwZT0iY2lyY2xlIixrKGkse2N4OmUsY3k6cixyOm59KSxpfSxyLl9lbmdpbmUuaW1hZ2U9ZnVuY3Rpb24odCxlLG4saSxhLHMpe3ZhciBvPXIuX3JlY3RQYXRoKG4saSxhLHMpLGM9dC5wYXRoKG8pLmF0dHIoe3N0cm9rZToibm9uZSJ9KSxoPWMuYXR0cnMsdT1jLm5vZGUsbD11LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmaWxsIilbMF07cmV0dXJuIGguc3JjPWUsYy5YPWgueD1uLGMuWT1oLnk9aSxjLlc9aC53aWR0aD1hLGMuSD1oLmhlaWdodD1zLGgucGF0aD1vLGMudHlwZT0iaW1hZ2UiLGwucGFyZW50Tm9kZT09dSYmdS5yZW1vdmVDaGlsZChsKSxsLnJvdGF0ZT0hMCxsLnNyYz1lLGwudHlwZT0idGlsZSIsYy5fLmZpbGxwb3M9W24saV0sYy5fLmZpbGxzaXplPVthLHNdLHUuYXBwZW5kQ2hpbGQobCksRShjLDEsMSwwLDAsMCksY30sci5fZW5naW5lLnRleHQ9ZnVuY3Rpb24odCxuLGkscyl7dmFyIG89Tigic2hhcGUiKSxjPU4oInBhdGgiKSxoPU4oInRleHRwYXRoIik7bj1ufHwwLGk9aXx8MCxzPXN8fCIiLGMudj1yLmZvcm1hdCgibXswfSx7MX1sezJ9LHsxfSIsYShuKnkpLGEoaSp5KSxhKG4qeSkrMSksYy50ZXh0cGF0aG9rPSEwLGguc3RyaW5nPWUocyksaC5vbj0hMCxvLnN0eWxlLmNzc1RleHQ9dixvLmNvb3Jkc2l6ZT15K2wreSxvLmNvb3Jkb3JpZ2luPSIwIDAiO3ZhciB1PW5ldyBBKG8sdCkscD17ZmlsbDoiIzAwMCIsc3Ryb2tlOiJub25lIixmb250OnIuX2F2YWlsYWJsZUF0dHJzLmZvbnQsdGV4dDpzfTt1LnNoYXBlPW8sdS5wYXRoPWMsdS50ZXh0cGF0aD1oLHUudHlwZT0idGV4dCIsdS5hdHRycy50ZXh0PWUocyksdS5hdHRycy54PW4sdS5hdHRycy55PWksdS5hdHRycy53PTEsdS5hdHRycy5oPTEsayh1LHApLG8uYXBwZW5kQ2hpbGQoaCksby5hcHBlbmRDaGlsZChjKSx0LmNhbnZhcy5hcHBlbmRDaGlsZChvKTt2YXIgZD1OKCJza2V3Iik7cmV0dXJuIGQub249ITAsby5hcHBlbmRDaGlsZChkKSx1LnNrZXc9ZCx1LnRyYW5zZm9ybShmKSx1fSxyLl9lbmdpbmUuc2V0U2l6ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY2FudmFzLnN0eWxlO3JldHVybiB0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0PT0rdCYmKHQrPSJweCIpLGU9PStlJiYoZSs9InB4Iiksbi53aWR0aD10LG4uaGVpZ2h0PWUsbi5jbGlwPSJyZWN0KDAgIit0KyIgIitlKyIgMCkiLHRoaXMuX3ZpZXdCb3gmJnIuX2VuZ2luZS5zZXRWaWV3Qm94LmFwcGx5KHRoaXMsdGhpcy5fdmlld0JveCksdGhpc30sci5fZW5naW5lLnNldFZpZXdCb3g9ZnVuY3Rpb24odCxlLG4saSxhKXtyLmV2ZSgicmFwaGFlbC5zZXRWaWV3Qm94Iix0aGlzLHRoaXMuX3ZpZXdCb3gsW3QsZSxuLGksYV0pO3ZhciBvLGMsaD10aGlzLndpZHRoLHU9dGhpcy5oZWlnaHQsbD0xL3Mobi9oLGkvdSk7cmV0dXJuIGEmJihvPXUvaSxjPWgvbixuKm88aCYmKHQtPShoLW4qbykvMi9vKSxpKmM8dSYmKGUtPSh1LWkqYykvMi9jKSksdGhpcy5fdmlld0JveD1bdCxlLG4saSwhIWFdLHRoaXMuX3ZpZXdCb3hTaGlmdD17ZHg6LXQsZHk6LWUsc2NhbGU6bH0sdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QudHJhbnNmb3JtKCIuLi4iKX0pLHRoaXN9O3ZhciBOO3IuX2VuZ2luZS5pbml0V2luPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZG9jdW1lbnQ7ZS5jcmVhdGVTdHlsZVNoZWV0KCkuYWRkUnVsZSgiLnJ2bWwiLCJiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKSIpO3RyeXshZS5uYW1lc3BhY2VzLnJ2bWwmJmUubmFtZXNwYWNlcy5hZGQoInJ2bWwiLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpLE49ZnVuY3Rpb24odCl7cmV0dXJuIGUuY3JlYXRlRWxlbWVudCgiPHJ2bWw6Iit0KycgY2xhc3M9InJ2bWwiPicpfX1jYXRjaCh0KXtOPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNyZWF0ZUVsZW1lbnQoIjwiK3QrJyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LmNvbTp2bWwiIGNsYXNzPSJydm1sIj4nKX19fSxyLl9lbmdpbmUuaW5pdFdpbihyLl9nLndpbiksci5fZW5naW5lLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PXIuX2dldENvbnRhaW5lci5hcHBseSgwLGFyZ3VtZW50cyksZT10LmNvbnRhaW5lcixuPXQuaGVpZ2h0LGk9dC53aWR0aCxhPXQueCxzPXQueTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlZNTCBjb250YWluZXIgbm90IGZvdW5kLiIpO3ZhciBvPW5ldyByLl9QYXBlcixjPW8uY2FudmFzPXIuX2cuZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGg9Yy5zdHlsZTtyZXR1cm4gYT1hfHwwLHM9c3x8MCxpPWl8fDUxMixuPW58fDM0MixvLndpZHRoPWksby5oZWlnaHQ9bixpPT0raSYmKGkrPSJweCIpLG49PStuJiYobis9InB4Iiksby5jb29yZHNpemU9MjE2ZTUrbCsyMTZlNSxvLmNvb3Jkb3JpZ2luPSIwIDAiLG8uc3Bhbj1yLl9nLmRvYy5jcmVhdGVFbGVtZW50KCJzcGFuIiksby5zcGFuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbTtwYWRkaW5nOjA7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MTsiLGMuYXBwZW5kQ2hpbGQoby5zcGFuKSxoLmNzc1RleHQ9ci5mb3JtYXQoInRvcDowO2xlZnQ6MDt3aWR0aDp7MH07aGVpZ2h0OnsxfTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtjbGlwOnJlY3QoMCB7MH0gezF9IDApO292ZXJmbG93OmhpZGRlbiIsaSxuKSwxPT1lPyhyLl9nLmRvYy5ib2R5LmFwcGVuZENoaWxkKGMpLGgubGVmdD1hKyJweCIsaC50b3A9cysicHgiLGgucG9zaXRpb249ImFic29sdXRlIik6ZS5maXJzdENoaWxkP2UuaW5zZXJ0QmVmb3JlKGMsZS5maXJzdENoaWxkKTplLmFwcGVuZENoaWxkKGMpLG8ucmVuZGVyZml4PWZ1bmN0aW9uKCl7fSxvfSxyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3IuZXZlKCJyYXBoYWVsLmNsZWFyIix0aGlzKSx0aGlzLmNhbnZhcy5pbm5lckhUTUw9Zix0aGlzLnNwYW49ci5fZy5kb2MuY3JlYXRlRWxlbWVudCgic3BhbiIpLHRoaXMuc3Bhbi5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5ZW07dG9wOi05OTk5ZW07cGFkZGluZzowO21hcmdpbjowO2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTppbmxpbmU7Iix0aGlzLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLnNwYW4pLHRoaXMuYm90dG9tPXRoaXMudG9wPW51bGx9LHIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3IuZXZlKCJyYXBoYWVsLnJlbW92ZSIsdGhpcyksdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7Zm9yKHZhciB0IGluIHRoaXMpdGhpc1t0XT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpc1t0XT9yLl9yZW1vdmVkRmFjdG9yeSh0KTpudWxsO3JldHVybiEwfTt2YXIgTz1yLnN0O2Zvcih2YXIgVCBpbiBCKUJbdF0oVCkmJiFPW3RdKFQpJiYoT1tUXT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihyKXtyW3RdLmFwcGx5KHIsZSl9KX19KFQpKX19KCksQS53YXM/Uy53aW4uUmFwaGFlbD1yOlJhcGhhZWw9cixyfSksImZ1bmN0aW9uIiE9dHlwZW9mIGRlZmluZSl2YXIgZGVmaW5lPXJlcXVpcmUoImFtZGVmaW5lIikobW9kdWxlKTtkZWZpbmUoInJlZ3VsZXgiLFsiLi9LaXQiLCIuL05GQSIsIi4vUmVnRXhwIiwiLi9wYXJzZSIsIi4vdmlzdWFsaXplIiwiLi9saWJzL3JhcGhhZWwiXSxmdW5jdGlvbih0LGUscixuLGksYSl7cmV0dXJue0tpdDp0LE5GQTplLFJlZ0V4cDpyLHBhcnNlOm4sUmFwaGFlbDphLHZpc3VhbGl6ZTppfX0pOw==",t={class:"visualizer-container"},z={class:"visualizer-content"},k={class:"visualizer-regex-input code"},M={style:{width:"3em"}},N={class:"visualizer-flag-options"},w={class:"visualizer-flag-label"},T={class:"visualizer-flag-label"},U={class:"visualizer-flag-label"},j={key:0,class:"visualizer-error-box code"},e={__name:"RegulexVisualizer",props:{pattern:{type:String,default:""}},emits:["update:pattern"],setup(g,{emit:P}){const S=g,Q=P,X=l.ref(S.pattern||"^1[3-9]\\d{9}$"),W=l.ref(!1),y=l.ref(!1),u=l.ref(!1),s=l.ref(""),p=l.ref(null),a=l.ref(null),G=l.ref(null),c=l.ref({embed:!1,re:"",highlight:!0,flags:"",debug:!1}),x=l.computed(()=>{let d="";return W.value&&(d+="i"),y.value&&(d+="m"),u.value&&(d+="g"),d});l.watch(X,d=>{Q("update:pattern",`/${d}/${x.value}`),h()}),l.watch(()=>S.pattern,d=>{d!==X.value&&o(d)});function R(d){return d.replace(/^\s+/,"").replace(/\s+$/,"")}function o(d){const Z=d.match(/^\/(.*)\/([gimsuy]*)$/);if(Z){X.value=Z[1];const m=Z[2];W.value=m.includes("i"),y.value=m.includes("m"),u.value=m.includes("g")}else X.value=d,W.value=!1,y.value=!1,u.value=!1}function v(){const d=location.hash;if(!d||d.length<2)return{embed:!1,re:"",highlight:!0,flags:""};const m=d.slice(2).split("&").reduce((b,K)=>{const L=K.split("=");return b[L[0]]=L[1],b},{});return{embed:m.embed==="true",flags:m.flags||"",re:m.re?R(decodeURIComponent(m.re)):"",debug:m.debug==="true",cmd:m.cmd||""}}function B(){const d=R(X.value),Z=x.value;return"#!"+(c.value.debug?"debug=true&":"")+(c.value.embed?"embed=true&":"")+"flags="+Z+"&re="+encodeURIComponent(d)}function J(){location.hash=B()}function D(){s.value=""}function O(d,Z){let m=["Error:"+Z.message,""];typeof Z.lastIndex=="number"&&(m.push(d),m.push("-".repeat(Z.lastIndex)+"^")),s.value=m.join(`
2
+ `)}function H(){try{if(typeof window<"u"&&window.require)try{const d=window.require("regulex");if(d)return{parse:d.parse,visualize:d.visualize,Raphael:d.Raphael,Kit:d.Kit}}catch(d){console.error("Require method failed:",d)}return null}catch(d){return console.error("Failed to load Regulex dependencies:",d),null}}function E(){return new Promise((d,Z)=>{if(window.regulexLoaded){const b=H();b?d(b):Z(new Error("Regulex not found after previous load"));return}const m=document.createElement("script");m.type="text/javascript",m.src=C,m.onload=()=>{window.regulexLoaded=!0;const b=H();b?d(b):Z(new Error("Failed to load Regulex dependencies"))},m.onerror=()=>{Z(new Error("Failed to load Regulex script"))},document.head.appendChild(m)})}function h(d=!1){if(!G.value)return console.error("Regulex dependencies not available"),!1;if(!p.value)return console.error("Graph container not available"),!1;const Z=R(X.value);J(),D();try{a.value||(a.value=G.value.Raphael(p.value,10,10));const m=G.value.parse(Z);return G.value.visualize(m,x.value,a.value),!0}catch(m){return d||O(Z,m),!1}}function n(){h(),J()}function f(d){d.keyCode!==13&&(clearTimeout(window.onKeyupTid),window.onKeyupTid=setTimeout(()=>{h()},100))}function r(d){d.keyCode===13&&(d.preventDefault(),d.stopPropagation(),h())}function A(d){if(!d)return;d.addEventListener("mousedown",Z);function Z(m){q();let b=m.clientX,K=m.clientY;d.addEventListener("mousemove",F),document.addEventListener("mouseup",L,!0),window.addEventListener("mouseup",L,!0);function L(Y){d.removeEventListener("mousemove",F),document.removeEventListener("mouseup",L,!0),window.removeEventListener("mouseup",L,!0)}function F(Y){let I=b-Y.clientX,V=K-Y.clientY;I>0&&d.scrollWidth-d.scrollLeft-d.clientWidth<2||I<0&&d.scrollLeft<1?(document.documentElement.scrollLeft+=I,document.body.scrollLeft+=I):d.scrollLeft+=I,V>0&&d.scrollHeight-d.scrollTop-d.clientHeight<2||V<0&&d.scrollTop<1?(document.documentElement.scrollTop+=V,document.body.scrollTop+=V):d.scrollTop+=V,b=Y.clientX,K=Y.clientY}}}function q(){var d,Z;window.getSelection?window.getSelection().empty?window.getSelection().empty():(d=window.getSelection())!=null&&d.removeAllRanges&&((Z=window.getSelection())==null||Z.removeAllRanges()):document.selection&&document.selection.empty()}return l.onMounted(async()=>{try{if(G.value=H(),G.value||(G.value=await E()),!G.value){s.value="Error: Failed to load Regulex dependencies";return}const d=v();Object.assign(c.value,d),S.pattern?o(S.pattern):c.value.re&&o(c.value.re),c.value.flags&&(W.value=c.value.flags.includes("i"),y.value=c.value.flags.includes("m"),u.value=c.value.flags.includes("g")),await l.nextTick(),h(),p.value&&A(p.value)}catch(d){s.value="Error: Failed to load Regulex dependencies",console.error("Failed to initialize RegexVisualizer:",d)}}),(d,Z)=>(l.openBlock(),l.createElementBlock("div",t,[l.createElementVNode("div",z,[l.createElementVNode("div",k,[l.createElementVNode("table",null,[l.createElementVNode("tbody",null,[l.createElementVNode("tr",null,[Z[4]||(Z[4]=l.createElementVNode("td",{style:{width:"1em"}},"/",-1)),l.createElementVNode("td",null,[l.withDirectives(l.createElementVNode("input",{"onUpdate:modelValue":Z[0]||(Z[0]=m=>X.value=m),class:"input",onKeyup:f,onKeydown:r,placeholder:"输入正则表达式"},null,544),[[l.vModelText,X.value]])]),Z[5]||(Z[5]=l.createElementVNode("td",{style:{width:"1em"}},"/",-1)),l.createElementVNode("td",M,l.toDisplayString(x.value),1)])])])]),l.createElementVNode("div",N,[l.createElementVNode("label",w,[l.withDirectives(l.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":Z[1]||(Z[1]=m=>W.value=m),onChange:n},null,544),[[l.vModelCheckbox,W.value]]),Z[6]||(Z[6]=l.createTextVNode("IgnoreCase ",-1))]),l.createElementVNode("label",T,[l.withDirectives(l.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":Z[2]||(Z[2]=m=>y.value=m),onChange:n},null,544),[[l.vModelCheckbox,y.value]]),Z[7]||(Z[7]=l.createTextVNode("Multiline ",-1))]),l.createElementVNode("label",U,[l.withDirectives(l.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":Z[3]||(Z[3]=m=>u.value=m),onChange:n},null,544),[[l.vModelCheckbox,u.value]]),Z[8]||(Z[8]=l.createTextVNode("GlobalMatch ",-1))])]),s.value?(l.openBlock(),l.createElementBlock("p",j,l.toDisplayString(s.value),1)):l.createCommentVNode("",!0),l.createElementVNode("div",{ref_key:"graphContainer",ref:p,class:"visualizer-graph-container code"},null,512)])]))}};i.RegulexVisualizer=e,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));