(() => {
var clientBase64 = "KCgpPT57dmFyIHkwPU9iamVjdC5jcmVhdGU7dmFyIGJwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgdzA9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgYjA9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIHgwPU9iamVjdC5nZXRQcm90b3R5cGVPZixrMD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBTcj0oZSx0KT0+KCk9Pih0fHxlKCh0PXtleHBvcnRzOnt9fSkuZXhwb3J0cyx0KSx0LmV4cG9ydHMpO3ZhciBTMD0oZSx0LG4scik9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgbyBvZiBiMCh0KSkhazAuY2FsbChlLG8pJiZvIT09biYmYnAoZSxvLHtnZXQ6KCk9PnRbb10sZW51bWVyYWJsZTohKHI9dzAodCxvKSl8fHIuZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgeGU9KGUsdCxuKT0+KG49ZSE9bnVsbD95MCh4MChlKSk6e30sUzAodHx8IWV8fCFlLl9fZXNNb2R1bGU/YnAobiwiZGVmYXVsdCIse3ZhbHVlOmUsZW51bWVyYWJsZTohMH0pOm4sZSkpO3ZhciBScD1TcihvZT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgUW89U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLEUwPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLFQwPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksTjA9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxEMD1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLF8wPVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksQzA9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLEEwPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksTzA9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSxSMD1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksTTA9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpLHhwPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBJMChlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPXhwJiZlW3hwXXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyIEVwPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxUcD1PYmplY3QuYXNzaWduLE5wPXt9O2Z1bmN0aW9uIG9vKGUsdCxuKXt0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPU5wLHRoaXMudXBkYXRlcj1ufHxFcH1vby5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTtvby5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24iJiZlIT1udWxsKXRocm93IEVycm9yKCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4iKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsZSx0LCJzZXRTdGF0ZSIpfTtvby5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLGUsImZvcmNlVXBkYXRlIil9O2Z1bmN0aW9uIERwKCl7fURwLnByb3RvdHlwZT1vby5wcm90b3R5cGU7ZnVuY3Rpb24gRGwoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9TnAsdGhpcy51cGRhdGVyPW58fEVwfXZhciBfbD1EbC5wcm90b3R5cGU9bmV3IERwO19sLmNvbnN0cnVjdG9yPURsO1RwKF9sLG9vLnByb3RvdHlwZSk7X2wuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIGtwPUFycmF5LmlzQXJyYXksX3A9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxDbD17Y3VycmVudDpudWxsfSxDcD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIEFwKGUsdCxuKXt2YXIgcixvPXt9LGE9bnVsbCxpPW51bGw7aWYodCE9bnVsbClmb3IociBpbiB0LnJlZiE9PXZvaWQgMCYmKGk9dC5yZWYpLHQua2V5IT09dm9pZCAwJiYoYT0iIit0LmtleSksdClfcC5jYWxsKHQscikmJiFDcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG9bcl09dFtyXSk7dmFyIHM9YXJndW1lbnRzLmxlbmd0aC0yO2lmKHM9PT0xKW8uY2hpbGRyZW49bjtlbHNlIGlmKDE8cyl7Zm9yKHZhciBsPUFycmF5KHMpLHU9MDt1PHM7dSsrKWxbdV09YXJndW1lbnRzW3UrMl07by5jaGlsZHJlbj1sfWlmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihyIGluIHM9ZS5kZWZhdWx0UHJvcHMscylvW3JdPT09dm9pZCAwJiYob1tyXT1zW3JdKTtyZXR1cm57JCR0eXBlb2Y6UW8sdHlwZTplLGtleTphLHJlZjppLHByb3BzOm8sX293bmVyOkNsLmN1cnJlbnR9fWZ1bmN0aW9uIFAwKGUsdCl7cmV0dXJueyQkdHlwZW9mOlFvLHR5cGU6ZS50eXBlLGtleTp0LHJlZjplLnJlZixwcm9wczplLnByb3BzLF9vd25lcjplLl9vd25lcn19ZnVuY3Rpb24gQWwoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwmJmUuJCR0eXBlb2Y9PT1Rb31mdW5jdGlvbiBMMChlKXt2YXIgdD17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIitlLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFtuXX0pfXZhciBTcD0vXC8rL2c7ZnVuY3Rpb24gTmwoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS5rZXkhPW51bGw/TDAoIiIrZS5rZXkpOnQudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHdpKGUsdCxuLHIsbyl7dmFyIGE9dHlwZW9mIGU7KGE9PT0idW5kZWZpbmVkInx8YT09PSJib29sZWFuIikmJihlPW51bGwpO3ZhciBpPSExO2lmKGU9PT1udWxsKWk9ITA7ZWxzZSBzd2l0Y2goYSl7Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjppPSEwO2JyZWFrO2Nhc2Uib2JqZWN0Ijpzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSBRbzpjYXNlIEUwOmk9ITB9fWlmKGkpcmV0dXJuIGk9ZSxvPW8oaSksZT1yPT09IiI/Ii4iK05sKGksMCk6cixrcChvKT8obj0iIixlIT1udWxsJiYobj1lLnJlcGxhY2UoU3AsIiQmLyIpKyIvIiksd2kobyx0LG4sIiIsZnVuY3Rpb24odSl7cmV0dXJuIHV9KSk6byE9bnVsbCYmKEFsKG8pJiYobz1QMChvLG4rKCFvLmtleXx8aSYmaS5rZXk9PT1vLmtleT8iIjooIiIrby5rZXkpLnJlcGxhY2UoU3AsIiQmLyIpKyIvIikrZSkpLHQucHVzaChvKSksMTtpZihpPTAscj1yPT09IiI/Ii4iOnIrIjoiLGtwKGUpKWZvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKXthPWVbc107dmFyIGw9citObChhLHMpO2krPXdpKGEsdCxuLGwsbyl9ZWxzZSBpZihsPUkwKGUpLHR5cGVvZiBsPT0iZnVuY3Rpb24iKWZvcihlPWwuY2FsbChlKSxzPTA7IShhPWUubmV4dCgpKS5kb25lOylhPWEudmFsdWUsbD1yK05sKGEscysrKSxpKz13aShhLHQsbixsLG8pO2Vsc2UgaWYoYT09PSJvYmplY3QiKXRocm93IHQ9U3RyaW5nKGUpLEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIrKHQ9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp0KSsiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLiIpO3JldHVybiBpfWZ1bmN0aW9uIHlpKGUsdCxuKXtpZihlPT1udWxsKXJldHVybiBlO3ZhciByPVtdLG89MDtyZXR1cm4gd2koZSxyLCIiLCIiLGZ1bmN0aW9uKGEpe3JldHVybiB0LmNhbGwobixhLG8rKyl9KSxyfWZ1bmN0aW9uIHowKGUpe2lmKGUuX3N0YXR1cz09PS0xKXt2YXIgdD1lLl9yZXN1bHQ7dD10KCksdC50aGVuKGZ1bmN0aW9uKG4peyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MSxlLl9yZXN1bHQ9bil9LGZ1bmN0aW9uKG4peyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MixlLl9yZXN1bHQ9bil9KSxlLl9zdGF0dXM9PT0tMSYmKGUuX3N0YXR1cz0wLGUuX3Jlc3VsdD10KX1pZihlLl9zdGF0dXM9PT0xKXJldHVybiBlLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBlLl9yZXN1bHR9dmFyIHV0PXtjdXJyZW50Om51bGx9LGJpPXt0cmFuc2l0aW9uOm51bGx9LEYwPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOnV0LFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOmJpLFJlYWN0Q3VycmVudE93bmVyOkNsfTtmdW5jdGlvbiBPcCgpe3Rocm93IEVycm9yKCJhY3QoLi4uKSBpcyBub3Qgc3VwcG9ydGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzIG9mIFJlYWN0LiIpfW9lLkNoaWxkcmVuPXttYXA6eWksZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7eWkoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4geWkoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHlpKGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIUFsKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O29lLkNvbXBvbmVudD1vbztvZS5GcmFnbWVudD1UMDtvZS5Qcm9maWxlcj1EMDtvZS5QdXJlQ29tcG9uZW50PURsO29lLlN0cmljdE1vZGU9TjA7b2UuU3VzcGVuc2U9TzA7b2UuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9RjA7b2UuYWN0PU9wO29lLmNsb25lRWxlbWVudD1mdW5jdGlvbihlLHQsbil7aWYoZT09bnVsbCl0aHJvdyBFcnJvcigiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgIitlKyIuIik7dmFyIHI9VHAoe30sZS5wcm9wcyksbz1lLmtleSxhPWUucmVmLGk9ZS5fb3duZXI7aWYodCE9bnVsbCl7aWYodC5yZWYhPT12b2lkIDAmJihhPXQucmVmLGk9Q2wuY3VycmVudCksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSxlLnR5cGUmJmUudHlwZS5kZWZhdWx0UHJvcHMpdmFyIHM9ZS50eXBlLmRlZmF1bHRQcm9wcztmb3IobCBpbiB0KV9wLmNhbGwodCxsKSYmIUNwLmhhc093blByb3BlcnR5KGwpJiYocltsXT10W2xdPT09dm9pZCAwJiZzIT09dm9pZCAwP3NbbF06dFtsXSl9dmFyIGw9YXJndW1lbnRzLmxlbmd0aC0yO2lmKGw9PT0xKXIuY2hpbGRyZW49bjtlbHNlIGlmKDE8bCl7cz1BcnJheShsKTtmb3IodmFyIHU9MDt1PGw7dSsrKXNbdV09YXJndW1lbnRzW3UrMl07ci5jaGlsZHJlbj1zfXJldHVybnskJHR5cGVvZjpRbyx0eXBlOmUudHlwZSxrZXk6byxyZWY6YSxwcm9wczpyLF9vd25lcjppfX07b2UuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gZT17JCR0eXBlb2Y6QzAsX2N1cnJlbnRWYWx1ZTplLF9jdXJyZW50VmFsdWUyOmUsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfSxlLlByb3ZpZGVyPXskJHR5cGVvZjpfMCxfY29udGV4dDplfSxlLkNvbnN1bWVyPWV9O29lLmNyZWF0ZUVsZW1lbnQ9QXA7b2UuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgdD1BcC5iaW5kKG51bGwsZSk7cmV0dXJuIHQudHlwZT1lLHR9O29lLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fTtvZS5mb3J3YXJkUmVmPWZ1bmN0aW9uKGUpe3JldHVybnskJHR5cGVvZjpBMCxyZW5kZXI6ZX19O29lLmlzVmFsaWRFbGVtZW50PUFsO29lLmxhenk9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOk0wLF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6ZX0sX2luaXQ6ejB9fTtvZS5tZW1vPWZ1bmN0aW9uKGUsdCl7cmV0dXJueyQkdHlwZW9mOlIwLHR5cGU6ZSxjb21wYXJlOnQ9PT12b2lkIDA/bnVsbDp0fX07b2Uuc3RhcnRUcmFuc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWJpLnRyYW5zaXRpb247YmkudHJhbnNpdGlvbj17fTt0cnl7ZSgpfWZpbmFsbHl7YmkudHJhbnNpdGlvbj10fX07b2UudW5zdGFibGVfYWN0PU9wO29lLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHV0LmN1cnJlbnQudXNlQ2FsbGJhY2soZSx0KX07b2UudXNlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gdXQuY3VycmVudC51c2VDb250ZXh0KGUpfTtvZS51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtvZS51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiB1dC5jdXJyZW50LnVzZURlZmVycmVkVmFsdWUoZSl9O29lLnVzZUVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiB1dC5jdXJyZW50LnVzZUVmZmVjdChlLHQpfTtvZS51c2VJZD1mdW5jdGlvbigpe3JldHVybiB1dC5jdXJyZW50LnVzZUlkKCl9O29lLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB1dC5jdXJyZW50LnVzZUltcGVyYXRpdmVIYW5kbGUoZSx0LG4pfTtvZS51c2VJbnNlcnRpb25FZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdXQuY3VycmVudC51c2VJbnNlcnRpb25FZmZlY3QoZSx0KX07b2UudXNlTGF5b3V0RWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHV0LmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGUsdCl9O29lLnVzZU1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdXQuY3VycmVudC51c2VNZW1vKGUsdCl9O29lLnVzZVJlZHVjZXI9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB1dC5jdXJyZW50LnVzZVJlZHVjZXIoZSx0LG4pfTtvZS51c2VSZWY9ZnVuY3Rpb24oZSl7cmV0dXJuIHV0LmN1cnJlbnQudXNlUmVmKGUpfTtvZS51c2VTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdXQuY3VycmVudC51c2VTdGF0ZShlKX07b2UudXNlU3luY0V4dGVybmFsU3RvcmU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB1dC5jdXJyZW50LnVzZVN5bmNFeHRlcm5hbFN0b3JlKGUsdCxuKX07b2UudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiB1dC5jdXJyZW50LnVzZVRyYW5zaXRpb24oKX07b2UudmVyc2lvbj0iMTguMy4xIn0pO3ZhciB3ZT1TcigoUU4sTXApPT57InVzZSBzdHJpY3QiO01wLmV4cG9ydHM9UnAoKX0pO3ZhciBIcD1TcihrZT0+eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBJbChlLHQpe3ZhciBuPWUubGVuZ3RoO2UucHVzaCh0KTtlOmZvcig7MDxuOyl7dmFyIHI9bi0xPj4+MSxvPWVbcl07aWYoMDx4aShvLHQpKWVbcl09dCxlW25dPW8sbj1yO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24gS3QoZSl7cmV0dXJuIGUubGVuZ3RoPT09MD9udWxsOmVbMF19ZnVuY3Rpb24gU2koZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciB0PWVbMF0sbj1lLnBvcCgpO2lmKG4hPT10KXtlWzBdPW47ZTpmb3IodmFyIHI9MCxvPWUubGVuZ3RoLGE9bz4+PjE7cjxhOyl7dmFyIGk9MioocisxKS0xLHM9ZVtpXSxsPWkrMSx1PWVbbF07aWYoMD54aShzLG4pKWw8byYmMD54aSh1LHMpPyhlW3JdPXUsZVtsXT1uLHI9bCk6KGVbcl09cyxlW2ldPW4scj1pKTtlbHNlIGlmKGw8byYmMD54aSh1LG4pKWVbcl09dSxlW2xdPW4scj1sO2Vsc2UgYnJlYWsgZX19cmV0dXJuIHR9ZnVuY3Rpb24geGkoZSx0KXt2YXIgbj1lLnNvcnRJbmRleC10LnNvcnRJbmRleDtyZXR1cm4gbiE9PTA/bjplLmlkLXQuaWR9dHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj8oSXA9cGVyZm9ybWFuY2Usa2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIElwLm5vdygpfSk6KE9sPURhdGUsUHA9T2wubm93KCksa2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIE9sLm5vdygpLVBwfSk7dmFyIElwLE9sLFBwLHBuPVtdLFZuPVtdLFUwPTEsUHQ9bnVsbCxudD0zLEVpPSExLEVyPSExLFhvPSExLEZwPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6bnVsbCxVcD10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLExwPXR5cGVvZiBzZXRJbW1lZGlhdGU8InUiP3NldEltbWVkaWF0ZTpudWxsO3R5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmchPT12b2lkIDAmJm5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpO2Z1bmN0aW9uIFBsKGUpe2Zvcih2YXIgdD1LdChWbik7dCE9PW51bGw7KXtpZih0LmNhbGxiYWNrPT09bnVsbClTaShWbik7ZWxzZSBpZih0LnN0YXJ0VGltZTw9ZSlTaShWbiksdC5zb3J0SW5kZXg9dC5leHBpcmF0aW9uVGltZSxJbChwbix0KTtlbHNlIGJyZWFrO3Q9S3QoVm4pfX1mdW5jdGlvbiBMbChlKXtpZihYbz0hMSxQbChlKSwhRXIpaWYoS3QocG4pIT09bnVsbClFcj0hMCxGbCh6bCk7ZWxzZXt2YXIgdD1LdChWbik7dCE9PW51bGwmJlVsKExsLHQuc3RhcnRUaW1lLWUpfX1mdW5jdGlvbiB6bChlLHQpe0VyPSExLFhvJiYoWG89ITEsVXAoWm8pLFpvPS0xKSxFaT0hMDt2YXIgbj1udDt0cnl7Zm9yKFBsKHQpLFB0PUt0KHBuKTtQdCE9PW51bGwmJighKFB0LmV4cGlyYXRpb25UaW1lPnQpfHxlJiYhV3AoKSk7KXt2YXIgcj1QdC5jYWxsYmFjaztpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7UHQuY2FsbGJhY2s9bnVsbCxudD1QdC5wcmlvcml0eUxldmVsO3ZhciBvPXIoUHQuZXhwaXJhdGlvblRpbWU8PXQpO3Q9a2UudW5zdGFibGVfbm93KCksdHlwZW9mIG89PSJmdW5jdGlvbiI/UHQuY2FsbGJhY2s9bzpQdD09PUt0KHBuKSYmU2kocG4pLFBsKHQpfWVsc2UgU2kocG4pO1B0PUt0KHBuKX1pZihQdCE9PW51bGwpdmFyIGE9ITA7ZWxzZXt2YXIgaT1LdChWbik7aSE9PW51bGwmJlVsKExsLGkuc3RhcnRUaW1lLXQpLGE9ITF9cmV0dXJuIGF9ZmluYWxseXtQdD1udWxsLG50PW4sRWk9ITF9fXZhciBUaT0hMSxraT1udWxsLFpvPS0xLCRwPTUsQnA9LTE7ZnVuY3Rpb24gV3AoKXtyZXR1cm4hKGtlLnVuc3RhYmxlX25vdygpLUJwPCRwKX1mdW5jdGlvbiBSbCgpe2lmKGtpIT09bnVsbCl7dmFyIGU9a2UudW5zdGFibGVfbm93KCk7QnA9ZTt2YXIgdD0hMDt0cnl7dD1raSghMCxlKX1maW5hbGx5e3Q/Sm8oKTooVGk9ITEsa2k9bnVsbCl9fWVsc2UgVGk9ITF9dmFyIEpvO3R5cGVvZiBMcD09ImZ1bmN0aW9uIj9Kbz1mdW5jdGlvbigpe0xwKFJsKX06dHlwZW9mIE1lc3NhZ2VDaGFubmVsPCJ1Ij8oTWw9bmV3IE1lc3NhZ2VDaGFubmVsLHpwPU1sLnBvcnQyLE1sLnBvcnQxLm9ubWVzc2FnZT1SbCxKbz1mdW5jdGlvbigpe3pwLnBvc3RNZXNzYWdlKG51bGwpfSk6Sm89ZnVuY3Rpb24oKXtGcChSbCwwKX07dmFyIE1sLHpwO2Z1bmN0aW9uIEZsKGUpe2tpPWUsVGl8fChUaT0hMCxKbygpKX1mdW5jdGlvbiBVbChlLHQpe1pvPUZwKGZ1bmN0aW9uKCl7ZShrZS51bnN0YWJsZV9ub3coKSl9LHQpfWtlLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O2tlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7a2UudW5zdGFibGVfTG93UHJpb3JpdHk9NDtrZS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zO2tlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO2tlLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7a2UudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7ZS5jYWxsYmFjaz1udWxsfTtrZS51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe0VyfHxFaXx8KEVyPSEwLEZsKHpsKSl9O2tlLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGUpezA+ZXx8MTI1PGU/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6JHA9MDxlP01hdGguZmxvb3IoMWUzL2UpOjV9O2tlLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIG50fTtrZS51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBLdChwbil9O2tlLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oZSl7c3dpdGNoKG50KXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgdD0zO2JyZWFrO2RlZmF1bHQ6dD1udH12YXIgbj1udDtudD10O3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7bnQ9bn19O2tlLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtrZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt9O2tlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6ZT0zfXZhciBuPW50O250PWU7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtudD1ufX07a2UudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9a2UudW5zdGFibGVfbm93KCk7c3dpdGNoKHR5cGVvZiBuPT0ib2JqZWN0IiYmbiE9PW51bGw/KG49bi5kZWxheSxuPXR5cGVvZiBuPT0ibnVtYmVyIiYmMDxuP3IrbjpyKTpuPXIsZSl7Y2FzZSAxOnZhciBvPS0xO2JyZWFrO2Nhc2UgMjpvPTI1MDticmVhaztjYXNlIDU6bz0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDpvPTFlNDticmVhaztkZWZhdWx0Om89NWUzfXJldHVybiBvPW4rbyxlPXtpZDpVMCsrLGNhbGxiYWNrOnQscHJpb3JpdHlMZXZlbDplLHN0YXJ0VGltZTpuLGV4cGlyYXRpb25UaW1lOm8sc29ydEluZGV4Oi0xfSxuPnI/KGUuc29ydEluZGV4PW4sSWwoVm4sZSksS3QocG4pPT09bnVsbCYmZT09PUt0KFZuKSYmKFhvPyhVcChabyksWm89LTEpOlhvPSEwLFVsKExsLG4tcikpKTooZS5zb3J0SW5kZXg9byxJbChwbixlKSxFcnx8RWl8fChFcj0hMCxGbCh6bCkpKSxlfTtrZS51bnN0YWJsZV9zaG91bGRZaWVsZD1XcDtrZS51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bnQ7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49bnQ7bnQ9dDt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7bnQ9bn19fX0pO3ZhciBWcD1TcigoWE4sanApPT57InVzZSBzdHJpY3QiO2pwLmV4cG9ydHM9SHAoKX0pO3ZhciBRaD1TcihPdD0+eyJ1c2Ugc3RyaWN0Ijt2YXIgJDA9d2UoKSxDdD1WcCgpO2Z1bmN0aW9uIEkoZSl7Zm9yKHZhciB0PSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Usbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrZSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgWmY9bmV3IFNldCx4YT17fTtmdW5jdGlvbiB6cihlLHQpe05vKGUsdCksTm8oZSsiQ2FwdHVyZSIsdCl9ZnVuY3Rpb24gTm8oZSx0KXtmb3IoeGFbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspWmYuYWRkKHRbZV0pfXZhciBBbj0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksbHU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxCMD0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLEdwPXt9LEtwPXt9O2Z1bmN0aW9uIFcwKGUpe3JldHVybiBsdS5jYWxsKEtwLGUpPyEwOmx1LmNhbGwoR3AsZSk/ITE6QjAudGVzdChlKT9LcFtlXT0hMDooR3BbZV09ITAsITEpfWZ1bmN0aW9uIEgwKGUsdCxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOihlPWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLGUhPT0iZGF0YS0iJiZlIT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gajAoZSx0LG4scil7aWYodD09PW51bGx8fHR5cGVvZiB0PiJ1Inx8SDAoZSx0LG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIXQ7Y2FzZSA0OnJldHVybiB0PT09ITE7Y2FzZSA1OnJldHVybiBpc05hTih0KTtjYXNlIDY6cmV0dXJuIGlzTmFOKHQpfHwxPnR9cmV0dXJuITF9ZnVuY3Rpb24gcHQoZSx0LG4scixvLGEsaSl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9dD09PTJ8fHQ9PT0zfHx0PT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1vLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9ZSx0aGlzLnR5cGU9dCx0aGlzLnNhbml0aXplVVJMPWEsdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1pfXZhciBaZT17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7WmVbZV09bmV3IHB0KGUsMCwhMSxlLG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07WmVbdF09bmV3IHB0KHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1plW2VdPW5ldyBwdChlLDIsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbihlKXtaZVtlXT1uZXcgcHQoZSwyLCExLGUsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1plW2VdPW5ldyBwdChlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtaZVtlXT1uZXcgcHQoZSwzLCEwLGUsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7WmVbZV09bmV3IHB0KGUsNCwhMSxlLG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbihlKXtaZVtlXT1uZXcgcHQoZSw2LCExLGUsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7WmVbZV09bmV3IHB0KGUsNSwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgZWM9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHRjKGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGVjLHRjKTtaZVt0XT1uZXcgcHQodCwxLCExLGUsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGVjLHRjKTtaZVt0XT1uZXcgcHQodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGVjLHRjKTtaZVt0XT1uZXcgcHQodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihlKXtaZVtlXT1uZXcgcHQoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1plLnhsaW5rSHJlZj1uZXcgcHQoInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihlKXtaZVtlXT1uZXcgcHQoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIG5jKGUsdCxuLHIpe3ZhciBvPVplLmhhc093blByb3BlcnR5KHQpP1plW3RdOm51bGw7KG8hPT1udWxsP28udHlwZSE9PTA6cnx8ISgyPHQubGVuZ3RoKXx8dFswXSE9PSJvIiYmdFswXSE9PSJPInx8dFsxXSE9PSJuIiYmdFsxXSE9PSJOIikmJihqMCh0LG4sbyxyKSYmKG49bnVsbCkscnx8bz09PW51bGw/VzAodCkmJihuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKTpvLm11c3RVc2VQcm9wZXJ0eT9lW28ucHJvcGVydHlOYW1lXT1uPT09bnVsbD9vLnR5cGU9PT0zPyExOiIiOm46KHQ9by5hdHRyaWJ1dGVOYW1lLHI9by5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG89by50eXBlLG49bz09PTN8fG89PT00JiZuPT09ITA/IiI6IiIrbixyP2Uuc2V0QXR0cmlidXRlTlMocix0LG4pOmUuc2V0QXR0cmlidXRlKHQsbikpKSl9dmFyIEluPSQwLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELE5pPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxzbz1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxsbz1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLHJjPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksdXU9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxlbT1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLHRtPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxvYz1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLGN1PVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksZHU9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLGFjPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxLbj1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iik7U3ltYm9sLmZvcigicmVhY3Quc2NvcGUiKTtTeW1ib2wuZm9yKCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlIik7dmFyIG5tPVN5bWJvbC5mb3IoInJlYWN0Lm9mZnNjcmVlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmxlZ2FjeV9oaWRkZW4iKTtTeW1ib2wuZm9yKCJyZWFjdC5jYWNoZSIpO1N5bWJvbC5mb3IoInJlYWN0LnRyYWNpbmdfbWFya2VyIik7dmFyIFlwPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBlYShlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPVlwJiZlW1lwXXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyIEllPU9iamVjdC5hc3NpZ24sJGw7ZnVuY3Rpb24gbGEoZSl7aWYoJGw9PT12b2lkIDApdHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2gobil7dmFyIHQ9bi5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pOyRsPXQmJnRbMV18fCIifXJldHVybmAKYCskbCtlfXZhciBCbD0hMTtmdW5jdGlvbiBXbChlLHQpe2lmKCFlfHxCbClyZXR1cm4iIjtCbD0hMDt2YXIgbj1FcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT12b2lkIDA7dHJ5e2lmKHQpaWYodD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicHJvcHMiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfX0pLHR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0IiYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdCh0LFtdKX1jYXRjaCh1KXt2YXIgcj11fVJlZmxlY3QuY29uc3RydWN0KGUsW10sdCl9ZWxzZXt0cnl7dC5jYWxsKCl9Y2F0Y2godSl7cj11fWUuY2FsbCh0LnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaCh1KXtyPXV9ZSgpfX1jYXRjaCh1KXtpZih1JiZyJiZ0eXBlb2YgdS5zdGFjaz09InN0cmluZyIpe2Zvcih2YXIgbz11LnN0YWNrLnNwbGl0KGAKYCksYT1yLnN0YWNrLnNwbGl0KGAKYCksaT1vLmxlbmd0aC0xLHM9YS5sZW5ndGgtMTsxPD1pJiYwPD1zJiZvW2ldIT09YVtzXTspcy0tO2Zvcig7MTw9aSYmMDw9cztpLS0scy0tKWlmKG9baV0hPT1hW3NdKXtpZihpIT09MXx8cyE9PTEpZG8gaWYoaS0tLHMtLSwwPnN8fG9baV0hPT1hW3NdKXt2YXIgbD1gCmArb1tpXS5yZXBsYWNlKCIgYXQgbmV3ICIsIiBhdCAiKTtyZXR1cm4gZS5kaXNwbGF5TmFtZSYmbC5pbmNsdWRlcygiPGFub255bW91cz4iKSYmKGw9bC5yZXBsYWNlKCI8YW5vbnltb3VzPiIsZS5kaXNwbGF5TmFtZSkpLGx9d2hpbGUoMTw9aSYmMDw9cyk7YnJlYWt9fX1maW5hbGx5e0JsPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPW59cmV0dXJuKGU9ZT9lLmRpc3BsYXlOYW1lfHxlLm5hbWU6IiIpP2xhKGUpOiIifWZ1bmN0aW9uIFYwKGUpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnJldHVybiBsYShlLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIGxhKCJMYXp5Iik7Y2FzZSAxMzpyZXR1cm4gbGEoIlN1c3BlbnNlIik7Y2FzZSAxOTpyZXR1cm4gbGEoIlN1c3BlbnNlTGlzdCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gZT1XbChlLnR5cGUsITEpLGU7Y2FzZSAxMTpyZXR1cm4gZT1XbChlLnR5cGUucmVuZGVyLCExKSxlO2Nhc2UgMTpyZXR1cm4gZT1XbChlLnR5cGUsITApLGU7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gcHUoZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4gZS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHxudWxsO2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtzd2l0Y2goZSl7Y2FzZSBsbzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2Ugc286cmV0dXJuIlBvcnRhbCI7Y2FzZSB1dTpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgcmM6cmV0dXJuIlN0cmljdE1vZGUiO2Nhc2UgY3U6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIGR1OnJldHVybiJTdXNwZW5zZUxpc3QifWlmKHR5cGVvZiBlPT0ib2JqZWN0Iilzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSB0bTpyZXR1cm4oZS5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIGVtOnJldHVybihlLl9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2Ugb2M6dmFyIHQ9ZS5yZW5kZXI7cmV0dXJuIGU9ZS5kaXNwbGF5TmFtZSxlfHwoZT10LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fCIiLGU9ZSE9PSIiPyJGb3J3YXJkUmVmKCIrZSsiKSI6IkZvcndhcmRSZWYiKSxlO2Nhc2UgYWM6cmV0dXJuIHQ9ZS5kaXNwbGF5TmFtZXx8bnVsbCx0IT09bnVsbD90OnB1KGUudHlwZSl8fCJNZW1vIjtjYXNlIEtuOnQ9ZS5fcGF5bG9hZCxlPWUuX2luaXQ7dHJ5e3JldHVybiBwdShlKHQpKX1jYXRjaHt9fXJldHVybiBudWxsfWZ1bmN0aW9uIEcwKGUpe3ZhciB0PWUudHlwZTtzd2l0Y2goZS50YWcpe2Nhc2UgMjQ6cmV0dXJuIkNhY2hlIjtjYXNlIDk6cmV0dXJuKHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSAxMDpyZXR1cm4odC5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIDE4OnJldHVybiJEZWh5ZHJhdGVkRnJhZ21lbnQiO2Nhc2UgMTE6cmV0dXJuIGU9dC5yZW5kZXIsZT1lLmRpc3BsYXlOYW1lfHxlLm5hbWV8fCIiLHQuZGlzcGxheU5hbWV8fChlIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpO2Nhc2UgNzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2UgNTpyZXR1cm4gdDtjYXNlIDQ6cmV0dXJuIlBvcnRhbCI7Y2FzZSAzOnJldHVybiJSb290IjtjYXNlIDY6cmV0dXJuIlRleHQiO2Nhc2UgMTY6cmV0dXJuIHB1KHQpO2Nhc2UgODpyZXR1cm4gdD09PXJjPyJTdHJpY3RNb2RlIjoiTW9kZSI7Y2FzZSAyMjpyZXR1cm4iT2Zmc2NyZWVuIjtjYXNlIDEyOnJldHVybiJQcm9maWxlciI7Y2FzZSAyMTpyZXR1cm4iU2NvcGUiO2Nhc2UgMTM6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIDE5OnJldHVybiJTdXNwZW5zZUxpc3QiO2Nhc2UgMjU6cmV0dXJuIlRyYWNpbmdNYXJrZXIiO2Nhc2UgMTpjYXNlIDA6Y2FzZSAxNzpjYXNlIDI6Y2FzZSAxNDpjYXNlIDE1OmlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fG51bGw7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0fXJldHVybiBudWxsfWZ1bmN0aW9uIHNyKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJib29sZWFuIjpjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpyZXR1cm4gZTtjYXNlIm9iamVjdCI6cmV0dXJuIGU7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gcm0oZSl7dmFyIHQ9ZS50eXBlO3JldHVybihlPWUubm9kZU5hbWUpJiZlLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYodD09PSJjaGVja2JveCJ8fHQ9PT0icmFkaW8iKX1mdW5jdGlvbiBLMChlKXt2YXIgdD1ybShlKT8iY2hlY2tlZCI6InZhbHVlIixuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsdCkscj0iIitlW3RdO2lmKCFlLmhhc093blByb3BlcnR5KHQpJiZ0eXBlb2YgbjwidSImJnR5cGVvZiBuLmdldD09ImZ1bmN0aW9uIiYmdHlwZW9mIG4uc2V0PT0iZnVuY3Rpb24iKXt2YXIgbz1uLmdldCxhPW4uc2V0O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGkpe3I9IiIraSxhLmNhbGwodGhpcyxpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOm4uZW51bWVyYWJsZX0pLHtnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiByfSxzZXRWYWx1ZTpmdW5jdGlvbihpKXtyPSIiK2l9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe2UuX3ZhbHVlVHJhY2tlcj1udWxsLGRlbGV0ZSBlW3RdfX19fWZ1bmN0aW9uIERpKGUpe2UuX3ZhbHVlVHJhY2tlcnx8KGUuX3ZhbHVlVHJhY2tlcj1LMChlKSl9ZnVuY3Rpb24gb20oZSl7aWYoIWUpcmV0dXJuITE7dmFyIHQ9ZS5fdmFsdWVUcmFja2VyO2lmKCF0KXJldHVybiEwO3ZhciBuPXQuZ2V0VmFsdWUoKSxyPSIiO3JldHVybiBlJiYocj1ybShlKT9lLmNoZWNrZWQ/InRydWUiOiJmYWxzZSI6ZS52YWx1ZSksZT1yLGUhPT1uPyh0LnNldFZhbHVlKGUpLCEwKTohMX1mdW5jdGlvbiB0cyhlKXtpZihlPWV8fCh0eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50OnZvaWQgMCksdHlwZW9mIGU+InUiKXJldHVybiBudWxsO3RyeXtyZXR1cm4gZS5hY3RpdmVFbGVtZW50fHxlLmJvZHl9Y2F0Y2h7cmV0dXJuIGUuYm9keX19ZnVuY3Rpb24gZnUoZSx0KXt2YXIgbj10LmNoZWNrZWQ7cmV0dXJuIEllKHt9LHQse2RlZmF1bHRDaGVja2VkOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOnZvaWQgMCxjaGVja2VkOm4/P2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uIHFwKGUsdCl7dmFyIG49dC5kZWZhdWx0VmFsdWU9PW51bGw/IiI6dC5kZWZhdWx0VmFsdWUscj10LmNoZWNrZWQhPW51bGw/dC5jaGVja2VkOnQuZGVmYXVsdENoZWNrZWQ7bj1zcih0LnZhbHVlIT1udWxsP3QudmFsdWU6biksZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsQ2hlY2tlZDpyLGluaXRpYWxWYWx1ZTpuLGNvbnRyb2xsZWQ6dC50eXBlPT09ImNoZWNrYm94Inx8dC50eXBlPT09InJhZGlvIj90LmNoZWNrZWQhPW51bGw6dC52YWx1ZSE9bnVsbH19ZnVuY3Rpb24gYW0oZSx0KXt0PXQuY2hlY2tlZCx0IT1udWxsJiZuYyhlLCJjaGVja2VkIix0LCExKX1mdW5jdGlvbiBtdShlLHQpe2FtKGUsdCk7dmFyIG49c3IodC52YWx1ZSkscj10LnR5cGU7aWYobiE9bnVsbClyPT09Im51bWJlciI/KG49PT0wJiZlLnZhbHVlPT09IiJ8fGUudmFsdWUhPW4pJiYoZS52YWx1ZT0iIituKTplLnZhbHVlIT09IiIrbiYmKGUudmFsdWU9IiIrbik7ZWxzZSBpZihyPT09InN1Ym1pdCJ8fHI9PT0icmVzZXQiKXtlLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTtyZXR1cm59dC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKT9odShlLHQudHlwZSxuKTp0Lmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSYmaHUoZSx0LnR5cGUsc3IodC5kZWZhdWx0VmFsdWUpKSx0LmNoZWNrZWQ9PW51bGwmJnQuZGVmYXVsdENoZWNrZWQhPW51bGwmJihlLmRlZmF1bHRDaGVja2VkPSEhdC5kZWZhdWx0Q2hlY2tlZCl9ZnVuY3Rpb24gUXAoZSx0LG4pe2lmKHQuaGFzT3duUHJvcGVydHkoInZhbHVlIil8fHQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpKXt2YXIgcj10LnR5cGU7aWYoIShyIT09InN1Ym1pdCImJnIhPT0icmVzZXQifHx0LnZhbHVlIT09dm9pZCAwJiZ0LnZhbHVlIT09bnVsbCkpcmV0dXJuO3Q9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxufHx0PT09ZS52YWx1ZXx8KGUudmFsdWU9dCksZS5kZWZhdWx0VmFsdWU9dH1uPWUubmFtZSxuIT09IiImJihlLm5hbWU9IiIpLGUuZGVmYXVsdENoZWNrZWQ9ISFlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsbiE9PSIiJiYoZS5uYW1lPW4pfWZ1bmN0aW9uIGh1KGUsdCxuKXsodCE9PSJudW1iZXIifHx0cyhlLm93bmVyRG9jdW1lbnQpIT09ZSkmJihuPT1udWxsP2UuZGVmYXVsdFZhbHVlPSIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6ZS5kZWZhdWx0VmFsdWUhPT0iIituJiYoZS5kZWZhdWx0VmFsdWU9IiIrbikpfXZhciB1YT1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGJvKGUsdCxuLHIpe2lmKGU9ZS5vcHRpb25zLHQpe3Q9e307Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspdFsiJCIrbltvXV09ITA7Zm9yKG49MDtuPGUubGVuZ3RoO24rKylvPXQuaGFzT3duUHJvcGVydHkoIiQiK2Vbbl0udmFsdWUpLGVbbl0uc2VsZWN0ZWQhPT1vJiYoZVtuXS5zZWxlY3RlZD1vKSxvJiZyJiYoZVtuXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Zm9yKG49IiIrc3IobiksdD1udWxsLG89MDtvPGUubGVuZ3RoO28rKyl7aWYoZVtvXS52YWx1ZT09PW4pe2Vbb10uc2VsZWN0ZWQ9ITAsciYmKGVbb10uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59dCE9PW51bGx8fGVbb10uZGlzYWJsZWR8fCh0PWVbb10pfXQhPT1udWxsJiYodC5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIGd1KGUsdCl7aWYodC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCl0aHJvdyBFcnJvcihJKDkxKSk7cmV0dXJuIEllKHt9LHQse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOiIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9KX1mdW5jdGlvbiBKcChlLHQpe3ZhciBuPXQudmFsdWU7aWYobj09bnVsbCl7aWYobj10LmNoaWxkcmVuLHQ9dC5kZWZhdWx0VmFsdWUsbiE9bnVsbCl7aWYodCE9bnVsbCl0aHJvdyBFcnJvcihJKDkyKSk7aWYodWEobikpe2lmKDE8bi5sZW5ndGgpdGhyb3cgRXJyb3IoSSg5MykpO249blswXX10PW59dD09bnVsbCYmKHQ9IiIpLG49dH1lLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpzcihuKX19ZnVuY3Rpb24gaW0oZSx0KXt2YXIgbj1zcih0LnZhbHVlKSxyPXNyKHQuZGVmYXVsdFZhbHVlKTtuIT1udWxsJiYobj0iIituLG4hPT1lLnZhbHVlJiYoZS52YWx1ZT1uKSx0LmRlZmF1bHRWYWx1ZT09bnVsbCYmZS5kZWZhdWx0VmFsdWUhPT1uJiYoZS5kZWZhdWx0VmFsdWU9bikpLHIhPW51bGwmJihlLmRlZmF1bHRWYWx1ZT0iIityKX1mdW5jdGlvbiBYcChlKXt2YXIgdD1lLnRleHRDb250ZW50O3Q9PT1lLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiZ0IT09IiImJnQhPT1udWxsJiYoZS52YWx1ZT10KX1mdW5jdGlvbiBzbShlKXtzd2l0Y2goZSl7Y2FzZSJzdmciOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Y2FzZSJtYXRoIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI7ZGVmYXVsdDpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCJ9fWZ1bmN0aW9uIHZ1KGUsdCl7cmV0dXJuIGU9PW51bGx8fGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/c20odCk6ZT09PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyImJnQ9PT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOmV9dmFyIF9pLGxtPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgTVNBcHA8InUiJiZNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbj9mdW5jdGlvbih0LG4scixvKXtNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbigpe3JldHVybiBlKHQsbixyLG8pfSl9OmV9KGZ1bmN0aW9uKGUsdCl7aWYoZS5uYW1lc3BhY2VVUkkhPT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifHwiaW5uZXJIVE1MImluIGUpZS5pbm5lckhUTUw9dDtlbHNle2ZvcihfaT1faXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksX2kuaW5uZXJIVE1MPSI8c3ZnPiIrdC52YWx1ZU9mKCkudG9TdHJpbmcoKSsiPC9zdmc+Iix0PV9pLmZpcnN0Q2hpbGQ7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKDt0LmZpcnN0Q2hpbGQ7KWUuYXBwZW5kQ2hpbGQodC5maXJzdENoaWxkKX19KTtmdW5jdGlvbiBrYShlLHQpe2lmKHQpe3ZhciBuPWUuZmlyc3RDaGlsZDtpZihuJiZuPT09ZS5sYXN0Q2hpbGQmJm4ubm9kZVR5cGU9PT0zKXtuLm5vZGVWYWx1ZT10O3JldHVybn19ZS50ZXh0Q29udGVudD10fXZhciBwYT17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYXNwZWN0UmF0aW86ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0sWTA9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5cyhwYSkuZm9yRWFjaChmdW5jdGlvbihlKXtZMC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9dCtlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyaW5nKDEpLHBhW3RdPXBhW2VdfSl9KTtmdW5jdGlvbiB1bShlLHQsbil7cmV0dXJuIHQ9PW51bGx8fHR5cGVvZiB0PT0iYm9vbGVhbiJ8fHQ9PT0iIj8iIjpufHx0eXBlb2YgdCE9Im51bWJlciJ8fHQ9PT0wfHxwYS5oYXNPd25Qcm9wZXJ0eShlKSYmcGFbZV0/KCIiK3QpLnRyaW0oKTp0KyJweCJ9ZnVuY3Rpb24gY20oZSx0KXtlPWUuc3R5bGU7Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9bi5pbmRleE9mKCItLSIpPT09MCxvPXVtKG4sdFtuXSxyKTtuPT09ImZsb2F0IiYmKG49ImNzc0Zsb2F0Iikscj9lLnNldFByb3BlcnR5KG4sbyk6ZVtuXT1vfX12YXIgcTA9SWUoe21lbnVpdGVtOiEwfSx7YXJlYTohMCxiYXNlOiEwLGJyOiEwLGNvbDohMCxlbWJlZDohMCxocjohMCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3VyY2U6ITAsdHJhY2s6ITAsd2JyOiEwfSk7ZnVuY3Rpb24geXUoZSx0KXtpZih0KXtpZihxMFtlXSYmKHQuY2hpbGRyZW4hPW51bGx8fHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpKXRocm93IEVycm9yKEkoMTM3LGUpKTtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXtpZih0LmNoaWxkcmVuIT1udWxsKXRocm93IEVycm9yKEkoNjApKTtpZih0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9Im9iamVjdCJ8fCEoIl9faHRtbCJpbiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihJKDYxKSl9aWYodC5zdHlsZSE9bnVsbCYmdHlwZW9mIHQuc3R5bGUhPSJvYmplY3QiKXRocm93IEVycm9yKEkoNjIpKX19ZnVuY3Rpb24gd3UoZSx0KXtpZihlLmluZGV4T2YoIi0iKT09PS0xKXJldHVybiB0eXBlb2YgdC5pcz09InN0cmluZyI7c3dpdGNoKGUpe2Nhc2UiYW5ub3RhdGlvbi14bWwiOmNhc2UiY29sb3ItcHJvZmlsZSI6Y2FzZSJmb250LWZhY2UiOmNhc2UiZm9udC1mYWNlLXNyYyI6Y2FzZSJmb250LWZhY2UtdXJpIjpjYXNlImZvbnQtZmFjZS1mb3JtYXQiOmNhc2UiZm9udC1mYWNlLW5hbWUiOmNhc2UibWlzc2luZy1nbHlwaCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19dmFyIGJ1PW51bGw7ZnVuY3Rpb24gaWMoZSl7cmV0dXJuIGU9ZS50YXJnZXR8fGUuc3JjRWxlbWVudHx8d2luZG93LGUuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihlPWUuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLGUubm9kZVR5cGU9PT0zP2UucGFyZW50Tm9kZTplfXZhciB4dT1udWxsLHhvPW51bGwsa289bnVsbDtmdW5jdGlvbiBacChlKXtpZihlPSRhKGUpKXtpZih0eXBlb2YgeHUhPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoSSgyODApKTt2YXIgdD1lLnN0YXRlTm9kZTt0JiYodD1Dcyh0KSx4dShlLnN0YXRlTm9kZSxlLnR5cGUsdCkpfX1mdW5jdGlvbiBkbShlKXt4bz9rbz9rby5wdXNoKGUpOmtvPVtlXTp4bz1lfWZ1bmN0aW9uIHBtKCl7aWYoeG8pe3ZhciBlPXhvLHQ9a287aWYoa289eG89bnVsbCxacChlKSx0KWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspWnAodFtlXSl9fWZ1bmN0aW9uIGZtKGUsdCl7cmV0dXJuIGUodCl9ZnVuY3Rpb24gbW0oKXt9dmFyIEhsPSExO2Z1bmN0aW9uIGhtKGUsdCxuKXtpZihIbClyZXR1cm4gZSh0LG4pO0hsPSEwO3RyeXtyZXR1cm4gZm0oZSx0LG4pfWZpbmFsbHl7SGw9ITEsKHhvIT09bnVsbHx8a28hPT1udWxsKSYmKG1tKCkscG0oKSl9fWZ1bmN0aW9uIFNhKGUsdCl7dmFyIG49ZS5zdGF0ZU5vZGU7aWYobj09PW51bGwpcmV0dXJuIG51bGw7dmFyIHI9Q3Mobik7aWYocj09PW51bGwpcmV0dXJuIG51bGw7bj1yW3RdO2U6c3dpdGNoKHQpe2Nhc2Uib25DbGljayI6Y2FzZSJvbkNsaWNrQ2FwdHVyZSI6Y2FzZSJvbkRvdWJsZUNsaWNrIjpjYXNlIm9uRG91YmxlQ2xpY2tDYXB0dXJlIjpjYXNlIm9uTW91c2VEb3duIjpjYXNlIm9uTW91c2VEb3duQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlTW92ZSI6Y2FzZSJvbk1vdXNlTW92ZUNhcHR1cmUiOmNhc2Uib25Nb3VzZVVwIjpjYXNlIm9uTW91c2VVcENhcHR1cmUiOmNhc2Uib25Nb3VzZUVudGVyIjoocj0hci5kaXNhYmxlZCl8fChlPWUudHlwZSxyPSEoZT09PSJidXR0b24ifHxlPT09ImlucHV0Inx8ZT09PSJzZWxlY3QifHxlPT09InRleHRhcmVhIikpLGU9IXI7YnJlYWsgZTtkZWZhdWx0OmU9ITF9aWYoZSlyZXR1cm4gbnVsbDtpZihuJiZ0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihJKDIzMSx0LHR5cGVvZiBuKSk7cmV0dXJuIG59dmFyIGt1PSExO2lmKEFuKXRyeXthbz17fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYW8sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtrdT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsYW8sYW8pLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0Iixhbyxhbyl9Y2F0Y2h7a3U9ITF9dmFyIGFvO2Z1bmN0aW9uIFEwKGUsdCxuLHIsbyxhLGkscyxsKXt2YXIgdT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyk7dHJ5e3QuYXBwbHkobix1KX1jYXRjaChjKXt0aGlzLm9uRXJyb3IoYyl9fXZhciBmYT0hMSxucz1udWxsLHJzPSExLFN1PW51bGwsSjA9e29uRXJyb3I6ZnVuY3Rpb24oZSl7ZmE9ITAsbnM9ZX19O2Z1bmN0aW9uIFgwKGUsdCxuLHIsbyxhLGkscyxsKXtmYT0hMSxucz1udWxsLFEwLmFwcGx5KEowLGFyZ3VtZW50cyl9ZnVuY3Rpb24gWjAoZSx0LG4scixvLGEsaSxzLGwpe2lmKFgwLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxmYSl7aWYoZmEpe3ZhciB1PW5zO2ZhPSExLG5zPW51bGx9ZWxzZSB0aHJvdyBFcnJvcihJKDE5OCkpO3JzfHwocnM9ITAsU3U9dSl9fWZ1bmN0aW9uIEZyKGUpe3ZhciB0PWUsbj1lO2lmKGUuYWx0ZXJuYXRlKWZvcig7dC5yZXR1cm47KXQ9dC5yZXR1cm47ZWxzZXtlPXQ7ZG8gdD1lLHQuZmxhZ3MmNDA5OCYmKG49dC5yZXR1cm4pLGU9dC5yZXR1cm47d2hpbGUoZSl9cmV0dXJuIHQudGFnPT09Mz9uOm51bGx9ZnVuY3Rpb24gZ20oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9ZS5tZW1vaXplZFN0YXRlO2lmKHQ9PT1udWxsJiYoZT1lLmFsdGVybmF0ZSxlIT09bnVsbCYmKHQ9ZS5tZW1vaXplZFN0YXRlKSksdCE9PW51bGwpcmV0dXJuIHQuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBlZihlKXtpZihGcihlKSE9PWUpdGhyb3cgRXJyb3IoSSgxODgpKX1mdW5jdGlvbiBldyhlKXt2YXIgdD1lLmFsdGVybmF0ZTtpZighdCl7aWYodD1GcihlKSx0PT09bnVsbCl0aHJvdyBFcnJvcihJKDE4OCkpO3JldHVybiB0IT09ZT9udWxsOmV9Zm9yKHZhciBuPWUscj10Ozspe3ZhciBvPW4ucmV0dXJuO2lmKG89PT1udWxsKWJyZWFrO3ZhciBhPW8uYWx0ZXJuYXRlO2lmKGE9PT1udWxsKXtpZihyPW8ucmV0dXJuLHIhPT1udWxsKXtuPXI7Y29udGludWV9YnJlYWt9aWYoby5jaGlsZD09PWEuY2hpbGQpe2ZvcihhPW8uY2hpbGQ7YTspe2lmKGE9PT1uKXJldHVybiBlZihvKSxlO2lmKGE9PT1yKXJldHVybiBlZihvKSx0O2E9YS5zaWJsaW5nfXRocm93IEVycm9yKEkoMTg4KSl9aWYobi5yZXR1cm4hPT1yLnJldHVybiluPW8scj1hO2Vsc2V7Zm9yKHZhciBpPSExLHM9by5jaGlsZDtzOyl7aWYocz09PW4pe2k9ITAsbj1vLHI9YTticmVha31pZihzPT09cil7aT0hMCxyPW8sbj1hO2JyZWFrfXM9cy5zaWJsaW5nfWlmKCFpKXtmb3Iocz1hLmNoaWxkO3M7KXtpZihzPT09bil7aT0hMCxuPWEscj1vO2JyZWFrfWlmKHM9PT1yKXtpPSEwLHI9YSxuPW87YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWkpdGhyb3cgRXJyb3IoSSgxODkpKX19aWYobi5hbHRlcm5hdGUhPT1yKXRocm93IEVycm9yKEkoMTkwKSl9aWYobi50YWchPT0zKXRocm93IEVycm9yKEkoMTg4KSk7cmV0dXJuIG4uc3RhdGVOb2RlLmN1cnJlbnQ9PT1uP2U6dH1mdW5jdGlvbiB2bShlKXtyZXR1cm4gZT1ldyhlKSxlIT09bnVsbD95bShlKTpudWxsfWZ1bmN0aW9uIHltKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlO2ZvcihlPWUuY2hpbGQ7ZSE9PW51bGw7KXt2YXIgdD15bShlKTtpZih0IT09bnVsbClyZXR1cm4gdDtlPWUuc2libGluZ31yZXR1cm4gbnVsbH12YXIgd209Q3QudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayx0Zj1DdC51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayx0dz1DdC51bnN0YWJsZV9zaG91bGRZaWVsZCxudz1DdC51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsRmU9Q3QudW5zdGFibGVfbm93LHJ3PUN0LnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLHNjPUN0LnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LGJtPUN0LnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LG9zPUN0LnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LG93PUN0LnVuc3RhYmxlX0xvd1ByaW9yaXR5LHhtPUN0LnVuc3RhYmxlX0lkbGVQcmlvcml0eSxUcz1udWxsLGduPW51bGw7ZnVuY3Rpb24gYXcoZSl7aWYoZ24mJnR5cGVvZiBnbi5vbkNvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7Z24ub25Db21taXRGaWJlclJvb3QoVHMsZSx2b2lkIDAsKGUuY3VycmVudC5mbGFncyYxMjgpPT09MTI4KX1jYXRjaHt9fXZhciBYdD1NYXRoLmNsejMyP01hdGguY2x6MzI6bHcsaXc9TWF0aC5sb2csc3c9TWF0aC5MTjI7ZnVuY3Rpb24gbHcoZSl7cmV0dXJuIGU+Pj49MCxlPT09MD8zMjozMS0oaXcoZSkvc3d8MCl8MH12YXIgQ2k9NjQsQWk9NDE5NDMwNDtmdW5jdGlvbiBjYShlKXtzd2l0Y2goZSYtZSl7Y2FzZSAxOnJldHVybiAxO2Nhc2UgMjpyZXR1cm4gMjtjYXNlIDQ6cmV0dXJuIDQ7Y2FzZSA4OnJldHVybiA4O2Nhc2UgMTY6cmV0dXJuIDE2O2Nhc2UgMzI6cmV0dXJuIDMyO2Nhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIGUmNDE5NDI0MDtjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybiBlJjEzMDAyMzQyNDtjYXNlIDEzNDIxNzcyODpyZXR1cm4gMTM0MjE3NzI4O2Nhc2UgMjY4NDM1NDU2OnJldHVybiAyNjg0MzU0NTY7Y2FzZSA1MzY4NzA5MTI6cmV0dXJuIDUzNjg3MDkxMjtjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuIDEwNzM3NDE4MjQ7ZGVmYXVsdDpyZXR1cm4gZX19ZnVuY3Rpb24gYXMoZSx0KXt2YXIgbj1lLnBlbmRpbmdMYW5lcztpZihuPT09MClyZXR1cm4gMDt2YXIgcj0wLG89ZS5zdXNwZW5kZWRMYW5lcyxhPWUucGluZ2VkTGFuZXMsaT1uJjI2ODQzNTQ1NTtpZihpIT09MCl7dmFyIHM9aSZ+bztzIT09MD9yPWNhKHMpOihhJj1pLGEhPT0wJiYocj1jYShhKSkpfWVsc2UgaT1uJn5vLGkhPT0wP3I9Y2EoaSk6YSE9PTAmJihyPWNhKGEpKTtpZihyPT09MClyZXR1cm4gMDtpZih0IT09MCYmdCE9PXImJiEodCZvKSYmKG89ciYtcixhPXQmLXQsbz49YXx8bz09PTE2JiYoYSY0MTk0MjQwKSE9PTApKXJldHVybiB0O2lmKHImNCYmKHJ8PW4mMTYpLHQ9ZS5lbnRhbmdsZWRMYW5lcyx0IT09MClmb3IoZT1lLmVudGFuZ2xlbWVudHMsdCY9cjswPHQ7KW49MzEtWHQodCksbz0xPDxuLHJ8PWVbbl0sdCY9fm87cmV0dXJuIHJ9ZnVuY3Rpb24gdXcoZSx0KXtzd2l0Y2goZSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDQ6cmV0dXJuIHQrMjUwO2Nhc2UgODpjYXNlIDE2OmNhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gdCs1ZTM7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4tMTtjYXNlIDEzNDIxNzcyODpjYXNlIDI2ODQzNTQ1NjpjYXNlIDUzNjg3MDkxMjpjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuLTE7ZGVmYXVsdDpyZXR1cm4tMX19ZnVuY3Rpb24gY3coZSx0KXtmb3IodmFyIG49ZS5zdXNwZW5kZWRMYW5lcyxyPWUucGluZ2VkTGFuZXMsbz1lLmV4cGlyYXRpb25UaW1lcyxhPWUucGVuZGluZ0xhbmVzOzA8YTspe3ZhciBpPTMxLVh0KGEpLHM9MTw8aSxsPW9baV07bD09PS0xPyghKHMmbil8fHMmcikmJihvW2ldPXV3KHMsdCkpOmw8PXQmJihlLmV4cGlyZWRMYW5lc3w9cyksYSY9fnN9fWZ1bmN0aW9uIEV1KGUpe3JldHVybiBlPWUucGVuZGluZ0xhbmVzJi0xMDczNzQxODI1LGUhPT0wP2U6ZSYxMDczNzQxODI0PzEwNzM3NDE4MjQ6MH1mdW5jdGlvbiBrbSgpe3ZhciBlPUNpO3JldHVybiBDaTw8PTEsIShDaSY0MTk0MjQwKSYmKENpPTY0KSxlfWZ1bmN0aW9uIGpsKGUpe2Zvcih2YXIgdD1bXSxuPTA7MzE+bjtuKyspdC5wdXNoKGUpO3JldHVybiB0fWZ1bmN0aW9uIEZhKGUsdCxuKXtlLnBlbmRpbmdMYW5lc3w9dCx0IT09NTM2ODcwOTEyJiYoZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCksZT1lLmV2ZW50VGltZXMsdD0zMS1YdCh0KSxlW3RdPW59ZnVuY3Rpb24gZHcoZSx0KXt2YXIgbj1lLnBlbmRpbmdMYW5lcyZ+dDtlLnBlbmRpbmdMYW5lcz10LGUuc3VzcGVuZGVkTGFuZXM9MCxlLnBpbmdlZExhbmVzPTAsZS5leHBpcmVkTGFuZXMmPXQsZS5tdXRhYmxlUmVhZExhbmVzJj10LGUuZW50YW5nbGVkTGFuZXMmPXQsdD1lLmVudGFuZ2xlbWVudHM7dmFyIHI9ZS5ldmVudFRpbWVzO2ZvcihlPWUuZXhwaXJhdGlvblRpbWVzOzA8bjspe3ZhciBvPTMxLVh0KG4pLGE9MTw8bzt0W29dPTAscltvXT0tMSxlW29dPS0xLG4mPX5hfX1mdW5jdGlvbiBsYyhlLHQpe3ZhciBuPWUuZW50YW5nbGVkTGFuZXN8PXQ7Zm9yKGU9ZS5lbnRhbmdsZW1lbnRzO247KXt2YXIgcj0zMS1YdChuKSxvPTE8PHI7byZ0fGVbcl0mdCYmKGVbcl18PXQpLG4mPX5vfX12YXIgZ2U9MDtmdW5jdGlvbiBTbShlKXtyZXR1cm4gZSY9LWUsMTxlPzQ8ZT9lJjI2ODQzNTQ1NT8xNjo1MzY4NzA5MTI6NDoxfXZhciBFbSx1YyxUbSxObSxEbSxUdT0hMSxPaT1bXSxabj1udWxsLGVyPW51bGwsdHI9bnVsbCxFYT1uZXcgTWFwLFRhPW5ldyBNYXAscW49W10scHc9Im1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXQiLnNwbGl0KCIgIik7ZnVuY3Rpb24gbmYoZSx0KXtzd2l0Y2goZSl7Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0Ijpabj1udWxsO2JyZWFrO2Nhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdsZWF2ZSI6ZXI9bnVsbDticmVhaztjYXNlIm1vdXNlb3ZlciI6Y2FzZSJtb3VzZW91dCI6dHI9bnVsbDticmVhaztjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJvdXQiOkVhLmRlbGV0ZSh0LnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOlRhLmRlbGV0ZSh0LnBvaW50ZXJJZCl9fWZ1bmN0aW9uIHRhKGUsdCxuLHIsbyxhKXtyZXR1cm4gZT09PW51bGx8fGUubmF0aXZlRXZlbnQhPT1hPyhlPXtibG9ja2VkT246dCxkb21FdmVudE5hbWU6bixldmVudFN5c3RlbUZsYWdzOnIsbmF0aXZlRXZlbnQ6YSx0YXJnZXRDb250YWluZXJzOltvXX0sdCE9PW51bGwmJih0PSRhKHQpLHQhPT1udWxsJiZ1Yyh0KSksZSk6KGUuZXZlbnRTeXN0ZW1GbGFnc3w9cix0PWUudGFyZ2V0Q29udGFpbmVycyxvIT09bnVsbCYmdC5pbmRleE9mKG8pPT09LTEmJnQucHVzaChvKSxlKX1mdW5jdGlvbiBmdyhlLHQsbixyLG8pe3N3aXRjaCh0KXtjYXNlImZvY3VzaW4iOnJldHVybiBabj10YShabixlLHQsbixyLG8pLCEwO2Nhc2UiZHJhZ2VudGVyIjpyZXR1cm4gZXI9dGEoZXIsZSx0LG4scixvKSwhMDtjYXNlIm1vdXNlb3ZlciI6cmV0dXJuIHRyPXRhKHRyLGUsdCxuLHIsbyksITA7Y2FzZSJwb2ludGVyb3ZlciI6dmFyIGE9by5wb2ludGVySWQ7cmV0dXJuIEVhLnNldChhLHRhKEVhLmdldChhKXx8bnVsbCxlLHQsbixyLG8pKSwhMDtjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpyZXR1cm4gYT1vLnBvaW50ZXJJZCxUYS5zZXQoYSx0YShUYS5nZXQoYSl8fG51bGwsZSx0LG4scixvKSksITB9cmV0dXJuITF9ZnVuY3Rpb24gX20oZSl7dmFyIHQ9RHIoZS50YXJnZXQpO2lmKHQhPT1udWxsKXt2YXIgbj1Gcih0KTtpZihuIT09bnVsbCl7aWYodD1uLnRhZyx0PT09MTMpe2lmKHQ9Z20obiksdCE9PW51bGwpe2UuYmxvY2tlZE9uPXQsRG0oZS5wcmlvcml0eSxmdW5jdGlvbigpe1RtKG4pfSk7cmV0dXJufX1lbHNlIGlmKHQ9PT0zJiZuLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXtlLmJsb2NrZWRPbj1uLnRhZz09PTM/bi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19fWUuYmxvY2tlZE9uPW51bGx9ZnVuY3Rpb24gVmkoZSl7aWYoZS5ibG9ja2VkT24hPT1udWxsKXJldHVybiExO2Zvcih2YXIgdD1lLnRhcmdldENvbnRhaW5lcnM7MDx0Lmxlbmd0aDspe3ZhciBuPU51KGUuZG9tRXZlbnROYW1lLGUuZXZlbnRTeXN0ZW1GbGFncyx0WzBdLGUubmF0aXZlRXZlbnQpO2lmKG49PT1udWxsKXtuPWUubmF0aXZlRXZlbnQ7dmFyIHI9bmV3IG4uY29uc3RydWN0b3Iobi50eXBlLG4pO2J1PXIsbi50YXJnZXQuZGlzcGF0Y2hFdmVudChyKSxidT1udWxsfWVsc2UgcmV0dXJuIHQ9JGEobiksdCE9PW51bGwmJnVjKHQpLGUuYmxvY2tlZE9uPW4sITE7dC5zaGlmdCgpfXJldHVybiEwfWZ1bmN0aW9uIHJmKGUsdCxuKXtWaShlKSYmbi5kZWxldGUodCl9ZnVuY3Rpb24gbXcoKXtUdT0hMSxabiE9PW51bGwmJlZpKFpuKSYmKFpuPW51bGwpLGVyIT09bnVsbCYmVmkoZXIpJiYoZXI9bnVsbCksdHIhPT1udWxsJiZWaSh0cikmJih0cj1udWxsKSxFYS5mb3JFYWNoKHJmKSxUYS5mb3JFYWNoKHJmKX1mdW5jdGlvbiBuYShlLHQpe2UuYmxvY2tlZE9uPT09dCYmKGUuYmxvY2tlZE9uPW51bGwsVHV8fChUdT0hMCxDdC51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKEN0LnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LG13KSkpfWZ1bmN0aW9uIE5hKGUpe2Z1bmN0aW9uIHQobyl7cmV0dXJuIG5hKG8sZSl9aWYoMDxPaS5sZW5ndGgpe25hKE9pWzBdLGUpO2Zvcih2YXIgbj0xO248T2kubGVuZ3RoO24rKyl7dmFyIHI9T2lbbl07ci5ibG9ja2VkT249PT1lJiYoci5ibG9ja2VkT249bnVsbCl9fWZvcihabiE9PW51bGwmJm5hKFpuLGUpLGVyIT09bnVsbCYmbmEoZXIsZSksdHIhPT1udWxsJiZuYSh0cixlKSxFYS5mb3JFYWNoKHQpLFRhLmZvckVhY2godCksbj0wO248cW4ubGVuZ3RoO24rKylyPXFuW25dLHIuYmxvY2tlZE9uPT09ZSYmKHIuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDxxbi5sZW5ndGgmJihuPXFuWzBdLG4uYmxvY2tlZE9uPT09bnVsbCk7KV9tKG4pLG4uYmxvY2tlZE9uPT09bnVsbCYmcW4uc2hpZnQoKX12YXIgU289SW4uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsaXM9ITA7ZnVuY3Rpb24gaHcoZSx0LG4scil7dmFyIG89Z2UsYT1Tby50cmFuc2l0aW9uO1NvLnRyYW5zaXRpb249bnVsbDt0cnl7Z2U9MSxjYyhlLHQsbixyKX1maW5hbGx5e2dlPW8sU28udHJhbnNpdGlvbj1hfX1mdW5jdGlvbiBndyhlLHQsbixyKXt2YXIgbz1nZSxhPVNvLnRyYW5zaXRpb247U28udHJhbnNpdGlvbj1udWxsO3RyeXtnZT00LGNjKGUsdCxuLHIpfWZpbmFsbHl7Z2U9byxTby50cmFuc2l0aW9uPWF9fWZ1bmN0aW9uIGNjKGUsdCxuLHIpe2lmKGlzKXt2YXIgbz1OdShlLHQsbixyKTtpZihvPT09bnVsbClKbChlLHQscixzcyxuKSxuZihlLHIpO2Vsc2UgaWYoZncobyxlLHQsbixyKSlyLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYobmYoZSxyKSx0JjQmJi0xPHB3LmluZGV4T2YoZSkpe2Zvcig7byE9PW51bGw7KXt2YXIgYT0kYShvKTtpZihhIT09bnVsbCYmRW0oYSksYT1OdShlLHQsbixyKSxhPT09bnVsbCYmSmwoZSx0LHIsc3MsbiksYT09PW8pYnJlYWs7bz1hfW8hPT1udWxsJiZyLnN0b3BQcm9wYWdhdGlvbigpfWVsc2UgSmwoZSx0LHIsbnVsbCxuKX19dmFyIHNzPW51bGw7ZnVuY3Rpb24gTnUoZSx0LG4scil7aWYoc3M9bnVsbCxlPWljKHIpLGU9RHIoZSksZSE9PW51bGwpaWYodD1GcihlKSx0PT09bnVsbCllPW51bGw7ZWxzZSBpZihuPXQudGFnLG49PT0xMyl7aWYoZT1nbSh0KSxlIT09bnVsbClyZXR1cm4gZTtlPW51bGx9ZWxzZSBpZihuPT09Myl7aWYodC5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClyZXR1cm4gdC50YWc9PT0zP3Quc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtlPW51bGx9ZWxzZSB0IT09ZSYmKGU9bnVsbCk7cmV0dXJuIHNzPWUsbnVsbH1mdW5jdGlvbiBDbShlKXtzd2l0Y2goZSl7Y2FzZSJjYW5jZWwiOmNhc2UiY2xpY2siOmNhc2UiY2xvc2UiOmNhc2UiY29udGV4dG1lbnUiOmNhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0IjpjYXNlImlucHV0IjpjYXNlImludmFsaWQiOmNhc2Uia2V5ZG93biI6Y2FzZSJrZXlwcmVzcyI6Y2FzZSJrZXl1cCI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2V1cCI6Y2FzZSJwYXN0ZSI6Y2FzZSJwYXVzZSI6Y2FzZSJwbGF5IjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcnVwIjpjYXNlInJhdGVjaGFuZ2UiOmNhc2UicmVzZXQiOmNhc2UicmVzaXplIjpjYXNlInNlZWtlZCI6Y2FzZSJzdWJtaXQiOmNhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2hzdGFydCI6Y2FzZSJ2b2x1bWVjaGFuZ2UiOmNhc2UiY2hhbmdlIjpjYXNlInNlbGVjdGlvbmNoYW5nZSI6Y2FzZSJ0ZXh0SW5wdXQiOmNhc2UiY29tcG9zaXRpb25zdGFydCI6Y2FzZSJjb21wb3NpdGlvbmVuZCI6Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6Y2FzZSJiZWZvcmVpbnB1dCI6Y2FzZSJibHVyIjpjYXNlImZ1bGxzY3JlZW5jaGFuZ2UiOmNhc2UiZm9jdXMiOmNhc2UiaGFzaGNoYW5nZSI6Y2FzZSJwb3BzdGF0ZSI6Y2FzZSJzZWxlY3QiOmNhc2Uic2VsZWN0c3RhcnQiOnJldHVybiAxO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJzY3JvbGwiOmNhc2UidG9nZ2xlIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ3aGVlbCI6Y2FzZSJtb3VzZWVudGVyIjpjYXNlIm1vdXNlbGVhdmUiOmNhc2UicG9pbnRlcmVudGVyIjpjYXNlInBvaW50ZXJsZWF2ZSI6cmV0dXJuIDQ7Y2FzZSJtZXNzYWdlIjpzd2l0Y2gocncoKSl7Y2FzZSBzYzpyZXR1cm4gMTtjYXNlIGJtOnJldHVybiA0O2Nhc2Ugb3M6Y2FzZSBvdzpyZXR1cm4gMTY7Y2FzZSB4bTpyZXR1cm4gNTM2ODcwOTEyO2RlZmF1bHQ6cmV0dXJuIDE2fWRlZmF1bHQ6cmV0dXJuIDE2fX12YXIgSm49bnVsbCxkYz1udWxsLEdpPW51bGw7ZnVuY3Rpb24gQW0oKXtpZihHaSlyZXR1cm4gR2k7dmFyIGUsdD1kYyxuPXQubGVuZ3RoLHIsbz0idmFsdWUiaW4gSm4/Sm4udmFsdWU6Sm4udGV4dENvbnRlbnQsYT1vLmxlbmd0aDtmb3IoZT0wO2U8biYmdFtlXT09PW9bZV07ZSsrKTt2YXIgaT1uLWU7Zm9yKHI9MTtyPD1pJiZ0W24tcl09PT1vW2Etcl07cisrKTtyZXR1cm4gR2k9by5zbGljZShlLDE8cj8xLXI6dm9pZCAwKX1mdW5jdGlvbiBLaShlKXt2YXIgdD1lLmtleUNvZGU7cmV0dXJuImNoYXJDb2RlImluIGU/KGU9ZS5jaGFyQ29kZSxlPT09MCYmdD09PTEzJiYoZT0xMykpOmU9dCxlPT09MTAmJihlPTEzKSwzMjw9ZXx8ZT09PTEzP2U6MH1mdW5jdGlvbiBSaSgpe3JldHVybiEwfWZ1bmN0aW9uIG9mKCl7cmV0dXJuITF9ZnVuY3Rpb24gQXQoZSl7ZnVuY3Rpb24gdChuLHIsbyxhLGkpe3RoaXMuX3JlYWN0TmFtZT1uLHRoaXMuX3RhcmdldEluc3Q9byx0aGlzLnR5cGU9cix0aGlzLm5hdGl2ZUV2ZW50PWEsdGhpcy50YXJnZXQ9aSx0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbDtmb3IodmFyIHMgaW4gZSllLmhhc093blByb3BlcnR5KHMpJiYobj1lW3NdLHRoaXNbc109bj9uKGEpOmFbc10pO3JldHVybiB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0oYS5kZWZhdWx0UHJldmVudGVkIT1udWxsP2EuZGVmYXVsdFByZXZlbnRlZDphLnJldHVyblZhbHVlPT09ITEpP1JpOm9mLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9b2YsdGhpc31yZXR1cm4gSWUodC5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBuPXRoaXMubmF0aXZlRXZlbnQ7biYmKG4ucHJldmVudERlZmF1bHQ/bi5wcmV2ZW50RGVmYXVsdCgpOnR5cGVvZiBuLnJldHVyblZhbHVlIT0idW5rbm93biImJihuLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1SaSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBuPXRoaXMubmF0aXZlRXZlbnQ7biYmKG4uc3RvcFByb3BhZ2F0aW9uP24uc3RvcFByb3BhZ2F0aW9uKCk6dHlwZW9mIG4uY2FuY2VsQnViYmxlIT0idW5rbm93biImJihuLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1SaSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt9LGlzUGVyc2lzdGVudDpSaX0pLHR9dmFyIE1vPXtldmVudFBoYXNlOjAsYnViYmxlczowLGNhbmNlbGFibGU6MCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOjAsaXNUcnVzdGVkOjB9LHBjPUF0KE1vKSxVYT1JZSh7fSxNbyx7dmlldzowLGRldGFpbDowfSksdnc9QXQoVWEpLFZsLEdsLHJhLE5zPUllKHt9LFVhLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAscGFnZVg6MCxwYWdlWTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxnZXRNb2RpZmllclN0YXRlOmZjLGJ1dHRvbjowLGJ1dHRvbnM6MCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbGF0ZWRUYXJnZXQ9PT12b2lkIDA/ZS5mcm9tRWxlbWVudD09PWUuc3JjRWxlbWVudD9lLnRvRWxlbWVudDplLmZyb21FbGVtZW50OmUucmVsYXRlZFRhcmdldH0sbW92ZW1lbnRYOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFgiaW4gZT9lLm1vdmVtZW50WDooZSE9PXJhJiYocmEmJmUudHlwZT09PSJtb3VzZW1vdmUiPyhWbD1lLnNjcmVlblgtcmEuc2NyZWVuWCxHbD1lLnNjcmVlblktcmEuc2NyZWVuWSk6R2w9Vmw9MCxyYT1lKSxWbCl9LG1vdmVtZW50WTpmdW5jdGlvbihlKXtyZXR1cm4ibW92ZW1lbnRZImluIGU/ZS5tb3ZlbWVudFk6R2x9fSksYWY9QXQoTnMpLHl3PUllKHt9LE5zLHtkYXRhVHJhbnNmZXI6MH0pLHd3PUF0KHl3KSxidz1JZSh7fSxVYSx7cmVsYXRlZFRhcmdldDowfSksS2w9QXQoYncpLHh3PUllKHt9LE1vLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxrdz1BdCh4dyksU3c9SWUoe30sTW8se2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuImNsaXBib2FyZERhdGEiaW4gZT9lLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSksRXc9QXQoU3cpLFR3PUllKHt9LE1vLHtkYXRhOjB9KSxzZj1BdChUdyksTnc9e0VzYzoiRXNjYXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFycm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNvbnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LER3PXs4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50ZXIiLDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2NrIiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFycm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0MDoiQXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bUxvY2siLDE0NToiU2Nyb2xsTG9jayIsMjI0OiJNZXRhIn0sX3c9e0FsdDoiYWx0S2V5IixDb250cm9sOiJjdHJsS2V5IixNZXRhOiJtZXRhS2V5IixTaGlmdDoic2hpZnRLZXkifTtmdW5jdGlvbiBDdyhlKXt2YXIgdD10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiB0LmdldE1vZGlmaWVyU3RhdGU/dC5nZXRNb2RpZmllclN0YXRlKGUpOihlPV93W2VdKT8hIXRbZV06ITF9ZnVuY3Rpb24gZmMoKXtyZXR1cm4gQ3d9dmFyIEF3PUllKHt9LFVhLHtrZXk6ZnVuY3Rpb24oZSl7aWYoZS5rZXkpe3ZhciB0PU53W2Uua2V5XXx8ZS5rZXk7aWYodCE9PSJVbmlkZW50aWZpZWQiKXJldHVybiB0fXJldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiPyhlPUtpKGUpLGU9PT0xMz8iRW50ZXIiOlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9Ed1tlLmtleUNvZGVdfHwiVW5pZGVudGlmaWVkIjoiIn0sY29kZTowLGxvY2F0aW9uOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLHJlcGVhdDowLGxvY2FsZTowLGdldE1vZGlmaWVyU3RhdGU6ZmMsY2hhckNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/S2koZSk6MH0sa2V5Q29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP2Uua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9LaShlKTplLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9fSksT3c9QXQoQXcpLFJ3PUllKHt9LE5zLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pLGxmPUF0KFJ3KSxNdz1JZSh7fSxVYSx7dG91Y2hlczowLHRhcmdldFRvdWNoZXM6MCxjaGFuZ2VkVG91Y2hlczowLGFsdEtleTowLG1ldGFLZXk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxnZXRNb2RpZmllclN0YXRlOmZjfSksSXc9QXQoTXcpLFB3PUllKHt9LE1vLHtwcm9wZXJ0eU5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLEx3PUF0KFB3KSx6dz1JZSh7fSxOcyx7ZGVsdGFYOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVgiaW4gZT9lLmRlbHRhWDoid2hlZWxEZWx0YVgiaW4gZT8tZS53aGVlbERlbHRhWDowfSxkZWx0YVk6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWSJpbiBlP2UuZGVsdGFZOiJ3aGVlbERlbHRhWSJpbiBlPy1lLndoZWVsRGVsdGFZOiJ3aGVlbERlbHRhImluIGU/LWUud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLEZ3PUF0KHp3KSxVdz1bOSwxMywyNywzMl0sbWM9QW4mJiJDb21wb3NpdGlvbkV2ZW50ImluIHdpbmRvdyxtYT1udWxsO0FuJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYobWE9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTt2YXIgJHc9QW4mJiJUZXh0RXZlbnQiaW4gd2luZG93JiYhbWEsT209QW4mJighbWN8fG1hJiY4PG1hJiYxMT49bWEpLHVmPSIgIixjZj0hMTtmdW5jdGlvbiBSbShlLHQpe3N3aXRjaChlKXtjYXNlImtleXVwIjpyZXR1cm4gVXcuaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2FzZSJrZXlkb3duIjpyZXR1cm4gdC5rZXlDb2RlIT09MjI5O2Nhc2Uia2V5cHJlc3MiOmNhc2UibW91c2Vkb3duIjpjYXNlImZvY3Vzb3V0IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBNbShlKXtyZXR1cm4gZT1lLmRldGFpbCx0eXBlb2YgZT09Im9iamVjdCImJiJkYXRhImluIGU/ZS5kYXRhOm51bGx9dmFyIHVvPSExO2Z1bmN0aW9uIEJ3KGUsdCl7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBNbSh0KTtjYXNlImtleXByZXNzIjpyZXR1cm4gdC53aGljaCE9PTMyP251bGw6KGNmPSEwLHVmKTtjYXNlInRleHRJbnB1dCI6cmV0dXJuIGU9dC5kYXRhLGU9PT11ZiYmY2Y/bnVsbDplO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIFd3KGUsdCl7aWYodW8pcmV0dXJuIGU9PT0iY29tcG9zaXRpb25lbmQifHwhbWMmJlJtKGUsdCk/KGU9QW0oKSxHaT1kYz1Kbj1udWxsLHVvPSExLGUpOm51bGw7c3dpdGNoKGUpe2Nhc2UicGFzdGUiOnJldHVybiBudWxsO2Nhc2Uia2V5cHJlc3MiOmlmKCEodC5jdHJsS2V5fHx0LmFsdEtleXx8dC5tZXRhS2V5KXx8dC5jdHJsS2V5JiZ0LmFsdEtleSl7aWYodC5jaGFyJiYxPHQuY2hhci5sZW5ndGgpcmV0dXJuIHQuY2hhcjtpZih0LndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQud2hpY2gpfXJldHVybiBudWxsO2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBPbSYmdC5sb2NhbGUhPT0ia28iP251bGw6dC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBIdz17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gZGYoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0Ij8hIUh3W2UudHlwZV06dD09PSJ0ZXh0YXJlYSJ9ZnVuY3Rpb24gSW0oZSx0LG4scil7ZG0ociksdD1scyh0LCJvbkNoYW5nZSIpLDA8dC5sZW5ndGgmJihuPW5ldyBwYygib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsbixyKSxlLnB1c2goe2V2ZW50Om4sbGlzdGVuZXJzOnR9KSl9dmFyIGhhPW51bGwsRGE9bnVsbDtmdW5jdGlvbiBqdyhlKXtWbShlLDApfWZ1bmN0aW9uIERzKGUpe3ZhciB0PWZvKGUpO2lmKG9tKHQpKXJldHVybiBlfWZ1bmN0aW9uIFZ3KGUsdCl7aWYoZT09PSJjaGFuZ2UiKXJldHVybiB0fXZhciBQbT0hMTtBbiYmKEFuPyhJaT0ib25pbnB1dCJpbiBkb2N1bWVudCxJaXx8KFlsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFlsLnNldEF0dHJpYnV0ZSgib25pbnB1dCIsInJldHVybjsiKSxJaT10eXBlb2YgWWwub25pbnB1dD09ImZ1bmN0aW9uIiksTWk9SWkpOk1pPSExLFBtPU1pJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpKTt2YXIgTWksSWksWWw7ZnVuY3Rpb24gcGYoKXtoYSYmKGhhLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixMbSksRGE9aGE9bnVsbCl9ZnVuY3Rpb24gTG0oZSl7aWYoZS5wcm9wZXJ0eU5hbWU9PT0idmFsdWUiJiZEcyhEYSkpe3ZhciB0PVtdO0ltKHQsRGEsZSxpYyhlKSksaG0oancsdCl9fWZ1bmN0aW9uIEd3KGUsdCxuKXtlPT09ImZvY3VzaW4iPyhwZigpLGhhPXQsRGE9bixoYS5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsTG0pKTplPT09ImZvY3Vzb3V0IiYmcGYoKX1mdW5jdGlvbiBLdyhlKXtpZihlPT09InNlbGVjdGlvbmNoYW5nZSJ8fGU9PT0ia2V5dXAifHxlPT09ImtleWRvd24iKXJldHVybiBEcyhEYSl9ZnVuY3Rpb24gWXcoZSx0KXtpZihlPT09ImNsaWNrIilyZXR1cm4gRHModCl9ZnVuY3Rpb24gcXcoZSx0KXtpZihlPT09ImlucHV0Inx8ZT09PSJjaGFuZ2UiKXJldHVybiBEcyh0KX1mdW5jdGlvbiBRdyhlLHQpe3JldHVybiBlPT09dCYmKGUhPT0wfHwxL2U9PT0xL3QpfHxlIT09ZSYmdCE9PXR9dmFyIGVuPXR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOlF3O2Z1bmN0aW9uIF9hKGUsdCl7aWYoZW4oZSx0KSlyZXR1cm4hMDtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiExO3ZhciBuPU9iamVjdC5rZXlzKGUpLHI9T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO2lmKCFsdS5jYWxsKHQsbyl8fCFlbihlW29dLHRbb10pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGZmKGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBtZihlLHQpe3ZhciBuPWZmKGUpO2U9MDtmb3IodmFyIHI7bjspe2lmKG4ubm9kZVR5cGU9PT0zKXtpZihyPWUrbi50ZXh0Q29udGVudC5sZW5ndGgsZTw9dCYmcj49dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2U9cn1lOntmb3IoO247KXtpZihuLm5leHRTaWJsaW5nKXtuPW4ubmV4dFNpYmxpbmc7YnJlYWsgZX1uPW4ucGFyZW50Tm9kZX1uPXZvaWQgMH1uPWZmKG4pfX1mdW5jdGlvbiB6bShlLHQpe3JldHVybiBlJiZ0P2U9PT10PyEwOmUmJmUubm9kZVR5cGU9PT0zPyExOnQmJnQubm9kZVR5cGU9PT0zP3ptKGUsdC5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gZT9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSYxNik6ITE6ITF9ZnVuY3Rpb24gRm0oKXtmb3IodmFyIGU9d2luZG93LHQ9dHMoKTt0IGluc3RhbmNlb2YgZS5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgbj10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY9PSJzdHJpbmcifWNhdGNoe249ITF9aWYobillPXQuY29udGVudFdpbmRvdztlbHNlIGJyZWFrO3Q9dHMoZS5kb2N1bWVudCl9cmV0dXJuIHR9ZnVuY3Rpb24gaGMoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYodD09PSJpbnB1dCImJihlLnR5cGU9PT0idGV4dCJ8fGUudHlwZT09PSJzZWFyY2gifHxlLnR5cGU9PT0idGVsInx8ZS50eXBlPT09InVybCJ8fGUudHlwZT09PSJwYXNzd29yZCIpfHx0PT09InRleHRhcmVhInx8ZS5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpfWZ1bmN0aW9uIEp3KGUpe3ZhciB0PUZtKCksbj1lLmZvY3VzZWRFbGVtLHI9ZS5zZWxlY3Rpb25SYW5nZTtpZih0IT09biYmbiYmbi5vd25lckRvY3VtZW50JiZ6bShuLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4pKXtpZihyIT09bnVsbCYmaGMobikpe2lmKHQ9ci5zdGFydCxlPXIuZW5kLGU9PT12b2lkIDAmJihlPXQpLCJzZWxlY3Rpb25TdGFydCJpbiBuKW4uc2VsZWN0aW9uU3RhcnQ9dCxuLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihlLG4udmFsdWUubGVuZ3RoKTtlbHNlIGlmKGU9KHQ9bi5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnQuZGVmYXVsdFZpZXd8fHdpbmRvdyxlLmdldFNlbGVjdGlvbil7ZT1lLmdldFNlbGVjdGlvbigpO3ZhciBvPW4udGV4dENvbnRlbnQubGVuZ3RoLGE9TWF0aC5taW4oci5zdGFydCxvKTtyPXIuZW5kPT09dm9pZCAwP2E6TWF0aC5taW4oci5lbmQsbyksIWUuZXh0ZW5kJiZhPnImJihvPXIscj1hLGE9byksbz1tZihuLGEpO3ZhciBpPW1mKG4scik7byYmaSYmKGUucmFuZ2VDb3VudCE9PTF8fGUuYW5jaG9yTm9kZSE9PW8ubm9kZXx8ZS5hbmNob3JPZmZzZXQhPT1vLm9mZnNldHx8ZS5mb2N1c05vZGUhPT1pLm5vZGV8fGUuZm9jdXNPZmZzZXQhPT1pLm9mZnNldCkmJih0PXQuY3JlYXRlUmFuZ2UoKSx0LnNldFN0YXJ0KG8ubm9kZSxvLm9mZnNldCksZS5yZW1vdmVBbGxSYW5nZXMoKSxhPnI/KGUuYWRkUmFuZ2UodCksZS5leHRlbmQoaS5ub2RlLGkub2Zmc2V0KSk6KHQuc2V0RW5kKGkubm9kZSxpLm9mZnNldCksZS5hZGRSYW5nZSh0KSkpfX1mb3IodD1bXSxlPW47ZT1lLnBhcmVudE5vZGU7KWUubm9kZVR5cGU9PT0xJiZ0LnB1c2goe2VsZW1lbnQ6ZSxsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9KTtmb3IodHlwZW9mIG4uZm9jdXM9PSJmdW5jdGlvbiImJm4uZm9jdXMoKSxuPTA7bjx0Lmxlbmd0aDtuKyspZT10W25dLGUuZWxlbWVudC5zY3JvbGxMZWZ0PWUubGVmdCxlLmVsZW1lbnQuc2Nyb2xsVG9wPWUudG9wfX12YXIgWHc9QW4mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsY289bnVsbCxEdT1udWxsLGdhPW51bGwsX3U9ITE7ZnVuY3Rpb24gaGYoZSx0LG4pe3ZhciByPW4ud2luZG93PT09bj9uLmRvY3VtZW50Om4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50O191fHxjbz09bnVsbHx8Y28hPT10cyhyKXx8KHI9Y28sInNlbGVjdGlvblN0YXJ0ImluIHImJmhjKHIpP3I9e3N0YXJ0OnIuc2VsZWN0aW9uU3RhcnQsZW5kOnIuc2VsZWN0aW9uRW5kfToocj0oci5vd25lckRvY3VtZW50JiZyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCkscj17YW5jaG9yTm9kZTpyLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnIuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpyLmZvY3VzTm9kZSxmb2N1c09mZnNldDpyLmZvY3VzT2Zmc2V0fSksZ2EmJl9hKGdhLHIpfHwoZ2E9cixyPWxzKER1LCJvblNlbGVjdCIpLDA8ci5sZW5ndGgmJih0PW5ldyBwYygib25TZWxlY3QiLCJzZWxlY3QiLG51bGwsdCxuKSxlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOnJ9KSx0LnRhcmdldD1jbykpKX1mdW5jdGlvbiBQaShlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3Qsbn12YXIgcG89e2FuaW1hdGlvbmVuZDpQaSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOlBpKCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpQaSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOlBpKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxxbD17fSxVbT17fTtBbiYmKFVtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgcG8uYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgcG8uYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgcG8uYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIHBvLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gX3MoZSl7aWYocWxbZV0pcmV0dXJuIHFsW2VdO2lmKCFwb1tlXSlyZXR1cm4gZTt2YXIgdD1wb1tlXSxuO2ZvcihuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBVbSlyZXR1cm4gcWxbZV09dFtuXTtyZXR1cm4gZX12YXIgJG09X3MoImFuaW1hdGlvbmVuZCIpLEJtPV9zKCJhbmltYXRpb25pdGVyYXRpb24iKSxXbT1fcygiYW5pbWF0aW9uc3RhcnQiKSxIbT1fcygidHJhbnNpdGlvbmVuZCIpLGptPW5ldyBNYXAsZ2Y9ImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO2Z1bmN0aW9uIHVyKGUsdCl7am0uc2V0KGUsdCksenIodCxbZV0pfWZvcihMaT0wO0xpPGdmLmxlbmd0aDtMaSsrKXppPWdmW0xpXSx2Zj16aS50b0xvd2VyQ2FzZSgpLHlmPXppWzBdLnRvVXBwZXJDYXNlKCkremkuc2xpY2UoMSksdXIodmYsIm9uIit5Zik7dmFyIHppLHZmLHlmLExpO3VyKCRtLCJvbkFuaW1hdGlvbkVuZCIpO3VyKEJtLCJvbkFuaW1hdGlvbkl0ZXJhdGlvbiIpO3VyKFdtLCJvbkFuaW1hdGlvblN0YXJ0Iik7dXIoImRibGNsaWNrIiwib25Eb3VibGVDbGljayIpO3VyKCJmb2N1c2luIiwib25Gb2N1cyIpO3VyKCJmb2N1c291dCIsIm9uQmx1ciIpO3VyKEhtLCJvblRyYW5zaXRpb25FbmQiKTtObygib25Nb3VzZUVudGVyIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO05vKCJvbk1vdXNlTGVhdmUiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7Tm8oIm9uUG9pbnRlckVudGVyIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtObygib25Qb2ludGVyTGVhdmUiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO3pyKCJvbkNoYW5nZSIsImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTt6cigib25TZWxlY3QiLCJmb2N1c291dCBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzaW4ga2V5ZG93biBrZXl1cCBtb3VzZWRvd24gbW91c2V1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO3pyKCJvbkJlZm9yZUlucHV0IixbImNvbXBvc2l0aW9uZW5kIiwia2V5cHJlc3MiLCJ0ZXh0SW5wdXQiLCJwYXN0ZSJdKTt6cigib25Db21wb3NpdGlvbkVuZCIsImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt6cigib25Db21wb3NpdGlvblN0YXJ0IiwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7enIoIm9uQ29tcG9zaXRpb25VcGRhdGUiLCJjb21wb3NpdGlvbnVwZGF0ZSBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7dmFyIGRhPSJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZyIuc3BsaXQoIiAiKSxadz1uZXcgU2V0KCJjYW5jZWwgY2xvc2UgaW52YWxpZCBsb2FkIHNjcm9sbCB0b2dnbGUiLnNwbGl0KCIgIikuY29uY2F0KGRhKSk7ZnVuY3Rpb24gd2YoZSx0LG4pe3ZhciByPWUudHlwZXx8InVua25vd24tZXZlbnQiO2UuY3VycmVudFRhcmdldD1uLFowKHIsdCx2b2lkIDAsZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gVm0oZSx0KXt0PSh0JjQpIT09MDtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxvPXIuZXZlbnQ7cj1yLmxpc3RlbmVycztlOnt2YXIgYT12b2lkIDA7aWYodClmb3IodmFyIGk9ci5sZW5ndGgtMTswPD1pO2ktLSl7dmFyIHM9cltpXSxsPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQ7aWYocz1zLmxpc3RlbmVyLGwhPT1hJiZvLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTt3ZihvLHMsdSksYT1sfWVsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl7aWYocz1yW2ldLGw9cy5pbnN0YW5jZSx1PXMuY3VycmVudFRhcmdldCxzPXMubGlzdGVuZXIsbCE9PWEmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO3dmKG8scyx1KSxhPWx9fX1pZihycyl0aHJvdyBlPVN1LHJzPSExLFN1PW51bGwsZX1mdW5jdGlvbiBOZShlLHQpe3ZhciBuPXRbTXVdO249PT12b2lkIDAmJihuPXRbTXVdPW5ldyBTZXQpO3ZhciByPWUrIl9fYnViYmxlIjtuLmhhcyhyKXx8KEdtKHQsZSwyLCExKSxuLmFkZChyKSl9ZnVuY3Rpb24gUWwoZSx0LG4pe3ZhciByPTA7dCYmKHJ8PTQpLEdtKG4sZSxyLHQpfXZhciBGaT0iX3JlYWN0TGlzdGVuaW5nIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBDYShlKXtpZighZVtGaV0pe2VbRmldPSEwLFpmLmZvckVhY2goZnVuY3Rpb24obil7biE9PSJzZWxlY3Rpb25jaGFuZ2UiJiYoWncuaGFzKG4pfHxRbChuLCExLGUpLFFsKG4sITAsZSkpfSk7dmFyIHQ9ZS5ub2RlVHlwZT09PTk/ZTplLm93bmVyRG9jdW1lbnQ7dD09PW51bGx8fHRbRmldfHwodFtGaV09ITAsUWwoInNlbGVjdGlvbmNoYW5nZSIsITEsdCkpfX1mdW5jdGlvbiBHbShlLHQsbixyKXtzd2l0Y2goQ20odCkpe2Nhc2UgMTp2YXIgbz1odzticmVhaztjYXNlIDQ6bz1ndzticmVhaztkZWZhdWx0Om89Y2N9bj1vLmJpbmQobnVsbCx0LG4sZSksbz12b2lkIDAsIWt1fHx0IT09InRvdWNoc3RhcnQiJiZ0IT09InRvdWNobW92ZSImJnQhPT0id2hlZWwifHwobz0hMCkscj9vIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se2NhcHR1cmU6ITAscGFzc2l2ZTpvfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCk6byE9PXZvaWQgMD9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHtwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKX1mdW5jdGlvbiBKbChlLHQsbixyLG8pe3ZhciBhPXI7aWYoISh0JjEpJiYhKHQmMikmJnIhPT1udWxsKWU6Zm9yKDs7KXtpZihyPT09bnVsbClyZXR1cm47dmFyIGk9ci50YWc7aWYoaT09PTN8fGk9PT00KXt2YXIgcz1yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKHM9PT1vfHxzLm5vZGVUeXBlPT09OCYmcy5wYXJlbnROb2RlPT09bylicmVhaztpZihpPT09NClmb3IoaT1yLnJldHVybjtpIT09bnVsbDspe3ZhciBsPWkudGFnO2lmKChsPT09M3x8bD09PTQpJiYobD1pLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGw9PT1vfHxsLm5vZGVUeXBlPT09OCYmbC5wYXJlbnROb2RlPT09bykpcmV0dXJuO2k9aS5yZXR1cm59Zm9yKDtzIT09bnVsbDspe2lmKGk9RHIocyksaT09PW51bGwpcmV0dXJuO2lmKGw9aS50YWcsbD09PTV8fGw9PT02KXtyPWE9aTtjb250aW51ZSBlfXM9cy5wYXJlbnROb2RlfX1yPXIucmV0dXJufWhtKGZ1bmN0aW9uKCl7dmFyIHU9YSxjPWljKG4pLGQ9W107ZTp7dmFyIHA9am0uZ2V0KGUpO2lmKHAhPT12b2lkIDApe3ZhciBnPXBjLHY9ZTtzd2l0Y2goZSl7Y2FzZSJrZXlwcmVzcyI6aWYoS2kobik9PT0wKWJyZWFrIGU7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpnPU93O2JyZWFrO2Nhc2UiZm9jdXNpbiI6dj0iZm9jdXMiLGc9S2w7YnJlYWs7Y2FzZSJmb2N1c291dCI6dj0iYmx1ciIsZz1LbDticmVhaztjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpnPUtsO2JyZWFrO2Nhc2UiY2xpY2siOmlmKG4uYnV0dG9uPT09MilicmVhayBlO2Nhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZXVwIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJjb250ZXh0bWVudSI6Zz1hZjticmVhaztjYXNlImRyYWciOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpnPXd3O2JyZWFrO2Nhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2htb3ZlIjpjYXNlInRvdWNoc3RhcnQiOmc9SXc7YnJlYWs7Y2FzZSAkbTpjYXNlIEJtOmNhc2UgV206Zz1rdzticmVhaztjYXNlIEhtOmc9THc7YnJlYWs7Y2FzZSJzY3JvbGwiOmc9dnc7YnJlYWs7Y2FzZSJ3aGVlbCI6Zz1GdzticmVhaztjYXNlImNvcHkiOmNhc2UiY3V0IjpjYXNlInBhc3RlIjpnPUV3O2JyZWFrO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOmNhc2UibG9zdHBvaW50ZXJjYXB0dXJlIjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJwb2ludGVydXAiOmc9bGZ9dmFyIHk9KHQmNCkhPT0wLGI9IXkmJmU9PT0ic2Nyb2xsIixoPXk/cCE9PW51bGw/cCsiQ2FwdHVyZSI6bnVsbDpwO3k9W107Zm9yKHZhciBtPXUsdzttIT09bnVsbDspe3c9bTt2YXIgZj13LnN0YXRlTm9kZTtpZih3LnRhZz09PTUmJmYhPT1udWxsJiYodz1mLGghPT1udWxsJiYoZj1TYShtLGgpLGYhPW51bGwmJnkucHVzaChBYShtLGYsdykpKSksYilicmVhazttPW0ucmV0dXJufTA8eS5sZW5ndGgmJihwPW5ldyBnKHAsdixudWxsLG4sYyksZC5wdXNoKHtldmVudDpwLGxpc3RlbmVyczp5fSkpfX1pZighKHQmNykpe2U6e2lmKHA9ZT09PSJtb3VzZW92ZXIifHxlPT09InBvaW50ZXJvdmVyIixnPWU9PT0ibW91c2VvdXQifHxlPT09InBvaW50ZXJvdXQiLHAmJm4hPT1idSYmKHY9bi5yZWxhdGVkVGFyZ2V0fHxuLmZyb21FbGVtZW50KSYmKERyKHYpfHx2W09uXSkpYnJlYWsgZTtpZigoZ3x8cCkmJihwPWMud2luZG93PT09Yz9jOihwPWMub3duZXJEb2N1bWVudCk/cC5kZWZhdWx0Vmlld3x8cC5wYXJlbnRXaW5kb3c6d2luZG93LGc/KHY9bi5yZWxhdGVkVGFyZ2V0fHxuLnRvRWxlbWVudCxnPXUsdj12P0RyKHYpOm51bGwsdiE9PW51bGwmJihiPUZyKHYpLHYhPT1ifHx2LnRhZyE9PTUmJnYudGFnIT09NikmJih2PW51bGwpKTooZz1udWxsLHY9dSksZyE9PXYpKXtpZih5PWFmLGY9Im9uTW91c2VMZWF2ZSIsaD0ib25Nb3VzZUVudGVyIixtPSJtb3VzZSIsKGU9PT0icG9pbnRlcm91dCJ8fGU9PT0icG9pbnRlcm92ZXIiKSYmKHk9bGYsZj0ib25Qb2ludGVyTGVhdmUiLGg9Im9uUG9pbnRlckVudGVyIixtPSJwb2ludGVyIiksYj1nPT1udWxsP3A6Zm8oZyksdz12PT1udWxsP3A6Zm8odikscD1uZXcgeShmLG0rImxlYXZlIixnLG4sYykscC50YXJnZXQ9YixwLnJlbGF0ZWRUYXJnZXQ9dyxmPW51bGwsRHIoYyk9PT11JiYoeT1uZXcgeShoLG0rImVudGVyIix2LG4sYykseS50YXJnZXQ9dyx5LnJlbGF0ZWRUYXJnZXQ9YixmPXkpLGI9ZixnJiZ2KXQ6e2Zvcih5PWcsaD12LG09MCx3PXk7dzt3PWlvKHcpKW0rKztmb3Iodz0wLGY9aDtmO2Y9aW8oZikpdysrO2Zvcig7MDxtLXc7KXk9aW8oeSksbS0tO2Zvcig7MDx3LW07KWg9aW8oaCksdy0tO2Zvcig7bS0tOyl7aWYoeT09PWh8fGghPT1udWxsJiZ5PT09aC5hbHRlcm5hdGUpYnJlYWsgdDt5PWlvKHkpLGg9aW8oaCl9eT1udWxsfWVsc2UgeT1udWxsO2chPT1udWxsJiZiZihkLHAsZyx5LCExKSx2IT09bnVsbCYmYiE9PW51bGwmJmJmKGQsYix2LHksITApfX1lOntpZihwPXU/Zm8odSk6d2luZG93LGc9cC5ub2RlTmFtZSYmcC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGc9PT0ic2VsZWN0Inx8Zz09PSJpbnB1dCImJnAudHlwZT09PSJmaWxlIil2YXIgVD1WdztlbHNlIGlmKGRmKHApKWlmKFBtKVQ9cXc7ZWxzZXtUPUt3O3ZhciBTPUd3fWVsc2UoZz1wLm5vZGVOYW1lKSYmZy50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKHAudHlwZT09PSJjaGVja2JveCJ8fHAudHlwZT09PSJyYWRpbyIpJiYoVD1Zdyk7aWYoVCYmKFQ9VChlLHUpKSl7SW0oZCxULG4sYyk7YnJlYWsgZX1TJiZTKGUscCx1KSxlPT09ImZvY3Vzb3V0IiYmKFM9cC5fd3JhcHBlclN0YXRlKSYmUy5jb250cm9sbGVkJiZwLnR5cGU9PT0ibnVtYmVyIiYmaHUocCwibnVtYmVyIixwLnZhbHVlKX1zd2l0Y2goUz11P2ZvKHUpOndpbmRvdyxlKXtjYXNlImZvY3VzaW4iOihkZihTKXx8Uy5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpJiYoY289UyxEdT11LGdhPW51bGwpO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOmdhPUR1PWNvPW51bGw7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOl91PSEwO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOmNhc2UibW91c2V1cCI6Y2FzZSJkcmFnZW5kIjpfdT0hMSxoZihkLG4sYyk7YnJlYWs7Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmlmKFh3KWJyZWFrO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6aGYoZCxuLGMpfXZhciBEO2lmKG1jKWU6e3N3aXRjaChlKXtjYXNlImNvbXBvc2l0aW9uc3RhcnQiOnZhciBOPSJvbkNvbXBvc2l0aW9uU3RhcnQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbmVuZCI6Tj0ib25Db21wb3NpdGlvbkVuZCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpOPSJvbkNvbXBvc2l0aW9uVXBkYXRlIjticmVhayBlfU49dm9pZCAwfWVsc2UgdW8/Um0oZSxuKSYmKE49Im9uQ29tcG9zaXRpb25FbmQiKTplPT09ImtleWRvd24iJiZuLmtleUNvZGU9PT0yMjkmJihOPSJvbkNvbXBvc2l0aW9uU3RhcnQiKTtOJiYoT20mJm4ubG9jYWxlIT09ImtvIiYmKHVvfHxOIT09Im9uQ29tcG9zaXRpb25TdGFydCI/Tj09PSJvbkNvbXBvc2l0aW9uRW5kIiYmdW8mJihEPUFtKCkpOihKbj1jLGRjPSJ2YWx1ZSJpbiBKbj9Kbi52YWx1ZTpKbi50ZXh0Q29udGVudCx1bz0hMCkpLFM9bHModSxOKSwwPFMubGVuZ3RoJiYoTj1uZXcgc2YoTixlLG51bGwsbixjKSxkLnB1c2goe2V2ZW50Ok4sbGlzdGVuZXJzOlN9KSxEP04uZGF0YT1EOihEPU1tKG4pLEQhPT1udWxsJiYoTi5kYXRhPUQpKSkpLChEPSR3P0J3KGUsbik6V3coZSxuKSkmJih1PWxzKHUsIm9uQmVmb3JlSW5wdXQiKSwwPHUubGVuZ3RoJiYoYz1uZXcgc2YoIm9uQmVmb3JlSW5wdXQiLCJiZWZvcmVpbnB1dCIsbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6YyxsaXN0ZW5lcnM6dX0pLGMuZGF0YT1EKSl9Vm0oZCx0KX0pfWZ1bmN0aW9uIEFhKGUsdCxuKXtyZXR1cm57aW5zdGFuY2U6ZSxsaXN0ZW5lcjp0LGN1cnJlbnRUYXJnZXQ6bn19ZnVuY3Rpb24gbHMoZSx0KXtmb3IodmFyIG49dCsiQ2FwdHVyZSIscj1bXTtlIT09bnVsbDspe3ZhciBvPWUsYT1vLnN0YXRlTm9kZTtvLnRhZz09PTUmJmEhPT1udWxsJiYobz1hLGE9U2EoZSxuKSxhIT1udWxsJiZyLnVuc2hpZnQoQWEoZSxhLG8pKSxhPVNhKGUsdCksYSE9bnVsbCYmci5wdXNoKEFhKGUsYSxvKSkpLGU9ZS5yZXR1cm59cmV0dXJuIHJ9ZnVuY3Rpb24gaW8oZSl7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7ZG8gZT1lLnJldHVybjt3aGlsZShlJiZlLnRhZyE9PTUpO3JldHVybiBlfHxudWxsfWZ1bmN0aW9uIGJmKGUsdCxuLHIsbyl7Zm9yKHZhciBhPXQuX3JlYWN0TmFtZSxpPVtdO24hPT1udWxsJiZuIT09cjspe3ZhciBzPW4sbD1zLmFsdGVybmF0ZSx1PXMuc3RhdGVOb2RlO2lmKGwhPT1udWxsJiZsPT09cilicmVhaztzLnRhZz09PTUmJnUhPT1udWxsJiYocz11LG8/KGw9U2EobixhKSxsIT1udWxsJiZpLnVuc2hpZnQoQWEobixsLHMpKSk6b3x8KGw9U2EobixhKSxsIT1udWxsJiZpLnB1c2goQWEobixsLHMpKSkpLG49bi5yZXR1cm59aS5sZW5ndGghPT0wJiZlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOml9KX12YXIgZWI9L1xyXG4/L2csdGI9L1x1MDAwMHxcdUZGRkQvZztmdW5jdGlvbiB4ZihlKXtyZXR1cm4odHlwZW9mIGU9PSJzdHJpbmciP2U6IiIrZSkucmVwbGFjZShlYixgCmApLnJlcGxhY2UodGIsIiIpfWZ1bmN0aW9uIFVpKGUsdCxuKXtpZih0PXhmKHQpLHhmKGUpIT09dCYmbil0aHJvdyBFcnJvcihJKDQyNSkpfWZ1bmN0aW9uIHVzKCl7fXZhciBDdT1udWxsLEF1PW51bGw7ZnVuY3Rpb24gT3UoZSx0KXtyZXR1cm4gZT09PSJ0ZXh0YXJlYSJ8fGU9PT0ibm9zY3JpcHQifHx0eXBlb2YgdC5jaGlsZHJlbj09InN0cmluZyJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ibnVtYmVyInx8dHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9PSJvYmplY3QiJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT09bnVsbCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwhPW51bGx9dmFyIFJ1PXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6dm9pZCAwLG5iPXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0OnZvaWQgMCxrZj10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlOnZvaWQgMCxyYj10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6dHlwZW9mIGtmPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4ga2YucmVzb2x2ZShudWxsKS50aGVuKGUpLmNhdGNoKG9iKX06UnU7ZnVuY3Rpb24gb2IoZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX1mdW5jdGlvbiBYbChlLHQpe3ZhciBuPXQscj0wO2Rve3ZhciBvPW4ubmV4dFNpYmxpbmc7aWYoZS5yZW1vdmVDaGlsZChuKSxvJiZvLm5vZGVUeXBlPT09OClpZihuPW8uZGF0YSxuPT09Ii8kIil7aWYocj09PTApe2UucmVtb3ZlQ2hpbGQobyksTmEodCk7cmV0dXJufXItLX1lbHNlIG4hPT0iJCImJm4hPT0iJD8iJiZuIT09IiQhInx8cisrO249b313aGlsZShuKTtOYSh0KX1mdW5jdGlvbiBucihlKXtmb3IoO2UhPW51bGw7ZT1lLm5leHRTaWJsaW5nKXt2YXIgdD1lLm5vZGVUeXBlO2lmKHQ9PT0xfHx0PT09MylicmVhaztpZih0PT09OCl7aWYodD1lLmRhdGEsdD09PSIkInx8dD09PSIkISJ8fHQ9PT0iJD8iKWJyZWFrO2lmKHQ9PT0iLyQiKXJldHVybiBudWxsfX1yZXR1cm4gZX1mdW5jdGlvbiBTZihlKXtlPWUucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iJCJ8fG49PT0iJCEifHxuPT09IiQ/Iil7aWYodD09PTApcmV0dXJuIGU7dC0tfWVsc2Ugbj09PSIvJCImJnQrK31lPWUucHJldmlvdXNTaWJsaW5nfXJldHVybiBudWxsfXZhciBJbz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxobj0iX19yZWFjdEZpYmVyJCIrSW8sT2E9Il9fcmVhY3RQcm9wcyQiK0lvLE9uPSJfX3JlYWN0Q29udGFpbmVyJCIrSW8sTXU9Il9fcmVhY3RFdmVudHMkIitJbyxhYj0iX19yZWFjdExpc3RlbmVycyQiK0lvLGliPSJfX3JlYWN0SGFuZGxlcyQiK0lvO2Z1bmN0aW9uIERyKGUpe3ZhciB0PWVbaG5dO2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciBuPWUucGFyZW50Tm9kZTtuOyl7aWYodD1uW09uXXx8bltobl0pe2lmKG49dC5hbHRlcm5hdGUsdC5jaGlsZCE9PW51bGx8fG4hPT1udWxsJiZuLmNoaWxkIT09bnVsbClmb3IoZT1TZihlKTtlIT09bnVsbDspe2lmKG49ZVtobl0pcmV0dXJuIG47ZT1TZihlKX1yZXR1cm4gdH1lPW4sbj1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gJGEoZSl7cmV0dXJuIGU9ZVtobl18fGVbT25dLCFlfHxlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xMyYmZS50YWchPT0zP251bGw6ZX1mdW5jdGlvbiBmbyhlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IoSSgzMykpfWZ1bmN0aW9uIENzKGUpe3JldHVybiBlW09hXXx8bnVsbH12YXIgSXU9W10sbW89LTE7ZnVuY3Rpb24gY3IoZSl7cmV0dXJue2N1cnJlbnQ6ZX19ZnVuY3Rpb24gRGUoZSl7MD5tb3x8KGUuY3VycmVudD1JdVttb10sSXVbbW9dPW51bGwsbW8tLSl9ZnVuY3Rpb24gU2UoZSx0KXttbysrLEl1W21vXT1lLmN1cnJlbnQsZS5jdXJyZW50PXR9dmFyIGxyPXt9LGl0PWNyKGxyKSx5dD1jcighMSksUnI9bHI7ZnVuY3Rpb24gRG8oZSx0KXt2YXIgbj1lLnR5cGUuY29udGV4dFR5cGVzO2lmKCFuKXJldHVybiBscjt2YXIgcj1lLnN0YXRlTm9kZTtpZihyJiZyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT10KXJldHVybiByLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBvPXt9LGE7Zm9yKGEgaW4gbilvW2FdPXRbYV07cmV0dXJuIHImJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD10LGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9byksb31mdW5jdGlvbiB3dChlKXtyZXR1cm4gZT1lLmNoaWxkQ29udGV4dFR5cGVzLGUhPW51bGx9ZnVuY3Rpb24gY3MoKXtEZSh5dCksRGUoaXQpfWZ1bmN0aW9uIEVmKGUsdCxuKXtpZihpdC5jdXJyZW50IT09bHIpdGhyb3cgRXJyb3IoSSgxNjgpKTtTZShpdCx0KSxTZSh5dCxuKX1mdW5jdGlvbiBLbShlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYodD10LmNoaWxkQ29udGV4dFR5cGVzLHR5cGVvZiByLmdldENoaWxkQ29udGV4dCE9ImZ1bmN0aW9uIilyZXR1cm4gbjtyPXIuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBvIGluIHIpaWYoIShvIGluIHQpKXRocm93IEVycm9yKEkoMTA4LEcwKGUpfHwiVW5rbm93biIsbykpO3JldHVybiBJZSh7fSxuLHIpfWZ1bmN0aW9uIGRzKGUpe3JldHVybiBlPShlPWUuc3RhdGVOb2RlKSYmZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8bHIsUnI9aXQuY3VycmVudCxTZShpdCxlKSxTZSh5dCx5dC5jdXJyZW50KSwhMH1mdW5jdGlvbiBUZihlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYoIXIpdGhyb3cgRXJyb3IoSSgxNjkpKTtuPyhlPUttKGUsdCxSciksci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1lLERlKHl0KSxEZShpdCksU2UoaXQsZSkpOkRlKHl0KSxTZSh5dCxuKX12YXIgTm49bnVsbCxBcz0hMSxabD0hMTtmdW5jdGlvbiBZbShlKXtObj09PW51bGw/Tm49W2VdOk5uLnB1c2goZSl9ZnVuY3Rpb24gc2IoZSl7QXM9ITAsWW0oZSl9ZnVuY3Rpb24gZHIoKXtpZighWmwmJk5uIT09bnVsbCl7Wmw9ITA7dmFyIGU9MCx0PWdlO3RyeXt2YXIgbj1Objtmb3IoZ2U9MTtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtkbyByPXIoITApO3doaWxlKHIhPT1udWxsKX1Obj1udWxsLEFzPSExfWNhdGNoKG8pe3Rocm93IE5uIT09bnVsbCYmKE5uPU5uLnNsaWNlKGUrMSkpLHdtKHNjLGRyKSxvfWZpbmFsbHl7Z2U9dCxabD0hMX19cmV0dXJuIG51bGx9dmFyIGhvPVtdLGdvPTAscHM9bnVsbCxmcz0wLEx0PVtdLHp0PTAsTXI9bnVsbCxEbj0xLF9uPSIiO2Z1bmN0aW9uIFRyKGUsdCl7aG9bZ28rK109ZnMsaG9bZ28rK109cHMscHM9ZSxmcz10fWZ1bmN0aW9uIHFtKGUsdCxuKXtMdFt6dCsrXT1EbixMdFt6dCsrXT1fbixMdFt6dCsrXT1NcixNcj1lO3ZhciByPURuO2U9X247dmFyIG89MzItWHQociktMTtyJj1+KDE8PG8pLG4rPTE7dmFyIGE9MzItWHQodCkrbztpZigzMDxhKXt2YXIgaT1vLW8lNTthPShyJigxPDxpKS0xKS50b1N0cmluZygzMikscj4+PWksby09aSxEbj0xPDwzMi1YdCh0KStvfG48PG98cixfbj1hK2V9ZWxzZSBEbj0xPDxhfG48PG98cixfbj1lfWZ1bmN0aW9uIGdjKGUpe2UucmV0dXJuIT09bnVsbCYmKFRyKGUsMSkscW0oZSwxLDApKX1mdW5jdGlvbiB2YyhlKXtmb3IoO2U9PT1wczspcHM9aG9bLS1nb10saG9bZ29dPW51bGwsZnM9aG9bLS1nb10saG9bZ29dPW51bGw7Zm9yKDtlPT09TXI7KU1yPUx0Wy0tenRdLEx0W3p0XT1udWxsLF9uPUx0Wy0tenRdLEx0W3p0XT1udWxsLERuPUx0Wy0tenRdLEx0W3p0XT1udWxsfXZhciBfdD1udWxsLER0PW51bGwsQWU9ITEsSnQ9bnVsbDtmdW5jdGlvbiBRbShlLHQpe3ZhciBuPUZ0KDUsbnVsbCxudWxsLDApO24uZWxlbWVudFR5cGU9IkRFTEVURUQiLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSx0PWUuZGVsZXRpb25zLHQ9PT1udWxsPyhlLmRlbGV0aW9ucz1bbl0sZS5mbGFnc3w9MTYpOnQucHVzaChuKX1mdW5jdGlvbiBOZihlLHQpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnZhciBuPWUudHlwZTtyZXR1cm4gdD10Lm5vZGVUeXBlIT09MXx8bi50b0xvd2VyQ2FzZSgpIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxfdD1lLER0PW5yKHQuZmlyc3RDaGlsZCksITApOiExO2Nhc2UgNjpyZXR1cm4gdD1lLnBlbmRpbmdQcm9wcz09PSIifHx0Lm5vZGVUeXBlIT09Mz9udWxsOnQsdCE9PW51bGw/KGUuc3RhdGVOb2RlPXQsX3Q9ZSxEdD1udWxsLCEwKTohMTtjYXNlIDEzOnJldHVybiB0PXQubm9kZVR5cGUhPT04P251bGw6dCx0IT09bnVsbD8obj1NciE9PW51bGw/e2lkOkRuLG92ZXJmbG93Ol9ufTpudWxsLGUubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDp0LHRyZWVDb250ZXh0Om4scmV0cnlMYW5lOjEwNzM3NDE4MjR9LG49RnQoMTgsbnVsbCxudWxsLDApLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSxlLmNoaWxkPW4sX3Q9ZSxEdD1udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBQdShlKXtyZXR1cm4oZS5tb2RlJjEpIT09MCYmKGUuZmxhZ3MmMTI4KT09PTB9ZnVuY3Rpb24gTHUoZSl7aWYoQWUpe3ZhciB0PUR0O2lmKHQpe3ZhciBuPXQ7aWYoIU5mKGUsdCkpe2lmKFB1KGUpKXRocm93IEVycm9yKEkoNDE4KSk7dD1ucihuLm5leHRTaWJsaW5nKTt2YXIgcj1fdDt0JiZOZihlLHQpP1FtKHIsbik6KGUuZmxhZ3M9ZS5mbGFncyYtNDA5N3wyLEFlPSExLF90PWUpfX1lbHNle2lmKFB1KGUpKXRocm93IEVycm9yKEkoNDE4KSk7ZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsQWU9ITEsX3Q9ZX19fWZ1bmN0aW9uIERmKGUpe2ZvcihlPWUucmV0dXJuO2UhPT1udWxsJiZlLnRhZyE9PTUmJmUudGFnIT09MyYmZS50YWchPT0xMzspZT1lLnJldHVybjtfdD1lfWZ1bmN0aW9uICRpKGUpe2lmKGUhPT1fdClyZXR1cm4hMTtpZighQWUpcmV0dXJuIERmKGUpLEFlPSEwLCExO3ZhciB0O2lmKCh0PWUudGFnIT09MykmJiEodD1lLnRhZyE9PTUpJiYodD1lLnR5cGUsdD10IT09ImhlYWQiJiZ0IT09ImJvZHkiJiYhT3UoZS50eXBlLGUubWVtb2l6ZWRQcm9wcykpLHQmJih0PUR0KSl7aWYoUHUoZSkpdGhyb3cgSm0oKSxFcnJvcihJKDQxOCkpO2Zvcig7dDspUW0oZSx0KSx0PW5yKHQubmV4dFNpYmxpbmcpfWlmKERmKGUpLGUudGFnPT09MTMpe2lmKGU9ZS5tZW1vaXplZFN0YXRlLGU9ZSE9PW51bGw/ZS5kZWh5ZHJhdGVkOm51bGwsIWUpdGhyb3cgRXJyb3IoSSgzMTcpKTtlOntmb3IoZT1lLm5leHRTaWJsaW5nLHQ9MDtlOyl7aWYoZS5ub2RlVHlwZT09PTgpe3ZhciBuPWUuZGF0YTtpZihuPT09Ii8kIil7aWYodD09PTApe0R0PW5yKGUubmV4dFNpYmxpbmcpO2JyZWFrIGV9dC0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkISImJm4hPT0iJD8ifHx0Kyt9ZT1lLm5leHRTaWJsaW5nfUR0PW51bGx9fWVsc2UgRHQ9X3Q/bnIoZS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gSm0oKXtmb3IodmFyIGU9RHQ7ZTspZT1ucihlLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBfbygpe0R0PV90PW51bGwsQWU9ITF9ZnVuY3Rpb24geWMoZSl7SnQ9PT1udWxsP0p0PVtlXTpKdC5wdXNoKGUpfXZhciBsYj1Jbi5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztmdW5jdGlvbiBvYShlLHQsbil7aWYoZT1uLnJlZixlIT09bnVsbCYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJnR5cGVvZiBlIT0ib2JqZWN0Iil7aWYobi5fb3duZXIpe2lmKG49bi5fb3duZXIsbil7aWYobi50YWchPT0xKXRocm93IEVycm9yKEkoMzA5KSk7dmFyIHI9bi5zdGF0ZU5vZGV9aWYoIXIpdGhyb3cgRXJyb3IoSSgxNDcsZSkpO3ZhciBvPXIsYT0iIitlO3JldHVybiB0IT09bnVsbCYmdC5yZWYhPT1udWxsJiZ0eXBlb2YgdC5yZWY9PSJmdW5jdGlvbiImJnQucmVmLl9zdHJpbmdSZWY9PT1hP3QucmVmOih0PWZ1bmN0aW9uKGkpe3ZhciBzPW8ucmVmcztpPT09bnVsbD9kZWxldGUgc1thXTpzW2FdPWl9LHQuX3N0cmluZ1JlZj1hLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihJKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihJKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gQmkoZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihJKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gX2YoZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiBYbShlKXtmdW5jdGlvbiB0KGgsbSl7aWYoZSl7dmFyIHc9aC5kZWxldGlvbnM7dz09PW51bGw/KGguZGVsZXRpb25zPVttXSxoLmZsYWdzfD0xNik6dy5wdXNoKG0pfX1mdW5jdGlvbiBuKGgsbSl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDttIT09bnVsbDspdChoLG0pLG09bS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIoaCxtKXtmb3IoaD1uZXcgTWFwO20hPT1udWxsOyltLmtleSE9PW51bGw/aC5zZXQobS5rZXksbSk6aC5zZXQobS5pbmRleCxtKSxtPW0uc2libGluZztyZXR1cm4gaH1mdW5jdGlvbiBvKGgsbSl7cmV0dXJuIGg9aXIoaCxtKSxoLmluZGV4PTAsaC5zaWJsaW5nPW51bGwsaH1mdW5jdGlvbiBhKGgsbSx3KXtyZXR1cm4gaC5pbmRleD13LGU/KHc9aC5hbHRlcm5hdGUsdyE9PW51bGw/KHc9dy5pbmRleCx3PG0/KGguZmxhZ3N8PTIsbSk6dyk6KGguZmxhZ3N8PTIsbSkpOihoLmZsYWdzfD0xMDQ4NTc2LG0pfWZ1bmN0aW9uIGkoaCl7cmV0dXJuIGUmJmguYWx0ZXJuYXRlPT09bnVsbCYmKGguZmxhZ3N8PTIpLGh9ZnVuY3Rpb24gcyhoLG0sdyxmKXtyZXR1cm4gbT09PW51bGx8fG0udGFnIT09Nj8obT1pdSh3LGgubW9kZSxmKSxtLnJldHVybj1oLG0pOihtPW8obSx3KSxtLnJldHVybj1oLG0pfWZ1bmN0aW9uIGwoaCxtLHcsZil7dmFyIFQ9dy50eXBlO3JldHVybiBUPT09bG8/YyhoLG0sdy5wcm9wcy5jaGlsZHJlbixmLHcua2V5KTptIT09bnVsbCYmKG0uZWxlbWVudFR5cGU9PT1UfHx0eXBlb2YgVD09Im9iamVjdCImJlQhPT1udWxsJiZULiQkdHlwZW9mPT09S24mJl9mKFQpPT09bS50eXBlKT8oZj1vKG0sdy5wcm9wcyksZi5yZWY9b2EoaCxtLHcpLGYucmV0dXJuPWgsZik6KGY9ZXMody50eXBlLHcua2V5LHcucHJvcHMsbnVsbCxoLm1vZGUsZiksZi5yZWY9b2EoaCxtLHcpLGYucmV0dXJuPWgsZil9ZnVuY3Rpb24gdShoLG0sdyxmKXtyZXR1cm4gbT09PW51bGx8fG0udGFnIT09NHx8bS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PXcuY29udGFpbmVySW5mb3x8bS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT13LmltcGxlbWVudGF0aW9uPyhtPXN1KHcsaC5tb2RlLGYpLG0ucmV0dXJuPWgsbSk6KG09byhtLHcuY2hpbGRyZW58fFtdKSxtLnJldHVybj1oLG0pfWZ1bmN0aW9uIGMoaCxtLHcsZixUKXtyZXR1cm4gbT09PW51bGx8fG0udGFnIT09Nz8obT1Pcih3LGgubW9kZSxmLFQpLG0ucmV0dXJuPWgsbSk6KG09byhtLHcpLG0ucmV0dXJuPWgsbSl9ZnVuY3Rpb24gZChoLG0sdyl7aWYodHlwZW9mIG09PSJzdHJpbmciJiZtIT09IiJ8fHR5cGVvZiBtPT0ibnVtYmVyIilyZXR1cm4gbT1pdSgiIittLGgubW9kZSx3KSxtLnJldHVybj1oLG07aWYodHlwZW9mIG09PSJvYmplY3QiJiZtIT09bnVsbCl7c3dpdGNoKG0uJCR0eXBlb2Ype2Nhc2UgTmk6cmV0dXJuIHc9ZXMobS50eXBlLG0ua2V5LG0ucHJvcHMsbnVsbCxoLm1vZGUsdyksdy5yZWY9b2EoaCxudWxsLG0pLHcucmV0dXJuPWgsdztjYXNlIHNvOnJldHVybiBtPXN1KG0saC5tb2RlLHcpLG0ucmV0dXJuPWgsbTtjYXNlIEtuOnZhciBmPW0uX2luaXQ7cmV0dXJuIGQoaCxmKG0uX3BheWxvYWQpLHcpfWlmKHVhKG0pfHxlYShtKSlyZXR1cm4gbT1PcihtLGgubW9kZSx3LG51bGwpLG0ucmV0dXJuPWgsbTtCaShoLG0pfXJldHVybiBudWxsfWZ1bmN0aW9uIHAoaCxtLHcsZil7dmFyIFQ9bSE9PW51bGw/bS5rZXk6bnVsbDtpZih0eXBlb2Ygdz09InN0cmluZyImJnchPT0iInx8dHlwZW9mIHc9PSJudW1iZXIiKXJldHVybiBUIT09bnVsbD9udWxsOnMoaCxtLCIiK3csZik7aWYodHlwZW9mIHc9PSJvYmplY3QiJiZ3IT09bnVsbCl7c3dpdGNoKHcuJCR0eXBlb2Ype2Nhc2UgTmk6cmV0dXJuIHcua2V5PT09VD9sKGgsbSx3LGYpOm51bGw7Y2FzZSBzbzpyZXR1cm4gdy5rZXk9PT1UP3UoaCxtLHcsZik6bnVsbDtjYXNlIEtuOnJldHVybiBUPXcuX2luaXQscChoLG0sVCh3Ll9wYXlsb2FkKSxmKX1pZih1YSh3KXx8ZWEodykpcmV0dXJuIFQhPT1udWxsP251bGw6YyhoLG0sdyxmLG51bGwpO0JpKGgsdyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZyhoLG0sdyxmLFQpe2lmKHR5cGVvZiBmPT0ic3RyaW5nIiYmZiE9PSIifHx0eXBlb2YgZj09Im51bWJlciIpcmV0dXJuIGg9aC5nZXQodyl8fG51bGwscyhtLGgsIiIrZixUKTtpZih0eXBlb2YgZj09Im9iamVjdCImJmYhPT1udWxsKXtzd2l0Y2goZi4kJHR5cGVvZil7Y2FzZSBOaTpyZXR1cm4gaD1oLmdldChmLmtleT09PW51bGw/dzpmLmtleSl8fG51bGwsbChtLGgsZixUKTtjYXNlIHNvOnJldHVybiBoPWguZ2V0KGYua2V5PT09bnVsbD93OmYua2V5KXx8bnVsbCx1KG0saCxmLFQpO2Nhc2UgS246dmFyIFM9Zi5faW5pdDtyZXR1cm4gZyhoLG0sdyxTKGYuX3BheWxvYWQpLFQpfWlmKHVhKGYpfHxlYShmKSlyZXR1cm4gaD1oLmdldCh3KXx8bnVsbCxjKG0saCxmLFQsbnVsbCk7QmkobSxmKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB2KGgsbSx3LGYpe2Zvcih2YXIgVD1udWxsLFM9bnVsbCxEPW0sTj1tPTAsQz1udWxsO0QhPT1udWxsJiZOPHcubGVuZ3RoO04rKyl7RC5pbmRleD5OPyhDPUQsRD1udWxsKTpDPUQuc2libGluZzt2YXIgeD1wKGgsRCx3W05dLGYpO2lmKHg9PT1udWxsKXtEPT09bnVsbCYmKEQ9Qyk7YnJlYWt9ZSYmRCYmeC5hbHRlcm5hdGU9PT1udWxsJiZ0KGgsRCksbT1hKHgsbSxOKSxTPT09bnVsbD9UPXg6Uy5zaWJsaW5nPXgsUz14LEQ9Q31pZihOPT09dy5sZW5ndGgpcmV0dXJuIG4oaCxEKSxBZSYmVHIoaCxOKSxUO2lmKEQ9PT1udWxsKXtmb3IoO048dy5sZW5ndGg7TisrKUQ9ZChoLHdbTl0sZiksRCE9PW51bGwmJihtPWEoRCxtLE4pLFM9PT1udWxsP1Q9RDpTLnNpYmxpbmc9RCxTPUQpO3JldHVybiBBZSYmVHIoaCxOKSxUfWZvcihEPXIoaCxEKTtOPHcubGVuZ3RoO04rKylDPWcoRCxoLE4sd1tOXSxmKSxDIT09bnVsbCYmKGUmJkMuYWx0ZXJuYXRlIT09bnVsbCYmRC5kZWxldGUoQy5rZXk9PT1udWxsP046Qy5rZXkpLG09YShDLG0sTiksUz09PW51bGw/VD1DOlMuc2libGluZz1DLFM9Qyk7cmV0dXJuIGUmJkQuZm9yRWFjaChmdW5jdGlvbihNKXtyZXR1cm4gdChoLE0pfSksQWUmJlRyKGgsTiksVH1mdW5jdGlvbiB5KGgsbSx3LGYpe3ZhciBUPWVhKHcpO2lmKHR5cGVvZiBUIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKEkoMTUwKSk7aWYodz1ULmNhbGwodyksdz09bnVsbCl0aHJvdyBFcnJvcihJKDE1MSkpO2Zvcih2YXIgUz1UPW51bGwsRD1tLE49bT0wLEM9bnVsbCx4PXcubmV4dCgpO0QhPT1udWxsJiYheC5kb25lO04rKyx4PXcubmV4dCgpKXtELmluZGV4Pk4/KEM9RCxEPW51bGwpOkM9RC5zaWJsaW5nO3ZhciBNPXAoaCxELHgudmFsdWUsZik7aWYoTT09PW51bGwpe0Q9PT1udWxsJiYoRD1DKTticmVha31lJiZEJiZNLmFsdGVybmF0ZT09PW51bGwmJnQoaCxEKSxtPWEoTSxtLE4pLFM9PT1udWxsP1Q9TTpTLnNpYmxpbmc9TSxTPU0sRD1DfWlmKHguZG9uZSlyZXR1cm4gbihoLEQpLEFlJiZUcihoLE4pLFQ7aWYoRD09PW51bGwpe2Zvcig7IXguZG9uZTtOKysseD13Lm5leHQoKSl4PWQoaCx4LnZhbHVlLGYpLHghPT1udWxsJiYobT1hKHgsbSxOKSxTPT09bnVsbD9UPXg6Uy5zaWJsaW5nPXgsUz14KTtyZXR1cm4gQWUmJlRyKGgsTiksVH1mb3IoRD1yKGgsRCk7IXguZG9uZTtOKysseD13Lm5leHQoKSl4PWcoRCxoLE4seC52YWx1ZSxmKSx4IT09bnVsbCYmKGUmJnguYWx0ZXJuYXRlIT09bnVsbCYmRC5kZWxldGUoeC5rZXk9PT1udWxsP046eC5rZXkpLG09YSh4LG0sTiksUz09PW51bGw/VD14OlMuc2libGluZz14LFM9eCk7cmV0dXJuIGUmJkQuZm9yRWFjaChmdW5jdGlvbihQKXtyZXR1cm4gdChoLFApfSksQWUmJlRyKGgsTiksVH1mdW5jdGlvbiBiKGgsbSx3LGYpe2lmKHR5cGVvZiB3PT0ib2JqZWN0IiYmdyE9PW51bGwmJncudHlwZT09PWxvJiZ3LmtleT09PW51bGwmJih3PXcucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiB3PT0ib2JqZWN0IiYmdyE9PW51bGwpe3N3aXRjaCh3LiQkdHlwZW9mKXtjYXNlIE5pOmU6e2Zvcih2YXIgVD13LmtleSxTPW07UyE9PW51bGw7KXtpZihTLmtleT09PVQpe2lmKFQ9dy50eXBlLFQ9PT1sbyl7aWYoUy50YWc9PT03KXtuKGgsUy5zaWJsaW5nKSxtPW8oUyx3LnByb3BzLmNoaWxkcmVuKSxtLnJldHVybj1oLGg9bTticmVhayBlfX1lbHNlIGlmKFMuZWxlbWVudFR5cGU9PT1UfHx0eXBlb2YgVD09Im9iamVjdCImJlQhPT1udWxsJiZULiQkdHlwZW9mPT09S24mJl9mKFQpPT09Uy50eXBlKXtuKGgsUy5zaWJsaW5nKSxtPW8oUyx3LnByb3BzKSxtLnJlZj1vYShoLFMsdyksbS5yZXR1cm49aCxoPW07YnJlYWsgZX1uKGgsUyk7YnJlYWt9ZWxzZSB0KGgsUyk7Uz1TLnNpYmxpbmd9dy50eXBlPT09bG8/KG09T3Iody5wcm9wcy5jaGlsZHJlbixoLm1vZGUsZix3LmtleSksbS5yZXR1cm49aCxoPW0pOihmPWVzKHcudHlwZSx3LmtleSx3LnByb3BzLG51bGwsaC5tb2RlLGYpLGYucmVmPW9hKGgsbSx3KSxmLnJldHVybj1oLGg9Zil9cmV0dXJuIGkoaCk7Y2FzZSBzbzplOntmb3IoUz13LmtleTttIT09bnVsbDspe2lmKG0ua2V5PT09UylpZihtLnRhZz09PTQmJm0uc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT13LmNvbnRhaW5lckluZm8mJm0uc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09dy5pbXBsZW1lbnRhdGlvbil7bihoLG0uc2libGluZyksbT1vKG0sdy5jaGlsZHJlbnx8W10pLG0ucmV0dXJuPWgsaD1tO2JyZWFrIGV9ZWxzZXtuKGgsbSk7YnJlYWt9ZWxzZSB0KGgsbSk7bT1tLnNpYmxpbmd9bT1zdSh3LGgubW9kZSxmKSxtLnJldHVybj1oLGg9bX1yZXR1cm4gaShoKTtjYXNlIEtuOnJldHVybiBTPXcuX2luaXQsYihoLG0sUyh3Ll9wYXlsb2FkKSxmKX1pZih1YSh3KSlyZXR1cm4gdihoLG0sdyxmKTtpZihlYSh3KSlyZXR1cm4geShoLG0sdyxmKTtCaShoLHcpfXJldHVybiB0eXBlb2Ygdz09InN0cmluZyImJnchPT0iInx8dHlwZW9mIHc9PSJudW1iZXIiPyh3PSIiK3csbSE9PW51bGwmJm0udGFnPT09Nj8obihoLG0uc2libGluZyksbT1vKG0sdyksbS5yZXR1cm49aCxoPW0pOihuKGgsbSksbT1pdSh3LGgubW9kZSxmKSxtLnJldHVybj1oLGg9bSksaShoKSk6bihoLG0pfXJldHVybiBifXZhciBDbz1YbSghMCksWm09WG0oITEpLG1zPWNyKG51bGwpLGhzPW51bGwsdm89bnVsbCx3Yz1udWxsO2Z1bmN0aW9uIGJjKCl7d2M9dm89aHM9bnVsbH1mdW5jdGlvbiB4YyhlKXt2YXIgdD1tcy5jdXJyZW50O0RlKG1zKSxlLl9jdXJyZW50VmFsdWU9dH1mdW5jdGlvbiB6dShlLHQsbil7Zm9yKDtlIT09bnVsbDspe3ZhciByPWUuYWx0ZXJuYXRlO2lmKChlLmNoaWxkTGFuZXMmdCkhPT10PyhlLmNoaWxkTGFuZXN8PXQsciE9PW51bGwmJihyLmNoaWxkTGFuZXN8PXQpKTpyIT09bnVsbCYmKHIuY2hpbGRMYW5lcyZ0KSE9PXQmJihyLmNoaWxkTGFuZXN8PXQpLGU9PT1uKWJyZWFrO2U9ZS5yZXR1cm59fWZ1bmN0aW9uIEVvKGUsdCl7aHM9ZSx3Yz12bz1udWxsLGU9ZS5kZXBlbmRlbmNpZXMsZSE9PW51bGwmJmUuZmlyc3RDb250ZXh0IT09bnVsbCYmKGUubGFuZXMmdCYmKHZ0PSEwKSxlLmZpcnN0Q29udGV4dD1udWxsKX1mdW5jdGlvbiAkdChlKXt2YXIgdD1lLl9jdXJyZW50VmFsdWU7aWYod2MhPT1lKWlmKGU9e2NvbnRleHQ6ZSxtZW1vaXplZFZhbHVlOnQsbmV4dDpudWxsfSx2bz09PW51bGwpe2lmKGhzPT09bnVsbCl0aHJvdyBFcnJvcihJKDMwOCkpO3ZvPWUsaHMuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDplfX1lbHNlIHZvPXZvLm5leHQ9ZTtyZXR1cm4gdH12YXIgX3I9bnVsbDtmdW5jdGlvbiBrYyhlKXtfcj09PW51bGw/X3I9W2VdOl9yLnB1c2goZSl9ZnVuY3Rpb24gZWgoZSx0LG4scil7dmFyIG89dC5pbnRlcmxlYXZlZDtyZXR1cm4gbz09PW51bGw/KG4ubmV4dD1uLGtjKHQpKToobi5uZXh0PW8ubmV4dCxvLm5leHQ9biksdC5pbnRlcmxlYXZlZD1uLFJuKGUscil9ZnVuY3Rpb24gUm4oZSx0KXtlLmxhbmVzfD10O3ZhciBuPWUuYWx0ZXJuYXRlO2ZvcihuIT09bnVsbCYmKG4ubGFuZXN8PXQpLG49ZSxlPWUucmV0dXJuO2UhPT1udWxsOyllLmNoaWxkTGFuZXN8PXQsbj1lLmFsdGVybmF0ZSxuIT09bnVsbCYmKG4uY2hpbGRMYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47cmV0dXJuIG4udGFnPT09Mz9uLnN0YXRlTm9kZTpudWxsfXZhciBZbj0hMTtmdW5jdGlvbiBTYyhlKXtlLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fWZ1bmN0aW9uIHRoKGUsdCl7ZT1lLnVwZGF0ZVF1ZXVlLHQudXBkYXRlUXVldWU9PT1lJiYodC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTplLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDplLnNoYXJlZCxlZmZlY3RzOmUuZWZmZWN0c30pfWZ1bmN0aW9uIENuKGUsdCl7cmV0dXJue2V2ZW50VGltZTplLGxhbmU6dCx0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fWZ1bmN0aW9uIHJyKGUsdCxuKXt2YXIgcj1lLnVwZGF0ZVF1ZXVlO2lmKHI9PT1udWxsKXJldHVybiBudWxsO2lmKHI9ci5zaGFyZWQsaWUmMil7dmFyIG89ci5wZW5kaW5nO3JldHVybiBvPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5wZW5kaW5nPXQsUm4oZSxuKX1yZXR1cm4gbz1yLmludGVybGVhdmVkLG89PT1udWxsPyh0Lm5leHQ9dCxrYyhyKSk6KHQubmV4dD1vLm5leHQsby5uZXh0PXQpLHIuaW50ZXJsZWF2ZWQ9dCxSbihlLG4pfWZ1bmN0aW9uIFlpKGUsdCxuKXtpZih0PXQudXBkYXRlUXVldWUsdCE9PW51bGwmJih0PXQuc2hhcmVkLChuJjQxOTQyNDApIT09MCkpe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sbGMoZSxuKX19ZnVuY3Rpb24gQ2YoZSx0KXt2YXIgbj1lLnVwZGF0ZVF1ZXVlLHI9ZS5hbHRlcm5hdGU7aWYociE9PW51bGwmJihyPXIudXBkYXRlUXVldWUsbj09PXIpKXt2YXIgbz1udWxsLGE9bnVsbDtpZihuPW4uZmlyc3RCYXNlVXBkYXRlLG4hPT1udWxsKXtkb3t2YXIgaT17ZXZlbnRUaW1lOm4uZXZlbnRUaW1lLGxhbmU6bi5sYW5lLHRhZzpuLnRhZyxwYXlsb2FkOm4ucGF5bG9hZCxjYWxsYmFjazpuLmNhbGxiYWNrLG5leHQ6bnVsbH07YT09PW51bGw/bz1hPWk6YT1hLm5leHQ9aSxuPW4ubmV4dH13aGlsZShuIT09bnVsbCk7YT09PW51bGw/bz1hPXQ6YT1hLm5leHQ9dH1lbHNlIG89YT10O249e2Jhc2VTdGF0ZTpyLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6byxsYXN0QmFzZVVwZGF0ZTphLHNoYXJlZDpyLnNoYXJlZCxlZmZlY3RzOnIuZWZmZWN0c30sZS51cGRhdGVRdWV1ZT1uO3JldHVybn1lPW4ubGFzdEJhc2VVcGRhdGUsZT09PW51bGw/bi5maXJzdEJhc2VVcGRhdGU9dDplLm5leHQ9dCxuLmxhc3RCYXNlVXBkYXRlPXR9ZnVuY3Rpb24gZ3MoZSx0LG4scil7dmFyIG89ZS51cGRhdGVRdWV1ZTtZbj0hMTt2YXIgYT1vLmZpcnN0QmFzZVVwZGF0ZSxpPW8ubGFzdEJhc2VVcGRhdGUscz1vLnNoYXJlZC5wZW5kaW5nO2lmKHMhPT1udWxsKXtvLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGw9cyx1PWwubmV4dDtsLm5leHQ9bnVsbCxpPT09bnVsbD9hPXU6aS5uZXh0PXUsaT1sO3ZhciBjPWUuYWx0ZXJuYXRlO2MhPT1udWxsJiYoYz1jLnVwZGF0ZVF1ZXVlLHM9Yy5sYXN0QmFzZVVwZGF0ZSxzIT09aSYmKHM9PT1udWxsP2MuZmlyc3RCYXNlVXBkYXRlPXU6cy5uZXh0PXUsYy5sYXN0QmFzZVVwZGF0ZT1sKSl9aWYoYSE9PW51bGwpe3ZhciBkPW8uYmFzZVN0YXRlO2k9MCxjPXU9bD1udWxsLHM9YTtkb3t2YXIgcD1zLmxhbmUsZz1zLmV2ZW50VGltZTtpZigociZwKT09PXApe2MhPT1udWxsJiYoYz1jLm5leHQ9e2V2ZW50VGltZTpnLGxhbmU6MCx0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9KTtlOnt2YXIgdj1lLHk9cztzd2l0Y2gocD10LGc9bix5LnRhZyl7Y2FzZSAxOmlmKHY9eS5wYXlsb2FkLHR5cGVvZiB2PT0iZnVuY3Rpb24iKXtkPXYuY2FsbChnLGQscCk7YnJlYWsgZX1kPXY7YnJlYWsgZTtjYXNlIDM6di5mbGFncz12LmZsYWdzJi02NTUzN3wxMjg7Y2FzZSAwOmlmKHY9eS5wYXlsb2FkLHA9dHlwZW9mIHY9PSJmdW5jdGlvbiI/di5jYWxsKGcsZCxwKTp2LHA9PW51bGwpYnJlYWsgZTtkPUllKHt9LGQscCk7YnJlYWsgZTtjYXNlIDI6WW49ITB9fXMuY2FsbGJhY2shPT1udWxsJiZzLmxhbmUhPT0wJiYoZS5mbGFnc3w9NjQscD1vLmVmZmVjdHMscD09PW51bGw/by5lZmZlY3RzPVtzXTpwLnB1c2gocykpfWVsc2UgZz17ZXZlbnRUaW1lOmcsbGFuZTpwLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0sYz09PW51bGw/KHU9Yz1nLGw9ZCk6Yz1jLm5leHQ9ZyxpfD1wO2lmKHM9cy5uZXh0LHM9PT1udWxsKXtpZihzPW8uc2hhcmVkLnBlbmRpbmcscz09PW51bGwpYnJlYWs7cD1zLHM9cC5uZXh0LHAubmV4dD1udWxsLG8ubGFzdEJhc2VVcGRhdGU9cCxvLnNoYXJlZC5wZW5kaW5nPW51bGx9fXdoaWxlKCEwKTtpZihjPT09bnVsbCYmKGw9ZCksby5iYXNlU3RhdGU9bCxvLmZpcnN0QmFzZVVwZGF0ZT11LG8ubGFzdEJhc2VVcGRhdGU9Yyx0PW8uc2hhcmVkLmludGVybGVhdmVkLHQhPT1udWxsKXtvPXQ7ZG8gaXw9by5sYW5lLG89by5uZXh0O3doaWxlKG8hPT10KX1lbHNlIGE9PT1udWxsJiYoby5zaGFyZWQubGFuZXM9MCk7UHJ8PWksZS5sYW5lcz1pLGUubWVtb2l6ZWRTdGF0ZT1kfX1mdW5jdGlvbiBBZihlLHQsbil7aWYoZT10LmVmZmVjdHMsdC5lZmZlY3RzPW51bGwsZSE9PW51bGwpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIHI9ZVt0XSxvPXIuY2FsbGJhY2s7aWYobyE9PW51bGwpe2lmKHIuY2FsbGJhY2s9bnVsbCxyPW4sdHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoSSgxOTEsbykpO28uY2FsbChyKX19fXZhciBCYT17fSx2bj1jcihCYSksUmE9Y3IoQmEpLE1hPWNyKEJhKTtmdW5jdGlvbiBDcihlKXtpZihlPT09QmEpdGhyb3cgRXJyb3IoSSgxNzQpKTtyZXR1cm4gZX1mdW5jdGlvbiBFYyhlLHQpe3N3aXRjaChTZShNYSx0KSxTZShSYSxlKSxTZSh2bixCYSksZT10Lm5vZGVUeXBlLGUpe2Nhc2UgOTpjYXNlIDExOnQ9KHQ9dC5kb2N1bWVudEVsZW1lbnQpP3QubmFtZXNwYWNlVVJJOnZ1KG51bGwsIiIpO2JyZWFrO2RlZmF1bHQ6ZT1lPT09OD90LnBhcmVudE5vZGU6dCx0PWUubmFtZXNwYWNlVVJJfHxudWxsLGU9ZS50YWdOYW1lLHQ9dnUodCxlKX1EZSh2biksU2Uodm4sdCl9ZnVuY3Rpb24gQW8oKXtEZSh2biksRGUoUmEpLERlKE1hKX1mdW5jdGlvbiBuaChlKXtDcihNYS5jdXJyZW50KTt2YXIgdD1Dcih2bi5jdXJyZW50KSxuPXZ1KHQsZS50eXBlKTt0IT09biYmKFNlKFJhLGUpLFNlKHZuLG4pKX1mdW5jdGlvbiBUYyhlKXtSYS5jdXJyZW50PT09ZSYmKERlKHZuKSxEZShSYSkpfXZhciBSZT1jcigwKTtmdW5jdGlvbiB2cyhlKXtmb3IodmFyIHQ9ZTt0IT09bnVsbDspe2lmKHQudGFnPT09MTMpe3ZhciBuPXQubWVtb2l6ZWRTdGF0ZTtpZihuIT09bnVsbCYmKG49bi5kZWh5ZHJhdGVkLG49PT1udWxsfHxuLmRhdGE9PT0iJD8ifHxuLmRhdGE9PT0iJCEiKSlyZXR1cm4gdH1lbHNlIGlmKHQudGFnPT09MTkmJnQubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciE9PXZvaWQgMCl7aWYodC5mbGFncyYxMjgpcmV0dXJuIHR9ZWxzZSBpZih0LmNoaWxkIT09bnVsbCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuIG51bGw7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBldT1bXTtmdW5jdGlvbiBOYygpe2Zvcih2YXIgZT0wO2U8ZXUubGVuZ3RoO2UrKylldVtlXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO2V1Lmxlbmd0aD0wfXZhciBxaT1Jbi5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLHR1PUluLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLElyPTAsTWU9bnVsbCxXZT1udWxsLEdlPW51bGwseXM9ITEsdmE9ITEsSWE9MCx1Yj0wO2Z1bmN0aW9uIHJ0KCl7dGhyb3cgRXJyb3IoSSgzMjEpKX1mdW5jdGlvbiBEYyhlLHQpe2lmKHQ9PT1udWxsKXJldHVybiExO2Zvcih2YXIgbj0wO248dC5sZW5ndGgmJm48ZS5sZW5ndGg7bisrKWlmKCFlbihlW25dLHRbbl0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIF9jKGUsdCxuLHIsbyxhKXtpZihJcj1hLE1lPXQsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLHQubGFuZXM9MCxxaS5jdXJyZW50PWU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGU9PT1udWxsP2ZiOm1iLGU9bihyLG8pLHZhKXthPTA7ZG97aWYodmE9ITEsSWE9MCwyNTw9YSl0aHJvdyBFcnJvcihJKDMwMSkpO2ErPTEsR2U9V2U9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwscWkuY3VycmVudD1oYixlPW4ocixvKX13aGlsZSh2YSl9aWYocWkuY3VycmVudD13cyx0PVdlIT09bnVsbCYmV2UubmV4dCE9PW51bGwsSXI9MCxHZT1XZT1NZT1udWxsLHlzPSExLHQpdGhyb3cgRXJyb3IoSSgzMDApKTtyZXR1cm4gZX1mdW5jdGlvbiBDYygpe3ZhciBlPUlhIT09MDtyZXR1cm4gSWE9MCxlfWZ1bmN0aW9uIG1uKCl7dmFyIGU9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07cmV0dXJuIEdlPT09bnVsbD9NZS5tZW1vaXplZFN0YXRlPUdlPWU6R2U9R2UubmV4dD1lLEdlfWZ1bmN0aW9uIEJ0KCl7aWYoV2U9PT1udWxsKXt2YXIgZT1NZS5hbHRlcm5hdGU7ZT1lIT09bnVsbD9lLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGU9V2UubmV4dDt2YXIgdD1HZT09PW51bGw/TWUubWVtb2l6ZWRTdGF0ZTpHZS5uZXh0O2lmKHQhPT1udWxsKUdlPXQsV2U9ZTtlbHNle2lmKGU9PT1udWxsKXRocm93IEVycm9yKEkoMzEwKSk7V2U9ZSxlPXttZW1vaXplZFN0YXRlOldlLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOldlLmJhc2VTdGF0ZSxiYXNlUXVldWU6V2UuYmFzZVF1ZXVlLHF1ZXVlOldlLnF1ZXVlLG5leHQ6bnVsbH0sR2U9PT1udWxsP01lLm1lbW9pemVkU3RhdGU9R2U9ZTpHZT1HZS5uZXh0PWV9cmV0dXJuIEdlfWZ1bmN0aW9uIFBhKGUsdCl7cmV0dXJuIHR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSk6dH1mdW5jdGlvbiBudShlKXt2YXIgdD1CdCgpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihJKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPVdlLG89ci5iYXNlUXVldWUsYT1uLnBlbmRpbmc7aWYoYSE9PW51bGwpe2lmKG8hPT1udWxsKXt2YXIgaT1vLm5leHQ7by5uZXh0PWEubmV4dCxhLm5leHQ9aX1yLmJhc2VRdWV1ZT1vPWEsbi5wZW5kaW5nPW51bGx9aWYobyE9PW51bGwpe2E9by5uZXh0LHI9ci5iYXNlU3RhdGU7dmFyIHM9aT1udWxsLGw9bnVsbCx1PWE7ZG97dmFyIGM9dS5sYW5lO2lmKChJciZjKT09PWMpbCE9PW51bGwmJihsPWwubmV4dD17bGFuZTowLGFjdGlvbjp1LmFjdGlvbixoYXNFYWdlclN0YXRlOnUuaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOnUuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxyPXUuaGFzRWFnZXJTdGF0ZT91LmVhZ2VyU3RhdGU6ZShyLHUuYWN0aW9uKTtlbHNle3ZhciBkPXtsYW5lOmMsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH07bD09PW51bGw/KHM9bD1kLGk9cik6bD1sLm5leHQ9ZCxNZS5sYW5lc3w9YyxQcnw9Y311PXUubmV4dH13aGlsZSh1IT09bnVsbCYmdSE9PWEpO2w9PT1udWxsP2k9cjpsLm5leHQ9cyxlbihyLHQubWVtb2l6ZWRTdGF0ZSl8fCh2dD0hMCksdC5tZW1vaXplZFN0YXRlPXIsdC5iYXNlU3RhdGU9aSx0LmJhc2VRdWV1ZT1sLG4ubGFzdFJlbmRlcmVkU3RhdGU9cn1pZihlPW4uaW50ZXJsZWF2ZWQsZSE9PW51bGwpe289ZTtkbyBhPW8ubGFuZSxNZS5sYW5lc3w9YSxQcnw9YSxvPW8ubmV4dDt3aGlsZShvIT09ZSl9ZWxzZSBvPT09bnVsbCYmKG4ubGFuZXM9MCk7cmV0dXJuW3QubWVtb2l6ZWRTdGF0ZSxuLmRpc3BhdGNoXX1mdW5jdGlvbiBydShlKXt2YXIgdD1CdCgpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihJKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPW4uZGlzcGF0Y2gsbz1uLnBlbmRpbmcsYT10Lm1lbW9pemVkU3RhdGU7aWYobyE9PW51bGwpe24ucGVuZGluZz1udWxsO3ZhciBpPW89by5uZXh0O2RvIGE9ZShhLGkuYWN0aW9uKSxpPWkubmV4dDt3aGlsZShpIT09byk7ZW4oYSx0Lm1lbW9pemVkU3RhdGUpfHwodnQ9ITApLHQubWVtb2l6ZWRTdGF0ZT1hLHQuYmFzZVF1ZXVlPT09bnVsbCYmKHQuYmFzZVN0YXRlPWEpLG4ubGFzdFJlbmRlcmVkU3RhdGU9YX1yZXR1cm5bYSxyXX1mdW5jdGlvbiByaCgpe31mdW5jdGlvbiBvaChlLHQpe3ZhciBuPU1lLHI9QnQoKSxvPXQoKSxhPSFlbihyLm1lbW9pemVkU3RhdGUsbyk7aWYoYSYmKHIubWVtb2l6ZWRTdGF0ZT1vLHZ0PSEwKSxyPXIucXVldWUsQWMoc2guYmluZChudWxsLG4scixlKSxbZV0pLHIuZ2V0U25hcHNob3QhPT10fHxhfHxHZSE9PW51bGwmJkdlLm1lbW9pemVkU3RhdGUudGFnJjEpe2lmKG4uZmxhZ3N8PTIwNDgsTGEoOSxpaC5iaW5kKG51bGwsbixyLG8sdCksdm9pZCAwLG51bGwpLEtlPT09bnVsbCl0aHJvdyBFcnJvcihJKDM0OSkpO0lyJjMwfHxhaChuLHQsbyl9cmV0dXJuIG99ZnVuY3Rpb24gYWgoZSx0LG4pe2UuZmxhZ3N8PTE2Mzg0LGU9e2dldFNuYXBzaG90OnQsdmFsdWU6bn0sdD1NZS51cGRhdGVRdWV1ZSx0PT09bnVsbD8odD17bGFzdEVmZmVjdDpudWxsLHN0b3JlczpudWxsfSxNZS51cGRhdGVRdWV1ZT10LHQuc3RvcmVzPVtlXSk6KG49dC5zdG9yZXMsbj09PW51bGw/dC5zdG9yZXM9W2VdOm4ucHVzaChlKSl9ZnVuY3Rpb24gaWgoZSx0LG4scil7dC52YWx1ZT1uLHQuZ2V0U25hcHNob3Q9cixsaCh0KSYmdWgoZSl9ZnVuY3Rpb24gc2goZSx0LG4pe3JldHVybiBuKGZ1bmN0aW9uKCl7bGgodCkmJnVoKGUpfSl9ZnVuY3Rpb24gbGgoZSl7dmFyIHQ9ZS5nZXRTbmFwc2hvdDtlPWUudmFsdWU7dHJ5e3ZhciBuPXQoKTtyZXR1cm4hZW4oZSxuKX1jYXRjaHtyZXR1cm4hMH19ZnVuY3Rpb24gdWgoZSl7dmFyIHQ9Um4oZSwxKTt0IT09bnVsbCYmWnQodCxlLDEsLTEpfWZ1bmN0aW9uIE9mKGUpe3ZhciB0PW1uKCk7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYoZT1lKCkpLHQubWVtb2l6ZWRTdGF0ZT10LmJhc2VTdGF0ZT1lLGU9e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOlBhLGxhc3RSZW5kZXJlZFN0YXRlOmV9LHQucXVldWU9ZSxlPWUuZGlzcGF0Y2g9cGIuYmluZChudWxsLE1lLGUpLFt0Lm1lbW9pemVkU3RhdGUsZV19ZnVuY3Rpb24gTGEoZSx0LG4scil7cmV0dXJuIGU9e3RhZzplLGNyZWF0ZTp0LGRlc3Ryb3k6bixkZXBzOnIsbmV4dDpudWxsfSx0PU1lLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LE1lLnVwZGF0ZVF1ZXVlPXQsdC5sYXN0RWZmZWN0PWUubmV4dD1lKToobj10Lmxhc3RFZmZlY3Qsbj09PW51bGw/dC5sYXN0RWZmZWN0PWUubmV4dD1lOihyPW4ubmV4dCxuLm5leHQ9ZSxlLm5leHQ9cix0Lmxhc3RFZmZlY3Q9ZSkpLGV9ZnVuY3Rpb24gY2goKXtyZXR1cm4gQnQoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIFFpKGUsdCxuLHIpe3ZhciBvPW1uKCk7TWUuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPUxhKDF8dCxuLHZvaWQgMCxyPT09dm9pZCAwP251bGw6cil9ZnVuY3Rpb24gT3MoZSx0LG4scil7dmFyIG89QnQoKTtyPXI9PT12b2lkIDA/bnVsbDpyO3ZhciBhPXZvaWQgMDtpZihXZSE9PW51bGwpe3ZhciBpPVdlLm1lbW9pemVkU3RhdGU7aWYoYT1pLmRlc3Ryb3ksciE9PW51bGwmJkRjKHIsaS5kZXBzKSl7by5tZW1vaXplZFN0YXRlPUxhKHQsbixhLHIpO3JldHVybn19TWUuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPUxhKDF8dCxuLGEscil9ZnVuY3Rpb24gUmYoZSx0KXtyZXR1cm4gUWkoODM5MDY1Niw4LGUsdCl9ZnVuY3Rpb24gQWMoZSx0KXtyZXR1cm4gT3MoMjA0OCw4LGUsdCl9ZnVuY3Rpb24gZGgoZSx0KXtyZXR1cm4gT3MoNCwyLGUsdCl9ZnVuY3Rpb24gcGgoZSx0KXtyZXR1cm4gT3MoNCw0LGUsdCl9ZnVuY3Rpb24gZmgoZSx0KXtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gZT1lKCksdChlKSxmdW5jdGlvbigpe3QobnVsbCl9O2lmKHQhPW51bGwpcmV0dXJuIGU9ZSgpLHQuY3VycmVudD1lLGZ1bmN0aW9uKCl7dC5jdXJyZW50PW51bGx9fWZ1bmN0aW9uIG1oKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxPcyg0LDQsZmguYmluZChudWxsLHQsZSksbil9ZnVuY3Rpb24gT2MoKXt9ZnVuY3Rpb24gaGgoZSx0KXt2YXIgbj1CdCgpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJkRjKHQsclsxXSk/clswXToobi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIGdoKGUsdCl7dmFyIG49QnQoKTt0PXQ9PT12b2lkIDA/bnVsbDp0O3ZhciByPW4ubWVtb2l6ZWRTdGF0ZTtyZXR1cm4gciE9PW51bGwmJnQhPT1udWxsJiZEYyh0LHJbMV0pP3JbMF06KGU9ZSgpLG4ubWVtb2l6ZWRTdGF0ZT1bZSx0XSxlKX1mdW5jdGlvbiB2aChlLHQsbil7cmV0dXJuIElyJjIxPyhlbihuLHQpfHwobj1rbSgpLE1lLmxhbmVzfD1uLFByfD1uLGUuYmFzZVN0YXRlPSEwKSx0KTooZS5iYXNlU3RhdGUmJihlLmJhc2VTdGF0ZT0hMSx2dD0hMCksZS5tZW1vaXplZFN0YXRlPW4pfWZ1bmN0aW9uIGNiKGUsdCl7dmFyIG49Z2U7Z2U9biE9PTAmJjQ+bj9uOjQsZSghMCk7dmFyIHI9dHUudHJhbnNpdGlvbjt0dS50cmFuc2l0aW9uPXt9O3RyeXtlKCExKSx0KCl9ZmluYWxseXtnZT1uLHR1LnRyYW5zaXRpb249cn19ZnVuY3Rpb24geWgoKXtyZXR1cm4gQnQoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIGRiKGUsdCxuKXt2YXIgcj1hcihlKTtpZihuPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfSx3aChlKSliaCh0LG4pO2Vsc2UgaWYobj1laChlLHQsbixyKSxuIT09bnVsbCl7dmFyIG89ZHQoKTtadChuLGUscixvKSx4aChuLHQscil9fWZ1bmN0aW9uIHBiKGUsdCxuKXt2YXIgcj1hcihlKSxvPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZih3aChlKSliaCh0LG8pO2Vsc2V7dmFyIGE9ZS5hbHRlcm5hdGU7aWYoZS5sYW5lcz09PTAmJihhPT09bnVsbHx8YS5sYW5lcz09PTApJiYoYT10Lmxhc3RSZW5kZXJlZFJlZHVjZXIsYSE9PW51bGwpKXRyeXt2YXIgaT10Lmxhc3RSZW5kZXJlZFN0YXRlLHM9YShpLG4pO2lmKG8uaGFzRWFnZXJTdGF0ZT0hMCxvLmVhZ2VyU3RhdGU9cyxlbihzLGkpKXt2YXIgbD10LmludGVybGVhdmVkO2w9PT1udWxsPyhvLm5leHQ9byxrYyh0KSk6KG8ubmV4dD1sLm5leHQsbC5uZXh0PW8pLHQuaW50ZXJsZWF2ZWQ9bztyZXR1cm59fWNhdGNoe31maW5hbGx5e31uPWVoKGUsdCxvLHIpLG4hPT1udWxsJiYobz1kdCgpLFp0KG4sZSxyLG8pLHhoKG4sdCxyKSl9fWZ1bmN0aW9uIHdoKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO3JldHVybiBlPT09TWV8fHQhPT1udWxsJiZ0PT09TWV9ZnVuY3Rpb24gYmgoZSx0KXt2YT15cz0hMDt2YXIgbj1lLnBlbmRpbmc7bj09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1uLm5leHQsbi5uZXh0PXQpLGUucGVuZGluZz10fWZ1bmN0aW9uIHhoKGUsdCxuKXtpZihuJjQxOTQyNDApe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sbGMoZSxuKX19dmFyIHdzPXtyZWFkQ29udGV4dDokdCx1c2VDYWxsYmFjazpydCx1c2VDb250ZXh0OnJ0LHVzZUVmZmVjdDpydCx1c2VJbXBlcmF0aXZlSGFuZGxlOnJ0LHVzZUluc2VydGlvbkVmZmVjdDpydCx1c2VMYXlvdXRFZmZlY3Q6cnQsdXNlTWVtbzpydCx1c2VSZWR1Y2VyOnJ0LHVzZVJlZjpydCx1c2VTdGF0ZTpydCx1c2VEZWJ1Z1ZhbHVlOnJ0LHVzZURlZmVycmVkVmFsdWU6cnQsdXNlVHJhbnNpdGlvbjpydCx1c2VNdXRhYmxlU291cmNlOnJ0LHVzZVN5bmNFeHRlcm5hbFN0b3JlOnJ0LHVzZUlkOnJ0LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZmI9e3JlYWRDb250ZXh0OiR0LHVzZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG1uKCkubWVtb2l6ZWRTdGF0ZT1bZSx0PT09dm9pZCAwP251bGw6dF0sZX0sdXNlQ29udGV4dDokdCx1c2VFZmZlY3Q6UmYsdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG49biE9bnVsbD9uLmNvbmNhdChbZV0pOm51bGwsUWkoNDE5NDMwOCw0LGZoLmJpbmQobnVsbCx0LGUpLG4pfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUWkoNDE5NDMwOCw0LGUsdCl9LHVzZUluc2VydGlvbkVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBRaSg0LDIsZSx0KX0sdXNlTWVtbzpmdW5jdGlvbihlLHQpe3ZhciBuPW1uKCk7cmV0dXJuIHQ9dD09PXZvaWQgMD9udWxsOnQsZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGV9LHVzZVJlZHVjZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW1uKCk7cmV0dXJuIHQ9biE9PXZvaWQgMD9uKHQpOnQsci5tZW1vaXplZFN0YXRlPXIuYmFzZVN0YXRlPXQsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6ZSxsYXN0UmVuZGVyZWRTdGF0ZTp0fSxyLnF1ZXVlPWUsZT1lLmRpc3BhdGNoPWRiLmJpbmQobnVsbCxNZSxlKSxbci5tZW1vaXplZFN0YXRlLGVdfSx1c2VSZWY6ZnVuY3Rpb24oZSl7dmFyIHQ9bW4oKTtyZXR1cm4gZT17Y3VycmVudDplfSx0Lm1lbW9pemVkU3RhdGU9ZX0sdXNlU3RhdGU6T2YsdXNlRGVidWdWYWx1ZTpPYyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBtbigpLm1lbW9pemVkU3RhdGU9ZX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPU9mKCExKSx0PWVbMF07cmV0dXJuIGU9Y2IuYmluZChudWxsLGVbMV0pLG1uKCkubWVtb2l6ZWRTdGF0ZT1lLFt0LGVdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9TWUsbz1tbigpO2lmKEFlKXtpZihuPT09dm9pZCAwKXRocm93IEVycm9yKEkoNDA3KSk7bj1uKCl9ZWxzZXtpZihuPXQoKSxLZT09PW51bGwpdGhyb3cgRXJyb3IoSSgzNDkpKTtJciYzMHx8YWgocix0LG4pfW8ubWVtb2l6ZWRTdGF0ZT1uO3ZhciBhPXt2YWx1ZTpuLGdldFNuYXBzaG90OnR9O3JldHVybiBvLnF1ZXVlPWEsUmYoc2guYmluZChudWxsLHIsYSxlKSxbZV0pLHIuZmxhZ3N8PTIwNDgsTGEoOSxpaC5iaW5kKG51bGwscixhLG4sdCksdm9pZCAwLG51bGwpLG59LHVzZUlkOmZ1bmN0aW9uKCl7dmFyIGU9bW4oKSx0PUtlLmlkZW50aWZpZXJQcmVmaXg7aWYoQWUpe3ZhciBuPV9uLHI9RG47bj0ociZ+KDE8PDMyLVh0KHIpLTEpKS50b1N0cmluZygzMikrbix0PSI6Iit0KyJSIituLG49SWErKywwPG4mJih0Kz0iSCIrbi50b1N0cmluZygzMikpLHQrPSI6In1lbHNlIG49dWIrKyx0PSI6Iit0KyJyIituLnRvU3RyaW5nKDMyKSsiOiI7cmV0dXJuIGUubWVtb2l6ZWRTdGF0ZT10fSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LG1iPXtyZWFkQ29udGV4dDokdCx1c2VDYWxsYmFjazpoaCx1c2VDb250ZXh0OiR0LHVzZUVmZmVjdDpBYyx1c2VJbXBlcmF0aXZlSGFuZGxlOm1oLHVzZUluc2VydGlvbkVmZmVjdDpkaCx1c2VMYXlvdXRFZmZlY3Q6cGgsdXNlTWVtbzpnaCx1c2VSZWR1Y2VyOm51LHVzZVJlZjpjaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBudShQYSl9LHVzZURlYnVnVmFsdWU6T2MsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1CdCgpO3JldHVybiB2aCh0LFdlLm1lbW9pemVkU3RhdGUsZSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT1udShQYSlbMF0sdD1CdCgpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2UsdF19LHVzZU11dGFibGVTb3VyY2U6cmgsdXNlU3luY0V4dGVybmFsU3RvcmU6b2gsdXNlSWQ6eWgsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxoYj17cmVhZENvbnRleHQ6JHQsdXNlQ2FsbGJhY2s6aGgsdXNlQ29udGV4dDokdCx1c2VFZmZlY3Q6QWMsdXNlSW1wZXJhdGl2ZUhhbmRsZTptaCx1c2VJbnNlcnRpb25FZmZlY3Q6ZGgsdXNlTGF5b3V0RWZmZWN0OnBoLHVzZU1lbW86Z2gsdXNlUmVkdWNlcjpydSx1c2VSZWY6Y2gsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcnUoUGEpfSx1c2VEZWJ1Z1ZhbHVlOk9jLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9QnQoKTtyZXR1cm4gV2U9PT1udWxsP3QubWVtb2l6ZWRTdGF0ZT1lOnZoKHQsV2UubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXJ1KFBhKVswXSx0PUJ0KCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpyaCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpvaCx1c2VJZDp5aCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9O2Z1bmN0aW9uIHF0KGUsdCl7aWYoZSYmZS5kZWZhdWx0UHJvcHMpe3Q9SWUoe30sdCksZT1lLmRlZmF1bHRQcm9wcztmb3IodmFyIG4gaW4gZSl0W25dPT09dm9pZCAwJiYodFtuXT1lW25dKTtyZXR1cm4gdH1yZXR1cm4gdH1mdW5jdGlvbiBGdShlLHQsbixyKXt0PWUubWVtb2l6ZWRTdGF0ZSxuPW4ocix0KSxuPW49PW51bGw/dDpJZSh7fSx0LG4pLGUubWVtb2l6ZWRTdGF0ZT1uLGUubGFuZXM9PT0wJiYoZS51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9bil9dmFyIFJzPXtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZS5fcmVhY3RJbnRlcm5hbHMpP0ZyKGUpPT09ZTohMX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPWR0KCksbz1hcihlKSxhPUNuKHIsbyk7YS5wYXlsb2FkPXQsbiE9bnVsbCYmKGEuY2FsbGJhY2s9biksdD1ycihlLGEsbyksdCE9PW51bGwmJihadCh0LGUsbyxyKSxZaSh0LGUsbykpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPWR0KCksbz1hcihlKSxhPUNuKHIsbyk7YS50YWc9MSxhLnBheWxvYWQ9dCxuIT1udWxsJiYoYS5jYWxsYmFjaz1uKSx0PXJyKGUsYSxvKSx0IT09bnVsbCYmKFp0KHQsZSxvLHIpLFlpKHQsZSxvKSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihlLHQpe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG49ZHQoKSxyPWFyKGUpLG89Q24obixyKTtvLnRhZz0yLHQhPW51bGwmJihvLmNhbGxiYWNrPXQpLHQ9cnIoZSxvLHIpLHQhPT1udWxsJiYoWnQodCxlLHIsbiksWWkodCxlLHIpKX19O2Z1bmN0aW9uIE1mKGUsdCxuLHIsbyxhLGkpe3JldHVybiBlPWUuc3RhdGVOb2RlLHR5cGVvZiBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT09ImZ1bmN0aW9uIj9lLnNob3VsZENvbXBvbmVudFVwZGF0ZShyLGEsaSk6dC5wcm90b3R5cGUmJnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50PyFfYShuLHIpfHwhX2EobyxhKTohMH1mdW5jdGlvbiBraChlLHQsbil7dmFyIHI9ITEsbz1scixhPXQuY29udGV4dFR5cGU7cmV0dXJuIHR5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGw/YT0kdChhKToobz13dCh0KT9ScjppdC5jdXJyZW50LHI9dC5jb250ZXh0VHlwZXMsYT0ocj1yIT1udWxsKT9EbyhlLG8pOmxyKSx0PW5ldyB0KG4sYSksZS5tZW1vaXplZFN0YXRlPXQuc3RhdGUhPT1udWxsJiZ0LnN0YXRlIT09dm9pZCAwP3Quc3RhdGU6bnVsbCx0LnVwZGF0ZXI9UnMsZS5zdGF0ZU5vZGU9dCx0Ll9yZWFjdEludGVybmFscz1lLHImJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1vLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9YSksdH1mdW5jdGlvbiBJZihlLHQsbixyKXtlPXQuc3RhdGUsdHlwZW9mIHQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz09ImZ1bmN0aW9uIiYmdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdHlwZW9mIHQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobixyKSx0LnN0YXRlIT09ZSYmUnMuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0LHQuc3RhdGUsbnVsbCl9ZnVuY3Rpb24gVXUoZSx0LG4scil7dmFyIG89ZS5zdGF0ZU5vZGU7by5wcm9wcz1uLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlLG8ucmVmcz17fSxTYyhlKTt2YXIgYT10LmNvbnRleHRUeXBlO3R5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGw/by5jb250ZXh0PSR0KGEpOihhPXd0KHQpP1JyOml0LmN1cnJlbnQsby5jb250ZXh0PURvKGUsYSkpLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlLGE9dC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsdHlwZW9mIGE9PSJmdW5jdGlvbiImJihGdShlLHQsYSxuKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksdHlwZW9mIHQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT0iZnVuY3Rpb24ifHx0eXBlb2Ygby5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uInx8dHlwZW9mIG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uIiYmdHlwZW9mIG8uY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24ifHwodD1vLnN0YXRlLHR5cGVvZiBvLmNvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmby5jb21wb25lbnRXaWxsTW91bnQoKSx0eXBlb2Ygby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSx0IT09by5zdGF0ZSYmUnMuZW5xdWV1ZVJlcGxhY2VTdGF0ZShvLG8uc3RhdGUsbnVsbCksZ3MoZSxuLG8sciksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiBvLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NDE5NDMwOCl9ZnVuY3Rpb24gT28oZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPVYwKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIG89bn1jYXRjaChhKXtvPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCthLm1lc3NhZ2UrYApgK2Euc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6byxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gb3UoZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uICR1KGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIGdiPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIFNoKGUsdCxuKXtuPUNuKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXt4c3x8KHhzPSEwLFF1PXIpLCR1KGUsdCl9LG59ZnVuY3Rpb24gRWgoZSx0LG4pe249Q24oLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgbz10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKG8pfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7JHUoZSx0KX19dmFyIGE9ZS5zdGF0ZU5vZGU7cmV0dXJuIGEhPT1udWxsJiZ0eXBlb2YgYS5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXskdShlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYob3I9PT1udWxsP29yPW5ldyBTZXQoW3RoaXNdKTpvci5hZGQodGhpcykpO3ZhciBpPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazppIT09bnVsbD9pOiIifSl9KSxufWZ1bmN0aW9uIFBmKGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgZ2I7dmFyIG89bmV3IFNldDtyLnNldCh0LG8pfWVsc2Ugbz1yLmdldCh0KSxvPT09dm9pZCAwJiYobz1uZXcgU2V0LHIuc2V0KHQsbykpO28uaGFzKG4pfHwoby5hZGQobiksZT1BYi5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBMZihlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiB6ZihlLHQsbixyLG8pe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1vLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PUNuKC0xLDEpLHQudGFnPTIscnIobix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIHZiPUluLlJlYWN0Q3VycmVudE93bmVyLHZ0PSExO2Z1bmN0aW9uIGN0KGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/Wm0odCxudWxsLG4scik6Q28odCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gRmYoZSx0LG4scixvKXtuPW4ucmVuZGVyO3ZhciBhPXQucmVmO3JldHVybiBFbyh0LG8pLHI9X2MoZSx0LG4scixhLG8pLG49Q2MoKSxlIT09bnVsbCYmIXZ0Pyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sTW4oZSx0LG8pKTooQWUmJm4mJmdjKHQpLHQuZmxhZ3N8PTEsY3QoZSx0LHIsbyksdC5jaGlsZCl9ZnVuY3Rpb24gVWYoZSx0LG4scixvKXtpZihlPT09bnVsbCl7dmFyIGE9bi50eXBlO3JldHVybiB0eXBlb2YgYT09ImZ1bmN0aW9uIiYmIVVjKGEpJiZhLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1hLFRoKGUsdCxhLHIsbykpOihlPWVzKG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsbyksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKGE9ZS5jaGlsZCwhKGUubGFuZXMmbykpe3ZhciBpPWEubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246X2EsbihpLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBNbihlLHQsbyl9cmV0dXJuIHQuZmxhZ3N8PTEsZT1pcihhLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIFRoKGUsdCxuLHIsbyl7aWYoZSE9PW51bGwpe3ZhciBhPWUubWVtb2l6ZWRQcm9wcztpZihfYShhLHIpJiZlLnJlZj09PXQucmVmKWlmKHZ0PSExLHQucGVuZGluZ1Byb3BzPXI9YSwoZS5sYW5lcyZvKSE9PTApZS5mbGFncyYxMzEwNzImJih2dD0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLE1uKGUsdCxvKX1yZXR1cm4gQnUoZSx0LG4scixvKX1mdW5jdGlvbiBOaChlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1yLmNoaWxkcmVuLGE9ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxTZSh3byxOdCksTnR8PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9YSE9PW51bGw/YS5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsU2Uod28sTnQpLE50fD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPWEhPT1udWxsP2EuYmFzZUxhbmVzOm4sU2Uod28sTnQpLE50fD1yfWVsc2UgYSE9PW51bGw/KHI9YS5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLFNlKHdvLE50KSxOdHw9cjtyZXR1cm4gY3QoZSx0LG8sbiksdC5jaGlsZH1mdW5jdGlvbiBEaChlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIEJ1KGUsdCxuLHIsbyl7dmFyIGE9d3Qobik/UnI6aXQuY3VycmVudDtyZXR1cm4gYT1Ebyh0LGEpLEVvKHQsbyksbj1fYyhlLHQsbixyLGEsbykscj1DYygpLGUhPT1udWxsJiYhdnQ/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+byxNbihlLHQsbykpOihBZSYmciYmZ2ModCksdC5mbGFnc3w9MSxjdChlLHQsbixvKSx0LmNoaWxkKX1mdW5jdGlvbiAkZihlLHQsbixyLG8pe2lmKHd0KG4pKXt2YXIgYT0hMDtkcyh0KX1lbHNlIGE9ITE7aWYoRW8odCxvKSx0LnN0YXRlTm9kZT09PW51bGwpSmkoZSx0KSxraCh0LG4sciksVXUodCxuLHIsbykscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgaT10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztpLnByb3BzPXM7dmFyIGw9aS5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9JHQodSk6KHU9d3Qobik/UnI6aXQuY3VycmVudCx1PURvKHQsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGwhPT11KSYmSWYodCxpLHIsdSksWW49ITE7dmFyIHA9dC5tZW1vaXplZFN0YXRlO2kuc3RhdGU9cCxncyh0LHIsaSxvKSxsPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8cCE9PWx8fHl0LmN1cnJlbnR8fFluPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKEZ1KHQsbixjLHIpLGw9dC5tZW1vaXplZFN0YXRlKSwocz1Zbnx8TWYodCxuLHMscixwLGwsdSkpPyhkfHx0eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgaS5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1sKSxpLnByb3BzPXIsaS5zdGF0ZT1sLGkuY29udGV4dD11LHI9cyk6KHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtpPXQuc3RhdGVOb2RlLHRoKGUsdCkscz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6cXQodC50eXBlLHMpLGkucHJvcHM9dSxkPXQucGVuZGluZ1Byb3BzLHA9aS5jb250ZXh0LGw9bi5jb250ZXh0VHlwZSx0eXBlb2YgbD09Im9iamVjdCImJmwhPT1udWxsP2w9JHQobCk6KGw9d3Qobik/UnI6aXQuY3VycmVudCxsPURvKHQsbCkpO3ZhciBnPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBnPT0iZnVuY3Rpb24ifHx0eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fHAhPT1sKSYmSWYodCxpLHIsbCksWW49ITEscD10Lm1lbW9pemVkU3RhdGUsaS5zdGF0ZT1wLGdzKHQscixpLG8pO3ZhciB2PXQubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8cCE9PXZ8fHl0LmN1cnJlbnR8fFluPyh0eXBlb2YgZz09ImZ1bmN0aW9uIiYmKEZ1KHQsbixnLHIpLHY9dC5tZW1vaXplZFN0YXRlKSwodT1Zbnx8TWYodCxuLHUscixwLHYsbCl8fCExKT8oY3x8dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgaS5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZpLmNvbXBvbmVudFdpbGxVcGRhdGUocix2LGwpLHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZpLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsdixsKSksdHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBpLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmcD09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZwPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPXYpLGkucHJvcHM9cixpLnN0YXRlPXYsaS5jb250ZXh0PWwscj11KToodHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZwPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJnA9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gV3UoZSx0LG4scixhLG8pfWZ1bmN0aW9uIFd1KGUsdCxuLHIsbyxhKXtEaChlLHQpO3ZhciBpPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhaSlyZXR1cm4gbyYmVGYodCxuLCExKSxNbihlLHQsYSk7cj10LnN0YXRlTm9kZSx2Yi5jdXJyZW50PXQ7dmFyIHM9aSYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmaT8odC5jaGlsZD1Dbyh0LGUuY2hpbGQsbnVsbCxhKSx0LmNoaWxkPUNvKHQsbnVsbCxzLGEpKTpjdChlLHQscyxhKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxvJiZUZih0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gX2goZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD9FZihlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZFZihlLHQuY29udGV4dCwhMSksRWMoZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIEJmKGUsdCxuLHIsbyl7cmV0dXJuIF9vKCkseWMobyksdC5mbGFnc3w9MjU2LGN0KGUsdCxuLHIpLHQuY2hpbGR9dmFyIEh1PXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24ganUoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIENoKGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPVJlLmN1cnJlbnQsYT0hMSxpPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9aSl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihvJjIpIT09MCkscz8oYT0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYob3w9MSksU2UoUmUsbyYxKSxlPT09bnVsbClyZXR1cm4gTHUodCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGk9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssYT8ocj10Lm1vZGUsYT10LmNoaWxkLGk9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46aX0sIShyJjEpJiZhIT09bnVsbD8oYS5jaGlsZExhbmVzPTAsYS5wZW5kaW5nUHJvcHM9aSk6YT1QcyhpLHIsMCxudWxsKSxlPU9yKGUscixuLG51bGwpLGEucmV0dXJuPXQsZS5yZXR1cm49dCxhLnNpYmxpbmc9ZSx0LmNoaWxkPWEsdC5jaGlsZC5tZW1vaXplZFN0YXRlPWp1KG4pLHQubWVtb2l6ZWRTdGF0ZT1IdSxlKTpSYyh0LGkpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKHM9by5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4geWIoZSx0LGkscixzLG8sbik7aWYoYSl7YT1yLmZhbGxiYWNrLGk9dC5tb2RlLG89ZS5jaGlsZCxzPW8uc2libGluZzt2YXIgbD17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGkmMSkmJnQuY2hpbGQhPT1vPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9bCx0LmRlbGV0aW9ucz1udWxsKToocj1pcihvLGwpLHIuc3VidHJlZUZsYWdzPW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9hPWlyKHMsYSk6KGE9T3IoYSxpLG4sbnVsbCksYS5mbGFnc3w9MiksYS5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1hLHQuY2hpbGQ9cixyPWEsYT10LmNoaWxkLGk9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGk9aT09PW51bGw/anUobik6e2Jhc2VMYW5lczppLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmkudHJhbnNpdGlvbnN9LGEubWVtb2l6ZWRTdGF0ZT1pLGEuY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPUh1LHJ9cmV0dXJuIGE9ZS5jaGlsZCxlPWEuc2libGluZyxyPWlyKGEse21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBSYyhlLHQpe3JldHVybiB0PVBzKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBXaShlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJnljKHIpLENvKHQsZS5jaGlsZCxudWxsLG4pLGU9UmModCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIHliKGUsdCxuLHIsbyxhLGkpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9b3UoRXJyb3IoSSg0MjIpKSksV2koZSx0LGkscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KGE9ci5mYWxsYmFjayxvPXQubW9kZSxyPVBzKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxvLDAsbnVsbCksYT1PcihhLG8saSxudWxsKSxhLmZsYWdzfD0yLHIucmV0dXJuPXQsYS5yZXR1cm49dCxyLnNpYmxpbmc9YSx0LmNoaWxkPXIsdC5tb2RlJjEmJkNvKHQsZS5jaGlsZCxudWxsLGkpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT1qdShpKSx0Lm1lbW9pemVkU3RhdGU9SHUsYSk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIFdpKGUsdCxpLG51bGwpO2lmKG8uZGF0YT09PSIkISIpe2lmKHI9by5uZXh0U2libGluZyYmby5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsYT1FcnJvcihJKDQxOSkpLHI9b3UoYSxyLHZvaWQgMCksV2koZSx0LGkscil9aWYocz0oaSZlLmNoaWxkTGFuZXMpIT09MCx2dHx8cyl7aWYocj1LZSxyIT09bnVsbCl7c3dpdGNoKGkmLWkpe2Nhc2UgNDpvPTI7YnJlYWs7Y2FzZSAxNjpvPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Om89MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bz0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDpvPTB9bz1vJihyLnN1c3BlbmRlZExhbmVzfGkpPzA6byxvIT09MCYmbyE9PWEucmV0cnlMYW5lJiYoYS5yZXRyeUxhbmU9byxSbihlLG8pLFp0KHIsZSxvLC0xKSl9cmV0dXJuIEZjKCkscj1vdShFcnJvcihJKDQyMSkpKSxXaShlLHQsaSxyKX1yZXR1cm4gby5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PU9iLmJpbmQobnVsbCxlKSxvLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9YS50cmVlQ29udGV4dCxEdD1ucihvLm5leHRTaWJsaW5nKSxfdD10LEFlPSEwLEp0PW51bGwsZSE9PW51bGwmJihMdFt6dCsrXT1EbixMdFt6dCsrXT1fbixMdFt6dCsrXT1NcixEbj1lLmlkLF9uPWUub3ZlcmZsb3csTXI9dCksdD1SYyh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24gV2YoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSx6dShlLnJldHVybix0LG4pfWZ1bmN0aW9uIGF1KGUsdCxuLHIsbyl7dmFyIGE9ZS5tZW1vaXplZFN0YXRlO2E9PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOm99OihhLmlzQmFja3dhcmRzPXQsYS5yZW5kZXJpbmc9bnVsbCxhLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGEubGFzdD1yLGEudGFpbD1uLGEudGFpbE1vZGU9byl9ZnVuY3Rpb24gQWgoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89ci5yZXZlYWxPcmRlcixhPXIudGFpbDtpZihjdChlLHQsci5jaGlsZHJlbixuKSxyPVJlLmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmV2YoZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSlXZihlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKFNlKFJlLHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKG8pe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsbz1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZ2cyhlKT09PW51bGwmJihvPW4pLG49bi5zaWJsaW5nO249byxuPT09bnVsbD8obz10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KG89bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxhdSh0LCExLG8sbixhKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxvPXQuY2hpbGQsdC5jaGlsZD1udWxsO28hPT1udWxsOyl7aWYoZT1vLmFsdGVybmF0ZSxlIT09bnVsbCYmdnMoZSk9PT1udWxsKXt0LmNoaWxkPW87YnJlYWt9ZT1vLnNpYmxpbmcsby5zaWJsaW5nPW4sbj1vLG89ZX1hdSh0LCEwLG4sbnVsbCxhKTticmVhaztjYXNlInRvZ2V0aGVyIjphdSh0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gSmkoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gTW4oZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLFByfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihJKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49aXIoZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9aXIoZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiB3YihlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6X2godCksX28oKTticmVhaztjYXNlIDU6bmgodCk7YnJlYWs7Y2FzZSAxOnd0KHQudHlwZSkmJmRzKHQpO2JyZWFrO2Nhc2UgNDpFYyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LG89dC5tZW1vaXplZFByb3BzLnZhbHVlO1NlKG1zLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPW87YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oU2UoUmUsUmUuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/Q2goZSx0LG4pOihTZShSZSxSZS5jdXJyZW50JjEpLGU9TW4oZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtTZShSZSxSZS5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gQWgoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihvPXQubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKG8ucmVuZGVyaW5nPW51bGwsby50YWlsPW51bGwsby5sYXN0RWZmZWN0PW51bGwpLFNlKFJlLFJlLmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsTmgoZSx0LG4pfXJldHVybiBNbihlLHQsbil9dmFyIE9oLFZ1LFJoLE1oO09oPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTtWdT1mdW5jdGlvbigpe307Umg9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5tZW1vaXplZFByb3BzO2lmKG8hPT1yKXtlPXQuc3RhdGVOb2RlLENyKHZuLmN1cnJlbnQpO3ZhciBhPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOm89ZnUoZSxvKSxyPWZ1KGUsciksYT1bXTticmVhaztjYXNlInNlbGVjdCI6bz1JZSh7fSxvLHt2YWx1ZTp2b2lkIDB9KSxyPUllKHt9LHIse3ZhbHVlOnZvaWQgMH0pLGE9W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bz1ndShlLG8pLHI9Z3UoZSxyKSxhPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz11cyl9eXUobixyKTt2YXIgaTtuPW51bGw7Zm9yKHUgaW4gbylpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmby5oYXNPd25Qcm9wZXJ0eSh1KSYmb1t1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9b1t1XTtmb3IoaSBpbiBzKXMuaGFzT3duUHJvcGVydHkoaSkmJihufHwobj17fSksbltpXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJih4YS5oYXNPd25Qcm9wZXJ0eSh1KT9hfHwoYT1bXSk6KGE9YXx8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGw9clt1XTtpZihzPW8/Llt1XSxyLmhhc093blByb3BlcnR5KHUpJiZsIT09cyYmKGwhPW51bGx8fHMhPW51bGwpKWlmKHU9PT0ic3R5bGUiKWlmKHMpe2ZvcihpIGluIHMpIXMuaGFzT3duUHJvcGVydHkoaSl8fGwmJmwuaGFzT3duUHJvcGVydHkoaSl8fChufHwobj17fSksbltpXT0iIik7Zm9yKGkgaW4gbClsLmhhc093blByb3BlcnR5KGkpJiZzW2ldIT09bFtpXSYmKG58fChuPXt9KSxuW2ldPWxbaV0pfWVsc2Ugbnx8KGF8fChhPVtdKSxhLnB1c2godSxuKSksbj1sO2Vsc2UgdT09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGw9bD9sLl9faHRtbDp2b2lkIDAscz1zP3MuX19odG1sOnZvaWQgMCxsIT1udWxsJiZzIT09bCYmKGE9YXx8W10pLnB1c2godSxsKSk6dT09PSJjaGlsZHJlbiI/dHlwZW9mIGwhPSJzdHJpbmciJiZ0eXBlb2YgbCE9Im51bWJlciJ8fChhPWF8fFtdKS5wdXNoKHUsIiIrbCk6dSE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZ1IT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJih4YS5oYXNPd25Qcm9wZXJ0eSh1KT8obCE9bnVsbCYmdT09PSJvblNjcm9sbCImJk5lKCJzY3JvbGwiLGUpLGF8fHM9PT1sfHwoYT1bXSkpOihhPWF8fFtdKS5wdXNoKHUsbCkpfW4mJihhPWF8fFtdKS5wdXNoKCJzdHlsZSIsbik7dmFyIHU9YTsodC51cGRhdGVRdWV1ZT11KSYmKHQuZmxhZ3N8PTQpfX07TWg9ZnVuY3Rpb24oZSx0LG4scil7biE9PXImJih0LmZsYWdzfD00KX07ZnVuY3Rpb24gYWEoZSx0KXtpZighQWUpc3dpdGNoKGUudGFpbE1vZGUpe2Nhc2UiaGlkZGVuIjp0PWUudGFpbDtmb3IodmFyIG49bnVsbDt0IT09bnVsbDspdC5hbHRlcm5hdGUhPT1udWxsJiYobj10KSx0PXQuc2libGluZztuPT09bnVsbD9lLnRhaWw9bnVsbDpuLnNpYmxpbmc9bnVsbDticmVhaztjYXNlImNvbGxhcHNlZCI6bj1lLnRhaWw7Zm9yKHZhciByPW51bGw7biE9PW51bGw7KW4uYWx0ZXJuYXRlIT09bnVsbCYmKHI9biksbj1uLnNpYmxpbmc7cj09PW51bGw/dHx8ZS50YWlsPT09bnVsbD9lLnRhaWw9bnVsbDplLnRhaWwuc2libGluZz1udWxsOnIuc2libGluZz1udWxsfX1mdW5jdGlvbiBvdChlKXt2YXIgdD1lLmFsdGVybmF0ZSE9PW51bGwmJmUuYWx0ZXJuYXRlLmNoaWxkPT09ZS5jaGlsZCxuPTAscj0wO2lmKHQpZm9yKHZhciBvPWUuY2hpbGQ7byE9PW51bGw7KW58PW8ubGFuZXN8by5jaGlsZExhbmVzLHJ8PW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0LHJ8PW8uZmxhZ3MmMTQ2ODAwNjQsby5yZXR1cm49ZSxvPW8uc2libGluZztlbHNlIGZvcihvPWUuY2hpbGQ7byE9PW51bGw7KW58PW8ubGFuZXN8by5jaGlsZExhbmVzLHJ8PW8uc3VidHJlZUZsYWdzLHJ8PW8uZmxhZ3Msby5yZXR1cm49ZSxvPW8uc2libGluZztyZXR1cm4gZS5zdWJ0cmVlRmxhZ3N8PXIsZS5jaGlsZExhbmVzPW4sdH1mdW5jdGlvbiBiYihlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHM7c3dpdGNoKHZjKHQpLHQudGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gb3QodCksbnVsbDtjYXNlIDE6cmV0dXJuIHd0KHQudHlwZSkmJmNzKCksb3QodCksbnVsbDtjYXNlIDM6cmV0dXJuIHI9dC5zdGF0ZU5vZGUsQW8oKSxEZSh5dCksRGUoaXQpLE5jKCksci5wZW5kaW5nQ29udGV4dCYmKHIuY29udGV4dD1yLnBlbmRpbmdDb250ZXh0LHIucGVuZGluZ0NvbnRleHQ9bnVsbCksKGU9PT1udWxsfHxlLmNoaWxkPT09bnVsbCkmJigkaSh0KT90LmZsYWdzfD00OmU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYhKHQuZmxhZ3MmMjU2KXx8KHQuZmxhZ3N8PTEwMjQsSnQhPT1udWxsJiYoWnUoSnQpLEp0PW51bGwpKSksVnUoZSx0KSxvdCh0KSxudWxsO2Nhc2UgNTpUYyh0KTt2YXIgbz1DcihNYS5jdXJyZW50KTtpZihuPXQudHlwZSxlIT09bnVsbCYmdC5zdGF0ZU5vZGUhPW51bGwpUmgoZSx0LG4scixvKSxlLnJlZiE9PXQucmVmJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpO2Vsc2V7aWYoIXIpe2lmKHQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihJKDE2NikpO3JldHVybiBvdCh0KSxudWxsfWlmKGU9Q3Iodm4uY3VycmVudCksJGkodCkpe3I9dC5zdGF0ZU5vZGUsbj10LnR5cGU7dmFyIGE9dC5tZW1vaXplZFByb3BzO3N3aXRjaChyW2huXT10LHJbT2FdPWEsZT0odC5tb2RlJjEpIT09MCxuKXtjYXNlImRpYWxvZyI6TmUoImNhbmNlbCIsciksTmUoImNsb3NlIixyKTticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOk5lKCJsb2FkIixyKTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3Iobz0wO288ZGEubGVuZ3RoO28rKylOZShkYVtvXSxyKTticmVhaztjYXNlInNvdXJjZSI6TmUoImVycm9yIixyKTticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpOZSgiZXJyb3IiLHIpLE5lKCJsb2FkIixyKTticmVhaztjYXNlImRldGFpbHMiOk5lKCJ0b2dnbGUiLHIpO2JyZWFrO2Nhc2UiaW5wdXQiOnFwKHIsYSksTmUoImludmFsaWQiLHIpO2JyZWFrO2Nhc2Uic2VsZWN0IjpyLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhYS5tdWx0aXBsZX0sTmUoImludmFsaWQiLHIpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOkpwKHIsYSksTmUoImludmFsaWQiLHIpfXl1KG4sYSksbz1udWxsO2Zvcih2YXIgaSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBzPWFbaV07aT09PSJjaGlsZHJlbiI/dHlwZW9mIHM9PSJzdHJpbmciP3IudGV4dENvbnRlbnQhPT1zJiYoYS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmVWkoci50ZXh0Q29udGVudCxzLGUpLG89WyJjaGlsZHJlbiIsc10pOnR5cGVvZiBzPT0ibnVtYmVyIiYmci50ZXh0Q29udGVudCE9PSIiK3MmJihhLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiZVaShyLnRleHRDb250ZW50LHMsZSksbz1bImNoaWxkcmVuIiwiIitzXSk6eGEuaGFzT3duUHJvcGVydHkoaSkmJnMhPW51bGwmJmk9PT0ib25TY3JvbGwiJiZOZSgic2Nyb2xsIixyKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6RGkociksUXAocixhLCEwKTticmVhaztjYXNlInRleHRhcmVhIjpEaShyKSxYcChyKTticmVhaztjYXNlInNlbGVjdCI6Y2FzZSJvcHRpb24iOmJyZWFrO2RlZmF1bHQ6dHlwZW9mIGEub25DbGljaz09ImZ1bmN0aW9uIiYmKHIub25jbGljaz11cyl9cj1vLHQudXBkYXRlUXVldWU9cixyIT09bnVsbCYmKHQuZmxhZ3N8PTQpfWVsc2V7aT1vLm5vZGVUeXBlPT09OT9vOm8ub3duZXJEb2N1bWVudCxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiJiYoZT1zbShuKSksZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9uPT09InNjcmlwdCI/KGU9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLmlubmVySFRNTD0iPHNjcmlwdD48XC9zY3JpcHQ+IixlPWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKSk6dHlwZW9mIHIuaXM9PSJzdHJpbmciP2U9aS5jcmVhdGVFbGVtZW50KG4se2lzOnIuaXN9KTooZT1pLmNyZWF0ZUVsZW1lbnQobiksbj09PSJzZWxlY3QiJiYoaT1lLHIubXVsdGlwbGU/aS5tdWx0aXBsZT0hMDpyLnNpemUmJihpLnNpemU9ci5zaXplKSkpOmU9aS5jcmVhdGVFbGVtZW50TlMoZSxuKSxlW2huXT10LGVbT2FdPXIsT2goZSx0LCExLCExKSx0LnN0YXRlTm9kZT1lO2U6e3N3aXRjaChpPXd1KG4sciksbil7Y2FzZSJkaWFsb2ciOk5lKCJjYW5jZWwiLGUpLE5lKCJjbG9zZSIsZSksbz1yO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6TmUoImxvYWQiLGUpLG89cjticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3Iobz0wO288ZGEubGVuZ3RoO28rKylOZShkYVtvXSxlKTtvPXI7YnJlYWs7Y2FzZSJzb3VyY2UiOk5lKCJlcnJvciIsZSksbz1yO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOk5lKCJlcnJvciIsZSksTmUoImxvYWQiLGUpLG89cjticmVhaztjYXNlImRldGFpbHMiOk5lKCJ0b2dnbGUiLGUpLG89cjticmVhaztjYXNlImlucHV0IjpxcChlLHIpLG89ZnUoZSxyKSxOZSgiaW52YWxpZCIsZSk7YnJlYWs7Y2FzZSJvcHRpb24iOm89cjticmVhaztjYXNlInNlbGVjdCI6ZS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIXIubXVsdGlwbGV9LG89SWUoe30scix7dmFsdWU6dm9pZCAwfSksTmUoImludmFsaWQiLGUpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOkpwKGUsciksbz1ndShlLHIpLE5lKCJpbnZhbGlkIixlKTticmVhaztkZWZhdWx0Om89cn15dShuLG8pLHM9bztmb3IoYSBpbiBzKWlmKHMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBsPXNbYV07YT09PSJzdHlsZSI/Y20oZSxsKTphPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj8obD1sP2wuX19odG1sOnZvaWQgMCxsIT1udWxsJiZsbShlLGwpKTphPT09ImNoaWxkcmVuIj90eXBlb2YgbD09InN0cmluZyI/KG4hPT0idGV4dGFyZWEifHxsIT09IiIpJiZrYShlLGwpOnR5cGVvZiBsPT0ibnVtYmVyIiYma2EoZSwiIitsKTphIT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJmEhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmYSE9PSJhdXRvRm9jdXMiJiYoeGEuaGFzT3duUHJvcGVydHkoYSk/bCE9bnVsbCYmYT09PSJvblNjcm9sbCImJk5lKCJzY3JvbGwiLGUpOmwhPW51bGwmJm5jKGUsYSxsLGkpKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6RGkoZSksUXAoZSxyLCExKTticmVhaztjYXNlInRleHRhcmVhIjpEaShlKSxYcChlKTticmVhaztjYXNlIm9wdGlvbiI6ci52YWx1ZSE9bnVsbCYmZS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIitzcihyLnZhbHVlKSk7YnJlYWs7Y2FzZSJzZWxlY3QiOmUubXVsdGlwbGU9ISFyLm11bHRpcGxlLGE9ci52YWx1ZSxhIT1udWxsP2JvKGUsISFyLm11bHRpcGxlLGEsITEpOnIuZGVmYXVsdFZhbHVlIT1udWxsJiZibyhlLCEhci5tdWx0aXBsZSxyLmRlZmF1bHRWYWx1ZSwhMCk7YnJlYWs7ZGVmYXVsdDp0eXBlb2Ygby5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoZS5vbmNsaWNrPXVzKX1zd2l0Y2gobil7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpyPSEhci5hdXRvRm9jdXM7YnJlYWsgZTtjYXNlImltZyI6cj0hMDticmVhayBlO2RlZmF1bHQ6cj0hMX19ciYmKHQuZmxhZ3N8PTQpfXQucmVmIT09bnVsbCYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKX1yZXR1cm4gb3QodCksbnVsbDtjYXNlIDY6aWYoZSYmdC5zdGF0ZU5vZGUhPW51bGwpTWgoZSx0LGUubWVtb2l6ZWRQcm9wcyxyKTtlbHNle2lmKHR5cGVvZiByIT0ic3RyaW5nIiYmdC5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKEkoMTY2KSk7aWYobj1DcihNYS5jdXJyZW50KSxDcih2bi5jdXJyZW50KSwkaSh0KSl7aWYocj10LnN0YXRlTm9kZSxuPXQubWVtb2l6ZWRQcm9wcyxyW2huXT10LChhPXIubm9kZVZhbHVlIT09bikmJihlPV90LGUhPT1udWxsKSlzd2l0Y2goZS50YWcpe2Nhc2UgMzpVaShyLm5vZGVWYWx1ZSxuLChlLm1vZGUmMSkhPT0wKTticmVhaztjYXNlIDU6ZS5tZW1vaXplZFByb3BzLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiZVaShyLm5vZGVWYWx1ZSxuLChlLm1vZGUmMSkhPT0wKX1hJiYodC5mbGFnc3w9NCl9ZWxzZSByPShuLm5vZGVUeXBlPT09OT9uOm4ub3duZXJEb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUocikscltobl09dCx0LnN0YXRlTm9kZT1yfXJldHVybiBvdCh0KSxudWxsO2Nhc2UgMTM6aWYoRGUoUmUpLHI9dC5tZW1vaXplZFN0YXRlLGU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKEFlJiZEdCE9PW51bGwmJnQubW9kZSYxJiYhKHQuZmxhZ3MmMTI4KSlKbSgpLF9vKCksdC5mbGFnc3w9OTg1NjAsYT0hMTtlbHNlIGlmKGE9JGkodCksciE9PW51bGwmJnIuZGVoeWRyYXRlZCE9PW51bGwpe2lmKGU9PT1udWxsKXtpZighYSl0aHJvdyBFcnJvcihJKDMxOCkpO2lmKGE9dC5tZW1vaXplZFN0YXRlLGE9YSE9PW51bGw/YS5kZWh5ZHJhdGVkOm51bGwsIWEpdGhyb3cgRXJyb3IoSSgzMTcpKTthW2huXT10fWVsc2UgX28oKSwhKHQuZmxhZ3MmMTI4KSYmKHQubWVtb2l6ZWRTdGF0ZT1udWxsKSx0LmZsYWdzfD00O290KHQpLGE9ITF9ZWxzZSBKdCE9PW51bGwmJihadShKdCksSnQ9bnVsbCksYT0hMDtpZighYSlyZXR1cm4gdC5mbGFncyY2NTUzNj90Om51bGx9cmV0dXJuIHQuZmxhZ3MmMTI4Pyh0LmxhbmVzPW4sdCk6KHI9ciE9PW51bGwsciE9PShlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlIT09bnVsbCkmJnImJih0LmNoaWxkLmZsYWdzfD04MTkyLHQubW9kZSYxJiYoZT09PW51bGx8fFJlLmN1cnJlbnQmMT9IZT09PTAmJihIZT0zKTpGYygpKSksdC51cGRhdGVRdWV1ZSE9PW51bGwmJih0LmZsYWdzfD00KSxvdCh0KSxudWxsKTtjYXNlIDQ6cmV0dXJuIEFvKCksVnUoZSx0KSxlPT09bnVsbCYmQ2EodC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksb3QodCksbnVsbDtjYXNlIDEwOnJldHVybiB4Yyh0LnR5cGUuX2NvbnRleHQpLG90KHQpLG51bGw7Y2FzZSAxNzpyZXR1cm4gd3QodC50eXBlKSYmY3MoKSxvdCh0KSxudWxsO2Nhc2UgMTk6aWYoRGUoUmUpLGE9dC5tZW1vaXplZFN0YXRlLGE9PT1udWxsKXJldHVybiBvdCh0KSxudWxsO2lmKHI9KHQuZmxhZ3MmMTI4KSE9PTAsaT1hLnJlbmRlcmluZyxpPT09bnVsbClpZihyKWFhKGEsITEpO2Vsc2V7aWYoSGUhPT0wfHxlIT09bnVsbCYmZS5mbGFncyYxMjgpZm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGk9dnMoZSksaSE9PW51bGwpe2Zvcih0LmZsYWdzfD0xMjgsYWEoYSwhMSkscj1pLnVwZGF0ZVF1ZXVlLHIhPT1udWxsJiYodC51cGRhdGVRdWV1ZT1yLHQuZmxhZ3N8PTQpLHQuc3VidHJlZUZsYWdzPTAscj1uLG49dC5jaGlsZDtuIT09bnVsbDspYT1uLGU9cixhLmZsYWdzJj0xNDY4MDA2NixpPWEuYWx0ZXJuYXRlLGk9PT1udWxsPyhhLmNoaWxkTGFuZXM9MCxhLmxhbmVzPWUsYS5jaGlsZD1udWxsLGEuc3VidHJlZUZsYWdzPTAsYS5tZW1vaXplZFByb3BzPW51bGwsYS5tZW1vaXplZFN0YXRlPW51bGwsYS51cGRhdGVRdWV1ZT1udWxsLGEuZGVwZW5kZW5jaWVzPW51bGwsYS5zdGF0ZU5vZGU9bnVsbCk6KGEuY2hpbGRMYW5lcz1pLmNoaWxkTGFuZXMsYS5sYW5lcz1pLmxhbmVzLGEuY2hpbGQ9aS5jaGlsZCxhLnN1YnRyZWVGbGFncz0wLGEuZGVsZXRpb25zPW51bGwsYS5tZW1vaXplZFByb3BzPWkubWVtb2l6ZWRQcm9wcyxhLm1lbW9pemVkU3RhdGU9aS5tZW1vaXplZFN0YXRlLGEudXBkYXRlUXVldWU9aS51cGRhdGVRdWV1ZSxhLnR5cGU9aS50eXBlLGU9aS5kZXBlbmRlbmNpZXMsYS5kZXBlbmRlbmNpZXM9ZT09PW51bGw/bnVsbDp7bGFuZXM6ZS5sYW5lcyxmaXJzdENvbnRleHQ6ZS5maXJzdENvbnRleHR9KSxuPW4uc2libGluZztyZXR1cm4gU2UoUmUsUmUuY3VycmVudCYxfDIpLHQuY2hpbGR9ZT1lLnNpYmxpbmd9YS50YWlsIT09bnVsbCYmRmUoKT5SbyYmKHQuZmxhZ3N8PTEyOCxyPSEwLGFhKGEsITEpLHQubGFuZXM9NDE5NDMwNCl9ZWxzZXtpZighcilpZihlPXZzKGkpLGUhPT1udWxsKXtpZih0LmZsYWdzfD0xMjgscj0hMCxuPWUudXBkYXRlUXVldWUsbiE9PW51bGwmJih0LnVwZGF0ZVF1ZXVlPW4sdC5mbGFnc3w9NCksYWEoYSwhMCksYS50YWlsPT09bnVsbCYmYS50YWlsTW9kZT09PSJoaWRkZW4iJiYhaS5hbHRlcm5hdGUmJiFBZSlyZXR1cm4gb3QodCksbnVsbH1lbHNlIDIqRmUoKS1hLnJlbmRlcmluZ1N0YXJ0VGltZT5SbyYmbiE9PTEwNzM3NDE4MjQmJih0LmZsYWdzfD0xMjgscj0hMCxhYShhLCExKSx0LmxhbmVzPTQxOTQzMDQpO2EuaXNCYWNrd2FyZHM/KGkuc2libGluZz10LmNoaWxkLHQuY2hpbGQ9aSk6KG49YS5sYXN0LG4hPT1udWxsP24uc2libGluZz1pOnQuY2hpbGQ9aSxhLmxhc3Q9aSl9cmV0dXJuIGEudGFpbCE9PW51bGw/KHQ9YS50YWlsLGEucmVuZGVyaW5nPXQsYS50YWlsPXQuc2libGluZyxhLnJlbmRlcmluZ1N0YXJ0VGltZT1GZSgpLHQuc2libGluZz1udWxsLG49UmUuY3VycmVudCxTZShSZSxyP24mMXwyOm4mMSksdCk6KG90KHQpLG51bGwpO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gemMoKSxyPXQubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwhPT1yJiYodC5mbGFnc3w9ODE5MiksciYmdC5tb2RlJjE/TnQmMTA3Mzc0MTgyNCYmKG90KHQpLHQuc3VidHJlZUZsYWdzJjYmJih0LmZsYWdzfD04MTkyKSk6b3QodCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2Nhc2UgMjU6cmV0dXJuIG51bGx9dGhyb3cgRXJyb3IoSSgxNTYsdC50YWcpKX1mdW5jdGlvbiB4YihlLHQpe3N3aXRjaCh2Yyh0KSx0LnRhZyl7Y2FzZSAxOnJldHVybiB3dCh0LnR5cGUpJiZjcygpLGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMzpyZXR1cm4gQW8oKSxEZSh5dCksRGUoaXQpLE5jKCksZT10LmZsYWdzLGUmNjU1MzYmJiEoZSYxMjgpPyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgNTpyZXR1cm4gVGModCksbnVsbDtjYXNlIDEzOmlmKERlKFJlKSxlPXQubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYodC5hbHRlcm5hdGU9PT1udWxsKXRocm93IEVycm9yKEkoMzQwKSk7X28oKX1yZXR1cm4gZT10LmZsYWdzLGUmNjU1MzY/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSAxOTpyZXR1cm4gRGUoUmUpLG51bGw7Y2FzZSA0OnJldHVybiBBbygpLG51bGw7Y2FzZSAxMDpyZXR1cm4geGModC50eXBlLl9jb250ZXh0KSxudWxsO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gemMoKSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIEhpPSExLGF0PSExLGtiPXR5cGVvZiBXZWFrU2V0PT0iZnVuY3Rpb24iP1dlYWtTZXQ6U2V0LEI9bnVsbDtmdW5jdGlvbiB5byhlLHQpe3ZhciBuPWUucmVmO2lmKG4hPT1udWxsKWlmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXRyeXtuKG51bGwpfWNhdGNoKHIpe0xlKGUsdCxyKX1lbHNlIG4uY3VycmVudD1udWxsfWZ1bmN0aW9uIEd1KGUsdCxuKXt0cnl7bigpfWNhdGNoKHIpe0xlKGUsdCxyKX19dmFyIEhmPSExO2Z1bmN0aW9uIFNiKGUsdCl7aWYoQ3U9aXMsZT1GbSgpLGhjKGUpKXtpZigic2VsZWN0aW9uU3RhcnQiaW4gZSl2YXIgbj17c3RhcnQ6ZS5zZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2Vsc2UgZTp7bj0obj1lLm93bmVyRG9jdW1lbnQpJiZuLmRlZmF1bHRWaWV3fHx3aW5kb3c7dmFyIHI9bi5nZXRTZWxlY3Rpb24mJm4uZ2V0U2VsZWN0aW9uKCk7aWYociYmci5yYW5nZUNvdW50IT09MCl7bj1yLmFuY2hvck5vZGU7dmFyIG89ci5hbmNob3JPZmZzZXQsYT1yLmZvY3VzTm9kZTtyPXIuZm9jdXNPZmZzZXQ7dHJ5e24ubm9kZVR5cGUsYS5ub2RlVHlwZX1jYXRjaHtuPW51bGw7YnJlYWsgZX12YXIgaT0wLHM9LTEsbD0tMSx1PTAsYz0wLGQ9ZSxwPW51bGw7dDpmb3IoOzspe2Zvcih2YXIgZztkIT09bnx8byE9PTAmJmQubm9kZVR5cGUhPT0zfHwocz1pK28pLGQhPT1hfHxyIT09MCYmZC5ub2RlVHlwZSE9PTN8fChsPWkrciksZC5ub2RlVHlwZT09PTMmJihpKz1kLm5vZGVWYWx1ZS5sZW5ndGgpLChnPWQuZmlyc3RDaGlsZCkhPT1udWxsOylwPWQsZD1nO2Zvcig7Oyl7aWYoZD09PWUpYnJlYWsgdDtpZihwPT09biYmKyt1PT09byYmKHM9aSkscD09PWEmJisrYz09PXImJihsPWkpLChnPWQubmV4dFNpYmxpbmcpIT09bnVsbClicmVhaztkPXAscD1kLnBhcmVudE5vZGV9ZD1nfW49cz09PS0xfHxsPT09LTE/bnVsbDp7c3RhcnQ6cyxlbmQ6bH19ZWxzZSBuPW51bGx9bj1ufHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBuPW51bGw7Zm9yKEF1PXtmb2N1c2VkRWxlbTplLHNlbGVjdGlvblJhbmdlOm59LGlzPSExLEI9dDtCIT09bnVsbDspaWYodD1CLGU9dC5jaGlsZCwodC5zdWJ0cmVlRmxhZ3MmMTAyOCkhPT0wJiZlIT09bnVsbCllLnJldHVybj10LEI9ZTtlbHNlIGZvcig7QiE9PW51bGw7KXt0PUI7dHJ5e3ZhciB2PXQuYWx0ZXJuYXRlO2lmKHQuZmxhZ3MmMTAyNClzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6YnJlYWs7Y2FzZSAxOmlmKHYhPT1udWxsKXt2YXIgeT12Lm1lbW9pemVkUHJvcHMsYj12Lm1lbW9pemVkU3RhdGUsaD10LnN0YXRlTm9kZSxtPWguZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUodC5lbGVtZW50VHlwZT09PXQudHlwZT95OnF0KHQudHlwZSx5KSxiKTtoLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlPW19YnJlYWs7Y2FzZSAzOnZhciB3PXQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87dy5ub2RlVHlwZT09PTE/dy50ZXh0Q29udGVudD0iIjp3Lm5vZGVUeXBlPT09OSYmdy5kb2N1bWVudEVsZW1lbnQmJncucmVtb3ZlQ2hpbGQody5kb2N1bWVudEVsZW1lbnQpO2JyZWFrO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDE2MykpfX1jYXRjaChmKXtMZSh0LHQucmV0dXJuLGYpfWlmKGU9dC5zaWJsaW5nLGUhPT1udWxsKXtlLnJldHVybj10LnJldHVybixCPWU7YnJlYWt9Qj10LnJldHVybn1yZXR1cm4gdj1IZixIZj0hMSx2fWZ1bmN0aW9uIHlhKGUsdCxuKXt2YXIgcj10LnVwZGF0ZVF1ZXVlO2lmKHI9ciE9PW51bGw/ci5sYXN0RWZmZWN0Om51bGwsciE9PW51bGwpe3ZhciBvPXI9ci5uZXh0O2Rve2lmKChvLnRhZyZlKT09PWUpe3ZhciBhPW8uZGVzdHJveTtvLmRlc3Ryb3k9dm9pZCAwLGEhPT12b2lkIDAmJkd1KHQsbixhKX1vPW8ubmV4dH13aGlsZShvIT09cil9fWZ1bmN0aW9uIE1zKGUsdCl7aWYodD10LnVwZGF0ZVF1ZXVlLHQ9dCE9PW51bGw/dC5sYXN0RWZmZWN0Om51bGwsdCE9PW51bGwpe3ZhciBuPXQ9dC5uZXh0O2Rve2lmKChuLnRhZyZlKT09PWUpe3ZhciByPW4uY3JlYXRlO24uZGVzdHJveT1yKCl9bj1uLm5leHR9d2hpbGUobiE9PXQpfX1mdW5jdGlvbiBLdShlKXt2YXIgdD1lLnJlZjtpZih0IT09bnVsbCl7dmFyIG49ZS5zdGF0ZU5vZGU7c3dpdGNoKGUudGFnKXtjYXNlIDU6ZT1uO2JyZWFrO2RlZmF1bHQ6ZT1ufXR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSk6dC5jdXJyZW50PWV9fWZ1bmN0aW9uIEloKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO3QhPT1udWxsJiYoZS5hbHRlcm5hdGU9bnVsbCxJaCh0KSksZS5jaGlsZD1udWxsLGUuZGVsZXRpb25zPW51bGwsZS5zaWJsaW5nPW51bGwsZS50YWc9PT01JiYodD1lLnN0YXRlTm9kZSx0IT09bnVsbCYmKGRlbGV0ZSB0W2huXSxkZWxldGUgdFtPYV0sZGVsZXRlIHRbTXVdLGRlbGV0ZSB0W2FiXSxkZWxldGUgdFtpYl0pKSxlLnN0YXRlTm9kZT1udWxsLGUucmV0dXJuPW51bGwsZS5kZXBlbmRlbmNpZXM9bnVsbCxlLm1lbW9pemVkUHJvcHM9bnVsbCxlLm1lbW9pemVkU3RhdGU9bnVsbCxlLnBlbmRpbmdQcm9wcz1udWxsLGUuc3RhdGVOb2RlPW51bGwsZS51cGRhdGVRdWV1ZT1udWxsfWZ1bmN0aW9uIFBoKGUpe3JldHVybiBlLnRhZz09PTV8fGUudGFnPT09M3x8ZS50YWc9PT00fWZ1bmN0aW9uIGpmKGUpe2U6Zm9yKDs7KXtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fFBoKGUucmV0dXJuKSlyZXR1cm4gbnVsbDtlPWUucmV0dXJufWZvcihlLnNpYmxpbmcucmV0dXJuPWUucmV0dXJuLGU9ZS5zaWJsaW5nO2UudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTE4Oyl7aWYoZS5mbGFncyYyfHxlLmNoaWxkPT09bnVsbHx8ZS50YWc9PT00KWNvbnRpbnVlIGU7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGR9aWYoIShlLmZsYWdzJjIpKXJldHVybiBlLnN0YXRlTm9kZX19ZnVuY3Rpb24gWXUoZSx0LG4pe3ZhciByPWUudGFnO2lmKHI9PT01fHxyPT09NillPWUuc3RhdGVOb2RlLHQ/bi5ub2RlVHlwZT09PTg/bi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQpOm4uaW5zZXJ0QmVmb3JlKGUsdCk6KG4ubm9kZVR5cGU9PT04Pyh0PW4ucGFyZW50Tm9kZSx0Lmluc2VydEJlZm9yZShlLG4pKToodD1uLHQuYXBwZW5kQ2hpbGQoZSkpLG49bi5fcmVhY3RSb290Q29udGFpbmVyLG4hPW51bGx8fHQub25jbGljayE9PW51bGx8fCh0Lm9uY2xpY2s9dXMpKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoWXUoZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOylZdShlLHQsbiksZT1lLnNpYmxpbmd9ZnVuY3Rpb24gcXUoZSx0LG4pe3ZhciByPWUudGFnO2lmKHI9PT01fHxyPT09NillPWUuc3RhdGVOb2RlLHQ/bi5pbnNlcnRCZWZvcmUoZSx0KTpuLmFwcGVuZENoaWxkKGUpO2Vsc2UgaWYociE9PTQmJihlPWUuY2hpbGQsZSE9PW51bGwpKWZvcihxdShlLHQsbiksZT1lLnNpYmxpbmc7ZSE9PW51bGw7KXF1KGUsdCxuKSxlPWUuc2libGluZ312YXIgSmU9bnVsbCxRdD0hMTtmdW5jdGlvbiBHbihlLHQsbil7Zm9yKG49bi5jaGlsZDtuIT09bnVsbDspTGgoZSx0LG4pLG49bi5zaWJsaW5nfWZ1bmN0aW9uIExoKGUsdCxuKXtpZihnbiYmdHlwZW9mIGduLm9uQ29tbWl0RmliZXJVbm1vdW50PT0iZnVuY3Rpb24iKXRyeXtnbi5vbkNvbW1pdEZpYmVyVW5tb3VudChUcyxuKX1jYXRjaHt9c3dpdGNoKG4udGFnKXtjYXNlIDU6YXR8fHlvKG4sdCk7Y2FzZSA2OnZhciByPUplLG89UXQ7SmU9bnVsbCxHbihlLHQsbiksSmU9cixRdD1vLEplIT09bnVsbCYmKFF0PyhlPUplLG49bi5zdGF0ZU5vZGUsZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOmUucmVtb3ZlQ2hpbGQobikpOkplLnJlbW92ZUNoaWxkKG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSAxODpKZSE9PW51bGwmJihRdD8oZT1KZSxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P1hsKGUucGFyZW50Tm9kZSxuKTplLm5vZGVUeXBlPT09MSYmWGwoZSxuKSxOYShlKSk6WGwoSmUsbi5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDQ6cj1KZSxvPVF0LEplPW4uc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sUXQ9ITAsR24oZSx0LG4pLEplPXIsUXQ9bzticmVhaztjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6aWYoIWF0JiYocj1uLnVwZGF0ZVF1ZXVlLHIhPT1udWxsJiYocj1yLmxhc3RFZmZlY3QsciE9PW51bGwpKSl7bz1yPXIubmV4dDtkb3t2YXIgYT1vLGk9YS5kZXN0cm95O2E9YS50YWcsaSE9PXZvaWQgMCYmKGEmMnx8YSY0KSYmR3Uobix0LGkpLG89by5uZXh0fXdoaWxlKG8hPT1yKX1HbihlLHQsbik7YnJlYWs7Y2FzZSAxOmlmKCFhdCYmKHlvKG4sdCkscj1uLnN0YXRlTm9kZSx0eXBlb2Ygci5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIikpdHJ5e3IucHJvcHM9bi5tZW1vaXplZFByb3BzLHIuc3RhdGU9bi5tZW1vaXplZFN0YXRlLHIuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChzKXtMZShuLHQscyl9R24oZSx0LG4pO2JyZWFrO2Nhc2UgMjE6R24oZSx0LG4pO2JyZWFrO2Nhc2UgMjI6bi5tb2RlJjE/KGF0PShyPWF0KXx8bi5tZW1vaXplZFN0YXRlIT09bnVsbCxHbihlLHQsbiksYXQ9cik6R24oZSx0LG4pO2JyZWFrO2RlZmF1bHQ6R24oZSx0LG4pfX1mdW5jdGlvbiBWZihlKXt2YXIgdD1lLnVwZGF0ZVF1ZXVlO2lmKHQhPT1udWxsKXtlLnVwZGF0ZVF1ZXVlPW51bGw7dmFyIG49ZS5zdGF0ZU5vZGU7bj09PW51bGwmJihuPWUuc3RhdGVOb2RlPW5ldyBrYiksdC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPVJiLmJpbmQobnVsbCxlLHIpO24uaGFzKHIpfHwobi5hZGQociksci50aGVuKG8sbykpfSl9fWZ1bmN0aW9uIFl0KGUsdCl7dmFyIG49dC5kZWxldGlvbnM7aWYobiE9PW51bGwpZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dHJ5e3ZhciBhPWUsaT10LHM9aTtlOmZvcig7cyE9PW51bGw7KXtzd2l0Y2gocy50YWcpe2Nhc2UgNTpKZT1zLnN0YXRlTm9kZSxRdD0hMTticmVhayBlO2Nhc2UgMzpKZT1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLFF0PSEwO2JyZWFrIGU7Y2FzZSA0OkplPXMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sUXQ9ITA7YnJlYWsgZX1zPXMucmV0dXJufWlmKEplPT09bnVsbCl0aHJvdyBFcnJvcihJKDE2MCkpO0xoKGEsaSxvKSxKZT1udWxsLFF0PSExO3ZhciBsPW8uYWx0ZXJuYXRlO2whPT1udWxsJiYobC5yZXR1cm49bnVsbCksby5yZXR1cm49bnVsbH1jYXRjaCh1KXtMZShvLHQsdSl9fWlmKHQuc3VidHJlZUZsYWdzJjEyODU0KWZvcih0PXQuY2hpbGQ7dCE9PW51bGw7KXpoKHQsZSksdD10LnNpYmxpbmd9ZnVuY3Rpb24gemgoZSx0KXt2YXIgbj1lLmFsdGVybmF0ZSxyPWUuZmxhZ3M7c3dpdGNoKGUudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6aWYoWXQodCxlKSxmbihlKSxyJjQpe3RyeXt5YSgzLGUsZS5yZXR1cm4pLE1zKDMsZSl9Y2F0Y2goeSl7TGUoZSxlLnJldHVybix5KX10cnl7eWEoNSxlLGUucmV0dXJuKX1jYXRjaCh5KXtMZShlLGUucmV0dXJuLHkpfX1icmVhaztjYXNlIDE6WXQodCxlKSxmbihlKSxyJjUxMiYmbiE9PW51bGwmJnlvKG4sbi5yZXR1cm4pO2JyZWFrO2Nhc2UgNTppZihZdCh0LGUpLGZuKGUpLHImNTEyJiZuIT09bnVsbCYmeW8obixuLnJldHVybiksZS5mbGFncyYzMil7dmFyIG89ZS5zdGF0ZU5vZGU7dHJ5e2thKG8sIiIpfWNhdGNoKHkpe0xlKGUsZS5yZXR1cm4seSl9fWlmKHImNCYmKG89ZS5zdGF0ZU5vZGUsbyE9bnVsbCkpe3ZhciBhPWUubWVtb2l6ZWRQcm9wcyxpPW4hPT1udWxsP24ubWVtb2l6ZWRQcm9wczphLHM9ZS50eXBlLGw9ZS51cGRhdGVRdWV1ZTtpZihlLnVwZGF0ZVF1ZXVlPW51bGwsbCE9PW51bGwpdHJ5e3M9PT0iaW5wdXQiJiZhLnR5cGU9PT0icmFkaW8iJiZhLm5hbWUhPW51bGwmJmFtKG8sYSksd3UocyxpKTt2YXIgdT13dShzLGEpO2ZvcihpPTA7aTxsLmxlbmd0aDtpKz0yKXt2YXIgYz1sW2ldLGQ9bFtpKzFdO2M9PT0ic3R5bGUiP2NtKG8sZCk6Yz09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/bG0obyxkKTpjPT09ImNoaWxkcmVuIj9rYShvLGQpOm5jKG8sYyxkLHUpfXN3aXRjaChzKXtjYXNlImlucHV0IjptdShvLGEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmltKG8sYSk7YnJlYWs7Y2FzZSJzZWxlY3QiOnZhciBwPW8uX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtvLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFhLm11bHRpcGxlO3ZhciBnPWEudmFsdWU7ZyE9bnVsbD9ibyhvLCEhYS5tdWx0aXBsZSxnLCExKTpwIT09ISFhLm11bHRpcGxlJiYoYS5kZWZhdWx0VmFsdWUhPW51bGw/Ym8obywhIWEubXVsdGlwbGUsYS5kZWZhdWx0VmFsdWUsITApOmJvKG8sISFhLm11bHRpcGxlLGEubXVsdGlwbGU/W106IiIsITEpKX1vW09hXT1hfWNhdGNoKHkpe0xlKGUsZS5yZXR1cm4seSl9fWJyZWFrO2Nhc2UgNjppZihZdCh0LGUpLGZuKGUpLHImNCl7aWYoZS5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKEkoMTYyKSk7bz1lLnN0YXRlTm9kZSxhPWUubWVtb2l6ZWRQcm9wczt0cnl7by5ub2RlVmFsdWU9YX1jYXRjaCh5KXtMZShlLGUucmV0dXJuLHkpfX1icmVhaztjYXNlIDM6aWYoWXQodCxlKSxmbihlKSxyJjQmJm4hPT1udWxsJiZuLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXRyeXtOYSh0LmNvbnRhaW5lckluZm8pfWNhdGNoKHkpe0xlKGUsZS5yZXR1cm4seSl9YnJlYWs7Y2FzZSA0Oll0KHQsZSksZm4oZSk7YnJlYWs7Y2FzZSAxMzpZdCh0LGUpLGZuKGUpLG89ZS5jaGlsZCxvLmZsYWdzJjgxOTImJihhPW8ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsby5zdGF0ZU5vZGUuaXNIaWRkZW49YSwhYXx8by5hbHRlcm5hdGUhPT1udWxsJiZvLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlIT09bnVsbHx8KFBjPUZlKCkpKSxyJjQmJlZmKGUpO2JyZWFrO2Nhc2UgMjI6aWYoYz1uIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlIT09bnVsbCxlLm1vZGUmMT8oYXQ9KHU9YXQpfHxjLFl0KHQsZSksYXQ9dSk6WXQodCxlKSxmbihlKSxyJjgxOTIpe2lmKHU9ZS5tZW1vaXplZFN0YXRlIT09bnVsbCwoZS5zdGF0ZU5vZGUuaXNIaWRkZW49dSkmJiFjJiZlLm1vZGUmMSlmb3IoQj1lLGM9ZS5jaGlsZDtjIT09bnVsbDspe2ZvcihkPUI9YztCIT09bnVsbDspe3N3aXRjaChwPUIsZz1wLmNoaWxkLHAudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6eWEoNCxwLHAucmV0dXJuKTticmVhaztjYXNlIDE6eW8ocCxwLnJldHVybik7dmFyIHY9cC5zdGF0ZU5vZGU7aWYodHlwZW9mIHYuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpe3I9cCxuPXAucmV0dXJuO3RyeXt0PXIsdi5wcm9wcz10Lm1lbW9pemVkUHJvcHMsdi5zdGF0ZT10Lm1lbW9pemVkU3RhdGUsdi5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHkpe0xlKHIsbix5KX19YnJlYWs7Y2FzZSA1OnlvKHAscC5yZXR1cm4pO2JyZWFrO2Nhc2UgMjI6aWYocC5tZW1vaXplZFN0YXRlIT09bnVsbCl7S2YoZCk7Y29udGludWV9fWchPT1udWxsPyhnLnJldHVybj1wLEI9Zyk6S2YoZCl9Yz1jLnNpYmxpbmd9ZTpmb3IoYz1udWxsLGQ9ZTs7KXtpZihkLnRhZz09PTUpe2lmKGM9PT1udWxsKXtjPWQ7dHJ5e289ZC5zdGF0ZU5vZGUsdT8oYT1vLnN0eWxlLHR5cGVvZiBhLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP2Euc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6YS5kaXNwbGF5PSJub25lIik6KHM9ZC5zdGF0ZU5vZGUsbD1kLm1lbW9pemVkUHJvcHMuc3R5bGUsaT1sIT1udWxsJiZsLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/bC5kaXNwbGF5Om51bGwscy5zdHlsZS5kaXNwbGF5PXVtKCJkaXNwbGF5IixpKSl9Y2F0Y2goeSl7TGUoZSxlLnJldHVybix5KX19fWVsc2UgaWYoZC50YWc9PT02KXtpZihjPT09bnVsbCl0cnl7ZC5zdGF0ZU5vZGUubm9kZVZhbHVlPXU/IiI6ZC5tZW1vaXplZFByb3BzfWNhdGNoKHkpe0xlKGUsZS5yZXR1cm4seSl9fWVsc2UgaWYoKGQudGFnIT09MjImJmQudGFnIT09MjN8fGQubWVtb2l6ZWRTdGF0ZT09PW51bGx8fGQ9PT1lKSYmZC5jaGlsZCE9PW51bGwpe2QuY2hpbGQucmV0dXJuPWQsZD1kLmNoaWxkO2NvbnRpbnVlfWlmKGQ9PT1lKWJyZWFrIGU7Zm9yKDtkLnNpYmxpbmc9PT1udWxsOyl7aWYoZC5yZXR1cm49PT1udWxsfHxkLnJldHVybj09PWUpYnJlYWsgZTtjPT09ZCYmKGM9bnVsbCksZD1kLnJldHVybn1jPT09ZCYmKGM9bnVsbCksZC5zaWJsaW5nLnJldHVybj1kLnJldHVybixkPWQuc2libGluZ319YnJlYWs7Y2FzZSAxOTpZdCh0LGUpLGZuKGUpLHImNCYmVmYoZSk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0Oll0KHQsZSksZm4oZSl9fWZ1bmN0aW9uIGZuKGUpe3ZhciB0PWUuZmxhZ3M7aWYodCYyKXt0cnl7ZTp7Zm9yKHZhciBuPWUucmV0dXJuO24hPT1udWxsOyl7aWYoUGgobikpe3ZhciByPW47YnJlYWsgZX1uPW4ucmV0dXJufXRocm93IEVycm9yKEkoMTYwKSl9c3dpdGNoKHIudGFnKXtjYXNlIDU6dmFyIG89ci5zdGF0ZU5vZGU7ci5mbGFncyYzMiYmKGthKG8sIiIpLHIuZmxhZ3MmPS0zMyk7dmFyIGE9amYoZSk7cXUoZSxhLG8pO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGk9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxzPWpmKGUpO1l1KGUscyxpKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKEkoMTYxKSl9fWNhdGNoKGwpe0xlKGUsZS5yZXR1cm4sbCl9ZS5mbGFncyY9LTN9dCY0MDk2JiYoZS5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIEViKGUsdCxuKXtCPWUsRmgoZSx0LG4pfWZ1bmN0aW9uIEZoKGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7QiE9PW51bGw7KXt2YXIgbz1CLGE9by5jaGlsZDtpZihvLnRhZz09PTIyJiZyKXt2YXIgaT1vLm1lbW9pemVkU3RhdGUhPT1udWxsfHxIaTtpZighaSl7dmFyIHM9by5hbHRlcm5hdGUsbD1zIT09bnVsbCYmcy5tZW1vaXplZFN0YXRlIT09bnVsbHx8YXQ7cz1IaTt2YXIgdT1hdDtpZihIaT1pLChhdD1sKSYmIXUpZm9yKEI9bztCIT09bnVsbDspaT1CLGw9aS5jaGlsZCxpLnRhZz09PTIyJiZpLm1lbW9pemVkU3RhdGUhPT1udWxsP1lmKG8pOmwhPT1udWxsPyhsLnJldHVybj1pLEI9bCk6WWYobyk7Zm9yKDthIT09bnVsbDspQj1hLEZoKGEsdCxuKSxhPWEuc2libGluZztCPW8sSGk9cyxhdD11fUdmKGUsdCxuKX1lbHNlIG8uc3VidHJlZUZsYWdzJjg3NzImJmEhPT1udWxsPyhhLnJldHVybj1vLEI9YSk6R2YoZSx0LG4pfX1mdW5jdGlvbiBHZihlKXtmb3IoO0IhPT1udWxsOyl7dmFyIHQ9QjtpZih0LmZsYWdzJjg3NzIpe3ZhciBuPXQuYWx0ZXJuYXRlO3RyeXtpZih0LmZsYWdzJjg3NzIpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmF0fHxNcyg1LHQpO2JyZWFrO2Nhc2UgMTp2YXIgcj10LnN0YXRlTm9kZTtpZih0LmZsYWdzJjQmJiFhdClpZihuPT09bnVsbClyLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgbz10LmVsZW1lbnRUeXBlPT09dC50eXBlP24ubWVtb2l6ZWRQcm9wczpxdCh0LnR5cGUsbi5tZW1vaXplZFByb3BzKTtyLmNvbXBvbmVudERpZFVwZGF0ZShvLG4ubWVtb2l6ZWRTdGF0ZSxyLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgYT10LnVwZGF0ZVF1ZXVlO2EhPT1udWxsJiZBZih0LGEscik7YnJlYWs7Y2FzZSAzOnZhciBpPXQudXBkYXRlUXVldWU7aWYoaSE9PW51bGwpe2lmKG49bnVsbCx0LmNoaWxkIT09bnVsbClzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpuPXQuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTpuPXQuY2hpbGQuc3RhdGVOb2RlfUFmKHQsaSxuKX1icmVhaztjYXNlIDU6dmFyIHM9dC5zdGF0ZU5vZGU7aWYobj09PW51bGwmJnQuZmxhZ3MmNCl7bj1zO3ZhciBsPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2godC50eXBlKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmwuYXV0b0ZvY3VzJiZuLmZvY3VzKCk7YnJlYWs7Y2FzZSJpbWciOmwuc3JjJiYobi5zcmM9bC5zcmMpfX1icmVhaztjYXNlIDY6YnJlYWs7Y2FzZSA0OmJyZWFrO2Nhc2UgMTI6YnJlYWs7Y2FzZSAxMzppZih0Lm1lbW9pemVkU3RhdGU9PT1udWxsKXt2YXIgdT10LmFsdGVybmF0ZTtpZih1IT09bnVsbCl7dmFyIGM9dS5tZW1vaXplZFN0YXRlO2lmKGMhPT1udWxsKXt2YXIgZD1jLmRlaHlkcmF0ZWQ7ZCE9PW51bGwmJk5hKGQpfX19YnJlYWs7Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmNhc2UgMjU6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDE2MykpfWF0fHx0LmZsYWdzJjUxMiYmS3UodCl9Y2F0Y2gocCl7TGUodCx0LnJldHVybixwKX19aWYodD09PWUpe0I9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4sQj1uO2JyZWFrfUI9dC5yZXR1cm59fWZ1bmN0aW9uIEtmKGUpe2Zvcig7QiE9PW51bGw7KXt2YXIgdD1CO2lmKHQ9PT1lKXtCPW51bGw7YnJlYWt9dmFyIG49dC5zaWJsaW5nO2lmKG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybixCPW47YnJlYWt9Qj10LnJldHVybn19ZnVuY3Rpb24gWWYoZSl7Zm9yKDtCIT09bnVsbDspe3ZhciB0PUI7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7TXMoNCx0KX1jYXRjaChsKXtMZSh0LG4sbCl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgbz10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGwpe0xlKHQsbyxsKX19dmFyIGE9dC5yZXR1cm47dHJ5e0t1KHQpfWNhdGNoKGwpe0xlKHQsYSxsKX1icmVhaztjYXNlIDU6dmFyIGk9dC5yZXR1cm47dHJ5e0t1KHQpfWNhdGNoKGwpe0xlKHQsaSxsKX19fWNhdGNoKGwpe0xlKHQsdC5yZXR1cm4sbCl9aWYodD09PWUpe0I9bnVsbDticmVha312YXIgcz10LnNpYmxpbmc7aWYocyE9PW51bGwpe3MucmV0dXJuPXQucmV0dXJuLEI9czticmVha31CPXQucmV0dXJufX12YXIgVGI9TWF0aC5jZWlsLGJzPUluLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTWM9SW4uUmVhY3RDdXJyZW50T3duZXIsVXQ9SW4uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsaWU9MCxLZT1udWxsLCRlPW51bGwsWGU9MCxOdD0wLHdvPWNyKDApLEhlPTAsemE9bnVsbCxQcj0wLElzPTAsSWM9MCx3YT1udWxsLGd0PW51bGwsUGM9MCxSbz0xLzAsVG49bnVsbCx4cz0hMSxRdT1udWxsLG9yPW51bGwsamk9ITEsWG49bnVsbCxrcz0wLGJhPTAsSnU9bnVsbCxYaT0tMSxaaT0wO2Z1bmN0aW9uIGR0KCl7cmV0dXJuIGllJjY/RmUoKTpYaSE9PS0xP1hpOlhpPUZlKCl9ZnVuY3Rpb24gYXIoZSl7cmV0dXJuIGUubW9kZSYxP2llJjImJlhlIT09MD9YZSYtWGU6bGIudHJhbnNpdGlvbiE9PW51bGw/KFppPT09MCYmKFppPWttKCkpLFppKTooZT1nZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjpDbShlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIFp0KGUsdCxuLHIpe2lmKDUwPGJhKXRocm93IGJhPTAsSnU9bnVsbCxFcnJvcihJKDE4NSkpO0ZhKGUsbixyKSwoIShpZSYyKXx8ZSE9PUtlKSYmKGU9PT1LZSYmKCEoaWUmMikmJihJc3w9biksSGU9PT00JiZRbihlLFhlKSksYnQoZSxyKSxuPT09MSYmaWU9PT0wJiYhKHQubW9kZSYxKSYmKFJvPUZlKCkrNTAwLEFzJiZkcigpKSl9ZnVuY3Rpb24gYnQoZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtjdyhlLHQpO3ZhciByPWFzKGUsZT09PUtlP1hlOjApO2lmKHI9PT0wKW4hPT1udWxsJiZ0ZihuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJnRmKG4pLHQ9PT0xKWUudGFnPT09MD9zYihxZi5iaW5kKG51bGwsZSkpOlltKHFmLmJpbmQobnVsbCxlKSkscmIoZnVuY3Rpb24oKXshKGllJjYpJiZkcigpfSksbj1udWxsO2Vsc2V7c3dpdGNoKFNtKHIpKXtjYXNlIDE6bj1zYzticmVhaztjYXNlIDQ6bj1ibTticmVhaztjYXNlIDE2Om49b3M7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj14bTticmVhaztkZWZhdWx0Om49b3N9bj1HaChuLFVoLmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gVWgoZSx0KXtpZihYaT0tMSxaaT0wLGllJjYpdGhyb3cgRXJyb3IoSSgzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZihUbygpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9YXMoZSxlPT09S2U/WGU6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PVNzKGUscik7ZWxzZXt0PXI7dmFyIG89aWU7aWV8PTI7dmFyIGE9QmgoKTsoS2UhPT1lfHxYZSE9PXQpJiYoVG49bnVsbCxSbz1GZSgpKzUwMCxBcihlLHQpKTtkbyB0cnl7X2IoKTticmVha31jYXRjaChzKXskaChlLHMpfXdoaWxlKCEwKTtiYygpLGJzLmN1cnJlbnQ9YSxpZT1vLCRlIT09bnVsbD90PTA6KEtlPW51bGwsWGU9MCx0PUhlKX1pZih0IT09MCl7aWYodD09PTImJihvPUV1KGUpLG8hPT0wJiYocj1vLHQ9WHUoZSxvKSkpLHQ9PT0xKXRocm93IG49emEsQXIoZSwwKSxRbihlLHIpLGJ0KGUsRmUoKSksbjtpZih0PT09NilRbihlLHIpO2Vsc2V7aWYobz1lLmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiFOYihvKSYmKHQ9U3MoZSxyKSx0PT09MiYmKGE9RXUoZSksYSE9PTAmJihyPWEsdD1YdShlLGEpKSksdD09PTEpKXRocm93IG49emEsQXIoZSwwKSxRbihlLHIpLGJ0KGUsRmUoKSksbjtzd2l0Y2goZS5maW5pc2hlZFdvcms9byxlLmZpbmlzaGVkTGFuZXM9cix0KXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKEkoMzQ1KSk7Y2FzZSAyOk5yKGUsZ3QsVG4pO2JyZWFrO2Nhc2UgMzppZihRbihlLHIpLChyJjEzMDAyMzQyNCk9PT1yJiYodD1QYys1MDAtRmUoKSwxMDx0KSl7aWYoYXMoZSwwKSE9PTApYnJlYWs7aWYobz1lLnN1c3BlbmRlZExhbmVzLChvJnIpIT09cil7ZHQoKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm87YnJlYWt9ZS50aW1lb3V0SGFuZGxlPVJ1KE5yLmJpbmQobnVsbCxlLGd0LFRuKSx0KTticmVha31OcihlLGd0LFRuKTticmVhaztjYXNlIDQ6aWYoUW4oZSxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKHQ9ZS5ldmVudFRpbWVzLG89LTE7MDxyOyl7dmFyIGk9MzEtWHQocik7YT0xPDxpLGk9dFtpXSxpPm8mJihvPWkpLHImPX5hfWlmKHI9byxyPUZlKCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKlRiKHIvMTk2MCkpLXIsMTA8cil7ZS50aW1lb3V0SGFuZGxlPVJ1KE5yLmJpbmQobnVsbCxlLGd0LFRuKSxyKTticmVha31OcihlLGd0LFRuKTticmVhaztjYXNlIDU6TnIoZSxndCxUbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDMyOSkpfX19cmV0dXJuIGJ0KGUsRmUoKSksZS5jYWxsYmFja05vZGU9PT1uP1VoLmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIFh1KGUsdCl7dmFyIG49d2E7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKEFyKGUsdCkuZmxhZ3N8PTI1NiksZT1TcyhlLHQpLGUhPT0yJiYodD1ndCxndD1uLHQhPT1udWxsJiZadSh0KSksZX1mdW5jdGlvbiBadShlKXtndD09PW51bGw/Z3Q9ZTpndC5wdXNoLmFwcGx5KGd0LGUpfWZ1bmN0aW9uIE5iKGUpe2Zvcih2YXIgdD1lOzspe2lmKHQuZmxhZ3MmMTYzODQpe3ZhciBuPXQudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXSxhPW8uZ2V0U25hcHNob3Q7bz1vLnZhbHVlO3RyeXtpZighZW4oYSgpLG8pKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj10LmNoaWxkLHQuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj10LHQ9bjtlbHNle2lmKHQ9PT1lKWJyZWFrO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1lKXJldHVybiEwO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gUW4oZSx0KXtmb3IodCY9fkljLHQmPX5JcyxlLnN1c3BlbmRlZExhbmVzfD10LGUucGluZ2VkTGFuZXMmPX50LGU9ZS5leHBpcmF0aW9uVGltZXM7MDx0Oyl7dmFyIG49MzEtWHQodCkscj0xPDxuO2Vbbl09LTEsdCY9fnJ9fWZ1bmN0aW9uIHFmKGUpe2lmKGllJjYpdGhyb3cgRXJyb3IoSSgzMjcpKTtUbygpO3ZhciB0PWFzKGUsMCk7aWYoISh0JjEpKXJldHVybiBidChlLEZlKCkpLG51bGw7dmFyIG49U3MoZSx0KTtpZihlLnRhZyE9PTAmJm49PT0yKXt2YXIgcj1FdShlKTtyIT09MCYmKHQ9cixuPVh1KGUscikpfWlmKG49PT0xKXRocm93IG49emEsQXIoZSwwKSxRbihlLHQpLGJ0KGUsRmUoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihJKDM0NSkpO3JldHVybiBlLmZpbmlzaGVkV29yaz1lLmN1cnJlbnQuYWx0ZXJuYXRlLGUuZmluaXNoZWRMYW5lcz10LE5yKGUsZ3QsVG4pLGJ0KGUsRmUoKSksbnVsbH1mdW5jdGlvbiBMYyhlLHQpe3ZhciBuPWllO2llfD0xO3RyeXtyZXR1cm4gZSh0KX1maW5hbGx5e2llPW4saWU9PT0wJiYoUm89RmUoKSs1MDAsQXMmJmRyKCkpfX1mdW5jdGlvbiBMcihlKXtYbiE9PW51bGwmJlhuLnRhZz09PTAmJiEoaWUmNikmJlRvKCk7dmFyIHQ9aWU7aWV8PTE7dmFyIG49VXQudHJhbnNpdGlvbixyPWdlO3RyeXtpZihVdC50cmFuc2l0aW9uPW51bGwsZ2U9MSxlKXJldHVybiBlKCl9ZmluYWxseXtnZT1yLFV0LnRyYW5zaXRpb249bixpZT10LCEoaWUmNikmJmRyKCl9fWZ1bmN0aW9uIHpjKCl7TnQ9d28uY3VycmVudCxEZSh3byl9ZnVuY3Rpb24gQXIoZSx0KXtlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wO3ZhciBuPWUudGltZW91dEhhbmRsZTtpZihuIT09LTEmJihlLnRpbWVvdXRIYW5kbGU9LTEsbmIobikpLCRlIT09bnVsbClmb3Iobj0kZS5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaCh2YyhyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJmNzKCk7YnJlYWs7Y2FzZSAzOkFvKCksRGUoeXQpLERlKGl0KSxOYygpO2JyZWFrO2Nhc2UgNTpUYyhyKTticmVhaztjYXNlIDQ6QW8oKTticmVhaztjYXNlIDEzOkRlKFJlKTticmVhaztjYXNlIDE5OkRlKFJlKTticmVhaztjYXNlIDEwOnhjKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOnpjKCl9bj1uLnJldHVybn1pZihLZT1lLCRlPWU9aXIoZS5jdXJyZW50LG51bGwpLFhlPU50PXQsSGU9MCx6YT1udWxsLEljPUlzPVByPTAsZ3Q9d2E9bnVsbCxfciE9PW51bGwpe2Zvcih0PTA7dDxfci5sZW5ndGg7dCsrKWlmKG49X3JbdF0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIG89ci5uZXh0LGE9bi5wZW5kaW5nO2lmKGEhPT1udWxsKXt2YXIgaT1hLm5leHQ7YS5uZXh0PW8sci5uZXh0PWl9bi5wZW5kaW5nPXJ9X3I9bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiAkaChlLHQpe2Rve3ZhciBuPSRlO3RyeXtpZihiYygpLHFpLmN1cnJlbnQ9d3MseXMpe2Zvcih2YXIgcj1NZS5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIG89ci5xdWV1ZTtvIT09bnVsbCYmKG8ucGVuZGluZz1udWxsKSxyPXIubmV4dH15cz0hMX1pZihJcj0wLEdlPVdlPU1lPW51bGwsdmE9ITEsSWE9MCxNYy5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7SGU9MSx6YT10LCRlPW51bGw7YnJlYWt9ZTp7dmFyIGE9ZSxpPW4ucmV0dXJuLHM9bixsPXQ7aWYodD1YZSxzLmZsYWdzfD0zMjc2OCxsIT09bnVsbCYmdHlwZW9mIGw9PSJvYmplY3QiJiZ0eXBlb2YgbC50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1sLGM9cyxkPWMudGFnO2lmKCEoYy5tb2RlJjEpJiYoZD09PTB8fGQ9PT0xMXx8ZD09PTE1KSl7dmFyIHA9Yy5hbHRlcm5hdGU7cD8oYy51cGRhdGVRdWV1ZT1wLnVwZGF0ZVF1ZXVlLGMubWVtb2l6ZWRTdGF0ZT1wLm1lbW9pemVkU3RhdGUsYy5sYW5lcz1wLmxhbmVzKTooYy51cGRhdGVRdWV1ZT1udWxsLGMubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgZz1MZihpKTtpZihnIT09bnVsbCl7Zy5mbGFncyY9LTI1Nyx6ZihnLGkscyxhLHQpLGcubW9kZSYxJiZQZihhLHUsdCksdD1nLGw9dTt2YXIgdj10LnVwZGF0ZVF1ZXVlO2lmKHY9PT1udWxsKXt2YXIgeT1uZXcgU2V0O3kuYWRkKGwpLHQudXBkYXRlUXVldWU9eX1lbHNlIHYuYWRkKGwpO2JyZWFrIGV9ZWxzZXtpZighKHQmMSkpe1BmKGEsdSx0KSxGYygpO2JyZWFrIGV9bD1FcnJvcihJKDQyNikpfX1lbHNlIGlmKEFlJiZzLm1vZGUmMSl7dmFyIGI9TGYoaSk7aWYoYiE9PW51bGwpeyEoYi5mbGFncyY2NTUzNikmJihiLmZsYWdzfD0yNTYpLHpmKGIsaSxzLGEsdCkseWMoT28obCxzKSk7YnJlYWsgZX19YT1sPU9vKGwscyksSGUhPT00JiYoSGU9Miksd2E9PT1udWxsP3dhPVthXTp3YS5wdXNoKGEpLGE9aTtkb3tzd2l0Y2goYS50YWcpe2Nhc2UgMzphLmZsYWdzfD02NTUzNix0Jj0tdCxhLmxhbmVzfD10O3ZhciBoPVNoKGEsbCx0KTtDZihhLGgpO2JyZWFrIGU7Y2FzZSAxOnM9bDt2YXIgbT1hLnR5cGUsdz1hLnN0YXRlTm9kZTtpZighKGEuZmxhZ3MmMTI4KSYmKHR5cGVvZiBtLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8dyE9PW51bGwmJnR5cGVvZiB3LmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYob3I9PT1udWxsfHwhb3IuaGFzKHcpKSkpe2EuZmxhZ3N8PTY1NTM2LHQmPS10LGEubGFuZXN8PXQ7dmFyIGY9RWgoYSxzLHQpO0NmKGEsZik7YnJlYWsgZX19YT1hLnJldHVybn13aGlsZShhIT09bnVsbCl9SGgobil9Y2F0Y2goVCl7dD1ULCRlPT09biYmbiE9PW51bGwmJigkZT1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSghMCl9ZnVuY3Rpb24gQmgoKXt2YXIgZT1icy5jdXJyZW50O3JldHVybiBicy5jdXJyZW50PXdzLGU9PT1udWxsP3dzOmV9ZnVuY3Rpb24gRmMoKXsoSGU9PT0wfHxIZT09PTN8fEhlPT09MikmJihIZT00KSxLZT09PW51bGx8fCEoUHImMjY4NDM1NDU1KSYmIShJcyYyNjg0MzU0NTUpfHxRbihLZSxYZSl9ZnVuY3Rpb24gU3MoZSx0KXt2YXIgbj1pZTtpZXw9Mjt2YXIgcj1CaCgpOyhLZSE9PWV8fFhlIT09dCkmJihUbj1udWxsLEFyKGUsdCkpO2RvIHRyeXtEYigpO2JyZWFrfWNhdGNoKG8peyRoKGUsbyl9d2hpbGUoITApO2lmKGJjKCksaWU9bixicy5jdXJyZW50PXIsJGUhPT1udWxsKXRocm93IEVycm9yKEkoMjYxKSk7cmV0dXJuIEtlPW51bGwsWGU9MCxIZX1mdW5jdGlvbiBEYigpe2Zvcig7JGUhPT1udWxsOylXaCgkZSl9ZnVuY3Rpb24gX2IoKXtmb3IoOyRlIT09bnVsbCYmIXR3KCk7KVdoKCRlKX1mdW5jdGlvbiBXaChlKXt2YXIgdD1WaChlLmFsdGVybmF0ZSxlLE50KTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/SGgoZSk6JGU9dCxNYy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gSGgoZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49eGIobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsJGU9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7SGU9NiwkZT1udWxsO3JldHVybn19ZWxzZSBpZihuPWJiKG4sdCxOdCksbiE9PW51bGwpeyRlPW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXskZT10O3JldHVybn0kZT10PWV9d2hpbGUodCE9PW51bGwpO0hlPT09MCYmKEhlPTUpfWZ1bmN0aW9uIE5yKGUsdCxuKXt2YXIgcj1nZSxvPVV0LnRyYW5zaXRpb247dHJ5e1V0LnRyYW5zaXRpb249bnVsbCxnZT0xLENiKGUsdCxuLHIpfWZpbmFsbHl7VXQudHJhbnNpdGlvbj1vLGdlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQ2IoZSx0LG4scil7ZG8gVG8oKTt3aGlsZShYbiE9PW51bGwpO2lmKGllJjYpdGhyb3cgRXJyb3IoSSgzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBvPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoSSgxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBhPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKGR3KGUsYSksZT09PUtlJiYoJGU9S2U9bnVsbCxYZT0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fGppfHwoamk9ITAsR2gob3MsZnVuY3Rpb24oKXtyZXR1cm4gVG8oKSxudWxsfSkpLGE9KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8YSl7YT1VdC50cmFuc2l0aW9uLFV0LnRyYW5zaXRpb249bnVsbDt2YXIgaT1nZTtnZT0xO3ZhciBzPWllO2llfD00LE1jLmN1cnJlbnQ9bnVsbCxTYihlLG4pLHpoKG4sZSksSncoQXUpLGlzPSEhQ3UsQXU9Q3U9bnVsbCxlLmN1cnJlbnQ9bixFYihuLGUsbyksbncoKSxpZT1zLGdlPWksVXQudHJhbnNpdGlvbj1hfWVsc2UgZS5jdXJyZW50PW47aWYoamkmJihqaT0hMSxYbj1lLGtzPW8pLGE9ZS5wZW5kaW5nTGFuZXMsYT09PTAmJihvcj1udWxsKSxhdyhuLnN0YXRlTm9kZSxyKSxidChlLEZlKCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0scihvLnZhbHVlLHtjb21wb25lbnRTdGFjazpvLnN0YWNrLGRpZ2VzdDpvLmRpZ2VzdH0pO2lmKHhzKXRocm93IHhzPSExLGU9UXUsUXU9bnVsbCxlO3JldHVybiBrcyYxJiZlLnRhZyE9PTAmJlRvKCksYT1lLnBlbmRpbmdMYW5lcyxhJjE/ZT09PUp1P2JhKys6KGJhPTAsSnU9ZSk6YmE9MCxkcigpLG51bGx9ZnVuY3Rpb24gVG8oKXtpZihYbiE9PW51bGwpe3ZhciBlPVNtKGtzKSx0PVV0LnRyYW5zaXRpb24sbj1nZTt0cnl7aWYoVXQudHJhbnNpdGlvbj1udWxsLGdlPTE2PmU/MTY6ZSxYbj09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPVhuLFhuPW51bGwsa3M9MCxpZSY2KXRocm93IEVycm9yKEkoMzMxKSk7dmFyIG89aWU7Zm9yKGllfD00LEI9ZS5jdXJyZW50O0IhPT1udWxsOyl7dmFyIGE9QixpPWEuY2hpbGQ7aWYoQi5mbGFncyYxNil7dmFyIHM9YS5kZWxldGlvbnM7aWYocyE9PW51bGwpe2Zvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgdT1zW2xdO2ZvcihCPXU7QiE9PW51bGw7KXt2YXIgYz1CO3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp5YSg4LGMsYSl9dmFyIGQ9Yy5jaGlsZDtpZihkIT09bnVsbClkLnJldHVybj1jLEI9ZDtlbHNlIGZvcig7QiE9PW51bGw7KXtjPUI7dmFyIHA9Yy5zaWJsaW5nLGc9Yy5yZXR1cm47aWYoSWgoYyksYz09PXUpe0I9bnVsbDticmVha31pZihwIT09bnVsbCl7cC5yZXR1cm49ZyxCPXA7YnJlYWt9Qj1nfX19dmFyIHY9YS5hbHRlcm5hdGU7aWYodiE9PW51bGwpe3ZhciB5PXYuY2hpbGQ7aWYoeSE9PW51bGwpe3YuY2hpbGQ9bnVsbDtkb3t2YXIgYj15LnNpYmxpbmc7eS5zaWJsaW5nPW51bGwseT1ifXdoaWxlKHkhPT1udWxsKX19Qj1hfX1pZihhLnN1YnRyZWVGbGFncyYyMDY0JiZpIT09bnVsbClpLnJldHVybj1hLEI9aTtlbHNlIGU6Zm9yKDtCIT09bnVsbDspe2lmKGE9QixhLmZsYWdzJjIwNDgpc3dpdGNoKGEudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnlhKDksYSxhLnJldHVybil9dmFyIGg9YS5zaWJsaW5nO2lmKGghPT1udWxsKXtoLnJldHVybj1hLnJldHVybixCPWg7YnJlYWsgZX1CPWEucmV0dXJufX12YXIgbT1lLmN1cnJlbnQ7Zm9yKEI9bTtCIT09bnVsbDspe2k9Qjt2YXIgdz1pLmNoaWxkO2lmKGkuc3VidHJlZUZsYWdzJjIwNjQmJnchPT1udWxsKXcucmV0dXJuPWksQj13O2Vsc2UgZTpmb3IoaT1tO0IhPT1udWxsOyl7aWYocz1CLHMuZmxhZ3MmMjA0OCl0cnl7c3dpdGNoKHMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Ok1zKDkscyl9fWNhdGNoKFQpe0xlKHMscy5yZXR1cm4sVCl9aWYocz09PWkpe0I9bnVsbDticmVhayBlfXZhciBmPXMuc2libGluZztpZihmIT09bnVsbCl7Zi5yZXR1cm49cy5yZXR1cm4sQj1mO2JyZWFrIGV9Qj1zLnJldHVybn19aWYoaWU9byxkcigpLGduJiZ0eXBlb2YgZ24ub25Qb3N0Q29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXtnbi5vblBvc3RDb21taXRGaWJlclJvb3QoVHMsZSl9Y2F0Y2h7fXI9ITB9cmV0dXJuIHJ9ZmluYWxseXtnZT1uLFV0LnRyYW5zaXRpb249dH19cmV0dXJuITF9ZnVuY3Rpb24gUWYoZSx0LG4pe3Q9T28obix0KSx0PVNoKGUsdCwxKSxlPXJyKGUsdCwxKSx0PWR0KCksZSE9PW51bGwmJihGYShlLDEsdCksYnQoZSx0KSl9ZnVuY3Rpb24gTGUoZSx0LG4pe2lmKGUudGFnPT09MylRZihlLGUsbik7ZWxzZSBmb3IoO3QhPT1udWxsOyl7aWYodC50YWc9PT0zKXtRZih0LGUsbik7YnJlYWt9ZWxzZSBpZih0LnRhZz09PTEpe3ZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiB0LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx0eXBlb2Ygci5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG9yPT09bnVsbHx8IW9yLmhhcyhyKSkpe2U9T28obixlKSxlPUVoKHQsZSwxKSx0PXJyKHQsZSwxKSxlPWR0KCksdCE9PW51bGwmJihGYSh0LDEsZSksYnQodCxlKSk7YnJlYWt9fXQ9dC5yZXR1cm59fWZ1bmN0aW9uIEFiKGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtyIT09bnVsbCYmci5kZWxldGUodCksdD1kdCgpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbixLZT09PWUmJihYZSZuKT09PW4mJihIZT09PTR8fEhlPT09MyYmKFhlJjEzMDAyMzQyNCk9PT1YZSYmNTAwPkZlKCktUGM/QXIoZSwwKTpJY3w9biksYnQoZSx0KX1mdW5jdGlvbiBqaChlLHQpe3Q9PT0wJiYoZS5tb2RlJjE/KHQ9QWksQWk8PD0xLCEoQWkmMTMwMDIzNDI0KSYmKEFpPTQxOTQzMDQpKTp0PTEpO3ZhciBuPWR0KCk7ZT1SbihlLHQpLGUhPT1udWxsJiYoRmEoZSx0LG4pLGJ0KGUsbikpfWZ1bmN0aW9uIE9iKGUpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZSxuPTA7dCE9PW51bGwmJihuPXQucmV0cnlMYW5lKSxqaChlLG4pfWZ1bmN0aW9uIFJiKGUsdCl7dmFyIG49MDtzd2l0Y2goZS50YWcpe2Nhc2UgMTM6dmFyIHI9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkU3RhdGU7byE9PW51bGwmJihuPW8ucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OnI9ZS5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDMxNCkpfXIhPT1udWxsJiZyLmRlbGV0ZSh0KSxqaChlLG4pfXZhciBWaDtWaD1mdW5jdGlvbihlLHQsbil7aWYoZSE9PW51bGwpaWYoZS5tZW1vaXplZFByb3BzIT09dC5wZW5kaW5nUHJvcHN8fHl0LmN1cnJlbnQpdnQ9ITA7ZWxzZXtpZighKGUubGFuZXMmbikmJiEodC5mbGFncyYxMjgpKXJldHVybiB2dD0hMSx3YihlLHQsbik7dnQ9ISEoZS5mbGFncyYxMzEwNzIpfWVsc2UgdnQ9ITEsQWUmJnQuZmxhZ3MmMTA0ODU3NiYmcW0odCxmcyx0LmluZGV4KTtzd2l0Y2godC5sYW5lcz0wLHQudGFnKXtjYXNlIDI6dmFyIHI9dC50eXBlO0ppKGUsdCksZT10LnBlbmRpbmdQcm9wczt2YXIgbz1Ebyh0LGl0LmN1cnJlbnQpO0VvKHQsbiksbz1fYyhudWxsLHQscixlLG8sbik7dmFyIGE9Q2MoKTtyZXR1cm4gdC5mbGFnc3w9MSx0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsJiZ0eXBlb2Ygby5yZW5kZXI9PSJmdW5jdGlvbiImJm8uJCR0eXBlb2Y9PT12b2lkIDA/KHQudGFnPTEsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLHd0KHIpPyhhPSEwLGRzKHQpKTphPSExLHQubWVtb2l6ZWRTdGF0ZT1vLnN0YXRlIT09bnVsbCYmby5zdGF0ZSE9PXZvaWQgMD9vLnN0YXRlOm51bGwsU2ModCksby51cGRhdGVyPVJzLHQuc3RhdGVOb2RlPW8sby5fcmVhY3RJbnRlcm5hbHM9dCxVdSh0LHIsZSxuKSx0PVd1KG51bGwsdCxyLCEwLGEsbikpOih0LnRhZz0wLEFlJiZhJiZnYyh0KSxjdChudWxsLHQsbyxuKSx0PXQuY2hpbGQpLHQ7Y2FzZSAxNjpyPXQuZWxlbWVudFR5cGU7ZTp7c3dpdGNoKEppKGUsdCksZT10LnBlbmRpbmdQcm9wcyxvPXIuX2luaXQscj1vKHIuX3BheWxvYWQpLHQudHlwZT1yLG89dC50YWc9SWIociksZT1xdChyLGUpLG8pe2Nhc2UgMDp0PUJ1KG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE6dD0kZihudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxMTp0PUZmKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE0OnQ9VWYobnVsbCx0LHIscXQoci50eXBlLGUpLG4pO2JyZWFrIGV9dGhyb3cgRXJyb3IoSSgzMDYsciwiIikpfXJldHVybiB0O2Nhc2UgMDpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286cXQocixvKSxCdShlLHQscixvLG4pO2Nhc2UgMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286cXQocixvKSwkZihlLHQscixvLG4pO2Nhc2UgMzplOntpZihfaCh0KSxlPT09bnVsbCl0aHJvdyBFcnJvcihJKDM4NykpO3I9dC5wZW5kaW5nUHJvcHMsYT10Lm1lbW9pemVkU3RhdGUsbz1hLmVsZW1lbnQsdGgoZSx0KSxncyh0LHIsbnVsbCxuKTt2YXIgaT10Lm1lbW9pemVkU3RhdGU7aWYocj1pLmVsZW1lbnQsYS5pc0RlaHlkcmF0ZWQpaWYoYT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDohMSxjYWNoZTppLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6aS5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmkudHJhbnNpdGlvbnN9LHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWEsdC5tZW1vaXplZFN0YXRlPWEsdC5mbGFncyYyNTYpe289T28oRXJyb3IoSSg0MjMpKSx0KSx0PUJmKGUsdCxyLG4sbyk7YnJlYWsgZX1lbHNlIGlmKHIhPT1vKXtvPU9vKEVycm9yKEkoNDI0KSksdCksdD1CZihlLHQscixuLG8pO2JyZWFrIGV9ZWxzZSBmb3IoRHQ9bnIodC5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxfdD10LEFlPSEwLEp0PW51bGwsbj1abSh0LG51bGwscixuKSx0LmNoaWxkPW47bjspbi5mbGFncz1uLmZsYWdzJi0zfDQwOTYsbj1uLnNpYmxpbmc7ZWxzZXtpZihfbygpLHI9PT1vKXt0PU1uKGUsdCxuKTticmVhayBlfWN0KGUsdCxyLG4pfXQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDU6cmV0dXJuIG5oKHQpLGU9PT1udWxsJiZMdSh0KSxyPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLGE9ZSE9PW51bGw/ZS5tZW1vaXplZFByb3BzOm51bGwsaT1vLmNoaWxkcmVuLE91KHIsbyk/aT1udWxsOmEhPT1udWxsJiZPdShyLGEpJiYodC5mbGFnc3w9MzIpLERoKGUsdCksY3QoZSx0LGksbiksdC5jaGlsZDtjYXNlIDY6cmV0dXJuIGU9PT1udWxsJiZMdSh0KSxudWxsO2Nhc2UgMTM6cmV0dXJuIENoKGUsdCxuKTtjYXNlIDQ6cmV0dXJuIEVjKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbykscj10LnBlbmRpbmdQcm9wcyxlPT09bnVsbD90LmNoaWxkPUNvKHQsbnVsbCxyLG4pOmN0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286cXQocixvKSxGZihlLHQscixvLG4pO2Nhc2UgNzpyZXR1cm4gY3QoZSx0LHQucGVuZGluZ1Byb3BzLG4pLHQuY2hpbGQ7Y2FzZSA4OnJldHVybiBjdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEyOnJldHVybiBjdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEwOmU6e2lmKHI9dC50eXBlLl9jb250ZXh0LG89dC5wZW5kaW5nUHJvcHMsYT10Lm1lbW9pemVkUHJvcHMsaT1vLnZhbHVlLFNlKG1zLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWksYSE9PW51bGwpaWYoZW4oYS52YWx1ZSxpKSl7aWYoYS5jaGlsZHJlbj09PW8uY2hpbGRyZW4mJiF5dC5jdXJyZW50KXt0PU1uKGUsdCxuKTticmVhayBlfX1lbHNlIGZvcihhPXQuY2hpbGQsYSE9PW51bGwmJihhLnJldHVybj10KTthIT09bnVsbDspe3ZhciBzPWEuZGVwZW5kZW5jaWVzO2lmKHMhPT1udWxsKXtpPWEuY2hpbGQ7Zm9yKHZhciBsPXMuZmlyc3RDb250ZXh0O2whPT1udWxsOyl7aWYobC5jb250ZXh0PT09cil7aWYoYS50YWc9PT0xKXtsPUNuKC0xLG4mLW4pLGwudGFnPTI7dmFyIHU9YS51cGRhdGVRdWV1ZTtpZih1IT09bnVsbCl7dT11LnNoYXJlZDt2YXIgYz11LnBlbmRpbmc7Yz09PW51bGw/bC5uZXh0PWw6KGwubmV4dD1jLm5leHQsYy5uZXh0PWwpLHUucGVuZGluZz1sfX1hLmxhbmVzfD1uLGw9YS5hbHRlcm5hdGUsbCE9PW51bGwmJihsLmxhbmVzfD1uKSx6dShhLnJldHVybixuLHQpLHMubGFuZXN8PW47YnJlYWt9bD1sLm5leHR9fWVsc2UgaWYoYS50YWc9PT0xMClpPWEudHlwZT09PXQudHlwZT9udWxsOmEuY2hpbGQ7ZWxzZSBpZihhLnRhZz09PTE4KXtpZihpPWEucmV0dXJuLGk9PT1udWxsKXRocm93IEVycm9yKEkoMzQxKSk7aS5sYW5lc3w9bixzPWkuYWx0ZXJuYXRlLHMhPT1udWxsJiYocy5sYW5lc3w9biksenUoaSxuLHQpLGk9YS5zaWJsaW5nfWVsc2UgaT1hLmNoaWxkO2lmKGkhPT1udWxsKWkucmV0dXJuPWE7ZWxzZSBmb3IoaT1hO2khPT1udWxsOyl7aWYoaT09PXQpe2k9bnVsbDticmVha31pZihhPWkuc2libGluZyxhIT09bnVsbCl7YS5yZXR1cm49aS5yZXR1cm4saT1hO2JyZWFrfWk9aS5yZXR1cm59YT1pfWN0KGUsdCxvLmNoaWxkcmVuLG4pLHQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDk6cmV0dXJuIG89dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sRW8odCxuKSxvPSR0KG8pLHI9cihvKSx0LmZsYWdzfD0xLGN0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gcj10LnR5cGUsbz1xdChyLHQucGVuZGluZ1Byb3BzKSxvPXF0KHIudHlwZSxvKSxVZihlLHQscixvLG4pO2Nhc2UgMTU6cmV0dXJuIFRoKGUsdCx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsbik7Y2FzZSAxNzpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286cXQocixvKSxKaShlLHQpLHQudGFnPTEsd3Qocik/KGU9ITAsZHModCkpOmU9ITEsRW8odCxuKSxraCh0LHIsbyksVXUodCxyLG8sbiksV3UobnVsbCx0LHIsITAsZSxuKTtjYXNlIDE5OnJldHVybiBBaChlLHQsbik7Y2FzZSAyMjpyZXR1cm4gTmgoZSx0LG4pfXRocm93IEVycm9yKEkoMTU2LHQudGFnKSl9O2Z1bmN0aW9uIEdoKGUsdCl7cmV0dXJuIHdtKGUsdCl9ZnVuY3Rpb24gTWIoZSx0LG4scil7dGhpcy50YWc9ZSx0aGlzLmtleT1uLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmPW51bGwsdGhpcy5wZW5kaW5nUHJvcHM9dCx0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbCx0aGlzLm1vZGU9cix0aGlzLnN1YnRyZWVGbGFncz10aGlzLmZsYWdzPTAsdGhpcy5kZWxldGlvbnM9bnVsbCx0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wLHRoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gRnQoZSx0LG4scil7cmV0dXJuIG5ldyBNYihlLHQsbixyKX1mdW5jdGlvbiBVYyhlKXtyZXR1cm4gZT1lLnByb3RvdHlwZSwhKCFlfHwhZS5pc1JlYWN0Q29tcG9uZW50KX1mdW5jdGlvbiBJYihlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4gVWMoZSk/MTowO2lmKGUhPW51bGwpe2lmKGU9ZS4kJHR5cGVvZixlPT09b2MpcmV0dXJuIDExO2lmKGU9PT1hYylyZXR1cm4gMTR9cmV0dXJuIDJ9ZnVuY3Rpb24gaXIoZSx0KXt2YXIgbj1lLmFsdGVybmF0ZTtyZXR1cm4gbj09PW51bGw/KG49RnQoZS50YWcsdCxlLmtleSxlLm1vZGUpLG4uZWxlbWVudFR5cGU9ZS5lbGVtZW50VHlwZSxuLnR5cGU9ZS50eXBlLG4uc3RhdGVOb2RlPWUuc3RhdGVOb2RlLG4uYWx0ZXJuYXRlPWUsZS5hbHRlcm5hdGU9bik6KG4ucGVuZGluZ1Byb3BzPXQsbi50eXBlPWUudHlwZSxuLmZsYWdzPTAsbi5zdWJ0cmVlRmxhZ3M9MCxuLmRlbGV0aW9ucz1udWxsKSxuLmZsYWdzPWUuZmxhZ3MmMTQ2ODAwNjQsbi5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyxuLmxhbmVzPWUubGFuZXMsbi5jaGlsZD1lLmNoaWxkLG4ubWVtb2l6ZWRQcm9wcz1lLm1lbW9pemVkUHJvcHMsbi5tZW1vaXplZFN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxuLnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdD1lLmRlcGVuZGVuY2llcyxuLmRlcGVuZGVuY2llcz10PT09bnVsbD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sbi5zaWJsaW5nPWUuc2libGluZyxuLmluZGV4PWUuaW5kZXgsbi5yZWY9ZS5yZWYsbn1mdW5jdGlvbiBlcyhlLHQsbixyLG8sYSl7dmFyIGk9MjtpZihyPWUsdHlwZW9mIGU9PSJmdW5jdGlvbiIpVWMoZSkmJihpPTEpO2Vsc2UgaWYodHlwZW9mIGU9PSJzdHJpbmciKWk9NTtlbHNlIGU6c3dpdGNoKGUpe2Nhc2UgbG86cmV0dXJuIE9yKG4uY2hpbGRyZW4sbyxhLHQpO2Nhc2UgcmM6aT04LG98PTg7YnJlYWs7Y2FzZSB1dTpyZXR1cm4gZT1GdCgxMixuLHQsb3wyKSxlLmVsZW1lbnRUeXBlPXV1LGUubGFuZXM9YSxlO2Nhc2UgY3U6cmV0dXJuIGU9RnQoMTMsbix0LG8pLGUuZWxlbWVudFR5cGU9Y3UsZS5sYW5lcz1hLGU7Y2FzZSBkdTpyZXR1cm4gZT1GdCgxOSxuLHQsbyksZS5lbGVtZW50VHlwZT1kdSxlLmxhbmVzPWEsZTtjYXNlIG5tOnJldHVybiBQcyhuLG8sYSx0KTtkZWZhdWx0OmlmKHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgZW06aT0xMDticmVhayBlO2Nhc2UgdG06aT05O2JyZWFrIGU7Y2FzZSBvYzppPTExO2JyZWFrIGU7Y2FzZSBhYzppPTE0O2JyZWFrIGU7Y2FzZSBLbjppPTE2LHI9bnVsbDticmVhayBlfXRocm93IEVycm9yKEkoMTMwLGU9PW51bGw/ZTp0eXBlb2YgZSwiIikpfXJldHVybiB0PUZ0KGksbix0LG8pLHQuZWxlbWVudFR5cGU9ZSx0LnR5cGU9cix0LmxhbmVzPWEsdH1mdW5jdGlvbiBPcihlLHQsbixyKXtyZXR1cm4gZT1GdCg3LGUscix0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBQcyhlLHQsbixyKXtyZXR1cm4gZT1GdCgyMixlLHIsdCksZS5lbGVtZW50VHlwZT1ubSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxlfWZ1bmN0aW9uIGl1KGUsdCxuKXtyZXR1cm4gZT1GdCg2LGUsbnVsbCx0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBzdShlLHQsbil7cmV0dXJuIHQ9RnQoNCxlLmNoaWxkcmVuIT09bnVsbD9lLmNoaWxkcmVuOltdLGUua2V5LHQpLHQubGFuZXM9bix0LnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzplLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246ZS5pbXBsZW1lbnRhdGlvbn0sdH1mdW5jdGlvbiBQYihlLHQsbixyLG8pe3RoaXMudGFnPXQsdGhpcy5jb250YWluZXJJbmZvPWUsdGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGwsdGhpcy50aW1lb3V0SGFuZGxlPS0xLHRoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGwsdGhpcy5jYWxsYmFja1ByaW9yaXR5PTAsdGhpcy5ldmVudFRpbWVzPWpsKDApLHRoaXMuZXhwaXJhdGlvblRpbWVzPWpsKC0xKSx0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTAsdGhpcy5lbnRhbmdsZW1lbnRzPWpsKDApLHRoaXMuaWRlbnRpZmllclByZWZpeD1yLHRoaXMub25SZWNvdmVyYWJsZUVycm9yPW8sdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9ZnVuY3Rpb24gJGMoZSx0LG4scixvLGEsaSxzLGwpe3JldHVybiBlPW5ldyBQYihlLHQsbixzLGwpLHQ9PT0xPyh0PTEsYT09PSEwJiYodHw9OCkpOnQ9MCxhPUZ0KDMsbnVsbCxudWxsLHQpLGUuY3VycmVudD1hLGEuc3RhdGVOb2RlPWUsYS5tZW1vaXplZFN0YXRlPXtlbGVtZW50OnIsaXNEZWh5ZHJhdGVkOm4sY2FjaGU6bnVsbCx0cmFuc2l0aW9uczpudWxsLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bnVsbH0sU2MoYSksZX1mdW5jdGlvbiBMYihlLHQsbil7dmFyIHI9Mzxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOnNvLGtleTpyPT1udWxsP251bGw6IiIrcixjaGlsZHJlbjplLGNvbnRhaW5lckluZm86dCxpbXBsZW1lbnRhdGlvbjpufX1mdW5jdGlvbiBLaChlKXtpZighZSlyZXR1cm4gbHI7ZT1lLl9yZWFjdEludGVybmFscztlOntpZihGcihlKSE9PWV8fGUudGFnIT09MSl0aHJvdyBFcnJvcihJKDE3MCkpO3ZhciB0PWU7ZG97c3dpdGNoKHQudGFnKXtjYXNlIDM6dD10LnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGU7Y2FzZSAxOmlmKHd0KHQudHlwZSkpe3Q9dC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgZX19dD10LnJldHVybn13aGlsZSh0IT09bnVsbCk7dGhyb3cgRXJyb3IoSSgxNzEpKX1pZihlLnRhZz09PTEpe3ZhciBuPWUudHlwZTtpZih3dChuKSlyZXR1cm4gS20oZSxuLHQpfXJldHVybiB0fWZ1bmN0aW9uIFloKGUsdCxuLHIsbyxhLGkscyxsKXtyZXR1cm4gZT0kYyhuLHIsITAsZSxvLGEsaSxzLGwpLGUuY29udGV4dD1LaChudWxsKSxuPWUuY3VycmVudCxyPWR0KCksbz1hcihuKSxhPUNuKHIsbyksYS5jYWxsYmFjaz10Pz9udWxsLHJyKG4sYSxvKSxlLmN1cnJlbnQubGFuZXM9byxGYShlLG8sciksYnQoZSxyKSxlfWZ1bmN0aW9uIExzKGUsdCxuLHIpe3ZhciBvPXQuY3VycmVudCxhPWR0KCksaT1hcihvKTtyZXR1cm4gbj1LaChuKSx0LmNvbnRleHQ9PT1udWxsP3QuY29udGV4dD1uOnQucGVuZGluZ0NvbnRleHQ9bix0PUNuKGEsaSksdC5wYXlsb2FkPXtlbGVtZW50OmV9LHI9cj09PXZvaWQgMD9udWxsOnIsciE9PW51bGwmJih0LmNhbGxiYWNrPXIpLGU9cnIobyx0LGkpLGUhPT1udWxsJiYoWnQoZSxvLGksYSksWWkoZSxvLGkpKSxpfWZ1bmN0aW9uIEVzKGUpe2lmKGU9ZS5jdXJyZW50LCFlLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gSmYoZSx0KXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7dmFyIG49ZS5yZXRyeUxhbmU7ZS5yZXRyeUxhbmU9biE9PTAmJm48dD9uOnR9fWZ1bmN0aW9uIEJjKGUsdCl7SmYoZSx0KSwoZT1lLmFsdGVybmF0ZSkmJkpmKGUsdCl9ZnVuY3Rpb24gemIoKXtyZXR1cm4gbnVsbH12YXIgcWg9dHlwZW9mIHJlcG9ydEVycm9yPT0iZnVuY3Rpb24iP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9O2Z1bmN0aW9uIFdjKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXpzLnByb3RvdHlwZS5yZW5kZXI9V2MucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnRlcm5hbFJvb3Q7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoSSg0MDkpKTtMcyhlLHQsbnVsbCxudWxsKX07enMucHJvdG90eXBlLnVubW91bnQ9V2MucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnRlcm5hbFJvb3Q7aWYoZSE9PW51bGwpe3RoaXMuX2ludGVybmFsUm9vdD1udWxsO3ZhciB0PWUuY29udGFpbmVySW5mbztMcihmdW5jdGlvbigpe0xzKG51bGwsZSxudWxsLG51bGwpfSksdFtPbl09bnVsbH19O2Z1bmN0aW9uIHpzKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXpzLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD1ObSgpO2U9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDplLHByaW9yaXR5OnR9O2Zvcih2YXIgbj0wO248cW4ubGVuZ3RoJiZ0IT09MCYmdDxxbltuXS5wcmlvcml0eTtuKyspO3FuLnNwbGljZShuLDAsZSksbj09PTAmJl9tKGUpfX07ZnVuY3Rpb24gSGMoZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEpfWZ1bmN0aW9uIEZzKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExJiYoZS5ub2RlVHlwZSE9PTh8fGUubm9kZVZhbHVlIT09IiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAiKSl9ZnVuY3Rpb24gWGYoKXt9ZnVuY3Rpb24gRmIoZSx0LG4scixvKXtpZihvKXtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIGE9cjtyPWZ1bmN0aW9uKCl7dmFyIHU9RXMoaSk7YS5jYWxsKHUpfX12YXIgaT1ZaCh0LHIsZSwwLG51bGwsITEsITEsIiIsWGYpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9aSxlW09uXT1pLmN1cnJlbnQsQ2EoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLExyKCksaX1mb3IoO289ZS5sYXN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQobyk7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBzPXI7cj1mdW5jdGlvbigpe3ZhciB1PUVzKGwpO3MuY2FsbCh1KX19dmFyIGw9JGMoZSwwLCExLG51bGwsbnVsbCwhMSwhMSwiIixYZik7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1sLGVbT25dPWwuY3VycmVudCxDYShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksTHIoZnVuY3Rpb24oKXtMcyh0LGwsbixyKX0pLGx9ZnVuY3Rpb24gVXMoZSx0LG4scixvKXt2YXIgYT1uLl9yZWFjdFJvb3RDb250YWluZXI7aWYoYSl7dmFyIGk9YTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7dmFyIHM9bztvPWZ1bmN0aW9uKCl7dmFyIGw9RXMoaSk7cy5jYWxsKGwpfX1Mcyh0LGksZSxvKX1lbHNlIGk9RmIobix0LGUsbyxyKTtyZXR1cm4gRXMoaSl9RW09ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDM6dmFyIHQ9ZS5zdGF0ZU5vZGU7aWYodC5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXt2YXIgbj1jYSh0LnBlbmRpbmdMYW5lcyk7biE9PTAmJihsYyh0LG58MSksYnQodCxGZSgpKSwhKGllJjYpJiYoUm89RmUoKSs1MDAsZHIoKSkpfWJyZWFrO2Nhc2UgMTM6THIoZnVuY3Rpb24oKXt2YXIgcj1SbihlLDEpO2lmKHIhPT1udWxsKXt2YXIgbz1kdCgpO1p0KHIsZSwxLG8pfX0pLEJjKGUsMSl9fTt1Yz1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1SbihlLDEzNDIxNzcyOCk7aWYodCE9PW51bGwpe3ZhciBuPWR0KCk7WnQodCxlLDEzNDIxNzcyOCxuKX1CYyhlLDEzNDIxNzcyOCl9fTtUbT1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1hcihlKSxuPVJuKGUsdCk7aWYobiE9PW51bGwpe3ZhciByPWR0KCk7WnQobixlLHQscil9QmMoZSx0KX19O05tPWZ1bmN0aW9uKCl7cmV0dXJuIGdlfTtEbT1mdW5jdGlvbihlLHQpe3ZhciBuPWdlO3RyeXtyZXR1cm4gZ2U9ZSx0KCl9ZmluYWxseXtnZT1ufX07eHU9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh0KXtjYXNlImlucHV0IjppZihtdShlLG4pLHQ9bi5uYW1lLG4udHlwZT09PSJyYWRpbyImJnQhPW51bGwpe2ZvcihuPWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTtmb3Iobj1uLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIit0KSsnXVt0eXBlPSJyYWRpbyJdJyksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2lmKHIhPT1lJiZyLmZvcm09PT1lLmZvcm0pe3ZhciBvPUNzKHIpO2lmKCFvKXRocm93IEVycm9yKEkoOTApKTtvbShyKSxtdShyLG8pfX19YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aW0oZSxuKTticmVhaztjYXNlInNlbGVjdCI6dD1uLnZhbHVlLHQhPW51bGwmJmJvKGUsISFuLm11bHRpcGxlLHQsITEpfX07Zm09TGM7bW09THI7dmFyIFViPXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOlskYSxmbyxDcyxkbSxwbSxMY119LGlhPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpEcixidW5kbGVUeXBlOjAsdmVyc2lvbjoiMTguMy4xIixyZW5kZXJlclBhY2thZ2VOYW1lOiJyZWFjdC1kb20ifSwkYj17YnVuZGxlVHlwZTppYS5idW5kbGVUeXBlLHZlcnNpb246aWEudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOmlhLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6aWEucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6SW4uUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT12bShlKSxlPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTppYS5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8emIsZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbCxyZWNvbmNpbGVyVmVyc2lvbjoiMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNiJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiJiYoc2E9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLCFzYS5pc0Rpc2FibGVkJiZzYS5zdXBwb3J0c0ZpYmVyKSl0cnl7VHM9c2EuaW5qZWN0KCRiKSxnbj1zYX1jYXRjaHt9dmFyIHNhO090Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPVViO090LmNyZWF0ZVBvcnRhbD1mdW5jdGlvbihlLHQpe3ZhciBuPTI8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsO2lmKCFIYyh0KSl0aHJvdyBFcnJvcihJKDIwMCkpO3JldHVybiBMYihlLHQsbnVsbCxuKX07T3QuY3JlYXRlUm9vdD1mdW5jdGlvbihlLHQpe2lmKCFIYyhlKSl0aHJvdyBFcnJvcihJKDI5OSkpO3ZhciBuPSExLHI9IiIsbz1xaDtyZXR1cm4gdCE9bnVsbCYmKHQudW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYobj0hMCksdC5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYocj10LmlkZW50aWZpZXJQcmVmaXgpLHQub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYobz10Lm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9JGMoZSwxLCExLG51bGwsbnVsbCxuLCExLHIsbyksZVtPbl09dC5jdXJyZW50LENhKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxuZXcgV2ModCl9O090LmZpbmRET01Ob2RlPWZ1bmN0aW9uKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoZS5ub2RlVHlwZT09PTEpcmV0dXJuIGU7dmFyIHQ9ZS5fcmVhY3RJbnRlcm5hbHM7aWYodD09PXZvaWQgMCl0aHJvdyB0eXBlb2YgZS5yZW5kZXI9PSJmdW5jdGlvbiI/RXJyb3IoSSgxODgpKTooZT1PYmplY3Qua2V5cyhlKS5qb2luKCIsIiksRXJyb3IoSSgyNjgsZSkpKTtyZXR1cm4gZT12bSh0KSxlPWU9PT1udWxsP251bGw6ZS5zdGF0ZU5vZGUsZX07T3QuZmx1c2hTeW5jPWZ1bmN0aW9uKGUpe3JldHVybiBMcihlKX07T3QuaHlkcmF0ZT1mdW5jdGlvbihlLHQsbil7aWYoIUZzKHQpKXRocm93IEVycm9yKEkoMjAwKSk7cmV0dXJuIFVzKG51bGwsZSx0LCEwLG4pfTtPdC5oeWRyYXRlUm9vdD1mdW5jdGlvbihlLHQsbil7aWYoIUhjKGUpKXRocm93IEVycm9yKEkoNDA1KSk7dmFyIHI9biE9bnVsbCYmbi5oeWRyYXRlZFNvdXJjZXN8fG51bGwsbz0hMSxhPSIiLGk9cWg7aWYobiE9bnVsbCYmKG4udW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYobz0hMCksbi5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYoYT1uLmlkZW50aWZpZXJQcmVmaXgpLG4ub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYoaT1uLm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9WWgodCxudWxsLGUsMSxuPz9udWxsLG8sITEsYSxpKSxlW09uXT10LmN1cnJlbnQsQ2EoZSkscilmb3IoZT0wO2U8ci5sZW5ndGg7ZSsrKW49cltlXSxvPW4uX2dldFZlcnNpb24sbz1vKG4uX3NvdXJjZSksdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPT1udWxsP3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bbixvXTp0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChuLG8pO3JldHVybiBuZXcgenModCl9O090LnJlbmRlcj1mdW5jdGlvbihlLHQsbil7aWYoIUZzKHQpKXRocm93IEVycm9yKEkoMjAwKSk7cmV0dXJuIFVzKG51bGwsZSx0LCExLG4pfTtPdC51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGUpe2lmKCFGcyhlKSl0aHJvdyBFcnJvcihJKDQwKSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj8oTHIoZnVuY3Rpb24oKXtVcyhudWxsLG51bGwsZSwhMSxmdW5jdGlvbigpe2UuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsLGVbT25dPW51bGx9KX0pLCEwKTohMX07T3QudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9TGM7T3QudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oZSx0LG4scil7aWYoIUZzKG4pKXRocm93IEVycm9yKEkoMjAwKSk7aWYoZT09bnVsbHx8ZS5fcmVhY3RJbnRlcm5hbHM9PT12b2lkIDApdGhyb3cgRXJyb3IoSSgzOCkpO3JldHVybiBVcyhlLHQsbiwhMSxyKX07T3QudmVyc2lvbj0iMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNiJ9KTt2YXIgWmg9U3IoKGVELFhoKT0+eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBKaCgpe2lmKCEodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXz4idSJ8fHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UhPSJmdW5jdGlvbiIpKXRyeXtfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoSmgpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fUpoKCksWGguZXhwb3J0cz1RaCgpfSk7dmFyIHRnPVNyKGpjPT57InVzZSBzdHJpY3QiO3ZhciBlZz1aaCgpO2pjLmNyZWF0ZVJvb3Q9ZWcuY3JlYXRlUm9vdCxqYy5oeWRyYXRlUm9vdD1lZy5oeWRyYXRlUm9vdDt2YXIgdER9KTt2YXIgaDA9eGUod2UoKSwxKSxnMD14ZSh0ZygpLDEpO3ZhciB0bj17REVGQVVMVDoiZGVmYXVsdCIsTEFZT1VUX0NPTkZJRzoibGF5b3V0Q29uZmlnIixTRVRUSU5HU19DT05GSUc6InNldHRpbmdzQ29uZmlnIn07dmFyIHJnPXR5cGVvZiBwcm9jZXNzPCJ1IiYmITEsUG49ITEsVmM9MzAseHQ9InBsdWdpbnMvZGFzaGJvYXJkIiwkcz0icGxhbm5pbmcvcXVhcnRlcmx5IixvZz17YW50aHJvcGljOiJBbnRocm9waWMgQVBJIEtleSIsZGVlcHNlZWs6IkRlZXBTZWVrIEFQSSBLZXkiLGdlbWluaToiR2VtaW5pIEFQSSBLZXkiLGdyb2s6Ikdyb2sgQVBJIEtleSIsb3BlbmFpOiJPcGVuQUkgQVBJIEtleSJ9O3ZhciBKPXtCQUNLR1JPVU5EX0lNQUdFX1VSTDoiQmFja2dyb3VuZCBJbWFnZSBVUkwiLEJBQ0tHUk9VTkRfSU1BR0VfTU9ERToiQmFja2dyb3VuZCBJbWFnZSBNb2RlIixDT05TT0xFX0xPR0dJTkc6IkNvbnNvbGUgbG9nZ2luZyIsREFTSEJPQVJEX0NPTVBPTkVOVFM6ImRhc2hib2FyZF9lbGVtZW50cyIsTExNX0FQSV9LRVlfQU5USFJPUElDOiJBbnRocm9waWMgQVBJIEtleSIsTExNX0FQSV9LRVlfR0VNSU5JOiJHZW1pbmkgQVBJIEtleSIsTExNX0FQSV9LRVlfR1JPSzoiR3JvayBBUEkgS2V5IixMTE1fQVBJX0tFWV9PUEVOQUk6Ik9wZW5BSSBBUEkgS2V5IixMTE1fUFJPVklERVJfTU9ERUw6IkxMTSBQcm92aWRlciIsVEFTS19ET01BSU5TOiJkYXNoYm9hcmRfdGFza19kb21haW5zIixQTEFOTklOR19OT1RFX1RBRzoiVGFnIHRvIGFwcGx5IHRvIHBsYW5uaW5nIG5vdGVzIn0sYWc9e2FudGhyb3BpYzpKLkxMTV9BUElfS0VZX0FOVEhST1BJQyxnZW1pbmk6Si5MTE1fQVBJX0tFWV9HRU1JTkksZ3JvazpKLkxMTV9BUElfS0VZX0dST0ssb3BlbmFpOkouTExNX0FQSV9LRVlfT1BFTkFJfSxuZz17bm9uZTpudWxsLG9wZW5haToib3BlbmFpIixhbnRocm9waWM6ImFudGhyb3BpYyIsImFudGhyb3BpYy1zb25uZXQiOiJhbnRocm9waWMiLGdlbWluaToiZ2VtaW5pIixncm9rOiJncm9rIn07ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIWV8fGU9PT0ibm9uZSI/bnVsbDpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmcsZSk/bmdbZV06YWdbZV0/ZTpudWxsfWZ1bmN0aW9uIG5uKGUpe3JldHVybiBhZ1tlXXx8bnVsbH1mdW5jdGlvbiBmcihlKXtyZXR1cm5gZGFzaGJvYXJkXyR7ZX1fY29uZmlnYH1mdW5jdGlvbiBCcyhlLHQpe2xldCBuPWUuc2V0dGluZ3M/Lltmcih0KV07aWYoIW4pcmV0dXJuW107aWYoQXJyYXkuaXNBcnJheShuKSlyZXR1cm4gbjt0cnl7cmV0dXJuIEpTT04ucGFyc2Uobil9Y2F0Y2h7cmV0dXJuW119fXZhciBpZz1be3ZhbHVlOiJjb3ZlciIsbGFiZWw6IkNvdmVyIChmaWxsIGVudGlyZSBiYWNrZ3JvdW5kKSJ9LHt2YWx1ZToiY29udGFpbiIsbGFiZWw6IkNvbnRhaW4gKGZpdCB3aXRob3V0IGNyb3BwaW5nKSJ9LHt2YWx1ZToicmVwZWF0IixsYWJlbDoiUmVwZWF0ICh0aWxlIHRoZSBpbWFnZSkifSx7dmFsdWU6InJlcGVhdC14IixsYWJlbDoiUmVwZWF0IGhvcml6b250YWxseSJ9LHt2YWx1ZToicmVwZWF0LXkiLGxhYmVsOiJSZXBlYXQgdmVydGljYWxseSJ9LHt2YWx1ZToibm8tcmVwZWF0IixsYWJlbDoiTm8gcmVwZWF0IChzaW5nbGUgY2VudGVyZWQgaW1hZ2UpIn1dLHJEPUouREFTSEJPQVJEX0NPTVBPTkVOVFMsb0Q9Si5UQVNLX0RPTUFJTlMsYUQ9Si5QTEFOTklOR19OT1RFX1RBRyxCYj0yNCo2MCo2MCoxZTMseW49W3t3aWRnZXRJZDoicGxhbm5pbmciLG5hbWU6IlF1YXJ0ZXJseSBQbGFubmluZyIsZGVzY3JpcHRpb246IlBsYW4gYW5kIHRyYWNrIHlvdXIgcXVhcnRlcmx5IGdvYWxzIGFuZCBwcmlvcml0aWVzIixpY29uOiJcdXsxRjRDQn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InZpY3RvcnktdmFsdWUiLG5hbWU6IlZpY3RvcnkgVmFsdWUiLGRlc2NyaXB0aW9uOiJDZWxlYnJhdGUgd2lucyBhbmQgdHJhY2sgaGlnaC12YWx1ZSB0YXNrIGNvbXBsZXRpb25zIixpY29uOiJcdXsxRjNDNn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6Im1vb2QiLG5hbWU6Ik1vb2QgVHJhY2tlciIsdmlzaWJsZVRpdGxlOiJIb3cgYXJlIHlvdSBmZWVsaW5nPyIsZGVzY3JpcHRpb246IkxvZyB5b3VyIGRhaWx5IG1vb2QgYW5kIHZpc3VhbGl6ZSB0cmVuZHMgb3ZlciB0aW1lIixpY29uOiJcdXsxRjNBRH0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjEsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImNhbGVuZGFyIixuYW1lOiJDYWxlbmRhciIsZGVzY3JpcHRpb246IlNlZSB1cGNvbWluZyBldmVudHMgYW5kIGFwcG9pbnRtZW50cyBhdCBhIGdsYW5jZSIsaWNvbjoiXHV7MUY0QzV9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToxLG1heEhvcml6b250YWxUaWxlczoyLG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJhZ2VuZGEiLG5hbWU6IlRhc2sgQWdlbmRhIixkZXNjcmlwdGlvbjoiVmlldyBhbmQgbWFuYWdlIHlvdXIgcHJpb3JpdGl6ZWQgdGFzayBsaXN0IixpY29uOiJcdXsxRjRDQ30iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InF1b3RlcyIsbmFtZToiSW5zcGlyYXRpb24gUXVvdGVzIixkZXNjcmlwdGlvbjoiUm90YXRpbmcgaW5zcGlyYXRpb25hbCBxdW90ZXMgdG8ga2VlcCB5b3UgbW90aXZhdGVkIixpY29uOiJcdXsxRjRBMX0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InJlY2VudC1ub3RlcyIsbmFtZToiUmV2aXNpdCBDYW5kaWRhdGUiLGRlc2NyaXB0aW9uOiJOb3RlcyB3aXRoIG9wZW4gdGFza3MgdGhhdCBoYXZlIG5vdCBoYWQgYSBuZXcgdGFzayBpbiBvdmVyIGEgd2VlayIsaWNvbjoiXHV7MUY0RER9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToxLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJxdWljay1hY3Rpb25zIixuYW1lOiJRdWljayBBY3Rpb25zIixkZXNjcmlwdGlvbjoiU2hvcnRjdXRzIGZvciB5b3VyIG1vc3QgZnJlcXVlbnRseSB1c2VkIGRhc2hib2FyZCBhY3Rpb25zIixpY29uOiJcdTI2QTEiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjEsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImRyZWFtLXRhc2siLG5hbWU6IkRyZWFtVGFzayIsZGVzY3JpcHRpb246IkFJLXN1Z2dlc3RlZCB0YXNrcyBhbGlnbmVkIHdpdGggeW91ciBxdWFydGVybHkgYW5kIG1vbnRobHkgZ29hbHMiLGljb246Ilx1ezFGNTJFfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicGVhay1ob3VycyIsbmFtZToiUGVhayBIb3VycyIsZGVzY3JpcHRpb246IkhvdXJseSBkaXN0cmlidXRpb24gb2YgdGFzayBjcmVhdGlvbiBhbmQgY29tcGxldGlvbiBhY3Rpdml0eSIsaWNvbjoiXHUyM0YwIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJkYXktc2tldGNoIixuYW1lOiJEYXkgU2tldGNoZXIiLGRlc2NyaXB0aW9uOiJOb3RlYm9vay1wYXBlciBkYXkgcGxhbm5lciB3aXRoIGhvdXItYnktaG91ciBlbnRyaWVzIHNhdmVkIHRvIGEgbm90ZSIsaWNvbjoiXHV7MUY1RDJ9XHVGRTBGIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn1dO2Z1bmN0aW9uIGxlKGUpe2xldCB0PXluLmZpbmQobj0+bi53aWRnZXRJZD09PWUpO3JldHVybiB0Py52aXNpYmxlVGl0bGV8fHQ/Lm5hbWV8fGV9ZnVuY3Rpb24gc2coZSl7cmV0dXJuIHluLmZpbmQodD0+dC53aWRnZXRJZD09PWUpfHxudWxsfXZhciBQbz15bi5tYXAoZT0+KHt3aWRnZXRJZDplLndpZGdldElkLGdyaWRXaWR0aFNpemU6ZS5kZWZhdWx0R3JpZFdpZHRoU2l6ZSxncmlkSGVpZ2h0U2l6ZToxLHNldHRpbmdzOnt9fSkpO3ZhciBHYz0hMTtmdW5jdGlvbiBLYyhlKXtpZih0eXBlb2YgZT09ImJvb2xlYW4iKXtHYz1lO3JldHVybn1sZXQgdD1TdHJpbmcoZXx8IiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO0djPVsidHJ1ZSIsInllcyIsIjEiLCJvbiIsImVuYWJsZWQiXS5pbmNsdWRlcyh0KX1mdW5jdGlvbiBBKC4uLmUpe0djJiZjb25zb2xlLmxvZyguLi5lKX12YXIgbGc9IkNvbnNvbGUgbG9nZ2luZyI7ZnVuY3Rpb24gV3MoZSl7cmV0dXJuYGRhc2hib2FyZF8ke2V9X2NvbmZpZ2B9ZnVuY3Rpb24gWWMoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9lOmU/LnV1aWR9ZnVuY3Rpb24gbWcoZSl7cmV0dXJuKGUubWF0Y2goL14oI3sxLDZ9KVxzKyguKykkL2dtKXx8W10pLm1hcCgobixyKT0+KHtoZWFkaW5nOnt0ZXh0Om4ucmVwbGFjZSgvXiN7MSw2fVxzKy8sIiIpLnRyaW0oKSxsZXZlbDoobi5tYXRjaCgvXiMrLyl8fFsiIl0pWzBdLmxlbmd0aH0saW5kZXg6cn0pKX1mdW5jdGlvbiBIcyhlKXtyZXR1cm4gZT09bnVsbD9udWxsOmU8MWUxMD9lKjFlMzplfWZ1bmN0aW9uIFdiKGUpe2xldCB0PW5ldyBEYXRlKGUpLG49dC5nZXREYXkoKTtyZXR1cm4gdC5zZXREYXRlKHQuZ2V0RGF0ZSgpLW4rKG49PT0wPy02OjEpKSx0LnNldEhvdXJzKDAsMCwwLDApLHR9ZnVuY3Rpb24gSGIoZSx0KXtsZXQgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKS5nZXRUaW1lKCkscj1uKzg2NGU1O3JldHVybiBlLmZpbHRlcihvPT57bGV0IGE9SHMoby5zdGFydEF0KTtyZXR1cm4hby5jb21wbGV0ZWRBdCYmIW8uZGlzbWlzc2VkQXQmJmEhPW51bGwmJmE+PW4mJmE8cn0pfWZ1bmN0aW9uIGhnKGUsdCl7bGV0IG49dC5nZXRUaW1lKCkscj1uKzcqODY0ZTU7cmV0dXJuIGUuZmlsdGVyKG89PntsZXQgYT1IcyhvLmNvbXBsZXRlZEF0KTtyZXR1cm4gYSE9bnVsbCYmYT49biYmYTxyfSl9ZnVuY3Rpb24gamIoZSx0KXtyZXR1cm4gaGcoZSx0KS5yZWR1Y2UoKG4scik9Pm4rKHIudmljdG9yeVZhbHVlfHwwKSwwKX1mdW5jdGlvbiBWYihlLHQpe3JldHVyblsiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0IiwiU3VuIl0ubWFwKChyLG8pPT57bGV0IGE9bmV3IERhdGUodCk7YS5zZXREYXRlKGEuZ2V0RGF0ZSgpK28pO2xldCBpPW5ldyBEYXRlKGEpO2kuc2V0RGF0ZShpLmdldERhdGUoKSsxKTtsZXQgcz1lLmZpbHRlcihsPT57bGV0IHU9SHMobC5jb21wbGV0ZWRBdCk7cmV0dXJuIHUhPW51bGwmJnU+PWEuZ2V0VGltZSgpJiZ1PGkuZ2V0VGltZSgpfSk7cmV0dXJue2RheTpyLGRhdGU6YS50b0lTT1N0cmluZygpLHZhbHVlOnMucmVkdWNlKChsLHUpPT5sKyh1LnZpY3RvcnlWYWx1ZXx8MCksMCksdGFza0NvdW50OnMubGVuZ3RofX0pfWZ1bmN0aW9uIHVnKGUpe2xldCB0PVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxuPShlLTEpKjM7cmV0dXJuW3Rbbl0sdFtuKzFdLHRbbisyXV19ZnVuY3Rpb24gR2IoZSx0KXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO24uc3R5bGUuZGlzcGxheT0iZmxleCIsbi5zdHlsZS5hbGlnbkl0ZW1zPSJjZW50ZXIiLG4uc3R5bGUuZ2FwPSIxMHB4IjtsZXQgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci50ZXh0Q29udGVudD1lPy5sYWJlbHx8YElucHV0ICR7dCsxfWAsci5zdHlsZS5taW5XaWR0aD0iMTQwcHgiLG4uYXBwZW5kQ2hpbGQocik7bGV0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5zdHlsZS5mbGV4PSIxIixuLmFwcGVuZENoaWxkKG8pO2xldCBhPWU/LnR5cGV8fCJ0ZXh0IixpPUFycmF5LmlzQXJyYXkoZT8ub3B0aW9ucyk/ZS5vcHRpb25zOltdO2lmKGE9PT0iY2hlY2tib3giKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3JldHVybiBsLnR5cGU9ImNoZWNrYm94IixsLmNoZWNrZWQ9ISFlPy52YWx1ZSxvLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6bCxnZXRWYWx1ZTooKT0+bC5jaGVja2VkfX1pZihhPT09InJhZGlvIil7bGV0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZS5kaXNwbGF5PSJmbGV4IixsLnN0eWxlLmZsZXhXcmFwPSJ3cmFwIixsLnN0eWxlLmdhcD0iMTBweCI7bGV0IHU9YGRldi1wcm9tcHQtcmFkaW8tJHtEYXRlLm5vdygpfS0ke3R9YCxjPW51bGw7Zm9yKGxldFtkLHBdb2YgaS5lbnRyaWVzKCkpe2xldCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7Zy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtZmxleCIsZy5zdHlsZS5hbGlnbkl0ZW1zPSJjZW50ZXIiLGcuc3R5bGUuZ2FwPSI0cHgiO2xldCB2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7di50eXBlPSJyYWRpbyIsdi5uYW1lPXUsdi52YWx1ZT1TdHJpbmcocD8udmFsdWU/P3A/LmxhYmVsPz8iIiksZT8udmFsdWUhPW51bGwmJlN0cmluZyhlLnZhbHVlKT09PXYudmFsdWUmJih2LmNoZWNrZWQ9ITApLGN8fChjPXYpO2xldCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt5LnRleHRDb250ZW50PXA/LmxhYmVsPz92LnZhbHVlLGcuYXBwZW5kKHYseSksbC5hcHBlbmRDaGlsZChnKSxkPT09aS5sZW5ndGgtMSYmIWwucXVlcnlTZWxlY3RvcigiaW5wdXQ6Y2hlY2tlZCIpJiZjJiYoYy5jaGVja2VkPSEwKX1yZXR1cm4gby5hcHBlbmRDaGlsZChsKSx7bGluZTpuLGZvY3VzVGFyZ2V0OmMsZ2V0VmFsdWU6KCk9PntsZXQgZD1sLnF1ZXJ5U2VsZWN0b3IoImlucHV0OmNoZWNrZWQiKTtyZXR1cm4gZD9kLnZhbHVlOm51bGx9fX1pZihhPT09InNlbGVjdCIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO2wuc3R5bGUud2lkdGg9IjEwMCUiO2ZvcihsZXQgdSBvZiBpKXtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtjLnZhbHVlPVN0cmluZyh1Py52YWx1ZT8/dT8ubGFiZWw/PyIiKSxjLnRleHRDb250ZW50PXU/LmxhYmVsPz9jLnZhbHVlLGwuYXBwZW5kQ2hpbGQoYyl9cmV0dXJuIGU/LnZhbHVlIT1udWxsJiYobC52YWx1ZT1TdHJpbmcoZS52YWx1ZSkpLG8uYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT5sLnZhbHVlfX1pZihhPT09ImRhdGUiKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2lmKGwudHlwZT0iZGF0ZSIsZT8udmFsdWUhPW51bGwpe2xldCB1PW5ldyBEYXRlKEhzKE51bWJlcihlLnZhbHVlKSkpO051bWJlci5pc05hTih1LmdldFRpbWUoKSl8fChsLnZhbHVlPXUudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKSl9cmV0dXJuIGwuc3R5bGUud2lkdGg9IjEwMCUiLG8uYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT57aWYoIWwudmFsdWUpcmV0dXJuIG51bGw7bGV0IHU9RGF0ZS5wYXJzZShgJHtsLnZhbHVlfVQwMDowMDowMFpgKTtyZXR1cm4gTnVtYmVyLmlzTmFOKHUpP251bGw6TWF0aC5mbG9vcih1LzFlMyl9fX1pZihhPT09InRleHQiKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3JldHVybiBsLnJvd3M9MixsLnN0eWxlLndpZHRoPSIxMDAlIixsLnZhbHVlPVN0cmluZyhlPy52YWx1ZT8/IiIpLGU/LnBsYWNlaG9sZGVyJiYobC5wbGFjZWhvbGRlcj1lLnBsYWNlaG9sZGVyKSxvLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6bCxnZXRWYWx1ZTooKT0+bC52YWx1ZX19bGV0IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtyZXR1cm4gcy50eXBlPWE9PT0ic2VjdXJlVGV4dCI/InBhc3N3b3JkIjoidGV4dCIscy5zdHlsZS53aWR0aD0iMTAwJSIscy52YWx1ZT1TdHJpbmcoZT8udmFsdWU/PyIiKSxlPy5wbGFjZWhvbGRlciYmKHMucGxhY2Vob2xkZXI9ZS5wbGFjZWhvbGRlciksby5hcHBlbmRDaGlsZChzKSx7bGluZTpuLGZvY3VzVGFyZ2V0OnMsZ2V0VmFsdWU6KCk9PnMudmFsdWV9fWZ1bmN0aW9uIEtiKGUsdD17fSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO2xldCBuPUFycmF5LmlzQXJyYXkodD8uaW5wdXRzKSYmdC5pbnB1dHMubGVuZ3RoPjA/dC5pbnB1dHM6W3t0eXBlOiJ0ZXh0In1dLHI9QXJyYXkuaXNBcnJheSh0Py5hY3Rpb25zKT90LmFjdGlvbnM6W107cmV0dXJuIG5ldyBQcm9taXNlKG89PntsZXQgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmRhdGFzZXQuZGV2UHJvbXB0PSJvdmVybGF5IixhLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsYS5zdHlsZS5pbnNldD0iMCIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsMCwwLDAuMzUpIixhLnN0eWxlLnpJbmRleD0iOTk5OTkiLGEuc3R5bGUuZGlzcGxheT0iZ3JpZCIsYS5zdHlsZS5wbGFjZUl0ZW1zPSJjZW50ZXIiO2xldCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuc3R5bGUud2lkdGg9Im1pbig2ODBweCwgOTJ2dykiLGkuc3R5bGUuYmFja2dyb3VuZD0iI2ZmZiIsaS5zdHlsZS5jb2xvcj0iIzExMSIsaS5zdHlsZS5ib3JkZXJSYWRpdXM9IjEwcHgiLGkuc3R5bGUucGFkZGluZz0iMTZweCIsaS5zdHlsZS5ib3hTaGFkb3c9IjAgMTZweCA0OHB4IHJnYmEoMCwwLDAsMC4yNSkiLGEuYXBwZW5kQ2hpbGQoaSk7bGV0IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy50ZXh0Q29udGVudD1TdHJpbmcoZT8/IlByb21wdCIpLHMuc3R5bGUuZm9udFdlaWdodD0iNjAwIixzLnN0eWxlLm1hcmdpbkJvdHRvbT0iMTJweCIsaS5hcHBlbmRDaGlsZChzKTtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIik7bC5zdHlsZS5kaXNwbGF5PSJmbGV4IixsLnN0eWxlLmZsZXhEaXJlY3Rpb249ImNvbHVtbiIsbC5zdHlsZS5nYXA9IjEwcHgiLGkuYXBwZW5kQ2hpbGQobCk7bGV0IHU9bi5tYXAoKHksYik9PkdiKHksYikpO2ZvcihsZXQgeSBvZiB1KWwuYXBwZW5kQ2hpbGQoeS5saW5lKTtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlLmRpc3BsYXk9ImZsZXgiLGMuc3R5bGUuanVzdGlmeUNvbnRlbnQ9ImZsZXgtZW5kIixjLnN0eWxlLmdhcD0iOHB4IixjLnN0eWxlLm1hcmdpblRvcD0iOHB4IixsLmFwcGVuZENoaWxkKGMpO2xldCBkPS0xO2ZvcihsZXRbeSxiXW9mIHIuZW50cmllcygpKXtsZXQgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtoLnR5cGU9ImJ1dHRvbiIsaC50ZXh0Q29udGVudD1iPy5sYWJlbHx8YEFjdGlvbiAke3krMX1gLGguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57ZD1iPy52YWx1ZT8/eSxsLnJlcXVlc3RTdWJtaXQoKX0pLGMuYXBwZW5kQ2hpbGQoaCl9bGV0IHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7cC50eXBlPSJidXR0b24iLHAuZGF0YXNldC5kZXZQcm9tcHRDYW5jZWw9InRydWUiLHAudGV4dENvbnRlbnQ9IkNhbmNlbCIscC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PnthLnJlbW92ZSgpLG8obnVsbCl9KSxjLmFwcGVuZENoaWxkKHApO2xldCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2cudHlwZT0ic3VibWl0IixnLnRleHRDb250ZW50PSJTdWJtaXQiLGMuYXBwZW5kQ2hpbGQoZyksbC5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLHk9Pnt5LnByZXZlbnREZWZhdWx0KCk7bGV0IGI9dS5tYXAoaD0+aC5nZXRWYWx1ZSgpKTthLnJlbW92ZSgpLGIubGVuZ3RoPT09MSYmci5sZW5ndGg9PT0wP28oYlswXSk6ci5sZW5ndGg9PT0wP28oYik6byhbLi4uYixkXSl9KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO2xldCB2PXUuZmluZCh5PT55LmZvY3VzVGFyZ2V0KT8uZm9jdXNUYXJnZXQ7diYmdi5mb2N1cygpfSl9dmFyIFdhPW51bGw7YXN5bmMgZnVuY3Rpb24gZ2coKXtpZihXYSE9PW51bGwpcmV0dXJuIFdhO3RyeXtXYT1hd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9zZXR0aW5ncyIpKS5qc29uKCl9Y2F0Y2h7V2E9e319cmV0dXJuIFdhfWFzeW5jIGZ1bmN0aW9uIFliKGUsdCl7bGV0IG49YXdhaXQgZ2coKTtuW2VdPXQ7dHJ5e2F3YWl0IGZldGNoKCIvYXBpL3NldHRpbmdzIix7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe2tleTplLHZhbHVlOnR9KX0pfWNhdGNoKHIpe2NvbnNvbGUud2FybigiW2Rldi1hcHBdIGZhaWxlZCB0byBwZXJzaXN0IHNldHRpbmciLGUscil9fWFzeW5jIGZ1bmN0aW9uIGNnKCl7dHJ5e3JldHVybiBhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS90YXNrcyIpKS5qc29uKCl9Y2F0Y2h7cmV0dXJuW119fWFzeW5jIGZ1bmN0aW9uIHFiKGUsdCl7dHJ5e3JldHVybiBhd2FpdChhd2FpdCBmZXRjaChgL2FwaS90YXNrcz9mcm9tPSR7ZX0mdG89JHt0fWApKS5qc29uKCl9Y2F0Y2h7cmV0dXJuW119fWFzeW5jIGZ1bmN0aW9uIGRnKGUpe3RyeXtsZXQgdD1lP2AvYXBpL21vb2RzP2Zyb209JHtlfWA6Ii9hcGkvbW9vZHMiO3JldHVybiBhd2FpdChhd2FpdCBmZXRjaCh0KSkuanNvbigpfWNhdGNoe3JldHVybltdfX12YXIgcWM9eyJkb21haW4td29yay11dWlkIjpbe3V1aWQ6Im5vdGUtd29yay0xIixuYW1lOiJRMSBHb2FsIFJldmlldyJ9LHt1dWlkOiJub3RlLXdvcmstMiIsbmFtZToiU3RhbmQtdXAgTm90ZXMifSx7dXVpZDoibm90ZS13b3JrLTMiLG5hbWU6IkZlYXR1cmUgSW1wbGVtZW50YXRpb24ifSx7dXVpZDoibm90ZS13b3JrLTQiLG5hbWU6IkRlc2lnbiBGZWVkYmFjayJ9LHt1dWlkOiJub3RlLXdvcmstNSIsbmFtZToiQnVkZ2V0IFRyYWNrZXIifSx7dXVpZDoibm90ZS13b3JrLTYiLG5hbWU6Ik9mZmxpbmUgVGVzdGluZyJ9LHt1dWlkOiJub3RlLXdvcmstNyIsbmFtZToiU3ByaW50IFJldHJvIn0se3V1aWQ6Im5vdGUtd29yay04IixuYW1lOiJBUEkgTGF5ZXIgUmVzZWFyY2gifSx7dXVpZDoibm90ZS13b3JrLTkiLG5hbWU6IkludGVncmF0aW9uIFRlc3RzIn0se3V1aWQ6Im5vdGUtd29yay0xMCIsbmFtZToiUHVsbCBSZXF1ZXN0IFF1ZXVlIn0se3V1aWQ6Im5vdGUtd29yay0xMSIsbmFtZToiU2V0dGluZ3MgTW9kdWxlIFRlc3RzIn0se3V1aWQ6Im5vdGUtd29yay0xMiIsbmFtZToiQ1NTIENsZWFudXAifSx7dXVpZDoibm90ZS13b3JrLTEzIixuYW1lOiJEYXNoYm9hcmQgTWVtb3J5IExlYWsifSx7dXVpZDoibm90ZS13b3JrLTE0IixuYW1lOiJDbGllbnQgRmVlZGJhY2sifSx7dXVpZDoibm90ZS13b3JrLTE1IixuYW1lOiJBUEkgRXJyb3IgSGFuZGxpbmcifSx7dXVpZDoibm90ZS13b3JrLTE2IixuYW1lOiJBdXRoIFRva2VuIFJlZnJlc2gifSx7dXVpZDoibm90ZS13b3JrLTE3IixuYW1lOiJEQiBRdWVyeSBQZXJmb3JtYW5jZSJ9XSwiZG9tYWluLXBlcnNvbmFsLXV1aWQiOlt7dXVpZDoibm90ZS1wZXJzb25hbC0xIixuYW1lOiJOZXR3b3JraW5nIE91dHJlYWNoIn0se3V1aWQ6Im5vdGUtcGVyc29uYWwtMiIsbmFtZToiRml0bmVzcyBMb2cifSx7dXVpZDoibm90ZS1wZXJzb25hbC0zIixuYW1lOiJTb2NpYWwgUmVtaW5kZXJzIn0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNCIsbmFtZToiRW50ZXJ0YWlubWVudCJ9LHt1dWlkOiJub3RlLXBlcnNvbmFsLTUiLG5hbWU6IlNob3BwaW5nIExpc3QifSx7dXVpZDoibm90ZS1wZXJzb25hbC02IixuYW1lOiJIZWFsdGggQXBwb2ludG1lbnRzIn0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNyIsbmFtZToiUmVhZGluZyBMaXN0In0se3V1aWQ6Im5vdGUtcGVyc29uYWwtOCIsbmFtZToiSG9iYmllcyJ9LHt1dWlkOiJub3RlLXBlcnNvbmFsLTkiLG5hbWU6IlRyaXAgUGxhbm5pbmcifSx7dXVpZDoibm90ZS1wZXJzb25hbC0xMCIsbmFtZToiSG9tZSBPZmZpY2UifV0sImRvbWFpbi1zaWRlLXV1aWQiOlt7dXVpZDoibm90ZS1zaWRlLTEiLG5hbWU6IkJsb2cgUG9zdCBJZGVhcyJ9LHt1dWlkOiJub3RlLXNpZGUtMiIsbmFtZToiU2lkZSBQcm9qZWN0IFJFQURNRSJ9LHt1dWlkOiJub3RlLXNpZGUtMyIsbmFtZToiQ0kgUGlwZWxpbmUgU2V0dXAifV19LFFiPVt7bmFtZToiV29yayIsdXVpZDoiZG9tYWluLXdvcmstdXVpZCIsbm90ZXM6cWNbImRvbWFpbi13b3JrLXV1aWQiXX0se25hbWU6IlBlcnNvbmFsIix1dWlkOiJkb21haW4tcGVyc29uYWwtdXVpZCIsbm90ZXM6cWNbImRvbWFpbi1wZXJzb25hbC11dWlkIl19LHtuYW1lOiJTaWRlIFByb2plY3RzIix1dWlkOiJkb21haW4tc2lkZS11dWlkIixub3RlczpxY1siZG9tYWluLXNpZGUtdXVpZCJdfV07YXN5bmMgZnVuY3Rpb24gcGcoZSl7dHJ5e3JldHVybiBhd2FpdChhd2FpdCBmZXRjaChgL2FwaS9ub3RlLWZpbmQ/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChlKX1gKSkuanNvbigpfWNhdGNoe3JldHVybiBudWxsfX1hc3luYyBmdW5jdGlvbiBmZyhlKXt0cnl7bGV0IG49YXdhaXQgUWMoKS5nZXROb3RlQ29udGVudChlKTtyZXR1cm4gbWcobnx8IiIpfWNhdGNoe3JldHVybltdfX12YXIgTG89bnVsbDtmdW5jdGlvbiBRYygpe2lmKExvKXJldHVybiBMbztsZXQgZT10PT57bGV0IG49L15odHRwczpcL1wvd3d3XC5hbXBsZW5vdGVcLmNvbVwvbm90ZXMoPzokfFsvP10uKikvLnRlc3QodCk7cmV0dXJuIG4/Y29uc29sZS5sb2coIltkZXYtYXBwXSBuYXZpZ2F0ZSIsdCk6Y29uc29sZS53YXJuKCJbZGV2LWFwcF0gbmF2aWdhdGUgcmVqZWN0ZWQgaW52YWxpZCBVUkwiLHQpLG59O3JldHVybiBMbz17c2V0dGluZ3M6e30sYXN5bmMgaW5pdCgpe2xldCB0PWF3YWl0IGdnKCk7aWYodFtsZ118fCh0W2xnXT0idHJ1ZSIpLHR5cGVvZiB0LmRhc2hib2FyZF9lbGVtZW50cz09InN0cmluZyIpdHJ5e3QuZGFzaGJvYXJkX2VsZW1lbnRzPUpTT04ucGFyc2UodC5kYXNoYm9hcmRfZWxlbWVudHMpfWNhdGNoe3QuZGFzaGJvYXJkX2VsZW1lbnRzPW51bGx9Zm9yKGxldCB3IG9mW1dzKCJ2aWN0b3J5LXZhbHVlIiksV3MoImNhbGVuZGFyIiksV3MoIm1vb2QiKSxXcygicXVvdGVzIildKWlmKHR5cGVvZiB0W3ddPT0ic3RyaW5nIil0cnl7dFt3XT1KU09OLnBhcnNlKHRbd10pfWNhdGNoe3Rbd109bnVsbH1sZXQgbj1uZXcgRGF0ZSxyPVdiKG4pLG89YXdhaXQgY2coKSxhPWF3YWl0IGRnKCksaT1NYXRoLmNlaWwoKG4uZ2V0TW9udGgoKSsxKS8zKSxzPWBRJHtpfSAke24uZ2V0RnVsbFllYXIoKX1gLGw9aT09PTQ/MTppKzEsdT1pPT09ND9uLmdldEZ1bGxZZWFyKCkrMTpuLmdldEZ1bGxZZWFyKCksYz1gUSR7bH0gJHt1fWAsW2QscF09YXdhaXQgUHJvbWlzZS5hbGwoW3BnKGAke3N9IFBsYW5gKSxwZyhgJHtjfSBQbGFuYCldKSxbZyx2XT1hd2FpdCBQcm9taXNlLmFsbChbZD8udXVpZD9mZyhkLnV1aWQpOlByb21pc2UucmVzb2x2ZShbXSkscD8udXVpZD9mZyhwLnV1aWQpOlByb21pc2UucmVzb2x2ZShbXSldKSx5PXVnKGkpLGI9dWcobCksaD15LmV2ZXJ5KHc9Pmcuc29tZShmPT5mLmhlYWRpbmc/LnRleHQ/LnRyaW0oKS50b0xvd2VyQ2FzZSgpPT09dy50b0xvd2VyQ2FzZSgpKSksbT1iLmV2ZXJ5KHc9PnYuc29tZShmPT5mLmhlYWRpbmc/LnRleHQ/LnRyaW0oKS50b0xvd2VyQ2FzZSgpPT09dy50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIExvLnNldHRpbmdzPXQse3Rhc2tzOm8sdG9kYXlUYXNrczpIYihvLG4pLGNvbXBsZXRlZFRoaXNXZWVrOmhnKG8sciksd2Vla2x5VmljdG9yeVZhbHVlOmpiKG8sciksZGFpbHlWaWN0b3J5VmFsdWVzOlZiKG8sciksbW9vZFJhdGluZ3M6YSxxdWFydGVybHlQbGFuczp7Y3VycmVudDp7eWVhcjpuLmdldEZ1bGxZZWFyKCkscXVhcnRlcjppLGxhYmVsOnMsbm90ZVVVSUQ6ZD8udXVpZD8/bnVsbCxoYXNBbGxNb250aGx5RGV0YWlsczpofSxuZXh0Ont5ZWFyOnUscXVhcnRlcjpsLGxhYmVsOmMsbm90ZVVVSUQ6cD8udXVpZD8/bnVsbCxoYXNBbGxNb250aGx5RGV0YWlsczptfX0sY3VycmVudERhdGU6bi50b0lTT1N0cmluZygpLHNldHRpbmdzOnQsdGFza0RvbWFpbnM6W3tuYW1lOiJXb3JrIix1dWlkOiJkb21haW4td29yay11dWlkIn0se25hbWU6IlBlcnNvbmFsIix1dWlkOiJkb21haW4tcGVyc29uYWwtdXVpZCJ9LHtuYW1lOiJTaWRlIFByb2plY3RzIix1dWlkOiJkb21haW4tc2lkZS11dWlkIn1dLGFjdGl2ZVRhc2tEb21haW46ImRvbWFpbi13b3JrLXV1aWQifX0sYXN5bmMgY29uZmlndXJlKCl7cmV0dXJuIG51bGx9LGFzeW5jIGdldE1vb2RSYXRpbmdzKHQpe3JldHVybiBkZyh0KX0sYXN5bmMgZ2V0Q29tcGxldGVkVGFza3ModCxuKXtyZXR1cm4gcWIodCxuKX0sYXN5bmMgZ2V0VGFza0RvbWFpbnMoKXtyZXR1cm4gUWJ9LGFzeW5jIGdldFRhc2tEb21haW5UYXNrcyh0KXtsZXQgbj10P2AvYXBpL3Rhc2tzP2RvbWFpbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0KX1gOiIvYXBpL3Rhc2tzIjtyZXR1cm4gYXdhaXQoYXdhaXQgZmV0Y2gobikpLmpzb24oKX0sYXN5bmMgZ2V0Tm90ZVRhc2tzKHQsbil7cmV0dXJuKGF3YWl0IGNnKCkpLmZpbHRlcihvPT5vLm5vdGVVVUlEPT09dCYmby5jb21wbGV0ZWRBdD09bnVsbCYmby5kaXNtaXNzZWRBdD09bnVsbCl9LG5hdmlnYXRlKHQpe3JldHVybiBlKHQpfSxhc3luYyBzZXRTZXR0aW5nKHQsbil7bGV0IHI9bj09bnVsbD8iIjpTdHJpbmcobik7TG8uc2V0dGluZ3NbdF09cixhd2FpdCBZYih0LHIpfSxhc3luYyByZWNvcmRNb29kUmF0aW5nKHQpe3RyeXtyZXR1cm4oYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7dmFsdWU6dH0pfSkpLmpzb24oKSkudXVpZH1jYXRjaChuKXtyZXR1cm4gQSgiW2Rldi1hcHBdIHJlY29yZE1vb2RSYXRpbmcgZmFpbGVkOiIsbiksbnVsbH19LGFzeW5jIHVwZGF0ZU1vb2RSYXRpbmcodCxuKXt0cnl7YXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBBVENIIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe3V1aWQ6dCx1cGRhdGVzOm59KX0pfWNhdGNoKHIpe0EoIltkZXYtYXBwXSB1cGRhdGVNb29kUmF0aW5nIGZhaWxlZDoiLHIpfX0sYXN5bmMgZ2V0Tm90ZUNvbnRlbnQodCl7bGV0IG49WWModCk7dHJ5e3JldHVybihhd2FpdChhd2FpdCBmZXRjaChgL2FwaS9ub3RlLWNvbnRlbnQ/dXVpZD0ke2VuY29kZVVSSUNvbXBvbmVudChuKX1gKSkuanNvbigpKS5jb250ZW50Pz8iIn1jYXRjaHtyZXR1cm4iIn19LGFzeW5jIGdldE5vdGVTZWN0aW9ucyh0KXtsZXQgbj1hd2FpdCB0aGlzLmdldE5vdGVDb250ZW50KHQpO3JldHVybiBtZyhuKX0sYXN5bmMgZmluZE5vdGUodD17fSl7dHJ5e2xldCBuPXQudXVpZD9gdXVpZD0ke2VuY29kZVVSSUNvbXBvbmVudCh0LnV1aWQpfWA6YG5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQodC5uYW1lKX1gLG89YXdhaXQoYXdhaXQgZmV0Y2goYC9hcGkvbm90ZS1maW5kPyR7bn1gKSkuanNvbigpO3JldHVybiBvPy51dWlkP286bnVsbH1jYXRjaHtyZXR1cm4gbnVsbH19LGFzeW5jIGZpbHRlck5vdGVzKHQ9e30pe2lmKHQucXVlcnkpdHJ5e2xldCByPWF3YWl0KGF3YWl0IGZldGNoKGAvYXBpL25vdGUtZmluZD9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQucXVlcnkpfWApKS5qc29uKCk7cmV0dXJuIHI/LnV1aWQ/W3JdOltdfWNhdGNoe3JldHVybltdfXJldHVybltdfSxhc3luYyBjcmVhdGVOb3RlKHQsbj1bXSl7dHJ5e3JldHVybihhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9ub3RlLWNyZWF0ZSIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtuYW1lOnQsdGFnczpufSl9KSkuanNvbigpKS51dWlkfWNhdGNoe3JldHVybiBudWxsfX0sYXN5bmMgcmVwbGFjZU5vdGVDb250ZW50KHQsbixyPXt9KXtsZXQgbz1ZYyh0KTt0cnl7bGV0IGE9e3V1aWQ6byxjb250ZW50Om59O3JldHVybiByLnNlY3Rpb24mJihhLnNlY3Rpb249ci5zZWN0aW9uKSwoYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvbm90ZS1jb250ZW50Iix7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoYSl9KSkuanNvbigpKS5va3x8ITF9Y2F0Y2h7cmV0dXJuITF9fSxhc3luYyBpbnNlcnROb3RlQ29udGVudCh0LG4scj17fSl7bGV0IG89WWModCk7dHJ5e2F3YWl0IGZldGNoKCIvYXBpL25vdGUtYXBwZW5kIix7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe3V1aWQ6byxjb250ZW50Om4sYXRFbmQ6ISFyLmF0RW5kfSl9KX1jYXRjaHt9fSxhc3luYyBhdHRhY2hOb3RlTWVkaWEodCxuKXtBKCJbZGV2LWFwcF0gYXR0YWNoTm90ZU1lZGlhIGNhbGxlZCwgZGF0YVVSTCBsZW5ndGg6IixuPy5sZW5ndGh8fDApO3RyeXtsZXQgYT0oYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvYXR0YWNoLW1lZGlhIix7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe2RhdGFVUkw6bn0pfSkpLmpzb24oKSkudXJsfHxudWxsO3JldHVybiBBKCJbZGV2LWFwcF0gYXR0YWNoTm90ZU1lZGlhIHJlc3BvbnNlOiIsYT9gVVJMIHJlY2VpdmVkOiAke2F9YDoibm8gVVJMIGluIHJlc3BvbnNlIiksYX1jYXRjaChyKXtyZXR1cm4gQSgiW2Rldi1hcHBdIGF0dGFjaE5vdGVNZWRpYSBGQUlMRUQ6IixyKSxudWxsfX0sYXN5bmMgcHJvbXB0KHQsbj17fSl7cmV0dXJuIEtiKHQsbil9fSxMb312YXIgbmU9eGUod2UoKSwxKTt2YXIgSGE9WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLEpiPVsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sSmM9Y2xhc3N7Y29uc3RydWN0b3Ioe2luZGV4OnQsc2hvcnQ6bixmdWxsOnIscGxhbjpvLGN1cnJlbnQ6YX0pe3RoaXMuaW5kZXg9dCx0aGlzLnNob3J0PW4sdGhpcy5mdWxsPXIsdGhpcy5wbGFuPW8sdGhpcy5jdXJyZW50PWF9fTtmdW5jdGlvbiBYYygpe2xldCBlPW5ldyBEYXRlLHQ9ZS5nZXRGdWxsWWVhcigpLG49ZS5nZXRNb250aCgpLHI9TWF0aC5mbG9vcihuLzMpKzE7cmV0dXJue3llYXI6dCxxdWFydGVyOnIsbGFiZWw6YFEke3J9ICR7dH1gfX1mdW5jdGlvbiB2ZyhlLHQpe2xldCBuPShlLnF1YXJ0ZXItMSkqMyxyPW5ldyBEYXRlKCkuZ2V0TW9udGgoKSxvPVtdO2ZvcihsZXQgYT0wO2E8NjthKyspe2xldCBpPShuK2EpJTEyO28ucHVzaChuZXcgSmMoe2luZGV4Omksc2hvcnQ6SmJbaV0sZnVsbDpIYVtpXSxwbGFuOmE8Mz9lOnQsY3VycmVudDppPT09cn0pKX1yZXR1cm4gb31mdW5jdGlvbiBqcygpe2xldCBlPW5ldyBEYXRlLHQ9ZS5nZXREYXkoKSxuO3JldHVybiB0PT09Nj9uPTI6dD09PTA/bj0xOm49MS10LG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCkrbil9ZnVuY3Rpb24gVnMoZSl7cmV0dXJuYFdlZWsgb2YgJHtIYVtlLmdldE1vbnRoKCldfSAke2UuZ2V0RGF0ZSgpfWB9ZnVuY3Rpb24gem8oZSx0KXtsZXQgbj10LnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCQmIikscj1uZXcgUmVnRXhwKGAoXnxcXG4pKCN7MSw2fSlcXHMrJHtufVxccypcXG5gLCJpIiksbz1lLm1hdGNoKHIpO2lmKCFvKXJldHVybiBudWxsO2xldCBhPW8uaW5kZXgrb1swXS5sZW5ndGgsaT1lLnN1YnN0cmluZyhhKSxzPWkubWF0Y2goL1xuI3sxLDZ9XHMvKTtyZXR1cm4ocz9pLnN1YnN0cmluZygwLHMuaW5kZXgpOmkpLnRyaW0oKX1mdW5jdGlvbiBaYyhlKXtyZXR1cm5gCiMjIyAke2V9Ci0gRm9jdXM6Ci0gS2V5IG1vdmU6CmB9ZnVuY3Rpb24gZWQoZSl7cmV0dXJuYAojIyMgJHtlfQotIFByaW1hcnkgZm9jdXM6Ci0gS2V5IHRhc2tzOgotIENvbW1pdG1lbnRzOgpgfXZhciB6ZT0idG9wIixqZT0iYm90dG9tIixCZT0icmlnaHQiLFVlPSJsZWZ0IixHcz0iYXV0byIsbXI9W3plLGplLEJlLFVlXSxMbj0ic3RhcnQiLFVyPSJlbmQiLHlnPSJjbGlwcGluZ1BhcmVudHMiLEtzPSJ2aWV3cG9ydCIsRm89InBvcHBlciIsd2c9InJlZmVyZW5jZSIsdGQ9bXIucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KFt0KyItIitMbix0KyItIitVcl0pfSxbXSksWXM9W10uY29uY2F0KG1yLFtHc10pLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdChbdCx0KyItIitMbix0KyItIitVcl0pfSxbXSksWGI9ImJlZm9yZVJlYWQiLFpiPSJyZWFkIixleD0iYWZ0ZXJSZWFkIix0eD0iYmVmb3JlTWFpbiIsbng9Im1haW4iLHJ4PSJhZnRlck1haW4iLG94PSJiZWZvcmVXcml0ZSIsYXg9IndyaXRlIixpeD0iYWZ0ZXJXcml0ZSIsYmc9W1hiLFpiLGV4LHR4LG54LHJ4LG94LGF4LGl4XTtmdW5jdGlvbiBZZShlKXtyZXR1cm4gZT8oZS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk6bnVsbH1mdW5jdGlvbiBPZShlKXtpZihlPT1udWxsKXJldHVybiB3aW5kb3c7aWYoZS50b1N0cmluZygpIT09IltvYmplY3QgV2luZG93XSIpe3ZhciB0PWUub3duZXJEb2N1bWVudDtyZXR1cm4gdCYmdC5kZWZhdWx0Vmlld3x8d2luZG93fXJldHVybiBlfWZ1bmN0aW9uIFd0KGUpe3ZhciB0PU9lKGUpLkVsZW1lbnQ7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fHxlIGluc3RhbmNlb2YgRWxlbWVudH1mdW5jdGlvbiBWZShlKXt2YXIgdD1PZShlKS5IVE1MRWxlbWVudDtyZXR1cm4gZSBpbnN0YW5jZW9mIHR8fGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudH1mdW5jdGlvbiBVbyhlKXtpZih0eXBlb2YgU2hhZG93Um9vdD4idSIpcmV0dXJuITE7dmFyIHQ9T2UoZSkuU2hhZG93Um9vdDtyZXR1cm4gZSBpbnN0YW5jZW9mIHR8fGUgaW5zdGFuY2VvZiBTaGFkb3dSb290fWZ1bmN0aW9uIHN4KGUpe3ZhciB0PWUuc3RhdGU7T2JqZWN0LmtleXModC5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj10LnN0eWxlc1tuXXx8e30sbz10LmF0dHJpYnV0ZXNbbl18fHt9LGE9dC5lbGVtZW50c1tuXTshVmUoYSl8fCFZZShhKXx8KE9iamVjdC5hc3NpZ24oYS5zdHlsZSxyKSxPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBzPW9baV07cz09PSExP2EucmVtb3ZlQXR0cmlidXRlKGkpOmEuc2V0QXR0cmlidXRlKGkscz09PSEwPyIiOnMpfSkpfSl9ZnVuY3Rpb24gbHgoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXtwb3BwZXI6e3Bvc2l0aW9uOnQub3B0aW9ucy5zdHJhdGVneSxsZWZ0OiIwIix0b3A6IjAiLG1hcmdpbjoiMCJ9LGFycm93Ontwb3NpdGlvbjoiYWJzb2x1dGUifSxyZWZlcmVuY2U6e319O3JldHVybiBPYmplY3QuYXNzaWduKHQuZWxlbWVudHMucG9wcGVyLnN0eWxlLG4ucG9wcGVyKSx0LnN0eWxlcz1uLHQuZWxlbWVudHMuYXJyb3cmJk9iamVjdC5hc3NpZ24odC5lbGVtZW50cy5hcnJvdy5zdHlsZSxuLmFycm93KSxmdW5jdGlvbigpe09iamVjdC5rZXlzKHQuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG89dC5lbGVtZW50c1tyXSxhPXQuYXR0cmlidXRlc1tyXXx8e30saT1PYmplY3Qua2V5cyh0LnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShyKT90LnN0eWxlc1tyXTpuW3JdKSxzPWkucmVkdWNlKGZ1bmN0aW9uKGwsdSl7cmV0dXJuIGxbdV09IiIsbH0se30pOyFWZShvKXx8IVllKG8pfHwoT2JqZWN0LmFzc2lnbihvLnN0eWxlLHMpLE9iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24obCl7by5yZW1vdmVBdHRyaWJ1dGUobCl9KSl9KX19dmFyIGphPXtuYW1lOiJhcHBseVN0eWxlcyIsZW5hYmxlZDohMCxwaGFzZToid3JpdGUiLGZuOnN4LGVmZmVjdDpseCxyZXF1aXJlczpbImNvbXB1dGVTdHlsZXMiXX07ZnVuY3Rpb24gcWUoZSl7cmV0dXJuIGUuc3BsaXQoIi0iKVswXX12YXIgcm49TWF0aC5tYXgsJHI9TWF0aC5taW4sem49TWF0aC5yb3VuZDtmdW5jdGlvbiAkbygpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnREYXRhO3JldHVybiBlIT1udWxsJiZlLmJyYW5kcyYmQXJyYXkuaXNBcnJheShlLmJyYW5kcyk/ZS5icmFuZHMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJyYW5kKyIvIit0LnZlcnNpb259KS5qb2luKCIgIik6bmF2aWdhdG9yLnVzZXJBZ2VudH1mdW5jdGlvbiBWYSgpe3JldHVybiEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KCRvKCkpfWZ1bmN0aW9uIEh0KGUsdCxuKXt0PT09dm9pZCAwJiYodD0hMSksbj09PXZvaWQgMCYmKG49ITEpO3ZhciByPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz0xLGE9MTt0JiZWZShlKSYmKG89ZS5vZmZzZXRXaWR0aD4wJiZ6bihyLndpZHRoKS9lLm9mZnNldFdpZHRofHwxLGE9ZS5vZmZzZXRIZWlnaHQ+MCYmem4oci5oZWlnaHQpL2Uub2Zmc2V0SGVpZ2h0fHwxKTt2YXIgaT1XdChlKT9PZShlKTp3aW5kb3cscz1pLnZpc3VhbFZpZXdwb3J0LGw9IVZhKCkmJm4sdT0oci5sZWZ0KyhsJiZzP3Mub2Zmc2V0TGVmdDowKSkvbyxjPShyLnRvcCsobCYmcz9zLm9mZnNldFRvcDowKSkvYSxkPXIud2lkdGgvbyxwPXIuaGVpZ2h0L2E7cmV0dXJue3dpZHRoOmQsaGVpZ2h0OnAsdG9wOmMscmlnaHQ6dStkLGJvdHRvbTpjK3AsbGVmdDp1LHg6dSx5OmN9fWZ1bmN0aW9uIEJyKGUpe3ZhciB0PUh0KGUpLG49ZS5vZmZzZXRXaWR0aCxyPWUub2Zmc2V0SGVpZ2h0O3JldHVybiBNYXRoLmFicyh0LndpZHRoLW4pPD0xJiYobj10LndpZHRoKSxNYXRoLmFicyh0LmhlaWdodC1yKTw9MSYmKHI9dC5oZWlnaHQpLHt4OmUub2Zmc2V0TGVmdCx5OmUub2Zmc2V0VG9wLHdpZHRoOm4saGVpZ2h0OnJ9fWZ1bmN0aW9uIEdhKGUsdCl7dmFyIG49dC5nZXRSb290Tm9kZSYmdC5nZXRSb290Tm9kZSgpO2lmKGUuY29udGFpbnModCkpcmV0dXJuITA7aWYobiYmVW8obikpe3ZhciByPXQ7ZG97aWYociYmZS5pc1NhbWVOb2RlKHIpKXJldHVybiEwO3I9ci5wYXJlbnROb2RlfHxyLmhvc3R9d2hpbGUocil9cmV0dXJuITF9ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIE9lKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gbmQoZSl7cmV0dXJuWyJ0YWJsZSIsInRkIiwidGgiXS5pbmRleE9mKFllKGUpKT49MH1mdW5jdGlvbiBldChlKXtyZXR1cm4oKFd0KGUpP2Uub3duZXJEb2N1bWVudDplLmRvY3VtZW50KXx8d2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuIFllKGUpPT09Imh0bWwiP2U6ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50Tm9kZXx8KFVvKGUpP2UuaG9zdDpudWxsKXx8ZXQoZSl9ZnVuY3Rpb24geGcoZSl7cmV0dXJuIVZlKGUpfHxmdChlKS5wb3NpdGlvbj09PSJmaXhlZCI/bnVsbDplLm9mZnNldFBhcmVudH1mdW5jdGlvbiB1eChlKXt2YXIgdD0vZmlyZWZveC9pLnRlc3QoJG8oKSksbj0vVHJpZGVudC9pLnRlc3QoJG8oKSk7aWYobiYmVmUoZSkpe3ZhciByPWZ0KGUpO2lmKHIucG9zaXRpb249PT0iZml4ZWQiKXJldHVybiBudWxsfXZhciBvPUZuKGUpO2ZvcihVbyhvKSYmKG89by5ob3N0KTtWZShvKSYmWyJodG1sIiwiYm9keSJdLmluZGV4T2YoWWUobykpPDA7KXt2YXIgYT1mdChvKTtpZihhLnRyYW5zZm9ybSE9PSJub25lInx8YS5wZXJzcGVjdGl2ZSE9PSJub25lInx8YS5jb250YWluPT09InBhaW50Inx8WyJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSJdLmluZGV4T2YoYS53aWxsQ2hhbmdlKSE9PS0xfHx0JiZhLndpbGxDaGFuZ2U9PT0iZmlsdGVyInx8dCYmYS5maWx0ZXImJmEuZmlsdGVyIT09Im5vbmUiKXJldHVybiBvO289by5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIG9uKGUpe2Zvcih2YXIgdD1PZShlKSxuPXhnKGUpO24mJm5kKG4pJiZmdChuKS5wb3NpdGlvbj09PSJzdGF0aWMiOyluPXhnKG4pO3JldHVybiBuJiYoWWUobik9PT0iaHRtbCJ8fFllKG4pPT09ImJvZHkiJiZmdChuKS5wb3NpdGlvbj09PSJzdGF0aWMiKT90Om58fHV4KGUpfHx0fWZ1bmN0aW9uIFdyKGUpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5kZXhPZihlKT49MD8ieCI6InkifWZ1bmN0aW9uIEhyKGUsdCxuKXtyZXR1cm4gcm4oZSwkcih0LG4pKX1mdW5jdGlvbiBrZyhlLHQsbil7dmFyIHI9SHIoZSx0LG4pO3JldHVybiByPm4/bjpyfWZ1bmN0aW9uIEthKCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfX1mdW5jdGlvbiBZYShlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxLYSgpLGUpfWZ1bmN0aW9uIHFhKGUsdCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKG4scil7cmV0dXJuIG5bcl09ZSxufSx7fSl9dmFyIGN4PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChPYmplY3QuYXNzaWduKHt9LG4ucmVjdHMse3BsYWNlbWVudDpuLnBsYWNlbWVudH0pKTp0LFlhKHR5cGVvZiB0IT0ibnVtYmVyIj90OnFhKHQsbXIpKX07ZnVuY3Rpb24gZHgoZSl7dmFyIHQsbj1lLnN0YXRlLHI9ZS5uYW1lLG89ZS5vcHRpb25zLGE9bi5lbGVtZW50cy5hcnJvdyxpPW4ubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLHM9cWUobi5wbGFjZW1lbnQpLGw9V3IocyksdT1bVWUsQmVdLmluZGV4T2Yocyk+PTAsYz11PyJoZWlnaHQiOiJ3aWR0aCI7aWYoISghYXx8IWkpKXt2YXIgZD1jeChvLnBhZGRpbmcsbikscD1CcihhKSxnPWw9PT0ieSI/emU6VWUsdj1sPT09InkiP2plOkJlLHk9bi5yZWN0cy5yZWZlcmVuY2VbY10rbi5yZWN0cy5yZWZlcmVuY2VbbF0taVtsXS1uLnJlY3RzLnBvcHBlcltjXSxiPWlbbF0tbi5yZWN0cy5yZWZlcmVuY2VbbF0saD1vbihhKSxtPWg/bD09PSJ5Ij9oLmNsaWVudEhlaWdodHx8MDpoLmNsaWVudFdpZHRofHwwOjAsdz15LzItYi8yLGY9ZFtnXSxUPW0tcFtjXS1kW3ZdLFM9bS8yLXBbY10vMit3LEQ9SHIoZixTLFQpLE49bDtuLm1vZGlmaWVyc0RhdGFbcl09KHQ9e30sdFtOXT1ELHQuY2VudGVyT2Zmc2V0PUQtUyx0KX19ZnVuY3Rpb24gcHgoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxyPW4uZWxlbWVudCxvPXI9PT12b2lkIDA/IltkYXRhLXBvcHBlci1hcnJvd10iOnI7byE9bnVsbCYmKHR5cGVvZiBvPT0ic3RyaW5nIiYmKG89dC5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihvKSwhbyl8fEdhKHQuZWxlbWVudHMucG9wcGVyLG8pJiYodC5lbGVtZW50cy5hcnJvdz1vKSl9dmFyIFNnPXtuYW1lOiJhcnJvdyIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIsZm46ZHgsZWZmZWN0OnB4LHJlcXVpcmVzOlsicG9wcGVyT2Zmc2V0cyJdLHJlcXVpcmVzSWZFeGlzdHM6WyJwcmV2ZW50T3ZlcmZsb3ciXX07ZnVuY3Rpb24ganQoZSl7cmV0dXJuIGUuc3BsaXQoIi0iKVsxXX12YXIgZng9e3RvcDoiYXV0byIscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byIsbGVmdDoiYXV0byJ9O2Z1bmN0aW9uIG14KGUsdCl7dmFyIG49ZS54LHI9ZS55LG89dC5kZXZpY2VQaXhlbFJhdGlvfHwxO3JldHVybnt4OnpuKG4qbykvb3x8MCx5OnpuKHIqbykvb3x8MH19ZnVuY3Rpb24gRWcoZSl7dmFyIHQsbj1lLnBvcHBlcixyPWUucG9wcGVyUmVjdCxvPWUucGxhY2VtZW50LGE9ZS52YXJpYXRpb24saT1lLm9mZnNldHMscz1lLnBvc2l0aW9uLGw9ZS5ncHVBY2NlbGVyYXRpb24sdT1lLmFkYXB0aXZlLGM9ZS5yb3VuZE9mZnNldHMsZD1lLmlzRml4ZWQscD1pLngsZz1wPT09dm9pZCAwPzA6cCx2PWkueSx5PXY9PT12b2lkIDA/MDp2LGI9dHlwZW9mIGM9PSJmdW5jdGlvbiI/Yyh7eDpnLHl9KTp7eDpnLHl9O2c9Yi54LHk9Yi55O3ZhciBoPWkuaGFzT3duUHJvcGVydHkoIngiKSxtPWkuaGFzT3duUHJvcGVydHkoInkiKSx3PVVlLGY9emUsVD13aW5kb3c7aWYodSl7dmFyIFM9b24obiksRD0iY2xpZW50SGVpZ2h0IixOPSJjbGllbnRXaWR0aCI7aWYoUz09PU9lKG4pJiYoUz1ldChuKSxmdChTKS5wb3NpdGlvbiE9PSJzdGF0aWMiJiZzPT09ImFic29sdXRlIiYmKEQ9InNjcm9sbEhlaWdodCIsTj0ic2Nyb2xsV2lkdGgiKSksUz1TLG89PT16ZXx8KG89PT1VZXx8bz09PUJlKSYmYT09PVVyKXtmPWplO3ZhciBDPWQmJlM9PT1UJiZULnZpc3VhbFZpZXdwb3J0P1QudmlzdWFsVmlld3BvcnQuaGVpZ2h0OlNbRF07eS09Qy1yLmhlaWdodCx5Kj1sPzE6LTF9aWYobz09PVVlfHwobz09PXplfHxvPT09amUpJiZhPT09VXIpe3c9QmU7dmFyIHg9ZCYmUz09PVQmJlQudmlzdWFsVmlld3BvcnQ/VC52aXN1YWxWaWV3cG9ydC53aWR0aDpTW05dO2ctPXgtci53aWR0aCxnKj1sPzE6LTF9fXZhciBNPU9iamVjdC5hc3NpZ24oe3Bvc2l0aW9uOnN9LHUmJmZ4KSxQPWM9PT0hMD9teCh7eDpnLHl9LE9lKG4pKTp7eDpnLHl9O2lmKGc9UC54LHk9UC55LGwpe3ZhciBPO3JldHVybiBPYmplY3QuYXNzaWduKHt9LE0sKE89e30sT1tmXT1tPyIwIjoiIixPW3ddPWg/IjAiOiIiLE8udHJhbnNmb3JtPShULmRldmljZVBpeGVsUmF0aW98fDEpPD0xPyJ0cmFuc2xhdGUoIitnKyJweCwgIit5KyJweCkiOiJ0cmFuc2xhdGUzZCgiK2crInB4LCAiK3krInB4LCAwKSIsTykpfXJldHVybiBPYmplY3QuYXNzaWduKHt9LE0sKHQ9e30sdFtmXT1tP3krInB4IjoiIix0W3ddPWg/ZysicHgiOiIiLHQudHJhbnNmb3JtPSIiLHQpKX1mdW5jdGlvbiBoeChlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLHI9bi5ncHVBY2NlbGVyYXRpb24sbz1yPT09dm9pZCAwPyEwOnIsYT1uLmFkYXB0aXZlLGk9YT09PXZvaWQgMD8hMDphLHM9bi5yb3VuZE9mZnNldHMsbD1zPT09dm9pZCAwPyEwOnMsdT17cGxhY2VtZW50OnFlKHQucGxhY2VtZW50KSx2YXJpYXRpb246anQodC5wbGFjZW1lbnQpLHBvcHBlcjp0LmVsZW1lbnRzLnBvcHBlcixwb3BwZXJSZWN0OnQucmVjdHMucG9wcGVyLGdwdUFjY2VsZXJhdGlvbjpvLGlzRml4ZWQ6dC5vcHRpb25zLnN0cmF0ZWd5PT09ImZpeGVkIn07dC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMhPW51bGwmJih0LnN0eWxlcy5wb3BwZXI9T2JqZWN0LmFzc2lnbih7fSx0LnN0eWxlcy5wb3BwZXIsRWcoT2JqZWN0LmFzc2lnbih7fSx1LHtvZmZzZXRzOnQubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLHBvc2l0aW9uOnQub3B0aW9ucy5zdHJhdGVneSxhZGFwdGl2ZTppLHJvdW5kT2Zmc2V0czpsfSkpKSksdC5tb2RpZmllcnNEYXRhLmFycm93IT1udWxsJiYodC5zdHlsZXMuYXJyb3c9T2JqZWN0LmFzc2lnbih7fSx0LnN0eWxlcy5hcnJvdyxFZyhPYmplY3QuYXNzaWduKHt9LHUse29mZnNldHM6dC5tb2RpZmllcnNEYXRhLmFycm93LHBvc2l0aW9uOiJhYnNvbHV0ZSIsYWRhcHRpdmU6ITEscm91bmRPZmZzZXRzOmx9KSkpKSx0LmF0dHJpYnV0ZXMucG9wcGVyPU9iamVjdC5hc3NpZ24oe30sdC5hdHRyaWJ1dGVzLnBvcHBlcix7ImRhdGEtcG9wcGVyLXBsYWNlbWVudCI6dC5wbGFjZW1lbnR9KX12YXIgVGc9e25hbWU6ImNvbXB1dGVTdHlsZXMiLGVuYWJsZWQ6ITAscGhhc2U6ImJlZm9yZVdyaXRlIixmbjpoeCxkYXRhOnt9fTt2YXIgcXM9e3Bhc3NpdmU6ITB9O2Z1bmN0aW9uIGd4KGUpe3ZhciB0PWUuc3RhdGUsbj1lLmluc3RhbmNlLHI9ZS5vcHRpb25zLG89ci5zY3JvbGwsYT1vPT09dm9pZCAwPyEwOm8saT1yLnJlc2l6ZSxzPWk9PT12b2lkIDA/ITA6aSxsPU9lKHQuZWxlbWVudHMucG9wcGVyKSx1PVtdLmNvbmNhdCh0LnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLHQuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO3JldHVybiBhJiZ1LmZvckVhY2goZnVuY3Rpb24oYyl7Yy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4udXBkYXRlLHFzKX0pLHMmJmwuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixuLnVwZGF0ZSxxcyksZnVuY3Rpb24oKXthJiZ1LmZvckVhY2goZnVuY3Rpb24oYyl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4udXBkYXRlLHFzKX0pLHMmJmwucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuLnVwZGF0ZSxxcyl9fXZhciBOZz17bmFtZToiZXZlbnRMaXN0ZW5lcnMiLGVuYWJsZWQ6ITAscGhhc2U6IndyaXRlIixmbjpmdW5jdGlvbigpe30sZWZmZWN0Omd4LGRhdGE6e319O3ZhciB2eD17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifTtmdW5jdGlvbiBCbyhlKXtyZXR1cm4gZS5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyxmdW5jdGlvbih0KXtyZXR1cm4gdnhbdF19KX12YXIgeXg9e3N0YXJ0OiJlbmQiLGVuZDoic3RhcnQifTtmdW5jdGlvbiBRcyhlKXtyZXR1cm4gZS5yZXBsYWNlKC9zdGFydHxlbmQvZyxmdW5jdGlvbih0KXtyZXR1cm4geXhbdF19KX1mdW5jdGlvbiBqcihlKXt2YXIgdD1PZShlKSxuPXQucGFnZVhPZmZzZXQscj10LnBhZ2VZT2Zmc2V0O3JldHVybntzY3JvbGxMZWZ0Om4sc2Nyb2xsVG9wOnJ9fWZ1bmN0aW9uIFZyKGUpe3JldHVybiBIdChldChlKSkubGVmdCtqcihlKS5zY3JvbGxMZWZ0fWZ1bmN0aW9uIHJkKGUsdCl7dmFyIG49T2UoZSkscj1ldChlKSxvPW4udmlzdWFsVmlld3BvcnQsYT1yLmNsaWVudFdpZHRoLGk9ci5jbGllbnRIZWlnaHQscz0wLGw9MDtpZihvKXthPW8ud2lkdGgsaT1vLmhlaWdodDt2YXIgdT1WYSgpOyh1fHwhdSYmdD09PSJmaXhlZCIpJiYocz1vLm9mZnNldExlZnQsbD1vLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOmEsaGVpZ2h0OmkseDpzK1ZyKGUpLHk6bH19ZnVuY3Rpb24gb2QoZSl7dmFyIHQsbj1ldChlKSxyPWpyKGUpLG89KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5ib2R5LGE9cm4obi5zY3JvbGxXaWR0aCxuLmNsaWVudFdpZHRoLG8/by5zY3JvbGxXaWR0aDowLG8/by5jbGllbnRXaWR0aDowKSxpPXJuKG4uc2Nyb2xsSGVpZ2h0LG4uY2xpZW50SGVpZ2h0LG8/by5zY3JvbGxIZWlnaHQ6MCxvP28uY2xpZW50SGVpZ2h0OjApLHM9LXIuc2Nyb2xsTGVmdCtWcihlKSxsPS1yLnNjcm9sbFRvcDtyZXR1cm4gZnQob3x8bikuZGlyZWN0aW9uPT09InJ0bCImJihzKz1ybihuLmNsaWVudFdpZHRoLG8/by5jbGllbnRXaWR0aDowKS1hKSx7d2lkdGg6YSxoZWlnaHQ6aSx4OnMseTpsfX1mdW5jdGlvbiBHcihlKXt2YXIgdD1mdChlKSxuPXQub3ZlcmZsb3cscj10Lm92ZXJmbG93WCxvPXQub3ZlcmZsb3dZO3JldHVybi9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChuK28rcil9ZnVuY3Rpb24gSnMoZSl7cmV0dXJuWyJodG1sIiwiYm9keSIsIiNkb2N1bWVudCJdLmluZGV4T2YoWWUoZSkpPj0wP2Uub3duZXJEb2N1bWVudC5ib2R5OlZlKGUpJiZHcihlKT9lOkpzKEZuKGUpKX1mdW5jdGlvbiBocihlLHQpe3ZhciBuO3Q9PT12b2lkIDAmJih0PVtdKTt2YXIgcj1KcyhlKSxvPXI9PT0oKG49ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6bi5ib2R5KSxhPU9lKHIpLGk9bz9bYV0uY29uY2F0KGEudmlzdWFsVmlld3BvcnR8fFtdLEdyKHIpP3I6W10pOnIscz10LmNvbmNhdChpKTtyZXR1cm4gbz9zOnMuY29uY2F0KGhyKEZuKGkpKSl9ZnVuY3Rpb24gV28oZSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx7bGVmdDplLngsdG9wOmUueSxyaWdodDplLngrZS53aWR0aCxib3R0b206ZS55K2UuaGVpZ2h0fSl9ZnVuY3Rpb24gd3goZSx0KXt2YXIgbj1IdChlLCExLHQ9PT0iZml4ZWQiKTtyZXR1cm4gbi50b3A9bi50b3ArZS5jbGllbnRUb3Asbi5sZWZ0PW4ubGVmdCtlLmNsaWVudExlZnQsbi5ib3R0b209bi50b3ArZS5jbGllbnRIZWlnaHQsbi5yaWdodD1uLmxlZnQrZS5jbGllbnRXaWR0aCxuLndpZHRoPWUuY2xpZW50V2lkdGgsbi5oZWlnaHQ9ZS5jbGllbnRIZWlnaHQsbi54PW4ubGVmdCxuLnk9bi50b3Asbn1mdW5jdGlvbiBEZyhlLHQsbil7cmV0dXJuIHQ9PT1Lcz9XbyhyZChlLG4pKTpXdCh0KT93eCh0LG4pOldvKG9kKGV0KGUpKSl9ZnVuY3Rpb24gYngoZSl7dmFyIHQ9aHIoRm4oZSkpLG49WyJhYnNvbHV0ZSIsImZpeGVkIl0uaW5kZXhPZihmdChlKS5wb3NpdGlvbik+PTAscj1uJiZWZShlKT9vbihlKTplO3JldHVybiBXdChyKT90LmZpbHRlcihmdW5jdGlvbihvKXtyZXR1cm4gV3QobykmJkdhKG8scikmJlllKG8pIT09ImJvZHkifSk6W119ZnVuY3Rpb24gYWQoZSx0LG4scil7dmFyIG89dD09PSJjbGlwcGluZ1BhcmVudHMiP2J4KGUpOltdLmNvbmNhdCh0KSxhPVtdLmNvbmNhdChvLFtuXSksaT1hWzBdLHM9YS5yZWR1Y2UoZnVuY3Rpb24obCx1KXt2YXIgYz1EZyhlLHUscik7cmV0dXJuIGwudG9wPXJuKGMudG9wLGwudG9wKSxsLnJpZ2h0PSRyKGMucmlnaHQsbC5yaWdodCksbC5ib3R0b209JHIoYy5ib3R0b20sbC5ib3R0b20pLGwubGVmdD1ybihjLmxlZnQsbC5sZWZ0KSxsfSxEZyhlLGkscikpO3JldHVybiBzLndpZHRoPXMucmlnaHQtcy5sZWZ0LHMuaGVpZ2h0PXMuYm90dG9tLXMudG9wLHMueD1zLmxlZnQscy55PXMudG9wLHN9ZnVuY3Rpb24gUWEoZSl7dmFyIHQ9ZS5yZWZlcmVuY2Usbj1lLmVsZW1lbnQscj1lLnBsYWNlbWVudCxvPXI/cWUocik6bnVsbCxhPXI/anQocik6bnVsbCxpPXQueCt0LndpZHRoLzItbi53aWR0aC8yLHM9dC55K3QuaGVpZ2h0LzItbi5oZWlnaHQvMixsO3N3aXRjaChvKXtjYXNlIHplOmw9e3g6aSx5OnQueS1uLmhlaWdodH07YnJlYWs7Y2FzZSBqZTpsPXt4OmkseTp0LnkrdC5oZWlnaHR9O2JyZWFrO2Nhc2UgQmU6bD17eDp0LngrdC53aWR0aCx5OnN9O2JyZWFrO2Nhc2UgVWU6bD17eDp0Lngtbi53aWR0aCx5OnN9O2JyZWFrO2RlZmF1bHQ6bD17eDp0LngseTp0Lnl9fXZhciB1PW8/V3Iobyk6bnVsbDtpZih1IT1udWxsKXt2YXIgYz11PT09InkiPyJoZWlnaHQiOiJ3aWR0aCI7c3dpdGNoKGEpe2Nhc2UgTG46bFt1XT1sW3VdLSh0W2NdLzItbltjXS8yKTticmVhaztjYXNlIFVyOmxbdV09bFt1XSsodFtjXS8yLW5bY10vMik7YnJlYWs7ZGVmYXVsdDp9fXJldHVybiBsfWZ1bmN0aW9uIGFuKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPXQscj1uLnBsYWNlbWVudCxvPXI9PT12b2lkIDA/ZS5wbGFjZW1lbnQ6cixhPW4uc3RyYXRlZ3ksaT1hPT09dm9pZCAwP2Uuc3RyYXRlZ3k6YSxzPW4uYm91bmRhcnksbD1zPT09dm9pZCAwP3lnOnMsdT1uLnJvb3RCb3VuZGFyeSxjPXU9PT12b2lkIDA/S3M6dSxkPW4uZWxlbWVudENvbnRleHQscD1kPT09dm9pZCAwP0ZvOmQsZz1uLmFsdEJvdW5kYXJ5LHY9Zz09PXZvaWQgMD8hMTpnLHk9bi5wYWRkaW5nLGI9eT09PXZvaWQgMD8wOnksaD1ZYSh0eXBlb2YgYiE9Im51bWJlciI/YjpxYShiLG1yKSksbT1wPT09Rm8/d2c6Rm8sdz1lLnJlY3RzLnBvcHBlcixmPWUuZWxlbWVudHNbdj9tOnBdLFQ9YWQoV3QoZik/ZjpmLmNvbnRleHRFbGVtZW50fHxldChlLmVsZW1lbnRzLnBvcHBlciksbCxjLGkpLFM9SHQoZS5lbGVtZW50cy5yZWZlcmVuY2UpLEQ9UWEoe3JlZmVyZW5jZTpTLGVsZW1lbnQ6dyxzdHJhdGVneToiYWJzb2x1dGUiLHBsYWNlbWVudDpvfSksTj1XbyhPYmplY3QuYXNzaWduKHt9LHcsRCkpLEM9cD09PUZvP046Uyx4PXt0b3A6VC50b3AtQy50b3AraC50b3AsYm90dG9tOkMuYm90dG9tLVQuYm90dG9tK2guYm90dG9tLGxlZnQ6VC5sZWZ0LUMubGVmdCtoLmxlZnQscmlnaHQ6Qy5yaWdodC1ULnJpZ2h0K2gucmlnaHR9LE09ZS5tb2RpZmllcnNEYXRhLm9mZnNldDtpZihwPT09Rm8mJk0pe3ZhciBQPU1bb107T2JqZWN0LmtleXMoeCkuZm9yRWFjaChmdW5jdGlvbihPKXt2YXIgUj1bQmUsamVdLmluZGV4T2YoTyk+PTA/MTotMSxVPVt6ZSxqZV0uaW5kZXhPZihPKT49MD8ieSI6IngiO3hbT10rPVBbVV0qUn0pfXJldHVybiB4fWZ1bmN0aW9uIGlkKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPXQscj1uLnBsYWNlbWVudCxvPW4uYm91bmRhcnksYT1uLnJvb3RCb3VuZGFyeSxpPW4ucGFkZGluZyxzPW4uZmxpcFZhcmlhdGlvbnMsbD1uLmFsbG93ZWRBdXRvUGxhY2VtZW50cyx1PWw9PT12b2lkIDA/WXM6bCxjPWp0KHIpLGQ9Yz9zP3RkOnRkLmZpbHRlcihmdW5jdGlvbih2KXtyZXR1cm4ganQodik9PT1jfSk6bXIscD1kLmZpbHRlcihmdW5jdGlvbih2KXtyZXR1cm4gdS5pbmRleE9mKHYpPj0wfSk7cC5sZW5ndGg9PT0wJiYocD1kKTt2YXIgZz1wLnJlZHVjZShmdW5jdGlvbih2LHkpe3JldHVybiB2W3ldPWFuKGUse3BsYWNlbWVudDp5LGJvdW5kYXJ5Om8scm9vdEJvdW5kYXJ5OmEscGFkZGluZzppfSlbcWUoeSldLHZ9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXMoZykuc29ydChmdW5jdGlvbih2LHkpe3JldHVybiBnW3ZdLWdbeV19KX1mdW5jdGlvbiB4eChlKXtpZihxZShlKT09PUdzKXJldHVybltdO3ZhciB0PUJvKGUpO3JldHVybltRcyhlKSx0LFFzKHQpXX1mdW5jdGlvbiBreChlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLHI9ZS5uYW1lO2lmKCF0Lm1vZGlmaWVyc0RhdGFbcl0uX3NraXApe2Zvcih2YXIgbz1uLm1haW5BeGlzLGE9bz09PXZvaWQgMD8hMDpvLGk9bi5hbHRBeGlzLHM9aT09PXZvaWQgMD8hMDppLGw9bi5mYWxsYmFja1BsYWNlbWVudHMsdT1uLnBhZGRpbmcsYz1uLmJvdW5kYXJ5LGQ9bi5yb290Qm91bmRhcnkscD1uLmFsdEJvdW5kYXJ5LGc9bi5mbGlwVmFyaWF0aW9ucyx2PWc9PT12b2lkIDA/ITA6Zyx5PW4uYWxsb3dlZEF1dG9QbGFjZW1lbnRzLGI9dC5vcHRpb25zLnBsYWNlbWVudCxoPXFlKGIpLG09aD09PWIsdz1sfHwobXx8IXY/W0JvKGIpXTp4eChiKSksZj1bYl0uY29uY2F0KHcpLnJlZHVjZShmdW5jdGlvbihILEspe3JldHVybiBILmNvbmNhdChxZShLKT09PUdzP2lkKHQse3BsYWNlbWVudDpLLGJvdW5kYXJ5OmMscm9vdEJvdW5kYXJ5OmQscGFkZGluZzp1LGZsaXBWYXJpYXRpb25zOnYsYWxsb3dlZEF1dG9QbGFjZW1lbnRzOnl9KTpLKX0sW10pLFQ9dC5yZWN0cy5yZWZlcmVuY2UsUz10LnJlY3RzLnBvcHBlcixEPW5ldyBNYXAsTj0hMCxDPWZbMF0seD0wO3g8Zi5sZW5ndGg7eCsrKXt2YXIgTT1mW3hdLFA9cWUoTSksTz1qdChNKT09PUxuLFI9W3plLGplXS5pbmRleE9mKFApPj0wLFU9Uj8id2lkdGgiOiJoZWlnaHQiLEc9YW4odCx7cGxhY2VtZW50Ok0sYm91bmRhcnk6Yyxyb290Qm91bmRhcnk6ZCxhbHRCb3VuZGFyeTpwLHBhZGRpbmc6dX0pLFE9Uj9PP0JlOlVlOk8/amU6emU7VFtVXT5TW1VdJiYoUT1CbyhRKSk7dmFyIHBlPUJvKFEpLF9lPVtdO2lmKGEmJl9lLnB1c2goR1tQXTw9MCkscyYmX2UucHVzaChHW1FdPD0wLEdbcGVdPD0wKSxfZS5ldmVyeShmdW5jdGlvbihIKXtyZXR1cm4gSH0pKXtDPU0sTj0hMTticmVha31ELnNldChNLF9lKX1pZihOKWZvcih2YXIgRT12PzM6MSxrPWZ1bmN0aW9uKEspe3ZhciBxPWYuZmluZChmdW5jdGlvbihWKXt2YXIgJD1ELmdldChWKTtpZigkKXJldHVybiAkLnNsaWNlKDAsSykuZXZlcnkoZnVuY3Rpb24oWCl7cmV0dXJuIFh9KX0pO2lmKHEpcmV0dXJuIEM9cSwiYnJlYWsifSxGPUU7Rj4wO0YtLSl7dmFyIFc9ayhGKTtpZihXPT09ImJyZWFrIilicmVha310LnBsYWNlbWVudCE9PUMmJih0Lm1vZGlmaWVyc0RhdGFbcl0uX3NraXA9ITAsdC5wbGFjZW1lbnQ9Qyx0LnJlc2V0PSEwKX19dmFyIF9nPXtuYW1lOiJmbGlwIixlbmFibGVkOiEwLHBoYXNlOiJtYWluIixmbjpreCxyZXF1aXJlc0lmRXhpc3RzOlsib2Zmc2V0Il0sZGF0YTp7X3NraXA6ITF9fTtmdW5jdGlvbiBDZyhlLHQsbil7cmV0dXJuIG49PT12b2lkIDAmJihuPXt4OjAseTowfSkse3RvcDplLnRvcC10LmhlaWdodC1uLnkscmlnaHQ6ZS5yaWdodC10LndpZHRoK24ueCxib3R0b206ZS5ib3R0b20tdC5oZWlnaHQrbi55LGxlZnQ6ZS5sZWZ0LXQud2lkdGgtbi54fX1mdW5jdGlvbiBBZyhlKXtyZXR1cm5bemUsQmUsamUsVWVdLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF0+PTB9KX1mdW5jdGlvbiBTeChlKXt2YXIgdD1lLnN0YXRlLG49ZS5uYW1lLHI9dC5yZWN0cy5yZWZlcmVuY2Usbz10LnJlY3RzLnBvcHBlcixhPXQubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3csaT1hbih0LHtlbGVtZW50Q29udGV4dDoicmVmZXJlbmNlIn0pLHM9YW4odCx7YWx0Qm91bmRhcnk6ITB9KSxsPUNnKGksciksdT1DZyhzLG8sYSksYz1BZyhsKSxkPUFnKHUpO3QubW9kaWZpZXJzRGF0YVtuXT17cmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOmwscG9wcGVyRXNjYXBlT2Zmc2V0czp1LGlzUmVmZXJlbmNlSGlkZGVuOmMsaGFzUG9wcGVyRXNjYXBlZDpkfSx0LmF0dHJpYnV0ZXMucG9wcGVyPU9iamVjdC5hc3NpZ24oe30sdC5hdHRyaWJ1dGVzLnBvcHBlcix7ImRhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4iOmMsImRhdGEtcG9wcGVyLWVzY2FwZWQiOmR9KX12YXIgT2c9e25hbWU6ImhpZGUiLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLHJlcXVpcmVzSWZFeGlzdHM6WyJwcmV2ZW50T3ZlcmZsb3ciXSxmbjpTeH07ZnVuY3Rpb24gRXgoZSx0LG4pe3ZhciByPXFlKGUpLG89W1VlLHplXS5pbmRleE9mKHIpPj0wPy0xOjEsYT10eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKE9iamVjdC5hc3NpZ24oe30sdCx7cGxhY2VtZW50OmV9KSk6bixpPWFbMF0scz1hWzFdO3JldHVybiBpPWl8fDAscz0oc3x8MCkqbyxbVWUsQmVdLmluZGV4T2Yocik+PTA/e3g6cyx5Oml9Ont4OmkseTpzfX1mdW5jdGlvbiBUeChlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLHI9ZS5uYW1lLG89bi5vZmZzZXQsYT1vPT09dm9pZCAwP1swLDBdOm8saT1Zcy5yZWR1Y2UoZnVuY3Rpb24oYyxkKXtyZXR1cm4gY1tkXT1FeChkLHQucmVjdHMsYSksY30se30pLHM9aVt0LnBsYWNlbWVudF0sbD1zLngsdT1zLnk7dC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMhPW51bGwmJih0Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54Kz1sLHQubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkrPXUpLHQubW9kaWZpZXJzRGF0YVtyXT1pfXZhciBSZz17bmFtZToib2Zmc2V0IixlbmFibGVkOiEwLHBoYXNlOiJtYWluIixyZXF1aXJlczpbInBvcHBlck9mZnNldHMiXSxmbjpUeH07ZnVuY3Rpb24gTngoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUubmFtZTt0Lm1vZGlmaWVyc0RhdGFbbl09UWEoe3JlZmVyZW5jZTp0LnJlY3RzLnJlZmVyZW5jZSxlbGVtZW50OnQucmVjdHMucG9wcGVyLHN0cmF0ZWd5OiJhYnNvbHV0ZSIscGxhY2VtZW50OnQucGxhY2VtZW50fSl9dmFyIE1nPXtuYW1lOiJwb3BwZXJPZmZzZXRzIixlbmFibGVkOiEwLHBoYXNlOiJyZWFkIixmbjpOeCxkYXRhOnt9fTtmdW5jdGlvbiBzZChlKXtyZXR1cm4gZT09PSJ4Ij8ieSI6IngifWZ1bmN0aW9uIER4KGUpe3ZhciB0PWUuc3RhdGUsbj1lLm9wdGlvbnMscj1lLm5hbWUsbz1uLm1haW5BeGlzLGE9bz09PXZvaWQgMD8hMDpvLGk9bi5hbHRBeGlzLHM9aT09PXZvaWQgMD8hMTppLGw9bi5ib3VuZGFyeSx1PW4ucm9vdEJvdW5kYXJ5LGM9bi5hbHRCb3VuZGFyeSxkPW4ucGFkZGluZyxwPW4udGV0aGVyLGc9cD09PXZvaWQgMD8hMDpwLHY9bi50ZXRoZXJPZmZzZXQseT12PT09dm9pZCAwPzA6dixiPWFuKHQse2JvdW5kYXJ5Omwscm9vdEJvdW5kYXJ5OnUscGFkZGluZzpkLGFsdEJvdW5kYXJ5OmN9KSxoPXFlKHQucGxhY2VtZW50KSxtPWp0KHQucGxhY2VtZW50KSx3PSFtLGY9V3IoaCksVD1zZChmKSxTPXQubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLEQ9dC5yZWN0cy5yZWZlcmVuY2UsTj10LnJlY3RzLnBvcHBlcixDPXR5cGVvZiB5PT0iZnVuY3Rpb24iP3koT2JqZWN0LmFzc2lnbih7fSx0LnJlY3RzLHtwbGFjZW1lbnQ6dC5wbGFjZW1lbnR9KSk6eSx4PXR5cGVvZiBDPT0ibnVtYmVyIj97bWFpbkF4aXM6QyxhbHRBeGlzOkN9Ok9iamVjdC5hc3NpZ24oe21haW5BeGlzOjAsYWx0QXhpczowfSxDKSxNPXQubW9kaWZpZXJzRGF0YS5vZmZzZXQ/dC5tb2RpZmllcnNEYXRhLm9mZnNldFt0LnBsYWNlbWVudF06bnVsbCxQPXt4OjAseTowfTtpZihTKXtpZihhKXt2YXIgTyxSPWY9PT0ieSI/emU6VWUsVT1mPT09InkiP2plOkJlLEc9Zj09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgiLFE9U1tmXSxwZT1RK2JbUl0sX2U9US1iW1VdLEU9Zz8tTltHXS8yOjAsaz1tPT09TG4/RFtHXTpOW0ddLEY9bT09PUxuPy1OW0ddOi1EW0ddLFc9dC5lbGVtZW50cy5hcnJvdyxIPWcmJlc/QnIoVyk6e3dpZHRoOjAsaGVpZ2h0OjB9LEs9dC5tb2RpZmllcnNEYXRhWyJhcnJvdyNwZXJzaXN0ZW50Il0/dC5tb2RpZmllcnNEYXRhWyJhcnJvdyNwZXJzaXN0ZW50Il0ucGFkZGluZzpLYSgpLHE9S1tSXSxWPUtbVV0sJD1IcigwLERbR10sSFtHXSksWD13P0RbR10vMi1FLSQtcS14Lm1haW5BeGlzOmstJC1xLXgubWFpbkF4aXMsdGU9dz8tRFtHXS8yK0UrJCtWK3gubWFpbkF4aXM6RiskK1YreC5tYWluQXhpcyxaPXQuZWxlbWVudHMuYXJyb3cmJm9uKHQuZWxlbWVudHMuYXJyb3cpLHNlPVo/Zj09PSJ5Ij9aLmNsaWVudFRvcHx8MDpaLmNsaWVudExlZnR8fDA6MCxiZT0oTz1NPy5bZl0pIT1udWxsP086MCxyZT1RK1gtYmUtc2UsWT1RK3RlLWJlLGZlPUhyKGc/JHIocGUscmUpOnBlLFEsZz9ybihfZSxZKTpfZSk7U1tmXT1mZSxQW2ZdPWZlLVF9aWYocyl7dmFyIFRlLFFlPWY9PT0ieCI/emU6VWUsc3Q9Zj09PSJ4Ij9qZTpCZSxDZT1TW1RdLFR0PVQ9PT0ieSI/ImhlaWdodCI6IndpZHRoIixFbj1DZStiW1FlXSxkbj1DZS1iW3N0XSxqbj1bemUsVWVdLmluZGV4T2YoaCkhPT0tMSxacj0oVGU9TT8uW1RdKSE9bnVsbD9UZTowLHhyPWpuP0VuOkNlLURbVHRdLU5bVHRdLVpyK3guYWx0QXhpcyxlbz1qbj9DZStEW1R0XStOW1R0XS1aci14LmFsdEF4aXM6ZG4sdG89ZyYmam4/a2coeHIsQ2UsZW8pOkhyKGc/eHI6RW4sQ2UsZz9lbzpkbik7U1tUXT10byxQW1RdPXRvLUNlfXQubW9kaWZpZXJzRGF0YVtyXT1QfX12YXIgSWc9e25hbWU6InByZXZlbnRPdmVyZmxvdyIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIsZm46RHgscmVxdWlyZXNJZkV4aXN0czpbIm9mZnNldCJdfTtmdW5jdGlvbiBsZChlKXtyZXR1cm57c2Nyb2xsTGVmdDplLnNjcm9sbExlZnQsc2Nyb2xsVG9wOmUuc2Nyb2xsVG9wfX1mdW5jdGlvbiB1ZChlKXtyZXR1cm4gZT09PU9lKGUpfHwhVmUoZSk/anIoZSk6bGQoZSl9ZnVuY3Rpb24gX3goZSl7dmFyIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXpuKHQud2lkdGgpL2Uub2Zmc2V0V2lkdGh8fDEscj16bih0LmhlaWdodCkvZS5vZmZzZXRIZWlnaHR8fDE7cmV0dXJuIG4hPT0xfHxyIT09MX1mdW5jdGlvbiBjZChlLHQsbil7bj09PXZvaWQgMCYmKG49ITEpO3ZhciByPVZlKHQpLG89VmUodCkmJl94KHQpLGE9ZXQodCksaT1IdChlLG8sbikscz17c2Nyb2xsTGVmdDowLHNjcm9sbFRvcDowfSxsPXt4OjAseTowfTtyZXR1cm4ocnx8IXImJiFuKSYmKChZZSh0KSE9PSJib2R5Inx8R3IoYSkpJiYocz11ZCh0KSksVmUodCk/KGw9SHQodCwhMCksbC54Kz10LmNsaWVudExlZnQsbC55Kz10LmNsaWVudFRvcCk6YSYmKGwueD1WcihhKSkpLHt4OmkubGVmdCtzLnNjcm9sbExlZnQtbC54LHk6aS50b3Arcy5zY3JvbGxUb3AtbC55LHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fX1mdW5jdGlvbiBDeChlKXt2YXIgdD1uZXcgTWFwLG49bmV3IFNldCxyPVtdO2UuZm9yRWFjaChmdW5jdGlvbihhKXt0LnNldChhLm5hbWUsYSl9KTtmdW5jdGlvbiBvKGEpe24uYWRkKGEubmFtZSk7dmFyIGk9W10uY29uY2F0KGEucmVxdWlyZXN8fFtdLGEucmVxdWlyZXNJZkV4aXN0c3x8W10pO2kuZm9yRWFjaChmdW5jdGlvbihzKXtpZighbi5oYXMocykpe3ZhciBsPXQuZ2V0KHMpO2wmJm8obCl9fSksci5wdXNoKGEpfXJldHVybiBlLmZvckVhY2goZnVuY3Rpb24oYSl7bi5oYXMoYS5uYW1lKXx8byhhKX0pLHJ9ZnVuY3Rpb24gZGQoZSl7dmFyIHQ9Q3goZSk7cmV0dXJuIGJnLnJlZHVjZShmdW5jdGlvbihuLHIpe3JldHVybiBuLmNvbmNhdCh0LmZpbHRlcihmdW5jdGlvbihvKXtyZXR1cm4gby5waGFzZT09PXJ9KSl9LFtdKX1mdW5jdGlvbiBwZChlKXt2YXIgdDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdHx8KHQ9bmV3IFByb21pc2UoZnVuY3Rpb24obil7UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3Q9dm9pZCAwLG4oZSgpKX0pfSkpLHR9fWZ1bmN0aW9uIGZkKGUpe3ZhciB0PWUucmVkdWNlKGZ1bmN0aW9uKG4scil7dmFyIG89bltyLm5hbWVdO3JldHVybiBuW3IubmFtZV09bz9PYmplY3QuYXNzaWduKHt9LG8scix7b3B0aW9uczpPYmplY3QuYXNzaWduKHt9LG8ub3B0aW9ucyxyLm9wdGlvbnMpLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxvLmRhdGEsci5kYXRhKX0pOnIsbn0se30pO3JldHVybiBPYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHRbbl19KX12YXIgUGc9e3BsYWNlbWVudDoiYm90dG9tIixtb2RpZmllcnM6W10sc3RyYXRlZ3k6ImFic29sdXRlIn07ZnVuY3Rpb24gTGcoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4hdC5zb21lKGZ1bmN0aW9uKHIpe3JldHVybiEociYmdHlwZW9mIHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PT0iZnVuY3Rpb24iKX0pfWZ1bmN0aW9uIHpnKGUpe2U9PT12b2lkIDAmJihlPXt9KTt2YXIgdD1lLG49dC5kZWZhdWx0TW9kaWZpZXJzLHI9bj09PXZvaWQgMD9bXTpuLG89dC5kZWZhdWx0T3B0aW9ucyxhPW89PT12b2lkIDA/UGc6bztyZXR1cm4gZnVuY3Rpb24ocyxsLHUpe3U9PT12b2lkIDAmJih1PWEpO3ZhciBjPXtwbGFjZW1lbnQ6ImJvdHRvbSIsb3JkZXJlZE1vZGlmaWVyczpbXSxvcHRpb25zOk9iamVjdC5hc3NpZ24oe30sUGcsYSksbW9kaWZpZXJzRGF0YTp7fSxlbGVtZW50czp7cmVmZXJlbmNlOnMscG9wcGVyOmx9LGF0dHJpYnV0ZXM6e30sc3R5bGVzOnt9fSxkPVtdLHA9ITEsZz17c3RhdGU6YyxzZXRPcHRpb25zOmZ1bmN0aW9uKGgpe3ZhciBtPXR5cGVvZiBoPT0iZnVuY3Rpb24iP2goYy5vcHRpb25zKTpoO3koKSxjLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxhLGMub3B0aW9ucyxtKSxjLnNjcm9sbFBhcmVudHM9e3JlZmVyZW5jZTpXdChzKT9ocihzKTpzLmNvbnRleHRFbGVtZW50P2hyKHMuY29udGV4dEVsZW1lbnQpOltdLHBvcHBlcjpocihsKX07dmFyIHc9ZGQoZmQoW10uY29uY2F0KHIsYy5vcHRpb25zLm1vZGlmaWVycykpKTtyZXR1cm4gYy5vcmRlcmVkTW9kaWZpZXJzPXcuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiBmLmVuYWJsZWR9KSx2KCksZy51cGRhdGUoKX0sZm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXtpZighcCl7dmFyIGg9Yy5lbGVtZW50cyxtPWgucmVmZXJlbmNlLHc9aC5wb3BwZXI7aWYoTGcobSx3KSl7Yy5yZWN0cz17cmVmZXJlbmNlOmNkKG0sb24odyksYy5vcHRpb25zLnN0cmF0ZWd5PT09ImZpeGVkIikscG9wcGVyOkJyKHcpfSxjLnJlc2V0PSExLGMucGxhY2VtZW50PWMub3B0aW9ucy5wbGFjZW1lbnQsYy5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24oeCl7cmV0dXJuIGMubW9kaWZpZXJzRGF0YVt4Lm5hbWVdPU9iamVjdC5hc3NpZ24oe30seC5kYXRhKX0pO2Zvcih2YXIgZj0wO2Y8Yy5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDtmKyspe2lmKGMucmVzZXQ9PT0hMCl7Yy5yZXNldD0hMSxmPS0xO2NvbnRpbnVlfXZhciBUPWMub3JkZXJlZE1vZGlmaWVyc1tmXSxTPVQuZm4sRD1ULm9wdGlvbnMsTj1EPT09dm9pZCAwP3t9OkQsQz1ULm5hbWU7dHlwZW9mIFM9PSJmdW5jdGlvbiImJihjPVMoe3N0YXRlOmMsb3B0aW9uczpOLG5hbWU6QyxpbnN0YW5jZTpnfSl8fGMpfX19fSx1cGRhdGU6cGQoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYil7Zy5mb3JjZVVwZGF0ZSgpLGIoYyl9KX0pLGRlc3Ryb3k6ZnVuY3Rpb24oKXt5KCkscD0hMH19O2lmKCFMZyhzLGwpKXJldHVybiBnO2cuc2V0T3B0aW9ucyh1KS50aGVuKGZ1bmN0aW9uKGIpeyFwJiZ1Lm9uRmlyc3RVcGRhdGUmJnUub25GaXJzdFVwZGF0ZShiKX0pO2Z1bmN0aW9uIHYoKXtjLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgaD1iLm5hbWUsbT1iLm9wdGlvbnMsdz1tPT09dm9pZCAwP3t9Om0sZj1iLmVmZmVjdDtpZih0eXBlb2YgZj09ImZ1bmN0aW9uIil7dmFyIFQ9Zih7c3RhdGU6YyxuYW1lOmgsaW5zdGFuY2U6ZyxvcHRpb25zOnd9KSxTPWZ1bmN0aW9uKCl7fTtkLnB1c2goVHx8Uyl9fSl9ZnVuY3Rpb24geSgpe2QuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYigpfSksZD1bXX1yZXR1cm4gZ319dmFyIEF4PVtOZyxNZyxUZyxqYSxSZyxfZyxJZyxTZyxPZ10sbWQ9emcoe2RlZmF1bHRNb2RpZmllcnM6QXh9KTt2YXIgT3g9InRpcHB5LWJveCIsS2c9InRpcHB5LWNvbnRlbnQiLFJ4PSJ0aXBweS1iYWNrZHJvcCIsWWc9InRpcHB5LWFycm93IixxZz0idGlwcHktc3ZnLWFycm93IixLcj17cGFzc2l2ZTohMCxjYXB0dXJlOiEwfSxRZz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5fTtmdW5jdGlvbiBoZChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIHI9ZVt0XTtyZXR1cm4gcj8/KEFycmF5LmlzQXJyYXkobik/blt0XTpuKX1yZXR1cm4gZX1mdW5jdGlvbiB4ZChlLHQpe3ZhciBuPXt9LnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIG4uaW5kZXhPZigiW29iamVjdCIpPT09MCYmbi5pbmRleE9mKHQrIl0iKT4tMX1mdW5jdGlvbiBKZyhlLHQpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIj9lLmFwcGx5KHZvaWQgMCx0KTplfWZ1bmN0aW9uIEZnKGUsdCl7aWYodD09PTApcmV0dXJuIGU7dmFyIG47cmV0dXJuIGZ1bmN0aW9uKHIpe2NsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKHIpfSx0KX19ZnVuY3Rpb24gTXgoZSl7cmV0dXJuIGUuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKX1mdW5jdGlvbiBIbyhlKXtyZXR1cm5bXS5jb25jYXQoZSl9ZnVuY3Rpb24gVWcoZSx0KXtlLmluZGV4T2YodCk9PT0tMSYmZS5wdXNoKHQpfWZ1bmN0aW9uIEl4KGUpe3JldHVybiBlLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiBlLmluZGV4T2YodCk9PT1ufSl9ZnVuY3Rpb24gUHgoZSl7cmV0dXJuIGUuc3BsaXQoIi0iKVswXX1mdW5jdGlvbiBacyhlKXtyZXR1cm5bXS5zbGljZS5jYWxsKGUpfWZ1bmN0aW9uICRnKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gZVtuXSE9PXZvaWQgMCYmKHRbbl09ZVtuXSksdH0se30pfWZ1bmN0aW9uIEphKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfWZ1bmN0aW9uIGVsKGUpe3JldHVyblsiRWxlbWVudCIsIkZyYWdtZW50Il0uc29tZShmdW5jdGlvbih0KXtyZXR1cm4geGQoZSx0KX0pfWZ1bmN0aW9uIEx4KGUpe3JldHVybiB4ZChlLCJOb2RlTGlzdCIpfWZ1bmN0aW9uIHp4KGUpe3JldHVybiB4ZChlLCJNb3VzZUV2ZW50Iil9ZnVuY3Rpb24gRngoZSl7cmV0dXJuISEoZSYmZS5fdGlwcHkmJmUuX3RpcHB5LnJlZmVyZW5jZT09PWUpfWZ1bmN0aW9uIFV4KGUpe3JldHVybiBlbChlKT9bZV06THgoZSk/WnMoZSk6QXJyYXkuaXNBcnJheShlKT9lOlpzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfWZ1bmN0aW9uIGdkKGUsdCl7ZS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJihuLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj10KyJtcyIpfSl9ZnVuY3Rpb24gQmcoZSx0KXtlLmZvckVhY2goZnVuY3Rpb24obil7biYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdGUiLHQpfSl9ZnVuY3Rpb24gJHgoZSl7dmFyIHQsbj1IbyhlKSxyPW5bMF07cmV0dXJuIHIhPW51bGwmJih0PXIub3duZXJEb2N1bWVudCkhPW51bGwmJnQuYm9keT9yLm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnR9ZnVuY3Rpb24gQngoZSx0KXt2YXIgbj10LmNsaWVudFgscj10LmNsaWVudFk7cmV0dXJuIGUuZXZlcnkoZnVuY3Rpb24obyl7dmFyIGE9by5wb3BwZXJSZWN0LGk9by5wb3BwZXJTdGF0ZSxzPW8ucHJvcHMsbD1zLmludGVyYWN0aXZlQm9yZGVyLHU9UHgoaS5wbGFjZW1lbnQpLGM9aS5tb2RpZmllcnNEYXRhLm9mZnNldDtpZighYylyZXR1cm4hMDt2YXIgZD11PT09ImJvdHRvbSI/Yy50b3AueTowLHA9dT09PSJ0b3AiP2MuYm90dG9tLnk6MCxnPXU9PT0icmlnaHQiP2MubGVmdC54OjAsdj11PT09ImxlZnQiP2MucmlnaHQueDowLHk9YS50b3AtcitkPmwsYj1yLWEuYm90dG9tLXA+bCxoPWEubGVmdC1uK2c+bCxtPW4tYS5yaWdodC12Pmw7cmV0dXJuIHl8fGJ8fGh8fG19KX1mdW5jdGlvbiB2ZChlLHQsbil7dmFyIHI9dCsiRXZlbnRMaXN0ZW5lciI7WyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCJdLmZvckVhY2goZnVuY3Rpb24obyl7ZVtyXShvLG4pfSl9ZnVuY3Rpb24gV2coZSx0KXtmb3IodmFyIG49dDtuOyl7dmFyIHI7aWYoZS5jb250YWlucyhuKSlyZXR1cm4hMDtuPW4uZ2V0Um9vdE5vZGU9PW51bGx8fChyPW4uZ2V0Um9vdE5vZGUoKSk9PW51bGw/dm9pZCAwOnIuaG9zdH1yZXR1cm4hMX12YXIgd249e2lzVG91Y2g6ITF9LEhnPTA7ZnVuY3Rpb24gV3goKXt3bi5pc1RvdWNofHwod24uaXNUb3VjaD0hMCx3aW5kb3cucGVyZm9ybWFuY2UmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsWGcpKX1mdW5jdGlvbiBYZygpe3ZhciBlPXBlcmZvcm1hbmNlLm5vdygpO2UtSGc8MjAmJih3bi5pc1RvdWNoPSExLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsWGcpKSxIZz1lfWZ1bmN0aW9uIEh4KCl7dmFyIGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZihGeChlKSl7dmFyIHQ9ZS5fdGlwcHk7ZS5ibHVyJiYhdC5zdGF0ZS5pc1Zpc2libGUmJmUuYmx1cigpfX1mdW5jdGlvbiBqeCgpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLFd4LEtyKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsSHgpfXZhciBWeD10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIGRvY3VtZW50PCJ1IixHeD1WeD8hIXdpbmRvdy5tc0NyeXB0bzohMTt2YXIgS3g9e2FuaW1hdGVGaWxsOiExLGZvbGxvd0N1cnNvcjohMSxpbmxpbmVQb3NpdGlvbmluZzohMSxzdGlja3k6ITF9LFl4PXthbGxvd0hUTUw6ITEsYW5pbWF0aW9uOiJmYWRlIixhcnJvdzohMCxjb250ZW50OiIiLGluZXJ0aWE6ITEsbWF4V2lkdGg6MzUwLHJvbGU6InRvb2x0aXAiLHRoZW1lOiIiLHpJbmRleDo5OTk5fSxzbj1PYmplY3QuYXNzaWduKHthcHBlbmRUbzpRZyxhcmlhOntjb250ZW50OiJhdXRvIixleHBhbmRlZDoiYXV0byJ9LGRlbGF5OjAsZHVyYXRpb246WzMwMCwyNTBdLGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6bnVsbCxoaWRlT25DbGljazohMCxpZ25vcmVBdHRyaWJ1dGVzOiExLGludGVyYWN0aXZlOiExLGludGVyYWN0aXZlQm9yZGVyOjIsaW50ZXJhY3RpdmVEZWJvdW5jZTowLG1vdmVUcmFuc2l0aW9uOiIiLG9mZnNldDpbMCwxMF0sb25BZnRlclVwZGF0ZTpmdW5jdGlvbigpe30sb25CZWZvcmVVcGRhdGU6ZnVuY3Rpb24oKXt9LG9uQ3JlYXRlOmZ1bmN0aW9uKCl7fSxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXt9LG9uSGlkZGVuOmZ1bmN0aW9uKCl7fSxvbkhpZGU6ZnVuY3Rpb24oKXt9LG9uTW91bnQ6ZnVuY3Rpb24oKXt9LG9uU2hvdzpmdW5jdGlvbigpe30sb25TaG93bjpmdW5jdGlvbigpe30sb25UcmlnZ2VyOmZ1bmN0aW9uKCl7fSxvblVudHJpZ2dlcjpmdW5jdGlvbigpe30sb25DbGlja091dHNpZGU6ZnVuY3Rpb24oKXt9LHBsYWNlbWVudDoidG9wIixwbHVnaW5zOltdLHBvcHBlck9wdGlvbnM6e30scmVuZGVyOm51bGwsc2hvd09uQ3JlYXRlOiExLHRvdWNoOiEwLHRyaWdnZXI6Im1vdXNlZW50ZXIgZm9jdXMiLHRyaWdnZXJUYXJnZXQ6bnVsbH0sS3gsWXgpLHF4PU9iamVjdC5rZXlzKHNuKSxReD1mdW5jdGlvbih0KXt2YXIgbj1PYmplY3Qua2V5cyh0KTtuLmZvckVhY2goZnVuY3Rpb24ocil7c25bcl09dFtyXX0pfTtmdW5jdGlvbiBaZyhlKXt2YXIgdD1lLnBsdWdpbnN8fFtdLG49dC5yZWR1Y2UoZnVuY3Rpb24ocixvKXt2YXIgYT1vLm5hbWUsaT1vLmRlZmF1bHRWYWx1ZTtpZihhKXt2YXIgcztyW2FdPWVbYV0hPT12b2lkIDA/ZVthXToocz1zblthXSkhPW51bGw/czppfXJldHVybiByfSx7fSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSxuKX1mdW5jdGlvbiBKeChlLHQpe3ZhciBuPXQ/T2JqZWN0LmtleXMoWmcoT2JqZWN0LmFzc2lnbih7fSxzbix7cGx1Z2luczp0fSkpKTpxeCxyPW4ucmVkdWNlKGZ1bmN0aW9uKG8sYSl7dmFyIGk9KGUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpcHB5LSIrYSl8fCIiKS50cmltKCk7aWYoIWkpcmV0dXJuIG87aWYoYT09PSJjb250ZW50IilvW2FdPWk7ZWxzZSB0cnl7b1thXT1KU09OLnBhcnNlKGkpfWNhdGNoe29bYV09aX1yZXR1cm4gb30se30pO3JldHVybiByfWZ1bmN0aW9uIGpnKGUsdCl7dmFyIG49T2JqZWN0LmFzc2lnbih7fSx0LHtjb250ZW50OkpnKHQuY29udGVudCxbZV0pfSx0Lmlnbm9yZUF0dHJpYnV0ZXM/e306SngoZSx0LnBsdWdpbnMpKTtyZXR1cm4gbi5hcmlhPU9iamVjdC5hc3NpZ24oe30sc24uYXJpYSxuLmFyaWEpLG4uYXJpYT17ZXhwYW5kZWQ6bi5hcmlhLmV4cGFuZGVkPT09ImF1dG8iP3QuaW50ZXJhY3RpdmU6bi5hcmlhLmV4cGFuZGVkLGNvbnRlbnQ6bi5hcmlhLmNvbnRlbnQ9PT0iYXV0byI/dC5pbnRlcmFjdGl2ZT9udWxsOiJkZXNjcmliZWRieSI6bi5hcmlhLmNvbnRlbnR9LG59dmFyIFh4PWZ1bmN0aW9uKCl7cmV0dXJuImlubmVySFRNTCJ9O2Z1bmN0aW9uIHdkKGUsdCl7ZVtYeCgpXT10fWZ1bmN0aW9uIFZnKGUpe3ZhciB0PUphKCk7cmV0dXJuIGU9PT0hMD90LmNsYXNzTmFtZT1ZZzoodC5jbGFzc05hbWU9cWcsZWwoZSk/dC5hcHBlbmRDaGlsZChlKTp3ZCh0LGUpKSx0fWZ1bmN0aW9uIEdnKGUsdCl7ZWwodC5jb250ZW50KT8od2QoZSwiIiksZS5hcHBlbmRDaGlsZCh0LmNvbnRlbnQpKTp0eXBlb2YgdC5jb250ZW50IT0iZnVuY3Rpb24iJiYodC5hbGxvd0hUTUw/d2QoZSx0LmNvbnRlbnQpOmUudGV4dENvbnRlbnQ9dC5jb250ZW50KX1mdW5jdGlvbiBiZChlKXt2YXIgdD1lLmZpcnN0RWxlbWVudENoaWxkLG49WnModC5jaGlsZHJlbik7cmV0dXJue2JveDp0LGNvbnRlbnQ6bi5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNsYXNzTGlzdC5jb250YWlucyhLZyl9KSxhcnJvdzpuLmZpbmQoZnVuY3Rpb24ocil7cmV0dXJuIHIuY2xhc3NMaXN0LmNvbnRhaW5zKFlnKXx8ci5jbGFzc0xpc3QuY29udGFpbnMocWcpfSksYmFja2Ryb3A6bi5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNsYXNzTGlzdC5jb250YWlucyhSeCl9KX19ZnVuY3Rpb24gZXYoZSl7dmFyIHQ9SmEoKSxuPUphKCk7bi5jbGFzc05hbWU9T3gsbi5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdGUiLCJoaWRkZW4iKSxuLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpO3ZhciByPUphKCk7ci5jbGFzc05hbWU9S2csci5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdGUiLCJoaWRkZW4iKSxHZyhyLGUucHJvcHMpLHQuYXBwZW5kQ2hpbGQobiksbi5hcHBlbmRDaGlsZChyKSxvKGUucHJvcHMsZS5wcm9wcyk7ZnVuY3Rpb24gbyhhLGkpe3ZhciBzPWJkKHQpLGw9cy5ib3gsdT1zLmNvbnRlbnQsYz1zLmFycm93O2kudGhlbWU/bC5zZXRBdHRyaWJ1dGUoImRhdGEtdGhlbWUiLGkudGhlbWUpOmwucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXRoZW1lIiksdHlwZW9mIGkuYW5pbWF0aW9uPT0ic3RyaW5nIj9sLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb24iLGkuYW5pbWF0aW9uKTpsLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb24iKSxpLmluZXJ0aWE/bC5zZXRBdHRyaWJ1dGUoImRhdGEtaW5lcnRpYSIsIiIpOmwucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWluZXJ0aWEiKSxsLnN0eWxlLm1heFdpZHRoPXR5cGVvZiBpLm1heFdpZHRoPT0ibnVtYmVyIj9pLm1heFdpZHRoKyJweCI6aS5tYXhXaWR0aCxpLnJvbGU/bC5zZXRBdHRyaWJ1dGUoInJvbGUiLGkucm9sZSk6bC5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKSwoYS5jb250ZW50IT09aS5jb250ZW50fHxhLmFsbG93SFRNTCE9PWkuYWxsb3dIVE1MKSYmR2codSxlLnByb3BzKSxpLmFycm93P2M/YS5hcnJvdyE9PWkuYXJyb3cmJihsLnJlbW92ZUNoaWxkKGMpLGwuYXBwZW5kQ2hpbGQoVmcoaS5hcnJvdykpKTpsLmFwcGVuZENoaWxkKFZnKGkuYXJyb3cpKTpjJiZsLnJlbW92ZUNoaWxkKGMpfXJldHVybntwb3BwZXI6dCxvblVwZGF0ZTpvfX1ldi4kJHRpcHB5PSEwO3ZhciBaeD0xLFhzPVtdLHlkPVtdO2Z1bmN0aW9uIGVrKGUsdCl7dmFyIG49amcoZSxPYmplY3QuYXNzaWduKHt9LHNuLFpnKCRnKHQpKSkpLHIsbyxhLGk9ITEscz0hMSxsPSExLHU9ITEsYyxkLHAsZz1bXSx2PUZnKHJlLG4uaW50ZXJhY3RpdmVEZWJvdW5jZSkseSxiPVp4KyssaD1udWxsLG09SXgobi5wbHVnaW5zKSx3PXtpc0VuYWJsZWQ6ITAsaXNWaXNpYmxlOiExLGlzRGVzdHJveWVkOiExLGlzTW91bnRlZDohMSxpc1Nob3duOiExfSxmPXtpZDpiLHJlZmVyZW5jZTplLHBvcHBlcjpKYSgpLHBvcHBlckluc3RhbmNlOmgscHJvcHM6bixzdGF0ZTp3LHBsdWdpbnM6bSxjbGVhckRlbGF5VGltZW91dHM6eHIsc2V0UHJvcHM6ZW8sc2V0Q29udGVudDp0byxzaG93Om1pLGhpZGU6aGksaGlkZVdpdGhJbnRlcmFjdGl2aXR5OnFvLGVuYWJsZTpqbixkaXNhYmxlOlpyLHVubW91bnQ6a2wsZGVzdHJveTpTbH07aWYoIW4ucmVuZGVyKXJldHVybiBmO3ZhciBUPW4ucmVuZGVyKGYpLFM9VC5wb3BwZXIsRD1ULm9uVXBkYXRlO1Muc2V0QXR0cmlidXRlKCJkYXRhLXRpcHB5LXJvb3QiLCIiKSxTLmlkPSJ0aXBweS0iK2YuaWQsZi5wb3BwZXI9UyxlLl90aXBweT1mLFMuX3RpcHB5PWY7dmFyIE49bS5tYXAoZnVuY3Rpb24oXyl7cmV0dXJuIF8uZm4oZil9KSxDPWUuaGFzQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIik7cmV0dXJuIFooKSxFKCksUSgpLHBlKCJvbkNyZWF0ZSIsW2ZdKSxuLnNob3dPbkNyZWF0ZSYmRW4oKSxTLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7Zi5wcm9wcy5pbnRlcmFjdGl2ZSYmZi5zdGF0ZS5pc1Zpc2libGUmJmYuY2xlYXJEZWxheVRpbWVvdXRzKCl9KSxTLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Zi5wcm9wcy5pbnRlcmFjdGl2ZSYmZi5wcm9wcy50cmlnZ2VyLmluZGV4T2YoIm1vdXNlZW50ZXIiKT49MCYmUigpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdil9KSxmO2Z1bmN0aW9uIHgoKXt2YXIgXz1mLnByb3BzLnRvdWNoO3JldHVybiBBcnJheS5pc0FycmF5KF8pP186W18sMF19ZnVuY3Rpb24gTSgpe3JldHVybiB4KClbMF09PT0iaG9sZCJ9ZnVuY3Rpb24gUCgpe3ZhciBfO3JldHVybiEhKChfPWYucHJvcHMucmVuZGVyKSE9bnVsbCYmXy4kJHRpcHB5KX1mdW5jdGlvbiBPKCl7cmV0dXJuIHl8fGV9ZnVuY3Rpb24gUigpe3ZhciBfPU8oKS5wYXJlbnROb2RlO3JldHVybiBfPyR4KF8pOmRvY3VtZW50fWZ1bmN0aW9uIFUoKXtyZXR1cm4gYmQoUyl9ZnVuY3Rpb24gRyhfKXtyZXR1cm4gZi5zdGF0ZS5pc01vdW50ZWQmJiFmLnN0YXRlLmlzVmlzaWJsZXx8d24uaXNUb3VjaHx8YyYmYy50eXBlPT09ImZvY3VzIj8wOmhkKGYucHJvcHMuZGVsYXksXz8wOjEsc24uZGVsYXkpfWZ1bmN0aW9uIFEoXyl7Xz09PXZvaWQgMCYmKF89ITEpLFMuc3R5bGUucG9pbnRlckV2ZW50cz1mLnByb3BzLmludGVyYWN0aXZlJiYhXz8iIjoibm9uZSIsUy5zdHlsZS56SW5kZXg9IiIrZi5wcm9wcy56SW5kZXh9ZnVuY3Rpb24gcGUoXyxqLGVlKXtpZihlZT09PXZvaWQgMCYmKGVlPSEwKSxOLmZvckVhY2goZnVuY3Rpb24oYWUpe2FlW19dJiZhZVtfXS5hcHBseShhZSxqKX0pLGVlKXt2YXIgaGU7KGhlPWYucHJvcHMpW19dLmFwcGx5KGhlLGopfX1mdW5jdGlvbiBfZSgpe3ZhciBfPWYucHJvcHMuYXJpYTtpZihfLmNvbnRlbnQpe3ZhciBqPSJhcmlhLSIrXy5jb250ZW50LGVlPVMuaWQsaGU9SG8oZi5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKTtoZS5mb3JFYWNoKGZ1bmN0aW9uKGFlKXt2YXIgbHQ9YWUuZ2V0QXR0cmlidXRlKGopO2lmKGYuc3RhdGUuaXNWaXNpYmxlKWFlLnNldEF0dHJpYnV0ZShqLGx0P2x0KyIgIitlZTplZSk7ZWxzZXt2YXIgSXQ9bHQmJmx0LnJlcGxhY2UoZWUsIiIpLnRyaW0oKTtJdD9hZS5zZXRBdHRyaWJ1dGUoaixJdCk6YWUucmVtb3ZlQXR0cmlidXRlKGopfX0pfX1mdW5jdGlvbiBFKCl7aWYoIShDfHwhZi5wcm9wcy5hcmlhLmV4cGFuZGVkKSl7dmFyIF89SG8oZi5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKTtfLmZvckVhY2goZnVuY3Rpb24oail7Zi5wcm9wcy5pbnRlcmFjdGl2ZT9qLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsZi5zdGF0ZS5pc1Zpc2libGUmJmo9PT1PKCk/InRydWUiOiJmYWxzZSIpOmoucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIil9KX19ZnVuY3Rpb24gaygpe1IoKS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHYpLFhzPVhzLmZpbHRlcihmdW5jdGlvbihfKXtyZXR1cm4gXyE9PXZ9KX1mdW5jdGlvbiBGKF8pe2lmKCEod24uaXNUb3VjaCYmKGx8fF8udHlwZT09PSJtb3VzZWRvd24iKSkpe3ZhciBqPV8uY29tcG9zZWRQYXRoJiZfLmNvbXBvc2VkUGF0aCgpWzBdfHxfLnRhcmdldDtpZighKGYucHJvcHMuaW50ZXJhY3RpdmUmJldnKFMsaikpKXtpZihIbyhmLnByb3BzLnRyaWdnZXJUYXJnZXR8fGUpLnNvbWUoZnVuY3Rpb24oZWUpe3JldHVybiBXZyhlZSxqKX0pKXtpZih3bi5pc1RvdWNofHxmLnN0YXRlLmlzVmlzaWJsZSYmZi5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImNsaWNrIik+PTApcmV0dXJufWVsc2UgcGUoIm9uQ2xpY2tPdXRzaWRlIixbZixfXSk7Zi5wcm9wcy5oaWRlT25DbGljaz09PSEwJiYoZi5jbGVhckRlbGF5VGltZW91dHMoKSxmLmhpZGUoKSxzPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzPSExfSksZi5zdGF0ZS5pc01vdW50ZWR8fHEoKSl9fX1mdW5jdGlvbiBXKCl7bD0hMH1mdW5jdGlvbiBIKCl7bD0hMX1mdW5jdGlvbiBLKCl7dmFyIF89UigpO18uYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixGLCEwKSxfLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixGLEtyKSxfLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEgsS3IpLF8uYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixXLEtyKX1mdW5jdGlvbiBxKCl7dmFyIF89UigpO18ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixGLCEwKSxfLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixGLEtyKSxfLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEgsS3IpLF8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixXLEtyKX1mdW5jdGlvbiBWKF8sail7WChfLGZ1bmN0aW9uKCl7IWYuc3RhdGUuaXNWaXNpYmxlJiZTLnBhcmVudE5vZGUmJlMucGFyZW50Tm9kZS5jb250YWlucyhTKSYmaigpfSl9ZnVuY3Rpb24gJChfLGope1goXyxqKX1mdW5jdGlvbiBYKF8sail7dmFyIGVlPVUoKS5ib3g7ZnVuY3Rpb24gaGUoYWUpe2FlLnRhcmdldD09PWVlJiYodmQoZWUsInJlbW92ZSIsaGUpLGooKSl9aWYoXz09PTApcmV0dXJuIGooKTt2ZChlZSwicmVtb3ZlIixkKSx2ZChlZSwiYWRkIixoZSksZD1oZX1mdW5jdGlvbiB0ZShfLGosZWUpe2VlPT09dm9pZCAwJiYoZWU9ITEpO3ZhciBoZT1IbyhmLnByb3BzLnRyaWdnZXJUYXJnZXR8fGUpO2hlLmZvckVhY2goZnVuY3Rpb24oYWUpe2FlLmFkZEV2ZW50TGlzdGVuZXIoXyxqLGVlKSxnLnB1c2goe25vZGU6YWUsZXZlbnRUeXBlOl8saGFuZGxlcjpqLG9wdGlvbnM6ZWV9KX0pfWZ1bmN0aW9uIFooKXtNKCkmJih0ZSgidG91Y2hzdGFydCIsYmUse3Bhc3NpdmU6ITB9KSx0ZSgidG91Y2hlbmQiLFkse3Bhc3NpdmU6ITB9KSksTXgoZi5wcm9wcy50cmlnZ2VyKS5mb3JFYWNoKGZ1bmN0aW9uKF8pe2lmKF8hPT0ibWFudWFsIilzd2l0Y2godGUoXyxiZSksXyl7Y2FzZSJtb3VzZWVudGVyIjp0ZSgibW91c2VsZWF2ZSIsWSk7YnJlYWs7Y2FzZSJmb2N1cyI6dGUoR3g/ImZvY3Vzb3V0IjoiYmx1ciIsZmUpO2JyZWFrO2Nhc2UiZm9jdXNpbiI6dGUoImZvY3Vzb3V0IixmZSk7YnJlYWt9fSl9ZnVuY3Rpb24gc2UoKXtnLmZvckVhY2goZnVuY3Rpb24oXyl7dmFyIGo9Xy5ub2RlLGVlPV8uZXZlbnRUeXBlLGhlPV8uaGFuZGxlcixhZT1fLm9wdGlvbnM7ai5yZW1vdmVFdmVudExpc3RlbmVyKGVlLGhlLGFlKX0pLGc9W119ZnVuY3Rpb24gYmUoXyl7dmFyIGosZWU9ITE7aWYoISghZi5zdGF0ZS5pc0VuYWJsZWR8fFRlKF8pfHxzKSl7dmFyIGhlPSgoaj1jKT09bnVsbD92b2lkIDA6ai50eXBlKT09PSJmb2N1cyI7Yz1fLHk9Xy5jdXJyZW50VGFyZ2V0LEUoKSwhZi5zdGF0ZS5pc1Zpc2libGUmJnp4KF8pJiZYcy5mb3JFYWNoKGZ1bmN0aW9uKGFlKXtyZXR1cm4gYWUoXyl9KSxfLnR5cGU9PT0iY2xpY2siJiYoZi5wcm9wcy50cmlnZ2VyLmluZGV4T2YoIm1vdXNlZW50ZXIiKTwwfHxpKSYmZi5wcm9wcy5oaWRlT25DbGljayE9PSExJiZmLnN0YXRlLmlzVmlzaWJsZT9lZT0hMDpFbihfKSxfLnR5cGU9PT0iY2xpY2siJiYoaT0hZWUpLGVlJiYhaGUmJmRuKF8pfX1mdW5jdGlvbiByZShfKXt2YXIgaj1fLnRhcmdldCxlZT1PKCkuY29udGFpbnMoail8fFMuY29udGFpbnMoaik7aWYoIShfLnR5cGU9PT0ibW91c2Vtb3ZlIiYmZWUpKXt2YXIgaGU9VHQoKS5jb25jYXQoUykubWFwKGZ1bmN0aW9uKGFlKXt2YXIgbHQsSXQ9YWUuX3RpcHB5LG5vPShsdD1JdC5wb3BwZXJJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmx0LnN0YXRlO3JldHVybiBubz97cG9wcGVyUmVjdDphZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxwb3BwZXJTdGF0ZTpubyxwcm9wczpufTpudWxsfSkuZmlsdGVyKEJvb2xlYW4pO0J4KGhlLF8pJiYoaygpLGRuKF8pKX19ZnVuY3Rpb24gWShfKXt2YXIgaj1UZShfKXx8Zi5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImNsaWNrIik+PTAmJmk7aWYoIWope2lmKGYucHJvcHMuaW50ZXJhY3RpdmUpe2YuaGlkZVdpdGhJbnRlcmFjdGl2aXR5KF8pO3JldHVybn1kbihfKX19ZnVuY3Rpb24gZmUoXyl7Zi5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImZvY3VzaW4iKTwwJiZfLnRhcmdldCE9PU8oKXx8Zi5wcm9wcy5pbnRlcmFjdGl2ZSYmXy5yZWxhdGVkVGFyZ2V0JiZTLmNvbnRhaW5zKF8ucmVsYXRlZFRhcmdldCl8fGRuKF8pfWZ1bmN0aW9uIFRlKF8pe3JldHVybiB3bi5pc1RvdWNoP00oKSE9PV8udHlwZS5pbmRleE9mKCJ0b3VjaCIpPj0wOiExfWZ1bmN0aW9uIFFlKCl7c3QoKTt2YXIgXz1mLnByb3BzLGo9Xy5wb3BwZXJPcHRpb25zLGVlPV8ucGxhY2VtZW50LGhlPV8ub2Zmc2V0LGFlPV8uZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCxsdD1fLm1vdmVUcmFuc2l0aW9uLEl0PVAoKT9iZChTKS5hcnJvdzpudWxsLG5vPWFlP3tnZXRCb3VuZGluZ0NsaWVudFJlY3Q6YWUsY29udGV4dEVsZW1lbnQ6YWUuY29udGV4dEVsZW1lbnR8fE8oKX06ZSx3cD17bmFtZToiJCR0aXBweSIsZW5hYmxlZDohMCxwaGFzZToiYmVmb3JlV3JpdGUiLHJlcXVpcmVzOlsiY29tcHV0ZVN0eWxlcyJdLGZuOmZ1bmN0aW9uKGdpKXt2YXIgcm89Z2kuc3RhdGU7aWYoUCgpKXt2YXIgdjA9VSgpLFRsPXYwLmJveDtbInBsYWNlbWVudCIsInJlZmVyZW5jZS1oaWRkZW4iLCJlc2NhcGVkIl0uZm9yRWFjaChmdW5jdGlvbih2aSl7dmk9PT0icGxhY2VtZW50Ij9UbC5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhY2VtZW50Iixyby5wbGFjZW1lbnQpOnJvLmF0dHJpYnV0ZXMucG9wcGVyWyJkYXRhLXBvcHBlci0iK3ZpXT9UbC5zZXRBdHRyaWJ1dGUoImRhdGEtIit2aSwiIik6VGwucmVtb3ZlQXR0cmlidXRlKCJkYXRhLSIrdmkpfSkscm8uYXR0cmlidXRlcy5wb3BwZXI9e319fX0sa3I9W3tuYW1lOiJvZmZzZXQiLG9wdGlvbnM6e29mZnNldDpoZX19LHtuYW1lOiJwcmV2ZW50T3ZlcmZsb3ciLG9wdGlvbnM6e3BhZGRpbmc6e3RvcDoyLGJvdHRvbToyLGxlZnQ6NSxyaWdodDo1fX19LHtuYW1lOiJmbGlwIixvcHRpb25zOntwYWRkaW5nOjV9fSx7bmFtZToiY29tcHV0ZVN0eWxlcyIsb3B0aW9uczp7YWRhcHRpdmU6IWx0fX0sd3BdO1AoKSYmSXQmJmtyLnB1c2goe25hbWU6ImFycm93IixvcHRpb25zOntlbGVtZW50Okl0LHBhZGRpbmc6M319KSxrci5wdXNoLmFwcGx5KGtyLGo/Lm1vZGlmaWVyc3x8W10pLGYucG9wcGVySW5zdGFuY2U9bWQobm8sUyxPYmplY3QuYXNzaWduKHt9LGose3BsYWNlbWVudDplZSxvbkZpcnN0VXBkYXRlOnAsbW9kaWZpZXJzOmtyfSkpfWZ1bmN0aW9uIHN0KCl7Zi5wb3BwZXJJbnN0YW5jZSYmKGYucG9wcGVySW5zdGFuY2UuZGVzdHJveSgpLGYucG9wcGVySW5zdGFuY2U9bnVsbCl9ZnVuY3Rpb24gQ2UoKXt2YXIgXz1mLnByb3BzLmFwcGVuZFRvLGosZWU9TygpO2YucHJvcHMuaW50ZXJhY3RpdmUmJl89PT1RZ3x8Xz09PSJwYXJlbnQiP2o9ZWUucGFyZW50Tm9kZTpqPUpnKF8sW2VlXSksai5jb250YWlucyhTKXx8ai5hcHBlbmRDaGlsZChTKSxmLnN0YXRlLmlzTW91bnRlZD0hMCxRZSgpfWZ1bmN0aW9uIFR0KCl7cmV0dXJuIFpzKFMucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGlwcHktcm9vdF0iKSl9ZnVuY3Rpb24gRW4oXyl7Zi5jbGVhckRlbGF5VGltZW91dHMoKSxfJiZwZSgib25UcmlnZ2VyIixbZixfXSksSygpO3ZhciBqPUcoITApLGVlPXgoKSxoZT1lZVswXSxhZT1lZVsxXTt3bi5pc1RvdWNoJiZoZT09PSJob2xkIiYmYWUmJihqPWFlKSxqP3I9c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc2hvdygpfSxqKTpmLnNob3coKX1mdW5jdGlvbiBkbihfKXtpZihmLmNsZWFyRGVsYXlUaW1lb3V0cygpLHBlKCJvblVudHJpZ2dlciIsW2YsX10pLCFmLnN0YXRlLmlzVmlzaWJsZSl7cSgpO3JldHVybn1pZighKGYucHJvcHMudHJpZ2dlci5pbmRleE9mKCJtb3VzZWVudGVyIik+PTAmJmYucHJvcHMudHJpZ2dlci5pbmRleE9mKCJjbGljayIpPj0wJiZbIm1vdXNlbGVhdmUiLCJtb3VzZW1vdmUiXS5pbmRleE9mKF8udHlwZSk+PTAmJmkpKXt2YXIgaj1HKCExKTtqP289c2V0VGltZW91dChmdW5jdGlvbigpe2Yuc3RhdGUuaXNWaXNpYmxlJiZmLmhpZGUoKX0saik6YT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtmLmhpZGUoKX0pfX1mdW5jdGlvbiBqbigpe2Yuc3RhdGUuaXNFbmFibGVkPSEwfWZ1bmN0aW9uIFpyKCl7Zi5oaWRlKCksZi5zdGF0ZS5pc0VuYWJsZWQ9ITF9ZnVuY3Rpb24geHIoKXtjbGVhclRpbWVvdXQociksY2xlYXJUaW1lb3V0KG8pLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGEpfWZ1bmN0aW9uIGVvKF8pe2lmKCFmLnN0YXRlLmlzRGVzdHJveWVkKXtwZSgib25CZWZvcmVVcGRhdGUiLFtmLF9dKSxzZSgpO3ZhciBqPWYucHJvcHMsZWU9amcoZSxPYmplY3QuYXNzaWduKHt9LGosJGcoXykse2lnbm9yZUF0dHJpYnV0ZXM6ITB9KSk7Zi5wcm9wcz1lZSxaKCksai5pbnRlcmFjdGl2ZURlYm91bmNlIT09ZWUuaW50ZXJhY3RpdmVEZWJvdW5jZSYmKGsoKSx2PUZnKHJlLGVlLmludGVyYWN0aXZlRGVib3VuY2UpKSxqLnRyaWdnZXJUYXJnZXQmJiFlZS50cmlnZ2VyVGFyZ2V0P0hvKGoudHJpZ2dlclRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihoZSl7aGUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIil9KTplZS50cmlnZ2VyVGFyZ2V0JiZlLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpLEUoKSxRKCksRCYmRChqLGVlKSxmLnBvcHBlckluc3RhbmNlJiYoUWUoKSxUdCgpLmZvckVhY2goZnVuY3Rpb24oaGUpe3JlcXVlc3RBbmltYXRpb25GcmFtZShoZS5fdGlwcHkucG9wcGVySW5zdGFuY2UuZm9yY2VVcGRhdGUpfSkpLHBlKCJvbkFmdGVyVXBkYXRlIixbZixfXSl9fWZ1bmN0aW9uIHRvKF8pe2Yuc2V0UHJvcHMoe2NvbnRlbnQ6X30pfWZ1bmN0aW9uIG1pKCl7dmFyIF89Zi5zdGF0ZS5pc1Zpc2libGUsaj1mLnN0YXRlLmlzRGVzdHJveWVkLGVlPSFmLnN0YXRlLmlzRW5hYmxlZCxoZT13bi5pc1RvdWNoJiYhZi5wcm9wcy50b3VjaCxhZT1oZChmLnByb3BzLmR1cmF0aW9uLDAsc24uZHVyYXRpb24pO2lmKCEoX3x8anx8ZWV8fGhlKSYmIU8oKS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikmJihwZSgib25TaG93IixbZl0sITEpLGYucHJvcHMub25TaG93KGYpIT09ITEpKXtpZihmLnN0YXRlLmlzVmlzaWJsZT0hMCxQKCkmJihTLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiKSxRKCksSygpLGYuc3RhdGUuaXNNb3VudGVkfHwoUy5zdHlsZS50cmFuc2l0aW9uPSJub25lIiksUCgpKXt2YXIgbHQ9VSgpLEl0PWx0LmJveCxubz1sdC5jb250ZW50O2dkKFtJdCxub10sMCl9cD1mdW5jdGlvbigpe3ZhciBrcjtpZighKCFmLnN0YXRlLmlzVmlzaWJsZXx8dSkpe2lmKHU9ITAsUy5vZmZzZXRIZWlnaHQsUy5zdHlsZS50cmFuc2l0aW9uPWYucHJvcHMubW92ZVRyYW5zaXRpb24sUCgpJiZmLnByb3BzLmFuaW1hdGlvbil7dmFyIEVsPVUoKSxnaT1FbC5ib3gscm89RWwuY29udGVudDtnZChbZ2kscm9dLGFlKSxCZyhbZ2kscm9dLCJ2aXNpYmxlIil9X2UoKSxFKCksVWcoeWQsZiksKGtyPWYucG9wcGVySW5zdGFuY2UpPT1udWxsfHxrci5mb3JjZVVwZGF0ZSgpLHBlKCJvbk1vdW50IixbZl0pLGYucHJvcHMuYW5pbWF0aW9uJiZQKCkmJiQoYWUsZnVuY3Rpb24oKXtmLnN0YXRlLmlzU2hvd249ITAscGUoIm9uU2hvd24iLFtmXSl9KX19LENlKCl9fWZ1bmN0aW9uIGhpKCl7dmFyIF89IWYuc3RhdGUuaXNWaXNpYmxlLGo9Zi5zdGF0ZS5pc0Rlc3Ryb3llZCxlZT0hZi5zdGF0ZS5pc0VuYWJsZWQsaGU9aGQoZi5wcm9wcy5kdXJhdGlvbiwxLHNuLmR1cmF0aW9uKTtpZighKF98fGp8fGVlKSYmKHBlKCJvbkhpZGUiLFtmXSwhMSksZi5wcm9wcy5vbkhpZGUoZikhPT0hMSkpe2lmKGYuc3RhdGUuaXNWaXNpYmxlPSExLGYuc3RhdGUuaXNTaG93bj0hMSx1PSExLGk9ITEsUCgpJiYoUy5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxrKCkscSgpLFEoITApLFAoKSl7dmFyIGFlPVUoKSxsdD1hZS5ib3gsSXQ9YWUuY29udGVudDtmLnByb3BzLmFuaW1hdGlvbiYmKGdkKFtsdCxJdF0saGUpLEJnKFtsdCxJdF0sImhpZGRlbiIpKX1fZSgpLEUoKSxmLnByb3BzLmFuaW1hdGlvbj9QKCkmJlYoaGUsZi51bm1vdW50KTpmLnVubW91bnQoKX19ZnVuY3Rpb24gcW8oXyl7UigpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdiksVWcoWHMsdiksdihfKX1mdW5jdGlvbiBrbCgpe2Yuc3RhdGUuaXNWaXNpYmxlJiZmLmhpZGUoKSxmLnN0YXRlLmlzTW91bnRlZCYmKHN0KCksVHQoKS5mb3JFYWNoKGZ1bmN0aW9uKF8pe18uX3RpcHB5LnVubW91bnQoKX0pLFMucGFyZW50Tm9kZSYmUy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKFMpLHlkPXlkLmZpbHRlcihmdW5jdGlvbihfKXtyZXR1cm4gXyE9PWZ9KSxmLnN0YXRlLmlzTW91bnRlZD0hMSxwZSgib25IaWRkZW4iLFtmXSkpfWZ1bmN0aW9uIFNsKCl7Zi5zdGF0ZS5pc0Rlc3Ryb3llZHx8KGYuY2xlYXJEZWxheVRpbWVvdXRzKCksZi51bm1vdW50KCksc2UoKSxkZWxldGUgZS5fdGlwcHksZi5zdGF0ZS5pc0Rlc3Ryb3llZD0hMCxwZSgib25EZXN0cm95IixbZl0pKX19ZnVuY3Rpb24gWGEoZSx0KXt0PT09dm9pZCAwJiYodD17fSk7dmFyIG49c24ucGx1Z2lucy5jb25jYXQodC5wbHVnaW5zfHxbXSk7angoKTt2YXIgcj1PYmplY3QuYXNzaWduKHt9LHQse3BsdWdpbnM6bn0pLG89VXgoZSk7aWYoMCl2YXIgYSxpO3ZhciBzPW8ucmVkdWNlKGZ1bmN0aW9uKGwsdSl7dmFyIGM9dSYmZWsodSxyKTtyZXR1cm4gYyYmbC5wdXNoKGMpLGx9LFtdKTtyZXR1cm4gZWwoZSk/c1swXTpzfVhhLmRlZmF1bHRQcm9wcz1zbjtYYS5zZXREZWZhdWx0UHJvcHM9UXg7WGEuY3VycmVudElucHV0PXduO3ZhciBzMj1PYmplY3QuYXNzaWduKHt9LGphLHtlZmZlY3Q6ZnVuY3Rpb24odCl7dmFyIG49dC5zdGF0ZSxyPXtwb3BwZXI6e3Bvc2l0aW9uOm4ub3B0aW9ucy5zdHJhdGVneSxsZWZ0OiIwIix0b3A6IjAiLG1hcmdpbjoiMCJ9LGFycm93Ontwb3NpdGlvbjoiYWJzb2x1dGUifSxyZWZlcmVuY2U6e319O09iamVjdC5hc3NpZ24obi5lbGVtZW50cy5wb3BwZXIuc3R5bGUsci5wb3BwZXIpLG4uc3R5bGVzPXIsbi5lbGVtZW50cy5hcnJvdyYmT2JqZWN0LmFzc2lnbihuLmVsZW1lbnRzLmFycm93LnN0eWxlLHIuYXJyb3cpfX0pO1hhLnNldERlZmF1bHRQcm9wcyh7cmVuZGVyOmV2fSk7dmFyIFphPVhhO3ZhciBrdD14ZSh3ZSgpLDEpO3ZhciB0dj17dGhlbWU6ImRhc2hib2FyZCIsZHVyYXRpb246WzEyMCw4MF0sYXJyb3c6ITAsb2Zmc2V0OlswLDhdfTtmdW5jdGlvbiBrZCh7Y29udGVudDplLHBsYWNlbWVudDp0LGludGVyYWN0aXZlOm4sY2hpbGRyZW46ciwuLi5vfSl7bGV0IGE9KDAsa3QudXNlUmVmKShudWxsKSxpPSgwLGt0LnVzZVJlZikobnVsbCk7cmV0dXJuKDAsa3QudXNlRWZmZWN0KSgoKT0+e2lmKGEuY3VycmVudClyZXR1cm4gaS5jdXJyZW50PVphKGEuY3VycmVudCx7Li4udHYsY29udGVudDplfHwiIixwbGFjZW1lbnQ6dHx8InRvcCIsaW50ZXJhY3RpdmU6bnx8ITEsYWxsb3dIVE1MOiEwLC4uLm99KSwoKT0+e2kuY3VycmVudD8uZGVzdHJveSgpLGkuY3VycmVudD1udWxsfX0sW10pLCgwLGt0LnVzZUVmZmVjdCkoKCk9PntpLmN1cnJlbnQmJmUhPW51bGwmJmkuY3VycmVudC5zZXRDb250ZW50KGUpfSxbZV0pLCgwLGt0LmNyZWF0ZUVsZW1lbnQpKCJzcGFuIix7cmVmOmEsc3R5bGU6e2Rpc3BsYXk6ImlubGluZSJ9fSxyKX1mdW5jdGlvbiBlaShlPXt9KXtsZXQgdD0oMCxrdC51c2VSZWYpKG51bGwpLG49KDAsa3QudXNlUmVmKSh7d2lkdGg6MCxoZWlnaHQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0pLHI9KDAsa3QudXNlUmVmKShudWxsKSxvPSgwLGt0LnVzZVJlZikoZS5oaWRlRGVsYXl8fDMwMCksYT0oMCxrdC51c2VSZWYpKG51bGwpO2Z1bmN0aW9uIGkoKXtyLmN1cnJlbnQmJihjbGVhclRpbWVvdXQoci5jdXJyZW50KSxyLmN1cnJlbnQ9bnVsbCl9ZnVuY3Rpb24gcyhjLGQpe2koKSxkIT09dm9pZCAwJiYoYS5jdXJyZW50PWQpLHIuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57ci5jdXJyZW50PW51bGwsdC5jdXJyZW50Py5oaWRlKCksYS5jdXJyZW50JiZhLmN1cnJlbnQoKX0sYz8/by5jdXJyZW50KX0oMCxrdC51c2VFZmZlY3QpKCgpPT57dC5jdXJyZW50PVphKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHsuLi50dixnZXRSZWZlcmVuY2VDbGllbnRSZWN0OigpPT5uLmN1cnJlbnQsdHJpZ2dlcjoibWFudWFsIixoaWRlT25DbGljazohMSxhbGxvd0hUTUw6ITAsaW50ZXJhY3RpdmU6ISFlLmludGVyYWN0aXZlLHBsYWNlbWVudDplLnBsYWNlbWVudHx8InRvcCIsYXBwZW5kVG86KCk9PmRvY3VtZW50LmJvZHksLi4uZX0pO2xldCBjLGQ7aWYoZS5pbnRlcmFjdGl2ZSl7bGV0IHA9dC5jdXJyZW50LnBvcHBlcjtjPSgpPT5pKCksZD0oKT0+cygpLHAuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsYykscC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixkKX1yZXR1cm4oKT0+e2lmKGUuaW50ZXJhY3RpdmUmJnQuY3VycmVudCl7bGV0IHA9dC5jdXJyZW50LnBvcHBlcjtjJiZwLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGMpLGQmJnAucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZCl9aSgpLHQuY3VycmVudD8uZGVzdHJveSgpLHQuY3VycmVudD1udWxsfX0sW10pO2Z1bmN0aW9uIGwoYyxkLHAsZyl7aSgpO2xldCB2PXQuY3VycmVudDtpZighdilyZXR1cm47bi5jdXJyZW50PXt3aWR0aDowLGhlaWdodDowLHRvcDpwLHJpZ2h0OmQsYm90dG9tOnAsbGVmdDpkfSx2LnNldENvbnRlbnQoYyk7bGV0IHk9Z3x8e30sYj15LnBsYWNlbWVudHx8di5wcm9wcy5wbGFjZW1lbnQ7YiE9PXYucHJvcHMucGxhY2VtZW50JiZ2LnNldFByb3BzKHtwbGFjZW1lbnQ6Yn0pO2xldCBoPXYucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkO2gmJmguY2xhc3NMaXN0LnRvZ2dsZSgiYmVsb3ctY2hhcnQiLCEheS5iZWxvd0NoYXJ0KSx2LnN0YXRlLmlzVmlzaWJsZT92LnBvcHBlckluc3RhbmNlPy51cGRhdGUoKTp2LnNob3coKX1mdW5jdGlvbiB1KCl7aSgpLHQuY3VycmVudD8uaGlkZSgpfXJldHVybntzaG93OmwsaGlkZTp1LHNjaGVkdWxlSGlkZTpzLGNhbmNlbFNjaGVkdWxlZEhpZGU6aX19dmFyIHZyPXhlKHdlKCkpO2Z1bmN0aW9uIG10KGUpe2lmKCFlKXJldHVybiBuZXcgRGF0ZTtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUoZSk7aWYodHlwZW9mIGU9PSJzdHJpbmciJiYvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChlKSl7bGV0W24scixvXT1lLnNwbGl0KCItIikubWFwKE51bWJlcik7cmV0dXJuIG5ldyBEYXRlKG4sci0xLG8pfWxldCB0PW5ldyBEYXRlKGUpO3JldHVybiBOdW1iZXIuaXNOYU4odC5nZXRUaW1lKCkpP25ldyBEYXRlOnR9ZnVuY3Rpb24gZ3IoZSl7bGV0IHQ7aWYoZSBpbnN0YW5jZW9mIERhdGUpdD1uZXcgRGF0ZShlLmdldFRpbWUoKSk7ZWxzZSBpZih0eXBlb2YgZT09Im51bWJlciIpe2xldCBhPWU8MWUxMD9lKjFlMzplO3Q9bmV3IERhdGUoYSl9ZWxzZSB0PW10KGUpO051bWJlci5pc05hTih0LmdldFRpbWUoKSkmJih0PW5ldyBEYXRlKTtsZXQgbj10LmdldEZ1bGxZZWFyKCkscj1TdHJpbmcodC5nZXRNb250aCgpKzEpLnBhZFN0YXJ0KDIsIjAiKSxvPVN0cmluZyh0LmdldERhdGUoKSkucGFkU3RhcnQoMiwiMCIpO3JldHVybmAke259LSR7cn0tJHtvfWB9ZnVuY3Rpb24gU3QoZSl7cmV0dXJuIGdyKGUpfWZ1bmN0aW9uIFZ0KGUsdD0xKXtsZXQgbj1tdChlKSxvPShuLmdldERheSgpLXQrNyklNyxhPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCktbyk7cmV0dXJuIGEuc2V0SG91cnMoMCwwLDAsMCksYX1mdW5jdGlvbiB0bChlLHQ9MSl7bGV0IG49VnQoZSx0KSxyPW5ldyBEYXRlKG4pO3JldHVybiByLnNldERhdGUoci5nZXREYXRlKCkrNiksci5zZXRIb3VycygyMyw1OSw1OSw5OTkpLHJ9ZnVuY3Rpb24gbnYoZSx0PTEpe2xldCBuPVZ0KGUsdCkscj1bXTtmb3IobGV0IG89MDtvPDc7bysrKXtsZXQgYT1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpK28pLGk9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKStvKzEpO3IucHVzaCh7ZnJvbTpNYXRoLmZsb29yKGEuZ2V0VGltZSgpLzFlMyksdG86TWF0aC5mbG9vcihpLmdldFRpbWUoKS8xZTMpLGRhdGVLZXk6U3QoYSl9KX1yZXR1cm57Ym91bmRhcmllczpyLHdlZWtTdGFydEtleTpTdChuKX19ZnVuY3Rpb24gcnYoZSx0PTEpe2xldCBuPVZ0KGUsdCk7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDo3fSwocixvKT0+e2xldCBhPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCkrbyk7cmV0dXJue2RheTphLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3dlZWtkYXk6InNob3J0In0pLGRhdGU6YS50b0lTT1N0cmluZygpLGRhdGVLZXk6U3QoYSl9fSl9ZnVuY3Rpb24gb3YoZSl7cmV0dXJuIGU9PT0ic3VuZGF5Ij8wOjF9ZnVuY3Rpb24gU2QoKXtsZXQgZT1uZXcgRGF0ZSx0PVZ0KGUpO3JldHVybiBlLmdldFRpbWUoKS10LmdldFRpbWUoKTwzKjI0KjYwKjYwKjFlM31mdW5jdGlvbiBqbyhlLHQpe3JldHVybiB0PT09IjI0aCI/YCR7U3RyaW5nKGUpLnBhZFN0YXJ0KDIsIjAiKX06MDBgOmU9PT0wPyIxMmFtIjplPDEyP2Ake2V9YW1gOmU9PT0xMj8iMTJwbSI6YCR7ZS0xMn1wbWB9ZnVuY3Rpb24gYXYoZSl7cmV0dXJuIG10KGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KX1hc3luYyBmdW5jdGlvbiBpdihlLHQpe2xldCBuPW5ldyBEYXRlLHI9VnQobiksbz10bChuKSxhPWUuc2V0dGluZ3NbSi5UQVNLX0RPTUFJTlNdLGk9e307dHJ5e2k9YT9KU09OLnBhcnNlKGEpOnt9fWNhdGNoe2k9e319aS5zZWxlY3RlZERvbWFpblV1aWQ9dCxhd2FpdCBlLnNldFNldHRpbmcoSi5UQVNLX0RPTUFJTlMsSlNPTi5zdHJpbmdpZnkoaSkpO2xldCBzPWF3YWl0IG5rKGUsdCk7cmV0dXJue3Rhc2tzOnMsdG9kYXlUYXNrczpyayhzLG4pLGNvbXBsZXRlZFRoaXNXZWVrOmZ2KHMscixvKSx3ZWVrbHlWaWN0b3J5VmFsdWU6b2socyxyLG8pLGRhaWx5VmljdG9yeVZhbHVlczphayhzLHIpLGFjdGl2ZVRhc2tEb21haW46dH19YXN5bmMgZnVuY3Rpb24gc3YoZSl7QSgiW3JlZnJlc2hUYXNrRG9tYWluc10gU3RhcnRpbmcgZG9tYWluIHJlZnJlc2giKTtsZXQgdD1hd2FpdCBlLmdldFRhc2tEb21haW5zKCk7QShgW3JlZnJlc2hUYXNrRG9tYWluc10gRmV0Y2hlZCAke3Q/Lmxlbmd0aD8/MH0gZG9tYWlucyBmcm9tIEFQSWAsdCk7bGV0IG49ZS5zZXR0aW5nc1tKLlRBU0tfRE9NQUlOU10scj17fTt0cnl7cj1uP0pTT04ucGFyc2Uobik6e319Y2F0Y2h7cj17fX1yZXR1cm4gci5kb21haW5zPXQubWFwKGE9Pih7bmFtZTphLm5hbWUsdXVpZDphLnV1aWR9KSksci5sYXN0UmV0cmlldmVkPURhdGUubm93KCksci5zZWxlY3RlZERvbWFpblV1aWQmJnIuZG9tYWlucy5zb21lKGE9PmEudXVpZD09PXIuc2VsZWN0ZWREb21haW5VdWlkKXx8KEEoYFtyZWZyZXNoVGFza0RvbWFpbnNdIFByZXZpb3VzIHNlbGVjdGlvbiAke3Iuc2VsZWN0ZWREb21haW5VdWlkfSBubyBsb25nZXIgZXhpc3RzLCBwaWNraW5nIGRlZmF1bHRgKSxyLnNlbGVjdGVkRG9tYWluVXVpZD10ayhyLmRvbWFpbnMpKSxhd2FpdCBlLnNldFNldHRpbmcoSi5UQVNLX0RPTUFJTlMsSlNPTi5zdHJpbmdpZnkocikpLEEoYFtyZWZyZXNoVGFza0RvbWFpbnNdIFJlZnJlc2ggY29tcGxldGUgXHUyMDE0ICR7ci5kb21haW5zLmxlbmd0aH0gZG9tYWlucywgYWN0aXZlOiAke3Iuc2VsZWN0ZWREb21haW5VdWlkfWApLHtkb21haW5zOnIuZG9tYWlucyxhY3RpdmVUYXNrRG9tYWluOnIuc2VsZWN0ZWREb21haW5VdWlkfX1hc3luYyBmdW5jdGlvbiBsdihlLHQpe2xldHtsYWJlbDpuLHllYXI6cixxdWFydGVyOm99PXQsYT1gJHtufSBQbGFuYCxpPWUuc2V0dGluZ3NbSi5QTEFOTklOR19OT1RFX1RBR118fCRzLHM9W3h0LGldLHU9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5OmF9KSkuZmluZChwPT5wLm5hbWU9PT1hKTtpZih1KXJldHVybiBhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7dS51dWlkfWApLHt1dWlkOnUudXVpZCxleGlzdGVkOiEwfTtsZXQgYz1UZChuLG8pLGQ9YXdhaXQgZS5jcmVhdGVOb3RlKGEscyk7cmV0dXJuIGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6ZH0sYyksYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke2R9YCkse3V1aWQ6ZCxleGlzdGVkOiExfX1hc3luYyBmdW5jdGlvbiB1dihlLHQse2FwaUtleTpuLHByb3ZpZGVyOnJ9PXt9KXtpZihufHwobj1lLnNldHRpbmdzPy5bIkxMTSBBUEkgS2V5Il0pLHJ8fChyPWUuc2V0dGluZ3M/LltKLkxMTV9QUk9WSURFUl9NT0RFTF18fCJvcGVuYWkiKSwhbilyZXR1cm5bXTtsZXQgbz10P2BCYXNlZCBvbiB0aGVzZSBxdWFydGVybHkgZ29hbHMsIGdlbmVyYXRlIDIgc2hvcnQgaW5zcGlyYXRpb25hbCBxdW90ZXMgKDEtMiBzZW50ZW5jZXMgZWFjaCkgdGhhdCBtb3RpdmF0ZSBwcm9ncmVzcyB0b3dhcmQgdGhlc2UgZ29hbHMuIFJldHVybiBhcyBKU09OIGFycmF5IFt7dGV4dCwgYXV0aG9yfV0uIEdvYWxzOiAke3Quc3Vic3RyaW5nKDAsNTAwKX1gOiJHZW5lcmF0ZSAyIHNob3J0IGluc3BpcmF0aW9uYWwgcXVvdGVzIGFib3V0IHByb2R1Y3Rpdml0eSBhbmQgcGVyc29uYWwgZ3Jvd3RoLiBSZXR1cm4gYXMgSlNPTiBhcnJheSBbe3RleHQsIGF1dGhvcn1dLiIsYT1yPT09ImFudGhyb3BpYyI/Imh0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMiOiJodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL2NoYXQvY29tcGxldGlvbnMiLGk9cj09PSJhbnRocm9waWMiP3siQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIngtYXBpLWtleSI6biwiYW50aHJvcGljLXZlcnNpb24iOiIyMDIzLTA2LTAxIn06eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtufWB9LHM9cj09PSJhbnRocm9waWMiP3ttb2RlbDoiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0IixtYXhfdG9rZW5zOjMwMCxtZXNzYWdlczpbe3JvbGU6InVzZXIiLGNvbnRlbnQ6b31dfTp7bW9kZWw6ImdwdC00by1taW5pIixtZXNzYWdlczpbe3JvbGU6InVzZXIiLGNvbnRlbnQ6b31dLG1heF90b2tlbnM6MzAwfTt0cnl7bGV0IHU9YXdhaXQoYXdhaXQgZmV0Y2goYSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOmksYm9keTpKU09OLnN0cmluZ2lmeShzKX0pKS5qc29uKCksYz1yPT09ImFudGhyb3BpYyI/dT8uY29udGVudD8uWzBdPy50ZXh0OnU/LmNob2ljZXM/LlswXT8ubWVzc2FnZT8uY29udGVudDtyZXR1cm4gSlNPTi5wYXJzZShjKX1jYXRjaChsKXtyZXR1cm4gQSgiUXVvdGUgZmV0Y2ggZXJyb3I6IixsKSxbe3RleHQ6IldoYXQgZ2V0cyBtZWFzdXJlZCBnZXRzIG1hbmFnZWQuIixhdXRob3I6IlBldGVyIERydWNrZXIifSx7dGV4dDoiU21hbGwgZGFpbHkgaW1wcm92ZW1lbnRzIGxlYWQgdG8gc3R1bm5pbmcgcmVzdWx0cy4iLGF1dGhvcjoiUm9iaW4gU2hhcm1hIn1dfX1hc3luYyBmdW5jdGlvbiBFZChlLHQsbil7aWYoIXQpcmV0dXJue2ZvdW5kOiExLGNvbnRlbnQ6bnVsbH07bGV0IHI9YXdhaXQgZS5nZXROb3RlU2VjdGlvbnMoe3V1aWQ6dH0pO0EoYFtnZXRNb250aGx5UGxhbkNvbnRlbnRdIG5vdGVVVUlEPSR7dH0gbW9udGhOYW1lPSIke259IiBzZWN0aW9uczpgLHI/Lm1hcChzPT5zLmhlYWRpbmc/LnRleHQpKTtsZXQgbz1yLmZpbmQocz0+cy5oZWFkaW5nJiZzLmhlYWRpbmcudGV4dCYmcy5oZWFkaW5nLnRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk9PT1uLnRvTG93ZXJDYXNlKCkpO2lmKEEoIltnZXRNb250aGx5UGxhbkNvbnRlbnRdIG1vbnRoU2VjdGlvbiBmb3VuZDoiLCEhbyksIW8pcmV0dXJue2ZvdW5kOiExLGNvbnRlbnQ6bnVsbH07bGV0IGE9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSksaT16byhhLG4pO3JldHVybiBBKGBbZ2V0TW9udGhseVBsYW5Db250ZW50XSBleHRyYWN0ZWQgY29udGVudCBsZW5ndGg6ICR7aT8ubGVuZ3RoPz8wfWApLHtmb3VuZDohMCxjb250ZW50Oml8fCIifX1hc3luYyBmdW5jdGlvbiBjdihlLHQsbil7bGV0e2xhYmVsOnIseWVhcjpvLHF1YXJ0ZXI6YX09dCxpPWAke3J9IFBsYW5gLHM9ZS5zZXR0aW5nc1tKLlBMQU5OSU5HX05PVEVfVEFHXXx8JHMsbD1beHQsc10sYz0oYXdhaXQgZS5maWx0ZXJOb3Rlcyh7cXVlcnk6aX0pKS5maW5kKGc9PmcubmFtZT09PWkpLGQ7aWYoYylkPWMudXVpZCxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmR9LFpjKG4pLHthdEVuZDohMH0pO2Vsc2V7bGV0IGc9VGQocixhKTtkPWF3YWl0IGUuY3JlYXRlTm90ZShpLGwpLGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6ZH0sZyl9bGV0IHA9YXdhaXQgcHYoZSxkLG4pO3JldHVybntub3RlVVVJRDpkLGNvbnRlbnQ6cCxjcmVhdGVkOiFjfX1hc3luYyBmdW5jdGlvbiBkdihlLHQsbil7bGV0e2xhYmVsOnIseWVhcjpvLHF1YXJ0ZXI6YX09dCxpPWAke3J9IFBsYW5gLHM9ZS5zZXR0aW5nc1tKLlBMQU5OSU5HX05PVEVfVEFHXXx8JHMsbD1beHQsc10sYz0oYXdhaXQgZS5maWx0ZXJOb3Rlcyh7cXVlcnk6aX0pKS5maW5kKGc9PmcubmFtZT09PWkpLGQ7aWYoYylkPWMudXVpZCwoYXdhaXQgRWQoZSxkLG4pKS5mb3VuZHx8YXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpkfSxlZChuKSx7YXRFbmQ6ITB9KTtlbHNle2xldCBnPVRkKHIsYSk7ZD1hd2FpdCBlLmNyZWF0ZU5vdGUoaSxsKSxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmR9LGcpLGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6ZH0sZWQobikse2F0RW5kOiEwfSl9bGV0IHA9YXdhaXQgcHYoZSxkLG4pO3JldHVybntub3RlVVVJRDpkLGNvbnRlbnQ6cH19YXN5bmMgZnVuY3Rpb24gcHYoZSx0LG4se2F0dGVtcHRzOnI9MyxkZWxheU1zOm89NTAwfT17fSl7Zm9yKGxldCBhPTA7YTxyO2ErKyl7YT4wJiZhd2FpdCBuZXcgUHJvbWlzZShsPT5zZXRUaW1lb3V0KGwsbykpO2xldCBpPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dH0pLHM9em8oaSxuKTtpZihzKXJldHVybiBzfXJldHVybiBaYyhuKS5zcGxpdChgCmApLmZpbHRlcihhPT5hJiYhYS5zdGFydHNXaXRoKCIjIikpLmpvaW4oYApgKX1mdW5jdGlvbiB0ayhlKXtpZighZXx8ZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO2xldCB0PWUuZmluZChuPT5uLm5hbWU9PT0iV29yayIpO3JldHVybiB0P3QudXVpZDplWzBdLnV1aWR9YXN5bmMgZnVuY3Rpb24gbmsoZSx0KXtpZighdClyZXR1cm5bXTt0cnl7bGV0IG49YXdhaXQgZS5nZXRUYXNrRG9tYWluVGFza3ModCk7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/bjpbXX1jYXRjaChuKXtyZXR1cm4gQShgW19mZXRjaFRhc2tzRm9yRG9tYWluXSBnZXRUYXNrRG9tYWluVGFza3MgZmFpbGVkIGZvciBkb21haW4gJHt0fTpgLG4pLFtdfX1mdW5jdGlvbiByayhlLHQpe2xldCBuPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCkpLmdldFRpbWUoKSxyPW4rODY0ZTU7cmV0dXJuIGUuZmlsdGVyKG89PiFvLmNvbXBsZXRlZEF0JiYhby5kaXNtaXNzZWRBdCYmbG4oby5zdGFydEF0KSYmbG4oby5zdGFydEF0KT49biYmbG4oby5zdGFydEF0KTxyKS5zb3J0KChvLGEpPT4obG4oby5zdGFydEF0KXx8MCktKGxuKGEuc3RhcnRBdCl8fDApKX1mdW5jdGlvbiBmdihlLHQsbil7bGV0IHI9dC5nZXRUaW1lKCksbz1uLmdldFRpbWUoKTtyZXR1cm4gZS5maWx0ZXIoYT0+bG4oYS5jb21wbGV0ZWRBdCkmJmxuKGEuY29tcGxldGVkQXQpPj1yJiZsbihhLmNvbXBsZXRlZEF0KTw9byl9ZnVuY3Rpb24gb2soZSx0LG4pe3JldHVybiBmdihlLHQsbikucmVkdWNlKChyLG8pPT5yKyhvLnZpY3RvcnlWYWx1ZXx8MCksMCl9ZnVuY3Rpb24gYWsoZSx0KXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOjd9LChyLG8pPT57bGV0IGE9bmV3IERhdGUodCk7YS5zZXREYXRlKGEuZ2V0RGF0ZSgpK28pO2xldCBpPW5ldyBEYXRlKGEpO2kuc2V0RGF0ZShpLmdldERhdGUoKSsxKTtsZXQgcz1lLmZpbHRlcihsPT5sbihsLmNvbXBsZXRlZEF0KSYmbG4obC5jb21wbGV0ZWRBdCk+PWEuZ2V0VGltZSgpJiZsbihsLmNvbXBsZXRlZEF0KTxpLmdldFRpbWUoKSk7cmV0dXJue2RheTpbIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdW29dLGRhdGU6YS50b0lTT1N0cmluZygpLHZhbHVlOnMucmVkdWNlKChsLHUpPT5sKyh1LnZpY3RvcnlWYWx1ZXx8MCksMCksdGFza0NvdW50OnMubGVuZ3RofX0pfWZ1bmN0aW9uIGxuKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIGUhPSJudW1iZXIiKXtsZXQgdD1OdW1iZXIoZSk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0KT90PDFlMTA/dCoxZTM6dDpudWxsfXJldHVybiBlPDFlMTA/ZSoxZTM6ZX1mdW5jdGlvbiBUZChlLHQpe2xldCByPXsxOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giXSwyOlsiQXByaWwiLCJNYXkiLCJKdW5lIl0sMzpbIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiXSw0OlsiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXX1bdF18fFsiTW9udGggMSIsIk1vbnRoIDIiLCJNb250aCAzIl07cmV0dXJuYFF1YXJ0ZXJseSBQbGFuIFx1MjAxNCAke2V9CgojIFF1YXJ0ZXIgVGhlbWUKW09uZSBzZW50ZW5jZSBkZXNjcmliaW5nIHRoZSBtYWluIGZvY3VzIG9mIHRoaXMgcXVhcnRlci5dCgojIyBTdWNjZXNzIExvb2tzIExpa2UKMS4gWyBdIFtUb3Agb3V0Y29tZV0KMi4gWyBdIFtUb3Agb3V0Y29tZV0KMy4gWyBdIFtUb3Agb3V0Y29tZV0KCiMgUHJvamVjdHMKCiMjIFtQcm9qZWN0IDFdCi0gT3V0Y29tZToKLSBXaHkgbm93OgotIFdlZWtseSByaHl0aG06Ci0gRGVhZGxpbmU6Ci0gQ29uc3RyYWludHM6Ci0gRG9uZSBlbm91Z2ggd2hlbjoKCiMjIFtQcm9qZWN0IDJdCi0gT3V0Y29tZToKLSBXaHkgbm93OgotIFdlZWtseSByaHl0aG06Ci0gRGVhZGxpbmU6Ci0gQ29uc3RyYWludHM6Ci0gRG9uZSBlbm91Z2ggd2hlbjoKCiMjIFtQcm9qZWN0IDNdCi0gT3V0Y29tZToKLSBXaHkgbm93OgotIFdlZWtseSByaHl0aG06Ci0gRGVhZGxpbmU6Ci0gQ29uc3RyYWludHM6Ci0gRG9uZSBlbm91Z2ggd2hlbjoKCiMgTm90IFRoaXMgUXVhcnRlcgotIFsgXSBbTG93ZXItcHJpb3JpdHkgcHJvamVjdF0KLSBbIF0gW0NvbW1pdG1lbnQgdG8gZGVjbGluZV0KLSBbIF0gW0FyZWEgdG8gaW50ZW50aW9uYWxseSBpZ25vcmVdCgojIERheS1vZi1XZWVrIEJyZWFrZG93bgpBbnkgY2F0ZWdvcnkgb2YgdGFzayB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGJlIHRoZSBmb2N1cyBmb3IgZGlmZmVyZW50IGRheXMtb2Ytd2VlayAoc29tZXRpbWVzIGNhbGxlZCAiZGF5IHN0cmlwaW5nIik/ClNlcGFyYXRlIHlvdXIgdGFzayBjYXRlZ29yaWVzIHdpdGggYSBzZW1pY29sb24gKGkuZS4sICI7IikuIFdlIHdpbGwgY29uc2lkZXIgdGhlbSB3aGVuIHByb3Bvc2luZyBwb3NzaWJsZSAKZGFpbHkgYWdlbmRhcyBmcm9tIHlvdXIgZXhpc3RpbmcgdGFza3MuICAKCi0gTW9uZGF5czogCi0gVHVlc2RheXM6IAotIFdlZG5lc2RheXM6IAotIFRodXJzZGF5czogCi0gRnJpZGF5czogCgpbQW1wbGVub3RlIG1lc3NhZ2VdCllvdSBjYW4gYWxzbyBhZGQgU2F0dXJkYXkgYW5kIFN1bmRheSBpZiB5b3UgbGlrZTsgdGhleSdyZSBub3QgaW4gdGhlIGxpc3Qgc2luY2UgYnkgZGVmYXVsdCBiZWNhdXNlIHdlIHN1c3BlY3QgCnlvdSdyZSBiZXN0IG9mZiBwcmVzZXJ2aW5nIHlvdXIgd2Vla2VuZCBmb3IgdW5wbGFubmVkIGZhbWlseSAmIHJlc3RvcmF0aW9uIGFjdGl2aXRpZXMuICAgCgojIE1vbnRoLWJ5LU1vbnRoIEJyZWFrZG93bgoKIyMgJHtyWzBdfQotIEZvY3VzOgotIEtleSBtb3ZlOgoKIyMgJHtyWzFdfQotIEZvY3VzOgotIEtleSBtb3ZlOgoKIyMgJHtyWzJdfQotIEZvY3VzOgotIEtleSBtb3ZlOgoKIyBXZWVrbHkgUGxhbm5pbmcgUHJvbXB0CldoaWNoIHByb2plY3RzIG5lZWQgdGltZSBvbiBteSBjYWxlbmRhciB0aGlzIHdlZWs/CgojIFF1YXJ0ZXJseSBSZXZpZXcKLSBGaW5pc2hlZDoKLSBQcm9ncmVzcyBtYWRlOgotIExlc3NvbnMgbGVhcm5lZDoKLSBDYXJyeSBmb3J3YXJkOmB9YXN5bmMgZnVuY3Rpb24gTmQoZSx0LG4pe3JldHVybiBhd2FpdCBFZChlLHQsbil9YXN5bmMgZnVuY3Rpb24gbXYoZSx0LG4pe3JldHVybiBhd2FpdCBjdihlLHQsbil9YXN5bmMgZnVuY3Rpb24gaHYoZSx0LG4pe3JldHVybiBhd2FpdCBkdihlLHQsbil9YXN5bmMgZnVuY3Rpb24gZ3YoZSx0KXtsZXQgbj1hd2FpdCBsdihlLHQpO3JldHVybiBQbiYmbj8udXVpZD97Li4ubixkZXZFZGl0OiEwLG5vdGVVVUlEOm4udXVpZH06bn1hc3luYyBmdW5jdGlvbiBubChlLHQpe3JldHVybiBQbj97ZGV2RWRpdDohMCxub3RlVVVJRDp0fTphd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7dH1gKX1hc3luYyBmdW5jdGlvbiB2dihlLHQpe3JldHVybiBhd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnR9KX1hc3luYyBmdW5jdGlvbiB5dihlLHQsbixyKXtyZXR1cm4gYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6dH0sbixyKX1mdW5jdGlvbiBEZCh7YXBwOmUsbm90ZVVVSUQ6dCxvbkJhY2s6bn0pe2xldCByPXZyLmNyZWF0ZUVsZW1lbnQsW28sYV09KDAsdnIudXNlU3RhdGUpKCIiKSxbaSxzXT0oMCx2ci51c2VTdGF0ZSkoITApLFtsLHVdPSgwLHZyLnVzZVN0YXRlKSghMSk7KDAsdnIudXNlRWZmZWN0KSgoKT0+e2xldCBkPSExO3JldHVybiB2dihlLHQpLnRoZW4ocD0+e2R8fChhKHB8fCIiKSxzKCExKSl9KSwoKT0+e2Q9ITB9fSxbdCxlXSk7bGV0IGM9YXN5bmMoKT0+e3UoITApLGF3YWl0IHl2KGUsdCxvKSx1KCExKX07cmV0dXJuIGk/cigiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci1sb2FkaW5nIn0sIkxvYWRpbmcgbm90ZVx1MjAyNiIpOnIoImRpdiIse2NsYXNzTmFtZToibm90ZS1lZGl0b3IifSxyKCJkaXYiLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLXRvb2xiYXIifSxyKCJidXR0b24iLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLWJ0biBub3RlLWVkaXRvci1idG4tLWJhY2siLG9uQ2xpY2s6bn0sIlx1MjE5MCBCYWNrIikscigiYnV0dG9uIix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci1idG4gbm90ZS1lZGl0b3ItYnRuLS1zYXZlIixvbkNsaWNrOmMsZGlzYWJsZWQ6bH0sbD8iU2F2aW5nXHUyMDI2IjoiU2F2ZSIpKSxyKCJ0ZXh0YXJlYSIse2NsYXNzTmFtZToibm90ZS1lZGl0b3ItdGV4dGFyZWEiLHZhbHVlOm8sb25DaGFuZ2U6ZD0+YShkLnRhcmdldC52YWx1ZSl9KSl9dmFyIFJ0PXhlKHdlKCkpO2Z1bmN0aW9uIE9kKCl7cmV0dXJue2FzeW5jOiExLGJyZWFrczohMSxleHRlbnNpb25zOm51bGwsZ2ZtOiEwLGhvb2tzOm51bGwscGVkYW50aWM6ITEscmVuZGVyZXI6bnVsbCxzaWxlbnQ6ITEsdG9rZW5pemVyOm51bGwsd2Fsa1Rva2VuczpudWxsfX12YXIgcXI9T2QoKTtmdW5jdGlvbiBFdihlKXtxcj1lfXZhciByaT17ZXhlYzooKT0+bnVsbH07ZnVuY3Rpb24gbWUoZSx0PSIiKXtsZXQgbj10eXBlb2YgZT09InN0cmluZyI/ZTplLnNvdXJjZSxyPXtyZXBsYWNlOihvLGEpPT57bGV0IGk9dHlwZW9mIGE9PSJzdHJpbmciP2E6YS5zb3VyY2U7cmV0dXJuIGk9aS5yZXBsYWNlKGh0LmNhcmV0LCIkMSIpLG49bi5yZXBsYWNlKG8saSkscn0sZ2V0UmVnZXg6KCk9Pm5ldyBSZWdFeHAobix0KX07cmV0dXJuIHJ9dmFyIGh0PXtjb2RlUmVtb3ZlSW5kZW50Oi9eKD86IHsxLDR9fCB7MCwzfVx0KS9nbSxvdXRwdXRMaW5rUmVwbGFjZTovXFwoW1xbXF1dKS9nLGluZGVudENvZGVDb21wZW5zYXRpb246L14oXHMrKSg/OmBgYCkvLGJlZ2lubmluZ1NwYWNlOi9eXHMrLyxlbmRpbmdIYXNoOi8jJC8sc3RhcnRpbmdTcGFjZUNoYXI6L14gLyxlbmRpbmdTcGFjZUNoYXI6LyAkLyxub25TcGFjZUNoYXI6L1teIF0vLG5ld0xpbmVDaGFyR2xvYmFsOi9cbi9nLHRhYkNoYXJHbG9iYWw6L1x0L2csbXVsdGlwbGVTcGFjZUdsb2JhbDovXHMrL2csYmxhbmtMaW5lOi9eWyBcdF0qJC8sZG91YmxlQmxhbmtMaW5lOi9cblsgXHRdKlxuWyBcdF0qJC8sYmxvY2txdW90ZVN0YXJ0Oi9eIHswLDN9Pi8sYmxvY2txdW90ZVNldGV4dFJlcGxhY2U6L1xuIHswLDN9KCg/Oj0rfC0rKSAqKSg/PVxufCQpL2csYmxvY2txdW90ZVNldGV4dFJlcGxhY2UyOi9eIHswLDN9PlsgXHRdPy9nbSxsaXN0UmVwbGFjZVRhYnM6L15cdCsvLGxpc3RSZXBsYWNlTmVzdGluZzovXiB7MSw0fSg/PSggezR9KSpbXiBdKS9nLGxpc3RJc1Rhc2s6L15cW1sgeFhdXF0gLyxsaXN0UmVwbGFjZVRhc2s6L15cW1sgeFhdXF0gKy8sYW55TGluZTovXG4uKlxuLyxocmVmQnJhY2tldHM6L148KC4qKT4kLyx0YWJsZURlbGltaXRlcjovWzp8XS8sdGFibGVBbGlnbkNoYXJzOi9eXHx8XHwgKiQvZyx0YWJsZVJvd0JsYW5rTGluZTovXG5bIFx0XSokLyx0YWJsZUFsaWduUmlnaHQ6L14gKi0rOiAqJC8sdGFibGVBbGlnbkNlbnRlcjovXiAqOi0rOiAqJC8sdGFibGVBbGlnbkxlZnQ6L14gKjotKyAqJC8sc3RhcnRBVGFnOi9ePGEgL2ksZW5kQVRhZzovXjxcL2E+L2ksc3RhcnRQcmVTY3JpcHRUYWc6L148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2ksZW5kUHJlU2NyaXB0VGFnOi9ePFwvKHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2ksc3RhcnRBbmdsZUJyYWNrZXQ6L148LyxlbmRBbmdsZUJyYWNrZXQ6Lz4kLyxwZWRhbnRpY0hyZWZUaXRsZTovXihbXiciXSpbXlxzXSlccysoWyciXSkoLiopXDIvLHVuaWNvZGVBbHBoYU51bWVyaWM6L1tccHtMfVxwe059XS91LGVzY2FwZVRlc3Q6L1smPD4iJ10vLGVzY2FwZVJlcGxhY2U6L1smPD4iJ10vZyxlc2NhcGVUZXN0Tm9FbmNvZGU6L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvLGVzY2FwZVJlcGxhY2VOb0VuY29kZTovWzw+IiddfCYoPyEoI1xkezEsN318I1tYeF1bYS1mQS1GMC05XXsxLDZ9fFx3Kyk7KS9nLHVuZXNjYXBlVGVzdDovJigjKD86XGQrKXwoPzojeFswLTlBLUZhLWZdKyl8KD86XHcrKSk7Py9pZyxjYXJldDovKF58W15cW10pXF4vZyxwZXJjZW50RGVjb2RlOi8lMjUvZyxmaW5kUGlwZTovXHwvZyxzcGxpdFBpcGU6LyBcfC8sc2xhc2hQaXBlOi9cXFx8L2csY2FycmlhZ2VSZXR1cm46L1xyXG58XHIvZyxzcGFjZUxpbmU6L14gKyQvZ20sbm90U3BhY2VTdGFydDovXlxTKi8sZW5kaW5nTmV3bGluZTovXG4kLyxsaXN0SXRlbVJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4oIHswLDN9JHtlfSkoKD86WwkgXVteXFxuXSopPyg/OlxcbnwkKSlgKSxuZXh0QnVsbGV0UmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19KD86WyorLV18XFxkezEsOX1bLildKSgoPzpbIAldW15cXG5dKik/KD86XFxufCQpKWApLGhyUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcKiAqKXszLH0pKD86XFxuK3wkKWApLGZlbmNlc0JlZ2luUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19KD86XGBcYFxgfH5+filgKSxoZWFkaW5nQmVnaW5SZWdleDplPT5uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxlLTEpfX0jYCksaHRtbEJlZ2luUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19PCg/OlthLXpdLio+fCEtLSlgLCJpIil9LGlrPS9eKD86WyBcdF0qKD86XG58JCkpKy8sc2s9L14oKD86IHs0fXwgezAsM31cdClbXlxuXSsoPzpcbig/OlsgXHRdKig/OlxufCQpKSopPykrLyxsaz0vXiB7MCwzfShgezMsfSg/PVteYFxuXSooPzpcbnwkKSl8fnszLH0pKFteXG5dKikoPzpcbnwkKSg/OnwoW1xzXFNdKj8pKD86XG58JCkpKD86IHswLDN9XDFbfmBdKiAqKD89XG58JCl8JCkvLG9pPS9eIHswLDN9KCg/Oi1bXHQgXSopezMsfXwoPzpfWyBcdF0qKXszLH18KD86XCpbIFx0XSopezMsfSkoPzpcbit8JCkvLHVrPS9eIHswLDN9KCN7MSw2fSkoPz1cc3wkKSguKikoPzpcbit8JCkvLFJkPS8oPzpbKistXXxcZHsxLDl9Wy4pXSkvLFR2PS9eKD8hYnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkoKD86Lnxcbig/IVxzKj9cbnxidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSkrPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8sTnY9bWUoVHYpLnJlcGxhY2UoL2J1bGwvZyxSZCkucmVwbGFjZSgvYmxvY2tDb2RlL2csLyg/OiB7NH18IHswLDN9XHQpLykucmVwbGFjZSgvZmVuY2VzL2csLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLC8gezAsM308W15cbj5dKz5cbi8pLnJlcGxhY2UoL1x8dGFibGUvZywiIikuZ2V0UmVnZXgoKSxjaz1tZShUdikucmVwbGFjZSgvYnVsbC9nLFJkKS5yZXBsYWNlKC9ibG9ja0NvZGUvZywvKD86IHs0fXwgezAsM31cdCkvKS5yZXBsYWNlKC9mZW5jZXMvZywvIHswLDN9KD86YHszLH18fnszLH0pLykucmVwbGFjZSgvYmxvY2txdW90ZS9nLC8gezAsM30+LykucmVwbGFjZSgvaGVhZGluZy9nLC8gezAsM30jezEsNn0vKS5yZXBsYWNlKC9odG1sL2csLyB7MCwzfTxbXlxuPl0rPlxuLykucmVwbGFjZSgvdGFibGUvZywvIHswLDN9XHw/KD86WzpcLSBdKlx8KStbXDpcLSBdKlxuLykuZ2V0UmVnZXgoKSxNZD0vXihbXlxuXSsoPzpcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXG4pW15cbl0rKSopLyxkaz0vXlteXG5dKy8sSWQ9Lyg/IVxzKlxdKSg/OlxcLnxbXlxbXF1cXF0pKy8scGs9bWUoL14gezAsM31cWyhsYWJlbClcXTogKig/OlxuWyBcdF0qKT8oW148XHNdW15cc10qfDwuKj8+KSg/Oig/OiArKD86XG5bIFx0XSopP3wgKlxuWyBcdF0qKSh0aXRsZSkpPyAqKD86XG4rfCQpLykucmVwbGFjZSgibGFiZWwiLElkKS5yZXBsYWNlKCJ0aXRsZSIsLyg/OiIoPzpcXCI/fFteIlxcXSkqInwnW14nXG5dKig/OlxuW14nXG5dKykqXG4/J3xcKFteKCldKlwpKS8pLmdldFJlZ2V4KCksZms9bWUoL14oIHswLDN9YnVsbCkoWyBcdF1bXlxuXSs/KT8oPzpcbnwkKS8pLnJlcGxhY2UoL2J1bGwvZyxSZCkuZ2V0UmVnZXgoKSxsbD0iYWRkcmVzc3xhcnRpY2xlfGFzaWRlfGJhc2V8YmFzZWZvbnR8YmxvY2txdW90ZXxib2R5fGNhcHRpb258Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb258ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMS02XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZXxsZWdlbmR8bGl8bGlua3xtYWlufG1lbnV8bWVudWl0ZW18bWV0YXxuYXZ8bm9mcmFtZXN8b2x8b3B0Z3JvdXB8b3B0aW9ufHB8cGFyYW18c2VhcmNofHNlY3Rpb258c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZXx0cnx0cmFja3x1bCIsUGQ9LzwhLS0oPzotPz58W1xzXFNdKj8oPzotLT58JCkpLyxtaz1tZSgiXiB7MCwzfSg/Ojwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxzPl1bXFxzXFxTXSo/KD86PC9cXDE+W15cXG5dKlxcbit8JCl8Y29tbWVudFteXFxuXSooXFxuK3wkKXw8XFw/W1xcc1xcU10qPyg/OlxcPz5cXG4qfCQpfDwhW0EtWl1bXFxzXFxTXSo/KD86Plxcbip8JCl8PCFcXFtDREFUQVxcW1tcXHNcXFNdKj8oPzpcXF1cXF0+XFxuKnwkKXw8Lz8odGFnKSg/OiArfFxcbnwvPz4pW1xcc1xcU10qPyg/Oig/OlxcblsgCV0qKStcXG58JCl8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcblsgCV0qKStcXG58JCl8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcdy1dKlxccyo+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuWyAJXSopK1xcbnwkKSkiLCJpIikucmVwbGFjZSgiY29tbWVudCIsUGQpLnJlcGxhY2UoInRhZyIsbGwpLnJlcGxhY2UoImF0dHJpYnV0ZSIsLyArW2EtekEtWjpfXVtcdy46LV0qKD86ICo9ICoiW14iXG5dKiJ8ICo9IConW14nXG5dKid8ICo9ICpbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCksRHY9bWUoTWQpLnJlcGxhY2UoImhyIixvaSkucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInx0YWJsZSIsIiIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIixsbCkuZ2V0UmVnZXgoKSxoaz1tZSgvXiggezAsM30+ID8ocGFyYWdyYXBofFteXG5dKikoPzpcbnwkKSkrLykucmVwbGFjZSgicGFyYWdyYXBoIixEdikuZ2V0UmVnZXgoKSxMZD17YmxvY2txdW90ZTpoayxjb2RlOnNrLGRlZjpwayxmZW5jZXM6bGssaGVhZGluZzp1ayxocjpvaSxodG1sOm1rLGxoZWFkaW5nOk52LGxpc3Q6ZmssbmV3bGluZTppayxwYXJhZ3JhcGg6RHYsdGFibGU6cmksdGV4dDpka30sd3Y9bWUoIl4gKihbXlxcbiBdLiopXFxuIHswLDN9KCg/OlxcfCAqKT86Py0rOj8gKig/OlxcfCAqOj8tKzo/ICopKig/OlxcfCAqKT8pKD86XFxuKCg/Oig/ISAqXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXG58JCkpKilcXG4qfCQpIikucmVwbGFjZSgiaHIiLG9pKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJjb2RlIiwiKD86IHs0fXwgezAsM30JKVteXFxuXSIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsbGwpLmdldFJlZ2V4KCksZ2s9ey4uLkxkLGxoZWFkaW5nOmNrLHRhYmxlOnd2LHBhcmFncmFwaDptZShNZCkucmVwbGFjZSgiaHIiLG9pKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgidGFibGUiLHd2KS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsbGwpLmdldFJlZ2V4KCl9LHZrPXsuLi5MZCxodG1sOm1lKGBeICooPzpjb21tZW50ICooPzpcXG58XFxzKiQpfDwodGFnKVtcXHNcXFNdKz88L1xcMT4gKig/OlxcbnsyLH18XFxzKiQpfDx0YWcoPzoiW14iXSoifCdbXiddKid8XFxzW14nIi8+XFxzXSopKj8vPz4gKig/OlxcbnsyLH18XFxzKiQpKWApLnJlcGxhY2UoImNvbW1lbnQiLFBkKS5yZXBsYWNlKC90YWcvZywiKD8hKD86YXxlbXxzdHJvbmd8c21hbGx8c3xjaXRlfHF8ZGZufGFiYnJ8ZGF0YXx0aW1lfGNvZGV8dmFyfHNhbXB8a2JkfHN1YnxzdXB8aXxifHV8bWFya3xydWJ5fHJ0fHJwfGJkaXxiZG98c3Bhbnxicnx3YnJ8aW5zfGRlbHxpbWcpXFxiKVxcdysoPyE6fFteXFx3XFxzQF0qQClcXGIiKS5nZXRSZWdleCgpLGRlZjovXiAqXFsoW15cXV0rKVxdOiAqPD8oW15ccz5dKyk+Pyg/OiArKFsiKF1bXlxuXStbIildKSk/ICooPzpcbit8JCkvLGhlYWRpbmc6L14oI3sxLDZ9KSguKikoPzpcbit8JCkvLGZlbmNlczpyaSxsaGVhZGluZzovXiguKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLHBhcmFncmFwaDptZShNZCkucmVwbGFjZSgiaHIiLG9pKS5yZXBsYWNlKCJoZWFkaW5nIixgICojezEsNn0gKlteCl1gKS5yZXBsYWNlKCJsaGVhZGluZyIsTnYpLnJlcGxhY2UoInx0YWJsZSIsIiIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgifGZlbmNlcyIsIiIpLnJlcGxhY2UoInxsaXN0IiwiIikucmVwbGFjZSgifGh0bWwiLCIiKS5yZXBsYWNlKCJ8dGFnIiwiIikuZ2V0UmVnZXgoKX0seWs9L15cXChbISIjJCUmJygpKissXC0uLzo7PD0+P0BcW1xdXFxeX2B7fH1+XSkvLHdrPS9eKGArKShbXmBdfFteYF1bXHNcU10qP1teYF0pXDEoPyFgKS8sX3Y9L14oIHsyLH18XFwpXG4oPyFccyokKS8sYms9L14oYCt8W15gXSkoPzooPz0gezIsfVxuKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKl9dfFxiX3wkKXxbXiBdKD89IHsyLH1cbikpKS8sdWw9L1tccHtQfVxwe1N9XS91LHpkPS9bXHNccHtQfVxwe1N9XS91LEN2PS9bXlxzXHB7UH1ccHtTfV0vdSx4az1tZSgvXigoPyFbKl9dKXB1bmN0U3BhY2UpLywidSIpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyx6ZCkuZ2V0UmVnZXgoKSxBdj0vKD8hfilbXHB7UH1ccHtTfV0vdSxraz0vKD8hfilbXHNccHtQfVxwe1N9XS91LFNrPS8oPzpbXlxzXHB7UH1ccHtTfV18fikvdSxFaz0vXFtbXltcXV0qP1xdXCgoPzpcXC58W15cXFwoXCldfFwoKD86XFwufFteXFxcKFwpXSkqXCkpKlwpfGBbXmBdKj9gfDxbXjw+XSo/Pi9nLE92PS9eKD86XCorKD86KCg/IVwqKXB1bmN0KXxbXlxzKl0pKXxeXysoPzooKD8hXylwdW5jdCl8KFteXHNfXSkpLyxUaz1tZShPdiwidSIpLnJlcGxhY2UoL3B1bmN0L2csdWwpLmdldFJlZ2V4KCksTms9bWUoT3YsInUiKS5yZXBsYWNlKC9wdW5jdC9nLEF2KS5nZXRSZWdleCgpLFJ2PSJeW15fKl0qP19fW15fKl0qP1xcKlteXypdKj8oPz1fXyl8W14qXSsoPz1bXipdKXwoPyFcXCopcHVuY3QoXFwqKykoPz1bXFxzXXwkKXxub3RQdW5jdFNwYWNlKFxcKispKD8hXFwqKSg/PXB1bmN0U3BhY2V8JCl8KD8hXFwqKXB1bmN0U3BhY2UoXFwqKykoPz1ub3RQdW5jdFNwYWNlKXxbXFxzXShcXCorKSg/IVxcKikoPz1wdW5jdCl8KD8hXFwqKXB1bmN0KFxcKispKD8hXFwqKSg/PXB1bmN0KXxub3RQdW5jdFNwYWNlKFxcKispKD89bm90UHVuY3RTcGFjZSkiLERrPW1lKFJ2LCJndSIpLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZyxDdikucmVwbGFjZSgvcHVuY3RTcGFjZS9nLHpkKS5yZXBsYWNlKC9wdW5jdC9nLHVsKS5nZXRSZWdleCgpLF9rPW1lKFJ2LCJndSIpLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZyxTaykucmVwbGFjZSgvcHVuY3RTcGFjZS9nLGtrKS5yZXBsYWNlKC9wdW5jdC9nLEF2KS5nZXRSZWdleCgpLENrPW1lKCJeW15fKl0qP1xcKlxcKlteXypdKj9fW15fKl0qPyg/PVxcKlxcKil8W15fXSsoPz1bXl9dKXwoPyFfKXB1bmN0KF8rKSg/PVtcXHNdfCQpfG5vdFB1bmN0U3BhY2UoXyspKD8hXykoPz1wdW5jdFNwYWNlfCQpfCg/IV8pcHVuY3RTcGFjZShfKykoPz1ub3RQdW5jdFNwYWNlKXxbXFxzXShfKykoPyFfKSg/PXB1bmN0KXwoPyFfKXB1bmN0KF8rKSg/IV8pKD89cHVuY3QpIiwiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csQ3YpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyx6ZCkucmVwbGFjZSgvcHVuY3QvZyx1bCkuZ2V0UmVnZXgoKSxBaz1tZSgvXFwocHVuY3QpLywiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLHVsKS5nZXRSZWdleCgpLE9rPW1lKC9ePChzY2hlbWU6W15cc1x4MDAtXHgxZjw+XSp8ZW1haWwpPi8pLnJlcGxhY2UoInNjaGVtZSIsL1thLXpBLVpdW2EtekEtWjAtOSsuLV17MSwzMX0vKS5yZXBsYWNlKCJlbWFpbCIsL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKyg/IVstX10pLykuZ2V0UmVnZXgoKSxSaz1tZShQZCkucmVwbGFjZSgiKD86LS0+fCQpIiwiLS0+IikuZ2V0UmVnZXgoKSxNaz1tZSgiXmNvbW1lbnR8XjwvW2EtekEtWl1bXFx3Oi1dKlxccyo+fF48W2EtekEtWl1bXFx3LV0qKD86YXR0cmlidXRlKSo/XFxzKi8/PnxePFxcP1tcXHNcXFNdKj9cXD8+fF48IVthLXpBLVpdK1xcc1tcXHNcXFNdKj8+fF48IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT4iKS5yZXBsYWNlKCJjb21tZW50IixSaykucmVwbGFjZSgiYXR0cmlidXRlIiwvXHMrW2EtekEtWjpfXVtcdy46LV0qKD86XHMqPVxzKiJbXiJdKiJ8XHMqPVxzKidbXiddKid8XHMqPVxzKlteXHMiJz08PmBdKyk/LykuZ2V0UmVnZXgoKSxhbD0vKD86XFsoPzpcXC58W15cW1xdXFxdKSpcXXxcXC58YFteYF0qYHxbXlxbXF1cXGBdKSo/LyxJaz1tZSgvXiE/XFsobGFiZWwpXF1cKFxzKihocmVmKSg/Oig/OlsgXHRdKig/OlxuWyBcdF0qKT8pKHRpdGxlKSk/XHMqXCkvKS5yZXBsYWNlKCJsYWJlbCIsYWwpLnJlcGxhY2UoImhyZWYiLC88KD86XFwufFteXG48PlxcXSkrPnxbXiBcdFxuXHgwMC1ceDFmXSovKS5yZXBsYWNlKCJ0aXRsZSIsLyIoPzpcXCI/fFteIlxcXSkqInwnKD86XFwnP3xbXidcXF0pKid8XCgoPzpcXFwpP3xbXilcXF0pKlwpLykuZ2V0UmVnZXgoKSxNdj1tZSgvXiE/XFsobGFiZWwpXF1cWyhyZWYpXF0vKS5yZXBsYWNlKCJsYWJlbCIsYWwpLnJlcGxhY2UoInJlZiIsSWQpLmdldFJlZ2V4KCksSXY9bWUoL14hP1xbKHJlZilcXSg/OlxbXF0pPy8pLnJlcGxhY2UoInJlZiIsSWQpLmdldFJlZ2V4KCksUGs9bWUoInJlZmxpbmt8bm9saW5rKD8hXFwoKSIsImciKS5yZXBsYWNlKCJyZWZsaW5rIixNdikucmVwbGFjZSgibm9saW5rIixJdikuZ2V0UmVnZXgoKSxGZD17X2JhY2twZWRhbDpyaSxhbnlQdW5jdHVhdGlvbjpBayxhdXRvbGluazpPayxibG9ja1NraXA6RWssYnI6X3YsY29kZTp3ayxkZWw6cmksZW1TdHJvbmdMRGVsaW06VGssZW1TdHJvbmdSRGVsaW1Bc3Q6RGssZW1TdHJvbmdSRGVsaW1VbmQ6Q2ssZXNjYXBlOnlrLGxpbms6SWssbm9saW5rOkl2LHB1bmN0dWF0aW9uOnhrLHJlZmxpbms6TXYscmVmbGlua1NlYXJjaDpQayx0YWc6TWssdGV4dDpiayx1cmw6cml9LExrPXsuLi5GZCxsaW5rOm1lKC9eIT9cWyhsYWJlbClcXVwoKC4qPylcKS8pLnJlcGxhY2UoImxhYmVsIixhbCkuZ2V0UmVnZXgoKSxyZWZsaW5rOm1lKC9eIT9cWyhsYWJlbClcXVxzKlxbKFteXF1dKilcXS8pLnJlcGxhY2UoImxhYmVsIixhbCkuZ2V0UmVnZXgoKX0sX2Q9ey4uLkZkLGVtU3Ryb25nUkRlbGltQXN0Ol9rLGVtU3Ryb25nTERlbGltOk5rLHVybDptZSgvXigoPzpmdHB8aHR0cHM/KTpcL1wvfHd3d1wuKSg/OlthLXpBLVowLTlcLV0rXC4/KStbXlxzPF0qfF5lbWFpbC8sImkiKS5yZXBsYWNlKCJlbWFpbCIsL1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlwuW2EtekEtWjAtOS1fXSpbYS16QS1aMC05XSkrKD8hWy1fXSkvKS5nZXRSZWdleCgpLF9iYWNrcGVkYWw6Lyg/OltePyEuLDo7Kl8nIn4oKSZdK3xcKFteKV0qXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nIn4pXSsoPyEkKSkrLyxkZWw6L14ofn4/KSg/PVteXHN+XSkoKD86XFwufFteXFxdKSo/KD86XFwufFteXHN+XFxdKSlcMSg/PVtefl18JCkvLHRleHQ6L14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cbil8KD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCl8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCp+X118XGJffGh0dHBzPzpcL1wvfGZ0cDpcL1wvfHd3d1wufCQpfFteIF0oPz0gezIsfVxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0oPz1bYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXStAKSkpL30sems9ey4uLl9kLGJyOm1lKF92KS5yZXBsYWNlKCJ7Mix9IiwiKiIpLmdldFJlZ2V4KCksdGV4dDptZShfZC50ZXh0KS5yZXBsYWNlKCJcXGJfIiwiXFxiX3wgezIsfVxcbiIpLnJlcGxhY2UoL1x7MixcfS9nLCIqIikuZ2V0UmVnZXgoKX0scmw9e25vcm1hbDpMZCxnZm06Z2sscGVkYW50aWM6dmt9LHRpPXtub3JtYWw6RmQsZ2ZtOl9kLGJyZWFrczp6ayxwZWRhbnRpYzpMa30sRms9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9LGJ2PWU9PkZrW2VdO2Z1bmN0aW9uIGJuKGUsdCl7aWYodCl7aWYoaHQuZXNjYXBlVGVzdC50ZXN0KGUpKXJldHVybiBlLnJlcGxhY2UoaHQuZXNjYXBlUmVwbGFjZSxidil9ZWxzZSBpZihodC5lc2NhcGVUZXN0Tm9FbmNvZGUudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKGh0LmVzY2FwZVJlcGxhY2VOb0VuY29kZSxidik7cmV0dXJuIGV9ZnVuY3Rpb24geHYoZSl7dHJ5e2U9ZW5jb2RlVVJJKGUpLnJlcGxhY2UoaHQucGVyY2VudERlY29kZSwiJSIpfWNhdGNoe3JldHVybiBudWxsfXJldHVybiBlfWZ1bmN0aW9uIGt2KGUsdCl7bGV0IG49ZS5yZXBsYWNlKGh0LmZpbmRQaXBlLChhLGkscyk9PntsZXQgbD0hMSx1PWk7Zm9yKDstLXU+PTAmJnNbdV09PT0iXFwiOylsPSFsO3JldHVybiBsPyJ8IjoiIHwifSkscj1uLnNwbGl0KGh0LnNwbGl0UGlwZSksbz0wO2lmKHJbMF0udHJpbSgpfHxyLnNoaWZ0KCksci5sZW5ndGg+MCYmIXIuYXQoLTEpPy50cmltKCkmJnIucG9wKCksdClpZihyLmxlbmd0aD50KXIuc3BsaWNlKHQpO2Vsc2UgZm9yKDtyLmxlbmd0aDx0OylyLnB1c2goIiIpO2Zvcig7bzxyLmxlbmd0aDtvKyspcltvXT1yW29dLnRyaW0oKS5yZXBsYWNlKGh0LnNsYXNoUGlwZSwifCIpO3JldHVybiByfWZ1bmN0aW9uIG5pKGUsdCxuKXtsZXQgcj1lLmxlbmd0aDtpZihyPT09MClyZXR1cm4iIjtsZXQgbz0wO2Zvcig7bzxyOyl7bGV0IGE9ZS5jaGFyQXQoci1vLTEpO2lmKGE9PT10JiYhbilvKys7ZWxzZSBpZihhIT09dCYmbilvKys7ZWxzZSBicmVha31yZXR1cm4gZS5zbGljZSgwLHItbyl9ZnVuY3Rpb24gVWsoZSx0KXtpZihlLmluZGV4T2YodFsxXSk9PT0tMSlyZXR1cm4tMTtsZXQgbj0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl09PT0iXFwiKXIrKztlbHNlIGlmKGVbcl09PT10WzBdKW4rKztlbHNlIGlmKGVbcl09PT10WzFdJiYobi0tLG48MCkpcmV0dXJuIHI7cmV0dXJuIG4+MD8tMjotMX1mdW5jdGlvbiBTdihlLHQsbixyLG8pe2xldCBhPXQuaHJlZixpPXQudGl0bGV8fG51bGwscz1lWzFdLnJlcGxhY2Uoby5vdGhlci5vdXRwdXRMaW5rUmVwbGFjZSwiJDEiKTtyLnN0YXRlLmluTGluaz0hMDtsZXQgbD17dHlwZTplWzBdLmNoYXJBdCgwKT09PSIhIj8iaW1hZ2UiOiJsaW5rIixyYXc6bixocmVmOmEsdGl0bGU6aSx0ZXh0OnMsdG9rZW5zOnIuaW5saW5lVG9rZW5zKHMpfTtyZXR1cm4gci5zdGF0ZS5pbkxpbms9ITEsbH1mdW5jdGlvbiAkayhlLHQsbil7bGV0IHI9ZS5tYXRjaChuLm90aGVyLmluZGVudENvZGVDb21wZW5zYXRpb24pO2lmKHI9PT1udWxsKXJldHVybiB0O2xldCBvPXJbMV07cmV0dXJuIHQuc3BsaXQoYApgKS5tYXAoYT0+e2xldCBpPWEubWF0Y2gobi5vdGhlci5iZWdpbm5pbmdTcGFjZSk7aWYoaT09PW51bGwpcmV0dXJuIGE7bGV0W3NdPWk7cmV0dXJuIHMubGVuZ3RoPj1vLmxlbmd0aD9hLnNsaWNlKG8ubGVuZ3RoKTphfSkuam9pbihgCmApfXZhciBpbD1jbGFzc3tvcHRpb25zO3J1bGVzO2xleGVyO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHxxcn1zcGFjZShlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhlKTtpZih0JiZ0WzBdLmxlbmd0aD4wKXJldHVybnt0eXBlOiJzcGFjZSIscmF3OnRbMF19fWNvZGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWMoZSk7aWYodCl7bGV0IG49dFswXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuY29kZVJlbW92ZUluZGVudCwiIik7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzp0WzBdLGNvZGVCbG9ja1N0eWxlOiJpbmRlbnRlZCIsdGV4dDp0aGlzLm9wdGlvbnMucGVkYW50aWM/bjpuaShuLGAKYCl9fX1mZW5jZXMoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyhlKTtpZih0KXtsZXQgbj10WzBdLHI9JGsobix0WzNdfHwiIix0aGlzLnJ1bGVzKTtyZXR1cm57dHlwZToiY29kZSIscmF3Om4sbGFuZzp0WzJdP3RbMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIik6dFsyXSx0ZXh0OnJ9fX1oZWFkaW5nKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKGUpO2lmKHQpe2xldCBuPXRbMl0udHJpbSgpO2lmKHRoaXMucnVsZXMub3RoZXIuZW5kaW5nSGFzaC50ZXN0KG4pKXtsZXQgcj1uaShuLCIjIik7KHRoaXMub3B0aW9ucy5wZWRhbnRpY3x8IXJ8fHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QocikpJiYobj1yLnRyaW0oKSl9cmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzp0WzBdLGRlcHRoOnRbMV0ubGVuZ3RoLHRleHQ6bix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUobil9fX1ocihlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiaHIiLHJhdzpuaSh0WzBdLGAKYCl9fWJsb2NrcXVvdGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWMoZSk7aWYodCl7bGV0IG49bmkodFswXSxgCmApLnNwbGl0KGAKYCkscj0iIixvPSIiLGE9W107Zm9yKDtuLmxlbmd0aD4wOyl7bGV0IGk9ITEscz1bXSxsO2ZvcihsPTA7bDxuLmxlbmd0aDtsKyspaWYodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU3RhcnQudGVzdChuW2xdKSlzLnB1c2gobltsXSksaT0hMDtlbHNlIGlmKCFpKXMucHVzaChuW2xdKTtlbHNlIGJyZWFrO249bi5zbGljZShsKTtsZXQgdT1zLmpvaW4oYApgKSxjPXUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlLGAKICAgICQxYCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMiwiIik7cj1yP2Ake3J9CiR7dX1gOnUsbz1vP2Ake299CiR7Y31gOmM7bGV0IGQ9dGhpcy5sZXhlci5zdGF0ZS50b3A7aWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITAsdGhpcy5sZXhlci5ibG9ja1Rva2VucyhjLGEsITApLHRoaXMubGV4ZXIuc3RhdGUudG9wPWQsbi5sZW5ndGg9PT0wKWJyZWFrO2xldCBwPWEuYXQoLTEpO2lmKHA/LnR5cGU9PT0iY29kZSIpYnJlYWs7aWYocD8udHlwZT09PSJibG9ja3F1b3RlIil7bGV0IGc9cCx2PWcucmF3K2AKYCtuLmpvaW4oYApgKSx5PXRoaXMuYmxvY2txdW90ZSh2KTthW2EubGVuZ3RoLTFdPXkscj1yLnN1YnN0cmluZygwLHIubGVuZ3RoLWcucmF3Lmxlbmd0aCkreS5yYXcsbz1vLnN1YnN0cmluZygwLG8ubGVuZ3RoLWcudGV4dC5sZW5ndGgpK3kudGV4dDticmVha31lbHNlIGlmKHA/LnR5cGU9PT0ibGlzdCIpe2xldCBnPXAsdj1nLnJhdytgCmArbi5qb2luKGAKYCkseT10aGlzLmxpc3Qodik7YVthLmxlbmd0aC0xXT15LHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC1wLnJhdy5sZW5ndGgpK3kucmF3LG89by5zdWJzdHJpbmcoMCxvLmxlbmd0aC1nLnJhdy5sZW5ndGgpK3kucmF3LG49di5zdWJzdHJpbmcoYS5hdCgtMSkucmF3Lmxlbmd0aCkuc3BsaXQoYApgKTtjb250aW51ZX19cmV0dXJue3R5cGU6ImJsb2NrcXVvdGUiLHJhdzpyLHRva2VuczphLHRleHQ6b319fWxpc3QoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWMoZSk7aWYodCl7bGV0IG49dFsxXS50cmltKCkscj1uLmxlbmd0aD4xLG89e3R5cGU6Imxpc3QiLHJhdzoiIixvcmRlcmVkOnIsc3RhcnQ6cj8rbi5zbGljZSgwLC0xKToiIixsb29zZTohMSxpdGVtczpbXX07bj1yP2BcXGR7MSw5fVxcJHtuLnNsaWNlKC0xKX1gOmBcXCR7bn1gLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKG49cj9uOiJbKistXSIpO2xldCBhPXRoaXMucnVsZXMub3RoZXIubGlzdEl0ZW1SZWdleChuKSxpPSExO2Zvcig7ZTspe2xldCBsPSExLHU9IiIsYz0iIjtpZighKHQ9YS5leGVjKGUpKXx8dGhpcy5ydWxlcy5ibG9jay5oci50ZXN0KGUpKWJyZWFrO3U9dFswXSxlPWUuc3Vic3RyaW5nKHUubGVuZ3RoKTtsZXQgZD10WzJdLnNwbGl0KGAKYCwxKVswXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYWJzLGg9PiIgIi5yZXBlYXQoMypoLmxlbmd0aCkpLHA9ZS5zcGxpdChgCmAsMSlbMF0sZz0hZC50cmltKCksdj0wO2lmKHRoaXMub3B0aW9ucy5wZWRhbnRpYz8odj0yLGM9ZC50cmltU3RhcnQoKSk6Zz92PXRbMV0ubGVuZ3RoKzE6KHY9dFsyXS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpLHY9dj40PzE6dixjPWQuc2xpY2Uodiksdis9dFsxXS5sZW5ndGgpLGcmJnRoaXMucnVsZXMub3RoZXIuYmxhbmtMaW5lLnRlc3QocCkmJih1Kz1wK2AKYCxlPWUuc3Vic3RyaW5nKHAubGVuZ3RoKzEpLGw9ITApLCFsKXtsZXQgaD10aGlzLnJ1bGVzLm90aGVyLm5leHRCdWxsZXRSZWdleCh2KSxtPXRoaXMucnVsZXMub3RoZXIuaHJSZWdleCh2KSx3PXRoaXMucnVsZXMub3RoZXIuZmVuY2VzQmVnaW5SZWdleCh2KSxmPXRoaXMucnVsZXMub3RoZXIuaGVhZGluZ0JlZ2luUmVnZXgodiksVD10aGlzLnJ1bGVzLm90aGVyLmh0bWxCZWdpblJlZ2V4KHYpO2Zvcig7ZTspe2xldCBTPWUuc3BsaXQoYApgLDEpWzBdLEQ7aWYocD1TLHRoaXMub3B0aW9ucy5wZWRhbnRpYz8ocD1wLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZU5lc3RpbmcsIiAgIiksRD1wKTpEPXAucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYkNoYXJHbG9iYWwsIiAgICAiKSx3LnRlc3QocCl8fGYudGVzdChwKXx8VC50ZXN0KHApfHxoLnRlc3QocCl8fG0udGVzdChwKSlicmVhaztpZihELnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcik+PXZ8fCFwLnRyaW0oKSljKz1gCmArRC5zbGljZSh2KTtlbHNle2lmKGd8fGQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYkNoYXJHbG9iYWwsIiAgICAiKS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpPj00fHx3LnRlc3QoZCl8fGYudGVzdChkKXx8bS50ZXN0KGQpKWJyZWFrO2MrPWAKYCtwfSFnJiYhcC50cmltKCkmJihnPSEwKSx1Kz1TK2AKYCxlPWUuc3Vic3RyaW5nKFMubGVuZ3RoKzEpLGQ9RC5zbGljZSh2KX19by5sb29zZXx8KGk/by5sb29zZT0hMDp0aGlzLnJ1bGVzLm90aGVyLmRvdWJsZUJsYW5rTGluZS50ZXN0KHUpJiYoaT0hMCkpO2xldCB5PW51bGwsYjt0aGlzLm9wdGlvbnMuZ2ZtJiYoeT10aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2suZXhlYyhjKSx5JiYoYj15WzBdIT09IlsgXSAiLGM9Yy5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYXNrLCIiKSkpLG8uaXRlbXMucHVzaCh7dHlwZToibGlzdF9pdGVtIixyYXc6dSx0YXNrOiEheSxjaGVja2VkOmIsbG9vc2U6ITEsdGV4dDpjLHRva2VuczpbXX0pLG8ucmF3Kz11fWxldCBzPW8uaXRlbXMuYXQoLTEpO2lmKHMpcy5yYXc9cy5yYXcudHJpbUVuZCgpLHMudGV4dD1zLnRleHQudHJpbUVuZCgpO2Vsc2UgcmV0dXJuO28ucmF3PW8ucmF3LnRyaW1FbmQoKTtmb3IobGV0IGw9MDtsPG8uaXRlbXMubGVuZ3RoO2wrKylpZih0aGlzLmxleGVyLnN0YXRlLnRvcD0hMSxvLml0ZW1zW2xdLnRva2Vucz10aGlzLmxleGVyLmJsb2NrVG9rZW5zKG8uaXRlbXNbbF0udGV4dCxbXSksIW8ubG9vc2Upe2xldCB1PW8uaXRlbXNbbF0udG9rZW5zLmZpbHRlcihkPT5kLnR5cGU9PT0ic3BhY2UiKSxjPXUubGVuZ3RoPjAmJnUuc29tZShkPT50aGlzLnJ1bGVzLm90aGVyLmFueUxpbmUudGVzdChkLnJhdykpO28ubG9vc2U9Y31pZihvLmxvb3NlKWZvcihsZXQgbD0wO2w8by5pdGVtcy5sZW5ndGg7bCsrKW8uaXRlbXNbbF0ubG9vc2U9ITA7cmV0dXJuIG99fWh0bWwoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5odG1sLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiaHRtbCIsYmxvY2s6ITAscmF3OnRbMF0scHJlOnRbMV09PT0icHJlInx8dFsxXT09PSJzY3JpcHQifHx0WzFdPT09InN0eWxlIix0ZXh0OnRbMF19fWRlZihlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubXVsdGlwbGVTcGFjZUdsb2JhbCwiICIpLHI9dFsyXT90WzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ocmVmQnJhY2tldHMsIiQxIikucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKToiIixvPXRbM10/dFszXS5zdWJzdHJpbmcoMSx0WzNdLmxlbmd0aC0xKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCIkMSIpOnRbM107cmV0dXJue3R5cGU6ImRlZiIsdGFnOm4scmF3OnRbMF0saHJlZjpyLHRpdGxlOm99fX10YWJsZShlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoZSk7aWYoIXR8fCF0aGlzLnJ1bGVzLm90aGVyLnRhYmxlRGVsaW1pdGVyLnRlc3QodFsyXSkpcmV0dXJuO2xldCBuPWt2KHRbMV0pLHI9dFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNoYXJzLCIiKS5zcGxpdCgifCIpLG89dFszXT8udHJpbSgpP3RbM10ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlUm93QmxhbmtMaW5lLCIiKS5zcGxpdChgCmApOltdLGE9e3R5cGU6InRhYmxlIixyYXc6dFswXSxoZWFkZXI6W10sYWxpZ246W10scm93czpbXX07aWYobi5sZW5ndGg9PT1yLmxlbmd0aCl7Zm9yKGxldCBpIG9mIHIpdGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduUmlnaHQudGVzdChpKT9hLmFsaWduLnB1c2goInJpZ2h0Iik6dGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduQ2VudGVyLnRlc3QoaSk/YS5hbGlnbi5wdXNoKCJjZW50ZXIiKTp0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25MZWZ0LnRlc3QoaSk/YS5hbGlnbi5wdXNoKCJsZWZ0Iik6YS5hbGlnbi5wdXNoKG51bGwpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKWEuaGVhZGVyLnB1c2goe3RleHQ6bltpXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUobltpXSksaGVhZGVyOiEwLGFsaWduOmEuYWxpZ25baV19KTtmb3IobGV0IGkgb2YgbylhLnJvd3MucHVzaChrdihpLGEuaGVhZGVyLmxlbmd0aCkubWFwKChzLGwpPT4oe3RleHQ6cyx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocyksaGVhZGVyOiExLGFsaWduOmEuYWxpZ25bbF19KSkpO3JldHVybiBhfX1saGVhZGluZyhlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiaGVhZGluZyIscmF3OnRbMF0sZGVwdGg6dFsyXS5jaGFyQXQoMCk9PT0iPSI/MToyLHRleHQ6dFsxXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUodFsxXSl9fXBhcmFncmFwaChlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0uY2hhckF0KHRbMV0ubGVuZ3RoLTEpPT09YApgP3RbMV0uc2xpY2UoMCwtMSk6dFsxXTtyZXR1cm57dHlwZToicGFyYWdyYXBoIixyYXc6dFswXSx0ZXh0Om4sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG4pfX19dGV4dChlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnRleHQuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOiJ0ZXh0IixyYXc6dFswXSx0ZXh0OnRbMF0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHRbMF0pfX1lc2NhcGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiZXNjYXBlIixyYXc6dFswXSx0ZXh0OnRbMV19fXRhZyhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS50YWcuZXhlYyhlKTtpZih0KXJldHVybiF0aGlzLmxleGVyLnN0YXRlLmluTGluayYmdGhpcy5ydWxlcy5vdGhlci5zdGFydEFUYWcudGVzdCh0WzBdKT90aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluTGluayYmdGhpcy5ydWxlcy5vdGhlci5lbmRBVGFnLnRlc3QodFswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMSksIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayYmdGhpcy5ydWxlcy5vdGhlci5zdGFydFByZVNjcmlwdFRhZy50ZXN0KHRbMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJnRoaXMucnVsZXMub3RoZXIuZW5kUHJlU2NyaXB0VGFnLnRlc3QodFswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITEpLHt0eXBlOiJodG1sIixyYXc6dFswXSxpbkxpbms6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssaW5SYXdCbG9jazp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssYmxvY2s6ITEsdGV4dDp0WzBdfX1saW5rKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmxpbmsuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnRyaW0oKTtpZighdGhpcy5vcHRpb25zLnBlZGFudGljJiZ0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3Qobikpe2lmKCF0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KG4pKXJldHVybjtsZXQgYT1uaShuLnNsaWNlKDAsLTEpLCJcXCIpO2lmKChuLmxlbmd0aC1hLmxlbmd0aCklMj09PTApcmV0dXJufWVsc2V7bGV0IGE9VWsodFsyXSwiKCkiKTtpZihhPT09LTIpcmV0dXJuO2lmKGE+LTEpe2xldCBzPSh0WzBdLmluZGV4T2YoIiEiKT09PTA/NTo0KSt0WzFdLmxlbmd0aCthO3RbMl09dFsyXS5zdWJzdHJpbmcoMCxhKSx0WzBdPXRbMF0uc3Vic3RyaW5nKDAscykudHJpbSgpLHRbM109IiJ9fWxldCByPXRbMl0sbz0iIjtpZih0aGlzLm9wdGlvbnMucGVkYW50aWMpe2xldCBhPXRoaXMucnVsZXMub3RoZXIucGVkYW50aWNIcmVmVGl0bGUuZXhlYyhyKTthJiYocj1hWzFdLG89YVszXSl9ZWxzZSBvPXRbM10/dFszXS5zbGljZSgxLC0xKToiIjtyZXR1cm4gcj1yLnRyaW0oKSx0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3QocikmJih0aGlzLm9wdGlvbnMucGVkYW50aWMmJiF0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KG4pP3I9ci5zbGljZSgxKTpyPXIuc2xpY2UoMSwtMSkpLFN2KHQse2hyZWY6ciYmci5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCIkMSIpLHRpdGxlOm8mJm8ucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKX0sdFswXSx0aGlzLmxleGVyLHRoaXMucnVsZXMpfX1yZWZsaW5rKGUsdCl7bGV0IG47aWYoKG49dGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKGUpKXx8KG49dGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWMoZSkpKXtsZXQgcj0oblsyXXx8blsxXSkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsIiAiKSxvPXRbci50b0xvd2VyQ2FzZSgpXTtpZighbyl7bGV0IGE9blswXS5jaGFyQXQoMCk7cmV0dXJue3R5cGU6InRleHQiLHJhdzphLHRleHQ6YX19cmV0dXJuIFN2KG4sbyxuWzBdLHRoaXMubGV4ZXIsdGhpcy5ydWxlcyl9fWVtU3Ryb25nKGUsdCxuPSIiKXtsZXQgcj10aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ0xEZWxpbS5leGVjKGUpO2lmKCFyfHxyWzNdJiZuLm1hdGNoKHRoaXMucnVsZXMub3RoZXIudW5pY29kZUFscGhhTnVtZXJpYykpcmV0dXJuO2lmKCEoclsxXXx8clsyXXx8IiIpfHwhbnx8dGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhuKSl7bGV0IGE9Wy4uLnJbMF1dLmxlbmd0aC0xLGkscyxsPWEsdT0wLGM9clswXVswXT09PSIqIj90aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbUFzdDp0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbVVuZDtmb3IoYy5sYXN0SW5kZXg9MCx0PXQuc2xpY2UoLTEqZS5sZW5ndGgrYSk7KHI9Yy5leGVjKHQpKSE9bnVsbDspe2lmKGk9clsxXXx8clsyXXx8clszXXx8cls0XXx8cls1XXx8cls2XSwhaSljb250aW51ZTtpZihzPVsuLi5pXS5sZW5ndGgsclszXXx8cls0XSl7bCs9cztjb250aW51ZX1lbHNlIGlmKChyWzVdfHxyWzZdKSYmYSUzJiYhKChhK3MpJTMpKXt1Kz1zO2NvbnRpbnVlfWlmKGwtPXMsbD4wKWNvbnRpbnVlO3M9TWF0aC5taW4ocyxzK2wrdSk7bGV0IGQ9Wy4uLnJbMF1dWzBdLmxlbmd0aCxwPWUuc2xpY2UoMCxhK3IuaW5kZXgrZCtzKTtpZihNYXRoLm1pbihhLHMpJTIpe2xldCB2PXAuc2xpY2UoMSwtMSk7cmV0dXJue3R5cGU6ImVtIixyYXc6cCx0ZXh0OnYsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHYpfX1sZXQgZz1wLnNsaWNlKDIsLTIpO3JldHVybnt0eXBlOiJzdHJvbmciLHJhdzpwLHRleHQ6Zyx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoZyl9fX19Y29kZXNwYW4oZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuY29kZS5leGVjKGUpO2lmKHQpe2xldCBuPXRbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm5ld0xpbmVDaGFyR2xvYmFsLCIgIikscj10aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhci50ZXN0KG4pLG89dGhpcy5ydWxlcy5vdGhlci5zdGFydGluZ1NwYWNlQ2hhci50ZXN0KG4pJiZ0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KG4pO3JldHVybiByJiZvJiYobj1uLnN1YnN0cmluZygxLG4ubGVuZ3RoLTEpKSx7dHlwZToiY29kZXNwYW4iLHJhdzp0WzBdLHRleHQ6bn19fWJyKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmJyLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiYnIiLHJhdzp0WzBdfX1kZWwoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuZGVsLmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToiZGVsIixyYXc6dFswXSx0ZXh0OnRbMl0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRbMl0pfX1hdXRvbGluayhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5hdXRvbGluay5leGVjKGUpO2lmKHQpe2xldCBuLHI7cmV0dXJuIHRbMl09PT0iQCI/KG49dFsxXSxyPSJtYWlsdG86IituKToobj10WzFdLHI9bikse3R5cGU6ImxpbmsiLHJhdzp0WzBdLHRleHQ6bixocmVmOnIsdG9rZW5zOlt7dHlwZToidGV4dCIscmF3Om4sdGV4dDpufV19fX11cmwoZSl7bGV0IHQ7aWYodD10aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhlKSl7bGV0IG4scjtpZih0WzJdPT09IkAiKW49dFswXSxyPSJtYWlsdG86IituO2Vsc2V7bGV0IG87ZG8gbz10WzBdLHRbMF09dGhpcy5ydWxlcy5pbmxpbmUuX2JhY2twZWRhbC5leGVjKHRbMF0pPy5bMF0/PyIiO3doaWxlKG8hPT10WzBdKTtuPXRbMF0sdFsxXT09PSJ3d3cuIj9yPSJodHRwOi8vIit0WzBdOnI9dFswXX1yZXR1cm57dHlwZToibGluayIscmF3OnRbMF0sdGV4dDpuLGhyZWY6cix0b2tlbnM6W3t0eXBlOiJ0ZXh0IixyYXc6bix0ZXh0Om59XX19fWlubGluZVRleHQoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKGUpO2lmKHQpe2xldCBuPXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaztyZXR1cm57dHlwZToidGV4dCIscmF3OnRbMF0sdGV4dDp0WzBdLGVzY2FwZWQ6bn19fX0sVW49Y2xhc3MgQ2R7dG9rZW5zO29wdGlvbnM7c3RhdGU7dG9rZW5pemVyO2lubGluZVF1ZXVlO2NvbnN0cnVjdG9yKHQpe3RoaXMudG9rZW5zPVtdLHRoaXMudG9rZW5zLmxpbmtzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5vcHRpb25zPXR8fHFyLHRoaXMub3B0aW9ucy50b2tlbml6ZXI9dGhpcy5vcHRpb25zLnRva2VuaXplcnx8bmV3IGlsLHRoaXMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXIsdGhpcy50b2tlbml6ZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50b2tlbml6ZXIubGV4ZXI9dGhpcyx0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMuc3RhdGU9e2luTGluazohMSxpblJhd0Jsb2NrOiExLHRvcDohMH07bGV0IG49e290aGVyOmh0LGJsb2NrOnJsLm5vcm1hbCxpbmxpbmU6dGkubm9ybWFsfTt0aGlzLm9wdGlvbnMucGVkYW50aWM/KG4uYmxvY2s9cmwucGVkYW50aWMsbi5pbmxpbmU9dGkucGVkYW50aWMpOnRoaXMub3B0aW9ucy5nZm0mJihuLmJsb2NrPXJsLmdmbSx0aGlzLm9wdGlvbnMuYnJlYWtzP24uaW5saW5lPXRpLmJyZWFrczpuLmlubGluZT10aS5nZm0pLHRoaXMudG9rZW5pemVyLnJ1bGVzPW59c3RhdGljIGdldCBydWxlcygpe3JldHVybntibG9jazpybCxpbmxpbmU6dGl9fXN0YXRpYyBsZXgodCxuKXtyZXR1cm4gbmV3IENkKG4pLmxleCh0KX1zdGF0aWMgbGV4SW5saW5lKHQsbil7cmV0dXJuIG5ldyBDZChuKS5pbmxpbmVUb2tlbnModCl9bGV4KHQpe3Q9dC5yZXBsYWNlKGh0LmNhcnJpYWdlUmV0dXJuLGAKYCksdGhpcy5ibG9ja1Rva2Vucyh0LHRoaXMudG9rZW5zKTtmb3IobGV0IG49MDtuPHRoaXMuaW5saW5lUXVldWUubGVuZ3RoO24rKyl7bGV0IHI9dGhpcy5pbmxpbmVRdWV1ZVtuXTt0aGlzLmlubGluZVRva2VucyhyLnNyYyxyLnRva2Vucyl9cmV0dXJuIHRoaXMuaW5saW5lUXVldWU9W10sdGhpcy50b2tlbnN9YmxvY2tUb2tlbnModCxuPVtdLHI9ITEpe2Zvcih0aGlzLm9wdGlvbnMucGVkYW50aWMmJih0PXQucmVwbGFjZShodC50YWJDaGFyR2xvYmFsLCIgICAgIikucmVwbGFjZShodC5zcGFjZUxpbmUsIiIpKTt0Oyl7bGV0IG87aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmJsb2NrPy5zb21lKGk9PihvPWkuY2FsbCh7bGV4ZXI6dGhpc30sdCxuKSk/KHQ9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyksITApOiExKSljb250aW51ZTtpZihvPXRoaXMudG9rZW5pemVyLnNwYWNlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCk7bGV0IGk9bi5hdCgtMSk7by5yYXcubGVuZ3RoPT09MSYmaSE9PXZvaWQgMD9pLnJhdys9YApgOm4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmNvZGUodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InBhcmFncmFwaCJ8fGk/LnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArby5yYXcsaS50ZXh0Kz1gCmArby50ZXh0LHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1pLnRleHQpOm4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmZlbmNlcyh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmhlYWRpbmcodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5ocih0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5saXN0KHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIuaHRtbCh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmRlZih0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2xldCBpPW4uYXQoLTEpO2k/LnR5cGU9PT0icGFyYWdyYXBoInx8aT8udHlwZT09PSJ0ZXh0Ij8oaS5yYXcrPWAKYCtvLnJhdyxpLnRleHQrPWAKYCtvLnJhdyx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTp0aGlzLnRva2Vucy5saW5rc1tvLnRhZ118fCh0aGlzLnRva2Vucy5saW5rc1tvLnRhZ109e2hyZWY6by5ocmVmLHRpdGxlOm8udGl0bGV9KTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLnRhYmxlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIubGhlYWRpbmcodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9bGV0IGE9dDtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRCbG9jayl7bGV0IGk9MS8wLHM9dC5zbGljZSgxKSxsO3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2suZm9yRWFjaCh1PT57bD11LmNhbGwoe2xleGVyOnRoaXN9LHMpLHR5cGVvZiBsPT0ibnVtYmVyIiYmbD49MCYmKGk9TWF0aC5taW4oaSxsKSl9KSxpPDEvMCYmaT49MCYmKGE9dC5zdWJzdHJpbmcoMCxpKzEpKX1pZih0aGlzLnN0YXRlLnRvcCYmKG89dGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKGEpKSl7bGV0IGk9bi5hdCgtMSk7ciYmaT8udHlwZT09PSJwYXJhZ3JhcGgiPyhpLnJhdys9YApgK28ucmF3LGkudGV4dCs9YApgK28udGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1pLnRleHQpOm4ucHVzaChvKSxyPWEubGVuZ3RoIT09dC5sZW5ndGgsdD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIudGV4dCh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2xldCBpPW4uYXQoLTEpO2k/LnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArby5yYXcsaS50ZXh0Kz1gCmArby50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkuc3JjPWkudGV4dCk6bi5wdXNoKG8pO2NvbnRpbnVlfWlmKHQpe2xldCBpPSJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrdC5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3IoaSk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoaSl9fXJldHVybiB0aGlzLnN0YXRlLnRvcD0hMCxufWlubGluZSh0LG49W10pe3JldHVybiB0aGlzLmlubGluZVF1ZXVlLnB1c2goe3NyYzp0LHRva2VuczpufSksbn1pbmxpbmVUb2tlbnModCxuPVtdKXtsZXQgcj10LG89bnVsbDtpZih0aGlzLnRva2Vucy5saW5rcyl7bGV0IHM9T2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO2lmKHMubGVuZ3RoPjApZm9yKDsobz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKHIpKSE9bnVsbDspcy5pbmNsdWRlcyhvWzBdLnNsaWNlKG9bMF0ubGFzdEluZGV4T2YoIlsiKSsxLC0xKSkmJihyPXIuc2xpY2UoMCxvLmluZGV4KSsiWyIrImEiLnJlcGVhdChvWzBdLmxlbmd0aC0yKSsiXSIrci5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5sYXN0SW5kZXgpKX1mb3IoOyhvPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5leGVjKHIpKSE9bnVsbDspcj1yLnNsaWNlKDAsby5pbmRleCkrIisrIityLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO2Zvcig7KG89dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKHIpKSE9bnVsbDspcj1yLnNsaWNlKDAsby5pbmRleCkrIlsiKyJhIi5yZXBlYXQob1swXS5sZW5ndGgtMikrIl0iK3Iuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5sYXN0SW5kZXgpO2xldCBhPSExLGk9IiI7Zm9yKDt0Oyl7YXx8KGk9IiIpLGE9ITE7bGV0IHM7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmlubGluZT8uc29tZSh1PT4ocz11LmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpLCEwKTohMSkpY29udGludWU7aWYocz10aGlzLnRva2VuaXplci5lc2NhcGUodCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci50YWcodCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIucmVmbGluayh0LHRoaXMudG9rZW5zLmxpbmtzKSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpO2xldCB1PW4uYXQoLTEpO3MudHlwZT09PSJ0ZXh0IiYmdT8udHlwZT09PSJ0ZXh0Ij8odS5yYXcrPXMucmF3LHUudGV4dCs9cy50ZXh0KTpuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5lbVN0cm9uZyh0LHIsaSkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5jb2Rlc3Bhbih0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmJyKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuZGVsKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuYXV0b2xpbmsodCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYoIXRoaXMuc3RhdGUuaW5MaW5rJiYocz10aGlzLnRva2VuaXplci51cmwodCkpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWxldCBsPXQ7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0SW5saW5lKXtsZXQgdT0xLzAsYz10LnNsaWNlKDEpLGQ7dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaChwPT57ZD1wLmNhbGwoe2xleGVyOnRoaXN9LGMpLHR5cGVvZiBkPT0ibnVtYmVyIiYmZD49MCYmKHU9TWF0aC5taW4odSxkKSl9KSx1PDEvMCYmdT49MCYmKGw9dC5zdWJzdHJpbmcoMCx1KzEpKX1pZihzPXRoaXMudG9rZW5pemVyLmlubGluZVRleHQobCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxzLnJhdy5zbGljZSgtMSkhPT0iXyImJihpPXMucmF3LnNsaWNlKC0xKSksYT0hMDtsZXQgdT1uLmF0KC0xKTt1Py50eXBlPT09InRleHQiPyh1LnJhdys9cy5yYXcsdS50ZXh0Kz1zLnRleHQpOm4ucHVzaChzKTtjb250aW51ZX1pZih0KXtsZXQgdT0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKHUpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKHUpfX1yZXR1cm4gbn19LHNsPWNsYXNze29wdGlvbnM7cGFyc2VyO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHxxcn1zcGFjZShlKXtyZXR1cm4iIn1jb2RlKHt0ZXh0OmUsbGFuZzp0LGVzY2FwZWQ6bn0pe2xldCByPSh0fHwiIikubWF0Y2goaHQubm90U3BhY2VTdGFydCk/LlswXSxvPWUucmVwbGFjZShodC5lbmRpbmdOZXdsaW5lLCIiKStgCmA7cmV0dXJuIHI/JzxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLScrYm4ocikrJyI+Jysobj9vOmJuKG8sITApKStgPC9jb2RlPjwvcHJlPgpgOiI8cHJlPjxjb2RlPiIrKG4/bzpibihvLCEwKSkrYDwvY29kZT48L3ByZT4KYH1ibG9ja3F1b3RlKHt0b2tlbnM6ZX0pe3JldHVybmA8YmxvY2txdW90ZT4KJHt0aGlzLnBhcnNlci5wYXJzZShlKX08L2Jsb2NrcXVvdGU+CmB9aHRtbCh7dGV4dDplfSl7cmV0dXJuIGV9aGVhZGluZyh7dG9rZW5zOmUsZGVwdGg6dH0pe3JldHVybmA8aCR7dH0+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L2gke3R9PgpgfWhyKGUpe3JldHVybmA8aHI+CmB9bGlzdChlKXtsZXQgdD1lLm9yZGVyZWQsbj1lLnN0YXJ0LHI9IiI7Zm9yKGxldCBpPTA7aTxlLml0ZW1zLmxlbmd0aDtpKyspe2xldCBzPWUuaXRlbXNbaV07cis9dGhpcy5saXN0aXRlbShzKX1sZXQgbz10PyJvbCI6InVsIixhPXQmJm4hPT0xPycgc3RhcnQ9IicrbisnIic6IiI7cmV0dXJuIjwiK28rYStgPgpgK3IrIjwvIitvK2A+CmB9bGlzdGl0ZW0oZSl7bGV0IHQ9IiI7aWYoZS50YXNrKXtsZXQgbj10aGlzLmNoZWNrYm94KHtjaGVja2VkOiEhZS5jaGVja2VkfSk7ZS5sb29zZT9lLnRva2Vuc1swXT8udHlwZT09PSJwYXJhZ3JhcGgiPyhlLnRva2Vuc1swXS50ZXh0PW4rIiAiK2UudG9rZW5zWzBdLnRleHQsZS50b2tlbnNbMF0udG9rZW5zJiZlLnRva2Vuc1swXS50b2tlbnMubGVuZ3RoPjAmJmUudG9rZW5zWzBdLnRva2Vuc1swXS50eXBlPT09InRleHQiJiYoZS50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQ9bisiICIrYm4oZS50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQpLGUudG9rZW5zWzBdLnRva2Vuc1swXS5lc2NhcGVkPSEwKSk6ZS50b2tlbnMudW5zaGlmdCh7dHlwZToidGV4dCIscmF3Om4rIiAiLHRleHQ6bisiICIsZXNjYXBlZDohMH0pOnQrPW4rIiAifXJldHVybiB0Kz10aGlzLnBhcnNlci5wYXJzZShlLnRva2VucywhIWUubG9vc2UpLGA8bGk+JHt0fTwvbGk+CmB9Y2hlY2tib3goe2NoZWNrZWQ6ZX0pe3JldHVybiI8aW5wdXQgIisoZT8nY2hlY2tlZD0iIiAnOiIiKSsnZGlzYWJsZWQ9IiIgdHlwZT0iY2hlY2tib3giPid9cGFyYWdyYXBoKHt0b2tlbnM6ZX0pe3JldHVybmA8cD4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUpfTwvcD4KYH10YWJsZShlKXtsZXQgdD0iIixuPSIiO2ZvcihsZXQgbz0wO288ZS5oZWFkZXIubGVuZ3RoO28rKyluKz10aGlzLnRhYmxlY2VsbChlLmhlYWRlcltvXSk7dCs9dGhpcy50YWJsZXJvdyh7dGV4dDpufSk7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzxlLnJvd3MubGVuZ3RoO28rKyl7bGV0IGE9ZS5yb3dzW29dO249IiI7Zm9yKGxldCBpPTA7aTxhLmxlbmd0aDtpKyspbis9dGhpcy50YWJsZWNlbGwoYVtpXSk7cis9dGhpcy50YWJsZXJvdyh7dGV4dDpufSl9cmV0dXJuIHImJihyPWA8dGJvZHk+JHtyfTwvdGJvZHk+YCksYDx0YWJsZT4KPHRoZWFkPgpgK3QrYDwvdGhlYWQ+CmArcitgPC90YWJsZT4KYH10YWJsZXJvdyh7dGV4dDplfSl7cmV0dXJuYDx0cj4KJHtlfTwvdHI+CmB9dGFibGVjZWxsKGUpe2xldCB0PXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUudG9rZW5zKSxuPWUuaGVhZGVyPyJ0aCI6InRkIjtyZXR1cm4oZS5hbGlnbj9gPCR7bn0gYWxpZ249IiR7ZS5hbGlnbn0iPmA6YDwke259PmApK3QrYDwvJHtufT4KYH1zdHJvbmcoe3Rva2VuczplfSl7cmV0dXJuYDxzdHJvbmc+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L3N0cm9uZz5gfWVtKHt0b2tlbnM6ZX0pe3JldHVybmA8ZW0+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L2VtPmB9Y29kZXNwYW4oe3RleHQ6ZX0pe3JldHVybmA8Y29kZT4ke2JuKGUsITApfTwvY29kZT5gfWJyKGUpe3JldHVybiI8YnI+In1kZWwoe3Rva2VuczplfSl7cmV0dXJuYDxkZWw+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L2RlbD5gfWxpbmsoe2hyZWY6ZSx0aXRsZTp0LHRva2VuczpufSl7bGV0IHI9dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUobiksbz14dihlKTtpZihvPT09bnVsbClyZXR1cm4gcjtlPW87bGV0IGE9JzxhIGhyZWY9IicrZSsnIic7cmV0dXJuIHQmJihhKz0nIHRpdGxlPSInK2JuKHQpKyciJyksYSs9Ij4iK3IrIjwvYT4iLGF9aW1hZ2Uoe2hyZWY6ZSx0aXRsZTp0LHRleHQ6bix0b2tlbnM6cn0pe3ImJihuPXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHIsdGhpcy5wYXJzZXIudGV4dFJlbmRlcmVyKSk7bGV0IG89eHYoZSk7aWYobz09PW51bGwpcmV0dXJuIGJuKG4pO2U9bztsZXQgYT1gPGltZyBzcmM9IiR7ZX0iIGFsdD0iJHtufSJgO3JldHVybiB0JiYoYSs9YCB0aXRsZT0iJHtibih0KX0iYCksYSs9Ij4iLGF9dGV4dChlKXtyZXR1cm4idG9rZW5zImluIGUmJmUudG9rZW5zP3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUudG9rZW5zKToiZXNjYXBlZCJpbiBlJiZlLmVzY2FwZWQ/ZS50ZXh0OmJuKGUudGV4dCl9fSxhaT1jbGFzc3tzdHJvbmcoe3RleHQ6ZX0pe3JldHVybiBlfWVtKHt0ZXh0OmV9KXtyZXR1cm4gZX1jb2Rlc3Bhbih7dGV4dDplfSl7cmV0dXJuIGV9ZGVsKHt0ZXh0OmV9KXtyZXR1cm4gZX1odG1sKHt0ZXh0OmV9KXtyZXR1cm4gZX10ZXh0KHt0ZXh0OmV9KXtyZXR1cm4gZX1saW5rKHt0ZXh0OmV9KXtyZXR1cm4iIitlfWltYWdlKHt0ZXh0OmV9KXtyZXR1cm4iIitlfWJyKCl7cmV0dXJuIiJ9fSwkbj1jbGFzcyBBZHtvcHRpb25zO3JlbmRlcmVyO3RleHRSZW5kZXJlcjtjb25zdHJ1Y3Rvcih0KXt0aGlzLm9wdGlvbnM9dHx8cXIsdGhpcy5vcHRpb25zLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcnx8bmV3IHNsLHRoaXMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyLHRoaXMucmVuZGVyZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy5yZW5kZXJlci5wYXJzZXI9dGhpcyx0aGlzLnRleHRSZW5kZXJlcj1uZXcgYWl9c3RhdGljIHBhcnNlKHQsbil7cmV0dXJuIG5ldyBBZChuKS5wYXJzZSh0KX1zdGF0aWMgcGFyc2VJbmxpbmUodCxuKXtyZXR1cm4gbmV3IEFkKG4pLnBhcnNlSW5saW5lKHQpfXBhcnNlKHQsbj0hMCl7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2xldCBhPXRbb107aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnJlbmRlcmVycz8uW2EudHlwZV0pe2xldCBzPWEsbD10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbcy50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30scyk7aWYobCE9PSExfHwhWyJzcGFjZSIsImhyIiwiaGVhZGluZyIsImNvZGUiLCJ0YWJsZSIsImJsb2NrcXVvdGUiLCJsaXN0IiwiaHRtbCIsInBhcmFncmFwaCIsInRleHQiXS5pbmNsdWRlcyhzLnR5cGUpKXtyKz1sfHwiIjtjb250aW51ZX19bGV0IGk9YTtzd2l0Y2goaS50eXBlKXtjYXNlInNwYWNlIjp7cis9dGhpcy5yZW5kZXJlci5zcGFjZShpKTtjb250aW51ZX1jYXNlImhyIjp7cis9dGhpcy5yZW5kZXJlci5ocihpKTtjb250aW51ZX1jYXNlImhlYWRpbmciOntyKz10aGlzLnJlbmRlcmVyLmhlYWRpbmcoaSk7Y29udGludWV9Y2FzZSJjb2RlIjp7cis9dGhpcy5yZW5kZXJlci5jb2RlKGkpO2NvbnRpbnVlfWNhc2UidGFibGUiOntyKz10aGlzLnJlbmRlcmVyLnRhYmxlKGkpO2NvbnRpbnVlfWNhc2UiYmxvY2txdW90ZSI6e3IrPXRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShpKTtjb250aW51ZX1jYXNlImxpc3QiOntyKz10aGlzLnJlbmRlcmVyLmxpc3QoaSk7Y29udGludWV9Y2FzZSJodG1sIjp7cis9dGhpcy5yZW5kZXJlci5odG1sKGkpO2NvbnRpbnVlfWNhc2UicGFyYWdyYXBoIjp7cis9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgoaSk7Y29udGludWV9Y2FzZSJ0ZXh0Ijp7bGV0IHM9aSxsPXRoaXMucmVuZGVyZXIudGV4dChzKTtmb3IoO28rMTx0Lmxlbmd0aCYmdFtvKzFdLnR5cGU9PT0idGV4dCI7KXM9dFsrK29dLGwrPWAKYCt0aGlzLnJlbmRlcmVyLnRleHQocyk7bj9yKz10aGlzLnJlbmRlcmVyLnBhcmFncmFwaCh7dHlwZToicGFyYWdyYXBoIixyYXc6bCx0ZXh0OmwsdG9rZW5zOlt7dHlwZToidGV4dCIscmF3OmwsdGV4dDpsLGVzY2FwZWQ6ITB9XX0pOnIrPWw7Y29udGludWV9ZGVmYXVsdDp7bGV0IHM9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IocyksIiI7dGhyb3cgbmV3IEVycm9yKHMpfX19cmV0dXJuIHJ9cGFyc2VJbmxpbmUodCxuPXRoaXMucmVuZGVyZXIpe2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtsZXQgYT10W29dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthLnR5cGVdKXtsZXQgcz10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbYS50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30sYSk7aWYocyE9PSExfHwhWyJlc2NhcGUiLCJodG1sIiwibGluayIsImltYWdlIiwic3Ryb25nIiwiZW0iLCJjb2Rlc3BhbiIsImJyIiwiZGVsIiwidGV4dCJdLmluY2x1ZGVzKGEudHlwZSkpe3IrPXN8fCIiO2NvbnRpbnVlfX1sZXQgaT1hO3N3aXRjaChpLnR5cGUpe2Nhc2UiZXNjYXBlIjp7cis9bi50ZXh0KGkpO2JyZWFrfWNhc2UiaHRtbCI6e3IrPW4uaHRtbChpKTticmVha31jYXNlImxpbmsiOntyKz1uLmxpbmsoaSk7YnJlYWt9Y2FzZSJpbWFnZSI6e3IrPW4uaW1hZ2UoaSk7YnJlYWt9Y2FzZSJzdHJvbmciOntyKz1uLnN0cm9uZyhpKTticmVha31jYXNlImVtIjp7cis9bi5lbShpKTticmVha31jYXNlImNvZGVzcGFuIjp7cis9bi5jb2Rlc3BhbihpKTticmVha31jYXNlImJyIjp7cis9bi5icihpKTticmVha31jYXNlImRlbCI6e3IrPW4uZGVsKGkpO2JyZWFrfWNhc2UidGV4dCI6e3IrPW4udGV4dChpKTticmVha31kZWZhdWx0OntsZXQgcz0nVG9rZW4gd2l0aCAiJytpLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihzKSwiIjt0aHJvdyBuZXcgRXJyb3Iocyl9fX1yZXR1cm4gcn19LG9sPWNsYXNze29wdGlvbnM7YmxvY2s7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWV8fHFyfXN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzPW5ldyBTZXQoWyJwcmVwcm9jZXNzIiwicG9zdHByb2Nlc3MiLCJwcm9jZXNzQWxsVG9rZW5zIl0pO3ByZXByb2Nlc3MoZSl7cmV0dXJuIGV9cG9zdHByb2Nlc3MoZSl7cmV0dXJuIGV9cHJvY2Vzc0FsbFRva2VucyhlKXtyZXR1cm4gZX1wcm92aWRlTGV4ZXIoKXtyZXR1cm4gdGhpcy5ibG9jaz9Vbi5sZXg6VW4ubGV4SW5saW5lfXByb3ZpZGVQYXJzZXIoKXtyZXR1cm4gdGhpcy5ibG9jaz8kbi5wYXJzZTokbi5wYXJzZUlubGluZX19LEJrPWNsYXNze2RlZmF1bHRzPU9kKCk7b3B0aW9ucz10aGlzLnNldE9wdGlvbnM7cGFyc2U9dGhpcy5wYXJzZU1hcmtkb3duKCEwKTtwYXJzZUlubGluZT10aGlzLnBhcnNlTWFya2Rvd24oITEpO1BhcnNlcj0kbjtSZW5kZXJlcj1zbDtUZXh0UmVuZGVyZXI9YWk7TGV4ZXI9VW47VG9rZW5pemVyPWlsO0hvb2tzPW9sO2NvbnN0cnVjdG9yKC4uLmUpe3RoaXMudXNlKC4uLmUpfXdhbGtUb2tlbnMoZSx0KXtsZXQgbj1bXTtmb3IobGV0IHIgb2YgZSlzd2l0Y2gobj1uLmNvbmNhdCh0LmNhbGwodGhpcyxyKSksci50eXBlKXtjYXNlInRhYmxlIjp7bGV0IG89cjtmb3IobGV0IGEgb2Ygby5oZWFkZXIpbj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoYS50b2tlbnMsdCkpO2ZvcihsZXQgYSBvZiBvLnJvd3MpZm9yKGxldCBpIG9mIGEpbj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoaS50b2tlbnMsdCkpO2JyZWFrfWNhc2UibGlzdCI6e2xldCBvPXI7bj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoby5pdGVtcyx0KSk7YnJlYWt9ZGVmYXVsdDp7bGV0IG89cjt0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnM/LmNoaWxkVG9rZW5zPy5bby50eXBlXT90aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbby50eXBlXS5mb3JFYWNoKGE9PntsZXQgaT1vW2FdLmZsYXQoMS8wKTtuPW4uY29uY2F0KHRoaXMud2Fsa1Rva2VucyhpLHQpKX0pOm8udG9rZW5zJiYobj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoby50b2tlbnMsdCkpKX19cmV0dXJuIG59dXNlKC4uLmUpe2xldCB0PXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9uc3x8e3JlbmRlcmVyczp7fSxjaGlsZFRva2Vuczp7fX07cmV0dXJuIGUuZm9yRWFjaChuPT57bGV0IHI9ey4uLm59O2lmKHIuYXN5bmM9dGhpcy5kZWZhdWx0cy5hc3luY3x8ci5hc3luY3x8ITEsbi5leHRlbnNpb25zJiYobi5leHRlbnNpb25zLmZvckVhY2gobz0+e2lmKCFvLm5hbWUpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbmFtZSByZXF1aXJlZCIpO2lmKCJyZW5kZXJlciJpbiBvKXtsZXQgYT10LnJlbmRlcmVyc1tvLm5hbWVdO2E/dC5yZW5kZXJlcnNbby5uYW1lXT1mdW5jdGlvbiguLi5pKXtsZXQgcz1vLnJlbmRlcmVyLmFwcGx5KHRoaXMsaSk7cmV0dXJuIHM9PT0hMSYmKHM9YS5hcHBseSh0aGlzLGkpKSxzfTp0LnJlbmRlcmVyc1tvLm5hbWVdPW8ucmVuZGVyZXJ9aWYoInRva2VuaXplciJpbiBvKXtpZighby5sZXZlbHx8by5sZXZlbCE9PSJibG9jayImJm8ubGV2ZWwhPT0iaW5saW5lIil0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSciKTtsZXQgYT10W28ubGV2ZWxdO2E/YS51bnNoaWZ0KG8udG9rZW5pemVyKTp0W28ubGV2ZWxdPVtvLnRva2VuaXplcl0sby5zdGFydCYmKG8ubGV2ZWw9PT0iYmxvY2siP3Quc3RhcnRCbG9jaz90LnN0YXJ0QmxvY2sucHVzaChvLnN0YXJ0KTp0LnN0YXJ0QmxvY2s9W28uc3RhcnRdOm8ubGV2ZWw9PT0iaW5saW5lIiYmKHQuc3RhcnRJbmxpbmU/dC5zdGFydElubGluZS5wdXNoKG8uc3RhcnQpOnQuc3RhcnRJbmxpbmU9W28uc3RhcnRdKSl9ImNoaWxkVG9rZW5zImluIG8mJm8uY2hpbGRUb2tlbnMmJih0LmNoaWxkVG9rZW5zW28ubmFtZV09by5jaGlsZFRva2Vucyl9KSxyLmV4dGVuc2lvbnM9dCksbi5yZW5kZXJlcil7bGV0IG89dGhpcy5kZWZhdWx0cy5yZW5kZXJlcnx8bmV3IHNsKHRoaXMuZGVmYXVsdHMpO2ZvcihsZXQgYSBpbiBuLnJlbmRlcmVyKXtpZighKGEgaW4gbykpdGhyb3cgbmV3IEVycm9yKGByZW5kZXJlciAnJHthfScgZG9lcyBub3QgZXhpc3RgKTtpZihbIm9wdGlvbnMiLCJwYXJzZXIiXS5pbmNsdWRlcyhhKSljb250aW51ZTtsZXQgaT1hLHM9bi5yZW5kZXJlcltpXSxsPW9baV07b1tpXT0oLi4udSk9PntsZXQgYz1zLmFwcGx5KG8sdSk7cmV0dXJuIGM9PT0hMSYmKGM9bC5hcHBseShvLHUpKSxjfHwiIn19ci5yZW5kZXJlcj1vfWlmKG4udG9rZW5pemVyKXtsZXQgbz10aGlzLmRlZmF1bHRzLnRva2VuaXplcnx8bmV3IGlsKHRoaXMuZGVmYXVsdHMpO2ZvcihsZXQgYSBpbiBuLnRva2VuaXplcil7aWYoIShhIGluIG8pKXRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke2F9JyBkb2VzIG5vdCBleGlzdGApO2lmKFsib3B0aW9ucyIsInJ1bGVzIiwibGV4ZXIiXS5pbmNsdWRlcyhhKSljb250aW51ZTtsZXQgaT1hLHM9bi50b2tlbml6ZXJbaV0sbD1vW2ldO29baV09KC4uLnUpPT57bGV0IGM9cy5hcHBseShvLHUpO3JldHVybiBjPT09ITEmJihjPWwuYXBwbHkobyx1KSksY319ci50b2tlbml6ZXI9b31pZihuLmhvb2tzKXtsZXQgbz10aGlzLmRlZmF1bHRzLmhvb2tzfHxuZXcgb2w7Zm9yKGxldCBhIGluIG4uaG9va3Mpe2lmKCEoYSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoYGhvb2sgJyR7YX0nIGRvZXMgbm90IGV4aXN0YCk7aWYoWyJvcHRpb25zIiwiYmxvY2siXS5pbmNsdWRlcyhhKSljb250aW51ZTtsZXQgaT1hLHM9bi5ob29rc1tpXSxsPW9baV07b2wucGFzc1Rocm91Z2hIb29rcy5oYXMoYSk/b1tpXT11PT57aWYodGhpcy5kZWZhdWx0cy5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMuY2FsbChvLHUpKS50aGVuKGQ9PmwuY2FsbChvLGQpKTtsZXQgYz1zLmNhbGwobyx1KTtyZXR1cm4gbC5jYWxsKG8sYyl9Om9baV09KC4uLnUpPT57bGV0IGM9cy5hcHBseShvLHUpO3JldHVybiBjPT09ITEmJihjPWwuYXBwbHkobyx1KSksY319ci5ob29rcz1vfWlmKG4ud2Fsa1Rva2Vucyl7bGV0IG89dGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zLGE9bi53YWxrVG9rZW5zO3Iud2Fsa1Rva2Vucz1mdW5jdGlvbihpKXtsZXQgcz1bXTtyZXR1cm4gcy5wdXNoKGEuY2FsbCh0aGlzLGkpKSxvJiYocz1zLmNvbmNhdChvLmNhbGwodGhpcyxpKSkpLHN9fXRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4ucn19KSx0aGlzfXNldE9wdGlvbnMoZSl7cmV0dXJuIHRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4uZX0sdGhpc31sZXhlcihlLHQpe3JldHVybiBVbi5sZXgoZSx0Pz90aGlzLmRlZmF1bHRzKX1wYXJzZXIoZSx0KXtyZXR1cm4gJG4ucGFyc2UoZSx0Pz90aGlzLmRlZmF1bHRzKX1wYXJzZU1hcmtkb3duKGUpe3JldHVybihuLHIpPT57bGV0IG89ey4uLnJ9LGE9ey4uLnRoaXMuZGVmYXVsdHMsLi4ub30saT10aGlzLm9uRXJyb3IoISFhLnNpbGVudCwhIWEuYXN5bmMpO2lmKHRoaXMuZGVmYXVsdHMuYXN5bmM9PT0hMCYmby5hc3luYz09PSExKXJldHVybiBpKG5ldyBFcnJvcigibWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gUmVtb3ZlIGFzeW5jOiBmYWxzZSBmcm9tIHRoZSBwYXJzZSBvcHRpb25zIG9iamVjdCB0byByZXR1cm4gYSBQcm9taXNlLiIpKTtpZih0eXBlb2Ygbj4idSJ8fG49PT1udWxsKXJldHVybiBpKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCIpKTtpZih0eXBlb2YgbiE9InN0cmluZyIpcmV0dXJuIGkobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgIitPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikrIiwgc3RyaW5nIGV4cGVjdGVkIikpO2EuaG9va3MmJihhLmhvb2tzLm9wdGlvbnM9YSxhLmhvb2tzLmJsb2NrPWUpO2xldCBzPWEuaG9va3M/YS5ob29rcy5wcm92aWRlTGV4ZXIoKTplP1VuLmxleDpVbi5sZXhJbmxpbmUsbD1hLmhvb2tzP2EuaG9va3MucHJvdmlkZVBhcnNlcigpOmU/JG4ucGFyc2U6JG4ucGFyc2VJbmxpbmU7aWYoYS5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEuaG9va3M/YS5ob29rcy5wcmVwcm9jZXNzKG4pOm4pLnRoZW4odT0+cyh1LGEpKS50aGVuKHU9PmEuaG9va3M/YS5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHUpOnUpLnRoZW4odT0+YS53YWxrVG9rZW5zP1Byb21pc2UuYWxsKHRoaXMud2Fsa1Rva2Vucyh1LGEud2Fsa1Rva2VucykpLnRoZW4oKCk9PnUpOnUpLnRoZW4odT0+bCh1LGEpKS50aGVuKHU9PmEuaG9va3M/YS5ob29rcy5wb3N0cHJvY2Vzcyh1KTp1KS5jYXRjaChpKTt0cnl7YS5ob29rcyYmKG49YS5ob29rcy5wcmVwcm9jZXNzKG4pKTtsZXQgdT1zKG4sYSk7YS5ob29rcyYmKHU9YS5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHUpKSxhLndhbGtUb2tlbnMmJnRoaXMud2Fsa1Rva2Vucyh1LGEud2Fsa1Rva2Vucyk7bGV0IGM9bCh1LGEpO3JldHVybiBhLmhvb2tzJiYoYz1hLmhvb2tzLnBvc3Rwcm9jZXNzKGMpKSxjfWNhdGNoKHUpe3JldHVybiBpKHUpfX19b25FcnJvcihlLHQpe3JldHVybiBuPT57aWYobi5tZXNzYWdlKz1gClBsZWFzZSByZXBvcnQgdGhpcyB0byBodHRwczovL2dpdGh1Yi5jb20vbWFya2VkanMvbWFya2VkLmAsZSl7bGV0IHI9IjxwPkFuIGVycm9yIG9jY3VycmVkOjwvcD48cHJlPiIrYm4obi5tZXNzYWdlKyIiLCEwKSsiPC9wcmU+IjtyZXR1cm4gdD9Qcm9taXNlLnJlc29sdmUocik6cn1pZih0KXJldHVybiBQcm9taXNlLnJlamVjdChuKTt0aHJvdyBufX19LFlyPW5ldyBCaztmdW5jdGlvbiB1ZShlLHQpe3JldHVybiBZci5wYXJzZShlLHQpfXVlLm9wdGlvbnM9dWUuc2V0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gWXIuc2V0T3B0aW9ucyhlKSx1ZS5kZWZhdWx0cz1Zci5kZWZhdWx0cyxFdih1ZS5kZWZhdWx0cyksdWV9O3VlLmdldERlZmF1bHRzPU9kO3VlLmRlZmF1bHRzPXFyO3VlLnVzZT1mdW5jdGlvbiguLi5lKXtyZXR1cm4gWXIudXNlKC4uLmUpLHVlLmRlZmF1bHRzPVlyLmRlZmF1bHRzLEV2KHVlLmRlZmF1bHRzKSx1ZX07dWUud2Fsa1Rva2Vucz1mdW5jdGlvbihlLHQpe3JldHVybiBZci53YWxrVG9rZW5zKGUsdCl9O3VlLnBhcnNlSW5saW5lPVlyLnBhcnNlSW5saW5lO3VlLlBhcnNlcj0kbjt1ZS5wYXJzZXI9JG4ucGFyc2U7dWUuUmVuZGVyZXI9c2w7dWUuVGV4dFJlbmRlcmVyPWFpO3VlLkxleGVyPVVuO3VlLmxleGVyPVVuLmxleDt1ZS5Ub2tlbml6ZXI9aWw7dWUuSG9va3M9b2w7dWUucGFyc2U9dWU7dmFyIE4yPXVlLm9wdGlvbnMsRDI9dWUuc2V0T3B0aW9ucyxfMj11ZS51c2UsQzI9dWUud2Fsa1Rva2VucyxQdj11ZS5wYXJzZUlubGluZTt2YXIgQTI9JG4ucGFyc2UsTzI9VW4ubGV4O3VlLnVzZSh7YnJlYWtzOiEwLGdmbTohMCxyZW5kZXJlcjp7bGluayh7aHJlZjplLHRpdGxlOnQsdGV4dDpufSl7bGV0IHI9dD9gIHRpdGxlPSIke3R9ImA6IiI7cmV0dXJuYDxhIGhyZWY9IiR7ZX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiJHtyfT4ke259PC9hPmB9fX0pO2Z1bmN0aW9uIFZvKGUpe3JldHVybiBlP3VlLnBhcnNlSW5saW5lKGUpOiIifWZ1bmN0aW9uIFVkKGUpe3JldHVybiBlP3VlLnBhcnNlKGUpOiIifWZ1bmN0aW9uIEx2KGUpe2lmKCFlKXJldHVybiIiO2xldCB0PWUucmVwbGFjZSgvXFsoW15cXV0rKVxdXFtcXj9cZCtcXS9nLCIkMSIpLnJlcGxhY2UoL1xbXF5bXlxdXSpcXS9nLCIiKS5yZXBsYWNlKC89PShbXj1dKyk9PS9nLCIkMSIpO3JldHVybiBQdih0LHtyZW5kZXJlcjpuZXcgYWl9KS50cmltKCl9dmFyICR2PXhlKHdlKCkpO3ZhciB2ZT14ZSh3ZSgpKSxXaz0yZTMsJGQ9ImRhc2hib2FyZDp3aWRnZXQtZHJhZy1yZWFkeSIsenY9MjIwO2Z1bmN0aW9uIEhrKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudD8hIWUuY2xvc2VzdCgiYnV0dG9uLCBhLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgW3JvbGU9J2J1dHRvbiddIik6ITF9ZnVuY3Rpb24gamsoZSx0LG4pe2lmKCFBcnJheS5pc0FycmF5KGUpfHwhdHx8IW58fHQ9PT1uKXJldHVybiBlO2xldCByPWUuZmluZEluZGV4KGw9Pmw/LndpZGdldElkPT09dCksbz1lLmZpbmRJbmRleChsPT5sPy53aWRnZXRJZD09PW4pO2lmKHI8MHx8bzwwfHxyPT09bylyZXR1cm4gZTtsZXQgYT1bLi4uZV0sW2ldPWEuc3BsaWNlKHIsMSkscz1yPG8/by0xOm87cmV0dXJuIGEuc3BsaWNlKHMsMCxpKSxhfWZ1bmN0aW9uIFZrKCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4gbmV3IE1hcDtsZXQgZT1uZXcgTWFwO3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZGFzaGJvYXJkLWdyaWQgLmdyaWQtY2VsbFtkYXRhLXdpZGdldC1pZF0iKS5mb3JFYWNoKG49PntsZXQgcj1uLmdldEF0dHJpYnV0ZSgiZGF0YS13aWRnZXQtaWQiKTtyJiZlLnNldChyLG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfSksZX1mdW5jdGlvbiBHayhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIE1hcCl8fGUuc2l6ZT09PTB8fHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuO2xldCBuPVtdO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpLmZvckVhY2gobz0+e2xldCBhPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXdpZGdldC1pZCIpO2lmKCFhfHxhPT09dClyZXR1cm47bGV0IGk9ZS5nZXQoYSk7aWYoIWkpcmV0dXJuO2xldCBzPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbD1pLmxlZnQtcy5sZWZ0LHU9aS50b3Atcy50b3A7TWF0aC5hYnMobCk8MSYmTWF0aC5hYnModSk8MXx8KG8uc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsby5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1mbGlwLXgiLGAke2x9cHhgKSxvLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteSIsYCR7dX1weGApLG4ucHVzaChvKSl9KSxuLmxlbmd0aCE9PTAmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntuLmZvckVhY2gobz0+e28uc3R5bGUudHJhbnNpdGlvbj1gdHJhbnNmb3JtICR7enZ9bXMgZWFzZWAsby5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1mbGlwLXgiLCIwcHgiKSxvLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteSIsIjBweCIpfSksd2luZG93LnNldFRpbWVvdXQoKCk9PntuLmZvckVhY2gobz0+by5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpKX0senYrNDApfSl9ZnVuY3Rpb24gRnYoZSl7cmV0dXJuKGV8fFtdKS5tYXAodD0+dD8ud2lkZ2V0SWQpLmZpbHRlcihCb29sZWFuKS5qb2luKCJ8Iil9ZnVuY3Rpb24gVXYoZSx0KXtsZXRbbixyXT0oMCx2ZS51c2VTdGF0ZSkobnVsbCksW28sYV09KDAsdmUudXNlU3RhdGUpKGUpLGk9KDAsdmUudXNlUmVmKShlKSxzPSgwLHZlLnVzZVJlZikobnVsbCk7KDAsdmUudXNlRWZmZWN0KSgoKT0+e258fGEoZSl9LFtlLG5dKSwoMCx2ZS51c2VFZmZlY3QpKCgpPT57aS5jdXJyZW50PW99LFtvXSksKDAsdmUudXNlTGF5b3V0RWZmZWN0KSgoKT0+e2xldCB1PXMuY3VycmVudDshbnx8IXV8fChzLmN1cnJlbnQ9bnVsbCxHayh1LG4pKX0sW28sbl0pLCgwLHZlLnVzZUVmZmVjdCkoKCk9PntsZXQgdT1jPT57bGV0IGQ9Yz8uZGV0YWlsPy53aWRnZXRJZDtkJiYocihkKSxhKHA9PkFycmF5LmlzQXJyYXkocCkmJnAubGVuZ3RoP3A6ZSkpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJGQsdSksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCRkLHUpfSxbZV0pO2xldCBsPSgwLHZlLnVzZUNhbGxiYWNrKSgoKT0+e2lmKCFuKXJldHVybjtsZXQgdT1GdihlKSxjPUZ2KGkuY3VycmVudCk7cihudWxsKSxjJiZ1IT09YyYmdChpLmN1cnJlbnQubWFwKGQ9PmQud2lkZ2V0SWQpKX0sW2Usbix0XSk7cmV0dXJuKDAsdmUudXNlRWZmZWN0KSgoKT0+e2lmKCFuKXJldHVybjtsZXQgdT1wPT57aWYoKHAuYnV0dG9ucyYxKSE9PTEpe2woKTtyZXR1cm59bGV0IHk9ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChwLmNsaWVudFgscC5jbGllbnRZKT8uY2xvc2VzdD8uKCIuZGFzaGJvYXJkLWdyaWQgLmdyaWQtY2VsbFtkYXRhLXdpZGdldC1pZF0iKT8uZ2V0QXR0cmlidXRlPy4oImRhdGEtd2lkZ2V0LWlkIik7aWYoIXl8fHk9PT1uKXJldHVybjtsZXQgYj1WaygpO2EoaD0+e2xldCBtPWprKGgsbix5KTtyZXR1cm4gbSE9PWgmJihzLmN1cnJlbnQ9YiksbX0pfSxjPSgpPT5sKCksZD0oKT0+bCgpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix1KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGQpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGMpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIixkKX19LFtuLGxdKSx7ZHJhZ2dpbmdXaWRnZXRJZDpuLGRpc3BsYXllZENvbXBvbmVudHM6b319ZnVuY3Rpb24gQmQoe2NvbmZpZ3VyYWJsZTplLGhlYWRlckFjdGlvbnM6dCxpY29uOm4sb25Db25maWd1cmU6cixzdWJ0aXRsZTpvLHRpdGxlOmEsd2lkZ2V0SWQ6aX0pe2xldCBzPSgwLHZlLnVzZVJlZikobnVsbCksbD0oMCx2ZS51c2VSZWYpKG51bGwpLHU9KDAsdmUudXNlUmVmKSghMSksYz0oMCx2ZS51c2VNZW1vKSgoKT0+KHt3aWRnZXRJZDppfSksW2ldKTtyZXR1cm4oMCx2ZS51c2VFZmZlY3QpKCgpPT57bGV0IGQ9cy5jdXJyZW50O2lmKCFkKXJldHVybjtsZXQgcD0oKT0+e2wuY3VycmVudCE9bnVsbCYmKHdpbmRvdy5jbGVhclRpbWVvdXQobC5jdXJyZW50KSxsLmN1cnJlbnQ9bnVsbCl9LGc9Yj0+e2QuY2xhc3NMaXN0LnRvZ2dsZSgid2lkZ2V0LWhlYWRpbmctYmFyLS1kcmFnLXJlYWR5IiwhIWIpfSx2PWI9PntiLmJ1dHRvbj09PTAmJihIayhiLnRhcmdldCl8fCh1LmN1cnJlbnQ9ITEsZyghMSkscCgpLGwuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+e3UuY3VycmVudD0hMCxnKCEwKSx3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJGQse2RldGFpbDpjfSkpfSxXaykpKX0seT0oKT0+e3AoKSx1LmN1cnJlbnQ9ITEsZyghMSl9O3JldHVybiBkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix5KSwoKT0+e3AoKSxnKCExKSxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdiksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix5KX19LFtjXSksKDAsdmUuY3JlYXRlRWxlbWVudCkoImRpdiIse3JlZjpzLGNsYXNzTmFtZToid2lkZ2V0LWhlYWRlciB3aWRnZXQtaGVhZGluZy1iYXIifSwoMCx2ZS5jcmVhdGVFbGVtZW50KSgic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LWljb24ifSxuKSwoMCx2ZS5jcmVhdGVFbGVtZW50KSgiaDMiLHtjbGFzc05hbWU6IndpZGdldC10aXRsZSJ9LCgwLHZlLmNyZWF0ZUVsZW1lbnQpKCJzcGFuIix7Y2xhc3NOYW1lOiJ3aWRnZXQtdGl0bGVfX2xhYmVsIn0sYSksbz8oMCx2ZS5jcmVhdGVFbGVtZW50KSgic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlX19zdWJ0aXRsZSJ9LG8pOm51bGwpLHR8fG51bGwsZT8oMCx2ZS5jcmVhdGVFbGVtZW50KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ3aWRnZXQtY29uZmlndXJlIixvbkNsaWNrOnJ9LCJcdTI2OTkgQ29uZmlndXJlIik6bnVsbCl9ZnVuY3Rpb24gY2Uoe2FwcDplLGNoaWxkcmVuOnQsY29uZmlndXJhYmxlOm4sZ3JpZEhlaWdodFNpemU6cixncmlkV2lkdGhTaXplOm8saGVhZGVyQWN0aW9uczphLGljb246aSxvbkNvbmZpZ3VyZTpzLHN1YnRpdGxlOmwsdGl0bGU6dSx3aWRnZXRJZDpjfSl7bGV0IGQ9JHYuZGVmYXVsdC5jcmVhdGVFbGVtZW50LHA9YXN5bmMoKT0+e3M/cygpOmUmJmF3YWl0IGUuY29uZmlndXJlKGMpJiZ3aW5kb3cubG9jYXRpb24ucmVsb2FkKCl9LGc9TnVtYmVyKG8pPjA/TnVtYmVyKG8pOjEsdj1OdW1iZXIocik+MD9OdW1iZXIocik6MSx5PWBob3Jpem9udGFsLSR7Z30tY2VsbCB2ZXJ0aWNhbC0ke3Z9LWNlbGxgO3JldHVybiBkKCJkaXYiLHtjbGFzc05hbWU6YHdpZGdldCB3aWRnZXQtJHtjfSAke3l9YH0sZChCZCx7Y29uZmlndXJhYmxlOm4saGVhZGVyQWN0aW9uczphLGljb246aSxzdWJ0aXRsZTpsLHRpdGxlOnUsd2lkZ2V0SWQ6YyxvbkNvbmZpZ3VyZTpwfSksZCgiZGl2Iix7Y2xhc3NOYW1lOiJ3aWRnZXQtYm9keSJ9LHQpKX1hc3luYyBmdW5jdGlvbiBLayhlLHQpe3JldHVybiB0Lm5vdGVVVUlEP2F3YWl0IG5sKGUsdC5ub3RlVVVJRCk6YXdhaXQgZ3YoZSx0KX1hc3luYyBmdW5jdGlvbiBCdihlLHQse2FjdGl2ZVRhYjpuLHNldEFjdGl2ZVRhYjpyLHNldE1vbnRoTG9hZGluZzpvLHNldE1vbnRoQ29udGVudDphfSl7aWYobj09PXQuaW5kZXgpe3IobnVsbCksYShudWxsKTtyZXR1cm59cih0LmluZGV4KSxvKCEwKSxhKG51bGwpO2xldCBpPXQucGxhbi5ub3RlVVVJRDt0cnl7aWYoIWkpYSh7Zm91bmQ6ITEscGxhbjp0LnBsYW4sbW9udGhOYW1lOnQuZnVsbCx5ZWFyOnQucGxhbi55ZWFyfSk7ZWxzZXtsZXQgcz1hd2FpdCBOZChlLGksdC5mdWxsKTtBKGBbUGxhbm5pbmddIFJhdyBtYXJrZG93biBmb3IgJHt0LmZ1bGx9OmAscz8uY29udGVudCksYSh7Li4ucyxwbGFuOnQucGxhbixtb250aE5hbWU6dC5mdWxsLHllYXI6dC5wbGFuLnllYXJ9KX19Y2F0Y2h7YSh7Zm91bmQ6ITEscGxhbjp0LnBsYW4sbW9udGhOYW1lOnQuZnVsbCx5ZWFyOnQucGxhbi55ZWFyfSl9ZmluYWxseXtvKCExKX19YXN5bmMgZnVuY3Rpb24gWWsoZSx0LHtzZXRNb250aExvYWRpbmc6bixzZXRNb250aENvbnRlbnQ6cn0pe2lmKHQpe24oITApO3RyeXtsZXQgbz1hd2FpdCBtdihlLHQucGxhbix0Lm1vbnRoTmFtZSk7aWYobyYmby5ub3RlVVVJRClyZXR1cm4gcihhPT4oey4uLmEsZm91bmQ6ITAsY29udGVudDpvLmNvbnRlbnR8fCIifSkpLGF3YWl0IG5sKGUsby5ub3RlVVVJRCl9Y2F0Y2h7fWZpbmFsbHl7bighMSl9fX1hc3luYyBmdW5jdGlvbiBxayhlLHQsbixyLG8pe3IoITApO3RyeXtsZXQgYT1hd2FpdCBodihlLHQsbik7aWYoYT8ubm90ZVVVSUQpcmV0dXJuIG8oe2ZvdW5kOiEwLGNvbnRlbnQ6YS5jb250ZW50fHwiIn0pLGF3YWl0IG5sKGUsYS5ub3RlVVVJRCl9Y2F0Y2h7fWZpbmFsbHl7cighMSl9fWZ1bmN0aW9uIFFrKGUsdCxuKXtsZXQgcj0hIXQubm90ZVVVSUQsbz0hIXQuaGFzQWxsTW9udGhseURldGFpbHMsYT0icXVhcnRlci1jYXJkIisocj8iIHF1YXJ0ZXItY2FyZC0taGFzLXBsYW4iOiIiKSxpPW8/Ilx1MjcwNSI6Ilx1ezFGNkE3fSIscz1vPyJBbGwgMyBtb250aHMgaW4gdGhpcyBxdWFydGVyIGhhdmUgYmVlbiBwbGFubmVkLiI6Ik1vbnRobHkgZGV0YWlscyBhcmUgbWlzc2luZyBmb3Igb25lIG9yIG1vcmUgbW9udGhzIFx1MjAxNCB0aGlzIHBsYW4gaXMgYSB3b3JrIGluIHByb2dyZXNzLiI7cmV0dXJuIGUoImRpdiIse2tleTp0LmxhYmVsLGNsYXNzTmFtZTphLG9uQ2xpY2s6bn0sZSgic3BhbiIse2NsYXNzTmFtZToicXVhcnRlci1sYWJlbCJ9LHQubGFiZWwpLGUoImRpdiIse2NsYXNzTmFtZToicXVhcnRlci1zdGF0dXMtcm93In0sZSgic3BhbiIse2NsYXNzTmFtZToicXVhcnRlci1zdGF0dXMifSxyPyJcdXsxRjRERH0gT3BlbiBQbGFuIjoiKyBDcmVhdGUgUGxhbiIpLHI/ZShrZCx7Y29udGVudDpzLHBsYWNlbWVudDoiYm90dG9tIn0sZSgic3BhbiIse2NsYXNzTmFtZToicXVhcnRlci1wbGFuLWluZGljYXRvciIsb25DbGljazpsPT5sLnN0b3BQcm9wYWdhdGlvbigpfSxpKSk6bnVsbCkpfWZ1bmN0aW9uIEprKGUsdCxuLHIpe3JldHVybiB0P2UoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1sb2FkaW5nIn0sIkxvYWRpbmdcdTIwMjYiKTpuP24uZm91bmQ/ZSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50In0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LWhlYWRlciJ9LG4ubW9udGhOYW1lKSxlKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpVZChuLmNvbnRlbnQpfHwiPHA+KEVtcHR5IHNlY3Rpb24pPC9wPiJ9fSkpOmUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1lbXB0eSJ9LGUoImJ1dHRvbiIse2NsYXNzTmFtZToiY3JlYXRlLW1vbnRoLXBsYW4tbGluayIsb25DbGljazpyfSxgQ3JlYXRlIGEgcGxhbiBmb3IgJHtuLm1vbnRoTmFtZX0gJHtuLnllYXJ9YCkpOm51bGx9ZnVuY3Rpb24gWGsoZSx0LG4scixvLGEpe3JldHVybiByP2UoImRpdiIse2NsYXNzTmFtZToid2Vla2x5LXBsYW4tc2VjdGlvbiJ9LGUoImRpdiIse2NsYXNzTmFtZToid2Vla2x5LXBsYW4tbG9hZGluZyJ9LCJMb2FkaW5nXHUyMDI2IikpOm8/LmZvdW5kP2UoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1hcmVhIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50In0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LWhlYWRlciJ9LHQpLGUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC10ZXh0IixkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOlVkKG8uY29udGVudCl8fCI8cD4oRW1wdHkgc2VjdGlvbik8L3A+In19KSkpOmUoImRpdiIse2NsYXNzTmFtZToid2Vla2x5LXBsYW4tc2VjdGlvbiJ9LGUoImRpdiIse2NsYXNzTmFtZToid2Vla2x5LXBsYW4taGVhZGVyIn0sIldlZWtseSBQbGFuIiksZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjcmVhdGUtd2Vlay1wbGFuLWxpbmsiLG9uQ2xpY2s6YX0sYENyZWF0ZSBhIHdlZWtseSBwbGFuIGZvciAke3R9LCAke259YCkpfWZ1bmN0aW9uIFdkKHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTp0PTEscXVhcnRlcmx5UGxhbnM6bn0pe2xldCByPVJ0LmNyZWF0ZUVsZW1lbnQsW28sYV09KDAsUnQudXNlU3RhdGUpKG51bGwpLFtpLHNdPSgwLFJ0LnVzZVN0YXRlKShudWxsKSxbbCx1XT0oMCxSdC51c2VTdGF0ZSkoITEpLFtjLGRdPSgwLFJ0LnVzZVN0YXRlKShudWxsKSxbcCxnXT0oMCxSdC51c2VTdGF0ZSkoITEpLFt2LHldPSgwLFJ0LnVzZVN0YXRlKSghMSksW2IsaF09KDAsUnQudXNlU3RhdGUpKG51bGwpLG09dD49MjtpZihiJiZQbilyZXR1cm4gcihjZSx7dGl0bGU6bGUoInBsYW5uaW5nIiksaWNvbjoiXHV7MUY0Q0J9Iix3aWRnZXRJZDoicGxhbm5pbmcifSxyKERkLHthcHA6ZSxub3RlVVVJRDpiLG9uQmFjazooKT0+aChudWxsKX0pKTtpZighbj8uY3VycmVudHx8IW4/Lm5leHQpcmV0dXJuIHIoY2Use3RpdGxlOmxlKCJwbGFubmluZyIpLGljb246Ilx1ezFGNENCfSIsd2lkZ2V0SWQ6InBsYW5uaW5nIn0scigicCIse2NsYXNzTmFtZToicGxhbm5pbmctZW1wdHkifSwiTG9hZGluZyBxdWFydGVybHkgcGxhbnNcdTIwMjYiKSk7bGV0IHc9dmcobi5jdXJyZW50LG4ubmV4dCksZj17YWN0aXZlVGFiOm8sc2V0QWN0aXZlVGFiOmEsc2V0TW9udGhMb2FkaW5nOnUsc2V0TW9udGhDb250ZW50OnN9LFQ9e3NldE1vbnRoTG9hZGluZzp1LHNldE1vbnRoQ29udGVudDpzfSxTPUM9PntDPy5kZXZFZGl0JiZDLm5vdGVVVUlEJiZoKEMubm90ZVVVSUQpfSxEPWpzKCksTj1WcyhEKTtyZXR1cm4oMCxSdC51c2VFZmZlY3QpKCgpPT57aWYodilyZXR1cm47bGV0IEM9dy5maW5kKHg9PnguY3VycmVudCk7QyYmKHkoITApLEJ2KGUsQyxmKSl9LFt2XSksKDAsUnQudXNlRWZmZWN0KSgoKT0+e2lmKCFtKXJldHVybjtsZXQgQz1uLmN1cnJlbnQ/Lm5vdGVVVUlEO0MmJihnKCEwKSxOZChlLEMsTikudGhlbih4PT57QShgW1BsYW5uaW5nXSBXZWVrbHkgc2VjdGlvbiAiJHtOfSI6YCx4KSxkKHgpfSkuY2F0Y2goKCk9PmQoe2ZvdW5kOiExLGNvbnRlbnQ6bnVsbH0pKS5maW5hbGx5KCgpPT5nKCExKSkpfSxbbSxuLmN1cnJlbnQ/Lm5vdGVVVUlELE5dKSxyKGNlLHt0aXRsZTpsZSgicGxhbm5pbmciKSxpY29uOiJcdXsxRjRDQn0iLHdpZGdldElkOiJwbGFubmluZyJ9LHIoImRpdiIse2NsYXNzTmFtZToicGxhbm5pbmctcXVhcnRlcnMifSxbbi5jdXJyZW50LG4ubmV4dF0ubWFwKEM9PlFrKHIsQyxhc3luYygpPT57bGV0IHg9YXdhaXQgS2soZSxDKTtTKHgpfSkpKSxyKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLXRhYnMifSx3Lm1hcChDPT5yKCJidXR0b24iLHtrZXk6Qy5pbmRleCxjbGFzc05hbWU6Im1vbnRoLXRhYiIrKEMuaW5kZXg9PT1vPyIgYWN0aXZlIjoiIiksb25DbGljazooKT0+QnYoZSxDLGYpfSxDLnNob3J0KSkpLG8hPT1udWxsP3IoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1hcmVhIn0sSmsocixsLGksYXN5bmMoKT0+e2xldCBDPWF3YWl0IFlrKGUsaSxUKTtTKEMpfSkpOm51bGwsbT9YayhyLE4sbi5jdXJyZW50LnllYXIscCxjLGFzeW5jKCk9PntsZXQgQz1hd2FpdCBxayhlLG4uY3VycmVudCxOLGcsZCk7UyhDKX0pOm51bGwpfXZhciBCbj14ZSh3ZSgpKTt2YXIgWms9L1xbKFteXF1dKylcXVxbXF4/KFxkKylcXS9nLFd2PS9ccypcW1xePyhcZCspXF1bLjpdXHMqLyxlMT0vXiFcWyhbXlxdXSopXF1cKChbXildKylcKS8sdDE9L15cWyhbXlxdXSopXF1cKChbXildKilcKS8sbjE9L1wuKG1wNHx3ZWJtfG9nZykoXD98JCkvaSxqdj0vKD86eW91dHViZVwuY29tXC93YXRjaFw/dj18eW91dHVcLmJlXC8pKFthLXpBLVowLTlfLV0rKS8sVnY9L3ZpbWVvXC5jb21cLyhcZCspLztmdW5jdGlvbiByMShlKXtyZXR1cm4gbjEudGVzdChlKXx8anYudGVzdChlKXx8VnYudGVzdChlKX1mdW5jdGlvbiBpaShlKXtyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7Iil9ZnVuY3Rpb24gSGQoZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9ZnVuY3Rpb24gbzEoZSx0KXtsZXQgbj1lLm1hdGNoKGUxKTtpZihuKXtsZXQgbz1uWzJdO3IxKG8pP3QudmlkZW9zLnB1c2goe2FsdDpuWzFdLHVybDpvfSk6dC5pbWFnZXMucHVzaCh7YWx0Om5bMV0sdXJsOm99KTtyZXR1cm59bGV0IHI9ZS5tYXRjaCh0MSk7aWYocil7IXQuZGVzY3JpcHRpb24mJiF0LnVybD8odC5kZXNjcmlwdGlvbj1yWzFdfHwiIix0LnVybD1yWzJdfHwiIik6dC50ZXh0LnB1c2goZSk7cmV0dXJufWUmJnQudGV4dC5wdXNoKGUpfWZ1bmN0aW9uIGExKGUpe2xldCB0PWUubWF0Y2goV3YpO2lmKCF0KXJldHVybntmb290bm90ZXM6e30sY2xlYW5lZE1hcmtkb3duOmV9O2xldCBuPWUuc3Vic3RyaW5nKDAsdC5pbmRleCkudHJpbUVuZCgpLHI9ZS5zdWJzdHJpbmcodC5pbmRleCksbz17fSxhPW5ldyBSZWdFeHAoV3Yuc291cmNlLCJnIiksaT1udWxsLHM9MCxsO2Zvcig7KGw9YS5leGVjKHIpKSE9PW51bGw7KWkhPT1udWxsJiYob1tpXT1IdihyLnN1YnN0cmluZyhzLGwuaW5kZXgpKSksaT1sWzFdLHM9bC5pbmRleCtsWzBdLmxlbmd0aDtyZXR1cm4gaSE9PW51bGwmJihvW2ldPUh2KHIuc3Vic3RyaW5nKHMpKSkse2Zvb3Rub3RlczpvLGNsZWFuZWRNYXJrZG93bjpufX1mdW5jdGlvbiBIdihlKXtsZXQgdD17ZGVzY3JpcHRpb246IiIsdXJsOiIiLGltYWdlczpbXSx2aWRlb3M6W10sdGV4dDpbXX07Zm9yKGxldCBuIG9mIGUuc3BsaXQoYApgKSl7bGV0IHI9bi50cmltKCk7ciYmbzEocix0KX1yZXR1cm4gdH1mdW5jdGlvbiBpMShlKXtsZXQgdD1bXTtyZXR1cm4gZS5pbWFnZXMubGVuZ3RoJiZ0LnB1c2goe2NsczoiaW1hZ2UiLHRpdGxlOiJDb250YWlucyBpbWFnZSIsc3ltYm9sOiJcdXsxRjVCQ30ifSksZS52aWRlb3MubGVuZ3RoJiZ0LnB1c2goe2NsczoidmlkZW8iLHRpdGxlOiJDb250YWlucyB2aWRlbyIsc3ltYm9sOiJcdXsxRjNBQ30ifSksIWUuaW1hZ2VzLmxlbmd0aCYmIWUudmlkZW9zLmxlbmd0aCYmKGUudXJsP3QucHVzaCh7Y2xzOiJ1cmwiLHRpdGxlOiJDb250YWlucyBsaW5rIixzeW1ib2w6Ilx1ezFGNTE3fSJ9KTooZS5kZXNjcmlwdGlvbnx8ZS50ZXh0Lmxlbmd0aCkmJnQucHVzaCh7Y2xzOiJ0ZXh0Iix0aXRsZToiQ29udGFpbnMgZGV0YWlscyIsc3ltYm9sOiJcdXsxRjRERH0ifSkpLHR9ZnVuY3Rpb24gczEoZSl7bGV0IHQ9Wyc8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwIj4nXTtlLnVybCYmdC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLXVybCI+PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNiIvPjxwb2x5bGluZSBwb2ludHM9IjE1IDMgMjEgMyAyMSA5Ii8+PGxpbmUgeDE9IjEwIiB5MT0iMTQiIHgyPSIyMSIgeTI9IjMiLz48L3N2Zz48YSBocmVmPSIke2lpKGUudXJsKX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPiR7SGQoZS51cmwpfTwvYT48L2Rpdj5gKSxlLmRlc2NyaXB0aW9uJiZ0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtdGV4dCI+JHtIZChlLmRlc2NyaXB0aW9uKX08L2Rpdj5gKTtmb3IobGV0IG4gb2YgZS50ZXh0KXQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC10ZXh0Ij4ke0hkKG4pfTwvZGl2PmApO2ZvcihsZXQgbiBvZiBlLmltYWdlcyl0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtbWVkaWEiPjxpbWcgc3JjPSIke2lpKG4udXJsKX0iIGFsdD0iJHtpaShuLmFsdCl9IiBsb2FkaW5nPSJsYXp5Ii8+PC9kaXY+YCk7Zm9yKGxldCBuIG9mIGUudmlkZW9zKXtsZXQgcj1uLnVybC5tYXRjaChqdiksbz1uLnVybC5tYXRjaChWdik7cj90LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtbWVkaWEiPjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3JbMV19IiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPjwvZGl2PmApOm8/dC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48aWZyYW1lIHNyYz0iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyR7b1sxXX0iIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+PC9kaXY+YCk6dC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48dmlkZW8gc3JjPSIke2lpKG4udXJsKX0iIGNvbnRyb2xzPjwvdmlkZW8+PC9kaXY+YCl9cmV0dXJuIHQucHVzaCgnPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1hY3Rpb25zIj48YnV0dG9uIGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLWNsb3NlIiB0eXBlPSJidXR0b24iPkNMT1NFPC9idXR0b24+PC9kaXY+JyksdC5wdXNoKCI8L2Rpdj4iKSx0LmpvaW4oIiIpfWZ1bmN0aW9uIGwxKGUsdCl7bGV0IG49aTEodCkscj1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe3VybDp0LnVybCxkZXNjcmlwdGlvbjp0LmRlc2NyaXB0aW9uLHRleHQ6dC50ZXh0LGltYWdlczp0LmltYWdlcyx2aWRlb3M6dC52aWRlb3N9KSksbz10LnVybHx8IiMiLGE9bi5tYXAoaT0+YDxzcGFuIGNsYXNzPSJyaWNoLWZvb3Rub3RlLWluZGljYXRvciByaWNoLWZvb3Rub3RlLWluZGljYXRvci0tJHtpLmNsc30iIHRpdGxlPSIke2kudGl0bGV9Ij4ke2kuc3ltYm9sfTwvc3Bhbj5gKS5qb2luKCIiKTtyZXR1cm5gPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS13cmFwIj48YSBjbGFzcz0icmljaC1mb290bm90ZS1saW5rIiBocmVmPSIke2lpKG8pfSIgZGF0YS1yaWNoLWZvb3Rub3RlPSIke3J9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4ke2V9PC9hPmArYSsiPC9kaXY+In1mdW5jdGlvbiBzaShlKXtpZighZSlyZXR1cm4iIjtsZXR7Zm9vdG5vdGVzOnQsY2xlYW5lZE1hcmtkb3duOm59PWExKGUpO2lmKE9iamVjdC5rZXlzKHQpLmxlbmd0aD09PTApcmV0dXJuIFZvKGUpO2xldCByPVtdLG89bi5yZXBsYWNlKFprLChpLHMsbCk9PntpZighdFtsXSlyZXR1cm4gaTtsZXQgdT1yLmxlbmd0aDtyZXR1cm4gci5wdXNoKHt0ZXh0OnMsZm5JZDpsfSksYDwhLS1GTlJFRjoke3V9LS0+YH0pLGE9Vm8obyk7cmV0dXJuIGE9YS5yZXBsYWNlKC88IS0tRk5SRUY6KFxkKyktLT4vZywoaSxzKT0+e2xldHt0ZXh0OmwsZm5JZDp1fT1yW3BhcnNlSW50KHMpXSxjPXRbdV07aWYoIWMpcmV0dXJuIGw7bGV0IGQ9Vm8obCk7cmV0dXJuIGwxKGQsYyl9KSxhfWZ1bmN0aW9uIGNsKGUpe2lmKCFlKXJldHVybjtsZXQgdD1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yaWNoLWZvb3Rub3RlLWxpbmtbZGF0YS1yaWNoLWZvb3Rub3RlXSIpO2ZvcihsZXQgbiBvZiB0KXtpZihuLl90aXBweVJpY2hGb290bm90ZSljb250aW51ZTtsZXQgcjt0cnl7cj1KU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChuLmRhdGFzZXQucmljaEZvb3Rub3RlKSl9Y2F0Y2h7Y29udGludWV9aWYoISEhKHIuZGVzY3JpcHRpb258fHIudGV4dD8ubGVuZ3RofHxyLmltYWdlcz8ubGVuZ3RofHxyLnZpZGVvcz8ubGVuZ3RoKSljb250aW51ZTtsZXQgYT1zMShyKSxpPVphKG4se2NvbnRlbnQ6YSxhbGxvd0hUTUw6ITAsaW50ZXJhY3RpdmU6ITAsdHJpZ2dlcjoibWFudWFsIixwbGFjZW1lbnQ6ImJvdHRvbS1zdGFydCIsdGhlbWU6InJpY2gtZm9vdG5vdGUiLG1heFdpZHRoOjQyMCxhcnJvdzohMCxkdXJhdGlvbjpbMTUwLDEwMF0sYXBwZW5kVG86KCk9PmRvY3VtZW50LmJvZHksb25TaG93bigpe2xldCBzPWkucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoIi5yaWNoLWZvb3Rub3RlLXBvcHVwLWNsb3NlIik7cyYmcy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PmkuaGlkZSgpLHtvbmNlOiEwfSl9fSk7bi5fdGlwcHlSaWNoRm9vdG5vdGU9aSxuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixzPT57aWYoaS5zdGF0ZS5pc1Zpc2libGUpe2kuaGlkZSgpO3JldHVybn1zLnByZXZlbnREZWZhdWx0KCkscy5zdG9wUHJvcGFnYXRpb24oKSxpLnNob3coKX0pfX12YXIgZGw9MztmdW5jdGlvbiBqZCh7YXBwOmUsY3VycmVudERhdGU6dCxzZWxlY3RlZERhdGU6bix0YXNrczpyLHRpbWVGb3JtYXQ6b30pe2xldCBhPUJuLmNyZWF0ZUVsZW1lbnQsW2ksc109KDAsQm4udXNlU3RhdGUpKDApLGw9KDAsQm4udXNlUmVmKShudWxsKSx1PWdyKHR8fG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSksYz1PYmplY3Qua2V5cyhyfHx7fSkuc29ydCgpLGQ9biYmIWMuaW5jbHVkZXMobik/Wy4uLmMsbl0uc29ydCgpOmMscD1NYXRoLm1heCgxLE1hdGguY2VpbChkLmxlbmd0aC9kbCkpOygwLEJuLnVzZUVmZmVjdCkoKCk9PntpZighbilyZXR1cm47bGV0IHg9ZC5pbmRleE9mKG4pO3g+PTAmJnMoTWF0aC5mbG9vcih4L2RsKSl9LFtuXSksKDAsQm4udXNlRWZmZWN0KSgoKT0+e2NsKGwuY3VycmVudCl9KTtsZXQgZz1NYXRoLm1pbihpLHAtMSksdj1kLnNsaWNlKGcqZGwsKGcrMSkqZGwpLHk9eD0+eC5pbXBvcnRhbnQmJngudXJnZW50PyJwcmlvcml0eS1jcml0aWNhbCI6eC5pbXBvcnRhbnQ/InByaW9yaXR5LWltcG9ydGFudCI6eC51cmdlbnQ/InByaW9yaXR5LXVyZ2VudCI6InByaW9yaXR5LW5vcm1hbCIsYj14PT54P3ggaW5zdGFuY2VvZiBEYXRlP3guZ2V0VGltZSgpOnR5cGVvZiB4PT0ibnVtYmVyIj94PDFlMTA/eCoxZTM6eDpudWxsOm51bGwsaD14PT57bGV0IE09Yih4KTtpZighTSlyZXR1cm4iIjtsZXQgUD1vPT09IjI0aCI/e2hvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsaG91cjEyOiExfTp7aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0In07cmV0dXJuIG5ldyBEYXRlKE0pLnRvTG9jYWxlVGltZVN0cmluZyhbXSxQKX0sbT14PT54Lm5vdGVVVUlEfHx4Lm5vdGVVdWlkfHx4Lm5vdGU/LnV1aWR8fG51bGwsdz14PT54Lm5vdGVOYW1lfHx4Lm5vdGVUaXRsZXx8eC5ub3RlPy5uYW1lfHwiT3BlbiBub3RlIixmPWFzeW5jIHg9PntsZXQgTT1tKHgpOyFNfHwheC51dWlkfHxhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7TX0/aGlnaGxpZ2h0VGFza1VVSUQ9JHt4LnV1aWR9YCl9LFQ9YXN5bmMoeCxNKT0+e00uc3RvcFByb3BhZ2F0aW9uKCk7bGV0IFA9bSh4KTtQJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7UH1gKX0sUz14PT5uZXcgRGF0ZShgJHt4fVQwMDowMDowMGApLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSx7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIn0pLEQ9RGF0ZS5ub3coKSxOPXg9PnguZmlsdGVyKE09PntsZXQgUD1iKE0uaGlkZVVudGlsKTtyZXR1cm4gUD09bnVsbD8hMDpQPD1EfSksQz1wPjE/YSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnaW5hdGlvbiJ9LGEoImJ1dHRvbiIse2NsYXNzTmFtZToiYWdlbmRhLXBhZ2UtYXJyb3ciLG9uQ2xpY2s6KCk9PnMoeD0+TWF0aC5tYXgoMCx4LTEpKSxkaXNhYmxlZDpnPT09MH0sIlx1MjVDMCIpLGEoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1wYWdlLWluZGljYXRvciJ9LGAke2crMX0gLyAke3B9YCksYSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnZS1hcnJvdyIsb25DbGljazooKT0+cyh4PT5NYXRoLm1pbihwLTEseCsxKSksZGlzYWJsZWQ6Zz49cC0xfSwiXHUyNUI2IikpOm51bGw7cmV0dXJuIGEoY2Use3RpdGxlOmxlKCJhZ2VuZGEiKSxpY29uOiJcdXsxRjRDQn0iLHdpZGdldElkOiJhZ2VuZGEiLGhlYWRlckFjdGlvbnM6Q30sYSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtbGlzdCIscmVmOmx9LHYubWFwKHg9PntsZXQgTT1yW3hdfHxbXSxQPU4oTSksTz14PT09dTtyZXR1cm4gYSgic2VjdGlvbiIse2tleTp4LGNsYXNzTmFtZToiYWdlbmRhLWRheSJ9LGEoImg0Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtZGF0ZS1sYWJlbCJ9LFMoeCkpLFAubGVuZ3RoPT09MD9hKCJwIix7Y2xhc3NOYW1lOiJhZ2VuZGEtZW1wdHktZGF5In0sTz8iTm8gdGFza3Mgc2NoZWR1bGVkIGZvciB0b2RheSI6Ik5vIHRhc2tzIHNjaGVkdWxlZCIpOlAubWFwKFI9PmEoImRpdiIse2tleTpSLnV1aWQsY2xhc3NOYW1lOiJhZ2VuZGEtaXRlbSBhZ2VuZGEtdGFzay1yb3ciLG9uQ2xpY2s6VT0+e1UudGFyZ2V0LmNsb3Nlc3QoImEiKXx8ZihSKX19LGEoImRpdiIse2NsYXNzTmFtZTpgYWdlbmRhLWluZGljYXRvciAke3koUil9YH0pLGEoImRpdiIse2NsYXNzTmFtZToiYWdlbmRhLWNvbnRlbnQifSxhKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtdGltZSIsdGl0bGU6YCR7Ui5zdGFydEF0PyJTdGFydCI6IkRlYWRsaW5lIn0gdGltZSBmb3IgdGFza2B9LGgoUi5zdGFydEF0fHxSLmRlYWRsaW5lKSksYSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRleHQiLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6c2koUi5jb250ZW50KXx8IlVudGl0bGVkIHRhc2sifX0pLG0oUik/YSgiYnV0dG9uIix7dHlwZToiYnV0dG9uIixjbGFzc05hbWU6ImFnZW5kYS1ub3RlLWxpbmsiLG9uQ2xpY2s6VT0+VChSLFUpfSx3KFIpKTpudWxsKSxiKFIuZW5kQXQpJiZiKFIuc3RhcnRBdCkmJmIoUi5lbmRBdCk+YihSLnN0YXJ0QXQpP2EoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1kdXJhdGlvbiJ9LE1hdGgucm91bmQoKGIoUi5lbmRBdCktYihSLnN0YXJ0QXQpKS82ZTQpKyJtIik6bnVsbCkpKX0pKSl9dmFyIHBsPXhlKHdlKCkpO2Z1bmN0aW9uIFZkKHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGN1cnJlbnREYXRlOm4sZ3JpZEhlaWdodFNpemU6cixncmlkV2lkdGhTaXplOm8sb25EYXRlU2VsZWN0OmEsb25PcGVuU2V0dGluZ3M6aSxvcGVuVGFza3M6cyxzZWxlY3RlZERhdGU6bCx3ZWVrRm9ybWF0OnV9KXtsZXQgYz1wbC5jcmVhdGVFbGVtZW50LGQ9bmV3IERhdGUobiksW3AsZ109KDAscGwudXNlU3RhdGUpKG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSxkLmdldE1vbnRoKCksMSkpLHY9dT09PSJtb25kYXkiPzE6MCx5PW5ldyBEYXRlKHAuZ2V0RnVsbFllYXIoKSxwLmdldE1vbnRoKCkrMSwwKS5nZXREYXRlKCksYj0obmV3IERhdGUocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSwxKS5nZXREYXkoKS12KzcpJTcsaD12PT09MT9bIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSIsIlN1Il06WyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdLG09e30sdz1wLmdldEZ1bGxZZWFyKCksZj1wLmdldE1vbnRoKCksVD1gJHt3fS0ke1N0cmluZyhmKzEpLnBhZFN0YXJ0KDIsIjAiKX0tYDtbcyx0XS5mb3JFYWNoKFI9PntPYmplY3Qua2V5cyhSfHx7fSkuZm9yRWFjaChVPT57aWYoVS5zdGFydHNXaXRoKFQpKXtsZXQgRz1wYXJzZUludChVLnN1YnN0cmluZyg4KSwxMCk7bVtHXT0obVtHXXx8MCkrKFJbVV0/Lmxlbmd0aHx8MCl9fSl9KTtsZXQgUz0oKT0+ZyhuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCkscC5nZXRNb250aCgpLTEsMSkpLEQ9KCk9PmcobmV3IERhdGUocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSsxLDEpKSxOPXAudG9Mb2NhbGVTdHJpbmcoImRlZmF1bHQiLHttb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KSxDPVI9PlI9PT1kLmdldERhdGUoKSYmcC5nZXRNb250aCgpPT09ZC5nZXRNb250aCgpJiZwLmdldEZ1bGxZZWFyKCk9PT1kLmdldEZ1bGxZZWFyKCkseD1SPT57bGV0IFU9cC5nZXRGdWxsWWVhcigpLEc9U3RyaW5nKHAuZ2V0TW9udGgoKSsxKS5wYWRTdGFydCgyLCIwIiksUT1TdHJpbmcoUikucGFkU3RhcnQoMiwiMCIpO3JldHVybmAke1V9LSR7R30tJHtRfWB9LE09Uj0+bCYmeChSKT09PWwsUD1SPT57aWYoYSl7bGV0IFU9eChSKTthKFU9PT1sP251bGw6VSl9fSxPPVtdO2ZvcihsZXQgUj0wO1I8YjtSKyspTy5wdXNoKGMoImRpdiIse2tleToiZW1wdHktIitSLGNsYXNzTmFtZToiY2FsLWNlbGwgZW1wdHkifSkpO2ZvcihsZXQgUj0xO1I8PXk7UisrKXtsZXQgVT1tW1JdfHwwLEc9VT09PTA/Im5vbmUiOlU8PTI/IiM4NmVmYWMiOlU8PTU/IiNmYmJmMjQiOiIjZjg3MTcxIixRPSJjYWwtY2VsbCI7QyhSKSYmKFErPSIgdG9kYXkiKSxNKFIpJiYoUSs9IiBzZWxlY3RlZCIpLE8ucHVzaChjKCJkaXYiLHtrZXk6UixjbGFzc05hbWU6USxvbkNsaWNrOigpPT5QKFIpfSxjKCJzcGFuIix7Y2xhc3NOYW1lOiJjYWwtZGF5In0sUiksRyE9PSJub25lIj9jKCJzcGFuIix7Y2xhc3NOYW1lOiJjYWwtZG90IixzdHlsZTp7YmFja2dyb3VuZENvbG9yOkd9fSk6bnVsbCkpfXJldHVybiBjKGNlLHtjb25maWd1cmFibGU6ITAsZ3JpZEhlaWdodFNpemU6cixncmlkV2lkdGhTaXplOm8saWNvbjoiXHV7MUY0QzV9IixvbkNvbmZpZ3VyZTppLHRpdGxlOmxlKCJjYWxlbmRhciIpLHdpZGdldElkOiJjYWxlbmRhciJ9LGMoImRpdiIse2NsYXNzTmFtZToiY2FsLW5hdiJ9LGMoImJ1dHRvbiIse29uQ2xpY2s6UyxjbGFzc05hbWU6ImNhbC1hcnJvdyJ9LCJcdTI1QzAiKSxjKCJzcGFuIix7Y2xhc3NOYW1lOiJjYWwtbW9udGgifSxOKSxjKCJidXR0b24iLHtvbkNsaWNrOkQsY2xhc3NOYW1lOiJjYWwtYXJyb3cifSwiXHUyNUI2IikpLGMoImRpdiIse2NsYXNzTmFtZToiY2FsLWdyaWQifSxoLm1hcChSPT5jKCJkaXYiLHtrZXk6UixjbGFzc05hbWU6ImNhbC1oZWFkZXIifSxSKSksLi4uTykpfXZhciBNdD14ZSh3ZSgpKTtmdW5jdGlvbiBZdihlKXtyZXR1cm4geW4uZmluZCh0PT50LndpZGdldElkPT09ZSl9ZnVuY3Rpb24gdTEoZSl7bGV0IHQ9eW4ubWFwKGE9PmEud2lkZ2V0SWQpLHI9KEFycmF5LmlzQXJyYXkoZSk/ZTpbXSkubWFwKGE9PmEud2lkZ2V0SWQpLmZpbHRlcihhPT50LmluY2x1ZGVzKGEpKSxvPXQuZmlsdGVyKGE9PiFyLmluY2x1ZGVzKGEpKTtyZXR1cm57cmVuZGVyZWRJZHM6cixoaWRkZW5JZHM6b319ZnVuY3Rpb24gR3YoZSl7bGV0IHQ9e307cmV0dXJuIHluLmZvckVhY2gocj0+e3Rbci53aWRnZXRJZF09e2dyaWRXaWR0aFNpemU6ci5kZWZhdWx0R3JpZFdpZHRoU2l6ZXx8MSxncmlkSGVpZ2h0U2l6ZToxfX0pLChBcnJheS5pc0FycmF5KGUpP2U6W10pLmZvckVhY2gocj0+e3Rbci53aWRnZXRJZF0mJih0W3Iud2lkZ2V0SWRdPXtncmlkV2lkdGhTaXplOnIuZ3JpZFdpZHRoU2l6ZXx8dFtyLndpZGdldElkXS5ncmlkV2lkdGhTaXplLGdyaWRIZWlnaHRTaXplOnIuZ3JpZEhlaWdodFNpemV8fDF9KX0pLHR9ZnVuY3Rpb24gYzEoZSx0LG4scil7bGV0IG89Wy4uLmUsLi4udF0sYT1vLmluZGV4T2Yobik7aWYocj09PSJ1cCImJmE9PT0wfHxyPT09ImRvd24iJiZhPT09by5sZW5ndGgtMSlyZXR1cm4gbnVsbDtsZXQgaT1bLi4ub10scz1yPT09InVwIj9hLTE6YSsxO3JldHVybltpW2FdLGlbc11dPVtpW3NdLGlbYV1dLHtyZW5kZXJlZElkczppLnNsaWNlKDAsZS5sZW5ndGgpLGhpZGRlbklkczppLnNsaWNlKGUubGVuZ3RoKX19ZnVuY3Rpb24gZDEoZSx0LG4scil7bGV0IG89ZS5maWx0ZXIoaT0+aSE9PW4pLGE9dC5maWx0ZXIoaT0+aSE9PW4pO3JldHVybiBlLmluY2x1ZGVzKHIpP28uc3BsaWNlKG8uaW5kZXhPZihyKSwwLG4pOmEuc3BsaWNlKGEuaW5kZXhPZihyKSwwLG4pLHtyZW5kZXJlZElkczpvLGhpZGRlbklkczphfX1mdW5jdGlvbiBwMShlLHQsbixyKXtsZXQgbz1lLmZpbHRlcihpPT5pIT09biksYT10LmZpbHRlcihpPT5pIT09bik7cmV0dXJuKHI9PT0icmVuZGVyZWQiP286YSkucHVzaChuKSx7cmVuZGVyZWRJZHM6byxoaWRkZW5JZHM6YX19ZnVuY3Rpb24gZjEoZSx0LG4pe2xldCByPVl2KHQpO2lmKCFyKXJldHVybiBudWxsO2xldCBvPVsuLi5uLnJlbmRlcmVkSWRzLC4uLm4uaGlkZGVuSWRzXSxhPW8uaW5kZXhPZih0KTtyZXR1cm4gZSgiZGl2Iix7a2V5OnQsY2xhc3NOYW1lOlsiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtIixuLmRyYWdnaW5nSWQ9PT10PyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tLWRyYWdnaW5nIjoiIixuLmRyYWdPdmVySWQ9PT10PyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tLWRyYWctb3ZlciI6IiJdLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIiksZHJhZ2dhYmxlOiEwLG9uRHJhZ1N0YXJ0Omk9Pm4ub25EcmFnU3RhcnQoaSx0KSxvbkRyYWdFbmQ6bi5vbkRyYWdFbmQsb25EcmFnT3ZlcjppPT5uLm9uRHJhZ092ZXJJdGVtKGksdCksb25Ecm9wOmk9Pm4ub25Ecm9wT25JdGVtKGksdCl9LGUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1oYW5kbGUiLCJhcmlhLWhpZGRlbiI6InRydWUifSwiXHUyODNGIiksZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWljb24iLCJhcmlhLWhpZGRlbiI6InRydWUifSxyLmljb24pLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWluZm8ifSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tbmFtZSJ9LHIubmFtZSksci5kZXNjcmlwdGlvbiYmZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWRlc2NyaXB0aW9uIn0sci5kZXNjcmlwdGlvbikpLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWFjdGlvbnMifSxlKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtYXJyb3ctYnV0dG9uIix0eXBlOiJidXR0b24iLGRpc2FibGVkOmE9PT0wLHRpdGxlOiJNb3ZlIHVwIiwiYXJpYS1sYWJlbCI6YE1vdmUgJHtyLm5hbWV9IHVwYCxvbkNsaWNrOmk9PntpLnN0b3BQcm9wYWdhdGlvbigpLG4ub25Nb3ZlKHQsInVwIil9fSwiXHUyMTkxIiksZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWFycm93LWJ1dHRvbiIsdHlwZToiYnV0dG9uIixkaXNhYmxlZDphPT09by5sZW5ndGgtMSx0aXRsZToiTW92ZSBkb3duIiwiYXJpYS1sYWJlbCI6YE1vdmUgJHtyLm5hbWV9IGRvd25gLG9uQ2xpY2s6aT0+e2kuc3RvcFByb3BhZ2F0aW9uKCksbi5vbk1vdmUodCwiZG93biIpfX0sIlx1MjE5MyIpKSl9ZnVuY3Rpb24gS3YoZSx0LG4scixvLGEpe3JldHVybiBlKCJkaXYiLHtjbGFzc05hbWU6WyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24iLGEuZHJhZ092ZXJTZWN0aW9uPT09dD8iZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uLS1kcmFnLW92ZXIiOiIiXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpLG9uRHJhZ092ZXI6aT0+YS5vbkRyYWdPdmVyU2VjdGlvbihpLHQpLG9uRHJhZ0xlYXZlOmEub25EcmFnTGVhdmVTZWN0aW9uLG9uRHJvcDppPT5hLm9uRHJvcE9uU2VjdGlvbihpLHQpfSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2VjdGlvbi1oZWFkZXIifSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24taWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9LHIpLGUoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24tdGl0bGUifSxuKSksby5sZW5ndGg9PT0wP2UoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1lbXB0eSJ9LHQ9PT0icmVuZGVyZWQiPyJEcmFnIGNvbXBvbmVudHMgaGVyZSB0byBzaG93IHRoZW0gb24gdGhlIGRhc2hib2FyZCI6IkFsbCBjb21wb25lbnRzIGFyZSBjdXJyZW50bHkgc2hvd24iKTplKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtbGlzdCJ9LC4uLm8ubWFwKGk9PmYxKGUsaSxhKSkpKX1mdW5jdGlvbiBtMShlLHQsbixyKXtsZXQgbz1Zdih0KTtpZighbylyZXR1cm4gbnVsbDtsZXQgYT1uW3RdPy5ncmlkV2lkdGhTaXplPz9vLmRlZmF1bHRHcmlkV2lkdGhTaXplPz8xLGk9blt0XT8uZ3JpZEhlaWdodFNpemU/PzEscz1vLm1heEhvcml6b250YWxUaWxlc3x8NCxsPW8ubWF4VmVydGljYWxUaWxlc3x8MjtyZXR1cm4gZSgiZGl2Iix7a2V5OnQsY2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1pdGVtIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1pdGVtLWhlYWRlciJ9LGUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1pY29uIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sby5pY29uKSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tbmFtZSJ9LG8ubmFtZSkpLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctaXRlbS1jb250cm9scyJ9LGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctZmllbGQifSxlKCJsYWJlbCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctbGFiZWwifSwiV2lkdGgiKSxlKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLXNlbGVjdCIsdmFsdWU6YSxvbkNoYW5nZTp1PT5yKHQsImdyaWRXaWR0aFNpemUiLE51bWJlcih1LnRhcmdldC52YWx1ZSkpfSwuLi5BcnJheS5mcm9tKHtsZW5ndGg6c30sKHUsYyk9PmUoIm9wdGlvbiIse2tleTpjKzEsdmFsdWU6YysxfSxgJHtjKzF9YCkpKSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1maWVsZCJ9LGUoImxhYmVsIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1sYWJlbCJ9LCJWZXJ0aWNhbCB0aWxlcyIpLGUoInNlbGVjdCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctc2VsZWN0Iix2YWx1ZTppLG9uQ2hhbmdlOnU9PnIodCwiZ3JpZEhlaWdodFNpemUiLE51bWJlcih1LnRhcmdldC52YWx1ZSkpfSwuLi5BcnJheS5mcm9tKHtsZW5ndGg6bH0sKHUsYyk9PmUoIm9wdGlvbiIse2tleTpjKzEsdmFsdWU6YysxfSxgJHtjKzF9YCkpKSkpKX1mdW5jdGlvbiBoMShlKXtsZXR7cmVuZGVyZWRJZHM6dCxoaWRkZW5JZHM6bn09dTEoZSksW3Isb109KDAsTXQudXNlU3RhdGUpKHQpLFthLGldPSgwLE10LnVzZVN0YXRlKShuKSxbcyxsXT0oMCxNdC51c2VTdGF0ZSkoKCk9Pkd2KGUpKSxbdSxjXT0oMCxNdC51c2VTdGF0ZSkobnVsbCksW2QscF09KDAsTXQudXNlU3RhdGUpKG51bGwpLFtnLHZdPSgwLE10LnVzZVN0YXRlKShudWxsKSx5PSgwLE10LnVzZVJlZikobnVsbCksW2IsaF09KDAsTXQudXNlU3RhdGUpKCExKSxtPSgpPT57eS5jdXJyZW50PW51bGwsYyhudWxsKSxwKG51bGwpLHYobnVsbCl9O3JldHVybntyZW5kZXJlZElkczpyLGhpZGRlbklkczphLHNpemluZzpzLGRyYWdnaW5nSWQ6dSxkcmFnT3ZlcklkOmQsZHJhZ092ZXJTZWN0aW9uOmcsaGFzUmVzZXQ6Yixvbk1vdmU6KE8sUik9PntsZXQgVT1jMShyLGEsTyxSKTtVJiYobyhVLnJlbmRlcmVkSWRzKSxpKFUuaGlkZGVuSWRzKSl9LG9uRHJhZ1N0YXJ0OihPLFIpPT57eS5jdXJyZW50PVIsTy5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZD0ibW92ZSIscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5jKFIpKX0sb25EcmFnRW5kOigpPT5tKCksb25EcmFnT3Zlckl0ZW06KE8sUik9PntPLnByZXZlbnREZWZhdWx0KCksTy5zdG9wUHJvcGFnYXRpb24oKSxPLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJtb3ZlIixwKFIpLHYobnVsbCl9LG9uRHJhZ092ZXJTZWN0aW9uOihPLFIpPT57Ty5wcmV2ZW50RGVmYXVsdCgpLE8uZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Im1vdmUiLHYoUikscChudWxsKX0sb25EcmFnTGVhdmVTZWN0aW9uOk89PntPLmN1cnJlbnRUYXJnZXQuY29udGFpbnMoTy5yZWxhdGVkVGFyZ2V0KXx8dihudWxsKX0sb25Ecm9wT25JdGVtOihPLFIpPT57Ty5wcmV2ZW50RGVmYXVsdCgpLE8uc3RvcFByb3BhZ2F0aW9uKCk7bGV0IFU9eS5jdXJyZW50O2lmKG0oKSwhVXx8VT09PVIpcmV0dXJuO2xldHtyZW5kZXJlZElkczpHLGhpZGRlbklkczpRfT1kMShyLGEsVSxSKTtvKEcpLGkoUSl9LG9uRHJvcE9uU2VjdGlvbjooTyxSKT0+e08ucHJldmVudERlZmF1bHQoKTtsZXQgVT15LmN1cnJlbnQ7aWYobSgpLCFVKXJldHVybjtsZXR7cmVuZGVyZWRJZHM6RyxoaWRkZW5JZHM6UX09cDEocixhLFUsUik7byhHKSxpKFEpfSxvblNpemluZ0NoYW5nZTooTyxSLFUpPT57bChHPT4oey4uLkcsW09dOnsuLi5HW09dLFtSXTpVfX0pKX0sb25SZXNldDooKT0+e28oeW4ubWFwKE89Pk8ud2lkZ2V0SWQpKSxpKFtdKSxoKCEwKSxsKEd2KG51bGwpKX19fWZ1bmN0aW9uIEdkKHtjdXJyZW50TGF5b3V0OmUsb25TYXZlOnQsb25DYW5jZWw6bn0pe2xldCByPU10LmNyZWF0ZUVsZW1lbnQsW28sYV09KDAsTXQudXNlU3RhdGUpKCJjb21wb25lbnRzIiksaT1oMShlKSx7cmVuZGVyZWRJZHM6cyxoaWRkZW5JZHM6bCxzaXppbmc6dSxoYXNSZXNldDpjLG9uUmVzZXQ6ZCxvblNpemluZ0NoYW5nZTpwfT1pLGc9bz09PSJjb21wb25lbnRzIj9bS3YociwicmVuZGVyZWQiLCJSZW5kZXJlZCBEYXNoYm9hcmQgRWxlbWVudHMiLCJcdXsxRjQ0MX0iLHMsaSksS3YociwiaGlkZGVuIiwiSGlkZGVuIERhc2hib2FyZCBFbGVtZW50cyIsIlx1ezFGNkFCfSIsbCxpKV06W3MubGVuZ3RoPT09MD9yKCJkaXYiLHtrZXk6ImVtcHR5IixjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtZW1wdHkifSwiTm8gcmVuZGVyZWQgY29tcG9uZW50cy4gQWRkIGNvbXBvbmVudHMgaW4gdGhlIENvbXBvbmVudHMgdGFiLiIpOnIoImRpdiIse2tleToic2l6aW5nLWxpc3QiLGNsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmcifSwuLi5zLm1hcCh2PT5tMShyLHYsdSxwKSkpXTtyZXR1cm4gcigiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtb3ZlcmxheSIsb25DbGljazp2PT52LnRhcmdldD09PXYuY3VycmVudFRhcmdldCYmbigpfSxyKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1jb250YWluZXIgZGFzaGJvYXJkLWxheW91dC1wb3B1cCJ9LHIoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWhlYWRlciJ9LHIoImgzIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtdGl0bGUifSwiXHUyNjk5XHVGRTBGIERhc2hib2FyZCBMYXlvdXQiKSxyKCJkaXYiLHtjbGFzc05hbWU6ImV4cGxhbmF0aW9uLXBhcmFncmFwaCJ9LCJDdXN0b21pemUgdGhlIG9yZGVyIG9mIHlvdXIgd2lkZ2V0cyBieSBkcmFnZ2luZyBvciBzaXppbmcgdGhlbSBpbiB0aGlzIG1lbnUuIFlvdSBjYW4gYWxzbyByZW9yZGVyIHdpZGdldHMgb3V0c2lkZSB0aGlzIG1lbnUgYnkgY2xpY2tpbmcgb24gdGhlaXIgaGVhZGVyIGZvciAyIHNlY29uZHMgdG8gZW5nYWdlIGRyYWcgcmVvcmRlcmluZy4iKSxyKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtdGFicyJ9LHIoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC10YWIiKyhvPT09ImNvbXBvbmVudHMiPyIgYWN0aXZlIjoiIiksdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT5hKCJjb21wb25lbnRzIil9LCJDb21wb25lbnRzIikscigiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXRhYiIrKG89PT0ic2l6aW5nIj8iIGFjdGl2ZSI6IiIpLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+YSgic2l6aW5nIil9LCJTaXppbmciKSkpLHIoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWJvZHkgZGFzaGJvYXJkLWxheW91dC1wb3B1cC1ib2R5In0sLi4uZykscigiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYWN0aW9ucyJ9LHIoImJ1dHRvbiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWxpbmsiLHR5cGU6ImJ1dHRvbiIsb25DbGljazpkfSwiUmVzZXQgdG8gZGVmYXVsdHMiKSxyKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tY2FuY2VsIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6bn0sIkNhbmNlbCIpLHIoImJ1dHRvbiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWJ0biBjb25maWctcG9wdXAtYnRuLS1zdWJtaXQiLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+dChzLHtpc1Jlc2V0OmMsc2l6aW5nOnV9KX0sIlNhdmUgTGF5b3V0IikpKSl9dmFyIHF2PSJNaXNzaW9uIENvbnRyb2wgRGFzaGJvYXJkOiBwbHVnaW4gc2V0dGluZ3MiO2Z1bmN0aW9uIFF2KCl7dHJ5e2xldHtob3VyQ3ljbGU6ZX09bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodm9pZCAwLHtob3VyOiJudW1lcmljIn0pLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBlPT09ImgyMyJ8fGU9PT0iaDI0Ij8iMjRoIjoibWVyaWRpYW4ifWNhdGNoe3JldHVybiJtZXJpZGlhbiJ9fWZ1bmN0aW9uIEp2KCl7dHJ5e2xldCBlPW5ldyBJbnRsLkxvY2FsZShuYXZpZ2F0b3IubGFuZ3VhZ2UpLHQ9ZS53ZWVrSW5mb3x8ZS5nZXRXZWVrSW5mbz8uKCk7cmV0dXJuIHQ/LmZpcnN0RGF5PT09N3x8dD8uZmlyc3REYXk9PT0wPyJzdW5kYXkiOiJtb25kYXkifWNhdGNoe3JldHVybiJtb25kYXkifX1mdW5jdGlvbiBnMShlKXtsZXQgdD17fTtpZighZSlyZXR1cm4gdDtmb3IobGV0IG4gb2YgZS5zcGxpdChgCmApKXtsZXQgcj1uLm1hdGNoKC9eKFteOl0rKTpccyooLispLyk7aWYoIXIpY29udGludWU7bGV0IG89clsxXS50cmltKCkudG9Mb3dlckNhc2UoKSxhPXJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7bz09PSJ0aW1lIGZvcm1hdCImJih0LnRpbWVGb3JtYXQ9YSksbz09PSJ3ZWVrIGZvcm1hdCImJih0LndlZWtGb3JtYXQ9YSl9cmV0dXJuIHR9ZnVuY3Rpb24gWHYoZSl7bGV0IHQ9W107cmV0dXJuIGUudGltZUZvcm1hdCYmdC5wdXNoKGBUaW1lIGZvcm1hdDogJHtlLnRpbWVGb3JtYXR9YCksZS53ZWVrRm9ybWF0JiZ0LnB1c2goYFdlZWsgZm9ybWF0OiAke2Uud2Vla0Zvcm1hdH1gKSx0LmpvaW4oYApgKX12YXIgbGk9Y2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fYXBwPXQsdGhpcy5fbm90ZVVVSUQ9bnVsbCx0aGlzLl9zZXR0aW5ncz1udWxsfWFzeW5jIGxvYWQoKXtsZXQgdD1hd2FpdCB0aGlzLl9hcHAuZmluZE5vdGUoe25hbWU6cXYsdGFnczpbeHRdfSk7aWYodD8udXVpZCl7dGhpcy5fbm90ZVVVSUQ9dC51dWlkO2xldCByPWF3YWl0IHRoaXMuX2FwcC5nZXROb3RlQ29udGVudCh7dXVpZDp0LnV1aWR9KTtyZXR1cm4gdGhpcy5fc2V0dGluZ3M9ZzEociksdGhpcy5fc2V0dGluZ3MudGltZUZvcm1hdHx8KHRoaXMuX3NldHRpbmdzLnRpbWVGb3JtYXQ9UXYoKSksdGhpcy5fc2V0dGluZ3Mud2Vla0Zvcm1hdHx8KHRoaXMuX3NldHRpbmdzLndlZWtGb3JtYXQ9SnYoKSksQSgiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBsb2FkZWQgc2V0dGluZ3M6Iix0aGlzLl9zZXR0aW5ncyksey4uLnRoaXMuX3NldHRpbmdzfX10aGlzLl9zZXR0aW5ncz17dGltZUZvcm1hdDpRdigpLHdlZWtGb3JtYXQ6SnYoKX07bGV0IG49YXdhaXQgdGhpcy5fYXBwLmNyZWF0ZU5vdGUocXYsW3h0XSx7YXJjaGl2ZTohMH0pO3JldHVybiB0aGlzLl9ub3RlVVVJRD10eXBlb2Ygbj09Im9iamVjdCI/bi51dWlkOm4sYXdhaXQgdGhpcy5fYXBwLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0aGlzLl9ub3RlVVVJRH0sWHYodGhpcy5fc2V0dGluZ3MpKSxBKCJbRGFzaGJvYXJkU2V0dGluZ05vdGVdIGNyZWF0ZWQgc2V0dGluZ3Mgbm90ZToiLHRoaXMuX25vdGVVVUlEKSx7Li4udGhpcy5fc2V0dGluZ3N9fWFzeW5jIHNhdmUodCl7aWYodGhpcy5fc2V0dGluZ3M9ey4uLnRoaXMuX3NldHRpbmdzLC4uLnR9LCF0aGlzLl9ub3RlVVVJRCl7QSgiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBubyBub3RlVVVJRDsgY2Fubm90IHNhdmUiKTtyZXR1cm59YXdhaXQgdGhpcy5fYXBwLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0aGlzLl9ub3RlVVVJRH0sWHYodGhpcy5fc2V0dGluZ3MpKSxBKCJbRGFzaGJvYXJkU2V0dGluZ05vdGVdIHNhdmVkIHNldHRpbmdzOiIsdGhpcy5fc2V0dGluZ3MpfWdldCBzZXR0aW5ncygpe3JldHVybiB0aGlzLl9zZXR0aW5ncz97Li4udGhpcy5fc2V0dGluZ3N9Om51bGx9fTt2YXIgR289eGUod2UoKSwxKTtmdW5jdGlvbiBRcih7dGl0bGU6ZSxvblN1Ym1pdDp0LG9uQ2FuY2VsOm4sc3VibWl0TGFiZWw6cj0iU3VibWl0IixjaGlsZHJlbjpvLHNjcm9sbFRvcDphfSl7bGV0IGk9R28uY3JlYXRlRWxlbWVudCxzPSgwLEdvLnVzZVJlZikobnVsbCk7cmV0dXJuKDAsR28udXNlRWZmZWN0KSgoKT0+e2lmKGE9PT12b2lkIDApcmV0dXJuO2xldCB1PWM9PntzLmN1cnJlbnQmJiFzLmN1cnJlbnQuY29udGFpbnMoYy50YXJnZXQpJiZuKCl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHUpLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHUpfSxbYSxuXSksaSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtb3ZlcmxheSIsc3R5bGU6YSE9PXZvaWQgMD97cG9zaXRpb246ImFic29sdXRlIix0b3A6YSxsZWZ0OjAscmlnaHQ6MCxtaW5IZWlnaHQ6IjEwMHZoIixwb2ludGVyRXZlbnRzOiJub25lIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0IixwYWRkaW5nOiIxNnB4In06dm9pZCAwLG9uQ2xpY2s6YT09PXZvaWQgMD91PT57dS50YXJnZXQ9PT11LmN1cnJlbnRUYXJnZXQmJm4oKX06dm9pZCAwfSxpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1jb250YWluZXIiLHJlZjpzLHN0eWxlOmEhPT12b2lkIDA/e3BvaW50ZXJFdmVudHM6ImF1dG8ifTp2b2lkIDB9LGU/aSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtaGVhZGVyIn0saSgiaDMiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC10aXRsZSJ9LGUpKTpudWxsLGkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWJvZHkifSxvKSxpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1hY3Rpb25zIn0saSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsb25DbGljazpufSwiQ2FuY2VsIiksaSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLXN1Ym1pdCIsb25DbGljazp0fSxyKSkpKX12YXIgdjE9NTAqMTAyNCo0O3ZhciBadj17YW50aHJvcGljOiJodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9zZXR0aW5ncy9rZXlzIiwiYW50aHJvcGljLXNvbm5ldCI6Imh0dHBzOi8vY29uc29sZS5hbnRocm9waWMuY29tL3NldHRpbmdzL2tleXMiLGRlZXBzZWVrOiJodHRwczovL3BsYXRmb3JtLmRlZXBzZWVrLmNvbS9hcGlfa2V5cyIsZ2VtaW5pOiJodHRwczovL2Fpc3R1ZGlvLmdvb2dsZS5jb20vYXBwL2FwaS1rZXlzIixncm9rOiJodHRwczovL2NvbnNvbGUueC5haS90ZWFtL2RlZmF1bHQvYXBpLWtleXMiLG9wZW5haToiaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2FwaS1rZXlzIixwZXJwbGV4aXR5OiJodHRwczovL3d3dy5wZXJwbGV4aXR5LmFpL2FjY291bnQvYXBpL2tleXMifSxKcj17YW50aHJvcGljOiJjbGF1ZGUtb3B1cy00LTYiLCJhbnRocm9waWMtc29ubmV0IjoiY2xhdWRlLXNvbm5ldC00LTYiLGRlZXBzZWVrOiJkZWVwc2Vlay1jaGF0IixnZW1pbmk6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLGdyb2s6Imdyb2stNC4yMCIsb3BlbmFpOiJncHQtNS40IixwZXJwbGV4aXR5OiJzb25hci1wcm8ifTt2YXIgS2Q9e2FudGhyb3BpYzoiaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcyIsImFudGhyb3BpYy1zb25uZXQiOiJodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzIixkZWVwc2VlazoiaHR0cHM6Ly9hcGkuZGVlcHNlZWsuY29tL3YxL2NoYXQvY29tcGxldGlvbnMiLGdlbWluaToiaHR0cHM6Ly9nZW5lcmF0aXZlbGFuZ3VhZ2UuZ29vZ2xlYXBpcy5jb20vdjFiZXRhL21vZGVscy97bW9kZWwtbmFtZX06Z2VuZXJhdGVDb250ZW50Iixncm9rOiJodHRwczovL2FwaS54LmFpL3YxL2NoYXQvY29tcGxldGlvbnMiLG9wZW5haToiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9jaGF0L2NvbXBsZXRpb25zIixwZXJwbGV4aXR5OiJodHRwczovL2FwaS5wZXJwbGV4aXR5LmFpL2NoYXQvY29tcGxldGlvbnMifSxVTz1PYmplY3Qua2V5cyhLZCksZXk9eyJjbGF1ZGUtb3B1cy00LTYiOjIwMCoxMDI0KjQsImNsYXVkZS1zb25uZXQtNC02IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtNSI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTUtMjAyNTA5MjkiOjIwMCoxMDI0KjQsImNsYXVkZS1oYWlrdS00LTUiOjIwMCoxMDI0KjQsImNsYXVkZS1oYWlrdS00LTUtMjAyNTEwMDEiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtNSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC01LTIwMjUxMTAxIjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTEiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMS0yMDI1MDgwNSI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTAiOjIwMCoxMDI0KjQsImNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNCI6MjAwKjEwMjQqNCwiY2xhdWRlLTMtNy1zb25uZXQtbGF0ZXN0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy03LXNvbm5ldC0yMDI1MDIxOSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC0wIjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTIwMjUwNTE0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy01LWhhaWt1LWxhdGVzdCI6MjAwKjEwMjQqNCwiY2xhdWRlLTMtNS1oYWlrdS0yMDI0MTAyMiI6MjAwKjEwMjQqNCwiY2xhdWRlLTMtNS1zb25uZXQtbGF0ZXN0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy1oYWlrdS0yMDI0MDMwNyI6MjAwKjEwMjQqNH0sdHk9eyJkZWVwc2Vlay1jaGF0Ijo2NCoxMDI0KjQsImRlZXBzZWVrLXJlYXNvbmVyIjo2NCoxMDI0KjQsImRlZXBzZWVrLXIxIjo2NCoxMDI0KjQsImRlZXBzZWVrLXIxLTA1MjgiOjY0KjEwMjQqNH0sbnk9eyJnZW1pbmktMy1mbGFzaCI6NjQqMTAyNCo0LCJnZW1pbmktMy1mbGFzaC1wcmV2aWV3Ijo2NCoxMDI0KjQsImdlbWluaS0zLXBybyI6MTAyNCoxMDI0KjQsImdlbWluaS0zLXByby1wcmV2aWV3IjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyI6MTAyNCoxMDI0KjQsImdlbWluaS0zLXByby1pbWFnZS1wcmV2aWV3Ijo2NCoxMDI0KjQsImdlbWluaS0yLjUtcHJvIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuNS1mbGFzaCI6MTAyNCoxMDI0KjQsImdlbWluaS0yLjUtZmxhc2gtbGl0ZSI6MTAyNCoxMDI0KjQsImdlbWluaS0yLjUtZmxhc2gtbGl0ZS1wcmV2aWV3LTA2LTE3IjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuMC1mbGFzaCI6MTAyNCoxMDI0KjQsImdlbWluaS0yLjAtZmxhc2gtbGl0ZSI6MTAyNCoxMDI0KjR9LHJ5PXsiZ3Jvay00LTEtZmFzdCI6MjA0OCoxMDI0KjQsImdyb2stNC1mYXN0IjoyMDQ4KjEwMjQqNCwiZ3Jvay00IjoyNTYqMTAyNCo0LCJncm9rLTQuMjAiOjI1NioxMDI0KjQsImdyb2stNC0wNzA5IjoyNTYqMTAyNCo0LCJncm9rLTMiOjEyOCoxMDI0KjQsImdyb2stMy1iZXRhIjoxMjgqMTAyNCo0LCJncm9rLTMtbWluaSI6MTI4KjEwMjQqNCwiZ3Jvay0zLW1pbmktYmV0YSI6MTI4KjEwMjQqNCwiZ3Jvay0yLXZpc2lvbi0xMjEyIjo4KjEwMjQqNCwiZ3Jvay0yLWltYWdlLTEyMTIiOjEyOCoxMDI0KjQsImdyb2stMi0xMjEyIjoxMjgqMTAyNCo0fSxveT17ImdwdC01LjQiOjQwMCoxMDI0KjQsImdwdC01LjIiOjQwMCoxMDI0KjQsImdwdC01LjEiOjQwMCoxMDI0KjQsImdwdC01LjEtY29kZXgtbWF4Ijo0MDAqMTAyNCo0LCJncHQtNSI6NDAwKjEwMjQqNCwiZ3B0LTUtZmFzdCI6NDAwKjEwMjQqNCwiZ3B0LTUtdGhpbmtpbmciOjQwMCoxMDI0KjQsImdwdC00LjEiOjFlMyoxMDI0KjQsImdwdC00LjEtbWluaSI6MTI4KjEwMjQqNCwiZ3B0LTRvIjoxMjgqMTAyNCo0LCJncHQtNG8tbWluaSI6MTI4KjEwMjQqNCxvMzoyMDAqMTAyNCo0LCJvMy1taW5pIjoyMDAqMTAyNCo0LCJvMy1wcm8iOjIwMCoxMDI0KjQsIm80LW1pbmkiOjIwMCoxMDI0KjQsImdwdC00Ijo4KjEwMjQqNCwiZ3B0LTQtMTEwNi1wcmV2aWV3IjoxMjgqMTAyNCo0LCJncHQtNC0zMmsiOjMyKjEwMjQqNCwiZ3B0LTQtMzJrLTA2MTMiOjMyKjEwMjQqNCwiZ3B0LTQtdmlzaW9uLXByZXZpZXciOjEyOCoxMDI0KjR9LCRPPXsic29uYXItcHJvIjoyMDAqMTAyNCo0LHNvbmFyOjEyOCoxMDI0KjQsInNvbmFyLXJlYXNvbmluZy1wcm8iOjEyOCoxMDI0KjQsInNvbmFyLXJlYXNvbmluZyI6MTI4KjEwMjQqNCwic29uYXItZGVlcC1yZXNlYXJjaCI6MTI4KjEwMjQqNH0seTE9ey4uLmV5LC4uLnR5LC4uLm55LC4uLnJ5LC4uLm95fSxZZD17YW50aHJvcGljOk9iamVjdC5rZXlzKGV5KSxkZWVwc2VlazpPYmplY3Qua2V5cyh0eSksZ2VtaW5pOk9iamVjdC5rZXlzKG55KSxncm9rOk9iamVjdC5rZXlzKHJ5KSxvcGVuYWk6T2JqZWN0LmtleXMob3kpfTt2YXIgRXQ9eGUod2UoKSk7ZnVuY3Rpb24gdzEoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57bGV0IHI9bmV3IEZpbGVSZWFkZXI7ci5vbmxvYWQ9bz0+dChvLnRhcmdldC5yZXN1bHQpLHIub25lcnJvcj1vPT57ci5hYm9ydCgpLG4oby50YXJnZXQuZXJyb3IpfSxyLnJlYWRBc0RhdGFVUkwoZSl9KX1mdW5jdGlvbiBxZCh7YXBwOmUscGx1Z2luTm90ZVVVSUQ6dCxpbml0aWFsSW1hZ2VVcmw6bj0iIixpbml0aWFsTW9kZTpyPSJjb3ZlciJ9PXt9KXtsZXRbbyxhXT0oMCxFdC51c2VTdGF0ZSkobiksW2ksc109KDAsRXQudXNlU3RhdGUpKHIpLFtsLHVdPSgwLEV0LnVzZVN0YXRlKSghMSksW2MsZF09KDAsRXQudXNlU3RhdGUpKCExKSxwPSgwLEV0LnVzZVJlZikobnVsbCksZz0oMCxFdC51c2VDYWxsYmFjaykoYXN5bmMgdz0+e2lmKCF3fHwhdy50eXBlLnN0YXJ0c1dpdGgoImltYWdlLyIpKXtBKCJbYmctdXBsb2FkXSByZWplY3RlZCBmaWxlIChub3QgYW4gaW1hZ2Ugb3IgbWlzc2luZyk6Iix3Py50eXBlKTtyZXR1cm59QSgiW2JnLXVwbG9hZF0gc3RhcnRpbmcgdXBsb2FkIGZvcjoiLHcubmFtZSx3LnR5cGUsdy5zaXplLCJieXRlcyIpLHUoITApO3RyeXtsZXQgZj1hd2FpdCB3MSh3KTtBKCJbYmctdXBsb2FkXSBmaWxlIGNvbnZlcnRlZCB0byBkYXRhIFVSTCwgbGVuZ3RoOiIsZi5sZW5ndGgpO2xldCBUPWF3YWl0IGUuYXR0YWNoTm90ZU1lZGlhKHt1dWlkOnR9LGYpO0EoIltiZy11cGxvYWRdIGF0dGFjaE5vdGVNZWRpYSByZXR1cm5lZCBVUkw6IixUKSxUP2EoVCk6QSgiW2JnLXVwbG9hZF0gYXR0YWNoTm90ZU1lZGlhIHJldHVybmVkIGZhbHN5IFVSTCBcdTIwMTQgdXBsb2FkIG1heSBoYXZlIGZhaWxlZCBzaWxlbnRseSIpfWNhdGNoKGYpe0EoIltiZy11cGxvYWRdIHVwbG9hZCBGQUlMRUQgd2l0aCBleGNlcHRpb246IixmKX1maW5hbGx5e3UoITEpLEEoIltiZy11cGxvYWRdIHVwbG9hZCBmbG93IGNvbXBsZXRlIil9fSxbXSksdj0oMCxFdC51c2VDYWxsYmFjaykodz0+e3cucHJldmVudERlZmF1bHQoKSx3LnN0b3BQcm9wYWdhdGlvbigpLGQoITEpO2xldCBmPXcuZGF0YVRyYW5zZmVyPy5maWxlcz8uWzBdO2YmJmcoZil9LFtnXSkseT0oMCxFdC51c2VDYWxsYmFjaykodz0+e3cucHJldmVudERlZmF1bHQoKSx3LnN0b3BQcm9wYWdhdGlvbigpLGQoITApfSxbXSksYj0oMCxFdC51c2VDYWxsYmFjaykodz0+e3cucHJldmVudERlZmF1bHQoKSx3LnN0b3BQcm9wYWdhdGlvbigpLGQoITEpfSxbXSksaD0oMCxFdC51c2VDYWxsYmFjaykodz0+e2xldCBmPXcudGFyZ2V0LmZpbGVzPy5bMF07ZiYmZyhmKX0sW2ddKSxtPSgwLEV0LnVzZUNhbGxiYWNrKSgoKT0+e2EoIiIpfSxbXSk7cmV0dXJue2JhY2tncm91bmRJbWFnZVVybDpvLGJhY2tncm91bmRNb2RlOmksc2V0QmFja2dyb3VuZE1vZGU6cyx1cGxvYWRpbmc6bCxkcmFnT3ZlcjpjLGZpbGVJbnB1dFJlZjpwLGhhbmRsZURyb3A6dixoYW5kbGVEcmFnT3Zlcjp5LGhhbmRsZURyYWdMZWF2ZTpiLGhhbmRsZUZpbGVJbnB1dENoYW5nZTpoLGhhbmRsZVJlbW92ZUltYWdlOm19fXZhciBXbj14ZSh3ZSgpKTt2YXIgeXI9W3t2YWx1ZToibm9uZSIsbGFiZWw6Ik5vbmUgKGRpc2FibGUgQUkgZmVhdHVyZXMpIixhcGlLZXlQcm92aWRlcjpudWxsfSx7dmFsdWU6Im9wZW5haSIsbGFiZWw6Ik9wZW5BSSBDaGF0R1BUIixhcGlLZXlQcm92aWRlcjoib3BlbmFpIn0se3ZhbHVlOiJhbnRocm9waWMiLGxhYmVsOiJBbnRocm9waWMgT3B1cyIsYXBpS2V5UHJvdmlkZXI6ImFudGhyb3BpYyJ9LHt2YWx1ZToiYW50aHJvcGljLXNvbm5ldCIsbGFiZWw6IkFudGhyb3BpYyBTb25uZXQiLGFwaUtleVByb3ZpZGVyOiJhbnRocm9waWMifSx7dmFsdWU6ImdlbWluaSIsbGFiZWw6Ikdvb2dsZSBHZW1pbmkiLGFwaUtleVByb3ZpZGVyOiJnZW1pbmkifSx7dmFsdWU6Imdyb2siLGxhYmVsOiJHcm9rIixhcGlLZXlQcm92aWRlcjoiZ3JvayJ9XTtmdW5jdGlvbiBiMSgpe2xldCBlPW5hdmlnYXRvci51c2VyQWdlbnR8fCIiLHQ9bmF2aWdhdG9yLnBsYXRmb3JtfHwiIixuPS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChlKSxyPW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4xJiYvTWFjaW50b3NoLy50ZXN0KGUpO3JldHVybiBufHxyP3tsaW5rUGFyZW50aGV0aWNhbDoibG9uZy1wcmVzcywgT3BlbiBpbiBOZXcgVGFiIixub3RlOiJMb25nLXByZXNzIHRoZSBmb2xsb3dpbmcgbGluaywgdGhlbiBjaG9vc2UgT3BlbiBpbiBOZXcgVGFiIG9yIE9wZW4gaW4gQnJvd3Nlci4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QuIn06L01hY3xpUGhvbmV8aVBvZHxpUGFkLy50ZXN0KHQpfHwvTWFjIE9TIFgvLnRlc3QoZSk/e2xpbmtQYXJlbnRoZXRpY2FsOiJDbWQrY2xpY2siLG5vdGU6IkNtZC1jbGljayB0aGUgZm9sbG93aW5nIGxpbmsgdG8gb3BlbiBpdC4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QuIn06L1dpbi8udGVzdCh0KT97bGlua1BhcmVudGhldGljYWw6IkN0cmwrY2xpY2siLG5vdGU6IkN0cmwtY2xpY2sgdGhlIGZvbGxvd2luZyBsaW5rIHRvIG9wZW4gaXQuIEEgbm9ybWFsIGNsaWNrIG1heSBoYXZlIG5vIHZpc2libGUgZWZmZWN0LiJ9OntsaW5rUGFyZW50aGV0aWNhbDoiQ3RybCtjbGljayIsbm90ZToiQ3RybC1jbGljayB0aGUgZm9sbG93aW5nIGxpbmsgdG8gb3BlbiBpdC4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QifX1mdW5jdGlvbiB4MShlLHthcGlLZXk6dCxhcGlLZXlWaXNpYmxlOm4sbGlua1BhcmVudGhldGljYWw6cixub3RlOm8sb25BcGlLZXlDaGFuZ2U6YSxvblByb3ZpZGVyQ2hhbmdlOmksb25Ub2dnbGVLZXlWaXNpYmlsaXR5OnMscHJvdmlkZXJBcGlLZXlVcmw6bCxwcm92aWRlck5hbWU6dSxzZWxlY3RlZFByb3ZpZGVyOmN9KXtyZXR1cm4gZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1oZWFkZXIifSxlKCJoNCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tdGl0bGUifSwiQUkgUHJvdmlkZXIiKSxlKCJwIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1kZXNjIn0sIkVuYWJsZSBhbmFseXNpcyBvZiBxdWFydGVybHkgcGxhbiAmIHN1Z2dlc3RlZCB0YXNrcy4iKSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQifSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiTExNIFByb3ZpZGVyIiksZSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VsZWN0IixpZDoibGxtLXByb3ZpZGVyLXNlbGVjdCIsdmFsdWU6YyxvbkNoYW5nZTpkPT5pKGQudGFyZ2V0LnZhbHVlKX0sLi4ueXIubWFwKGQ9PmUoIm9wdGlvbiIse2tleTpkLnZhbHVlLHZhbHVlOmQudmFsdWV9LGQubGFiZWwpKSkpLGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWxpbmUifSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCJ9LCJBUEkgS2V5IiksZSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWFwaS1rZXktaGludCJ9LG8pLGUoImEiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWxpbmsiLGhyZWY6bCx0YXJnZXQ6Il9ibGFuayIscmVsOiJub29wZW5lciBub3JlZmVycmVyIn0sYFJldHJpZXZlIHlvdXIgJHt1fSBBUEkga2V5ICgke3J9KSBcdTIxOTJgKSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWlucHV0LXJvdyJ9LGUoImlucHV0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1pbnB1dCIsdHlwZTpuPyJ0ZXh0IjoicGFzc3dvcmQiLHZhbHVlOnQsb25DaGFuZ2U6ZD0+YShkLnRhcmdldC52YWx1ZSkscGxhY2Vob2xkZXI6IlBhc3RlIHlvdXIgQVBJIGtleSBoZXJlIixhdXRvQ29tcGxldGU6Im9mZiIsc3BlbGxDaGVjazohMX0pLGUoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWFwaS1rZXktdG9nZ2xlIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6cyx0aXRsZTpuPyJIaWRlIEFQSSBrZXkiOiJTaG93IEFQSSBrZXkiLCJhcmlhLWxhYmVsIjpuPyJIaWRlIEFQSSBrZXkiOiJTaG93IEFQSSBrZXkifSxuPyJcdXsxRjY0OH0iOiJcdXsxRjQ0MX1cdUZFMEYiKSkpKSl9ZnVuY3Rpb24gazEoZSx7YmFja2dyb3VuZEltYWdlVXJsOnQsYmFja2dyb3VuZE1vZGU6bixkcmFnT3ZlcjpyLGZpbGVJbnB1dFJlZjpvLG9uQmFja2dyb3VuZE1vZGVDaGFuZ2U6YSxvbkRyYWdMZWF2ZTppLG9uRHJhZ092ZXI6cyxvbkRyb3A6bCxvbkZpbGVJbnB1dENoYW5nZTp1LG9uUmVtb3ZlSW1hZ2U6Yyx1cGxvYWRpbmc6ZH0pe3JldHVybiBlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uIHNlY3Rpb24ifSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWhlYWRlciJ9LGUoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSJ9LCJCYWNrZ3JvdW5kIEltYWdlIiksZSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyJ9LCJVcGxvYWQgYW4gaW1hZ2UgdG8gdXNlIGFzIHlvdXIgZGFzaGJvYXJkIGJhY2tncm91bmQuIikpLGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOmBkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUke3I/IiBkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtLWFjdGl2ZSI6IiJ9JHtkPyIgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLS11cGxvYWRpbmciOiIifWAsb25Ecm9wOmwsb25EcmFnT3ZlcjpzLG9uRHJhZ0xlYXZlOmksb25DbGljazooKT0+IWQmJm8uY3VycmVudD8uY2xpY2soKX0sZSgiaW5wdXQiLHtyZWY6byx0eXBlOiJmaWxlIixhY2NlcHQ6ImltYWdlLyoiLGNsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLWlucHV0IixvbkNoYW5nZTp1fSksZD9lKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtdGV4dCJ9LCJVcGxvYWRpbmcuLi4iKTp0P2UoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXByZXZpZXcifSxlKCJpbWciLHtzcmM6dCxhbHQ6IkJhY2tncm91bmQgcHJldmlldyIsY2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtcHJldmlldy1pbWciLG9uTG9hZDooKT0+QSgiW3NldHRpbmdzLXBvcHVwXSBiYWNrZ3JvdW5kIHByZXZpZXcgaW1hZ2UgbG9hZGVkIE9LOiIsdCksb25FcnJvcjpwPT5BKCJbc2V0dGluZ3MtcG9wdXBdIGJhY2tncm91bmQgcHJldmlldyBpbWFnZSBGQUlMRUQgdG8gbG9hZDoiLHQscC50eXBlKX0pLGUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS10ZXh0In0sIkRyb3AgYSBuZXcgaW1hZ2Ugb3IgY2xpY2sgdG8gcmVwbGFjZSIpKTplKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtdGV4dCJ9LCJEcmFnICYgZHJvcCBhbiBpbWFnZSBoZXJlLCBvciBjbGljayB0byB1cGxvYWQiKSksdCYmZSgiYSIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXJlbW92ZS1pbWFnZSIsaHJlZjoiIyIsb25DbGljazpwPT57cC5wcmV2ZW50RGVmYXVsdCgpLGMoKX19LCJSZW1vdmUgaW1hZ2UiKSksdCYmZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQifSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCJ9LCJEaXNwbGF5IE1vZGUiKSxlKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWxlY3QiLHZhbHVlOm4sb25DaGFuZ2U6cD0+YShwLnRhcmdldC52YWx1ZSl9LC4uLmlnLm1hcChwPT5lKCJvcHRpb24iLHtrZXk6cC52YWx1ZSx2YWx1ZTpwLnZhbHVlfSxwLmxhYmVsKSkpKSl9ZnVuY3Rpb24gUzEoZSx7b25UaW1lRm9ybWF0Q2hhbmdlOnQsb25XZWVrRm9ybWF0Q2hhbmdlOm4sdGltZUZvcm1hdDpyLHdlZWtGb3JtYXQ6b30pe3JldHVybiBlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uIHNlY3Rpb24ifSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWhlYWRlciJ9LGUoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSJ9LCJUaW1lICYgRGF0ZSBGb3JtYXQiKSxlKCJwIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1kZXNjIn0sIkNob29zZSBob3cgdGltZXMgYW5kIHdlZWtzIGFyZSBkaXNwbGF5ZWQgYWNyb3NzIHRoZSBkYXNoYm9hcmQuIikpLGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctbGluZSJ9LGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIlRpbWUgRm9ybWF0IiksZSgibGFiZWwiLG51bGwsZSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToidGltZS1mb3JtYXQiLHZhbHVlOiJtZXJpZGlhbiIsY2hlY2tlZDpyPT09Im1lcmlkaWFuIixvbkNoYW5nZTooKT0+dCgibWVyaWRpYW4iKX0pLCJVc2UgbWVyaWRpYW4gKGFtL3BtKSB0aW1lcyIpLGUoImxhYmVsIixudWxsLGUoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6InRpbWUtZm9ybWF0Iix2YWx1ZToiMjRoIixjaGVja2VkOnI9PT0iMjRoIixvbkNoYW5nZTooKT0+dCgiMjRoIil9KSwiMjQgaG91ciB0aW1lIikpLGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWxpbmUifSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCJ9LCJXZWVrIEZvcm1hdCIpLGUoImxhYmVsIixudWxsLGUoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6IndlZWstZm9ybWF0Iix2YWx1ZToic3VuZGF5IixjaGVja2VkOm89PT0ic3VuZGF5IixvbkNoYW5nZTooKT0+bigic3VuZGF5Iil9KSwiV2VlayBiZWdpbnMgb24gU3VuZGF5IiksZSgibGFiZWwiLG51bGwsZSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToid2Vlay1mb3JtYXQiLHZhbHVlOiJtb25kYXkiLGNoZWNrZWQ6bz09PSJtb25kYXkiLG9uQ2hhbmdlOigpPT5uKCJtb25kYXkiKX0pLCJXZWVrIGJlZ2lucyBvbiBNb25kYXkiKSkpKX1mdW5jdGlvbiBheShlLHQpe2lmKCF0KXJldHVybiIiO2xldCBuPW5uKHQpO3JldHVybiBuJiZlPy5bbl18fCIifWZ1bmN0aW9uIFFkKHthcHA6ZSxjb25maWdQYXJhbXM6dCxvbkNhbmNlbDpuLG9uU2F2ZTpyLHBsdWdpbk5vdGVVVUlEOm8sdGltZUZvcm1hdDphLHdlZWtGb3JtYXQ6aX0pe2xldCBzPVduLmNyZWF0ZUVsZW1lbnQsW2xdPSgwLFduLnVzZVN0YXRlKSgoKT0+dHlwZW9mIHdpbmRvdz4idSI/MDp3aW5kb3cuc2Nyb2xsWT8/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcD8/MCksdT10Py5bSi5MTE1fUFJPVklERVJfTU9ERUxdLGM9dD8uW0ouQkFDS0dST1VORF9JTUFHRV9VUkxdLGQ9dD8uW0ouQkFDS0dST1VORF9JTUFHRV9NT0RFXSxwPXlyLmZpbmQoSD0+SC52YWx1ZT09PXUpfHx5clswXSxbZyx2XT0oMCxXbi51c2VTdGF0ZSkoYXkodCxwLmFwaUtleVByb3ZpZGVyKSksW3ksYl09KDAsV24udXNlU3RhdGUpKCExKSxbaCxtXT0oMCxXbi51c2VTdGF0ZSkodXx8Im9wZW5haSIpLFt3LGZdPSgwLFduLnVzZVN0YXRlKShhfHwibWVyaWRpYW4iKSxbVCxTXT0oMCxXbi51c2VTdGF0ZSkoaXx8InN1bmRheSIpO0EoIltzZXR0aW5ncy1wb3B1cF0gcmVuZGVyaW5nIERhc2hib2FyZFNldHRpbmdzUG9wdXAsIGN1cnJlbnRCYWNrZ3JvdW5kSW1hZ2VVcmw6IixjKTtsZXR7YmFja2dyb3VuZEltYWdlVXJsOkQsYmFja2dyb3VuZE1vZGU6TixzZXRCYWNrZ3JvdW5kTW9kZTpDLHVwbG9hZGluZzp4LGRyYWdPdmVyOk0sZmlsZUlucHV0UmVmOlAsaGFuZGxlRHJvcDpPLGhhbmRsZURyYWdPdmVyOlIsaGFuZGxlRHJhZ0xlYXZlOlUsaGFuZGxlRmlsZUlucHV0Q2hhbmdlOkcsaGFuZGxlUmVtb3ZlSW1hZ2U6UX09cWQoe2FwcDplLHBsdWdpbk5vdGVVVUlEOm8saW5pdGlhbEltYWdlVXJsOmMsaW5pdGlhbE1vZGU6ZH0pLHBlPXlyLmZpbmQoSD0+SC52YWx1ZT09PWgpfHx5clswXSxfZT1adltwZS5hcGlLZXlQcm92aWRlcl0sRT15ci5maW5kKEg9PkgudmFsdWU9PT1oKT8ubGFiZWwsaz1IPT57bShIKTtsZXQgSz15ci5maW5kKFY9PlYudmFsdWU9PT1IKXx8eXJbMF0scT1heSh0LEsuYXBpS2V5UHJvdmlkZXIpO3YocSl9LHtsaW5rUGFyZW50aGV0aWNhbDpGLG5vdGU6V309YjEoKTtyZXR1cm4gcyhRcix7dGl0bGU6Ilx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgU2V0dGluZ3MiLHNjcm9sbFRvcDpsLG9uU3VibWl0OigpPT5yKHthcGlLZXk6ZyxhcGlLZXlQcm92aWRlcjpwZS5hcGlLZXlQcm92aWRlcixiYWNrZ3JvdW5kSW1hZ2VVcmw6RCxiYWNrZ3JvdW5kTW9kZTpOLGxsbVByb3ZpZGVyOmgsdGltZUZvcm1hdDp3LHdlZWtGb3JtYXQ6VH0pLG9uQ2FuY2VsOm4sc3VibWl0TGFiZWw6IlNhdmUgU2V0dGluZ3MifSxzKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1jb250YWluZXIifSxrMShzLHtiYWNrZ3JvdW5kSW1hZ2VVcmw6RCxiYWNrZ3JvdW5kTW9kZTpOLGRyYWdPdmVyOk0sZmlsZUlucHV0UmVmOlAsb25CYWNrZ3JvdW5kTW9kZUNoYW5nZTpDLG9uRHJhZ0xlYXZlOlUsb25EcmFnT3ZlcjpSLG9uRHJvcDpPLG9uRmlsZUlucHV0Q2hhbmdlOkcsb25SZW1vdmVJbWFnZTpRLHVwbG9hZGluZzp4fSkseDEocyx7YXBpS2V5OmcsYXBpS2V5VmlzaWJsZTp5LGxpbmtQYXJlbnRoZXRpY2FsOkYsbm90ZTpXLG9uQXBpS2V5Q2hhbmdlOnYsb25Qcm92aWRlckNoYW5nZTprLG9uVG9nZ2xlS2V5VmlzaWJpbGl0eTooKT0+YihIPT4hSCkscHJvdmlkZXJBcGlLZXlVcmw6X2UscHJvdmlkZXJOYW1lOkUsc2VsZWN0ZWRQcm92aWRlcjpofSksUzEocyx7b25UaW1lRm9ybWF0Q2hhbmdlOmYsb25XZWVrRm9ybWF0Q2hhbmdlOlMsdGltZUZvcm1hdDp3LHdlZWtGb3JtYXQ6VH0pKSl9dmFyIEpkPXt9OyhmdW5jdGlvbiBlKHQsbixyLG8pe3ZhciBhPSEhKHQuV29ya2VyJiZ0LkJsb2ImJnQuUHJvbWlzZSYmdC5PZmZzY3JlZW5DYW52YXMmJnQuT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEJiZ0LkhUTUxDYW52YXNFbGVtZW50JiZ0LkhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS50cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbiYmdC5VUkwmJnQuVVJMLmNyZWF0ZU9iamVjdFVSTCksaT10eXBlb2YgUGF0aDJEPT0iZnVuY3Rpb24iJiZ0eXBlb2YgRE9NTWF0cml4PT0iZnVuY3Rpb24iLHM9ZnVuY3Rpb24oKXtpZighdC5PZmZzY3JlZW5DYW52YXMpcmV0dXJuITE7dHJ5e3ZhciBFPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSxrPUUuZ2V0Q29udGV4dCgiMmQiKTtrLmZpbGxSZWN0KDAsMCwxLDEpO3ZhciBGPUUudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7ay5jcmVhdGVQYXR0ZXJuKEYsIm5vLXJlcGVhdCIpfWNhdGNoe3JldHVybiExfXJldHVybiEwfSgpO2Z1bmN0aW9uIGwoKXt9ZnVuY3Rpb24gdShFKXt2YXIgaz1uLmV4cG9ydHMuUHJvbWlzZSxGPWshPT12b2lkIDA/azp0LlByb21pc2U7cmV0dXJuIHR5cGVvZiBGPT0iZnVuY3Rpb24iP25ldyBGKEUpOihFKGwsbCksbnVsbCl9dmFyIGM9ZnVuY3Rpb24oRSxrKXtyZXR1cm57dHJhbnNmb3JtOmZ1bmN0aW9uKEYpe2lmKEUpcmV0dXJuIEY7aWYoay5oYXMoRikpcmV0dXJuIGsuZ2V0KEYpO3ZhciBXPW5ldyBPZmZzY3JlZW5DYW52YXMoRi53aWR0aCxGLmhlaWdodCksSD1XLmdldENvbnRleHQoIjJkIik7cmV0dXJuIEguZHJhd0ltYWdlKEYsMCwwKSxrLnNldChGLFcpLFd9LGNsZWFyOmZ1bmN0aW9uKCl7ay5jbGVhcigpfX19KHMsbmV3IE1hcCksZD1mdW5jdGlvbigpe3ZhciBFPU1hdGguZmxvb3IoMTYuNjY2NjY2NjY2NjY2NjY4KSxrLEYsVz17fSxIPTA7cmV0dXJuIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiImJnR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIj8oaz1mdW5jdGlvbihLKXt2YXIgcT1NYXRoLnJhbmRvbSgpO3JldHVybiBXW3FdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBWKCQpe0g9PT0kfHxIK0UtMTwkPyhIPSQsZGVsZXRlIFdbcV0sSygpKTpXW3FdPXJlcXVlc3RBbmltYXRpb25GcmFtZShWKX0pLHF9LEY9ZnVuY3Rpb24oSyl7V1tLXSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoV1tLXSl9KTooaz1mdW5jdGlvbihLKXtyZXR1cm4gc2V0VGltZW91dChLLEUpfSxGPWZ1bmN0aW9uKEspe3JldHVybiBjbGVhclRpbWVvdXQoSyl9KSx7ZnJhbWU6ayxjYW5jZWw6Rn19KCkscD1mdW5jdGlvbigpe3ZhciBFLGssRj17fTtmdW5jdGlvbiBXKEgpe2Z1bmN0aW9uIEsocSxWKXtILnBvc3RNZXNzYWdlKHtvcHRpb25zOnF8fHt9LGNhbGxiYWNrOlZ9KX1ILmluaXQ9ZnVuY3Rpb24oVil7dmFyICQ9Vi50cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbigpO0gucG9zdE1lc3NhZ2Uoe2NhbnZhczokfSxbJF0pfSxILmZpcmU9ZnVuY3Rpb24oViwkLFgpe2lmKGspcmV0dXJuIEsoVixudWxsKSxrO3ZhciB0ZT1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtyZXR1cm4gaz11KGZ1bmN0aW9uKFope2Z1bmN0aW9uIHNlKGJlKXtiZS5kYXRhLmNhbGxiYWNrPT09dGUmJihkZWxldGUgRlt0ZV0sSC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzZSksaz1udWxsLGMuY2xlYXIoKSxYKCksWigpKX1ILmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHNlKSxLKFYsdGUpLEZbdGVdPXNlLmJpbmQobnVsbCx7ZGF0YTp7Y2FsbGJhY2s6dGV9fSl9KSxrfSxILnJlc2V0PWZ1bmN0aW9uKCl7SC5wb3N0TWVzc2FnZSh7cmVzZXQ6ITB9KTtmb3IodmFyIFYgaW4gRilGW1ZdKCksZGVsZXRlIEZbVl19fXJldHVybiBmdW5jdGlvbigpe2lmKEUpcmV0dXJuIEU7aWYoIXImJmEpe3ZhciBIPVsidmFyIENPTkZFVFRJLCBTSVpFID0ge30sIG1vZHVsZSA9IHt9OyIsIigiK2UudG9TdHJpbmcoKSsiKSh0aGlzLCBtb2R1bGUsIHRydWUsIFNJWkUpOyIsIm9ubWVzc2FnZSA9IGZ1bmN0aW9uKG1zZykgeyIsIiAgaWYgKG1zZy5kYXRhLm9wdGlvbnMpIHsiLCIgICAgQ09ORkVUVEkobXNnLmRhdGEub3B0aW9ucykudGhlbihmdW5jdGlvbiAoKSB7IiwiICAgICAgaWYgKG1zZy5kYXRhLmNhbGxiYWNrKSB7IiwiICAgICAgICBwb3N0TWVzc2FnZSh7IGNhbGxiYWNrOiBtc2cuZGF0YS5jYWxsYmFjayB9KTsiLCIgICAgICB9IiwiICAgIH0pOyIsIiAgfSBlbHNlIGlmIChtc2cuZGF0YS5yZXNldCkgeyIsIiAgICBDT05GRVRUSSAmJiBDT05GRVRUSS5yZXNldCgpOyIsIiAgfSBlbHNlIGlmIChtc2cuZGF0YS5yZXNpemUpIHsiLCIgICAgU0laRS53aWR0aCA9IG1zZy5kYXRhLnJlc2l6ZS53aWR0aDsiLCIgICAgU0laRS5oZWlnaHQgPSBtc2cuZGF0YS5yZXNpemUuaGVpZ2h0OyIsIiAgfSBlbHNlIGlmIChtc2cuZGF0YS5jYW52YXMpIHsiLCIgICAgU0laRS53aWR0aCA9IG1zZy5kYXRhLmNhbnZhcy53aWR0aDsiLCIgICAgU0laRS5oZWlnaHQgPSBtc2cuZGF0YS5jYW52YXMuaGVpZ2h0OyIsIiAgICBDT05GRVRUSSA9IG1vZHVsZS5leHBvcnRzLmNyZWF0ZShtc2cuZGF0YS5jYW52YXMpOyIsIiAgfSIsIn0iXS5qb2luKGAKYCk7dHJ5e0U9bmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtIXSkpKX1jYXRjaChLKXtyZXR1cm4gdHlwZW9mIGNvbnNvbGU8InUiJiZ0eXBlb2YgY29uc29sZS53YXJuPT0iZnVuY3Rpb24iJiZjb25zb2xlLndhcm4oIlx1ezFGMzhBfSBDb3VsZCBub3QgbG9hZCB3b3JrZXIiLEspLG51bGx9VyhFKX1yZXR1cm4gRX19KCksZz17cGFydGljbGVDb3VudDo1MCxhbmdsZTo5MCxzcHJlYWQ6NDUsc3RhcnRWZWxvY2l0eTo0NSxkZWNheTouOSxncmF2aXR5OjEsZHJpZnQ6MCx0aWNrczoyMDAseDouNSx5Oi41LHNoYXBlczpbInNxdWFyZSIsImNpcmNsZSJdLHpJbmRleDoxMDAsY29sb3JzOlsiIzI2Y2NmZiIsIiNhMjVhZmQiLCIjZmY1ZTdlIiwiIzg4ZmY1YSIsIiNmY2ZmNDIiLCIjZmZhNjJkIiwiI2ZmMzZmZiJdLGRpc2FibGVGb3JSZWR1Y2VkTW90aW9uOiExLHNjYWxhcjoxfTtmdW5jdGlvbiB2KEUsayl7cmV0dXJuIGs/ayhFKTpFfWZ1bmN0aW9uIHkoRSl7cmV0dXJuIEUhPW51bGx9ZnVuY3Rpb24gYihFLGssRil7cmV0dXJuIHYoRSYmeShFW2tdKT9FW2tdOmdba10sRil9ZnVuY3Rpb24gaChFKXtyZXR1cm4gRTwwPzA6TWF0aC5mbG9vcihFKX1mdW5jdGlvbiBtKEUsayl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooay1FKSkrRX1mdW5jdGlvbiB3KEUpe3JldHVybiBwYXJzZUludChFLDE2KX1mdW5jdGlvbiBmKEUpe3JldHVybiBFLm1hcChUKX1mdW5jdGlvbiBUKEUpe3ZhciBrPVN0cmluZyhFKS5yZXBsYWNlKC9bXjAtOWEtZl0vZ2ksIiIpO3JldHVybiBrLmxlbmd0aDw2JiYoaz1rWzBdK2tbMF0ra1sxXStrWzFdK2tbMl0ra1syXSkse3I6dyhrLnN1YnN0cmluZygwLDIpKSxnOncoay5zdWJzdHJpbmcoMiw0KSksYjp3KGsuc3Vic3RyaW5nKDQsNikpfX1mdW5jdGlvbiBTKEUpe3ZhciBrPWIoRSwib3JpZ2luIixPYmplY3QpO3JldHVybiBrLng9YihrLCJ4IixOdW1iZXIpLGsueT1iKGssInkiLE51bWJlciksa31mdW5jdGlvbiBEKEUpe0Uud2lkdGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLEUuaGVpZ2h0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gTihFKXt2YXIgaz1FLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO0Uud2lkdGg9ay53aWR0aCxFLmhlaWdodD1rLmhlaWdodH1mdW5jdGlvbiBDKEUpe3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiBrLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsay5zdHlsZS50b3A9IjBweCIsay5zdHlsZS5sZWZ0PSIwcHgiLGsuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsay5zdHlsZS56SW5kZXg9RSxrfWZ1bmN0aW9uIHgoRSxrLEYsVyxILEsscSxWLCQpe0Uuc2F2ZSgpLEUudHJhbnNsYXRlKGssRiksRS5yb3RhdGUoSyksRS5zY2FsZShXLEgpLEUuYXJjKDAsMCwxLHEsViwkKSxFLnJlc3RvcmUoKX1mdW5jdGlvbiBNKEUpe3ZhciBrPUUuYW5nbGUqKE1hdGguUEkvMTgwKSxGPUUuc3ByZWFkKihNYXRoLlBJLzE4MCk7cmV0dXJue3g6RS54LHk6RS55LHdvYmJsZTpNYXRoLnJhbmRvbSgpKjEwLHdvYmJsZVNwZWVkOk1hdGgubWluKC4xMSxNYXRoLnJhbmRvbSgpKi4xKy4wNSksdmVsb2NpdHk6RS5zdGFydFZlbG9jaXR5Ki41K01hdGgucmFuZG9tKCkqRS5zdGFydFZlbG9jaXR5LGFuZ2xlMkQ6LWsrKC41KkYtTWF0aC5yYW5kb20oKSpGKSx0aWx0QW5nbGU6KE1hdGgucmFuZG9tKCkqKC43NS0uMjUpKy4yNSkqTWF0aC5QSSxjb2xvcjpFLmNvbG9yLHNoYXBlOkUuc2hhcGUsdGljazowLHRvdGFsVGlja3M6RS50aWNrcyxkZWNheTpFLmRlY2F5LGRyaWZ0OkUuZHJpZnQscmFuZG9tOk1hdGgucmFuZG9tKCkrMix0aWx0U2luOjAsdGlsdENvczowLHdvYmJsZVg6MCx3b2JibGVZOjAsZ3Jhdml0eTpFLmdyYXZpdHkqMyxvdmFsU2NhbGFyOi42LHNjYWxhcjpFLnNjYWxhcixmbGF0OkUuZmxhdH19ZnVuY3Rpb24gUChFLGspe2sueCs9TWF0aC5jb3Moay5hbmdsZTJEKSprLnZlbG9jaXR5K2suZHJpZnQsay55Kz1NYXRoLnNpbihrLmFuZ2xlMkQpKmsudmVsb2NpdHkray5ncmF2aXR5LGsudmVsb2NpdHkqPWsuZGVjYXksay5mbGF0PyhrLndvYmJsZT0wLGsud29iYmxlWD1rLngrMTAqay5zY2FsYXIsay53b2JibGVZPWsueSsxMCprLnNjYWxhcixrLnRpbHRTaW49MCxrLnRpbHRDb3M9MCxrLnJhbmRvbT0xKTooay53b2JibGUrPWsud29iYmxlU3BlZWQsay53b2JibGVYPWsueCsxMCprLnNjYWxhcipNYXRoLmNvcyhrLndvYmJsZSksay53b2JibGVZPWsueSsxMCprLnNjYWxhcipNYXRoLnNpbihrLndvYmJsZSksay50aWx0QW5nbGUrPS4xLGsudGlsdFNpbj1NYXRoLnNpbihrLnRpbHRBbmdsZSksay50aWx0Q29zPU1hdGguY29zKGsudGlsdEFuZ2xlKSxrLnJhbmRvbT1NYXRoLnJhbmRvbSgpKzIpO3ZhciBGPWsudGljaysrL2sudG90YWxUaWNrcyxXPWsueCtrLnJhbmRvbSprLnRpbHRDb3MsSD1rLnkray5yYW5kb20qay50aWx0U2luLEs9ay53b2JibGVYK2sucmFuZG9tKmsudGlsdENvcyxxPWsud29iYmxlWStrLnJhbmRvbSprLnRpbHRTaW47aWYoRS5maWxsU3R5bGU9InJnYmEoIitrLmNvbG9yLnIrIiwgIitrLmNvbG9yLmcrIiwgIitrLmNvbG9yLmIrIiwgIisoMS1GKSsiKSIsRS5iZWdpblBhdGgoKSxpJiZrLnNoYXBlLnR5cGU9PT0icGF0aCImJnR5cGVvZiBrLnNoYXBlLnBhdGg9PSJzdHJpbmciJiZBcnJheS5pc0FycmF5KGsuc2hhcGUubWF0cml4KSlFLmZpbGwoUShrLnNoYXBlLnBhdGgsay5zaGFwZS5tYXRyaXgsay54LGsueSxNYXRoLmFicyhLLVcpKi4xLE1hdGguYWJzKHEtSCkqLjEsTWF0aC5QSS8xMCprLndvYmJsZSkpO2Vsc2UgaWYoay5zaGFwZS50eXBlPT09ImJpdG1hcCIpe3ZhciBWPU1hdGguUEkvMTAqay53b2JibGUsJD1NYXRoLmFicyhLLVcpKi4xLFg9TWF0aC5hYnMocS1IKSouMSx0ZT1rLnNoYXBlLmJpdG1hcC53aWR0aCprLnNjYWxhcixaPWsuc2hhcGUuYml0bWFwLmhlaWdodCprLnNjYWxhcixzZT1uZXcgRE9NTWF0cml4KFtNYXRoLmNvcyhWKSokLE1hdGguc2luKFYpKiQsLU1hdGguc2luKFYpKlgsTWF0aC5jb3MoVikqWCxrLngsay55XSk7c2UubXVsdGlwbHlTZWxmKG5ldyBET01NYXRyaXgoay5zaGFwZS5tYXRyaXgpKTt2YXIgYmU9RS5jcmVhdGVQYXR0ZXJuKGMudHJhbnNmb3JtKGsuc2hhcGUuYml0bWFwKSwibm8tcmVwZWF0Iik7YmUuc2V0VHJhbnNmb3JtKHNlKSxFLmdsb2JhbEFscGhhPTEtRixFLmZpbGxTdHlsZT1iZSxFLmZpbGxSZWN0KGsueC10ZS8yLGsueS1aLzIsdGUsWiksRS5nbG9iYWxBbHBoYT0xfWVsc2UgaWYoay5zaGFwZT09PSJjaXJjbGUiKUUuZWxsaXBzZT9FLmVsbGlwc2Uoay54LGsueSxNYXRoLmFicyhLLVcpKmsub3ZhbFNjYWxhcixNYXRoLmFicyhxLUgpKmsub3ZhbFNjYWxhcixNYXRoLlBJLzEwKmsud29iYmxlLDAsMipNYXRoLlBJKTp4KEUsay54LGsueSxNYXRoLmFicyhLLVcpKmsub3ZhbFNjYWxhcixNYXRoLmFicyhxLUgpKmsub3ZhbFNjYWxhcixNYXRoLlBJLzEwKmsud29iYmxlLDAsMipNYXRoLlBJKTtlbHNlIGlmKGsuc2hhcGU9PT0ic3RhciIpZm9yKHZhciByZT1NYXRoLlBJLzIqMyxZPTQqay5zY2FsYXIsZmU9OCprLnNjYWxhcixUZT1rLngsUWU9ay55LHN0PTUsQ2U9TWF0aC5QSS9zdDtzdC0tOylUZT1rLngrTWF0aC5jb3MocmUpKmZlLFFlPWsueStNYXRoLnNpbihyZSkqZmUsRS5saW5lVG8oVGUsUWUpLHJlKz1DZSxUZT1rLngrTWF0aC5jb3MocmUpKlksUWU9ay55K01hdGguc2luKHJlKSpZLEUubGluZVRvKFRlLFFlKSxyZSs9Q2U7ZWxzZSBFLm1vdmVUbyhNYXRoLmZsb29yKGsueCksTWF0aC5mbG9vcihrLnkpKSxFLmxpbmVUbyhNYXRoLmZsb29yKGsud29iYmxlWCksTWF0aC5mbG9vcihIKSksRS5saW5lVG8oTWF0aC5mbG9vcihLKSxNYXRoLmZsb29yKHEpKSxFLmxpbmVUbyhNYXRoLmZsb29yKFcpLE1hdGguZmxvb3Ioay53b2JibGVZKSk7cmV0dXJuIEUuY2xvc2VQYXRoKCksRS5maWxsKCksay50aWNrPGsudG90YWxUaWNrc31mdW5jdGlvbiBPKEUsayxGLFcsSCl7dmFyIEs9ay5zbGljZSgpLHE9RS5nZXRDb250ZXh0KCIyZCIpLFYsJCxYPXUoZnVuY3Rpb24odGUpe2Z1bmN0aW9uIFooKXtWPSQ9bnVsbCxxLmNsZWFyUmVjdCgwLDAsVy53aWR0aCxXLmhlaWdodCksYy5jbGVhcigpLEgoKSx0ZSgpfWZ1bmN0aW9uIHNlKCl7ciYmIShXLndpZHRoPT09by53aWR0aCYmVy5oZWlnaHQ9PT1vLmhlaWdodCkmJihXLndpZHRoPUUud2lkdGg9by53aWR0aCxXLmhlaWdodD1FLmhlaWdodD1vLmhlaWdodCksIVcud2lkdGgmJiFXLmhlaWdodCYmKEYoRSksVy53aWR0aD1FLndpZHRoLFcuaGVpZ2h0PUUuaGVpZ2h0KSxxLmNsZWFyUmVjdCgwLDAsVy53aWR0aCxXLmhlaWdodCksSz1LLmZpbHRlcihmdW5jdGlvbihiZSl7cmV0dXJuIFAocSxiZSl9KSxLLmxlbmd0aD9WPWQuZnJhbWUoc2UpOlooKX1WPWQuZnJhbWUoc2UpLCQ9Wn0pO3JldHVybnthZGRGZXR0aXM6ZnVuY3Rpb24odGUpe3JldHVybiBLPUsuY29uY2F0KHRlKSxYfSxjYW52YXM6RSxwcm9taXNlOlgscmVzZXQ6ZnVuY3Rpb24oKXtWJiZkLmNhbmNlbChWKSwkJiYkKCl9fX1mdW5jdGlvbiBSKEUsayl7dmFyIEY9IUUsVz0hIWIoa3x8e30sInJlc2l6ZSIpLEg9ITEsSz1iKGssImRpc2FibGVGb3JSZWR1Y2VkTW90aW9uIixCb29sZWFuKSxxPWEmJiEhYihrfHx7fSwidXNlV29ya2VyIiksVj1xP3AoKTpudWxsLCQ9Rj9EOk4sWD1FJiZWPyEhRS5fX2NvbmZldHRpX2luaXRpYWxpemVkOiExLHRlPXR5cGVvZiBtYXRjaE1lZGlhPT0iZnVuY3Rpb24iJiZtYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbikiKS5tYXRjaGVzLFo7ZnVuY3Rpb24gc2UocmUsWSxmZSl7Zm9yKHZhciBUZT1iKHJlLCJwYXJ0aWNsZUNvdW50IixoKSxRZT1iKHJlLCJhbmdsZSIsTnVtYmVyKSxzdD1iKHJlLCJzcHJlYWQiLE51bWJlciksQ2U9YihyZSwic3RhcnRWZWxvY2l0eSIsTnVtYmVyKSxUdD1iKHJlLCJkZWNheSIsTnVtYmVyKSxFbj1iKHJlLCJncmF2aXR5IixOdW1iZXIpLGRuPWIocmUsImRyaWZ0IixOdW1iZXIpLGpuPWIocmUsImNvbG9ycyIsZiksWnI9YihyZSwidGlja3MiLE51bWJlcikseHI9YihyZSwic2hhcGVzIiksZW89YihyZSwic2NhbGFyIiksdG89ISFiKHJlLCJmbGF0IiksbWk9UyhyZSksaGk9VGUscW89W10sa2w9RS53aWR0aCptaS54LFNsPUUuaGVpZ2h0Km1pLnk7aGktLTspcW8ucHVzaChNKHt4OmtsLHk6U2wsYW5nbGU6UWUsc3ByZWFkOnN0LHN0YXJ0VmVsb2NpdHk6Q2UsY29sb3I6am5baGklam4ubGVuZ3RoXSxzaGFwZTp4clttKDAseHIubGVuZ3RoKV0sdGlja3M6WnIsZGVjYXk6VHQsZ3Jhdml0eTpFbixkcmlmdDpkbixzY2FsYXI6ZW8sZmxhdDp0b30pKTtyZXR1cm4gWj9aLmFkZEZldHRpcyhxbyk6KFo9TyhFLHFvLCQsWSxmZSksWi5wcm9taXNlKX1mdW5jdGlvbiBiZShyZSl7dmFyIFk9S3x8YihyZSwiZGlzYWJsZUZvclJlZHVjZWRNb3Rpb24iLEJvb2xlYW4pLGZlPWIocmUsInpJbmRleCIsTnVtYmVyKTtpZihZJiZ0ZSlyZXR1cm4gdShmdW5jdGlvbihDZSl7Q2UoKX0pO0YmJlo/RT1aLmNhbnZhczpGJiYhRSYmKEU9QyhmZSksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKSksVyYmIVgmJiQoRSk7dmFyIFRlPXt3aWR0aDpFLndpZHRoLGhlaWdodDpFLmhlaWdodH07ViYmIVgmJlYuaW5pdChFKSxYPSEwLFYmJihFLl9fY29uZmV0dGlfaW5pdGlhbGl6ZWQ9ITApO2Z1bmN0aW9uIFFlKCl7aWYoVil7dmFyIENlPXtnZXRCb3VuZGluZ0NsaWVudFJlY3Q6ZnVuY3Rpb24oKXtpZighRilyZXR1cm4gRS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX19OyQoQ2UpLFYucG9zdE1lc3NhZ2Uoe3Jlc2l6ZTp7d2lkdGg6Q2Uud2lkdGgsaGVpZ2h0OkNlLmhlaWdodH19KTtyZXR1cm59VGUud2lkdGg9VGUuaGVpZ2h0PW51bGx9ZnVuY3Rpb24gc3QoKXtaPW51bGwsVyYmKEg9ITEsdC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLFFlKSksRiYmRSYmKGRvY3VtZW50LmJvZHkuY29udGFpbnMoRSkmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSksRT1udWxsLFg9ITEpfXJldHVybiBXJiYhSCYmKEg9ITAsdC5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLFFlLCExKSksVj9WLmZpcmUocmUsVGUsc3QpOnNlKHJlLFRlLHN0KX1yZXR1cm4gYmUucmVzZXQ9ZnVuY3Rpb24oKXtWJiZWLnJlc2V0KCksWiYmWi5yZXNldCgpfSxiZX12YXIgVTtmdW5jdGlvbiBHKCl7cmV0dXJuIFV8fChVPVIobnVsbCx7dXNlV29ya2VyOiEwLHJlc2l6ZTohMH0pKSxVfWZ1bmN0aW9uIFEoRSxrLEYsVyxILEsscSl7dmFyIFY9bmV3IFBhdGgyRChFKSwkPW5ldyBQYXRoMkQ7JC5hZGRQYXRoKFYsbmV3IERPTU1hdHJpeChrKSk7dmFyIFg9bmV3IFBhdGgyRDtyZXR1cm4gWC5hZGRQYXRoKCQsbmV3IERPTU1hdHJpeChbTWF0aC5jb3MocSkqSCxNYXRoLnNpbihxKSpILC1NYXRoLnNpbihxKSpLLE1hdGguY29zKHEpKkssRixXXSkpLFh9ZnVuY3Rpb24gcGUoRSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJwYXRoIGNvbmZldHRpIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciIpO3ZhciBrLEY7dHlwZW9mIEU9PSJzdHJpbmciP2s9RTooaz1FLnBhdGgsRj1FLm1hdHJpeCk7dmFyIFc9bmV3IFBhdGgyRChrKSxIPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLEs9SC5nZXRDb250ZXh0KCIyZCIpO2lmKCFGKXtmb3IodmFyIHE9MWUzLFY9cSwkPXEsWD0wLHRlPTAsWixzZSxiZT0wO2JlPHE7YmUrPTIpZm9yKHZhciByZT0wO3JlPHE7cmUrPTIpSy5pc1BvaW50SW5QYXRoKFcsYmUscmUsIm5vbnplcm8iKSYmKFY9TWF0aC5taW4oVixiZSksJD1NYXRoLm1pbigkLHJlKSxYPU1hdGgubWF4KFgsYmUpLHRlPU1hdGgubWF4KHRlLHJlKSk7Wj1YLVYsc2U9dGUtJDt2YXIgWT0xMCxmZT1NYXRoLm1pbihZL1osWS9zZSk7Rj1bZmUsMCwwLGZlLC1NYXRoLnJvdW5kKFovMitWKSpmZSwtTWF0aC5yb3VuZChzZS8yKyQpKmZlXX1yZXR1cm57dHlwZToicGF0aCIscGF0aDprLG1hdHJpeDpGfX1mdW5jdGlvbiBfZShFKXt2YXIgayxGPTEsVz0iIzAwMDAwMCIsSD0nIkFwcGxlIENvbG9yIEVtb2ppIiwgIlNlZ29lIFVJIEVtb2ppIiwgIlNlZ29lIFVJIFN5bWJvbCIsICJOb3RvIENvbG9yIEVtb2ppIiwgIkVtb2ppT25lIENvbG9yIiwgIkFuZHJvaWQgRW1vamkiLCAiVHdlbW9qaSBNb3ppbGxhIiwgInN5c3RlbSBlbW9qaSIsIHNhbnMtc2VyaWYnO3R5cGVvZiBFPT0ic3RyaW5nIj9rPUU6KGs9RS50ZXh0LEY9InNjYWxhciJpbiBFP0Uuc2NhbGFyOkYsSD0iZm9udEZhbWlseSJpbiBFP0UuZm9udEZhbWlseTpILFc9ImNvbG9yImluIEU/RS5jb2xvcjpXKTt2YXIgSz0xMCpGLHE9IiIrSysicHggIitILFY9bmV3IE9mZnNjcmVlbkNhbnZhcyhLLEspLCQ9Vi5nZXRDb250ZXh0KCIyZCIpOyQuZm9udD1xO3ZhciBYPSQubWVhc3VyZVRleHQoayksdGU9TWF0aC5jZWlsKFguYWN0dWFsQm91bmRpbmdCb3hSaWdodCtYLmFjdHVhbEJvdW5kaW5nQm94TGVmdCksWj1NYXRoLmNlaWwoWC5hY3R1YWxCb3VuZGluZ0JveEFzY2VudCtYLmFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCksc2U9MixiZT1YLmFjdHVhbEJvdW5kaW5nQm94TGVmdCtzZSxyZT1YLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50K3NlO3RlKz1zZStzZSxaKz1zZStzZSxWPW5ldyBPZmZzY3JlZW5DYW52YXModGUsWiksJD1WLmdldENvbnRleHQoIjJkIiksJC5mb250PXEsJC5maWxsU3R5bGU9VywkLmZpbGxUZXh0KGssYmUscmUpO3ZhciBZPTEvRjtyZXR1cm57dHlwZToiYml0bWFwIixiaXRtYXA6Vi50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKSxtYXRyaXg6W1ksMCwwLFksLXRlKlkvMiwtWipZLzJdfX1uLmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gRygpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbi5leHBvcnRzLnJlc2V0PWZ1bmN0aW9uKCl7RygpLnJlc2V0KCl9LG4uZXhwb3J0cy5jcmVhdGU9UixuLmV4cG9ydHMuc2hhcGVGcm9tUGF0aD1wZSxuLmV4cG9ydHMuc2hhcGVGcm9tVGV4dD1fZX0pKGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0aGlzfHx7fX0oKSxKZCwhMSk7dmFyIGl5PUpkLmV4cG9ydHMsWk89SmQuZXhwb3J0cy5jcmVhdGU7ZnVuY3Rpb24gZmwoZSl7bGV0IHQ9ZS5zZXR0aW5nc1tKLkxMTV9QUk9WSURFUl9NT0RFTF07aWYoIXR8fHQ9PT0ibm9uZSIpcmV0dXJuW107bGV0IG49cHIodCl8fHQscj1ZZFtuXTtpZighcnx8ci5sZW5ndGg9PT0wKXJldHVybltdO2xldCBvPUpyW25dO3JldHVybiBvP1tvLC4uLnIuZmlsdGVyKGE9PmEhPT1vKV06Wy4uLnJdfWZ1bmN0aW9uIHN5KGUsdCl7bGV0IG49bm4odCk7aWYobiYmZS5zZXR0aW5nc1tuXSlyZXR1cm4gZS5zZXR0aW5nc1tuXS50cmltKCk7bGV0IHI9ZS5zZXR0aW5nc1siTExNIEFQSSBLZXkiXTtpZihyKXJldHVybiByLnRyaW0oKTtpZihyZyl0aHJvdyBuZXcgRXJyb3IoYENvdWxkbnQgZmluZCBhICR7dH0ga2V5IGluICR7SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoZS5zZXR0aW5ncykpfWApO3JldHVybiBlLmFsZXJ0KCJQbGVhc2UgY29uZmlndXJlIHlvdXIgQVBJIGtleSBpbiBwbHVnaW4gc2V0dGluZ3MuIiksbnVsbH1mdW5jdGlvbiBseShlLHQpe2xldCBuPXdyKGUpLHI9S2Rbbl07cmV0dXJuIHI9ci5yZXBsYWNlKCJ7bW9kZWwtbmFtZX0iLGUpLG49PT0iZ2VtaW5pIiYmKHI9YCR7cn0/a2V5PSR7dH1gKSxyfWZ1bmN0aW9uIHdyKGUpe2ZvcihsZXRbdCxuXW9mIE9iamVjdC5lbnRyaWVzKFlkKSlpZihuLmluY2x1ZGVzKGUpKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgTW9kZWwgJHtlfSBub3QgZm91bmQgaW4gYW55IHByb3ZpZGVyYCl9ZnVuY3Rpb24gYnIoZSl7cmV0dXJue2FudGhyb3BpYzoiQW50aHJvcGljIixkZWVwc2VlazoiRGVlcFNlZWsiLGdlbWluaToiR2VtaW5pIixncm9rOiJHcm9rIixvcGVuYWk6Ik9wZW5BSSIscGVycGxleGl0eToiUGVycGxleGl0eSJ9W2VdfHxlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9ZnVuY3Rpb24gdXkoZSl7bGV0IHQsbj1lLnRyaW0oKSxyPW4uaW5kZXhPZigiWyIpLG89bi5pbmRleE9mKCJ7IiksYT1uLmluY2x1ZGVzKCJ9IiksaT1uLmluY2x1ZGVzKCJdIikscz0hMSxsPS0xO2EmJm89PT0tMSYmKGU9YHske2V9YCxvPTApLGkmJnI9PT0tMSYmKGU9YFske2V9YCxyPTApLHI9ZS5pbmRleE9mKCJbIiksbz1lLmluZGV4T2YoInsiKSxyIT09LTEmJihvPT09LTF8fHI8byk/KHM9ITAsbD1yKTpvIT09LTE/KHM9ITEsbD1vKTooZT1geyR7ZX19YCxsPTAscz0hMSk7bGV0IHU9cz8iXSI6In0iLGM9ZS5sYXN0SW5kZXhPZih1KTtpZihjPT09LTEpe2VbZS5sZW5ndGgtMV09PT0iLCImJihlPWUuc3Vic3RyaW5nKDAsZS5sZW5ndGgtMSkpO2xldCBkPWUuaW5jbHVkZXMoIlsiKSYmIWUuaW5jbHVkZXMoIl0iKSxwPWUuaW5jbHVkZXMoInsiKSYmIWUuaW5jbHVkZXMoIn0iKTtkJiZwP2UrPSJ9XSI6ZD9lKz0iXSI6cD9lKz0ifSI6ZT1zP2Ake2V9XWA6YCR7ZX19YH1lbHNlIGU9ZS5zdWJzdHJpbmcobCxjKzEpO3RyeXtyZXR1cm4gdD1KU09OLnBhcnNlKGUpLHR9Y2F0Y2goZCl7bGV0IHA9ZTtlPUUxKGUpLEEoYEZhaWxlZCB0byBwYXJzZSBqc29uVGV4dCBTVEFSVDoKJHtwfQpFTkQKIGR1ZSB0byAke2R9LiBBdHRlbXB0ZWQgcmViYWxhbmNlIHlpZWxkZWQ6ICR7ZX0gKG9yaWdpbmFsIHNpemUgJHtwLmxlbmd0aHx8IihudWxsKSJ9LCByZWJhbGFuY2Ugc2l6ZSAke2U/Lmxlbmd0aHx8IigwKSJ9KWApO3RyeXtyZXR1cm4gdD1KU09OLnBhcnNlKGUpLHR9Y2F0Y2godil7QSgiUmViYWxhbmNlZCBqc29uVGV4dCBzdGlsbCBmYWlscyIsdil9bGV0IGc9ZS5yZXBsYWNlKC8iIiIvZywnIlxcIiInKS5yZXBsYWNlKC8iXG4vZywnIlxcbicpO2lmKGc9Zy5yZXBsYWNlKC8oW3ssXVxzKikoW2EtekEtWl8kXVthLXpBLVowLTlfJF0qKSI6L2csJyQxIiQyIjonKSxnPWcucmVwbGFjZSgvXG5ccypbJ+KAnOKAnV0vZyxgCiJgKS5yZXBsYWNlKC9bJ+KAnOKAnV0sXHMqXG4vZyxgIiwKYCkucmVwbGFjZSgvWyfigJzigJ1dXHMqKFtcblxdXSkvLCciJDEnKSxnIT09ZSl0cnl7cmV0dXJuIHQ9SlNPTi5wYXJzZShnKSx0fWNhdGNoKHYpe0EoIlJlZm9ybWF0dGVkIHRleHQgc3RpbGwgZmFpbHMiLHYpfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBFMShlKXtsZXQgdD1lLmluZGV4T2YoInsiKTtpZih0PT09LTEpcmV0dXJuIG51bGw7bGV0IG49ZS5zdWJzdHJpbmcodCkudHJpbSgpLHI9W10sbz0iIjtmb3IobGV0IGEgb2YgbilpZihvKz1hLGE9PT0ieyI/ci5wdXNoKCJ9Iik6YT09PSJ9Ij9yW3IubGVuZ3RoLTFdPT09In0iJiZyLnBvcCgpOmE9PT0iWyI/ci5wdXNoKCJdIik6YT09PSJdIiYmcltyLmxlbmd0aC0xXT09PSJdIiYmci5wb3AoKSxyLmxlbmd0aD09PTApYnJlYWs7cmV0dXJuIHIubGVuZ3RoJiYoQSgiRm91bmQiLHIubGVuZ3RoLCJjaGFyYWN0ZXJzIHRvIGFwcGVuZCB0byBiYWxhbmNlIixvLCIuIEFkZGluZyAiLHIucmV2ZXJzZSgpLmpvaW4oIiIpKSxvKz1yLnJldmVyc2UoKS5qb2luKCIiKSksb312YXIgY3k9MjtmdW5jdGlvbiBYZChlKXtsZXQgdD1lLnRyaW0oKTt0LmluZGV4T2YoInsiKT09PS0xJiYodD0ieyIrdCk7bGV0IHI7dC5zcGxpdCgifXsiKS5sZW5ndGg+MT8ocj10LnNwbGl0KCJ9eyIpLm1hcChpPT5gJHtpWzBdPT09InsiPyIiOiJ7In0ke2l9JHtpW2kubGVuZ3RoLTFdPT09In0iPyIiOiJ9In1gKSxBKCJSZWNlaXZlZCBtdWx0aXBsZSByZXNwb25zZXMgZnJvbSBBSSwgZXZhbHVhdGluZyBlYWNoIG9mIixyKSk6cj1bdF07bGV0IGE9ci5tYXAoaT0+dXkoaSkpLmZpbHRlcihpPT5pKTtpZihhLmxlbmd0aClpZihhLmxlbmd0aD4xKXtsZXQgaT1hWzBdO3JldHVybiBPYmplY3QuZW50cmllcyhpKS5mb3JFYWNoKChbcyxsXSk9Pntmb3IobGV0IHUgb2YgYS5zbGljZSgxKSl7bGV0IGM9dVtzXTtjJiZBcnJheS5pc0FycmF5KGMpJiZBcnJheS5pc0FycmF5KGwpJiYoaVtzXT1bLi4ubmV3IFNldChbLi4ubCwuLi5jXSldLmZpbHRlcihkPT5kKSl9fSksaX1lbHNlIHJldHVybiBhWzBdO3JldHVybiBudWxsfWZ1bmN0aW9uIFQxKGUsdCl7bGV0IG47c3dpdGNoKGUpe2Nhc2UiYW50aHJvcGljIjpuPXQ/LmNvbnRlbnQ/LmF0KDApPy50ZXh0O2JyZWFrO2Nhc2UiZ2VtaW5pIjpuPXQ/LmNhbmRpZGF0ZXM/LmF0KDApPy5jb250ZW50Py5wYXJ0cz8uYXQoMCk/LnRleHQ7YnJlYWs7Y2FzZSJvbGxhbWEiOm49dD8ubWVzc2FnZT8uY29udGVudHx8dD8ucmVzcG9uc2U7YnJlYWs7Y2FzZSJkZWVwc2VlayI6Y2FzZSJncm9rIjpjYXNlIm9wZW5haSI6Y2FzZSJwZXJwbGV4aXR5IjpkZWZhdWx0Om49dD8uY2hvaWNlcz8uYXQoMCk/Lm1lc3NhZ2U/LmNvbnRlbnR8fHQ/LmNob2ljZXM/LmF0KDApPy5tZXNzYWdlPy50b29sX2NhbGxzPy5hdCgwKT8uZnVuY3Rpb24/LmFyZ3VtZW50czticmVha31yZXR1cm4gbnx8QShgQ291bGQgbm90IGV4dHJhY3QgY29udGVudCBmcm9tICR7ZX0gcmVzcG9uc2U6YCxKU09OLnN0cmluZ2lmeSh0LG51bGwsMikpLG58fG51bGx9YXN5bmMgZnVuY3Rpb24gZHkoZSx0LG4scixvLGEse3RpbWVvdXRTZWNvbmRzOmk9MzB9PXt9KXtsZXQgcz13cihuKSxsO2lmKG8pbD1hd2FpdCBOMShlLHQsbiwhMCxvKSxlLmFsZXJ0KGwse3Njcm9sbFRvRW5kOiEwfSk7ZWxzZSB0cnl7YXdhaXQgUHJvbWlzZS5yYWNlKFtuZXcgUHJvbWlzZShhc3luYyhjLGQpPT57bGV0IHA9YXdhaXQgdC5qc29uKCk7bD1UMShzLHApLGMobCl9KSxuZXcgUHJvbWlzZSgoYyxkKT0+c2V0VGltZW91dCgoKT0+ZChuZXcgRXJyb3IoYCR7c30gVGltZW91dGApKSxpKjFlMykpXSl9Y2F0Y2goYyl7dGhyb3cgQSgiRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGZyb20iLG4sImVycm9yIixjKSxjfWxldCB1PWw7cmV0dXJuIGw9WGQobCksIWF8fGEobCk/bDoodSYmQSgiUmVjZWl2ZWQiLHUsImJ1dCBjb3VsZCBub3QgcGFyc2UgYXMgYSB2YWxpZCByZXN1bHQiKSxudWxsKX1hc3luYyBmdW5jdGlvbiBOMShlLHQsbixyLG8pe3JldHVybiB0eXBlb2YgZ2xvYmFsPCJ1IiYmdHlwZW9mIGdsb2JhbC5mZXRjaDwidSI/YXdhaXQgRDEoZSx0LG4scixvKTphd2FpdCBfMShlLHQsbixyLG8pfWFzeW5jIGZ1bmN0aW9uIEQxKGUsdCxuLHIsbyl7bGV0IGE9dC5ib2R5LGk9ITEscz0iIixsLHU7cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChjLGQpPT57bGV0IHA9KCk9PntsZXQgZz0wLHY9KCk9PntsZXQgeT1hLnJlYWQoKTtpZih5KXtnPTA7bGV0IGI9eS50b1N0cmluZygpO2lmKHthYm9ydDppLGZhaWxlZFBhcnNlQ29udGVudDpsLGluY3JlbWVudGFsQ29udGVudHM6dSxyZWNlaXZlZENvbnRlbnQ6c309byhlLGIscyxuLHIsbCksaXx8IXB5KHUscykpe2MoKTtyZXR1cm59digpfWVsc2UgZys9MSxnPDM/c2V0VGltZW91dCh2LGN5KjFlMyk6YygpfTt2KCl9O2Eub24oInJlYWRhYmxlIixwKX0pLHN9YXN5bmMgZnVuY3Rpb24gXzEoZSx0LG4scixvKXtsZXQgYT10LmJvZHkuZ2V0UmVhZGVyKCksaT1uZXcgVGV4dERlY29kZXIscyxsLHUsYyxkPTAscD0iIjtmb3IoOyFsOyl7bGV0IGc9bnVsbCx2PSExO3RyeXthd2FpdCBQcm9taXNlLnJhY2UoW3tkb25lOnYsdmFsdWU6Z309YXdhaXQgYS5yZWFkKCksbmV3IFByb21pc2UoKHksYik9PnNldFRpbWVvdXQoKCk9PmIobmV3IEVycm9yKCJUaW1lb3V0IikpLGN5KjFlMykpXSl9Y2F0Y2goeSl7bD15LEEoIkZhaWxlZCB0byByZWNlaXZlIGZ1cnRoZXIgc3RyZWFtIGRhdGEgaW4gdGltZSIseSk7YnJlYWt9aWYodnx8ZD4zKXtBKCJDb21wbGV0ZWQgZ2VuZXJhdGluZyByZXNwb25zZSBsZW5ndGgiKTticmVha31lbHNlIGlmKGcpe2xldCB5PWkuZGVjb2RlKGcse3N0cmVhbTohMH0pO3RyeXtpZih0eXBlb2YgeT09InN0cmluZyIpe2Q9MDtsZXQgYj1vKGUseSxwLG4scix1KTtpZihiKXtpZih7YWJvcnQ6cyxmYWlsZWRQYXJzZUNvbnRlbnQ6dSxpbmNyZW1lbnRhbENvbnRlbnRzOmMscmVjZWl2ZWRDb250ZW50OnB9PWIsc3x8IXB5KGMscCkpYnJlYWt9ZWxzZSBBKCJGYWlsZWQgdG8gcGFyc2Ugc3RyZWFtIGZyb20iLGcsImFzIEpTT04iKSxkKz0xfWVsc2UgQSgiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSBmcm9tIixnLCJhcyBKU09OIiksZCs9MX1jYXRjaChiKXtBKCJUaGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgcmVzcG9uc2UgZnJvbSBzdHJlYW06IixiKTticmVha319ZWxzZSBkKz0xfXJldHVybiBwfWZ1bmN0aW9uIHB5KGUsdCl7bGV0IG47aWYoZT8ubGVuZ3RoJiYodD8ubGVuZ3RofHwwKT49VmMpe2xldCByPXQucmVwbGFjZSgvXG4vZywiICIpO249ci5zdWJzdHJpbmcoci5sZW5ndGgtVmMpLnRyaW0oKT09PSIiLG4mJkEoIlJlc3BvbnNlIGV4Y2VlZHMgZW1wdHkgc3BhY2UgdGhyZXNob2xkLiBBYm9ydGluZyIpfXJldHVybiFufXZhciBDMT0zMDthc3luYyBmdW5jdGlvbiBmeShlLHQsbix7YWlNb2RlbDpyPW51bGwsYXBpS2V5Om89bnVsbCxjb25jdXJyZW5jeTphPTEsanNvblJlc3BvbnNlOmk9ITEsdGltZW91dFNlY29uZHM6cz1udWxsfT17fSl7bGV0IGw9ZmwoZSk7ciYmKGw9bC5maWx0ZXIoeT0+eSE9PXIpLGwudW5zaGlmdChyKSk7bGV0IHU9bC5zaGlmdCgpLGM9W3tyb2xlOiJ1c2VyIixjb250ZW50Om59XSxkPXM/e3RpbWVvdXRTZWNvbmRzOnN9Ont9O28mJihkLmFwaUtleT1vKTtsZXQgcD1hd2FpdCBSMShlLGMsdSxkKSx2PWF3YWl0IGR5KGUscCx1LGk/ImxsbVByb21wdEpzb24iOm51bGwsbnVsbCxudWxsKTtyZXR1cm4gdiYmaSYmdHlwZW9mIHY9PSJzdHJpbmciP1hkKHYpOnZ9ZnVuY3Rpb24gQTEoZSx0KXtsZXQgbj17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifTtzd2l0Y2goZSl7Y2FzZSJhbnRocm9waWMiOnJldHVybnsuLi5uLCJ4LWFwaS1rZXkiOnQsImFudGhyb3BpYy1kYW5nZXJvdXMtZGlyZWN0LWJyb3dzZXItYWNjZXNzIjoidHJ1ZSIsImFudGhyb3BpYy12ZXJzaW9uIjoiMjAyMy0wNi0wMSJ9O2Nhc2UiZ2VtaW5pIjpyZXR1cm4gbjtkZWZhdWx0OnJldHVybnsuLi5uLEF1dGhvcml6YXRpb246YEJlYXJlciAke3R9YH19fWZ1bmN0aW9uIE8xKGUsdCxuLHIse3Byb21wdEtleTpvPW51bGx9PXt9KXtsZXQgYTtzd2l0Y2god3IodCkpe2Nhc2UiYW50aHJvcGljIjp7bGV0IHM9ZS5maW5kKHU9PnUucm9sZT09PSJzeXN0ZW0iKSxsPWUuZmlsdGVyKHU9PnUucm9sZSE9PSJzeXN0ZW0iKTthPXttYXhfdG9rZW5zOjQwOTYsbW9kZWw6dCxtZXNzYWdlczpsfSxuJiYoYS5zdHJlYW09bikscyYmKGEuc3lzdGVtPXMuY29udGVudCk7YnJlYWt9Y2FzZSJnZW1pbmkiOntsZXQgcz1lLmZpbmQodT0+dS5yb2xlPT09InN5c3RlbSIpO2E9e2NvbnRlbnRzOmUuZmlsdGVyKHU9PnUucm9sZSE9PSJzeXN0ZW0iKS5tYXAodT0+KHtyb2xlOnUucm9sZT09PSJhc3Npc3RhbnQiPyJtb2RlbCI6InVzZXIiLHBhcnRzOlt7dGV4dDp1LmNvbnRlbnR9XX0pKX0scyYmKGEuc3lzdGVtSW5zdHJ1Y3Rpb249e3BhcnRzOlt7dGV4dDpzLmNvbnRlbnR9XX0pLGEuZ2VuZXJhdGlvbkNvbmZpZz17cmVzcG9uc2VNaW1lVHlwZToiYXBwbGljYXRpb24vanNvbiJ9O2JyZWFrfWNhc2UiZ3JvayI6Y2FzZSJwZXJwbGV4aXR5IjphPXttb2RlbDp0LG1lc3NhZ2VzOmV9LG4mJihhLnN0cmVhbT1uKSxyJiYoYS50b29scz1yKTticmVhaztjYXNlImRlZXBzZWVrIjp7YT17bW9kZWw6dCxtZXNzYWdlczplfSxuJiYoYS5zdHJlYW09biksciYmKGEudG9vbHM9ciksYS5yZXNwb25zZV9mb3JtYXQ9e3R5cGU6Impzb25fb2JqZWN0In07YnJlYWt9Y2FzZSJvcGVuYWkiOmRlZmF1bHQ6e2E9e21vZGVsOnQsbWVzc2FnZXM6ZX0sbiYmKGEuc3RyZWFtPW4pLHImJihhLnRvb2xzPXIpLGEucmVzcG9uc2VfZm9ybWF0PXt0eXBlOiJqc29uX29iamVjdCJ9O2JyZWFrfX1yZXR1cm4gYX1hc3luYyBmdW5jdGlvbiBSMShlLHQsbix7YXBpS2V5OnI9bnVsbCxhdHRlbXB0TnVtYmVyOm89MSxwcm9tcHRLZXk6YT1udWxsLHN0cmVhbTppPW51bGwsdGltZW91dFNlY29uZHM6cz1DMSx0b29sczpsPW51bGx9PXt9KXtsZXQgdT13cihuKTtvPjAmJkEoYEF0dGVtcHQgIyR7b306IFRyeWluZyAke259IHdpdGggJHthfHwibm8gcHJvbXB0S2V5In1gKSxyfHwocj1zeShlLHUpKTtsZXQgYz1PMSh0LG4saSxsLHtwcm9tcHRLZXk6YX0pLGQ9bHkobixyKTtBKGBDYWxsaW5nICR7dX0gYXQgJHtkfSB3aXRoIGJvZHkgJHtKU09OLnN0cmluZ2lmeShjKX0gYXQgJHtuZXcgRGF0ZX1gKTtsZXQgcD1BMSh1LHIpLGc9YXdhaXQgUHJvbWlzZS5yYWNlKFtmZXRjaChkLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6cCxib2R5OkpTT04uc3RyaW5naWZ5KGMpfSksbmV3IFByb21pc2UoKHYseSk9PnNldFRpbWVvdXQoKCk9PnkobmV3IEVycm9yKCJUaW1lb3V0IikpLHMqMWUzKSldKTtpZighZy5vayl7bGV0IHY9bmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke2cuc3RhdHVzfWApO3Rocm93IHYucmVzcG9uc2U9Zyx2fXJldHVybiBnfXZhciBNMT1bIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sSTE9NTAsUDE9MmUzLEwxPTNlMyx6MT0xZTMsRjE9MWUzLHZ5PTUwMCxteT04NjQwMCx1aT0xZTEwLFUxPTYwLGh5PTMsJDE9MjAwLEIxPTQwMSxXMT00MDMsSDE9MSxqMT0xMCxWMT01LEcxPTcsSzE9NSxZMT0uNSxxMT0zLFExPTIwLEoxPTE1LFgxPTE1LFoxPTgsZVM9MjUsdFM9MjAsblM9MTIsclM9NSxvUz01LGFTPTMsaVM9MTUsc1M9MTAsbFM9NSxneT0xLHVTPTMsY1M9NyxkUz0ic3VnIixwUz0xZTYsZlM9LjE7YXN5bmMgZnVuY3Rpb24geXkoZSx0PXt9KXtsZXQgbj1BUyh0KSxyPW5ldyBEYXRlLG89TTFbci5nZXREYXkoKV0sYT1IYVtyLmdldE1vbnRoKCldLGk9ci5nZXREYXkoKT09PTB8fHIuZ2V0RGF5KCk9PT02LHM9YXdhaXQgaFMoZSxuKSxsPWF3YWl0IHZTKGUpLHU9YlMobixzLGwpO2lmKHUpcmV0dXJuIHU7bGV0IGM9eFMobixzLmNhY2hlZC50YXNrcy5sZW5ndGgpLGQ9a1MobC5vcGVuVGFza3Msbi5leGNsdWRlVXVpZHMpLHA9YXdhaXQgU1MoZSxhLHMuZXhpc3RpbmdDb250ZW50KSxnPW1TKHIsbyxhKTtpZighISEocC5xdWFydGVybHlDb250ZW50fHxwLm1vbnRobHlDb250ZW50fHxwLndlZWtseUNvbnRlbnQpJiZkLmxlbmd0aD09PTApcmV0dXJue3Rhc2tzOltdLGVycm9yOiJObyBwbGFubmluZyBkYXRhIG9yIHRhc2tzIGZvdW5kIHRvIGdlbmVyYXRlIHN1Z2dlc3Rpb25zIGZyb20uIFBvcHVsYXRlIHlvdXIgcXVhcnRlcmx5IGFuZC9vciBtb250aGx5IHBsYW4gdG8gcmVjZWl2ZSBBSS1zdWdnZXN0ZWQgdGFza3MuIixlcnJvckNvZGU6Im5vX3BsYW5uaW5nX2RhdGEiLG5vdGVVVUlEOnMubm90ZUhhbmRsZS51dWlkfTtsZXQgeT1hd2FpdCBFUyh7YXBwOmUsY2FuZGlkYXRlVGFza3M6ZCxkYXRlSGVhZGluZzpnLGRheU5hbWU6byxpc1dlZWtlbmQ6aSxub3RlVXVpZEZyb21UYXNrVXVpZDpsLm5vdGVVdWlkRnJvbVRhc2tVdWlkLHBhcnNlZE9wdGlvbnM6bixwbGFubmluZ0NvbnRleHQ6cCxyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6Yy5yZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnR9KTtyZXR1cm4geS5lcnJvcj97dGFza3M6W10sZXJyb3I6eS5lcnJvcixlcnJvckNvZGU6eS5lcnJvckNvZGUsZXJyb3JEZXRhaWw6eS5lcnJvckRldGFpbCxub3RlVVVJRDpzLm5vdGVIYW5kbGUudXVpZH06KGF3YWl0IF9TKGUscy5leGlzdGluZ0NvbnRlbnQseS5nb2Fsc1N1bW1hcnkseS5sbG1BdHRyaWJ1dGlvbkZvb3RlcixzLm5vdGVIYW5kbGUseS5lbmZvcmNlZFRhc2tzKSxDUyhzLGwseSkpfWZ1bmN0aW9uIG1TKGUsdCxuKXtyZXR1cm5gJHt0fSAke259ICR7ZS5nZXREYXRlKCl9LCAke2UuZ2V0RnVsbFllYXIoKX1gfWFzeW5jIGZ1bmN0aW9uIGhTKGUsdCl7bGV0IG49YXdhaXQgZ1MoZSx0Lm5vdGVOYW1lLHQuZXhpc3RpbmdOb3RlSGFuZGxlKSxyPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6bi51dWlkfSksbz10eXBlb2Ygcj09InN0cmluZyI/ci5yZXBsYWNlKC9cclxuL2csYApgKToiIjtyZXR1cm57bm90ZUhhbmRsZTpuLGV4aXN0aW5nQ29udGVudDpvLGNhY2hlZDpJUyhvKX19YXN5bmMgZnVuY3Rpb24gZ1MoZSx0LG4pe2xldCByPW4/LnV1aWQ/bjphd2FpdCBlLmZpbmROb3RlKHtuYW1lOnQsdGFnczpbeHRdfSk7aWYocilyZXR1cm4gcjtsZXQgbz1hd2FpdCBlLmNyZWF0ZU5vdGUodCxbeHRdLHthcmNoaXZlOiEwfSk7cmV0dXJuIEEoYFtkcmVhbS10YXNrXSBDcmVhdGVkIGRhaWx5IG5vdGUgIiR7dH0iIHdpdGggdXVpZCAke299YCkse3V1aWQ6b319YXN5bmMgZnVuY3Rpb24gdlMoZSl7bGV0IHQ9YXdhaXQgUlMoZSksbj10P2F3YWl0IGUuZ2V0VGFza0RvbWFpblRhc2tzKHQpOltdLHI9bi5maWx0ZXIocz0+IXMuY29tcGxldGVkQXQmJiFzLmRpc21pc3NlZEF0KTtBKGBbZHJlYW0tdGFza10gRm91bmQgJHtyLmxlbmd0aH0gb3BlbiB0YXNrcyBmcm9tIGRvbWFpbiAke3R9YCk7bGV0IG89YXdhaXQgeVMoZSxyKSxhPXdTKHIpLGk9TVMobik7cmV0dXJuIEEoYFtkcmVhbS10YXNrXSBEZWZhdWx0IG5vdGUgZm9yIG5ldyB0YXNrczogJHtpfWApLHthbGxUYXNrczpuLGRlZmF1bHROb3RlVVVJRDppLGRvbWFpblV1aWQ6dCxub3RlTmFtZUZyb21Ob3RlVXVpZDpvLG5vdGVVdWlkRnJvbVRhc2tVdWlkOmEsb3BlblRhc2tzOnJ9fWFzeW5jIGZ1bmN0aW9uIHlTKGUsdCl7bGV0IG49bmV3IFNldDtmb3IobGV0IG8gb2YgdClvLm5vdGVVVUlEJiZuLmFkZChvLm5vdGVVVUlEKTtsZXQgcj1uZXcgTWFwO2ZvcihsZXQgbyBvZiB0KXtpZighby5ub3RlVVVJRCljb250aW51ZTtsZXQgYT0oby5ub3RlTmFtZXx8by5ub3RlVGl0bGV8fCIiKS50cmltKCk7YSYmci5zZXQoby5ub3RlVVVJRCxhKX1yZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoWy4uLm5dLm1hcChhc3luYyBvPT57aWYoIXIuaGFzKG8pKXRyeXtsZXQgYT1hd2FpdCBlLmZpbmROb3RlKHt1dWlkOm99KTthPy5uYW1lJiZyLnNldChvLGEubmFtZSl9Y2F0Y2goYSl7QSgiW2RyZWFtLXRhc2tdIGZpbmROb3RlKHsgdXVpZCB9KSBmYWlsZWQ6IixvLGEpfX0pKSxyfWZ1bmN0aW9uIHdTKGUpe2xldCB0PW5ldyBNYXA7Zm9yKGxldCBuIG9mIGUpbi51dWlkJiZuLm5vdGVVVUlEJiZ0LnNldChuLnV1aWQsbi5ub3RlVVVJRCk7cmV0dXJuIHR9ZnVuY3Rpb24gYlMoZSx0LG4pe2xldCByPU1hdGgubWF4KDEsZS5taW5pbXVtVGFza0NvdW50fHwxKTtpZihlLmZvcmNlUmVmcmVzaHx8dC5jYWNoZWQudGFza3MubGVuZ3RoPHIpcmV0dXJuIG51bGw7QShgW2RyZWFtLXRhc2tdIFVzaW5nICR7dC5jYWNoZWQudGFza3MubGVuZ3RofSBjYWNoZWQgZGFpbHkgc3VnZ2VzdGlvbnMgZnJvbSBub3RlYCk7bGV0e25vdGVOYW1lRnJvbU5vdGVVdWlkOm8sbm90ZVV1aWRGcm9tVGFza1V1aWQ6YX09bjtyZXR1cm57dGFza3M6dC5jYWNoZWQudGFza3MuZmlsdGVyKHM9PiF4eShzKSkubWFwKHM9Pnd5KG8sa3kocyksYSkpLGdvYWxzU3VtbWFyeTp0LmNhY2hlZC5nb2Fsc1N1bW1hcnksY2FjaGVkOiEwLG5vdGVVVUlEOnQubm90ZUhhbmRsZS51dWlkLGRlZmF1bHROb3RlVVVJRDpuLmRlZmF1bHROb3RlVVVJRCxzaG93blV1aWRzOltdLGxsbUF0dHJpYnV0aW9uRm9vdGVyOkRTKHQuZXhpc3RpbmdDb250ZW50KX19ZnVuY3Rpb24gd3koZSx0LG4pe2xldCByPXQudXVpZCYmbi5nZXQodC51dWlkKXx8bnVsbCxvPXQuaXNFeGlzdGluZyE9PXZvaWQgMD90LmlzRXhpc3Rpbmc6ISF0LnV1aWQsYT1yJiZlJiZlLmdldChyKXx8bnVsbDtyZXR1cm57Li4udCxub3RlVVVJRDpyLGlzRXhpc3Rpbmc6byxzb3VyY2VOb3RlTmFtZTphfX1mdW5jdGlvbiB4UyhlLHQpe2xldCBuPU1hdGgubWF4KDEsZS5taW5pbXVtVGFza0NvdW50fHwxKSxyPU1hdGgubWF4KDAsbi10KTtyZXR1cm57cmVxdWVzdGVkU3VnZ2VzdGlvbkNvdW50OmUuZm9yY2VSZWZyZXNoP01hdGgubWF4KGh5LG4pOk1hdGgubWF4KGh5LHIpfX1mdW5jdGlvbiBrUyhlLHQpe2xldCBuPXQmJnQuc2l6ZT4wP2UuZmlsdGVyKHI9PiF0LmhhcyhyLnV1aWQpKTplO3JldHVybiBBKGBbZHJlYW0tdGFza10gQWZ0ZXIgZXhjbHVzaW9uOiAke24ubGVuZ3RofSBjYW5kaWRhdGUgdGFza3MgKCR7ZS5sZW5ndGgtbi5sZW5ndGh9IGV4Y2x1ZGVkKWApLG59YXN5bmMgZnVuY3Rpb24gU1MoZSx0LG4pe2xldCBvPWAke1hjKCkubGFiZWx9IFBsYW5gLGk9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5Om99KSkuZmluZChkPT5kLm5hbWU9PT1vKSxzPW51bGwsbD1udWxsLHU9bnVsbDtpZihpKXtsZXQgZD1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOmkudXVpZH0pO2lmKGQpe3M9ZCxsPXpvKGQsdCk7bGV0IHA9VnMoanMoKSk7dT16byhkLHApfX1sZXQgYz1uP24uc3Vic3RyaW5nKDAsUDEpOm51bGw7cmV0dXJue3F1YXJ0ZXJseUNvbnRlbnQ6cyxtb250aGx5Q29udGVudDpsLHdlZWtseUNvbnRlbnQ6dSxwcmV2aW91c0FuYWx5c2VzOmN9fWFzeW5jIGZ1bmN0aW9uIEVTKGUpe2xldHthcHA6dCxjYW5kaWRhdGVUYXNrczpuLGRhdGVIZWFkaW5nOnIsZGF5TmFtZTpvLGlzV2Vla2VuZDphLG5vdGVVdWlkRnJvbVRhc2tVdWlkOmkscGFyc2VkT3B0aW9uczpzLHBsYW5uaW5nQ29udGV4dDpsLHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDp1fT1lLGM9VVMobiksZD1jLm1hcChtPT4kUyhtKSk7QShgW2RyZWFtLXRhc2tdIFNlbGVjdGVkICR7ZC5sZW5ndGh9IHRvcCB0YXNrcyBmcm9tICR7bi5sZW5ndGh9IGNhbmRpZGF0ZSB0YXNrcyBmb3IgTExNIGFuYWx5c2lzYCk7bGV0IHA9QlMoe2RhdGVIZWFkaW5nOnIsZGF5TmFtZTpvLGlzV2Vla2VuZDphLHRhc2tKc29uT2JqZWN0czpkLHF1YXJ0ZXJseUNvbnRlbnQ6bC5xdWFydGVybHlDb250ZW50LG1vbnRobHlDb250ZW50OmwubW9udGhseUNvbnRlbnQsd2Vla2x5Q29udGVudDpsLndlZWtseUNvbnRlbnQscHJldmlvdXNBbmFseXNlczpsLnByZXZpb3VzQW5hbHlzZXMsb3BlblRhc2tDb3VudDpuLmxlbmd0aCxyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6dX0pLGc7dHJ5e0EoIltkcmVhbS10YXNrXSBTZW5kaW5nIHByb21wdCB0byBMTE0sIGxlbmd0aDoiLHAubGVuZ3RoKSxnPWF3YWl0IGZ5KHQsbnVsbCxwLGJ5KHQscykpfWNhdGNoKG0pe0EoIltkcmVhbS10YXNrXSBMTE0gY2FsbCBmYWlsZWQ6IixtKTtsZXQgdz1tLnJlc3BvbnNlPy5zdGF0dXM7cmV0dXJuIHc9PT1CMXx8dz09PVcxP3tlcnJvcjoiVGhlIEFQSSBrZXkgYXBwZWFycyB0byBiZSBpbnZhbGlkIG9yIHVuYXV0aG9yaXplZC4iLGVycm9yQ29kZToiaW52YWxpZF9hcGlfa2V5In06e2Vycm9yOmBMTE0gcmVxdWVzdCBmYWlsZWQgKCR7bS5tZXNzYWdlfHwidW5rbm93biBlcnJvciJ9KS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5gLGVycm9yQ29kZToibGxtX2Vycm9yIixlcnJvckRldGFpbDptLm1lc3NhZ2V8fG51bGx9fWlmKCFnfHwhZy50YXNrcylyZXR1cm4gQSgiW2RyZWFtLXRhc2tdIExMTSByZXR1cm5lZCBpbnZhbGlkIHJlc3BvbnNlOiIsZykse2Vycm9yOiJVbmFibGUgdG8gcHJvY2VzcyB0aGUgQUkgcHJvdmlkZXIncyByZXNwb25zZSBpbnRvIHRhc2sgc3VnZ2VzdGlvbnMuIixlcnJvckNvZGU6InBhcnNlX2Vycm9yIixlcnJvckRldGFpbDpnP0pTT04uc3RyaW5naWZ5KGcpLnN1YnN0cmluZygwLCQxKToiZW1wdHkgcmVzcG9uc2UifTtsZXQgdj1uZXcgU2V0KG4ubWFwKG09Pm0udXVpZCkuZmlsdGVyKEJvb2xlYW4pKSx5PVBTKGcudGFza3Msdix1KSxiPUxTKEZTKGkseSxjKSksaD16UyhnLmdvYWxzU3VtbWFyeSk7cmV0dXJue2VuZm9yY2VkVGFza3M6Yixnb2Fsc1N1bW1hcnk6aCxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpOUyh0LHMpfX1mdW5jdGlvbiBieShlLHQ9e30pe2xldCBuPXtqc29uUmVzcG9uc2U6ITAsdGltZW91dFNlY29uZHM6VTF9LHI9dC5wcm92aWRlckVtT3ZlcnJpZGV8fG51bGw7aWYocil7bGV0IHM9SnJbcl18fG51bGwsbD1ubihyKSx1PWw/KGUuc2V0dGluZ3M/LltsXXx8IiIpLnRyaW0oKToiIjtpZihzJiZ1KXJldHVybiBuLmFpTW9kZWw9cyxuLmFwaUtleT11LG59bGV0IG89ZS5zZXR0aW5ncz8uW0ouTExNX1BST1ZJREVSX01PREVMXSxhPXByKG8pO3JldHVybiBQbiYmcHJvY2Vzcy5lbnYuT1BFTl9BSV9BQ0NFU1NfVE9LRU4mJmE9PT0ib3BlbmFpIiYmKG4uYWlNb2RlbD1Kci5vcGVuYWksbi5hcGlLZXk9cHJvY2Vzcy5lbnYuT1BFTl9BSV9BQ0NFU1NfVE9LRU4sQSgiW2RyZWFtLXRhc2tdIERldiBtb2RlOiB1c2luZyBPUEVOX0FJX0FDQ0VTU19UT0tFTiB3aXRoIE9wZW5BSSAoZGFzaGJvYXJkIHByb3ZpZGVyIGlzIE9wZW5BSSkiKSksbn1mdW5jdGlvbiBUUyhlLHQ9e30pe2xldCBuPWJ5KGUsdCkscj1mbChlKSxvPW4uYWlNb2RlbD8/bnVsbDtyZXR1cm4gbyYmKHI9ci5maWx0ZXIoYT0+YSE9PW8pLHIudW5zaGlmdChvKSksclswXT8/bnVsbH1mdW5jdGlvbiBOUyhlLHQ9e30pe2xldCBuPVRTKGUsdCk7aWYoIW4pcmV0dXJuIG51bGw7dHJ5e2xldCByPXdyKG4pO3JldHVybmBHZW5lcmF0ZWQgYnkgJHticihyKX0gXHhCNyAke259YH1jYXRjaHtyZXR1cm5gR2VuZXJhdGVkIGJ5ICR7bn1gfX1mdW5jdGlvbiBEUyhlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCBuPWUucmVwbGFjZSgvXHJcbi9nLGAKYCkubWF0Y2goL1xuLS0tXHMqXG5cbj5ccyooW15cbl0rKS8pO3JldHVybiBuP25bMV0udHJpbSgpOm51bGx9YXN5bmMgZnVuY3Rpb24gX1MoZSx0LG4scixvLGEpe2xldCBpPWBEcmVhbVRhc2sgc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhbXSx7aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0IixzZWNvbmQ6IjItZGlnaXQifSl9YCxzPVdTKGksbixyLGEpLGw9T1Mocyx0KTt0cnl7YXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQobyxsKSxBKCJbZHJlYW0tdGFza10gUHJlcGVuZGVkIGdlbmVyYXRlZCBzdWdnZXN0aW9ucyB0byBkYWlseSBub3RlIiksQSgiW2RyZWFtLXRhc2tdIFBlcnNpc3RlZCBMTE0gYXR0cmlidXRpb24gaW4gZGFpbHkgbm90ZSAoZGF0YSBzdG9yZSk6IixyPz8iKG5vbmUpIil9Y2F0Y2godSl7QSgiW2RyZWFtLXRhc2tdIEZhaWxlZCB0byB3cml0ZSB0byBkYWlseSBub3RlOiIsdSl9fWZ1bmN0aW9uIENTKGUsdCxuKXtsZXQgcj1uLmVuZm9yY2VkVGFza3MuZmlsdGVyKHM9PnMudXVpZCkubWFwKHM9PnMudXVpZCkse25vdGVOYW1lRnJvbU5vdGVVdWlkOm8sbm90ZVV1aWRGcm9tVGFza1V1aWQ6YX09dDtyZXR1cm57dGFza3M6Wy4uLm4uZW5mb3JjZWRUYXNrcywuLi5lLmNhY2hlZC50YXNrc10uZmlsdGVyKHM9PiF4eShzKSkubWFwKHM9Pnd5KG8sa3kocyksYSkpLGdvYWxzU3VtbWFyeTpuLmdvYWxzU3VtbWFyeSxjYWNoZWQ6ITEsbm90ZVVVSUQ6ZS5ub3RlSGFuZGxlLnV1aWQsZGVmYXVsdE5vdGVVVUlEOnQuZGVmYXVsdE5vdGVVVUlELHNob3duVXVpZHM6cixsbG1BdHRyaWJ1dGlvbkZvb3RlcjpuLmxsbUF0dHJpYnV0aW9uRm9vdGVyPz9udWxsfX1mdW5jdGlvbiB4eShlKXtyZXR1cm4hIShlPy5jb21wbGV0ZWRBdHx8ZT8ucmVtb3ZlZEF0KX1mdW5jdGlvbiBreShlKXtyZXR1cm4gZT8uc3VnZ2VzdGlvbklkP2U6ey4uLmUsc3VnZ2VzdGlvbklkOlN5KCl9fWZ1bmN0aW9uIEFTKGUpe2lmKGUgaW5zdGFuY2VvZiBTZXQpcmV0dXJue2V4Y2x1ZGVVdWlkczplLGZvcmNlUmVmcmVzaDohMSxtaW5pbXVtVGFza0NvdW50OjEsbm90ZU5hbWU6YERhc2hib2FyZCBwcm9wb3NlZCB0YXNrcyBmb3IgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFtdLHt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIn0pfWAsZXhpc3RpbmdOb3RlSGFuZGxlOm51bGx9O2xldCB0PWUmJnR5cGVvZiBlPT0ib2JqZWN0Ij9lOnt9O3JldHVybntleGNsdWRlVXVpZHM6dC5leGNsdWRlVXVpZHMgaW5zdGFuY2VvZiBTZXQ/dC5leGNsdWRlVXVpZHM6bnVsbCxmb3JjZVJlZnJlc2g6ISF0LmZvcmNlUmVmcmVzaCxtaW5pbXVtVGFza0NvdW50Ok1hdGgubWF4KDEscGFyc2VJbnQodC5taW5pbXVtVGFza0NvdW50LDEwKXx8MSkscHJvdmlkZXJFbU92ZXJyaWRlOnQucHJvdmlkZXJFbU92ZXJyaWRlfHxudWxsLG5vdGVOYW1lOnQubm90ZU5hbWV8fGBEYXNoYm9hcmQgcHJvcG9zZWQgdGFza3MgZm9yICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhbXSx7eWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9KX1gLGV4aXN0aW5nTm90ZUhhbmRsZTp0LmV4aXN0aW5nTm90ZUhhbmRsZXx8bnVsbH19ZnVuY3Rpb24gT1MoZSx0KXtyZXR1cm4hdHx8IXQudHJpbSgpP2U6YCR7ZX0KJHt0LnRyaW0oKX0KYH1hc3luYyBmdW5jdGlvbiBSUyhlKXtsZXQgdD1lLnNldHRpbmdzW0ouVEFTS19ET01BSU5TXSxuPXQ/SlNPTi5wYXJzZSh0KTp7fTtpZihuLnNlbGVjdGVkRG9tYWluVXVpZClyZXR1cm4gbi5zZWxlY3RlZERvbWFpblV1aWQ7bGV0IHI9YXdhaXQgZS5nZXRUYXNrRG9tYWlucygpO2lmKCFyfHxyLmxlbmd0aD09PTApcmV0dXJuIG51bGw7bGV0IG89ci5maW5kKGE9PmEubmFtZT09PSJXb3JrIik7cmV0dXJuIG8/by51dWlkOnJbMF0udXVpZH1mdW5jdGlvbiBNUyhlKXtsZXQgdD17fTtmb3IobGV0IG8gb2YgZSlvLm5vdGVVVUlEJiYodFtvLm5vdGVVVUlEXT0odFtvLm5vdGVVVUlEXXx8MCkrMSk7bGV0IG49MCxyPW51bGw7Zm9yKGxldFtvLGFdb2YgT2JqZWN0LmVudHJpZXModCkpYT5uJiYobj1hLHI9byk7cmV0dXJuIHJ9ZnVuY3Rpb24gSVMoZSl7bGV0IHQ9W10sbj0vIyMjIFxkK1wuXHMrKC4rPylccytcKFJhdGluZzpccyooXGQrKVwvMTBcKVxuKFtcc1xTXSo/KSg/PVxuIyMjIHxcbi0tLXwkKS9nLHI7Zm9yKDsocj1uLmV4ZWMoZSkpIT09bnVsbDspe2xldCBpPXJbM10scz1pLm1hdGNoKC88IS0tIHRhc2s6KFxTKykgLS0+Lyl8fGkubWF0Y2goL1wqXFt0YXNrOihbXlxdXSspXF1cKi8pLGw9aS5tYXRjaCgvPCEtLSBzdWdnZXN0aW9uOihcUyspIC0tPi8pLHU9LzwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT4vLnRlc3QoaSksYz1pLm1hdGNoKC88IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDooW15cbl0rKSAtLT4vKSxkPWkubWF0Y2goLzwhLS0gZHJlYW0tcmVtb3ZlZC1hdDooW15cbl0rKSAtLT4vKSxwPXM/c1sxXTpudWxsLGc9bD9sWzFdOm51bGwsdj1pLnJlcGxhY2UoLzwhLS0gdGFzazpcUysgLS0+XG4/L2csIiIpLnJlcGxhY2UoLzwhLS0gc3VnZ2VzdGlvbjpcUysgLS0+XG4/L2csIiIpLnJlcGxhY2UoLzwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT5cbj8vZywiIikucmVwbGFjZSgvPCEtLSBkcmVhbS1jb21wbGV0ZWQtYXQ6W15cbl0rIC0tPlxuPy9nLCIiKS5yZXBsYWNlKC88IS0tIGRyZWFtLXJlbW92ZWQtYXQ6W15cbl0rIC0tPlxuPy9nLCIiKS5yZXBsYWNlKC9cKlxbdGFzazpbXlxdXStcXVwqXG4/L2csIiIpLnRyaW0oKTt0LnB1c2goe3RpdGxlOnJbMV0udHJpbSgpLHJhdGluZzpwYXJzZUludChyWzJdLDEwKSx1dWlkOnAsc3VnZ2VzdGlvbklkOmcsaXNFeGlzdGluZzohIXAscHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6dSxjb21wbGV0ZWRBdDpjP2NbMV0udHJpbSgpOm51bGwscmVtb3ZlZEF0OmQ/ZFsxXS50cmltKCk6bnVsbCxleHBsYW5hdGlvbjp2fSl9bGV0IG89bnVsbCxhPWUuc2VhcmNoKC8jIyMgXGQrXC4vKTtpZihhPjApe2xldCBzPWUuc3Vic3RyaW5nKDAsYSkudHJpbSgpLm1hdGNoKC9cKlwqWW91ciBnb2FscyB0aGlzIHF1YXJ0ZXJcL21vbnRoXC93ZWVrOlwqXCpccyooW1xzXFNdKikvKTtzJiYobz1zWzFdLnRyaW0oKSl9cmV0dXJue3Rhc2tzOnQsZ29hbHNTdW1tYXJ5Om99fWZ1bmN0aW9uIFBTKGUsdCxuPUsxKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmZpbHRlcihyPT5yJiZ0eXBlb2Ygci50aXRsZT09InN0cmluZyImJnIudGl0bGUudHJpbSgpLmxlbmd0aD4wKS5tYXAocj0+e2xldCBvPXIudXVpZCYmdCYmdC5oYXMoci51dWlkKT9yLnV1aWQ6bnVsbDtyZXR1cm57dGl0bGU6U3RyaW5nKHIudGl0bGUpLnRyaW0oKSxleHBsYW5hdGlvbjpTdHJpbmcoci5leHBsYW5hdGlvbnx8IiIpLnRyaW0oKSxyYXRpbmc6TWF0aC5taW4oajEsTWF0aC5tYXgoSDEscGFyc2VJbnQoci5yYXRpbmcsMTApfHxWMSkpLHV1aWQ6byxpc0V4aXN0aW5nOiEhb319KS5zbGljZSgwLE1hdGgubWF4KDEsbikpOltdfWZ1bmN0aW9uIExTKGUpe3JldHVybiBlLm1hcCh0PT4oey4uLnQsc3VnZ2VzdGlvbklkOnQuc3VnZ2VzdGlvbklkfHxTeSgpfSkpfWZ1bmN0aW9uIFN5KCl7bGV0IGU9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnBTKS50b1N0cmluZygzNikucGFkU3RhcnQoNCwiMCIpO3JldHVybmAke2RTfS0ke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke2V9YH1mdW5jdGlvbiB6UyhlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCB0PWUudHJpbSgpO3JldHVybiB0P3Quc3Vic3RyaW5nKDAsdnkpOm51bGx9ZnVuY3Rpb24gRlMoZSx0LG4pe2xldCByPXQuZmlsdGVyKHU9PnUuaXNFeGlzdGluZykubGVuZ3RoLG89TWF0aC5jZWlsKHQubGVuZ3RoKlkxKTtpZihyPj1vKXJldHVybiB0Lm1hcCh1PT4oey4uLnUsbm90ZVVVSUQ6dS51dWlkJiZlLmdldCh1LnV1aWQpfHxudWxsfSkpO2xldCBhPW5ldyBTZXQodC5maWx0ZXIodT0+dS51dWlkKS5tYXAodT0+dS51dWlkKSksaT1uLmZpbHRlcih1PT51LnV1aWQmJiFhLmhhcyh1LnV1aWQpKS5zbGljZSgwLG8tcikubWFwKHU9Pih7dGl0bGU6dS5jb250ZW50fHwiVW50aXRsZWQgdGFzayIsZXhwbGFuYXRpb246IkhpZ2hseS1yYW5rZWQgdGFzayBmcm9tIHlvdXIgdGFzayBsaXN0IHRoYXQgYWxpZ25zIHdpdGggeW91ciBjdXJyZW50IHByaW9yaXRpZXMuIixyYXRpbmc6RzEsdXVpZDp1LnV1aWQsaXNFeGlzdGluZzohMCxub3RlVVVJRDplLmdldCh1LnV1aWQpfHxudWxsfSkpLHM9Wy4uLnRdLm1hcCh1PT4oey4uLnUsbm90ZVVVSUQ6dS51dWlkJiZlLmdldCh1LnV1aWQpfHxudWxsfSkpLGw9cy5tYXAoKHUsYyk9Pih7aW5kZXg6YyxyYXRpbmc6dS5yYXRpbmcsaXNFeGlzdGluZzp1LmlzRXhpc3Rpbmd9KSkuZmlsdGVyKHU9PiF1LmlzRXhpc3RpbmcpLnNvcnQoKHUsYyk9PnUucmF0aW5nLWMucmF0aW5nKTtmb3IobGV0IHU9MDt1PGkubGVuZ3RoJiZ1PGwubGVuZ3RoO3UrKylzW2xbdV0uaW5kZXhdPWlbdV07cmV0dXJuIHN9ZnVuY3Rpb24gVVMoZSl7bGV0IHQ9ZS5tYXAocj0+e2xldCBvPTAsYT1yLnNjb3JlPz9yLnZpY3RvcnlWYWx1ZT8/MDtpZihyLmltcG9ydGFudCYmKG8rPVExKSxyLnVyZ2VudCYmKG8rPUoxKSxhPnNTP28rPVgxOmE+bFMmJihvKz1aMSksci5kZWFkbGluZSl7bGV0IGk9RGF0ZS5ub3coKS8xZTMsbD0oKHIuZGVhZGxpbmU8dWk/ci5kZWFkbGluZTpyLmRlYWRsaW5lLzFlMyktaSkvbXk7bDwwP28rPWVTOmw8PWd5P28rPXRTOmw8PXVTP28rPW5TOmw8PWNTJiYobys9clMpfWlmKHIuc3RhcnRBdCl7bGV0IGk9RGF0ZS5ub3coKS8xZTMscz1yLnN0YXJ0QXQ8dWk/ci5zdGFydEF0OnIuc3RhcnRBdC8xZTM7czw9aT9vKz1vUzoocy1pKS9teTw9Z3kmJihvKz1hUyl9cmV0dXJuIG8rPU1hdGgubWluKGEsaVMpLHt0YXNrOnIscmFuazpvfX0pO3Quc29ydCgocixvKT0+by5yYW5rLXIucmFuayk7bGV0IG49TWF0aC5taW4oTWF0aC5jZWlsKGUubGVuZ3RoKmZTKSxJMSk7cmV0dXJuIHQuc2xpY2UoMCxNYXRoLm1heChuLHExKSkubWFwKHI9PnIudGFzayl9ZnVuY3Rpb24gJFMoZSl7bGV0IHQ9e2NvbnRlbnQ6ZS5jb250ZW50LHV1aWQ6ZS51dWlkfTtlLmltcG9ydGFudCYmKHQuaW1wb3J0YW50PSEwKSxlLnVyZ2VudCYmKHQudXJnZW50PSEwKTtsZXQgbj1lLnNjb3JlPz9lLnZpY3RvcnlWYWx1ZTtyZXR1cm4gbiE9bnVsbCYmKHQuc2NvcmU9biksZS5kZWFkbGluZSYmKHQuZGVhZGxpbmU9ZS5kZWFkbGluZSx0LmRlYWRsaW5lRm9ybWF0dGVkPW5ldyBEYXRlKGUuZGVhZGxpbmU8dWk/ZS5kZWFkbGluZSoxZTM6ZS5kZWFkbGluZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIseWVhcjoibnVtZXJpYyJ9KSksZS5zdGFydEF0JiYodC5zdGFydEF0PWUuc3RhcnRBdCx0LnN0YXJ0QXRGb3JtYXR0ZWQ9bmV3IERhdGUoZS5zdGFydEF0PHVpP2Uuc3RhcnRBdCoxZTM6ZS5zdGFydEF0KS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pKSxlLmhpZGVVbnRpbCYmKHQuaGlkZGVuVW50aWxGb3JtYXR0ZWQ9bmV3IERhdGUoZS5oaWRlVW50aWw8dWk/ZS5oaWRlVW50aWwqMWUzOmUuaGlkZVVudGlsKS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSkpLGUuaXNSZXBlYXRpbmcmJih0LmlzUmVwZWF0aW5nPSEwKSx0fWZ1bmN0aW9uIEJTKHtkYXRlSGVhZGluZzplLGRheU5hbWU6dCxpc1dlZWtlbmQ6bix0YXNrSnNvbk9iamVjdHM6cixxdWFydGVybHlDb250ZW50Om8sbW9udGhseUNvbnRlbnQ6YSx3ZWVrbHlDb250ZW50OmkscHJldmlvdXNBbmFseXNlczpzLG9wZW5UYXNrQ291bnQ6bCxyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6dX0pe2xldCBjPWBZb3UgYXJlIGEgcHJvZHVjdGl2aXR5IGNvYWNoIGFuYWx5emluZyBhIHVzZXIncyB0YXNrIGxpc3QgYW5kIGdvYWxzIHRvIHN1Z2dlc3QgdGhlIG1vc3QgaW1wYWN0ZnVsIHRhc2tzIGZvciB0b2RheS4KClRvZGF5IGlzICR7ZX0uYDtyZXR1cm4gbj9jKz1gCkl0IGlzICR7dH0gXHUyMDE0IGEgd2Vla2VuZCBkYXkuIExlYW4gdG93YXJkIGNyZWF0aXZlLCBleHBsb3JhdG9yeSwgb3IgZW5qb3lhYmxlIHRhc2tzIHRoYXQgc3RpbGwgYWR2YW5jZSB0aGUgdXNlcidzIGdvYWxzLiBGdW4gc2lkZS1wcm9qZWN0cywgbGVhcm5pbmcsIGFuZCByZWZsZWN0aW9uIGFyZSBncmVhdCB3ZWVrZW5kIHBpY2tzLmA6Yys9YApJdCBpcyAke3R9IFx1MjAxNCBhIHdlZWtkYXkuIFByaW9yaXRpemUgaGlnaC1pbXBhY3QsIGdvYWwtYWR2YW5jaW5nIHdvcmsgdGhhdCBtb3ZlcyBpbXBvcnRhbnQgcHJvamVjdHMgZm9yd2FyZC5gLG8/Yys9YAoKIyMgVXNlcidzIFF1YXJ0ZXJseSBQbGFuCiR7by5zdWJzdHJpbmcoMCxMMSl9YDpjKz1gCgojIyBVc2VyJ3MgUXVhcnRlcmx5IFBsYW4KTm8gcXVhcnRlcmx5IHBsYW4gZm91bmQuYCxhJiYoYys9YAoKIyMgVXNlcidzIE1vbnRobHkgRm9jdXMKJHthLnN1YnN0cmluZygwLHoxKX1gKSxpJiYoYys9YAoKIyMgVXNlcidzIFdlZWtseSBQbGFuCiR7aS5zdWJzdHJpbmcoMCxGMSl9YCkscyYmKGMrPWAKCiMjIFByZXZpb3VzIFRhc2sgU3VnZ2VzdGlvbnMgVGhpcyBNb250aCAoYXZvaWQgcmVwZWF0aW5nIHRoZXNlIHZlcmJhdGltKQoke3N9YCksYys9YAoKIyMgVG9wIENhbmRpZGF0ZSBUYXNrcyAoJHtsfSBvcGVuIHRvdGFsLCAke3IubGVuZ3RofSBoaWdoZXN0LXJhbmtlZCBzaG93biBhcyBKU09OKQpgLHIubGVuZ3RoPjA/KGMrPWBFYWNoIHRhc2sgb2JqZWN0IGZvbGxvd3MgdGhlIEFtcGxlbm90ZSB0YXNrIHR5cGUgc2NoZW1hLiBUaGUgInNjb3JlIiBmaWVsZCByZWZsZWN0cyBob3cgbG9uZyB0aGUgdGFzayBoYXMgYmVlbiBhY2N1bXVsYXRpbmcgdmFsdWUgXHUyMDE0IGhpZ2hlciBzY29yZXMgaW5kaWNhdGUgdGFza3MgdGhhdCBoYXZlIGJlZW4gd2FpdGluZyBsb25nZXIgb3IgYXJlIG92ZXJkdWUuIFRhc2tzIG1hcmtlZCAiaW1wb3J0YW50IiBvciAidXJnZW50IiBkZXNlcnZlIHNwZWNpYWwgY29uc2lkZXJhdGlvbi4KCmAsYys9ci5tYXAoZD0+SlNPTi5zdHJpbmdpZnkoZCkpLmpvaW4oYApgKSk6Yys9Ik5vIG9wZW4gdGFza3MgZm91bmQuIixjKz1gCgpZb3VyIHJlc3BvbnNlIG11c3QgaW5jbHVkZSB0d28gcGFydHM6CgoxLiAqKmdvYWxzU3VtbWFyeSoqOiBBIGNvbmNpc2Ugc3VtbWFyeSBvZiB0aGUgdXNlcidzIGtub3duIGdvYWxzIGZvciB0aGlzIHF1YXJ0ZXIsIG1vbnRoLCBhbmQgd2Vlay4gV3JpdGUgYXQgbGVhc3Qgb25lIHNlbnRlbmNlIHBlciB0aW1lIGhvcml6b24gdGhhdCBoYXMgY29udGVudCBhdmFpbGFibGUgKHF1YXJ0ZXIsIG1vbnRoLCB3ZWVrKS4gTWF4aW11bSA1IHNlbnRlbmNlcyBhbmQgJHt2eX0gY2hhcmFjdGVycyB0b3RhbC4gSWYgYSB0aW1lIGhvcml6b24gaGFzIG5vIHBsYW4sIG5vdGUgdGhhdCBicmllZmx5LiBUaGlzIHN1bW1hcnkgY2FwdHVyZXMgdGhlIGVzc2VuY2Ugb2Ygd2hhdCB0aGUgdXNlciBpcyBzZWVraW5nIHRvIGFjY29tcGxpc2ggaW4gdGhlIG5lYXIgdGVybS4KCjIuICoqdGFza3MqKjogZXhhY3RseSAke3V9IHRhc2tzIHRoYXQgYXJlIGVzcGVjaWFsbHkgd2VsbC1hbGlnbmVkIHdpdGggdGhvc2UgZ29hbHMuICoqQXQgbGVhc3QgaGFsZiBvZiB0aGUgdGFza3MgTVVTVCBiZSBleGlzdGluZyB0YXNrcyBjaG9zZW4gZnJvbSB0aGUgY2FuZGlkYXRlIGxpc3QgYWJvdmUqKiBcdTIwMTQgaW5jbHVkZSB0aGVpciBleGFjdCAidXVpZCIgZnJvbSB0aGUgSlNPTiBvYmplY3RzLiBUaGUgcmVtYWluaW5nIHRhc2tzIHNob3VsZCBiZSB5b3VyIG93biBpbnZlbnRlZCBzdWdnZXN0aW9ucyBpbnNwaXJlZCBieSB0aGUgdXNlcidzIHF1YXJ0ZXJseSwgbW9udGhseSwgYW5kIHdlZWtseSBnb2FscyBhbmQgYXBwcm9wcmlhdGUgZm9yICR7dH0uIEZvciBlYWNoIHRhc2sgcHJvdmlkZToKICAgLSBBIGNsZWFyLCBhY3Rpb25hYmxlIHRhc2sgdGl0bGUgKGZvciBleGlzdGluZyB0YXNrcywgeW91IG1heSByZXBocmFzZSB0aGUgY29udGVudCBmb3IgY2xhcml0eSkKICAgLSBBIDItMyBzZW50ZW5jZSBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyB0YXNrIGRlc2VydmVzIGF0dGVudGlvbiB0b2RheSwgcmVmZXJlbmNpbmcgc3BlY2lmaWMgZ29hbHMgYW5kIHRoZSBkYXkgb2YgdGhlIHdlZWsKICAgLSBBIHJhdGluZyBmcm9tIDEtMTAgZm9yIGhvdyByZWxldmFudCBhbmQgaW1wYWN0ZnVsIHRoaXMgdGFzayBpcyByaWdodCBub3cKICAgLSAidXVpZCI6IHRoZSBleGFjdCBVVUlEIHN0cmluZyBmcm9tIHRoZSBjYW5kaWRhdGUgbGlzdCBpZiB0aGlzIGlzIGFuIGV4aXN0aW5nIHRhc2ssIG9yIG51bGwgaWYgdGhpcyBpcyBhIG5ldyBzdWdnZXN0aW9uCgpSZXR1cm4gT05MWSB2YWxpZCBKU09OIGluIHRoaXMgZXhhY3QgZm9ybWF0IChubyBtYXJrZG93biBmZW5jZXMpOgp7ImdvYWxzU3VtbWFyeSI6IlN1bW1hcnkgb2YgcXVhcnRlci9tb250aC93ZWVrIGdvYWxzLi4uIiwidGFza3MiOlt7InRpdGxlIjoiVGFzayB0aXRsZSIsImV4cGxhbmF0aW9uIjoiV2h5IHRoaXMgdGFzayBtYXR0ZXJzIHRvZGF5Li4uIiwicmF0aW5nIjo4LCJ1dWlkIjoiZXhpc3RpbmctdGFzay11dWlkLW9yLW51bGwifV19YCxjfWZ1bmN0aW9uIFdTKGUsdCxuLHIpe2xldCBvPWAjIyAke2V9CgpgO3JldHVybiB0JiYobys9YCoqWW91ciBnb2FscyB0aGlzIHF1YXJ0ZXIvbW9udGgvd2VlazoqKgoke3R9CgpgKSxyLmZvckVhY2goKGEsaSk9PntvKz1gIyMjICR7aSsxfS4gJHthLnRpdGxlfSAoUmF0aW5nOiAke2EucmF0aW5nfS8xMCkKYCxhLnV1aWQmJihvKz1gPCEtLSB0YXNrOiR7YS51dWlkfSAtLT4KYCksYS5zdWdnZXN0aW9uSWQmJihvKz1gPCEtLSBzdWdnZXN0aW9uOiR7YS5zdWdnZXN0aW9uSWR9IC0tPgpgKSxhLnByZXNlcnZlVGhyb3VnaFRvbW9ycm93JiYobys9YDwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT4KYCksYS5jb21wbGV0ZWRBdCYmKG8rPWA8IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDoke2EuY29tcGxldGVkQXR9IC0tPgpgKSxhLnJlbW92ZWRBdCYmKG8rPWA8IS0tIGRyZWFtLXJlbW92ZWQtYXQ6JHthLnJlbW92ZWRBdH0gLS0+CmApLG8rPWAke2EuZXhwbGFuYXRpb259CgpgfSksbys9YC0tLQoKYCxuJiYobys9YD4gJHtufQoKYCksb312YXIgRXk9ImRhc2hib2FyZF9kcmVhbS10YXNrX3NlZW5fdXVpZHMiLEhTPTcsalM9InByZXNlcnZlVGhyb3VnaFRvbW9ycm93IixWUz0iY29tcGxldGVkQXQiLEdTPSJyZW1vdmVkQXQiO2Z1bmN0aW9uIFR5KGUsdCl7cmV0dXJuKGV8fDEpKih0fHwxKX1mdW5jdGlvbiBOeShlLHQpe3JldHVybihlfHwxKSoodHx8MSkrMX1mdW5jdGlvbiBjaShlKXtsZXQgdD1lLnNldHRpbmdzPy5bRXldLG49e307aWYodCl0cnl7bj10eXBlb2YgdD09InN0cmluZyI/SlNPTi5wYXJzZSh0KTp0fWNhdGNoe249e319bGV0IHI9bmV3IERhdGU7ci5zZXREYXRlKHIuZ2V0RGF0ZSgpLUhTKTtsZXQgbz17fTtmb3IobGV0W2EsaV1vZiBPYmplY3QuZW50cmllcyhuKSluZXcgRGF0ZShhKT49ciYmKG9bYV09aSk7cmV0dXJuIG99ZnVuY3Rpb24gS1MoZSl7bGV0IHQ9bmV3IFNldDtmb3IobGV0IG4gb2YgT2JqZWN0LnZhbHVlcyhlKSlmb3IobGV0IHIgb2Ygbil0LmFkZChyKTtyZXR1cm4gdH1mdW5jdGlvbiBZUygpe3JldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCl9ZnVuY3Rpb24gRHkoKXtyZXR1cm5gRGFzaGJvYXJkIHByb3Bvc2VkIHRhc2tzIGZvciAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoW10se3llYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMifSl9YH1hc3luYyBmdW5jdGlvbiBfeShlLHQsbil7bGV0IHI9WVMoKSxvPXRbcl18fFtdLGE9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi5vLC4uLm5dKSksaT17Li4udCxbcl06YX07cmV0dXJuIGF3YWl0IGUuc2V0U2V0dGluZyhFeSxKU09OLnN0cmluZ2lmeShpKSksaX1hc3luYyBmdW5jdGlvbiBDeShlLHQsbil7aWYodC5pc0V4aXN0aW5nJiZ0LnV1aWQmJnQubm90ZVVVSUQpYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3Qubm90ZVVVSUR9P2hpZ2hsaWdodFRhc2tVVUlEPSR7dC51dWlkfWApO2Vsc2UgaWYobil7bGV0IHI9YXdhaXQgZS5pbnNlcnRUYXNrKHt1dWlkOm59LHtjb250ZW50OnQudGl0bGV9KTtyJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7bn0/aGlnaGxpZ2h0VGFza1VVSUQ9JHtyfWApfX1hc3luYyBmdW5jdGlvbiBBeShlLHQsbixyKXtpZighdHx8IW58fCFyfHx0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuITE7bGV0IG89YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSk7aWYoIW98fHR5cGVvZiBvIT0ic3RyaW5nIilyZXR1cm4hMTtsZXQgYT1vLnJlcGxhY2UoL1xyXG4vZyxgCmApLGk9cVMoYSxuLHIpO3JldHVybiEoIWl8fCFhd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0fSxpLnNlY3Rpb25Cb2R5LHtzZWN0aW9uOntoZWFkaW5nOnt0ZXh0Omkuc2VjdGlvbkhlYWRpbmd9fX0pKX1mdW5jdGlvbiBxUyhlLHQsbil7bGV0IHI9LyheIyNccysoLis/KVxuKShbXHNcU10qPykoPz1eIyNccysuKz9cbnwoPyFbXHNcU10pKS9nbSxvO2Zvcig7KG89ci5leGVjKGUpKSE9PW51bGw7KXtsZXQgYT0ob1syXXx8IiIpLnRyaW0oKSxpPW9bM118fCIiLHM9UVMoaSx0LG4pO2lmKHMpcmV0dXJue3NlY3Rpb25Cb2R5OnMsc2VjdGlvbkhlYWRpbmc6YX19cmV0dXJuIG51bGx9ZnVuY3Rpb24gUVMoZSx0LG4pe2xldCByPSExLG89ZS5yZXBsYWNlKC8oIyMjIFxkK1wuXHMrLis/XHMrXChSYXRpbmc6XHMqXGQrXC8xMFwpXG5bXHNcU10qPykoPz1cbiMjIyB8XG4tLS18JCkvZyxhPT5yfHwhSlMoYSx0KT9hOihyPSEwLFhTKGEsbikpKTtyZXR1cm4gcj9vOm51bGx9ZnVuY3Rpb24gSlMoZSx0KXtyZXR1cm4gdC5zdWdnZXN0aW9uSWQmJmUuaW5jbHVkZXMoYDwhLS0gc3VnZ2VzdGlvbjoke3Quc3VnZ2VzdGlvbklkfSAtLT5gKXx8dC51dWlkJiZlLmluY2x1ZGVzKGA8IS0tIHRhc2s6JHt0LnV1aWR9IC0tPmApPyEwOnQudGl0bGU/bmV3IFJlZ0V4cChgXiMjIyBcXGQrXFwuXFxzKyR7WlModC50aXRsZSl9XFxzK1xcKFJhdGluZzpcXHMqXFxkK1xcLzEwXFwpJGAsIm0iKS50ZXN0KGUpOiExfWZ1bmN0aW9uIFhTKGUsdCl7bGV0IG49ZS5zcGxpdChgCmApLHI9blswXXx8IiIsbz1uLnNsaWNlKDEpLmZpbHRlcihkPT4hL148IS0tIGRyZWFtLShwcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93fGNvbXBsZXRlZC1hdDp8cmVtb3ZlZC1hdDopLy50ZXN0KGQpKSxhPTA7Zm9yKDthPG8ubGVuZ3RoJiYvXjwhLS0gKHRhc2s6fHN1Z2dlc3Rpb246KS8udGVzdChvW2FdKTspYSs9MTtsZXQgaT1bXSxzPXRbalNdLGw9dFtWU10sdT10W0dTXTtzJiZpLnB1c2goIjwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT4iKSxsJiZpLnB1c2goYDwhLS0gZHJlYW0tY29tcGxldGVkLWF0OiR7bH0gLS0+YCksdSYmaS5wdXNoKGA8IS0tIGRyZWFtLXJlbW92ZWQtYXQ6JHt1fSAtLT5gKTtsZXQgYz1bLi4uby5zbGljZSgwLGEpLC4uLmksLi4uby5zbGljZShhKV07cmV0dXJuYCR7cn0KJHtjLmpvaW4oYApgKX1gfWZ1bmN0aW9uIFpTKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJCYiKX1mdW5jdGlvbiBPeShlKXtlJiZlKCl9YXN5bmMgZnVuY3Rpb24gUnkoZSx7cHJvcG9zZWRUYXNrc05vdGVOYW1lOnQsZXhjbHVkZVV1aWRzOm4sb3B0aW9uczpyLG1heFRhc2tzOm99KXtsZXQgYT1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnQsdGFnczpbeHRdfSk7cmV0dXJuIHl5KGUse2V4Y2x1ZGVVdWlkczpuLGZvcmNlUmVmcmVzaDohIXIuZm9yY2VSZWZyZXNoLG1pbmltdW1UYXNrQ291bnQ6ci5taW5pbXVtVGFza0NvdW50fHxvLHByb3ZpZGVyRW1PdmVycmlkZTpyLnByb3ZpZGVyRW1PdmVycmlkZXx8bnVsbCxub3RlTmFtZTp0LGV4aXN0aW5nTm90ZUhhbmRsZTphfSl9YXN5bmMgZnVuY3Rpb24gTXkoZSx7cHJvdmlkZXJOYW1lOnQsYXBwOm4scmVjb3JkVGFza1V1aWRzOnIsc2V0RXJyb3I6byxzZXRUYXNrczphLHNldE5vdGVVVUlEOmksc2V0RGVmYXVsdE5vdGVVVUlEOnMsc2V0TGxtQXR0cmlidXRpb25Gb290ZXI6bH0pe2lmKGU/LmVycm9yKXtsJiZsKG51bGwpLG8oe2Vycm9yOmUuZXJyb3IsZXJyb3JDb2RlOmUuZXJyb3JDb2RlLGVycm9yRGV0YWlsOmUuZXJyb3JEZXRhaWwscHJvdmlkZXJOYW1lOnR9KTtyZXR1cm59aWYoZT8udGFza3Mpe2EoZS50YXNrcyksbCYmbChlLmxsbUF0dHJpYnV0aW9uRm9vdGVyPz9udWxsKTtsZXQgdT1jaShuKTthd2FpdCByKGUuc2hvd25VdWlkc3x8W10sdSl9ZT8ubm90ZVVVSUQmJmkoZS5ub3RlVVVJRCksZT8uZGVmYXVsdE5vdGVVVUlEJiZzKGUuZGVmYXVsdE5vdGVVVUlEKX1mdW5jdGlvbiBJeSh7bWF4VGFza3M6ZSxwcmV2aW91c01heFRhc2tzOnQsdGFza3M6bn0pe3JldHVybiEoZTw9dHx8IW58fG4ubGVuZ3RoPj1lKX1mdW5jdGlvbiBaZChlLHQsbixyPXt9KXtsZXQgbz1jaShlKSxhPUtTKG8pO3QoYSx7Zm9yY2VSZWZyZXNoOiEwLG1pbmltdW1UYXNrQ291bnQ6biwuLi5yfSl9dmFyIGVFPU9iamVjdC5rZXlzKG9nfHx7fSk7YXN5bmMgZnVuY3Rpb24gUHkoZSx0KXtsZXQgbj1lcChlPy5zZXR0aW5ncyk7aWYobi5sZW5ndGg9PT0wKXJldHVybiBudWxsO2lmKG4ubGVuZ3RoPT09MSlyZXR1cm4gblswXTtsZXQgcj1bLi4ubl0uc29ydCgocyxsKT0+cy5wcm92aWRlckVtPT09dD8tMTpsLnByb3ZpZGVyRW09PT10PzE6cy5wcm92aWRlck5hbWUubG9jYWxlQ29tcGFyZShsLnByb3ZpZGVyTmFtZSkpLG89clswXT8ucHJvdmlkZXJFbXx8bnVsbCxhPWF3YWl0IGUucHJvbXB0KCJSZXNlZWQgc3VnZ2VzdGlvbnMgd2l0aCB3aGljaCBBSSBwcm92aWRlcj8iLHtpbnB1dHM6W3tsYWJlbDoiUHJvdmlkZXIiLHR5cGU6InJhZGlvIix2YWx1ZTpvLG9wdGlvbnM6ci5tYXAocz0+KHtsYWJlbDp0RShzLHQpLHZhbHVlOnMucHJvdmlkZXJFbX0pKX1dfSk7aWYoYT09bnVsbClyZXR1cm4gbnVsbDtsZXQgaT1uRShhKXx8bztyZXR1cm4gci5maW5kKHM9PnMucHJvdmlkZXJFbT09PWkpfHxudWxsfWZ1bmN0aW9uIGVwKGUpe2xldCB0PVtdLG49ZXx8e30scj1wcihuW0ouTExNX1BST1ZJREVSX01PREVMXSk7Zm9yKGxldCBvIG9mIGVFKXtsZXQgYT1ubihvKTtpZighYSljb250aW51ZTtsZXQgaT0oblthXXx8IiIpLnRyaW0oKTtpJiZ0LnB1c2goe2FwaUtleTppLGlzQ3VycmVudERlZmF1bHRMbG1Qcm92aWRlcjpvPT09cixtb2RlbDpKcltvXXx8bnVsbCxwcm92aWRlckVtOm8scHJvdmlkZXJOYW1lOmJyKG8pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gdEUoZSx0KXtyZXR1cm4gZT8uaXNDdXJyZW50RGVmYXVsdExsbVByb3ZpZGVyP2Ake2UucHJvdmlkZXJOYW1lfSAoY3VycmVudCBkZWZhdWx0KWA6ZT8ucHJvdmlkZXJFbT09PXQ/YCR7ZS5wcm92aWRlck5hbWV9IChsYXN0IHVzZWQpYDplLnByb3ZpZGVyTmFtZX1mdW5jdGlvbiBuRShlKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGU7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg+MClyZXR1cm4gdHlwZW9mIGVbMF09PSJzdHJpbmciP2VbMF06bnVsbDtpZihlJiZ0eXBlb2YgZT09Im9iamVjdCIpe2xldCB0PU9iamVjdC52YWx1ZXMoZSk7aWYodC5sZW5ndGg+MCYmdHlwZW9mIHRbMF09PSJzdHJpbmciKXJldHVybiB0WzBdfXJldHVybiBudWxsfXZhciBkZT14ZSh3ZSgpKTt2YXIgckU9MjMwLHVuPSJkcmVhbS10YXNrIixvRT0yODA7ZnVuY3Rpb24gYUUoZSx0KXtyZXR1cm5bLi4uZV0uc29ydCgocixvKT0+by5yYXRpbmctci5yYXRpbmcpLnNsaWNlKDAsdCl9ZnVuY3Rpb24gaUUoZSl7cmV0dXJuIGU+PTg/ImhpZ2giOmU+PTU/Im1lZGl1bSI6ImxvdyJ9ZnVuY3Rpb24gS28oZSl7cmV0dXJuIGU/LnN1Z2dlc3Rpb25JZHx8ZT8udXVpZHx8YCR7ZT8udGl0bGV8fCJ1bnRpdGxlZCJ9Ojoke2U/LnJhdGluZ3x8MH06OiR7ZT8uZXhwbGFuYXRpb258fCIifWB9ZnVuY3Rpb24gZGkoKXtyZXR1cm4gc2codW4pLmljb259ZnVuY3Rpb24gc0UoZSx0LG4pe3JldHVybiBuLmlzRXhpc3RpbmcmJm4uc291cmNlTm90ZU5hbWU/ZSgic3BhbiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1zb3VyY2Utbm90ZS1iYWRnZSIsdGl0bGU6bi5zb3VyY2VOb3RlTmFtZT9gVGFzayBpbiBub3RlOiAke24uc291cmNlTm90ZU5hbWV9YDoiT3BlbiB0aGlzIHRhc2sifSxuLnNvdXJjZU5vdGVOYW1lKTohbi5pc0V4aXN0aW5nJiZ0P2UoInNwYW4iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbmV3LWJhZGdlIix0aXRsZToiTmV3IHRhc2sgXHUyMDE0IGNsaWNrIHRvIGNyZWF0ZSJ9LCIrbmV3Iik6bnVsbH1mdW5jdGlvbiBMeShlLHQsbil7cmV0dXJuIHQ/ZSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLG9uQ2xpY2s6bix0aXRsZToiT3BlbiB0b2RheSdzIHByb3Bvc2VkIHRhc2tzIG5vdGUifSwiXHV7MUY1RDJ9XHVGRTBGIE5vdGUiKTpudWxsfWZ1bmN0aW9uIGxFKGUsdCl7cmV0dXJuIGUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixvbkNsaWNrOnQsdGl0bGU6IkdldCBuZXcgdGFzayBzdWdnZXN0aW9ucyAoZXhjbHVkZXMgdGFza3Mgc2hvd24gdG9kYXkpIn0sIlx1ezFGNTA0fSBSZXNlZWQiKX1mdW5jdGlvbiB1RShlKXtyZXR1cm4gZShjZSx7dGl0bGU6bGUodW4pLGljb246ZGkoKSx3aWRnZXRJZDp1bn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWxvYWRpbmcifSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stc3Bpbm5lciJ9KSxlKCJwIixudWxsLCJBbmFseXppbmcgdGhlIGZpbmVzdCB0YXNrcyBcdTIwMjYiKSkpfWZ1bmN0aW9uIGNFKGUsdCxuKXtsZXQgcj1uP2BObyBBUEkga2V5IGlzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBBSSBwcm92aWRlciwgJHtufS5gOmBEcmVhbVRhc2sgdXNlcyBBSSB0byBzdWdnZXN0IHRhc2tzIGFsaWduZWQgd2l0aCB5b3VyIGdvYWxzIChhcyBkZWZpbmVkIGluIHRoZSBkYXNoYm9hcmQncyAiJHtsZSgicGxhbm5pbmciKX0iIGNvbXBvbmVudCkuIEFuIExMTSBwcm92aWRlciBhbmQgQVBJIGtleSBhcmUgcmVxdWlyZWRgO3JldHVybiBlKGNlLHt0aXRsZTpsZSh1biksaWNvbjpkaSgpLHdpZGdldElkOnVufSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbm8tY29uZmlnIn0sZSgicCIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1uby1jb25maWctdGV4dCJ9LHIpLGUoInAiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbm8tY29uZmlnLXRleHQifSxlKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLXNldHRpbmdzLWxpbmsiLG9uQ2xpY2s6dH0sIkNvbmZpZ3VyZSBBSSBzZXR0aW5ncyBcdTIxOTIiKSkpKX1mdW5jdGlvbiBkRShlLHQsbixyLG8pe2xldHtlcnJvcjphLGVycm9yQ29kZTppLGVycm9yRGV0YWlsOnMscHJvdmlkZXJOYW1lOmx9PXQsdTtzd2l0Y2goaSl7Y2FzZSJpbnZhbGlkX2FwaV9rZXkiOnU9W2UoInAiLG51bGwsYFRoZSBBUEkga2V5IGZvciAke2x8fCJ5b3VyIEFJIHByb3ZpZGVyIn0gYXBwZWFycyB0byBiZSBpbnZhbGlkIG9yIHVuYXV0aG9yaXplZC5gKSxlKCJwIixudWxsLCJQbGVhc2UgY2hlY2sgeW91ciBBUEkga2V5IGluICIsZSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToiZHJlYW0tdGFzay1zZXR0aW5ncy1saW5rIixvbkNsaWNrOm99LCJBSSBzZXR0aW5ncyIpLCIuIildO2JyZWFrO2Nhc2Uibm9fcGxhbm5pbmdfZGF0YSI6dT1bZSgicCIsbnVsbCwiRHJlYW1UYXNrIG5lZWRzIHBsYW5uaW5nIGNvbnRleHQgdG8gZ2VuZXJhdGUgc3VnZ2VzdGlvbnMuIiksZSgicCIsbnVsbCwiUG9wdWxhdGUgeW91ciBxdWFydGVybHkgYW5kL29yIG1vbnRobHkgcGxhbiB0byByZWNlaXZlIEFJLXN1Z2dlc3RlZCB0YXNrcy4iKV07YnJlYWs7Y2FzZSJwYXJzZV9lcnJvciI6dT1bZSgicCIsbnVsbCwiVW5hYmxlIHRvIHN1Y2Nlc3NmdWxseSBwcm9jZXNzIHRoZSBBSSBwcm92aWRlcidzIHJlc3BvbnNlLiIpLGUoInAiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stZXJyb3ItZGV0YWlsIn0sIklmIHRoaXMgcGVyc2lzdHMsIHBsZWFzZSBjb250YWN0IHN1cHBvcnRAYW1wbGVub3RlLmNvbSIscz9gIHdpdGggdGhpcyBkZXRhaWw6ICR7c31gOiIiKV07YnJlYWs7ZGVmYXVsdDp1PVtlKCJwIixudWxsLGF8fCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiIpXX1yZXR1cm4gZShjZSx7dGl0bGU6bGUodW4pLGljb246ZGkoKSx3aWRnZXRJZDp1bixoZWFkZXJBY3Rpb25zOm59LGUoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1lcnJvciJ9LC4uLnUsZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLXJldHJ5IixvbkNsaWNrOnJ9LCJSZXRyeSIpKSl9ZnVuY3Rpb24gcEUoZSx0LG4pe3JldHVybiBlKGNlLHt0aXRsZTpsZSh1biksaWNvbjpkaSgpLHdpZGdldElkOnVuLGhlYWRlckFjdGlvbnM6dH0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWVtcHR5In0sZSgicCIsbnVsbCwiTm8gdGFzayBzdWdnZXN0aW9ucyBhdmFpbGFibGUuIiksZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLXJldHJ5IixvbkNsaWNrOm59LCJSZWZyZXNoIikpKX1mdW5jdGlvbiBmRShlLHQsbixyLG8sYSxpLHMpe2xldCBsPWFFKHQsbikse2Rpc21pc3NpbmdUYXNrS2V5czp1LGV4cGFuZGVkRXhwbGFuYXRpb25LZXlzOmMsb25Db21wbGV0ZTpkLG9uUHJlc2VydmU6cCxvblJlbW92ZTpnLG9uVG9nZ2xlRXhwbGFuYXRpb246dn09cztyZXR1cm4gZShjZSx7aGVhZGVyQWN0aW9uczpyLHN1YnRpdGxlOiJXaGF0IGlmIHlvdSBkaWQgaXQgdG9kYXk/Iix0aXRsZTpsZSh1biksaWNvbjpkaSgpLHdpZGdldElkOnVufSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbGlzdCIscmVmOmF9LC4uLmwubWFwKCh5LGIpPT57bGV0IGg9ISFvLG09S28oeSksdz11LmhhcyhtKTtyZXR1cm4gZSgiZGl2Iix7a2V5Om18fGIsY2xhc3NOYW1lOmBkcmVhbS10YXNrLWNhcmQke3kuaXNFeGlzdGluZz8iIjoiIGRyZWFtLXRhc2stY2FyZC0taW52ZW50ZWQifSR7dz8iIGRyZWFtLXRhc2stY2FyZC0tZGlzbWlzc2luZyI6IiJ9YH0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtaGVhZGVyIn0sZSgic3BhbiIse2NsYXNzTmFtZTpgZHJlYW0tdGFzay1jYXJkLXRpdGxlJHtoPyIgZHJlYW0tdGFzay1jYXJkLXRpdGxlLS1jbGlja2FibGUiOiIifWAsb25DbGljazpoPygpPT5vKHkpOnZvaWQgMCxyb2xlOmg/ImJ1dHRvbiI6dm9pZCAwLHRhYkluZGV4Omg/MDp2b2lkIDAsb25LZXlEb3duOmg/Zj0+eyhmLmtleT09PSJFbnRlciJ8fGYua2V5PT09IiAiKSYmKGYucHJldmVudERlZmF1bHQoKSxvKHkpKX06dm9pZCAwLHRpdGxlOnkuaXNFeGlzdGluZz8iT3BlbiB0aGlzIHRhc2siOiJDbGljayB0byBjcmVhdGUgdGhpcyB0YXNrIixkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOnNpKHkudGl0bGUpfHx5LnRpdGxlfX0pLHNFKGUsaCx5KSxlKCJzcGFuIix7Y2xhc3NOYW1lOmBkcmVhbS10YXNrLXJhdGluZyBkcmVhbS10YXNrLXJhdGluZy0tJHtpRSh5LnJhdGluZyl9YCx0aXRsZTpgUmVsZXZhbmNlOiAke3kucmF0aW5nfS8xMGB9LGAke3kucmF0aW5nfS8xMGApKSxlKCJwIix7Y2xhc3NOYW1lOmBkcmVhbS10YXNrLWNhcmQtZXhwbGFuYXRpb24ke2MuaGFzKG0pPyIgZHJlYW0tdGFzay1jYXJkLWV4cGxhbmF0aW9uLS1leHBhbmRlZCI6IiJ9YCx0aXRsZTp5LmV4cGxhbmF0aW9uPy5sZW5ndGg+ckU/eS5leHBsYW5hdGlvbjpudWxsLG9uQ2xpY2s6KCk9PnYoeSksZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpzaSh5LmV4cGxhbmF0aW9uKXx8IiJ9fSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9ucyJ9LGUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6Zj0+cChmLHkpLHRpdGxlOnkucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c/IkNsaWNraW5nIHRoaXMgd2lsbCByZW1vdmUgcHJlc2VydmUgc3RhdHVzIHNvIHRoZSB0YXNrIGNhbiByZXNlZWQgbm9ybWFsbHkiOiJDbGlja2luZyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHRhc2sgcmVtYWlucyBwcmVzZW50IGluIHlvdXIgRHJlYW0gVGFzayBsaXN0IHRocm91Z2ggdG9tb3Jyb3cgKG5vcm1hbGx5IHRhc2tzIHJlc2VlZCBkYWlseSkifSx5LnByZXNlcnZlVGhyb3VnaFRvbW9ycm93PyJcdXsxRjZBQn0gUmVtb3ZlIHByZXNlcnZlIHN0YXR1cyI6Ilx1ezFGNDREfSBQcmVzZXJ2ZSB0aHJvdWdoIHRvbW9ycm93IiksZSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToiZHJlYW0tdGFzay1jYXJkLWFjdGlvbiIsb25DbGljazpmPT5kKGYseSksdGl0bGU6Ik1hcmsgdGhpcyB0YXNrIGNvbXBsZXRlIGFuZCByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBzdWdnZXN0aW9uIHdoZW4gYXZhaWxhYmxlIn0sIlx1MjcwNSBNYXJrIGNvbXBsZXRlIiksZSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToiZHJlYW0tdGFzay1jYXJkLWFjdGlvbiIsb25DbGljazpmPT5nKGYseSksdGl0bGU6IlJlbW92ZSB0aGlzIHRhc2sgYW5kIHJlcGxhY2UgaXQgd2l0aCBhbm90aGVyIHN1Z2dlc3Rpb24gd2hlbiBhdmFpbGFibGUifSwiXHUyNzRDIFJlbW92ZSIpKSl9KSxpP2UoInAiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbGxtLWF0dHJpYnV0aW9uIn0saSk6bnVsbCkpfWZ1bmN0aW9uIG1FKGUse2xvYWRpbmc6dCxlcnJvcjpuLHRhc2tzOnIsbWF4VGFza3M6byxub3RlTGluazphLGhlYWRlckFjdGlvbnM6aSxvblNldHRpbmdzQ2xpY2s6cyxydW5BbmFseXNpczpsLG9uVGFza0NsaWNrOnUsbGlzdFJlZjpjLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmQsYWN0aW9uSGFuZGxlcnM6cH0pe3JldHVybiB0P3VFKGUpOm4/ZEUoZSxuLGEsKCk9PmwobnVsbCkscyk6IXJ8fHIubGVuZ3RoPT09MD9wRShlLGEsKCk9PmwobnVsbCkpOmZFKGUscixvLGksdSxjLGQscCl9ZnVuY3Rpb24gaEUoZSx7bm90ZVVVSUQ6dCxvbk9wZW5Ob3RlOm4sb25SZXNlZWQ6cn0pe3JldHVybiBlKCJzcGFuIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWhlYWRlci1hY3Rpb25zIn0sbEUoZSxyKSxMeShlLHQsbikpfWZ1bmN0aW9uIGdFKGUsdCxuKXtsZXRbcixvXT0oMCxkZS51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpLFthLGldPSgwLGRlLnVzZVN0YXRlKSgoKT0+bmV3IFNldCkscz0oMCxkZS51c2VDYWxsYmFjaykoKCk9PntvKG5ldyBTZXQpLGkobmV3IFNldCl9LFtdKSxsPSgwLGRlLnVzZUNhbGxiYWNrKShhc3luYyh5LGIpPT57YXdhaXQgQXkoZSx0LHksYil9LFtlLHRdKSx1PSgwLGRlLnVzZUNhbGxiYWNrKSh5PT57bGV0IGI9S28oeSk7byhoPT57bGV0IG09bmV3IFNldChoKTtyZXR1cm4gbS5hZGQoYiksbX0pLHNldFRpbWVvdXQoKCk9PntuKGg9PihofHxbXSkuZmlsdGVyKG09PktvKG0pIT09YikpLG8oaD0+e2xldCBtPW5ldyBTZXQoaCk7cmV0dXJuIG0uZGVsZXRlKGIpLG19KSxpKGg9PntsZXQgbT1uZXcgU2V0KGgpO3JldHVybiBtLmRlbGV0ZShiKSxtfSl9LG9FKX0sW25dKSxjPSgwLGRlLnVzZUNhbGxiYWNrKSh5PT57bGV0IGI9eS5jdXJyZW50VGFyZ2V0Py5jbG9zZXN0Py4oIi5kcmVhbS10YXNrLWNhcmQiKTtpZighYnx8dHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuO2xldCBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IWgud2lkdGh8fCFoLmhlaWdodHx8aXkoe29yaWdpbjp7eDooaC5sZWZ0K2gud2lkdGgvMikvd2luZG93LmlubmVyV2lkdGgseTooaC50b3AraC5oZWlnaHQvMikvd2luZG93LmlubmVySGVpZ2h0fSxwYXJ0aWNsZUNvdW50OjkwLHNwcmVhZDo3NSxzdGFydFZlbG9jaXR5OjQyfSl9LFtdKSxkPSgwLGRlLnVzZUNhbGxiYWNrKShhc3luYyh5LGIpPT57eS5wcmV2ZW50RGVmYXVsdCgpLGMoeSk7bGV0IGg9bmV3IERhdGUoKS50b0lTT1N0cmluZygpO2F3YWl0IGwoYix7Y29tcGxldGVkQXQ6aCxyZW1vdmVkQXQ6bnVsbH0pLHUoYil9LFtjLGwsdV0pLHA9KDAsZGUudXNlQ2FsbGJhY2spKGFzeW5jKHksYik9Pnt5LnByZXZlbnREZWZhdWx0KCk7bGV0IGg9S28oYiksbT0hYi5wcmVzZXJ2ZVRocm91Z2hUb21vcnJvdztuKHc9Pih3fHxbXSkubWFwKGY9PktvKGYpPT09aD97Li4uZixwcmVzZXJ2ZVRocm91Z2hUb21vcnJvdzptfTpmKSksYXdhaXQgbChiLHtwcmVzZXJ2ZVRocm91Z2hUb21vcnJvdzptfSl9LFtsLG5dKSxnPSgwLGRlLnVzZUNhbGxiYWNrKShhc3luYyh5LGIpPT57eS5wcmV2ZW50RGVmYXVsdCgpO2xldCBoPW5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTthd2FpdCBsKGIse2NvbXBsZXRlZEF0Om51bGwscmVtb3ZlZEF0Omh9KSx1KGIpfSxbbCx1XSksdj0oMCxkZS51c2VDYWxsYmFjaykoeT0+e2xldCBiPUtvKHkpO2koaD0+e2xldCBtPW5ldyBTZXQoaCk7cmV0dXJuIG0uaGFzKGIpP20uZGVsZXRlKGIpOm0uYWRkKGIpLG19KX0sW10pO3JldHVybntkaXNtaXNzaW5nVGFza0tleXM6cixleHBhbmRlZEV4cGxhbmF0aW9uS2V5czphLG9uQ29tcGxldGVUYXNrOmQsb25QcmVzZXJ2ZVRhc2s6cCxvblJlbW92ZVRhc2s6ZyxvblRvZ2dsZUV4cGxhbmF0aW9uOnYscmVzZXRBY3Rpb25TdGF0ZTpzfX1mdW5jdGlvbiB0cCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dCxncmlkV2lkdGhTaXplOm4sb25PcGVuU2V0dGluZ3M6cixwcm92aWRlckFwaUtleTpvLHByb3ZpZGVyRW06YX0pe2xldCBpPWRlLmNyZWF0ZUVsZW1lbnQsW3MsbF09KDAsZGUudXNlU3RhdGUpKCExKSxbdSxjXT0oMCxkZS51c2VTdGF0ZSkobnVsbCksW2QscF09KDAsZGUudXNlU3RhdGUpKG51bGwpLFtnLHZdPSgwLGRlLnVzZVN0YXRlKShudWxsKSxbeSxiXT0oMCxkZS51c2VTdGF0ZSkobnVsbCksW2gsbV09KDAsZGUudXNlU3RhdGUpKG51bGwpLFssd109KDAsZGUudXNlU3RhdGUpKCgpPT5jaShlKSksZj0oMCxkZS51c2VSZWYpKG51bGwpLFM9ISEodHlwZW9mIHByb2Nlc3M8InUiJiZwcm9jZXNzLmVudj8uT1BFTl9BSV9BQ0NFU1NfVE9LRU58fCIifHxvKSxEPWE/YnIoYSk6bnVsbCxOPVR5KG4sdCksQz1OeShuLHQpLHg9RHkoKSxNPSgwLGRlLnVzZVJlZikoQykse2Rpc21pc3NpbmdUYXNrS2V5czpQLGV4cGFuZGVkRXhwbGFuYXRpb25LZXlzOk8sb25Db21wbGV0ZVRhc2s6UixvblByZXNlcnZlVGFzazpVLG9uUmVtb3ZlVGFzazpHLG9uVG9nZ2xlRXhwbGFuYXRpb246USxyZXNldEFjdGlvblN0YXRlOnBlfT1nRShlLGcsYyksX2U9KDAsZGUudXNlQ2FsbGJhY2spKGFzeW5jKCQsWCk9PntsZXQgdGU9KCR8fFtdKS5maWx0ZXIoQm9vbGVhbik7aWYodGUubGVuZ3RoPT09MClyZXR1cm4gWDtsZXQgWj1hd2FpdCBfeShlLFgsdGUpO3JldHVybiB3KFopLFp9LFtlXSksRT0oMCxkZS51c2VDYWxsYmFjaykoYXN5bmMoJCxYPXt9KT0+e2lmKCFTKXJldHVybjtsZXQgdGU9WC5wcm92aWRlckVtT3ZlcnJpZGU/YnIoWC5wcm92aWRlckVtT3ZlcnJpZGUpOkQ7bCghMCkscChudWxsKSxtKG51bGwpO3RyeXtsZXQgWj1hd2FpdCBSeShlLHtleGNsdWRlVXVpZHM6JCxvcHRpb25zOlgscHJvcG9zZWRUYXNrc05vdGVOYW1lOngsbWF4VGFza3M6Q30pO2F3YWl0IE15KFose3Byb3ZpZGVyTmFtZTp0ZSxhcHA6ZSxyZWNvcmRUYXNrVXVpZHM6X2Usc2V0RXJyb3I6cCxzZXRUYXNrczpjLHNldE5vdGVVVUlEOnYsc2V0RGVmYXVsdE5vdGVVVUlEOmIsc2V0TGxtQXR0cmlidXRpb25Gb290ZXI6bX0pfWNhdGNoKFope3Aoe2Vycm9yOloubWVzc2FnZXx8IkFuYWx5c2lzIGZhaWxlZCIsZXJyb3JDb2RlOiJsbG1fZXJyb3IiLHByb3ZpZGVyTmFtZTp0ZX0pfWZpbmFsbHl7bCghMSl9fSxbUyxlLF9lLEMseCxEXSk7KDAsZGUudXNlRWZmZWN0KSgoKT0+e2xldCAkPWNpKGUpO3coJCksRShudWxsLHttaW5pbXVtVGFza0NvdW50OkN9KX0sW10pLCgwLGRlLnVzZUVmZmVjdCkoKCk9PntpZighUylyZXR1cm47bGV0ICQ9TS5jdXJyZW50O00uY3VycmVudD1DLEl5KHttYXhUYXNrczpDLHByZXZpb3VzTWF4VGFza3M6JCx0YXNrczp1fSkmJlpkKGUsRSxDKX0sW2UsUyxDLEUsdV0pO2xldCBrPSgwLGRlLnVzZVJlZikoUyk7KDAsZGUudXNlRWZmZWN0KSgoKT0+e2xldCAkPWsuY3VycmVudDtrLmN1cnJlbnQ9UywhJCYmUyYmIXUmJkUobnVsbCx7bWluaW11bVRhc2tDb3VudDpDfSl9LFtTLHUsRSxDXSksKDAsZGUudXNlRWZmZWN0KSgoKT0+e2NsKGYuY3VycmVudCl9KTtsZXQgRj1hc3luYyAkPT57JC5wcmV2ZW50RGVmYXVsdCgpLGcmJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtnfWApfSxXPSQ9PnskLnByZXZlbnREZWZhdWx0KCksT3kocil9LEg9YXN5bmMgJD0+eyQucHJldmVudERlZmF1bHQoKTtsZXQgWD1lcChlLnNldHRpbmdzKSx0ZT17fTtpZihYLmxlbmd0aD4xKXtsZXQgWj1hd2FpdCBQeShlLGEpO2lmKCFaKXJldHVybjt0ZT17cHJvdmlkZXJFbU92ZXJyaWRlOloucHJvdmlkZXJFbX19ZWxzZSBYLmxlbmd0aD09PTEmJih0ZT17cHJvdmlkZXJFbU92ZXJyaWRlOlhbMF0ucHJvdmlkZXJFbX0pO2MobnVsbCkscGUoKSxtKG51bGwpLFpkKGUsRSxDLHRlKX07aWYoIVMpcmV0dXJuIEEoYGhhc0xsbUNvbmZpZyBpcyAke1N9IHdoZXJlYXMgcHJvdmlkZXJOYW1lIGlzICR7RH0gYW5kIHByb3ZpZGVyQXBpS2V5IGlzICR7b31gKSxjRShpLFcsRCk7bGV0IEs9aEUoaSx7bm90ZVVVSUQ6Zyxvbk9wZW5Ob3RlOkYsb25SZXNlZWQ6SH0pLHE9THkoaSxnLEYpO3JldHVybiBtRShpLHtlcnJvcjpkLGhlYWRlckFjdGlvbnM6SyxsaXN0UmVmOmYsbG9hZGluZzpzLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmgsbWF4VGFza3M6Tixub3RlTGluazpxLG9uVGFza0NsaWNrOiQ9PkN5KGUsJCx5KSx0YXNrczp1LG9uU2V0dGluZ3NDbGljazpXLHJ1bkFuYWx5c2lzOkUsYWN0aW9uSGFuZGxlcnM6e2Rpc21pc3NpbmdUYXNrS2V5czpQLGV4cGFuZGVkRXhwbGFuYXRpb25LZXlzOk8sb25Db21wbGV0ZTpSLG9uUHJlc2VydmU6VSxvblJlbW92ZTpHLG9uVG9nZ2xlRXhwbGFuYXRpb246UX19KX12YXIgeG49eGUod2UoKSk7ZnVuY3Rpb24gdkUoZSl7bGV0IHQ9e307Zm9yKGxldHtkYXRlS2V5Om4sdGFza3M6cn1vZiBlKXRbbl09cjtyZXR1cm4gdH1mdW5jdGlvbiBucChlKXtsZXRbdCxuXT0oMCx4bi51c2VTdGF0ZSkoe30pLHI9KDAseG4udXNlUmVmKSghMSksbz0oMCx4bi51c2VSZWYpKG51bGwpLGE9KDAseG4udXNlUmVmKShuZXcgU2V0KSxpPSgwLHhuLnVzZVJlZikobnVsbCkscz0oMCx4bi51c2VSZWYpKHt9KSxsPSgwLHhuLnVzZUNhbGxiYWNrKShhc3luYyh1LGMpPT57aS5jdXJyZW50IT09YyYmKGkuY3VycmVudD1jLGEuY3VycmVudD1uZXcgU2V0LHMuY3VycmVudD17fSk7bGV0e2JvdW5kYXJpZXM6ZCx3ZWVrU3RhcnRLZXk6cH09bnYodSksZz1gJHtwfTo6JHtjfHwiIn1gO2lmKGEuY3VycmVudC5oYXMoZykpcmV0dXJuIHMuY3VycmVudDtyLmN1cnJlbnQ9ITAsby5jdXJyZW50PW51bGw7dHJ5e2xldCB2PWF3YWl0IFByb21pc2UuYWxsKGQubWFwKGFzeW5jKHtmcm9tOmgsdG86bSxkYXRlS2V5Ond9KT0+e2xldCBmPWF3YWl0IGUuZ2V0Q29tcGxldGVkVGFza3MoaCxtKTtyZXR1cm57ZGF0ZUtleTp3LHRhc2tzOmZ8fFtdfX0pKSx5PXZFKHYpLGI9ey4uLnMuY3VycmVudCwuLi55fTtyZXR1cm4gbihiKSxzLmN1cnJlbnQ9YixhLmN1cnJlbnQuYWRkKGcpLGJ9Y2F0Y2godil7cmV0dXJuIEEoInVzZUNvbXBsZXRlZFRhc2tzOiBmYWlsZWQgdG8gZmV0Y2ggY29tcGxldGVkIHRhc2tzIix2KSxvLmN1cnJlbnQ9dixzLmN1cnJlbnR9ZmluYWxseXtyLmN1cnJlbnQ9ITF9fSxbXSk7cmV0dXJue2NvbXBsZXRlZFRhc2tzQnlEYXRlOnQsZ2V0IGxvYWRpbmcoKXtyZXR1cm4gci5jdXJyZW50fSxnZXQgZXJyb3IoKXtyZXR1cm4gby5jdXJyZW50fSxmZXRjaENvbXBsZXRlZFRhc2tzOmx9fXZhciBQZT14ZSh3ZSgpKTt2YXIgenk9ImRheS1za2V0Y2giLEZ5PTYseUU9MjEsd0U9MWU0LGJFPTMwMCxYcj1BcnJheS5mcm9tKHtsZW5ndGg6eUUtRnkrMX0sKGUsdCk9PkZ5K3QpO2Z1bmN0aW9uICR5KGUpe3JldHVybiBlLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLHt3ZWVrZGF5OiJsb25nIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pfWZ1bmN0aW9uIHhFKGUpe3JldHVybmBEYXkgU2tldGNoICR7JHkoZSl9YH1mdW5jdGlvbiBrRShlKXtsZXQgdD17fTtpZighZSlyZXR1cm4gdDtmb3IobGV0IG4gb2YgZS5zcGxpdChgCmApKXtsZXQgcj1uLm1hdGNoKC9eKFxkezEsMn0oPzphbXxwbSkpOlxzKiguKikvaSk7aWYoIXIpY29udGludWU7bGV0IG89clsxXS50b0xvd2VyQ2FzZSgpLGE9clsyXS5yZXBsYWNlKC9cXCskLywiIikudHJpbSgpLGk9U0Uobyk7aSE9PW51bGwmJlhyLmluY2x1ZGVzKGkpJiYodFtpXT1hKX1yZXR1cm4gdH1mdW5jdGlvbiBTRShlKXtsZXQgdD1lLm1hdGNoKC9eKFxkezEsMn0pKGFtfHBtKSQvaSk7aWYoIXQpcmV0dXJuIG51bGw7bGV0IG49cGFyc2VJbnQodFsxXSwxMCkscj10WzJdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHI9PT0iYW0iJiZuPT09MTI/bj0wOnI9PT0icG0iJiZuIT09MTImJihuKz0xMiksbn1mdW5jdGlvbiBFRShlKXtyZXR1cm4gWHIubWFwKHQ9PntsZXQgbj1qbyh0KSxyPWVbdF18fCIiO3JldHVybmAke259OiAke3J9YH0pLmpvaW4oYApgKX1mdW5jdGlvbiBtbCgpe2xldCBlPXt9O3JldHVybiBYci5mb3JFYWNoKHQ9PntlW3RdPSIifSksZX1mdW5jdGlvbiBVeShlKXtyZXR1cm4gZT9lIGluc3RhbmNlb2YgRGF0ZT9lLmdldFRpbWUoKTp0eXBlb2YgZT09Im51bWJlciI/ZTwxZTEwP2UqMWUzOmU6bnVsbDpudWxsfWZ1bmN0aW9uIFRFKGUpe2xldCB0PVV5KGU/LnN0YXJ0QXQpO2lmKCF0KXJldHVybltdO2xldCBuPW5ldyBEYXRlKHQpLmdldEhvdXJzKCkscj1bbl0sbz1VeShlPy5lbmRBdCk7aWYoIW98fG88PXQpcmV0dXJuIHI7bGV0IGE9TWF0aC5mbG9vcigoby10KS8oNjAqNjAqMWUzKSk7Zm9yKGxldCBpPTE7aTxhO2krPTEpci5wdXNoKG4raSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTkUoZSl7bGV0IHQ9KGU/LmNvbnRlbnR8fCIiKS5zcGxpdChgCmApWzBdO3JldHVybiBMdih0KX1mdW5jdGlvbiBERShlLHQpe3JldHVybiB0IT09bnVsbCYmSlNPTi5zdHJpbmdpZnkoZSkhPT1KU09OLnN0cmluZ2lmeSh0KX1mdW5jdGlvbiBfRShlLHQpe2xldCBuPXsuLi5lfTtyZXR1cm4gdC5mb3JFYWNoKHI9PntsZXQgbz1ORShyKTtvJiZURShyKS5mb3JFYWNoKGE9PntYci5pbmNsdWRlcyhhKSYmIW5bYV0mJihuW2FdPW8pfSl9KSxufWZ1bmN0aW9uIENFKHthcHA6ZSxub3RlTmFtZTp0fSl7bGV0W24scl09KDAsUGUudXNlU3RhdGUpKG1sKSxbbyxhXT0oMCxQZS51c2VTdGF0ZSkoITApLFtpLHNdPSgwLFBlLnVzZVN0YXRlKShudWxsKSxbbCx1XT0oMCxQZS51c2VTdGF0ZSkobnVsbCksYz0oMCxQZS51c2VSZWYpKG51bGwpLGQ9KDAsUGUudXNlUmVmKShuKTtkLmN1cnJlbnQ9bjtsZXQgcD0oMCxQZS51c2VDYWxsYmFjaykoYXN5bmMgeT0+e2lmKCFlKXJldHVybjtsZXQgYj1FRSh5KTt0cnl7bGV0IGg9aTtofHwoaD0oYXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0fSkpPy51dWlkfHxhd2FpdCBlLmNyZWF0ZU5vdGUodCxbeHRdKSxzKGgpKSxhd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDpofSxiKSx1KHsuLi55fSksQShgW0RheVNrZXRjaF0gcGVyc2lzdGVkICR7dH1gKX1jYXRjaChoKXtBKCJbRGF5U2tldGNoXSBzYXZlIGZhaWxlZCIsaCl9fSxbZSx0LGldKSxnPSgwLFBlLnVzZUNhbGxiYWNrKSgoeT13RSk9PntjLmN1cnJlbnQmJmNsZWFyVGltZW91dChjLmN1cnJlbnQpLGMuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57cChkLmN1cnJlbnQpfSx5KX0sW3BdKSx2PSgwLFBlLnVzZUNhbGxiYWNrKSgoKT0+e2MuY3VycmVudCYmY2xlYXJUaW1lb3V0KGMuY3VycmVudCkscChkLmN1cnJlbnQpfSxbcF0pO3JldHVybigwLFBlLnVzZUVmZmVjdCkoKCk9PntsZXQgeT0hMTtyZXR1cm4oYXN5bmMoKT0+e2EoITApO3RyeXtsZXQgYj1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnR9KTtpZih5KXJldHVybjtpZihiPy51dWlkKXtzKGIudXVpZCk7bGV0IGg9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpiLnV1aWR9KTtpZih5KXJldHVybjtsZXQgbT17Li4ubWwoKSwuLi5rRShoKX07cihtKSx1KG0pfWVsc2V7bGV0IGg9bWwoKTtyKGgpLHUoaCl9fWNhdGNoKGIpe2lmKEEoIltEYXlTa2V0Y2hdIGxvYWQgZmFpbGVkIixiKSwheSl7bGV0IGg9bWwoKTtyKGgpLHUoaCl9fWZpbmFsbHl7eXx8YSghMSl9fSkoKSwoKT0+e3k9ITB9fSxbZSx0XSksKDAsUGUudXNlRWZmZWN0KSgoKT0+KCk9PntjLmN1cnJlbnQmJmNsZWFyVGltZW91dChjLmN1cnJlbnQpfSxbXSkse2VudHJpZXM6bixpc0RpcnR5OkRFKG4sbCksbG9hZGluZzpvLHNhdmVOb3c6dixzY2hlZHVsZVNhdmU6ZyxzZXRFbnRyaWVzOnJ9fWZ1bmN0aW9uIEFFKHthZ2VuZGFUYXNrczplLGN1cnJlbnREYXRlOnQsbG9hZGluZzpuLHNldEVudHJpZXM6cn0peygwLFBlLnVzZUVmZmVjdCkoKCk9PntpZighZXx8IXR8fG4pcmV0dXJuO2xldCBvPVN0KHQpLGE9ZVtvXXx8W107YS5sZW5ndGghPT0wJiZyKGk9PntsZXQgcz1fRShpLGEpO3JldHVybiBKU09OLnN0cmluZ2lmeShzKT09PUpTT04uc3RyaW5naWZ5KGkpP2k6c30pfSxbZSx0LG4scl0pfWZ1bmN0aW9uIE9FKCl7bGV0IGU9KDAsUGUudXNlUmVmKSh7fSksdD0oMCxQZS51c2VDYWxsYmFjaykoKHIsbyk9PntvP2UuY3VycmVudFtyXT1vOmRlbGV0ZSBlLmN1cnJlbnRbcl19LFtdKTtyZXR1cm57aGFuZGxlSW5wdXRLZXlEb3duOigwLFBlLnVzZUNhbGxiYWNrKSgocixvKT0+e2lmKG8ua2V5IT09IkFycm93RG93biImJm8ua2V5IT09IkFycm93VXAiKXJldHVybjtpZihvLnByZXZlbnREZWZhdWx0KCksby5zaGlmdEtleSl7bGV0IHk9by5jdXJyZW50VGFyZ2V0LGI9eS52YWx1ZS5sZW5ndGg7by5rZXk9PT0iQXJyb3dVcCI/eS5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImJhY2t3YXJkIik6eS5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImZvcndhcmQiKTtyZXR1cm59bGV0IGE9WHIuaW5kZXhPZihyKTtpZihhPT09LTEpcmV0dXJuO2xldCBpPW8ua2V5PT09IkFycm93RG93biI/MTotMSxzPVhyW2EraV07aWYoIXMpcmV0dXJuO2xldCBsPW8uY3VycmVudFRhcmdldCx1PWUuY3VycmVudFtzXTtpZighdSlyZXR1cm47bGV0IGM9bC5zZWxlY3Rpb25TdGFydCxkPWwuc2VsZWN0aW9uRW5kLHA9dS52YWx1ZS5sZW5ndGgsZz1jPT09bnVsbD9wOk1hdGgubWluKGMscCksdj1kPT09bnVsbD9nOk1hdGgubWluKGQscCk7dS5mb2N1cygpLHUuc2V0U2VsZWN0aW9uUmFuZ2UoZyx2KX0sW10pLHNldElucHV0UmVmOnR9fWZ1bmN0aW9uIFJFKHtlbnRyaWVzOmUsaDp0LGhhbmRsZUJsdXI6bixoYW5kbGVJbnB1dENoYW5nZTpyLGhhbmRsZUlucHV0S2V5RG93bjpvLGhvdXI6YSxzZXRJbnB1dFJlZjppLHRpbWVGb3JtYXQ6c30pe3JldHVybiB0KCJkaXYiLHtrZXk6YSxjbGFzc05hbWU6ImRheS1za2V0Y2gtbGluZSJ9LHQoInNwYW4iLHtjbGFzc05hbWU6ImRheS1za2V0Y2gtaG91ci1sYWJlbCJ9LGpvKGEscykpLHQoImlucHV0Iix7dHlwZToidGV4dCIsY2xhc3NOYW1lOiJkYXktc2tldGNoLWlucHV0Iix2YWx1ZTplW2FdfHwiIixyZWY6bD0+aShhLGwpLG9uQ2hhbmdlOmw9PnIoYSxsLnRhcmdldC52YWx1ZSksb25LZXlEb3duOmw9Pm8oYSxsKSxvbkJsdXI6bixwbGFjZWhvbGRlcjoiIiwiYXJpYS1sYWJlbCI6YCR7am8oYSxzKX0gZW50cnlgfSkpfWZ1bmN0aW9uIE1FKGUsdCxuKXtyZXR1cm4gZSgiYnV0dG9uIix7Y2xhc3NOYW1lOmBkYXktc2tldGNoLXNhdmUtYnRuJHt0PyIiOiIgZGF5LXNrZXRjaC1zYXZlLWJ0bi0tZGlzYWJsZWQifWAsZGlzYWJsZWQ6IXQsb25DbGljazpuLHRpdGxlOnQ/IlNhdmUgY2hhbmdlcyI6Ik5vIHVuc2F2ZWQgY2hhbmdlcyJ9LHQ/IlNhdmUiOiJTYXZlZCIpfWZ1bmN0aW9uIHJwKHthZ2VuZGFUYXNrczplLGFwcDp0LGN1cnJlbnREYXRlOm4sdGltZUZvcm1hdDpyfSl7bGV0IG89UGUuY3JlYXRlRWxlbWVudCxhPW10KG4pLGk9eEUoYSkse2hhbmRsZUlucHV0S2V5RG93bjpzLHNldElucHV0UmVmOmx9PU9FKCkse2VudHJpZXM6dSxpc0RpcnR5OmMsbG9hZGluZzpkLHNhdmVOb3c6cCxzY2hlZHVsZVNhdmU6ZyxzZXRFbnRyaWVzOnZ9PUNFKHthcHA6dCxub3RlTmFtZTppfSk7QUUoe2FnZW5kYVRhc2tzOmUsY3VycmVudERhdGU6bixsb2FkaW5nOmQsc2V0RW50cmllczp2fSk7bGV0IHk9KDAsUGUudXNlQ2FsbGJhY2spKCgpPT57ZyhiRSl9LFtnXSksYj0oMCxQZS51c2VDYWxsYmFjaykoKGgsbSk9Pnt2KHc9Pih7Li4udyxbaF06bX0pKSxnKCl9LFtnLHZdKTtyZXR1cm4gbyhjZSx7dGl0bGU6bGUoenkpLHN1YnRpdGxlOiR5KGEpLGljb246Ilx1ezFGNUQyfVx1RkUwRiIsd2lkZ2V0SWQ6enksaGVhZGVyQWN0aW9uczpNRShvLGMscCl9LG8oImRpdiIse2NsYXNzTmFtZToiZGF5LXNrZXRjaC1ub3RlYm9vayJ9LGQ/bygiZGl2Iix7Y2xhc3NOYW1lOiJkYXktc2tldGNoLWxvYWRpbmcifSwiTG9hZGluZ1x1MjAyNiIpOlhyLm1hcChoPT5SRSh7ZW50cmllczp1LGg6byxoYW5kbGVCbHVyOnksaGFuZGxlSW5wdXRDaGFuZ2U6YixoYW5kbGVJbnB1dEtleURvd246cyxob3VyOmgsc2V0SW5wdXRSZWY6bCx0aW1lRm9ybWF0OnJ9KSkpKX12YXIgdHQ9eGUod2UoKSk7dmFyIGhsPSJwZWFrLWhvdXJzIjtmdW5jdGlvbiBJRShlKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOjI0fSwodCxuKT0+am8obixlKSl9ZnVuY3Rpb24gQnkoZSl7cmV0dXJuIGU/ZSBpbnN0YW5jZW9mIERhdGU/ZTp0eXBlb2YgZT09Im51bWJlciI/bmV3IERhdGUoZTwxZTEyP2UqMWUzOmUpOm5ldyBEYXRlKGUpOm51bGx9ZnVuY3Rpb24gUEUoZSl7bGV0IHQ9bXQoZSksbj10LmdldEZ1bGxZZWFyKCkscj10LmdldE1vbnRoKCksbz1uZXcgRGF0ZShuLHIsMSwwLDAsMCwwKSxhPW5ldyBEYXRlKG4scisxLDEsMCwwLDAsMCk7cmV0dXJue2Zyb206TWF0aC5mbG9vcihvLmdldFRpbWUoKS8xZTMpLHRvOk1hdGguZmxvb3IoYS5nZXRUaW1lKCkvMWUzKSxtb250aEtleTpgJHtufS0ke1N0cmluZyhyKzEpLnBhZFN0YXJ0KDIsIjAiKX1gfX1mdW5jdGlvbiBMRShlKXtsZXQgdD1uZXcgQXJyYXkoMjQpLmZpbGwoMCksbj1uZXcgQXJyYXkoMjQpLmZpbGwoMCkscj0wO2ZvcihsZXQgaSBvZiBlKXtsZXQgcz1pLnZpY3RvcnlWYWx1ZXx8MSxsPUJ5KGkuY3JlYXRlZEF0fHxpLnN0YXJ0QXQpO2wmJiFpc05hTihsKSYmKHRbbC5nZXRIb3VycygpXSs9cyxyKyspO2xldCB1PUJ5KGkuY29tcGxldGVkQXQpO3UmJiFpc05hTih1KSYmKG5bdS5nZXRIb3VycygpXSs9cyl9bGV0IG89dC5pbmRleE9mKE1hdGgubWF4KC4uLnQpKSxhPW4uaW5kZXhPZihNYXRoLm1heCguLi5uKSk7cmV0dXJue2NvbXBsZXRlZEJ5SG91cjpuLGNyZWF0ZWRCeUhvdXI6dCxwZWFrQ29tcGxldGVIb3VySW5kZXg6YSxwZWFrQ3JlYXRlSG91ckluZGV4Om8sdG90YWxUYXNrczpyfX1mdW5jdGlvbiB6RShlKXtsZXQgdD1nZXRDb21wdXRlZFN0eWxlKGUpO3JldHVybntiYXJDcmVhdGVkOnQuZ2V0UHJvcGVydHlWYWx1ZSgiLS1kYXNoYm9hcmQtY29sb3ItYmx1ZSIpLnRyaW0oKXx8IiM1YjdiYmYiLGJhckNvbXBsZXRlZDp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWFjY2VudCIpLnRyaW0oKXx8IiNlODg1M2QiLGF4aXNUZXh0OnQuZ2V0UHJvcGVydHlWYWx1ZSgiLS1kYXNoYm9hcmQtY29sb3ItdGV4dC1zZWNvbmRhcnkiKS50cmltKCl8fCIjN2E4Njk5IixncmlkTGluZTp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciIpLnRyaW0oKXx8IiNkOGRkZTYifX1mdW5jdGlvbiBXeShlLHQsbixyKXtsZXQgbz1lLmdldENvbnRleHQoIjJkIiksYT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSxpPWUucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPWkud2lkdGgsbD1pLmhlaWdodDtpZihzPD0wfHxsPD0wKXJldHVybjtlLndpZHRoPXMqYSxlLmhlaWdodD1sKmEsZS5zdHlsZS53aWR0aD1gJHtzfXB4YCxlLnN0eWxlLmhlaWdodD1gJHtsfXB4YCxvLnNjYWxlKGEsYSk7bGV0IHU9ekUoZSksYz00OCxkPTEyLHA9MTIsZz00MCx2PXMtYy1kLHk9bC1wLWcsYj1NYXRoLm1heCguLi50LC4uLm4sMSksaD1NYXRoLmNlaWwoYi8xMCkqMTB8fDEwO28uY2xlYXJSZWN0KDAsMCxzLGwpO2xldCBtPTU7by5mb250PSIxMXB4IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIixvLnRleHRBbGlnbj0icmlnaHQiLG8udGV4dEJhc2VsaW5lPSJtaWRkbGUiO2ZvcihsZXQgTj0wO048PW07TisrKXtsZXQgQz1NYXRoLnJvdW5kKGgvbSpOKSx4PXAreS15Kk4vbTtvLmZpbGxTdHlsZT11LmF4aXNUZXh0LG8uZmlsbFRleHQoYCR7Q31gLGMtOCx4KSxOPjAmJihvLnN0cm9rZVN0eWxlPXUuZ3JpZExpbmUsby5nbG9iYWxBbHBoYT0uNCxvLmxpbmVXaWR0aD0uNSxvLmJlZ2luUGF0aCgpLG8ubW92ZVRvKGMseCksby5saW5lVG8oYyt2LHgpLG8uc3Ryb2tlKCksby5nbG9iYWxBbHBoYT0xKX1sZXQgdz0yNCxmPXYvdyxUPWYqLjMyLFM9ZiouMDQ7Zm9yKGxldCBOPTA7Tjx3O04rKyl7bGV0IEM9YytOKmYrKGYtVCoyLVMpLzIseD10W05dL2gqeSxNPW5bTl0vaCp5O28uZmlsbFN0eWxlPXUuYmFyQ3JlYXRlZCxIeShvLEMscCt5LXgsVCx4LDIpLG8uZmlsbFN0eWxlPXUuYmFyQ29tcGxldGVkLEh5KG8sQytUK1MscCt5LU0sVCxNLDIpfW8uZmlsbFN0eWxlPXUuYXhpc1RleHQsby5mb250PSIxMHB4IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIixvLnRleHRBbGlnbj0iY2VudGVyIixvLnRleHRCYXNlbGluZT0idG9wIjtsZXQgRD12PDMwMD80OjI7Zm9yKGxldCBOPTA7Tjx3O04rPUQpe2xldCBDPWMrTipmK2YvMjtvLmZpbGxUZXh0KHJbTl0sQyxwK3krOCl9fWZ1bmN0aW9uIEh5KGUsdCxuLHIsbyxhKXtvPDF8fChhPU1hdGgubWluKGEsby8yLHIvMiksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0K2EsbiksZS5saW5lVG8odCtyLWEsbiksZS5hcmNUbyh0K3Isbix0K3IsbithLGEpLGUubGluZVRvKHQrcixuK28pLGUubGluZVRvKHQsbitvKSxlLmxpbmVUbyh0LG4rYSksZS5hcmNUbyh0LG4sdCthLG4sYSksZS5jbG9zZVBhdGgoKSxlLmZpbGwoKSl9ZnVuY3Rpb24gRkUoZSx0KXtsZXQgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dC5jbGllbnRYLW4ubGVmdCxvPW4ud2lkdGgsYT00OCxzPW8tYS0xMixsPXItYTtyZXR1cm4gbDwwfHxsPnM/LTE6TWF0aC5mbG9vcihsL3MqMjQpfWZ1bmN0aW9uIG9wKGUsdCxuKXtyZXR1cm4gZSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpYy1jYXJkIixrZXk6dH0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpYy1sYWJlbCJ9LHQpLGUoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1tZXRyaWMtdmFsdWUifSxuKSl9ZnVuY3Rpb24gankoZSx0LG4pe3JldHVybiBlKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWxlZ2VuZC1pdGVtIixrZXk6bn0sZSgic3BhbiIse2NsYXNzTmFtZTpgcGVhay1ob3Vycy1sZWdlbmQtc3dhdGNoICR7dH1gfSksbil9ZnVuY3Rpb24gYXAoe2FwcDplLGN1cnJlbnREYXRlOnQsc2VsZWN0ZWREYXRlOm4sdGltZUZvcm1hdDpyfSl7bGV0IG89dHQuY3JlYXRlRWxlbWVudCxhPSgwLHR0LnVzZVJlZikobnVsbCksW2ksc109KDAsdHQudXNlU3RhdGUpKG51bGwpLFtsLHVdPSgwLHR0LnVzZVN0YXRlKShbXSksYz0oMCx0dC51c2VSZWYpKG51bGwpLGQ9bnx8dDsoMCx0dC51c2VFZmZlY3QpKCgpPT57aWYoIWR8fCFlKXJldHVybjtsZXR7ZnJvbTpOLHRvOkMsbW9udGhLZXk6eH09UEUoZCk7aWYoYy5jdXJyZW50PT09eClyZXR1cm47Yy5jdXJyZW50PXg7bGV0IE09ITE7cmV0dXJuIGUuZ2V0Q29tcGxldGVkVGFza3MoTixDKS50aGVuKFA9PntNfHx1KEFycmF5LmlzQXJyYXkoUCk/UDpbXSl9KS5jYXRjaChQPT57QSgiW3BlYWstaG91cnNdIGZhaWxlZCB0byBmZXRjaCBtb250aCB0YXNrcyIsUCksTXx8dShbXSl9KSwoKT0+e009ITB9fSxbZSxkXSk7bGV0IHA9SUUocikse2NvbXBsZXRlZEJ5SG91cjpnLGNyZWF0ZWRCeUhvdXI6dixwZWFrQ29tcGxldGVIb3VySW5kZXg6eSxwZWFrQ3JlYXRlSG91ckluZGV4OmIsdG90YWxUYXNrczpofT0oMCx0dC51c2VNZW1vKSgoKT0+TEUobCksW2xdKSxtPXBbYl0sdz1wW3ldLHttb250aFN1YnRpdGxlOmYsZGF0ZVJhbmdlOlR9PSgwLHR0LnVzZU1lbW8pKCgpPT57aWYoIWQpcmV0dXJue21vbnRoU3VidGl0bGU6bnVsbCxkYXRlUmFuZ2U6bnVsbH07bGV0IE49bXQoZCksQz1OLmdldEZ1bGxZZWFyKCkseD1OLmdldE1vbnRoKCk7cmV0dXJue21vbnRoU3VidGl0bGU6Ti50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KSxkYXRlUmFuZ2U6e3N0YXJ0Om5ldyBEYXRlKEMseCwxKSxlbmQ6bmV3IERhdGUoQyx4KzEsMCl9fX0sW2RdKTsoMCx0dC51c2VFZmZlY3QpKCgpPT57aWYoIWEuY3VycmVudClyZXR1cm47V3koYS5jdXJyZW50LHYsZyxwKTtsZXQgTj0oKT0+e2EuY3VycmVudCYmV3koYS5jdXJyZW50LHYsZyxwKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLE4pLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixOKX0sW2csdixwXSk7bGV0IFM9KDAsdHQudXNlQ2FsbGJhY2spKE49PntsZXQgQz1GRShhLmN1cnJlbnQsTik7aWYoQzwwfHxDPjIzKXtzKG51bGwpO3JldHVybn1sZXQgeD1hLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cyh7eDpOLmNsaWVudFgteC5sZWZ0LHk6Ti5jbGllbnRZLXgudG9wLTYwLGhvdXI6cFtDXSxjcmVhdGVkOnZbQ10sY29tcGxldGVkOmdbQ119KX0sW3YsZ10pLEQ9KDAsdHQudXNlQ2FsbGJhY2spKCgpPT5zKG51bGwpLFtdKTtyZXR1cm4gaD09PTA/byhjZSx7dGl0bGU6bGUoaGwpLGljb246Ilx1MjNGMCIsd2lkZ2V0SWQ6aGwsc3VidGl0bGU6Zn0sbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWVtcHR5In0sbygicCIsbnVsbCwiTm8gY29tcGxldGVkIHRhc2sgZGF0YSBhdmFpbGFibGUgeWV0LiIpKSk6byhjZSx7dGl0bGU6bGUoaGwpLGljb246Ilx1MjNGMCIsd2lkZ2V0SWQ6aGwsc3VidGl0bGU6Zn0sbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpY3MtZ3JpZCJ9LG9wKG8sIlRhc2tzIGFuYWx5emVkIixoKSxvcChvLCJQZWFrIGNyZWF0ZSBob3VyIixtKSxvcChvLCJQZWFrIGNvbXBsZXRlIGhvdXIiLHcpKSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtbGVnZW5kIn0sankobywicGVhay1ob3Vycy1sZWdlbmQtc3dhdGNoLS1jcmVhdGVkIiwiQ3JlYXRlZCB2YWx1ZSIpLGp5KG8sInBlYWstaG91cnMtbGVnZW5kLXN3YXRjaC0tY29tcGxldGVkIiwiQ29tcGxldGVkIHZhbHVlIikpLG8oImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1jaGFydC1jb250YWluZXIifSxvKCJjYW52YXMiLHtyZWY6YSxjbGFzc05hbWU6InBlYWstaG91cnMtY2FudmFzIixvbk1vdXNlTW92ZTpTLG9uTW91c2VMZWF2ZTpEfSksaSYmbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAiLHN0eWxlOntsZWZ0OmkueCx0b3A6aS55LHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSJ9fSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1oZWFkZXIifSxpLmhvdXIpLG8oImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy10b29sdGlwLXJvdyJ9LG8oInNwYW4iLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1sYWJlbCBwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwtLWNyZWF0ZWQifSwiQ3JlYXRlZDoiKSxgICR7aS5jcmVhdGVkfSBwdHNgKSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1yb3cifSxvKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwgcGVhay1ob3Vycy10b29sdGlwLWxhYmVsLS1jb21wbGV0ZWQifSwiQ29tcGxldGVkOiIpLGAgJHtpLmNvbXBsZXRlZH0gcHRzYCkpKSxUJiZvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtZm9vdGVyIn0sZikpfXZhciBrbj14ZSh3ZSgpKTtmdW5jdGlvbiBnbChlKXtyZXR1cm4gZS5zdGFydEF0fHxlLmRlYWRsaW5lfWZ1bmN0aW9uIGlwKGUsdCxuPSgpPT4hMCl7bGV0IHI9e30sbz0wLGE9bmV3IERhdGU7cmV0dXJuIGUuZm9yRWFjaChpPT57aWYobys9MSwhbihpKSlyZXR1cm47bGV0IHM9dChpKTtpZighcylyZXR1cm47bGV0IGw9Z3Iocyk7cltsXXx8KHJbbF09W10pLHJbbF0ucHVzaChpKX0pLEEoYEFuYWx5emVkICR7b30gdGFza3MsIGdyb3VwZWQgaW50byAke09iamVjdC5rZXlzKHIpLmxlbmd0aH0gZGF0ZSBrZXlzIGluICR7bmV3IERhdGUtYX1tc2ApLHJ9ZnVuY3Rpb24gVnkoZSl7cmV0dXJuIGlwKGUsZ2wsdD0+IXQuY29tcGxldGVkQXQmJiF0LmRpc21pc3NlZEF0KX1mdW5jdGlvbiBHeShlKXtyZXR1cm4gaXAoZSx0PT50LmNvbXBsZXRlZEF0LHQ9PiEhdC5jb21wbGV0ZWRBdCl9ZnVuY3Rpb24gVUUoZSx0KXtsZXQgbj1lLmZpbHRlcihvPT5vPnQpLHI9ZS5maWx0ZXIobz0+bzx0KTtyZXR1cm57dXBjb21pbmdEYXRlS2V5czpuLG9sZGVyRGF0ZUtleXM6cn19ZnVuY3Rpb24gJEUoZSx0KXtsZXQgbj17fTtyZXR1cm4gdC5mb3JFYWNoKHI9PntuW3JdPWVbcl18fFtdfSksbn1mdW5jdGlvbiBzcCgpe2xldFtlLHRdPSgwLGtuLnVzZVN0YXRlKShbXSksW24scl09KDAsa24udXNlU3RhdGUpKG51bGwpLFtvLGFdPSgwLGtuLnVzZVN0YXRlKShudWxsKSxbaSxzXT0oMCxrbi51c2VTdGF0ZSkoe30pLFtsLHVdPSgwLGtuLnVzZVN0YXRlKSh7fSksYz1uZXcgRGF0ZSxkPSgwLGtuLnVzZUNhbGxiYWNrKSh2PT57aWYoIXYpcmV0dXJuO3Qodi50YXNrRG9tYWluc3x8W10pLHIodi5hY3RpdmVUYXNrRG9tYWlufHxudWxsKTtsZXQgeT12LnRhc2tzfHxbXTtzKFZ5KHkpKSx1KEd5KHkpKSxhKERhdGUubm93KCkpfSxbXSkscD0oMCxrbi51c2VDYWxsYmFjaykoKHYseSxiKT0+e2lmKHYmJnQodikseSYmcih5KSxiKXtsZXQgaD1iLnRhc2tzfHxbXTtzKFZ5KGgpKSx1KEd5KGgpKSxhKERhdGUubm93KCkpfX0sW10pLGc9KDAsa24udXNlQ2FsbGJhY2spKHY9PntsZXQgeT12P25ldyBEYXRlKHYpOm5ldyBEYXRlLGI9Z3IoeSksaD1PYmplY3QudmFsdWVzKGkpLmZsYXQoKSxtPWguZmlsdGVyKEQ9PiEhKEQuc3RhcnRBdHx8RC5kZWFkbGluZSkpLnNvcnQoKEQsTik9PmdsKEQpLWdsKE4pKTtBKGBBZ2VuZGEgd2lsbCByZXZpZXdlZCAke2gubGVuZ3RofSBvcGVuIHRhc2tzYCxoLm1hcChEPT4oe2RlYWRsaW5lVGV4dDpELmRlYWRsaW5lP2dyKEQuZGVhZGxpbmUpOiJOL0EiLHN0YXJ0VGV4dDpELnN0YXJ0QXQ/Z3IoRC5zdGFydEF0KToiTm9uZSIsLi4uRH0pKSksQShgJHttLmxlbmd0aH0gcmVsZXZhbnQgKHdpdGggc3RhcnRBdClgLG0pO2xldCB3PWlwKG0sZ2wpLGY9T2JqZWN0LmtleXModykuc29ydCgpLHt1cGNvbWluZ0RhdGVLZXlzOlR9PVVFKGYsYiksUz1bYiwuLi5UXTtyZXR1cm4gJEUodyxTKX0sW2ldKTtyZXR1cm4gQShgdXNlRG9tYWluVGFza3MgaW5pdGlhbGl6ZWQgd2l0aCBhY3RpdmUgZG9tYWluICR7bn0gaW4gJHtuZXcgRGF0ZS1jfW1zYCkse3Rhc2tEb21haW5zOmUsYWN0aXZlVGFza0RvbWFpbjpuLHRhc2tzRmV0Y2hlZEF0Om8sb3BlblRhc2tzOmksY29tcGxldGVkVGFza3M6bCxpbml0aWFsaXplRG9tYWluVGFza3M6ZCxvbkRvbWFpbkNoYW5nZTpwLGJ1aWxkQWdlbmRhVGFza3NCeURhdGU6Z319dmFyIEVlPXhlKHdlKCkpO3ZhciBCRT01ZTMsWHk9NyxXRT0zLHllPTIyMCxaeT0xNCxlMD0yLEhFPTQsakU9NzgsVkU9NDAsS3k9NCxHRT00OCxLRT05NSxZRT0xNixxRT0uMDQsUUU9MTIsSkU9MTIsWXk9LjUsWEU9MS44LFpFPS00LGVUPTUscXk9LjcsdFQ9My4zLG5UPTE4LHJUPTIyLG9UPS01LGFUPTExLGlUPTEzLHNUPTI2LGxUPTEwLHVUPTMwLGNUPTQ0LGRUPTUsdmw9MS8zLHBUPTEuMyxmVD1bWzAsIiMyN0FFNjA1MCJdLFsuNSwiI0YyQzk0QzIwIl0sWzEsIiNFODQ1M0MwOCJdXSxtVD0yLGhUPTMuNSxnVD0xLjIsdlQ9OCxReT0uMyx5VD0yLHdUPTEsYlQ9MTYseFQ9MjgsSnk9Ljcsa1Q9MyxTVD0tMTEsRVQ9MTQsVFQ9NTYsTlQ9NDYsRFQ9MTYsX1Q9OCxDVD0zMyxBVD0xMixPVD0uMjUsUlQ9Ljc1LE1UPTI1LElUPTEyMDAsUFQ9MWUzLHQwPTMseWw9W3t2YWx1ZTotMixlbW9qaToiXHV7MUY2MzV9XHUyMDBEXHV7MUY0QUJ9IixsYWJlbDoiQXdmdWwifSx7dmFsdWU6LTEsZW1vamk6Ilx1ezFGQUU0fSIsbGFiZWw6IkJhZCJ9LHt2YWx1ZTowLGVtb2ppOiJcdXsxRjY0Mn0iLGxhYmVsOiJPa2F5In0se3ZhbHVlOjEsZW1vamk6Ilx1ezFGNjAwfSIsbGFiZWw6Ikdvb2QifSx7dmFsdWU6MixlbW9qaToiXHV7MUY5Mjl9IixsYWJlbDoiR3JlYXQifV0sTFQ9eyItMiI6IiNFODQ1M0MiLCItMSI6IiNGMjk5NEEiLDA6IiNGMkM5NEMiLDE6IiM2RkNGOTciLDI6IiMyN0FFNjAifSx6VD1PYmplY3QuZnJvbUVudHJpZXMoeWwubWFwKGU9PltlLnZhbHVlLGUuZW1vamldKSk7ZnVuY3Rpb24gWW8oZSl7cmV0dXJuIExUW01hdGgucm91bmQoZSldfHwiI2NjYyJ9ZnVuY3Rpb24gbjAoZSl7cmV0dXJuIHpUW01hdGgucm91bmQoZSldfHwiXHUyNzUzIn1mdW5jdGlvbiBGVChlKXtsZXQgdD15bC5maW5kKG49Pm4udmFsdWU9PT1lKTtyZXR1cm4gdD90LmxhYmVsOiIifWZ1bmN0aW9uIHIwKGUpe2lmKCFlKXJldHVybiIiO2xldHtmdWxsRGF0ZTp0LGVudHJpZXM6bn09ZSxyPVtgPGRpdiBjbGFzcz0ibW9vZC12aXotdG9vbHRpcC1kYXRlIj4ke3R9PC9kaXY+YF07Zm9yKGxldCBvIG9mIG4pe2xldCBhPXlsLmZpbmQobD0+bC52YWx1ZT09PW8ucmF0aW5nKT8uZW1vaml8fCJcdTI3NTMiLGk9RlQoby5yYXRpbmcpLHM9YDxkaXYgY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtZW50cnkiPjxzcGFuIGNsYXNzPSJtb29kLXZpei10b29sdGlwLXRpbWUiPiR7by50aW1lfTwvc3Bhbj48c3BhbiBjbGFzcz0ibW9vZC12aXotdG9vbHRpcC1tb29kIj4ke2F9IDxzcGFuIGNsYXNzPSJtb29kLXZpei1sYWJlbCI+JHtpfSAoJHtvLnJhdGluZz4wP2ArJHtvLnJhdGluZ31gOm8ucmF0aW5nfSk8L3NwYW4+PC9zcGFuPmA7by5ub3RlcyYmKHMrPWA8ZGl2IGNsYXNzPSJtb29kLXZpei10b29sdGlwLW5vdGUiPiR7by5ub3Rlc308L2Rpdj5gKSxzKz0iPC9kaXY+IixyLnB1c2gocyl9cmV0dXJuIHIuam9pbigiIil9ZnVuY3Rpb24gVVQoZSx0LG4scil7dHx8bnx8cihlKX1mdW5jdGlvbiAkVChlLHQsbixyLG8sYSxpKXt0LmtleT09PSJFbnRlciImJih0LmN0cmxLZXl8fHQubWV0YUtleSkmJih0LnByZXZlbnREZWZhdWx0KCksbzAoZSxuLHIsbyxhLGkpKX1hc3luYyBmdW5jdGlvbiBvMChlLHQsbixyLG8sYSl7cighMCk7dHJ5e2xldCBpPWF3YWl0IGUucmVjb3JkTW9vZFJhdGluZyh0LnZhbHVlKSxzPW4udHJpbSgpO3MmJmF3YWl0IGUudXBkYXRlTW9vZFJhdGluZyhpLHtub3RlOnN9KSxvKCEwKSxhJiZhKHtyYXRpbmc6dC52YWx1ZSx0aW1lc3RhbXA6TWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMyksbm90ZTpzfHxudWxsfSl9Y2F0Y2goaSl7QSgiRmFpbGVkIHRvIHJlY29yZCBtb29kOiIsaSl9ZmluYWxseXtyKCExKX19ZnVuY3Rpb24gQlQoZSl7bGV0IHQ9KGV8fFtdKS5zbGljZSgtWHkpO2lmKCF0Lmxlbmd0aClyZXR1cm57cmVjZW50TW9vZHM6dCxhdmVyYWdlTW9vZDoiXHUyMDE0In07bGV0IG49KHQucmVkdWNlKChyLG8pPT5yK28ucmF0aW5nLDApL3QubGVuZ3RoKS50b0ZpeGVkKDEpO3JldHVybntyZWNlbnRNb29kczp0LGF2ZXJhZ2VNb29kOm59fWZ1bmN0aW9uIGEwKCl7bGV0IGU9Z2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLHQ9bj0+ZS5nZXRQcm9wZXJ0eVZhbHVlKG4pLnRyaW0oKTtyZXR1cm57YmdDYXJkOnQoIi0tZGFzaGJvYXJkLWNvbG9yLWJnLWNhcmQiKSxiZ1BhZ2U6dCgiLS1kYXNoYm9hcmQtY29sb3ItYmctcGFnZSIpLGJvcmRlcjp0KCItLWRhc2hib2FyZC1jb2xvci1ib3JkZXIiKSx0ZXh0U2Vjb25kYXJ5OnQoIi0tZGFzaGJvYXJkLWNvbG9yLXRleHQtc2Vjb25kYXJ5IiksdGV4dE11dGVkOnQoIi0tZGFzaGJvYXJkLWNvbG9yLXRleHQtbXV0ZWQiKX19ZnVuY3Rpb24gbHAoZSx0KXtyZXR1cm4gZS5zdGFydHNXaXRoKCIjIikmJmUubGVuZ3RoPT09Nz9lK3Q6ZX1mdW5jdGlvbiBXVCh7bW9vZERhdGE6ZX0pe2xldCB0PUVlLmNyZWF0ZUVsZW1lbnQsbj0oMCxFZS51c2VSZWYpKG51bGwpLHI9KDAsRWUudXNlUmVmKShudWxsKSxbbyxhXT0oMCxFZS51c2VTdGF0ZSkoMCksaT1laSgpLHM9SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuKDAsRWUudXNlRWZmZWN0KSgoKT0+e2EoMCk7bGV0IGMsZD1udWxsLHA9SVQsZz12PT57ZHx8KGQ9dik7bGV0IHk9TWF0aC5taW4oKHYtZCkvcCwxKSxiPTEtTWF0aC5wb3coMS15LHQwKTthKGIpLHk8MSYmKGM9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGcpKX07cmV0dXJuIGM9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGcpLCgpPT5jYW5jZWxBbmltYXRpb25GcmFtZShjKX0sW3NdKSwoMCxFZS51c2VFZmZlY3QpKCgpPT57bGV0IGM9bi5jdXJyZW50O2lmKCFjKXJldHVybjtsZXQgZD1jLmdldENvbnRleHQoIjJkIikscD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8ZTA7Yy53aWR0aD15ZSpwLGMuaGVpZ2h0PXllKnAsZC5zY2FsZShwLHApLGQuY2xlYXJSZWN0KDAsMCx5ZSx5ZSk7bGV0IGc9YTAoKSx2PXllLzIseT15ZS8yK0hFLGI9akUsaD1WRTtkLmZpbGxTdHlsZT1nLmJnQ2FyZCxkLmJlZ2luUGF0aCgpLGQucm91bmRSZWN0KDAsMCx5ZSx5ZSxaeSksZC5maWxsKCksZC5zdHJva2VTdHlsZT1scChnLmJvcmRlciwiMjgiKSxkLmxpbmVXaWR0aD0xO2ZvcihsZXQgUz1HRTtTPD1LRTtTKz1ZRSlkLmJlZ2luUGF0aCgpLGQuYXJjKHYseSxTLDAsTWF0aC5QSSoyKSxkLnN0cm9rZSgpO2xldCBtPWUubWFwKFM9Pih7bGFiZWw6Uy5kYXlMYWJlbCxkYXRlTGFiZWw6Uy5kYXRlTGFiZWwsdmFsOlMucmF0aW5nfSkpLHc9TWF0aC5tYXgobS5sZW5ndGgsMSksZj1NYXRoLlBJKjIvdyxUPW0ubGVuZ3RoPjE/cUU6MDtpZihyLmN1cnJlbnQ9e2NlbnRlclg6dixjZW50ZXJZOnksaW5uZXJSYWRpdXM6aCxvdXRlclJhZGl1czpiLHNlZ21lbnRDb3VudDptLmxlbmd0aCxzZWdtZW50QW5nbGU6ZixnYXBBbmdsZTpUfSxtLmZvckVhY2goKHtsYWJlbDpTLGRhdGVMYWJlbDpELHZhbDpOfSxDKT0+e2xldCB4PS1NYXRoLlBJLzIrQypmK1QsTT14KyhmLVQqMikqbyxQPVlvKE4pO2Quc2hhZG93Q29sb3I9UCxkLnNoYWRvd0JsdXI9UUUqbyxkLmJlZ2luUGF0aCgpLGQuYXJjKHYseSxiLHgsTSksZC5hcmModix5LGgsTSx4LCEwKSxkLmNsb3NlUGF0aCgpO2xldCBPPWQuY3JlYXRlUmFkaWFsR3JhZGllbnQodix5LGgsdix5LGIpO2lmKE8uYWRkQ29sb3JTdG9wKDAsUCsiOTkiKSxPLmFkZENvbG9yU3RvcCgxLFArImZmIiksZC5maWxsU3R5bGU9TyxkLmZpbGwoKSxkLnNoYWRvd0JsdXI9MCxvPll5KXtsZXQgUj14KyhmLVQqMikvMixVPWIrSkUsRz12K01hdGguY29zKFIpKlUsUT15K01hdGguc2luKFIpKlU7ZC5maWxsU3R5bGU9Zy50ZXh0U2Vjb25kYXJ5LGQuZ2xvYmFsQWxwaGE9KG8tWXkpKlhFLGQuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsZC50ZXh0QWxpZ249ImNlbnRlciIsZC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsZC5maWxsVGV4dChTLEcsUStaRSksZC5mb250PSI3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsZC5maWxsU3R5bGU9Zy50ZXh0TXV0ZWQsZC5maWxsVGV4dChELEcsUStlVCksZC5nbG9iYWxBbHBoYT0xfWlmKG8+cXkpe2xldCBSPXgrKGYtVCoyKS8yLFU9KGIraCkvMixHPXYrTWF0aC5jb3MoUikqVSxRPXkrTWF0aC5zaW4oUikqVTtkLmZvbnQ9IjEzcHggc2VyaWYiLGQudGV4dEFsaWduPSJjZW50ZXIiLGQudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGQuZ2xvYmFsQWxwaGE9TWF0aC5taW4oKG8tcXkpKnRULDEpLGQuZmlsbFRleHQobjAoTiksRyxRKSxkLmdsb2JhbEFscGhhPTF9fSksZC5iZWdpblBhdGgoKSxkLmFyYyh2LHksaC1LeSwwLE1hdGguUEkqMiksZC5maWxsU3R5bGU9Zy5iZ1BhZ2UsZC5maWxsKCksbS5sZW5ndGg+MCl7bGV0IFM9KG0ucmVkdWNlKChELE4pPT5EK04udmFsLDApL20ubGVuZ3RoKS50b0ZpeGVkKDEpO2QuZmlsbFN0eWxlPVlvKE1hdGgucm91bmQoTnVtYmVyKFMpKSksZC5mb250PWBib2xkICR7clR9cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZmAsZC50ZXh0QWxpZ249ImNlbnRlciIsZC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsZC5nbG9iYWxBbHBoYT1vLGQuZmlsbFRleHQoUyx2LHkrb1QpLGQuZmlsbFN0eWxlPWcudGV4dE11dGVkLGQuZm9udD0iYm9sZCA3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsZC5maWxsVGV4dCgiNy1EQVkgQVZHIix2LHkrYVQpLGQuZ2xvYmFsQWxwaGE9MX1kLmZpbGxTdHlsZT1nLnRleHRNdXRlZCxkLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGQudGV4dEFsaWduPSJjZW50ZXIiLGQudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIixkLmZpbGxUZXh0KCJXIEUgRSBLICAgUiBJIE4gRyIsdixpVCl9LFtzLG9dKSx0KCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixsaW5lSGVpZ2h0OjB9fSx0KCJjYW52YXMiLHtyZWY6bixjbGFzc05hbWU6Im1vb2Qtdml6LWNhbnZhcyIsb25Nb3VzZU1vdmU6Yz0+e2xldCBkPXIuY3VycmVudCxwPW4uY3VycmVudDtpZighZHx8IWQuc2VnbWVudENvdW50fHwhcCl7aS5oaWRlKCk7cmV0dXJufWxldCBnPXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj0oYy5jbGllbnRYLWcubGVmdCkqKHllL2cud2lkdGgpLHk9KGMuY2xpZW50WS1nLnRvcCkqKHllL2cuaGVpZ2h0KSxiPXYtZC5jZW50ZXJYLGg9eS1kLmNlbnRlclksbT1NYXRoLnNxcnQoYipiK2gqaCk7aWYobTxkLmlubmVyUmFkaXVzLUt5fHxtPmQub3V0ZXJSYWRpdXMrblQpe2kuaGlkZSgpO3JldHVybn1sZXQgdz1NYXRoLmF0YW4yKGgsYikrTWF0aC5QSS8yO3c8MCYmKHcrPU1hdGguUEkqMik7bGV0IGY9TWF0aC5mbG9vcih3L2Quc2VnbWVudEFuZ2xlKTtpZihmPj0wJiZmPGQuc2VnbWVudENvdW50KXtsZXQgVD1lW2ZdLFM9Zy5sZWZ0K3YveWUqZy53aWR0aCxEPWcudG9wK3kveWUqZy5oZWlnaHQ7aS5zaG93KHIwKHtmdWxsRGF0ZTpULmZ1bGxEYXRlLGVudHJpZXM6VC5lbnRyaWVzfHxbVF19KSxTLEQpfWVsc2UgaS5oaWRlKCl9LG9uTW91c2VMZWF2ZTooKT0+aS5oaWRlKCl9KSl9ZnVuY3Rpb24gSFQoe21vb2REYXRhOmV9KXtsZXQgdD1FZS5jcmVhdGVFbGVtZW50LG49KDAsRWUudXNlUmVmKShudWxsKSxyPSgwLEVlLnVzZVJlZikoW10pLFtvLGFdPSgwLEVlLnVzZVN0YXRlKSgwKSxpPWVpKCkscz1KU09OLnN0cmluZ2lmeShlKTtyZXR1cm4oMCxFZS51c2VFZmZlY3QpKCgpPT57YSgwKTtsZXQgYyxkPW51bGwscD1QVCxnPXY9PntkfHwoZD12KTtsZXQgeT1NYXRoLm1pbigodi1kKS9wLDEpO2EoMS1NYXRoLnBvdygxLXksdDApKSx5PDEmJihjPXJlcXVlc3RBbmltYXRpb25GcmFtZShnKSl9O3JldHVybiBjPXJlcXVlc3RBbmltYXRpb25GcmFtZShnKSwoKT0+Y2FuY2VsQW5pbWF0aW9uRnJhbWUoYyl9LFtzXSksKDAsRWUudXNlRWZmZWN0KSgoKT0+e2xldCBjPW4uY3VycmVudDtpZighYylyZXR1cm47bGV0IGQ9Yy5nZXRDb250ZXh0KCIyZCIpLHA9d2luZG93LmRldmljZVBpeGVsUmF0aW98fGUwO2Mud2lkdGg9eWUqcCxjLmhlaWdodD15ZSpwLGQuc2NhbGUocCxwKSxkLmNsZWFyUmVjdCgwLDAseWUseWUpO2xldCBnPWEwKCk7ZC5iZWdpblBhdGgoKSxkLnJvdW5kUmVjdCgwLDAseWUseWUsWnkpLGQuZmlsbFN0eWxlPWcuYmdDYXJkLGQuZmlsbCgpO2xldCB2PXNULHk9bFQsYj11VCxoPWNULG09eWUtdi15LHc9eWUtYi1oLGY9Yit3O2ZvcihsZXQgeD0tMjt4PD0yO3grKyl7bGV0IE09Yit3LSh4KzIpLzQqdztkLnN0cm9rZVN0eWxlPWxwKGcuYm9yZGVyLCI1MCIpLGQubGluZVdpZHRoPTEsZC5iZWdpblBhdGgoKSxkLm1vdmVUbyh2LE0pLGQubGluZVRvKHllLXksTSksZC5zdHJva2UoKSxkLmZpbGxTdHlsZT1nLnRleHRNdXRlZCxkLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGQudGV4dEFsaWduPSJyaWdodCIsZC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsZC5maWxsVGV4dCh4PjA/YCske3h9YDp4LHYtZFQsTSl9bGV0IFQ9ZS5tYXAoeD0+KHtsYWJlbDp4LmRheUxhYmVsLGRhdGVMYWJlbDp4LmRhdGVMYWJlbCx2YWw6eC5yYXRpbmd9KSksUz0oeCxNKT0+TT09PTE/dittLzI6TT09PTI/dittKih4PT09MD9PVDpSVCk6dit4LyhNLTEpKm0sRD1ULm1hcCgoeCxNKT0+KHt4OlMoTSxULmxlbmd0aCkseTpiK3ctKHgudmFsKzIpLzQqdyx2YWw6eC52YWwsbGFiZWw6eC5sYWJlbCxkYXRlTGFiZWw6eC5kYXRlTGFiZWx9KSk7ci5jdXJyZW50PUQ7bGV0IE49RC5tYXAoeD0+KHsuLi54LHk6Yit3LSh4LnZhbCsyKS80KncqTWF0aC5taW4obypwVCwxKX0pKSxDPSh4LE0pPT57ZC5iZWdpblBhdGgoKSxkLm1vdmVUbyh4WzBdLngseFswXS55KTtmb3IobGV0IFA9MDtQPHgubGVuZ3RoLTE7UCsrKXtsZXQgTz14W1ArMV0ueC14W1BdLngsUj14W1BdLngrTyp2bCxVPXhbUCsxXS54LU8qdmw7ZC5iZXppZXJDdXJ2ZVRvKFIseFtQXS55LFUseFtQKzFdLnkseFtQKzFdLngseFtQKzFdLnkpfU0mJihkLmxpbmVUbyh4W3gubGVuZ3RoLTFdLngsZiksZC5saW5lVG8oeFswXS54LGYpLGQuY2xvc2VQYXRoKCkpfTtpZihOLmxlbmd0aD49Mil7bGV0IHg9ZC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLGIsMCxmKTtmb3IobGV0W00sUF1vZiBmVCl4LmFkZENvbG9yU3RvcChNLFApO0MoTiwhMCksZC5maWxsU3R5bGU9eCxkLmZpbGwoKSxkLmxpbmVXaWR0aD1tVCxkLmxpbmVDYXA9InJvdW5kIjtmb3IobGV0IE09MDtNPE4ubGVuZ3RoLTE7TSsrKXtsZXQgUD1OW01dLE89TltNKzFdLFI9ZC5jcmVhdGVMaW5lYXJHcmFkaWVudChQLngsUC55LE8ueCxPLnkpO1IuYWRkQ29sb3JTdG9wKDAsWW8oUC52YWwpKSxSLmFkZENvbG9yU3RvcCgxLFlvKE8udmFsKSksZC5zdHJva2VTdHlsZT1SLGQuYmVnaW5QYXRoKCk7bGV0IFU9Ty54LVAueCxHPVAueCtVKnZsLFE9Ty54LVUqdmw7ZC5tb3ZlVG8oUC54LFAueSksZC5iZXppZXJDdXJ2ZVRvKEcsUC55LFEsTy55LE8ueCxPLnkpLGQuc3Ryb2tlKCl9fWlmKG8+UXkmJk4uZm9yRWFjaCh4PT57bGV0IE09TWF0aC5taW4oKG8tUXkpKnlULDEpLFA9WW8oeC52YWwpO2Quc2hhZG93Q29sb3I9UCxkLnNoYWRvd0JsdXI9dlQsZC5iZWdpblBhdGgoKSxkLmFyYyh4LngseC55LGhULDAsTWF0aC5QSSoyKSxkLmZpbGxTdHlsZT1QLGQuZ2xvYmFsQWxwaGE9TSxkLmZpbGwoKSxkLnNoYWRvd0JsdXI9MCxkLmJlZ2luUGF0aCgpLGQuYXJjKHgueCx4LnksZ1QsMCxNYXRoLlBJKjIpLGQuZmlsbFN0eWxlPWcuYmdDYXJkLGQuZmlsbCgpLGQuZ2xvYmFsQWxwaGE9MSxkLmZpbGxTdHlsZT1nLnRleHRTZWNvbmRhcnksZC5nbG9iYWxBbHBoYT1NKndULGQuZm9udD0iYm9sZCAxMHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGQudGV4dEFsaWduPSJjZW50ZXIiLGQudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIixkLmZpbGxUZXh0KHgubGFiZWwseC54LGYrYlQpLGQuZm9udD0iOXB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGQuZmlsbFRleHQoeC5kYXRlTGFiZWwseC54LGYreFQpLGQuZ2xvYmFsQWxwaGE9MSxvPkp5JiYoZC5nbG9iYWxBbHBoYT1NYXRoLm1pbigoby1KeSkqa1QsMSksZC5mb250PSIxMXB4IHNlcmlmIixkLmZpbGxUZXh0KG4wKHgudmFsKSx4LngseC55K1NUKSxkLmdsb2JhbEFscGhhPTEpfSksZC5maWxsU3R5bGU9Zy50ZXh0TXV0ZWQsZC5mb250PSJib2xkIDhweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmIixkLnRleHRBbGlnbj0iY2VudGVyIixkLnRleHRCYXNlbGluZT0iYWxwaGFiZXRpYyIsZC5maWxsVGV4dCgiTSBPIE8gRCAgIFcgQSBWIEUiLHllLzIsRVQpLFQubGVuZ3RoPjApe2xldCB4PShULnJlZHVjZSgoUCxPKT0+UCtPLnZhbCwwKS9ULmxlbmd0aCkudG9GaXhlZCgxKSxNPVlvKE1hdGgucm91bmQoTnVtYmVyKHgpKSk7ZC5maWxsU3R5bGU9bHAoTSwiMjIiKSxkLmJlZ2luUGF0aCgpLGQucm91bmRSZWN0KHllLVRULDQsTlQsRFQsX1QpLGQuZmlsbCgpLGQuZmlsbFN0eWxlPU0sZC5mb250PSJib2xkIDhweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmIixkLnRleHRBbGlnbj0iY2VudGVyIixkLnRleHRCYXNlbGluZT0ibWlkZGxlIixkLmZpbGxUZXh0KGBBdmcgJHt4fWAseWUtQ1QsQVQpfX0sW3Msb10pLHQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGxpbmVIZWlnaHQ6MH19LHQoImNhbnZhcyIse3JlZjpuLGNsYXNzTmFtZToibW9vZC12aXotY2FudmFzIixvbk1vdXNlTW92ZTpjPT57bGV0IGQ9bi5jdXJyZW50O2lmKCFkKXJldHVybjtsZXQgcD1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGc9KGMuY2xpZW50WC1wLmxlZnQpKih5ZS9wLndpZHRoKSx2PShjLmNsaWVudFktcC50b3ApKih5ZS9wLmhlaWdodCkseT1yLmN1cnJlbnQ7aWYoIXl8fCF5Lmxlbmd0aCl7aS5oaWRlKCk7cmV0dXJufWxldCBiPS0xLGg9TVQ7Zm9yKGxldCBtPTA7bTx5Lmxlbmd0aDttKyspe2xldCB3PWcteVttXS54LGY9di15W21dLnksVD1NYXRoLnNxcnQodyp3K2YqZik7VDxoJiYoaD1ULGI9bSl9aWYoYj49MCl7bGV0IG09eVtiXSx3PWVbYl0sZj1wLmxlZnQrbS54L3llKnAud2lkdGgsVD1wLnRvcCttLnkveWUqcC5oZWlnaHQ7aS5zaG93KHIwKHtmdWxsRGF0ZTp3LmZ1bGxEYXRlLGVudHJpZXM6dy5lbnRyaWVzfHxbd119KSxmLFQpfWVsc2UgaS5oaWRlKCl9LG9uTW91c2VMZWF2ZTooKT0+aS5oaWRlKCl9KSl9ZnVuY3Rpb24galQoZSl7bGV0IHQ9WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxuPVsuLi5lfHxbXV0uc29ydCgoYSxpKT0+KGEudGltZXN0YW1wfHwwKS0oaS50aW1lc3RhbXB8fDApKTtpZihuLmxlbmd0aCljb25zb2xlLmxvZygiRm91bmQgZXhpc3RpbmcgcmF0aW5ncyIpO2Vsc2UgcmV0dXJuIGNvbnNvbGUubG9nKCJObyByYXRpbmdzIGZvdW5kLCByZXR1cm5pbmcgW10iKSxbXTtsZXQgcj1uZXcgTWFwO2ZvcihsZXQgYSBvZiBuKXtsZXQgaT1hLnRpbWVzdGFtcD9uZXcgRGF0ZShhLnRpbWVzdGFtcCoxZTMpOm5ldyBEYXRlLHM9YCR7aS5nZXRGdWxsWWVhcigpfS0ke2kuZ2V0TW9udGgoKSsxfS0ke2kuZ2V0RGF0ZSgpfWA7ci5oYXMocyl8fHIuc2V0KHMse2RheUxhYmVsOnRbaS5nZXREYXkoKV0sZGF0ZUxhYmVsOmAke2kuZ2V0TW9udGgoKSsxfS8ke2kuZ2V0RGF0ZSgpfWAsZGF0ZUtleTpzLGZ1bGxEYXRlOmkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6ImxvbmciLHllYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMifSksZW50cmllczpbXSxyYXRpbmdTdW06MCxyYXRpbmdDb3VudDowfSk7bGV0IGw9ci5nZXQocyk7bC5lbnRyaWVzLnB1c2goe3JhdGluZzphLnJhdGluZyx0aW1lOihhLnRpbWVzdGFtcD9uZXcgRGF0ZShhLnRpbWVzdGFtcCoxZTMpOm5ldyBEYXRlKS50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIix7aG91cjoibnVtZXJpYyIsbWludXRlOiIyLWRpZ2l0In0pLG5vdGVzOmEubm90ZXN8fGEubm90ZXx8bnVsbCx0aW1lc3RhbXA6YS50aW1lc3RhbXB9KSxsLnJhdGluZ1N1bSs9YS5yYXRpbmcsbC5yYXRpbmdDb3VudCs9MX1yZXR1cm5bLi4uci52YWx1ZXMoKV0uc2xpY2UoLVh5KS5tYXAoYT0+KHtyYXRpbmc6YS5yYXRpbmdTdW0vYS5yYXRpbmdDb3VudCxkYXlMYWJlbDphLmRheUxhYmVsLGRhdGVMYWJlbDphLmRhdGVMYWJlbCxkYXRlS2V5OmEuZGF0ZUtleSxmdWxsRGF0ZTphLmZ1bGxEYXRlLHRpbWU6YS5lbnRyaWVzW2EuZW50cmllcy5sZW5ndGgtMV0udGltZSx0aW1lc3RhbXA6YS5lbnRyaWVzW2EuZW50cmllcy5sZW5ndGgtMV0udGltZXN0YW1wLG5vdGVzOmEuZW50cmllc1thLmVudHJpZXMubGVuZ3RoLTFdLm5vdGVzLGVudHJpZXM6YS5lbnRyaWVzfSkpfWZ1bmN0aW9uIFZUKGUsdCxuLHIsbyxhKXtsZXQgaT1lO2lmKCEodHx8W10pLmxlbmd0aClyZXR1cm4gaSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXN1bW1hcnkifSxpKCJzcGFuIixudWxsLCJBdmcgbW9vZCAoN2QpOiAiK24pKTtsZXQgcz1qVCh0KSxsPXI9PT0id2F2ZSI/aShIVCx7a2V5Om8sbW9vZERhdGE6c30pOmkoV1Qse2tleTpvLG1vb2REYXRhOnN9KTtyZXR1cm4gaSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXZpei1zZWN0aW9uIn0saSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXZpei1jYW52YXMtd3JhcCJ9LGwpLGkoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC12aXotY29uZmlndXJlLWxpbmsiLG9uQ2xpY2s6YX0sIlx1MjY5OSBDb25maWd1cmUiKSl9ZnVuY3Rpb24gdXAoe2FwcDplLG1vb2RSYXRpbmdzOnQsb25Nb29kUmVjb3JkZWQ6bn0pe2xldCByPUVlLmNyZWF0ZUVsZW1lbnQsW28sYV09KDAsRWUudXNlU3RhdGUpKG51bGwpLFtpLHNdPSgwLEVlLnVzZVN0YXRlKSgiIiksW2wsdV09KDAsRWUudXNlU3RhdGUpKCExKSxbYyxkXT0oMCxFZS51c2VTdGF0ZSkoITEpLGc9QnMoZSwibW9vZCIpWzBdfHwicmluZyIsW3YseV09KDAsRWUudXNlU3RhdGUpKGcpLFtiLGhdPSgwLEVlLnVzZVN0YXRlKShnKSxbbSx3XT0oMCxFZS51c2VTdGF0ZSkoMCksW2YsVF09KDAsRWUudXNlU3RhdGUpKCExKTsoMCxFZS51c2VFZmZlY3QpKCgpPT57aWYoIWMpcmV0dXJuO2xldCBPPXNldFRpbWVvdXQoKCk9PntkKCExKSxhKG51bGwpLHMoIiIpfSxCRSk7cmV0dXJuKCk9PmNsZWFyVGltZW91dChPKX0sW2NdKTtsZXQgUz0oKT0+e2godiksVCghMCl9LEQ9KCk9Pnt5KGIpLHcoTz0+TysxKSxUKCExKSxlLnNldFNldHRpbmcoZnIoIm1vb2QiKSxKU09OLnN0cmluZ2lmeShbYl0pKX0sTj0oKT0+e2godiksVCghMSl9LEM9KCk9PnthKG51bGwpLHMoIiIpfSx7YXZlcmFnZU1vb2Q6eH09QlQodCksTT1WVChyLHQseCx2LG0sUyksUD1mP3IoUXIse3RpdGxlOiJNb29kIFZpc3VhbGl6YXRpb24iLG9uU3VibWl0OkQsb25DYW5jZWw6TixzdWJtaXRMYWJlbDoiQXBwbHkifSxyKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LHIoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIkRpc3BsYXkgc3R5bGUiKSxbWyJyaW5nIiwiUmluZyJdLFsid2F2ZSIsIldhdmUiXV0ubWFwKChbTyxSXSk9PnIoImxhYmVsIix7a2V5Ok8sY2xhc3NOYW1lOiJtb29kLXZpei1jb25maWctb3B0aW9uIn0scigiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToibW9vZC12aXotbW9kZSIsdmFsdWU6TyxjaGVja2VkOmI9PT1PLG9uQ2hhbmdlOigpPT5oKE8pfSksUikpKSk6bnVsbDtyZXR1cm4gYz9yKGNlLHt0aXRsZTpsZSgibW9vZCIpLGljb246Ilx1ezFGM0FEfSIsd2lkZ2V0SWQ6Im1vb2QifSxQLHIoImRpdiIse2NsYXNzTmFtZToibW9vZC1jb25maXJtYXRpb24ifSxyKCJkaXYiLHtjbGFzc05hbWU6Im1vb2QtY29uZmlybWF0aW9uLWljb24ifSxvLmVtb2ppKSxyKCJwIix7Y2xhc3NOYW1lOiJtb29kLWNvbmZpcm1hdGlvbi10ZXh0In0sIk1vb2QgcmF0aW5nIHJlY29yZGVkIikpLE0pOnIoY2Use3RpdGxlOmxlKCJtb29kIiksaWNvbjoiXHV7MUYzQUR9Iix3aWRnZXRJZDoibW9vZCJ9LFAscigiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXNlbGVjdG9yIn0seWwubWFwKE89PnIoImJ1dHRvbiIse2tleTpPLnZhbHVlLGNsYXNzTmFtZToibW9vZC1idG4iKyhvPy52YWx1ZT09PU8udmFsdWU/IiBtb29kLWJ0bi0tc2VsZWN0ZWQiOiIiKSx0aXRsZTpPLmxhYmVsLG9uQ2xpY2s6KCk9PlVUKE8sbCxjLGEpfSxyKCJzcGFuIix7Y2xhc3NOYW1lOiJtb29kLWVtb2ppIn0sTy5lbW9qaSkpKSksbyE9PW51bGwmJnIoImRpdiIse2NsYXNzTmFtZToibW9vZC1kZXRhaWxzIn0scigibGFiZWwiLHtjbGFzc05hbWU6Im1vb2QtZGV0YWlscy1sYWJlbCJ9LCJNb3JlIGRldGFpbHMgKG9wdGlvbmFsKSIpLHIoInRleHRhcmVhIix7Y2xhc3NOYW1lOiJtb29kLWRldGFpbHMtdGV4dGFyZWEiLHZhbHVlOmksb25DaGFuZ2U6Tz0+cyhPLnRhcmdldC52YWx1ZSksb25LZXlEb3duOk89PiRUKGUsTyxvLGksdSxkLG4pLHBsYWNlaG9sZGVyOiJXaGF0J3Mgb24geW91ciBtaW5kPyIscm93czpXRX0pKSxvIT09bnVsbCYmcigiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXN1Ym1pdC1yb3cifSxyKCJidXR0b24iLHtjbGFzc05hbWU6Im1vb2QtY2FuY2VsLWJ0biIsb25DbGljazpDLGRpc2FibGVkOmx9LCJDYW5jZWwiKSxyKCJidXR0b24iLHtjbGFzc05hbWU6Im1vb2Qtc3VibWl0LWJ0biIsb25DbGljazooKT0+bzAoZSxvLGksdSxkLG4pLGRpc2FibGVkOmx9LGw/IlJlY29yZGluZy4uLiI6IlN1Ym1pdCIpKSxvPT09bnVsbCYmTSl9dmFyIEhuPXhlKHdlKCkpO3ZhciBHVD1be3RleHQ6IlRoZSBzZWNyZXQgb2YgZ2V0dGluZyBhaGVhZCBpcyBnZXR0aW5nIHN0YXJ0ZWQuIixhdXRob3I6Ik1hcmsgVHdhaW4ifSx7dGV4dDoiWW91IGRvbid0IGhhdmUgdG8gYmUgZ3JlYXQgdG8gc3RhcnQsIGJ1dCB5b3UgaGF2ZSB0byBzdGFydCB0byBiZSBncmVhdC4iLGF1dGhvcjoiWmlnIFppZ2xhciJ9LHt0ZXh0OiJBY3Rpb24gaXMgdGhlIGZvdW5kYXRpb25hbCBrZXkgdG8gYWxsIHN1Y2Nlc3MuIixhdXRob3I6IlBhYmxvIFBpY2Fzc28ifSx7dGV4dDoiRG9uZSBpcyBiZXR0ZXIgdGhhbiBwZXJmZWN0LiIsYXV0aG9yOiJTaGVyeWwgU2FuZGJlcmcifSx7dGV4dDoiQW1hdGV1cnMgc2l0IGFuZCB3YWl0IGZvciBpbnNwaXJhdGlvbjsgdGhlIHJlc3Qgb2YgdXMganVzdCBnZXQgdXAgYW5kIGdvIHRvIHdvcmsuIixhdXRob3I6IlN0ZXBoZW4gS2luZyJ9LHt0ZXh0OiJUaGUgd2F5IHRvIGdldCBzdGFydGVkIGlzIHRvIHF1aXQgdGFsa2luZyBhbmQgYmVnaW4gZG9pbmcuIixhdXRob3I6IldhbHQgRGlzbmV5In0se3RleHQ6IkZvY3VzIG9uIGJlaW5nIHByb2R1Y3RpdmUgaW5zdGVhZCBvZiBidXN5LiIsYXV0aG9yOiJUaW0gRmVycmlzcyJ9LHt0ZXh0OiJJdCdzIG5vdCBhYm91dCBoYXZpbmcgdGltZS4gSXQncyBhYm91dCBtYWtpbmcgdGltZS4iLGF1dGhvcjoiIn0se3RleHQ6IldvcmsgZXhwYW5kcyB0byBmaWxsIHRoZSB0aW1lIGF2YWlsYWJsZSBmb3IgaXRzIGNvbXBsZXRpb24uIixhdXRob3I6IkN5cmlsIE5vcnRoY290ZSBQYXJraW5zb24ifSx7dGV4dDoiU3RvcCB3YWl0aW5nIGZvciB0aGUgcmlnaHQgdGltZS4gVGhlIHRpbWUgd2lsbCBuZXZlciBiZSBqdXN0IHJpZ2h0LiIsYXV0aG9yOiJOYXBvbGVvbiBIaWxsIn0se3RleHQ6Ik1vdGl2YXRpb24gaXMgd2hhdCBnZXRzIHlvdSBzdGFydGVkLiBIYWJpdCBpcyB3aGF0IGtlZXBzIHlvdSBnb2luZy4iLGF1dGhvcjoiSmltIFJ5dW4ifSx7dGV4dDoiSWYgeW91IHNwZW5kIHRvbyBtdWNoIHRpbWUgdGhpbmtpbmcgYWJvdXQgYSB0aGluZywgeW91J2xsIG5ldmVyIGdldCBpdCBkb25lLiIsYXV0aG9yOiJCcnVjZSBMZWUifSx7dGV4dDoiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvcmRpbmFyeSBhbmQgZXh0cmFvcmRpbmFyeSBpcyB0aGF0IGxpdHRsZSAnZXh0cmEnLiIsYXV0aG9yOiIifSx7dGV4dDoiRWZmaWNpZW5jeSBpcyBkb2luZyB0aGluZ3MgcmlnaHQuIEVmZmVjdGl2ZW5lc3MgaXMgZG9pbmcgdGhlIHJpZ2h0IHRoaW5ncy4iLGF1dGhvcjoiUGV0ZXIgRHJ1Y2tlciJ9LHt0ZXh0OiJZb3UgYXJlIG5ldmVyIHRvbyBvbGQgdG8gc2V0IGFub3RoZXIgZ29hbCBvciB0byBkcmVhbSBhIG5ldyBkcmVhbS4iLGF1dGhvcjoiQy5TLiBMZXdpcyJ9LHt0ZXh0OiJTbWFsbCBkYWlseSBpbXByb3ZlbWVudHMgYXJlIHRoZSBrZXkgdG8gc3RhZ2dlcmluZyBsb25nLXRlcm0gcmVzdWx0cy4iLGF1dGhvcjoiUm9iaW4gU2hhcm1hIn0se3RleHQ6IkRyZWFtcyBkb24ndCB3b3JrIHVubGVzcyB5b3UgZG8uIixhdXRob3I6IkpvaG4gQy4gTWF4d2VsbCJ9LHt0ZXh0OiJUaGUgbW9zdCBlZmZlY3RpdmUgd2F5IHRvIGRvIGl0IGlzIHRvIGRvIGl0LiIsYXV0aG9yOiJBbWVsaWEgRWFyaGFydCJ9LHt0ZXh0OiJUYWtlIHRpbWUgdG8gZGVsaWJlcmF0ZSwgYnV0IHdoZW4gdGhlIHRpbWUgZm9yIGFjdGlvbiBhcnJpdmVzLCBzdG9wIHRoaW5raW5nIGFuZCBnbyBpbi4iLGF1dGhvcjoiTmFwb2xlb24gQm9uYXBhcnRlIn0se3RleHQ6IlN0cml2aW5nIGZvciBleGNlbGxlbmNlIG1vdGl2YXRlcyB5b3U7IHN0cml2aW5nIGZvciBwZXJmZWN0aW9uIGlzIGRlbW9yYWxpemluZy4iLGF1dGhvcjoiSGFycmlldCBCcmFpa2VyIn0se3RleHQ6IlRoZSBqb3VybmV5IG9mIGEgdGhvdXNhbmQgbWlsZXMgYmVnaW5zIHdpdGggYSBzaW5nbGUgc3RlcC4iLGF1dGhvcjoiTGFvIFR6dSJ9LHt0ZXh0OiJBIHllYXIgZnJvbSBub3cgeW91IG1heSB3aXNoIHlvdSBoYWQgc3RhcnRlZCB0b2RheS4iLGF1dGhvcjoiS2FyZW4gTGFtYiJ9LHt0ZXh0OiJUaGUgYmVnaW5uaW5nIGlzIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSB3b3JrLiIsYXV0aG9yOiJQbGF0byJ9LHt0ZXh0OiJZb3UgZG9uJ3QgbmVlZCB0byBzZWUgdGhlIHdob2xlIHN0YWlyY2FzZSwganVzdCB0YWtlIHRoZSBmaXJzdCBzdGVwLiIsYXV0aG9yOiJNYXJ0aW4gTHV0aGVyIEtpbmcgSnIuIn0se3RleHQ6IlN0YXJ0IHdoZXJlIHlvdSBhcmUuIFVzZSB3aGF0IHlvdSBoYXZlLiBEbyB3aGF0IHlvdSBjYW4uIixhdXRob3I6IkFydGh1ciBBc2hlIn0se3RleHQ6IlRoZSBmaXJzdCBzdGVwIGlzIHlvdSBoYXZlIHRvIHNheSB0aGF0IHlvdSBjYW4uIixhdXRob3I6IldpbGwgU21pdGgifSx7dGV4dDoiSW4gdGhlIG1pZGRsZSBvZiBldmVyeSBkaWZmaWN1bHR5IGxpZXMgb3Bwb3J0dW5pdHkuIixhdXRob3I6IkFsYmVydCBFaW5zdGVpbiJ9LHt0ZXh0OiJFdmVuIHRoZSBsb25nZXN0IGpvdXJuZXkgc3RhcnRzIHdpdGggcHV0dGluZyBvbmUgZm9vdCBpbiBmcm9udCBvZiB0aGUgb3RoZXIuIixhdXRob3I6IiJ9LHt0ZXh0OiJZb3UgZG9uJ3QgaGF2ZSB0byBiZSBwZXJmZWN0IHRvIHN0YXJ0LCBidXQgeW91IGhhdmUgdG8gc3RhcnQgdG8gYmUgcGVyZmVjdC4iLGF1dGhvcjoiIn0se3RleHQ6IkNvdXJhZ2UgaXMgbm90IHRoZSBhYnNlbmNlIG9mIGZlYXIsIGJ1dCB0aGUganVkZ21lbnQgdGhhdCBzb21ldGhpbmcgZWxzZSBpcyBtb3JlIGltcG9ydGFudC4iLGF1dGhvcjoiQW1icm9zZSBSZWRtb29uIn0se3RleHQ6IldoYXRldmVyIHlvdSBjYW4gZG8sIG9yIGRyZWFtIHlvdSBjYW4gXHUyMDE0IGJlZ2luIGl0LiBCb2xkbmVzcyBoYXMgZ2VuaXVzLCBwb3dlciwgYW5kIG1hZ2ljIGluIGl0LiIsYXV0aG9yOiJKb2hhbm4gV29sZmdhbmcgdm9uIEdvZXRoZSJ9LHt0ZXh0OiJUaGUgaGFyZGVzdCBwYXJ0IGlzIHN0YXJ0aW5nLiBPbmNlIHlvdSBnZXQgdGhhdCBvdXQgb2YgdGhlIHdheSwgeW91J2xsIGZpbmQgdGhlIHJlc3Qgb2YgdGhlIGpvdXJuZXkgbXVjaCBlYXNpZXIuIixhdXRob3I6IiJ9LHt0ZXh0OiJJbmFjdGlvbiBicmVlZHMgZG91YnQgYW5kIGZlYXIuIEFjdGlvbiBicmVlZHMgY29uZmlkZW5jZSBhbmQgY291cmFnZS4iLGF1dGhvcjoiRGFsZSBDYXJuZWdpZSJ9LHt0ZXh0OiJUaGUgYmVzdCB0aW1lIHRvIHBsYW50IGEgdHJlZSB3YXMgdHdlbnR5IHllYXJzIGFnby4gVGhlIHNlY29uZCBiZXN0IHRpbWUgaXMgbm93LiIsYXV0aG9yOiJDaGluZXNlIFByb3ZlcmIifSx7dGV4dDoiWW91IGRvbid0IGhhdmUgdG8gYmUgZmVhcmxlc3MuIEp1c3QgZG9uJ3QgbGV0IGZlYXIgc3RvcCB5b3UuIixhdXRob3I6IiJ9LHt0ZXh0OiJQcm9ncmVzcywgbm90IHBlcmZlY3Rpb24sIGlzIHRoZSBnb2FsLiIsYXV0aG9yOiIifSx7dGV4dDoiTm90aGluZyB3aWxsIHdvcmsgdW5sZXNzIHlvdSBkby4iLGF1dGhvcjoiTWF5YSBBbmdlbG91In0se3RleHQ6IkxlYXAgYW5kIHRoZSBuZXQgd2lsbCBhcHBlYXIuIixhdXRob3I6IkpvaG4gQnVycm91Z2hzIn0se3RleHQ6IlRoZSBmaXJzdCBzdGVwIGJpbmRzIG9uZSB0byB0aGUgc2Vjb25kLiIsYXV0aG9yOiJGcmVuY2ggUHJvdmVyYiJ9LHt0ZXh0OiJUYWtlIHRoZSBmaXJzdCBzdGVwIGluIGZhaXRoLiBZb3UgZG9uJ3QgaGF2ZSB0byBzZWUgdGhlIHdob2xlIHN0YWlyY2FzZS4iLGF1dGhvcjoiTWFydGluIEx1dGhlciBLaW5nIEpyLiJ9LHt0ZXh0OiJUb2RheSBpcyBhIG5ldyBkYXkuIERvbid0IGxldCB5ZXN0ZXJkYXkncyBmYWlsdXJlcyBoYXVudCBpdC4iLGF1dGhvcjoiIn0se3RleHQ6IkV2ZXJ5IG1vcm5pbmcgd2UgYXJlIGJvcm4gYWdhaW4uIFdoYXQgd2UgZG8gdG9kYXkgbWF0dGVycyBtb3N0LiIsYXV0aG9yOiJCdWRkaGEifSx7dGV4dDoiV2l0aCB0aGUgbmV3IGRheSBjb21lcyBuZXcgc3RyZW5ndGggYW5kIG5ldyB0aG91Z2h0cy4iLGF1dGhvcjoiRWxlYW5vciBSb29zZXZlbHQifSx7dGV4dDoiVG9kYXkgaXMgYW5vdGhlciBjaGFuY2UgdG8gZ2V0IGJldHRlci4iLGF1dGhvcjoiIn0se3RleHQ6Illlc3RlcmRheSBpcyBub3Qgb3VycyB0byByZWNvdmVyLCBidXQgdG9tb3Jyb3cgaXMgb3VycyB0byB3aW4gb3IgbG9zZS4iLGF1dGhvcjoiTHluZG9uIEIuIEpvaG5zb24ifSx7dGV4dDoiVGhlIHN1biBpcyBhIGRhaWx5IHJlbWluZGVyIHRoYXQgd2UgdG9vIGNhbiByaXNlIGFnYWluIGZyb20gdGhlIGRhcmtuZXNzLiIsYXV0aG9yOiJTLiBBam5hIn0se3RleHQ6IkV2ZXJ5IGRheSBpcyBhIHNlY29uZCBjaGFuY2UuIixhdXRob3I6IiJ9LHt0ZXh0OiJUb2RheSdzIGFjY29tcGxpc2htZW50cyB3ZXJlIHllc3RlcmRheSdzIGltcG9zc2liaWxpdGllcy4iLGF1dGhvcjoiUm9iZXJ0IEguIFNjaHVsbGVyIn0se3RleHQ6IkVhY2ggbmV3IGRheSBpcyBhIGJsYW5rIHBhZ2UgaW4gdGhlIGRpYXJ5IG9mIHlvdXIgbGlmZS4iLGF1dGhvcjoiIn0se3RleHQ6IkFuIG9wdGltaXN0IHNlZXMgYW4gb3Bwb3J0dW5pdHkgaW4gZXZlcnkgY2FsYW1pdHk7IGEgcGVzc2ltaXN0IHNlZXMgYSBjYWxhbWl0eSBpbiBldmVyeSBvcHBvcnR1bml0eS4iLGF1dGhvcjoiV2luc3RvbiBDaHVyY2hpbGwifSx7dGV4dDoiT3Bwb3J0dW5pdGllcyBkb24ndCBoYXBwZW4uIFlvdSBjcmVhdGUgdGhlbS4iLGF1dGhvcjoiQ2hyaXMgR3Jvc3NlciJ9LHt0ZXh0OiJUaGlzIGlzIGEgd29uZGVyZnVsIGRheS4gSSd2ZSBuZXZlciBzZWVuIHRoaXMgb25lIGJlZm9yZS4iLGF1dGhvcjoiTWF5YSBBbmdlbG91In0se3RleHQ6IllvdSBoYXZlIGV4YWN0bHkgb25lIGxpZmUgaW4gd2hpY2ggdG8gZG8gZXZlcnl0aGluZyB5b3UnbGwgZXZlciBkby4gQWN0IGFjY29yZGluZ2x5LiIsYXV0aG9yOiJDb2xpbiBXcmlnaHQifSx7dGV4dDoiTGlmZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiB5b3UncmUgYnVzeSBtYWtpbmcgb3RoZXIgcGxhbnMuIixhdXRob3I6IkpvaG4gTGVubm9uIn0se3RleHQ6IllvdXIgbGlmZSBkb2VzIG5vdCBnZXQgYmV0dGVyIGJ5IGNoYW5jZSwgaXQgZ2V0cyBiZXR0ZXIgYnkgY2hhbmdlLiIsYXV0aG9yOiJKaW0gUm9obiJ9LHt0ZXh0OiJEb24ndCB3YXRjaCB0aGUgY2xvY2s7IGRvIHdoYXQgaXQgZG9lcy4gS2VlcCBnb2luZy4iLGF1dGhvcjoiU2FtIExldmVuc29uIn0se3RleHQ6IkJlbGlldmUgeW91IGNhbiBhbmQgeW91J3JlIGhhbGZ3YXkgdGhlcmUuIixhdXRob3I6IlRoZW9kb3JlIFJvb3NldmVsdCJ9LHt0ZXh0OiJJdCBkb2VzIG5vdCBtYXR0ZXIgaG93IHNsb3dseSB5b3UgZ28gYXMgbG9uZyBhcyB5b3UgZG8gbm90IHN0b3AuIixhdXRob3I6IkNvbmZ1Y2l1cyJ9LHt0ZXh0OiJUaGUgb25seSBsaW1pdCB0byBvdXIgcmVhbGl6YXRpb24gb2YgdG9tb3Jyb3cgd2lsbCBiZSBvdXIgZG91YnRzIG9mIHRvZGF5LiIsYXV0aG9yOiJGcmFua2xpbiBELiBSb29zZXZlbHQifSx7dGV4dDoiVGhlIGZ1dHVyZSBiZWxvbmdzIHRvIHRob3NlIHdobyBiZWxpZXZlIGluIHRoZSBiZWF1dHkgb2YgdGhlaXIgZHJlYW1zLiIsYXV0aG9yOiJFbGVhbm9yIFJvb3NldmVsdCJ9LHt0ZXh0OiJJZiB5b3UncmUgZ29pbmcgdGhyb3VnaCBoZWxsLCBrZWVwIGdvaW5nLiIsYXV0aG9yOiJXaW5zdG9uIENodXJjaGlsbCJ9LHt0ZXh0OiJQZXJzaXN0ZW5jZSBndWFyYW50ZWVzIHRoYXQgcmVzdWx0cyBhcmUgaW5ldml0YWJsZS4iLGF1dGhvcjoiUGFyYW1haGFuc2EgWW9nYW5hbmRhIn0se3RleHQ6IlN1Y2Nlc3MgaXMgbm90IGZpbmFsLCBmYWlsdXJlIGlzIG5vdCBmYXRhbDogaXQgaXMgdGhlIGNvdXJhZ2UgdG8gY29udGludWUgdGhhdCBjb3VudHMuIixhdXRob3I6IldpbnN0b24gQ2h1cmNoaWxsIn0se3RleHQ6IllvdSBtaXNzIDEwMCUgb2YgdGhlIHNob3RzIHlvdSBkb24ndCB0YWtlLiIsYXV0aG9yOiJXYXluZSBHcmV0emt5In0se3RleHQ6Ikl0IGFsd2F5cyBzZWVtcyBpbXBvc3NpYmxlIHVudGlsIGl0J3MgZG9uZS4iLGF1dGhvcjoiTmVsc29uIE1hbmRlbGEifSx7dGV4dDoiV2UgbWF5IGVuY291bnRlciBtYW55IGRlZmVhdHMsIGJ1dCB3ZSBtdXN0IG5vdCBiZSBkZWZlYXRlZC4iLGF1dGhvcjoiTWF5YSBBbmdlbG91In0se3RleHQ6IkkgbmV2ZXIgZHJlYW1lZCBhYm91dCBzdWNjZXNzLiBJIHdvcmtlZCBmb3IgaXQuIixhdXRob3I6IkVzdFx4RTllIExhdWRlciJ9LHt0ZXh0OiJUaGUgb25seSB3YXkgb3V0IGlzIHRocm91Z2guIixhdXRob3I6IlJvYmVydCBGcm9zdCJ9LHt0ZXh0OiJIYXJkc2hpcHMgb2Z0ZW4gcHJlcGFyZSBvcmRpbmFyeSBwZW9wbGUgZm9yIGFuIGV4dHJhb3JkaW5hcnkgZGVzdGlueS4iLGF1dGhvcjoiQy5TLiBMZXdpcyJ9LHt0ZXh0OiJBY3QgYXMgaWYgd2hhdCB5b3UgZG8gbWFrZXMgYSBkaWZmZXJlbmNlLiBJdCBkb2VzLiIsYXV0aG9yOiJXaWxsaWFtIEphbWVzIn0se3RleHQ6IkluIHRoZSBtaWRkbGUgb2YgZGlmZmljdWx0eSBsaWVzIG9wcG9ydHVuaXR5LiIsYXV0aG9yOiJBbGJlcnQgRWluc3RlaW4ifSx7dGV4dDoiWW91IGFyZSBicmF2ZXIgdGhhbiB5b3UgYmVsaWV2ZSwgc3Ryb25nZXIgdGhhbiB5b3Ugc2VlbSwgYW5kIHNtYXJ0ZXIgdGhhbiB5b3UgdGhpbmsuIixhdXRob3I6IkEuQS4gTWlsbmUifSx7dGV4dDoiS2VlcCB5b3VyIGV5ZXMgb24gdGhlIHN0YXJzIGFuZCB5b3VyIGZlZXQgb24gdGhlIGdyb3VuZC4iLGF1dGhvcjoiVGhlb2RvcmUgUm9vc2V2ZWx0In0se3RleHQ6IldoYXQgeW91IGRvIHRvZGF5IGNhbiBpbXByb3ZlIGFsbCB5b3VyIHRvbW9ycm93cy4iLGF1dGhvcjoiUmFscGggTWFyc3RvbiJ9LHt0ZXh0OiJEb24ndCBiZSBwdXNoZWQgYXJvdW5kIGJ5IHRoZSBmZWFycyBpbiB5b3VyIG1pbmQuIEJlIGxlZCBieSB0aGUgZHJlYW1zIGluIHlvdXIgaGVhcnQuIixhdXRob3I6IlJveSBULiBCZW5uZXR0In0se3RleHQ6IlRoZSBvbmx5IHBlcnNvbiB5b3Ugc2hvdWxkIHRyeSB0byBiZSBiZXR0ZXIgdGhhbiBpcyB3aG8geW91IHdlcmUgeWVzdGVyZGF5LiIsYXV0aG9yOiIifSx7dGV4dDoiSWYgeW91IHdhbnQgdG8gYWNoaWV2ZSBncmVhdG5lc3MsIHN0b3AgYXNraW5nIGZvciBwZXJtaXNzaW9uLiIsYXV0aG9yOiIifSx7dGV4dDoiVGhpbmdzIHdvcmsgb3V0IGJlc3QgZm9yIHRob3NlIHdobyBtYWtlIHRoZSBiZXN0IG9mIGhvdyB0aGluZ3Mgd29yayBvdXQuIixhdXRob3I6IkpvaG4gV29vZGVuIn0se3RleHQ6IlRvIGxpdmUgYSBjcmVhdGl2ZSBsaWZlLCB3ZSBtdXN0IGxvc2Ugb3VyIGZlYXIgb2YgYmVpbmcgd3JvbmcuIixhdXRob3I6Ikpvc2VwaCBDaGlsdG9uIFBlYXJjZSJ9LHt0ZXh0OiJJZiB5b3UgYXJlIG5vdCB3aWxsaW5nIHRvIHJpc2sgdGhlIHVzdWFsLCB5b3Ugd2lsbCBoYXZlIHRvIHNldHRsZSBmb3IgdGhlIG9yZGluYXJ5LiIsYXV0aG9yOiJKaW0gUm9obiJ9LHt0ZXh0OiJUcnVzdCB5b3Vyc2VsZi4gWW91IGtub3cgbW9yZSB0aGFuIHlvdSB0aGluayB5b3UgZG8uIixhdXRob3I6IkJlbmphbWluIFNwb2NrIn0se3RleHQ6IldoYXQgc2VlbXMgdG8gdXMgYXMgYml0dGVyIHRyaWFscyBhcmUgb2Z0ZW4gYmxlc3NpbmdzIGluIGRpc2d1aXNlLiIsYXV0aG9yOiJPc2NhciBXaWxkZSJ9LHt0ZXh0OiJUaGUgb25seSBwbGFjZSB3aGVyZSBzdWNjZXNzIGNvbWVzIGJlZm9yZSB3b3JrIGlzIGluIHRoZSBkaWN0aW9uYXJ5LiIsYXV0aG9yOiJWaWRhbCBTYXNzb29uIn0se3RleHQ6IlRvbyBtYW55IG9mIHVzIGFyZSBub3QgbGl2aW5nIG91ciBkcmVhbXMgYmVjYXVzZSB3ZSBhcmUgbGl2aW5nIG91ciBmZWFycy4iLGF1dGhvcjoiTGVzIEJyb3duIn0se3RleHQ6IkkgZmluZCB0aGF0IHRoZSBoYXJkZXIgSSB3b3JrLCB0aGUgbW9yZSBsdWNrIEkgc2VlbSB0byBoYXZlLiIsYXV0aG9yOiJUaG9tYXMgSmVmZmVyc29uIn0se3RleHQ6IlN1Y2Nlc3MgdXN1YWxseSBjb21lcyB0byB0aG9zZSB3aG8gYXJlIHRvbyBidXN5IHRvIGJlIGxvb2tpbmcgZm9yIGl0LiIsYXV0aG9yOiJIZW5yeSBEYXZpZCBUaG9yZWF1In0se3RleHQ6IklmIHlvdSByZWFsbHkgbG9vayBjbG9zZWx5LCBtb3N0IG92ZXJuaWdodCBzdWNjZXNzZXMgdG9vayBhIGxvbmcgdGltZS4iLGF1dGhvcjoiU3RldmUgSm9icyJ9LHt0ZXh0OiJOZXZlciBnaXZlIHVwIG9uIGEgZHJlYW0ganVzdCBiZWNhdXNlIG9mIHRoZSB0aW1lIGl0IHdpbGwgdGFrZSB0byBhY2NvbXBsaXNoIGl0LiIsYXV0aG9yOiJFYXJsIE5pZ2h0aW5nYWxlIn0se3RleHQ6IllvdSd2ZSBnb3QgdG8gZ2V0IHVwIGV2ZXJ5IG1vcm5pbmcgd2l0aCBkZXRlcm1pbmF0aW9uIGlmIHlvdSdyZSBnb2luZyB0byBnbyB0byBiZWQgd2l0aCBzYXRpc2ZhY3Rpb24uIixhdXRob3I6Ikdlb3JnZSBMb3JpbWVyIn0se3RleHQ6IlRoZSBzZWNyZXQgb2YgeW91ciBzdWNjZXNzIGlzIGRldGVybWluZWQgYnkgeW91ciBkYWlseSBhZ2VuZGEuIixhdXRob3I6IkpvaG4gQy4gTWF4d2VsbCJ9XTtmdW5jdGlvbiBwaShlPTIpe3JldHVyblsuLi5HVF0uc29ydCgoKT0+TWF0aC5yYW5kb20oKS0uNSkuc2xpY2UoMCxlKX12YXIgaTA9WyJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNjkwNTkyNTM0Ni0yMWJkYTRkMzJkZjQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDA3MTQ1OTYwNC0zYjVlYzNhN2ZlMDUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMTc4NTg4ODA0MS1hZjNlZjI4NWI0NzAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NDgyMjc1OTAyMy1mZWQ2MjJmZjJjM2IiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxOTY4MTM5Mzc4NC1kMTIwMjY3OTMzYmEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3NTkyNDE1NjczNC00OTZmNmNhYzZlYzEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5MDczMDE0MTEwMy02Y2FjMjdhYWFiOTQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzMzA4Njk2NjM1OC01NDg1OWQwZWQ3MTYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MjIxNDEwMzQ1MS05Mzc0YmQxYzc5OGUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQxNDYwOTI0NTIyNC1hZmEwMmJmYjNmZGEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2OTQ3NDk2ODAyOC01NjYyM2YwMmU0MmUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQyNjYwNDk2Njg0OC1kN2FkYWM0MDJiZmYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NTE0NjM0NDQyNS1mMDBkNWY1YzhmMDciLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5MTU1Mzg5NTkxMS0wMDU1ZWNhNjQwMmQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDc3MDg0MTA3Mi1mOTc4Y2Y0ZDAxOWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NDgyMzA2MzUzMC0wOGYxMGVkMWEyZGQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzOTg1Mzk0OTEyNy1mYTY0NzgyMWViYTAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MjM5Njk2MTY5My0xNDJlNmUyNjkwMjciLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzMTc5NDA2MjIzMi0yYTk5YTU0MzFjNmMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0Njc3NjgxMTk1My1iMjNkNTdiZDIxYWEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNjc0NDAzODEzNi00NjI3MzgzNGIzZmIiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5MzI0NDA0MDYyOS00OTZmNmQxMzZjYzMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQxODA2NTQ2MDQ4Ny0zZTQxYTZjODRkYzUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDI0Njk3MzkxOC0yOWE5MzIyMWM0NTUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MzExNjc2MzI0OS0yZmFhZWY4MWNjZGEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQzOTc5MjY3NTEwNS03MDFlNmE0YWI2ZjAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2MzMyMDcyNjI4MS02OTZhNDg1OTI4YzciLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5OTAwMjIzODQ0MC1kMjY0ZWRkNTk2ZWMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxMDc5ODgzMTk3MS02NjFlYjA0YjM3MzkiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNzUyNTQyODAzNC1iNzIzY2Y5NjFkM2UiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0MTk3NDIzMTUzMS1jNjIyN2RiNzZiNmUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1MDEwMTQ5OTE2My1jODg0OGM2NmNhODUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1ODY2ODM4Mzk3MC04ZGRkMzkyN2RlZWQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDc3MDkwMzY3Ni02OWI5ODIwMWVhMWMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NDAzNzg2NjU1Ni02ODEyYzlkMWM3MmUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1NTIxODg3MzUwOS04MDk3MzA1ZWUzNzgiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NTkxOTI5MjI3NS1jNjBiYTQ5ZGE2YWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0ODM3NTI0MDU4Ni04ODI3MDdkYjg4OGIiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1MTE4NzU4MDQ1OS00MzQ5MDI3OWMwZmEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ2NTEwMTA0NjUzMC03MzM5OGM3ZjI4Y2EiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQyMTc4OTY2NTIwOS1jOWIyYTQzNWUzZGMiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3NzQxNDM0ODQ2My1jMGViN2YxMzU5YjYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMDUzMDg1NTY5Ny1iNTg2ZDg5YmEzZWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ1NTE1NjIxODM4OC01ZTYxYjUyNjgxOGIiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0Nzc1Mjg3NTIxNS1iMjc2MWFjYjNjNWQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0Mzg5MDkyMzQyMi03ODE5ZWQ0MTAxYzAiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ5NDc4MzM2NzE5My0xNDkwMzRjMDVlOGYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxNzgyMTM2NTIwMS0yMGEzN2Q1ZjNmNmYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMjA4MjU1MzA0OC1mMDA5YzM3MTI5YjkiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUxOTkwNDk4MTA2My1iMGNmNDQ4ZDQ3OWUiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3NjIzMTY4MjgyOC0zN2U1NzFiYzE3MmYiXSxzMD17c21hbGw6e3dpZHRoOjYwMCxoZWlnaHQ6NjAwfSxsYXJnZTp7d2lkdGg6MTkyMCxoZWlnaHQ6MTA4MH19O2Z1bmN0aW9uIEtUKGUpe2xldCB0PVN0cmluZyhlPz8iZGVmYXVsdC1zZWVkIiksbj0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cis9MSluPShuPDw1KS1uK3QuY2hhckNvZGVBdChyKSxufD0wO3JldHVybiBNYXRoLmFicyhuKX1mdW5jdGlvbiB3bChlPSJzbWFsbCIsdD0iZGVmYXVsdCIsbj0wKXtsZXQgcj1zMFtlXXx8czAuc21hbGwsbz1gJHt0fToke259YCxhPUtUKG8pJWkwLmxlbmd0aCxpPWkwW2FdLHM9YD93PSR7ci53aWR0aH0maD0ke3IuaGVpZ2h0fSZmaXQ9Y3JvcCZhdXRvPWZvcm1hdGA7cmV0dXJuYCR7aX0ke3N9YH1mdW5jdGlvbiBjcCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dCxwbGFuQ29udGVudDpuLHByb3ZpZGVyQXBpS2V5OnIscXVvdGVzOm99KXtsZXQgYT1Ibi5jcmVhdGVFbGVtZW50LGk9KHR8fDEpPj0yPzQ6MixbcyxsXT0oMCxIbi51c2VTdGF0ZSkob3x8KG4/W106cGkoaSkpKSxbdSxjXT0oMCxIbi51c2VTdGF0ZSkoIW8mJiEhbiksW2RdPSgwLEhuLnVzZVN0YXRlKSgoKT0+YCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpfWApOygwLEhuLnVzZUVmZmVjdCkoKCk9PnshbyYmbiYmKGMoITApLHV2KGUsbix7YXBpS2V5OnJ9KS50aGVuKHY9PntsKHYmJnYubGVuZ3RoP3Y6cGkoaSkpLGMoITEpfSkpfSxbXSksKDAsSG4udXNlRWZmZWN0KSgoKT0+eyF1JiZzLmxlbmd0aDxpJiZsKHBpKGkpKX0sW2ldKTtsZXQgZz1hKCJidXR0b24iLHtjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixvbkNsaWNrOigpPT57bChwaShpKSl9LHRpdGxlOiJSZXNlZWQgcXVvdGVzIn0sIlx1MjFCQiBSZXNlZWQiKTtyZXR1cm4gdT9hKGNlLHt0aXRsZTpsZSgicXVvdGVzIiksaWNvbjoiXHV7MUY0QTF9Iix3aWRnZXRJZDoicXVvdGVzIn0sYSgiZGl2Iix7Y2xhc3NOYW1lOiJxdW90ZXMtbG9hZGluZyJ9LCJHZW5lcmF0aW5nIHF1b3Rlcy4uLiIpKTphKGNlLHt0aXRsZTpsZSgicXVvdGVzIiksaWNvbjoiXHV7MUY0QTF9Iix3aWRnZXRJZDoicXVvdGVzIixoZWFkZXJBY3Rpb25zOmd9LGEoImRpdiIse2NsYXNzTmFtZToicXVvdGVzLWdyaWQifSxzLnNsaWNlKDAsaSkubWFwKCh2LHkpPT5hKCJkaXYiLHtrZXk6eSxjbGFzc05hbWU6InF1b3RlLXRpbGUiLHN0eWxlOntiYWNrZ3JvdW5kSW1hZ2U6ImxpbmVhci1ncmFkaWVudChyZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMC42KSksIHVybCgiK3dsKCJzbWFsbCIsZCx5KSsiKSJ9fSxhKCJwIix7Y2xhc3NOYW1lOiJxdW90ZS10ZXh0In0sJyInK3YudGV4dCsnIicpLHYuYXV0aG9yP2EoInNwYW4iLHtjbGFzc05hbWU6InF1b3RlLWF1dGhvciJ9LCJcdTIwMTQgIit2LmF1dGhvcik6bnVsbCkpKSl9dmFyIGwwPXhlKHdlKCkpO3ZhciBZVD17ZGFpbHlKb3Q6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvam90cyIsam91cm5hbDoiaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy9qb3RzIixjYWxlbmRhcjoiaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy9jYWxlbmRhciJ9O2FzeW5jIGZ1bmN0aW9uIHFUKGUpe2xldCB0O3RyeXt0PWF3YWl0IGUuZ2V0VGFza0RvbWFpbnMoKX1jYXRjaHtyZXR1cm59bGV0IG49KEFycmF5LmlzQXJyYXkodCk/dDpbXSkuZmlsdGVyKG89Pm8hPW51bGwpLmZsYXRNYXAobz0+by5ub3Rlc3x8W10pO2lmKCFuLmxlbmd0aClyZXR1cm47bGV0IHI9bltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbi5sZW5ndGgpXTtyPy51dWlkJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7ci51dWlkfWApfWZ1bmN0aW9uIGRwKHthcHA6ZX0pe2xldCB0PWwwLmNyZWF0ZUVsZW1lbnQsbj1be2xhYmVsOiJEYWlseSBKb3QiLGljb246Ilx1ezFGNEREfSIsYWN0aW9uOiJkYWlseUpvdCJ9LHtsYWJlbDoiSm91cm5hbCIsaWNvbjoiXHV7MUY0RDN9IixhY3Rpb246ImpvdXJuYWwifSx7bGFiZWw6IkNhbGVuZGFyIixpY29uOiJcdXsxRjRDNX0iLGFjdGlvbjoiY2FsZW5kYXIifSx7bGFiZWw6IlJhbmRvbSBOb3RlIixpY29uOiJcdXsxRjNCMn0iLGFjdGlvbjoicmFuZG9tTm90ZSJ9XSxyPWFzeW5jIG89PntpZihvPT09InJhbmRvbU5vdGUiKXthd2FpdCBxVChlKTtyZXR1cm59bGV0IGE9WVRbb107YSYmYXdhaXQgZS5uYXZpZ2F0ZShhKX07cmV0dXJuIHQoY2Use3RpdGxlOmxlKCJxdWljay1hY3Rpb25zIiksaWNvbjoiXHUyNkExIix3aWRnZXRJZDoicXVpY2stYWN0aW9ucyJ9LHQoImRpdiIse2NsYXNzTmFtZToicWEtZ3JpZCJ9LG4ubWFwKG89PnQoImJ1dHRvbiIse2tleTpvLmFjdGlvbixjbGFzc05hbWU6InFhLWJ1dHRvbiIsb25DbGljazooKT0+cihvLmFjdGlvbil9LHQoInNwYW4iLHtjbGFzc05hbWU6InFhLWljb24ifSxvLmljb24pLHQoInNwYW4iLHtjbGFzc05hbWU6InFhLWxhYmVsIn0sby5sYWJlbCkpKSkpfXZhciBTbj14ZSh3ZSgpKTt2YXIgUVQ9NyoyNCo2MCo2MCoxZTMsdTA9MyxjMD01LEpUPTUscHA9ZnIoInJlY2VudC1ub3RlcyIpLGQwPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXTtmdW5jdGlvbiBYVChlKXtsZXQgdD0yMTY2MTM2MjYxO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXRePWUuY2hhckNvZGVBdChuKSx0PU1hdGguaW11bCh0LDE2Nzc3NjE5KT4+PjA7cmV0dXJuIHR9ZnVuY3Rpb24gWlQoZSl7bGV0IHQ9ZT4+PjA7cmV0dXJuIGZ1bmN0aW9uKCl7dCs9MTgzMTU2NTgxMztsZXQgbj1NYXRoLmltdWwodF50Pj4+MTUsMXx0KTtyZXR1cm4gbl49bitNYXRoLmltdWwobl5uPj4+Nyw2MXxuKSwoKG5ebj4+PjE0KT4+PjApLzQyOTQ5NjcyOTZ9fWZ1bmN0aW9uIGVOKGUpe2xldCB0PW5ldyBEYXRlLG49YCR7dC5nZXRGdWxsWWVhcigpfS0ke1N0cmluZyh0LmdldE1vbnRoKCkrMSkucGFkU3RhcnQoMiwiMCIpfS0ke1N0cmluZyh0LmdldERhdGUoKSkucGFkU3RhcnQoMiwiMCIpfWA7cmV0dXJuIFhUKGAke259LSR7ZX1gKX1mdW5jdGlvbiBmcChlKXtpZighZXx8dHlwZW9mIGUhPSJvYmplY3QifHxBcnJheS5pc0FycmF5KGUpKXJldHVybnt9O2xldCB0PXt9O2ZvcihsZXQgbiBvZiBkMCl7bGV0IHI9QXJyYXkuaXNBcnJheShlW25dKT9lW25dOltdO3Rbbl09Wy4uLm5ldyBTZXQoci5maWx0ZXIobz0+dHlwZW9mIG89PSJzdHJpbmciJiZvLmxlbmd0aD4wKSldfXJldHVybiB0fWZ1bmN0aW9uIHROKGUpe2xldCB0PWU/LnNldHRpbmdzPy5bcHBdO2lmKCF0KXJldHVybnt9O2lmKHR5cGVvZiB0PT0ic3RyaW5nIil0cnl7cmV0dXJuIGZwKEpTT04ucGFyc2UodCkpfWNhdGNoe3JldHVybnt9fXJldHVybiBmcCh0KX1hc3luYyBmdW5jdGlvbiBuTihlLHQpe2xldCBuPWZwKHQpLHI9SlNPTi5zdHJpbmdpZnkobik7YXdhaXQgZS5zZXRTZXR0aW5nKHBwLHIpLGU/LnNldHRpbmdzJiYoZS5zZXR0aW5nc1twcF09bil9ZnVuY3Rpb24gck4oZSl7bGV0IHQ9bmV3IFNldDtyZXR1cm4gZDAuZm9yRWFjaChuPT57KGVbbl18fFtdKS5mb3JFYWNoKHI9PnQuYWRkKHIpKX0pLHR9ZnVuY3Rpb24gb04oZSx0KXtsZXQgbj1uZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLHt3ZWVrZGF5OiJsb25nIn0pLHI9QXJyYXkuaXNBcnJheShlW25dKT9lW25dOltdO3JldHVybnsuLi5lLFtuXTpbLi4ubmV3IFNldChbLi4uciwuLi50XSldfX1hc3luYyBmdW5jdGlvbiBhTihlKXtsZXQgdDt0cnl7dD1hd2FpdCBlLmdldFRhc2tEb21haW5zKCl9Y2F0Y2gobyl7cmV0dXJuIEEoIltSZWNlbnROb3Rlc10gZ2V0VGFza0RvbWFpbnMgZmFpbGVkOiIsbyksW119aWYoIUFycmF5LmlzQXJyYXkodCl8fHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbj1uZXcgU2V0LHI9W107Zm9yKGxldCBvIG9mIHQpaWYobylmb3IobGV0IGEgb2Ygby5ub3Rlc3x8W10pYT8udXVpZCYmIW4uaGFzKGEudXVpZCkmJihuLmFkZChhLnV1aWQpLHIucHVzaChhKSk7cmV0dXJuIHJ9YXN5bmMgZnVuY3Rpb24gaU4oZSx0LG49YzApe2xldCByPWF3YWl0IGFOKGUpLG89RGF0ZS5ub3coKS1RVCxhPVpUKHQpLGk9W10scz1bXSxsPVtdO2ZvcihsZXQgYiBvZiByKXRyeXtsZXQgaD1hd2FpdCBlLmdldE5vdGVUYXNrcyh7dXVpZDpiLnV1aWR9LHtpbmNsdWRlRG9uZTohMX0pO2lmKCFBcnJheS5pc0FycmF5KGgpfHxoLmxlbmd0aD09PTApY29udGludWU7bGV0IG09aC5yZWR1Y2UoKHcsZik9PntsZXQgVD1mLnN0YXJ0QXQ/Zi5zdGFydEF0KjFlMzowO3JldHVybiBNYXRoLm1heCh3LFQpfSwwKTtpZihtIT09MCYmbT49byljb250aW51ZTtpLnB1c2goe25vdGVIYW5kbGU6Yix0YXNrQ291bnQ6aC5sZW5ndGgsbGF0ZXN0VGFza1RpbWVzdGFtcDptfSl9Y2F0Y2goaCl7QShgW1JlY2VudE5vdGVzXSBGYWlsZWQgdG8gZmV0Y2ggdGFza3MgZm9yIG5vdGUgJHtiLnV1aWR9OmAsaCl9bGV0IHU9dE4oZSksYz1yTih1KSxkPWkuZmlsdGVyKGI9PiFjLmhhcyhiLm5vdGVIYW5kbGUudXVpZCkpLHA9dTtpLmxlbmd0aD4wJiZkLmxlbmd0aD09PTAmJihwPXt9LGQ9aSk7Zm9yKGxldCBiIG9mIGQpe2lmKHMubGVuZ3RoPj1uKWJyZWFrO2wubGVuZ3RoPEpUJiZhKCk8LjU/bC5wdXNoKGIpOnMucHVzaChiKX1sZXQgZz1zLmxlbmd0aD49dTA/czpbLi4ucywuLi5sXS5zbGljZSgwLG4pLHY9YXdhaXQgUHJvbWlzZS5hbGwoZy5tYXAoYj0+ZS5maW5kTm90ZSh7dXVpZDpiLm5vdGVIYW5kbGUudXVpZH0pLnRoZW4oaD0+KHsuLi5iLG5vdGVIYW5kbGU6aHx8Yi5ub3RlSGFuZGxlfSkpLmNhdGNoKCgpPT5iKSkpLHk9di5tYXAoKHtub3RlSGFuZGxlOmJ9KT0+Yj8udXVpZCkuZmlsdGVyKEJvb2xlYW4pO2lmKHkubGVuZ3RoPjApdHJ5e2F3YWl0IG5OKGUsb04ocCx5KSl9Y2F0Y2goYil7QSgiW1JlY2VudE5vdGVzXSBGYWlsZWQgdG8gcGVyc2lzdCByZWNlbnQtbm90ZSBVVUlEIGhpc3Rvcnk6IixiKX1yZXR1cm4gdn1mdW5jdGlvbiBtcCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xfSl7bGV0IG49U24uY3JlYXRlRWxlbWVudCxbcixvXT0oMCxTbi51c2VTdGF0ZSkoMCksW2EsaV09KDAsU24udXNlU3RhdGUpKG51bGwpLFtzLGxdPSgwLFNuLnVzZVN0YXRlKShudWxsKSx1PXQ+PTI/MTA6YzAsYz0oMCxTbi51c2VNZW1vKSgoKT0+ZU4ociksW3JdKTsoMCxTbi51c2VFZmZlY3QpKCgpPT57aShudWxsKSxsKG51bGwpLGlOKGUsYyx1KS50aGVuKHY9PntpKHYpLEEoIltSZWNlbnROb3Rlc10gc3RhbGVOb3RlczoiLHYsInNlZWQ6IixjLCJyZXNlZWRDb3VudDoiLHIpfSkuY2F0Y2godj0+e0EoIltSZWNlbnROb3Rlc10gZmV0Y2ggZXJyb3I6Iix2KSxsKHYubWVzc2FnZXx8IkZhaWxlZCB0byBsb2FkIG5vdGVzIil9KX0sW2MsdV0pO2xldCBwPW4oImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+byh2PT52KzEpLHRpdGxlOiJTaG93IGEgZGlmZmVyZW50IHNldCBvZiBub3RlcyJ9LCJcdTIxQkIgUmVzZWVkIiksZz0oKT0+cz9uKCJwIix7Y2xhc3NOYW1lOiJub3RlLWVycm9yIn0sYEVycm9yOiAke3N9YCk6YT09PW51bGw/bigicCIse2NsYXNzTmFtZToibm90ZS1sb2FkaW5nIn0sIkxvYWRpbmdcdTIwMjYiKTphLmxlbmd0aDx1MD9uKCJwIix7Y2xhc3NOYW1lOiJub3RlLWVtcHR5In0sIk5vIG5vdGVzIHdpdGggc3RhbGUgdGFza3MgZm91bmQuIik6bigidWwiLHtjbGFzc05hbWU6Im5vdGUtbGlzdCJ9LGEubWFwKCh7bm90ZUhhbmRsZTp2LHRhc2tDb3VudDp5fSk9Pm4oImxpIix7a2V5OnYudXVpZCxjbGFzc05hbWU6Im5vdGUtaXRlbSJ9LG4oImJ1dHRvbiIse2NsYXNzTmFtZToibm90ZS1saW5rIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHt2LnV1aWR9YCksdGl0bGU6YE9wZW4gIiR7di5uYW1lfHwiVW50aXRsZWQifSJgfSxuKCJzcGFuIix7Y2xhc3NOYW1lOiJub3RlLW5hbWUifSx2Lm5hbWV8fCJVbnRpdGxlZCIpLG4oInNwYW4iLHtjbGFzc05hbWU6Im5vdGUtY291bnQifSxgJHt5fSBvcGVuIHRhc2ske3khPT0xPyJzIjoiIn1gKSkpKSk7cmV0dXJuIG4oY2Use3RpdGxlOmxlKCJyZWNlbnQtbm90ZXMiKSxpY29uOiJcdXsxRjRERH0iLHdpZGdldElkOiJyZWNlbnQtbm90ZXMiLGhlYWRlckFjdGlvbnM6cH0sZygpKX12YXIgYmw9eGUod2UoKSk7ZnVuY3Rpb24gaHAoe2FjdGl2ZVRhc2tEb21haW46ZSxhcHA6dCxkb21haW5zOm4sb25Eb21haW5DaGFuZ2U6cn0pe2xldCBvPWJsLmNyZWF0ZUVsZW1lbnQsW2EsaV09KDAsYmwudXNlU3RhdGUpKCExKSxzPWFzeW5jKCk9PntBKCJbVGFza0RvbWFpbnNdIFJlZnJlc2ggdHJpZ2dlcmVkIiksaSghMCk7dHJ5e2xldCBjPWF3YWl0IHN2KHQpO0EoIltUYXNrRG9tYWluc10gUmVmcmVzaCByZXN1bHQiLGMpLGMmJnImJnIoYy5kb21haW5zLGMuYWN0aXZlVGFza0RvbWFpbil9Y2F0Y2goYyl7dGhyb3cgQSgiW1Rhc2tEb21haW5zXSBSZWZyZXNoIGZhaWxlZCIsYyksY31maW5hbGx5e2koITEpfX0sbD1hc3luYyBjPT57aWYoYz09PWUpcmV0dXJuO2xldCBkPWF3YWl0IGl2KHQsYyk7ZCYmciYmcihudWxsLGMsZCl9LHU9YXN5bmMgYz0+e2Muc3RvcFByb3BhZ2F0aW9uKCksYXdhaXQgdC5uYXZpZ2F0ZSgiaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcz90YWc9dGFza19jYWxlbmRhciIpfTtyZXR1cm4hbnx8bi5sZW5ndGg9PT0wP28oImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zIHRhc2stZG9tYWlucy0tZW1wdHkifSxvKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1lbXB0eSJ9LCdWaXNpdCAiU2V0dGluZ3MiID4gIlRhc2sgQ2FsZW5kYXIiIHRvIGNyZWF0ZSBhIHRhc2sgZG9tYWluLCBlbmFibGluZyBEYXNoYm9hcmQuJyksbygiYnV0dG9uIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtcmVmcmVzaCIsb25DbGljazpzLGRpc2FibGVkOmEsdHlwZToiYnV0dG9uIn0sYT8iUmVmcmVzaGluZy4uLiI6Ilx1MjFCQiBSZWZyZXNoIikpOm8oImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zIn0sbygiZGl2Iix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtbGlzdCJ9LG4ubWFwKGM9Pm8oImRpdiIse2tleTpjLnV1aWQsY2xhc3NOYW1lOiJ0YXNrLWRvbWFpbi1pdGVtIisoYy51dWlkPT09ZT8iIGFjdGl2ZSI6IiIpLG9uQ2xpY2s6KCk9PmwoYy51dWlkKX0sbygic3BhbiIse2NsYXNzTmFtZToidGFzay1kb21haW4tbmFtZSJ9LGMubmFtZSkpKSksbygiYnV0dG9uIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtcmVmcmVzaCIsb25DbGljazpzLGRpc2FibGVkOmF9LGE/IlJlZnJlc2hpbmcuLi4iOiJcdTIxQkIgUmVmcmVzaCBUYXNrIERvbWFpbnMiKSl9dmFyIHhsPXhlKHdlKCkpO2Z1bmN0aW9uIHAwKGUpe2xldCB0PSgwLHhsLnVzZVJlZikobnVsbCk7dC5jdXJyZW50PT09bnVsbCYmKHQuY3VycmVudD1wZXJmb3JtYW5jZS5ub3coKSxBKGBbZGFzaGJvYXJkXSBXaWRnZXQgIiR7ZX0iIGxvYWRpbmcuLi5gKSksKDAseGwudXNlRWZmZWN0KSgoKT0+e3QuY3VycmVudCE9PW51bGwmJihBKGBbZGFzaGJvYXJkXSBXaWRnZXQgIiR7ZX0iIGZpbmlzaGVkIGxvYWRpbmcgaW4gJHsocGVyZm9ybWFuY2Uubm93KCktdC5jdXJyZW50KS50b0ZpeGVkKDEpfW1zYCksdC5jdXJyZW50PW51bGwpfSxbXSl9dmFyIEd0PXhlKHdlKCkpO3ZhciBzTj1be3ZhbHVlOi0yLGVtb2ppOiJcdXsxRjYyMn0iLGxhYmVsOiJBd2Z1bCJ9LHt2YWx1ZTotMSxlbW9qaToiXHV7MUY2MUZ9IixsYWJlbDoiQmFkIn0se3ZhbHVlOjAsZW1vamk6Ilx1ezFGNjEwfSIsbGFiZWw6Ik9rYXkifSx7dmFsdWU6MSxlbW9qaToiXHV7MUY2NDJ9IixsYWJlbDoiR29vZCJ9LHt2YWx1ZToyLGVtb2ppOiJcdXsxRjYwNH0iLGxhYmVsOiJHcmVhdCJ9XTtmdW5jdGlvbiBsTihlKXtpZighZXx8ZS5sZW5ndGg8NylyZXR1cm4iIjtsZXQgdD1tdChlWzBdLmRhdGUpLG49bXQoZVs2XS5kYXRlKSxyPW89Pm8udG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSk7cmV0dXJuYCR7cih0KX0gXHUyMDEzICR7cihuKX1gfWZ1bmN0aW9uIGYwKGUsdCl7bGV0IG49bXQoZSk7cmV0dXJuIG4uc2V0RGF0ZShuLmdldERhdGUoKSt0KjcpLFN0KG4pfWZ1bmN0aW9uIHVOKGUsdCl7bGV0IG49VnQoZSx0KSxyPVZ0KG5ldyBEYXRlLHQpO3JldHVybiBuPj1yfWZ1bmN0aW9uIGNOKGUsdCl7cmV0dXJuIUFycmF5LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MD9bXTohdHx8dHlwZW9mIHQhPSJvYmplY3QiP2U6ZS5tYXAobj0+e2xldCByPVN0KG4uZGF0ZSksbz1BcnJheS5pc0FycmF5KHRbcl0pP3Rbcl06W10sYT1vLnJlZHVjZSgoaSxzKT0+aSsocy52aWN0b3J5VmFsdWV8fDApLDApO3JldHVybnsuLi5uLHZhbHVlOmEsdGFza0NvdW50Om8ubGVuZ3RofX0pfWZ1bmN0aW9uIGROKGUsdCxuLHIpe2xldCBvPXJ2KGUscik7cmV0dXJuIW58fHR5cGVvZiBuIT0ib2JqZWN0Ij9jTih0LG4pOm8ubWFwKGE9PntsZXQgaT1BcnJheS5pc0FycmF5KG5bYS5kYXRlS2V5XSk/blthLmRhdGVLZXldOltdLHM9aS5yZWR1Y2UoKGwsdSk9PmwrKHUudmljdG9yeVZhbHVlfHwwKSwwKTtyZXR1cm57ZGF5OmEuZGF5LGRhdGU6YS5kYXRlLHZhbHVlOnMsdGFza0NvdW50OmkubGVuZ3RofX0pfWFzeW5jIGZ1bmN0aW9uIHBOKGUsdCxuLHIpe2xldCBvPVt0LFN0cmluZyhuKV07YXdhaXQgZS5zZXRTZXR0aW5nKGZyKCJ2aWN0b3J5LXZhbHVlIiksSlNPTi5zdHJpbmdpZnkobykpLHIoITEpfWZ1bmN0aW9uIG0wKGUpe3JldHVybiBlPT1udWxsPyEwOmU9PT0idHJ1ZSJ8fGU9PT0hMH1mdW5jdGlvbiBmTihlLHQsbixyKXt0KGVbMF18fCJ3ZWVrIiksbihtMChlWzFdKSkscighMSl9ZnVuY3Rpb24gbU4oZSx0LG4pe2xldCByPWUuY3VycmVudDtpZighcilyZXR1cm47bGV0IG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPW4uY2xpZW50WC1vLmxlZnQscz0oby53aWR0aC04MCkvNztmb3IobGV0IGw9MDtsPDc7bCsrKXtsZXQgdT00MCtsKnMsYz11K3M7aWYoYT49dSYmYTxjKXt0KGwpO3JldHVybn19dChudWxsKX1mdW5jdGlvbiBoTihlLHQpe2xldCBuPWUuY3VycmVudDtpZighbilyZXR1cm4gMDtsZXQgbz0obi5vZmZzZXRXaWR0aC04MCkvNztyZXR1cm4gNDArdCpvK28qLjV9ZnVuY3Rpb24gZ04oZSx0LG4scil7bGV0IG89ZS5jdXJyZW50O2lmKCFvKXJldHVybiAwO2xldCBhPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1vLm9mZnNldEhlaWdodC01MCx1PShuW3RdPy52YWx1ZXx8MCkvcipzKi44NTtyZXR1cm4gYS50b3Arcy11KzEwfWZ1bmN0aW9uIHZOKGUsdCxuKXtpZighbnx8IXRbZV0pcmV0dXJuW107bGV0IHI9U3QodFtlXS5kYXRlKTtyZXR1cm4obltyXXx8W10pLnNsaWNlKCkuc29ydCgobyxhKT0+KGEudmljdG9yeVZhbHVlfHwwKS0oby52aWN0b3J5VmFsdWV8fDApKX1mdW5jdGlvbiB5TihlLHQpe2lmKCFlfHwhQXJyYXkuaXNBcnJheShlKXx8IXQpcmV0dXJuW107bGV0IG49e307Zm9yKGxldCByIG9mIGUpe2lmKCFyfHxyLnRpbWVzdGFtcD09bnVsbCljb250aW51ZTtsZXQgbz1uZXcgRGF0ZShyLnRpbWVzdGFtcCoxZTMpLGE9U3Qobyk7KCFuW2FdfHxyLnRpbWVzdGFtcD5uW2FdLnRpbWVzdGFtcCkmJihuW2FdPXIpfXJldHVybiB0Lm1hcChyPT57bGV0IG89U3Qoci5kYXRlKTtyZXR1cm4gbltvXXx8bnVsbH0pfWZ1bmN0aW9uIHdOKGUsdCxuKXtpZighdHx8IXRbZV0pcmV0dXJuIG51bGw7aWYobiYmbltlXSl7bGV0IG89bmV3IERhdGU7aWYoby5zZXRIb3VycygyMyw1OSw1OSw5OTkpLG10KG5bZV0uZGF0ZSk+bylyZXR1cm4gbnVsbH1sZXQgcj10W2VdLnJhdGluZztyZXR1cm4gc04uZmluZChvPT5vLnZhbHVlPT09cil8fG51bGx9ZnVuY3Rpb24gYk4oZSx0LG4scixvLGEpe3QuZm9yRWFjaCgoaSxzKT0+e2xldCBsPWkudmFsdWUvbipvKi44NSx1PTQwK3MqcityKi4xNSxjPW8tbCsxMDtlLmZpbGxTdHlsZT1pLnZhbHVlPjA/IiM2MzY2ZjEiOiIjZTVlN2ViIixlLmJlZ2luUGF0aCgpLGUucm91bmRSZWN0KHUsYyxyKi43LGwsWzQsNCwwLDBdKSxlLmZpbGwoKSxlLmZpbGxTdHlsZT0iIzZiNzI4MCIsZS5mb250PSIxMXB4IHN5c3RlbS11aSIsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5maWxsVGV4dChpLmRheSx1K3IqLjM1LGEtMTUpO2xldCBwPW10KGkuZGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSk7ZS5maWxsU3R5bGU9IiM5Y2EzYWYiLGUuZm9udD0iOXB4IHN5c3RlbS11aSIsZS5maWxsVGV4dChwLHUrciouMzUsYS0zKSxpLnZhbHVlPjAmJihlLmZpbGxTdHlsZT0iI2ZmZmZmZiIsZS5mb250PSJib2xkIDEwcHggc3lzdGVtLXVpIixlLmZpbGxUZXh0KHhOKGkudmFsdWUpLHUrciouMzUsYysxNCkpfSl9ZnVuY3Rpb24geE4oZSl7cmV0dXJuKE1hdGgucm91bmQoKGV8fDApKjEwKS8xMCkudG9GaXhlZCgxKX1mdW5jdGlvbiBrTihlLHQsbixyLG8pe2xldCBhPW5ldyBEYXRlO2Euc2V0SG91cnMoMjMsNTksNTksOTk5KTtsZXQgaT1bXTtpZih0LmZvckVhY2goKHMsbCk9PntpZighc3x8IW5bbF18fG10KG5bbF0uZGF0ZSk+YSlyZXR1cm47bGV0IGM9by0ocy5yYXRpbmcrMikvNCpvKzEwLGQ9NDArbCpyK3IqLjU7aS5wdXNoKHtpbmRleDpsLHg6ZCx5OmN9KX0pLGkubGVuZ3RoIT09MCl7ZS5zdHJva2VTdHlsZT0iI2Y1OWUwYiIsZS5saW5lV2lkdGg9Mjtmb3IobGV0IHM9MTtzPGkubGVuZ3RoO3MrKyl7bGV0IGw9aVtzLTFdLHU9aVtzXTtlLnNldExpbmVEYXNoKHUuaW5kZXg9PT1sLmluZGV4KzE/W106WzMsNF0pLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8obC54LGwueSksZS5saW5lVG8odS54LHUueSksZS5zdHJva2UoKX1lLnNldExpbmVEYXNoKFtdKSxpLmZvckVhY2goKHt4OnMseTpsfSk9PntlLmZpbGxTdHlsZT0iI2Y1OWUwYiIsZS5iZWdpblBhdGgoKSxlLmFyYyhzLGwsMywwLE1hdGguUEkqMiksZS5maWxsKCl9KX19ZnVuY3Rpb24gU04oZSx0LG4scixvKXtsZXQgYT1lLmN1cnJlbnQ7aWYoIWEpcmV0dXJuO2xldCBpPWEuZ2V0Q29udGV4dCgiMmQiKSxzPWEud2lkdGg9YS5vZmZzZXRXaWR0aCoyLGw9YS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQqMjtpLnNjYWxlKDIsMik7bGV0IHU9cy8yLGM9bC8yLGQ9KHUtODApLzcscD1jLTUwO2kuY2xlYXJSZWN0KDAsMCx1LGMpLGJOKGksdCxuLGQscCxjKSxvJiZyJiZyLnNvbWUoZz0+ZyE9PW51bGwpJiZrTihpLHIsdCxkLHApfWZ1bmN0aW9uIEVOKGUsdCxuLHIpe2xldCBvPXZOKGUsdCxuKSxhPXdOKGUscix0KSxzPVtgPGRpdiBjbGFzcz0iZGFzaGJvYXJkLXRvb2x0aXAtaGVhZGVyIj4ke3RbZV0/YXYodFtlXS5kYXRlKToiIn08L2Rpdj5gXTtpZihhJiZzLnB1c2goYDxkaXYgY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXNlY3Rpb24iPiR7YS5lbW9qaX0gJHthLmxhYmVsfTwvZGl2PmApLG8ubGVuZ3RoPjApZm9yKGxldCBsIG9mIG8pcy5wdXNoKGA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1yb3ciPjxzcGFuIGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1yb3ctbGFiZWwiPiR7Vm8obC5jb250ZW50KX08L3NwYW4+PHNwYW4gY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXJvdy12YWx1ZSI+JHtsLnZpY3RvcnlWYWx1ZXx8MH0gcHRzPC9zcGFuPjwvZGl2PmApO2Vsc2Ugcy5wdXNoKCc8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1lbXB0eSI+Tm8gY29tcGxldGVkIHRhc2tzPC9kaXY+Jyk7cmV0dXJuIHMuam9pbigiIil9ZnVuY3Rpb24gVE4oZSx0LG4pe3JldHVyblsid2VlayIsIm1vbnRoIiwiMzBkYXlzIl0ubWFwKHI9PmUoImxhYmVsIix7a2V5OnJ9LGUoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6InZ2LXRpbWUtcmFuZ2UiLHZhbHVlOnIsY2hlY2tlZDp0PT09cixvbkNoYW5nZTpuLmJpbmQobnVsbCxyKX0pLHI9PT0id2VlayI/IlRoaXMgd2VlayI6cj09PSJtb250aCI/IlRoaXMgbW9udGgiOiJMYXN0IDMwIGRheXMiKSl9ZnVuY3Rpb24gZ3Aoe2FwcDplLGNvbXBsZXRlZFRhc2tzQnlEYXRlOnQsZGFpbHlWYWx1ZXM6bixtb29kUmF0aW5nczpyLG9uUmVmZXJlbmNlRGF0ZUNoYW5nZTpvLHJlZmVyZW5jZURhdGU6YSx3ZWVrRm9ybWF0Omksd2Vla2x5VG90YWw6c30pe2xldCBsPUd0LmNyZWF0ZUVsZW1lbnQsdT0oMCxHdC51c2VSZWYpKG51bGwpLGM9b3YoaSksZD1kTihhLG4sdCxjKSxwPU1hdGgubWF4KC4uLmQubWFwKEc9PkcudmFsdWUpLDEpLGc9ZC5yZWR1Y2UoKEcsUSk9PkcrKFEudmFsdWV8fDApLDApLHY9TWF0aC5yb3VuZChnfHxzfHwwKSx5PXlOKHIsZCksW2IsaF09KDAsR3QudXNlU3RhdGUpKCExKSxbbSx3XT0oMCxHdC51c2VTdGF0ZSkobnVsbCksZj1CcyhlLCJ2aWN0b3J5LXZhbHVlIiksW1QsU109KDAsR3QudXNlU3RhdGUpKGZbMF18fCJ3ZWVrIiksW0QsTl09KDAsR3QudXNlU3RhdGUpKG0wKGZbMV0pKSxDPWguYmluZChudWxsLCEwKSx4PXBOLmJpbmQobnVsbCxlLFQsRCxoKSxNPWZOLmJpbmQobnVsbCxmLFMsTixoKSxQPWxOKGQpLE89ZWkoe2ludGVyYWN0aXZlOiEwfSksUj1HPT57Ty5jYW5jZWxTY2hlZHVsZWRIaWRlKCksbU4odSx3LEcpfSxVPSgpPT5PLnNjaGVkdWxlSGlkZSgzMDAsKCk9PncobnVsbCkpO3JldHVybigwLEd0LnVzZUVmZmVjdCkoKCk9PntTTih1LGQscCx5LEQpfSxbZCxwLHksRF0pLCgwLEd0LnVzZUVmZmVjdCkoKCk9PntpZihtPT09bnVsbCl7Ty5oaWRlKCk7cmV0dXJufWxldCBHPXUuY3VycmVudDtpZighRylyZXR1cm47bGV0IFE9Ry5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxwZT1oTih1LG0pLF9lPVEubGVmdCtwZSxFPWdOKHUsbSxkLHApLGs9RSxGPXdpbmRvdy5pbm5lckhlaWdodC1RLmJvdHRvbSxXPUVOKG0sZCx0LHkpO0Y+az9PLnNob3coVyxfZSxRLmJvdHRvbSx7cGxhY2VtZW50OiJib3R0b20iLGJlbG93Q2hhcnQ6ITB9KTpPLnNob3coVyxfZSxFLHtwbGFjZW1lbnQ6InRvcCJ9KX0sW21dKSxsKGNlLHt0aXRsZTpsZSgidmljdG9yeS12YWx1ZSIpLGljb246Ilx1ezFGM0M2fSIsd2lkZ2V0SWQ6InZpY3RvcnktdmFsdWUiLGNvbmZpZ3VyYWJsZTohMCxvbkNvbmZpZ3VyZTpDfSxiP2woUXIse3RpdGxlOiJDb25maWd1cmUgVmljdG9yeSBWYWx1ZSIsb25TdWJtaXQ6eCxvbkNhbmNlbDpNfSxsKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LGwoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIlRpbWUgcmFuZ2UiKSxUTihsLFQsUykpLGwoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0sbCgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiTW9vZCBvdmVybGF5IiksbCgibGFiZWwiLG51bGwsbCgiaW5wdXQiLHt0eXBlOiJjaGVja2JveCIsY2hlY2tlZDpELG9uQ2hhbmdlOkc9Pk4oRy50YXJnZXQuY2hlY2tlZCl9KSwiU2hvdyBtb29kIG92ZXJsYXkiKSkpOm51bGwsbCgiZGl2Iix7Y2xhc3NOYW1lOiJ2di1oZWFkZXIifSxsKCJzcGFuIix7Y2xhc3NOYW1lOiJ2di10b3RhbCJ9LHYpLGwoInNwYW4iLHtjbGFzc05hbWU6InZ2LWxhYmVsIn0sYHBvaW50cyAke1B9YCkpLGwoImRpdiIse2NsYXNzTmFtZToidnYtY2hhcnQtY29udGFpbmVyIn0sbCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ2di1uYXYtYXJyb3ciLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+byYmbyhmMChhLC0xKSksdGl0bGU6IlByZXZpb3VzIHdlZWsiLCJhcmlhLWxhYmVsIjoiUHJldmlvdXMgd2VlayJ9LCJcdTIwMzkiKSxsKCJkaXYiLHtjbGFzc05hbWU6InZ2LWNoYXJ0LXdyYXAifSxsKCJjYW52YXMiLHtyZWY6dSxjbGFzc05hbWU6InZ2LWNoYXJ0Iixvbk1vdXNlTW92ZTpSLG9uTW91c2VMZWF2ZTpVfSkpLGwoImJ1dHRvbiIse2NsYXNzTmFtZToidnYtbmF2LWFycm93Iix0eXBlOiJidXR0b24iLGRpc2FibGVkOnVOKGEsYyksb25DbGljazooKT0+byYmbyhmMChhLDEpKSx0aXRsZToiTmV4dCB3ZWVrIiwiYXJpYS1sYWJlbCI6Ik5leHQgd2VlayJ9LCJcdTIwM0EiKSkpfWZ1bmN0aW9uIE5OKGUpe2xldCB0PU51bWJlcihlPy5ncmlkV2lkdGhTaXplKT4wP051bWJlcihlLmdyaWRXaWR0aFNpemUpOjEsbj1OdW1iZXIoZT8uZ3JpZEhlaWdodFNpemUpPjA/TnVtYmVyKGUuZ3JpZEhlaWdodFNpemUpOjE7cmV0dXJuYGdyaWQtY2VsbCBob3Jpem9udGFsLSR7dH0tY2VsbCB2ZXJ0aWNhbC0ke259LWNlbGxgfWZ1bmN0aW9uIEROKGUsdCl7bGV0IG49ZT8ud2lkZ2V0SWQ7cmV0dXJue2NsYXNzTmFtZTpbTk4oZSksdD8iZ3JpZC1jZWxsLS1kcmFnLWFjdGl2ZSI6IiIsdCYmdD09PW4/ImdyaWQtY2VsbC0tZHJhZ2dpbmctcmVhZHkiOiIiLHQmJnQhPT1uPyJncmlkLWNlbGwtLWRyYWctc2hpZnQiOiIiXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpLCJkYXRhLXdpZGdldC1pZCI6bn19dmFyIHZwPWNsYXNzIGV4dGVuZHMgbmUuQ29tcG9uZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuc3RhdGU9e2hhc0Vycm9yOiExLGVycm9yOm51bGx9fXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IodCl7cmV0dXJue2hhc0Vycm9yOiEwLGVycm9yOnR9fWNvbXBvbmVudERpZENhdGNoKHQsbil7QShgW1dpZGdldEVycm9yQm91bmRhcnldIFdpZGdldCAiJHt0aGlzLnByb3BzLndpZGdldElkfSIgY3Jhc2hlZDpgLHQsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuaGFzRXJyb3I/KDAsbmUuY3JlYXRlRWxlbWVudCkoImRpdiIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrIn0sKDAsbmUuY3JlYXRlRWxlbWVudCkoInAiLHtjbGFzc05hbWU6IndpZGdldC1lcnJvci1mYWxsYmFjay10aXRsZSJ9LGBcdTI2QTAgJHt0aGlzLnByb3BzLndpZGdldElkfWApLCgwLG5lLmNyZWF0ZUVsZW1lbnQpKCJwIix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2stbWVzc2FnZSJ9LHRoaXMuc3RhdGUuZXJyb3I/Lm1lc3NhZ2V8fCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIiksKDAsbmUuY3JlYXRlRWxlbWVudCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrLXJldHJ5IixvbkNsaWNrOigpPT50aGlzLnNldFN0YXRlKHtoYXNFcnJvcjohMSxlcnJvcjpudWxsfSl9LCJSZXRyeSIpKTp0aGlzLnByb3BzLmNoaWxkcmVufX07ZnVuY3Rpb24gY24oZSx0LG4pe3JldHVybigwLG5lLm1lbW8pKGZ1bmN0aW9uKG8pe3AwKGUpO2xldHtjb25maWc6YSxkcmFnZ2luZ1dpZGdldElkOml9PW87cmV0dXJuKDAsbmUuY3JlYXRlRWxlbWVudCkoImRpdiIsRE4oYSxpKSwoMCxuZS5jcmVhdGVFbGVtZW50KSh2cCx7d2lkZ2V0SWQ6ZX0sKDAsbmUuY3JlYXRlRWxlbWVudCkodCxuKG8pKSkpfSl9ZnVuY3Rpb24gZmkoLi4uZSl7cmV0dXJuIHQ9PntsZXQgbj17fTtmb3IobGV0IHIgb2YgZSluW3JdPXRbcl07cmV0dXJuIG59fXZhciBfTj1jbigiYWdlbmRhIixqZCxlPT4oe2FwcDplLmFwcCxjdXJyZW50RGF0ZTplLmN1cnJlbnREYXRlLHNlbGVjdGVkRGF0ZTplLnNlbGVjdGVkRGF0ZSx0YXNrczplLmFnZW5kYVRhc2tzLHRpbWVGb3JtYXQ6ZS50aW1lRm9ybWF0fSkpLENOPWNuKCJkYXktc2tldGNoIixycCxmaSgiYWdlbmRhVGFza3MiLCJhcHAiLCJjdXJyZW50RGF0ZSIsInRpbWVGb3JtYXQiKSksQU49Y24oImRyZWFtLXRhc2siLHRwLCh7YXBwOmUsY29uZmlnOnQsb25PcGVuU2V0dGluZ3M6bixwcm92aWRlckFwaUtleTpyLHByb3ZpZGVyRW06b30pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEsZ3JpZFdpZHRoU2l6ZTpOdW1iZXIodD8uZ3JpZFdpZHRoU2l6ZSl8fDIsb25PcGVuU2V0dGluZ3M6bixwcm92aWRlckFwaUtleTpyLHByb3ZpZGVyRW06b30pKSxPTj1jbigiY2FsZW5kYXIiLFZkLCh7YXBwOmUsY29tcGxldGVkVGFza3NCeURhdGU6dCxjb25maWc6bixjdXJyZW50RGF0ZTpyLG9uRGF0ZVNlbGVjdDpvLG9uT3BlblNldHRpbmdzOmEsb3BlblRhc2tzOmksc2VsZWN0ZWREYXRlOnMsd2Vla0Zvcm1hdDpsfSk9Pih7YXBwOmUsY29tcGxldGVkVGFza3NCeURhdGU6dCxjdXJyZW50RGF0ZTpyLGdyaWRIZWlnaHRTaXplOm4/LmdyaWRIZWlnaHRTaXplLGdyaWRXaWR0aFNpemU6bj8uZ3JpZFdpZHRoU2l6ZSxvbkRhdGVTZWxlY3Q6byxvbk9wZW5TZXR0aW5nczphLG9wZW5UYXNrczppLHNlbGVjdGVkRGF0ZTpzLHdlZWtGb3JtYXQ6bH0pKSxSTj1jbigibW9vZCIsdXAsZmkoImFwcCIsIm1vb2RSYXRpbmdzIiwib25Nb29kUmVjb3JkZWQiKSksTU49Y24oInBlYWstaG91cnMiLGFwLGZpKCJhcHAiLCJjdXJyZW50RGF0ZSIsInNlbGVjdGVkRGF0ZSIsInRpbWVGb3JtYXQiKSksSU49Y24oInBsYW5uaW5nIixXZCwoe2FwcDplLGNvbmZpZzp0LHF1YXJ0ZXJseVBsYW5zOm59KT0+KHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTpOdW1iZXIodD8uZ3JpZEhlaWdodFNpemUpfHwxLHF1YXJ0ZXJseVBsYW5zOm59KSksUE49Y24oInF1aWNrLWFjdGlvbnMiLGRwLGZpKCJhcHAiKSksTE49Y24oInF1b3RlcyIsY3AsKHthcHA6ZSxjb25maWc6dCxwcm92aWRlckFwaUtleTpufSk9Pih7YXBwOmUsZ3JpZEhlaWdodFNpemU6TnVtYmVyKHQ/LmdyaWRIZWlnaHRTaXplKXx8MSxwbGFuQ29udGVudDpudWxsLHByb3ZpZGVyQXBpS2V5Om4scXVvdGVzOm51bGx9KSksek49Y24oInJlY2VudC1ub3RlcyIsbXAsKHthcHA6ZSxjb25maWc6dH0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDF9KSksRk49Y24oInZpY3RvcnktdmFsdWUiLGdwLGZpKCJhcHAiLCJjb21wbGV0ZWRUYXNrc0J5RGF0ZSIsImRhaWx5VmFsdWVzIiwibW9vZFJhdGluZ3MiLCJvblJlZmVyZW5jZURhdGVDaGFuZ2UiLCJyZWZlcmVuY2VEYXRlIiwid2Vla0Zvcm1hdCIsIndlZWtseVRvdGFsIikpLFVOPXthZ2VuZGE6X04sY2FsZW5kYXI6T04sbW9vZDpSTixwbGFubmluZzpJTiwicXVpY2stYWN0aW9ucyI6UE4scXVvdGVzOkxOLCJyZWNlbnQtbm90ZXMiOnpOLCJ2aWN0b3J5LXZhbHVlIjpGTiwiZHJlYW0tdGFzayI6QU4sInBlYWstaG91cnMiOk1OLCJkYXktc2tldGNoIjpDTn07ZnVuY3Rpb24gJE4oZSx7aW5pdERhdGFGcmVzaFJlZjp0LGluaXRpYWxpemVEb21haW5UYXNrczpuLHNldENvbmZpZ1BhcmFtczpyLHNldEN1cnJlbnREYXRlOm8sc2V0RGFpbHlWaWN0b3J5VmFsdWVzOmEsc2V0TW9vZFJhdGluZ3M6aSxzZXRQbHVnaW5Ob3RlVVVJRDpzLHNldFF1YXJ0ZXJseVBsYW5zOmwsc2V0V2Vla2x5VmljdG9yeVZhbHVlOnV9KXtLYyhlLnNldHRpbmdzPy5bSi5DT05TT0xFX0xPR0dJTkddKSxBKCJJbml0IHJldHVybnMiLGUsImluY2x1ZGluZyBtb29kUmF0aW5ncyIsZS5tb29kUmF0aW5ncyksbihlKSxpKGUubW9vZFJhdGluZ3MpLGwoZS5xdWFydGVybHlQbGFucykscihlLnNldHRpbmdzKSxhKGUuZGFpbHlWaWN0b3J5VmFsdWVzKSx1KGUud2Vla2x5VmljdG9yeVZhbHVlKSxvKGUuY3VycmVudERhdGUpLGUucGx1Z2luTm90ZVVVSUQmJnMoZS5wbHVnaW5Ob3RlVVVJRCksdC5jdXJyZW50PSEwfWFzeW5jIGZ1bmN0aW9uIEJOKGUsdCxuKXtsZXQgcj1WdCh0KSxvPXRsKHQpO1NkKCkmJihyPW5ldyBEYXRlKHIpLHIuc2V0RGF0ZShyLmdldERhdGUoKS03KSk7bGV0IGE9TWF0aC5mbG9vcihyLmdldFRpbWUoKS8xZTMpLGk9TWF0aC5mbG9vcihvLmdldFRpbWUoKS8xZTMpO3RyeXtsZXQgcz1hd2FpdCBlLmdldE1vb2RSYXRpbmdzKGEsaSk7QXJyYXkuaXNBcnJheShzKSYmbihzKX1jYXRjaChzKXtBKCJmZXRjaE1vb2RSYXRpbmdzOiBmYWlsZWQgdG8gbG9hZCBtb29kIHJhdGluZ3MiLHMpfX1mdW5jdGlvbiBXTihlLHQsbixyLG8sYSl7ZShyLG8sYSksYSYmKHQoYS5kYWlseVZpY3RvcnlWYWx1ZXMpLG4oYS53ZWVrbHlWaWN0b3J5VmFsdWUpKX1hc3luYyBmdW5jdGlvbiBITihlLHQsbixyLG8se2lzUmVzZXQ6YSxzaXppbmc6aX09e30pe2xldCBzPUFycmF5LmlzQXJyYXkodD8uW0ouREFTSEJPQVJEX0NPTVBPTkVOVFNdKT90W0ouREFTSEJPQVJEX0NPTVBPTkVOVFNdOlBvLGw9e307YXx8cy5mb3JFYWNoKGM9PntsW2Mud2lkZ2V0SWRdPWN9KTtsZXQgdT1vLm1hcChjPT57bGV0IGQ9bFtjXSxwPXluLmZpbmQodj0+di53aWRnZXRJZD09PWMpLGc9aT8uW2NdO3JldHVybnt3aWRnZXRJZDpjLGdyaWRXaWR0aFNpemU6Zz8uZ3JpZFdpZHRoU2l6ZT8/ZD8uZ3JpZFdpZHRoU2l6ZT8/cD8uZGVmYXVsdEdyaWRXaWR0aFNpemU/PzEsZ3JpZEhlaWdodFNpemU6Zz8uZ3JpZEhlaWdodFNpemU/P2Q/LmdyaWRIZWlnaHRTaXplPz8xLHNldHRpbmdzOmQ/LnNldHRpbmdzfHx7fX19KTthd2FpdCBlLnNldFNldHRpbmcoSi5EQVNIQk9BUkRfQ09NUE9ORU5UUyxKU09OLnN0cmluZ2lmeSh1KSksbihjPT4oey4uLmMsW0ouREFTSEJPQVJEX0NPTVBPTkVOVFNdOnV9KSkscih0bi5ERUZBVUxUKX1hc3luYyBmdW5jdGlvbiBqTihlLHQsbixyLG8sYSx7YXBpS2V5OmksYXBpS2V5UHJvdmlkZXI6cyxiYWNrZ3JvdW5kSW1hZ2VVcmw6bCxiYWNrZ3JvdW5kTW9kZTp1LGxsbVByb3ZpZGVyOmMsdGltZUZvcm1hdDpkLHdlZWtGb3JtYXQ6cH0pe0EoIltkYXNoYm9hcmRdIGhhbmRsZVNldHRpbmdzU2F2ZSBjYWxsZWQgd2l0aDoiLHtsbG1Qcm92aWRlcjpjLGFwaUtleVByb3ZpZGVyOnMsYmFja2dyb3VuZE1vZGU6dSxiYWNrZ3JvdW5kSW1hZ2VVcmw6bCE9bnVsbD8iKHNldCkiOiIodW5jaGFuZ2VkKSIsdGltZUZvcm1hdDpkLHdlZWtGb3JtYXQ6cH0pO2xldCBnPW5uKHN8fGMpLHY9W2Uuc2V0U2V0dGluZyhKLkxMTV9QUk9WSURFUl9NT0RFTCxjKSxlLnNldFNldHRpbmcoSi5CQUNLR1JPVU5EX0lNQUdFX1VSTCxsfHwiIildO2cmJmkmJnYucHVzaChlLnNldFNldHRpbmcoZyxpKSksbCYmdSYmdi5wdXNoKGUuc2V0U2V0dGluZyhKLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERSx1KSksdC5jdXJyZW50JiYoZHx8cCkmJnYucHVzaCh0LmN1cnJlbnQuc2F2ZSh7dGltZUZvcm1hdDpkLHdlZWtGb3JtYXQ6cH0pKTt0cnl7YXdhaXQgUHJvbWlzZS5hbGwodiksQSgiW2Rhc2hib2FyZF0gc2V0dGluZ3Mgc2F2ZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Iil9Y2F0Y2goYil7QSgiW2Rhc2hib2FyZF0gc2V0dGluZ3Mgc2F2ZSBGQUlMRUQ6IixiKX1lLnNldHRpbmdzW0ouTExNX1BST1ZJREVSX01PREVMXT1jLGcmJihlLnNldHRpbmdzW2ddPWkpO2xldCB5PXtbSi5MTE1fUFJPVklERVJfTU9ERUxdOmMsW0ouQkFDS0dST1VORF9JTUFHRV9VUkxdOmx8fCIiLFtKLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERV06bD91fHwiY292ZXIiOiIifTtnJiYoeVtnXT1pKSxuKGI9Pih7Li4uYiwuLi55fSkpLGQmJm8oZCkscCYmYShwKSxyKHRuLkRFRkFVTFQpfWZ1bmN0aW9uIFZOKGUsdCl7ZShuPT5bLi4ubnx8W10sdF0pfWZ1bmN0aW9uIHlwKHthcHA6ZX0pe2xldCB0PW5lLmNyZWF0ZUVsZW1lbnQse2FjdGl2ZVRhc2tEb21haW46bixidWlsZEFnZW5kYVRhc2tzQnlEYXRlOnIsaW5pdGlhbGl6ZURvbWFpblRhc2tzOm8sb25Eb21haW5DaGFuZ2U6YSxvcGVuVGFza3M6aSx0YXNrRG9tYWluczpzfT1zcCgpLHtjb21wbGV0ZWRUYXNrc0J5RGF0ZTpsLGZldGNoQ29tcGxldGVkVGFza3M6dX09bnAoZSksW2MsZF09KDAsbmUudXNlU3RhdGUpKG51bGwpLFtwLGddPSgwLG5lLnVzZVN0YXRlKShudWxsKSxbdix5XT0oMCxuZS51c2VTdGF0ZSkobnVsbCksW2IsaF09KDAsbmUudXNlU3RhdGUpKG51bGwpLFttLHddPSgwLG5lLnVzZVN0YXRlKSh0bi5ERUZBVUxUKSxbZixUXT0oMCxuZS51c2VTdGF0ZSkobnVsbCksW1MsRF09KDAsbmUudXNlU3RhdGUpKG51bGwpLFtOLENdPSgwLG5lLnVzZVN0YXRlKShudWxsKSxbeCxNXT0oMCxuZS51c2VTdGF0ZSkobnVsbCksW1AsT109KDAsbmUudXNlU3RhdGUpKCJtZXJpZGlhbiIpLFtSLFVdPSgwLG5lLnVzZVN0YXRlKSgic3VuZGF5IiksW0csUV09KDAsbmUudXNlU3RhdGUpKG51bGwpLHBlPSgwLG5lLnVzZVJlZikobnVsbCksX2U9KDAsbmUudXNlUmVmKSghMSk7KDAsbmUudXNlRWZmZWN0KSgoKT0+e2UuaW5pdCgpLnRoZW4oYXN5bmMgWT0+e2lmKFk/LmVycm9yKWgoWS5lcnJvcik7ZWxzZXtZPy5zZXR0aW5ncyYmKGUuc2V0dGluZ3M9WS5zZXR0aW5ncyksJE4oWSx7aW5pdERhdGFGcmVzaFJlZjpfZSxpbml0aWFsaXplRG9tYWluVGFza3M6byxzZXRDb25maWdQYXJhbXM6ZCxzZXRDdXJyZW50RGF0ZTpnLHNldERhaWx5VmljdG9yeVZhbHVlczp5LHNldE1vb2RSYXRpbmdzOlQsc2V0UGx1Z2luTm90ZVVVSUQ6RCxzZXRRdWFydGVybHlQbGFuczpDLHNldFdlZWtseVZpY3RvcnlWYWx1ZTpRfSkscGUuY3VycmVudD1uZXcgbGkoZSk7bGV0e3RpbWVGb3JtYXQ6ZmUsd2Vla0Zvcm1hdDpUZX09YXdhaXQgcGUuY3VycmVudC5sb2FkKCk7ZmUmJk8oZmUpLFRlJiZVKFRlKX19KS5jYXRjaChZPT5oKFkubWVzc2FnZSkpfSxbXSk7bGV0IEU9KDAsbmUudXNlTWVtbykoKCk9PntpZih4KXJldHVybiB4O2lmKCFwKXJldHVybiBudWxsO2lmKFNkKCkpe2xldCBZPVZ0KHApLGZlPW5ldyBEYXRlKFkpO3JldHVybiBmZS5zZXREYXRlKGZlLmdldERhdGUoKS0xKSxTdChmZSl9cmV0dXJuIHB9LFtwLHhdKSxrPSgwLG5lLnVzZUNhbGxiYWNrKShZPT5CTihlLFksVCksW2VdKTsoMCxuZS51c2VFZmZlY3QpKCgpPT57bGV0IFk9eHx8cDtZJiYoX2UuY3VycmVudD9fZS5jdXJyZW50PSExOmsoWSksbiYmKHUoWSxuKSxFJiZFIT09WSYmdShFLG4pKSl9LFtuLHAsdSxrLHgsRV0pO2xldCBGPSgwLG5lLnVzZUNhbGxiYWNrKSgoWSxmZSxUZSk9PldOKGEseSxRLFksZmUsVGUpLFthXSksVz0oMCxuZS51c2VDYWxsYmFjaykoKFksZmUpPT5ITihlLGMsZCx3LFksZmUpLFtlLGNdKSxIPSgwLG5lLnVzZUNhbGxiYWNrKShZPT5qTihlLHBlLGQsdyxPLFUsWSksW2VdKSxLPSgwLG5lLnVzZUNhbGxiYWNrKShZPT5WTihULFkpLFtdKSxxPSgwLG5lLnVzZU1lbW8pKCgpPT5wP3IocCk6e30sW3IscF0pLFY9KDAsbmUudXNlTWVtbykoKCk9PntsZXQgWT1jPy5bSi5EQVNIQk9BUkRfQ09NUE9ORU5UU107cmV0dXJuIEFycmF5LmlzQXJyYXkoWSkmJlkubGVuZ3RoPjA/WTpQb30sW2NdKSx7ZHJhZ2dpbmdXaWRnZXRJZDokLGRpc3BsYXllZENvbXBvbmVudHM6WH09VXYoVixXKSx0ZT0oMCxuZS51c2VDYWxsYmFjaykoKCk9PncodG4uU0VUVElOR1NfQ09ORklHKSxbXSk7aWYoYilyZXR1cm4gdCgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtZXJyb3IifSx0KCJoMiIsbnVsbCwiRGFzaGJvYXJkIEVycm9yIiksdCgicCIsbnVsbCxiKSk7aWYoIWMpcmV0dXJuIHQoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLW91dGVyLWNvbnRhaW5lciJ9LHQoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxvYWRpbmcifSx0KCJkaXYiLHtjbGFzc05hbWU6InNwaW5uZXIifSksdCgicCIsbnVsbCwiTG9hZGluZyBkYXNoYm9hcmQuLi4iKSkpO2xldCBaPWM/LltKLkJBQ0tHUk9VTkRfSU1BR0VfVVJMXSxzZT1jPy5bSi5CQUNLR1JPVU5EX0lNQUdFX01PREVdfHwiY292ZXIiLGJlPVp8fHdsKCJsYXJnZSIsU3QocHx8bmV3IERhdGUpKTtaJiZBKCJbZGFzaGJvYXJkXSBiYWNrZ3JvdW5kIGltYWdlIFVSTCBmcm9tIHNldHRpbmdzOiIsWiwibW9kZToiLHNlKTtsZXQgcmU9YmU/KCgpPT57bGV0IFk9c2Uuc3RhcnRzV2l0aCgicmVwZWF0Iik7cmV0dXJue2JhY2tncm91bmRJbWFnZTpgdXJsKCR7YmV9KWAsYmFja2dyb3VuZFNpemU6WT8iYXV0byI6c2UsYmFja2dyb3VuZFJlcGVhdDpZP3NlOiJuby1yZXBlYXQiLGJhY2tncm91bmRQb3NpdGlvbjoiY2VudGVyIixiYWNrZ3JvdW5kQXR0YWNobWVudDoiZml4ZWQifX0pKCk6dm9pZCAwO3JldHVybiB0KCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1vdXRlci1jb250YWluZXIiLHN0eWxlOnJlfSxtPT09dG4uTEFZT1VUX0NPTkZJRz90KEdkLHtjdXJyZW50TGF5b3V0OkFycmF5LmlzQXJyYXkoYz8uW0ouREFTSEJPQVJEX0NPTVBPTkVOVFNdKT9jW0ouREFTSEJPQVJEX0NPTVBPTkVOVFNdOlBvLG9uU2F2ZTpXLG9uQ2FuY2VsOigpPT53KHRuLkRFRkFVTFQpfSk6bnVsbCxtPT09dG4uU0VUVElOR1NfQ09ORklHPyhBKCJbZGFzaGJvYXJkXSByZW5kZXJpbmcgRGFzaGJvYXJkU2V0dGluZ3NQb3B1cCwgYmdVcmw6IixjPy5bSi5CQUNLR1JPVU5EX0lNQUdFX1VSTF0pLHQoUWQse2FwcDplLGNvbmZpZ1BhcmFtczpjLG9uQ2FuY2VsOigpPT53KHRuLkRFRkFVTFQpLG9uU2F2ZTpILHBsdWdpbk5vdGVVVUlEOlMsdGltZUZvcm1hdDpQLHdlZWtGb3JtYXQ6Un0pKTpudWxsLHQoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWNvbnRlbnQifSx0KCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC10b29sYmFyIn0sdChocCx7YWN0aXZlVGFza0RvbWFpbjpuLGFwcDplLGRvbWFpbnM6cyxvbkRvbWFpbkNoYW5nZTpGfSksdCgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtdG9vbGJhci1hY3Rpb25zIn0sdCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtY29uZmlndXJlLWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT57QSgiW2Rhc2hib2FyZF0gb3BlbmluZyBTZXR0aW5ncyBwb3B1cCIpLHcodG4uU0VUVElOR1NfQ09ORklHKX0sdGl0bGU6IkNvbmZpZ3VyZSBMTE0gcHJvdmlkZXIgYW5kIEFQSSBrZXkgZm9yIEFJLXBvd2VyZWQgZmVhdHVyZXMifSwiXHUyNjk5XHVGRTBGIFNldHRpbmdzIiksdCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtY29uZmlndXJlLWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT53KHRuLkxBWU9VVF9DT05GSUcpLHRpdGxlOiJDb25maWd1cmUgd2hpY2ggd2lkZ2V0cyBhcmUgc2hvd24gYW5kIGluIHdoYXQgb3JkZXIifSwiXHUyNjMwIExheW91dCIpKSksdCgiZGl2Iix7Y2xhc3NOYW1lOmBkYXNoYm9hcmQtZ3JpZCR7JD8iIGRhc2hib2FyZC1ncmlkLS1kcmFnZ2luZyI6IiJ9YH0sLi4uWC5tYXAoKFksZmUpPT57bGV0IFRlPVk/LndpZGdldElkfHxQb1tmZV0/LndpZGdldElkLFFlPVVOW1RlXTtpZighUWUpcmV0dXJuIG51bGw7bGV0IHN0PWM/LltKLkxMTV9QUk9WSURFUl9NT0RFTF0sQ2U9cHIoc3QpLFR0PUNlP25uKENlKTpudWxsLEVuPVR0JiZjPy5bVHRdfHwiIjtyZXR1cm4gdChRZSx7a2V5OlRlLGFnZW5kYVRhc2tzOnEsYXBwOmUsY29tcGxldGVkVGFza3NCeURhdGU6bCxjb25maWc6WSxjdXJyZW50RGF0ZTpwLGRhaWx5VmFsdWVzOnYsZHJhZ2dpbmdXaWRnZXRJZDokLG1vb2RSYXRpbmdzOmYsb25EYXRlU2VsZWN0Ok0sb25Nb29kUmVjb3JkZWQ6Syxvbk9wZW5TZXR0aW5nczp0ZSxvblJlZmVyZW5jZURhdGVDaGFuZ2U6TSxvcGVuVGFza3M6aSxwcm92aWRlckFwaUtleTpFbixwcm92aWRlckVtOkNlfHxzdHx8bnVsbCxxdWFydGVybHlQbGFuczpOLHJlZmVyZW5jZURhdGU6RSxzZWxlY3RlZERhdGU6eCx0aW1lRm9ybWF0OlAsd2Vla0Zvcm1hdDpSLHdlZWtseVRvdGFsOkd9KX0pLmZpbHRlcihCb29sZWFuKSkpKX0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7bGV0IG49TWF0aC5taW4oc2NyZWVuLndpZHRoLHNjcmVlbi5oZWlnaHQpLHI9d2luZG93Lm1hdGNoTWVkaWEoIihvcmllbnRhdGlvbjogbGFuZHNjYXBlKSIpLm1hdGNoZXM/TWF0aC5tYXgoc2NyZWVuLndpZHRoLHNjcmVlbi5oZWlnaHQpOm47aWYocj49d2luZG93LmlubmVyV2lkdGgpe2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5tYXhXaWR0aD0iIixkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYPSIiLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1g9IiI7cmV0dXJufWxldCBvPXIrInB4Ijtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUubWF4V2lkdGg9byxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYPSJoaWRkZW4iLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9byxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WD0iaGlkZGVuIn10KCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdCl9KSgpO3ZhciBHTj1Qbj9RYygpOm5ldyBQcm94eSh7c2V0dGluZ3M6e319LHtnZXQoZSx0KXtpZih0PT09InNldHRpbmdzIilyZXR1cm4gZS5zZXR0aW5ncztpZih0eXBlb2YgdCE9InN5bWJvbCIpcmV0dXJuKC4uLm4pPT53aW5kb3cuY2FsbEFtcGxlbm90ZVBsdWdpbih0LC4uLm4pfSxzZXQoZSx0LG4pe3JldHVybiBlW3RdPW4sITB9fSksS049KDAsZzAuY3JlYXRlUm9vdCkoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhc2hib2FyZC1yb290IikpO0tOLnJlbmRlcigoMCxoMC5jcmVhdGVFbGVtZW50KSh5cCx7YXBwOkdOfSkpO30pKCk7Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246CgpyZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgUmVhY3QKICAgKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpzY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpyZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCiovCg==";
var compiledCSS = `[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{border-radius:6px;font-size:.75rem;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.tippy-content{padding:8px 12px;position:relative;z-index:1}.tippy-arrow{color:var(--dashboard-color-tooltip-bg);height:16px;width:16px}.tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-theme~=dashboard]{background:var(--dashboard-color-tooltip-bg);box-shadow:0 4px 12px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);max-width:260px;min-width:180px}.tippy-box[data-theme~=dashboard]>.tippy-arrow{color:var(--dashboard-color-tooltip-bg)}.tippy-box[data-theme~=dashboard].below-chart>.tippy-content{max-height:40vh;overflow-y:auto}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-header{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-section{border-bottom:1px solid var(--dashboard-color-tooltip-border);margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row{align-items:baseline;display:flex;gap:8px;justify-content:space-between;padding:2px 0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label p{display:inline;margin:0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-value{color:var(--dashboard-color-tooltip-accent);flex-shrink:0;font-weight:600}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-empty{color:var(--dashboard-color-tooltip-text-muted);font-style:italic}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-date{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-entry{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 6px;padding:2px 0}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-time{color:var(--dashboard-color-tooltip-text-muted);font-size:.7rem;min-width:52px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-mood .mood-viz-label{color:var(--dashboard-color-tooltip-text-muted)}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-note{color:var(--dashboard-color-tooltip-text);flex-basis:100%;font-size:.7rem;font-style:italic;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-word}.widget .widget-body{overflow-y:auto}.widget-planning .planning-quarters{display:flex;flex-wrap:wrap;gap:16px;margin-bottom:16px}.widget-planning .quarter-card{border:2px dashed var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex:1 1 140px;flex-direction:column;gap:4px;min-width:0;padding:12px 16px;transition:background .15s,border-color .15s}.widget-planning .quarter-card:hover{border-color:var(--dashboard-color-blue)}.widget-planning .quarter-card--has-plan{background:var(--dashboard-color-plan-created-bg);border-color:var(--dashboard-color-plan-created-border);border-style:solid}.widget-planning .quarter-card--has-plan:hover{border-color:var(--dashboard-color-plan-created-border);filter:brightness(.97)}.widget-planning .quarter-card .quarter-label{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700}.widget-planning .quarter-card .quarter-status-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.widget-planning .quarter-card .quarter-status{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-planning .quarter-card .quarter-plan-indicator{cursor:default;flex-shrink:0;font-size:.85rem;line-height:1}.widget-planning .month-tabs{display:flex;flex-wrap:wrap;gap:4px}.widget-planning .month-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s,color .15s}.widget-planning .month-tab:hover{background:var(--dashboard-color-blue-light)}.widget-planning .month-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .month-content-area{border:1px solid var(--dashboard-color-border);border-radius:6px;margin-top:12px;overflow:hidden;padding:12px 16px}.widget-planning .month-content-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .month-content-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .month-content-text{color:var(--dashboard-color-text);font-size:.8rem;line-height:1.4}.widget-planning .month-content-text p{margin:0 0 4px}.widget-planning .month-content-text ol,.widget-planning .month-content-text ul{margin:0 0 4px;padding-left:16px}.widget-planning .month-content-text li{margin:0;padding:0}.widget-planning .month-content-text strong{color:var(--dashboard-color-navy)}.widget-planning .month-content-text>:last-child{margin-bottom:0}.widget-planning .month-content-empty{text-align:center}.widget-planning .create-month-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s}.widget-planning .create-month-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .planning-empty{color:var(--dashboard-color-text-muted);font-size:.85rem;font-style:italic;padding:16px 0;text-align:center}.widget-planning .weekly-plan-section{border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:12px}.widget-planning .weekly-plan-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .weekly-plan-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .create-week-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s;width:100%}.widget-planning .create-week-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .note-editor{display:flex;flex-direction:column;gap:8px;height:100%}.widget-planning .note-editor-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px}.widget-planning .note-editor-toolbar{display:flex;gap:8px}.widget-planning .note-editor-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;padding:4px 12px;transition:background .15s}.widget-planning .note-editor-btn:hover{background:var(--dashboard-color-blue-light)}.widget-planning .note-editor-btn--save{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .note-editor-btn--save:hover{filter:brightness(.92)}.widget-planning .note-editor-btn--save:disabled{cursor:default;opacity:.6}.widget-planning .note-editor-textarea{border:1px solid var(--dashboard-color-border);border-radius:6px;flex:1;font-family:monospace;font-size:.8rem;line-height:1.5;min-height:180px;padding:12px;resize:vertical}.rich-footnote-wrap{display:inline}.rich-footnote-indicator{cursor:default;display:inline-block;font-size:.65em;margin-left:2px;opacity:.65;vertical-align:super}.rich-footnote-indicator:hover{opacity:1}.tippy-box[data-theme~=rich-footnote]{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:10px;box-shadow:0 4px 16px var(--dashboard-color-overlay-shadow);color:var(--dashboard-color-text);font-size:.85rem;line-height:1.5;max-width:420px;min-width:200px}.tippy-box[data-theme~=rich-footnote]>.tippy-arrow{color:var(--dashboard-color-bg-card)}.tippy-box[data-theme~=rich-footnote]>.tippy-content{padding:12px}.rich-footnote-popup{display:flex;flex-direction:column;gap:8px}.rich-footnote-popup-url{align-items:center;display:flex;gap:4px}.rich-footnote-popup-url svg{color:var(--dashboard-color-accent);flex-shrink:0}.rich-footnote-popup-url a{color:var(--dashboard-color-link);overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rich-footnote-popup-url a:hover{text-decoration:underline}.rich-footnote-popup-text{color:var(--dashboard-color-text)}.rich-footnote-popup-media{border-radius:6px;overflow:hidden}.rich-footnote-popup-media img,.rich-footnote-popup-media video,.rich-footnote-popup-media iframe{display:block;max-width:100%;width:100%}.rich-footnote-popup-media iframe{aspect-ratio:16/9;border:0}.rich-footnote-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;justify-content:flex-end;padding-top:8px}.rich-footnote-popup-close{background:none;border:none;color:var(--dashboard-color-accent);cursor:pointer;font-size:.8rem;font-weight:600;letter-spacing:.5px;padding:4px 8px}.rich-footnote-popup-close:hover{opacity:.8}.widget-agenda a{color:var(--dashboard-color-link);text-decoration:none}.widget-agenda a:hover{text-decoration:underline}.widget-agenda img{max-width:100%}.widget-agenda .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-agenda .agenda-list{display:flex;flex:1;flex-direction:column;gap:12px;min-height:0;overflow-x:hidden;overflow-y:auto;padding-right:4px}.widget-agenda .agenda-day{display:flex;flex-direction:column;gap:4px}.widget-agenda .agenda-date-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.widget-agenda .agenda-empty-day{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:4px 0}.widget-agenda .agenda-item{align-items:center;display:flex;gap:12px;padding:8px 0}.widget-agenda .agenda-item .agenda-indicator{border-radius:2px;flex-shrink:0;height:36px;width:4px}.widget-agenda .agenda-item .agenda-indicator.priority-critical{background-color:var(--dashboard-color-agenda-priority-critical)}.widget-agenda .agenda-item .agenda-indicator.priority-important{background-color:var(--dashboard-color-agenda-priority-important)}.widget-agenda .agenda-item .agenda-indicator.priority-urgent{background-color:var(--dashboard-color-agenda-priority-urgent)}.widget-agenda .agenda-item .agenda-indicator.priority-normal{background-color:var(--dashboard-color-agenda-priority-normal)}.widget-agenda .agenda-item .agenda-content{display:flex;flex:1;flex-direction:column;gap:4px}.widget-agenda .agenda-item .agenda-content .agenda-time{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600}.widget-agenda .agenda-item .agenda-content .agenda-text{color:var(--dashboard-color-text);font-size:.85rem;overflow:hidden;white-space:nowrap}.widget-agenda .agenda-item .agenda-content .agenda-note-link{background:#0000;border:0;color:var(--dashboard-color-link);cursor:pointer;font-size:.72rem;margin:0;padding:0;text-align:left;text-decoration:underline}.widget-agenda .agenda-item .agenda-duration{color:var(--dashboard-color-text-muted);font-size:.7rem}.widget-agenda .agenda-task-row{border-radius:6px;cursor:pointer;padding:8px;transition:background-color .12s ease}.widget-agenda .agenda-task-row:hover{background:var(--dashboard-color-bg-page)}.widget-agenda .agenda-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-agenda .agenda-pagination{align-items:center;display:flex;gap:4px}.widget-agenda .agenda-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.65rem;line-height:1;padding:2px 4px}.widget-agenda .agenda-page-arrow:hover:not(:disabled){color:var(--dashboard-color-navy)}.widget-agenda .agenda-page-arrow:disabled{cursor:default;opacity:.3}.widget-agenda .agenda-page-indicator{color:var(--dashboard-color-text-muted);font-size:.7rem;white-space:nowrap}.widget-calendar.vertical-2-cell .cal-arrow{font-size:.9rem}.widget-calendar.vertical-2-cell .cal-month{font-size:1.1rem}.widget-calendar.vertical-2-cell .cal-header{font-size:.85rem}.widget-calendar.vertical-2-cell .cal-cell{padding-top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-day{font-size:16px;top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-dot{bottom:18%;height:6px;width:6px}.widget-calendar.horizontal-2-cell.vertical-1-cell .widget-body{display:flex;flex-direction:column;padding:8px 16px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-nav{margin-bottom:8px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-grid{flex:1}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-header{padding:2px 0}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-cell{aspect-ratio:auto;border-radius:12px}.widget-calendar .cal-nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.widget-calendar .cal-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px}.widget-calendar .cal-arrow:hover{color:var(--dashboard-color-navy)}.widget-calendar .cal-month{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700}.widget-calendar .cal-grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr);text-align:center}.widget-calendar .cal-header{color:var(--dashboard-color-text-muted);font-size:.7rem;font-weight:600;padding:4px 0}.widget-calendar .cal-cell{align-items:center;aspect-ratio:1;border-radius:50%;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:4px 0;position:relative;transition:background-color .12s ease}.widget-calendar .cal-cell:not(.empty):hover{background:var(--dashboard-color-blue-light)}.widget-calendar .cal-cell.empty{cursor:default;visibility:hidden}.widget-calendar .cal-cell.today{background:var(--dashboard-color-blue)}.widget-calendar .cal-cell.today .cal-day{color:var(--dashboard-color-text-on-accent);font-weight:700}.widget-calendar .cal-cell.today:hover{background:var(--dashboard-color-navy)}.widget-calendar .cal-cell.selected{outline:2px solid var(--dashboard-color-accent);outline-offset:0}.widget-calendar .cal-cell.today.selected{outline-color:var(--dashboard-color-accent)}.widget-calendar .cal-cell .cal-day{color:var(--dashboard-color-text);font-size:.8rem;position:relative;top:-2px}.widget-calendar .cal-cell .cal-dot{border-radius:50%;bottom:6px;height:4px;position:absolute;width:4px}.dashboard-layout-popup{display:flex;flex-direction:column;margin:16px;max-height:min(800px,100vh - 32px);max-width:min(800px,100vw - 32px);min-width:0;width:100%}.dashboard-layout-popup .dashboard-layout-popup-tabs{display:flex;gap:4px;margin-top:12px}.dashboard-layout-popup .dashboard-layout-popup-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s ease,color .15s ease}.dashboard-layout-popup .dashboard-layout-popup-tab:hover{background:var(--dashboard-color-blue-light)}.dashboard-layout-popup .dashboard-layout-popup-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.dashboard-layout-popup .dashboard-layout-popup-body{display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:16px}.dashboard-layout-popup .dashboard-layout-popup-section{border:2px dashed rgba(0,0,0,0);border-radius:10px;padding:4px;transition:border-color .15s ease,background .15s ease}.dashboard-layout-popup .dashboard-layout-popup-section--drag-over{background:var(--dashboard-color-blue-light);border-color:var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-section-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;margin-bottom:8px;padding-bottom:8px}.dashboard-layout-popup .dashboard-layout-popup-section-icon{flex-shrink:0;font-size:.9rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-section-title{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:700;letter-spacing:.05em;margin:0;text-transform:uppercase}.dashboard-layout-popup .dashboard-layout-popup-list{display:flex;flex-direction:column;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-item{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:grab;display:flex;gap:8px;padding:8px 12px;transition:opacity .12s ease,box-shadow .12s ease,background .12s ease;-webkit-user-select:none;user-select:none}.dashboard-layout-popup .dashboard-layout-popup-item:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item--dragging{opacity:.35}.dashboard-layout-popup .dashboard-layout-popup-item--drag-over{background:var(--dashboard-color-bg-card);box-shadow:0 -2px 0 var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-item-handle{color:var(--dashboard-color-text-muted);cursor:grab;flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-handle:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item-icon{flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-info{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0;overflow:hidden}.dashboard-layout-popup .dashboard-layout-popup-item-name{color:var(--dashboard-color-text);font-size:.875rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-description{color:var(--dashboard-color-text-secondary);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-actions{display:flex;flex-shrink:0;gap:2px}.dashboard-layout-popup .dashboard-layout-popup-arrow-button{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;line-height:1;padding:3px 7px;transition:background .1s ease,color .1s ease}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:hover:not(:disabled){background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:disabled{cursor:not-allowed;opacity:.3}.dashboard-layout-popup .dashboard-layout-popup-empty{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px 8px;text-align:center}.dashboard-layout-popup .dashboard-layout-popup-sizing{display:flex;flex-direction:column;gap:8px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;align-items:center;gap:12px;padding:8px 12px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-header{align-items:center;display:flex;gap:8px;flex:1;min-width:0}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-controls{display:flex;flex-shrink:0;gap:16px}.dashboard-layout-popup .dashboard-layout-popup-sizing-field{align-items:center;display:flex;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-sizing-label{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-sizing-select{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;padding:4px 8px}.dashboard-layout-popup .config-popup-actions .config-popup-link{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;margin-right:auto;padding:0;text-decoration:underline}.dashboard-layout-popup .config-popup-actions .config-popup-link:hover{color:var(--dashboard-color-text)}.dashboard-toolbar{align-items:center;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;margin-bottom:16px}.dashboard-toolbar .dashboard-toolbar-actions{align-items:center;display:flex;background-color:var(--dashboard-color-bg-card);border-radius:6px;border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);flex-shrink:0;padding:8px}.dashboard-toolbar .dashboard-configure-button{background-color:var(--dashboard-color-bg-card);border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;font-weight:500;padding:4px 12px;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.dashboard-toolbar .dashboard-configure-button:hover{background:var(--dashboard-color-bg-page);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text)}.config-popup-overlay{align-items:center;background:var(--dashboard-color-overlay-backdrop);display:flex;inset:0;justify-content:center;position:fixed;z-index:1000}.config-popup-container{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;box-shadow:0 8px 32px var(--dashboard-color-overlay-shadow);max-width:90%;min-width:320px;width:650px}.config-popup-container .explanation-paragraph{font-size:14px;margin:12px 0 20px}.config-popup-container .config-popup-header{border-bottom:1px solid var(--dashboard-color-border);padding:16px}.config-popup-container .config-popup-title{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700;margin:0}.config-popup-container .config-popup-body{padding:16px}.config-popup-container .config-popup-body label{align-items:center;color:var(--dashboard-color-text);cursor:pointer;display:flex;font-size:.85rem;gap:8px;padding:4px 0}.config-popup-container .config-popup-body input[type=radio],.config-popup-container .config-popup-body input[type=checkbox]{accent-color:var(--dashboard-color-accent)}.config-popup-container .config-popup-body .config-field{margin-bottom:12px}.config-popup-container .config-popup-body .config-field .config-line{margin-bottom:10px;margin-top:10px}.config-popup-container .config-popup-body .config-field:last-child{margin-bottom:0}.config-popup-container .config-popup-body .config-field-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.03em;margin-bottom:4px;text-transform:uppercase}.config-popup-container .config-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.config-popup-container .config-popup-actions>button{padding-left:8px;padding-right:8px}.config-popup-container .config-popup-btn{border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;font-weight:600;padding:8px 16px}.config-popup-container .config-popup-btn--cancel{background:#0000;color:var(--dashboard-color-text-secondary)}.config-popup-container .config-popup-btn--cancel:hover{background:var(--dashboard-color-bg-page-hover)}.config-popup-container .config-popup-btn--submit{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent)}.config-popup-container .config-popup-btn--submit:hover{opacity:.9}.dashboard-settings-container .dashboard-settings-section{display:flex;flex-direction:column}.dashboard-settings-container .dashboard-settings-section.section:not(:first-child){border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:16px}.dashboard-settings-container .dashboard-settings-section-header{display:flex;flex-direction:column;gap:4px}.dashboard-settings-container .dashboard-settings-section-title{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;letter-spacing:.02em;margin:0}.dashboard-settings-container .dashboard-settings-section-desc{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.5;margin:0}.dashboard-settings-container .dashboard-settings-select{-webkit-appearance:none;appearance:none;background:var(--dashboard-color-bg-page);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.85rem;padding:8px 24px 8px 8px;transition:border-color .15s ease;width:100%}.dashboard-settings-container .dashboard-settings-select:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-dropzone{align-items:center;background:var(--dashboard-color-bg-page);border:2px dashed var(--dashboard-color-border);border-radius:6px;cursor:pointer;display:flex;flex-direction:column;gap:8px;justify-content:center;min-height:120px;padding:16px;text-align:center;transition:border-color .15s ease,background .15s ease}.dashboard-settings-container .dashboard-settings-dropzone:hover{border-color:var(--dashboard-color-accent)}.dashboard-settings-container .dashboard-settings-dropzone--active{background:#00000008;border-color:var(--dashboard-color-accent);border-style:solid}.dashboard-settings-container .dashboard-settings-dropzone--uploading{cursor:wait;opacity:.7}.dashboard-settings-container .dashboard-settings-dropzone-input{display:none}.dashboard-settings-container .dashboard-settings-dropzone-text{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-settings-container .dashboard-settings-dropzone-preview{align-items:center;display:flex;flex-direction:column;gap:8px}.dashboard-settings-container .dashboard-settings-dropzone-preview-img{border-radius:6px;max-height:80px;max-width:100%;object-fit:contain}.dashboard-settings-container .dashboard-settings-remove-image{color:var(--dashboard-color-danger);cursor:pointer;display:inline-block;font-size:.8rem;margin-top:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-remove-image:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-hint{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0 0 4px}.dashboard-settings-container .dashboard-settings-api-key-link{color:var(--dashboard-color-link);display:inline-block;font-size:.8rem;margin-bottom:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-api-key-link:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-input-row{align-items:center;display:flex;gap:4px}.dashboard-settings-container .dashboard-settings-api-key-input{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1;font-family:monospace;font-size:.82rem;min-width:0;padding:8px;transition:border-color .15s ease}.dashboard-settings-container .dashboard-settings-api-key-input::placeholder{color:var(--dashboard-color-text-muted)}.dashboard-settings-container .dashboard-settings-api-key-input:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-api-key-toggle{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:.9rem;line-height:1;padding:8px;transition:background .1s ease,color .1s ease}.dashboard-settings-container .dashboard-settings-api-key-toggle:hover{background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.widget-dream-task .dream-task-header-actions{align-items:center;display:flex;gap:8px}.widget-dream-task .dream-task-list{display:flex;flex-direction:column;gap:12px}.widget-dream-task .dream-task-llm-attribution{color:var(--dashboard-color-text-secondary);font-size:.7rem;line-height:1.4;padding-top:8px}.widget-dream-task .dream-task-goals-summary{border-bottom:1px solid var(--dashboard-color-border);margin-bottom:8px;padding-bottom:12px}.widget-dream-task .dream-task-goals-text{color:var(--dashboard-color-text-secondary);font-size:.8rem;font-style:italic;line-height:1.5;margin:0}.widget-dream-task .dream-task-card{border:1px solid var(--dashboard-color-border);border-radius:10px;opacity:1;padding:12px 16px;transition:border-color .15s ease,opacity .28s ease,transform .28s ease}.widget-dream-task .dream-task-card:hover{border-color:var(--dashboard-color-blue-light)}.widget-dream-task .dream-task-card--dismissing{opacity:0;pointer-events:none;transform:translateY(6px) scale(.98)}.widget-dream-task .dream-task-card-header{align-items:flex-start;display:flex;gap:8px;justify-content:space-between;margin-bottom:8px}.widget-dream-task .dream-task-card-title{color:var(--dashboard-color-navy);font-size:.9rem;font-weight:600;line-height:1.3}.widget-dream-task .dream-task-card-title--clickable{cursor:pointer}.widget-dream-task .dream-task-card-title--clickable:hover{color:var(--dashboard-color-blue);text-decoration:underline}.widget-dream-task .dream-task-rating{border-radius:6px;flex-shrink:0}.widget-dream-task .dream-task-rating--high{background:#22c55e1f;color:var(--dashboard-color-success)}.widget-dream-task .dream-task-rating--medium{background:#eab3081f;color:var(--dashboard-color-warning)}.widget-dream-task .dream-task-rating--low{background:#ef44441f;color:var(--dashboard-color-danger)}.widget-dream-task .dream-task-card--invented{border-left:2px solid var(--dashboard-color-blue-light)}.widget-dream-task .dream-task-new-badge{background:#4a9eff1f;border-radius:6px;color:var(--dashboard-color-blue);flex-shrink:0}.widget-dream-task .dream-task-source-note-badge{background:#7c3aed1a;border-radius:6px;color:var(--dashboard-color-navy);flex-shrink:0;font-size:11px;font-weight:600;max-width:11rem;overflow:hidden;padding:2px 4px;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.widget-dream-task .dream-task-new-badge,.widget-dream-task .dream-task-rating{font-size:11px;font-weight:700;padding:2px 4px;text-transform:uppercase;white-space:nowrap}.widget-dream-task .dream-task-card-explanation{color:var(--dashboard-color-text-secondary);cursor:pointer;display:-webkit-box;font-size:.8rem;line-height:1.5;margin:0;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:3}.widget-dream-task .dream-task-card-explanation--expanded{display:block;overflow:visible;text-overflow:clip;-webkit-box-orient:initial;-webkit-line-clamp:initial}.widget-dream-task .dream-task-card-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.widget-dream-task .dream-task-card-action{color:var(--dashboard-color-link);cursor:pointer;font-size:.75rem;font-weight:600;text-decoration:none}.widget-dream-task .dream-task-card-action:hover{text-decoration:underline}.widget-dream-task .dream-task-no-config{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px 16px;text-align:center}.widget-dream-task .dream-task-no-config-text{color:var(--dashboard-color-text-secondary);font-size:.85rem;line-height:1.5;margin:0}.widget-dream-task .dream-task-settings-link{color:var(--dashboard-color-link);font-weight:600;text-decoration:none}.widget-dream-task .dream-task-settings-link:hover{text-decoration:underline}.widget-dream-task .dream-task-loading{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px;text-align:center}.widget-dream-task .dream-task-loading p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.widget-dream-task .dream-task-spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:24px;width:24px}.widget-dream-task .dream-task-error{padding:16px;text-align:center}.widget-dream-task .dream-task-error p{color:var(--dashboard-color-danger);font-size:.85rem;margin:0 0 12px}.widget-dream-task .dream-task-empty{padding:16px;text-align:center}.widget-dream-task .dream-task-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0 0 12px}.widget-dream-task .dream-task-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 12px}.widget-dream-task .dream-task-retry:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.widget-day-sketch .widget-body{display:flex;flex-direction:column;overflow:hidden;padding:0}.widget-day-sketch .day-sketch-notebook{background-color:#fffef5;background-image:repeating-linear-gradient(transparent,transparent 33px,#b8d4e8 33px,#b8d4e8 34px);background-attachment:local;background-position:0 0;background-size:100% 34px;border-left:3px solid #e88e8e;flex:1;margin-left:0;min-height:0;overflow-y:auto;padding:0 8px 0 0}.widget-day-sketch .day-sketch-line{align-items:center;display:flex;height:34px;padding-left:4px;position:relative}.widget-day-sketch .day-sketch-hour-label{color:#a0a0a0;flex-shrink:0;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.78rem;font-weight:700;letter-spacing:.02em;text-align:right;text-transform:lowercase;-webkit-user-select:none;user-select:none;width:64px;padding-right:8px}.widget-day-sketch .day-sketch-input{background:#0000;border:none;color:#333;flex:1;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.88rem;height:100%;line-height:34px;outline:none;padding:0 4px}.widget-day-sketch .day-sketch-input::placeholder{color:#0000}.widget-day-sketch .day-sketch-input:focus{background:#b8d4e81f}.widget-day-sketch .day-sketch-loading{align-items:center;color:var(--dashboard-color-text-muted);display:flex;font-size:.85rem;height:100%;justify-content:center;padding:24px}.widget-day-sketch .day-sketch-save-btn{background:none;border:1px solid var(--dashboard-color-blue);border-radius:6px;color:var(--dashboard-color-blue);cursor:pointer;font-size:.72rem;font-weight:600;padding:2px 8px;transition:background .15s ease,color .15s ease}.widget-day-sketch .day-sketch-save-btn:hover:not(:disabled){background:var(--dashboard-color-blue);color:var(--dashboard-color-text-on-accent)}.widget-day-sketch .day-sketch-save-btn--disabled{border-color:var(--dashboard-color-text-muted);color:var(--dashboard-color-text-muted);cursor:default;opacity:.5}@media (prefers-color-scheme: dark){.widget-day-sketch .day-sketch-notebook{background-color:#2a2923;background-image:repeating-linear-gradient(transparent,transparent 33px,#4a5568 33px,#4a5568 34px);border-left-color:#7c4444}.widget-day-sketch .day-sketch-hour-label{color:#6b7280}.widget-day-sketch .day-sketch-input{color:#e2e0d8}.widget-day-sketch .day-sketch-input:focus{background:#4a556826}}.widget-peak-hours .peak-hours-metrics-grid{display:grid;gap:12px;grid-template-columns:repeat(3,1fr);margin-bottom:16px}.widget-peak-hours .peak-hours-metric-card{background:var(--dashboard-color-bg-page);border-radius:10px;padding:12px 16px}.widget-peak-hours .peak-hours-metric-label{color:var(--dashboard-color-text-secondary);font-size:.8rem;margin-bottom:4px}.widget-peak-hours .peak-hours-metric-value{color:var(--dashboard-color-navy);font-size:1.25rem;font-weight:600}.widget-peak-hours .peak-hours-legend{color:var(--dashboard-color-text-secondary);display:flex;flex-wrap:wrap;font-size:.75rem;gap:16px;margin-bottom:8px}.widget-peak-hours .peak-hours-legend-item{align-items:center;display:flex;gap:4px}.widget-peak-hours .peak-hours-legend-swatch{border-radius:2px;display:inline-block;height:10px;width:10px}.widget-peak-hours .peak-hours-legend-swatch--created{background:var(--dashboard-color-blue)}.widget-peak-hours .peak-hours-legend-swatch--completed{background:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-chart-container{height:220px;position:relative;width:100%}.widget-peak-hours .peak-hours-canvas{display:block;height:100%;width:100%}.widget-peak-hours .peak-hours-tooltip{background:var(--dashboard-color-tooltip-bg);border:1px solid var(--dashboard-color-tooltip-border);border-radius:6px;box-shadow:0 2px 8px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);font-size:.75rem;padding:8px 12px;pointer-events:none;position:absolute;white-space:nowrap;z-index:10}.widget-peak-hours .peak-hours-tooltip-header{font-weight:600;margin-bottom:4px}.widget-peak-hours .peak-hours-tooltip-label--created{color:var(--dashboard-color-tooltip-accent)}.widget-peak-hours .peak-hours-tooltip-label--completed{color:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-footer{color:var(--dashboard-color-text-muted);font-size:.75rem;margin-top:12px;text-align:center}.widget-peak-hours .peak-hours-empty{padding:24px;text-align:center}.widget-peak-hours .peak-hours-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.vertical-1-cell .widget-peak-hours .peak-hours-metrics-grid{gap:8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-card{padding:4px 8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-label{font-size:.7rem;margin-bottom:0}.vertical-1-cell .widget-peak-hours .peak-hours-metric-value{font-size:1rem}.vertical-1-cell .widget-peak-hours .peak-hours-legend{margin-bottom:4px}.vertical-1-cell .widget-peak-hours .peak-hours-chart-container{height:160px}.vertical-1-cell .widget-peak-hours .peak-hours-footer{margin-top:8px}.horizontal-2-cell .widget-peak-hours .peak-hours-chart-container{height:220px}.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:380px}.horizontal-2-cell.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:440px}@keyframes mood-fadeout{0%{opacity:1}to{opacity:0}}.widget-mood .mood-selector{display:flex;gap:8px;justify-content:center;margin-bottom:16px}.widget-mood .mood-btn{align-items:center;background:none;border:2px solid rgba(0,0,0,0);border-radius:50%;cursor:pointer;display:flex;height:44px;justify-content:center;transition:border-color .15s,transform .15s;width:44px}.widget-mood .mood-btn:hover{border-color:var(--dashboard-color-blue);transform:scale(1.15)}.widget-mood .mood-btn--selected{border-color:var(--dashboard-color-blue);background:var(--dashboard-color-blue-light);transform:scale(1.15)}.widget-mood .mood-btn .mood-emoji{font-size:1.5rem}.widget-mood .mood-details{margin-bottom:12px}.widget-mood .mood-details-label{color:var(--dashboard-color-text-secondary);display:block;font-size:.8rem;margin-bottom:4px}.widget-mood .mood-details-textarea{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.85rem;padding:8px;resize:vertical;width:100%}.widget-mood .mood-details-textarea:focus{border-color:var(--dashboard-color-blue);outline:none}.widget-mood .mood-details-textarea::placeholder{color:var(--dashboard-color-text-muted)}.widget-mood .mood-submit-row{display:flex;gap:8px;margin-bottom:16px}.widget-mood .mood-submit-btn{background:var(--dashboard-color-blue);border:none;border-radius:6px;color:var(--dashboard-color-text-on-accent);cursor:pointer;flex:1;font-size:.85rem;font-weight:600;padding:8px 16px;transition:opacity .15s}.widget-mood .mood-submit-btn:hover:not(:disabled){opacity:.9}.widget-mood .mood-submit-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-cancel-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.85rem;font-weight:600;padding:8px 16px;transition:border-color .15s,color .15s}.widget-mood .mood-cancel-btn:hover:not(:disabled){border-color:var(--dashboard-color-text-secondary);color:var(--dashboard-color-text)}.widget-mood .mood-cancel-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-confirmation{align-items:center;animation:mood-fadeout 1s ease-out 4s forwards;display:flex;flex-direction:column;gap:8px;margin-bottom:16px;padding:16px 0}.widget-mood .mood-confirmation-icon{font-size:2.5rem}.widget-mood .mood-confirmation-text{color:var(--dashboard-color-success);font-size:.9rem;font-weight:600}.widget-mood .mood-summary{color:var(--dashboard-color-text-secondary);font-size:.8rem;text-align:center}.widget-mood .mood-sparkline{align-items:flex-end;display:flex;gap:3px;height:24px;justify-content:center;margin-top:8px}.widget-mood .mood-dot{background:var(--dashboard-color-blue);border-radius:2px;min-height:4px;position:relative;width:4px}.widget-mood .mood-viz-section{align-items:center;display:flex;flex-direction:column;gap:4px;margin-top:8px}.widget-mood .mood-viz-canvas-wrap{border-radius:10px;line-height:0;overflow:visible;position:relative}.widget-mood .mood-viz-canvas{border-radius:10px;display:block;height:220px;width:220px}.widget-mood .mood-viz-configure-link{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.75rem;padding:4px 8px;transition:color .15s}.widget-mood .mood-viz-configure-link:hover{color:var(--dashboard-color-text-secondary)}.widget-mood .mood-viz-config-option{align-items:center;cursor:pointer;display:flex;font-size:.9rem;gap:8px;padding:4px 0}.widget-mood .mood-viz-config-option input[type=radio]{accent-color:var(--dashboard-color-blue);cursor:pointer}.widget-quotes .widget-body{display:flex;flex-direction:column}.widget-quotes .quotes-grid{display:grid;flex:1;gap:16px;grid-template-columns:1fr 1fr}.widget-quotes .quote-tile{background-position:center;background-size:cover;border-radius:10px;color:var(--dashboard-color-text-on-accent);display:flex;flex-direction:column;justify-content:flex-end;min-height:150px;padding:24px 16px}.widget-quotes .quote-tile .quote-text{font-family:Georgia,Times New Roman,serif;font-size:.95rem;font-style:italic;line-height:1.5;margin:0 0 8px}.widget-quotes .quote-tile .quote-author{font-size:.75rem;opacity:.85}.widget-quotes .quotes-loading{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-quick-actions .qa-grid{display:grid;gap:8px;grid-template-columns:1fr 1fr}.widget-quick-actions .qa-button{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex-direction:column;gap:8px;padding:16px 8px;transition:background .15s}.widget-quick-actions .qa-button:hover{background:var(--dashboard-color-bg-page-hover)}.widget-quick-actions .qa-button .qa-icon{font-size:1.4rem}.widget-quick-actions .qa-button .qa-label{color:var(--dashboard-color-text);font-size:.75rem;font-weight:500}.widget-recent-notes .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-recent-notes .note-list{display:flex;flex:1;flex-direction:column;gap:4px;list-style:none;min-height:0;overflow-y:auto}.widget-recent-notes .note-item{display:flex}.widget-recent-notes .note-item:hover{background-color:var(--dashboard-color-bg-page)}.widget-recent-notes .note-link{align-items:center;background:none;border:none;border-radius:6px;color:inherit;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:space-between;padding:8px 12px;text-align:left;width:100%}.widget-recent-notes .note-name{color:var(--dashboard-color-text);flex:1;font-size:.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-recent-notes .note-count{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-recent-notes .note-loading,.widget-recent-notes .note-empty,.widget-recent-notes .note-error{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-recent-notes .note-error{color:var(--dashboard-color-danger)}.dashboard-toolbar .task-domains{align-items:center;background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;gap:12px;padding:8px 12px}.dashboard-toolbar .task-domains-list{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:8px}.dashboard-toolbar .task-domain-item{align-items:center;border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;display:inline-flex;font-size:.8rem;font-weight:500;gap:4px;padding:4px 12px;transition:all .15s ease}.dashboard-toolbar .task-domain-item:hover{background:var(--dashboard-color-blue-light);color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domain-item.active{background:var(--dashboard-color-navy);border-color:var(--dashboard-color-navy);color:var(--dashboard-color-bg-card)}.dashboard-toolbar .task-domain-item.active .task-domain-settings{color:var(--dashboard-color-text-on-accent-muted)}.dashboard-toolbar .task-domain-item.active .task-domain-settings:hover{color:var(--dashboard-color-text-on-accent)}.dashboard-toolbar .task-domain-name{-webkit-user-select:none;user-select:none}.dashboard-toolbar .task-domain-settings{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.85rem;line-height:1;padding:0}.dashboard-toolbar .task-domain-settings:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;white-space:nowrap}@media (max-width: 800px){.dashboard-toolbar .task-domains-refresh{display:none}}.dashboard-toolbar .task-domains-refresh:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh:disabled{cursor:default;opacity:.5}.dashboard-toolbar .task-domains-empty{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-toolbar .task-domains--empty .task-domains-empty{flex:1 1 100%;font-weight:500}.widget-victory-value .widget-body{display:flex;flex-direction:column;justify-content:space-between}.widget-victory-value .vv-header{align-items:baseline;display:flex;gap:8px;margin-bottom:8px}.widget-victory-value .vv-header .vv-total{color:var(--dashboard-color-navy);font-size:2rem;font-weight:700}.widget-victory-value .vv-header .vv-label{color:var(--dashboard-color-text-secondary);font-size:.8rem}.widget-victory-value .vv-date-range{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:400}.widget-victory-value .vv-chart-container{align-items:center;display:flex;gap:4px}.widget-victory-value .vv-chart-wrap{flex:1;min-width:0;position:relative}.widget-victory-value .vv-chart{border-radius:6px;display:block;width:100%}.widget-victory-value .vv-nav-arrow{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:1.25rem;line-height:1;padding:4px 8px;transition:background .15s,color .15s}.widget-victory-value .vv-nav-arrow:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);color:var(--dashboard-color-navy)}.widget-victory-value .vv-nav-arrow:disabled{cursor:not-allowed;opacity:.3}.vertical-1-cell .widget-victory-value .vv-chart{height:180px}.horizontal-2-cell .widget-victory-value .vv-chart{height:260px}.vertical-2-cell .widget-victory-value .vv-chart{height:380px}.horizontal-2-cell.vertical-2-cell .widget-victory-value .vv-chart{height:460px}:root{--dashboard-color-accent: #e8853d;--dashboard-color-agenda-priority-critical: #e85353;--dashboard-color-agenda-priority-important: #e8853d;--dashboard-color-agenda-priority-normal: #7a8699;--dashboard-color-agenda-priority-urgent: #5b7bbf;--dashboard-color-bg-card: #ffffff;--dashboard-color-bg-page: #eef1f5;--dashboard-color-bg-page-hover: #e6ebf2;--dashboard-color-blue: #5b7bbf;--dashboard-color-blue-light: #e8edf5;--dashboard-color-border: #d8dde6;--dashboard-color-danger: #e85353;--dashboard-color-info: #5b7bbf;--dashboard-color-link: #5b7bbf;--dashboard-color-navy: #2c3e6b;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .4);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .15);--dashboard-color-success: #4caf80;--dashboard-color-text: #1e2a3a;--dashboard-color-text-muted: #a3aebb;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #7a8699;--dashboard-color-tooltip-accent: #5b7bbf;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .3);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #e8853d;--dashboard-color-plan-created-bg: rgba(76, 175, 128, .08);--dashboard-color-plan-created-border: #4caf80}@media (prefers-color-scheme: dark){:root{--dashboard-color-accent: #ffb36b;--dashboard-color-agenda-priority-critical: #ff7a7a;--dashboard-color-agenda-priority-important: #ffb36b;--dashboard-color-agenda-priority-normal: #a3b0c4;--dashboard-color-agenda-priority-urgent: #8fb2ff;--dashboard-color-bg-card: #1f2937;--dashboard-color-bg-page: #111827;--dashboard-color-bg-page-hover: #1a2436;--dashboard-color-blue: #8fb2ff;--dashboard-color-blue-light: #253553;--dashboard-color-border: #374151;--dashboard-color-danger: #ff7a7a;--dashboard-color-info: #8fb2ff;--dashboard-color-link: #60a5fa;--dashboard-color-navy: #c5d8ff;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .5);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .4);--dashboard-color-success: #73d4a3;--dashboard-color-text: #e5ecf5;--dashboard-color-text-muted: #95a3b8;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #b6c0cf;--dashboard-color-tooltip-accent: #a5b4fc;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .5);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #ffb36b;--dashboard-color-plan-created-bg: rgba(115, 212, 163, .1);--dashboard-color-plan-created-border: #73d4a3}}html{overflow-y:scroll}html *,html *:before,html *:after{box-sizing:border-box;margin:0;padding:0}html body{-webkit-font-smoothing:antialiased;background:var(--dashboard-color-bg-page);color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}.dashboard-outer-container{min-height:100vh;overflow-x:hidden;position:relative;width:100%}.dashboard-outer-container .dashboard-content{margin:0 auto;max-width:1200px;padding:24px}.dashboard-outer-container .dashboard-content .dashboard-grid{display:grid;gap:16px;grid-template-columns:repeat(4,1fr)}.dashboard-outer-container .dashboard-content .grid-cell{--drag-scale: 1;--flip-x: 0px;--flip-y: 0px;opacity:.95;min-width:0;transform:translate(var(--flip-x),var(--flip-y)) scale(var(--drag-scale));transition:opacity .3s ease,transform .22s ease;will-change:transform}.dashboard-outer-container .dashboard-content .grid-cell:hover{opacity:1}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell{grid-column:span 2}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell{grid-column:span 3}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 4}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell{max-height:400px;min-height:300px}.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 2;max-height:800px;min-height:600px}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-active{cursor:grabbing}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--dragging-ready{animation:widget-wobble .35s ease-in-out infinite alternate;opacity:1;z-index:3}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-shift{--drag-scale: .985}@media (max-width: 800px){.dashboard-outer-container .dashboard-content{padding:12px}.dashboard-outer-container .dashboard-content .dashboard-grid{grid-template-columns:1fr}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 1}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell,.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 1;max-height:none;min-height:auto}}.dashboard-outer-container .widget{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;display:flex;flex-direction:column;height:100%;max-width:100%;overflow:hidden}.dashboard-outer-container .widget-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding:12px 16px}.dashboard-outer-container .widget-heading-bar{-webkit-user-select:none;user-select:none}.dashboard-outer-container .widget-heading-bar.widget-heading-bar--drag-ready{cursor:grabbing}.dashboard-outer-container .widget-icon{font-size:1rem}.dashboard-outer-container .widget-title{align-items:baseline;color:var(--dashboard-color-navy);display:flex;flex:1;font-size:.85rem;font-weight:700;gap:8px;letter-spacing:.03em;margin:0;text-transform:uppercase}.dashboard-outer-container .widget-title__subtitle{color:var(--dashboard-color-text-muted);font-size:.75rem;font-weight:400;letter-spacing:.01em;text-transform:none}.dashboard-outer-container .widget-configure,.dashboard-outer-container .widget-header-action{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px}.dashboard-outer-container .widget-configure:hover,.dashboard-outer-container .widget-header-action:hover{color:var(--dashboard-color-navy)}.dashboard-outer-container .widget-body{flex:1;padding:16px}.dashboard-outer-container .dashboard-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:16px;height:100vh;justify-content:center;width:100%}.dashboard-outer-container .dashboard-loading .spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:32px;width:32px}.dashboard-outer-container .dashboard-error{color:var(--dashboard-color-danger);padding:40px;text-align:center}.dashboard-outer-container .dashboard-error p{color:var(--dashboard-color-text-secondary);margin-top:8px}.dashboard-outer-container .widget-error-fallback{align-items:center;background:var(--dashboard-color-bg-card);border:1px dashed var(--dashboard-color-danger);border-radius:10px;display:flex;flex-direction:column;gap:8px;height:100%;justify-content:center;padding:24px;text-align:center}.dashboard-outer-container .widget-error-fallback-title{color:var(--dashboard-color-danger);font-size:.9rem;font-weight:700}.dashboard-outer-container .widget-error-fallback-message{color:var(--dashboard-color-text-muted);font-size:.8rem;max-width:280px;word-break:break-word}.dashboard-outer-container .widget-error-fallback-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;margin-top:4px;padding:4px 12px;transition:color .15s ease,border-color .15s ease}.dashboard-outer-container .widget-error-fallback-retry:hover{border-color:var(--dashboard-color-navy);color:var(--dashboard-color-navy)}@keyframes spin{to{transform:rotate(360deg)}}@keyframes widget-wobble{0%{transform:rotate(-1.5deg)}to{transform:rotate(1.5deg)}}
`;
function buildEmbedHTML() {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>${compiledCSS}</style>
</head>
<body>
<div id="dashboard-root"></div>
<script type="text/javascript" src="data:text/javascript;base64,${clientBase64}"><\/script>
</body>
</html>`;
}
var SETTING_KEYS = {
BACKGROUND_IMAGE_URL: "Background Image URL",
BACKGROUND_IMAGE_MODE: "Background Image Mode",
CONSOLE_LOGGING: "Console logging",
DASHBOARD_COMPONENTS: "dashboard_elements",
LLM_API_KEY_ANTHROPIC: "Anthropic API Key",
LLM_API_KEY_GEMINI: "Gemini API Key",
LLM_API_KEY_GROK: "Grok API Key",
LLM_API_KEY_OPENAI: "OpenAI API Key",
LLM_PROVIDER_MODEL: "LLM Provider",
TASK_DOMAINS: "dashboard_task_domains",
PLANNING_NOTE_TAG: "Tag to apply to planning notes"
};
var API_KEY_FROM_PROVIDER = {
anthropic: SETTING_KEYS.LLM_API_KEY_ANTHROPIC,
gemini: SETTING_KEYS.LLM_API_KEY_GEMINI,
grok: SETTING_KEYS.LLM_API_KEY_GROK,
openai: SETTING_KEYS.LLM_API_KEY_OPENAI
};
function widgetConfigKey(widgetId) {
return `dashboard_${widgetId}_config`;
}
var DASHBOARD_COMPONENTS = SETTING_KEYS.DASHBOARD_COMPONENTS;
var TASK_DOMAIN_SETTING = SETTING_KEYS.TASK_DOMAINS;
var PLANNING_NOTE_TAG_LABEL = SETTING_KEYS.PLANNING_NOTE_TAG;
var TASK_DOMAIN_STALE_MS = 24 * 60 * 60 * 1e3;
var WIDGET_REGISTRY = [
{
widgetId: "planning",
name: "Quarterly Planning",
description: "Plan and track your quarterly goals and priorities",
icon: "\u{1F4CB}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "victory-value",
name: "Victory Value",
description: "Celebrate wins and track high-value task completions",
icon: "\u{1F3C6}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "mood",
name: "Mood Tracker",
visibleTitle: "How are you feeling?",
description: "Log your daily mood and visualize trends over time",
icon: "\u{1F3AD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "calendar",
name: "Calendar",
description: "See upcoming events and appointments at a glance",
icon: "\u{1F4C5}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "agenda",
name: "Task Agenda",
description: "View and manage your prioritized task list",
icon: "\u{1F4CC}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quotes",
name: "Inspiration Quotes",
description: "Rotating inspirational quotes to keep you motivated",
icon: "\u{1F4A1}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "recent-notes",
name: "Revisit Candidate",
description: "Notes with open tasks that have not had a new task in over a week",
icon: "\u{1F4DD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quick-actions",
name: "Quick Actions",
description: "Shortcuts for your most frequently used dashboard actions",
icon: "\u26A1",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "dream-task",
name: "DreamTask",
description: "AI-suggested tasks aligned with your quarterly and monthly goals",
icon: "\u{1F52E}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "peak-hours",
name: "Peak Hours",
description: "Hourly distribution of task creation and completion activity",
icon: "\u23F0",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "day-sketch",
name: "Day Sketcher",
description: "Notebook-paper day planner with hour-by-hour entries saved to a note",
icon: "\u{1F5D2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
}
];
var DEFAULT_DASHBOARD_COMPONENTS = WIDGET_REGISTRY.map((w) => ({
widgetId: w.widgetId,
gridWidthSize: w.defaultGridWidthSize,
gridHeightSize: 1,
settings: {}
}));
var FULL_MONTH_NAMES = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
function getCurrentQuarter() {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth();
const quarter = Math.floor(month / 3) + 1;
return { year, quarter, label: `Q${quarter} ${year}` };
}
function getNextQuarter() {
let { year, quarter } = getCurrentQuarter();
quarter++;
if (quarter > 4) {
quarter = 1;
year++;
}
return { year, quarter, label: `Q${quarter} ${year}` };
}
var _enabled = false;
function setLoggingEnabled(settingValue) {
if (typeof settingValue === "boolean") {
_enabled = settingValue;
return;
}
const normalized = String(settingValue || "").trim().toLowerCase();
_enabled = ["true", "yes", "1", "on", "enabled"].includes(normalized);
}
function logIfEnabled(...args) {
if (_enabled) {
console.log(...args);
}
}
function dateFromDateInput(dateInput) {
if (!dateInput)
return new Date();
if (dateInput instanceof Date)
return new Date(dateInput);
if (typeof dateInput === "string" && /^\d{4}-\d{2}-\d{2}$/.test(dateInput)) {
const [year, month, day] = dateInput.split("-").map(Number);
return new Date(year, month - 1, day);
}
const parsed = new Date(dateInput);
if (Number.isNaN(parsed.getTime()))
return new Date();
return parsed;
}
function weekStartFromDateInput(dateInput, weekStartDay = 1) {
const date = dateFromDateInput(dateInput);
const dayOfWeek = date.getDay();
const delta = (dayOfWeek - weekStartDay + 7) % 7;
const weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - delta);
weekStart.setHours(0, 0, 0, 0);
return weekStart;
}
function weekEndFromDateInput(dateInput, weekStartDay = 1) {
const weekStart = weekStartFromDateInput(dateInput, weekStartDay);
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekEnd.getDate() + 6);
weekEnd.setHours(23, 59, 59, 999);
return weekEnd;
}
async function fetchDashboardData(app) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
const now = new Date();
const weekStart = weekStartFromDateInput(now);
const weekEnd = weekEndFromDateInput(now);
let taskDomainInfo = { domains: [], selectedDomainUuid: null };
try {
taskDomainInfo = await _resolveTaskDomains(app);
} catch (err) {
logIfEnabled("[fetchDashboardData] _resolveTaskDomains failed, continuing with empty domains:", err);
}
const twoWeeksAgoUnixSeconds = Math.floor(Date.now() / 1e3) - 60 * 60 * 24 * 14;
const results = await Promise.allSettled([
_safeMoodRatings(app, twoWeeksAgoUnixSeconds),
_findQuarterlyPlans(app),
_readDashboardSettings(app),
_fetchTasksForDomain(app, taskDomainInfo.selectedDomainUuid)
]);
const moodRatings = _settledValueOr(results[0], [], "moodRatings");
const quarterlyPlans = _settledValueOr(results[1], null, "quarterlyPlans");
const settings = _settledValueOr(results[2], {}, "settings");
const domainTasks = _settledValueOr(results[3], [], "domainTasks");
return {
activeTaskDomain: taskDomainInfo.selectedDomainUuid,
completedThisWeek: _filterCompletedInRange(domainTasks, weekStart, weekEnd),
currentDate: now.toISOString(),
dailyVictoryValues: _calculateDailyVictoryValues(domainTasks, weekStart),
moodRatings,
pluginNoteUUID: app.context?.noteUUID || null,
quarterlyPlans,
settings,
tasks: domainTasks,
todayTasks: _filterTodayTasks(domainTasks, now),
taskDomains: taskDomainInfo.domains,
weeklyVictoryValue: _calculateWeeklyVictoryValue(domainTasks, weekStart, weekEnd)
};
}
async function _resolveTaskDomains(app) {
const raw = app.settings[SETTING_KEYS.TASK_DOMAINS];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
const isStale = !stored.lastRetrieved || Date.now() - stored.lastRetrieved > TASK_DOMAIN_STALE_MS;
const hasDomains = Array.isArray(stored.domains) && stored.domains.length > 0;
if (!hasDomains || isStale) {
const freshDomains = await app.getTaskDomains();
stored.domains = (Array.isArray(freshDomains) ? freshDomains : []).filter((d) => d && d.uuid).map((d) => ({ name: d.name, uuid: d.uuid }));
stored.lastRetrieved = Date.now();
const selectedStillExists = stored.selectedDomainUuid && stored.domains.some((d) => d.uuid === stored.selectedDomainUuid);
if (!selectedStillExists) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
}
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
if (!stored.selectedDomainUuid && stored.domains.length > 0) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
return stored;
}
function _settledValueOr(result, fallback, label) {
if (result.status === "fulfilled")
return result.value;
logIfEnabled(`[fetchDashboardData] ${label} fetch failed, using fallback:`, result.reason);
return fallback;
}
function _pickDefaultDomain(domains) {
if (!domains || domains.length === 0)
return null;
const work = domains.find((d) => d.name === "Work");
return work ? work.uuid : domains[0].uuid;
}
async function _fetchTasksForDomain(app, domainUuid) {
if (!domainUuid)
return [];
try {
const tasks = await app.getTaskDomainTasks(domainUuid);
return Array.isArray(tasks) ? tasks : [];
} catch (err) {
logIfEnabled(`[_fetchTasksForDomain] getTaskDomainTasks failed for domain ${domainUuid}:`, err);
return [];
}
}
function _filterTodayTasks(tasks, now) {
const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
const dayEnd = dayStart + 864e5;
return tasks.filter(
(t) => !t.completedAt && !t.dismissedAt && _millisFromTimestamp(t.startAt) && _millisFromTimestamp(t.startAt) >= dayStart && _millisFromTimestamp(t.startAt) < dayEnd
).sort((a, b) => (_millisFromTimestamp(a.startAt) || 0) - (_millisFromTimestamp(b.startAt) || 0));
}
function _filterCompletedInRange(tasks, start, end) {
const startMs = start.getTime();
const endMs = end.getTime();
return tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= startMs && _millisFromTimestamp(t.completedAt) <= endMs
);
}
function _calculateWeeklyVictoryValue(tasks, weekStart, weekEnd) {
return _filterCompletedInRange(tasks, weekStart, weekEnd).reduce((sum, t) => sum + (t.victoryValue || 0), 0);
}
function _calculateDailyVictoryValues(tasks, weekStart) {
const days = Array.from({ length: 7 }, (_, i) => {
const dayStart = new Date(weekStart);
dayStart.setDate(dayStart.getDate() + i);
const dayEnd = new Date(dayStart);
dayEnd.setDate(dayEnd.getDate() + 1);
const dayTasks = tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= dayStart.getTime() && _millisFromTimestamp(t.completedAt) < dayEnd.getTime()
);
return {
day: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][i],
date: dayStart.toISOString(),
value: dayTasks.reduce((sum, t) => sum + (t.victoryValue || 0), 0),
taskCount: dayTasks.length
};
});
return days;
}
async function _safeMoodRatings(app, fromUnixSeconds) {
const moodRatings = await app.getMoodRatings(fromUnixSeconds);
logIfEnabled("Mood ratings", moodRatings, "from", fromUnixSeconds);
return moodRatings;
}
async function _findQuarterlyPlans(app) {
const current = getCurrentQuarter();
const next = getNextQuarter();
logIfEnabled(`[_findQuarterlyPlans] querying: "${current.label} Plan", "${next.label} Plan"`);
const [currentPlans, nextPlans] = await Promise.all([
app.filterNotes({ query: `${current.label} Plan` }),
app.filterNotes({ query: `${next.label} Plan` })
]);
logIfEnabled(`[_findQuarterlyPlans] filterNotes results \u2014 current:`, currentPlans, `next:`, nextPlans);
const currentNoteUUID = currentPlans.find((n) => n.name === `${current.label} Plan`)?.uuid;
const nextNoteUUID = nextPlans.find((n) => n.name === `${next.label} Plan`)?.uuid;
logIfEnabled(`[_findQuarterlyPlans] resolved UUIDs \u2014 current: ${currentNoteUUID}, next: ${nextNoteUUID}`);
const currentMonths = _quarterMonthNames(current.quarter);
const nextMonths = _quarterMonthNames(next.quarter);
const [currentHasAll, nextHasAll] = await Promise.all([
currentNoteUUID ? _hasAllMonthSections(app, currentNoteUUID, currentMonths) : Promise.resolve(false),
nextNoteUUID ? _hasAllMonthSections(app, nextNoteUUID, nextMonths) : Promise.resolve(false)
]);
logIfEnabled(`[_findQuarterlyPlans] hasAllMonthlyDetails \u2014 current: ${currentHasAll}, next: ${nextHasAll}`);
return {
current: { ...current, noteUUID: currentNoteUUID, hasAllMonthlyDetails: currentHasAll },
next: { ...next, noteUUID: nextNoteUUID, hasAllMonthlyDetails: nextHasAll }
};
}
function _quarterMonthNames(quarter) {
const start = (quarter - 1) * 3;
return [0, 1, 2].map((i) => FULL_MONTH_NAMES[(start + i) % 12]);
}
async function _hasAllMonthSections(app, noteUUID, monthNames) {
try {
const sections = await app.getNoteSections({ uuid: noteUUID });
return monthNames.every(
(name) => sections.some((s) => s.heading?.text?.trim().toLowerCase() === name.toLowerCase())
);
} catch {
return false;
}
}
async function _readDashboardSettings(app) {
const keys = [
widgetConfigKey("victory-value"),
widgetConfigKey("calendar"),
widgetConfigKey("quotes"),
widgetConfigKey("mood"),
widgetConfigKey("recent-notes")
];
const settings = {};
for (const key of keys) {
try {
const val = app.settings[key];
settings[key] = val ? JSON.parse(val) : null;
} catch {
settings[key] = null;
}
}
settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] || "";
settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] || "cover";
settings[SETTING_KEYS.CONSOLE_LOGGING] = app.settings[SETTING_KEYS.CONSOLE_LOGGING] || "";
settings[SETTING_KEYS.LLM_PROVIDER_MODEL] = app.settings[SETTING_KEYS.LLM_PROVIDER_MODEL] || "";
settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] = app.settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] || "";
settings[SETTING_KEYS.LLM_API_KEY_GEMINI] = app.settings[SETTING_KEYS.LLM_API_KEY_GEMINI] || "";
settings[SETTING_KEYS.LLM_API_KEY_GROK] = app.settings[SETTING_KEYS.LLM_API_KEY_GROK] || "";
settings[SETTING_KEYS.LLM_API_KEY_OPENAI] = app.settings[SETTING_KEYS.LLM_API_KEY_OPENAI] || "";
let componentLayout = null;
try {
componentLayout = app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS] ? JSON.parse(app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS]) : null;
} catch {
componentLayout = null;
}
if (!Array.isArray(componentLayout) || componentLayout.length === 0) {
componentLayout = DEFAULT_DASHBOARD_COMPONENTS.map((component) => ({ ...component }));
await app.setSetting(SETTING_KEYS.DASHBOARD_COMPONENTS, JSON.stringify(componentLayout));
}
settings[SETTING_KEYS.DASHBOARD_COMPONENTS] = componentLayout;
return settings;
}
function _millisFromTimestamp(timestamp) {
if (timestamp == null)
return null;
if (typeof timestamp !== "number") {
const parsed = Number(timestamp);
if (!Number.isFinite(parsed))
return null;
return parsed < 1e10 ? parsed * 1e3 : parsed;
}
return timestamp < 1e10 ? timestamp * 1e3 : timestamp;
}
var plugin = {
constants: {},
appOption: {
"Open Dashboard": async function(app) {
await app.openSidebarEmbed(1.5);
},
"Open Dashboard (Full)": async function(app) {
await app.openEmbed();
}
},
async renderEmbed(app) {
try {
return buildEmbedHTML();
} catch (error) {
logIfEnabled("Dashboard renderEmbed error:", error);
return `<div style="padding:20px;color:red;">Dashboard failed to load: ${error.message}</div>`;
}
},
async onEmbedCall(app, actionType, ...args) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
try {
switch (actionType) {
case "attachNoteMedia":
const noteHandle = { uuid: app.context.noteUUID };
logIfEnabled(`[plugin] attachNoteMedia called \u2014 uploading to plugin note ${noteHandle.uuid}`);
const result = await app.attachNoteMedia(noteHandle, args[1]);
logIfEnabled(`[plugin] attachNoteMedia result:`, result ? "(URL received)" : "(no URL)");
return result;
case "configure":
return await this._handleConfigure(app, args[0]);
case "init":
return await fetchDashboardData(app);
default:
if (typeof app[actionType] === "function") {
return await app[actionType](...args);
}
logIfEnabled(`Unknown embed action: ${actionType}`);
return null;
}
} catch (error) {
logIfEnabled(`onEmbedCall error (${actionType}):`, error);
return { error: error.message };
}
},
async _handleConfigure(app, widgetId) {
const configs = {
"victory-value": {
title: "Configure Victory Value",
inputs: [
{ label: "Time range", type: "radio", options: [
{ label: "This week", value: "week" },
{ label: "This month", value: "month" },
{ label: "Last 30 days", value: "30days" }
] },
{ label: "Show mood overlay", type: "checkbox", value: true }
]
},
"calendar": {
title: "Configure Calendar",
inputs: [
{ label: "Week starts on", type: "radio", options: [
{ label: "Sunday", value: "0" },
{ label: "Monday", value: "1" }
] }
]
},
"quotes": {
title: "Configure Quotes",
inputs: [
{ label: "Quote style", type: "radio", options: [
{ label: "Motivational", value: "motivational" },
{ label: "Philosophical", value: "philosophical" },
{ label: "From quarterly goals", value: "goals" }
] }
]
}
};
const config = configs[widgetId];
if (!config)
return null;
const result = await app.prompt(config.title, { inputs: config.inputs });
if (!result)
return null;
await app.setSetting(widgetConfigKey(widgetId), JSON.stringify(
Array.isArray(result) ? result : [result]
));
return result;
}
};
var plugin_default = plugin;
return plugin;
})()