D3
OG
Old school D3 from simpler times
All examples
By author
By category
About
Jverma
Full window
Github gist
Scatterplot - II
Interactive Scatter plot of Iris data.
<!doctype HTML> <meta charset = 'utf-8'> <html> <head> <script src='data:application/javascript;base64,OwooZnVuY3Rpb24oKXt2YXIgbj10aGlzLHQ9bi5fLHI9e30sZT1BcnJheS5wcm90b3R5cGUsdT1PYmplY3QucHJvdG90eXBlLGk9RnVuY3Rpb24ucHJvdG90eXBlLGE9ZS5wdXNoLG89ZS5zbGljZSxjPWUuY29uY2F0LGw9dS50b1N0cmluZyxmPXUuaGFzT3duUHJvcGVydHkscz1lLmZvckVhY2gscD1lLm1hcCx2PWUucmVkdWNlLGg9ZS5yZWR1Y2VSaWdodCxnPWUuZmlsdGVyLGQ9ZS5ldmVyeSxtPWUuc29tZSx5PWUuaW5kZXhPZixiPWUubGFzdEluZGV4T2YseD1BcnJheS5pc0FycmF5LF89T2JqZWN0LmtleXMsaj1pLmJpbmQsdz1mdW5jdGlvbihuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIHc/bjp0aGlzIGluc3RhbmNlb2Ygdz8odGhpcy5fd3JhcHBlZD1uLHZvaWQgMCk6bmV3IHcobil9OyJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz8oInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYoZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz13KSxleHBvcnRzLl89dyk6bi5fPXcsdy5WRVJTSU9OPSIxLjQuMyI7dmFyIEE9dy5lYWNoPXcuZm9yRWFjaD1mdW5jdGlvbihuLHQsZSl7aWYobnVsbCE9bilpZihzJiZuLmZvckVhY2g9PT1zKW4uZm9yRWFjaCh0LGUpO2Vsc2UgaWYobi5sZW5ndGg9PT0rbi5sZW5ndGgpe2Zvcih2YXIgdT0wLGk9bi5sZW5ndGg7aT51O3UrKylpZih0LmNhbGwoZSxuW3VdLHUsbik9PT1yKXJldHVybn1lbHNlIGZvcih2YXIgYSBpbiBuKWlmKHcuaGFzKG4sYSkmJnQuY2FsbChlLG5bYV0sYSxuKT09PXIpcmV0dXJufTt3Lm1hcD13LmNvbGxlY3Q9ZnVuY3Rpb24obix0LHIpe3ZhciBlPVtdO3JldHVybiBudWxsPT1uP2U6cCYmbi5tYXA9PT1wP24ubWFwKHQscik6KEEobixmdW5jdGlvbihuLHUsaSl7ZVtlLmxlbmd0aF09dC5jYWxsKHIsbix1LGkpfSksZSl9O3ZhciBPPSJSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIjt3LnJlZHVjZT13LmZvbGRsPXcuaW5qZWN0PWZ1bmN0aW9uKG4sdCxyLGUpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MjtpZihudWxsPT1uJiYobj1bXSksdiYmbi5yZWR1Y2U9PT12KXJldHVybiBlJiYodD13LmJpbmQodCxlKSksdT9uLnJlZHVjZSh0LHIpOm4ucmVkdWNlKHQpO2lmKEEobixmdW5jdGlvbihuLGksYSl7dT9yPXQuY2FsbChlLHIsbixpLGEpOihyPW4sdT0hMCl9KSwhdSl0aHJvdyBuZXcgVHlwZUVycm9yKE8pO3JldHVybiByfSx3LnJlZHVjZVJpZ2h0PXcuZm9sZHI9ZnVuY3Rpb24obix0LHIsZSl7dmFyIHU9YXJndW1lbnRzLmxlbmd0aD4yO2lmKG51bGw9PW4mJihuPVtdKSxoJiZuLnJlZHVjZVJpZ2h0PT09aClyZXR1cm4gZSYmKHQ9dy5iaW5kKHQsZSkpLHU/bi5yZWR1Y2VSaWdodCh0LHIpOm4ucmVkdWNlUmlnaHQodCk7dmFyIGk9bi5sZW5ndGg7aWYoaSE9PStpKXt2YXIgYT13LmtleXMobik7aT1hLmxlbmd0aH1pZihBKG4sZnVuY3Rpb24obyxjLGwpe2M9YT9hWy0taV06LS1pLHU/cj10LmNhbGwoZSxyLG5bY10sYyxsKToocj1uW2NdLHU9ITApfSksIXUpdGhyb3cgbmV3IFR5cGVFcnJvcihPKTtyZXR1cm4gcn0sdy5maW5kPXcuZGV0ZWN0PWZ1bmN0aW9uKG4sdCxyKXt2YXIgZTtyZXR1cm4gRShuLGZ1bmN0aW9uKG4sdSxpKXtyZXR1cm4gdC5jYWxsKHIsbix1LGkpPyhlPW4sITApOnZvaWQgMH0pLGV9LHcuZmlsdGVyPXcuc2VsZWN0PWZ1bmN0aW9uKG4sdCxyKXt2YXIgZT1bXTtyZXR1cm4gbnVsbD09bj9lOmcmJm4uZmlsdGVyPT09Zz9uLmZpbHRlcih0LHIpOihBKG4sZnVuY3Rpb24obix1LGkpe3QuY2FsbChyLG4sdSxpKSYmKGVbZS5sZW5ndGhdPW4pfSksZSl9LHcucmVqZWN0PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gdy5maWx0ZXIobixmdW5jdGlvbihuLGUsdSl7cmV0dXJuIXQuY2FsbChyLG4sZSx1KX0scil9LHcuZXZlcnk9dy5hbGw9ZnVuY3Rpb24obix0LGUpe3R8fCh0PXcuaWRlbnRpdHkpO3ZhciB1PSEwO3JldHVybiBudWxsPT1uP3U6ZCYmbi5ldmVyeT09PWQ/bi5ldmVyeSh0LGUpOihBKG4sZnVuY3Rpb24obixpLGEpe3JldHVybih1PXUmJnQuY2FsbChlLG4saSxhKSk/dm9pZCAwOnJ9KSwhIXUpfTt2YXIgRT13LnNvbWU9dy5hbnk9ZnVuY3Rpb24obix0LGUpe3R8fCh0PXcuaWRlbnRpdHkpO3ZhciB1PSExO3JldHVybiBudWxsPT1uP3U6bSYmbi5zb21lPT09bT9uLnNvbWUodCxlKTooQShuLGZ1bmN0aW9uKG4saSxhKXtyZXR1cm4gdXx8KHU9dC5jYWxsKGUsbixpLGEpKT9yOnZvaWQgMH0pLCEhdSl9O3cuY29udGFpbnM9dy5pbmNsdWRlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGw9PW4/ITE6eSYmbi5pbmRleE9mPT09eT8tMSE9bi5pbmRleE9mKHQpOkUobixmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR9KX0sdy5pbnZva2U9ZnVuY3Rpb24obix0KXt2YXIgcj1vLmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiB3Lm1hcChuLGZ1bmN0aW9uKG4pe3JldHVybih3LmlzRnVuY3Rpb24odCk/dDpuW3RdKS5hcHBseShuLHIpfSl9LHcucGx1Y2s9ZnVuY3Rpb24obix0KXtyZXR1cm4gdy5tYXAobixmdW5jdGlvbihuKXtyZXR1cm4gblt0XX0pfSx3LndoZXJlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHcuaXNFbXB0eSh0KT9bXTp3LmZpbHRlcihuLGZ1bmN0aW9uKG4pe2Zvcih2YXIgciBpbiB0KWlmKHRbcl0hPT1uW3JdKXJldHVybiExO3JldHVybiEwfSl9LHcubWF4PWZ1bmN0aW9uKG4sdCxyKXtpZighdCYmdy5pc0FycmF5KG4pJiZuWzBdPT09K25bMF0mJjY1NTM1Pm4ubGVuZ3RoKXJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLG4pO2lmKCF0JiZ3LmlzRW1wdHkobikpcmV0dXJuLTEvMDt2YXIgZT17Y29tcHV0ZWQ6LTEvMCx2YWx1ZTotMS8wfTtyZXR1cm4gQShuLGZ1bmN0aW9uKG4sdSxpKXt2YXIgYT10P3QuY2FsbChyLG4sdSxpKTpuO2E+PWUuY29tcHV0ZWQmJihlPXt2YWx1ZTpuLGNvbXB1dGVkOmF9KX0pLGUudmFsdWV9LHcubWluPWZ1bmN0aW9uKG4sdCxyKXtpZighdCYmdy5pc0FycmF5KG4pJiZuWzBdPT09K25bMF0mJjY1NTM1Pm4ubGVuZ3RoKXJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLG4pO2lmKCF0JiZ3LmlzRW1wdHkobikpcmV0dXJuIDEvMDt2YXIgZT17Y29tcHV0ZWQ6MS8wLHZhbHVlOjEvMH07cmV0dXJuIEEobixmdW5jdGlvbihuLHUsaSl7dmFyIGE9dD90LmNhbGwocixuLHUsaSk6bjtlLmNvbXB1dGVkPmEmJihlPXt2YWx1ZTpuLGNvbXB1dGVkOmF9KX0pLGUudmFsdWV9LHcuc2h1ZmZsZT1mdW5jdGlvbihuKXt2YXIgdCxyPTAsZT1bXTtyZXR1cm4gQShuLGZ1bmN0aW9uKG4pe3Q9dy5yYW5kb20ocisrKSxlW3ItMV09ZVt0XSxlW3RdPW59KSxlfTt2YXIgRj1mdW5jdGlvbihuKXtyZXR1cm4gdy5pc0Z1bmN0aW9uKG4pP246ZnVuY3Rpb24odCl7cmV0dXJuIHRbbl19fTt3LnNvcnRCeT1mdW5jdGlvbihuLHQscil7dmFyIGU9Rih0KTtyZXR1cm4gdy5wbHVjayh3Lm1hcChuLGZ1bmN0aW9uKG4sdCx1KXtyZXR1cm57dmFsdWU6bixpbmRleDp0LGNyaXRlcmlhOmUuY2FsbChyLG4sdCx1KX19KS5zb3J0KGZ1bmN0aW9uKG4sdCl7dmFyIHI9bi5jcml0ZXJpYSxlPXQuY3JpdGVyaWE7aWYociE9PWUpe2lmKHI+ZXx8dm9pZCAwPT09cilyZXR1cm4gMTtpZihlPnJ8fHZvaWQgMD09PWUpcmV0dXJuLTF9cmV0dXJuIG4uaW5kZXg8dC5pbmRleD8tMToxfSksInZhbHVlIil9O3ZhciBrPWZ1bmN0aW9uKG4sdCxyLGUpe3ZhciB1PXt9LGk9Rih0fHx3LmlkZW50aXR5KTtyZXR1cm4gQShuLGZ1bmN0aW9uKHQsYSl7dmFyIG89aS5jYWxsKHIsdCxhLG4pO2UodSxvLHQpfSksdX07dy5ncm91cEJ5PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gayhuLHQscixmdW5jdGlvbihuLHQscil7KHcuaGFzKG4sdCk/blt0XTpuW3RdPVtdKS5wdXNoKHIpfSl9LHcuY291bnRCeT1mdW5jdGlvbihuLHQscil7cmV0dXJuIGsobix0LHIsZnVuY3Rpb24obix0KXt3LmhhcyhuLHQpfHwoblt0XT0wKSxuW3RdKyt9KX0sdy5zb3J0ZWRJbmRleD1mdW5jdGlvbihuLHQscixlKXtyPW51bGw9PXI/dy5pZGVudGl0eTpGKHIpO2Zvcih2YXIgdT1yLmNhbGwoZSx0KSxpPTAsYT1uLmxlbmd0aDthPmk7KXt2YXIgbz1pK2E+Pj4xO3U+ci5jYWxsKGUsbltvXSk/aT1vKzE6YT1vfXJldHVybiBpfSx3LnRvQXJyYXk9ZnVuY3Rpb24obil7cmV0dXJuIG4/dy5pc0FycmF5KG4pP28uY2FsbChuKTpuLmxlbmd0aD09PStuLmxlbmd0aD93Lm1hcChuLHcuaWRlbnRpdHkpOncudmFsdWVzKG4pOltdfSx3LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW4/MDpuLmxlbmd0aD09PStuLmxlbmd0aD9uLmxlbmd0aDp3LmtleXMobikubGVuZ3RofSx3LmZpcnN0PXcuaGVhZD13LnRha2U9ZnVuY3Rpb24obix0LHIpe3JldHVybiBudWxsPT1uP3ZvaWQgMDpudWxsPT10fHxyP25bMF06by5jYWxsKG4sMCx0KX0sdy5pbml0aWFsPWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gby5jYWxsKG4sMCxuLmxlbmd0aC0obnVsbD09dHx8cj8xOnQpKX0sdy5sYXN0PWZ1bmN0aW9uKG4sdCxyKXtyZXR1cm4gbnVsbD09bj92b2lkIDA6bnVsbD09dHx8cj9uW24ubGVuZ3RoLTFdOm8uY2FsbChuLE1hdGgubWF4KG4ubGVuZ3RoLXQsMCkpfSx3LnJlc3Q9dy50YWlsPXcuZHJvcD1mdW5jdGlvbihuLHQscil7cmV0dXJuIG8uY2FsbChuLG51bGw9PXR8fHI/MTp0KX0sdy5jb21wYWN0PWZ1bmN0aW9uKG4pe3JldHVybiB3LmZpbHRlcihuLHcuaWRlbnRpdHkpfTt2YXIgUj1mdW5jdGlvbihuLHQscil7cmV0dXJuIEEobixmdW5jdGlvbihuKXt3LmlzQXJyYXkobik/dD9hLmFwcGx5KHIsbik6UihuLHQscik6ci5wdXNoKG4pfSkscn07dy5mbGF0dGVuPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFIobix0LFtdKX0sdy53aXRob3V0PWZ1bmN0aW9uKG4pe3JldHVybiB3LmRpZmZlcmVuY2UobixvLmNhbGwoYXJndW1lbnRzLDEpKX0sdy51bmlxPXcudW5pcXVlPWZ1bmN0aW9uKG4sdCxyLGUpe3cuaXNGdW5jdGlvbih0KSYmKGU9cixyPXQsdD0hMSk7dmFyIHU9cj93Lm1hcChuLHIsZSk6bixpPVtdLGE9W107cmV0dXJuIEEodSxmdW5jdGlvbihyLGUpeyh0P2UmJmFbYS5sZW5ndGgtMV09PT1yOncuY29udGFpbnMoYSxyKSl8fChhLnB1c2gociksaS5wdXNoKG5bZV0pKX0pLGl9LHcudW5pb249ZnVuY3Rpb24oKXtyZXR1cm4gdy51bmlxKGMuYXBwbHkoZSxhcmd1bWVudHMpKX0sdy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24obil7dmFyIHQ9by5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdy5maWx0ZXIody51bmlxKG4pLGZ1bmN0aW9uKG4pe3JldHVybiB3LmV2ZXJ5KHQsZnVuY3Rpb24odCl7cmV0dXJuIHcuaW5kZXhPZih0LG4pPj0wfSl9KX0sdy5kaWZmZXJlbmNlPWZ1bmN0aW9uKG4pe3ZhciB0PWMuYXBwbHkoZSxvLmNhbGwoYXJndW1lbnRzLDEpKTtyZXR1cm4gdy5maWx0ZXIobixmdW5jdGlvbihuKXtyZXR1cm4hdy5jb250YWlucyh0LG4pfSl9LHcuemlwPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPW8uY2FsbChhcmd1bWVudHMpLHQ9dy5tYXgody5wbHVjayhuLCJsZW5ndGgiKSkscj1BcnJheSh0KSxlPTA7dD5lO2UrKylyW2VdPXcucGx1Y2sobiwiIitlKTtyZXR1cm4gcn0sdy5vYmplY3Q9ZnVuY3Rpb24obix0KXtpZihudWxsPT1uKXJldHVybnt9O2Zvcih2YXIgcj17fSxlPTAsdT1uLmxlbmd0aDt1PmU7ZSsrKXQ/cltuW2VdXT10W2VdOnJbbltlXVswXV09bltlXVsxXTtyZXR1cm4gcn0sdy5pbmRleE9mPWZ1bmN0aW9uKG4sdCxyKXtpZihudWxsPT1uKXJldHVybi0xO3ZhciBlPTAsdT1uLmxlbmd0aDtpZihyKXtpZigibnVtYmVyIiE9dHlwZW9mIHIpcmV0dXJuIGU9dy5zb3J0ZWRJbmRleChuLHQpLG5bZV09PT10P2U6LTE7ZT0wPnI/TWF0aC5tYXgoMCx1K3IpOnJ9aWYoeSYmbi5pbmRleE9mPT09eSlyZXR1cm4gbi5pbmRleE9mKHQscik7Zm9yKDt1PmU7ZSsrKWlmKG5bZV09PT10KXJldHVybiBlO3JldHVybi0xfSx3Lmxhc3RJbmRleE9mPWZ1bmN0aW9uKG4sdCxyKXtpZihudWxsPT1uKXJldHVybi0xO3ZhciBlPW51bGwhPXI7aWYoYiYmbi5sYXN0SW5kZXhPZj09PWIpcmV0dXJuIGU/bi5sYXN0SW5kZXhPZih0LHIpOm4ubGFzdEluZGV4T2YodCk7Zm9yKHZhciB1PWU/cjpuLmxlbmd0aDt1LS07KWlmKG5bdV09PT10KXJldHVybiB1O3JldHVybi0xfSx3LnJhbmdlPWZ1bmN0aW9uKG4sdCxyKXsxPj1hcmd1bWVudHMubGVuZ3RoJiYodD1ufHwwLG49MCkscj1hcmd1bWVudHNbMl18fDE7Zm9yKHZhciBlPU1hdGgubWF4KE1hdGguY2VpbCgodC1uKS9yKSwwKSx1PTAsaT1BcnJheShlKTtlPnU7KWlbdSsrXT1uLG4rPXI7cmV0dXJuIGl9O3ZhciBJPWZ1bmN0aW9uKCl7fTt3LmJpbmQ9ZnVuY3Rpb24obix0KXt2YXIgcixlO2lmKG4uYmluZD09PWomJmopcmV0dXJuIGouYXBwbHkobixvLmNhbGwoYXJndW1lbnRzLDEpKTtpZighdy5pc0Z1bmN0aW9uKG4pKXRocm93IG5ldyBUeXBlRXJyb3I7cmV0dXJuIHI9by5jYWxsKGFyZ3VtZW50cywyKSxlPWZ1bmN0aW9uKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgZSkpcmV0dXJuIG4uYXBwbHkodCxyLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpO0kucHJvdG90eXBlPW4ucHJvdG90eXBlO3ZhciB1PW5ldyBJO0kucHJvdG90eXBlPW51bGw7dmFyIGk9bi5hcHBseSh1LHIuY29uY2F0KG8uY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIE9iamVjdChpKT09PWk/aTp1fX0sdy5iaW5kQWxsPWZ1bmN0aW9uKG4pe3ZhciB0PW8uY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIDA9PXQubGVuZ3RoJiYodD13LmZ1bmN0aW9ucyhuKSksQSh0LGZ1bmN0aW9uKHQpe25bdF09dy5iaW5kKG5bdF0sbil9KSxufSx3Lm1lbW9pemU9ZnVuY3Rpb24obix0KXt2YXIgcj17fTtyZXR1cm4gdHx8KHQ9dy5pZGVudGl0eSksZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdy5oYXMocixlKT9yW2VdOnJbZV09bi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx3LmRlbGF5PWZ1bmN0aW9uKG4sdCl7dmFyIHI9by5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBuLmFwcGx5KG51bGwscil9LHQpfSx3LmRlZmVyPWZ1bmN0aW9uKG4pe3JldHVybiB3LmRlbGF5LmFwcGx5KHcsW24sMV0uY29uY2F0KG8uY2FsbChhcmd1bWVudHMsMSkpKX0sdy50aHJvdHRsZT1mdW5jdGlvbihuLHQpe3ZhciByLGUsdSxpLGE9MCxvPWZ1bmN0aW9uKCl7YT1uZXcgRGF0ZSx1PW51bGwsaT1uLmFwcGx5KHIsZSl9O3JldHVybiBmdW5jdGlvbigpe3ZhciBjPW5ldyBEYXRlLGw9dC0oYy1hKTtyZXR1cm4gcj10aGlzLGU9YXJndW1lbnRzLDA+PWw/KGNsZWFyVGltZW91dCh1KSx1PW51bGwsYT1jLGk9bi5hcHBseShyLGUpKTp1fHwodT1zZXRUaW1lb3V0KG8sbCkpLGl9fSx3LmRlYm91bmNlPWZ1bmN0aW9uKG4sdCxyKXt2YXIgZSx1O3JldHVybiBmdW5jdGlvbigpe3ZhciBpPXRoaXMsYT1hcmd1bWVudHMsbz1mdW5jdGlvbigpe2U9bnVsbCxyfHwodT1uLmFwcGx5KGksYSkpfSxjPXImJiFlO3JldHVybiBjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KG8sdCksYyYmKHU9bi5hcHBseShpLGEpKSx1fX0sdy5vbmNlPWZ1bmN0aW9uKG4pe3ZhciB0LHI9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHI/dDoocj0hMCx0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49bnVsbCx0KX19LHcud3JhcD1mdW5jdGlvbihuLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPVtuXTtyZXR1cm4gYS5hcHBseShyLGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLHIpfX0sdy5jb21wb3NlPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMscj1uLmxlbmd0aC0xO3I+PTA7ci0tKXQ9W25bcl0uYXBwbHkodGhpcyx0KV07cmV0dXJuIHRbMF19fSx3LmFmdGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIDA+PW4/dCgpOmZ1bmN0aW9uKCl7cmV0dXJuIDE+LS1uP3QuYXBwbHkodGhpcyxhcmd1bWVudHMpOnZvaWQgMH19LHcua2V5cz1ffHxmdW5jdGlvbihuKXtpZihuIT09T2JqZWN0KG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgb2JqZWN0Iik7dmFyIHQ9W107Zm9yKHZhciByIGluIG4pdy5oYXMobixyKSYmKHRbdC5sZW5ndGhdPXIpO3JldHVybiB0fSx3LnZhbHVlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIHIgaW4gbil3LmhhcyhuLHIpJiZ0LnB1c2gobltyXSk7cmV0dXJuIHR9LHcucGFpcnM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciByIGluIG4pdy5oYXMobixyKSYmdC5wdXNoKFtyLG5bcl1dKTtyZXR1cm4gdH0sdy5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9e307Zm9yKHZhciByIGluIG4pdy5oYXMobixyKSYmKHRbbltyXV09cik7cmV0dXJuIHR9LHcuZnVuY3Rpb25zPXcubWV0aG9kcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIHIgaW4gbil3LmlzRnVuY3Rpb24obltyXSkmJnQucHVzaChyKTtyZXR1cm4gdC5zb3J0KCl9LHcuZXh0ZW5kPWZ1bmN0aW9uKG4pe3JldHVybiBBKG8uY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24odCl7aWYodClmb3IodmFyIHIgaW4gdCluW3JdPXRbcl19KSxufSx3LnBpY2s9ZnVuY3Rpb24obil7dmFyIHQ9e30scj1jLmFwcGx5KGUsby5jYWxsKGFyZ3VtZW50cywxKSk7cmV0dXJuIEEocixmdW5jdGlvbihyKXtyIGluIG4mJih0W3JdPW5bcl0pfSksdH0sdy5vbWl0PWZ1bmN0aW9uKG4pe3ZhciB0PXt9LHI9Yy5hcHBseShlLG8uY2FsbChhcmd1bWVudHMsMSkpO2Zvcih2YXIgdSBpbiBuKXcuY29udGFpbnMocix1KXx8KHRbdV09blt1XSk7cmV0dXJuIHR9LHcuZGVmYXVsdHM9ZnVuY3Rpb24obil7cmV0dXJuIEEoby5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbih0KXtpZih0KWZvcih2YXIgciBpbiB0KW51bGw9PW5bcl0mJihuW3JdPXRbcl0pfSksbn0sdy5jbG9uZT1mdW5jdGlvbihuKXtyZXR1cm4gdy5pc09iamVjdChuKT93LmlzQXJyYXkobik/bi5zbGljZSgpOncuZXh0ZW5kKHt9LG4pOm59LHcudGFwPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQobiksbn07dmFyIFM9ZnVuY3Rpb24obix0LHIsZSl7aWYobj09PXQpcmV0dXJuIDAhPT1ufHwxL249PTEvdDtpZihudWxsPT1ufHxudWxsPT10KXJldHVybiBuPT09dDtuIGluc3RhbmNlb2YgdyYmKG49bi5fd3JhcHBlZCksdCBpbnN0YW5jZW9mIHcmJih0PXQuX3dyYXBwZWQpO3ZhciB1PWwuY2FsbChuKTtpZih1IT1sLmNhbGwodCkpcmV0dXJuITE7c3dpdGNoKHUpe2Nhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gbj09dCsiIjtjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIG4hPStuP3QhPSt0OjA9PW4/MS9uPT0xL3Q6bj09K3Q7Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybituPT0rdDtjYXNlIltvYmplY3QgUmVnRXhwXSI6cmV0dXJuIG4uc291cmNlPT10LnNvdXJjZSYmbi5nbG9iYWw9PXQuZ2xvYmFsJiZuLm11bHRpbGluZT09dC5tdWx0aWxpbmUmJm4uaWdub3JlQ2FzZT09dC5pZ25vcmVDYXNlfWlmKCJvYmplY3QiIT10eXBlb2Ygbnx8Im9iamVjdCIhPXR5cGVvZiB0KXJldHVybiExO2Zvcih2YXIgaT1yLmxlbmd0aDtpLS07KWlmKHJbaV09PW4pcmV0dXJuIGVbaV09PXQ7ci5wdXNoKG4pLGUucHVzaCh0KTt2YXIgYT0wLG89ITA7aWYoIltvYmplY3QgQXJyYXldIj09dSl7aWYoYT1uLmxlbmd0aCxvPWE9PXQubGVuZ3RoKWZvcig7YS0tJiYobz1TKG5bYV0sdFthXSxyLGUpKTspO31lbHNle3ZhciBjPW4uY29uc3RydWN0b3IsZj10LmNvbnN0cnVjdG9yO2lmKGMhPT1mJiYhKHcuaXNGdW5jdGlvbihjKSYmYyBpbnN0YW5jZW9mIGMmJncuaXNGdW5jdGlvbihmKSYmZiBpbnN0YW5jZW9mIGYpKXJldHVybiExO2Zvcih2YXIgcyBpbiBuKWlmKHcuaGFzKG4scykmJihhKyssIShvPXcuaGFzKHQscykmJlMobltzXSx0W3NdLHIsZSkpKSlicmVhaztpZihvKXtmb3IocyBpbiB0KWlmKHcuaGFzKHQscykmJiFhLS0pYnJlYWs7bz0hYX19cmV0dXJuIHIucG9wKCksZS5wb3AoKSxvfTt3LmlzRXF1YWw9ZnVuY3Rpb24obix0KXtyZXR1cm4gUyhuLHQsW10sW10pfSx3LmlzRW1wdHk9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4hMDtpZih3LmlzQXJyYXkobil8fHcuaXNTdHJpbmcobikpcmV0dXJuIDA9PT1uLmxlbmd0aDtmb3IodmFyIHQgaW4gbilpZih3LmhhcyhuLHQpKXJldHVybiExO3JldHVybiEwfSx3LmlzRWxlbWVudD1mdW5jdGlvbihuKXtyZXR1cm4hKCFufHwxIT09bi5ub2RlVHlwZSl9LHcuaXNBcnJheT14fHxmdW5jdGlvbihuKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1sLmNhbGwobil9LHcuaXNPYmplY3Q9ZnVuY3Rpb24obil7cmV0dXJuIG49PT1PYmplY3Qobil9LEEoWyJBcmd1bWVudHMiLCJGdW5jdGlvbiIsIlN0cmluZyIsIk51bWJlciIsIkRhdGUiLCJSZWdFeHAiXSxmdW5jdGlvbihuKXt3WyJpcyIrbl09ZnVuY3Rpb24odCl7cmV0dXJuIGwuY2FsbCh0KT09IltvYmplY3QgIituKyJdIn19KSx3LmlzQXJndW1lbnRzKGFyZ3VtZW50cyl8fCh3LmlzQXJndW1lbnRzPWZ1bmN0aW9uKG4pe3JldHVybiEoIW58fCF3LmhhcyhuLCJjYWxsZWUiKSl9KSx3LmlzRnVuY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG59LHcuaXNGaW5pdGU9ZnVuY3Rpb24obil7cmV0dXJuIGlzRmluaXRlKG4pJiYhaXNOYU4ocGFyc2VGbG9hdChuKSl9LHcuaXNOYU49ZnVuY3Rpb24obil7cmV0dXJuIHcuaXNOdW1iZXIobikmJm4hPStufSx3LmlzQm9vbGVhbj1mdW5jdGlvbihuKXtyZXR1cm4gbj09PSEwfHxuPT09ITF8fCJbb2JqZWN0IEJvb2xlYW5dIj09bC5jYWxsKG4pfSx3LmlzTnVsbD1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09PW59LHcuaXNVbmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIHZvaWQgMD09PW59LHcuaGFzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGYuY2FsbChuLHQpfSx3Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbi5fPXQsdGhpc30sdy5pZGVudGl0eT1mdW5jdGlvbihuKXtyZXR1cm4gbn0sdy50aW1lcz1mdW5jdGlvbihuLHQscil7Zm9yKHZhciBlPUFycmF5KG4pLHU9MDtuPnU7dSsrKWVbdV09dC5jYWxsKHIsdSk7cmV0dXJuIGV9LHcucmFuZG9tPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG51bGw9PXQmJih0PW4sbj0wKSxuKygwfE1hdGgucmFuZG9tKCkqKHQtbisxKSl9O3ZhciBUPXtlc2NhcGU6eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNzsiLCIvIjoiJiN4MkY7In19O1QudW5lc2NhcGU9dy5pbnZlcnQoVC5lc2NhcGUpO3ZhciBNPXtlc2NhcGU6UmVnRXhwKCJbIit3LmtleXMoVC5lc2NhcGUpLmpvaW4oIiIpKyJdIiwiZyIpLHVuZXNjYXBlOlJlZ0V4cCgiKCIrdy5rZXlzKFQudW5lc2NhcGUpLmpvaW4oInwiKSsiKSIsImciKX07dy5lYWNoKFsiZXNjYXBlIiwidW5lc2NhcGUiXSxmdW5jdGlvbihuKXt3W25dPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOigiIit0KS5yZXBsYWNlKE1bbl0sZnVuY3Rpb24odCl7cmV0dXJuIFRbbl1bdF19KX19KSx3LnJlc3VsdD1mdW5jdGlvbihuLHQpe2lmKG51bGw9PW4pcmV0dXJuIG51bGw7dmFyIHI9blt0XTtyZXR1cm4gdy5pc0Z1bmN0aW9uKHIpP3IuY2FsbChuKTpyfSx3Lm1peGluPWZ1bmN0aW9uKG4pe0Eody5mdW5jdGlvbnMobiksZnVuY3Rpb24odCl7dmFyIHI9d1t0XT1uW3RdO3cucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIG49W3RoaXMuX3dyYXBwZWRdO3JldHVybiBhLmFwcGx5KG4sYXJndW1lbnRzKSx6LmNhbGwodGhpcyxyLmFwcGx5KHcsbikpfX0pfTt2YXIgTj0wO3cudW5pcXVlSWQ9ZnVuY3Rpb24obil7dmFyIHQ9IiIrICsrTjtyZXR1cm4gbj9uK3Q6dH0sdy50ZW1wbGF0ZVNldHRpbmdzPXtldmFsdWF0ZTovPCUoW1xzXFNdKz8pJT4vZyxpbnRlcnBvbGF0ZTovPCU9KFtcc1xTXSs/KSU+L2csZXNjYXBlOi88JS0oW1xzXFNdKz8pJT4vZ307dmFyIHE9LyguKV4vLEI9eyInIjoiJyIsIlxcIjoiXFwiLCJcciI6InIiLCJcbiI6Im4iLCIJIjoidCIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxEPS9cXHwnfFxyfFxufFx0fFx1MjAyOHxcdTIwMjkvZzt3LnRlbXBsYXRlPWZ1bmN0aW9uKG4sdCxyKXtyPXcuZGVmYXVsdHMoe30scix3LnRlbXBsYXRlU2V0dGluZ3MpO3ZhciBlPVJlZ0V4cChbKHIuZXNjYXBlfHxxKS5zb3VyY2UsKHIuaW50ZXJwb2xhdGV8fHEpLnNvdXJjZSwoci5ldmFsdWF0ZXx8cSkuc291cmNlXS5qb2luKCJ8IikrInwkIiwiZyIpLHU9MCxpPSJfX3ArPSciO24ucmVwbGFjZShlLGZ1bmN0aW9uKHQscixlLGEsbyl7cmV0dXJuIGkrPW4uc2xpY2UodSxvKS5yZXBsYWNlKEQsZnVuY3Rpb24obil7cmV0dXJuIlxcIitCW25dfSksciYmKGkrPSInK1xuKChfX3Q9KCIrcisiKSk9PW51bGw/Jyc6Xy5lc2NhcGUoX190KSkrXG4nIiksZSYmKGkrPSInK1xuKChfX3Q9KCIrZSsiKSk9PW51bGw/Jyc6X190KStcbiciKSxhJiYoaSs9Iic7XG4iK2ErIlxuX19wKz0nIiksdT1vK3QubGVuZ3RoLHR9KSxpKz0iJztcbiIsci52YXJpYWJsZXx8KGk9IndpdGgob2JqfHx7fSl7XG4iK2krIn1cbiIpLGk9InZhciBfX3QsX19wPScnLF9faj1BcnJheS5wcm90b3R5cGUuam9pbixwcmludD1mdW5jdGlvbigpe19fcCs9X19qLmNhbGwoYXJndW1lbnRzLCcnKTt9O1xuIitpKyJyZXR1cm4gX19wO1xuIjt0cnl7dmFyIGE9RnVuY3Rpb24oci52YXJpYWJsZXx8Im9iaiIsIl8iLGkpfWNhdGNoKG8pe3Rocm93IG8uc291cmNlPWksb31pZih0KXJldHVybiBhKHQsdyk7dmFyIGM9ZnVuY3Rpb24obil7cmV0dXJuIGEuY2FsbCh0aGlzLG4sdyl9O3JldHVybiBjLnNvdXJjZT0iZnVuY3Rpb24oIisoci52YXJpYWJsZXx8Im9iaiIpKyIpe1xuIitpKyJ9IixjfSx3LmNoYWluPWZ1bmN0aW9uKG4pe3JldHVybiB3KG4pLmNoYWluKCl9O3ZhciB6PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9jaGFpbj93KG4pLmNoYWluKCk6bn07dy5taXhpbih3KSxBKFsicG9wIiwicHVzaCIsInJldmVyc2UiLCJzaGlmdCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sZnVuY3Rpb24obil7dmFyIHQ9ZVtuXTt3LnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe3ZhciByPXRoaXMuX3dyYXBwZWQ7cmV0dXJuIHQuYXBwbHkocixhcmd1bWVudHMpLCJzaGlmdCIhPW4mJiJzcGxpY2UiIT1ufHwwIT09ci5sZW5ndGh8fGRlbGV0ZSByWzBdLHouY2FsbCh0aGlzLHIpfX0pLEEoWyJjb25jYXQiLCJqb2luIiwic2xpY2UiXSxmdW5jdGlvbihuKXt2YXIgdD1lW25dO3cucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7cmV0dXJuIHouY2FsbCh0aGlzLHQuYXBwbHkodGhpcy5fd3JhcHBlZCxhcmd1bWVudHMpKX19KSx3LmV4dGVuZCh3LnByb3RvdHlwZSx7Y2hhaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hhaW49ITAsdGhpc30sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JhcHBlZH19KX0pLmNhbGwodGhpcyk7CjsKLy8gbW9tZW50LmpzCi8vIHZlcnNpb24gOiAxLjcuMgovLyBhdXRob3IgOiBUaW0gV29vZAovLyBsaWNlbnNlIDogTUlUCi8vIG1vbWVudGpzLmNvbQooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gRShhLGIsYyxkKXt2YXIgZT1jLmxhbmcoKTtyZXR1cm4gZVthXS5jYWxsP2VbYV0oYyxkKTplW2FdW2JdfWZ1bmN0aW9uIEYoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuIEsoYS5jYWxsKHRoaXMsYyksYil9fWZ1bmN0aW9uIEcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEuY2FsbCh0aGlzLGIpO3JldHVybiBjK3RoaXMubGFuZygpLm9yZGluYWwoYyl9fWZ1bmN0aW9uIEgoYSxiLGMpe3RoaXMuX2Q9YSx0aGlzLl9pc1VUQz0hIWIsdGhpcy5fYT1hLl9hfHxudWxsLHRoaXMuX2xhbmc9Y3x8ITF9ZnVuY3Rpb24gSShhKXt2YXIgYj10aGlzLl9kYXRhPXt9LGM9YS55ZWFyc3x8YS55fHwwLGQ9YS5tb250aHN8fGEuTXx8MCxlPWEud2Vla3N8fGEud3x8MCxmPWEuZGF5c3x8YS5kfHwwLGc9YS5ob3Vyc3x8YS5ofHwwLGg9YS5taW51dGVzfHxhLm18fDAsaT1hLnNlY29uZHN8fGEuc3x8MCxqPWEubWlsbGlzZWNvbmRzfHxhLm1zfHwwO3RoaXMuX21pbGxpc2Vjb25kcz1qK2kqMWUzK2gqNmU0K2cqMzZlNSx0aGlzLl9kYXlzPWYrZSo3LHRoaXMuX21vbnRocz1kK2MqMTIsYi5taWxsaXNlY29uZHM9aiUxZTMsaSs9SihqLzFlMyksYi5zZWNvbmRzPWklNjAsaCs9SihpLzYwKSxiLm1pbnV0ZXM9aCU2MCxnKz1KKGgvNjApLGIuaG91cnM9ZyUyNCxmKz1KKGcvMjQpLGYrPWUqNyxiLmRheXM9ZiUzMCxkKz1KKGYvMzApLGIubW9udGhzPWQlMTIsYys9SihkLzEyKSxiLnllYXJzPWMsdGhpcy5fbGFuZz0hMX1mdW5jdGlvbiBKKGEpe3JldHVybiBhPDA/TWF0aC5jZWlsKGEpOk1hdGguZmxvb3IoYSl9ZnVuY3Rpb24gSyhhLGIpe3ZhciBjPWErIiI7d2hpbGUoYy5sZW5ndGg8YiljPSIwIitjO3JldHVybiBjfWZ1bmN0aW9uIEwoYSxiLGMpe3ZhciBkPWIuX21pbGxpc2Vjb25kcyxlPWIuX2RheXMsZj1iLl9tb250aHMsZztkJiZhLl9kLnNldFRpbWUoK2ErZCpjKSxlJiZhLmRhdGUoYS5kYXRlKCkrZSpjKSxmJiYoZz1hLmRhdGUoKSxhLmRhdGUoMSkubW9udGgoYS5tb250aCgpK2YqYykuZGF0ZShNYXRoLm1pbihnLGEuZGF5c0luTW9udGgoKSkpKX1mdW5jdGlvbiBNKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0ifWZ1bmN0aW9uIE4oYSxiKXt2YXIgYz1NYXRoLm1pbihhLmxlbmd0aCxiLmxlbmd0aCksZD1NYXRoLmFicyhhLmxlbmd0aC1iLmxlbmd0aCksZT0wLGY7Zm9yKGY9MDtmPGM7ZisrKX5+YVtmXSE9PX5+YltmXSYmZSsrO3JldHVybiBlK2R9ZnVuY3Rpb24gTyhhLGIsYyxkKXt2YXIgZSxmLGc9W107Zm9yKGU9MDtlPDc7ZSsrKWdbZV09YVtlXT1hW2VdPT1udWxsP2U9PT0yPzE6MDphW2VdO3JldHVybiBhWzddPWdbN109YixhWzhdIT1udWxsJiYoZ1s4XT1hWzhdKSxhWzNdKz1jfHwwLGFbNF0rPWR8fDAsZj1uZXcgRGF0ZSgwKSxiPyhmLnNldFVUQ0Z1bGxZZWFyKGFbMF0sYVsxXSxhWzJdKSxmLnNldFVUQ0hvdXJzKGFbM10sYVs0XSxhWzVdLGFbNl0pKTooZi5zZXRGdWxsWWVhcihhWzBdLGFbMV0sYVsyXSksZi5zZXRIb3VycyhhWzNdLGFbNF0sYVs1XSxhWzZdKSksZi5fYT1nLGZ9ZnVuY3Rpb24gUChhLGMpe3ZhciBkLGUsZz1bXTshYyYmaCYmKGM9cmVxdWlyZSgiLi9sYW5nLyIrYSkpO2ZvcihkPTA7ZDxpLmxlbmd0aDtkKyspY1tpW2RdXT1jW2lbZF1dfHxmLmVuW2lbZF1dO2ZvcihkPTA7ZDwxMjtkKyspZT1iKFsyZTMsZF0pLGdbZF09bmV3IFJlZ0V4cCgiXiIrKGMubW9udGhzW2RdfHxjLm1vbnRocyhlLCIiKSkrInxeIisoYy5tb250aHNTaG9ydFtkXXx8Yy5tb250aHNTaG9ydChlLCIiKSkucmVwbGFjZSgiLiIsIiIpLCJpIik7cmV0dXJuIGMubW9udGhzUGFyc2U9Yy5tb250aHNQYXJzZXx8ZyxmW2FdPWMsY31mdW5jdGlvbiBRKGEpe3ZhciBjPXR5cGVvZiBhPT0ic3RyaW5nIiYmYXx8YSYmYS5fbGFuZ3x8bnVsbDtyZXR1cm4gYz9mW2NdfHxQKGMpOmJ9ZnVuY3Rpb24gUihhKXtyZXR1cm4gYS5tYXRjaCgvXFsuKlxdLyk/YS5yZXBsYWNlKC9eXFt8XF0kL2csIiIpOmEucmVwbGFjZSgvXFwvZywiIil9ZnVuY3Rpb24gUyhhKXt2YXIgYj1hLm1hdGNoKGspLGMsZDtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylEW2JbY11dP2JbY109RFtiW2NdXTpiW2NdPVIoYltjXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBmPSIiO2ZvcihjPTA7YzxkO2MrKylmKz10eXBlb2YgYltjXS5jYWxsPT0iZnVuY3Rpb24iP2JbY10uY2FsbChlLGEpOmJbY107cmV0dXJuIGZ9fWZ1bmN0aW9uIFQoYSxiKXtmdW5jdGlvbiBkKGIpe3JldHVybiBhLmxhbmcoKS5sb25nRGF0ZUZvcm1hdFtiXXx8Yn12YXIgYz01O3doaWxlKGMtLSYmbC50ZXN0KGIpKWI9Yi5yZXBsYWNlKGwsZCk7cmV0dXJuIEFbYl18fChBW2JdPVMoYikpLEFbYl0oYSl9ZnVuY3Rpb24gVShhKXtzd2l0Y2goYSl7Y2FzZSJEREREIjpyZXR1cm4gcDtjYXNlIllZWVkiOnJldHVybiBxO2Nhc2UiUyI6Y2FzZSJTUyI6Y2FzZSJTU1MiOmNhc2UiREREIjpyZXR1cm4gbztjYXNlIk1NTSI6Y2FzZSJNTU1NIjpjYXNlImRkIjpjYXNlImRkZCI6Y2FzZSJkZGRkIjpjYXNlImEiOmNhc2UiQSI6cmV0dXJuIHI7Y2FzZSJaIjpjYXNlIlpaIjpyZXR1cm4gcztjYXNlIlQiOnJldHVybiB0O2Nhc2UiTU0iOmNhc2UiREQiOmNhc2UiWVkiOmNhc2UiSEgiOmNhc2UiaGgiOmNhc2UibW0iOmNhc2Uic3MiOmNhc2UiTSI6Y2FzZSJEIjpjYXNlImQiOmNhc2UiSCI6Y2FzZSJoIjpjYXNlIm0iOmNhc2UicyI6cmV0dXJuIG47ZGVmYXVsdDpyZXR1cm4gbmV3IFJlZ0V4cChhLnJlcGxhY2UoIlxcIiwiIikpfX1mdW5jdGlvbiBWKGEsYixjLGQpe3ZhciBlLGY7c3dpdGNoKGEpe2Nhc2UiTSI6Y2FzZSJNTSI6Y1sxXT1iPT1udWxsPzA6fn5iLTE7YnJlYWs7Y2FzZSJNTU0iOmNhc2UiTU1NTSI6Zm9yKGU9MDtlPDEyO2UrKylpZihRKCkubW9udGhzUGFyc2VbZV0udGVzdChiKSl7Y1sxXT1lLGY9ITA7YnJlYWt9Znx8KGNbOF09ITEpO2JyZWFrO2Nhc2UiRCI6Y2FzZSJERCI6Y2FzZSJEREQiOmNhc2UiRERERCI6YiE9bnVsbCYmKGNbMl09fn5iKTticmVhaztjYXNlIllZIjpjWzBdPX5+Yisofn5iPjcwPzE5MDA6MmUzKTticmVhaztjYXNlIllZWVkiOmNbMF09fn5NYXRoLmFicyhiKTticmVhaztjYXNlImEiOmNhc2UiQSI6ZC5pc1BtPShiKyIiKS50b0xvd2VyQ2FzZSgpPT09InBtIjticmVhaztjYXNlIkgiOmNhc2UiSEgiOmNhc2UiaCI6Y2FzZSJoaCI6Y1szXT1+fmI7YnJlYWs7Y2FzZSJtIjpjYXNlIm1tIjpjWzRdPX5+YjticmVhaztjYXNlInMiOmNhc2Uic3MiOmNbNV09fn5iO2JyZWFrO2Nhc2UiUyI6Y2FzZSJTUyI6Y2FzZSJTU1MiOmNbNl09fn4oKCIwLiIrYikqMWUzKTticmVhaztjYXNlIloiOmNhc2UiWloiOmQuaXNVVEM9ITAsZT0oYisiIikubWF0Y2goeCksZSYmZVsxXSYmKGQudHpoPX5+ZVsxXSksZSYmZVsyXSYmKGQudHptPX5+ZVsyXSksZSYmZVswXT09PSIrIiYmKGQudHpoPS1kLnR6aCxkLnR6bT0tZC50em0pfWI9PW51bGwmJihjWzhdPSExKX1mdW5jdGlvbiBXKGEsYil7dmFyIGM9WzAsMCwxLDAsMCwwLDBdLGQ9e3R6aDowLHR6bTowfSxlPWIubWF0Y2goayksZixnO2ZvcihmPTA7ZjxlLmxlbmd0aDtmKyspZz0oVShlW2ZdKS5leGVjKGEpfHxbXSlbMF0sZyYmKGE9YS5zbGljZShhLmluZGV4T2YoZykrZy5sZW5ndGgpKSxEW2VbZl1dJiZWKGVbZl0sZyxjLGQpO3JldHVybiBkLmlzUG0mJmNbM108MTImJihjWzNdKz0xMiksZC5pc1BtPT09ITEmJmNbM109PT0xMiYmKGNbM109MCksTyhjLGQuaXNVVEMsZC50emgsZC50em0pfWZ1bmN0aW9uIFgoYSxiKXt2YXIgYyxkPWEubWF0Y2gobSl8fFtdLGUsZj05OSxnLGgsaTtmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWg9VyhhLGJbZ10pLGU9VChuZXcgSChoKSxiW2ddKS5tYXRjaChtKXx8W10saT1OKGQsZSksaTxmJiYoZj1pLGM9aCk7cmV0dXJuIGN9ZnVuY3Rpb24gWShhKXt2YXIgYj0iWVlZWS1NTS1ERFQiLGM7aWYodS5leGVjKGEpKXtmb3IoYz0wO2M8NDtjKyspaWYod1tjXVsxXS5leGVjKGEpKXtiKz13W2NdWzBdO2JyZWFrfXJldHVybiBzLmV4ZWMoYSk/VyhhLGIrIiBaIik6VyhhLGIpfXJldHVybiBuZXcgRGF0ZShhKX1mdW5jdGlvbiBaKGEsYixjLGQsZSl7dmFyIGY9ZS5yZWxhdGl2ZVRpbWVbYV07cmV0dXJuIHR5cGVvZiBmPT0iZnVuY3Rpb24iP2YoYnx8MSwhIWMsYSxkKTpmLnJlcGxhY2UoLyVkL2ksYnx8MSl9ZnVuY3Rpb24gJChhLGIsYyl7dmFyIGU9ZChNYXRoLmFicyhhKS8xZTMpLGY9ZChlLzYwKSxnPWQoZi82MCksaD1kKGcvMjQpLGk9ZChoLzM2NSksaj1lPDQ1JiZbInMiLGVdfHxmPT09MSYmWyJtIl18fGY8NDUmJlsibW0iLGZdfHxnPT09MSYmWyJoIl18fGc8MjImJlsiaGgiLGddfHxoPT09MSYmWyJkIl18fGg8PTI1JiZbImRkIixoXXx8aDw9NDUmJlsiTSJdfHxoPDM0NSYmWyJNTSIsZChoLzMwKV18fGk9PT0xJiZbInkiXXx8WyJ5eSIsaV07cmV0dXJuIGpbMl09YixqWzNdPWE+MCxqWzRdPWMsWi5hcHBseSh7fSxqKX1mdW5jdGlvbiBfKGEsYyl7Yi5mblthXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLl9pc1VUQz8iVVRDIjoiIjtyZXR1cm4gYSE9bnVsbD8odGhpcy5fZFsic2V0IitiK2NdKGEpLHRoaXMpOnRoaXMuX2RbImdldCIrYitjXSgpfX1mdW5jdGlvbiBhYihhKXtiLmR1cmF0aW9uLmZuW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFbYV19fWZ1bmN0aW9uIGJiKGEsYyl7Yi5kdXJhdGlvbi5mblsiYXMiK2FdPWZ1bmN0aW9uKCl7cmV0dXJuK3RoaXMvY319dmFyIGIsYz0iMS43LjIiLGQ9TWF0aC5yb3VuZCxlLGY9e30sZz0iZW4iLGg9dHlwZW9mIG1vZHVsZSE9InVuZGVmaW5lZCImJm1vZHVsZS5leHBvcnRzLGk9Im1vbnRoc3xtb250aHNTaG9ydHx3ZWVrZGF5c3x3ZWVrZGF5c1Nob3J0fHdlZWtkYXlzTWlufGxvbmdEYXRlRm9ybWF0fGNhbGVuZGFyfHJlbGF0aXZlVGltZXxvcmRpbmFsfG1lcmlkaWVtIi5zcGxpdCgifCIpLGo9L15cLz9EYXRlXCgoXC0/XGQrKS9pLGs9LyhcW1teXFtdKlxdKXwoXFwpPyhNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98WVlZWXxZWXxhfEF8aGg/fEhIP3xtbT98c3M/fFNTP1M/fHp6P3xaWj98LikvZyxsPS8oXFtbXlxbXSpcXSl8KFxcKT8oTFR8TEw/TD9MPykvZyxtPS8oWzAtOWEtekEtWlx1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0rKS9naSxuPS9cZFxkPy8sbz0vXGR7MSwzfS8scD0vXGR7M30vLHE9L1xkezEsNH0vLHI9L1swLTlhLXpcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKy9pLHM9L1p8W1wrXC1dXGRcZDo/XGRcZC9pLHQ9L1QvaSx1PS9eXHMqXGR7NH0tXGRcZC1cZFxkKFQoXGRcZCg6XGRcZCg6XGRcZChcLlxkXGQ/XGQ/KT8pPyk/KT8oW1wrXC1dXGRcZDo/XGRcZCk/KT8vLHY9IllZWVktTU0tRERUSEg6bW06c3NaIix3PVtbIkhIOm1tOnNzLlMiLC9UXGRcZDpcZFxkOlxkXGRcLlxkezEsM30vXSxbIkhIOm1tOnNzIiwvVFxkXGQ6XGRcZDpcZFxkL10sWyJISDptbSIsL1RcZFxkOlxkXGQvXSxbIkhIIiwvVFxkXGQvXV0seD0vKFtcK1wtXXxcZFxkKS9naSx5PSJNb250aHxEYXRlfEhvdXJzfE1pbnV0ZXN8U2Vjb25kc3xNaWxsaXNlY29uZHMiLnNwbGl0KCJ8Iiksej17TWlsbGlzZWNvbmRzOjEsU2Vjb25kczoxZTMsTWludXRlczo2ZTQsSG91cnM6MzZlNSxEYXlzOjg2NGU1LE1vbnRoczoyNTkyZTYsWWVhcnM6MzE1MzZlNn0sQT17fSxCPSJEREQgdyBNIEQgZCIuc3BsaXQoIiAiKSxDPSJNIEQgSCBoIG0gcyB3Ii5zcGxpdCgiICIpLEQ9e006ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb250aCgpKzF9LE1NTTpmdW5jdGlvbihhKXtyZXR1cm4gRSgibW9udGhzU2hvcnQiLHRoaXMubW9udGgoKSx0aGlzLGEpfSxNTU1NOmZ1bmN0aW9uKGEpe3JldHVybiBFKCJtb250aHMiLHRoaXMubW9udGgoKSx0aGlzLGEpfSxEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0ZSgpfSxEREQ6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSh0aGlzLnllYXIoKSx0aGlzLm1vbnRoKCksdGhpcy5kYXRlKCkpLGI9bmV3IERhdGUodGhpcy55ZWFyKCksMCwxKTtyZXR1cm5+figoYS1iKS84NjRlNSsxLjUpfSxkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF5KCl9LGRkOmZ1bmN0aW9uKGEpe3JldHVybiBFKCJ3ZWVrZGF5c01pbiIsdGhpcy5kYXkoKSx0aGlzLGEpfSxkZGQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEUoIndlZWtkYXlzU2hvcnQiLHRoaXMuZGF5KCksdGhpcyxhKX0sZGRkZDpmdW5jdGlvbihhKXtyZXR1cm4gRSgid2Vla2RheXMiLHRoaXMuZGF5KCksdGhpcyxhKX0sdzpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlKHRoaXMueWVhcigpLHRoaXMubW9udGgoKSx0aGlzLmRhdGUoKS10aGlzLmRheSgpKzUpLGI9bmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLDAsNCk7cmV0dXJufn4oKGEtYikvODY0ZTUvNysxLjUpfSxZWTpmdW5jdGlvbigpe3JldHVybiBLKHRoaXMueWVhcigpJTEwMCwyKX0sWVlZWTpmdW5jdGlvbigpe3JldHVybiBLKHRoaXMueWVhcigpLDQpfSxhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFuZygpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSx0aGlzLm1pbnV0ZXMoKSwhMCl9LEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYW5nKCkubWVyaWRpZW0odGhpcy5ob3VycygpLHRoaXMubWludXRlcygpLCExKX0sSDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvdXJzKCl9LGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3VycygpJTEyfHwxMn0sbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1pbnV0ZXMoKX0sczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlY29uZHMoKX0sUzpmdW5jdGlvbigpe3JldHVybn5+KHRoaXMubWlsbGlzZWNvbmRzKCkvMTAwKX0sU1M6ZnVuY3Rpb24oKXtyZXR1cm4gSyh+fih0aGlzLm1pbGxpc2Vjb25kcygpLzEwKSwyKX0sU1NTOmZ1bmN0aW9uKCl7cmV0dXJuIEsodGhpcy5taWxsaXNlY29uZHMoKSwzKX0sWjpmdW5jdGlvbigpe3ZhciBhPS10aGlzLnpvbmUoKSxiPSIrIjtyZXR1cm4gYTwwJiYoYT0tYSxiPSItIiksYitLKH5+KGEvNjApLDIpKyI6IitLKH5+YSU2MCwyKX0sWlo6ZnVuY3Rpb24oKXt2YXIgYT0tdGhpcy56b25lKCksYj0iKyI7cmV0dXJuIGE8MCYmKGE9LWEsYj0iLSIpLGIrSyh+figxMCphLzYpLDQpfX07d2hpbGUoQi5sZW5ndGgpZT1CLnBvcCgpLERbZSsibyJdPUcoRFtlXSk7d2hpbGUoQy5sZW5ndGgpZT1DLnBvcCgpLERbZStlXT1GKERbZV0sMik7RC5EREREPUYoRC5EREQsMyksYj1mdW5jdGlvbihjLGQpe2lmKGM9PT1udWxsfHxjPT09IiIpcmV0dXJuIG51bGw7dmFyIGUsZjtyZXR1cm4gYi5pc01vbWVudChjKT9uZXcgSChuZXcgRGF0ZSgrYy5fZCksYy5faXNVVEMsYy5fbGFuZyk6KGQ/TShkKT9lPVgoYyxkKTplPVcoYyxkKTooZj1qLmV4ZWMoYyksZT1jPT09YT9uZXcgRGF0ZTpmP25ldyBEYXRlKCtmWzFdKTpjIGluc3RhbmNlb2YgRGF0ZT9jOk0oYyk/TyhjKTp0eXBlb2YgYz09InN0cmluZyI/WShjKTpuZXcgRGF0ZShjKSksbmV3IEgoZSkpfSxiLnV0Yz1mdW5jdGlvbihhLGMpe3JldHVybiBNKGEpP25ldyBIKE8oYSwhMCksITApOih0eXBlb2YgYT09InN0cmluZyImJiFzLmV4ZWMoYSkmJihhKz0iICswMDAwIixjJiYoYys9IiBaIikpLGIoYSxjKS51dGMoKSl9LGIudW5peD1mdW5jdGlvbihhKXtyZXR1cm4gYihhKjFlMyl9LGIuZHVyYXRpb249ZnVuY3Rpb24oYSxjKXt2YXIgZD1iLmlzRHVyYXRpb24oYSksZT10eXBlb2YgYT09Im51bWJlciIsZj1kP2EuX2RhdGE6ZT97fTphLGc7cmV0dXJuIGUmJihjP2ZbY109YTpmLm1pbGxpc2Vjb25kcz1hKSxnPW5ldyBJKGYpLGQmJihnLl9sYW5nPWEuX2xhbmcpLGd9LGIuaHVtYW5pemVEdXJhdGlvbj1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIGIuZHVyYXRpb24oYSxjPT09ITA/bnVsbDpjKS5odW1hbml6ZShjPT09ITA/ITA6ZCl9LGIudmVyc2lvbj1jLGIuZGVmYXVsdEZvcm1hdD12LGIubGFuZz1mdW5jdGlvbihhLGMpe3ZhciBkO2lmKCFhKXJldHVybiBnOyhjfHwhZlthXSkmJlAoYSxjKTtpZihmW2FdKXtmb3IoZD0wO2Q8aS5sZW5ndGg7ZCsrKWJbaVtkXV09ZlthXVtpW2RdXTtiLm1vbnRoc1BhcnNlPWZbYV0ubW9udGhzUGFyc2UsZz1hfX0sYi5sYW5nRGF0YT1RLGIuaXNNb21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBIfSxiLmlzRHVyYXRpb249ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBJfSxiLmxhbmcoImVuIix7bW9udGhzOiJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyIi5zcGxpdCgiXyIpLG1vbnRoc1Nob3J0OiJKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYyIuc3BsaXQoIl8iKSx3ZWVrZGF5czoiU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXkiLnNwbGl0KCJfIiksd2Vla2RheXNTaG9ydDoiU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Ii5zcGxpdCgiXyIpLHdlZWtkYXlzTWluOiJTdV9Nb19UdV9XZV9UaF9Gcl9TYSIuc3BsaXQoIl8iKSxsb25nRGF0ZUZvcm1hdDp7TFQ6Img6bW0gQSIsTDoiTU0vREQvWVlZWSIsTEw6Ik1NTU0gRCBZWVlZIixMTEw6Ik1NTU0gRCBZWVlZIExUIixMTExMOiJkZGRkLCBNTU1NIEQgWVlZWSBMVCJ9LG1lcmlkaWVtOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYT4xMT9jPyJwbSI6IlBNIjpjPyJhbSI6IkFNIn0sY2FsZW5kYXI6e3NhbWVEYXk6IltUb2RheSBhdF0gTFQiLG5leHREYXk6IltUb21vcnJvdyBhdF0gTFQiLG5leHRXZWVrOiJkZGRkIFthdF0gTFQiLGxhc3REYXk6IltZZXN0ZXJkYXkgYXRdIExUIixsYXN0V2VlazoiW2xhc3RdIGRkZGQgW2F0XSBMVCIsc2FtZUVsc2U6IkwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZToiaW4gJXMiLHBhc3Q6IiVzIGFnbyIsczoiYSBmZXcgc2Vjb25kcyIsbToiYSBtaW51dGUiLG1tOiIlZCBtaW51dGVzIixoOiJhbiBob3VyIixoaDoiJWQgaG91cnMiLGQ6ImEgZGF5IixkZDoiJWQgZGF5cyIsTToiYSBtb250aCIsTU06IiVkIG1vbnRocyIseToiYSB5ZWFyIix5eToiJWQgeWVhcnMifSxvcmRpbmFsOmZ1bmN0aW9uKGEpe3ZhciBiPWElMTA7cmV0dXJufn4oYSUxMDAvMTApPT09MT8idGgiOmI9PT0xPyJzdCI6Yj09PTI/Im5kIjpiPT09Mz8icmQiOiJ0aCJ9fSksYi5mbj1ILnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzKX0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybit0aGlzLl9kfSx1bml4OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IoK3RoaXMuX2QvMWUzKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZC50b1N0cmluZygpfSx0b0RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZH0sdG9BcnJheTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuW2EueWVhcigpLGEubW9udGgoKSxhLmRhdGUoKSxhLmhvdXJzKCksYS5taW51dGVzKCksYS5zZWNvbmRzKCksYS5taWxsaXNlY29uZHMoKSwhIXRoaXMuX2lzVVRDXX0saXNWYWxpZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hP3RoaXMuX2FbOF0hPW51bGw/ISF0aGlzLl9hWzhdOiFOKHRoaXMuX2EsKHRoaXMuX2FbN10/Yi51dGModGhpcy5fYSk6Yih0aGlzLl9hKSkudG9BcnJheSgpKTohaXNOYU4odGhpcy5fZC5nZXRUaW1lKCkpfSx1dGM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNVVEM9ITAsdGhpc30sbG9jYWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNVVEM9ITEsdGhpc30sZm9ybWF0OmZ1bmN0aW9uKGEpe3JldHVybiBUKHRoaXMsYT9hOmIuZGVmYXVsdEZvcm1hdCl9LGFkZDpmdW5jdGlvbihhLGMpe3ZhciBkPWM/Yi5kdXJhdGlvbigrYyxhKTpiLmR1cmF0aW9uKGEpO3JldHVybiBMKHRoaXMsZCwxKSx0aGlzfSxzdWJ0cmFjdDpmdW5jdGlvbihhLGMpe3ZhciBkPWM/Yi5kdXJhdGlvbigrYyxhKTpiLmR1cmF0aW9uKGEpO3JldHVybiBMKHRoaXMsZCwtMSksdGhpc30sZGlmZjpmdW5jdGlvbihhLGMsZSl7dmFyIGY9dGhpcy5faXNVVEM/YihhKS51dGMoKTpiKGEpLmxvY2FsKCksZz0odGhpcy56b25lKCktZi56b25lKCkpKjZlNCxoPXRoaXMuX2QtZi5fZC1nLGk9dGhpcy55ZWFyKCktZi55ZWFyKCksaj10aGlzLm1vbnRoKCktZi5tb250aCgpLGs9dGhpcy5kYXRlKCktZi5kYXRlKCksbDtyZXR1cm4gYz09PSJtb250aHMiP2w9aSoxMitqK2svMzA6Yz09PSJ5ZWFycyI/bD1pKyhqK2svMzApLzEyOmw9Yz09PSJzZWNvbmRzIj9oLzFlMzpjPT09Im1pbnV0ZXMiP2gvNmU0OmM9PT0iaG91cnMiP2gvMzZlNTpjPT09ImRheXMiP2gvODY0ZTU6Yz09PSJ3ZWVrcyI/aC82MDQ4ZTU6aCxlP2w6ZChsKX0sZnJvbTpmdW5jdGlvbihhLGMpe3JldHVybiBiLmR1cmF0aW9uKHRoaXMuZGlmZihhKSkubGFuZyh0aGlzLl9sYW5nKS5odW1hbml6ZSghYyl9LGZyb21Ob3c6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbShiKCksYSl9LGNhbGVuZGFyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaWZmKGIoKS5zb2QoKSwiZGF5cyIsITApLGM9dGhpcy5sYW5nKCkuY2FsZW5kYXIsZD1jLnNhbWVFbHNlLGU9YTwtNj9kOmE8LTE/Yy5sYXN0V2VlazphPDA/Yy5sYXN0RGF5OmE8MT9jLnNhbWVEYXk6YTwyP2MubmV4dERheTphPDc/Yy5uZXh0V2VlazpkO3JldHVybiB0aGlzLmZvcm1hdCh0eXBlb2YgZT09ImZ1bmN0aW9uIj9lLmFwcGx5KHRoaXMpOmUpfSxpc0xlYXBZZWFyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55ZWFyKCk7cmV0dXJuIGElND09PTAmJmElMTAwIT09MHx8YSU0MDA9PT0wfSxpc0RTVDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpvbmUoKTxiKFt0aGlzLnllYXIoKV0pLnpvbmUoKXx8dGhpcy56b25lKCk8YihbdGhpcy55ZWFyKCksNV0pLnpvbmUoKX0sZGF5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2lzVVRDP3RoaXMuX2QuZ2V0VVRDRGF5KCk6dGhpcy5fZC5nZXREYXkoKTtyZXR1cm4gYT09bnVsbD9iOnRoaXMuYWRkKHtkOmEtYn0pfSxzdGFydE9mOmZ1bmN0aW9uKGEpe3N3aXRjaChhLnJlcGxhY2UoL3MkLywiIikpe2Nhc2UieWVhciI6dGhpcy5tb250aCgwKTtjYXNlIm1vbnRoIjp0aGlzLmRhdGUoMSk7Y2FzZSJkYXkiOnRoaXMuaG91cnMoMCk7Y2FzZSJob3VyIjp0aGlzLm1pbnV0ZXMoMCk7Y2FzZSJtaW51dGUiOnRoaXMuc2Vjb25kcygwKTtjYXNlInNlY29uZCI6dGhpcy5taWxsaXNlY29uZHMoMCl9cmV0dXJuIHRoaXN9LGVuZE9mOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0YXJ0T2YoYSkuYWRkKGEucmVwbGFjZSgvcz8kLywicyIpLDEpLnN1YnRyYWN0KCJtcyIsMSl9LHNvZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuc3RhcnRPZigiZGF5Iil9LGVvZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuZW5kT2YoImRheSIpfSx6b25lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVVRDPzA6dGhpcy5fZC5nZXRUaW1lem9uZU9mZnNldCgpfSxkYXlzSW5Nb250aDpmdW5jdGlvbigpe3JldHVybiBiLnV0YyhbdGhpcy55ZWFyKCksdGhpcy5tb250aCgpKzEsMF0pLmRhdGUoKX0sbGFuZzpmdW5jdGlvbihiKXtyZXR1cm4gYj09PWE/USh0aGlzKToodGhpcy5fbGFuZz1iLHRoaXMpfX07Zm9yKGU9MDtlPHkubGVuZ3RoO2UrKylfKHlbZV0udG9Mb3dlckNhc2UoKSx5W2VdKTtfKCJ5ZWFyIiwiRnVsbFllYXIiKSxiLmR1cmF0aW9uLmZuPUkucHJvdG90eXBlPXt3ZWVrczpmdW5jdGlvbigpe3JldHVybiBKKHRoaXMuZGF5cygpLzcpfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcyt0aGlzLl9kYXlzKjg2NGU1K3RoaXMuX21vbnRocyoyNTkyZTZ9LGh1bWFuaXplOmZ1bmN0aW9uKGEpe3ZhciBiPSt0aGlzLGM9dGhpcy5sYW5nKCkucmVsYXRpdmVUaW1lLGQ9JChiLCFhLHRoaXMubGFuZygpKSxlPWI8PTA/Yy5wYXN0OmMuZnV0dXJlO3JldHVybiBhJiYodHlwZW9mIGU9PSJmdW5jdGlvbiI/ZD1lKGQpOmQ9ZS5yZXBsYWNlKC8lcy9pLGQpKSxkfSxsYW5nOmIuZm4ubGFuZ307Zm9yKGUgaW4geil6Lmhhc093blByb3BlcnR5KGUpJiYoYmIoZSx6W2VdKSxhYihlLnRvTG93ZXJDYXNlKCkpKTtiYigiV2Vla3MiLDYwNDhlNSksaCYmKG1vZHVsZS5leHBvcnRzPWIpLHR5cGVvZiBlbmRlcj09InVuZGVmaW5lZCImJih0aGlzLm1vbWVudD1iKSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoIm1vbWVudCIsW10sZnVuY3Rpb24oKXtyZXR1cm4gYn0pfSkuY2FsbCh0aGlzKTsKOwovLyDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgXFwKLy8g4pSCIFJhcGhhw6tsIDIuMS4wIC0gSmF2YVNjcmlwdCBWZWN0b3IgTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCIFxcCi8vIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpCBcXAovLyDilIIgQ29weXJpZ2h0IMKpIDIwMDgtMjAxMiBEbWl0cnkgQmFyYW5vdnNraXkgKGh0dHA6Ly9yYXBoYWVsanMuY29tKSAgICDilIIgXFwKLy8g4pSCIENvcHlyaWdodCDCqSAyMDA4LTIwMTIgU2VuY2hhIExhYnMgKGh0dHA6Ly9zZW5jaGEuY29tKSAgICAgICAgICAgICAg4pSCIFxcCi8vIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpCBcXAovLyDilIIgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCAoaHR0cDovL3JhcGhhZWxqcy5jb20vbGljZW5zZS5odG1sKSBsaWNlbnNlLuKUgiBcXAovLyDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggXFwKCihmdW5jdGlvbihhKXt2YXIgYj0iMC4zLjQiLGM9Imhhc093blByb3BlcnR5IixkPS9bXC5cL10vLGU9IioiLGY9ZnVuY3Rpb24oKXt9LGc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS1ifSxoLGksaj17bjp7fX0saz1mdW5jdGlvbihhLGIpe3ZhciBjPWosZD1pLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLGY9ay5saXN0ZW5lcnMoYSksbD0wLG09ITEsbixvPVtdLHA9e30scT1bXSxyPWgscz1bXTtoPWEsaT0wO2Zvcih2YXIgdD0wLHU9Zi5sZW5ndGg7dDx1O3QrKykiekluZGV4ImluIGZbdF0mJihvLnB1c2goZlt0XS56SW5kZXgpLGZbdF0uekluZGV4PDAmJihwW2ZbdF0uekluZGV4XT1mW3RdKSk7by5zb3J0KGcpO3doaWxlKG9bbF08MCl7bj1wW29bbCsrXV0scS5wdXNoKG4uYXBwbHkoYixlKSk7aWYoaSl7aT1kO3JldHVybiBxfX1mb3IodD0wO3Q8dTt0Kyspe249Zlt0XTtpZigiekluZGV4ImluIG4paWYobi56SW5kZXg9PW9bbF0pe3EucHVzaChuLmFwcGx5KGIsZSkpO2lmKGkpYnJlYWs7ZG97bCsrLG49cFtvW2xdXSxuJiZxLnB1c2gobi5hcHBseShiLGUpKTtpZihpKWJyZWFrfXdoaWxlKG4pfWVsc2UgcFtuLnpJbmRleF09bjtlbHNle3EucHVzaChuLmFwcGx5KGIsZSkpO2lmKGkpYnJlYWt9fWk9ZCxoPXI7cmV0dXJuIHEubGVuZ3RoP3E6bnVsbH07ay5saXN0ZW5lcnM9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zcGxpdChkKSxjPWosZixnLGgsaSxrLGwsbSxuLG89W2NdLHA9W107Zm9yKGk9MCxrPWIubGVuZ3RoO2k8aztpKyspe249W107Zm9yKGw9MCxtPW8ubGVuZ3RoO2w8bTtsKyspe2M9b1tsXS5uLGc9W2NbYltpXV0sY1tlXV0saD0yO3doaWxlKGgtLSlmPWdbaF0sZiYmKG4ucHVzaChmKSxwPXAuY29uY2F0KGYuZnx8W10pKX1vPW59cmV0dXJuIHB9LGsub249ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnNwbGl0KGQpLGU9ajtmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspZT1lLm4sIWVbY1tnXV0mJihlW2NbZ11dPXtuOnt9fSksZT1lW2NbZ11dO2UuZj1lLmZ8fFtdO2ZvcihnPTAsaD1lLmYubGVuZ3RoO2c8aDtnKyspaWYoZS5mW2ddPT1iKXJldHVybiBmO2UuZi5wdXNoKGIpO3JldHVybiBmdW5jdGlvbihhKXsrYT09K2EmJihiLnpJbmRleD0rYSl9fSxrLnN0b3A9ZnVuY3Rpb24oKXtpPTF9LGsubnQ9ZnVuY3Rpb24oYSl7aWYoYSlyZXR1cm4obmV3IFJlZ0V4cCgiKD86XFwufFxcL3xeKSIrYSsiKD86XFwufFxcL3wkKSIpKS50ZXN0KGgpO3JldHVybiBofSxrLm9mZj1rLnVuYmluZD1mdW5jdGlvbihhLGIpe3ZhciBmPWEuc3BsaXQoZCksZyxoLGksayxsLG0sbixvPVtqXTtmb3Ioaz0wLGw9Zi5sZW5ndGg7azxsO2srKylmb3IobT0wO208by5sZW5ndGg7bSs9aS5sZW5ndGgtMil7aT1bbSwxXSxnPW9bbV0ubjtpZihmW2tdIT1lKWdbZltrXV0mJmkucHVzaChnW2Zba11dKTtlbHNlIGZvcihoIGluIGcpZ1tjXShoKSYmaS5wdXNoKGdbaF0pO28uc3BsaWNlLmFwcGx5KG8saSl9Zm9yKGs9MCxsPW8ubGVuZ3RoO2s8bDtrKyspe2c9b1trXTt3aGlsZShnLm4pe2lmKGIpe2lmKGcuZil7Zm9yKG09MCxuPWcuZi5sZW5ndGg7bTxuO20rKylpZihnLmZbbV09PWIpe2cuZi5zcGxpY2UobSwxKTticmVha30hZy5mLmxlbmd0aCYmZGVsZXRlIGcuZn1mb3IoaCBpbiBnLm4paWYoZy5uW2NdKGgpJiZnLm5baF0uZil7dmFyIHA9Zy5uW2hdLmY7Zm9yKG09MCxuPXAubGVuZ3RoO208bjttKyspaWYocFttXT09Yil7cC5zcGxpY2UobSwxKTticmVha30hcC5sZW5ndGgmJmRlbGV0ZSBnLm5baF0uZn19ZWxzZXtkZWxldGUgZy5mO2ZvcihoIGluIGcubilnLm5bY10oaCkmJmcubltoXS5mJiZkZWxldGUgZy5uW2hdLmZ9Zz1nLm59fX0say5vbmNlPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oKXt2YXIgZD1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtrLnVuYmluZChhLGMpO3JldHVybiBkfTtyZXR1cm4gay5vbihhLGMpfSxrLnZlcnNpb249YixrLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIllvdSBhcmUgcnVubmluZyBFdmUgIitifSx0eXBlb2YgbW9kdWxlIT0idW5kZWZpbmVkIiYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9azp0eXBlb2YgZGVmaW5lIT0idW5kZWZpbmVkIj9kZWZpbmUoImV2ZSIsW10sZnVuY3Rpb24oKXtyZXR1cm4ga30pOmEuZXZlPWt9KSh0aGlzKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGNGKGEpe2Zvcih2YXIgYj0wO2I8Y3kubGVuZ3RoO2IrKyljeVtiXS5lbC5wYXBlcj09YSYmY3kuc3BsaWNlKGItLSwxKX1mdW5jdGlvbiBjRShiLGQsZSxmLGgsaSl7ZT1RKGUpO3ZhciBqLGssbCxtPVtdLG8scCxxLHQ9Yi5tcyx1PXt9LHY9e30sdz17fTtpZihmKWZvcih5PTAsej1jeS5sZW5ndGg7eTx6O3krKyl7dmFyIHg9Y3lbeV07aWYoeC5lbC5pZD09ZC5pZCYmeC5hbmltPT1iKXt4LnBlcmNlbnQhPWU/KGN5LnNwbGljZSh5LDEpLGw9MSk6az14LGQuYXR0cih4LnRvdGFsT3JpZ2luKTticmVha319ZWxzZSBmPSt2O2Zvcih2YXIgeT0wLHo9Yi5wZXJjZW50cy5sZW5ndGg7eTx6O3krKyl7aWYoYi5wZXJjZW50c1t5XT09ZXx8Yi5wZXJjZW50c1t5XT5mKmIudG9wKXtlPWIucGVyY2VudHNbeV0scD1iLnBlcmNlbnRzW3ktMV18fDAsdD10L2IudG9wKihlLXApLG89Yi5wZXJjZW50c1t5KzFdLGo9Yi5hbmltW2VdO2JyZWFrfWYmJmQuYXR0cihiLmFuaW1bYi5wZXJjZW50c1t5XV0pfWlmKCEhail7aWYoIWspe2Zvcih2YXIgQSBpbiBqKWlmKGpbZ10oQSkpaWYoVVtnXShBKXx8ZC5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2ddKEEpKXt1W0FdPWQuYXR0cihBKSx1W0FdPT1udWxsJiYodVtBXT1UW0FdKSx2W0FdPWpbQV07c3dpdGNoKFVbQV0pe2Nhc2UgQzp3W0FdPSh2W0FdLXVbQV0pL3Q7YnJlYWs7Y2FzZSJjb2xvdXIiOnVbQV09YS5nZXRSR0IodVtBXSk7dmFyIEI9YS5nZXRSR0IodltBXSk7d1tBXT17cjooQi5yLXVbQV0ucikvdCxnOihCLmctdVtBXS5nKS90LGI6KEIuYi11W0FdLmIpL3R9O2JyZWFrO2Nhc2UicGF0aCI6dmFyIEQ9YlIodVtBXSx2W0FdKSxFPURbMV07dVtBXT1EWzBdLHdbQV09W107Zm9yKHk9MCx6PXVbQV0ubGVuZ3RoO3k8ejt5Kyspe3dbQV1beV09WzBdO2Zvcih2YXIgRj0xLEc9dVtBXVt5XS5sZW5ndGg7RjxHO0YrKyl3W0FdW3ldW0ZdPShFW3ldW0ZdLXVbQV1beV1bRl0pL3R9YnJlYWs7Y2FzZSJ0cmFuc2Zvcm0iOnZhciBIPWQuXyxJPWNhKEhbQV0sdltBXSk7aWYoSSl7dVtBXT1JLmZyb20sdltBXT1JLnRvLHdbQV09W10sd1tBXS5yZWFsPSEwO2Zvcih5PTAsej11W0FdLmxlbmd0aDt5PHo7eSsrKXt3W0FdW3ldPVt1W0FdW3ldWzBdXTtmb3IoRj0xLEc9dVtBXVt5XS5sZW5ndGg7RjxHO0YrKyl3W0FdW3ldW0ZdPSh2W0FdW3ldW0ZdLXVbQV1beV1bRl0pL3R9fWVsc2V7dmFyIEo9ZC5tYXRyaXh8fG5ldyBjYixLPXtfOnt0cmFuc2Zvcm06SC50cmFuc2Zvcm19LGdldEJCb3g6ZnVuY3Rpb24oKXtyZXR1cm4gZC5nZXRCQm94KDEpfX07dVtBXT1bSi5hLEouYixKLmMsSi5kLEouZSxKLmZdLGIkKEssdltBXSksdltBXT1LLl8udHJhbnNmb3JtLHdbQV09WyhLLm1hdHJpeC5hLUouYSkvdCwoSy5tYXRyaXguYi1KLmIpL3QsKEsubWF0cml4LmMtSi5jKS90LChLLm1hdHJpeC5kLUouZCkvdCwoSy5tYXRyaXguZS1KLmUpL3QsKEsubWF0cml4LmYtSi5mKS90XX1icmVhaztjYXNlImNzdiI6dmFyIEw9cihqW0FdKVtzXShjKSxNPXIodVtBXSlbc10oYyk7aWYoQT09ImNsaXAtcmVjdCIpe3VbQV09TSx3W0FdPVtdLHk9TS5sZW5ndGg7d2hpbGUoeS0tKXdbQV1beV09KExbeV0tdVtBXVt5XSkvdH12W0FdPUw7YnJlYWs7ZGVmYXVsdDpMPVtdW25dKGpbQV0pLE09W11bbl0odVtBXSksd1tBXT1bXSx5PWQucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tBXS5sZW5ndGg7d2hpbGUoeS0tKXdbQV1beV09KChMW3ldfHwwKS0oTVt5XXx8MCkpL3R9fXZhciBPPWouZWFzaW5nLFA9YS5lYXNpbmdfZm9ybXVsYXNbT107aWYoIVApe1A9cihPKS5tYXRjaChOKTtpZihQJiZQLmxlbmd0aD09NSl7dmFyIFI9UDtQPWZ1bmN0aW9uKGEpe3JldHVybiBjQyhhLCtSWzFdLCtSWzJdLCtSWzNdLCtSWzRdLHQpfX1lbHNlIFA9YmZ9cT1qLnN0YXJ0fHxiLnN0YXJ0fHwrKG5ldyBEYXRlKSx4PXthbmltOmIscGVyY2VudDplLHRpbWVzdGFtcDpxLHN0YXJ0OnErKGIuZGVsfHwwKSxzdGF0dXM6MCxpbml0c3RhdHVzOmZ8fDAsc3RvcDohMSxtczp0LGVhc2luZzpQLGZyb206dSxkaWZmOncsdG86dixlbDpkLGNhbGxiYWNrOmouY2FsbGJhY2sscHJldjpwLG5leHQ6byxyZXBlYXQ6aXx8Yi50aW1lcyxvcmlnaW46ZC5hdHRyKCksdG90YWxPcmlnaW46aH0sY3kucHVzaCh4KTtpZihmJiYhayYmIWwpe3guc3RvcD0hMCx4LnN0YXJ0PW5ldyBEYXRlLXQqZjtpZihjeS5sZW5ndGg9PTEpcmV0dXJuIGNBKCl9bCYmKHguc3RhcnQ9bmV3IERhdGUteC5tcypmKSxjeS5sZW5ndGg9PTEmJmN6KGNBKX1lbHNlIGsuaW5pdHN0YXR1cz1mLGsuc3RhcnQ9bmV3IERhdGUtay5tcypmO2V2ZSgicmFwaGFlbC5hbmltLnN0YXJ0LiIrZC5pZCxkLGIpfX1mdW5jdGlvbiBjRChhLGIpe3ZhciBjPVtdLGQ9e307dGhpcy5tcz1iLHRoaXMudGltZXM9MTtpZihhKXtmb3IodmFyIGUgaW4gYSlhW2ddKGUpJiYoZFtRKGUpXT1hW2VdLGMucHVzaChRKGUpKSk7Yy5zb3J0KGJkKX10aGlzLmFuaW09ZCx0aGlzLnRvcD1jW2MubGVuZ3RoLTFdLHRoaXMucGVyY2VudHM9Y31mdW5jdGlvbiBjQyhhLGIsYyxkLGUsZil7ZnVuY3Rpb24gbyhhLGIpe3ZhciBjLGQsZSxmLGosaztmb3IoZT1hLGs9MDtrPDg7aysrKXtmPW0oZSktYTtpZih6KGYpPGIpcmV0dXJuIGU7aj0oMyppKmUrMipoKSplK2c7aWYoeihqKTwxZS02KWJyZWFrO2U9ZS1mL2p9Yz0wLGQ9MSxlPWE7aWYoZTxjKXJldHVybiBjO2lmKGU+ZClyZXR1cm4gZDt3aGlsZShjPGQpe2Y9bShlKTtpZih6KGYtYSk8YilyZXR1cm4gZTthPmY/Yz1lOmQ9ZSxlPShkLWMpLzIrY31yZXR1cm4gZX1mdW5jdGlvbiBuKGEsYil7dmFyIGM9byhhLGIpO3JldHVybigobCpjK2spKmMraikqY31mdW5jdGlvbiBtKGEpe3JldHVybigoaSphK2gpKmErZykqYX12YXIgZz0zKmIsaD0zKihkLWIpLWcsaT0xLWctaCxqPTMqYyxrPTMqKGUtYyktaixsPTEtai1rO3JldHVybiBuKGEsMS8oMjAwKmYpKX1mdW5jdGlvbiBjcSgpe3JldHVybiB0aGlzLngrcSt0aGlzLnkrcSt0aGlzLndpZHRoKyIgw5cgIit0aGlzLmhlaWdodH1mdW5jdGlvbiBjcCgpe3JldHVybiB0aGlzLngrcSt0aGlzLnl9ZnVuY3Rpb24gY2IoYSxiLGMsZCxlLGYpe2EhPW51bGw/KHRoaXMuYT0rYSx0aGlzLmI9K2IsdGhpcy5jPStjLHRoaXMuZD0rZCx0aGlzLmU9K2UsdGhpcy5mPStmKToodGhpcy5hPTEsdGhpcy5iPTAsdGhpcy5jPTAsdGhpcy5kPTEsdGhpcy5lPTAsdGhpcy5mPTApfWZ1bmN0aW9uIGJIKGIsYyxkKXtiPWEuX3BhdGgyY3VydmUoYiksYz1hLl9wYXRoMmN1cnZlKGMpO3ZhciBlLGYsZyxoLGksaixrLGwsbSxuLG89ZD8wOltdO2Zvcih2YXIgcD0wLHE9Yi5sZW5ndGg7cDxxO3ArKyl7dmFyIHI9YltwXTtpZihyWzBdPT0iTSIpZT1pPXJbMV0sZj1qPXJbMl07ZWxzZXtyWzBdPT0iQyI/KG09W2UsZl0uY29uY2F0KHIuc2xpY2UoMSkpLGU9bVs2XSxmPW1bN10pOihtPVtlLGYsZSxmLGksaixpLGpdLGU9aSxmPWopO2Zvcih2YXIgcz0wLHQ9Yy5sZW5ndGg7czx0O3MrKyl7dmFyIHU9Y1tzXTtpZih1WzBdPT0iTSIpZz1rPXVbMV0saD1sPXVbMl07ZWxzZXt1WzBdPT0iQyI/KG49W2csaF0uY29uY2F0KHUuc2xpY2UoMSkpLGc9bls2XSxoPW5bN10pOihuPVtnLGgsZyxoLGssbCxrLGxdLGc9ayxoPWwpO3ZhciB2PWJHKG0sbixkKTtpZihkKW8rPXY7ZWxzZXtmb3IodmFyIHc9MCx4PXYubGVuZ3RoO3c8eDt3Kyspdlt3XS5zZWdtZW50MT1wLHZbd10uc2VnbWVudDI9cyx2W3ddLmJlejE9bSx2W3ddLmJlejI9bjtvPW8uY29uY2F0KHYpfX19fX1yZXR1cm4gb31mdW5jdGlvbiBiRyhiLGMsZCl7dmFyIGU9YS5iZXppZXJCQm94KGIpLGY9YS5iZXppZXJCQm94KGMpO2lmKCFhLmlzQkJveEludGVyc2VjdChlLGYpKXJldHVybiBkPzA6W107dmFyIGc9YkIuYXBwbHkoMCxiKSxoPWJCLmFwcGx5KDAsYyksaT1+fihnLzUpLGo9fn4oaC81KSxrPVtdLGw9W10sbT17fSxuPWQ/MDpbXTtmb3IodmFyIG89MDtvPGkrMTtvKyspe3ZhciBwPWEuZmluZERvdHNBdFNlZ21lbnQuYXBwbHkoYSxiLmNvbmNhdChvL2kpKTtrLnB1c2goe3g6cC54LHk6cC55LHQ6by9pfSl9Zm9yKG89MDtvPGorMTtvKyspcD1hLmZpbmREb3RzQXRTZWdtZW50LmFwcGx5KGEsYy5jb25jYXQoby9qKSksbC5wdXNoKHt4OnAueCx5OnAueSx0Om8van0pO2ZvcihvPTA7bzxpO28rKylmb3IodmFyIHE9MDtxPGo7cSsrKXt2YXIgcj1rW29dLHM9a1tvKzFdLHQ9bFtxXSx1PWxbcSsxXSx2PXoocy54LXIueCk8LjAwMT8ieSI6IngiLHc9eih1LngtdC54KTwuMDAxPyJ5IjoieCIseD1iRChyLngsci55LHMueCxzLnksdC54LHQueSx1LngsdS55KTtpZih4KXtpZihtW3gueC50b0ZpeGVkKDQpXT09eC55LnRvRml4ZWQoNCkpY29udGludWU7bVt4LngudG9GaXhlZCg0KV09eC55LnRvRml4ZWQoNCk7dmFyIHk9ci50K3ooKHhbdl0tclt2XSkvKHNbdl0tclt2XSkpKihzLnQtci50KSxBPXQudCt6KCh4W3ddLXRbd10pLyh1W3ddLXRbd10pKSoodS50LXQudCk7eT49MCYmeTw9MSYmQT49MCYmQTw9MSYmKGQ/bisrOm4ucHVzaCh7eDp4LngseTp4LnksdDE6eSx0MjpBfSkpfX1yZXR1cm4gbn1mdW5jdGlvbiBiRihhLGIpe3JldHVybiBiRyhhLGIsMSl9ZnVuY3Rpb24gYkUoYSxiKXtyZXR1cm4gYkcoYSxiKX1mdW5jdGlvbiBiRChhLGIsYyxkLGUsZixnLGgpe2lmKCEoeChhLGMpPHkoZSxnKXx8eShhLGMpPngoZSxnKXx8eChiLGQpPHkoZixoKXx8eShiLGQpPngoZixoKSkpe3ZhciBpPShhKmQtYipjKSooZS1nKS0oYS1jKSooZSpoLWYqZyksaj0oYSpkLWIqYykqKGYtaCktKGItZCkqKGUqaC1mKmcpLGs9KGEtYykqKGYtaCktKGItZCkqKGUtZyk7aWYoIWspcmV0dXJuO3ZhciBsPWkvayxtPWovayxuPStsLnRvRml4ZWQoMiksbz0rbS50b0ZpeGVkKDIpO2lmKG48K3koYSxjKS50b0ZpeGVkKDIpfHxuPit4KGEsYykudG9GaXhlZCgyKXx8bjwreShlLGcpLnRvRml4ZWQoMil8fG4+K3goZSxnKS50b0ZpeGVkKDIpfHxvPCt5KGIsZCkudG9GaXhlZCgyKXx8bz4reChiLGQpLnRvRml4ZWQoMil8fG88K3koZixoKS50b0ZpeGVkKDIpfHxvPit4KGYsaCkudG9GaXhlZCgyKSlyZXR1cm47cmV0dXJue3g6bCx5Om19fX1mdW5jdGlvbiBiQyhhLGIsYyxkLGUsZixnLGgsaSl7aWYoIShpPDB8fGJCKGEsYixjLGQsZSxmLGcsaCk8aSkpe3ZhciBqPTEsaz1qLzIsbD1qLWssbSxuPS4wMTttPWJCKGEsYixjLGQsZSxmLGcsaCxsKTt3aGlsZSh6KG0taSk+bilrLz0yLGwrPShtPGk/MTotMSkqayxtPWJCKGEsYixjLGQsZSxmLGcsaCxsKTtyZXR1cm4gbH19ZnVuY3Rpb24gYkIoYSxiLGMsZCxlLGYsZyxoLGkpe2k9PW51bGwmJihpPTEpLGk9aT4xPzE6aTwwPzA6aTt2YXIgaj1pLzIsaz0xMixsPVstMC4xMjUyLC4xMjUyLC0wLjM2NzgsLjM2NzgsLTAuNTg3MywuNTg3MywtMC43Njk5LC43Njk5LC0wLjkwNDEsLjkwNDEsLTAuOTgxNiwuOTgxNl0sbT1bLjI0OTEsLjI0OTEsLjIzMzUsLjIzMzUsLjIwMzIsLjIwMzIsLjE2MDEsLjE2MDEsLjEwNjksLjEwNjksLjA0NzIsLjA0NzJdLG49MDtmb3IodmFyIG89MDtvPGs7bysrKXt2YXIgcD1qKmxbb10raixxPWJBKHAsYSxjLGUsZykscj1iQShwLGIsZCxmLGgpLHM9cSpxK3IqcjtuKz1tW29dKncuc3FydChzKX1yZXR1cm4gaipufWZ1bmN0aW9uIGJBKGEsYixjLGQsZSl7dmFyIGY9LTMqYis5KmMtOSpkKzMqZSxnPWEqZis2KmItMTIqYys2KmQ7cmV0dXJuIGEqZy0zKmIrMypjfWZ1bmN0aW9uIGJ5KGEsYil7dmFyIGM9W107Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtlLTIqIWI+ZDtkKz0yKXt2YXIgZj1be3g6K2FbZC0yXSx5OithW2QtMV19LHt4OithW2RdLHk6K2FbZCsxXX0se3g6K2FbZCsyXSx5OithW2QrM119LHt4OithW2QrNF0seTorYVtkKzVdfV07Yj9kP2UtND09ZD9mWzNdPXt4OithWzBdLHk6K2FbMV19OmUtMj09ZCYmKGZbMl09e3g6K2FbMF0seTorYVsxXX0sZlszXT17eDorYVsyXSx5OithWzNdfSk6ZlswXT17eDorYVtlLTJdLHk6K2FbZS0xXX06ZS00PT1kP2ZbM109ZlsyXTpkfHwoZlswXT17eDorYVtkXSx5OithW2QrMV19KSxjLnB1c2goWyJDIiwoLWZbMF0ueCs2KmZbMV0ueCtmWzJdLngpLzYsKC1mWzBdLnkrNipmWzFdLnkrZlsyXS55KS82LChmWzFdLngrNipmWzJdLngtZlszXS54KS82LChmWzFdLnkrNipmWzJdLnktZlszXS55KS82LGZbMl0ueCxmWzJdLnldKX1yZXR1cm4gY31mdW5jdGlvbiBieCgpe3JldHVybiB0aGlzLmhleH1mdW5jdGlvbiBidihhLGIsYyl7ZnVuY3Rpb24gZCgpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxmPWUuam9pbigi4pCAIiksaD1kLmNhY2hlPWQuY2FjaGV8fHt9LGk9ZC5jb3VudD1kLmNvdW50fHxbXTtpZihoW2ddKGYpKXtidShpLGYpO3JldHVybiBjP2MoaFtmXSk6aFtmXX1pLmxlbmd0aD49MWUzJiZkZWxldGUgaFtpLnNoaWZ0KCldLGkucHVzaChmKSxoW2ZdPWFbbV0oYixlKTtyZXR1cm4gYz9jKGhbZl0pOmhbZl19cmV0dXJuIGR9ZnVuY3Rpb24gYnUoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspaWYoYVtjXT09PWIpcmV0dXJuIGEucHVzaChhLnNwbGljZShjLDEpWzBdKX1mdW5jdGlvbiBibShhKXtpZihPYmplY3QoYSkhPT1hKXJldHVybiBhO3ZhciBiPW5ldyBhLmNvbnN0cnVjdG9yO2Zvcih2YXIgYyBpbiBhKWFbZ10oYykmJihiW2NdPWJtKGFbY10pKTtyZXR1cm4gYn1mdW5jdGlvbiBhKGMpe2lmKGEuaXMoYywiZnVuY3Rpb24iKSlyZXR1cm4gYj9jKCk6ZXZlLm9uKCJyYXBoYWVsLkRPTWxvYWQiLGMpO2lmKGEuaXMoYyxFKSlyZXR1cm4gYS5fZW5naW5lLmNyZWF0ZVttXShhLGMuc3BsaWNlKDAsMythLmlzKGNbMF0sQykpKS5hZGQoYyk7dmFyIGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO2lmKGEuaXMoZFtkLmxlbmd0aC0xXSwiZnVuY3Rpb24iKSl7dmFyIGU9ZC5wb3AoKTtyZXR1cm4gYj9lLmNhbGwoYS5fZW5naW5lLmNyZWF0ZVttXShhLGQpKTpldmUub24oInJhcGhhZWwuRE9NbG9hZCIsZnVuY3Rpb24oKXtlLmNhbGwoYS5fZW5naW5lLmNyZWF0ZVttXShhLGQpKX0pfXJldHVybiBhLl9lbmdpbmUuY3JlYXRlW21dKGEsYXJndW1lbnRzKX1hLnZlcnNpb249IjIuMS4wIixhLmV2ZT1ldmU7dmFyIGIsYz0vWywgXSsvLGQ9e2NpcmNsZToxLHJlY3Q6MSxwYXRoOjEsZWxsaXBzZToxLHRleHQ6MSxpbWFnZToxfSxlPS9ceyhcZCspXH0vZyxmPSJwcm90b3R5cGUiLGc9Imhhc093blByb3BlcnR5IixoPXtkb2M6ZG9jdW1lbnQsd2luOndpbmRvd30saT17d2FzOk9iamVjdC5wcm90b3R5cGVbZ10uY2FsbChoLndpbiwiUmFwaGFlbCIpLGlzOmgud2luLlJhcGhhZWx9LGo9ZnVuY3Rpb24oKXt0aGlzLmNhPXRoaXMuY3VzdG9tQXR0cmlidXRlcz17fX0sayxsPSJhcHBlbmRDaGlsZCIsbT0iYXBwbHkiLG49ImNvbmNhdCIsbz0iY3JlYXRlVG91Y2giaW4gaC5kb2MscD0iIixxPSIgIixyPVN0cmluZyxzPSJzcGxpdCIsdD0iY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNlbW92ZSBtb3VzZW91dCBtb3VzZW92ZXIgbW91c2V1cCB0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCJbc10ocSksdT17bW91c2Vkb3duOiJ0b3VjaHN0YXJ0Iixtb3VzZW1vdmU6InRvdWNobW92ZSIsbW91c2V1cDoidG91Y2hlbmQifSx2PXIucHJvdG90eXBlLnRvTG93ZXJDYXNlLHc9TWF0aCx4PXcubWF4LHk9dy5taW4sej13LmFicyxBPXcucG93LEI9dy5QSSxDPSJudW1iZXIiLEQ9InN0cmluZyIsRT0iYXJyYXkiLEY9InRvU3RyaW5nIixHPSJmaWxsIixIPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsST17fSxKPSJwdXNoIixLPWEuX0lTVVJMPS9edXJsXChbJyJdPyhbXlwpXSs/KVsnIl0/XCkkL2ksTD0vXlxzKigoI1thLWZcZF17Nn0pfCgjW2EtZlxkXXszfSl8cmdiYT9cKFxzKihbXGRcLl0rJT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSslPyg/OlxzKixccypbXGRcLl0rJT8pPylccypcKXxoc2JhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8pJT9ccypcKXxoc2xhP1woXHMqKFtcZFwuXSsoPzpkZWd8XHhiMHwlKT9ccyosXHMqW1xkXC5dKyU/XHMqLFxzKltcZFwuXSsoPzolP1xzKixccypbXGRcLl0rKT8pJT9ccypcKSlccyokL2ksTT17TmFOOjEsSW5maW5pdHk6MSwiLUluZmluaXR5IjoxfSxOPS9eKD86Y3ViaWMtKT9iZXppZXJcKChbXixdKyksKFteLF0rKSwoW14sXSspLChbXlwpXSspXCkvLE89dy5yb3VuZCxQPSJzZXRBdHRyaWJ1dGUiLFE9cGFyc2VGbG9hdCxSPXBhcnNlSW50LFM9ci5wcm90b3R5cGUudG9VcHBlckNhc2UsVD1hLl9hdmFpbGFibGVBdHRycz17ImFycm93LWVuZCI6Im5vbmUiLCJhcnJvdy1zdGFydCI6Im5vbmUiLGJsdXI6MCwiY2xpcC1yZWN0IjoiMCAwIDFlOSAxZTkiLGN1cnNvcjoiZGVmYXVsdCIsY3g6MCxjeTowLGZpbGw6IiNmZmYiLCJmaWxsLW9wYWNpdHkiOjEsZm9udDonMTBweCAiQXJpYWwiJywiZm9udC1mYW1pbHkiOiciQXJpYWwiJywiZm9udC1zaXplIjoiMTAiLCJmb250LXN0eWxlIjoibm9ybWFsIiwiZm9udC13ZWlnaHQiOjQwMCxncmFkaWVudDowLGhlaWdodDowLGhyZWY6Imh0dHA6Ly9yYXBoYWVsanMuY29tLyIsImxldHRlci1zcGFjaW5nIjowLG9wYWNpdHk6MSxwYXRoOiJNMCwwIixyOjAscng6MCxyeTowLHNyYzoiIixzdHJva2U6IiMwMDAiLCJzdHJva2UtZGFzaGFycmF5IjoiIiwic3Ryb2tlLWxpbmVjYXAiOiJidXR0Iiwic3Ryb2tlLWxpbmVqb2luIjoiYnV0dCIsInN0cm9rZS1taXRlcmxpbWl0IjowLCJzdHJva2Utb3BhY2l0eSI6MSwic3Ryb2tlLXdpZHRoIjoxLHRhcmdldDoiX2JsYW5rIiwidGV4dC1hbmNob3IiOiJtaWRkbGUiLHRpdGxlOiJSYXBoYWVsIix0cmFuc2Zvcm06IiIsd2lkdGg6MCx4OjAseTowfSxVPWEuX2F2YWlsYWJsZUFuaW1BdHRycz17Ymx1cjpDLCJjbGlwLXJlY3QiOiJjc3YiLGN4OkMsY3k6QyxmaWxsOiJjb2xvdXIiLCJmaWxsLW9wYWNpdHkiOkMsImZvbnQtc2l6ZSI6QyxoZWlnaHQ6QyxvcGFjaXR5OkMscGF0aDoicGF0aCIscjpDLHJ4OkMscnk6QyxzdHJva2U6ImNvbG91ciIsInN0cm9rZS1vcGFjaXR5IjpDLCJzdHJva2Utd2lkdGgiOkMsdHJhbnNmb3JtOiJ0cmFuc2Zvcm0iLHdpZHRoOkMseDpDLHk6Q30sVj0vW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldL2csVz0vW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKixbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qLyxYPXtoczoxLHJnOjF9LFk9Lyw/KFthY2hsbXFyc3R2eHpdKSw/L2dpLFo9LyhbYWNobG1ycXN0dnpdKVtceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5LF0qKCgtP1xkKlwuP1xkKig/OmVbXC0rXT9cZCspP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSosP1tceDA5XHgwYVx4MGJceDBjXHgwZFx4MjBceGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XSopKykvaWcsJD0vKFtyc3RtXSlbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOSxdKigoLT9cZCpcLj9cZCooPzplW1wtK10/XGQrKT9bXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qLD9bXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qKSspL2lnLF89LygtP1xkKlwuP1xkKig/OmVbXC0rXT9cZCspPylbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qLD9bXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qL2lnLGJhPWEuX3JhZGlhbF9ncmFkaWVudD0vXnIoPzpcKChbXixdKz8pW1x4MDlceDBhXHgwYlx4MGNceDBkXHgyMFx4YTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjldKixbXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwXHhhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOV0qKFteXCldKz8pXCkpPy8sYmI9e30sYmM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5rZXktYi5rZXl9LGJkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFEoYSktUShiKX0sYmU9ZnVuY3Rpb24oKXt9LGJmPWZ1bmN0aW9uKGEpe3JldHVybiBhfSxiZz1hLl9yZWN0UGF0aD1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGUpcmV0dXJuW1siTSIsYStlLGJdLFsibCIsYy1lKjIsMF0sWyJhIixlLGUsMCwwLDEsZSxlXSxbImwiLDAsZC1lKjJdLFsiYSIsZSxlLDAsMCwxLC1lLGVdLFsibCIsZSoyLWMsMF0sWyJhIixlLGUsMCwwLDEsLWUsLWVdLFsibCIsMCxlKjItZF0sWyJhIixlLGUsMCwwLDEsZSwtZV0sWyJ6Il1dO3JldHVybltbIk0iLGEsYl0sWyJsIixjLDBdLFsibCIsMCxkXSxbImwiLC1jLDBdLFsieiJdXX0sYmg9ZnVuY3Rpb24oYSxiLGMsZCl7ZD09bnVsbCYmKGQ9Yyk7cmV0dXJuW1siTSIsYSxiXSxbIm0iLDAsLWRdLFsiYSIsYyxkLDAsMSwxLDAsMipkXSxbImEiLGMsZCwwLDEsMSwwLC0yKmRdLFsieiJdXX0sYmk9YS5fZ2V0UGF0aD17cGF0aDpmdW5jdGlvbihhKXtyZXR1cm4gYS5hdHRyKCJwYXRoIil9LGNpcmNsZTpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJzO3JldHVybiBiaChiLmN4LGIuY3ksYi5yKX0sZWxsaXBzZTpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJzO3JldHVybiBiaChiLmN4LGIuY3ksYi5yeCxiLnJ5KX0scmVjdDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJzO3JldHVybiBiZyhiLngsYi55LGIud2lkdGgsYi5oZWlnaHQsYi5yKX0saW1hZ2U6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRycztyZXR1cm4gYmcoYi54LGIueSxiLndpZHRoLGIuaGVpZ2h0KX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLl9nZXRCQm94KCk7cmV0dXJuIGJnKGIueCxiLnksYi53aWR0aCxiLmhlaWdodCl9fSxiaj1hLm1hcFBhdGg9ZnVuY3Rpb24oYSxiKXtpZighYilyZXR1cm4gYTt2YXIgYyxkLGUsZixnLGgsaTthPWJSKGEpO2ZvcihlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXtpPWFbZV07Zm9yKGY9MSxoPWkubGVuZ3RoO2Y8aDtmKz0yKWM9Yi54KGlbZl0saVtmKzFdKSxkPWIueShpW2ZdLGlbZisxXSksaVtmXT1jLGlbZisxXT1kfXJldHVybiBhfTthLl9nPWgsYS50eXBlPWgud2luLlNWR0FuZ2xlfHxoLmRvYy5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0Jhc2ljU3RydWN0dXJlIiwiMS4xIik/IlNWRyI6IlZNTCI7aWYoYS50eXBlPT0iVk1MIil7dmFyIGJrPWguZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGJsO2JrLmlubmVySFRNTD0nPHY6c2hhcGUgYWRqPSIxIi8+JyxibD1iay5maXJzdENoaWxkLGJsLnN0eWxlLmJlaGF2aW9yPSJ1cmwoI2RlZmF1bHQjVk1MKSI7aWYoIWJsfHx0eXBlb2YgYmwuYWRqIT0ib2JqZWN0IilyZXR1cm4gYS50eXBlPXA7Yms9bnVsbH1hLnN2Zz0hKGEudm1sPWEudHlwZT09IlZNTCIpLGEuX1BhcGVyPWosYS5mbj1rPWoucHJvdG90eXBlPWEucHJvdG90eXBlLGEuX2lkPTAsYS5fb2lkPTAsYS5pcz1mdW5jdGlvbihhLGIpe2I9di5jYWxsKGIpO2lmKGI9PSJmaW5pdGUiKXJldHVybiFNW2ddKCthKTtpZihiPT0iYXJyYXkiKXJldHVybiBhIGluc3RhbmNlb2YgQXJyYXk7cmV0dXJuIGI9PSJudWxsIiYmYT09PW51bGx8fGI9PXR5cGVvZiBhJiZhIT09bnVsbHx8Yj09Im9iamVjdCImJmE9PT1PYmplY3QoYSl8fGI9PSJhcnJheSImJkFycmF5LmlzQXJyYXkmJkFycmF5LmlzQXJyYXkoYSl8fEguY2FsbChhKS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpPT1ifSxhLmFuZ2xlPWZ1bmN0aW9uKGIsYyxkLGUsZixnKXtpZihmPT1udWxsKXt2YXIgaD1iLWQsaT1jLWU7aWYoIWgmJiFpKXJldHVybiAwO3JldHVybigxODArdy5hdGFuMigtaSwtaCkqMTgwL0IrMzYwKSUzNjB9cmV0dXJuIGEuYW5nbGUoYixjLGYsZyktYS5hbmdsZShkLGUsZixnKX0sYS5yYWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGElMzYwKkIvMTgwfSxhLmRlZz1mdW5jdGlvbihhKXtyZXR1cm4gYSoxODAvQiUzNjB9LGEuc25hcFRvPWZ1bmN0aW9uKGIsYyxkKXtkPWEuaXMoZCwiZmluaXRlIik/ZDoxMDtpZihhLmlzKGIsRSkpe3ZhciBlPWIubGVuZ3RoO3doaWxlKGUtLSlpZih6KGJbZV0tYyk8PWQpcmV0dXJuIGJbZV19ZWxzZXtiPStiO3ZhciBmPWMlYjtpZihmPGQpcmV0dXJuIGMtZjtpZihmPmItZClyZXR1cm4gYy1mK2J9cmV0dXJuIGN9O3ZhciBibj1hLmNyZWF0ZVVVSUQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4ieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Ii5yZXBsYWNlKGEsYikudG9VcHBlckNhc2UoKX19KC9beHldL2csZnVuY3Rpb24oYSl7dmFyIGI9dy5yYW5kb20oKSoxNnwwLGM9YT09IngiP2I6YiYzfDg7cmV0dXJuIGMudG9TdHJpbmcoMTYpfSk7YS5zZXRXaW5kb3c9ZnVuY3Rpb24oYil7ZXZlKCJyYXBoYWVsLnNldFdpbmRvdyIsYSxoLndpbixiKSxoLndpbj1iLGguZG9jPWgud2luLmRvY3VtZW50LGEuX2VuZ2luZS5pbml0V2luJiZhLl9lbmdpbmUuaW5pdFdpbihoLndpbil9O3ZhciBibz1mdW5jdGlvbihiKXtpZihhLnZtbCl7dmFyIGM9L15ccyt8XHMrJC9nLGQ7dHJ5e3ZhciBlPW5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpO2Uud3JpdGUoIjxib2R5PiIpLGUuY2xvc2UoKSxkPWUuYm9keX1jYXRjaChmKXtkPWNyZWF0ZVBvcHVwKCkuZG9jdW1lbnQuYm9keX12YXIgZz1kLmNyZWF0ZVRleHRSYW5nZSgpO2JvPWJ2KGZ1bmN0aW9uKGEpe3RyeXtkLnN0eWxlLmNvbG9yPXIoYSkucmVwbGFjZShjLHApO3ZhciBiPWcucXVlcnlDb21tYW5kVmFsdWUoIkZvcmVDb2xvciIpO2I9KGImMjU1KTw8MTZ8YiY2NTI4MHwoYiYxNjcxMTY4MCk+Pj4xNjtyZXR1cm4iIyIrKCIwMDAwMDAiK2IudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Y2F0Y2goZSl7cmV0dXJuIm5vbmUifX0pfWVsc2V7dmFyIGk9aC5kb2MuY3JlYXRlRWxlbWVudCgiaSIpO2kudGl0bGU9IlJhcGhhw6tsIENvbG91ciBQaWNrZXIiLGkuc3R5bGUuZGlzcGxheT0ibm9uZSIsaC5kb2MuYm9keS5hcHBlbmRDaGlsZChpKSxibz1idihmdW5jdGlvbihhKXtpLnN0eWxlLmNvbG9yPWE7cmV0dXJuIGguZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoaSxwKS5nZXRQcm9wZXJ0eVZhbHVlKCJjb2xvciIpfSl9cmV0dXJuIGJvKGIpfSxicD1mdW5jdGlvbigpe3JldHVybiJoc2IoIitbdGhpcy5oLHRoaXMucyx0aGlzLmJdKyIpIn0sYnE9ZnVuY3Rpb24oKXtyZXR1cm4iaHNsKCIrW3RoaXMuaCx0aGlzLnMsdGhpcy5sXSsiKSJ9LGJyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGV4fSxicz1mdW5jdGlvbihiLGMsZCl7Yz09bnVsbCYmYS5pcyhiLCJvYmplY3QiKSYmInIiaW4gYiYmImciaW4gYiYmImIiaW4gYiYmKGQ9Yi5iLGM9Yi5nLGI9Yi5yKTtpZihjPT1udWxsJiZhLmlzKGIsRCkpe3ZhciBlPWEuZ2V0UkdCKGIpO2I9ZS5yLGM9ZS5nLGQ9ZS5ifWlmKGI+MXx8Yz4xfHxkPjEpYi89MjU1LGMvPTI1NSxkLz0yNTU7cmV0dXJuW2IsYyxkXX0sYnQ9ZnVuY3Rpb24oYixjLGQsZSl7Yio9MjU1LGMqPTI1NSxkKj0yNTU7dmFyIGY9e3I6YixnOmMsYjpkLGhleDphLnJnYihiLGMsZCksdG9TdHJpbmc6YnJ9O2EuaXMoZSwiZmluaXRlIikmJihmLm9wYWNpdHk9ZSk7cmV0dXJuIGZ9O2EuY29sb3I9ZnVuY3Rpb24oYil7dmFyIGM7YS5pcyhiLCJvYmplY3QiKSYmImgiaW4gYiYmInMiaW4gYiYmImIiaW4gYj8oYz1hLmhzYjJyZ2IoYiksYi5yPWMucixiLmc9Yy5nLGIuYj1jLmIsYi5oZXg9Yy5oZXgpOmEuaXMoYiwib2JqZWN0IikmJiJoImluIGImJiJzImluIGImJiJsImluIGI/KGM9YS5oc2wycmdiKGIpLGIucj1jLnIsYi5nPWMuZyxiLmI9Yy5iLGIuaGV4PWMuaGV4KTooYS5pcyhiLCJzdHJpbmciKSYmKGI9YS5nZXRSR0IoYikpLGEuaXMoYiwib2JqZWN0IikmJiJyImluIGImJiJnImluIGImJiJiImluIGI/KGM9YS5yZ2IyaHNsKGIpLGIuaD1jLmgsYi5zPWMucyxiLmw9Yy5sLGM9YS5yZ2IyaHNiKGIpLGIudj1jLmIpOihiPXtoZXg6Im5vbmUifSxiLnI9Yi5nPWIuYj1iLmg9Yi5zPWIudj1iLmw9LTEpKSxiLnRvU3RyaW5nPWJyO3JldHVybiBifSxhLmhzYjJyZ2I9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5pcyhhLCJvYmplY3QiKSYmImgiaW4gYSYmInMiaW4gYSYmImIiaW4gYSYmKGM9YS5iLGI9YS5zLGE9YS5oLGQ9YS5vKSxhKj0zNjA7dmFyIGUsZixnLGgsaTthPWElMzYwLzYwLGk9YypiLGg9aSooMS16KGElMi0xKSksZT1mPWc9Yy1pLGE9fn5hLGUrPVtpLGgsMCwwLGgsaV1bYV0sZis9W2gsaSxpLGgsMCwwXVthXSxnKz1bMCwwLGgsaSxpLGhdW2FdO3JldHVybiBidChlLGYsZyxkKX0sYS5oc2wycmdiPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuaXMoYSwib2JqZWN0IikmJiJoImluIGEmJiJzImluIGEmJiJsImluIGEmJihjPWEubCxiPWEucyxhPWEuaCk7aWYoYT4xfHxiPjF8fGM+MSlhLz0zNjAsYi89MTAwLGMvPTEwMDthKj0zNjA7dmFyIGUsZixnLGgsaTthPWElMzYwLzYwLGk9MipiKihjPC41P2M6MS1jKSxoPWkqKDEteihhJTItMSkpLGU9Zj1nPWMtaS8yLGE9fn5hLGUrPVtpLGgsMCwwLGgsaV1bYV0sZis9W2gsaSxpLGgsMCwwXVthXSxnKz1bMCwwLGgsaSxpLGhdW2FdO3JldHVybiBidChlLGYsZyxkKX0sYS5yZ2IyaHNiPWZ1bmN0aW9uKGEsYixjKXtjPWJzKGEsYixjKSxhPWNbMF0sYj1jWzFdLGM9Y1syXTt2YXIgZCxlLGYsZztmPXgoYSxiLGMpLGc9Zi15KGEsYixjKSxkPWc9PTA/bnVsbDpmPT1hPyhiLWMpL2c6Zj09Yj8oYy1hKS9nKzI6KGEtYikvZys0LGQ9KGQrMzYwKSU2KjYwLzM2MCxlPWc9PTA/MDpnL2Y7cmV0dXJue2g6ZCxzOmUsYjpmLHRvU3RyaW5nOmJwfX0sYS5yZ2IyaHNsPWZ1bmN0aW9uKGEsYixjKXtjPWJzKGEsYixjKSxhPWNbMF0sYj1jWzFdLGM9Y1syXTt2YXIgZCxlLGYsZyxoLGk7Zz14KGEsYixjKSxoPXkoYSxiLGMpLGk9Zy1oLGQ9aT09MD9udWxsOmc9PWE/KGItYykvaTpnPT1iPyhjLWEpL2krMjooYS1iKS9pKzQsZD0oZCszNjApJTYqNjAvMzYwLGY9KGcraCkvMixlPWk9PTA/MDpmPC41P2kvKDIqZik6aS8oMi0yKmYpO3JldHVybntoOmQsczplLGw6Zix0b1N0cmluZzpicX19LGEuX3BhdGgyc3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pbigiLCIpLnJlcGxhY2UoWSwiJDEiKX07dmFyIGJ3PWEuX3ByZWxvYWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1oLmRvYy5jcmVhdGVFbGVtZW50KCJpbWciKTtjLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbSIsYy5vbmxvYWQ9ZnVuY3Rpb24oKXtiLmNhbGwodGhpcyksdGhpcy5vbmxvYWQ9bnVsbCxoLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXtoLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxoLmRvYy5ib2R5LmFwcGVuZENoaWxkKGMpLGMuc3JjPWF9O2EuZ2V0UkdCPWJ2KGZ1bmN0aW9uKGIpe2lmKCFifHwhISgoYj1yKGIpKS5pbmRleE9mKCItIikrMSkpcmV0dXJue3I6LTEsZzotMSxiOi0xLGhleDoibm9uZSIsZXJyb3I6MSx0b1N0cmluZzpieH07aWYoYj09Im5vbmUiKXJldHVybntyOi0xLGc6LTEsYjotMSxoZXg6Im5vbmUiLHRvU3RyaW5nOmJ4fTshWFtnXShiLnRvTG93ZXJDYXNlKCkuc3Vic3RyaW5nKDAsMikpJiZiLmNoYXJBdCgpIT0iIyImJihiPWJvKGIpKTt2YXIgYyxkLGUsZixoLGksaixrPWIubWF0Y2goTCk7aWYoayl7a1syXSYmKGY9UihrWzJdLnN1YnN0cmluZyg1KSwxNiksZT1SKGtbMl0uc3Vic3RyaW5nKDMsNSksMTYpLGQ9UihrWzJdLnN1YnN0cmluZygxLDMpLDE2KSksa1szXSYmKGY9UigoaT1rWzNdLmNoYXJBdCgzKSkraSwxNiksZT1SKChpPWtbM10uY2hhckF0KDIpKStpLDE2KSxkPVIoKGk9a1szXS5jaGFyQXQoMSkpK2ksMTYpKSxrWzRdJiYoaj1rWzRdW3NdKFcpLGQ9UShqWzBdKSxqWzBdLnNsaWNlKC0xKT09IiUiJiYoZCo9Mi41NSksZT1RKGpbMV0pLGpbMV0uc2xpY2UoLTEpPT0iJSImJihlKj0yLjU1KSxmPVEoalsyXSksalsyXS5zbGljZSgtMSk9PSIlIiYmKGYqPTIuNTUpLGtbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpPT0icmdiYSImJihoPVEoalszXSkpLGpbM10mJmpbM10uc2xpY2UoLTEpPT0iJSImJihoLz0xMDApKTtpZihrWzVdKXtqPWtbNV1bc10oVyksZD1RKGpbMF0pLGpbMF0uc2xpY2UoLTEpPT0iJSImJihkKj0yLjU1KSxlPVEoalsxXSksalsxXS5zbGljZSgtMSk9PSIlIiYmKGUqPTIuNTUpLGY9UShqWzJdKSxqWzJdLnNsaWNlKC0xKT09IiUiJiYoZio9Mi41NSksKGpbMF0uc2xpY2UoLTMpPT0iZGVnInx8alswXS5zbGljZSgtMSk9PSLCsCIpJiYoZC89MzYwKSxrWzFdLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw0KT09ImhzYmEiJiYoaD1RKGpbM10pKSxqWzNdJiZqWzNdLnNsaWNlKC0xKT09IiUiJiYoaC89MTAwKTtyZXR1cm4gYS5oc2IycmdiKGQsZSxmLGgpfWlmKGtbNl0pe2o9a1s2XVtzXShXKSxkPVEoalswXSksalswXS5zbGljZSgtMSk9PSIlIiYmKGQqPTIuNTUpLGU9UShqWzFdKSxqWzFdLnNsaWNlKC0xKT09IiUiJiYoZSo9Mi41NSksZj1RKGpbMl0pLGpbMl0uc2xpY2UoLTEpPT0iJSImJihmKj0yLjU1KSwoalswXS5zbGljZSgtMyk9PSJkZWcifHxqWzBdLnNsaWNlKC0xKT09IsKwIikmJihkLz0zNjApLGtbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpPT0iaHNsYSImJihoPVEoalszXSkpLGpbM10mJmpbM10uc2xpY2UoLTEpPT0iJSImJihoLz0xMDApO3JldHVybiBhLmhzbDJyZ2IoZCxlLGYsaCl9az17cjpkLGc6ZSxiOmYsdG9TdHJpbmc6Ynh9LGsuaGV4PSIjIisoMTY3NzcyMTZ8ZnxlPDw4fGQ8PDE2KS50b1N0cmluZygxNikuc2xpY2UoMSksYS5pcyhoLCJmaW5pdGUiKSYmKGsub3BhY2l0eT1oKTtyZXR1cm4ga31yZXR1cm57cjotMSxnOi0xLGI6LTEsaGV4OiJub25lIixlcnJvcjoxLHRvU3RyaW5nOmJ4fX0sYSksYS5oc2I9YnYoZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmhzYjJyZ2IoYixjLGQpLmhleH0pLGEuaHNsPWJ2KGZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYS5oc2wycmdiKGIsYyxkKS5oZXh9KSxhLnJnYj1idihmdW5jdGlvbihhLGIsYyl7cmV0dXJuIiMiKygxNjc3NzIxNnxjfGI8PDh8YTw8MTYpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0pLGEuZ2V0Q29sb3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRDb2xvci5zdGFydD10aGlzLmdldENvbG9yLnN0YXJ0fHx7aDowLHM6MSxiOmF8fC43NX0sYz10aGlzLmhzYjJyZ2IoYi5oLGIucyxiLmIpO2IuaCs9LjA3NSxiLmg+MSYmKGIuaD0wLGIucy09LjIsYi5zPD0wJiYodGhpcy5nZXRDb2xvci5zdGFydD17aDowLHM6MSxiOmIuYn0pKTtyZXR1cm4gYy5oZXh9LGEuZ2V0Q29sb3IucmVzZXQ9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5zdGFydH0sYS5wYXJzZVBhdGhTdHJpbmc9ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuIG51bGw7dmFyIGM9YnooYik7aWYoYy5hcnIpcmV0dXJuIGJKKGMuYXJyKTt2YXIgZD17YTo3LGM6NixoOjEsbDoyLG06MixyOjQscTo0LHM6NCx0OjIsdjoxLHo6MH0sZT1bXTthLmlzKGIsRSkmJmEuaXMoYlswXSxFKSYmKGU9YkooYikpLGUubGVuZ3RofHxyKGIpLnJlcGxhY2UoWixmdW5jdGlvbihhLGIsYyl7dmFyIGY9W10sZz1iLnRvTG93ZXJDYXNlKCk7Yy5yZXBsYWNlKF8sZnVuY3Rpb24oYSxiKXtiJiZmLnB1c2goK2IpfSksZz09Im0iJiZmLmxlbmd0aD4yJiYoZS5wdXNoKFtiXVtuXShmLnNwbGljZSgwLDIpKSksZz0ibCIsYj1iPT0ibSI/ImwiOiJMIik7aWYoZz09InIiKWUucHVzaChbYl1bbl0oZikpO2Vsc2Ugd2hpbGUoZi5sZW5ndGg+PWRbZ10pe2UucHVzaChbYl1bbl0oZi5zcGxpY2UoMCxkW2ddKSkpO2lmKCFkW2ddKWJyZWFrfX0pLGUudG9TdHJpbmc9YS5fcGF0aDJzdHJpbmcsYy5hcnI9YkooZSk7cmV0dXJuIGV9LGEucGFyc2VUcmFuc2Zvcm1TdHJpbmc9YnYoZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuIG51bGw7dmFyIGM9e3I6MyxzOjQsdDoyLG06Nn0sZD1bXTthLmlzKGIsRSkmJmEuaXMoYlswXSxFKSYmKGQ9YkooYikpLGQubGVuZ3RofHxyKGIpLnJlcGxhY2UoJCxmdW5jdGlvbihhLGIsYyl7dmFyIGU9W10sZj12LmNhbGwoYik7Yy5yZXBsYWNlKF8sZnVuY3Rpb24oYSxiKXtiJiZlLnB1c2goK2IpfSksZC5wdXNoKFtiXVtuXShlKSl9KSxkLnRvU3RyaW5nPWEuX3BhdGgyc3RyaW5nO3JldHVybiBkfSk7dmFyIGJ6PWZ1bmN0aW9uKGEpe3ZhciBiPWJ6LnBzPWJ6LnBzfHx7fTtiW2FdP2JbYV0uc2xlZXA9MTAwOmJbYV09e3NsZWVwOjEwMH0sc2V0VGltZW91dChmdW5jdGlvbigpe2Zvcih2YXIgYyBpbiBiKWJbZ10oYykmJmMhPWEmJihiW2NdLnNsZWVwLS0sIWJbY10uc2xlZXAmJmRlbGV0ZSBiW2NdKX0pO3JldHVybiBiW2FdfTthLmZpbmREb3RzQXRTZWdtZW50PWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXt2YXIgaj0xLWksaz1BKGosMyksbD1BKGosMiksbT1pKmksbj1tKmksbz1rKmErbCozKmkqYytqKjMqaSppKmUrbipnLHA9aypiK2wqMyppKmQraiozKmkqaSpmK24qaCxxPWErMippKihjLWEpK20qKGUtMipjK2EpLHI9YisyKmkqKGQtYikrbSooZi0yKmQrYikscz1jKzIqaSooZS1jKSttKihnLTIqZStjKSx0PWQrMippKihmLWQpK20qKGgtMipmK2QpLHU9aiphK2kqYyx2PWoqYitpKmQseD1qKmUraSpnLHk9aipmK2kqaCx6PTkwLXcuYXRhbjIocS1zLHItdCkqMTgwL0I7KHE+c3x8cjx0KSYmKHorPTE4MCk7cmV0dXJue3g6byx5OnAsbTp7eDpxLHk6cn0sbjp7eDpzLHk6dH0sc3RhcnQ6e3g6dSx5OnZ9LGVuZDp7eDp4LHk6eX0sYWxwaGE6en19LGEuYmV6aWVyQkJveD1mdW5jdGlvbihiLGMsZCxlLGYsZyxoLGkpe2EuaXMoYiwiYXJyYXkiKXx8KGI9W2IsYyxkLGUsZixnLGgsaV0pO3ZhciBqPWJRLmFwcGx5KG51bGwsYik7cmV0dXJue3g6ai5taW4ueCx5OmoubWluLnkseDI6ai5tYXgueCx5MjpqLm1heC55LHdpZHRoOmoubWF4Lngtai5taW4ueCxoZWlnaHQ6ai5tYXgueS1qLm1pbi55fX0sYS5pc1BvaW50SW5zaWRlQkJveD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+PWEueCYmYjw9YS54MiYmYz49YS55JiZjPD1hLnkyfSxhLmlzQkJveEludGVyc2VjdD1mdW5jdGlvbihiLGMpe3ZhciBkPWEuaXNQb2ludEluc2lkZUJCb3g7cmV0dXJuIGQoYyxiLngsYi55KXx8ZChjLGIueDIsYi55KXx8ZChjLGIueCxiLnkyKXx8ZChjLGIueDIsYi55Mil8fGQoYixjLngsYy55KXx8ZChiLGMueDIsYy55KXx8ZChiLGMueCxjLnkyKXx8ZChiLGMueDIsYy55Mil8fChiLng8Yy54MiYmYi54PmMueHx8Yy54PGIueDImJmMueD5iLngpJiYoYi55PGMueTImJmIueT5jLnl8fGMueTxiLnkyJiZjLnk+Yi55KX0sYS5wYXRoSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGJIKGEsYil9LGEucGF0aEludGVyc2VjdGlvbk51bWJlcj1mdW5jdGlvbihhLGIpe3JldHVybiBiSChhLGIsMSl9LGEuaXNQb2ludEluc2lkZVBhdGg9ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEucGF0aEJCb3goYik7cmV0dXJuIGEuaXNQb2ludEluc2lkZUJCb3goZSxjLGQpJiZiSChiLFtbIk0iLGMsZF0sWyJIIixlLngyKzEwXV0sMSklMj09MX0sYS5fcmVtb3ZlZEZhY3Rvcnk9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZXZlKCJyYXBoYWVsLmxvZyIsbnVsbCwiUmFwaGHDq2w6IHlvdSBhcmUgY2FsbGluZyB0byBtZXRob2Qg4oCcIithKyLigJ0gb2YgcmVtb3ZlZCBvYmplY3QiLGEpfX07dmFyIGJJPWEucGF0aEJCb3g9ZnVuY3Rpb24oYSl7dmFyIGI9YnooYSk7aWYoYi5iYm94KXJldHVybiBiLmJib3g7aWYoIWEpcmV0dXJue3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCx4MjowLHkyOjB9O2E9YlIoYSk7dmFyIGM9MCxkPTAsZT1bXSxmPVtdLGc7Zm9yKHZhciBoPTAsaT1hLmxlbmd0aDtoPGk7aCsrKXtnPWFbaF07aWYoZ1swXT09Ik0iKWM9Z1sxXSxkPWdbMl0sZS5wdXNoKGMpLGYucHVzaChkKTtlbHNle3ZhciBqPWJRKGMsZCxnWzFdLGdbMl0sZ1szXSxnWzRdLGdbNV0sZ1s2XSk7ZT1lW25dKGoubWluLngsai5tYXgueCksZj1mW25dKGoubWluLnksai5tYXgueSksYz1nWzVdLGQ9Z1s2XX19dmFyIGs9eVttXSgwLGUpLGw9eVttXSgwLGYpLG89eFttXSgwLGUpLHA9eFttXSgwLGYpLHE9e3g6ayx5OmwseDI6byx5MjpwLHdpZHRoOm8tayxoZWlnaHQ6cC1sfTtiLmJib3g9Ym0ocSk7cmV0dXJuIHF9LGJKPWZ1bmN0aW9uKGIpe3ZhciBjPWJtKGIpO2MudG9TdHJpbmc9YS5fcGF0aDJzdHJpbmc7cmV0dXJuIGN9LGJLPWEuX3BhdGhUb1JlbGF0aXZlPWZ1bmN0aW9uKGIpe3ZhciBjPWJ6KGIpO2lmKGMucmVsKXJldHVybiBiSihjLnJlbCk7aWYoIWEuaXMoYixFKXx8IWEuaXMoYiYmYlswXSxFKSliPWEucGFyc2VQYXRoU3RyaW5nKGIpO3ZhciBkPVtdLGU9MCxmPTAsZz0wLGg9MCxpPTA7YlswXVswXT09Ik0iJiYoZT1iWzBdWzFdLGY9YlswXVsyXSxnPWUsaD1mLGkrKyxkLnB1c2goWyJNIixlLGZdKSk7Zm9yKHZhciBqPWksaz1iLmxlbmd0aDtqPGs7aisrKXt2YXIgbD1kW2pdPVtdLG09YltqXTtpZihtWzBdIT12LmNhbGwobVswXSkpe2xbMF09di5jYWxsKG1bMF0pO3N3aXRjaChsWzBdKXtjYXNlImEiOmxbMV09bVsxXSxsWzJdPW1bMl0sbFszXT1tWzNdLGxbNF09bVs0XSxsWzVdPW1bNV0sbFs2XT0rKG1bNl0tZSkudG9GaXhlZCgzKSxsWzddPSsobVs3XS1mKS50b0ZpeGVkKDMpO2JyZWFrO2Nhc2UidiI6bFsxXT0rKG1bMV0tZikudG9GaXhlZCgzKTticmVhaztjYXNlIm0iOmc9bVsxXSxoPW1bMl07ZGVmYXVsdDpmb3IodmFyIG49MSxvPW0ubGVuZ3RoO248bztuKyspbFtuXT0rKG1bbl0tKG4lMj9lOmYpKS50b0ZpeGVkKDMpfX1lbHNle2w9ZFtqXT1bXSxtWzBdPT0ibSImJihnPW1bMV0rZSxoPW1bMl0rZik7Zm9yKHZhciBwPTAscT1tLmxlbmd0aDtwPHE7cCsrKWRbal1bcF09bVtwXX12YXIgcj1kW2pdLmxlbmd0aDtzd2l0Y2goZFtqXVswXSl7Y2FzZSJ6IjplPWcsZj1oO2JyZWFrO2Nhc2UiaCI6ZSs9K2Rbal1bci0xXTticmVhaztjYXNlInYiOmYrPStkW2pdW3ItMV07YnJlYWs7ZGVmYXVsdDplKz0rZFtqXVtyLTJdLGYrPStkW2pdW3ItMV19fWQudG9TdHJpbmc9YS5fcGF0aDJzdHJpbmcsYy5yZWw9YkooZCk7cmV0dXJuIGR9LGJMPWEuX3BhdGhUb0Fic29sdXRlPWZ1bmN0aW9uKGIpe3ZhciBjPWJ6KGIpO2lmKGMuYWJzKXJldHVybiBiSihjLmFicyk7aWYoIWEuaXMoYixFKXx8IWEuaXMoYiYmYlswXSxFKSliPWEucGFyc2VQYXRoU3RyaW5nKGIpO2lmKCFifHwhYi5sZW5ndGgpcmV0dXJuW1siTSIsMCwwXV07dmFyIGQ9W10sZT0wLGY9MCxnPTAsaD0wLGk9MDtiWzBdWzBdPT0iTSImJihlPStiWzBdWzFdLGY9K2JbMF1bMl0sZz1lLGg9ZixpKyssZFswXT1bIk0iLGUsZl0pO3ZhciBqPWIubGVuZ3RoPT0zJiZiWzBdWzBdPT0iTSImJmJbMV1bMF0udG9VcHBlckNhc2UoKT09IlIiJiZiWzJdWzBdLnRvVXBwZXJDYXNlKCk9PSJaIjtmb3IodmFyIGssbCxtPWksbz1iLmxlbmd0aDttPG87bSsrKXtkLnB1c2goaz1bXSksbD1iW21dO2lmKGxbMF0hPVMuY2FsbChsWzBdKSl7a1swXT1TLmNhbGwobFswXSk7c3dpdGNoKGtbMF0pe2Nhc2UiQSI6a1sxXT1sWzFdLGtbMl09bFsyXSxrWzNdPWxbM10sa1s0XT1sWzRdLGtbNV09bFs1XSxrWzZdPSsobFs2XStlKSxrWzddPSsobFs3XStmKTticmVhaztjYXNlIlYiOmtbMV09K2xbMV0rZjticmVhaztjYXNlIkgiOmtbMV09K2xbMV0rZTticmVhaztjYXNlIlIiOnZhciBwPVtlLGZdW25dKGwuc2xpY2UoMSkpO2Zvcih2YXIgcT0yLHI9cC5sZW5ndGg7cTxyO3ErKylwW3FdPStwW3FdK2UscFsrK3FdPStwW3FdK2Y7ZC5wb3AoKSxkPWRbbl0oYnkocCxqKSk7YnJlYWs7Y2FzZSJNIjpnPStsWzFdK2UsaD0rbFsyXStmO2RlZmF1bHQ6Zm9yKHE9MSxyPWwubGVuZ3RoO3E8cjtxKyspa1txXT0rbFtxXSsocSUyP2U6Zil9fWVsc2UgaWYobFswXT09IlIiKXA9W2UsZl1bbl0obC5zbGljZSgxKSksZC5wb3AoKSxkPWRbbl0oYnkocCxqKSksaz1bIlIiXVtuXShsLnNsaWNlKC0yKSk7ZWxzZSBmb3IodmFyIHM9MCx0PWwubGVuZ3RoO3M8dDtzKyspa1tzXT1sW3NdO3N3aXRjaChrWzBdKXtjYXNlIloiOmU9ZyxmPWg7YnJlYWs7Y2FzZSJIIjplPWtbMV07YnJlYWs7Y2FzZSJWIjpmPWtbMV07YnJlYWs7Y2FzZSJNIjpnPWtbay5sZW5ndGgtMl0saD1rW2subGVuZ3RoLTFdO2RlZmF1bHQ6ZT1rW2subGVuZ3RoLTJdLGY9a1trLmxlbmd0aC0xXX19ZC50b1N0cmluZz1hLl9wYXRoMnN0cmluZyxjLmFicz1iSihkKTtyZXR1cm4gZH0sYk09ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuW2EsYixjLGQsYyxkXX0sYk49ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPTEvMyxoPTIvMztyZXR1cm5bZyphK2gqYyxnKmIraCpkLGcqZStoKmMsZypmK2gqZCxlLGZdfSxiTz1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgaz1CKjEyMC8xODAsbD1CLzE4MCooK2V8fDApLG09W10sbyxwPWJ2KGZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hKncuY29zKGMpLWIqdy5zaW4oYyksZT1hKncuc2luKGMpK2Iqdy5jb3MoYyk7cmV0dXJue3g6ZCx5OmV9fSk7aWYoIWope289cChhLGIsLWwpLGE9by54LGI9by55LG89cChoLGksLWwpLGg9by54LGk9by55O3ZhciBxPXcuY29zKEIvMTgwKmUpLHI9dy5zaW4oQi8xODAqZSksdD0oYS1oKS8yLHU9KGItaSkvMix2PXQqdC8oYypjKSt1KnUvKGQqZCk7dj4xJiYodj13LnNxcnQodiksYz12KmMsZD12KmQpO3ZhciB4PWMqYyx5PWQqZCxBPShmPT1nPy0xOjEpKncuc3FydCh6KCh4KnkteCp1KnUteSp0KnQpLyh4KnUqdSt5KnQqdCkpKSxDPUEqYyp1L2QrKGEraCkvMixEPUEqLWQqdC9jKyhiK2kpLzIsRT13LmFzaW4oKChiLUQpL2QpLnRvRml4ZWQoOSkpLEY9dy5hc2luKCgoaS1EKS9kKS50b0ZpeGVkKDkpKTtFPWE8Qz9CLUU6RSxGPWg8Qz9CLUY6RixFPDAmJihFPUIqMitFKSxGPDAmJihGPUIqMitGKSxnJiZFPkYmJihFPUUtQioyKSwhZyYmRj5FJiYoRj1GLUIqMil9ZWxzZSBFPWpbMF0sRj1qWzFdLEM9alsyXSxEPWpbM107dmFyIEc9Ri1FO2lmKHooRyk+ayl7dmFyIEg9RixJPWgsSj1pO0Y9RStrKihnJiZGPkU/MTotMSksaD1DK2Mqdy5jb3MoRiksaT1EK2Qqdy5zaW4oRiksbT1iTyhoLGksYyxkLGUsMCxnLEksSixbRixILEMsRF0pfUc9Ri1FO3ZhciBLPXcuY29zKEUpLEw9dy5zaW4oRSksTT13LmNvcyhGKSxOPXcuc2luKEYpLE89dy50YW4oRy80KSxQPTQvMypjKk8sUT00LzMqZCpPLFI9W2EsYl0sUz1bYStQKkwsYi1RKktdLFQ9W2grUCpOLGktUSpNXSxVPVtoLGldO1NbMF09MipSWzBdLVNbMF0sU1sxXT0yKlJbMV0tU1sxXTtpZihqKXJldHVybltTLFQsVV1bbl0obSk7bT1bUyxULFVdW25dKG0pLmpvaW4oKVtzXSgiLCIpO3ZhciBWPVtdO2Zvcih2YXIgVz0wLFg9bS5sZW5ndGg7VzxYO1crKylWW1ddPVclMj9wKG1bVy0xXSxtW1ddLGwpLnk6cChtW1ddLG1bVysxXSxsKS54O3JldHVybiBWfSxiUD1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIGo9MS1pO3JldHVybnt4OkEoaiwzKSphK0EoaiwyKSozKmkqYytqKjMqaSppKmUrQShpLDMpKmcseTpBKGosMykqYitBKGosMikqMyppKmQraiozKmkqaSpmK0EoaSwzKSpofX0sYlE9YnYoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2YXIgaT1lLTIqYythLShnLTIqZStjKSxqPTIqKGMtYSktMiooZS1jKSxrPWEtYyxsPSgtait3LnNxcnQoaipqLTQqaSprKSkvMi9pLG49KC1qLXcuc3FydChqKmotNCppKmspKS8yL2ksbz1bYixoXSxwPVthLGddLHE7eihsKT4iMWUxMiImJihsPS41KSx6KG4pPiIxZTEyIiYmKG49LjUpLGw+MCYmbDwxJiYocT1iUChhLGIsYyxkLGUsZixnLGgsbCkscC5wdXNoKHEueCksby5wdXNoKHEueSkpLG4+MCYmbjwxJiYocT1iUChhLGIsYyxkLGUsZixnLGgsbikscC5wdXNoKHEueCksby5wdXNoKHEueSkpLGk9Zi0yKmQrYi0oaC0yKmYrZCksaj0yKihkLWIpLTIqKGYtZCksaz1iLWQsbD0oLWordy5zcXJ0KGoqai00KmkqaykpLzIvaSxuPSgtai13LnNxcnQoaipqLTQqaSprKSkvMi9pLHoobCk+IjFlMTIiJiYobD0uNSkseihuKT4iMWUxMiImJihuPS41KSxsPjAmJmw8MSYmKHE9YlAoYSxiLGMsZCxlLGYsZyxoLGwpLHAucHVzaChxLngpLG8ucHVzaChxLnkpKSxuPjAmJm48MSYmKHE9YlAoYSxiLGMsZCxlLGYsZyxoLG4pLHAucHVzaChxLngpLG8ucHVzaChxLnkpKTtyZXR1cm57bWluOnt4OnlbbV0oMCxwKSx5OnlbbV0oMCxvKX0sbWF4Ont4OnhbbV0oMCxwKSx5OnhbbV0oMCxvKX19fSksYlI9YS5fcGF0aDJjdXJ2ZT1idihmdW5jdGlvbihhLGIpe3ZhciBjPSFiJiZieihhKTtpZighYiYmYy5jdXJ2ZSlyZXR1cm4gYkooYy5jdXJ2ZSk7dmFyIGQ9YkwoYSksZT1iJiZiTChiKSxmPXt4OjAseTowLGJ4OjAsYnk6MCxYOjAsWTowLHF4Om51bGwscXk6bnVsbH0sZz17eDowLHk6MCxieDowLGJ5OjAsWDowLFk6MCxxeDpudWxsLHF5Om51bGx9LGg9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2lmKCFhKXJldHVyblsiQyIsYi54LGIueSxiLngsYi55LGIueCxiLnldOyEoYVswXWlue1Q6MSxROjF9KSYmKGIucXg9Yi5xeT1udWxsKTtzd2l0Y2goYVswXSl7Y2FzZSJNIjpiLlg9YVsxXSxiLlk9YVsyXTticmVhaztjYXNlIkEiOmE9WyJDIl1bbl0oYk9bbV0oMCxbYi54LGIueV1bbl0oYS5zbGljZSgxKSkpKTticmVhaztjYXNlIlMiOmM9Yi54KyhiLngtKGIuYnh8fGIueCkpLGQ9Yi55KyhiLnktKGIuYnl8fGIueSkpLGE9WyJDIixjLGRdW25dKGEuc2xpY2UoMSkpO2JyZWFrO2Nhc2UiVCI6Yi5xeD1iLngrKGIueC0oYi5xeHx8Yi54KSksYi5xeT1iLnkrKGIueS0oYi5xeXx8Yi55KSksYT1bIkMiXVtuXShiTihiLngsYi55LGIucXgsYi5xeSxhWzFdLGFbMl0pKTticmVhaztjYXNlIlEiOmIucXg9YVsxXSxiLnF5PWFbMl0sYT1bIkMiXVtuXShiTihiLngsYi55LGFbMV0sYVsyXSxhWzNdLGFbNF0pKTticmVhaztjYXNlIkwiOmE9WyJDIl1bbl0oYk0oYi54LGIueSxhWzFdLGFbMl0pKTticmVhaztjYXNlIkgiOmE9WyJDIl1bbl0oYk0oYi54LGIueSxhWzFdLGIueSkpO2JyZWFrO2Nhc2UiViI6YT1bIkMiXVtuXShiTShiLngsYi55LGIueCxhWzFdKSk7YnJlYWs7Y2FzZSJaIjphPVsiQyJdW25dKGJNKGIueCxiLnksYi5YLGIuWSkpfXJldHVybiBhfSxpPWZ1bmN0aW9uKGEsYil7aWYoYVtiXS5sZW5ndGg+Nyl7YVtiXS5zaGlmdCgpO3ZhciBjPWFbYl07d2hpbGUoYy5sZW5ndGgpYS5zcGxpY2UoYisrLDAsWyJDIl1bbl0oYy5zcGxpY2UoMCw2KSkpO2Euc3BsaWNlKGIsMSksbD14KGQubGVuZ3RoLGUmJmUubGVuZ3RofHwwKX19LGo9ZnVuY3Rpb24oYSxiLGMsZixnKXthJiZiJiZhW2ddWzBdPT0iTSImJmJbZ11bMF0hPSJNIiYmKGIuc3BsaWNlKGcsMCxbIk0iLGYueCxmLnldKSxjLmJ4PTAsYy5ieT0wLGMueD1hW2ddWzFdLGMueT1hW2ddWzJdLGw9eChkLmxlbmd0aCxlJiZlLmxlbmd0aHx8MCkpfTtmb3IodmFyIGs9MCxsPXgoZC5sZW5ndGgsZSYmZS5sZW5ndGh8fDApO2s8bDtrKyspe2Rba109aChkW2tdLGYpLGkoZCxrKSxlJiYoZVtrXT1oKGVba10sZykpLGUmJmkoZSxrKSxqKGQsZSxmLGcsayksaihlLGQsZyxmLGspO3ZhciBvPWRba10scD1lJiZlW2tdLHE9by5sZW5ndGgscj1lJiZwLmxlbmd0aDtmLng9b1txLTJdLGYueT1vW3EtMV0sZi5ieD1RKG9bcS00XSl8fGYueCxmLmJ5PVEob1txLTNdKXx8Zi55LGcuYng9ZSYmKFEocFtyLTRdKXx8Zy54KSxnLmJ5PWUmJihRKHBbci0zXSl8fGcueSksZy54PWUmJnBbci0yXSxnLnk9ZSYmcFtyLTFdfWV8fChjLmN1cnZlPWJKKGQpKTtyZXR1cm4gZT9bZCxlXTpkfSxudWxsLGJKKSxiUz1hLl9wYXJzZURvdHM9YnYoZnVuY3Rpb24oYil7dmFyIGM9W107Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKXt2YXIgZj17fSxnPWJbZF0ubWF0Y2goL14oW146XSopOj8oW1xkXC5dKikvKTtmLmNvbG9yPWEuZ2V0UkdCKGdbMV0pO2lmKGYuY29sb3IuZXJyb3IpcmV0dXJuIG51bGw7Zi5jb2xvcj1mLmNvbG9yLmhleCxnWzJdJiYoZi5vZmZzZXQ9Z1syXSsiJSIpLGMucHVzaChmKX1mb3IoZD0xLGU9Yy5sZW5ndGgtMTtkPGU7ZCsrKWlmKCFjW2RdLm9mZnNldCl7dmFyIGg9UShjW2QtMV0ub2Zmc2V0fHwwKSxpPTA7Zm9yKHZhciBqPWQrMTtqPGU7aisrKWlmKGNbal0ub2Zmc2V0KXtpPWNbal0ub2Zmc2V0O2JyZWFrfWl8fChpPTEwMCxqPWUpLGk9UShpKTt2YXIgaz0oaS1oKS8oai1kKzEpO2Zvcig7ZDxqO2QrKyloKz1rLGNbZF0ub2Zmc2V0PWgrIiUifXJldHVybiBjfSksYlQ9YS5fdGVhcj1mdW5jdGlvbihhLGIpe2E9PWIudG9wJiYoYi50b3A9YS5wcmV2KSxhPT1iLmJvdHRvbSYmKGIuYm90dG9tPWEubmV4dCksYS5uZXh0JiYoYS5uZXh0LnByZXY9YS5wcmV2KSxhLnByZXYmJihhLnByZXYubmV4dD1hLm5leHQpfSxiVT1hLl90b2Zyb250PWZ1bmN0aW9uKGEsYil7Yi50b3AhPT1hJiYoYlQoYSxiKSxhLm5leHQ9bnVsbCxhLnByZXY9Yi50b3AsYi50b3AubmV4dD1hLGIudG9wPWEpfSxiVj1hLl90b2JhY2s9ZnVuY3Rpb24oYSxiKXtiLmJvdHRvbSE9PWEmJihiVChhLGIpLGEubmV4dD1iLmJvdHRvbSxhLnByZXY9bnVsbCxiLmJvdHRvbS5wcmV2PWEsYi5ib3R0b209YSl9LGJXPWEuX2luc2VydGFmdGVyPWZ1bmN0aW9uKGEsYixjKXtiVChhLGMpLGI9PWMudG9wJiYoYy50b3A9YSksYi5uZXh0JiYoYi5uZXh0LnByZXY9YSksYS5uZXh0PWIubmV4dCxhLnByZXY9YixiLm5leHQ9YX0sYlg9YS5faW5zZXJ0YmVmb3JlPWZ1bmN0aW9uKGEsYixjKXtiVChhLGMpLGI9PWMuYm90dG9tJiYoYy5ib3R0b209YSksYi5wcmV2JiYoYi5wcmV2Lm5leHQ9YSksYS5wcmV2PWIucHJldixiLnByZXY9YSxhLm5leHQ9Yn0sYlk9YS50b01hdHJpeD1mdW5jdGlvbihhLGIpe3ZhciBjPWJJKGEpLGQ9e186e3RyYW5zZm9ybTpwfSxnZXRCQm94OmZ1bmN0aW9uKCl7cmV0dXJuIGN9fTtiJChkLGIpO3JldHVybiBkLm1hdHJpeH0sYlo9YS50cmFuc2Zvcm1QYXRoPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGJqKGEsYlkoYSxiKSl9LGIkPWEuX2V4dHJhY3RUcmFuc2Zvcm09ZnVuY3Rpb24oYixjKXtpZihjPT1udWxsKXJldHVybiBiLl8udHJhbnNmb3JtO2M9cihjKS5yZXBsYWNlKC9cLnszfXxcdTIwMjYvZyxiLl8udHJhbnNmb3JtfHxwKTt2YXIgZD1hLnBhcnNlVHJhbnNmb3JtU3RyaW5nKGMpLGU9MCxmPTAsZz0wLGg9MSxpPTEsaj1iLl8saz1uZXcgY2I7ai50cmFuc2Zvcm09ZHx8W107aWYoZClmb3IodmFyIGw9MCxtPWQubGVuZ3RoO2w8bTtsKyspe3ZhciBuPWRbbF0sbz1uLmxlbmd0aCxxPXIoblswXSkudG9Mb3dlckNhc2UoKSxzPW5bMF0hPXEsdD1zP2suaW52ZXJ0KCk6MCx1LHYsdyx4LHk7cT09InQiJiZvPT0zP3M/KHU9dC54KDAsMCksdj10LnkoMCwwKSx3PXQueChuWzFdLG5bMl0pLHg9dC55KG5bMV0sblsyXSksay50cmFuc2xhdGUody11LHgtdikpOmsudHJhbnNsYXRlKG5bMV0sblsyXSk6cT09InIiP289PTI/KHk9eXx8Yi5nZXRCQm94KDEpLGsucm90YXRlKG5bMV0seS54K3kud2lkdGgvMix5LnkreS5oZWlnaHQvMiksZSs9blsxXSk6bz09NCYmKHM/KHc9dC54KG5bMl0sblszXSkseD10LnkoblsyXSxuWzNdKSxrLnJvdGF0ZShuWzFdLHcseCkpOmsucm90YXRlKG5bMV0sblsyXSxuWzNdKSxlKz1uWzFdKTpxPT0icyI/bz09Mnx8bz09Mz8oeT15fHxiLmdldEJCb3goMSksay5zY2FsZShuWzFdLG5bby0xXSx5LngreS53aWR0aC8yLHkueSt5LmhlaWdodC8yKSxoKj1uWzFdLGkqPW5bby0xXSk6bz09NSYmKHM/KHc9dC54KG5bM10sbls0XSkseD10LnkoblszXSxuWzRdKSxrLnNjYWxlKG5bMV0sblsyXSx3LHgpKTprLnNjYWxlKG5bMV0sblsyXSxuWzNdLG5bNF0pLGgqPW5bMV0saSo9blsyXSk6cT09Im0iJiZvPT03JiZrLmFkZChuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0sbls2XSksai5kaXJ0eVQ9MSxiLm1hdHJpeD1rfWIubWF0cml4PWssai5zeD1oLGouc3k9aSxqLmRlZz1lLGouZHg9Zj1rLmUsai5keT1nPWsuZixoPT0xJiZpPT0xJiYhZSYmai5iYm94PyhqLmJib3gueCs9K2Ysai5iYm94LnkrPStnKTpqLmRpcnR5VD0xfSxiXz1mdW5jdGlvbihhKXt2YXIgYj1hWzBdO3N3aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2UidCI6cmV0dXJuW2IsMCwwXTtjYXNlIm0iOnJldHVybltiLDEsMCwwLDEsMCwwXTtjYXNlInIiOnJldHVybiBhLmxlbmd0aD09ND9bYiwwLGFbMl0sYVszXV06W2IsMF07Y2FzZSJzIjpyZXR1cm4gYS5sZW5ndGg9PTU/W2IsMSwxLGFbM10sYVs0XV06YS5sZW5ndGg9PTM/W2IsMSwxXTpbYiwxXX19LGNhPWEuX2VxdWFsaXNlVHJhbnNmb3JtPWZ1bmN0aW9uKGIsYyl7Yz1yKGMpLnJlcGxhY2UoL1wuezN9fFx1MjAyNi9nLGIpLGI9YS5wYXJzZVRyYW5zZm9ybVN0cmluZyhiKXx8W10sYz1hLnBhcnNlVHJhbnNmb3JtU3RyaW5nKGMpfHxbXTt2YXIgZD14KGIubGVuZ3RoLGMubGVuZ3RoKSxlPVtdLGY9W10sZz0wLGgsaSxqLGs7Zm9yKDtnPGQ7ZysrKXtqPWJbZ118fGJfKGNbZ10pLGs9Y1tnXXx8Yl8oaik7aWYoalswXSE9a1swXXx8alswXS50b0xvd2VyQ2FzZSgpPT0iciImJihqWzJdIT1rWzJdfHxqWzNdIT1rWzNdKXx8alswXS50b0xvd2VyQ2FzZSgpPT0icyImJihqWzNdIT1rWzNdfHxqWzRdIT1rWzRdKSlyZXR1cm47ZVtnXT1bXSxmW2ddPVtdO2ZvcihoPTAsaT14KGoubGVuZ3RoLGsubGVuZ3RoKTtoPGk7aCsrKWggaW4gaiYmKGVbZ11baF09altoXSksaCBpbiBrJiYoZltnXVtoXT1rW2hdKX1yZXR1cm57ZnJvbTplLHRvOmZ9fTthLl9nZXRDb250YWluZXI9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY7Zj1lPT1udWxsJiYhYS5pcyhiLCJvYmplY3QiKT9oLmRvYy5nZXRFbGVtZW50QnlJZChiKTpiO2lmKGYhPW51bGwpe2lmKGYudGFnTmFtZSlyZXR1cm4gYz09bnVsbD97Y29udGFpbmVyOmYsd2lkdGg6Zi5zdHlsZS5waXhlbFdpZHRofHxmLm9mZnNldFdpZHRoLGhlaWdodDpmLnN0eWxlLnBpeGVsSGVpZ2h0fHxmLm9mZnNldEhlaWdodH06e2NvbnRhaW5lcjpmLHdpZHRoOmMsaGVpZ2h0OmR9O3JldHVybntjb250YWluZXI6MSx4OmIseTpjLHdpZHRoOmQsaGVpZ2h0OmV9fX0sYS5wYXRoVG9SZWxhdGl2ZT1iSyxhLl9lbmdpbmU9e30sYS5wYXRoMmN1cnZlPWJSLGEubWF0cml4PWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtyZXR1cm4gbmV3IGNiKGEsYixjLGQsZSxmKX0sZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChhKXt2YXIgYj13LnNxcnQoYyhhKSk7YVswXSYmKGFbMF0vPWIpLGFbMV0mJihhWzFdLz1iKX1mdW5jdGlvbiBjKGEpe3JldHVybiBhWzBdKmFbMF0rYVsxXSphWzFdfWIuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1bW10sW10sW11dLGg9W1t0aGlzLmEsdGhpcy5jLHRoaXMuZV0sW3RoaXMuYix0aGlzLmQsdGhpcy5mXSxbMCwwLDFdXSxpPVtbYSxjLGVdLFtiLGQsZl0sWzAsMCwxXV0saixrLGwsbTthJiZhIGluc3RhbmNlb2YgY2ImJihpPVtbYS5hLGEuYyxhLmVdLFthLmIsYS5kLGEuZl0sWzAsMCwxXV0pO2ZvcihqPTA7ajwzO2orKylmb3Ioaz0wO2s8MztrKyspe209MDtmb3IobD0wO2w8MztsKyspbSs9aFtqXVtsXSppW2xdW2tdO2dbal1ba109bX10aGlzLmE9Z1swXVswXSx0aGlzLmI9Z1sxXVswXSx0aGlzLmM9Z1swXVsxXSx0aGlzLmQ9Z1sxXVsxXSx0aGlzLmU9Z1swXVsyXSx0aGlzLmY9Z1sxXVsyXX0sYi5pbnZlcnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5hKmEuZC1hLmIqYS5jO3JldHVybiBuZXcgY2IoYS5kL2IsLWEuYi9iLC1hLmMvYixhLmEvYiwoYS5jKmEuZi1hLmQqYS5lKS9iLChhLmIqYS5lLWEuYSphLmYpL2IpfSxiLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjYih0aGlzLmEsdGhpcy5iLHRoaXMuYyx0aGlzLmQsdGhpcy5lLHRoaXMuZil9LGIudHJhbnNsYXRlPWZ1bmN0aW9uKGEsYil7dGhpcy5hZGQoMSwwLDAsMSxhLGIpfSxiLnNjYWxlPWZ1bmN0aW9uKGEsYixjLGQpe2I9PW51bGwmJihiPWEpLChjfHxkKSYmdGhpcy5hZGQoMSwwLDAsMSxjLGQpLHRoaXMuYWRkKGEsMCwwLGIsMCwwKSwoY3x8ZCkmJnRoaXMuYWRkKDEsMCwwLDEsLWMsLWQpfSxiLnJvdGF0ZT1mdW5jdGlvbihiLGMsZCl7Yj1hLnJhZChiKSxjPWN8fDAsZD1kfHwwO3ZhciBlPSt3LmNvcyhiKS50b0ZpeGVkKDkpLGY9K3cuc2luKGIpLnRvRml4ZWQoOSk7dGhpcy5hZGQoZSxmLC1mLGUsYyxkKSx0aGlzLmFkZCgxLDAsMCwxLC1jLC1kKX0sYi54PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEqdGhpcy5hK2IqdGhpcy5jK3RoaXMuZX0sYi55PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEqdGhpcy5iK2IqdGhpcy5kK3RoaXMuZn0sYi5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuK3RoaXNbci5mcm9tQ2hhckNvZGUoOTcrYSldLnRvRml4ZWQoNCl9LGIudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5zdmc/Im1hdHJpeCgiK1t0aGlzLmdldCgwKSx0aGlzLmdldCgxKSx0aGlzLmdldCgyKSx0aGlzLmdldCgzKSx0aGlzLmdldCg0KSx0aGlzLmdldCg1KV0uam9pbigpKyIpIjpbdGhpcy5nZXQoMCksdGhpcy5nZXQoMiksdGhpcy5nZXQoMSksdGhpcy5nZXQoMyksMCwwXS5qb2luKCl9LGIudG9GaWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4icHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeChNMTE9Iit0aGlzLmdldCgwKSsiLCBNMTI9Iit0aGlzLmdldCgyKSsiLCBNMjE9Iit0aGlzLmdldCgxKSsiLCBNMjI9Iit0aGlzLmdldCgzKSsiLCBEeD0iK3RoaXMuZ2V0KDQpKyIsIER5PSIrdGhpcy5nZXQoNSkrIiwgc2l6aW5nbWV0aG9kPSdhdXRvIGV4cGFuZCcpIn0sYi5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5lLnRvRml4ZWQoNCksdGhpcy5mLnRvRml4ZWQoNCldfSxiLnNwbGl0PWZ1bmN0aW9uKCl7dmFyIGI9e307Yi5keD10aGlzLmUsYi5keT10aGlzLmY7dmFyIGU9W1t0aGlzLmEsdGhpcy5jXSxbdGhpcy5iLHRoaXMuZF1dO2Iuc2NhbGV4PXcuc3FydChjKGVbMF0pKSxkKGVbMF0pLGIuc2hlYXI9ZVswXVswXSplWzFdWzBdK2VbMF1bMV0qZVsxXVsxXSxlWzFdPVtlWzFdWzBdLWVbMF1bMF0qYi5zaGVhcixlWzFdWzFdLWVbMF1bMV0qYi5zaGVhcl0sYi5zY2FsZXk9dy5zcXJ0KGMoZVsxXSkpLGQoZVsxXSksYi5zaGVhci89Yi5zY2FsZXk7dmFyIGY9LWVbMF1bMV0sZz1lWzFdWzFdO2c8MD8oYi5yb3RhdGU9YS5kZWcody5hY29zKGcpKSxmPDAmJihiLnJvdGF0ZT0zNjAtYi5yb3RhdGUpKTpiLnJvdGF0ZT1hLmRlZyh3LmFzaW4oZikpLGIuaXNTaW1wbGU9IStiLnNoZWFyLnRvRml4ZWQoOSkmJihiLnNjYWxleC50b0ZpeGVkKDkpPT1iLnNjYWxleS50b0ZpeGVkKDkpfHwhYi5yb3RhdGUpLGIuaXNTdXBlclNpbXBsZT0hK2Iuc2hlYXIudG9GaXhlZCg5KSYmYi5zY2FsZXgudG9GaXhlZCg5KT09Yi5zY2FsZXkudG9GaXhlZCg5KSYmIWIucm90YXRlLGIubm9Sb3RhdGlvbj0hK2Iuc2hlYXIudG9GaXhlZCg5KSYmIWIucm90YXRlO3JldHVybiBifSxiLnRvVHJhbnNmb3JtU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiPWF8fHRoaXNbc10oKTtpZihiLmlzU2ltcGxlKXtiLnNjYWxleD0rYi5zY2FsZXgudG9GaXhlZCg0KSxiLnNjYWxleT0rYi5zY2FsZXkudG9GaXhlZCg0KSxiLnJvdGF0ZT0rYi5yb3RhdGUudG9GaXhlZCg0KTtyZXR1cm4oYi5keHx8Yi5keT8idCIrW2IuZHgsYi5keV06cCkrKGIuc2NhbGV4IT0xfHxiLnNjYWxleSE9MT8icyIrW2Iuc2NhbGV4LGIuc2NhbGV5LDAsMF06cCkrKGIucm90YXRlPyJyIitbYi5yb3RhdGUsMCwwXTpwKX1yZXR1cm4ibSIrW3RoaXMuZ2V0KDApLHRoaXMuZ2V0KDEpLHRoaXMuZ2V0KDIpLHRoaXMuZ2V0KDMpLHRoaXMuZ2V0KDQpLHRoaXMuZ2V0KDUpXX19KGNiLnByb3RvdHlwZSk7dmFyIGNjPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyguKj8pXHMvKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pO25hdmlnYXRvci52ZW5kb3I9PSJBcHBsZSBDb21wdXRlciwgSW5jLiImJihjYyYmY2NbMV08NHx8bmF2aWdhdG9yLnBsYXRmb3JtLnNsaWNlKDAsMik9PSJpUCIpfHxuYXZpZ2F0b3IudmVuZG9yPT0iR29vZ2xlIEluYy4iJiZjYyYmY2NbMV08OD9rLnNhZmFyaT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVjdCgtOTksLTk5LHRoaXMud2lkdGgrOTksdGhpcy5oZWlnaHQrOTkpLmF0dHIoe3N0cm9rZToibm9uZSJ9KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5yZW1vdmUoKX0pfTprLnNhZmFyaT1iZTt2YXIgY2Q9ZnVuY3Rpb24oKXt0aGlzLnJldHVyblZhbHVlPSExfSxjZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKX0sY2Y9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEJ1YmJsZT0hMH0sY2c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSxjaD1mdW5jdGlvbigpe2lmKGguZG9jLmFkZEV2ZW50TGlzdGVuZXIpcmV0dXJuIGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW8mJnVbYl0/dVtiXTpiLGY9ZnVuY3Rpb24oZSl7dmFyIGY9aC5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8aC5kb2MuYm9keS5zY3JvbGxUb3AsaT1oLmRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8aC5kb2MuYm9keS5zY3JvbGxMZWZ0LGo9ZS5jbGllbnRYK2ksaz1lLmNsaWVudFkrZjtpZihvJiZ1W2ddKGIpKWZvcih2YXIgbD0wLG09ZS50YXJnZXRUb3VjaGVzJiZlLnRhcmdldFRvdWNoZXMubGVuZ3RoO2w8bTtsKyspaWYoZS50YXJnZXRUb3VjaGVzW2xdLnRhcmdldD09YSl7dmFyIG49ZTtlPWUudGFyZ2V0VG91Y2hlc1tsXSxlLm9yaWdpbmFsRXZlbnQ9bixlLnByZXZlbnREZWZhdWx0PWNlLGUuc3RvcFByb3BhZ2F0aW9uPWNnO2JyZWFrfXJldHVybiBjLmNhbGwoZCxlLGosayl9O2EuYWRkRXZlbnRMaXN0ZW5lcihlLGYsITEpO3JldHVybiBmdW5jdGlvbigpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGYsITEpO3JldHVybiEwfX07aWYoaC5kb2MuYXR0YWNoRXZlbnQpcmV0dXJuIGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWZ1bmN0aW9uKGEpe2E9YXx8aC53aW4uZXZlbnQ7dmFyIGI9aC5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8aC5kb2MuYm9keS5zY3JvbGxUb3AsZT1oLmRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8aC5kb2MuYm9keS5zY3JvbGxMZWZ0LGY9YS5jbGllbnRYK2UsZz1hLmNsaWVudFkrYjthLnByZXZlbnREZWZhdWx0PWEucHJldmVudERlZmF1bHR8fGNkLGEuc3RvcFByb3BhZ2F0aW9uPWEuc3RvcFByb3BhZ2F0aW9ufHxjZjtyZXR1cm4gYy5jYWxsKGQsYSxmLGcpfTthLmF0dGFjaEV2ZW50KCJvbiIrYixlKTt2YXIgZj1mdW5jdGlvbigpe2EuZGV0YWNoRXZlbnQoIm9uIitiLGUpO3JldHVybiEwfTtyZXR1cm4gZn19KCksY2k9W10sY2o9ZnVuY3Rpb24oYSl7dmFyIGI9YS5jbGllbnRYLGM9YS5jbGllbnRZLGQ9aC5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8aC5kb2MuYm9keS5zY3JvbGxUb3AsZT1oLmRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8aC5kb2MuYm9keS5zY3JvbGxMZWZ0LGYsZz1jaS5sZW5ndGg7d2hpbGUoZy0tKXtmPWNpW2ddO2lmKG8pe3ZhciBpPWEudG91Y2hlcy5sZW5ndGgsajt3aGlsZShpLS0pe2o9YS50b3VjaGVzW2ldO2lmKGouaWRlbnRpZmllcj09Zi5lbC5fZHJhZy5pZCl7Yj1qLmNsaWVudFgsYz1qLmNsaWVudFksKGEub3JpZ2luYWxFdmVudD9hLm9yaWdpbmFsRXZlbnQ6YSkucHJldmVudERlZmF1bHQoKTticmVha319fWVsc2UgYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBrPWYuZWwubm9kZSxsLG09ay5uZXh0U2libGluZyxuPWsucGFyZW50Tm9kZSxwPWsuc3R5bGUuZGlzcGxheTtoLndpbi5vcGVyYSYmbi5yZW1vdmVDaGlsZChrKSxrLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGw9Zi5lbC5wYXBlci5nZXRFbGVtZW50QnlQb2ludChiLGMpLGsuc3R5bGUuZGlzcGxheT1wLGgud2luLm9wZXJhJiYobT9uLmluc2VydEJlZm9yZShrLG0pOm4uYXBwZW5kQ2hpbGQoaykpLGwmJmV2ZSgicmFwaGFlbC5kcmFnLm92ZXIuIitmLmVsLmlkLGYuZWwsbCksYis9ZSxjKz1kLGV2ZSgicmFwaGFlbC5kcmFnLm1vdmUuIitmLmVsLmlkLGYubW92ZV9zY29wZXx8Zi5lbCxiLWYuZWwuX2RyYWcueCxjLWYuZWwuX2RyYWcueSxiLGMsYSl9fSxjaz1mdW5jdGlvbihiKXthLnVubW91c2Vtb3ZlKGNqKS51bm1vdXNldXAoY2spO3ZhciBjPWNpLmxlbmd0aCxkO3doaWxlKGMtLSlkPWNpW2NdLGQuZWwuX2RyYWc9e30sZXZlKCJyYXBoYWVsLmRyYWcuZW5kLiIrZC5lbC5pZCxkLmVuZF9zY29wZXx8ZC5zdGFydF9zY29wZXx8ZC5tb3ZlX3Njb3BlfHxkLmVsLGIpO2NpPVtdfSxjbD1hLmVsPXt9O2Zvcih2YXIgY209dC5sZW5ndGg7Y20tLTspKGZ1bmN0aW9uKGIpe2FbYl09Y2xbYl09ZnVuY3Rpb24oYyxkKXthLmlzKGMsImZ1bmN0aW9uIikmJih0aGlzLmV2ZW50cz10aGlzLmV2ZW50c3x8W10sdGhpcy5ldmVudHMucHVzaCh7bmFtZTpiLGY6Yyx1bmJpbmQ6Y2godGhpcy5zaGFwZXx8dGhpcy5ub2RlfHxoLmRvYyxiLGMsZHx8dGhpcyl9KSk7cmV0dXJuIHRoaXN9LGFbInVuIitiXT1jbFsidW4iK2JdPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZXZlbnRzfHxbXSxkPWMubGVuZ3RoO3doaWxlKGQtLSlpZihjW2RdLm5hbWU9PWImJmNbZF0uZj09YSl7Y1tkXS51bmJpbmQoKSxjLnNwbGljZShkLDEpLCFjLmxlbmd0aCYmZGVsZXRlIHRoaXMuZXZlbnRzO3JldHVybiB0aGlzfXJldHVybiB0aGlzfX0pKHRbY21dKTtjbC5kYXRhPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9YmJbdGhpcy5pZF09YmJbdGhpcy5pZF18fHt9O2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpe2lmKGEuaXMoYiwib2JqZWN0Iikpe2Zvcih2YXIgZSBpbiBiKWJbZ10oZSkmJnRoaXMuZGF0YShlLGJbZV0pO3JldHVybiB0aGlzfWV2ZSgicmFwaGFlbC5kYXRhLmdldC4iK3RoaXMuaWQsdGhpcyxkW2JdLGIpO3JldHVybiBkW2JdfWRbYl09YyxldmUoInJhcGhhZWwuZGF0YS5zZXQuIit0aGlzLmlkLHRoaXMsYyxiKTtyZXR1cm4gdGhpc30sY2wucmVtb3ZlRGF0YT1mdW5jdGlvbihhKXthPT1udWxsP2JiW3RoaXMuaWRdPXt9OmJiW3RoaXMuaWRdJiZkZWxldGUgYmJbdGhpcy5pZF1bYV07cmV0dXJuIHRoaXN9LGNsLmhvdmVyPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm1vdXNlb3ZlcihhLGMpLm1vdXNlb3V0KGIsZHx8Yyl9LGNsLnVuaG92ZXI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy51bm1vdXNlb3ZlcihhKS51bm1vdXNlb3V0KGIpfTt2YXIgY249W107Y2wuZHJhZz1mdW5jdGlvbihiLGMsZCxlLGYsZyl7ZnVuY3Rpb24gaShpKXsoaS5vcmlnaW5hbEV2ZW50fHxpKS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBqPWguZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGguZG9jLmJvZHkuc2Nyb2xsVG9wLGs9aC5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGguZG9jLmJvZHkuc2Nyb2xsTGVmdDt0aGlzLl9kcmFnLng9aS5jbGllbnRYK2ssdGhpcy5fZHJhZy55PWkuY2xpZW50WStqLHRoaXMuX2RyYWcuaWQ9aS5pZGVudGlmaWVyLCFjaS5sZW5ndGgmJmEubW91c2Vtb3ZlKGNqKS5tb3VzZXVwKGNrKSxjaS5wdXNoKHtlbDp0aGlzLG1vdmVfc2NvcGU6ZSxzdGFydF9zY29wZTpmLGVuZF9zY29wZTpnfSksYyYmZXZlLm9uKCJyYXBoYWVsLmRyYWcuc3RhcnQuIit0aGlzLmlkLGMpLGImJmV2ZS5vbigicmFwaGFlbC5kcmFnLm1vdmUuIit0aGlzLmlkLGIpLGQmJmV2ZS5vbigicmFwaGFlbC5kcmFnLmVuZC4iK3RoaXMuaWQsZCksZXZlKCJyYXBoYWVsLmRyYWcuc3RhcnQuIit0aGlzLmlkLGZ8fGV8fHRoaXMsaS5jbGllbnRYK2ssaS5jbGllbnRZK2osaSl9dGhpcy5fZHJhZz17fSxjbi5wdXNoKHtlbDp0aGlzLHN0YXJ0Oml9KSx0aGlzLm1vdXNlZG93bihpKTtyZXR1cm4gdGhpc30sY2wub25EcmFnT3Zlcj1mdW5jdGlvbihhKXthP2V2ZS5vbigicmFwaGFlbC5kcmFnLm92ZXIuIit0aGlzLmlkLGEpOmV2ZS51bmJpbmQoInJhcGhhZWwuZHJhZy5vdmVyLiIrdGhpcy5pZCl9LGNsLnVuZHJhZz1mdW5jdGlvbigpe3ZhciBiPWNuLmxlbmd0aDt3aGlsZShiLS0pY25bYl0uZWw9PXRoaXMmJih0aGlzLnVubW91c2Vkb3duKGNuW2JdLnN0YXJ0KSxjbi5zcGxpY2UoYiwxKSxldmUudW5iaW5kKCJyYXBoYWVsLmRyYWcuKi4iK3RoaXMuaWQpKTshY24ubGVuZ3RoJiZhLnVubW91c2Vtb3ZlKGNqKS51bm1vdXNldXAoY2spfSxrLmNpcmNsZT1mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5fZW5naW5lLmNpcmNsZSh0aGlzLGJ8fDAsY3x8MCxkfHwwKTt0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKGUpO3JldHVybiBlfSxrLnJlY3Q9ZnVuY3Rpb24oYixjLGQsZSxmKXt2YXIgZz1hLl9lbmdpbmUucmVjdCh0aGlzLGJ8fDAsY3x8MCxkfHwwLGV8fDAsZnx8MCk7dGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChnKTtyZXR1cm4gZ30say5lbGxpcHNlPWZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPWEuX2VuZ2luZS5lbGxpcHNlKHRoaXMsYnx8MCxjfHwwLGR8fDAsZXx8MCk7dGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChmKTtyZXR1cm4gZn0say5wYXRoPWZ1bmN0aW9uKGIpe2ImJiFhLmlzKGIsRCkmJiFhLmlzKGJbMF0sRSkmJihiKz1wKTt2YXIgYz1hLl9lbmdpbmUucGF0aChhLmZvcm1hdFttXShhLGFyZ3VtZW50cyksdGhpcyk7dGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChjKTtyZXR1cm4gY30say5pbWFnZT1mdW5jdGlvbihiLGMsZCxlLGYpe3ZhciBnPWEuX2VuZ2luZS5pbWFnZSh0aGlzLGJ8fCJhYm91dDpibGFuayIsY3x8MCxkfHwwLGV8fDAsZnx8MCk7dGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChnKTtyZXR1cm4gZ30say50ZXh0PWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLl9lbmdpbmUudGV4dCh0aGlzLGJ8fDAsY3x8MCxyKGQpKTt0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKGUpO3JldHVybiBlfSxrLnNldD1mdW5jdGlvbihiKXshYS5pcyhiLCJhcnJheSIpJiYoYj1BcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYXJndW1lbnRzLDAsYXJndW1lbnRzLmxlbmd0aCkpO3ZhciBjPW5ldyBjRyhiKTt0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKGMpO3JldHVybiBjfSxrLnNldFN0YXJ0PWZ1bmN0aW9uKGEpe3RoaXMuX19zZXRfXz1hfHx0aGlzLnNldCgpfSxrLnNldEZpbmlzaD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLl9fc2V0X187ZGVsZXRlIHRoaXMuX19zZXRfXztyZXR1cm4gYn0say5zZXRTaXplPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuX2VuZ2luZS5zZXRTaXplLmNhbGwodGhpcyxiLGMpfSxrLnNldFZpZXdCb3g9ZnVuY3Rpb24oYixjLGQsZSxmKXtyZXR1cm4gYS5fZW5naW5lLnNldFZpZXdCb3guY2FsbCh0aGlzLGIsYyxkLGUsZil9LGsudG9wPWsuYm90dG9tPW51bGwsay5yYXBoYWVsPWE7dmFyIGNvPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1hLm93bmVyRG9jdW1lbnQsZD1jLmJvZHksZT1jLmRvY3VtZW50RWxlbWVudCxmPWUuY2xpZW50VG9wfHxkLmNsaWVudFRvcHx8MCxnPWUuY2xpZW50TGVmdHx8ZC5jbGllbnRMZWZ0fHwwLGk9Yi50b3ArKGgud2luLnBhZ2VZT2Zmc2V0fHxlLnNjcm9sbFRvcHx8ZC5zY3JvbGxUb3ApLWYsaj1iLmxlZnQrKGgud2luLnBhZ2VYT2Zmc2V0fHxlLnNjcm9sbExlZnR8fGQuc2Nyb2xsTGVmdCktZztyZXR1cm57eTppLHg6an19O2suZ2V0RWxlbWVudEJ5UG9pbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yy5jYW52YXMsZT1oLmRvYy5lbGVtZW50RnJvbVBvaW50KGEsYik7aWYoaC53aW4ub3BlcmEmJmUudGFnTmFtZT09InN2ZyIpe3ZhciBmPWNvKGQpLGc9ZC5jcmVhdGVTVkdSZWN0KCk7Zy54PWEtZi54LGcueT1iLWYueSxnLndpZHRoPWcuaGVpZ2h0PTE7dmFyIGk9ZC5nZXRJbnRlcnNlY3Rpb25MaXN0KGcsbnVsbCk7aS5sZW5ndGgmJihlPWlbaS5sZW5ndGgtMV0pfWlmKCFlKXJldHVybiBudWxsO3doaWxlKGUucGFyZW50Tm9kZSYmZSE9ZC5wYXJlbnROb2RlJiYhZS5yYXBoYWVsKWU9ZS5wYXJlbnROb2RlO2U9PWMuY2FudmFzLnBhcmVudE5vZGUmJihlPWQpLGU9ZSYmZS5yYXBoYWVsP2MuZ2V0QnlJZChlLnJhcGhhZWxpZCk6bnVsbDtyZXR1cm4gZX0say5nZXRCeUlkPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYm90dG9tO3doaWxlKGIpe2lmKGIuaWQ9PWEpcmV0dXJuIGI7Yj1iLm5leHR9cmV0dXJuIG51bGx9LGsuZm9yRWFjaD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuYm90dG9tO3doaWxlKGMpe2lmKGEuY2FsbChiLGMpPT09ITEpcmV0dXJuIHRoaXM7Yz1jLm5leHR9cmV0dXJuIHRoaXN9LGsuZ2V0RWxlbWVudHNCeVBvaW50PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5zZXQoKTt0aGlzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5pc1BvaW50SW5zaWRlKGEsYikmJmMucHVzaChkKX0pO3JldHVybiBjfSxjbC5pc1BvaW50SW5zaWRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5yZWFsUGF0aD10aGlzLnJlYWxQYXRofHxiaVt0aGlzLnR5cGVdKHRoaXMpO3JldHVybiBhLmlzUG9pbnRJbnNpZGVQYXRoKGQsYixjKX0sY2wuZ2V0QkJveD1mdW5jdGlvbihhKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJue307dmFyIGI9dGhpcy5fO2lmKGEpe2lmKGIuZGlydHl8fCFiLmJib3h3dCl0aGlzLnJlYWxQYXRoPWJpW3RoaXMudHlwZV0odGhpcyksYi5iYm94d3Q9YkkodGhpcy5yZWFsUGF0aCksYi5iYm94d3QudG9TdHJpbmc9Y3EsYi5kaXJ0eT0wO3JldHVybiBiLmJib3h3dH1pZihiLmRpcnR5fHxiLmRpcnR5VHx8IWIuYmJveCl7aWYoYi5kaXJ0eXx8IXRoaXMucmVhbFBhdGgpYi5iYm94d3Q9MCx0aGlzLnJlYWxQYXRoPWJpW3RoaXMudHlwZV0odGhpcyk7Yi5iYm94PWJJKGJqKHRoaXMucmVhbFBhdGgsdGhpcy5tYXRyaXgpKSxiLmJib3gudG9TdHJpbmc9Y3EsYi5kaXJ0eT1iLmRpcnR5VD0wfXJldHVybiBiLmJib3h9LGNsLmNsb25lPWZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVkKXJldHVybiBudWxsO3ZhciBhPXRoaXMucGFwZXJbdGhpcy50eXBlXSgpLmF0dHIodGhpcy5hdHRyKCkpO3RoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2goYSk7cmV0dXJuIGF9LGNsLmdsb3c9ZnVuY3Rpb24oYSl7aWYodGhpcy50eXBlPT0idGV4dCIpcmV0dXJuIG51bGw7YT1hfHx7fTt2YXIgYj17d2lkdGg6KGEud2lkdGh8fDEwKSsoK3RoaXMuYXR0cigic3Ryb2tlLXdpZHRoIil8fDEpLGZpbGw6YS5maWxsfHwhMSxvcGFjaXR5OmEub3BhY2l0eXx8LjUsb2Zmc2V0eDphLm9mZnNldHh8fDAsb2Zmc2V0eTphLm9mZnNldHl8fDAsY29sb3I6YS5jb2xvcnx8IiMwMDAifSxjPWIud2lkdGgvMixkPXRoaXMucGFwZXIsZT1kLnNldCgpLGY9dGhpcy5yZWFsUGF0aHx8YmlbdGhpcy50eXBlXSh0aGlzKTtmPXRoaXMubWF0cml4P2JqKGYsdGhpcy5tYXRyaXgpOmY7Zm9yKHZhciBnPTE7ZzxjKzE7ZysrKWUucHVzaChkLnBhdGgoZikuYXR0cih7c3Ryb2tlOmIuY29sb3IsZmlsbDpiLmZpbGw/Yi5jb2xvcjoibm9uZSIsInN0cm9rZS1saW5lam9pbiI6InJvdW5kIiwic3Ryb2tlLWxpbmVjYXAiOiJyb3VuZCIsInN0cm9rZS13aWR0aCI6KyhiLndpZHRoL2MqZykudG9GaXhlZCgzKSxvcGFjaXR5OisoYi5vcGFjaXR5L2MpLnRvRml4ZWQoMyl9KSk7cmV0dXJuIGUuaW5zZXJ0QmVmb3JlKHRoaXMpLnRyYW5zbGF0ZShiLm9mZnNldHgsYi5vZmZzZXR5KX07dmFyIGNyPXt9LGNzPWZ1bmN0aW9uKGIsYyxkLGUsZixnLGgsaSxqKXtyZXR1cm4gaj09bnVsbD9iQihiLGMsZCxlLGYsZyxoLGkpOmEuZmluZERvdHNBdFNlZ21lbnQoYixjLGQsZSxmLGcsaCxpLGJDKGIsYyxkLGUsZixnLGgsaSxqKSl9LGN0PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmKXtkPWJSKGQpO3ZhciBnLGgsaSxqLGs9IiIsbD17fSxtLG49MDtmb3IodmFyIG89MCxwPWQubGVuZ3RoO288cDtvKyspe2k9ZFtvXTtpZihpWzBdPT0iTSIpZz0raVsxXSxoPStpWzJdO2Vsc2V7aj1jcyhnLGgsaVsxXSxpWzJdLGlbM10saVs0XSxpWzVdLGlbNl0pO2lmKG4raj5lKXtpZihjJiYhbC5zdGFydCl7bT1jcyhnLGgsaVsxXSxpWzJdLGlbM10saVs0XSxpWzVdLGlbNl0sZS1uKSxrKz1bIkMiK20uc3RhcnQueCxtLnN0YXJ0LnksbS5tLngsbS5tLnksbS54LG0ueV07aWYoZilyZXR1cm4gaztsLnN0YXJ0PWssaz1bIk0iK20ueCxtLnkrIkMiK20ubi54LG0ubi55LG0uZW5kLngsbS5lbmQueSxpWzVdLGlbNl1dLmpvaW4oKSxuKz1qLGc9K2lbNV0saD0raVs2XTtjb250aW51ZX1pZighYiYmIWMpe209Y3MoZyxoLGlbMV0saVsyXSxpWzNdLGlbNF0saVs1XSxpWzZdLGUtbik7cmV0dXJue3g6bS54LHk6bS55LGFscGhhOm0uYWxwaGF9fX1uKz1qLGc9K2lbNV0saD0raVs2XX1rKz1pLnNoaWZ0KCkraX1sLmVuZD1rLG09Yj9uOmM/bDphLmZpbmREb3RzQXRTZWdtZW50KGcsaCxpWzBdLGlbMV0saVsyXSxpWzNdLGlbNF0saVs1XSwxKSxtLmFscGhhJiYobT17eDptLngseTptLnksYWxwaGE6bS5hbHBoYX0pO3JldHVybiBtfX0sY3U9Y3QoMSksY3Y9Y3QoKSxjdz1jdCgwLDEpO2EuZ2V0VG90YWxMZW5ndGg9Y3UsYS5nZXRQb2ludEF0TGVuZ3RoPWN2LGEuZ2V0U3VicGF0aD1mdW5jdGlvbihhLGIsYyl7aWYodGhpcy5nZXRUb3RhbExlbmd0aChhKS1jPDFlLTYpcmV0dXJuIGN3KGEsYikuZW5kO3ZhciBkPWN3KGEsYywxKTtyZXR1cm4gYj9jdyhkLGIpLmVuZDpkfSxjbC5nZXRUb3RhbExlbmd0aD1mdW5jdGlvbigpe2lmKHRoaXMudHlwZT09InBhdGgiKXtpZih0aGlzLm5vZGUuZ2V0VG90YWxMZW5ndGgpcmV0dXJuIHRoaXMubm9kZS5nZXRUb3RhbExlbmd0aCgpO3JldHVybiBjdSh0aGlzLmF0dHJzLnBhdGgpfX0sY2wuZ2V0UG9pbnRBdExlbmd0aD1mdW5jdGlvbihhKXtpZih0aGlzLnR5cGU9PSJwYXRoIilyZXR1cm4gY3YodGhpcy5hdHRycy5wYXRoLGEpfSxjbC5nZXRTdWJwYXRoPWZ1bmN0aW9uKGIsYyl7aWYodGhpcy50eXBlPT0icGF0aCIpcmV0dXJuIGEuZ2V0U3VicGF0aCh0aGlzLmF0dHJzLnBhdGgsYixjKX07dmFyIGN4PWEuZWFzaW5nX2Zvcm11bGFzPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LCI8IjpmdW5jdGlvbihhKXtyZXR1cm4gQShhLDEuNyl9LCI+IjpmdW5jdGlvbihhKXtyZXR1cm4gQShhLC40OCl9LCI8PiI6ZnVuY3Rpb24oYSl7dmFyIGI9LjQ4LWEvMS4wNCxjPXcuc3FydCguMTczNCtiKmIpLGQ9Yy1iLGU9QSh6KGQpLDEvMykqKGQ8MD8tMToxKSxmPS1jLWIsZz1BKHooZiksMS8zKSooZjwwPy0xOjEpLGg9ZStnKy41O3JldHVybigxLWgpKjMqaCpoK2gqaCpofSxiYWNrSW46ZnVuY3Rpb24oYSl7dmFyIGI9MS43MDE1ODtyZXR1cm4gYSphKigoYisxKSphLWIpfSxiYWNrT3V0OmZ1bmN0aW9uKGEpe2E9YS0xO3ZhciBiPTEuNzAxNTg7cmV0dXJuIGEqYSooKGIrMSkqYStiKSsxfSxlbGFzdGljOmZ1bmN0aW9uKGEpe2lmKGE9PSEhYSlyZXR1cm4gYTtyZXR1cm4gQSgyLC0xMCphKSp3LnNpbigoYS0uMDc1KSoyKkIvLjMpKzF9LGJvdW5jZTpmdW5jdGlvbihhKXt2YXIgYj03LjU2MjUsYz0yLjc1LGQ7YTwxL2M/ZD1iKmEqYTphPDIvYz8oYS09MS41L2MsZD1iKmEqYSsuNzUpOmE8Mi41L2M/KGEtPTIuMjUvYyxkPWIqYSphKy45Mzc1KTooYS09Mi42MjUvYyxkPWIqYSphKy45ODQzNzUpO3JldHVybiBkfX07Y3guZWFzZUluPWN4WyJlYXNlLWluIl09Y3hbIjwiXSxjeC5lYXNlT3V0PWN4WyJlYXNlLW91dCJdPWN4WyI+Il0sY3guZWFzZUluT3V0PWN4WyJlYXNlLWluLW91dCJdPWN4WyI8PiJdLGN4WyJiYWNrLWluIl09Y3guYmFja0luLGN4WyJiYWNrLW91dCJdPWN4LmJhY2tPdXQ7dmFyIGN5PVtdLGN6PXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoYSwxNil9LGNBPWZ1bmN0aW9uKCl7dmFyIGI9KyhuZXcgRGF0ZSksYz0wO2Zvcig7YzxjeS5sZW5ndGg7YysrKXt2YXIgZD1jeVtjXTtpZihkLmVsLnJlbW92ZWR8fGQucGF1c2VkKWNvbnRpbnVlO3ZhciBlPWItZC5zdGFydCxmPWQubXMsaD1kLmVhc2luZyxpPWQuZnJvbSxqPWQuZGlmZixrPWQudG8sbD1kLnQsbT1kLmVsLG89e30scCxyPXt9LHM7ZC5pbml0c3RhdHVzPyhlPShkLmluaXRzdGF0dXMqZC5hbmltLnRvcC1kLnByZXYpLyhkLnBlcmNlbnQtZC5wcmV2KSpmLGQuc3RhdHVzPWQuaW5pdHN0YXR1cyxkZWxldGUgZC5pbml0c3RhdHVzLGQuc3RvcCYmY3kuc3BsaWNlKGMtLSwxKSk6ZC5zdGF0dXM9KGQucHJldisoZC5wZXJjZW50LWQucHJldikqKGUvZikpL2QuYW5pbS50b3A7aWYoZTwwKWNvbnRpbnVlO2lmKGU8Zil7dmFyIHQ9aChlL2YpO2Zvcih2YXIgdSBpbiBpKWlmKGlbZ10odSkpe3N3aXRjaChVW3VdKXtjYXNlIEM6cD0raVt1XSt0KmYqalt1XTticmVhaztjYXNlImNvbG91ciI6cD0icmdiKCIrW2NCKE8oaVt1XS5yK3QqZipqW3VdLnIpKSxjQihPKGlbdV0uZyt0KmYqalt1XS5nKSksY0IoTyhpW3VdLmIrdCpmKmpbdV0uYikpXS5qb2luKCIsIikrIikiO2JyZWFrO2Nhc2UicGF0aCI6cD1bXTtmb3IodmFyIHY9MCx3PWlbdV0ubGVuZ3RoO3Y8dzt2Kyspe3Bbdl09W2lbdV1bdl1bMF1dO2Zvcih2YXIgeD0xLHk9aVt1XVt2XS5sZW5ndGg7eDx5O3grKylwW3ZdW3hdPStpW3VdW3ZdW3hdK3QqZipqW3VdW3ZdW3hdO3Bbdl09cFt2XS5qb2luKHEpfXA9cC5qb2luKHEpO2JyZWFrO2Nhc2UidHJhbnNmb3JtIjppZihqW3VdLnJlYWwpe3A9W107Zm9yKHY9MCx3PWlbdV0ubGVuZ3RoO3Y8dzt2Kyspe3Bbdl09W2lbdV1bdl1bMF1dO2Zvcih4PTEseT1pW3VdW3ZdLmxlbmd0aDt4PHk7eCsrKXBbdl1beF09aVt1XVt2XVt4XSt0KmYqalt1XVt2XVt4XX19ZWxzZXt2YXIgej1mdW5jdGlvbihhKXtyZXR1cm4raVt1XVthXSt0KmYqalt1XVthXX07cD1bWyJtIix6KDApLHooMSkseigyKSx6KDMpLHooNCkseig1KV1dfWJyZWFrO2Nhc2UiY3N2IjppZih1PT0iY2xpcC1yZWN0Iil7cD1bXSx2PTQ7d2hpbGUodi0tKXBbdl09K2lbdV1bdl0rdCpmKmpbdV1bdl19YnJlYWs7ZGVmYXVsdDp2YXIgQT1bXVtuXShpW3VdKTtwPVtdLHY9bS5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW3VdLmxlbmd0aDt3aGlsZSh2LS0pcFt2XT0rQVt2XSt0KmYqalt1XVt2XX1vW3VdPXB9bS5hdHRyKG8pLGZ1bmN0aW9uKGEsYixjKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZXZlKCJyYXBoYWVsLmFuaW0uZnJhbWUuIithLGIsYyl9KX0obS5pZCxtLGQuYW5pbSl9ZWxzZXsoZnVuY3Rpb24oYixjLGQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtldmUoInJhcGhhZWwuYW5pbS5mcmFtZS4iK2MuaWQsYyxkKSxldmUoInJhcGhhZWwuYW5pbS5maW5pc2guIitjLmlkLGMsZCksYS5pcyhiLCJmdW5jdGlvbiIpJiZiLmNhbGwoYyl9KX0pKGQuY2FsbGJhY2ssbSxkLmFuaW0pLG0uYXR0cihrKSxjeS5zcGxpY2UoYy0tLDEpO2lmKGQucmVwZWF0PjEmJiFkLm5leHQpe2ZvcihzIGluIGspa1tnXShzKSYmKHJbc109ZC50b3RhbE9yaWdpbltzXSk7ZC5lbC5hdHRyKHIpLGNFKGQuYW5pbSxkLmVsLGQuYW5pbS5wZXJjZW50c1swXSxudWxsLGQudG90YWxPcmlnaW4sZC5yZXBlYXQtMSl9ZC5uZXh0JiYhZC5zdG9wJiZjRShkLmFuaW0sZC5lbCxkLm5leHQsbnVsbCxkLnRvdGFsT3JpZ2luLGQucmVwZWF0KX19YS5zdmcmJm0mJm0ucGFwZXImJm0ucGFwZXIuc2FmYXJpKCksY3kubGVuZ3RoJiZjeihjQSl9LGNCPWZ1bmN0aW9uKGEpe3JldHVybiBhPjI1NT8yNTU6YTwwPzA6YX07Y2wuYW5pbWF0ZVdpdGg9ZnVuY3Rpb24oYixjLGQsZSxmLGcpe3ZhciBoPXRoaXM7aWYoaC5yZW1vdmVkKXtnJiZnLmNhbGwoaCk7cmV0dXJuIGh9dmFyIGk9ZCBpbnN0YW5jZW9mIGNEP2Q6YS5hbmltYXRpb24oZCxlLGYsZyksaixrO2NFKGksaCxpLnBlcmNlbnRzWzBdLG51bGwsaC5hdHRyKCkpO2Zvcih2YXIgbD0wLG09Y3kubGVuZ3RoO2w8bTtsKyspaWYoY3lbbF0uYW5pbT09YyYmY3lbbF0uZWw9PWIpe2N5W20tMV0uc3RhcnQ9Y3lbbF0uc3RhcnQ7YnJlYWt9cmV0dXJuIGh9LGNsLm9uQW5pbWF0aW9uPWZ1bmN0aW9uKGEpe2E/ZXZlLm9uKCJyYXBoYWVsLmFuaW0uZnJhbWUuIit0aGlzLmlkLGEpOmV2ZS51bmJpbmQoInJhcGhhZWwuYW5pbS5mcmFtZS4iK3RoaXMuaWQpO3JldHVybiB0aGlzfSxjRC5wcm90b3R5cGUuZGVsYXk9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGNEKHRoaXMuYW5pbSx0aGlzLm1zKTtiLnRpbWVzPXRoaXMudGltZXMsYi5kZWw9K2F8fDA7cmV0dXJuIGJ9LGNELnByb3RvdHlwZS5yZXBlYXQ9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGNEKHRoaXMuYW5pbSx0aGlzLm1zKTtiLmRlbD10aGlzLmRlbCxiLnRpbWVzPXcuZmxvb3IoeChhLDApKXx8MTtyZXR1cm4gYn0sYS5hbmltYXRpb249ZnVuY3Rpb24oYixjLGQsZSl7aWYoYiBpbnN0YW5jZW9mIGNEKXJldHVybiBiO2lmKGEuaXMoZCwiZnVuY3Rpb24iKXx8IWQpZT1lfHxkfHxudWxsLGQ9bnVsbDtiPU9iamVjdChiKSxjPStjfHwwO3ZhciBmPXt9LGgsaTtmb3IoaSBpbiBiKWJbZ10oaSkmJlEoaSkhPWkmJlEoaSkrIiUiIT1pJiYoaD0hMCxmW2ldPWJbaV0pO2lmKCFoKXJldHVybiBuZXcgY0QoYixjKTtkJiYoZi5lYXNpbmc9ZCksZSYmKGYuY2FsbGJhY2s9ZSk7cmV0dXJuIG5ldyBjRCh7MTAwOmZ9LGMpfSxjbC5hbmltYXRlPWZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPXRoaXM7aWYoZi5yZW1vdmVkKXtlJiZlLmNhbGwoZik7cmV0dXJuIGZ9dmFyIGc9YiBpbnN0YW5jZW9mIGNEP2I6YS5hbmltYXRpb24oYixjLGQsZSk7Y0UoZyxmLGcucGVyY2VudHNbMF0sbnVsbCxmLmF0dHIoKSk7cmV0dXJuIGZ9LGNsLnNldFRpbWU9ZnVuY3Rpb24oYSxiKXthJiZiIT1udWxsJiZ0aGlzLnN0YXR1cyhhLHkoYixhLm1zKS9hLm1zKTtyZXR1cm4gdGhpc30sY2wuc3RhdHVzPWZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZD0wLGUsZjtpZihiIT1udWxsKXtjRShhLHRoaXMsLTEseShiLDEpKTtyZXR1cm4gdGhpc31lPWN5Lmxlbmd0aDtmb3IoO2Q8ZTtkKyspe2Y9Y3lbZF07aWYoZi5lbC5pZD09dGhpcy5pZCYmKCFhfHxmLmFuaW09PWEpKXtpZihhKXJldHVybiBmLnN0YXR1cztjLnB1c2goe2FuaW06Zi5hbmltLHN0YXR1czpmLnN0YXR1c30pfX1pZihhKXJldHVybiAwO3JldHVybiBjfSxjbC5wYXVzZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPGN5Lmxlbmd0aDtiKyspY3lbYl0uZWwuaWQ9PXRoaXMuaWQmJighYXx8Y3lbYl0uYW5pbT09YSkmJmV2ZSgicmFwaGFlbC5hbmltLnBhdXNlLiIrdGhpcy5pZCx0aGlzLGN5W2JdLmFuaW0pIT09ITEmJihjeVtiXS5wYXVzZWQ9ITApO3JldHVybiB0aGlzfSxjbC5yZXN1bWU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxjeS5sZW5ndGg7YisrKWlmKGN5W2JdLmVsLmlkPT10aGlzLmlkJiYoIWF8fGN5W2JdLmFuaW09PWEpKXt2YXIgYz1jeVtiXTtldmUoInJhcGhhZWwuYW5pbS5yZXN1bWUuIit0aGlzLmlkLHRoaXMsYy5hbmltKSE9PSExJiYoZGVsZXRlIGMucGF1c2VkLHRoaXMuc3RhdHVzKGMuYW5pbSxjLnN0YXR1cykpfXJldHVybiB0aGlzfSxjbC5zdG9wPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8Y3kubGVuZ3RoO2IrKyljeVtiXS5lbC5pZD09dGhpcy5pZCYmKCFhfHxjeVtiXS5hbmltPT1hKSYmZXZlKCJyYXBoYWVsLmFuaW0uc3RvcC4iK3RoaXMuaWQsdGhpcyxjeVtiXS5hbmltKSE9PSExJiZjeS5zcGxpY2UoYi0tLDEpO3JldHVybiB0aGlzfSxldmUub24oInJhcGhhZWwucmVtb3ZlIixjRiksZXZlLm9uKCJyYXBoYWVsLmNsZWFyIixjRiksY2wudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmFwaGHDq2zigJlzIG9iamVjdCJ9O3ZhciBjRz1mdW5jdGlvbihhKXt0aGlzLml0ZW1zPVtdLHRoaXMubGVuZ3RoPTAsdGhpcy50eXBlPSJzZXQiO2lmKGEpZm9yKHZhciBiPTAsYz1hLmxlbmd0aDtiPGM7YisrKWFbYl0mJihhW2JdLmNvbnN0cnVjdG9yPT1jbC5jb25zdHJ1Y3Rvcnx8YVtiXS5jb25zdHJ1Y3Rvcj09Y0cpJiYodGhpc1t0aGlzLml0ZW1zLmxlbmd0aF09dGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aF09YVtiXSx0aGlzLmxlbmd0aCsrKX0sY0g9Y0cucHJvdG90eXBlO2NILnB1c2g9ZnVuY3Rpb24oKXt2YXIgYSxiO2Zvcih2YXIgYz0wLGQ9YXJndW1lbnRzLmxlbmd0aDtjPGQ7YysrKWE9YXJndW1lbnRzW2NdLGEmJihhLmNvbnN0cnVjdG9yPT1jbC5jb25zdHJ1Y3Rvcnx8YS5jb25zdHJ1Y3Rvcj09Y0cpJiYoYj10aGlzLml0ZW1zLmxlbmd0aCx0aGlzW2JdPXRoaXMuaXRlbXNbYl09YSx0aGlzLmxlbmd0aCsrKTtyZXR1cm4gdGhpc30sY0gucG9wPWZ1bmN0aW9uKCl7dGhpcy5sZW5ndGgmJmRlbGV0ZSB0aGlzW3RoaXMubGVuZ3RoLS1dO3JldHVybiB0aGlzLml0ZW1zLnBvcCgpfSxjSC5mb3JFYWNoPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD10aGlzLml0ZW1zLmxlbmd0aDtjPGQ7YysrKWlmKGEuY2FsbChiLHRoaXMuaXRlbXNbY10sYyk9PT0hMSlyZXR1cm4gdGhpcztyZXR1cm4gdGhpc307Zm9yKHZhciBjSSBpbiBjbCljbFtnXShjSSkmJihjSFtjSV09ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGI9YXJndW1lbnRzO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oYyl7Y1thXVttXShjLGIpfSl9fShjSSkpO2NILmF0dHI9ZnVuY3Rpb24oYixjKXtpZihiJiZhLmlzKGIsRSkmJmEuaXMoYlswXSwib2JqZWN0IikpZm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKXRoaXMuaXRlbXNbZF0uYXR0cihiW2RdKTtlbHNlIGZvcih2YXIgZj0wLGc9dGhpcy5pdGVtcy5sZW5ndGg7ZjxnO2YrKyl0aGlzLml0ZW1zW2ZdLmF0dHIoYixjKTtyZXR1cm4gdGhpc30sY0guY2xlYXI9ZnVuY3Rpb24oKXt3aGlsZSh0aGlzLmxlbmd0aCl0aGlzLnBvcCgpfSxjSC5zcGxpY2U9ZnVuY3Rpb24oYSxiLGMpe2E9YTwwP3godGhpcy5sZW5ndGgrYSwwKTphLGI9eCgwLHkodGhpcy5sZW5ndGgtYSxiKSk7dmFyIGQ9W10sZT1bXSxmPVtdLGc7Zm9yKGc9MjtnPGFyZ3VtZW50cy5sZW5ndGg7ZysrKWYucHVzaChhcmd1bWVudHNbZ10pO2ZvcihnPTA7ZzxiO2crKyllLnB1c2godGhpc1thK2ddKTtmb3IoO2c8dGhpcy5sZW5ndGgtYTtnKyspZC5wdXNoKHRoaXNbYStnXSk7dmFyIGg9Zi5sZW5ndGg7Zm9yKGc9MDtnPGgrZC5sZW5ndGg7ZysrKXRoaXMuaXRlbXNbYStnXT10aGlzW2ErZ109ZzxoP2ZbZ106ZFtnLWhdO2c9dGhpcy5pdGVtcy5sZW5ndGg9dGhpcy5sZW5ndGgtPWItaDt3aGlsZSh0aGlzW2ddKWRlbGV0ZSB0aGlzW2crK107cmV0dXJuIG5ldyBjRyhlKX0sY0guZXhjbHVkZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMubGVuZ3RoO2I8YztiKyspaWYodGhpc1tiXT09YSl7dGhpcy5zcGxpY2UoYiwxKTtyZXR1cm4hMH19LGNILmFuaW1hdGU9ZnVuY3Rpb24oYixjLGQsZSl7KGEuaXMoZCwiZnVuY3Rpb24iKXx8IWQpJiYoZT1kfHxudWxsKTt2YXIgZj10aGlzLml0ZW1zLmxlbmd0aCxnPWYsaCxpPXRoaXMsajtpZighZilyZXR1cm4gdGhpcztlJiYoaj1mdW5jdGlvbigpeyEtLWYmJmUuY2FsbChpKX0pLGQ9YS5pcyhkLEQpP2Q6ajt2YXIgaz1hLmFuaW1hdGlvbihiLGMsZCxqKTtoPXRoaXMuaXRlbXNbLS1nXS5hbmltYXRlKGspO3doaWxlKGctLSl0aGlzLml0ZW1zW2ddJiYhdGhpcy5pdGVtc1tnXS5yZW1vdmVkJiZ0aGlzLml0ZW1zW2ddLmFuaW1hdGVXaXRoKGgsayxrKTtyZXR1cm4gdGhpc30sY0guaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5pdGVtcy5sZW5ndGg7d2hpbGUoYi0tKXRoaXMuaXRlbXNbYl0uaW5zZXJ0QWZ0ZXIoYSk7cmV0dXJuIHRoaXN9LGNILmdldEJCb3g9ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPVtdLGM9W10sZD1bXTtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGg7ZS0tOylpZighdGhpcy5pdGVtc1tlXS5yZW1vdmVkKXt2YXIgZj10aGlzLml0ZW1zW2VdLmdldEJCb3goKTthLnB1c2goZi54KSxiLnB1c2goZi55KSxjLnB1c2goZi54K2Yud2lkdGgpLGQucHVzaChmLnkrZi5oZWlnaHQpfWE9eVttXSgwLGEpLGI9eVttXSgwLGIpLGM9eFttXSgwLGMpLGQ9eFttXSgwLGQpO3JldHVybnt4OmEseTpiLHgyOmMseTI6ZCx3aWR0aDpjLWEsaGVpZ2h0OmQtYn19LGNILmNsb25lPWZ1bmN0aW9uKGEpe2E9bmV3IGNHO2Zvcih2YXIgYj0wLGM9dGhpcy5pdGVtcy5sZW5ndGg7YjxjO2IrKylhLnB1c2godGhpcy5pdGVtc1tiXS5jbG9uZSgpKTtyZXR1cm4gYX0sY0gudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmFwaGHDq2zigJhzIHNldCJ9LGEucmVnaXN0ZXJGb250PWZ1bmN0aW9uKGEpe2lmKCFhLmZhY2UpcmV0dXJuIGE7dGhpcy5mb250cz10aGlzLmZvbnRzfHx7fTt2YXIgYj17dzphLncsZmFjZTp7fSxnbHlwaHM6e319LGM9YS5mYWNlWyJmb250LWZhbWlseSJdO2Zvcih2YXIgZCBpbiBhLmZhY2UpYS5mYWNlW2ddKGQpJiYoYi5mYWNlW2RdPWEuZmFjZVtkXSk7dGhpcy5mb250c1tjXT90aGlzLmZvbnRzW2NdLnB1c2goYik6dGhpcy5mb250c1tjXT1bYl07aWYoIWEuc3ZnKXtiLmZhY2VbInVuaXRzLXBlci1lbSJdPVIoYS5mYWNlWyJ1bml0cy1wZXItZW0iXSwxMCk7Zm9yKHZhciBlIGluIGEuZ2x5cGhzKWlmKGEuZ2x5cGhzW2ddKGUpKXt2YXIgZj1hLmdseXBoc1tlXTtiLmdseXBoc1tlXT17dzpmLncsazp7fSxkOmYuZCYmIk0iK2YuZC5yZXBsYWNlKC9bbWxjeHRydl0vZyxmdW5jdGlvbihhKXtyZXR1cm57bDoiTCIsYzoiQyIseDoieiIsdDoibSIscjoibCIsdjoiYyJ9W2FdfHwiTSJ9KSsieiJ9O2lmKGYuaylmb3IodmFyIGggaW4gZi5rKWZbZ10oaCkmJihiLmdseXBoc1tlXS5rW2hdPWYua1toXSl9fXJldHVybiBhfSxrLmdldEZvbnQ9ZnVuY3Rpb24oYixjLGQsZSl7ZT1lfHwibm9ybWFsIixkPWR8fCJub3JtYWwiLGM9K2N8fHtub3JtYWw6NDAwLGJvbGQ6NzAwLGxpZ2h0ZXI6MzAwLGJvbGRlcjo4MDB9W2NdfHw0MDA7aWYoISFhLmZvbnRzKXt2YXIgZj1hLmZvbnRzW2JdO2lmKCFmKXt2YXIgaD1uZXcgUmVnRXhwKCIoXnxcXHMpIitiLnJlcGxhY2UoL1teXHdcZFxzKyF+LjpfLV0vZyxwKSsiKFxcc3wkKSIsImkiKTtmb3IodmFyIGkgaW4gYS5mb250cylpZihhLmZvbnRzW2ddKGkpJiZoLnRlc3QoaSkpe2Y9YS5mb250c1tpXTticmVha319dmFyIGo7aWYoZilmb3IodmFyIGs9MCxsPWYubGVuZ3RoO2s8bDtrKyspe2o9ZltrXTtpZihqLmZhY2VbImZvbnQtd2VpZ2h0Il09PWMmJihqLmZhY2VbImZvbnQtc3R5bGUiXT09ZHx8IWouZmFjZVsiZm9udC1zdHlsZSJdKSYmai5mYWNlWyJmb250LXN0cmV0Y2giXT09ZSlicmVha31yZXR1cm4gan19LGsucHJpbnQ9ZnVuY3Rpb24oYixkLGUsZixnLGgsaSl7aD1ofHwibWlkZGxlIixpPXgoeShpfHwwLDEpLC0xKTt2YXIgaj1yKGUpW3NdKHApLGs9MCxsPTAsbT1wLG47YS5pcyhmLGUpJiYoZj10aGlzLmdldEZvbnQoZikpO2lmKGYpe249KGd8fDE2KS9mLmZhY2VbInVuaXRzLXBlci1lbSJdO3ZhciBvPWYuZmFjZS5iYm94W3NdKGMpLHE9K29bMF0sdD1vWzNdLW9bMV0sdT0wLHY9K29bMV0rKGg9PSJiYXNlbGluZSI/dCsgK2YuZmFjZS5kZXNjZW50OnQvMik7Zm9yKHZhciB3PTAsej1qLmxlbmd0aDt3PHo7dysrKXtpZihqW3ddPT0iXG4iKWs9MCxCPTAsbD0wLHUrPXQ7ZWxzZXt2YXIgQT1sJiZmLmdseXBoc1tqW3ctMV1dfHx7fSxCPWYuZ2x5cGhzW2pbd11dO2srPWw/KEEud3x8Zi53KSsoQS5rJiZBLmtbalt3XV18fDApK2YudyppOjAsbD0xfUImJkIuZCYmKG0rPWEudHJhbnNmb3JtUGF0aChCLmQsWyJ0IixrKm4sdSpuLCJzIixuLG4scSx2LCJ0IiwoYi1xKS9uLChkLXYpL25dKSl9fXJldHVybiB0aGlzLnBhdGgobSkuYXR0cih7ZmlsbDoiIzAwMCIsc3Ryb2tlOiJub25lIn0pfSxrLmFkZD1mdW5jdGlvbihiKXtpZihhLmlzKGIsImFycmF5Iikpe3ZhciBjPXRoaXMuc2V0KCksZT0wLGY9Yi5sZW5ndGgsaDtmb3IoO2U8ZjtlKyspaD1iW2VdfHx7fSxkW2ddKGgudHlwZSkmJmMucHVzaCh0aGlzW2gudHlwZV0oKS5hdHRyKGgpKX1yZXR1cm4gY30sYS5mb3JtYXQ9ZnVuY3Rpb24oYixjKXt2YXIgZD1hLmlzKGMsRSk/WzBdW25dKGMpOmFyZ3VtZW50cztiJiZhLmlzKGIsRCkmJmQubGVuZ3RoLTEmJihiPWIucmVwbGFjZShlLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGRbKytiXT09bnVsbD9wOmRbYl19KSk7cmV0dXJuIGJ8fHB9LGEuZnVsbGZpbGw9ZnVuY3Rpb24oKXt2YXIgYT0vXHsoW15cfV0rKVx9L2csYj0vKD86KD86XnxcLikoLis/KSg/PVxbfFwufCR8XCgpfFxbKCd8IikoLis/KVwyXF0pKFwoXCkpPy9nLGM9ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQ7Yy5yZXBsYWNlKGIsZnVuY3Rpb24oYSxiLGMsZCxmKXtiPWJ8fGQsZSYmKGIgaW4gZSYmKGU9ZVtiXSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJmYmJihlPWUoKSkpfSksZT0oZT09bnVsbHx8ZT09ZD9hOmUpKyIiO3JldHVybiBlfTtyZXR1cm4gZnVuY3Rpb24oYixkKXtyZXR1cm4gU3RyaW5nKGIpLnJlcGxhY2UoYSxmdW5jdGlvbihhLGIpe3JldHVybiBjKGEsYixkKX0pfX0oKSxhLm5pbmphPWZ1bmN0aW9uKCl7aS53YXM/aC53aW4uUmFwaGFlbD1pLmlzOmRlbGV0ZSBSYXBoYWVsO3JldHVybiBhfSxhLnN0PWNILGZ1bmN0aW9uKGIsYyxkKXtmdW5jdGlvbiBlKCl7L2luLy50ZXN0KGIucmVhZHlTdGF0ZSk/c2V0VGltZW91dChlLDkpOmEuZXZlKCJyYXBoYWVsLkRPTWxvYWQiKX1iLnJlYWR5U3RhdGU9PW51bGwmJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcihjLGQ9ZnVuY3Rpb24oKXtiLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLCExKSxiLnJlYWR5U3RhdGU9ImNvbXBsZXRlIn0sITEpLGIucmVhZHlTdGF0ZT0ibG9hZGluZyIpLGUoKX0oZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiKSxpLndhcz9oLndpbi5SYXBoYWVsPWE6UmFwaGFlbD1hLGV2ZS5vbigicmFwaGFlbC5ET01sb2FkIixmdW5jdGlvbigpe2I9ITB9KX0oKSx3aW5kb3cuUmFwaGFlbC5zdmcmJmZ1bmN0aW9uKGEpe3ZhciBiPSJoYXNPd25Qcm9wZXJ0eSIsYz1TdHJpbmcsZD1wYXJzZUZsb2F0LGU9cGFyc2VJbnQsZj1NYXRoLGc9Zi5tYXgsaD1mLmFicyxpPWYucG93LGo9L1ssIF0rLyxrPWEuZXZlLGw9IiIsbT0iICIsbj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsbz17YmxvY2s6Ik01LDAgMCwyLjUgNSw1eiIsY2xhc3NpYzoiTTUsMCAwLDIuNSA1LDUgMy41LDMgMy41LDJ6IixkaWFtb25kOiJNMi41LDAgNSwyLjUgMi41LDUgMCwyLjV6IixvcGVuOiJNNiwxIDEsMy41IDYsNiIsb3ZhbDoiTTIuNSwwQTIuNSwyLjUsMCwwLDEsMi41LDUgMi41LDIuNSwwLDAsMSwyLjUsMHoifSxwPXt9O2EudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iWW91ciBicm93c2VyIHN1cHBvcnRzIFNWRy5cbllvdSBhcmUgcnVubmluZyBSYXBoYcOrbCAiK3RoaXMudmVyc2lvbn07dmFyIHE9ZnVuY3Rpb24oZCxlKXtpZihlKXt0eXBlb2YgZD09InN0cmluZyImJihkPXEoZCkpO2Zvcih2YXIgZiBpbiBlKWVbYl0oZikmJihmLnN1YnN0cmluZygwLDYpPT0ieGxpbms6Ij9kLnNldEF0dHJpYnV0ZU5TKG4sZi5zdWJzdHJpbmcoNiksYyhlW2ZdKSk6ZC5zZXRBdHRyaWJ1dGUoZixjKGVbZl0pKSl9ZWxzZSBkPWEuX2cuZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGQpLGQuc3R5bGUmJihkLnN0eWxlLndlYmtpdFRhcEhpZ2hsaWdodENvbG9yPSJyZ2JhKDAsMCwwLDApIik7cmV0dXJuIGR9LHI9ZnVuY3Rpb24oYixlKXt2YXIgaj0ibGluZWFyIixrPWIuaWQrZSxtPS41LG49LjUsbz1iLm5vZGUscD1iLnBhcGVyLHI9by5zdHlsZSxzPWEuX2cuZG9jLmdldEVsZW1lbnRCeUlkKGspO2lmKCFzKXtlPWMoZSkucmVwbGFjZShhLl9yYWRpYWxfZ3JhZGllbnQsZnVuY3Rpb24oYSxiLGMpe2o9InJhZGlhbCI7aWYoYiYmYyl7bT1kKGIpLG49ZChjKTt2YXIgZT0obj4uNSkqMi0xO2kobS0uNSwyKStpKG4tLjUsMik+LjI1JiYobj1mLnNxcnQoLjI1LWkobS0uNSwyKSkqZSsuNSkmJm4hPS41JiYobj1uLnRvRml4ZWQoNSktMWUtNSplKX1yZXR1cm4gbH0pLGU9ZS5zcGxpdCgvXHMqXC1ccyovKTtpZihqPT0ibGluZWFyIil7dmFyIHQ9ZS5zaGlmdCgpO3Q9LWQodCk7aWYoaXNOYU4odCkpcmV0dXJuIG51bGw7dmFyIHU9WzAsMCxmLmNvcyhhLnJhZCh0KSksZi5zaW4oYS5yYWQodCkpXSx2PTEvKGcoaCh1WzJdKSxoKHVbM10pKXx8MSk7dVsyXSo9dix1WzNdKj12LHVbMl08MCYmKHVbMF09LXVbMl0sdVsyXT0wKSx1WzNdPDAmJih1WzFdPS11WzNdLHVbM109MCl9dmFyIHc9YS5fcGFyc2VEb3RzKGUpO2lmKCF3KXJldHVybiBudWxsO2s9ay5yZXBsYWNlKC9bXChcKVxzLFx4YjAjXS9nLCJfIiksYi5ncmFkaWVudCYmayE9Yi5ncmFkaWVudC5pZCYmKHAuZGVmcy5yZW1vdmVDaGlsZChiLmdyYWRpZW50KSxkZWxldGUgYi5ncmFkaWVudCk7aWYoIWIuZ3JhZGllbnQpe3M9cShqKyJHcmFkaWVudCIse2lkOmt9KSxiLmdyYWRpZW50PXMscShzLGo9PSJyYWRpYWwiP3tmeDptLGZ5Om59Ont4MTp1WzBdLHkxOnVbMV0seDI6dVsyXSx5Mjp1WzNdLGdyYWRpZW50VHJhbnNmb3JtOmIubWF0cml4LmludmVydCgpfSkscC5kZWZzLmFwcGVuZENoaWxkKHMpO2Zvcih2YXIgeD0wLHk9dy5sZW5ndGg7eDx5O3grKylzLmFwcGVuZENoaWxkKHEoInN0b3AiLHtvZmZzZXQ6d1t4XS5vZmZzZXQ/d1t4XS5vZmZzZXQ6eD8iMTAwJSI6IjAlIiwic3RvcC1jb2xvciI6d1t4XS5jb2xvcnx8IiNmZmYifSkpfX1xKG8se2ZpbGw6InVybCgjIitrKyIpIixvcGFjaXR5OjEsImZpbGwtb3BhY2l0eSI6MX0pLHIuZmlsbD1sLHIub3BhY2l0eT0xLHIuZmlsbE9wYWNpdHk9MTtyZXR1cm4gMX0scz1mdW5jdGlvbihhKXt2YXIgYj1hLmdldEJCb3goMSk7cShhLnBhdHRlcm4se3BhdHRlcm5UcmFuc2Zvcm06YS5tYXRyaXguaW52ZXJ0KCkrIiB0cmFuc2xhdGUoIitiLngrIiwiK2IueSsiKSJ9KX0sdD1mdW5jdGlvbihkLGUsZil7aWYoZC50eXBlPT0icGF0aCIpe3ZhciBnPWMoZSkudG9Mb3dlckNhc2UoKS5zcGxpdCgiLSIpLGg9ZC5wYXBlcixpPWY/ImVuZCI6InN0YXJ0IixqPWQubm9kZSxrPWQuYXR0cnMsbT1rWyJzdHJva2Utd2lkdGgiXSxuPWcubGVuZ3RoLHI9ImNsYXNzaWMiLHMsdCx1LHYsdyx4PTMseT0zLHo9NTt3aGlsZShuLS0pc3dpdGNoKGdbbl0pe2Nhc2UiYmxvY2siOmNhc2UiY2xhc3NpYyI6Y2FzZSJvdmFsIjpjYXNlImRpYW1vbmQiOmNhc2Uib3BlbiI6Y2FzZSJub25lIjpyPWdbbl07YnJlYWs7Y2FzZSJ3aWRlIjp5PTU7YnJlYWs7Y2FzZSJuYXJyb3ciOnk9MjticmVhaztjYXNlImxvbmciOng9NTticmVhaztjYXNlInNob3J0Ijp4PTJ9cj09Im9wZW4iPyh4Kz0yLHkrPTIseis9Mix1PTEsdj1mPzQ6MSx3PXtmaWxsOiJub25lIixzdHJva2U6ay5zdHJva2V9KToodj11PXgvMix3PXtmaWxsOmsuc3Ryb2tlLHN0cm9rZToibm9uZSJ9KSxkLl8uYXJyb3dzP2Y/KGQuXy5hcnJvd3MuZW5kUGF0aCYmcFtkLl8uYXJyb3dzLmVuZFBhdGhdLS0sZC5fLmFycm93cy5lbmRNYXJrZXImJnBbZC5fLmFycm93cy5lbmRNYXJrZXJdLS0pOihkLl8uYXJyb3dzLnN0YXJ0UGF0aCYmcFtkLl8uYXJyb3dzLnN0YXJ0UGF0aF0tLSxkLl8uYXJyb3dzLnN0YXJ0TWFya2VyJiZwW2QuXy5hcnJvd3Muc3RhcnRNYXJrZXJdLS0pOmQuXy5hcnJvd3M9e307aWYociE9Im5vbmUiKXt2YXIgQT0icmFwaGFlbC1tYXJrZXItIityLEI9InJhcGhhZWwtbWFya2VyLSIraStyK3greTthLl9nLmRvYy5nZXRFbGVtZW50QnlJZChBKT9wW0FdKys6KGguZGVmcy5hcHBlbmRDaGlsZChxKHEoInBhdGgiKSx7InN0cm9rZS1saW5lY2FwIjoicm91bmQiLGQ6b1tyXSxpZDpBfSkpLHBbQV09MSk7dmFyIEM9YS5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoQiksRDtDPyhwW0JdKyssRD1DLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ1c2UiKVswXSk6KEM9cShxKCJtYXJrZXIiKSx7aWQ6QixtYXJrZXJIZWlnaHQ6eSxtYXJrZXJXaWR0aDp4LG9yaWVudDoiYXV0byIscmVmWDp2LHJlZlk6eS8yfSksRD1xKHEoInVzZSIpLHsieGxpbms6aHJlZiI6IiMiK0EsdHJhbnNmb3JtOihmPyJyb3RhdGUoMTgwICIreC8yKyIgIit5LzIrIikgIjpsKSsic2NhbGUoIit4L3orIiwiK3kveisiKSIsInN0cm9rZS13aWR0aCI6KDEvKCh4L3oreS96KS8yKSkudG9GaXhlZCg0KX0pLEMuYXBwZW5kQ2hpbGQoRCksaC5kZWZzLmFwcGVuZENoaWxkKEMpLHBbQl09MSkscShELHcpO3ZhciBGPXUqKHIhPSJkaWFtb25kIiYmciE9Im92YWwiKTtmPyhzPWQuXy5hcnJvd3Muc3RhcnRkeCptfHwwLHQ9YS5nZXRUb3RhbExlbmd0aChrLnBhdGgpLUYqbSk6KHM9RiptLHQ9YS5nZXRUb3RhbExlbmd0aChrLnBhdGgpLShkLl8uYXJyb3dzLmVuZGR4Km18fDApKSx3PXt9LHdbIm1hcmtlci0iK2ldPSJ1cmwoIyIrQisiKSI7aWYodHx8cyl3LmQ9UmFwaGFlbC5nZXRTdWJwYXRoKGsucGF0aCxzLHQpO3Eoaix3KSxkLl8uYXJyb3dzW2krIlBhdGgiXT1BLGQuXy5hcnJvd3NbaSsiTWFya2VyIl09QixkLl8uYXJyb3dzW2krImR4Il09RixkLl8uYXJyb3dzW2krIlR5cGUiXT1yLGQuXy5hcnJvd3NbaSsiU3RyaW5nIl09ZX1lbHNlIGY/KHM9ZC5fLmFycm93cy5zdGFydGR4Km18fDAsdD1hLmdldFRvdGFsTGVuZ3RoKGsucGF0aCktcyk6KHM9MCx0PWEuZ2V0VG90YWxMZW5ndGgoay5wYXRoKS0oZC5fLmFycm93cy5lbmRkeCptfHwwKSksZC5fLmFycm93c1tpKyJQYXRoIl0mJnEoaix7ZDpSYXBoYWVsLmdldFN1YnBhdGgoay5wYXRoLHMsdCl9KSxkZWxldGUgZC5fLmFycm93c1tpKyJQYXRoIl0sZGVsZXRlIGQuXy5hcnJvd3NbaSsiTWFya2VyIl0sZGVsZXRlIGQuXy5hcnJvd3NbaSsiZHgiXSxkZWxldGUgZC5fLmFycm93c1tpKyJUeXBlIl0sZGVsZXRlIGQuXy5hcnJvd3NbaSsiU3RyaW5nIl07Zm9yKHcgaW4gcClpZihwW2JdKHcpJiYhcFt3XSl7dmFyIEc9YS5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQodyk7RyYmRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEcpfX19LHU9eyIiOlswXSxub25lOlswXSwiLSI6WzMsMV0sIi4iOlsxLDFdLCItLiI6WzMsMSwxLDFdLCItLi4iOlszLDEsMSwxLDEsMV0sIi4gIjpbMSwzXSwiLSAiOls0LDNdLCItLSI6WzgsM10sIi0gLiI6WzQsMywxLDNdLCItLS4iOls4LDMsMSwzXSwiLS0uLiI6WzgsMywxLDMsMSwzXX0sdj1mdW5jdGlvbihhLGIsZCl7Yj11W2MoYikudG9Mb3dlckNhc2UoKV07aWYoYil7dmFyIGU9YS5hdHRyc1sic3Ryb2tlLXdpZHRoIl18fCIxIixmPXtyb3VuZDplLHNxdWFyZTplLGJ1dHQ6MH1bYS5hdHRyc1sic3Ryb2tlLWxpbmVjYXAiXXx8ZFsic3Ryb2tlLWxpbmVjYXAiXV18fDAsZz1bXSxoPWIubGVuZ3RoO3doaWxlKGgtLSlnW2hdPWJbaF0qZSsoaCUyPzE6LTEpKmY7cShhLm5vZGUseyJzdHJva2UtZGFzaGFycmF5IjpnLmpvaW4oIiwiKX0pfX0sdz1mdW5jdGlvbihkLGYpe3ZhciBpPWQubm9kZSxrPWQuYXR0cnMsbT1pLnN0eWxlLnZpc2liaWxpdHk7aS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO2Zvcih2YXIgbyBpbiBmKWlmKGZbYl0obykpe2lmKCFhLl9hdmFpbGFibGVBdHRyc1tiXShvKSljb250aW51ZTt2YXIgcD1mW29dO2tbb109cDtzd2l0Y2gobyl7Y2FzZSJibHVyIjpkLmJsdXIocCk7YnJlYWs7Y2FzZSJocmVmIjpjYXNlInRpdGxlIjpjYXNlInRhcmdldCI6dmFyIHU9aS5wYXJlbnROb2RlO2lmKHUudGFnTmFtZS50b0xvd2VyQ2FzZSgpIT0iYSIpe3ZhciB3PXEoImEiKTt1Lmluc2VydEJlZm9yZSh3LGkpLHcuYXBwZW5kQ2hpbGQoaSksdT13fW89PSJ0YXJnZXQiP3Uuc2V0QXR0cmlidXRlTlMobiwic2hvdyIscD09ImJsYW5rIj8ibmV3IjpwKTp1LnNldEF0dHJpYnV0ZU5TKG4sbyxwKTticmVhaztjYXNlImN1cnNvciI6aS5zdHlsZS5jdXJzb3I9cDticmVhaztjYXNlInRyYW5zZm9ybSI6ZC50cmFuc2Zvcm0ocCk7YnJlYWs7Y2FzZSJhcnJvdy1zdGFydCI6dChkLHApO2JyZWFrO2Nhc2UiYXJyb3ctZW5kIjp0KGQscCwxKTticmVhaztjYXNlImNsaXAtcmVjdCI6dmFyIHg9YyhwKS5zcGxpdChqKTtpZih4Lmxlbmd0aD09NCl7ZC5jbGlwJiZkLmNsaXAucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQuY2xpcC5wYXJlbnROb2RlKTt2YXIgej1xKCJjbGlwUGF0aCIpLEE9cSgicmVjdCIpO3ouaWQ9YS5jcmVhdGVVVUlEKCkscShBLHt4OnhbMF0seTp4WzFdLHdpZHRoOnhbMl0saGVpZ2h0OnhbM119KSx6LmFwcGVuZENoaWxkKEEpLGQucGFwZXIuZGVmcy5hcHBlbmRDaGlsZCh6KSxxKGkseyJjbGlwLXBhdGgiOiJ1cmwoIyIrei5pZCsiKSJ9KSxkLmNsaXA9QX1pZighcCl7dmFyIEI9aS5nZXRBdHRyaWJ1dGUoImNsaXAtcGF0aCIpO2lmKEIpe3ZhciBDPWEuX2cuZG9jLmdldEVsZW1lbnRCeUlkKEIucmVwbGFjZSgvKF51cmxcKCN8XCkkKS9nLGwpKTtDJiZDLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoQykscShpLHsiY2xpcC1wYXRoIjpsfSksZGVsZXRlIGQuY2xpcH19YnJlYWs7Y2FzZSJwYXRoIjpkLnR5cGU9PSJwYXRoIiYmKHEoaSx7ZDpwP2sucGF0aD1hLl9wYXRoVG9BYnNvbHV0ZShwKToiTTAsMCJ9KSxkLl8uZGlydHk9MSxkLl8uYXJyb3dzJiYoInN0YXJ0U3RyaW5nImluIGQuXy5hcnJvd3MmJnQoZCxkLl8uYXJyb3dzLnN0YXJ0U3RyaW5nKSwiZW5kU3RyaW5nImluIGQuXy5hcnJvd3MmJnQoZCxkLl8uYXJyb3dzLmVuZFN0cmluZywxKSkpO2JyZWFrO2Nhc2Uid2lkdGgiOmkuc2V0QXR0cmlidXRlKG8scCksZC5fLmRpcnR5PTE7aWYoay5meClvPSJ4IixwPWsueDtlbHNlIGJyZWFrO2Nhc2UieCI6ay5meCYmKHA9LWsueC0oay53aWR0aHx8MCkpO2Nhc2UicngiOmlmKG89PSJyeCImJmQudHlwZT09InJlY3QiKWJyZWFrO2Nhc2UiY3giOmkuc2V0QXR0cmlidXRlKG8scCksZC5wYXR0ZXJuJiZzKGQpLGQuXy5kaXJ0eT0xO2JyZWFrO2Nhc2UiaGVpZ2h0IjppLnNldEF0dHJpYnV0ZShvLHApLGQuXy5kaXJ0eT0xO2lmKGsuZnkpbz0ieSIscD1rLnk7ZWxzZSBicmVhaztjYXNlInkiOmsuZnkmJihwPS1rLnktKGsuaGVpZ2h0fHwwKSk7Y2FzZSJyeSI6aWYobz09InJ5IiYmZC50eXBlPT0icmVjdCIpYnJlYWs7Y2FzZSJjeSI6aS5zZXRBdHRyaWJ1dGUobyxwKSxkLnBhdHRlcm4mJnMoZCksZC5fLmRpcnR5PTE7YnJlYWs7Y2FzZSJyIjpkLnR5cGU9PSJyZWN0Ij9xKGkse3J4OnAscnk6cH0pOmkuc2V0QXR0cmlidXRlKG8scCksZC5fLmRpcnR5PTE7YnJlYWs7Y2FzZSJzcmMiOmQudHlwZT09ImltYWdlIiYmaS5zZXRBdHRyaWJ1dGVOUyhuLCJocmVmIixwKTticmVhaztjYXNlInN0cm9rZS13aWR0aCI6aWYoZC5fLnN4IT0xfHxkLl8uc3khPTEpcC89ZyhoKGQuXy5zeCksaChkLl8uc3kpKXx8MTtkLnBhcGVyLl92YlNpemUmJihwKj1kLnBhcGVyLl92YlNpemUpLGkuc2V0QXR0cmlidXRlKG8scCksa1sic3Ryb2tlLWRhc2hhcnJheSJdJiZ2KGQsa1sic3Ryb2tlLWRhc2hhcnJheSJdLGYpLGQuXy5hcnJvd3MmJigic3RhcnRTdHJpbmciaW4gZC5fLmFycm93cyYmdChkLGQuXy5hcnJvd3Muc3RhcnRTdHJpbmcpLCJlbmRTdHJpbmciaW4gZC5fLmFycm93cyYmdChkLGQuXy5hcnJvd3MuZW5kU3RyaW5nLDEpKTticmVhaztjYXNlInN0cm9rZS1kYXNoYXJyYXkiOnYoZCxwLGYpO2JyZWFrO2Nhc2UiZmlsbCI6dmFyIEQ9YyhwKS5tYXRjaChhLl9JU1VSTCk7aWYoRCl7ej1xKCJwYXR0ZXJuIik7dmFyIEY9cSgiaW1hZ2UiKTt6LmlkPWEuY3JlYXRlVVVJRCgpLHEoeix7eDowLHk6MCxwYXR0ZXJuVW5pdHM6InVzZXJTcGFjZU9uVXNlIixoZWlnaHQ6MSx3aWR0aDoxfSkscShGLHt4OjAseTowLCJ4bGluazpocmVmIjpEWzFdfSksei5hcHBlbmRDaGlsZChGKSxmdW5jdGlvbihiKXthLl9wcmVsb2FkKERbMV0sZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFdpZHRoLGM9dGhpcy5vZmZzZXRIZWlnaHQ7cShiLHt3aWR0aDphLGhlaWdodDpjfSkscShGLHt3aWR0aDphLGhlaWdodDpjfSksZC5wYXBlci5zYWZhcmkoKX0pfSh6KSxkLnBhcGVyLmRlZnMuYXBwZW5kQ2hpbGQoeikscShpLHtmaWxsOiJ1cmwoIyIrei5pZCsiKSJ9KSxkLnBhdHRlcm49eixkLnBhdHRlcm4mJnMoZCk7YnJlYWt9dmFyIEc9YS5nZXRSR0IocCk7aWYoIUcuZXJyb3IpZGVsZXRlIGYuZ3JhZGllbnQsZGVsZXRlIGsuZ3JhZGllbnQsIWEuaXMoay5vcGFjaXR5LCJ1bmRlZmluZWQiKSYmYS5pcyhmLm9wYWNpdHksInVuZGVmaW5lZCIpJiZxKGkse29wYWNpdHk6ay5vcGFjaXR5fSksIWEuaXMoa1siZmlsbC1vcGFjaXR5Il0sInVuZGVmaW5lZCIpJiZhLmlzKGZbImZpbGwtb3BhY2l0eSJdLCJ1bmRlZmluZWQiKSYmcShpLHsiZmlsbC1vcGFjaXR5IjprWyJmaWxsLW9wYWNpdHkiXX0pO2Vsc2UgaWYoKGQudHlwZT09ImNpcmNsZSJ8fGQudHlwZT09ImVsbGlwc2UifHxjKHApLmNoYXJBdCgpIT0iciIpJiZyKGQscCkpe2lmKCJvcGFjaXR5ImluIGt8fCJmaWxsLW9wYWNpdHkiaW4gayl7dmFyIEg9YS5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoaS5nZXRBdHRyaWJ1dGUoImZpbGwiKS5yZXBsYWNlKC9edXJsXCgjfFwpJC9nLGwpKTtpZihIKXt2YXIgST1ILmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdG9wIik7cShJW0kubGVuZ3RoLTFdLHsic3RvcC1vcGFjaXR5IjooIm9wYWNpdHkiaW4gaz9rLm9wYWNpdHk6MSkqKCJmaWxsLW9wYWNpdHkiaW4gaz9rWyJmaWxsLW9wYWNpdHkiXToxKX0pfX1rLmdyYWRpZW50PXAsay5maWxsPSJub25lIjticmVha31HW2JdKCJvcGFjaXR5IikmJnEoaSx7ImZpbGwtb3BhY2l0eSI6Ry5vcGFjaXR5PjE/Ry5vcGFjaXR5LzEwMDpHLm9wYWNpdHl9KTtjYXNlInN0cm9rZSI6Rz1hLmdldFJHQihwKSxpLnNldEF0dHJpYnV0ZShvLEcuaGV4KSxvPT0ic3Ryb2tlIiYmR1tiXSgib3BhY2l0eSIpJiZxKGkseyJzdHJva2Utb3BhY2l0eSI6Ry5vcGFjaXR5PjE/Ry5vcGFjaXR5LzEwMDpHLm9wYWNpdHl9KSxvPT0ic3Ryb2tlIiYmZC5fLmFycm93cyYmKCJzdGFydFN0cmluZyJpbiBkLl8uYXJyb3dzJiZ0KGQsZC5fLmFycm93cy5zdGFydFN0cmluZyksImVuZFN0cmluZyJpbiBkLl8uYXJyb3dzJiZ0KGQsZC5fLmFycm93cy5lbmRTdHJpbmcsMSkpO2JyZWFrO2Nhc2UiZ3JhZGllbnQiOihkLnR5cGU9PSJjaXJjbGUifHxkLnR5cGU9PSJlbGxpcHNlInx8YyhwKS5jaGFyQXQoKSE9InIiKSYmcihkLHApO2JyZWFrO2Nhc2Uib3BhY2l0eSI6ay5ncmFkaWVudCYmIWtbYl0oInN0cm9rZS1vcGFjaXR5IikmJnEoaSx7InN0cm9rZS1vcGFjaXR5IjpwPjE/cC8xMDA6cH0pO2Nhc2UiZmlsbC1vcGFjaXR5IjppZihrLmdyYWRpZW50KXtIPWEuX2cuZG9jLmdldEVsZW1lbnRCeUlkKGkuZ2V0QXR0cmlidXRlKCJmaWxsIikucmVwbGFjZSgvXnVybFwoI3xcKSQvZyxsKSksSCYmKEk9SC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3RvcCIpLHEoSVtJLmxlbmd0aC0xXSx7InN0b3Atb3BhY2l0eSI6cH0pKTticmVha307ZGVmYXVsdDpvPT0iZm9udC1zaXplIiYmKHA9ZShwLDEwKSsicHgiKTt2YXIgSj1vLnJlcGxhY2UoLyhcLS4pL2csZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3Vic3RyaW5nKDEpLnRvVXBwZXJDYXNlKCl9KTtpLnN0eWxlW0pdPXAsZC5fLmRpcnR5PTEsaS5zZXRBdHRyaWJ1dGUobyxwKX19eShkLGYpLGkuc3R5bGUudmlzaWJpbGl0eT1tfSx4PTEuMix5PWZ1bmN0aW9uKGQsZil7aWYoZC50eXBlPT0idGV4dCImJiEhKGZbYl0oInRleHQiKXx8ZltiXSgiZm9udCIpfHxmW2JdKCJmb250LXNpemUiKXx8ZltiXSgieCIpfHxmW2JdKCJ5IikpKXt2YXIgZz1kLmF0dHJzLGg9ZC5ub2RlLGk9aC5maXJzdENoaWxkP2UoYS5fZy5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShoLmZpcnN0Q2hpbGQsbCkuZ2V0UHJvcGVydHlWYWx1ZSgiZm9udC1zaXplIiksMTApOjEwO2lmKGZbYl0oInRleHQiKSl7Zy50ZXh0PWYudGV4dDt3aGlsZShoLmZpcnN0Q2hpbGQpaC5yZW1vdmVDaGlsZChoLmZpcnN0Q2hpbGQpO3ZhciBqPWMoZi50ZXh0KS5zcGxpdCgiXG4iKSxrPVtdLG07Zm9yKHZhciBuPTAsbz1qLmxlbmd0aDtuPG87bisrKW09cSgidHNwYW4iKSxuJiZxKG0se2R5OmkqeCx4OmcueH0pLG0uYXBwZW5kQ2hpbGQoYS5fZy5kb2MuY3JlYXRlVGV4dE5vZGUoaltuXSkpLGguYXBwZW5kQ2hpbGQobSksa1tuXT1tfWVsc2V7az1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0c3BhbiIpO2ZvcihuPTAsbz1rLmxlbmd0aDtuPG87bisrKW4/cShrW25dLHtkeTppKngseDpnLnh9KTpxKGtbMF0se2R5OjB9KX1xKGgse3g6Zy54LHk6Zy55fSksZC5fLmRpcnR5PTE7dmFyIHA9ZC5fZ2V0QkJveCgpLHI9Zy55LShwLnkrcC5oZWlnaHQvMik7ciYmYS5pcyhyLCJmaW5pdGUiKSYmcShrWzBdLHtkeTpyfSl9fSx6PWZ1bmN0aW9uKGIsYyl7dmFyIGQ9MCxlPTA7dGhpc1swXT10aGlzLm5vZGU9YixiLnJhcGhhZWw9ITAsdGhpcy5pZD1hLl9vaWQrKyxiLnJhcGhhZWxpZD10aGlzLmlkLHRoaXMubWF0cml4PWEubWF0cml4KCksdGhpcy5yZWFsUGF0aD1udWxsLHRoaXMucGFwZXI9Yyx0aGlzLmF0dHJzPXRoaXMuYXR0cnN8fHt9LHRoaXMuXz17dHJhbnNmb3JtOltdLHN4OjEsc3k6MSxkZWc6MCxkeDowLGR5OjAsZGlydHk6MX0sIWMuYm90dG9tJiYoYy5ib3R0b209dGhpcyksdGhpcy5wcmV2PWMudG9wLGMudG9wJiYoYy50b3AubmV4dD10aGlzKSxjLnRvcD10aGlzLHRoaXMubmV4dD1udWxsfSxBPWEuZWw7ei5wcm90b3R5cGU9QSxBLmNvbnN0cnVjdG9yPXosYS5fZW5naW5lLnBhdGg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1xKCJwYXRoIik7Yi5jYW52YXMmJmIuY2FudmFzLmFwcGVuZENoaWxkKGMpO3ZhciBkPW5ldyB6KGMsYik7ZC50eXBlPSJwYXRoIix3KGQse2ZpbGw6Im5vbmUiLHN0cm9rZToiIzAwMCIscGF0aDphfSk7cmV0dXJuIGR9LEEucm90YXRlPWZ1bmN0aW9uKGEsYixlKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7YT1jKGEpLnNwbGl0KGopLGEubGVuZ3RoLTEmJihiPWQoYVsxXSksZT1kKGFbMl0pKSxhPWQoYVswXSksZT09bnVsbCYmKGI9ZSk7aWYoYj09bnVsbHx8ZT09bnVsbCl7dmFyIGY9dGhpcy5nZXRCQm94KDEpO2I9Zi54K2Yud2lkdGgvMixlPWYueStmLmhlaWdodC8yfXRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInIiLGEsYixlXV0pKTtyZXR1cm4gdGhpc30sQS5zY2FsZT1mdW5jdGlvbihhLGIsZSxmKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7YT1jKGEpLnNwbGl0KGopLGEubGVuZ3RoLTEmJihiPWQoYVsxXSksZT1kKGFbMl0pLGY9ZChhWzNdKSksYT1kKGFbMF0pLGI9PW51bGwmJihiPWEpLGY9PW51bGwmJihlPWYpO2lmKGU9PW51bGx8fGY9PW51bGwpdmFyIGc9dGhpcy5nZXRCQm94KDEpO2U9ZT09bnVsbD9nLngrZy53aWR0aC8yOmUsZj1mPT1udWxsP2cueStnLmhlaWdodC8yOmYsdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1sicyIsYSxiLGUsZl1dKSk7cmV0dXJuIHRoaXN9LEEudHJhbnNsYXRlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2E9YyhhKS5zcGxpdChqKSxhLmxlbmd0aC0xJiYoYj1kKGFbMV0pKSxhPWQoYVswXSl8fDAsYj0rYnx8MCx0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbWyJ0IixhLGJdXSkpO3JldHVybiB0aGlzfSxBLnRyYW5zZm9ybT1mdW5jdGlvbihjKXt2YXIgZD10aGlzLl87aWYoYz09bnVsbClyZXR1cm4gZC50cmFuc2Zvcm07YS5fZXh0cmFjdFRyYW5zZm9ybSh0aGlzLGMpLHRoaXMuY2xpcCYmcSh0aGlzLmNsaXAse3RyYW5zZm9ybTp0aGlzLm1hdHJpeC5pbnZlcnQoKX0pLHRoaXMucGF0dGVybiYmcyh0aGlzKSx0aGlzLm5vZGUmJnEodGhpcy5ub2RlLHt0cmFuc2Zvcm06dGhpcy5tYXRyaXh9KTtpZihkLnN4IT0xfHxkLnN5IT0xKXt2YXIgZT10aGlzLmF0dHJzW2JdKCJzdHJva2Utd2lkdGgiKT90aGlzLmF0dHJzWyJzdHJva2Utd2lkdGgiXToxO3RoaXMuYXR0cih7InN0cm9rZS13aWR0aCI6ZX0pfXJldHVybiB0aGlzfSxBLmhpZGU9ZnVuY3Rpb24oKXshdGhpcy5yZW1vdmVkJiZ0aGlzLnBhcGVyLnNhZmFyaSh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxBLnNob3c9ZnVuY3Rpb24oKXshdGhpcy5yZW1vdmVkJiZ0aGlzLnBhcGVyLnNhZmFyaSh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheT0iIik7cmV0dXJuIHRoaXN9LEEucmVtb3ZlPWZ1bmN0aW9uKCl7aWYoIXRoaXMucmVtb3ZlZCYmISF0aGlzLm5vZGUucGFyZW50Tm9kZSl7dmFyIGI9dGhpcy5wYXBlcjtiLl9fc2V0X18mJmIuX19zZXRfXy5leGNsdWRlKHRoaXMpLGsudW5iaW5kKCJyYXBoYWVsLiouKi4iK3RoaXMuaWQpLHRoaXMuZ3JhZGllbnQmJmIuZGVmcy5yZW1vdmVDaGlsZCh0aGlzLmdyYWRpZW50KSxhLl90ZWFyKHRoaXMsYiksdGhpcy5ub2RlLnBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iYSI/dGhpcy5ub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUucGFyZW50Tm9kZSk6dGhpcy5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKTtmb3IodmFyIGMgaW4gdGhpcyl0aGlzW2NdPXR5cGVvZiB0aGlzW2NdPT0iZnVuY3Rpb24iP2EuX3JlbW92ZWRGYWN0b3J5KGMpOm51bGw7dGhpcy5yZW1vdmVkPSEwfX0sQS5fZ2V0QkJveD1mdW5jdGlvbigpe2lmKHRoaXMubm9kZS5zdHlsZS5kaXNwbGF5PT0ibm9uZSIpe3RoaXMuc2hvdygpO3ZhciBhPSEwfXZhciBiPXt9O3RyeXtiPXRoaXMubm9kZS5nZXRCQm94KCl9Y2F0Y2goYyl7fWZpbmFsbHl7Yj1ifHx7fX1hJiZ0aGlzLmhpZGUoKTtyZXR1cm4gYn0sQS5hdHRyPWZ1bmN0aW9uKGMsZCl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2lmKGM9PW51bGwpe3ZhciBlPXt9O2Zvcih2YXIgZiBpbiB0aGlzLmF0dHJzKXRoaXMuYXR0cnNbYl0oZikmJihlW2ZdPXRoaXMuYXR0cnNbZl0pO2UuZ3JhZGllbnQmJmUuZmlsbD09Im5vbmUiJiYoZS5maWxsPWUuZ3JhZGllbnQpJiZkZWxldGUgZS5ncmFkaWVudCxlLnRyYW5zZm9ybT10aGlzLl8udHJhbnNmb3JtO3JldHVybiBlfWlmKGQ9PW51bGwmJmEuaXMoYywic3RyaW5nIikpe2lmKGM9PSJmaWxsIiYmdGhpcy5hdHRycy5maWxsPT0ibm9uZSImJnRoaXMuYXR0cnMuZ3JhZGllbnQpcmV0dXJuIHRoaXMuYXR0cnMuZ3JhZGllbnQ7aWYoYz09InRyYW5zZm9ybSIpcmV0dXJuIHRoaXMuXy50cmFuc2Zvcm07dmFyIGc9Yy5zcGxpdChqKSxoPXt9O2Zvcih2YXIgaT0wLGw9Zy5sZW5ndGg7aTxsO2krKyljPWdbaV0sYyBpbiB0aGlzLmF0dHJzP2hbY109dGhpcy5hdHRyc1tjXTphLmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tjXSwiZnVuY3Rpb24iKT9oW2NdPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tjXS5kZWY6aFtjXT1hLl9hdmFpbGFibGVBdHRyc1tjXTtyZXR1cm4gbC0xP2g6aFtnWzBdXX1pZihkPT1udWxsJiZhLmlzKGMsImFycmF5Iikpe2g9e307Zm9yKGk9MCxsPWMubGVuZ3RoO2k8bDtpKyspaFtjW2ldXT10aGlzLmF0dHIoY1tpXSk7cmV0dXJuIGh9aWYoZCE9bnVsbCl7dmFyIG09e307bVtjXT1kfWVsc2UgYyE9bnVsbCYmYS5pcyhjLCJvYmplY3QiKSYmKG09Yyk7Zm9yKHZhciBuIGluIG0paygicmFwaGFlbC5hdHRyLiIrbisiLiIrdGhpcy5pZCx0aGlzLG1bbl0pO2ZvcihuIGluIHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlcylpZih0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbYl0obikmJm1bYl0obikmJmEuaXModGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW25dLCJmdW5jdGlvbiIpKXt2YXIgbz10aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbbl0uYXBwbHkodGhpcyxbXS5jb25jYXQobVtuXSkpO3RoaXMuYXR0cnNbbl09bVtuXTtmb3IodmFyIHAgaW4gbylvW2JdKHApJiYobVtwXT1vW3BdKX13KHRoaXMsbSk7cmV0dXJuIHRoaXN9LEEudG9Gcm9udD1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpczt0aGlzLm5vZGUucGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhIj90aGlzLm5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMubm9kZS5wYXJlbnROb2RlKTp0aGlzLm5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpO3ZhciBiPXRoaXMucGFwZXI7Yi50b3AhPXRoaXMmJmEuX3RvZnJvbnQodGhpcyxiKTtyZXR1cm4gdGhpc30sQS50b0JhY2s9ZnVuY3Rpb24oKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5ub2RlLnBhcmVudE5vZGU7Yi50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhIj9iLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZS5wYXJlbnROb2RlLHRoaXMubm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk6Yi5maXJzdENoaWxkIT10aGlzLm5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZSx0aGlzLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkKSxhLl90b2JhY2sodGhpcyx0aGlzLnBhcGVyKTt2YXIgYz10aGlzLnBhcGVyO3JldHVybiB0aGlzfSxBLmluc2VydEFmdGVyPWZ1bmN0aW9uKGIpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpczt2YXIgYz1iLm5vZGV8fGJbYi5sZW5ndGgtMV0ubm9kZTtjLm5leHRTaWJsaW5nP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGMubmV4dFNpYmxpbmcpOmMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLGEuX2luc2VydGFmdGVyKHRoaXMsYix0aGlzLnBhcGVyKTtyZXR1cm4gdGhpc30sQS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oYil7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO3ZhciBjPWIubm9kZXx8YlswXS5ub2RlO2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGMpLGEuX2luc2VydGJlZm9yZSh0aGlzLGIsdGhpcy5wYXBlcik7cmV0dXJuIHRoaXN9LEEuYmx1cj1mdW5jdGlvbihiKXt2YXIgYz10aGlzO2lmKCtiIT09MCl7dmFyIGQ9cSgiZmlsdGVyIiksZT1xKCJmZUdhdXNzaWFuQmx1ciIpO2MuYXR0cnMuYmx1cj1iLGQuaWQ9YS5jcmVhdGVVVUlEKCkscShlLHtzdGREZXZpYXRpb246K2J8fDEuNX0pLGQuYXBwZW5kQ2hpbGQoZSksYy5wYXBlci5kZWZzLmFwcGVuZENoaWxkKGQpLGMuX2JsdXI9ZCxxKGMubm9kZSx7ZmlsdGVyOiJ1cmwoIyIrZC5pZCsiKSJ9KX1lbHNlIGMuX2JsdXImJihjLl9ibHVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYy5fYmx1ciksZGVsZXRlIGMuX2JsdXIsZGVsZXRlIGMuYXR0cnMuYmx1ciksYy5ub2RlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9LGEuX2VuZ2luZS5jaXJjbGU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cSgiY2lyY2xlIik7YS5jYW52YXMmJmEuY2FudmFzLmFwcGVuZENoaWxkKGUpO3ZhciBmPW5ldyB6KGUsYSk7Zi5hdHRycz17Y3g6YixjeTpjLHI6ZCxmaWxsOiJub25lIixzdHJva2U6IiMwMDAifSxmLnR5cGU9ImNpcmNsZSIscShlLGYuYXR0cnMpO3JldHVybiBmfSxhLl9lbmdpbmUucmVjdD1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9cSgicmVjdCIpO2EuY2FudmFzJiZhLmNhbnZhcy5hcHBlbmRDaGlsZChnKTt2YXIgaD1uZXcgeihnLGEpO2guYXR0cnM9e3g6Yix5OmMsd2lkdGg6ZCxoZWlnaHQ6ZSxyOmZ8fDAscng6Znx8MCxyeTpmfHwwLGZpbGw6Im5vbmUiLHN0cm9rZToiIzAwMCJ9LGgudHlwZT0icmVjdCIscShnLGguYXR0cnMpO3JldHVybiBofSxhLl9lbmdpbmUuZWxsaXBzZT1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXEoImVsbGlwc2UiKTthLmNhbnZhcyYmYS5jYW52YXMuYXBwZW5kQ2hpbGQoZik7dmFyIGc9bmV3IHooZixhKTtnLmF0dHJzPXtjeDpiLGN5OmMscng6ZCxyeTplLGZpbGw6Im5vbmUiLHN0cm9rZToiIzAwMCJ9LGcudHlwZT0iZWxsaXBzZSIscShmLGcuYXR0cnMpO3JldHVybiBnfSxhLl9lbmdpbmUuaW1hZ2U9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPXEoImltYWdlIik7cShnLHt4OmMseTpkLHdpZHRoOmUsaGVpZ2h0OmYscHJlc2VydmVBc3BlY3RSYXRpbzoibm9uZSJ9KSxnLnNldEF0dHJpYnV0ZU5TKG4sImhyZWYiLGIpLGEuY2FudmFzJiZhLmNhbnZhcy5hcHBlbmRDaGlsZChnKTt2YXIgaD1uZXcgeihnLGEpO2guYXR0cnM9e3g6Yyx5OmQsd2lkdGg6ZSxoZWlnaHQ6ZixzcmM6Yn0saC50eXBlPSJpbWFnZSI7cmV0dXJuIGh9LGEuX2VuZ2luZS50ZXh0PWZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPXEoInRleHQiKTtiLmNhbnZhcyYmYi5jYW52YXMuYXBwZW5kQ2hpbGQoZik7dmFyIGc9bmV3IHooZixiKTtnLmF0dHJzPXt4OmMseTpkLCJ0ZXh0LWFuY2hvciI6Im1pZGRsZSIsdGV4dDplLGZvbnQ6YS5fYXZhaWxhYmxlQXR0cnMuZm9udCxzdHJva2U6Im5vbmUiLGZpbGw6IiMwMDAifSxnLnR5cGU9InRleHQiLHcoZyxnLmF0dHJzKTtyZXR1cm4gZ30sYS5fZW5naW5lLnNldFNpemU9ZnVuY3Rpb24oYSxiKXt0aGlzLndpZHRoPWF8fHRoaXMud2lkdGgsdGhpcy5oZWlnaHQ9Ynx8dGhpcy5oZWlnaHQsdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy53aWR0aCksdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KSx0aGlzLl92aWV3Qm94JiZ0aGlzLnNldFZpZXdCb3guYXBwbHkodGhpcyx0aGlzLl92aWV3Qm94KTtyZXR1cm4gdGhpc30sYS5fZW5naW5lLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciBiPWEuX2dldENvbnRhaW5lci5hcHBseSgwLGFyZ3VtZW50cyksYz1iJiZiLmNvbnRhaW5lcixkPWIueCxlPWIueSxmPWIud2lkdGgsZz1iLmhlaWdodDtpZighYyl0aHJvdyBuZXcgRXJyb3IoIlNWRyBjb250YWluZXIgbm90IGZvdW5kLiIpO3ZhciBoPXEoInN2ZyIpLGk9Im92ZXJmbG93OmhpZGRlbjsiLGo7ZD1kfHwwLGU9ZXx8MCxmPWZ8fDUxMixnPWd8fDM0MixxKGgse2hlaWdodDpnLHZlcnNpb246MS4xLHdpZHRoOmYseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIn0pLGM9PTE/KGguc3R5bGUuY3NzVGV4dD1pKyJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OiIrZCsicHg7dG9wOiIrZSsicHgiLGEuX2cuZG9jLmJvZHkuYXBwZW5kQ2hpbGQoaCksaj0xKTooaC5zdHlsZS5jc3NUZXh0PWkrInBvc2l0aW9uOnJlbGF0aXZlIixjLmZpcnN0Q2hpbGQ/Yy5pbnNlcnRCZWZvcmUoaCxjLmZpcnN0Q2hpbGQpOmMuYXBwZW5kQ2hpbGQoaCkpLGM9bmV3IGEuX1BhcGVyLGMud2lkdGg9ZixjLmhlaWdodD1nLGMuY2FudmFzPWgsYy5jbGVhcigpLGMuX2xlZnQ9Yy5fdG9wPTAsaiYmKGMucmVuZGVyZml4PWZ1bmN0aW9uKCl7fSksYy5yZW5kZXJmaXgoKTtyZXR1cm4gY30sYS5fZW5naW5lLnNldFZpZXdCb3g9ZnVuY3Rpb24oYSxiLGMsZCxlKXtrKCJyYXBoYWVsLnNldFZpZXdCb3giLHRoaXMsdGhpcy5fdmlld0JveCxbYSxiLGMsZCxlXSk7dmFyIGY9ZyhjL3RoaXMud2lkdGgsZC90aGlzLmhlaWdodCksaD10aGlzLnRvcCxpPWU/Im1lZXQiOiJ4TWluWU1pbiIsaixsO2E9PW51bGw/KHRoaXMuX3ZiU2l6ZSYmKGY9MSksZGVsZXRlIHRoaXMuX3ZiU2l6ZSxqPSIwIDAgIit0aGlzLndpZHRoK20rdGhpcy5oZWlnaHQpOih0aGlzLl92YlNpemU9ZixqPWErbStiK20rYyttK2QpLHEodGhpcy5jYW52YXMse3ZpZXdCb3g6aixwcmVzZXJ2ZUFzcGVjdFJhdGlvOml9KTt3aGlsZShmJiZoKWw9InN0cm9rZS13aWR0aCJpbiBoLmF0dHJzP2guYXR0cnNbInN0cm9rZS13aWR0aCJdOjEsaC5hdHRyKHsic3Ryb2tlLXdpZHRoIjpsfSksaC5fLmRpcnR5PTEsaC5fLmRpcnR5VD0xLGg9aC5wcmV2O3RoaXMuX3ZpZXdCb3g9W2EsYixjLGQsISFlXTtyZXR1cm4gdGhpc30sYS5wcm90b3R5cGUucmVuZGVyZml4PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jYW52YXMsYj1hLnN0eWxlLGM7dHJ5e2M9YS5nZXRTY3JlZW5DVE0oKXx8YS5jcmVhdGVTVkdNYXRyaXgoKX1jYXRjaChkKXtjPWEuY3JlYXRlU1ZHTWF0cml4KCl9dmFyIGU9LWMuZSUxLGY9LWMuZiUxO2lmKGV8fGYpZSYmKHRoaXMuX2xlZnQ9KHRoaXMuX2xlZnQrZSklMSxiLmxlZnQ9dGhpcy5fbGVmdCsicHgiKSxmJiYodGhpcy5fdG9wPSh0aGlzLl90b3ArZiklMSxiLnRvcD10aGlzLl90b3ArInB4Iil9LGEucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7YS5ldmUoInJhcGhhZWwuY2xlYXIiLHRoaXMpO3ZhciBiPXRoaXMuY2FudmFzO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7dGhpcy5ib3R0b209dGhpcy50b3A9bnVsbCwodGhpcy5kZXNjPXEoImRlc2MiKSkuYXBwZW5kQ2hpbGQoYS5fZy5kb2MuY3JlYXRlVGV4dE5vZGUoIkNyZWF0ZWQgd2l0aCBSYXBoYcOrbCAiK2EudmVyc2lvbikpLGIuYXBwZW5kQ2hpbGQodGhpcy5kZXNjKSxiLmFwcGVuZENoaWxkKHRoaXMuZGVmcz1xKCJkZWZzIikpfSxhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtrKCJyYXBoYWVsLnJlbW92ZSIsdGhpcyksdGhpcy5jYW52YXMucGFyZW50Tm9kZSYmdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7Zm9yKHZhciBiIGluIHRoaXMpdGhpc1tiXT10eXBlb2YgdGhpc1tiXT09ImZ1bmN0aW9uIj9hLl9yZW1vdmVkRmFjdG9yeShiKTpudWxsfTt2YXIgQj1hLnN0O2Zvcih2YXIgQyBpbiBBKUFbYl0oQykmJiFCW2JdKEMpJiYoQltDXT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYj1hcmd1bWVudHM7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihjKXtjW2FdLmFwcGx5KGMsYil9KX19KEMpKX0od2luZG93LlJhcGhhZWwpLHdpbmRvdy5SYXBoYWVsLnZtbCYmZnVuY3Rpb24oYSl7dmFyIGI9Imhhc093blByb3BlcnR5IixjPVN0cmluZyxkPXBhcnNlRmxvYXQsZT1NYXRoLGY9ZS5yb3VuZCxnPWUubWF4LGg9ZS5taW4saT1lLmFicyxqPSJmaWxsIixrPS9bLCBdKy8sbD1hLmV2ZSxtPSIgcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0IixuPSIgIixvPSIiLHA9e006Im0iLEw6ImwiLEM6ImMiLFo6IngiLG06InQiLGw6InIiLGM6InYiLHo6IngifSxxPS8oW2NsbXpdKSw/KFteY2xtel0qKS9naSxyPS8gcHJvZ2lkOlxTK0JsdXJcKFteXCldK1wpL2cscz0vLT9bXixccy1dKy9nLHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweCIsdT0yMTYwMCx2PXtwYXRoOjEscmVjdDoxLGltYWdlOjF9LHc9e2NpcmNsZToxLGVsbGlwc2U6MX0seD1mdW5jdGlvbihiKXt2YXIgZD0vW2FocXN0dl0vaWcsZT1hLl9wYXRoVG9BYnNvbHV0ZTtjKGIpLm1hdGNoKGQpJiYoZT1hLl9wYXRoMmN1cnZlKSxkPS9bY2xtel0vZztpZihlPT1hLl9wYXRoVG9BYnNvbHV0ZSYmIWMoYikubWF0Y2goZCkpe3ZhciBnPWMoYikucmVwbGFjZShxLGZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWIudG9Mb3dlckNhc2UoKT09Im0iLGc9cFtiXTtjLnJlcGxhY2UocyxmdW5jdGlvbihhKXtlJiZkLmxlbmd0aD09MiYmKGcrPWQrcFtiPT0ibSI/ImwiOiJMIl0sZD1bXSksZC5wdXNoKGYoYSp1KSl9KTtyZXR1cm4gZytkfSk7cmV0dXJuIGd9dmFyIGg9ZShiKSxpLGo7Zz1bXTtmb3IodmFyIGs9MCxsPWgubGVuZ3RoO2s8bDtrKyspe2k9aFtrXSxqPWhba11bMF0udG9Mb3dlckNhc2UoKSxqPT0ieiImJihqPSJ4Iik7Zm9yKHZhciBtPTEscj1pLmxlbmd0aDttPHI7bSsrKWorPWYoaVttXSp1KSsobSE9ci0xPyIsIjpvKTtnLnB1c2goail9cmV0dXJuIGcuam9pbihuKX0seT1mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5tYXRyaXgoKTtlLnJvdGF0ZSgtYiwuNSwuNSk7cmV0dXJue2R4OmUueChjLGQpLGR5OmUueShjLGQpfX0sej1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YS5fLGg9YS5tYXRyaXgsaz1nLmZpbGxwb3MsbD1hLm5vZGUsbT1sLnN0eWxlLG89MSxwPSIiLHEscj11L2Iscz11L2M7bS52aXNpYmlsaXR5PSJoaWRkZW4iO2lmKCEhYiYmISFjKXtsLmNvb3Jkc2l6ZT1pKHIpK24raShzKSxtLnJvdGF0aW9uPWYqKGIqYzwwPy0xOjEpO2lmKGYpe3ZhciB0PXkoZixkLGUpO2Q9dC5keCxlPXQuZHl9YjwwJiYocCs9IngiKSxjPDAmJihwKz0iIHkiKSYmKG89LTEpLG0uZmxpcD1wLGwuY29vcmRvcmlnaW49ZCotcituK2UqLXM7aWYoa3x8Zy5maWxsc2l6ZSl7dmFyIHY9bC5nZXRFbGVtZW50c0J5VGFnTmFtZShqKTt2PXYmJnZbMF0sbC5yZW1vdmVDaGlsZCh2KSxrJiYodD15KGYsaC54KGtbMF0sa1sxXSksaC55KGtbMF0sa1sxXSkpLHYucG9zaXRpb249dC5keCpvK24rdC5keSpvKSxnLmZpbGxzaXplJiYodi5zaXplPWcuZmlsbHNpemVbMF0qaShiKStuK2cuZmlsbHNpemVbMV0qaShjKSksbC5hcHBlbmRDaGlsZCh2KX1tLnZpc2liaWxpdHk9InZpc2libGUifX07YS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJZb3VyIGJyb3dzZXIgZG9lc27igJl0IHN1cHBvcnQgU1ZHLiBGYWxsaW5nIGRvd24gdG8gVk1MLlxuWW91IGFyZSBydW5uaW5nIFJhcGhhw6tsICIrdGhpcy52ZXJzaW9ufTt2YXIgQT1mdW5jdGlvbihhLGIsZCl7dmFyIGU9YyhiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KCItIiksZj1kPyJlbmQiOiJzdGFydCIsZz1lLmxlbmd0aCxoPSJjbGFzc2ljIixpPSJtZWRpdW0iLGo9Im1lZGl1bSI7d2hpbGUoZy0tKXN3aXRjaChlW2ddKXtjYXNlImJsb2NrIjpjYXNlImNsYXNzaWMiOmNhc2Uib3ZhbCI6Y2FzZSJkaWFtb25kIjpjYXNlIm9wZW4iOmNhc2Uibm9uZSI6aD1lW2ddO2JyZWFrO2Nhc2Uid2lkZSI6Y2FzZSJuYXJyb3ciOmo9ZVtnXTticmVhaztjYXNlImxvbmciOmNhc2Uic2hvcnQiOmk9ZVtnXX12YXIgaz1hLm5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0cm9rZSIpWzBdO2tbZisiYXJyb3ciXT1oLGtbZisiYXJyb3dsZW5ndGgiXT1pLGtbZisiYXJyb3d3aWR0aCJdPWp9LEI9ZnVuY3Rpb24oZSxpKXtlLmF0dHJzPWUuYXR0cnN8fHt9O3ZhciBsPWUubm9kZSxtPWUuYXR0cnMscD1sLnN0eWxlLHEscj12W2UudHlwZV0mJihpLnghPW0ueHx8aS55IT1tLnl8fGkud2lkdGghPW0ud2lkdGh8fGkuaGVpZ2h0IT1tLmhlaWdodHx8aS5jeCE9bS5jeHx8aS5jeSE9bS5jeXx8aS5yeCE9bS5yeHx8aS5yeSE9bS5yeXx8aS5yIT1tLnIpLHM9d1tlLnR5cGVdJiYobS5jeCE9aS5jeHx8bS5jeSE9aS5jeXx8bS5yIT1pLnJ8fG0ucnghPWkucnh8fG0ucnkhPWkucnkpLHQ9ZTtmb3IodmFyIHkgaW4gaSlpW2JdKHkpJiYobVt5XT1pW3ldKTtyJiYobS5wYXRoPWEuX2dldFBhdGhbZS50eXBlXShlKSxlLl8uZGlydHk9MSksaS5ocmVmJiYobC5ocmVmPWkuaHJlZiksaS50aXRsZSYmKGwudGl0bGU9aS50aXRsZSksaS50YXJnZXQmJihsLnRhcmdldD1pLnRhcmdldCksaS5jdXJzb3ImJihwLmN1cnNvcj1pLmN1cnNvciksImJsdXIiaW4gaSYmZS5ibHVyKGkuYmx1cik7aWYoaS5wYXRoJiZlLnR5cGU9PSJwYXRoInx8cilsLnBhdGg9eCh+YyhtLnBhdGgpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiciIpP2EuX3BhdGhUb0Fic29sdXRlKG0ucGF0aCk6bS5wYXRoKSxlLnR5cGU9PSJpbWFnZSImJihlLl8uZmlsbHBvcz1bbS54LG0ueV0sZS5fLmZpbGxzaXplPVttLndpZHRoLG0uaGVpZ2h0XSx6KGUsMSwxLDAsMCwwKSk7InRyYW5zZm9ybSJpbiBpJiZlLnRyYW5zZm9ybShpLnRyYW5zZm9ybSk7aWYocyl7dmFyIEI9K20uY3gsRD0rbS5jeSxFPSttLnJ4fHwrbS5yfHwwLEc9K20ucnl8fCttLnJ8fDA7bC5wYXRoPWEuZm9ybWF0KCJhcnswfSx7MX0sezJ9LHszfSx7NH0sezF9LHs0fSx7MX14IixmKChCLUUpKnUpLGYoKEQtRykqdSksZigoQitFKSp1KSxmKChEK0cpKnUpLGYoQip1KSl9aWYoImNsaXAtcmVjdCJpbiBpKXt2YXIgSD1jKGlbImNsaXAtcmVjdCJdKS5zcGxpdChrKTtpZihILmxlbmd0aD09NCl7SFsyXT0rSFsyXSsgK0hbMF0sSFszXT0rSFszXSsgK0hbMV07dmFyIEk9bC5jbGlwUmVjdHx8YS5fZy5kb2MuY3JlYXRlRWxlbWVudCgiZGl2IiksSj1JLnN0eWxlO0ouY2xpcD1hLmZvcm1hdCgicmVjdCh7MX1weCB7Mn1weCB7M31weCB7MH1weCkiLEgpLGwuY2xpcFJlY3R8fChKLnBvc2l0aW9uPSJhYnNvbHV0ZSIsSi50b3A9MCxKLmxlZnQ9MCxKLndpZHRoPWUucGFwZXIud2lkdGgrInB4IixKLmhlaWdodD1lLnBhcGVyLmhlaWdodCsicHgiLGwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoSSxsKSxJLmFwcGVuZENoaWxkKGwpLGwuY2xpcFJlY3Q9SSl9aVsiY2xpcC1yZWN0Il18fGwuY2xpcFJlY3QmJihsLmNsaXBSZWN0LnN0eWxlLmNsaXA9ImF1dG8iKX1pZihlLnRleHRwYXRoKXt2YXIgSz1lLnRleHRwYXRoLnN0eWxlO2kuZm9udCYmKEsuZm9udD1pLmZvbnQpLGlbImZvbnQtZmFtaWx5Il0mJihLLmZvbnRGYW1pbHk9JyInK2lbImZvbnQtZmFtaWx5Il0uc3BsaXQoIiwiKVswXS5yZXBsYWNlKC9eWyciXSt8WyciXSskL2csbykrJyInKSxpWyJmb250LXNpemUiXSYmKEsuZm9udFNpemU9aVsiZm9udC1zaXplIl0pLGlbImZvbnQtd2VpZ2h0Il0mJihLLmZvbnRXZWlnaHQ9aVsiZm9udC13ZWlnaHQiXSksaVsiZm9udC1zdHlsZSJdJiYoSy5mb250U3R5bGU9aVsiZm9udC1zdHlsZSJdKX0iYXJyb3ctc3RhcnQiaW4gaSYmQSh0LGlbImFycm93LXN0YXJ0Il0pLCJhcnJvdy1lbmQiaW4gaSYmQSh0LGlbImFycm93LWVuZCJdLDEpO2lmKGkub3BhY2l0eSE9bnVsbHx8aVsic3Ryb2tlLXdpZHRoIl0hPW51bGx8fGkuZmlsbCE9bnVsbHx8aS5zcmMhPW51bGx8fGkuc3Ryb2tlIT1udWxsfHxpWyJzdHJva2Utd2lkdGgiXSE9bnVsbHx8aVsic3Ryb2tlLW9wYWNpdHkiXSE9bnVsbHx8aVsiZmlsbC1vcGFjaXR5Il0hPW51bGx8fGlbInN0cm9rZS1kYXNoYXJyYXkiXSE9bnVsbHx8aVsic3Ryb2tlLW1pdGVybGltaXQiXSE9bnVsbHx8aVsic3Ryb2tlLWxpbmVqb2luIl0hPW51bGx8fGlbInN0cm9rZS1saW5lY2FwIl0hPW51bGwpe3ZhciBMPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaiksTT0hMTtMPUwmJkxbMF0sIUwmJihNPUw9RihqKSksZS50eXBlPT0iaW1hZ2UiJiZpLnNyYyYmKEwuc3JjPWkuc3JjKSxpLmZpbGwmJihMLm9uPSEwKTtpZihMLm9uPT1udWxsfHxpLmZpbGw9PSJub25lInx8aS5maWxsPT09bnVsbClMLm9uPSExO2lmKEwub24mJmkuZmlsbCl7dmFyIE49YyhpLmZpbGwpLm1hdGNoKGEuX0lTVVJMKTtpZihOKXtMLnBhcmVudE5vZGU9PWwmJmwucmVtb3ZlQ2hpbGQoTCksTC5yb3RhdGU9ITAsTC5zcmM9TlsxXSxMLnR5cGU9InRpbGUiO3ZhciBPPWUuZ2V0QkJveCgxKTtMLnBvc2l0aW9uPU8ueCtuK08ueSxlLl8uZmlsbHBvcz1bTy54LE8ueV0sYS5fcHJlbG9hZChOWzFdLGZ1bmN0aW9uKCl7ZS5fLmZpbGxzaXplPVt0aGlzLm9mZnNldFdpZHRoLHRoaXMub2Zmc2V0SGVpZ2h0XX0pfWVsc2UgTC5jb2xvcj1hLmdldFJHQihpLmZpbGwpLmhleCxMLnNyYz1vLEwudHlwZT0ic29saWQiLGEuZ2V0UkdCKGkuZmlsbCkuZXJyb3ImJih0LnR5cGUgaW57Y2lyY2xlOjEsZWxsaXBzZToxfXx8YyhpLmZpbGwpLmNoYXJBdCgpIT0iciIpJiZDKHQsaS5maWxsLEwpJiYobS5maWxsPSJub25lIixtLmdyYWRpZW50PWkuZmlsbCxMLnJvdGF0ZT0hMSl9aWYoImZpbGwtb3BhY2l0eSJpbiBpfHwib3BhY2l0eSJpbiBpKXt2YXIgUD0oKCttWyJmaWxsLW9wYWNpdHkiXSsxfHwyKS0xKSooKCttLm9wYWNpdHkrMXx8MiktMSkqKCgrYS5nZXRSR0IoaS5maWxsKS5vKzF8fDIpLTEpO1A9aChnKFAsMCksMSksTC5vcGFjaXR5PVAsTC5zcmMmJihMLmNvbG9yPSJub25lIil9bC5hcHBlbmRDaGlsZChMKTt2YXIgUT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHJva2UiKSYmbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3Ryb2tlIilbMF0sVD0hMTshUSYmKFQ9UT1GKCJzdHJva2UiKSk7aWYoaS5zdHJva2UmJmkuc3Ryb2tlIT0ibm9uZSJ8fGlbInN0cm9rZS13aWR0aCJdfHxpWyJzdHJva2Utb3BhY2l0eSJdIT1udWxsfHxpWyJzdHJva2UtZGFzaGFycmF5Il18fGlbInN0cm9rZS1taXRlcmxpbWl0Il18fGlbInN0cm9rZS1saW5lam9pbiJdfHxpWyJzdHJva2UtbGluZWNhcCJdKVEub249ITA7KGkuc3Ryb2tlPT0ibm9uZSJ8fGkuc3Ryb2tlPT09bnVsbHx8US5vbj09bnVsbHx8aS5zdHJva2U9PTB8fGlbInN0cm9rZS13aWR0aCJdPT0wKSYmKFEub249ITEpO3ZhciBVPWEuZ2V0UkdCKGkuc3Ryb2tlKTtRLm9uJiZpLnN0cm9rZSYmKFEuY29sb3I9VS5oZXgpLFA9KCgrbVsic3Ryb2tlLW9wYWNpdHkiXSsxfHwyKS0xKSooKCttLm9wYWNpdHkrMXx8MiktMSkqKCgrVS5vKzF8fDIpLTEpO3ZhciBWPShkKGlbInN0cm9rZS13aWR0aCJdKXx8MSkqLjc1O1A9aChnKFAsMCksMSksaVsic3Ryb2tlLXdpZHRoIl09PW51bGwmJihWPW1bInN0cm9rZS13aWR0aCJdKSxpWyJzdHJva2Utd2lkdGgiXSYmKFEud2VpZ2h0PVYpLFYmJlY8MSYmKFAqPVYpJiYoUS53ZWlnaHQ9MSksUS5vcGFjaXR5PVAsaVsic3Ryb2tlLWxpbmVqb2luIl0mJihRLmpvaW5zdHlsZT1pWyJzdHJva2UtbGluZWpvaW4iXXx8Im1pdGVyIiksUS5taXRlcmxpbWl0PWlbInN0cm9rZS1taXRlcmxpbWl0Il18fDgsaVsic3Ryb2tlLWxpbmVjYXAiXSYmKFEuZW5kY2FwPWlbInN0cm9rZS1saW5lY2FwIl09PSJidXR0Ij8iZmxhdCI6aVsic3Ryb2tlLWxpbmVjYXAiXT09InNxdWFyZSI/InNxdWFyZSI6InJvdW5kIik7aWYoaVsic3Ryb2tlLWRhc2hhcnJheSJdKXt2YXIgVz17Ii0iOiJzaG9ydGRhc2giLCIuIjoic2hvcnRkb3QiLCItLiI6InNob3J0ZGFzaGRvdCIsIi0uLiI6InNob3J0ZGFzaGRvdGRvdCIsIi4gIjoiZG90IiwiLSAiOiJkYXNoIiwiLS0iOiJsb25nZGFzaCIsIi0gLiI6ImRhc2hkb3QiLCItLS4iOiJsb25nZGFzaGRvdCIsIi0tLi4iOiJsb25nZGFzaGRvdGRvdCJ9O1EuZGFzaHN0eWxlPVdbYl0oaVsic3Ryb2tlLWRhc2hhcnJheSJdKT9XW2lbInN0cm9rZS1kYXNoYXJyYXkiXV06b31UJiZsLmFwcGVuZENoaWxkKFEpfWlmKHQudHlwZT09InRleHQiKXt0LnBhcGVyLmNhbnZhcy5zdHlsZS5kaXNwbGF5PW87dmFyIFg9dC5wYXBlci5zcGFuLFk9MTAwLFo9bS5mb250JiZtLmZvbnQubWF0Y2goL1xkKyg/OlwuXGQqKT8oPz1weCkvKTtwPVguc3R5bGUsbS5mb250JiYocC5mb250PW0uZm9udCksbVsiZm9udC1mYW1pbHkiXSYmKHAuZm9udEZhbWlseT1tWyJmb250LWZhbWlseSJdKSxtWyJmb250LXdlaWdodCJdJiYocC5mb250V2VpZ2h0PW1bImZvbnQtd2VpZ2h0Il0pLG1bImZvbnQtc3R5bGUiXSYmKHAuZm9udFN0eWxlPW1bImZvbnQtc3R5bGUiXSksWj1kKG1bImZvbnQtc2l6ZSJdfHxaJiZaWzBdKXx8MTAscC5mb250U2l6ZT1aKlkrInB4Iix0LnRleHRwYXRoLnN0cmluZyYmKFguaW5uZXJIVE1MPWModC50ZXh0cGF0aC5zdHJpbmcpLnJlcGxhY2UoLzwvZywiJiM2MDsiKS5yZXBsYWNlKC8mL2csIiYjMzg7IikucmVwbGFjZSgvXG4vZywiPGJyPiIpKTt2YXIgJD1YLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3QuVz1tLnc9KCQucmlnaHQtJC5sZWZ0KS9ZLHQuSD1tLmg9KCQuYm90dG9tLSQudG9wKS9ZLHQuWD1tLngsdC5ZPW0ueSt0LkgvMiwoIngiaW4gaXx8InkiaW4gaSkmJih0LnBhdGgudj1hLmZvcm1hdCgibXswfSx7MX1sezJ9LHsxfSIsZihtLngqdSksZihtLnkqdSksZihtLngqdSkrMSkpO3ZhciBfPVsieCIsInkiLCJ0ZXh0IiwiZm9udCIsImZvbnQtZmFtaWx5IiwiZm9udC13ZWlnaHQiLCJmb250LXN0eWxlIiwiZm9udC1zaXplIl07Zm9yKHZhciBiYT0wLGJiPV8ubGVuZ3RoO2JhPGJiO2JhKyspaWYoX1tiYV1pbiBpKXt0Ll8uZGlydHk9MTticmVha31zd2l0Y2gobVsidGV4dC1hbmNob3IiXSl7Y2FzZSJzdGFydCI6dC50ZXh0cGF0aC5zdHlsZVsidi10ZXh0LWFsaWduIl09ImxlZnQiLHQuYmJ4PXQuVy8yO2JyZWFrO2Nhc2UiZW5kIjp0LnRleHRwYXRoLnN0eWxlWyJ2LXRleHQtYWxpZ24iXT0icmlnaHQiLHQuYmJ4PS10LlcvMjticmVhaztkZWZhdWx0OnQudGV4dHBhdGguc3R5bGVbInYtdGV4dC1hbGlnbiJdPSJjZW50ZXIiLHQuYmJ4PTB9dC50ZXh0cGF0aC5zdHlsZVsidi10ZXh0LWtlcm4iXT0hMH19LEM9ZnVuY3Rpb24oYixmLGcpe2IuYXR0cnM9Yi5hdHRyc3x8e307dmFyIGg9Yi5hdHRycyxpPU1hdGgucG93LGosayxsPSJsaW5lYXIiLG09Ii41IC41IjtiLmF0dHJzLmdyYWRpZW50PWYsZj1jKGYpLnJlcGxhY2UoYS5fcmFkaWFsX2dyYWRpZW50LGZ1bmN0aW9uKGEsYixjKXtsPSJyYWRpYWwiLGImJmMmJihiPWQoYiksYz1kKGMpLGkoYi0uNSwyKStpKGMtLjUsMik+LjI1JiYoYz1lLnNxcnQoLjI1LWkoYi0uNSwyKSkqKChjPi41KSoyLTEpKy41KSxtPWIrbitjKTtyZXR1cm4gb30pLGY9Zi5zcGxpdCgvXHMqXC1ccyovKTtpZihsPT0ibGluZWFyIil7dmFyIHA9Zi5zaGlmdCgpO3A9LWQocCk7aWYoaXNOYU4ocCkpcmV0dXJuIG51bGx9dmFyIHE9YS5fcGFyc2VEb3RzKGYpO2lmKCFxKXJldHVybiBudWxsO2I9Yi5zaGFwZXx8Yi5ub2RlO2lmKHEubGVuZ3RoKXtiLnJlbW92ZUNoaWxkKGcpLGcub249ITAsZy5tZXRob2Q9Im5vbmUiLGcuY29sb3I9cVswXS5jb2xvcixnLmNvbG9yMj1xW3EubGVuZ3RoLTFdLmNvbG9yO3ZhciByPVtdO2Zvcih2YXIgcz0wLHQ9cS5sZW5ndGg7czx0O3MrKylxW3NdLm9mZnNldCYmci5wdXNoKHFbc10ub2Zmc2V0K24rcVtzXS5jb2xvcik7Zy5jb2xvcnM9ci5sZW5ndGg/ci5qb2luKCk6IjAlICIrZy5jb2xvcixsPT0icmFkaWFsIj8oZy50eXBlPSJncmFkaWVudFRpdGxlIixnLmZvY3VzPSIxMDAlIixnLmZvY3Vzc2l6ZT0iMCAwIixnLmZvY3VzcG9zaXRpb249bSxnLmFuZ2xlPTApOihnLnR5cGU9ImdyYWRpZW50IixnLmFuZ2xlPSgyNzAtcCklMzYwKSxiLmFwcGVuZENoaWxkKGcpfXJldHVybiAxfSxEPWZ1bmN0aW9uKGIsYyl7dGhpc1swXT10aGlzLm5vZGU9YixiLnJhcGhhZWw9ITAsdGhpcy5pZD1hLl9vaWQrKyxiLnJhcGhhZWxpZD10aGlzLmlkLHRoaXMuWD0wLHRoaXMuWT0wLHRoaXMuYXR0cnM9e30sdGhpcy5wYXBlcj1jLHRoaXMubWF0cml4PWEubWF0cml4KCksdGhpcy5fPXt0cmFuc2Zvcm06W10sc3g6MSxzeToxLGR4OjAsZHk6MCxkZWc6MCxkaXJ0eToxLGRpcnR5VDoxfSwhYy5ib3R0b20mJihjLmJvdHRvbT10aGlzKSx0aGlzLnByZXY9Yy50b3AsYy50b3AmJihjLnRvcC5uZXh0PXRoaXMpLGMudG9wPXRoaXMsdGhpcy5uZXh0PW51bGx9LEU9YS5lbDtELnByb3RvdHlwZT1FLEUuY29uc3RydWN0b3I9RCxFLnRyYW5zZm9ybT1mdW5jdGlvbihiKXtpZihiPT1udWxsKXJldHVybiB0aGlzLl8udHJhbnNmb3JtO3ZhciBkPXRoaXMucGFwZXIuX3ZpZXdCb3hTaGlmdCxlPWQ/InMiK1tkLnNjYWxlLGQuc2NhbGVdKyItMS0xdCIrW2QuZHgsZC5keV06byxmO2QmJihmPWI9YyhiKS5yZXBsYWNlKC9cLnszfXxcdTIwMjYvZyx0aGlzLl8udHJhbnNmb3JtfHxvKSksYS5fZXh0cmFjdFRyYW5zZm9ybSh0aGlzLGUrYik7dmFyIGc9dGhpcy5tYXRyaXguY2xvbmUoKSxoPXRoaXMuc2tldyxpPXRoaXMubm9kZSxqLGs9fmModGhpcy5hdHRycy5maWxsKS5pbmRleE9mKCItIiksbD0hYyh0aGlzLmF0dHJzLmZpbGwpLmluZGV4T2YoInVybCgiKTtnLnRyYW5zbGF0ZSgtMC41LC0wLjUpO2lmKGx8fGt8fHRoaXMudHlwZT09ImltYWdlIil7aC5tYXRyaXg9IjEgMCAwIDEiLGgub2Zmc2V0PSIwIDAiLGo9Zy5zcGxpdCgpO2lmKGsmJmoubm9Sb3RhdGlvbnx8IWouaXNTaW1wbGUpe2kuc3R5bGUuZmlsdGVyPWcudG9GaWx0ZXIoKTt2YXIgbT10aGlzLmdldEJCb3goKSxwPXRoaXMuZ2V0QkJveCgxKSxxPW0ueC1wLngscj1tLnktcC55O2kuY29vcmRvcmlnaW49cSotdStuK3IqLXUseih0aGlzLDEsMSxxLHIsMCl9ZWxzZSBpLnN0eWxlLmZpbHRlcj1vLHoodGhpcyxqLnNjYWxleCxqLnNjYWxleSxqLmR4LGouZHksai5yb3RhdGUpfWVsc2UgaS5zdHlsZS5maWx0ZXI9byxoLm1hdHJpeD1jKGcpLGgub2Zmc2V0PWcub2Zmc2V0KCk7ZiYmKHRoaXMuXy50cmFuc2Zvcm09Zik7cmV0dXJuIHRoaXN9LEUucm90YXRlPWZ1bmN0aW9uKGEsYixlKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYoYSE9bnVsbCl7YT1jKGEpLnNwbGl0KGspLGEubGVuZ3RoLTEmJihiPWQoYVsxXSksZT1kKGFbMl0pKSxhPWQoYVswXSksZT09bnVsbCYmKGI9ZSk7aWYoYj09bnVsbHx8ZT09bnVsbCl7dmFyIGY9dGhpcy5nZXRCQm94KDEpO2I9Zi54K2Yud2lkdGgvMixlPWYueStmLmhlaWdodC8yfXRoaXMuXy5kaXJ0eVQ9MSx0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbWyJyIixhLGIsZV1dKSk7cmV0dXJuIHRoaXN9fSxFLnRyYW5zbGF0ZT1mdW5jdGlvbihhLGIpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpczthPWMoYSkuc3BsaXQoayksYS5sZW5ndGgtMSYmKGI9ZChhWzFdKSksYT1kKGFbMF0pfHwwLGI9K2J8fDAsdGhpcy5fLmJib3gmJih0aGlzLl8uYmJveC54Kz1hLHRoaXMuXy5iYm94LnkrPWIpLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbInQiLGEsYl1dKSk7cmV0dXJuIHRoaXN9LEUuc2NhbGU9ZnVuY3Rpb24oYSxiLGUsZil7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2E9YyhhKS5zcGxpdChrKSxhLmxlbmd0aC0xJiYoYj1kKGFbMV0pLGU9ZChhWzJdKSxmPWQoYVszXSksaXNOYU4oZSkmJihlPW51bGwpLGlzTmFOKGYpJiYoZj1udWxsKSksYT1kKGFbMF0pLGI9PW51bGwmJihiPWEpLGY9PW51bGwmJihlPWYpO2lmKGU9PW51bGx8fGY9PW51bGwpdmFyIGc9dGhpcy5nZXRCQm94KDEpO2U9ZT09bnVsbD9nLngrZy53aWR0aC8yOmUsZj1mPT1udWxsP2cueStnLmhlaWdodC8yOmYsdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1sicyIsYSxiLGUsZl1dKSksdGhpcy5fLmRpcnR5VD0xO3JldHVybiB0aGlzfSxFLmhpZGU9ZnVuY3Rpb24oKXshdGhpcy5yZW1vdmVkJiYodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtyZXR1cm4gdGhpc30sRS5zaG93PWZ1bmN0aW9uKCl7IXRoaXMucmVtb3ZlZCYmKHRoaXMubm9kZS5zdHlsZS5kaXNwbGF5PW8pO3JldHVybiB0aGlzfSxFLl9nZXRCQm94PWZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVkKXJldHVybnt9O3JldHVybnt4OnRoaXMuWCsodGhpcy5iYnh8fDApLXRoaXMuVy8yLHk6dGhpcy5ZLXRoaXMuSCx3aWR0aDp0aGlzLlcsaGVpZ2h0OnRoaXMuSH19LEUucmVtb3ZlPWZ1bmN0aW9uKCl7aWYoIXRoaXMucmVtb3ZlZCYmISF0aGlzLm5vZGUucGFyZW50Tm9kZSl7dGhpcy5wYXBlci5fX3NldF9fJiZ0aGlzLnBhcGVyLl9fc2V0X18uZXhjbHVkZSh0aGlzKSxhLmV2ZS51bmJpbmQoInJhcGhhZWwuKi4qLiIrdGhpcy5pZCksYS5fdGVhcih0aGlzLHRoaXMucGFwZXIpLHRoaXMubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZSksdGhpcy5zaGFwZSYmdGhpcy5zaGFwZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2hhcGUpO2Zvcih2YXIgYiBpbiB0aGlzKXRoaXNbYl09dHlwZW9mIHRoaXNbYl09PSJmdW5jdGlvbiI/YS5fcmVtb3ZlZEZhY3RvcnkoYik6bnVsbDt0aGlzLnJlbW92ZWQ9ITB9fSxFLmF0dHI9ZnVuY3Rpb24oYyxkKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYoYz09bnVsbCl7dmFyIGU9e307Zm9yKHZhciBmIGluIHRoaXMuYXR0cnMpdGhpcy5hdHRyc1tiXShmKSYmKGVbZl09dGhpcy5hdHRyc1tmXSk7ZS5ncmFkaWVudCYmZS5maWxsPT0ibm9uZSImJihlLmZpbGw9ZS5ncmFkaWVudCkmJmRlbGV0ZSBlLmdyYWRpZW50LGUudHJhbnNmb3JtPXRoaXMuXy50cmFuc2Zvcm07cmV0dXJuIGV9aWYoZD09bnVsbCYmYS5pcyhjLCJzdHJpbmciKSl7aWYoYz09aiYmdGhpcy5hdHRycy5maWxsPT0ibm9uZSImJnRoaXMuYXR0cnMuZ3JhZGllbnQpcmV0dXJuIHRoaXMuYXR0cnMuZ3JhZGllbnQ7dmFyIGc9Yy5zcGxpdChrKSxoPXt9O2Zvcih2YXIgaT0wLG09Zy5sZW5ndGg7aTxtO2krKyljPWdbaV0sYyBpbiB0aGlzLmF0dHJzP2hbY109dGhpcy5hdHRyc1tjXTphLmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tjXSwiZnVuY3Rpb24iKT9oW2NdPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tjXS5kZWY6aFtjXT1hLl9hdmFpbGFibGVBdHRyc1tjXTtyZXR1cm4gbS0xP2g6aFtnWzBdXX1pZih0aGlzLmF0dHJzJiZkPT1udWxsJiZhLmlzKGMsImFycmF5Iikpe2g9e307Zm9yKGk9MCxtPWMubGVuZ3RoO2k8bTtpKyspaFtjW2ldXT10aGlzLmF0dHIoY1tpXSk7cmV0dXJuIGh9dmFyIG47ZCE9bnVsbCYmKG49e30sbltjXT1kKSxkPT1udWxsJiZhLmlzKGMsIm9iamVjdCIpJiYobj1jKTtmb3IodmFyIG8gaW4gbilsKCJyYXBoYWVsLmF0dHIuIitvKyIuIit0aGlzLmlkLHRoaXMsbltvXSk7aWYobil7Zm9yKG8gaW4gdGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzKWlmKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tiXShvKSYmbltiXShvKSYmYS5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbb10sImZ1bmN0aW9uIikpe3ZhciBwPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tvXS5hcHBseSh0aGlzLFtdLmNvbmNhdChuW29dKSk7dGhpcy5hdHRyc1tvXT1uW29dO2Zvcih2YXIgcSBpbiBwKXBbYl0ocSkmJihuW3FdPXBbcV0pfW4udGV4dCYmdGhpcy50eXBlPT0idGV4dCImJih0aGlzLnRleHRwYXRoLnN0cmluZz1uLnRleHQpLEIodGhpcyxuKX1yZXR1cm4gdGhpc30sRS50b0Zyb250PWZ1bmN0aW9uKCl7IXRoaXMucmVtb3ZlZCYmdGhpcy5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSx0aGlzLnBhcGVyJiZ0aGlzLnBhcGVyLnRvcCE9dGhpcyYmYS5fdG9mcm9udCh0aGlzLHRoaXMucGFwZXIpO3JldHVybiB0aGlzfSxFLnRvQmFjaz1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpczt0aGlzLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkIT10aGlzLm5vZGUmJih0aGlzLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpLGEuX3RvYmFjayh0aGlzLHRoaXMucGFwZXIpKTtyZXR1cm4gdGhpc30sRS5pbnNlcnRBZnRlcj1mdW5jdGlvbihiKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7Yi5jb25zdHJ1Y3Rvcj09YS5zdC5jb25zdHJ1Y3RvciYmKGI9YltiLmxlbmd0aC0xXSksYi5ub2RlLm5leHRTaWJsaW5nP2Iubm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLm5vZGUsYi5ub2RlLm5leHRTaWJsaW5nKTpiLm5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLGEuX2luc2VydGFmdGVyKHRoaXMsYix0aGlzLnBhcGVyKTtyZXR1cm4gdGhpc30sRS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oYil7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO2IuY29uc3RydWN0b3I9PWEuc3QuY29uc3RydWN0b3ImJihiPWJbMF0pLGIubm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLm5vZGUsYi5ub2RlKSxhLl9pbnNlcnRiZWZvcmUodGhpcyxiLHRoaXMucGFwZXIpO3JldHVybiB0aGlzfSxFLmJsdXI9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5ub2RlLnJ1bnRpbWVTdHlsZSxkPWMuZmlsdGVyO2Q9ZC5yZXBsYWNlKHIsbyksK2IhPT0wPyh0aGlzLmF0dHJzLmJsdXI9YixjLmZpbHRlcj1kK24rbSsiLkJsdXIocGl4ZWxyYWRpdXM9IisoK2J8fDEuNSkrIikiLGMubWFyZ2luPWEuZm9ybWF0KCItezB9cHggMCAwIC17MH1weCIsZigrYnx8MS41KSkpOihjLmZpbHRlcj1kLGMubWFyZ2luPTAsZGVsZXRlIHRoaXMuYXR0cnMuYmx1cil9LGEuX2VuZ2luZS5wYXRoPWZ1bmN0aW9uKGEsYil7dmFyIGM9Rigic2hhcGUiKTtjLnN0eWxlLmNzc1RleHQ9dCxjLmNvb3Jkc2l6ZT11K24rdSxjLmNvb3Jkb3JpZ2luPWIuY29vcmRvcmlnaW47dmFyIGQ9bmV3IEQoYyxiKSxlPXtmaWxsOiJub25lIixzdHJva2U6IiMwMDAifTthJiYoZS5wYXRoPWEpLGQudHlwZT0icGF0aCIsZC5wYXRoPVtdLGQuUGF0aD1vLEIoZCxlKSxiLmNhbnZhcy5hcHBlbmRDaGlsZChjKTt2YXIgZj1GKCJza2V3Iik7Zi5vbj0hMCxjLmFwcGVuZENoaWxkKGYpLGQuc2tldz1mLGQudHJhbnNmb3JtKG8pO3JldHVybiBkfSxhLl9lbmdpbmUucmVjdD1mdW5jdGlvbihiLGMsZCxlLGYsZyl7dmFyIGg9YS5fcmVjdFBhdGgoYyxkLGUsZixnKSxpPWIucGF0aChoKSxqPWkuYXR0cnM7aS5YPWoueD1jLGkuWT1qLnk9ZCxpLlc9ai53aWR0aD1lLGkuSD1qLmhlaWdodD1mLGoucj1nLGoucGF0aD1oLGkudHlwZT0icmVjdCI7cmV0dXJuIGl9LGEuX2VuZ2luZS5lbGxpcHNlPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS5wYXRoKCksZz1mLmF0dHJzO2YuWD1iLWQsZi5ZPWMtZSxmLlc9ZCoyLGYuSD1lKjIsZi50eXBlPSJlbGxpcHNlIixCKGYse2N4OmIsY3k6YyxyeDpkLHJ5OmV9KTtyZXR1cm4gZn0sYS5fZW5naW5lLmNpcmNsZT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1hLnBhdGgoKSxmPWUuYXR0cnM7ZS5YPWItZCxlLlk9Yy1kLGUuVz1lLkg9ZCoyLGUudHlwZT0iY2lyY2xlIixCKGUse2N4OmIsY3k6YyxyOmR9KTtyZXR1cm4gZX0sYS5fZW5naW5lLmltYWdlPWZ1bmN0aW9uKGIsYyxkLGUsZixnKXt2YXIgaD1hLl9yZWN0UGF0aChkLGUsZixnKSxpPWIucGF0aChoKS5hdHRyKHtzdHJva2U6Im5vbmUifSksaz1pLmF0dHJzLGw9aS5ub2RlLG09bC5nZXRFbGVtZW50c0J5VGFnTmFtZShqKVswXTtrLnNyYz1jLGkuWD1rLng9ZCxpLlk9ay55PWUsaS5XPWsud2lkdGg9ZixpLkg9ay5oZWlnaHQ9ZyxrLnBhdGg9aCxpLnR5cGU9ImltYWdlIixtLnBhcmVudE5vZGU9PWwmJmwucmVtb3ZlQ2hpbGQobSksbS5yb3RhdGU9ITAsbS5zcmM9YyxtLnR5cGU9InRpbGUiLGkuXy5maWxscG9zPVtkLGVdLGkuXy5maWxsc2l6ZT1bZixnXSxsLmFwcGVuZENoaWxkKG0pLHooaSwxLDEsMCwwLDApO3JldHVybiBpfSxhLl9lbmdpbmUudGV4dD1mdW5jdGlvbihiLGQsZSxnKXt2YXIgaD1GKCJzaGFwZSIpLGk9RigicGF0aCIpLGo9RigidGV4dHBhdGgiKTtkPWR8fDAsZT1lfHwwLGc9Z3x8IiIsaS52PWEuZm9ybWF0KCJtezB9LHsxfWx7Mn0sezF9IixmKGQqdSksZihlKnUpLGYoZCp1KSsxKSxpLnRleHRwYXRob2s9ITAsai5zdHJpbmc9YyhnKSxqLm9uPSEwLGguc3R5bGUuY3NzVGV4dD10LGguY29vcmRzaXplPXUrbit1LGguY29vcmRvcmlnaW49IjAgMCI7dmFyIGs9bmV3IEQoaCxiKSxsPXtmaWxsOiIjMDAwIixzdHJva2U6Im5vbmUiLGZvbnQ6YS5fYXZhaWxhYmxlQXR0cnMuZm9udCx0ZXh0Omd9O2suc2hhcGU9aCxrLnBhdGg9aSxrLnRleHRwYXRoPWosay50eXBlPSJ0ZXh0IixrLmF0dHJzLnRleHQ9YyhnKSxrLmF0dHJzLng9ZCxrLmF0dHJzLnk9ZSxrLmF0dHJzLnc9MSxrLmF0dHJzLmg9MSxCKGssbCksaC5hcHBlbmRDaGlsZChqKSxoLmFwcGVuZENoaWxkKGkpLGIuY2FudmFzLmFwcGVuZENoaWxkKGgpO3ZhciBtPUYoInNrZXciKTttLm9uPSEwLGguYXBwZW5kQ2hpbGQobSksay5za2V3PW0say50cmFuc2Zvcm0obyk7cmV0dXJuIGt9LGEuX2VuZ2luZS5zZXRTaXplPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5jYW52YXMuc3R5bGU7dGhpcy53aWR0aD1iLHRoaXMuaGVpZ2h0PWMsYj09K2ImJihiKz0icHgiKSxjPT0rYyYmKGMrPSJweCIpLGQud2lkdGg9YixkLmhlaWdodD1jLGQuY2xpcD0icmVjdCgwICIrYisiICIrYysiIDApIix0aGlzLl92aWV3Qm94JiZhLl9lbmdpbmUuc2V0Vmlld0JveC5hcHBseSh0aGlzLHRoaXMuX3ZpZXdCb3gpO3JldHVybiB0aGlzfSxhLl9lbmdpbmUuc2V0Vmlld0JveD1mdW5jdGlvbihiLGMsZCxlLGYpe2EuZXZlKCJyYXBoYWVsLnNldFZpZXdCb3giLHRoaXMsdGhpcy5fdmlld0JveCxbYixjLGQsZSxmXSk7dmFyIGg9dGhpcy53aWR0aCxpPXRoaXMuaGVpZ2h0LGo9MS9nKGQvaCxlL2kpLGssbDtmJiYoaz1pL2UsbD1oL2QsZCprPGgmJihiLT0oaC1kKmspLzIvayksZSpsPGkmJihjLT0oaS1lKmwpLzIvbCkpLHRoaXMuX3ZpZXdCb3g9W2IsYyxkLGUsISFmXSx0aGlzLl92aWV3Qm94U2hpZnQ9e2R4Oi1iLGR5Oi1jLHNjYWxlOmp9LHRoaXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnRyYW5zZm9ybSgiLi4uIil9KTtyZXR1cm4gdGhpc307dmFyIEY7YS5fZW5naW5lLmluaXRXaW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5kb2N1bWVudDtiLmNyZWF0ZVN0eWxlU2hlZXQoKS5hZGRSdWxlKCIucnZtbCIsImJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpIik7dHJ5eyFiLm5hbWVzcGFjZXMucnZtbCYmYi5uYW1lc3BhY2VzLmFkZCgicnZtbCIsInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIiksRj1mdW5jdGlvbihhKXtyZXR1cm4gYi5jcmVhdGVFbGVtZW50KCI8cnZtbDoiK2ErJyBjbGFzcz0icnZtbCI+Jyl9fWNhdGNoKGMpe0Y9ZnVuY3Rpb24oYSl7cmV0dXJuIGIuY3JlYXRlRWxlbWVudCgiPCIrYSsnIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQuY29tOnZtbCIgY2xhc3M9InJ2bWwiPicpfX19LGEuX2VuZ2luZS5pbml0V2luKGEuX2cud2luKSxhLl9lbmdpbmUuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIGI9YS5fZ2V0Q29udGFpbmVyLmFwcGx5KDAsYXJndW1lbnRzKSxjPWIuY29udGFpbmVyLGQ9Yi5oZWlnaHQsZSxmPWIud2lkdGgsZz1iLngsaD1iLnk7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJWTUwgY29udGFpbmVyIG5vdCBmb3VuZC4iKTt2YXIgaT1uZXcgYS5fUGFwZXIsaj1pLmNhbnZhcz1hLl9nLmRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKSxrPWouc3R5bGU7Zz1nfHwwLGg9aHx8MCxmPWZ8fDUxMixkPWR8fDM0MixpLndpZHRoPWYsaS5oZWlnaHQ9ZCxmPT0rZiYmKGYrPSJweCIpLGQ9PStkJiYoZCs9InB4IiksaS5jb29yZHNpemU9dSoxZTMrbit1KjFlMyxpLmNvb3Jkb3JpZ2luPSIwIDAiLGkuc3Bhbj1hLl9nLmRvYy5jcmVhdGVFbGVtZW50KCJzcGFuIiksaS5zcGFuLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTk5OTllbTt0b3A6LTk5OTllbTtwYWRkaW5nOjA7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MTsiLGouYXBwZW5kQ2hpbGQoaS5zcGFuKSxrLmNzc1RleHQ9YS5mb3JtYXQoInRvcDowO2xlZnQ6MDt3aWR0aDp7MH07aGVpZ2h0OnsxfTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtjbGlwOnJlY3QoMCB7MH0gezF9IDApO292ZXJmbG93OmhpZGRlbiIsZixkKSxjPT0xPyhhLl9nLmRvYy5ib2R5LmFwcGVuZENoaWxkKGopLGsubGVmdD1nKyJweCIsay50b3A9aCsicHgiLGsucG9zaXRpb249ImFic29sdXRlIik6Yy5maXJzdENoaWxkP2MuaW5zZXJ0QmVmb3JlKGosYy5maXJzdENoaWxkKTpjLmFwcGVuZENoaWxkKGopLGkucmVuZGVyZml4PWZ1bmN0aW9uKCl7fTtyZXR1cm4gaX0sYS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXthLmV2ZSgicmFwaGFlbC5jbGVhciIsdGhpcyksdGhpcy5jYW52YXMuaW5uZXJIVE1MPW8sdGhpcy5zcGFuPWEuX2cuZG9jLmNyZWF0ZUVsZW1lbnQoInNwYW4iKSx0aGlzLnNwYW4uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotOTk5OWVtO3RvcDotOTk5OWVtO3BhZGRpbmc6MDttYXJnaW46MDtsaW5lLWhlaWdodDoxO2Rpc3BsYXk6aW5saW5lOyIsdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5zcGFuKSx0aGlzLmJvdHRvbT10aGlzLnRvcD1udWxsfSxhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXthLmV2ZSgicmFwaGFlbC5yZW1vdmUiLHRoaXMpLHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO2Zvcih2YXIgYiBpbiB0aGlzKXRoaXNbYl09dHlwZW9mIHRoaXNbYl09PSJmdW5jdGlvbiI/YS5fcmVtb3ZlZEZhY3RvcnkoYik6bnVsbDtyZXR1cm4hMH07dmFyIEc9YS5zdDtmb3IodmFyIEggaW4gRSlFW2JdKEgpJiYhR1tiXShIKSYmKEdbSF09ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGI9YXJndW1lbnRzO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oYyl7Y1thXS5hcHBseShjLGIpfSl9fShIKSl9KHdpbmRvdy5SYXBoYWVsKQo7CndpbmRvdy5wb2x5anM9ZnVuY3Rpb24oUCl7aWYoIVApe3ZhciBjPXt9OyhmdW5jdGlvbigpe3ZhciBmPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGMpe2Zvcih2YXIgaD0wLGI9dGhpcy5sZW5ndGg7aDxiO2grKylpZihoIGluIHRoaXMmJnRoaXNbaF09PT1jKXJldHVybiBoO3JldHVybi0xfTtjLmdyb3VwQnk9ZnVuY3Rpb24oZixoKXtyZXR1cm4gXy5ncm91cEJ5KGYsYy5zdHJpbmdpZnkoaCkpfTtjLnN0cmluZ2lmeT1mdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIF8ucmVkdWNlKGMsZnVuY3Rpb24oYixhKXtyZXR1cm4iIitiK2ErIjoiK2hbYV0rIjsifSwiIil9fTtjLmNyb3NzPWZ1bmN0aW9uKGYsaCl7dmFyIGIsYSxkLGUsayxuLHAsbSxyLHE7bnVsbD09aCYmKGg9W10pO2Q9Xy5kaWZmZXJlbmNlKF8ua2V5cyhmKSxoKTtpZigwPT09ZC5sZW5ndGgpcmV0dXJuW3t9XTtiPVtdO2U9ZFswXTtkPWMuY3Jvc3MoZixoLmNvbmNhdChlKSk7cT1mW2VdO249MDtmb3IobT0KcS5sZW5ndGg7bjxtO24rKylmb3Ioaz1xW25dLHA9MCxyPWQubGVuZ3RoO3A8cjtwKyspYT1kW3BdLGE9Xy5jbG9uZShhKSxhW2VdPWssYi5wdXNoKGEpO3JldHVybiBifTtjLmZpbHRlcj1mdW5jdGlvbihjLGgsYil7dmFyIGEsZCxlLGs7ZD1bXTtlPTA7Zm9yKGs9Yy5sZW5ndGg7ZTxrO2UrKylhPWNbZV0sYVtoXT09PWImJmQucHVzaChhKTtyZXR1cm4gZH07Yy5pbnRlcnNlY3Q9ZnVuY3Rpb24oYyxoKXt2YXIgYixhLGQsZSxrO2E9ZnVuY3Rpb24oYil7dmFyIGEsZCxlLHEsbDtkPVtdO2w9Y1tiXVsiaW4iXTtlPTA7Zm9yKHE9bC5sZW5ndGg7ZTxxO2UrKylhPWxbZV0sMDw9Zi5jYWxsKGhbYl1bImluIl0sYSkmJmQucHVzaChhKTtyZXR1cm57ImluIjpkfX07Yj1mdW5jdGlvbihiKXt2YXIgYSxkLGUscSxsO2Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGFbYl0ubHQ/e3R5cGU6Imx0Iix2YWw6YVtiXS5sdH06YVtiXS5sZT97dHlwZToibGUiLHZhbDphW2JdLmxlfTp7dHlwZTpudWxsLHZhbDpudWxsfX07CmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGFbYl0uZ3Q/e3R5cGU6Imd0Iix2YWw6YVtiXS5ndH06YVtiXS5nZT97dHlwZToiZ2UiLHZhbDphW2JdLmdlfTp7dHlwZTpudWxsLHZhbDpudWxsfX07YT1bYShjKSxhKGgpXTtxPVtkKGMpLGQoaCldO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBiLnZhbC1hLnZhbH0pO3Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnZhbC1iLnZhbH0pO2Q9e307YVswXS50eXBlJiZhWzBdLnZhbCYmKGw9YVswXSxlPWwudHlwZSxsPWwudmFsLGFbMF0udmFsPT09YVsxXS52YWwmJmFbMF0udHlwZSE9PWFbMV0udHlwZSYmKGU9Imx0IiksZFtlXT1sKTtxWzBdLnR5cGUmJnFbMF0udmFsJiYobD1xWzBdLGU9bC50eXBlLGw9bC52YWwscVswXS52YWw9PT1xWzFdLnZhbCYmcVswXS50eXBlIT09cVsxXS50eXBlJiYoZT0ibHQiKSxkW2VdPWwpO2lmKGFbMF0udHlwZSYmcVswXS50eXBlJiYoYVswXS52YWw+cVswXS52YWx8fGFbMF0udmFsPT09cVswXS52YWwmJgooImx0Ij09PWFbMF0ua2V5fHwiZ3QiPT09cVswXS5rZXkpKSl0aHJvdyJObyBpbnRlcnNlY3Rpb24gZm91bmQhIjtyZXR1cm4gZH07ZT17fTtmb3IoZCBpbiBjKWs9Y1tkXSxlW2RdPWQgaW4gaD8iaW4iaW4gY1tkXT9hKGQpOmIoZCk6aztmb3IoZCBpbiBoKWs9aFtkXSxkIGluIGV8fChlW2RdPWspO3JldHVybiBlfTtjLmxpbmVhcj1mdW5jdGlvbihmLGgsYixhKXtpZihfLmlzRmluaXRlKGYpJiZfLmlzRmluaXRlKGgpJiZfLmlzRmluaXRlKGIpJiZfLmlzRmluaXRlKGEpKXJldHVybiBmdW5jdGlvbihkKXtyZXR1cm4oYS1oKS8oYi1mKSooZC1mKStofTt0aHJvdyBjLmVycm9yLmlucHV0KCJBdHRlbXB0aW5nIHRvIGNyZWF0ZSBsaW5lYXIgZnVuY3Rpb24gZnJvbSBpbmZpbml0eSIpO307Yy5tZWRpYW49ZnVuY3Rpb24oYyxoKXt2YXIgYjtudWxsPT1oJiYoaD0hMSk7aHx8KGM9Xy5zb3J0QnkoYyxmdW5jdGlvbihhKXtyZXR1cm4gYX0pKTtiPWMubGVuZ3RoLzI7cmV0dXJuIDAhPT0KYiUxP2NbTWF0aC5mbG9vcihiKV06KGNbYi0xXStjW2JdKS8yfTtjLmNvdW50ZXI9ZnVuY3Rpb24oKXt2YXIgYztjPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMrK319O2Muc2FtcGxlPWZ1bmN0aW9uKGMsaCl7cmV0dXJuIF8ucGljayhjLF8uc2h1ZmZsZShfLmtleXMoYykpLnNwbGljZSgwLGgpKX07Yy5jb21wYXJlPWZ1bmN0aW9uKGMsaCl7dmFyIGIsYSxkLGUsayxuLHAsbSxyO3I9Xy5zb3J0QnkoYyxmdW5jdGlvbihhKXtyZXR1cm4gYX0pO209Xy5zb3J0QnkoaCxmdW5jdGlvbihhKXtyZXR1cm4gYX0pO2E9W107ZD1bXTtiPVtdO2ZvcihwPWs9MDtwPHIubGVuZ3RofHxrPG0ubGVuZ3RoOylpZihuPXJbcF0sZT1tW2tdLHA+PXIubGVuZ3RoKWIucHVzaChlKSxrKz0xO2Vsc2UgaWYoaz49bS5sZW5ndGgpYS5wdXNoKG4pLHArPTE7ZWxzZSBpZihuPGUpYS5wdXNoKG4pLHArPTE7ZWxzZSBpZihuPmUpYi5wdXNoKGUpLGsrPTE7ZWxzZSBpZihuPT09ZSlkLnB1c2gobikscCs9CjEsays9MTtlbHNlIHRocm93IERhdGFFcnJvcigiVW5rbm93biBkYXRhIGVuY291bnRlZCIpO3JldHVybntkZWxldGVkOmEsa2VwdDpkLGFkZGVkOmJ9fTtjLmZsYXR0ZW49ZnVuY3Rpb24oZil7dmFyIGgsYixhLGQ7aD1bXTtpZihudWxsIT1mKWlmKF8uaXNPYmplY3QoZikpaWYoInNjYWxlZm4iPT09Zi50KSJub3ZhbHVlIiE9PWYuZiYmaC5wdXNoKGYudik7ZWxzZSBmb3IoYiBpbiBmKWE9ZltiXSxoPWguY29uY2F0KGMuZmxhdHRlbihhKSk7ZWxzZSBpZihfLmlzQXJyYXkoZikpZm9yKGI9MCxkPWYubGVuZ3RoO2I8ZDtiKyspYT1mW2JdLGg9aC5jb25jYXQoYy5mbGF0dGVuKGEpKTtlbHNlIGgucHVzaChmKTtyZXR1cm4gaH07Yy5nZXRMYWJlbD1mdW5jdGlvbihjLGgpe3JldHVybiBfLmNoYWluKGMpLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYi5tYXBwaW5nW2hdfSkud2l0aG91dChudWxsLHZvaWQgMCkudW5pcSgpLnZhbHVlKCkuam9pbigiIHwgIil9O2Muc3RyU2l6ZT1mdW5jdGlvbihjKXtjPQooYysiIikubGVuZ3RoO3JldHVybiAxMD5jPzYqYzo1KihjLTEwKSs2MH07Yy5zb3J0QXJyYXlzPWZ1bmN0aW9uKGMsaCl7dmFyIGI7Yj1fLnppcC5hcHBseShfLGgpO2Iuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBjKGFbMF0sYlswXSl9KTtyZXR1cm4gXy56aXAuYXBwbHkoXyxiKX07Yy5pc0RlZmluZWQ9ZnVuY3Rpb24oZil7cmV0dXJuIF8uaXNPYmplY3QoZik/InNjYWxlZm4iPT09Zi50JiYibm92YWx1ZSIhPT1mLmY/Yy5pc0RlZmluZWQoZi52KTohMDp2b2lkIDAhPT1mJiZudWxsIT09ZiYmIShfLmlzTnVtYmVyKGYpJiZfLmlzTmFOKGYpKX07Yy5pc1VSST1mdW5jdGlvbihjKXt2YXIgaDtyZXR1cm4gXy5pc1N0cmluZyhjKT8oaD1SZWdFeHAoIl4oaHR0cHM/OlxcL1xcLyk/KCgoW2EtelxcZF0oW2EtelxcZC1dKlthLXpcXGRdKSopXFwuKStbYS16XXsyLH18KChcXGR7MSwzfVxcLil7M31cXGR7MSwzfSkpKFxcOlxcZCspPyhcXC9bLWEtelxcZCVfLn4rXSopKihcXD9bOyZhLXpcXGQlXy5+Kz0tXSopPyhcXCNbLWEtelxcZF9dKik/JCIsCiJpIiksaC50ZXN0KGMpKTohMX19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe2NbImNvbnN0Il09e2FlczoieCB5IGNvbG9yIHNpemUgb3BhY2l0eSBzaGFwZSBpZCB0ZXh0Ii5zcGxpdCgiICIpLG5vRG9tYWluOlsiaWQiLCJ0ZXh0IiwidG9vbHRpcCJdLG5vTGVnZW5kOlsieCIsInkiLCJpZCIsInRleHQiLCJ0b29sdGlwIl0sdHJhbnM6e2JpbjpbImtleSIsImJpbndpZHRoIl0sbGFnOlsia2V5IiwibGFnIl19LHN0YXQ6e2NvdW50Olsia2V5Il0sdW5pcXVlOlsia2V5Il0sc3VtOlsia2V5Il0sbWVhbjpbImtleSJdLGJveDpbImtleSJdLG1lZGlhbjpbImtleSJdfSx0aW1lcmFuZ2U6InNlY29uZCBtaW51dGUgaG91ciBkYXkgd2VlayBtb250aCB0d29tb250aCBxdWFydGVyIHNpeG1vbnRoIHllYXIgdHdveWVhciBmaXZleWVhciBkZWNhZGUiLnNwbGl0KCIgIiksbWV0YXM6e3NvcnQ6bnVsbCxzdGF0Om51bGwsbGltaXQ6bnVsbCxhc2M6ITF9LHNjYWxlRm5zOntub3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3Y6bnVsbCwKZjoibm92YWx1ZSIsdDoic2NhbGVmbiJ9fSxtYXg6ZnVuY3Rpb24oYyl7cmV0dXJue3Y6YyxmOiJtYXgiLHQ6InNjYWxlZm4ifX0sbWluOmZ1bmN0aW9uKGMpe3JldHVybnt2OmMsZjoibWluIix0OiJzY2FsZWZuIn19LHVwcGVyOmZ1bmN0aW9uKGMscyxoKXtyZXR1cm57djpjLG46cyxtOmgsZjoidXBwZXIiLHQ6InNjYWxlZm4ifX0sbG93ZXI6ZnVuY3Rpb24oYyxzLGgpe3JldHVybnt2OmMsbjpzLG06aCxmOiJsb3dlciIsdDoic2NhbGVmbiJ9fSxtaWRkbGU6ZnVuY3Rpb24oYyl7cmV0dXJue3Y6YyxmOiJtaWRkbGUiLHQ6InNjYWxlZm4ifX0saml0dGVyOmZ1bmN0aW9uKGMpe3JldHVybnt2OmMsZjoiaml0dGVyIix0OiJzY2FsZWZuIn19LGlkZW50aXR5OmZ1bmN0aW9uKGMpe3JldHVybnt2OmMsZjoiaWRlbnRpdHkiLHQ6InNjYWxlZm4ifX19LGVwc2lsb246TWF0aC5wb3coMTAsLTcpLGRlZmF1bHRzOnt4Ont2Om51bGwsZjoibm92YWx1ZSIsdDoic2NhbGVmbiJ9LHk6e3Y6bnVsbCwKZjoibm92YWx1ZSIsdDoic2NhbGVmbiJ9LGNvbG9yOiJzdGVlbGJsdWUiLHNpemU6MixvcGFjaXR5OjAuN319fSkuY2FsbCh0aGlzKTsoZnVuY3Rpb24oKXt2YXIgZixzLGgsYixhLGQsZSxrLG4scD17fS5oYXNPd25Qcm9wZXJ0eSxtPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gbCgpe3RoaXMuY29uc3RydWN0b3I9YX1mb3IodmFyIGcgaW4gYilwLmNhbGwoYixnKSYmKGFbZ109YltnXSk7bC5wcm90b3R5cGU9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGw7YS5fX3N1cGVyX189Yi5wcm90b3R5cGU7cmV0dXJuIGF9O3M9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLm1lc3NhZ2U9YTt0aGlzLm5hbWU9IkRlZmluaXRpb25FcnJvciJ9bShiLGEpO3JldHVybiBifShFcnJvcik7aD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3RoaXMubWVzc2FnZT1hO3RoaXMubmFtZT0iRGVwZW5kZW5jeUVycm9yIn1tKGIsYSk7cmV0dXJuIGJ9KEVycm9yKTthPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dGhpcy5tZXNzYWdlPQphO3RoaXMubmFtZT0iTW9kZUVycm9yIn1tKGIsYSk7cmV0dXJuIGJ9KEVycm9yKTtmPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dGhpcy5tZXNzYWdlPWE7dGhpcy5uYW1lPSJEYXRhRXJyb3IifW0oYixhKTtyZXR1cm4gYn0oRXJyb3IpO249ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLm1lc3NhZ2U9YTt0aGlzLm5hbWU9IlVua25vd25JbnB1dCJ9bShiLGEpO3JldHVybiBifShFcnJvcik7ZD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3RoaXMubWVzc2FnZT1hO3RoaXMubmFtZT0iTW9kZUVycm9yIn1tKGIsYSk7cmV0dXJuIGJ9KEVycm9yKTtlPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dGhpcy5tZXNzYWdlPWE7dGhpcy5uYW1lPSJTY2FsZUVycm9yIn1tKGIsYSk7cmV0dXJuIGJ9KEVycm9yKTtiPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dGhpcy5tZXNzYWdlPWE7dGhpcy5uYW1lPSJNaXNzaW5nRGF0YSJ9bShiLGEpO3JldHVybiBifShFcnJvcik7az0KZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLm1lc3NhZ2U9YTt0aGlzLm5hbWU9IlR5cGUifW0oYixhKTtyZXR1cm4gYn0oRXJyb3IpO2MuZXJyb3I9ZnVuY3Rpb24oYSl7cmV0dXJuIEVycm9yKGEpfTtjLmVycm9yLmRhdGE9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBmKGEpfTtjLmVycm9yLmRlcG49ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBoKGEpfTtjLmVycm9yLmRlZm49ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBzKGEpfTtjLmVycm9yLm1vZGU9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhKGIpfTtjLmVycm9yLmltcGw9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBkKGEpfTtjLmVycm9yLmlucHV0PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgbihhKX07Yy5lcnJvci5zY2FsZT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGUoYSl9O2MuZXJyb3IubWlzc2luZz1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGIoYSl9O2MuZXJyb3IudHlwZT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGsoYSl9fSkuY2FsbCh0aGlzKTsKKGZ1bmN0aW9uKCl7dmFyIGYscyxoLGIsYSxkLGU9e30uaGFzT3duUHJvcGVydHksaz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt0aGlzLmNvbnN0cnVjdG9yPWF9Zm9yKHZhciBkIGluIGIpZS5jYWxsKGIsZCkmJihhW2RdPWJbZF0pO2MucHJvdG90eXBlPWIucHJvdG90eXBlO2EucHJvdG90eXBlPW5ldyBjO2EuX19zdXBlcl9fPWIucHJvdG90eXBlO3JldHVybiBhfSxuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX07Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt9YS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGMuZXJyb3IuaW1wbCgpfTthLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIGMuZXJyb3IuaW1wbCgpfTtyZXR1cm4gYX0oKTtzPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXtyZXR1cm4gYT1kLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9CmsoZCxiKTtkLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXt0aHJvdyBjLmVycm9yLmltcGwoKTt9O3JldHVybiBkfShiKTtoPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gZD1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ayhiLGEpO2IucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3Rocm93IGMuZXJyb3IuaW1wbCgpO307Yi5wcm90b3R5cGUubWFrZT1mdW5jdGlvbigpe3Rocm93IGMuZXJyb3IuaW1wbCgpO307cmV0dXJuIGJ9KGIpO2Y9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLnR5cGU9bnVsbCE9YT9hOm51bGw7dGhpcy5kaXNwb3NlPW4odGhpcy5kaXNwb3NlLHRoaXMpO3RoaXMuZ2VvbXM9e307dGhpcy5wdHM9e319ayhiLGEpO2IucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZW9tcz1hfTtiLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7dmFyIGIsbCxnLApkLHUsdCxlO3U9e307Zz1jLmNvbXBhcmUoXy5rZXlzKHRoaXMucHRzKSxfLmtleXModGhpcy5nZW9tcykpO2w9Zy5kZWxldGVkO2Q9Zy5rZXB0O2I9Zy5hZGRlZDt0PTA7Zm9yKGU9bC5sZW5ndGg7dDxlO3QrKylnPWxbdF0sdGhpcy5fZGVsZXRlKGEsdGhpcy5wdHNbZ10pO2w9MDtmb3IodD1iLmxlbmd0aDtsPHQ7bCsrKWc9YltsXSx1W2ddPXRoaXMuX2FkZChhLHRoaXMuZ2VvbXNbZ10pO2I9MDtmb3IobD1kLmxlbmd0aDtiPGw7YisrKWc9ZFtiXSx1W2ddPXRoaXMuX21vZGlmeShhLHRoaXMucHRzW2ddLHRoaXMuZ2VvbXNbZ10pO3JldHVybiB0aGlzLnB0cz11fTtiLnByb3RvdHlwZS5fZGVsZXRlPWZ1bmN0aW9uKGEsYil7dmFyIGwsZyxkO2Q9W107Zm9yKGwgaW4gYilnPWJbbF0sZC5wdXNoKGEucmVtb3ZlKGcpKTtyZXR1cm4gZH07Yi5wcm90b3R5cGUuX21vZGlmeT1mdW5jdGlvbihhLGIsbCl7dmFyIGcsZCxjLHQ7Yz17fTt0PWwubWFya3M7Zm9yKGQgaW4gdCl7Zz10W2RdO3RyeXtjW2RdPQpiW2RdP2JbZF0uZGF0YSgibSIpLnR5cGU9PT1nLnR5cGU/YS5hbmltYXRlKGJbZF0sZyxsLmV2dERhdGEsbC50b29sdGlwKTooYS5yZW1vdmUoYltkXSksYS5hZGQoZyxsLmV2dERhdGEsbC50b29sdGlwLHRoaXMudHlwZSkpOmEuYWRkKGcsbC5ldnREYXRhLGwudG9vbHRpcCx0aGlzLnR5cGUpfWNhdGNoKGUpe2lmKGc9ZSwiTWlzc2luZ0RhdGEiPT09Zy5uYW1lKWNvbnNvbGUubG9nKGcubWVzc2FnZSk7ZWxzZSB0aHJvdyBnO319cmV0dXJuIGN9O2IucHJvdG90eXBlLl9hZGQ9ZnVuY3Rpb24oYSxiKXt2YXIgZCxnLGMsdTtjPXt9O3U9Yi5tYXJrcztmb3IoZyBpbiB1KXtkPXVbZ107dHJ5e2NbZ109YS5hZGQoZCxiLmV2dERhdGEsYi50b29sdGlwLHRoaXMudHlwZSl9Y2F0Y2godCl7aWYoZD10LCJNaXNzaW5nRGF0YSI9PT1kLm5hbWUpY29uc29sZS5sb2coZC5tZXNzYWdlKTtlbHNlIHRocm93IGQ7fX1yZXR1cm4gY307Yi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbihhKXt2YXIgYiwKZCxnO2c9dGhpcy5wdHM7Zm9yKGIgaW4gZylkPWdbYl0sdGhpcy5fZGVsZXRlKGEsZCk7cmV0dXJuIHRoaXMucHRzPXt9fTtyZXR1cm4gYn0oYik7Yy5SZW5kZXJhYmxlPWI7Yy5HdWlkZT1zO2MuR3VpZGVTZXQ9aDtjLkdlb21ldHJ5PWZ9KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLHM7Yy5vZmZzZXQ9ZnVuY3Rpb24oYyl7dmFyIGIsYSxkO2I9e3RvcDowLGxlZnQ6MH07aWYoYT1jJiZjLm93bmVyRG9jdW1lbnQpcmV0dXJuIGQ9YS5kb2N1bWVudEVsZW1lbnQsInVuZGVmaW5lZCIhPT10eXBlb2YgYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLGM9bnVsbCE9PWEmJmE9PT1hLndpbmRvdz9hOjk9PT1hLm5vZGVUeXBlJiZhLmRlZmF1bHRWaWV3LHt0b3A6Yi50b3ArYy5wYWdlWU9mZnNldC1kLmNsaWVudFRvcCxsZWZ0OmIubGVmdCtjLnBhZ2VYT2Zmc2V0LWQuY2xpZW50TGVmdH19O2MuZ2V0WFk9ZnVuY3Rpb24oYyxiKXt2YXIgYSwKZDstMSE9PWIudHlwZS5pbmRleE9mKCJtb3VzZSIpPyhkPWIuY2xpZW50WCxhPWIuY2xpZW50WSk6LTEhPT1iLnR5cGUuaW5kZXhPZigidG91Y2giKSYmKGE9Yi5jaGFuZ2VkVG91Y2hlc1swXSxkPWEuY2xpZW50WCxhPWEuY2xpZW50WSk7cmV0dXJue3g6ZCsoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KS1jLmxlZnQseTphKyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKS1jLnRvcH19O2MudG91Y2hUb01vdXNlPWZ1bmN0aW9uKGMsYixhKXt2YXIgZCxlLGs7bnVsbD09YSYmKGE9ITEpO2Q9Yi5sYXN0RXZlbnQ7az0wPGQudG91Y2hlcy5sZW5ndGgmJmQudG91Y2hlc1swXXx8MDxkLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCYmZC5jaGFuZ2VkVG91Y2hlc1swXTtlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7CmUuaW5pdE1vdXNlRXZlbnQoYyxkLmJ1YmJsZXMsZC5jYW5jZWxhYmxlLGQudmlldyxkLmRldGFpbCxrLnNjcmVlblgsay5zY3JlZW5ZLGsuY2xpZW50WCxrLmNsaWVudFksZC5jdHJsS2V5LGQuYWx0S2V5LGQuc2hpZnRLZXksZC5tZXRhS2V5LDEsZC50YXJnZXQpO3JldHVybiBhPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGIucHJlc3NUaW1lciksYi5wcmVzc1RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZSl9LGEpKTpkLnRhcmdldC5kaXNwYXRjaEV2ZW50KGUpfTtmPXtsYXN0U3RhcnQ6MCxsYXN0VG91Y2g6MCxsYXN0RXZlbnQ6bnVsbCxwcmVzc1RpbWVyOjB9O3M9d2luZG93LmFsZXJ0O2MudG91Y2g9ZnVuY3Rpb24oaCxiLGEsZCl7Yi50b29sdGlwPWIuZGF0YSgidCIpO2IuZXZ0RGF0YT1iLmRhdGEoImUiKTtmLmxhc3RFdmVudD1hO2EucHJldmVudERlZmF1bHQoKTtpZigidG91Y2hzdGFydCI9PT1oKXJldHVybiBmLmxhc3RTdGFydD0KYS50aW1lU3RhbXAsYy50b3VjaFRvTW91c2UoIm1vdXNlZG93biIsZiksZi5wcmVzc1RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGMudG91Y2hUb01vdXNlKCJtb3VzZW92ZXIiLGYpfSw4MDApLHdpbmRvdy5hbGVydD1mdW5jdGlvbigpe3ZhciBhO3dpbmRvdy5jbGVhclRpbWVvdXQoZi5wcmVzc1RpbWVyKTthPWFyZ3VtZW50cztyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmFwcGx5KHdpbmRvdyxhKTtyZXR1cm4gd2luZG93LmFsZXJ0PXN9LDEwMCl9O2lmKCJ0b3VjaG1vdmUiPT09aCl7aD1kLnBhcGVyLmdldEJ5SWQoYS50YXJnZXQucmFwaGFlbGlkKTtkPWMub2Zmc2V0KGQuZG9tKTtkPWMuZ2V0WFkoZCxhKTtpZig2MDA8YS50aW1lU3RhbXAtZi5sYXN0U3RhcnQmJmguaXNQb2ludEluc2lkZShkLngsZC55KSlyZXR1cm4gYy50b3VjaFRvTW91c2UoIm1vdXNlb3ZlciIsZik7d2luZG93LmNsZWFyVGltZW91dChmLnByZXNzVGltZXIpOwpyZXR1cm4gYy50b3VjaFRvTW91c2UoIm1vdXNlb3V0IixmKX1pZigidG91Y2hlbmQiPT09aCl7aWYod2luZG93LmNsZWFyVGltZW91dChmLnByZXNzVGltZXIpLGMudG91Y2hUb01vdXNlKCJtb3VzZXVwIixmKSxjLnRvdWNoVG9Nb3VzZSgibW91c2VvdXQiLGYsNDAwKSw4MDA+YS50aW1lU3RhbXAtZi5sYXN0U3RhcnQpcmV0dXJuIGMudG91Y2hUb01vdXNlKCJjbGljayIsZil9ZWxzZSBpZigidG91Y2hjYW5jZWwiPT09aClyZXR1cm4gd2luZG93LmNsZWFyVGltZW91dChmLnByZXNzVGltZXIpLGMudG91Y2hUb01vdXNlKCJtb3VzZW91dCIsZiksYy50b3VjaFRvTW91c2UoIm1vdXNldXAiLGYsMzAwKX19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLHMsaDtjLmZvcm1hdD1mdW5jdGlvbihiLGEpe3N3aXRjaChiKXtjYXNlICJjYXQiOnJldHVybiBjLmZvcm1hdC5pZGVudGl0eTtjYXNlICJudW0iOnJldHVybiBjLmZvcm1hdC5udW1iZXIoYSk7Y2FzZSAiZGF0ZSI6cmV0dXJuIGMuZm9ybWF0LmRhdGUoYSk7CmNhc2UgIm5vbmUiOnJldHVybiBjLmZvcm1hdC5pZGVudGl0eX19O2MuZm9ybWF0LmlkZW50aXR5PWZ1bmN0aW9uKGIpe3JldHVybiBifTtmPXswOiIiLDM6ImsiLDY6Im0iLDk6ImIiLDEyOiJ0In07aD1mdW5jdGlvbihiLGEpe3JldHVybiBfLmlzVW5kZWZpbmVkKGZbYV0pP2IrImUiKygwPGE/IisiOiItIikrTWF0aC5hYnMoYSk6YitmW2FdfTtzPWZ1bmN0aW9uKGIpe3ZhciBhLGQsYztpZighaXNGaW5pdGUoYikpcmV0dXJuIGI7ZD0iIitiO2E9TWF0aC5hYnMoYik7MUU0PD1hJiYoYz0oIiIrYSkuc3BsaXQoL1wuLyksYT1jWzBdLmxlbmd0aCUzfHwzLGNbMF09ZC5zbGljZSgwLGErKDA+YikpK2NbMF0uc2xpY2UoYSkucmVwbGFjZSgvKFxkezN9KS9nLCIsJDEiKSxkPWMuam9pbigiLiIpKTtyZXR1cm4gZH07Yy5mb3JtYXQubnVtYmVyPWZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbihhKXt2YXIgYyxlO2U9MDtjPW51bGwhPWI/YjpNYXRoLmZsb29yKE1hdGgubG9nKE1hdGguYWJzKDA9PT0KYT8xOmEpKS9NYXRoLkxOMTApO251bGw9PWJ8fDIhPT1jJiY1IT09YyYmOCE9PWMmJjExIT09Yz8tMT09PWM/KGM9MCxlPW51bGwhPWI/MToyKTotMj09PWM/KGM9MCxlPW51bGwhPWI/MjozKToxPT09Y3x8Mj09PWM/Yz0wOjM8YyYmNj5jP2M9Mzo2PGMmJjk+Yz9jPTY6OTxjJiYxMj5jP2M9OToxMjxjJiYxNT5jP2M9MTI6ZT1udWxsIT1iPzA6MTooYys9MSxlPTEpO2E9TWF0aC5yb3VuZChhL01hdGgucG93KDEwLGMtZSkpO2EvPU1hdGgucG93KDEwLGUpO2E9YS50b0ZpeGVkKGUpO3JldHVybiBoKHMoYSksYyl9fTtjLmZvcm1hdC5kYXRlPWZ1bmN0aW9uKGIpe3JldHVybi0xIT09Xy5pbmRleE9mKGNbImNvbnN0Il0udGltZXJhbmdlLGIpPyJzZWNvbmQiPT09Yj9mdW5jdGlvbihhKXtyZXR1cm4gbW9tZW50LnVuaXgoYSkuZm9ybWF0KCJoOm1tOnNzIGEiKX06Im1pbnV0ZSI9PT1iP2Z1bmN0aW9uKGEpe3JldHVybiBtb21lbnQudW5peChhKS5mb3JtYXQoImg6bW0gYSIpfToiaG91ciI9PT0KYj9mdW5jdGlvbihhKXtyZXR1cm4gbW9tZW50LnVuaXgoYSkuZm9ybWF0KCJNTU0gRCBoIGEiKX06ImRheSI9PT1ifHwid2VlayI9PT1iP2Z1bmN0aW9uKGEpe3JldHVybiBtb21lbnQudW5peChhKS5mb3JtYXQoIk1NTSBEIil9OiJtb250aCI9PT1ifHwidHdvbW9udGgiPT09Ynx8InF1YXJ0ZXIiPT09Ynx8InNpeG1vbnRoIj09PWI/ZnVuY3Rpb24oYSl7cmV0dXJuIG1vbWVudC51bml4KGEpLmZvcm1hdCgiWVlZWS9NTSIpfTpmdW5jdGlvbihhKXtyZXR1cm4gbW9tZW50LnVuaXgoYSkuZm9ybWF0KCJZWVlZIil9OmZ1bmN0aW9uKGEpe3JldHVybiBtb21lbnQudW5peChhKS5mb3JtYXQoYil9fTtjLmZvcm1hdC5fbnVtYmVyX2luc3RhbmNlPWMuZm9ybWF0Lm51bWJlcigpO2MuZm9ybWF0LnZhbHVlPWZ1bmN0aW9uKGIpe3JldHVybiBfLmlzTnVtYmVyKGIpP2MuZm9ybWF0Ll9udW1iZXJfaW5zdGFuY2UoYik6Yn19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLHM7Yy50eXBlPQp7fTtjLnR5cGUuaW1wdXRlPWZ1bmN0aW9uKGMpe3ZhciBiLGEsZCxlLGssbjtrPWE9ZT1iPTA7Zm9yKG49Yy5sZW5ndGg7azxuO2srKylkPWNba10sbnVsbCE9ZCYmKHZvaWQgMCE9PWQmJm51bGwhPT1kKSYmKGErKyxpc05hTihkKSYmaXNOYU4oZC5yZXBsYWNlKC9cJHxcLC9nLCIiKSl8fGUrKyxkPW1vbWVudChkKSxudWxsIT1kJiZkLmlzVmFsaWQoKSYmYisrKTtyZXR1cm4gZT4wLjk1KmE/Im51bSI6Yj4wLjk1KmE/ImRhdGUiOiJjYXQifTtjLnR5cGUuY29lcmNlPWZ1bmN0aW9uKGMsYil7aWYoXy5pc1VuZGVmaW5lZChjKXx8Xy5pc051bGwoYyl8fCJjYXQiPT09Yi50eXBlKXJldHVybiBjO2lmKCJudW0iPT09Yi50eXBlKXJldHVybiBpc05hTihjKT8rKCIiK2MpLnJlcGxhY2UoL1wkfFwsL2csIiIpOitjO2lmKCJkYXRlIj09PWIudHlwZSlyZXR1cm4gYi5mb3JtYXQ/InVuaXgiPT09Yi5mb3JtYXQ/bW9tZW50LnVuaXgoYykudW5peCgpOm1vbWVudChjLGIuZm9ybWF0KS51bml4KCk6Cm1vbWVudChjKS51bml4KCl9O2MudHlwZS5jb21wYXJlPWZ1bmN0aW9uKGMpe3N3aXRjaChjKXtjYXNlICJjYXQiOnJldHVybiBmO2RlZmF1bHQ6cmV0dXJuIHN9fTtmPWZ1bmN0aW9uKGMsYil7dmFyIGEsZDtpZihjPT09YilyZXR1cm4gMDtfLmlzU3RyaW5nKGMpfHwoYz0iIitjKTtfLmlzU3RyaW5nKGIpfHwoYj0iIitiKTthPWMudG9Mb3dlckNhc2UoKTtkPWIudG9Mb3dlckNhc2UoKTtyZXR1cm4gYT09PWQ/YzxiPy0xOmM+Yj8xOjA6YTxkPy0xOmE+ZD8xOjB9O3M9ZnVuY3Rpb24oYyxiKXtyZXR1cm4gYz09PWI/MDpudWxsPT09Yz8xOm51bGw9PT1iPy0xOmM8Yj8tMTpjPmI/MTowfX0pLmNhbGwodGhpcyk7KGZ1bmN0aW9uKCl7Yy5zcGVjPXt9O2Muc3BlYy50b1N0cmljdE1vZGU9ZnVuY3Rpb24oZil7dmFyIHMsaCxiLGEsZCxlLGssbjtmPV8uY2xvbmUoZik7bnVsbD09Zi5sYXllcnMmJmYubGF5ZXImJihmLmxheWVycz1bZi5sYXllcl0pO251bGw9PWYuZ3VpZGVzJiZmLmd1aWRlJiYKKGYuZ3VpZGVzPWYuZ3VpZGUpO251bGw9PWYuZ3VpZGVzJiYoZi5ndWlkZXM9e30pO2lmKGYubGF5ZXJzKWZvcihlPWYubGF5ZXJzLHM9aD0wLGE9ZS5sZW5ndGg7aDxhO3M9KytoKXtiPWVbc107bj1jWyJjb25zdCJdLmFlcztkPTA7Zm9yKGs9bi5sZW5ndGg7ZDxrO2QrKylzPW5bZF0sYltzXSYmXy5pc1N0cmluZyhiW3NdKSYmKGJbc109eyJ2YXIiOmJbc119KTtudWxsPT1iLnNhbXBsZSYmKGIuc2FtcGxlPTUwMCl9aWYoZi5mYWNldClmb3IoYj1bInZhciIsIngiLCJ5Il0sZT0wLHM9Yi5sZW5ndGg7ZTxzO2UrKylhPWJbZV0sKGg9Zi5mYWNldFthXSkmJl8uaXNTdHJpbmcoaCkmJihmLmZhY2V0W2FdPXsidmFyIjpofSk7ZWxzZSBmLmZhY2V0PXt0eXBlOiJub25lIn07Zi5jb29yZHx8KGYuY29vcmQ9e3R5cGU6ImNhcnRlc2lhbiIsZmxpcDohMX0pO18uaXNTdHJpbmcoZi5kb20pJiYoZi5kb209ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZi5kb20pKTtyZXR1cm4gZn07Yy5zcGVjLmNoZWNrPQpmdW5jdGlvbihmKXt2YXIgcyxoLGIsYSxkO2lmKG51bGw9PWYubGF5ZXJzfHwwPT09Zi5sYXllcnMubGVuZ3RoKXRocm93IGMuZXJyb3IuZGVmbigiTm8gbGF5ZXJzIGFyZSBkZWZpbmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uLiIpO2Q9Zi5sYXllcnM7cz1iPTA7Zm9yKGE9ZC5sZW5ndGg7YjxhO3M9KytiKXtoPWRbc107aWYobnVsbD09aC5kYXRhKXRocm93IGMuZXJyb3IuZGVmbigiTGF5ZXIgIisocysxKSsiIGRvZXMgbm90IGhhdmUgZGF0YSB0byBwbG90ISIpO2lmKCFoLmRhdGEuaXNEYXRhKXRocm93IGMuZXJyb3IuZGVmbigiRGF0YSBtdXN0IGJlIGEgUG9seWNoYXJ0IERhdGEgb2JqZWN0LiIpO31pZigobnVsbD09Zi5yZW5kZXJ8fCExIT09Zi5yZW5kZXIpJiYhZi5kb20pdGhyb3cgYy5lcnJvci5kZWZuKCJObyBET00gZWxlbWVudCBzcGVjaWZpZWQuIFdoZXJlIHRvIG1ha2UgcGxvdD8iKTtyZXR1cm4gZn19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe2MueGhyPWZ1bmN0aW9uKGMsCnMsaCl7dmFyIGI7Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7Mz5hcmd1bWVudHMubGVuZ3RoPyhoPXMscz1udWxsKTpzJiZiLm92ZXJyaWRlTWltZVR5cGUmJmIub3ZlcnJpZGVNaW1lVHlwZShzKTtiLm9wZW4oIkdFVCIsYywhMCk7cyYmYi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHMpO2Iub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dmFyIGE7aWYoND09PWIucmVhZHlTdGF0ZSlyZXR1cm4gYT1iLnN0YXR1cyxhPSFhJiZiLnJlc3BvbnNlfHwyMDA8PWEmJjMwMD5hfHwzMDQ9PT1hP2I6bnVsbCxoKGEpfTtyZXR1cm4gYi5zZW5kKG51bGwpfTtjLnRleHQ9ZnVuY3Rpb24oZixzLGgpezM+YXJndW1lbnRzLmxlbmd0aCYmKGg9cyxzPW51bGwpO3JldHVybiBjLnhocihmLHMsZnVuY3Rpb24oYil7cmV0dXJuIGgoYiYmYi5yZXNwb25zZVRleHQpfSl9O2MuanNvbj1mdW5jdGlvbihmLHMpe3JldHVybiBjLnRleHQoZiwiYXBwbGljYXRpb24vanNvbiIsZnVuY3Rpb24oYyl7cmV0dXJuIHMoYz8KSlNPTi5wYXJzZShjKTpudWxsKX0pfTtjLmRzdj1mdW5jdGlvbihmLHMpe3ZhciBoLGIsYSxkLGUsayxuO249UmVnRXhwKCJcclxufFsiK2YrIlxyXG5dIiwiZyIpO2s9UmVnRXhwKCdbIicrZisiXG5dIik7aD1mLmNoYXJDb2RlQXQoMCk7YT1mdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZCkuam9pbihmKX07ZD1mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbCE9KGI9ay50ZXN0KGEpKT9iOiciJythLnJlcGxhY2UoL1wiL2csJyIiJykreyciJzphfX07ZT1udWxsO2I9ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYy50ZXh0KGEscyxmdW5jdGlvbihhKXtyZXR1cm4gZChhJiZiLnBhcnNlKGEpKX0pfTtiLnBhcnNlPWZ1bmN0aW9uKGEpe3JldHVybiBiLnBhcnNlUm93cyhhLGZ1bmN0aW9uKGEsYil7dmFyIGMsbCxnO2lmKGIpe2c9e307Yz0tMTtmb3IobD1lLmxlbmd0aDsrK2M8bDspZ1tlW2NdXT1hW2NdO3JldHVybiBnfWU9YTtyZXR1cm4gbnVsbH0pfTtiLnBhcnNlUm93cz1mdW5jdGlvbihhLApiKXt2YXIgYyxkLGwsZyx3LHUsdCxlO2Q9e307Yz17fTt1PVtdO3c9MDtnPXQ9bnVsbDtuLmxhc3RJbmRleD0wO2ZvcihlPWZ1bmN0aW9uKCl7dmFyIGIsdCxsO2lmKG4ubGFzdEluZGV4Pj1hLmxlbmd0aClyZXR1cm4gYztpZihnKXJldHVybiBnPSExLGQ7bD1uLmxhc3RJbmRleDtpZigzND09PWEuY2hhckNvZGVBdChsKSl7Zm9yKHQ9bDt0Kys8YS5sZW5ndGg7KWlmKDM0PT09YS5jaGFyQ29kZUF0KHQpKXtpZigzNCE9PWEuY2hhckNvZGVBdCh0KzEpKWJyZWFrO3QrK31uLmxhc3RJbmRleD10KzI7Yj1hLmNoYXJDb2RlQXQodCsxKTsxMz09PWI/KGc9ITAsMTA9PT1hLmNoYXJDb2RlQXQodCsyKSYmbi5sYXN0SW5kZXgrKyk6MTA9PT1iJiYoZz0hMCk7cmV0dXJuIGEuc3Vic3RyaW5nKGwrMSx0KS5yZXBsYWNlKC8iIi9nLCciJyl9aWYoYj1uLmV4ZWMoYSkpcmV0dXJuIGc9YlswXS5jaGFyQ29kZUF0KDApIT09aCxhLnN1YnN0cmluZyhsLGIuaW5kZXgpO24ubGFzdEluZGV4PWEubGVuZ3RoOwpyZXR1cm4gYS5zdWJzdHJpbmcobCl9Oyh0PWUoKSkhPT1jOyl7Zm9yKGw9W107dCE9PWQmJnQhPT1jOylsLnB1c2godCksdD1lKCk7YiYmIShsPWIobCx3KyspKXx8dS5wdXNoKGwpfXJldHVybiB1fTtiLmZvcm1hdD1mdW5jdGlvbihiKXtyZXR1cm4gYi5tYXAoYSkuam9pbigiXG4iKX07cmV0dXJuIGJ9O2MuY3N2PWMuZHN2KCIsIiwidGV4dC9jc3YiKX0pLmNhbGwodGhpcyk7KGZ1bmN0aW9uKCl7dmFyIGYscyxoLGIsYSxkLGUsayxuLHAsbSxyLHEsbCxnLHcsdSx0LHosRSxBLEcsQyx5LEIsdix4LEQsRixJLE4sTyxKLEssTD1bXS5zbGljZSxNPXt9Lmhhc093blByb3BlcnR5LEg9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7dGhpcy5jb25zdHJ1Y3Rvcj1hfWZvcih2YXIgZyBpbiBiKU0uY2FsbChiLGcpJiYoYVtnXT1iW2ddKTtjLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLl9fc3VwZXJfXz1iLnByb3RvdHlwZTtyZXR1cm4gYX07Sj1mdW5jdGlvbihhLApiKXt2YXIgYyxnLHQsbDtjPWEubGVuZ3RoO2w9WyciJywiJyJdO2c9MDtmb3IodD1sLmxlbmd0aDtnPHQ7ZysrKWlmKGI9bFtnXSxhWzBdPT09YiYmYVtjLTFdPT09YilyZXR1cm4gYS5zbGljZSgxLCsoYy0yKSsxfHw5RTkpO3JldHVybiBhfTtLPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3ZhciBnLHQsbCxkLHU7dT1bXTtnPWw9MDtmb3IoZD1iLmxlbmd0aDtsPGQ7Zz0rK2wpdD1iW2ddLHUucHVzaChhKHQsY1tnXSkpO3JldHVybiB1fX0oZnVuY3Rpb24oYSxiKXtyZXR1cm5bYSxiXX0pO3I9ZnVuY3Rpb24oYSl7dmFyIGIsYyxnLHQsbDtjPXt9O3Q9MDtmb3IobD1hLmxlbmd0aDt0PGw7dCsrKWc9YVt0XSxiPWdbMF0sZz1nWzFdLGNbYl09ZztyZXR1cm4gY307Zz1mdW5jdGlvbihhLGIsYyl7bnVsbD09YyYmKGM9bnVsbCk7cmV0dXJuIGIgaW4gYSYmYVtiXXx8Y307dz1mdW5jdGlvbihhLGIpe3ZhciBjLHQsbDt0PXt9O2ZvcihsIGluIGIpYz1iW2xdLGM9ZyhhLGwsCmMpLG51bGwhPT1jJiYodFtsXT1jKTtyZXR1cm4gdH07RT1mdW5jdGlvbihhKXt2YXIgYixjLHQsbCxkO2M9e307bD0wO2ZvcihkPWEubGVuZ3RoO2w8ZDtsKyspZm9yKHQgaW4gYj1hW2xdLGIpY1t0XT1iW3RdLmNvbmNhdChnKGMsdCxbXSkpO3JldHVybiBjfTtxPWZ1bmN0aW9uKGEsYil7dmFyIGMsZyx0LGwsZDtudWxsPT1iJiYoYj1mdW5jdGlvbihhKXtyZXR1cm4gYX0pO2M9e307bD0wO2ZvcihkPWEubGVuZ3RoO2w8ZDtsKyspZz1hW2xdLGNbYihnKV09ZztsPVtdO2Zvcih0IGluIGMpZz1jW3RdLGwucHVzaChnKTtyZXR1cm4gbH07bD1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIHEoYixmdW5jdGlvbihiKXtyZXR1cm4gYlthXX0pfX07RD1mdW5jdGlvbihhLGIpe3JldHVybiIiK2ErIigiK2IrIikifTtGPWZ1bmN0aW9uKGEpe3JldHVybiJbIithKyJdIn07bj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7dmFyIGMsZyx0LGw7bD1bXTtnPTA7Zm9yKHQ9Yi5sZW5ndGg7ZzwKdDtnKyspYz1iW2ddLGwucHVzaChjKTt0aGlzLmJ1ZmZlcj1sLnJldmVyc2UoKX1hLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5idWZmZXIubGVuZ3RofTthLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1wdHkoKT9udWxsOnRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyLmxlbmd0aC0xXX07YS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1wdHkoKT9udWxsOnRoaXMuYnVmZmVyLnBvcCgpfTthLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBEKCJTdHJlYW0iLEYoTC5jYWxsKHRoaXMuYnVmZmVyKS5yZXZlcnNlKCkpKX07cmV0dXJuIGF9KCk7bT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7dGhpcy50YWc9Yn1hLlRhZz17c3ltYm9sOiJzeW1ib2wiLGxpdGVyYWw6ImxpdGVyYWwiLGxwYXJlbjoiKCIscnBhcmVuOiIpIixjb21tYToiLCJ9O2EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIjwiKwp0aGlzLmNvbnRlbnRzKCkudG9TdHJpbmcoKSsiPiJ9O2EucHJvdG90eXBlLmNvbnRlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMudGFnXX07cmV0dXJuIGF9KCk7cD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3RoaXMubmFtZT1hO3RoaXMubmFtZT1KKHRoaXMubmFtZSk7Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLG0uVGFnLnN5bWJvbCl9SChiLGEpO2IucHJvdG90eXBlLmNvbnRlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIGIuX19zdXBlcl9fLmNvbnRlbnRzLmNhbGwodGhpcykuY29uY2F0KFt0aGlzLm5hbWVdKX07cmV0dXJuIGJ9KG0pO2U9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLnZhbD1hO3RoaXMudmFsPUoodGhpcy52YWwpO2IuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxtLlRhZy5saXRlcmFsKX1IKGIsYSk7Yi5wcm90b3R5cGUuY29udGVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gYi5fX3N1cGVyX18uY29udGVudHMuY2FsbCh0aGlzKS5jb25jYXQoW3RoaXMudmFsXSl9OwpyZXR1cm4gYn0obSk7Yj1mdW5jdGlvbigpe3ZhciBhLGIsYyxnO2M9W20uVGFnLmxwYXJlbixtLlRhZy5ycGFyZW4sbS5UYWcuY29tbWFdO2c9W107YT0wO2ZvcihiPWMubGVuZ3RoO2E8YjthKyspST1jW2FdLGcucHVzaChuZXcgbShJKSk7cmV0dXJuIGd9KCk7ZD1iWzBdO2s9YlsxXTtzPWJbMl07Tz1bWy9eXCgvLGZ1bmN0aW9uKCl7cmV0dXJuIGR9XSxbL15cKS8sZnVuY3Rpb24oKXtyZXR1cm4ga31dLFsvXiwvLGZ1bmN0aW9uKCl7cmV0dXJuIHN9XSxbL15bKy1dPygweFswLTlhLWZBLUZdK3wwP1wuXGQrfFsxLTldXGQqKFwuXGQrKT98MCkoW2VFXVsrLV0/XGQrKT8vLGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgZShhKX1dLFsvXihcd3xbXlx1MDAwMC1cdTAwODBdKSt8JygoXFwuKXxbXlxcJ10pKyd8IigoXFwuKXxbXlxcIl0pKyIvLGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgcChhKX1dXTt6PWZ1bmN0aW9uKGEpe3ZhciBiLGcsdCxsO3Q9MDtmb3IobD1PLmxlbmd0aDt0PGw7dCsrKWlmKGc9Ck9bdF0sYj1nWzBdLGc9Z1sxXSxiPWIuZXhlYyhhKSlyZXR1cm4gdD1iWzBdLFthLnNsaWNlKHQubGVuZ3RoKSxnKHQpXTt0aHJvdyBjLmVycm9yLmRlZm4oIlRoZXJlIGlzIGFuIGVycm9yIGluIHlvdXIgc3BlY2lmaWNhdGlvbiBhdCAiK2EpO307Tj1mdW5jdGlvbihhKXt2YXIgYixjO2ZvcihjPVtdOzspe2E9YS5yZXBsYWNlKC9eXHMrLywiIik7aWYoIWEpYnJlYWs7Yj16KGEpO2E9YlswXTtiPWJbMV07Yy5wdXNoKGIpfXJldHVybiBjfTtiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31hLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBEKHRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvbnRlbnRzKCkpfTtyZXR1cm4gYX0oKTthPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dGhpcy5uYW1lPWF9SChiLGEpO2IucHJvdG90eXBlLmNvbnRlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMubmFtZV19O2IucHJvdG90eXBlLnByZXR0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9OwpiLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbihhKXtyZXR1cm4gYS5pZGVudCh0aGlzLHRoaXMubmFtZSl9O3JldHVybiBifShiKTtoPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dGhpcy52YWw9YX1IKGIsYSk7Yi5wcm90b3R5cGUuY29udGVudHM9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy52YWxdfTtiLnByb3RvdHlwZS5wcmV0dHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx9O2IucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKGEpe3JldHVybiBhWyJjb25zdCJdKHRoaXMsdGhpcy52YWwpfTtyZXR1cm4gYn0oYik7Zj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYyl7dGhpcy5mbmFtZT1hO3RoaXMuYXJncz1jfUgoYixhKTtiLnByb3RvdHlwZS5jb250ZW50cz1mdW5jdGlvbigpe3JldHVyblt0aGlzLmZuYW1lLEYodGhpcy5hcmdzKV19O2IucHJvdG90eXBlLnByZXR0eT1mdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5mbmFtZSxjLGcsdCxsO3Q9dGhpcy5hcmdzO2w9W107Yz0wO2ZvcihnPQp0Lmxlbmd0aDtjPGc7YysrKWE9dFtjXSxsLnB1c2goYS5wcmV0dHkoKSk7cmV0dXJuIEQoYixsKX07Yi5wcm90b3R5cGUudmlzaXQ9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGEuY2FsbCh0aGlzLHRoaXMuZm5hbWUsZnVuY3Rpb24oKXt2YXIgYyxnLHQsbDt0PXRoaXMuYXJncztsPVtdO2M9MDtmb3IoZz10Lmxlbmd0aDtjPGc7YysrKWI9dFtjXSxsLnB1c2goYi52aXNpdChhKSk7cmV0dXJuIGx9LmNhbGwodGhpcykpfTtyZXR1cm4gYn0oYik7dT1mdW5jdGlvbihhLGIsYyl7dmFyIGcsdCxsLGQ7dD1hLnBlZWsoKTtpZihudWxsIT09dClmb3IobD0wLGQ9Yy5sZW5ndGg7bDxkO2wrKylpZihnPWNbbF0sST1nWzBdLGc9Z1sxXSx0LnRhZz09PUkpcmV0dXJuIGcoYSk7cmV0dXJuIGIoYSl9O3Y9ZnVuY3Rpb24oYSl7dGhyb3cgYy5lcnJvci5kZWZuKCJUaGVyZSBpcyBhbiBlcnJvciBpbiB5b3VyIHNwZWNpZmljYXRpb24gYXQgIithLnRvU3RyaW5nKCkpO307QT1mdW5jdGlvbihhKXt2YXIgYjsKYj1uZXcgbihOKGEpKTthPUIoYik7aWYobnVsbCE9PWIucGVlaygpKXRocm93IGMuZXJyb3IuZGVmbigiVGhlcmUgaXMgYW4gZXJyb3IgaW4geW91ciBzcGVjaWZpY2F0aW9uIGF0ICIrYi50b1N0cmluZygpKTtyZXR1cm4gYX07Qj1mdW5jdGlvbihhKXtyZXR1cm4gdShhLHYsW1ttLlRhZy5saXRlcmFsLHldLFttLlRhZy5zeW1ib2wseF1dKX07eT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGgoYS5nZXQoKS52YWwpfTt4PWZ1bmN0aW9uKGIpe3ZhciBjO2M9Yi5nZXQoKS5uYW1lO3JldHVybiB1KGIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEoYyl9LFtbbS5UYWcubHBhcmVuLEcoYyldXSl9O0c9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2IuZ2V0KCk7Yj11KGIsQyhbXSksW1ttLlRhZy5ycGFyZW4sZnVuY3Rpb24oYSl7YS5nZXQoKTtyZXR1cm5bXX1dXSk7cmV0dXJuIG5ldyBmKGEsYil9fTtDPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYyxnO2M9QihiKTsKZz1hLmNvbmNhdChbY10pO3JldHVybiB1KGIsdixbW20uVGFnLnJwYXJlbixmdW5jdGlvbihhKXthLmdldCgpO3JldHVybiBnfV0sW20uVGFnLmNvbW1hLGZ1bmN0aW9uKGEpe2EuZ2V0KCk7cmV0dXJuIEMoZykoYSl9XV0pfX07dD1mdW5jdGlvbihhKXt2YXIgYjtiPXt0cmFuczpbXSxzdGF0OltdfTthLnZpc2l0KHtpZGVudDpmdW5jdGlvbihhLGIpe3JldHVybiBifSwiY29uc3QiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9LGNhbGw6ZnVuY3Rpb24oYSxnLHQpe3ZhciBsLGQ7ZD1nIGluIGNbImNvbnN0Il0udHJhbnM/InRyYW5zIjpnIGluIGNbImNvbnN0Il0uc3RhdD8ic3RhdCI6Im5vbmUiO2lmKCJub25lIiE9PWQpcmV0dXJuIGw9Y1siY29uc3QiXVtkXVtnXSx0PXIoSyhsLHQpKSx0Lm5hbWU9YS5wcmV0dHkoKSx0W2RdPWcsYltkXS5wdXNoKHQpLHQubmFtZTt0aHJvdyBjLmVycm9yLmRlZm4oIlRoZSBvcGVyYXRpb24gIitnKyIgaXMgbm90IHJlY29nbml6ZWQuIFBsZWFzZSBjaGVjayB5b3VyIHNwZWNpZmljYXRpb25zLiIpOwp9fSk7cmV0dXJuIGJ9O2MucGFyc2VyPXt0b2tlbml6ZTpOLHBhcnNlOkEsbGF5ZXJUb0RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgZyxkLHUsZSx2LHgseixELG0sRjtudWxsPT1iJiYoYj1bXSk7dj17fTt6PW51bGwhPShtPWEuZmlsdGVyKT9tOnt9O2ZvcihkIGluIHopbT16W2RdLHZbQShkKS5wcmV0dHkoKV09bTt4PVtdO3o9MDtmb3IobT1iLmxlbmd0aDt6PG07eisrKWQ9Ylt6XSx4LnB1c2goQShkWyJ2YXIiXSkucHJldHR5KCkpO2I9eDtnPV8ucGljayhhLGNbImNvbnN0Il0uYWVzKTtmb3IoZCBpbiBnKSJ2YXIiaW4gZ1tkXXx8ZGVsZXRlIGdbZF07Rj1bXTttPVtdO3g9W107ej17fTtmb3IoZCBpbiBnKXU9Z1tkXSwiY291bnQoKikiPT09dVsidmFyIl0/bS5wdXNoKHVbInZhciJdKTooZT1BKHVbInZhciJdKSx1WyJ2YXIiXT1lLnByZXR0eSgpLGU9dChlKSxGLnB1c2goZSksbS5wdXNoKHVbInZhciJdKSwwPT09ZS5zdGF0Lmxlbmd0aCYmeC5wdXNoKHVbInZhciJdKSwic29ydCJpbgp1JiYoZT13KHUsY1siY29uc3QiXS5tZXRhcyksImNvdW50KCopIj09PWUuc29ydD9EPXtzb3J0OiJjb3VudCgqKSIsYXNjOmUuYXNjLHN0YXQ6W10sdHJhbnM6W119OihEPUEoZS5zb3J0KSxlLnNvcnQ9RC5wcmV0dHkoKSxEPXQoRCkpLDAhPT1ELnN0YXQubGVuZ3RoJiYoZS5zdGF0PUQuc3RhdFswXSkselt1WyJ2YXIiXV09ZSkpO2c9MDtmb3IodT1iLmxlbmd0aDtnPHU7ZysrKWlmKGQ9YltnXSxlPUEoZCksZD1lLnByZXR0eSgpLGU9dChlKSxGLnB1c2goZSksbS5wdXNoKGQpLDA9PT1lLnN0YXQubGVuZ3RoKXgucHVzaChkKTtlbHNlIHRocm93IGMuZXJyb3IuZGVmbigiRmFjZXQgdmFyaWFibGUgc2hvdWxkIG5vdCBjb250YWluIHN0YXRpc3RpY3MhIik7Rj1FKEYpO2Q9bCgibmFtZSIpO3g9e3N0YXRzOmQoRi5zdGF0KSxncm91cHM6cSh4KX07cmV0dXJue3RyYW5zOmQoRi50cmFucyksc3RhdHM6eCxtZXRhOnosc2VsZWN0OnEobSksZmlsdGVyOnZ9fX19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLApzLGgsYixhLGQ9e30uaGFzT3duUHJvcGVydHksZT1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt0aGlzLmNvbnN0cnVjdG9yPWF9Zm9yKHZhciBlIGluIGIpZC5jYWxsKGIsZSkmJihhW2VdPWJbZV0pO2MucHJvdG90eXBlPWIucHJvdG90eXBlO2EucHJvdG90eXBlPW5ldyBjO2EuX19zdXBlcl9fPWIucHJvdG90eXBlO3JldHVybiBhfSxrPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX07cz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7dmFyIGM7dGhpcy5zcGVjPWI7bnVsbD09dGhpcy5zcGVjJiYodGhpcy5zcGVjPXt9KTt0aGlzLmZsaXA9bnVsbCE9KGM9dGhpcy5zcGVjLmZsaXApP2M6ITE7dGhpcy5zY2FsZXM9bnVsbDtiPXRoaXMuZmxpcD9bInkiLCJ4Il06WyJ4IiwieSJdO3RoaXMueD1iWzBdO3RoaXMueT1iWzFdfWEucHJvdG90eXBlLm1ha2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGltcz1hfTthLnByb3RvdHlwZS5zZXRTY2FsZXM9CmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNjYWxlcz17eDphLnguZix5OmEueS5mfX07YS5wcm90b3R5cGUuY2xpcHBpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuW2EueCxhLnksdGhpcy5kaW1zLmVhY2hXaWR0aCx0aGlzLmRpbXMuZWFjaEhlaWdodF19O2EucHJvdG90eXBlLmdldFNjYWxlPWZ1bmN0aW9uKGEpe307YS5wcm90b3R5cGUucmFuZ2VzPWZ1bmN0aW9uKCl7fTtyZXR1cm4gYX0oKTtmPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoKXtyZXR1cm4gYj1kLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZShkLGEpO2QucHJvdG90eXBlLnR5cGU9ImNhcnRlc2lhbiI7ZC5wcm90b3R5cGUuZ2V0U2NhbGU9ZnVuY3Rpb24oYSl7aWYoIngiPT09YXx8InkiPT09YSlyZXR1cm4gdGhpcy5zY2FsZXNbdGhpc1thXV07dGhyb3cgYy5lcnJvci5pbnB1dCgiQ29vcmRpbmF0ZXMgb25seSBrZWVwIHggJiB5IHNjYWxlcyIpO307ZC5wcm90b3R5cGUucmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGE7CmE9e307YVt0aGlzLnhdPXttaW46MCxtYXg6dGhpcy5kaW1zLmVhY2hXaWR0aH07YVt0aGlzLnldPXttaW46dGhpcy5kaW1zLmVhY2hIZWlnaHQsbWF4OjB9O3JldHVybiBhfTtkLnByb3RvdHlwZS5heGlzVHlwZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpc1thXX07ZC5wcm90b3R5cGUuZ2V0WFk9ZnVuY3Rpb24oYSxiKXt2YXIgYyxsO2lmKGEpcmV0dXJuIGM9e3g6Xy5pc0FycmF5KGIueCk/Xy5tYXAoYi54LHRoaXMuc2NhbGVzLngpOnRoaXMuc2NhbGVzLngoYi54KSx5Ol8uaXNBcnJheShiLnkpP18ubWFwKGIueSx0aGlzLnNjYWxlcy55KTp0aGlzLnNjYWxlcy55KGIueSl9LHt4OmNbdGhpcy54XSx5OmNbdGhpcy55XX07Yz10aGlzLnNjYWxlc1t0aGlzLnhdO2w9dGhpcy5zY2FsZXNbdGhpcy55XTtyZXR1cm57eDpfLmlzQXJyYXkoYi54KT9fLm1hcChiLngsYyk6YyhiLngpLHk6Xy5pc0FycmF5KGIueSk/Xy5tYXAoYi55LGwpOmwoYi55KX19O2QucHJvdG90eXBlLmdldEFlcz1mdW5jdGlvbihhLApiLGMpe3JldHVybnt4OmMueChhW3RoaXMueF0sYlt0aGlzLnhdKSx5OmMueShhW3RoaXMueV0sYlt0aGlzLnldKX19O3JldHVybiBkfShzKTtoPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXt0aGlzLmdldFhZPWsodGhpcy5nZXRYWSx0aGlzKTtyZXR1cm4gYT1kLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZShkLGIpO2QucHJvdG90eXBlLnR5cGU9InBvbGFyIjtkLnByb3RvdHlwZS5tYWtlPWZ1bmN0aW9uKGEpe3RoaXMuZGltcz1hO3RoaXMuY3g9dGhpcy5kaW1zLmVhY2hXaWR0aC8yO3JldHVybiB0aGlzLmN5PXRoaXMuZGltcy5lYWNoSGVpZ2h0LzJ9O2QucHJvdG90eXBlLmdldFNjYWxlPWZ1bmN0aW9uKGEpe2lmKCJyIj09PWEpcmV0dXJuIHRoaXMuc2NhbGVzW3RoaXMueF07aWYoInQiPT09YSlyZXR1cm4gdGhpcy5zY2FsZXNbdGhpcy55XTt0aHJvdyBjLmVycm9yLmlucHV0KCJDb29yZGluYXRlcyBvbmx5IGtlZXAgciAmIHQgc2NhbGVzIik7Cn07ZC5wcm90b3R5cGUucmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGEsYixjO2I9W3RoaXMueCx0aGlzLnldO2E9YlswXTtjPWJbMV07Yj17fTtiW2NdPXttaW46MCxtYXg6MipNYXRoLlBJfTtiW2FdPXttaW46MCxtYXg6TWF0aC5taW4odGhpcy5kaW1zLmVhY2hXaWR0aCx0aGlzLmRpbXMuZWFjaEhlaWdodCkvMi0xMH07cmV0dXJuIGJ9O2QucHJvdG90eXBlLmF4aXNUeXBlPWZ1bmN0aW9uKGEpe3JldHVybiJ4Ij09PXRoaXNbYV0/InIiOiJ0In07ZC5wcm90b3R5cGUuZ2V0WFk9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGcsdyx1LHQsZSxrLEEsZixuLHksQix2LHg9dGhpcztmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHguY3grYSpNYXRoLmNvcyhiLU1hdGguUEkvMil9O249ZnVuY3Rpb24oYSxiKXtyZXR1cm4geC5jeSthKk1hdGguc2luKGItTWF0aC5QSS8yKX07dz1bdGhpcy54LHRoaXMueV07dT13WzBdO2U9d1sxXTtpZihhKXtpZihfLmlzQXJyYXkoYlt1XSkpe3c9e3g6W10seTpbXSxyOltdLAp0OltdfTtCPWJbdV07ZD1jPTA7Zm9yKHk9Qi5sZW5ndGg7Yzx5O2Q9KytjKXQ9QltkXSx0PXRoaXMuc2NhbGVzW3VdKHQpLGs9dGhpcy5zY2FsZXNbZV0oYltlXVtkXSksdy54LnB1c2goZih0LGspKSx3LnkucHVzaChuKHQsaykpLHcuci5wdXNoKHQpLHcudC5wdXNoKGspO3JldHVybiB3fXQ9dGhpcy5zY2FsZXNbdV0oYlt1XSk7az10aGlzLnNjYWxlc1tlXShiW2VdKTtyZXR1cm57eDpmKHQsaykseTpuKHQsaykscjp0LHQ6a319Zz1mdW5jdGlvbihhKXtyZXR1cm4gXy5pc09iamVjdChhKSYmInNjYWxlZm4iPT09YS50JiYiaWRlbnRpdHkiPT09YS5mfTtjPWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtjPWcoYSk7ZD1nKGIpO2lmKGMmJiFkKXJldHVybnt4OmEudix5Om4oeC5zY2FsZXNbdV0oYiksMCl9O2lmKGMmJmQpcmV0dXJue3g6YS52LHk6Yi52fTtpZighYyYmZClyZXR1cm57eTpiLnYseDpuKHguc2NhbGVzW2VdKGEpLDApfTt0PXguc2NhbGVzW3VdKGIpO2s9eC5zY2FsZXNbZV0oYSk7CnJldHVybnt4OmYodCxrKSx5Om4odCxrKX19O2lmKF8uaXNBcnJheShiLngpKXt3PXt4OltdLHk6W119O3Y9Yi54O2Q9eT0wO2ZvcihCPXYubGVuZ3RoO3k8QjtkPSsreSlBPXZbZF0sZD1iLnlbZF0sQT1jKEEsZCksZD1BLngsQT1BLnksdy54LnB1c2goZCksdy55LnB1c2goQSk7cmV0dXJuIHd9cmV0dXJuIGMoYi54LGIueSl9O3JldHVybiBkfShzKTtjLmNvb3JkPXtjYXJ0ZXNpYW46ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBmKGEpfSxwb2xhcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGgoYSl9fTtjLmNvb3JkLm1ha2U9ZnVuY3Rpb24oYSl7aWYobnVsbD09YXx8bnVsbD09YS50eXBlKXJldHVybiBjLmNvb3JkLmNhcnRlc2lhbigpO3N3aXRjaChhLnR5cGUpe2Nhc2UgImNhcnRlc2lhbiI6cmV0dXJuIGMuY29vcmQuY2FydGVzaWFuKGEpO2Nhc2UgInBvbGFyIjpyZXR1cm4gYy5jb29yZC5wb2xhcihhKTtkZWZhdWx0OnRocm93IGMuZXJyb3IuZGVmbigiTm8gc3VjaCBjb29yZGluYXRlIHR5cGUgIisKYS50eXBlKyIuIik7fX19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLHMsaCxiLGEsZCxlLGssbixwPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5sZW5ndGg7YjxjO2IrKylpZihiIGluIHRoaXMmJnRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfTtiPWNbImNvbnN0Il0uYWVzO2MuZG9tYWluPXt9O2MuZG9tYWluLm1ha2U9ZnVuY3Rpb24oYSxiLGQsbCl7dmFyIGcsZSx1O2c9W107Zm9yKHUgaW4gYSllPWFbdV0sZy5wdXNoKGsoZS5nZW9tcyxiW3VdLGQsbCkpO3JldHVybiBjLmRvbWFpbi5tZXJnZShnKX07Yy5kb21haW4uY29tcGFyZT1mdW5jdGlvbihhKXtyZXR1cm4gYT8iY2F0Ij09PWEudHlwZT9mdW5jdGlvbihiLGMpe2I9Xy5pbmRleE9mKGEubGV2ZWxzLGIpO2M9Xy5pbmRleE9mKGEubGV2ZWxzLGMpO3JldHVybi0xPT09Yj8xOi0xPT09Yz8tMTpiPGM/LTE6Yj5jPzE6MH06Yy50eXBlLmNvbXBhcmUoYS50eXBlKTpmdW5jdGlvbihhKXtyZXR1cm4gYX19OwpoPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe3RoaXMudHlwZT1hLnR5cGU7dGhpcy5taW49YS5taW47dGhpcy5tYXg9YS5tYXg7dGhpcy5idz1hLmJ3fX0oKTtzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe3RoaXMudHlwZT1hLnR5cGU7dGhpcy5taW49YS5taW47dGhpcy5tYXg9YS5tYXg7dGhpcy5idz1hLmJ3fX0oKTtmPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe3RoaXMudHlwZT1hLnR5cGU7dGhpcy5sZXZlbHM9YS5sZXZlbHM7dGhpcy5zb3J0ZWQ9YS5zb3J0ZWR9fSgpO2U9ZnVuY3Rpb24oYSl7ImNhdCIhPT1hLnR5cGUmJmEubWF4PT09YS5taW4mJihhLmJ3PyhhLm1heCs9YS5idyxhLm1pbi09YS5idyk6MD09PWEubWF4P2EubWF4Kz0xOihhLm1heCo9MS4xLGEubWluLz0xLjEpKTtzd2l0Y2goYS50eXBlKXtjYXNlICJudW0iOnJldHVybiBuZXcgaChhKTtjYXNlICJkYXRlIjpyZXR1cm4gbmV3IHMoYSk7Y2FzZSAiY2F0IjpyZXR1cm4gbmV3IGYoYSl9fTsKaz1mdW5jdGlvbihhLGIsayxsKXt2YXIgZyx3LHUsdCx6LGYsQSxuLEMseSxCLHYseCxELEYsSSxoLHMsSixLLEwsTSxIO3U9e307Zm9yKGcgaW4gYilpZihmPWJbZ10sISgwPD1wLmNhbGwoY1siY29uc3QiXS5ub0RvbWFpbixnKSkpaWYobCl1W2ddPWUoa1tnXSk7ZWxzZXtBPWQoYSxnKTtpZigwPT09QS5sZW5ndGgpdGhyb3cgYy5lcnJvci5pbnB1dCgiRGF0YXNldCBpcyBub25lPyIpO3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWtbZ10/a1tnXVthXTpudWxsfTtzd2l0Y2goZi50eXBlKXtjYXNlICJudW0iOnc9bnVsbCE9KG49dCgiYnciKSk/bjpmLmJ3O2lmKDE8QS5sZW5ndGgpZj1udWxsIT0oQz10KCJtaW4iKSk/QzpfLm1pbihBKSx6PW51bGwhPShJPXQoIm1heCIpKT9JOl8ubWF4KEEpKyhudWxsIT13P3c6MCk7ZWxzZSBpZigxPT09QS5sZW5ndGgpe2RlYnVnZ2VyO3c/KGY9bnVsbCE9KGg9dCgibWluIikpP2g6QVswXSx6PW51bGwhPShzPXQoIm1heCIpKT9zOkFbMF0rCncpOihmPW51bGwhPShKPXQoIm1pbiIpKT9KOkFbMF0tMSx6PW51bGwhPShLPXQoIm1heCIpKT9LOkFbMF0rMSl9ZWxzZSBmPW51bGwhPShMPXQoIm1pbiIpKT9MOjAsej1udWxsIT0oTT1udWxsIT0oSD10KCJtYXgiKSk/SDp3KT9NOjE7dVtnXT1lKHt0eXBlOiJudW0iLG1pbjpmLG1heDp6LGJ3Ond9KTticmVhaztjYXNlICJkYXRlIjp3PW51bGwhPSh5PXQoImJ3IikpP3k6Zi5idztmPW51bGwhPShCPXQoIm1pbiIpKT9COl8ubWluKEEpO3o9dCgibWF4Iik7bnVsbD09eiYmKHo9Xy5tYXgoQSksej1mdW5jdGlvbigpe3N3aXRjaCh3KXtjYXNlICJ3ZWVrIjpyZXR1cm4gbW9tZW50LnVuaXgoeikuYWRkKCJkYXlzIiw3KS51bml4KCk7Y2FzZSAidHdvbW9udGgiOnJldHVybiBtb21lbnQudW5peCh6KS5hZGQoIm1vbnRocyIsMikudW5peCgpO2Nhc2UgInF1YXJ0ZXIiOnJldHVybiBtb21lbnQudW5peCh6KS5hZGQoIm1vbnRocyIsNCkudW5peCgpO2Nhc2UgInNpeG1vbnRoIjpyZXR1cm4gbW9tZW50LnVuaXgoeikuYWRkKCJtb250aHMiLAo2KS51bml4KCk7Y2FzZSAidHdveWVhciI6cmV0dXJuIG1vbWVudC51bml4KHopLmFkZCgieWVhcnMiLDIpLnVuaXgoKTtjYXNlICJmaXZleWVhciI6cmV0dXJuIG1vbWVudC51bml4KHopLmFkZCgieWVhcnMiLDUpLnVuaXgoKTtjYXNlICJkZWNhZGUiOnJldHVybiBtb21lbnQudW5peCh6KS5hZGQoInllYXJzIiwxMCkudW5peCgpO2RlZmF1bHQ6cmV0dXJuIG1vbWVudC51bml4KHopLmFkZCh3KyJzIiwxKS51bml4KCl9fSgpKTt1W2ddPWUoe3R5cGU6ImRhdGUiLG1pbjpmLG1heDp6LGJ3Ond9KTticmVhaztjYXNlICJjYXQiOnVbZ109ZSh7dHlwZToiY2F0IixsZXZlbHM6bnVsbCE9KHY9bnVsbCE9KHg9dCgibGV2ZWxzIikpP3g6Zi5sZXZlbHMpP3Y6Xy51bmlxKEEpLHNvcnRlZDpudWxsIT0oRD1udWxsIT0oRj10KCJsZXZlbHMiKSk/RjpmLnNvcnRlZCk/RDohMX0pfX1yZXR1cm4gdX07ZD1mdW5jdGlvbihhLGIpe3ZhciBkLGwsZyxlLHU7ZT1bXTtmb3IobCBpbiBhKWZvcihnIGluIGQ9CmFbbF0sdT1kLm1hcmtzLHUpZD11W2ddLGU9ZS5jb25jYXQoYy5mbGF0dGVuKGRbYl0pKTt1PVtdO2c9MDtmb3IoZD1lLmxlbmd0aDtnPGQ7ZysrKWw9ZVtnXSxjLmlzRGVmaW5lZChsKSYmdS5wdXNoKGwpO3JldHVybiB1fTtjLmRvbWFpbi5tZXJnZT1mdW5jdGlvbihhKXt2YXIgYyxkLGwsZyxlO2w9e307Zz0wO2ZvcihlPWIubGVuZ3RoO2c8ZTtnKyspYz1iW2ddLGQ9Xy53aXRob3V0KF8ucGx1Y2soYSxjKSx2b2lkIDApLDA8ZC5sZW5ndGgmJihsW2NdPW4oZCkpO3JldHVybiBsfTthPXtudW06ZnVuY3Rpb24oYSl7dmFyIGIsZDtiPV8uY29tcGFjdChfLnVuaXEoXy5tYXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5id30pKSk7aWYoMTxiLmxlbmd0aCl0aHJvdyBjLmVycm9yLmRhdGEoIk5vdCBhbGwgbGF5ZXJzIGhhdmUgdGhlIHNhbWUgYmlud2lkdGguIik7Yj1udWxsIT0oZD1iWzBdKT9kOnZvaWQgMDtkPV8ubWluKF8ubWFwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWlufSkpOwphPV8ubWF4KF8ubWFwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4fSkpO3JldHVybiBlKHt0eXBlOiJudW0iLG1pbjpkLG1heDphLGJ3OmJ9KX0sZGF0ZTpmdW5jdGlvbihhKXt2YXIgYixkO2I9Xy5jb21wYWN0KF8udW5pcShfLm1hcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJ3fSkpKTtpZigxPGIubGVuZ3RoKXRocm93IGMuZXJyb3IuZGF0YSgiTm90IGFsbCBsYXllcnMgaGF2ZSB0aGUgc2FtZSBiaW53aWR0aC4iKTtiPW51bGwhPShkPWJbMF0pP2Q6dm9pZCAwO2Q9Xy5taW4oXy5tYXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5taW59KSk7YT1fLm1heChfLm1hcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1heH0pKTtyZXR1cm4gZSh7dHlwZToiZGF0ZSIsbWluOmQsbWF4OmEsYnc6Yn0pfSxjYXQ6ZnVuY3Rpb24oYSl7dmFyIGIsZCxsLGcsdyx1LHQsejtnPVtdO3c9MDtmb3IodD1hLmxlbmd0aDt3PHQ7dysrKWlmKGQ9YVt3XSxkLnNvcnRlZCl7Yj0hMDt1PTA7Zm9yKHo9Zy5sZW5ndGg7dTwKejt1KyspbD1nW3VdLF8uaXNFcXVhbChsLGQubGV2ZWxzKSYmKGI9ITEpO2ImJmcucHVzaChkLmxldmVscyl9YT1fLmNoYWluKGEpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4hYS5zb3J0ZWR9KS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubGV2ZWxzfSkudmFsdWUoKTtpZigxPGcubGVuZ3RoJiZfLmludGVyc2VjdGlvbi5hcHBseSh0aGlzLGcpKXRocm93IGMuZXJyb3IuZGF0YSgiWW91IGFyZSB0cnlpbmcgdG8gY29tYmluZSBpbmNvbXBhdGlibGUgc29ydGVkIGRvbWFpbnMgaW4gdGhlIHNhbWUgYXhpcy4iKTtnPVtfLmZsYXR0ZW4oZywhMCldO2E9Xy51bmlvbi5hcHBseSh0aGlzLGcuY29uY2F0KGEpKTswPT09Z1swXS5sZW5ndGgmJihhPWEuc29ydCgpKTtyZXR1cm4gZSh7dHlwZToiY2F0IixsZXZlbHM6YSxzb3J0ZWQ6MCE9PWdbMF0ubGVuZ3RofSl9fTtuPWZ1bmN0aW9uKGIpe3ZhciBkO2Q9Xy51bmlxKF8ubWFwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZX0pKTtpZigxPApkLmxlbmd0aCl0aHJvdyBjLmVycm9yLmRhdGEoIllvdSBhcmUgdHJ5aW5nIHRvIG1lcmdlIGRhdGEgb2YgZGlmZmVyZW50IHR5cGVzIGluIHRoZSBzYW1lIGF4aXMgb3IgbGVnZW5kLiIpO3JldHVybiBhW2RbMF1dKGIpfX0pLmNhbGwodGhpcyk7KGZ1bmN0aW9uKCl7dmFyIGYscyxoLGI7Yy50aWNrPXt9O2MudGljay5tYWtlPWZ1bmN0aW9uKGEsZCxlKXt2YXIgayxmLHAsbSxyLHEsbCxnO3I9bnVsbDtrPWZ1bmN0aW9uKGEpe3JldHVybiBhfTtudWxsIT1kLnRpY2tzP3E9Im51bSI9PT1lP18uZmlsdGVyKGQudGlja3MsZnVuY3Rpb24oYil7cmV0dXJuIGI+PWEubWluJiZiPD1hLm1heH0pOmQudGlja3M6KGs9bnVsbCE9KHE9ZC5udW10aWNrcyk/cTo1LGs9YltlXShhLGspLHE9ay50aWNrcyxyPWsuc3RlcCk7az1kLmxhYmVscz9mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbCE9KGI9ZC5sYWJlbHNbYV0pP2I6YX06ZC5mb3JtYXR0ZXI/ZC5mb3JtYXR0ZXI6Yy5mb3JtYXQoZS5zcGxpdCgiLSIpWzBdLApyKTtyPXt9O2U9aChlLGspO2lmKHEpZm9yKGY9bD0wLGc9cS5sZW5ndGgtMTswPD1nP2w8PWc6bD49ZztmPTA8PWc/KytsOi0tbCltPTA9PT1mP251bGw6cVtmLTFdLHA9Zj09PXEubGVuZ3RoLTE/bnVsbDpxW2YrMV0sZj1xW2ZdLHA9ZShmLG0scCkscltwLnZhbHVlXT1wO3JldHVybnt0aWNrczpyLHRpY2tzRm9ybWF0dGVyOmt9fTtmPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe3RoaXMubG9jYXRpb249YS5sb2NhdGlvbjt0aGlzLnZhbHVlPWEudmFsdWU7dGhpcy5pbmRleD1hLmluZGV4O3RoaXMuZXZ0RGF0YT1hLmV2dERhdGF9fSgpO2g9ZnVuY3Rpb24oYSxiKXt2YXIgYztjPTA7cmV0dXJuIGZ1bmN0aW9uKGssbixoKXt2YXIgbTsiY2F0Ij09PWE/bT17ImluIjpba119OihtPXt9LG51bGwhPW4mJihtLmdlPW4pLG51bGwhPWgmJihtLmxlPWgpKTtyZXR1cm4gbmV3IGYoe2xvY2F0aW9uOmssdmFsdWU6YihrKSxpbmRleDpjKyssZXZ0RGF0YTptfSl9fTtzPWZ1bmN0aW9uKGEsCmIpe3ZhciBjLGs7az1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKGEvYikvTWF0aC5MTjEwKSk7Yz1iL2EqazswLjE1PmM/ayo9MTA6MC4zNT49Yz9rKj01OjAuNzU+PWMmJihrKj0yKTtyZXR1cm4ga307Yj17bm9uZTpmdW5jdGlvbigpe3JldHVybnt9fSxjYXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxrLGYsaCxtLHIscTtmPU1hdGgubWF4KDEsTWF0aC5yb3VuZChhLmxldmVscy5sZW5ndGgvYikpO2g9W107cT1hLmxldmVscztjPW09MDtmb3Iocj1xLmxlbmd0aDttPHI7Yz0rK20paz1xW2NdLDA9PT1jJWYmJmgucHVzaChrKTtyZXR1cm57dGlja3M6aH19LG51bTpmdW5jdGlvbihhLGIpe3ZhciBjLGssZixoO2s9YS5taW47Yz1hLm1heDtmPXMoYy1rLGIpO2g9TWF0aC5jZWlsKGsvZikqZjtmb3Ioaz1bXTtoPGM7KWsucHVzaChoKSxoKz1mO3JldHVybnt0aWNrczprLHN0ZXA6TWF0aC5mbG9vcihNYXRoLmxvZyhmKS9NYXRoLkxOMTApfX0sIm51bS1sb2ciOmZ1bmN0aW9uKGEsCmIpe3ZhciBlLGssZixoLG0scixxLGwsZztsPVtdO3I9YS5taW47bT1hLm1heDtrPWZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmxvZyhhKS9NYXRoLkxOMTB9O2U9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguZXhwKGEqTWF0aC5MTjEwKX07aD1NYXRoLm1heChrKHIpLDApO2Y9ayhtKTtxPXMoZi1oLGIpO2ZvcihnPU1hdGguY2VpbChoL3EpKnE7ZzxmK2NbImNvbnN0Il0uZXBzaWxvbjspe2lmKCEoMCE9PWclMSYmMC4xPj1nJTEpKXtpZihnJTE+Y1siY29uc3QiXS5lcHNpbG9uKXtpZihoPU1hdGguZmxvb3IoZykraygxMCooZyUxKSksMD09PWglMSl7Zys9cTtjb250aW51ZX19ZWxzZSBoPWc7aD1lKGgpO2g8cnx8aD5tfHxsLnB1c2goaCl9Zys9cX1yZXR1cm57dGlja3M6bH19LGRhdGU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxrLGYsaCxtLHI7Zj1hLm1pbjtrPWEubWF4O209KGstZikvYjttPTEuND5tPyJzZWNvbmQiOjg0Pm0/Im1pbnV0ZSI6NTA0MD5tPyJob3VyIjoxMjA5NjA+bT8iZGF5IjoKODQ2NzIwPm0/IndlZWsiOjM2Mjg4MDA+bT8ibW9udGgiOjcyNTc2MDA+bT8idHdvbW9udGgiOjE0NTE1MjAwPm0/InF1YXJ0ZXIiOjIxNzcyODAwPm0/InNpeG1vbnRoIjo0NDE1MDQwMD5tPyJ5ZWFyIjo4ODMwMDgwMD5tPyJ0d295ZWFyIjoyMjA3NTJFMz5tPyJmaXZleWVhciI6ImRlY2FkZSI7cj1bXTtjPW1vbWVudC51bml4KGYpLnN0YXJ0T2YobSk7aD1mdW5jdGlvbigpe3N3aXRjaChtKXtjYXNlICJ0d29tb250aCI6cmV0dXJuWyJtb250aHMiLDJdO2Nhc2UgInF1YXJ0ZXIiOnJldHVyblsibW9udGhzIiw0XTtjYXNlICJzaXhtb250aCI6cmV0dXJuWyJtb250aHMiLDZdO2Nhc2UgInR3b3llYXIiOnJldHVyblsieWVhcnMiLDJdO2Nhc2UgImZpdmV5ZWFyIjpyZXR1cm5bInllYXJzIiw1XTtjYXNlICJkZWNhZGUiOnJldHVyblsieWVhcnMiLDEwXTtkZWZhdWx0OnJldHVyblttKyJzIiwxXX19KCk7Zm9yKGMudW5peCgpPGYmJmMuYWRkKGhbMF0saFsxXSk7Yy51bml4KCk8azspci5wdXNoKGMudW5peCgpKSwKYy5hZGQoaFswXSxoWzFdKTtyZXR1cm57dGlja3M6cixzdGVwOm19fX19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLHMsaCxiLGEsZCxlLGssbixwLG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShiLGFyZ3VtZW50cyl9fSxyPXt9Lmhhc093blByb3BlcnR5LHE9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7dGhpcy5jb25zdHJ1Y3Rvcj1hfWZvcih2YXIgZCBpbiBiKXIuY2FsbChiLGQpJiYoYVtkXT1iW2RdKTtjLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLl9fc3VwZXJfXz1iLnByb3RvdHlwZTtyZXR1cm4gYX07ZD1jWyJjb25zdCJdLnNjYWxlRm5zO2Y9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3RoaXMucmVuZGVyPW0odGhpcy5yZW5kZXIsdGhpcyk7dGhpcy5tYWtlPW0odGhpcy5tYWtlLHRoaXMpO3RoaXMucG9zaXRpb249Im5vbmUiO3RoaXMudGl0bGU9dGhpcy50aXRsZXRleHQ9bnVsbH1xKGIsCmEpO2IucHJvdG90eXBlLm1ha2U9ZnVuY3Rpb24oYSl7dmFyIGIsYyxnLGQ7Yj1hLmd1aWRlU3BlYztnPWEudGl0bGU7Yz1hLnBvc2l0aW9uO3RoaXMuc2l6ZT1hLnNpemU7dGhpcy5jb2xvcj1hLmNvbG9yO2E9ZnVuY3Rpb24oYSxjKXt2YXIgZztyZXR1cm4gbnVsbCE9KGc9YlthXSk/ZzpjfTt0aGlzLnRpdGxldGV4dD1hKCJ0aXRsZSIsZyk7dGhpcy5wb3NpdGlvbj1udWxsIT0oZD1hKCJwb3NpdGlvbiIsYykpP2Q6dGhpcy5kZWZhdWx0UG9zaXRpb247aWYoIm91dCI9PT10aGlzLnBvc2l0aW9uKXJldHVybiB0aGlzLnBvc2l0aW9uPSJib3R0b20ifTtiLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKCJub25lIiE9PXRoaXMucG9zaXRpb24pcmV0dXJuIG51bGwhPXRoaXMudGl0bGUmJmEucmVtb3ZlKHRoaXMudGl0bGUpLHRoaXMudGl0bGU9YS5hZGQodGhpcy5fbWFrZVRpdGxlKGIsYyksbnVsbCxudWxsLCJndWlkZS0iK3RoaXMudGl0bGVUeXBlKTtpZihudWxsIT0KdGhpcy50aXRsZSlyZXR1cm4gYS5yZW1vdmUodGhpcy50aXRsZSl9O2IucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oYSl7YS5yZW1vdmUodGhpcy50aXRsZSk7cmV0dXJuIHRoaXMudGl0bGU9bnVsbH07Yi5wcm90b3R5cGUuX21ha2VUaXRsZT1mdW5jdGlvbigpe3Rocm93IGMuZXJyb3IuaW1wbCgpO307Yi5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7dmFyIGE7YT17fTsibm9uZSIhPT10aGlzLnBvc2l0aW9uJiYoYVt0aGlzLnBvc2l0aW9uXT0xMCk7cmV0dXJuIGF9O3JldHVybiBifShjLkd1aWRlKTtoPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gZT1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cShiLGEpO2IucHJvdG90eXBlLmRlZmF1bHRQb3NpdGlvbj0iYm90dG9tIjtiLnByb3RvdHlwZS50aXRsZVR5cGU9InRpdGxlSCI7Yi5wcm90b3R5cGUuX21ha2VUaXRsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGcsbCxlLApmO2M9InRvcCI9PT10aGlzLnBvc2l0aW9uP2EucGFkZGluZ1RvcCthLmd1aWRlVG9wLShudWxsIT0oZz1iLnRvcCk/ZzowKS0yOmEuaGVpZ2h0LWEucGFkZGluZ0JvdHRvbS1hLmd1aWRlQm90dG9tKyhudWxsIT0obD1iLmJvdHRvbSk/bDowKTtyZXR1cm57dHlwZToidGV4dCIseDpkLmlkZW50aXR5KGEucGFkZGluZ0xlZnQrYS5ndWlkZUxlZnQrKGEud2lkdGgtYS5wYWRkaW5nTGVmdC1hLmd1aWRlTGVmdC1hLnBhZGRpbmdSaWdodC1hLmd1aWRlUmlnaHQpLzIpLHk6ZC5pZGVudGl0eShjKSxjb2xvcjpkLmlkZW50aXR5KG51bGwhPShlPXRoaXMuY29sb3IpP2U6ImJsYWNrIiksc2l6ZTpkLmlkZW50aXR5KG51bGwhPShmPXRoaXMuc2l6ZSk/ZjoxMiksdGV4dDp0aGlzLnRpdGxldGV4dCwidGV4dC1hbmNob3IiOiJtaWRkbGUifX07cmV0dXJuIGJ9KGYpO2E9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBrPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0KcShiLGEpO2IucHJvdG90eXBlLmRlZmF1bHRQb3NpdGlvbj0ibGVmdCI7Yi5wcm90b3R5cGUudGl0bGVUeXBlPSJ0aXRsZVYiO2IucHJvdG90eXBlLl9tYWtlVGl0bGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxnLGwsZSxmO2M9ImxlZnQiPT09dGhpcy5wb3NpdGlvbj9hLnBhZGRpbmdMZWZ0K2EuZ3VpZGVMZWZ0LShudWxsIT0oZz1iLmxlZnQpP2c6MCktNzphLndpZHRoLWEucGFkZGluZ1JpZ2h0LWEuZ3VpZGVSaWdodCsobnVsbCE9KGw9Yi5yaWdodCk/bDowKTtnPWEucGFkZGluZ1RvcCthLmd1aWRlVG9wKyhhLmhlaWdodC1hLnBhZGRpbmdUb3AtYS5ndWlkZVRvcC1hLnBhZGRpbmdCb3R0b20tYS5ndWlkZUJvdHRvbSkvMjtyZXR1cm57dHlwZToidGV4dCIseDpkLmlkZW50aXR5KGMpLHk6ZC5pZGVudGl0eShnKSxjb2xvcjpkLmlkZW50aXR5KG51bGwhPShlPXRoaXMuY29sb3IpP2U6ImJsYWNrIiksc2l6ZTpkLmlkZW50aXR5KG51bGwhPShmPXRoaXMuc2l6ZSk/ZjoxMiksdGV4dDp0aGlzLnRpdGxldGV4dCwKInRleHQtYW5jaG9yIjoibWlkZGxlIix0cmFuc2Zvcm06InIyNzAifX07cmV0dXJuIGJ9KGYpO2I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBuPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1xKGIsYSk7Yi5wcm90b3R5cGUudGl0bGVUeXBlPSJ0aXRsZSI7Yi5wcm90b3R5cGUuX21ha2VUaXRsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGc7cmV0dXJue3R5cGU6InRleHQiLHg6ZC5pZGVudGl0eShhLndpZHRoLzIpLHk6ZC5pZGVudGl0eSgyMCksY29sb3I6ZC5pZGVudGl0eShudWxsIT0oYz10aGlzLmNvbG9yKT9jOiJibGFjayIpLHNpemU6ZC5pZGVudGl0eShudWxsIT0oZz10aGlzLnNpemUpP2c6MTIpLHRleHQ6dGhpcy50aXRsZXRleHQsImZvbnQtc2l6ZSI6IjEzcHgiLCJmb250LXdlaWdodCI6ImJvbGQiLCJ0ZXh0LWFuY2hvciI6Im1pZGRsZSJ9fTtyZXR1cm4gYn0oZik7cz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7dGhpcy5yZW5kZXI9Cm0odGhpcy5yZW5kZXIsdGhpcyk7dGhpcy5tYWtlPW0odGhpcy5tYWtlLHRoaXMpO3JldHVybiBwPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1xKGIsYSk7Yi5wcm90b3R5cGUubWFrZT1mdW5jdGlvbihhKXt2YXIgYjtiPWEudGl0bGU7dGhpcy5zaXplPWEuc2l6ZTt0aGlzLmNvbG9yPWEuY29sb3I7cmV0dXJuIHRoaXMudGl0bGV0ZXh0PWJ9O2IucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGwhPXRoaXMudGl0bGU/dGhpcy50aXRsZT1hLmFuaW1hdGUodGhpcy50aXRsZSx0aGlzLl9tYWtlVGl0bGUoYixjKSk6dGhpcy50aXRsZT1hLmFkZCh0aGlzLl9tYWtlVGl0bGUoYixjKSxudWxsLG51bGwsImd1aWRlLWZhY2V0LXRpdGxlIil9O2IucHJvdG90eXBlLl9tYWtlVGl0bGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxnO3JldHVybnt0eXBlOiJ0ZXh0Iix4OmQuaWRlbnRpdHkoYi54K2EuZWFjaFdpZHRoLzIpLHk6ZC5pZGVudGl0eShiLnktCjcpLGNvbG9yOmQuaWRlbnRpdHkobnVsbCE9KGM9dGhpcy5jb2xvcik/YzoiYmxhY2siKSxzaXplOmQuaWRlbnRpdHkobnVsbCE9KGc9dGhpcy5zaXplKT9nOjEyKSx0ZXh0OnRoaXMudGl0bGV0ZXh0LCJ0ZXh0LWFuY2hvciI6Im1pZGRsZSJ9fTtyZXR1cm4gYn0oZik7bnVsbD09Yy5ndWlkZSYmKGMuZ3VpZGU9e30pO2MuZ3VpZGUudGl0bGU9ZnVuY3Rpb24oYyl7cmV0dXJuInkiPT09Y3x8InIiPT09Yz9uZXcgYToibWFpbiI9PT1jP25ldyBiOiJmYWNldCI9PT1jP25ldyBzOm5ldyBofX0pLmNhbGwodGhpcyk7KGZ1bmN0aW9uKCl7dmFyIGYscyxoLGIsYSxkLGUsayxuLHAsbSxyPXt9Lmhhc093blByb3BlcnR5LHE9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7dGhpcy5jb25zdHJ1Y3Rvcj1hfWZvcih2YXIgZyBpbiBiKXIuY2FsbChiLGcpJiYoYVtnXT1iW2ddKTtjLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLl9fc3VwZXJfXz1iLnByb3RvdHlwZTsKcmV0dXJuIGF9LGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShiLGFyZ3VtZW50cyl9fSxnPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5sZW5ndGg7YjxjO2IrKylpZihiIGluIHRoaXMmJnRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfTtlPWNbImNvbnN0Il0uc2NhbGVGbnM7Zj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7dGhpcy5heGVzR2VvbXM9e319cShiLGEpO2IucHJvdG90eXBlLm1ha2U9ZnVuY3Rpb24oYSl7dmFyIGIsZyxkLGw7dGhpcy5kb21haW5zPWEuZG9tYWluczt0aGlzLmNvb3JkPWEuY29vcmQ7dGhpcy5zY2FsZXM9YS5zY2FsZXM7dGhpcy5zcGVjcz1hLnNwZWNzO3RoaXMubGFiZWxzPWEubGFiZWxzO3JldHVybiB0aGlzLmF4ZXM9e3g6Yy5ndWlkZS5heGlzKHRoaXMuY29vcmQuYXhpc1R5cGUoIngiKSx7ZG9tYWluOnRoaXMuZG9tYWlucy54LHR5cGU6dGhpcy5zY2FsZXMueC50aWNrVHlwZSgpLApndWlkZVNwZWM6bnVsbCE9KGI9dGhpcy5zcGVjcy54KT9iOnt9LGtleTpudWxsIT0oZz10aGlzLmxhYmVscy54KT9nOiJ4In0pLHk6Yy5ndWlkZS5heGlzKHRoaXMuY29vcmQuYXhpc1R5cGUoInkiKSx7ZG9tYWluOnRoaXMuZG9tYWlucy55LHR5cGU6dGhpcy5zY2FsZXMueS50aWNrVHlwZSgpLGd1aWRlU3BlYzpudWxsIT0oZD10aGlzLnNwZWNzLnkpP2Q6e30sa2V5Om51bGwhPShsPXRoaXMubGFiZWxzLnkpP2w6InkifSl9fTtiLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oYSl7dmFyIGIsYyxnO2E9e307Zz10aGlzLmF4ZXM7Zm9yKGMgaW4gZyliPWdbY10sYj1iLmdldERpbWVuc2lvbigpLCJsZWZ0Ij09PWIucG9zaXRpb24/YS5sZWZ0PWIud2lkdGg6InJpZ2h0Ij09PWIucG9zaXRpb24/YS5yaWdodD1iLndpZHRoOiJib3R0b20iPT09Yi5wb3NpdGlvbj9hLmJvdHRvbT1iLmhlaWdodDoidG9wIj09PWIucG9zaXRpb24mJihhLnRvcD1iLmhlaWdodCk7cmV0dXJuIGF9OwpiLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSxiLGcpe3ZhciBkLGwsZSx1LHcsdix4LEQsZixrLGgsbixxLG0scCxyO3c9Xy5rZXlzKGcuaW5kaWNlcyk7ZT1jLmNvbXBhcmUoXy5rZXlzKHRoaXMuYXhlc0dlb21zKSx3KS5kZWxldGVkO2g9MDtmb3Iobj1lLmxlbmd0aDtoPG47aCsrKWZvcih1IGluIHg9ZVtoXSxtPXRoaXMuYXhlc0dlb21zW3hdLG0pbD1tW3VdLGwuZGlzcG9zZShiKCkpO2w9e3RvcDowLGxlZnQ6MCxyaWdodDphLmVhY2hXaWR0aCxib3R0b206YS5lYWNoSGVpZ2h0LHdpZHRoOmEuZWFjaFdpZHRoLGhlaWdodDphLmVhY2hIZWlnaHR9O2U9Zy5lZGdlKHRoaXMuYXhlcy54LnBvc2l0aW9uKTt1PWcuZWRnZSh0aGlzLmF4ZXMueS5wb3NpdGlvbik7aD17cmVuZGVyTGFiZWw6ITEscmVuZGVyVGljazohMX07bj17cmVuZGVyTGFiZWw6ITEscmVuZGVyVGljazohMX07InIiPT09dGhpcy5heGVzLngudHlwZSYmKGgucmVuZGVyTGluZT0hMSk7InIiPT09dGhpcy5heGVzLnkudHlwZSYmCihuLnJlbmRlckxpbmU9ITEpO3I9W107bT0wO2ZvcihwPXcubGVuZ3RoO208cDttKyspeD13W21dLEQ9Zy5nZXRPZmZzZXQoYSx4KSxudWxsPT0ocT10aGlzLmF4ZXNHZW9tcylbeF0mJihxW3hdPXt4Om5ldyBjLkdlb21ldHJ5KCJndWlkZSIpLHk6bmV3IGMuR2VvbWV0cnkoImd1aWRlIil9KSxrPWIoRCwhMSwhMSksRD1lKHgpP3t9OmgsdGhpcy5heGVzR2VvbXNbeF0ueC5zZXQodGhpcy5heGVzLnguY2FsY3VsYXRlKGwsdGhpcy5jb29yZCxEKSksdGhpcy5heGVzR2VvbXNbeF0ueC5yZW5kZXIoayksRD11KHgpP3t9Om4sdGhpcy5heGVzR2VvbXNbeF0ueS5zZXQodGhpcy5heGVzLnkuY2FsY3VsYXRlKGwsdGhpcy5jb29yZCxEKSksdGhpcy5heGVzR2VvbXNbeF0ueS5yZW5kZXIoayksci5wdXNoKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGc7Yz1bIngiLCJ5Il07Zz1bXTthPTA7Zm9yKGI9Yy5sZW5ndGg7YTxiO2ErKylkPWNbYV0sZy5wdXNoKGZ1bmN0aW9uKCl7dmFyIGEsYjthPXRoaXMuYXhlc0dlb21zW3hdW2RdLnB0czsKYj1bXTtmb3IodiBpbiBhKWY9YVt2XSxmLmdyaWQ/Yi5wdXNoKGYuZ3JpZC50b0JhY2soKSk6Yi5wdXNoKHZvaWQgMCk7cmV0dXJuIGJ9LmNhbGwodGhpcykpO3JldHVybiBnfS5jYWxsKHRoaXMpKTtyZXR1cm4gcn07Yi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbihhKXt2YXIgYixjLGc7Zz10aGlzLmF4ZXNHZW9tcztmb3IoYyBpbiBnKWI9Z1tjXSxiLnguZGlzcG9zZShhKSxiLnkuZGlzcG9zZShhKTtyZXR1cm4gdGhpcy5heGVzR2VvbXM9e319O3JldHVybiBifShjLkd1aWRlU2V0KTtzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dGhpcy5jYWxjdWxhdGU9bCh0aGlzLmNhbGN1bGF0ZSx0aGlzKTt2YXIgZCxlLHUsdyxmO2Q9YS5kb21haW47dz1hLnR5cGU7ZT1hLmd1aWRlU3BlYzthPWEua2V5O3U9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gbnVsbCE9KGM9ZVthXSk/YzpifTt0aGlzLnBvc2l0aW9uPXUoInBvc2l0aW9uIix0aGlzLmRlZmF1bHRQb3NpdGlvbik7aWYoZj0KdGhpcy5wb3NpdGlvbiwwPmcuY2FsbCh0aGlzLnZhbGlkUG9zaXRpb25zLGYpKXRocm93IGMuZXJyb3IuZGVmbigiWC1heGlzIHBvc2l0aW9uIGNhbid0IGJlICIrdGhpcy5wb3NpdGlvbisiLiIpO3RoaXMudGl0bGV0ZXh0PXUoInRpdGxlIixhKTt0aGlzLnJlbmRlclRpY2s9dSgicmVuZGVyVGljayIsdGhpcy5yZW5kZXJUaWNrRGVmYXVsdCk7dGhpcy5yZW5kZXJHcmlkPXUoInJlbmRlckdyaWQiLHRoaXMucmVuZGVyR3JpZERlZmF1bHQpO3RoaXMucmVuZGVyTGFiZWw9dSgicmVuZGVyTGFiZWwiLHRoaXMucmVuZGVyTGFiZWxEZWZhdWx0KTt0aGlzLnJlbmRlckxpbmU9dSgicmVuZGVyTGluZSIsdGhpcy5yZW5kZXJMaW5lRGVmYXVsdCk7dGhpcy5ncmlkQ29sb3I9dSgiZ3JpZENvbG9yIix0aGlzLmdyaWRDb2xvcik7ZD1jLnRpY2subWFrZShkLGUsdyk7dGhpcy50aWNrcz1kLnRpY2tzO3RoaXMudGlja3NGb3JtYXR0ZXI9ZC50aWNrc0Zvcm1hdHRlcjt0aGlzLm1heHdpZHRoPV8ubWF4KF8ubWFwKHRoaXMudGlja3MsCmZ1bmN0aW9uKGEpe3JldHVybiBjLnN0clNpemUoYS52YWx1ZSl9KSk7dGhpcy5tYXh3aWR0aD1NYXRoLm1heCh0aGlzLm1heHdpZHRoLDApfXEoYixhKTtiLnByb3RvdHlwZS5yZW5kZXJUaWNrRGVmYXVsdD0hMDtiLnByb3RvdHlwZS5yZW5kZXJHcmlkRGVmYXVsdD0hMDtiLnByb3RvdHlwZS5yZW5kZXJMYWJlbERlZmF1bHQ9ITA7Yi5wcm90b3R5cGUucmVuZGVyTGluZURlZmF1bHQ9ITA7Yi5wcm90b3R5cGUuY2FsY3VsYXRlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZyxkLGwsZSx1LHYseDt0aGlzLmNvb3JkPWI7aWYoIm5vbmUiPT09dGhpcy5wb3NpdGlvbilyZXR1cm57fTtudWxsPT1jJiYoYz17fSk7YS5jZW50ZXJ4PWEubGVmdCthLndpZHRoLzI7YS5jZW50ZXJ5PWEudG9wK2EuaGVpZ2h0LzI7YS5yYWRpdXM9TWF0aC5taW4oYS53aWR0aCxhLmhlaWdodCkvMi0xMDtiPXt9O3RoaXMucmVuZGVyTGluZSYmKGIubGluZT17bWFya3M6ezA6dGhpcy5fcmVuZGVybGluZShhKX19KTtlPQp0aGlzLnRpY2tzO2ZvcihnIGluIGUpbD1lW2ddLGQ9e30sdGhpcy5yZW5kZXJUaWNrJiYobnVsbCE9KHU9Yy5yZW5kZXJUaWNrKT91OjEpJiYoZC50aWNrPXRoaXMuX21ha2VUaWNrKGEsbCkpLHRoaXMucmVuZGVyTGFiZWwmJihudWxsIT0odj1jLnJlbmRlckxhYmVsKT92OjEpJiYoZC50ZXh0PXRoaXMuX21ha2VMYWJlbChhLGwpKSx0aGlzLnJlbmRlckdyaWQmJihudWxsIT0oeD1jLnJlbmRlckdyaWQpP3g6MSkmJihkLmdyaWQ9dGhpcy5fbWFrZUdyaWQoYSxsKSksYltnXT17bWFya3M6ZH07cmV0dXJuIGJ9O2IucHJvdG90eXBlLl9tYWtlVGljaz1mdW5jdGlvbihhKXtpZighYSl0aHJvdyBjLmVycm9yLmltcGwoKTthLnR5cGU9InBhdGgiO2Euc3Ryb2tlPWUuaWRlbnRpdHkoIiM2NjYiKTthLmNvbG9yPWUuaWRlbnRpdHkoIiM2NjYiKTtyZXR1cm4gYX07Yi5wcm90b3R5cGUuX21ha2VMYWJlbD1mdW5jdGlvbihhKXtpZighYSl0aHJvdyBjLmVycm9yLmltcGwoKTthLnR5cGU9InRleHQiOwphLnN0cm9rZT1lLmlkZW50aXR5KCIjNjY2Iik7YS5jb2xvcj1lLmlkZW50aXR5KCIjNjY2Iik7cmV0dXJuIGF9O2IucHJvdG90eXBlLl9tYWtlR3JpZD1mdW5jdGlvbihhKXtpZighYSl0aHJvdyBjLmVycm9yLmltcGwoKTthLnN0cm9rZT1udWxsIT10aGlzLmdyaWRDb2xvcj90aGlzLmdyaWRDb2xvcjoiI0VGRUZFRiI7cmV0dXJuIGF9O3JldHVybiBifShjLkd1aWRlKTthPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gaz1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cShiLGEpO2IucHJvdG90eXBlLnR5cGU9IngiO2IucHJvdG90eXBlLnJlbmRlckdyaWREZWZhdWx0PSExO2IucHJvdG90eXBlLmRlZmF1bHRQb3NpdGlvbj0iYm90dG9tIjtiLnByb3RvdHlwZS52YWxpZFBvc2l0aW9ucz1bInRvcCIsImJvdHRvbSIsIm5vbmUiXTtiLnByb3RvdHlwZS5fcmVuZGVybGluZT1mdW5jdGlvbihhKXt2YXIgYixjO2M9InRvcCI9PT10aGlzLnBvc2l0aW9uPwplLmlkZW50aXR5KGEudG9wKTplLmlkZW50aXR5KGEuYm90dG9tKTtiPWUuaWRlbnRpdHkoYS5sZWZ0KTthPWUuaWRlbnRpdHkoYS5sZWZ0K2Eud2lkdGgpO3JldHVybnt0eXBlOiJwYXRoIix5OltjLGNdLHg6W2IsYV0sc3Ryb2tlOmUuaWRlbnRpdHkoIiM2NjYiKX19O2IucHJvdG90eXBlLl9tYWtlVGljaz1mdW5jdGlvbihhLGMpe3ZhciBnLGQ7InRvcCI9PT10aGlzLnBvc2l0aW9uPyhnPWUuaWRlbnRpdHkoYS50b3ApLGQ9ZS5pZGVudGl0eShhLnRvcC01KSk6KGc9ZS5pZGVudGl0eShhLmJvdHRvbSksZD1lLmlkZW50aXR5KGEuYm90dG9tKzUpKTtyZXR1cm4gYi5fX3N1cGVyX18uX21ha2VUaWNrLmNhbGwodGhpcyx7eDpbYy5sb2NhdGlvbixjLmxvY2F0aW9uXSx5OltnLGRdfSl9O2IucHJvdG90eXBlLl9tYWtlTGFiZWw9ZnVuY3Rpb24oYSxjKXt2YXIgZztnPSJ0b3AiPT09dGhpcy5wb3NpdGlvbj9lLmlkZW50aXR5KGEudG9wLTE1KTplLmlkZW50aXR5KGEuYm90dG9tKzE1KTsKcmV0dXJuIGIuX19zdXBlcl9fLl9tYWtlTGFiZWwuY2FsbCh0aGlzLHt4OmMubG9jYXRpb24seTpnLHRleHQ6Yy52YWx1ZSwidGV4dC1hbmNob3IiOiJtaWRkbGUifSl9O2IucHJvdG90eXBlLl9tYWtlR3JpZD1mdW5jdGlvbihhLGMpe3ZhciBnLGQ7Zz1lLmlkZW50aXR5KGEudG9wKTtkPWUuaWRlbnRpdHkoYS5ib3R0b20pO3JldHVybiBiLl9fc3VwZXJfXy5fbWFrZUdyaWQuY2FsbCh0aGlzLHt0eXBlOiJwYXRoIix4OltjLmxvY2F0aW9uLGMubG9jYXRpb25dLHk6W2csZF19KX07Yi5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJue3Bvc2l0aW9uOm51bGwhPShhPXRoaXMucG9zaXRpb24pP2E6ImJvdHRvbSIsaGVpZ2h0OjMwLHdpZHRoOiJhbGwifX07cmV0dXJuIGJ9KHMpO2Q9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBuPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1xKGIsYSk7Yi5wcm90b3R5cGUudHlwZT0KInkiO2IucHJvdG90eXBlLnJlbmRlckxpbmVEZWZhdWx0PSExO2IucHJvdG90eXBlLnJlbmRlclRpY2tEZWZhdWx0PSExO2IucHJvdG90eXBlLmRlZmF1bHRQb3NpdGlvbj0ibGVmdCI7Yi5wcm90b3R5cGUudmFsaWRQb3NpdGlvbnM9WyJsZWZ0IiwicmlnaHQiLCJub25lIl07Yi5wcm90b3R5cGUuX3JlbmRlcmxpbmU9ZnVuY3Rpb24oYSl7dmFyIGIsYztiPSJsZWZ0Ij09PXRoaXMucG9zaXRpb24/ZS5pZGVudGl0eShhLmxlZnQpOmUuaWRlbnRpdHkoYS5yaWdodCk7Yz1lLmlkZW50aXR5KGEudG9wKTthPWUuaWRlbnRpdHkoYS50b3ArYS5oZWlnaHQpO3JldHVybnt0eXBlOiJwYXRoIix4OltiLGJdLHk6W2MsYV0sc3Ryb2tlOmUuaWRlbnRpdHkoIiM2NjYiKX19O2IucHJvdG90eXBlLl9tYWtlVGljaz1mdW5jdGlvbihhLGMpe3ZhciBnLGQ7ImxlZnQiPT09dGhpcy5wb3NpdGlvbj8oZz1lLmlkZW50aXR5KGEubGVmdCksZD1lLmlkZW50aXR5KGEubGVmdC01KSk6KGc9ZS5pZGVudGl0eShhLnJpZ2h0KSwKZD1lLmlkZW50aXR5KGEucmlnaHQrNSkpO3JldHVybiBiLl9fc3VwZXJfXy5fbWFrZVRpY2suY2FsbCh0aGlzLHt4OltnLGRdLHk6W2MubG9jYXRpb24sYy5sb2NhdGlvbl19KX07Yi5wcm90b3R5cGUuX21ha2VMYWJlbD1mdW5jdGlvbihhLGMpe3ZhciBnO2c9ImxlZnQiPT09dGhpcy5wb3NpdGlvbj9lLmlkZW50aXR5KGEubGVmdC03KTplLmlkZW50aXR5KGEucmlnaHQrNyk7cmV0dXJuIGIuX19zdXBlcl9fLl9tYWtlTGFiZWwuY2FsbCh0aGlzLHt4OmcseTpjLmxvY2F0aW9uLHRleHQ6Yy52YWx1ZSwidGV4dC1hbmNob3IiOiJsZWZ0Ij09PXRoaXMucG9zaXRpb24/ImVuZCI6InN0YXJ0In0pfTtiLnByb3RvdHlwZS5fbWFrZUdyaWQ9ZnVuY3Rpb24oYSxjKXt2YXIgZyxkO2c9ZS5pZGVudGl0eShhLmxlZnQpO2Q9ZS5pZGVudGl0eShhLnJpZ2h0KTtyZXR1cm4gYi5fX3N1cGVyX18uX21ha2VHcmlkLmNhbGwodGhpcyx7dHlwZToicGF0aCIseTpbYy5sb2NhdGlvbixjLmxvY2F0aW9uXSwKeDpbZyxkXX0pfTtiLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm57cG9zaXRpb246bnVsbCE9KGE9dGhpcy5wb3NpdGlvbik/YToicmlnaHQiLGhlaWdodDoiYWxsIix3aWR0aDo1K3RoaXMubWF4d2lkdGh9fTtyZXR1cm4gYn0ocyk7aD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIHA9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXEoYixhKTtiLnByb3RvdHlwZS50eXBlPSJyIjtiLnByb3RvdHlwZS5kZWZhdWx0UG9zaXRpb249ImxlZnQiO2IucHJvdG90eXBlLnZhbGlkUG9zaXRpb25zPVsibGVmdCIsInJpZ2h0Iiwibm9uZSJdO2IucHJvdG90eXBlLl9yZW5kZXJsaW5lPWZ1bmN0aW9uKGEpe3ZhciBiLGM7Yj1lLmlkZW50aXR5KGEubGVmdCk7Yz1lLmlkZW50aXR5KGEudG9wKTthPWUuaWRlbnRpdHkoYS50b3ArYS5oZWlnaHQvMik7cmV0dXJue3R5cGU6InBhdGgiLHg6W2IsYl0seTpbYyxhXSxzdHJva2U6ZS5pZGVudGl0eSgiIzY2NiIpfX07CmIucHJvdG90eXBlLl9tYWtlVGljaz1mdW5jdGlvbihhLGMpe3JldHVybiBiLl9fc3VwZXJfXy5fbWFrZVRpY2suY2FsbCh0aGlzLHt4OltlLmlkZW50aXR5KGEubGVmdCksZS5pZGVudGl0eShhLmxlZnQtNSldLHk6W2MubG9jYXRpb24sYy5sb2NhdGlvbl19KX07Yi5wcm90b3R5cGUuX21ha2VMYWJlbD1mdW5jdGlvbihhLGMpe3JldHVybiBiLl9fc3VwZXJfXy5fbWFrZUxhYmVsLmNhbGwodGhpcyx7eDplLmlkZW50aXR5KGEubGVmdC03KSx5OmMubG9jYXRpb24sdGV4dDpjLnZhbHVlLCJ0ZXh0LWFuY2hvciI6ImVuZCJ9KX07Yi5wcm90b3R5cGUuX21ha2VHcmlkPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGIuX19zdXBlcl9fLl9tYWtlR3JpZC5jYWxsKHRoaXMse3R5cGU6ImNpcmNsZSIseDplLmlkZW50aXR5KGEuY2VudGVyeCkseTplLmlkZW50aXR5KGEuY2VudGVyeSksc2l6ZTplLmlkZW50aXR5KHRoaXMuY29vcmQuZ2V0U2NhbGUoInIiKShjLmxvY2F0aW9uKSksY29sb3I6ZS5pZGVudGl0eSgibm9uZSIpLAoiZmlsbC1vcGFjaXR5IjowLCJzdHJva2Utd2lkdGgiOjF9KX07Yi5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJue3Bvc2l0aW9uOiJsZWZ0IixoZWlnaHQ6ImFsbCIsd2lkdGg6NSt0aGlzLm1heHdpZHRofX07cmV0dXJuIGJ9KHMpO2I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBtPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1xKGIsYSk7Yi5wcm90b3R5cGUudHlwZT0idCI7Yi5wcm90b3R5cGUuZGVmYXVsdFBvc2l0aW9uPSJvdXQiO2IucHJvdG90eXBlLnZhbGlkUG9zaXRpb25zPVsib3V0Iiwibm9uZSJdO2IucHJvdG90eXBlLl9yZW5kZXJsaW5lPWZ1bmN0aW9uKGEpe3JldHVybnt0eXBlOiJjaXJjbGUiLHg6ZS5pZGVudGl0eShhLmNlbnRlcngpLHk6ZS5pZGVudGl0eShhLmNlbnRlcnkpLHNpemU6ZS5pZGVudGl0eShhLnJhZGl1cyksY29sb3I6ZS5pZGVudGl0eSgibm9uZSIpLHN0cm9rZTplLmlkZW50aXR5KCIjNjY2IiksCiJzdHJva2Utd2lkdGgiOjF9fTtiLnByb3RvdHlwZS5fbWFrZVRpY2s9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYi5fX3N1cGVyX18uX21ha2VUaWNrLmNhbGwodGhpcyx7eDpbYy5sb2NhdGlvbixjLmxvY2F0aW9uXSx5OltlLm1heCgwKSxlLm1heCgzKV19KX07Yi5wcm90b3R5cGUuX21ha2VMYWJlbD1mdW5jdGlvbihhLGMpe3JldHVybiBiLl9fc3VwZXJfXy5fbWFrZUxhYmVsLmNhbGwodGhpcyx7eDpjLmxvY2F0aW9uLHk6ZS5tYXgoMTIpLHRleHQ6Yy52YWx1ZSwidGV4dC1hbmNob3IiOiJtaWRkbGUifSl9O2IucHJvdG90eXBlLl9tYWtlR3JpZD1mdW5jdGlvbihhLGMpe3ZhciBnLGQsbCx3O2Q9ZS5pZGVudGl0eShhLmNlbnRlcngpO3c9ZS5pZGVudGl0eShhLmNlbnRlcnkpO2c9dGhpcy5jb29yZC5nZXRTY2FsZSgidCIpKGMubG9jYXRpb24pLU1hdGguUEkvMjtsPWUuaWRlbnRpdHkoYS5jZW50ZXJ4K2EucmFkaXVzKk1hdGguY29zKGcpKTtnPWUuaWRlbnRpdHkoYS5jZW50ZXJ5KwphLnJhZGl1cypNYXRoLnNpbihnKSk7cmV0dXJuIGIuX19zdXBlcl9fLl9tYWtlR3JpZC5jYWxsKHRoaXMse3R5cGU6InBhdGgiLHk6W3csZ10seDpbZCxsXX0pfTtiLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm57fX07cmV0dXJuIGJ9KHMpO251bGw9PWMuZ3VpZGUmJihjLmd1aWRlPXt9KTtjLmd1aWRlLmF4aXM9ZnVuY3Rpb24oYyxnKXtpZigieCI9PT1jKXJldHVybiBuZXcgYShnKTtpZigieSI9PT1jKXJldHVybiBuZXcgZChnKTtpZigiciI9PT1jKXJldHVybiBuZXcgaChnKTtpZigidCI9PT1jKXJldHVybiBuZXcgYihnKX07Yy5ndWlkZS5heGVzPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgZihhKX19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLHMsaCxiLGEsZCxlLGs9e30uaGFzT3duUHJvcGVydHksbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt0aGlzLmNvbnN0cnVjdG9yPWF9Zm9yKHZhciBnIGluIGIpay5jYWxsKGIsZykmJihhW2ddPQpiW2ddKTtjLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLl9fc3VwZXJfXz1iLnByb3RvdHlwZTtyZXR1cm4gYX0scD1bXS5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMubGVuZ3RoO2I8YztiKyspaWYoYiBpbiB0aGlzJiZ0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX0sbT1mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19O2E9Y1siY29uc3QiXS5zY2FsZUZucztjLmd1aWRlLmxlZ2VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGh9O2MuZ3VpZGUubGVnZW5kPWZ1bmN0aW9uKGEsYyl7cmV0dXJuImxlZnQiPT09Y3x8InJpZ2h0Ij09PWM/bmV3IGIoYSk6bmV3IGYoYSl9O2g9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3RoaXMubGVnZW5kcz1bXTt0aGlzLmRlbGV0ZWRMZWdlbmRzPVtdfW4oYixhKTtiLnByb3RvdHlwZS5tYWtlPWZ1bmN0aW9uKGEpe3ZhciBiLGQsCmUsdCxmLGssaCxuLEMseSxCLHY7ZT1hLmRvbWFpbnM7bj1hLmxheWVyczt0PWEuZ3VpZGVTcGVjO0I9YS5zY2FsZXM7aD1hLmxheWVyTWFwcGluZzt0aGlzLnBvc2l0aW9uPWEucG9zaXRpb247ZD1hLmRpbXM7bnVsbD09dGhpcy5wb3N0aW9uJiYodGhpcy5wb3N0aW9uPSJyaWdodCIpO2lmKCJub25lIiE9PXRoaXMucG9zaXRpb24pe2I9dGhpcy5fbWVyZ2VBZXMoZSxuKTtmb3Ioaz0wO2s8dGhpcy5sZWdlbmRzLmxlbmd0aDspe0M9dGhpcy5sZWdlbmRzW2tdO3k9ITA7Zm9yKGY9MDtmPGIubGVuZ3RoOyl7YT1iW2ZdO2lmKF8uaXNFcXVhbChhLEMuYWVzKSl7Yi5zcGxpY2UoZiwxKTt5PSExO2JyZWFrfWYrK315Pyh0aGlzLmRlbGV0ZWRMZWdlbmRzLnB1c2goQyksdGhpcy5sZWdlbmRzLnNwbGljZShrLDEpKTprKyt9Qz0wO2ZvcihmPWIubGVuZ3RoO0M8ZjtDKyspYT1iW0NdLHRoaXMubGVnZW5kcy5wdXNoKGMuZ3VpZGUubGVnZW5kKGEsdGhpcy5wb3NpdGlvbikpO2s9dGhpcy5sZWdlbmRzOwp5PVtdO2I9MDtmb3IoZj1rLmxlbmd0aDtiPGY7YisrKUM9a1tiXSxhPUMuYWVzWzBdLHkucHVzaChDLm1ha2Uoe2RvbWFpbjplW2FdLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sZ3VpZGVTcGVjOm51bGwhPSh2PXRbYV0pP3Y6e30sdHlwZTpCW2FdLnRpY2tUeXBlKCksbWFwcGluZzpoLGtleXM6Yy5nZXRMYWJlbChuLGEpLGRpbXM6ZH0pKTtyZXR1cm4geX19O2IucHJvdG90eXBlLl9tZXJnZUFlcz1mdW5jdGlvbihhLGIpe3ZhciBkLGUsdCxmLGssaCxuO2s9W107Zm9yKGQgaW4gYSlpZighKDA8PXAuY2FsbChjWyJjb25zdCJdLm5vTGVnZW5kLGQpfHwodD1fLm1hcChiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1hcHBpbmdbZF19KSxfLmFsbCh0LF8uaXNVbmRlZmluZWQpKSkpe2Y9ITE7aD0wO2ZvcihuPWsubGVuZ3RoO2g8bjtoKyspaWYoZT1rW2hdLF8uaXNFcXVhbChlLm1hcHBlZCx0KSl7ZS5hZXMucHVzaChkKTtmPSEwO2JyZWFrfWZ8fGsucHVzaCh7YWVzOltkXSxtYXBwZWQ6dH0pfXJldHVybiBfLnBsdWNrKGssCiJhZXMiKX07Yi5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtiPXt9O2lmKCJsZWZ0Ij09PShjPXRoaXMucG9zaXRpb24pfHwicmlnaHQiPT09YyliW3RoaXMucG9zaXRpb25dPXRoaXMuX2xlZnRyaWdodFdpZHRoKGEpO2Vsc2UgaWYoInRvcCI9PT0oZD10aGlzLnBvc2l0aW9uKXx8ImJvdHRvbSI9PT1kKWJbdGhpcy5wb3NpdGlvbl09dGhpcy5fdG9wYm90dG9tSGVpZ2h0KGEpO3JldHVybiBifTtiLnByb3RvdHlwZS5fbGVmdHJpZ2h0V2lkdGg9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixrLGgsbjtlPWEuY2hhcnRIZWlnaHQ7Zj0wO2I9MTA7Yz0wO249dGhpcy5sZWdlbmRzO2s9MDtmb3IoaD1uLmxlbmd0aDtrPGg7aysrKWQ9bltrXSxkPWQuZ2V0RGltZW5zaW9uKGEpLGQuaGVpZ2h0K2M+ZSYmKGIrPWYrNSxmPWM9MCksZC53aWR0aD5mJiYoZj1kLndpZHRoKSxjKz1kLmhlaWdodDtyZXR1cm4gYitmfTtiLnByb3RvdHlwZS5fdG9wYm90dG9tSGVpZ2h0PQpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO2M9MTA7Zj10aGlzLmxlZ2VuZHM7ZD0wO2ZvcihlPWYubGVuZ3RoO2Q8ZTtkKyspYj1mW2RdLGI9Yi5nZXREaW1lbnNpb24oYSksYys9Yi5oZWlnaHQrMTA7cmV0dXJuIGN9O2IucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGssaDtlPWIoKTtoPXRoaXMuZGVsZXRlZExlZ2VuZHM7Zj0wO2ZvcihrPWgubGVuZ3RoO2Y8aztmKyspZD1oW2ZdLGQuZGlzcG9zZShlKTt0aGlzLmRlbGV0ZWRMZWdlbmRzPVtdO2lmKCJsZWZ0Ij09PXRoaXMucG9zaXRpb258fCJyaWdodCI9PT10aGlzLnBvc2l0aW9uKXJldHVybiB0aGlzLl9yZW5kZXJWKGEsYixjKTtpZigidG9wIj09PXRoaXMucG9zaXRpb258fCJib3R0b20iPT09dGhpcy5wb3NpdGlvbilyZXR1cm4gdGhpcy5fcmVuZGVySChhLGIsYyl9O2IucHJvdG90eXBlLl9yZW5kZXJWPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsayxoLG4sbSx5LEIsdix4LEQsRjtkPWEucGFkZGluZ1RvcCsKYS5ndWlkZVRvcDtlPSJsZWZ0Ij09PXRoaXMucG9zaXRpb24/YS5wYWRkaW5nTGVmdDphLndpZHRoLWEuZ3VpZGVSaWdodC1hLnBhZGRpbmdSaWdodDtoPTA7az1hLmhlaWdodC1hLmd1aWRlVG9wLWEucGFkZGluZ1RvcDt5PTEwO209InJpZ2h0Ij09PXRoaXMucG9zaXRpb24/Yy5yaWdodDowO0Q9dGhpcy5sZWdlbmRzO0Y9W107dj0wO2Zvcih4PUQubGVuZ3RoO3Y8eDt2KyspZj1EW3ZdLG49Zi5nZXREaW1lbnNpb24oYSksbi5oZWlnaHQrYy55PmsmJihtKz1oKzUsaD15PTApLG4ud2lkdGg+aCYmKGg9bi53aWR0aCksQj17eDptK2UseTp5K2R9LGYucmVuZGVyKGIoQiwhMSwhMSksaCksRi5wdXNoKHkrPW4uaGVpZ2h0KTtyZXR1cm4gRn07Yi5wcm90b3R5cGUuX3JlbmRlckg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixrLGgsbjtkPWEucGFkZGluZ0xlZnQ7ZT0idG9wIj09PXRoaXMucG9zaXRpb24/YS5wYWRkaW5nVG9wOmEuaGVpZ2h0LWEuZ3VpZGVCb3R0b20tYS5wYWRkaW5nQm90dG9tOwplPXt4OmQseToidG9wIj09PXRoaXMucG9zaXRpb24/Yy50b3ArZTpjLmJvdHRvbStlKzEwfTtoPXRoaXMubGVnZW5kcztuPVtdO2Y9MDtmb3Ioaz1oLmxlbmd0aDtmPGs7ZisrKWM9aFtmXSxkPWMuZ2V0RGltZW5zaW9uKGEpLGMucmVuZGVyKGIoZSwhMSwhMSkpLG4ucHVzaChlLnkrPWQuaGVpZ2h0KzEwKTtyZXR1cm4gbn07Yi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO2U9dGhpcy5sZWdlbmRzO2Y9W107Yz0wO2ZvcihkPWUubGVuZ3RoO2M8ZDtjKyspYj1lW2NdLGYucHVzaChiLmRpc3Bvc2UoYSkpO3JldHVybiBmfTtyZXR1cm4gYn0oYy5HdWlkZVNldCk7cz1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEpe3RoaXMuYWVzPWE7dGhpcy5fbWFrZUV2dERhdGE9bSh0aGlzLl9tYWtlRXZ0RGF0YSx0aGlzKTt0aGlzLl9tYWtlVGljaz1tKHRoaXMuX21ha2VUaWNrLHRoaXMpO3RoaXMuZ2VvbWV0cnk9bmV3IGMuR2VvbWV0cnkoImd1aWRlIil9bihkLGIpOwpkLnByb3RvdHlwZS5USVRMRUhFSUdIVD0xNTtkLnByb3RvdHlwZS5USUNLSEVJR0hUPTEyO2QucHJvdG90eXBlLlNQQUNJTkc9MTA7ZC5wcm90b3R5cGUubWFrZT1mdW5jdGlvbihhKXt2YXIgYixkLGUsZixrO2I9YS5kb21haW47ZT1hLnR5cGU7ZD1hLmd1aWRlU3BlYzt0aGlzLm1hcHBpbmc9YS5tYXBwaW5nO3RoaXMucG9zaXRpb249YS5wb3NpdGlvbjthPWEua2V5czt0aGlzLnRpdGxldGV4dD1udWxsIT0oZj1kLnRpdGxlKT9mOmE7cmV0dXJuIGs9Yy50aWNrLm1ha2UoYixkLGUpLHRoaXMudGlja3M9ay50aWNrcyxrfTtkLnByb3RvdHlwZS5jYWxjdWxhdGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2I9e307Yi50aXRsZT17bWFya3M6ezA6dGhpcy5fbWFrZVRpdGxlKHRoaXMudGl0bGV0ZXh0KX19O2U9dGhpcy50aWNrcztmb3IoYyBpbiBlKWE9ZVtjXSxkPXt9LGQudGljaz10aGlzLl9tYWtlVGljayhhKSxkLnRleHQ9dGhpcy5fbWFrZUxhYmVsKGEpLGE9dGhpcy5fbWFrZUV2dERhdGEoYSksCmJbY109e21hcmtzOmQsZXZ0RGF0YTphfTtyZXR1cm4gYn07ZC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe3RoaXMuZ2VvbWV0cnkuc2V0KHRoaXMuY2FsY3VsYXRlKCkpO3JldHVybiB0aGlzLmdlb21ldHJ5LnJlbmRlcihhKX07ZC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZW9tZXRyeS5kaXNwb3NlKGEpfTtkLnByb3RvdHlwZS5fbWFrZVRpdGxlPWZ1bmN0aW9uKGIsYyl7bnVsbD09YyYmKGM9e3g6MCx5OjB9KTtyZXR1cm57dHlwZToidGV4dCIseDphLmlkZW50aXR5KGMueCs1KSx5OmEuaWRlbnRpdHkoYy55KSxjb2xvcjphLmlkZW50aXR5KCJibGFjayIpLHRleHQ6YiwidGV4dC1hbmNob3IiOiJzdGFydCJ9fTtkLnByb3RvdHlwZS5fbWFrZUxhYmVsPWZ1bmN0aW9uKGIsYyl7Y3x8KGM9e3g6MCx5OjE1KzEyKmIuaW5kZXh9KTtyZXR1cm57dHlwZToidGV4dCIseDphLmlkZW50aXR5KGMueCsyMCkseTphLmlkZW50aXR5KGMueSsxKSxjb2xvcjphLmlkZW50aXR5KCJibGFjayIpLAp0ZXh0OmIudmFsdWUsInRleHQtYW5jaG9yIjoic3RhcnQifX07ZC5wcm90b3R5cGUuX21ha2VUaWNrPWZ1bmN0aW9uKGIsZCl7dmFyIGUsZixrLGg7ZHx8KGQ9e3g6MCx5OjE1KzEyKmIuaW5kZXh9KTtmPXt0eXBlOiJjaXJjbGUiLHg6YS5pZGVudGl0eShkLngrMTApLHk6YS5pZGVudGl0eShkLnkpLGNvbG9yOmEuaWRlbnRpdHkoInN0ZWVsYmx1ZSIpfTtoPXRoaXMubWFwcGluZztmb3IoZSBpbiBoKWs9aFtlXSwwPD1wLmNhbGwoY1siY29uc3QiXS5ub0xlZ2VuZCxlKXx8KGs9a1swXSwwPD1wLmNhbGwodGhpcy5hZXMsZSk/ZltlXT1iLmxvY2F0aW9uOm51bGwhPWsudHlwZSYmImNvbnN0Ij09PWsudHlwZT9mW2VdPWEuaWRlbnRpdHkoay52YWx1ZSk6Xy5pc09iamVjdChrKT9mW2VdPWEuaWRlbnRpdHkoY1siY29uc3QiXS5kZWZhdWx0c1tlXSk6ZltlXT1hLmlkZW50aXR5KGspKTtfLmlzT2JqZWN0KGYuc2l6ZSkmJihmLnNpemU9YS5pZGVudGl0eSg1KSk7cmV0dXJuIGZ9O2QucHJvdG90eXBlLl9tYWtlRXZ0RGF0YT0KZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixrLGg7Yz17fTtoPXRoaXMubWFwcGluZztmb3IoYiBpbiBoKWZvcihlPWhbYl0sZj0wLGs9ZS5sZW5ndGg7ZjxrO2YrKylkPWVbZl0sMDw9cC5jYWxsKHRoaXMuYWVzLGIpJiYibWFwIj09PWQudHlwZSYmKGNbZC52YWx1ZV09YS5ldnREYXRhKTtyZXR1cm4gY307cmV0dXJuIGR9KGMuR3VpZGUpO2I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBkPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1uKGIsYSk7Yi5wcm90b3R5cGUubWFrZT1mdW5jdGlvbihhKXt2YXIgZDtiLl9fc3VwZXJfXy5tYWtlLmNhbGwodGhpcyxhKTt0aGlzLmhlaWdodD10aGlzLlRJVExFSEVJR0hUK3RoaXMuU1BBQ0lORyt0aGlzLlRJQ0tIRUlHSFQqXy5zaXplKHRoaXMudGlja3MpO2Q9Yy5zdHJTaXplKHRoaXMudGl0bGV0ZXh0KTthPV8ubWF4KF8ubWFwKHRoaXMudGlja3MsZnVuY3Rpb24oYSl7cmV0dXJuIGMuc3RyU2l6ZShhLnZhbHVlKX0pKTsKcmV0dXJuIHRoaXMubWF4d2lkdGg9TWF0aC5tYXgoZCxhKX07Yi5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJue3Bvc2l0aW9uOnRoaXMucG9zaXRpb24saGVpZ2h0OnRoaXMuaGVpZ2h0LHdpZHRoOjE1K3RoaXMubWF4d2lkdGh9fTtyZXR1cm4gYn0ocyk7Zj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIGU9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfW4oYixhKTtiLnByb3RvdHlwZS5USUNLU1BBQ0lORz0yNTtiLnByb3RvdHlwZS5tYWtlPWZ1bmN0aW9uKGEpe3ZhciBkLGUsZixrO2IuX19zdXBlcl9fLm1ha2UuY2FsbCh0aGlzLGEpO3RoaXMubWF4d2lkdGg9YS5kaW1zLndpZHRoO3RoaXMuaGVpZ2h0PXRoaXMuVElUTEVIRUlHSFQrdGhpcy5TUEFDSU5HO2E9MDt0aGlzLmhlaWdodCs9dGhpcy5USUNLSEVJR0hUO2s9dGhpcy50aWNrcztlPTA7Zm9yKGY9ay5sZW5ndGg7ZTxmO2UrKylkPWtbZV0sZD1jLnN0clNpemUoZC52YWx1ZSkrCnRoaXMuVElDS1NQQUNJTkcsYStkPHRoaXMubWF4d2lkdGg/YSs9ZDoodGhpcy5oZWlnaHQrPXRoaXMuVElDS0hFSUdIVCxhPWQpO3JldHVybiBudWxsfTtiLnByb3RvdHlwZS5jYWxjdWxhdGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGQsZSxmLGssaDtiPXt9O2IudGl0bGU9e21hcmtzOnswOnRoaXMuX21ha2VUaXRsZSh0aGlzLnRpdGxldGV4dCl9fTtmPXt4OjAseTp0aGlzLlRJVExFSEVJR0hUfTtoPXRoaXMudGlja3M7Zm9yKGQgaW4gaClrPWhbZF0sZT17fSxlLnRpY2s9dGhpcy5fbWFrZVRpY2soayxmKSxlLnRleHQ9dGhpcy5fbWFrZUxhYmVsKGssZiksYT10aGlzLl9tYWtlRXZ0RGF0YShrLGYpLGJbZF09e21hcmtzOmUsZXZ0RGF0YTphfSxhPWMuc3RyU2l6ZShrLnZhbHVlKSt0aGlzLlRJQ0tTUEFDSU5HLGYueCthPHRoaXMubWF4d2lkdGg/Zi54Kz1hOihmLng9MCxmLnkrPXRoaXMuVElDS0hFSUdIVCk7cmV0dXJuIGJ9O2IucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybntwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLApoZWlnaHQ6dGhpcy5oZWlnaHQsd2lkdGg6ImFsbCJ9fTtyZXR1cm4gYn0ocyl9KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmLHMsaCxiLGEsZCxlLGssbixwLG0scixxLGwsZyx3LHUsdD1mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19LHo9e30uaGFzT3duUHJvcGVydHksRT1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt0aGlzLmNvbnN0cnVjdG9yPWF9Zm9yKHZhciBkIGluIGIpei5jYWxsKGIsZCkmJihhW2RdPWJbZF0pO2MucHJvdG90eXBlPWIucHJvdG90eXBlO2EucHJvdG90eXBlPW5ldyBjO2EuX19zdXBlcl9fPWIucHJvdG90eXBlO3JldHVybiBhfTtwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXt0aGlzLmY9bnVsbH1hLnByb3RvdHlwZS5tYWtlPWZ1bmN0aW9uKGEpe3RoaXMuZG9tYWluPWE7dGhpcy5jb21wYXJlPWMuZG9tYWluLmNvbXBhcmUoYSk7aWYoIWEpcmV0dXJuIHRoaXMuX21ha2VOb25lKCk7CnN3aXRjaChhLnR5cGUpe2Nhc2UgIm51bSI6cmV0dXJuIHRoaXMuX21ha2VOdW0oKTtjYXNlICJkYXRlIjpyZXR1cm4gdGhpcy5fbWFrZURhdGUoKTtjYXNlICJjYXQiOnJldHVybiB0aGlzLl9tYWtlQ2F0KCl9fTthLnByb3RvdHlwZS5fbWFrZU5vbmU9ZnVuY3Rpb24oKXt0aHJvdyBjLmVycm9yLmltcGwoIllvdSBhcmUgdXNpbmcgYSBzY2FsZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgbnVsbCB2YWx1ZXMiKTt9O2EucHJvdG90eXBlLl9tYWtlTnVtPWZ1bmN0aW9uKCl7dGhyb3cgYy5lcnJvci5pbXBsKCJZb3UgYXJlIHVzaW5nIGEgc2NhbGUgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IG51bWJlcnMiKTt9O2EucHJvdG90eXBlLl9tYWtlRGF0ZT1mdW5jdGlvbigpe3Rocm93IGMuZXJyb3IuaW1wbCgiWW91IGFyZSB1c2luZyBhIHNjYWxlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBkYXRlcyIpO307YS5wcm90b3R5cGUuX21ha2VDYXQ9ZnVuY3Rpb24oKXt0aHJvdyBjLmVycm9yLmltcGwoIllvdSBhcmUgdXNpbmcgYSBzY2FsZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgY2F0ZWdvcmllcyIpOwp9O2EucHJvdG90eXBlLnRpY2tUeXBlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZG9tYWluKXJldHVybiB0aGlzLl90aWNrTm9uZSgpO3N3aXRjaCh0aGlzLmRvbWFpbi50eXBlKXtjYXNlICJudW0iOnJldHVybiB0aGlzLl90aWNrTnVtKCk7Y2FzZSAiZGF0ZSI6cmV0dXJuIHRoaXMuX3RpY2tEYXRlKCk7Y2FzZSAiY2F0IjpyZXR1cm4gdGhpcy5fdGlja0NhdCgpfX07YS5wcm90b3R5cGUuX3RpY2tOb25lPWZ1bmN0aW9uKCl7cmV0dXJuIm5vbmUifTthLnByb3RvdHlwZS5fdGlja051bT1mdW5jdGlvbigpe3JldHVybiJudW0ifTthLnByb3RvdHlwZS5fdGlja0RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4iZGF0ZSJ9O2EucHJvdG90eXBlLl90aWNrQ2F0PWZ1bmN0aW9uKCl7cmV0dXJuImNhdCJ9O2EucHJvdG90eXBlLl9pZGVudGl0eVdyYXBwZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBfLmlzT2JqZWN0KGIpJiYic2NhbGVmbiI9PT1iLnQmJiJpZGVudGl0eSI9PT0KYi5mP2IudjphKGIpfX07cmV0dXJuIGF9KCk7Zj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3RoaXMuX2NhdFdyYXBwZXI9dCh0aGlzLl9jYXRXcmFwcGVyLHRoaXMpO3RoaXMuX2RhdGVXcmFwcGVyPXQodGhpcy5fZGF0ZVdyYXBwZXIsdGhpcyk7dGhpcy5fbnVtV3JhcHBlcj10KHRoaXMuX251bVdyYXBwZXIsdGhpcyk7dGhpcy5maW52PXRoaXMuZj1udWxsfUUoYixhKTtiLnByb3RvdHlwZS5tYWtlPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLnJhbmdlPWM7dGhpcy5zcGFjZT1kO18uaXNOdW1iZXIodGhpcy5zcGFjZSl8fCh0aGlzLnNwYWNlPTAuMDUpO3JldHVybiBiLl9fc3VwZXJfXy5tYWtlLmNhbGwodGhpcyxhKX07Yi5wcm90b3R5cGUuX21ha2VOb25lPWZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzO2E9KHRoaXMucmFuZ2UubWF4LXRoaXMucmFuZ2UubWluKSp0aGlzLnNwYWNlO3RoaXMuZj10aGlzLl9OYU5DaGVja1dyYXAoZnVuY3Rpb24oYyl7dmFyIGQ7aWYoXy5pc09iamVjdChjKSl7aWYoImlkZW50aXR5Ij09PQpjLmYpcmV0dXJuIGMudjtpZigibWlkZGxlIj09PWMuZilyZXR1cm4gYi5yYW5nZS5tYXgvMitiLnJhbmdlLm1pbi8yO2lmKCJtYXgiPT09Yy5mKXJldHVybiBiLnJhbmdlLm1heDtpZigibWluIj09PWMuZilyZXR1cm4gYi5yYW5nZS5taW47aWYoInVwcGVyIj09PWMuZiYmIWMubSlyZXR1cm4gYi5yYW5nZS5tYXgtYTtpZigibG93ZXIiPT09Yy5mJiYhYy5tKXJldHVybiBiLnJhbmdlLm1pbithO2Q9KGIucmFuZ2UubWF4LWIucmFuZ2UubWluLTIqYSkvYy5tO2lmKCJ1cHBlciI9PT1jLmYpcmV0dXJuIGIucmFuZ2UubWluK2ErKGMubisxKSpkO2lmKCJsb3dlciI9PT1jLmYpcmV0dXJuIGIucmFuZ2UubWluK2ErYy5uKmR9cmV0dXJuIGIucmFuZ2UubWF4LzIrYi5yYW5nZS5taW4vMn0pO3JldHVybiB0aGlzLmZpbnY9ZnVuY3Rpb24oKXtyZXR1cm57fX19O2IucHJvdG90eXBlLl9OYU5DaGVja1dyYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2lmKGMuaXNEZWZpbmVkKGIpKXtiPQphKGIpO2lmKGlzTmFOKGIpfHxJbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWIpdGhyb3cgYy5lcnJvci5zY2FsZSgiU2NhbGUgb3V0cHV0ZWQgYSB2YWx1ZSB0aGF0IGlzIG5vdCBmaW5pdGUuIik7cmV0dXJuIGJ9fX07Yi5wcm90b3R5cGUuX251bVdyYXBwZXI9ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzO3JldHVybiB0aGlzLl9OYU5DaGVja1dyYXAoZnVuY3Rpb24oZyl7dmFyIGUsZixsO2lmKF8uaXNPYmplY3QoZykpe2lmKCJzY2FsZWZuIj09PWcudCl7aWYoImlkZW50aXR5Ij09PWcuZilyZXR1cm4gZy52O2lmKCJtaWRkbGUiPT09Zy5mKXJldHVybiBiKGcudithLmJ3LzIpO2lmKCJtYXgiPT09Zy5mKXJldHVybiBkLnJhbmdlLm1heCtnLnY7aWYoIm1pbiI9PT1nLmYpcmV0dXJuIGQucmFuZ2UubWluK2cudjtpZigidXBwZXIiPT09KGU9Zy5mKXx8Imxvd2VyIj09PWUpe2w9YihnLnYrYS5idyk7ZT1iKGcudik7Zj0obC1lKSpkLnNwYWNlO2lmKCJ1cHBlciI9PT1nLmYmJiFnLm0pcmV0dXJuIGwtCmY7aWYoImxvd2VyIj09PWcuZiYmIWcubSlyZXR1cm4gZStmO2w9KGwtZS0yKmYpL2cubTtpZigidXBwZXIiPT09Zy5mKXJldHVybiBlK2YrKGcubisxKSpsO2lmKCJsb3dlciI9PT1nLmYpcmV0dXJuIGUrZitnLm4qbH19dGhyb3cgYy5lcnJvci5pbnB1dCgiVW5rbm93biBvYmplY3QgIitnKyIgaXMgcGFzc2VkIHRvIGEgc2NhbGUiKTt9cmV0dXJuIGIoZyl9KX07Yi5wcm90b3R5cGUuX2RhdGVXcmFwcGVyPWZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcztyZXR1cm4gdGhpcy5fTmFOQ2hlY2tXcmFwKGZ1bmN0aW9uKGcpe3ZhciBlLGYsbCxrO2lmKF8uaXNPYmplY3QoZykpe2lmKCJzY2FsZWZuIj09PWcudCl7aWYoImlkZW50aXR5Ij09PWcuZilyZXR1cm4gZy52O2lmKCJtYXgiPT09Zy5mKXJldHVybiBkLnJhbmdlLm1heCtnLnY7aWYoIm1pbiI9PT1nLmYpcmV0dXJuIGQucmFuZ2UubWluK2cudjtpZigidXBwZXIiPT09KGU9Zy5mKXx8Im1pZGRsZSI9PT1lfHwibG93ZXIiPT09ZSl7az0KZnVuY3Rpb24oYSxiLGMpe3ZhciBkO251bGw9PWMmJihjPTApO2Q9bW9tZW50LnVuaXgoZy52KS5zdGFydE9mKGIpO2RbYl0oYSpNYXRoLmZsb29yKGRbYl0oKS9hKSthKmMpO3JldHVybiBkLnVuaXgoKX07bD1mdW5jdGlvbigpe3N3aXRjaChhLmJ3KXtjYXNlICJ3ZWVrIjpyZXR1cm4gbW9tZW50LnVuaXgoZy52KS5kYXkoNykudW5peCgpO2Nhc2UgInR3b21vbnRoIjpyZXR1cm4gaygyLCJtb250aCIpO2Nhc2UgInF1YXJ0ZXIiOnJldHVybiBrKDQsIm1vbnRoIik7Y2FzZSAic2l4bW9udGgiOnJldHVybiBrKDYsIm1vbnRoIik7Y2FzZSAidHdveWVhciI6cmV0dXJuIGsoMiwieWVhciIpO2Nhc2UgImZpdmV5ZWFyIjpyZXR1cm4gayg1LCJ5ZWFyIik7Y2FzZSAiZGVjYWRlIjpyZXR1cm4gaygxMCwieWVhciIpO2RlZmF1bHQ6cmV0dXJuIG1vbWVudC51bml4KGcudikuZW5kT2YoYS5idykudW5peCgpfX0oKTtsPWIobCk7ZT1mdW5jdGlvbigpe3N3aXRjaChhLmJ3KXtjYXNlICJ3ZWVrIjpyZXR1cm4gbW9tZW50LnVuaXgoZy52KS5kYXkoMCkudW5peCgpOwpjYXNlICJ0d29tb250aCI6cmV0dXJuIGsoMiwibW9udGgiLDEpO2Nhc2UgInF1YXJ0ZXIiOnJldHVybiBrKDQsIm1vbnRoIiwxKTtjYXNlICJzaXhtb250aCI6cmV0dXJuIGsoNiwibW9udGgiLDEpO2Nhc2UgInR3b3llYXIiOnJldHVybiBrKDIsInllYXIiLDEpO2Nhc2UgImZpdmV5ZWFyIjpyZXR1cm4gayg1LCJ5ZWFyIiwxKTtjYXNlICJkZWNhZGUiOnJldHVybiBrKDEwLCJ5ZWFyIiwxKTtkZWZhdWx0OnJldHVybiBtb21lbnQudW5peChnLnYpLnN0YXJ0T2YoYS5idykudW5peCgpfX0oKTtlPWIoZSk7Zj0obC1lKSpkLnNwYWNlO2lmKCJtaWRkbGUiPT09Zy5mKXJldHVybiBsLzIrZS8yO2lmKCJ1cHBlciI9PT1nLmYmJiFnLm0pcmV0dXJuIGwtZjtpZigibG93ZXIiPT09Zy5mJiYhZy5tKXJldHVybiBlK2Y7bD0obC1lLTIqZikvZy5tO2lmKCJ1cHBlciI9PT1nLmYpcmV0dXJuIGUrZisoZy5uKzEpKmw7aWYoImxvd2VyIj09PWcuZilyZXR1cm4gZStmK2cubipsfX10aHJvdyBjLmVycm9yLmlucHV0KCJVbmtub3duIG9iamVjdCAiKwpnKyIgaXMgcGFzc2VkIHRvIGEgc2NhbGUiKTt9cmV0dXJuIGIoZyl9KX07Yi5wcm90b3R5cGUuX2NhdFdyYXBwZXI9ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzO3JldHVybiB0aGlzLl9OYU5DaGVja1dyYXAoZnVuY3Rpb24oZyl7dmFyIGUsZixsO2Y9YSpkLnNwYWNlO2lmKF8uaXNPYmplY3QoZykpe2lmKCJzY2FsZWZuIj09PWcudCl7aWYoImlkZW50aXR5Ij09PWcuZilyZXR1cm4gZy52O2lmKCJtYXgiPT09Zy5mKXJldHVybiBkLnJhbmdlLm1heCtnLnY7aWYoIm1pbiI9PT1nLmYpcmV0dXJuIGQucmFuZ2UubWluK2cudjtpZigidXBwZXIiPT09KGU9Zy5mKXx8Im1pZGRsZSI9PT1lfHwibG93ZXIiPT09ZSl7bD1iKGcudikrYTtlPWIoZy52KTtpZigibWlkZGxlIj09PWcuZilyZXR1cm4gbC8yK2UvMjtpZigidXBwZXIiPT09Zy5mJiYhZy5tKXJldHVybiBsLWY7aWYoImxvd2VyIj09PWcuZiYmIWcubSlyZXR1cm4gZStmO2w9KGwtZS0yKmYpL2cubTtpZigidXBwZXIiPT09Zy5mKXJldHVybiBlKwpmKyhnLm4rMSkqbDtpZigibG93ZXIiPT09Zy5mKXJldHVybiBlK2YrZy5uKmx9fXRocm93IGMuZXJyb3IuaW5wdXQoIlVua25vd24gb2JqZWN0ICIrZysiIGlzIHBhc3NlZCB0byBhIHNjYWxlIik7fXJldHVybiBiKGcpK2EvMn0pfTtyZXR1cm4gYn0ocCk7ZD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIG09Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUUoYixhKTtiLnByb3RvdHlwZS5fbWFrZU51bT1mdW5jdGlvbigpe3ZhciBhLGI7Yj1jLmxpbmVhcih0aGlzLmRvbWFpbi5taW4sdGhpcy5yYW5nZS5taW4sdGhpcy5kb21haW4ubWF4LHRoaXMucmFuZ2UubWF4KTthPWMubGluZWFyKHRoaXMucmFuZ2UubWluLHRoaXMuZG9tYWluLm1pbix0aGlzLnJhbmdlLm1heCx0aGlzLmRvbWFpbi5tYXgpO3RoaXMuZj10aGlzLl9udW1XcmFwcGVyKHRoaXMuZG9tYWluLGIpO3JldHVybiB0aGlzLmZpbnY9ZnVuY3Rpb24oYixjKXt2YXIgZDtkPVthKGIpLAphKGMpXTtyZXR1cm57Z2U6Xy5taW4oZCksbGU6Xy5tYXgoZCl9fX07Yi5wcm90b3R5cGUuX21ha2VEYXRlPWZ1bmN0aW9uKCl7dmFyIGEsYjtiPWMubGluZWFyKHRoaXMuZG9tYWluLm1pbix0aGlzLnJhbmdlLm1pbix0aGlzLmRvbWFpbi5tYXgsdGhpcy5yYW5nZS5tYXgpO2E9Yy5saW5lYXIodGhpcy5yYW5nZS5taW4sdGhpcy5kb21haW4ubWluLHRoaXMucmFuZ2UubWF4LHRoaXMuZG9tYWluLm1heCk7dGhpcy5mPXRoaXMuX2RhdGVXcmFwcGVyKHRoaXMuZG9tYWluLGIpO3JldHVybiB0aGlzLmZpbnY9ZnVuY3Rpb24oYixjKXt2YXIgZDtkPVthKGIpLGEoYyldO3JldHVybntnZTpfLm1pbihkKSxsZTpfLm1heChkKX19fTtiLnByb3RvdHlwZS5fbWFrZUNhdD1mdW5jdGlvbigpe3ZhciBhLGI9dGhpczthPSh0aGlzLnJhbmdlLm1heC10aGlzLnJhbmdlLm1pbikvdGhpcy5kb21haW4ubGV2ZWxzLmxlbmd0aDt0aGlzLmY9dGhpcy5fY2F0V3JhcHBlcihhLGZ1bmN0aW9uKGMpe2M9Xy5pbmRleE9mKGIuZG9tYWluLmxldmVscywKYyk7cmV0dXJuLTE9PT1jP251bGw6Yi5yYW5nZS5taW4rYyphfSk7cmV0dXJuIHRoaXMuZmludj1mdW5jdGlvbihjLGQpe3ZhciBnO2Q8YyYmKGc9W2QsY10sYz1nWzBdLGQ9Z1sxXSk7cmV0dXJueyJpbiI6Yi5kb21haW4ubGV2ZWxzLnNsaWNlKE1hdGguZmxvb3IoYy9hKSwrTWF0aC5mbG9vcihkL2EpKzF8fDlFOSl9fX07cmV0dXJuIGJ9KGYpO2U9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiByPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1FKGIsYSk7Yi5wcm90b3R5cGUuX21ha2VOdW09ZnVuY3Rpb24oKXt2YXIgYSxiLGQsZztpZigwPnRoaXMuZG9tYWluLm1pbil0aHJvdyBjLmVycm9yLmlucHV0KCJMb2cgc2NhbGUgY2Fubm90IGhhbmRsZSB6ZXJvIG9yIG5lZ2F0aXZlIGlucHV0LiIpO2E9TWF0aC5sb2c7ZD1jLmxpbmVhcihhKHRoaXMuZG9tYWluLm1pbiksdGhpcy5yYW5nZS5taW4sYSh0aGlzLmRvbWFpbi5tYXgpLHRoaXMucmFuZ2UubWF4KTsKdGhpcy5mPXRoaXMuX251bVdyYXBwZXIodGhpcy5kb21haW4sZnVuY3Rpb24oYil7cmV0dXJuIGQoYShiKSl9KTtnPWMubGluZWFyKHRoaXMucmFuZ2UubWluLGEodGhpcy5kb21haW4ubWluKSx0aGlzLnJhbmdlLm1heCxhKHRoaXMuZG9tYWluLm1heCkpO2I9ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguZXhwKGcoYSkpfTtyZXR1cm4gdGhpcy5maW52PWZ1bmN0aW9uKGEsYyl7dmFyIGQ7ZD1bYihhKSxiKGMpXTtyZXR1cm57Z2U6Xy5taW4oZCksbGU6Xy5tYXgoZCl9fX07Yi5wcm90b3R5cGUuX3RpY2tOdW09ZnVuY3Rpb24oKXtyZXR1cm4ibnVtLWxvZyJ9O3JldHVybiBifShmKTtmPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt0aGlzLl9tYWtlRGF0ZT10KHRoaXMuX21ha2VEYXRlLHRoaXMpO3RoaXMuX21ha2VOdW09dCh0aGlzLl9tYWtlTnVtLHRoaXMpO3JldHVybiBxPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1FKGIsYSk7Yi5wcm90b3R5cGUuX21ha2VOdW09CmZ1bmN0aW9uKCl7dmFyIGEsYixkO2E9MD09PXRoaXMuZG9tYWluLm1pbj8wOjE7Yj1NYXRoLnNxcnQ7ZD1jLmxpbmVhcihiKHRoaXMuZG9tYWluLm1pbiksYSxiKHRoaXMuZG9tYWluLm1heCksMTApO3JldHVybiB0aGlzLmY9dGhpcy5faWRlbnRpdHlXcmFwcGVyKGZ1bmN0aW9uKGEpe3JldHVybiBkKGIoYSkpfSl9O2IucHJvdG90eXBlLl9tYWtlRGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYWtlTnVtKCl9O3JldHVybiBifShwKTtrPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt0aGlzLl9tYWtlRGF0ZT10KHRoaXMuX21ha2VEYXRlLHRoaXMpO3RoaXMuX21ha2VOdW09dCh0aGlzLl9tYWtlTnVtLHRoaXMpO3JldHVybiBsPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1FKGIsYSk7Yi5wcm90b3R5cGUuX21ha2VOdW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mPXRoaXMuX2lkZW50aXR5V3JhcHBlcihjLmxpbmVhcih0aGlzLmRvbWFpbi5taW4sCjA9PT10aGlzLmRvbWFpbi5taW4/MDowLjEsdGhpcy5kb21haW4ubWF4LDEpKX07Yi5wcm90b3R5cGUuX21ha2VEYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21ha2VOdW0oKX07cmV0dXJuIGJ9KHApO249ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3RoaXMuX21ha2VDYXQ9dCh0aGlzLl9tYWtlQ2F0LHRoaXMpO3JldHVybiBnPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1FKGIsYSk7Yi5wcm90b3R5cGUuX21ha2VDYXQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZD10aGlzO2M9dGhpcy5kb21haW4ubGV2ZWxzLmxlbmd0aDtpZig5Pj1jKXJldHVybiBhPSIjRTQxQTFDICMzNzdFQjggIzREQUY0QSAjOTg0RUEzICNGRjdGMDAgI0ZGRkYzMyAjQTY1NjI4ICNGNzgxQkYgIzk5OTk5OSIuc3BsaXQoIiAiKSx0aGlzLmY9ZnVuY3Rpb24oYil7Yj1fLmluZGV4T2YoZC5kb21haW4ubGV2ZWxzLGIpO3JldHVybiBhW2JdfTtiPWZ1bmN0aW9uKGEpe3JldHVybiBfLmluZGV4T2YoZC5kb21haW4ubGV2ZWxzLAphKS9jKzEvKDIqYyl9O3JldHVybiB0aGlzLmY9ZnVuY3Rpb24oYSl7cmV0dXJuIFJhcGhhZWwuaHNsKGIoYSksMC41LDAuNSl9fTtyZXR1cm4gYn0ocCk7aD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3RoaXMuX21ha2VEYXRlPXQodGhpcy5fbWFrZURhdGUsdGhpcyk7dGhpcy5fbWFrZU51bT10KHRoaXMuX21ha2VOdW0sdGhpcyk7dGhpcy5sb3dlcj1hLmxvd2VyO3RoaXMudXBwZXI9YS51cHBlcn1FKGIsYSk7Yi5wcm90b3R5cGUuX21ha2VOdW09ZnVuY3Rpb24oKXt2YXIgYSxiLGQsZyxlO2Q9UmFwaGFlbC5jb2xvcih0aGlzLmxvd2VyKTtlPVJhcGhhZWwuY29sb3IodGhpcy51cHBlcik7Zz1jLmxpbmVhcih0aGlzLmRvbWFpbi5taW4sZC5yLHRoaXMuZG9tYWluLm1heCxlLnIpO2I9Yy5saW5lYXIodGhpcy5kb21haW4ubWluLGQuZyx0aGlzLmRvbWFpbi5tYXgsZS5nKTthPWMubGluZWFyKHRoaXMuZG9tYWluLm1pbixkLmIsdGhpcy5kb21haW4ubWF4LGUuYik7cmV0dXJuIHRoaXMuZj0KdGhpcy5faWRlbnRpdHlXcmFwcGVyKGZ1bmN0aW9uKGMpe3JldHVybiBSYXBoYWVsLnJnYihnKGMpLGIoYyksYShjKSl9KX07Yi5wcm90b3R5cGUuX21ha2VEYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21ha2VOdW0oKX07cmV0dXJuIGJ9KHApO2I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt0aGlzLl9tYWtlRGF0ZT10KHRoaXMuX21ha2VEYXRlLHRoaXMpO3RoaXMuX21ha2VDYXQ9dCh0aGlzLl9tYWtlQ2F0LHRoaXMpO3RoaXMuX21ha2VOdW09dCh0aGlzLl9tYWtlTnVtLHRoaXMpO3RoaXMubG93ZXI9YS5sb3dlcjt0aGlzLm1pZGRsZT1hLm1pZGRsZTt0aGlzLnVwcGVyPWEudXBwZXI7dGhpcy5taWRwb2ludD1hLm1pZHBvaW50O251bGw9PXRoaXMubWlkcG9pbnQmJih0aGlzLm1pZHBvaW50PTApfUUoYixhKTtiLnByb3RvdHlwZS5fbWFrZU51bT1mdW5jdGlvbigpe3ZhciBhLGIsZCxnLGUsZixsLGssaCx0PXRoaXM7ZT1SYXBoYWVsLmNvbG9yKHRoaXMubG93ZXIpO2Y9ClJhcGhhZWwuY29sb3IodGhpcy5taWRkbGUpO2g9UmFwaGFlbC5jb2xvcih0aGlzLnVwcGVyKTtsPWMubGluZWFyKHRoaXMuZG9tYWluLm1pbixlLnIsdGhpcy5taWRwb2ludCxmLnIpO2Q9Yy5saW5lYXIodGhpcy5kb21haW4ubWluLGUuZyx0aGlzLm1pZHBvaW50LGYuZyk7YT1jLmxpbmVhcih0aGlzLmRvbWFpbi5taW4sZS5iLHRoaXMubWlkcG9pbnQsZi5iKTtrPWMubGluZWFyKHRoaXMubWlkcG9pbnQsZi5yLHRoaXMuZG9tYWluLm1heCxoLnIpO2c9Yy5saW5lYXIodGhpcy5taWRwb2ludCxmLmcsdGhpcy5kb21haW4ubWF4LGguZyk7Yj1jLmxpbmVhcih0aGlzLm1pZHBvaW50LGYuYix0aGlzLmRvbWFpbi5tYXgsaC5iKTtyZXR1cm4gdGhpcy5mPXRoaXMuX2lkZW50aXR5V3JhcHBlcihmdW5jdGlvbihjKXtyZXR1cm4gYzx0Lm1pZHBvaW50P1JhcGhhZWwucmdiKGwoYyksZChjKSxhKGMpKTpSYXBoYWVsLnJnYihrKGMpLGcoYyksYihjKSl9KX07Yi5wcm90b3R5cGUuX21ha2VDYXQ9CmZ1bmN0aW9uKCl7fTtiLnByb3RvdHlwZS5fbWFrZURhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFrZU51bSgpfTtyZXR1cm4gYn0ocCk7cz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3RoaXNbImZ1bmN0aW9uIl09YVsiZnVuY3Rpb24iXX1FKGIsYSk7Yi5wcm90b3R5cGUubWFrZT1mdW5jdGlvbihhKXt0aGlzLmRvbWFpbj1hO3RoaXMuY29tcGFyZT1jLmRvbWFpbi5jb21wYXJlKGEpO3JldHVybiB0aGlzLmY9dGhpcy5faWRlbnRpdHlXcmFwcGVyKHRoaXNbImZ1bmN0aW9uIl0pfTtyZXR1cm4gYn0ocCk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gdz1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9RShiLGEpO2IucHJvdG90eXBlLl9tYWtlQ2F0PWZ1bmN0aW9uKCl7fTtyZXR1cm4gYn0pKHApO2E9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiB1PWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0KRShiLGEpO2IucHJvdG90eXBlLm1ha2U9ZnVuY3Rpb24oYSl7dGhpcy5kb21haW49YTt0aGlzLmNvbXBhcmU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMH07cmV0dXJuIHRoaXMuZj10aGlzLl9pZGVudGl0eVdyYXBwZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07cmV0dXJuIGJ9KHApO2Muc2NhbGU9e307Yy5zY2FsZS5CYXNlPXA7Yy5zY2FsZS5jbGFzc2VzPXtsaW5lYXI6ZCxsb2c6ZSxhcmVhOmYscGFsZXR0ZTpuLGdyYWRpZW50OmgsZ3JhZGllbnQyOmIsaWRlbnRpdHk6YSxvcGFjaXR5OmssY3VzdG9tOnN9O2Muc2NhbGUubWFrZT1mdW5jdGlvbihhKXt2YXIgYjtiPWEudHlwZTtpZihiIGluIGMuc2NhbGUuY2xhc3NlcylyZXR1cm4gbmV3IGMuc2NhbGUuY2xhc3Nlc1tiXShhKTt0aHJvdyBjLmVycm9yLmRlZm4oIk5vIHN1Y2ggc2NhbGUgIithLnR5cGUrIi4iKTt9fSkuY2FsbCh0aGlzKTsoZnVuY3Rpb24oKXt2YXIgZixzPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGMpe2Zvcih2YXIgYj0KMCxhPXRoaXMubGVuZ3RoO2I8YTtiKyspaWYoYiBpbiB0aGlzJiZ0aGlzW2JdPT09YylyZXR1cm4gYjtyZXR1cm4tMX07Yy5zY2FsZXNldD1mdW5jdGlvbihjLGIsYSl7cmV0dXJuIG5ldyBmKGMsYixhKX07Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoYixhKXt0aGlzLmNvb3JkPWE7dGhpcy5yYW5nZXM9Yjt0aGlzLmF4ZXM9Yy5ndWlkZS5heGVzKCk7dGhpcy5sZWdlbmRzPWMuZ3VpZGUubGVnZW5kcygpfWYucHJvdG90eXBlLm1ha2U9ZnVuY3Rpb24oYixhLGMpe3RoaXMuZ3VpZGVTcGVjPWI7dGhpcy5sYXllcnM9Yzt0aGlzLmRvbWFpbnM9YTt0aGlzLnNjYWxlcz10aGlzLl9tYWtlU2NhbGVzKGIsYSx0aGlzLnJhbmdlcyk7dGhpcy5yZXZlcnNlPXt4OnRoaXMuc2NhbGVzLnguZmludix5OnRoaXMuc2NhbGVzLnkuZmludn07cmV0dXJuIHRoaXMubGF5ZXJNYXBwaW5nPXRoaXMuX21hcExheWVycyhjKX07Zi5wcm90b3R5cGUuc2V0UmFuZ2VzPWZ1bmN0aW9uKGIpe3ZhciBhLGMsZSxmOwp0aGlzLnJhbmdlcz1iO2U9WyJ4IiwieSJdO2Y9W107YT0wO2ZvcihjPWUubGVuZ3RoO2E8YzthKyspYj1lW2FdLGYucHVzaCh0aGlzLnNjYWxlc1tiXS5tYWtlKHRoaXMuZG9tYWluc1tiXSx0aGlzLnJhbmdlc1tiXSx0aGlzLmdldFNwZWMoYikucGFkZGluZykpO3JldHVybiBmfTtmLnByb3RvdHlwZS5fbWFrZVNjYWxlcz1mdW5jdGlvbihiLGEsZCl7dmFyIGUsZjtmPWZ1bmN0aW9uKGEpe3ZhciBkLGU7aWYoYiYmbnVsbCE9YlthXSYmbnVsbCE9YlthXS5zY2FsZSl7aWYoXy5pc0Z1bmN0aW9uKGJbYV0uc2NhbGUpKXJldHVybnt0eXBlOiJjdXN0b20iLCJmdW5jdGlvbiI6YlthXS5zY2FsZX07c3dpdGNoKGEpe2Nhc2UgIngiOmQ9WyJsaW5lYXIiLCJsb2ciXTticmVhaztjYXNlICJ5IjpkPVsibGluZWFyIiwibG9nIl07YnJlYWs7Y2FzZSAiY29sb3IiOmQ9WyJwYWxldHRlIiwiZ3JhZGllbnQiLCJncmFkaWVudDIiXTticmVhaztjYXNlICJzaXplIjpkPVsibGluZWFyIiwibG9nIl07CmJyZWFrO2Nhc2UgIm9wYWNpdHkiOmQ9WyJvcGFjaXR5Il07YnJlYWs7Y2FzZSAic2hhcGUiOmQ9WyJsaW5lYXIiLCJsb2ciLCJhcmVhIl07YnJlYWs7Y2FzZSAiaWQiOmQ9WyJpZGVudGl0eSJdO2JyZWFrO2Nhc2UgInRleHQiOmQ9WyJpZGVudGl0eSJdO2JyZWFrO2RlZmF1bHQ6ZD1bXX1pZihlPWJbYV0uc2NhbGUudHlwZSwwPD1zLmNhbGwoZCxlKSlyZXR1cm4gYlthXS5zY2FsZTt0aHJvdyBjLmVycm9yLnNjYWxlKCJBZXN0aGV0aWMgIithKyIgY2Fubm90IGhhdmUgc2NhbGUgIitiW2FdLnNjYWxlLnR5cGUpO31yZXR1cm4gbnVsbH07ZT17fTtlLng9Yy5zY2FsZS5tYWtlKGYoIngiKXx8e3R5cGU6ImxpbmVhciJ9KTtlLngubWFrZShhLngsZC54LHRoaXMuZ2V0U3BlYygieCIpLnBhZGRpbmcpO2UueT1jLnNjYWxlLm1ha2UoZigieSIpfHx7dHlwZToibGluZWFyIn0pO2UueS5tYWtlKGEueSxkLnksdGhpcy5nZXRTcGVjKCJ5IikucGFkZGluZyk7bnVsbCE9YS5jb2xvciYmKCJjYXQiPT09CmEuY29sb3IudHlwZT9lLmNvbG9yPWMuc2NhbGUubWFrZShmKCJjb2xvciIpfHx7dHlwZToicGFsZXR0ZSJ9KTooZD17dHlwZToiZ3JhZGllbnQiLHVwcGVyOiJzdGVlbGJsdWUiLGxvd2VyOiJyZWQifSxlLmNvbG9yPWMuc2NhbGUubWFrZShmKCJjb2xvciIpfHxkKSksZS5jb2xvci5tYWtlKGEuY29sb3IpKTtudWxsIT1hLnNpemUmJihlLnNpemU9Yy5zY2FsZS5tYWtlKGYoInNpemUiKXx8e3R5cGU6ImFyZWEifSksZS5zaXplLm1ha2UoYS5zaXplKSk7bnVsbCE9YS5vcGFjaXR5JiYoZS5vcGFjaXR5PWMuc2NhbGUubWFrZShmKCJvcGFjaXR5Iil8fHt0eXBlOiJvcGFjaXR5In0pLGUub3BhY2l0eS5tYWtlKGEub3BhY2l0eSkpO2UudGV4dD1jLnNjYWxlLm1ha2Uoe3R5cGU6ImlkZW50aXR5In0pO2UudGV4dC5tYWtlKCk7cmV0dXJuIGV9O2YucHJvdG90eXBlLmZyb21QaXhlbHM9ZnVuY3Rpb24oYixhKXt2YXIgYyxlLGYsaCxwLG0scjtudWxsIT1iJiZudWxsIT1hJiYoYz10aGlzLmNvb3JkLmdldEFlcyhiLAphLHRoaXMucmV2ZXJzZSksZj1jLngsaD1jLnkpO2U9e307cj10aGlzLmxheWVyTWFwcGluZy54O3A9MDtmb3IobT1yLmxlbmd0aDtwPG07cCsrKWM9cltwXSxudWxsIT1jLnR5cGUmJiJtYXAiPT09Yy50eXBlJiYoZVtjLnZhbHVlXT1udWxsIT1mP2Y6bnVsbCk7bT10aGlzLmxheWVyTWFwcGluZy55O2Y9MDtmb3IocD1tLmxlbmd0aDtmPHA7ZisrKWM9bVtmXSxudWxsIT1jLnR5cGUmJiJtYXAiPT09Yy50eXBlJiYoZVtjLnZhbHVlXT1udWxsIT1oP2g6bnVsbCk7cmV0dXJuIGV9O2YucHJvdG90eXBlLmdldFNwZWM9ZnVuY3Rpb24oYil7cmV0dXJuIG51bGwhPXRoaXMuZ3VpZGVTcGVjJiZudWxsIT10aGlzLmd1aWRlU3BlY1tiXT90aGlzLmd1aWRlU3BlY1tiXTp7fX07Zi5wcm90b3R5cGUubWFrZUd1aWRlcz1mdW5jdGlvbihiLGEpe3ZhciBjLGU7dGhpcy5tYWtlQXhlcygpO3RoaXMubWFrZVRpdGxlcyhudWxsIT0oYz1iLnRpdGxlKT9jOiIiKTt0aGlzLm1ha2VMZWdlbmRzKG51bGwhPQooZT1iLmxlZ2VuZFBvc2l0aW9uKT9lOiJyaWdodCIsYSk7cmV0dXJue2F4ZXM6dGhpcy5heGVzLGxlZ2VuZHM6dGhpcy5sZWdlbmRzLHRpdGxlOnRoaXMudGl0bGV9fTtmLnByb3RvdHlwZS5yZW5kZXJHdWlkZXM9ZnVuY3Rpb24oYixhLGMpe3RoaXMuYXhlcy5yZW5kZXIoYixhLGMpO3RoaXMucmVuZGVyVGl0bGVzKGIsYSk7cmV0dXJuIHRoaXMucmVuZGVyTGVnZW5kcyhiLGEpfTtmLnByb3RvdHlwZS5kaXNwb3NlR3VpZGVzPWZ1bmN0aW9uKGIpe3RoaXMuYXhlcy5kaXNwb3NlKGIpO3RoaXMubGVnZW5kcy5kaXNwb3NlKGIpO3RoaXMudGl0bGVzLnguZGlzcG9zZShiKTt0aGlzLnRpdGxlcy55LmRpc3Bvc2UoYik7dGhpcy50aXRsZXMubWFpbi5kaXNwb3NlKGIpO3JldHVybiB0aGlzLnRpdGxlcz17fX07Zi5wcm90b3R5cGUubWFrZVRpdGxlcz1mdW5jdGlvbihiKXtudWxsPT10aGlzLnRpdGxlcyYmKHRoaXMudGl0bGVzPXt4OmMuZ3VpZGUudGl0bGUodGhpcy5jb29yZC5heGlzVHlwZSgieCIpKSwKeTpjLmd1aWRlLnRpdGxlKHRoaXMuY29vcmQuYXhpc1R5cGUoInkiKSksbWFpbjpjLmd1aWRlLnRpdGxlKCJtYWluIil9KTt0aGlzLnRpdGxlcy5tYWluLm1ha2Uoe3RpdGxlOmIsZ3VpZGVTcGVjOnt9LHBvc2l0aW9uOiJ0b3AifSk7dGhpcy50aXRsZXMueC5tYWtlKHtndWlkZVNwZWM6dGhpcy5nZXRTcGVjKCJ4IiksdGl0bGU6Yy5nZXRMYWJlbCh0aGlzLmxheWVycywieCIpfSk7cmV0dXJuIHRoaXMudGl0bGVzLnkubWFrZSh7Z3VpZGVTcGVjOnRoaXMuZ2V0U3BlYygieSIpLHRpdGxlOmMuZ2V0TGFiZWwodGhpcy5sYXllcnMsInkiKX0pfTtmLnByb3RvdHlwZS50aXRsZU9mZnNldD1mdW5jdGlvbihiKXt2YXIgYSxjLGUsZixoLHAsbTtiPXt9O3A9dGhpcy50aXRsZXM7Zm9yKGMgaW4gcClmb3IoYT1wW2NdLGU9YS5nZXREaW1lbnNpb24oKSxtPVsibGVmdCIsInJpZ2h0IiwidG9wIiwiIGJvdHRvbSJdLGY9MCxoPW0ubGVuZ3RoO2Y8aDtmKyspYT1tW2ZdLGVbYV0mJihudWxsPT1iW2FdJiYKKGJbYV09MCksYlthXSs9ZVthXSk7cmV0dXJuIGJ9O2YucHJvdG90eXBlLnJlbmRlclRpdGxlcz1mdW5jdGlvbihiLGEpe3ZhciBjO2E9YSh7fSwhMSwhMSk7Yz10aGlzLmF4ZXNPZmZzZXQoYik7dGhpcy50aXRsZXMueC5yZW5kZXIoYSxiLGMpO3RoaXMudGl0bGVzLnkucmVuZGVyKGEsYixjKTtyZXR1cm4gdGhpcy50aXRsZXMubWFpbi5yZW5kZXIoYSxiLGMpfTtmLnByb3RvdHlwZS5tYWtlQXhlcz1mdW5jdGlvbigpe3ZhciBiO3JldHVybiB0aGlzLmF4ZXMubWFrZSh7ZG9tYWluczp7eDp0aGlzLmRvbWFpbnMueCx5OnRoaXMuZG9tYWlucy55fSxjb29yZDp0aGlzLmNvb3JkLHNjYWxlczp0aGlzLnNjYWxlcyxzcGVjczpudWxsIT0oYj10aGlzLmd1aWRlU3BlYyk/Yjp7fSxsYWJlbHM6e3g6Yy5nZXRMYWJlbCh0aGlzLmxheWVycywieCIpLHk6Yy5nZXRMYWJlbCh0aGlzLmxheWVycywieSIpfX0pfTtmLnByb3RvdHlwZS5heGVzT2Zmc2V0PWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmF4ZXMuZ2V0RGltZW5zaW9uKGIpfTsKZi5wcm90b3R5cGUuX21hcExheWVycz1mdW5jdGlvbihiKXt2YXIgYSxkLGUsZixoO2Q9e307aD1jWyJjb25zdCJdLmFlcztlPTA7Zm9yKGY9aC5sZW5ndGg7ZTxmO2UrKylhPWhbZV0sZFthXT1fLm1hcChiLGZ1bmN0aW9uKGIpe3JldHVybiBudWxsIT1iLm1hcHBpbmdbYV0/e3R5cGU6Im1hcCIsdmFsdWU6Yi5tYXBwaW5nW2FdfTpudWxsIT1iLmNvbnN0c1thXT97dHlwZToiY29uc3QiLHZhbHVlOmIuY29uc3RzW2FdfTpiLmRlZmF1bHRzW2FdfSk7cmV0dXJuIGR9O2YucHJvdG90eXBlLm1ha2VMZWdlbmRzPWZ1bmN0aW9uKGIsYSl7bnVsbD09YiYmKGI9InJpZ2h0Iik7cmV0dXJuIHRoaXMubGVnZW5kcy5tYWtlKHtkb21haW5zOnRoaXMuZG9tYWlucyxsYXllcnM6dGhpcy5sYXllcnMsZ3VpZGVTcGVjOnRoaXMuZ3VpZGVTcGVjLHNjYWxlczp0aGlzLnNjYWxlcyxsYXllck1hcHBpbmc6dGhpcy5sYXllck1hcHBpbmcscG9zaXRpb246YixkaW1zOmF9KX07Zi5wcm90b3R5cGUubGVnZW5kT2Zmc2V0PQpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5sZWdlbmRzLmdldERpbWVuc2lvbihiKX07Zi5wcm90b3R5cGUucmVuZGVyTGVnZW5kcz1mdW5jdGlvbihiLGEpe3ZhciBjLGUsZixoLHAsbSxyLHEsbDtmPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206MH07Yz10aGlzLmF4ZXNPZmZzZXQoYik7aD10aGlzLnRpdGxlT2Zmc2V0KGIpO3I9WyJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iXTtwPTA7Zm9yKG09ci5sZW5ndGg7cDxtO3ArKyllPXJbcF0sZltlXSs9bnVsbCE9KHE9Y1tlXSk/cTowLGZbZV0rPW51bGwhPShsPWhbZV0pP2w6MDtyZXR1cm4gdGhpcy5sZWdlbmRzLnJlbmRlcihiLGEsZil9O3JldHVybiBmfSgpfSkuY2FsbCh0aGlzKTsoZnVuY3Rpb24oKXt2YXIgZixzLGgsYixhLGQsZSxrLG4scD17fS5oYXNPd25Qcm9wZXJ0eSxtPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe3RoaXMuY29uc3RydWN0b3I9YX1mb3IodmFyIGQgaW4gYilwLmNhbGwoYixkKSYmKGFbZF09CmJbZF0pO2MucHJvdG90eXBlPWIucHJvdG90eXBlO2EucHJvdG90eXBlPW5ldyBjO2EuX19zdXBlcl9fPWIucHJvdG90eXBlO3JldHVybiBhfSxyPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5sZW5ndGg7YjxjO2IrKylpZihiIGluIHRoaXMmJnRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfSxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX07Yy5kYXRhPWZ1bmN0aW9uKGEpe3ZhciBiLGQ7ZD12b2lkIDA7Xy5pc09iamVjdChhKSYmND5fLmtleXMoYSkubGVuZ3RoJiYiZGF0YSJpbiBhPyhiPWEuZGF0YSxkPWEubWV0YSk6Yj1hO3N3aXRjaChrKGIpKXtjYXNlICJqc29uLW9iamVjdCI6Y2FzZSAianNvbi1ncmlkIjpjYXNlICJqc29uLWFycmF5IjpyZXR1cm4gYy5kYXRhLmpzb24oYixkLHZvaWQgMCk7Y2FzZSAidXJsIjpyZXR1cm4gYy5kYXRhLnVybChiLGQsdm9pZCAwKTtjYXNlICJjc3YiOnJldHVybiBjLmRhdGEuY3N2KGIsCmQpO2Nhc2UgImFwaSI6cmV0dXJuIGMuZGF0YS5hcGkoYik7ZGVmYXVsdDp0aHJvdyBjLmVycm9yLmRhdGEoIlVua25vd24gZGF0YSBmb3JtYXQuIik7fX07Yy5kYXRhLmpzb249ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBuZXcgYih7ZGF0YTphLG1ldGE6Yyx0eXBlOmR9KX07Yy5kYXRhLmNzdj1mdW5jdGlvbihhLGMpe3JldHVybiBuZXcgYih7ZGF0YTphLG1ldGE6Yyxjc3Y6ImNzdiJ9KX07Yy5kYXRhLnVybD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBoKHt1cmw6YSxjb21wdXRlQmFja2VuZDpiLGxpbWl0OmN9KX07Yy5kYXRhLmFwaT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IHMoe2FwaUZ1bjphfSl9O2s9ZnVuY3Rpb24oYSl7aWYoXy5pc0FycmF5KGEpKXJldHVybiBfLmlzQXJyYXkoYVswXSk/Impzb24tZ3JpZCI6Impzb24tYXJyYXkiO2lmKF8uaXNPYmplY3QoYSkpcmV0dXJuImpzb24tb2JqZWN0IjtpZihfLmlzU3RyaW5nKGEpKXJldHVybiBjLmlzVVJJKGEpPyJ1cmwiOgoiY3N2IjtpZihfLmlzRnVuY3Rpb24oYSkpcmV0dXJuImFwaSI7dGhyb3cgYy5lcnJvci5kYXRhKCJVbmtub3duIGRhdGEgZm9ybWF0LiIpO307YT1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZixrLGgsbixtO2lmKDA8YS5sZW5ndGgpe2Y9Xy51bmlvbihfLmtleXMoYiksXy5rZXlzKGFbMF0pKTtkPWEuc2xpY2UoMCwxMDApO2s9MDtmb3IoaD1mLmxlbmd0aDtrPGg7aysrKWU9ZltrXSxudWxsPT1iW2VdJiYoYltlXT17fSksYltlXS50eXBlfHwoYltlXS50eXBlPWMudHlwZS5pbXB1dGUoXy5wbHVjayhkLGUpKSk7az0wO2ZvcihuPWEubGVuZ3RoO2s8bjtrKyspZm9yKGQ9YVtrXSxoPTAsbT1mLmxlbmd0aDtoPG07aCsrKWU9ZltoXSxkW2VdPWMudHlwZS5jb2VyY2UoZFtlXSxiW2VdKTtlPWY7Zj1hfWVsc2UgZT1fLmtleXMoYiksZj1bXTtyZXR1cm57a2V5OmUscmF3OmYsbWV0YTpifX07ZD1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZixrLGgsbixtLHAseSxxLHY7bj1bXTtpZigwPGEubGVuZ3RoKXtrPQpiJiZfLmlzQXJyYXkoYik/YjpiJiZfLmlzT2JqZWN0KGIpP18ua2V5cyhiKTpfLmtleXMoYVswXSk7aWYoXy5pc0FycmF5KGIpfHwhXy5pc09iamVjdChiKSliPXt9O2Q9YS5zbGljZSgwLDEwMCk7ZT1oPTA7Zm9yKG09ay5sZW5ndGg7aDxtO2U9KytoKWY9a1tlXSxudWxsPT1iW2ZdJiYoYltmXT17fSksYltmXS50eXBlfHwoYltmXS50eXBlPWMudHlwZS5pbXB1dGUoXy5wbHVjayhkLGUpKSk7cD0wO2ZvcihxPWEubGVuZ3RoO3A8cTtwKyspe2Q9YVtwXTtoPXt9O2U9eT0wO2Zvcih2PWQubGVuZ3RoO3k8djtlPSsreSltPWRbZV0sZj1rW2VdLGhbZl09Yy50eXBlLmNvZXJjZShtLGJbZl0pO24ucHVzaChoKX1mPWs7ZT1ufWVsc2UgZj1fLmtleXMoYiksZT1bXTtyZXR1cm57a2V5OmYscmF3OmUsbWV0YTpifX07bj1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZixrLGgsbixtLHAseTtmPV8ua2V5cyhhKTtoPVtdO249MDtmb3IoZT1mLmxlbmd0aDtuPGU7bisrKWQ9ZltuXSxudWxsPT1iW2RdJiYKKGJbZF09e30pLGJbZF0udHlwZXx8KGJbZF0udHlwZT1jLnR5cGUuaW1wdXRlKGFbZF0uc2xpY2UoMCwxMDApKSk7aWYoMDxmLmxlbmd0aCYmKGU9YVtmWzBdXS5sZW5ndGgsMDxlKSlmb3IoZD1uPTAseT1lLTE7MDw9eT9uPD15Om4+PXk7ZD0wPD15PysrbjotLW4pe2s9e307bT0wO2ZvcihwPWYubGVuZ3RoO208cDttKyspZT1mW21dLGtbZV09Yy50eXBlLmNvZXJjZShhW2VdW2RdLGJbZV0pO2gucHVzaChrKX1yZXR1cm57a2V5OmYscmF3OmgsbWV0YTpifX07ZT1mdW5jdGlvbihiLGQpe3JldHVybiBhKGMuY3N2LnBhcnNlKGIpLGQpfTtmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMucmF3PW51bGw7dGhpcy5tZXRhPXt9O3RoaXMua2V5PVtdO3RoaXMuc3Vic2NyaWJlZD1bXTt0aGlzLmNvbXB1dGVCYWNrZW5kPSExfWEucHJvdG90eXBlLmlzRGF0YT0hMDthLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2Q9dGhpcy5zdWJzY3JpYmVkO2U9W107CmI9MDtmb3IoYz1kLmxlbmd0aDtiPGM7YisrKWE9ZFtiXSxlLnB1c2goYSgpKTtyZXR1cm4gZX07YS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGEpe2lmKC0xPT09Xy5pbmRleE9mKHRoaXMuc3Vic2NyaWJlZCxhKSlyZXR1cm4gdGhpcy5zdWJzY3JpYmVkLnB1c2goYSl9O2EucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN1YnNjcmliZWQuc3BsaWNlKF8uaW5kZXhPZih0aGlzLnN1YnNjcmliZWQsYSksMSl9O2EucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXl9O2EucHJvdG90eXBlLnJlbmFtZT1mdW5jdGlvbigpe3JldHVybiExfTthLnByb3RvdHlwZS5yZW5hbWVNYW55PWZ1bmN0aW9uKCl7cmV0dXJuITF9O2EucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiExfTthLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMX07YS5wcm90b3R5cGUuc29ydD1mdW5jdGlvbigpe3JldHVybiExfTsKYS5wcm90b3R5cGUuZGVyaXZlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2EucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtpZih0aGlzLnJhdylyZXR1cm4gXy5wbHVjayh0aGlzLnJhdyxhKTt0aHJvdyBjLmVycm9yLmRhdGEoIkRhdGEgaGFzIG5vdCBiZWVuIGZldGNoZWQgb3IgaXMgdW5kZWZpbmVkLiIpO307YS5wcm90b3R5cGUubGVuPWZ1bmN0aW9uKCl7aWYodGhpcy5yYXcpcmV0dXJuIHRoaXMucmF3Lmxlbmd0aDt0aHJvdyBjLmVycm9yLmRhdGEoIkRhdGEgaGFzIG5vdCBiZWVuIGZldGNoZWQgb3IgaXMgdW5kZWZpbmVkLiIpO307YS5wcm90b3R5cGUuZ2V0T2JqZWN0PWZ1bmN0aW9uKGEpe2lmKHRoaXMucmF3KXJldHVybiB0aGlzLnJhd1thXTt0aHJvdyBjLmVycm9yLmRhdGEoIkRhdGEgaGFzIG5vdCBiZWVuIGZldGNoZWQgb3IgaXMgdW5kZWZpbmVkLiIpO307YS5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKGEpe3JldHVybiBfLm1heCh0aGlzLmdldChhKSl9O2EucHJvdG90eXBlLm1pbj0KZnVuY3Rpb24oYSl7cmV0dXJuIF8ubWluKHRoaXMuZ2V0KGEpKX07YS5wcm90b3R5cGUuZ2V0TWV0YT1mdW5jdGlvbihhKXtpZih0aGlzLm1ldGEpcmV0dXJuIHRoaXMubWV0YVthXX07YS5wcm90b3R5cGUudHlwZT1mdW5jdGlvbihhKXtpZihhIGluIHRoaXMubWV0YSlyZXR1cm4gYT10aGlzLm1ldGFbYV0udHlwZSwibnVtIj09PWE/Im51bWJlciI6YTt0aHJvdyBjLmVycm9yLmRlZm4oIkRhdGEgZG9lcyBub3QgaGF2ZSBjb2x1bW4gIithKyIuIik7fTtyZXR1cm4gYX0oKTtiPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGcoYSl7Zy5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLl9zZXREYXRhKGEpfW0oZyxiKTtnLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKGEpe3JldHVybiBhKG51bGwsdGhpcyl9O2cucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLl9zZXREYXRhKGEpO3JldHVybiBnLl9fc3VwZXJfXy51cGRhdGUuY2FsbCh0aGlzKX07Zy5wcm90b3R5cGUuX3NldERhdGE9CmZ1bmN0aW9uKGIpe3ZhciBnLGYsaDtfLmlzT2JqZWN0KGIpJiY0Pl8ua2V5cyhiKS5sZW5ndGgmJiJkYXRhImluIGI/KGc9Yi5kYXRhLGY9bnVsbCE9KGg9Yi5tZXRhKT9oOnt9KTooZz1iLGY9e30pO2g9ZnVuY3Rpb24oKXt2YXIgaDtzd2l0Y2gobnVsbCE9KGg9Yi50eXBlKT9oOmsoZykpe2Nhc2UgImpzb24tb2JqZWN0IjpyZXR1cm4gbihnLGYpO2Nhc2UgImpzb24tZ3JpZCI6cmV0dXJuIGQoZyxmKTtjYXNlICJqc29uLWFycmF5IjpyZXR1cm4gYShnLGYpO2Nhc2UgImNzdiI6cmV0dXJuIGUoZyxmKTtkZWZhdWx0OnRocm93IGMuZXJyb3IuZGF0YSgiVW5rbm93biBkYXRhIGZvcm1hdC4iKTt9fSgpO3RoaXMua2V5PWgua2V5O3RoaXMucmF3PWgucmF3O3RoaXMubWV0YT1oLm1ldGE7cmV0dXJuIHRoaXMuZGF0YT10aGlzLnJhd307Zy5wcm90b3R5cGUuX2NoZWNrUmVuYW1lPWZ1bmN0aW9uKGEsYil7aWYoIiI9PT1iKXRocm93IGMuZXJyb3IuZGVmbigiQ29sdW1uIG5hbWVzIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmciKTsKaWYoLTE9PT1fLmluZGV4T2YodGhpcy5rZXksYSkpdGhyb3cgYy5lcnJvci5kZWZuKCJUaGUga2V5ICIrYSsiIGRvZXNuJ3QgZXhpc3QhIik7aWYoLTEhPT1fLmluZGV4T2YodGhpcy5rZXksYikpdGhyb3cgYy5lcnJvci5kZWZuKCJUaGUga2V5ICIrYisiIGFscmVhZHkgZXhpc3RzISIpO307Zy5wcm90b3R5cGUucmVuYW1lPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc7bnVsbD09YyYmKGM9ITEpO2E9YS50b1N0cmluZygpO2I9Yi50b1N0cmluZygpO2lmKGE9PT1iKXJldHVybiEwO2N8fHRoaXMuX2NoZWNrUmVuYW1lKGEsYik7Zz10aGlzLnJhdztkPTA7Zm9yKGU9Zy5sZW5ndGg7ZDxlO2QrKyljPWdbZF0sY1tiXT1jW2FdLGRlbGV0ZSBjW2FdO2M9Xy5pbmRleE9mKHRoaXMua2V5LGEpO3RoaXMua2V5W2NdPWI7dGhpcy5tZXRhW2JdPXRoaXMubWV0YVthXTtkZWxldGUgdGhpcy5tZXRhW2FdO3JldHVybiEwfTtnLnByb3RvdHlwZS5yZW5hbWVNYW55PWZ1bmN0aW9uKGEpe3ZhciBiLApjO2ZvcihiIGluIGEpYz1hW2JdLGIhPT1jJiZ0aGlzLl9jaGVja1JlbmFtZShiLGMpO2ZvcihiIGluIGEpYz1hW2JdLGIhPT1jJiZ0aGlzLnJlbmFtZShiLGMsITApO3JldHVybiEwfTtnLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU7Yj1fLmluZGV4T2YodGhpcy5rZXksYSk7aWYoIi0xIj09PWIpcmV0dXJuITE7dGhpcy5rZXkuc3BsaWNlKGIsMSk7ZGVsZXRlIHRoaXMubWV0YVthXTtlPXRoaXMucmF3O2M9MDtmb3IoZD1lLmxlbmd0aDtjPGQ7YysrKWI9ZVtjXSxkZWxldGUgYlthXTtyZXR1cm4hMH07Zy5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxnLGY7YT1fLmlzRnVuY3Rpb24oYSk/YTpfLmlzU3RyaW5nKGEpP25ldyBGdW5jdGlvbigiZCIsIndpdGgoZCkgeyByZXR1cm4gIithKyI7fSIpOmZ1bmN0aW9uKCl7cmV0dXJuITB9O2Q9W107Zj10aGlzLnJhdztlPTA7Zm9yKGc9Zi5sZW5ndGg7ZTxnO2UrKyliPWZbZV0sYShiKSYmCmQucHVzaChiKTtyZXR1cm4gYy5kYXRhLmpzb24oZCx0aGlzLm1ldGEpfTtnLnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxnO2c9dGhpcy50eXBlKGEpO2Q9Xy5jbG9uZSh0aGlzLnJhdyk7ZT1jLnR5cGUuY29tcGFyZShnKTtkLnNvcnQoZnVuY3Rpb24oYixjKXtyZXR1cm4gZShiW2FdLGNbYV0pfSk7YiYmZC5yZXZlcnNlKCk7cmV0dXJuIGMuZGF0YS5qc29uKGQsdGhpcy5tZXRhKX07Zy5wcm90b3R5cGUuZGVyaXZlPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxnLGYsayxoLGwsbix2O251bGw9PWQmJihkPXt9KTtnPWQuZHJ5cnVuO2U9ZC5jb250ZXh0O251bGw9PWImJihiPV91bmlxdWVJZCgidmFyXyIpKTtudWxsPT1lJiYoZT17fSk7Xy5pc0Z1bmN0aW9uKGEpPyhkPWEsZj0hMSk6KGY9ITAsZD1uZXcgRnVuY3Rpb24oImQiLCJ3aXRoKHRoaXMpIHsgd2l0aChkKSB7IHJldHVybiAiK2EoYSkrIjt9fSIpKTt2PXRoaXMucmF3O2w9MDtmb3Iobj12Lmxlbmd0aDtsPApuO2wrKyl7az12W2xdO2g9ZC5jYWxsKGUsayk7aWYoXy5pc0Z1bmN0aW9uKGgpKXRocm93IGMuZXJyb3IuZGVmbigiRGVyaXZhdGlvbiBmdW5jdGlvbiByZXR1cm5lZCBhbm90aGVyIGZ1bmN0aW9uLiIpO2tbYl09aH1pZihnKXJldHVybntzdWNjZXNzOiEwLHZhbHVlczpfLnBsdWNrKHRoaXMucmF3LnNsaWNlKDAsMTEpLGIpfTswPD1yLmNhbGwodGhpcy5rZXksYil8fHRoaXMua2V5LnB1c2goYik7dGhpcy5tZXRhW2JdPXt0eXBlOmMudHlwZS5pbXB1dGUoXy5wbHVjayh0aGlzLnJhdy5zbGljZSgwLDEwMSksYikpLGRlcml2ZWQ6ITB9O2YmJih0aGlzLm1ldGFbYl0uZm9ybXVsYT1hKTtyZXR1cm4gYn07cmV0dXJuIGd9KGYpO2g9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZyhhKXt0aGlzLmdldERhdGE9cSh0aGlzLmdldERhdGEsdGhpcyk7Zy5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLnVybD1hLnVybDt0aGlzLmNvbXB1dGVCYWNrZW5kPWEuY29tcHV0ZUJhY2tlbmQ7CnRoaXMubGltaXQ9YS5saW1pdDtudWxsPT10aGlzLmNvbXB1dGVCYWNrZW5kJiYodGhpcy5jb21wdXRlQmFja2VuZD0hMSl9bShnLGIpO2cucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oYixnKXt2YXIgZixoLGw9dGhpcztpZihudWxsIT10aGlzLnJhdyYmIXRoaXMuY29tcHV0ZUJhY2tlbmQpcmV0dXJuIGIobnVsbCx0aGlzKTtmPS0xPT09Xy5pbmRleE9mKHRoaXMudXJsLCI/Iik/Ij8iOiImIjtoPXRoaXMudXJsO3RoaXMubGltaXQmJihoKz0iIitmKyJsaW1pdD0iK3RoaXMubGltaXQpO2cmJihoKz0iJnNwZWM9IitlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoZykpKTtyZXR1cm4gYy50ZXh0KGgsZnVuY3Rpb24oZyl7dmFyIGYsaCxtO3RyeXtnPUpTT04ucGFyc2UoZyl9Y2F0Y2godCl7fV8uaXNPYmplY3QoZykmJjQ+Xy5rZXlzKGcpLmxlbmd0aCYmImRhdGEiaW4gZz8oZj1nLmRhdGEsaD1udWxsIT0obT1nLm1ldGEpP206e30pOihmPWcsaD17fSk7Zz1mdW5jdGlvbigpe3N3aXRjaChrKGYpKXtjYXNlICJqc29uLW9iamVjdCI6cmV0dXJuIG4oZiwKaCk7Y2FzZSAianNvbi1ncmlkIjpyZXR1cm4gZChmLGgpO2Nhc2UgImpzb24tYXJyYXkiOnJldHVybiBhKGYsaCk7Y2FzZSAiY3N2IjpyZXR1cm4gZShmLGgpO2RlZmF1bHQ6dGhyb3cgYy5lcnJvci5kYXRhKCJVbmtub3duIGRhdGEgZm9ybWF0LiIpO319KCk7bC5rZXk9Zy5rZXk7bC5yYXc9Zy5yYXc7bC5tZXRhPWcubWV0YTtsLmRhdGE9bC5yYXc7cmV0dXJuIGIobnVsbCxsKX0pfTtnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7dGhpcy5yYXc9bnVsbDtyZXR1cm4gZy5fX3N1cGVyX18udXBkYXRlLmNhbGwodGhpcyl9O2cucHJvdG90eXBlLnJlbmFtZU1hbnk9ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1fLmtleXMoYSkubGVuZ3RofTtyZXR1cm4gZ30oZik7cz1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEpe3RoaXMuZ2V0RGF0YT1xKHRoaXMuZ2V0RGF0YSx0aGlzKTtkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXBpRnVuPWEuYXBpRnVuO3RoaXMuY29tcHV0ZUJhY2tlbmQ9CiEwfW0oZCxiKTtkLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKGIsZCl7dmFyIGc9dGhpcztyZXR1cm4gdGhpcy5hcGlGdW4oZCxmdW5jdGlvbihkLGYpe3ZhciBoLGwsbSxwLHE7aWYobnVsbCE9ZClyZXR1cm4gYihkLG51bGwpO3RyeXtmPUpTT04ucGFyc2UoZil9Y2F0Y2godil7bD12fXRyeXtyZXR1cm4gaD1mLmRhdGEsbT1udWxsIT0ocD1mLm1ldGEpP3A6e30scT1mdW5jdGlvbigpe3N3aXRjaChrKGgpKXtjYXNlICJqc29uLW9iamVjdCI6cmV0dXJuIG4oaCxtKTtjYXNlICJqc29uLWdyaWQiOnJldHVybiBfZ2V0QXJyYXlvZkFycmF5cyhoLG0pO2Nhc2UgImpzb24tYXJyYXkiOnJldHVybiBhKGgsbSk7Y2FzZSAiY3N2IjpyZXR1cm4gZShoLG0pO2RlZmF1bHQ6dGhyb3cgYy5lcnJvci5kYXRhKCJVbmtub3duIGRhdGEgZm9ybWF0LiIpO319KCksZy5rZXk9cS5rZXksZy5yYXc9cS5yYXcsZy5tZXRhPXEubWV0YSxnLmRhdGE9Zy5yYXcsYihudWxsLGcpfWNhdGNoKHgpe3JldHVybiBsPQp4LGIobCl9fSl9O2QucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnJhdz1udWxsO3JldHVybiBkLl9fc3VwZXJfXy51cGRhdGUuY2FsbCh0aGlzKX07ZC5wcm90b3R5cGUucmVuYW1lTWFueT1mdW5jdGlvbihhKXtyZXR1cm4gMD09PV8ua2V5cyhhKS5sZW5ndGh9O3JldHVybiBkfShmKX0pLmNhbGwodGhpcyk7KGZ1bmN0aW9uKCl7dmFyIGYscyxoLGIsYSxkLGUsayxuLHAsbSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX0scT1bXS5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMubGVuZ3RoO2I8YztiKyspaWYoYiBpbiB0aGlzJiZ0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX07Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixkLGUpe3RoaXMuX3dyYXA9cih0aGlzLl93cmFwLHRoaXMpO3RoaXMubGF5ZXJNZXRhPWIubWV0YTt0aGlzLmRhdGFPYmo9Yi5kYXRhO3RoaXMuaW5pdGlhbFNwZWM9CmMucGFyc2VyLmxheWVyVG9EYXRhKGIsZCk7dGhpcy5wcmV2U3BlYz1udWxsO3RoaXMuc3RyaWN0bW9kZT1lO3RoaXMuc3RhdERhdGE9bnVsbDt0aGlzLm1ldGFEYXRhPXt9fWEucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1ha2UodGhpcy5pbml0aWFsU3BlYyxhKX07YS5wcm90b3R5cGUubWFrZT1mdW5jdGlvbihhLGIsZCl7dmFyIGYsaDtoPXRoaXMuX3dyYXAoZCk7dGhpcy5zdHJpY3Rtb2RlJiZoKHtkYXRhOnRoaXMuZGF0YU9iai5yYXcsbWV0YTp0aGlzLmRhdGFPYmoubWV0YX0pO2lmKHRoaXMuZGF0YU9iai5jb21wdXRlQmFja2VuZClyZXR1cm4gZj1jLnBhcnNlci5sYXllclRvRGF0YShhLGIpLHRoaXMubGF5ZXJNZXRhJiYxPl8uc2l6ZShmLm1ldGEpJiYoZi5tZXRhPXRoaXMubGF5ZXJNZXRhKSxzKGYsdGhpcy5kYXRhT2JqLGgpO2Y9Yy5wYXJzZXIubGF5ZXJUb0RhdGEoYSxiKTtyZXR1cm4gdGhpcy5kYXRhT2JqLmdldERhdGEoZnVuY3Rpb24oYSwKYil7dmFyIGMsZCxnLGs7aWYobnVsbCE9YSlyZXR1cm4gaChhLG51bGwpO2lmKDA8PXEuY2FsbChmLnNlbGVjdCwiY291bnQoKikiKSl7az1iLmRhdGE7ZD0wO2ZvcihnPWsubGVuZ3RoO2Q8ZztkKyspYz1rW2RdLGNbImNvdW50KCopIl09MTtiLm1ldGFbImNvdW50KCopIl09e307Yi5tZXRhWyJjb3VudCgqKSJdLnR5cGU9Im51bSI7Zi5zdGF0cy5zdGF0cy5wdXNoKHtrZXk6ImNvdW50KCopIixuYW1lOiJjb3VudCgqKSIsc3RhdDoiY291bnQifSl9cmV0dXJuIGUoZixiLGgpfSl9O2EucHJvdG90eXBlLl93cmFwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGUsZjtpZihudWxsIT1jKXJldHVybiBhKGMsbnVsbCxudWxsKTtlPWQuZGF0YTtmPWQubWV0YTtiLnN0YXREYXRhPWU7Yi5tZXRhRGF0YT1mO3JldHVybiBhKG51bGwsYi5zdGF0RGF0YSxiLm1ldGFEYXRhKX19O3JldHVybiBhfSgpO2MuRGF0YVByb2Nlc3M9ZjtjLmRhdGEucHJvY2Vzcz0KZnVuY3Rpb24oYSxiLGMsZCl7YT1uZXcgZihiLGMpO2EucHJvY2VzcyhkKTtyZXR1cm4gYX07bT17YmluOmZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO2Y9Yi5uYW1lO2U9Yi5iaW53aWR0aDtpZigibnVtIj09PWQudHlwZSl7aWYoaXNOYU4oZSkpdGhyb3cgYy5lcnJvci5kZWZuKCJUaGUgYmlud2lkdGggIitlKyIgaXMgaW52YWxpZCBmb3IgYSBudW1lcmljIHZhcmxpYWJsZSIpO2U9K2U7Yj1mdW5jdGlvbihiKXtyZXR1cm4gYltmXT1lKk1hdGguZmxvb3IoYlthXS9lKX07cmV0dXJue3RyYW5zOmIsbWV0YTp7Ync6ZSxiaW5uZWQ6ITAsdHlwZToibnVtIn19fWlmKCJkYXRlIj09PWQudHlwZSl7aWYoISgwPD1xLmNhbGwoY1siY29uc3QiXS50aW1lcmFuZ2UsZSkpKXRocm93IGMuZXJyb3IuZGVmbigiVGhlIGJpbndpZHRoICIrZSsiIGlzIGludmFsaWQgZm9yIGEgZGF0ZXRpbWUgdmFybGlhYmxlIik7Yj1mdW5jdGlvbihiKXt2YXIgYztjPWZ1bmN0aW9uKGMsZCl7dmFyIGU7ZT1tb21lbnQudW5peChiW2FdKS5zdGFydE9mKGQpOwplW2RdKGMqTWF0aC5mbG9vcihlW2RdKCkvYykpO3JldHVybiBiW2ZdPWUudW5peCgpfTtzd2l0Y2goZSl7Y2FzZSAid2VlayI6cmV0dXJuIGJbZl09bW9tZW50LnVuaXgoYlthXSkuZGF5KDApLnVuaXgoKTtjYXNlICJ0d29tb250aCI6cmV0dXJuIGMoMiwibW9udGgiKTtjYXNlICJxdWFydGVyIjpyZXR1cm4gYyg0LCJtb250aCIpO2Nhc2UgInNpeG1vbnRoIjpyZXR1cm4gYyg2LCJtb250aCIpO2Nhc2UgInR3b3llYXIiOnJldHVybiBjKDIsInllYXIiKTtjYXNlICJmaXZleWVhciI6cmV0dXJuIGMoNSwieWVhciIpO2Nhc2UgImRlY2FkZSI6cmV0dXJuIGMoMTAsInllYXIiKTtkZWZhdWx0OnJldHVybiBiW2ZdPW1vbWVudC51bml4KGJbYV0pLnN0YXJ0T2YoZSkudW5peCgpfX07cmV0dXJue3RyYW5zOmIsbWV0YTp7Ync6ZSxiaW5uZWQ6ITAsdHlwZToiZGF0ZSJ9fX19LGxhZzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO2Y9Yi5uYW1lO2Q9Yi5sYWc7ZT1mdW5jdGlvbigpe3ZhciBhLApiO2I9W107Zm9yKGE9MTsxPD1kP2E8PWQ6YT49ZDsxPD1kPysrYTotLWEpYi5wdXNoKHZvaWQgMCk7cmV0dXJuIGJ9KCk7cmV0dXJue3RyYW5zOmZ1bmN0aW9uKGIpe2UucHVzaChiW2FdKTtyZXR1cm4gYltmXT1lLnNoaWZ0KCl9LG1ldGE6e3R5cGU6Yy50eXBlfX19fTtwPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbVtiLnRyYW5zXShhLGIsbnVsbCE9Yz9jOnt9KX07ZD17bHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYTxifSxsZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPD1ifSxndDpmdW5jdGlvbihhLGIpe3JldHVybiBhPmJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE+PWJ9LCJpbiI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDw9cS5jYWxsKGIsYSl9fTthPWZ1bmN0aW9uKGEpe3ZhciBiO2I9W107Xy5lYWNoKGEsZnVuY3Rpb24oYSxjKXtyZXR1cm4gXy5lYWNoKGEsZnVuY3Rpb24oYSxlKXtyZXR1cm4gYi5wdXNoKGZ1bmN0aW9uKGIpe3JldHVybiBkW2VdKGJbY10sYSl9KX0pfSk7CnJldHVybiBmdW5jdGlvbihhKXt2YXIgYyxkLGU7ZD0wO2ZvcihlPWIubGVuZ3RoO2Q8ZTtkKyspaWYoYz1iW2RdLCFjKGEpKXJldHVybiExO3JldHVybiEwfX07az17c3VtOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gXy5yZWR1Y2UoXy53aXRob3V0KGEsdm9pZCAwLG51bGwpLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGErYn0sMCl9fSxtZWFuOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhKXthPV8ud2l0aG91dChhLHZvaWQgMCxudWxsKTtyZXR1cm4gXy5yZWR1Y2UoYSxmdW5jdGlvbihhLGIpe3JldHVybiBhK2J9LDApL2EubGVuZ3RofX0sY291bnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBfLndpdGhvdXQoYSx2b2lkIDAsbnVsbCkubGVuZ3RofX0sdW5pcXVlOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gXy51bmlxKF8ud2l0aG91dChhLHZvaWQgMCxudWxsKSkubGVuZ3RofX0sbWluOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gXy5taW4oYSl9fSwKbWF4OmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gXy5tYXgoYSl9fSxtZWRpYW46ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBjLm1lZGlhbihhKX19LGJveDpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGIsZCxlLGYsaCxrO2Q9YS5sZW5ndGg7cmV0dXJuIDU8ZD8oZj1kLzIsYT1fLnNvcnRCeShhLGZ1bmN0aW9uKGEpe3JldHVybiBhfSksYj1NYXRoLmNlaWwoZikvMiwwIT09YiUxPyhiPU1hdGguZmxvb3IoYiksZj1hW2JdLGQ9YVtkLTEtYl0pOihmPShhW2JdK2FbYi0xXSkvMixkPShhW2QtYl0rYVtkLWItMV0pLzIpLGI9ZC1mLGU9Zi0xLjUqYixoPWQrMS41KmIsYj1fLmdyb3VwQnkoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT49ZSYmYTw9aH0pLHtxMTpfLm1pbihiWyJ0cnVlIl0pLHEyOmYscTM6Yy5tZWRpYW4oYSwhMCkscTQ6ZCxxNTpfLm1heChiWyJ0cnVlIl0pLG91dGxpZXJzOm51bGwhPShrPWJbImZhbHNlIl0pPwprOltdfSk6e291dGxpZXJzOmF9fX19O249ZnVuY3Rpb24oYSl7cmV0dXJuIGtbYS5zdGF0XShhKX07Yj1mdW5jdGlvbihhLGIpe3ZhciBkLGU7ZT17fTtfLmVhY2goYi5zdGF0cyxmdW5jdGlvbihhKXt2YXIgYixjLGQ7Yj1hLmtleTtjPWEubmFtZTtkPW4oYSk7cmV0dXJuIGVbY109ZnVuY3Rpb24oYSl7cmV0dXJuIGQoXy5wbHVjayhhLGIpKX19KTtkPWMuZ3JvdXBCeShhLGIuZ3JvdXBzKTtyZXR1cm4gXy5tYXAoZCxmdW5jdGlvbihhKXt2YXIgYztjPXt9O18uZWFjaChiLmdyb3VwcyxmdW5jdGlvbihiKXtyZXR1cm4gY1tiXT1hWzBdW2JdfSk7Xy5lYWNoKGUsZnVuY3Rpb24oYixkKXtyZXR1cm4gY1tkXT1iKGEpfSk7cmV0dXJuIGN9KX07aD1mdW5jdGlvbihhLGMsZCl7dmFyIGUsZixoLGs7aD1jLnNvcnQ7az1jLnN0YXQ7ZT1jLmxpbWl0O2M9Yy5hc2M7ayYmKGs9e3N0YXRzOltrXSxncm91cHM6W2FdfSxkPWIoZCxrKSk7Zj1jPzE6LTE7ZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbaF09PT0KYltoXT8wOmFbaF0+PWJbaF0/MSpmOi0xKmZ9KTtlJiYoZD1kLnNsaWNlKDAsKyhlLTEpKzF8fDlFOSkpO2E9Xy51bmlxKF8ucGx1Y2soZCxhKSk7cmV0dXJue21ldGE6e2xldmVsczphLHNvcnRlZDohMH0sZmlsdGVyOnsiaW4iOmF9fX07ZT1mdW5jdGlvbihkLGUsZil7dmFyIGssbixtLHEscixzLEMseSxCLHYseCxELEY7Qz1fLmNsb25lKGUubWV0YSk7ZT1fLmNsb25lKGUucmF3KTtudWxsPT1DJiYoQz17fSk7az1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBDW2FdPV8uZXh0ZW5kKG51bGwhPShjPUNbYV0pP2M6e30sYil9O2lmKGQudHJhbnMpZm9yKEY9ZC50cmFucyxxPTAseD1GLmxlbmd0aDtxPHg7cSsrKXt5PUZbcV07cj15LmtleTtzPXAocix5LENbcl0pO249cy50cmFucztzPXMubWV0YTtCPTA7Zm9yKEQ9ZS5sZW5ndGg7QjxEO0IrKyltPWVbQl0sbihtKTtrKHkubmFtZSxzKX1kLmZpbHRlciYmKGU9Xy5maWx0ZXIoZSxhKGQuZmlsdGVyKSkpO2lmKGQubWV0YSl7bj17fTsKeT1kLm1ldGE7Zm9yKHIgaW4geSlzPXlbcl0scT1oKHIscyxlKSxzPXEubWV0YSxxPXEuZmlsdGVyLG5bcl09cSxrKHIscyk7ZT1fLmZpbHRlcihlLGEobikpfWlmKGQuc3RhdHMmJmQuc3RhdHMuc3RhdHMmJjA8ZC5zdGF0cy5zdGF0cy5sZW5ndGgpZm9yKGU9YihlLGQuc3RhdHMpLG49ZC5zdGF0cy5zdGF0cyxyPTAscz1uLmxlbmd0aDtyPHM7cisrKXk9bltyXSx5PXkubmFtZSxrKHkse3R5cGU6Im51bSJ9KTtkPW51bGwhPSh2PWQuc2VsZWN0KT92OltdO3Y9MDtmb3Ioaz1kLmxlbmd0aDt2PGs7disrKWlmKHI9ZFt2XSxudWxsPT1DW3JdJiYiY291bnQoKikiIT09cil0aHJvdyBjLmVycm9yLmRlZm4oIllvdSByZWZlcmVuY2VkIGEgZGF0YSBjb2x1bW4gIityKyIgdGhhdCBkb2Vzbid0IGV4aXN0LiIpO3JldHVybiBmKG51bGwse2RhdGE6ZSxtZXRhOkN9KX07cz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGIuZ2V0RGF0YShjLGEpfTtjLmRhdGEuZnJvbnRlbmRQcm9jZXNzPWV9KS5jYWxsKHRoaXMpOwooZnVuY3Rpb24oKXt2YXIgZixzLGgsYixhLGQsZSxrLG4scCxtLHIscSxsLGcsdyx1LHQseixFLEEsRyxDPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5sZW5ndGg7YjxjO2IrKylpZihiIGluIHRoaXMmJnRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfSx5PXt9Lmhhc093blByb3BlcnR5LEI9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7dGhpcy5jb25zdHJ1Y3Rvcj1hfWZvcih2YXIgZCBpbiBiKXkuY2FsbChiLGQpJiYoYVtkXT1iW2RdKTtjLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLl9fc3VwZXJfXz1iLnByb3RvdHlwZTtyZXR1cm4gYX07bT1jWyJjb25zdCJdLmFlcztxPWNbImNvbnN0Il0uc2NhbGVGbnM7cj17eDpxLm5vdmFsdWUoKSx5OnEubm92YWx1ZSgpLGNvbG9yOiJzdGVlbGJsdWUiLHNpemU6NSxvcGFjaXR5OjAuOSxzaGFwZToxfTtiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMsZCl7dmFyIGU7CnRoaXMuc3BlYz1iO3RoaXMuZ3VpZGVTcGVjPWQ7dGhpcy5tYXBwaW5nPXt9O3RoaXMuY29uc3RzPXt9O2Q9MDtmb3IoZT1tLmxlbmd0aDtkPGU7ZCsrKWM9bVtkXSxiW2NdJiYoYltjXVsidmFyIl0mJih0aGlzLm1hcHBpbmdbY109YltjXVsidmFyIl0pLGJbY11bImNvbnN0Il0mJih0aGlzLmNvbnN0c1tjXT1iW2NdWyJjb25zdCJdKSl9YS5wcm90b3R5cGUuZGVmYXVsdHM9cjthLnByb3RvdHlwZS5jYWxjdWxhdGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7dGhpcy5zdGF0RGF0YT1hO3RoaXMubWV0YT1iO3RoaXMuX2NhbGNHZW9tcygpO3RoaXMuZ2VvbXM9dGhpcy5fc2FtcGxlKHRoaXMuZ2VvbXMpO2I9e307ZT10aGlzLm1hcHBpbmc7Zm9yKGMgaW4gZSlkPWVbY10sYltjXT10aGlzLm1ldGFbZF07cmV0dXJue2dlb21zOnRoaXMuZ2VvbXMsbWV0YTpifX07YS5wcm90b3R5cGUuX2NhbGNHZW9tcz1mdW5jdGlvbigpe3Rocm93IGMuZXJyb3IuaW1wbCgpO307YS5wcm90b3R5cGUuX3Rvb2x0aXA9CmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLnNwZWMudG9vbHRpcD9mdW5jdGlvbihjKXtyZXR1cm4gYi5zcGVjLnRvb2x0aXAoYSl9Om51bGwhPXRoaXMuc3BlYy50b29sdGlwP2Z1bmN0aW9uKGEpe3JldHVybiBiLnNwZWMudG9vbHRpcH06ZnVuY3Rpb24oZCl7dmFyIGUsZixnLGssaCxsO2g9IiI7az1bXTtsPWIubWFwcGluZztmb3IoZSBpbiBsKWc9bFtlXSwtMT09PWsuaW5kZXhPZihnKSYmKGsucHVzaChnKSxmPW51bGwhPWQmJm51bGwhPWRbZV0/Yy5mb3JtYXQoZFtlXS5kb21haW4udHlwZSxkW2VdLmRvbWFpbi5idyk6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LGgrPSJcbiIrZysiOiAiK2YoYVtnXSkpO3JldHVybiBoLnN1YnN0cigxKX19O2EucHJvdG90eXBlLl9zYW1wbGU9ZnVuY3Rpb24oYSl7aWYoITE9PT10aGlzLnNwZWMuc2FtcGxlKXJldHVybiBhO2lmKF8uaXNOdW1iZXIodGhpcy5zcGVjLnNhbXBsZSkpcmV0dXJuIGMuc2FtcGxlKGEsCnRoaXMuc3BlYy5zYW1wbGUpO3Rocm93IGMuZXJyb3IuZGVmbigiQSBsYXllcidzICdzYW1wbGUnIGRlZmluaXRpb24gc2hvdWxkIGJlIGFuIGludGVnZXIsIG5vdCAiK3RoaXMuc3BlYy5zYW1wbGUpO307YS5wcm90b3R5cGUuX2dldFZhbHVlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubWFwcGluZ1tiXT9hW3RoaXMubWFwcGluZ1tiXV06dGhpcy5jb25zdHNbYl0/cS5pZGVudGl0eSh0aGlzLmNvbnN0c1tiXSk6IngiPT09Ynx8InkiPT09Yj90aGlzLmRlZmF1bHRzW2JdOnEuaWRlbnRpdHkodGhpcy5kZWZhdWx0c1tiXSl9O2EucHJvdG90eXBlLl9nZXRJZEZ1bmM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBudWxsIT10aGlzLm1hcHBpbmcuaWQ/ZnVuY3Rpb24oYil7cmV0dXJuIGEuX2dldFZhbHVlKGIsImlkIil9OmMuY291bnRlcigpfTthLnByb3RvdHlwZS5fZmlsbFplcm9zPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2M9ZnVuY3Rpb24oKXt2YXIgYixjLGU7ZT1bXTsKYj0wO2ZvcihjPWEubGVuZ3RoO2I8YztiKyspZD1hW2JdLGUucHVzaCh0aGlzLl9nZXRWYWx1ZShkLCJ4IikpO3JldHVybiBlfS5jYWxsKHRoaXMpO2U9Xy5kaWZmZXJlbmNlKGIsYyk7cmV0dXJue3g6Yy5jb25jYXQoZSkseTpmdW5jdGlvbigpe3ZhciBiLGMsZTtlPVtdO2I9MDtmb3IoYz1hLmxlbmd0aDtiPGM7YisrKWQ9YVtiXSxlLnB1c2godGhpcy5fZ2V0VmFsdWUoZCwieSIpKTtyZXR1cm4gZX0uY2FsbCh0aGlzKS5jb25jYXQoZnVuY3Rpb24oKXt2YXIgYSxiLGM7Yz1bXTthPTA7Zm9yKGI9ZS5sZW5ndGg7YTxiO2ErKyljLnB1c2godm9pZCAwKTtyZXR1cm4gY30oKSl9fTthLnByb3RvdHlwZS5fc3RhY2s9ZnVuY3Rpb24oYSl7dmFyIGIsZCxlLGYsZyxrLGg9dGhpczthPWMuZ3JvdXBCeSh0aGlzLnN0YXREYXRhLGEpO2s9W107Zm9yKGUgaW4gYSliPWFbZV0sZj0wLGc9bnVsbCE9dGhpcy5tYXBwaW5nLnk/ZnVuY3Rpb24oYSl7cmV0dXJuIGFbaC5tYXBwaW5nLnldfTpmdW5jdGlvbihhKXtyZXR1cm4gMH0sCmsucHVzaChmdW5jdGlvbigpe3ZhciBhLGMsZTtlPVtdO2E9MDtmb3IoYz1iLmxlbmd0aDthPGM7YSsrKWQ9YlthXSxkLiRsb3dlcj1mLGYrPXBhcnNlRmxvYXQoZyhkKSksZS5wdXNoKGQuJHVwcGVyPWYpO3JldHVybiBlfSgpKTtyZXR1cm4ga307YS5wcm90b3R5cGUuX2RvZGdlPWZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmLGcsayxoLGwsbixtLHYscCxxPXRoaXM7ZT1fLndpdGhvdXQoXy5rZXlzKHRoaXMubWFwcGluZyksIngiLCJ5IiwiaWQiKTtfLnRvQXJyYXkoXy5waWNrKHRoaXMubWFwcGluZyxlKSk7dj1jLmdyb3VwQnkodGhpcy5zdGF0RGF0YSxhKTtwPVtdO2ZvcihnIGluIHYpe2Q9dltnXTtoPXt9O2s9MTtuPTA7Zm9yKG09ZS5sZW5ndGg7bjxtO24rKyliPWVbbl0sYT1fLnVuaXEoZnVuY3Rpb24oKXt2YXIgYSxjLGU7ZT1bXTthPTA7Zm9yKGM9ZC5sZW5ndGg7YTxjO2ErKylmPWRbYV0sZS5wdXNoKHRoaXMuX2dldFZhbHVlKGYsYikpO3JldHVybiBlfS5jYWxsKHRoaXMpKSwKayo9YS5sZW5ndGgsYS5zb3J0KGMudHlwZS5jb21wYXJlKHRoaXMubWV0YVt0aGlzLm1hcHBpbmdbYl1dLnR5cGUpKSxoW2JdPWE7bD1mdW5jdGlvbihhKXt2YXIgYyxkLGYsZztjPWs7Zj1kPTA7Zm9yKGc9ZS5sZW5ndGg7ZjxnO2YrKyliPWVbZl0sYy89aFtiXS5sZW5ndGgsZCs9YypfLmluZGV4T2YoaFtiXSxxLl9nZXRWYWx1ZShhLGIpKTtyZXR1cm4gZH07cC5wdXNoKGZ1bmN0aW9uKCl7dmFyIGEsYixjO2M9W107YT0wO2ZvcihiPWQubGVuZ3RoO2E8YjthKyspZj1kW2FdLGYuJG49bChmKSxjLnB1c2goZi4kbT1rKTtyZXR1cm4gY30oKSl9cmV0dXJuIHB9O2EucHJvdG90eXBlLl9pbkxldmVscz1mdW5jdGlvbihhKXt2YXIgYixjLGQ7Yz1bIngiLCJ5Il07Zm9yKGI9Yy5sZW5ndGg7MDxiOylyZXR1cm4gYj1jWzBdLG51bGwhPXRoaXMuZ3VpZGVTcGVjW2JdJiZudWxsIT10aGlzLmd1aWRlU3BlY1tiXS5sZXZlbHM/KGQ9YVt0aGlzLnNwZWNbYl1bInZhciJdXSwwPD1DLmNhbGwodGhpcy5ndWlkZVNwZWNbYl0ubGV2ZWxzLApkKSk6ITB9O3JldHVybiBhfSgpO2U9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBsPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1CKGIsYSk7Yi5wcm90b3R5cGUuX2NhbGNHZW9tcz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGssaDtiPXRoaXMuX2dldElkRnVuYygpO3RoaXMuZ2VvbXM9e307az10aGlzLnN0YXREYXRhO2g9W107Zj0wO2ZvcihnPWsubGVuZ3RoO2Y8ZztmKyspe2M9a1tmXTthPXt9O2ZvcihkIGluIGMpZT1jW2RdLGFbZF09eyJpbiI6W2VdfTtoLnB1c2godGhpcy5nZW9tc1tiKGMpXT17bWFya3M6ezA6e3R5cGU6ImNpcmNsZSIseDp0aGlzLl9nZXRWYWx1ZShjLCJ4IikseTp0aGlzLl9nZXRWYWx1ZShjLCJ5IiksY29sb3I6dGhpcy5fZ2V0VmFsdWUoYywiY29sb3IiKSxzaXplOnRoaXMuX2dldFZhbHVlKGMsInNpemUiKSxvcGFjaXR5OnRoaXMuX2luTGV2ZWxzKGMpP3RoaXMuX2dldFZhbHVlKGMsIm9wYWNpdHkiKToKMH19LGV2dERhdGE6YSx0b29sdGlwOnRoaXMuX3Rvb2x0aXAoYyl9KX1yZXR1cm4gaH07cmV0dXJuIGJ9KGIpO2Q9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBnPWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1CKGIsYSk7Yi5wcm90b3R5cGUuX2NhbGNHZW9tcz1mdW5jdGlvbigpe3ZhciBhLGIsZCxlLGYsZyxrLGgsbCxuLG0sdj10aGlzO2U9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZDtjPV8ud2l0aG91dChfLmtleXModGhpcy5tYXBwaW5nKSwieCIsInkiKTtkPVtdO2E9MDtmb3IoYj1jLmxlbmd0aDthPGI7YSsrKWc9Y1thXSxkLnB1c2godGhpcy5tYXBwaW5nW2ddKTtyZXR1cm4gZH0uY2FsbCh0aGlzKTtiPWMuZ3JvdXBCeSh0aGlzLnN0YXREYXRhLGUpO2Y9dGhpcy5fZ2V0SWRGdW5jKCk7dGhpcy5nZW9tcz17fTttPVtdO2ZvcihnIGluIGIpe2E9YltnXTtoPWFbMF07ZD17fTtsPTA7Zm9yKG49ZS5sZW5ndGg7bDxuO2wrKylrPWVbbF0sCmRba109eyJpbiI6W2hba11dfTttLnB1c2godGhpcy5nZW9tc1tmKGgpXT17bWFya3M6ezA6e3R5cGU6InBhdGgiLHg6Xy5tYXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gdi5fZ2V0VmFsdWUoYSwieCIpfSkseTpfLm1hcChhLGZ1bmN0aW9uKGEpe3JldHVybiB2Ll9nZXRWYWx1ZShhLCJ5Iil9KSxjb2xvcjp0aGlzLl9nZXRWYWx1ZShoLCJjb2xvciIpLG9wYWNpdHk6dGhpcy5fZ2V0VmFsdWUoaCwib3BhY2l0eSIpLHNpemU6dGhpcy5fZ2V0VmFsdWUoaCwic2l6ZSIpfX0sZXZ0RGF0YTpkfSl9cmV0dXJuIG19O3JldHVybiBifShiKTthPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gdz1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9QihiLGEpO2IucHJvdG90eXBlLmRlZmF1bHRzPXt4OnEubm92YWx1ZSgpLHk6cS5ub3ZhbHVlKCksY29sb3I6InN0ZWVsYmx1ZSIsc2l6ZToxLG9wYWNpdHk6MC45LHNoYXBlOjF9O2IucHJvdG90eXBlLl9jYWxjR2VvbXM9CmZ1bmN0aW9uKCl7dmFyIGEsYixkLGUsZixnLGssaCxsLG4sbSx2LHAseCxxLHI7YT1fLnVuaXEoZnVuY3Rpb24oKXt2YXIgYSxiLGMsZDtjPXRoaXMuc3RhdERhdGE7ZD1bXTthPTA7Zm9yKGI9Yy5sZW5ndGg7YTxiO2ErKylrPWNbYV0sZC5wdXNoKHRoaXMuX2dldFZhbHVlKGssIngiKSk7cmV0dXJuIGR9LmNhbGwodGhpcykpO2Y9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZDtjPV8ud2l0aG91dChfLmtleXModGhpcy5tYXBwaW5nKSwieCIsInkiKTtkPVtdO2E9MDtmb3IoYj1jLmxlbmd0aDthPGI7YSsrKWg9Y1thXSxkLnB1c2godGhpcy5tYXBwaW5nW2hdKTtyZXR1cm4gZH0uY2FsbCh0aGlzKTtkPV8ucGFpcnMoYy5ncm91cEJ5KHRoaXMuc3RhdERhdGEsZikpO2c9dGhpcy5fZ2V0SWRGdW5jKCk7dGhpcy5nZW9tcz17fTttPTE9PT1fLm1heChkLGZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLmxlbmd0aH0pWzFdLmxlbmd0aDtyPVtdO2U9dj0wO2Zvcih4PWQubGVuZ3RoO3Y8eDtlPSsrdil7bj0KZFtlXTtsPW5bMF07Yj1uWzFdO20mJmUrMTxkLmxlbmd0aCYmYi5wdXNoKGRbZSsxXVsxXVswXSk7bj1iWzBdO2U9e307cD0wO2ZvcihxPWYubGVuZ3RoO3A8cTtwKyspbD1mW3BdLGVbbF09eyJpbiI6W25bbF1dfTtiPXRoaXMuX2ZpbGxaZXJvcyhiLGEpO2w9Yi54O2I9Yi55O3IucHVzaCh0aGlzLmdlb21zW2cobildPXttYXJrczp7MDp7dHlwZToibGluZSIseDpsLHk6Yixjb2xvcjp0aGlzLl9nZXRWYWx1ZShuLCJjb2xvciIpLG9wYWNpdHk6dGhpcy5fZ2V0VmFsdWUobiwib3BhY2l0eSIpLHNpemU6dGhpcy5fZ2V0VmFsdWUobiwic2l6ZSIpfX0sZXZ0RGF0YTplfSl9cmV0dXJuIHJ9O3JldHVybiBifShiKTtrPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gdT1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9QihiLGEpO2IucHJvdG90eXBlLl9jYWxjR2VvbXM9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZSxmLGc7Yi5fX3N1cGVyX18uX2NhbGNHZW9tcy5jYWxsKHRoaXMpOwpmPXRoaXMuZ2VvbXM7Zz1bXTtmb3IoYyBpbiBmKWE9ZltjXSxnLnB1c2goZnVuY3Rpb24oKXt2YXIgYixjO2I9YS5tYXJrcztjPVtdO2ZvcihkIGluIGIpZT1iW2RdLGMucHVzaChlLnR5cGU9InNwbGluZSIpO3JldHVybiBjfSgpKTtyZXR1cm4gZ307cmV0dXJuIGJ9KGEpO3M9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiB0PWIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1CKGIsYSk7Yi5wcm90b3R5cGUuX2NhbGNHZW9tcz1mdW5jdGlvbigpe3ZhciBhLGI7aWYodGhpcy5tYXBwaW5nLnkmJiJjYXQiPT09dGhpcy5tZXRhW3RoaXMubWFwcGluZy55XS50eXBlKXRocm93IGMuZXJyb3IuZGVmbigiVGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvZiBhIGJhciBjaGFydCBjYW5ub3QgYmUgY2F0ZWdvcmljYWwhIik7aWYodGhpcy5tYXBwaW5nLngmJihhPXRoaXMubWV0YVt0aGlzLm1hcHBpbmcueF0sImNhdCIhPT1hLnR5cGUmJiFhLmJ3JiYhYS5iaW5uZWQmJgoibnVtIj09PWEudHlwZSYmbnVsbD09dGhpcy5ndWlkZVNwZWMueC5idykpdGhyb3cgYy5lcnJvci50eXBlKCJCYXIgY2hhcnQgeC12YWx1ZXMgbmVlZCB0byBiZSBiaW5uZWQuIFNldCBiaW53aWR0aCBvciB1c2UgdGhlIGJpbigpIHRyYW5zZm9ybSEiKTt0aGlzLnBvc2l0aW9uPW51bGwhPShiPXRoaXMuc3BlYy5wb3NpdGlvbik/Yjoic3RhY2siO2lmKCJzdGFjayI9PT10aGlzLnBvc2l0aW9uKXJldHVybiB0aGlzLl9jYWxjR2VvbXNTdGFjaygpO2lmKCJkb2RnZSI9PT10aGlzLnBvc2l0aW9uKXJldHVybiB0aGlzLl9jYWxjR2VvbXNEb2RnZSgpO3Rocm93IGMuZXJyb3IuZGVmbigiQmFyIGNoYXJ0IHBvc2l0aW9uICIrdGhpcy5wb3NpdGlvbisiIGlzIHVua25vd24uIik7fTtiLnByb3RvdHlwZS5fY2FsY0dlb21zRG9kZ2U9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxrLGgsbDthPW51bGwhPXRoaXMubWFwcGluZy54P1t0aGlzLm1hcHBpbmcueF06W107dGhpcy5fZG9kZ2UoYSk7CnRoaXMuX3N0YWNrKGEuY29uY2F0KCIkbiIpKTt0aGlzLmdlb21zPXt9O2I9dGhpcy5fZ2V0SWRGdW5jKCk7aD10aGlzLnN0YXREYXRhO2w9W107Zz0wO2ZvcihrPWgubGVuZ3RoO2c8aztnKyspe2M9aFtnXTthPXt9O2ZvcihkIGluIGMpZT1jW2RdLCJ5IiE9PWQmJihhW2RdPXsiaW4iOltlXX0pO2U9cS5sb3dlcih0aGlzLl9nZXRWYWx1ZShjLCJ4IiksYy4kbixjLiRtKTtmPXEudXBwZXIodGhpcy5fZ2V0VmFsdWUoYywieCIpLGMuJG4sYy4kbSk7bC5wdXNoKHRoaXMuZ2VvbXNbYihjKV09e21hcmtzOnswOnt0eXBlOiJyZWN0Iix4OltlLGZdLHk6W2MuJGxvd2VyLGMuJHVwcGVyXSxjb2xvcjp0aGlzLl9nZXRWYWx1ZShjLCJjb2xvciIpLG9wYWNpdHk6dGhpcy5faW5MZXZlbHMoYyk/dGhpcy5fZ2V0VmFsdWUoYywib3BhY2l0eSIpOjB9fSxldnREYXRhOmEsdG9vbHRpcDp0aGlzLl90b29sdGlwKGMpfSl9cmV0dXJuIGx9O2IucHJvdG90eXBlLl9jYWxjR2VvbXNTdGFjaz1mdW5jdGlvbigpe3ZhciBhLApiLGMsZCxlLGYsZyxrLGg7dGhpcy5fc3RhY2sobnVsbCE9dGhpcy5tYXBwaW5nLng/W3RoaXMubWFwcGluZy54XTpbXSk7Yj10aGlzLl9nZXRJZEZ1bmMoKTt0aGlzLmdlb21zPXt9O2s9dGhpcy5zdGF0RGF0YTtoPVtdO2Y9MDtmb3IoZz1rLmxlbmd0aDtmPGc7ZisrKXtjPWtbZl07YT17fTtmb3IoZCBpbiBjKWU9Y1tkXSwieSIhPT1kJiYoYVtkXT17ImluIjpbZV19KTtoLnB1c2godGhpcy5nZW9tc1tiKGMpXT17bWFya3M6ezA6e3R5cGU6InJlY3QiLHg6W3EubG93ZXIodGhpcy5fZ2V0VmFsdWUoYywieCIpKSxxLnVwcGVyKHRoaXMuX2dldFZhbHVlKGMsIngiKSldLHk6W2MuJGxvd2VyLGMuJHVwcGVyXSxjb2xvcjp0aGlzLl9nZXRWYWx1ZShjLCJjb2xvciIpLG9wYWNpdHk6dGhpcy5faW5MZXZlbHMoYyk/dGhpcy5fZ2V0VmFsdWUoYywib3BhY2l0eSIpOjB9fSxldnREYXRhOmEsdG9vbHRpcDp0aGlzLl90b29sdGlwKGMpfSl9cmV0dXJuIGh9O3JldHVybiBifShiKTtmPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gej0KYi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUIoYixhKTtiLnByb3RvdHlwZS5fY2FsY0dlb21zPWZ1bmN0aW9uKCl7dmFyIGEsYixkLGUsZixnLGssaCxsLG4sbSx2LHAscSx4LHI7YT1mdW5jdGlvbigpe3ZhciBhLGIsZCxlO2Q9dGhpcy5zdGF0RGF0YTtlPVtdO2E9MDtmb3IoYj1kLmxlbmd0aDthPGI7YSsrKWg9ZFthXSxjLmlzRGVmaW5lZCh0aGlzLl9nZXRWYWx1ZShoLCJ5IikpJiZjLmlzRGVmaW5lZCh2PXRoaXMuX2dldFZhbHVlKGgsIngiKSkmJmUucHVzaCh2KTtyZXR1cm4gZX0uY2FsbCh0aGlzKTthPV8udW5pcShhKTtiPXt9O2U9MDtmb3IoZj1hLmxlbmd0aDtlPGY7ZSsrKW49YVtlXSxiW25dPTA7Zz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkO2M9Xy53aXRob3V0KF8ua2V5cyh0aGlzLm1hcHBpbmcpLCJ4IiwieSIpO2Q9W107YT0wO2ZvcihiPWMubGVuZ3RoO2E8YjthKyspbD1jW2FdLGQucHVzaCh0aGlzLm1hcHBpbmdbbF0pO3JldHVybiBkfS5jYWxsKHRoaXMpOwplPWMuZ3JvdXBCeSh0aGlzLnN0YXREYXRhLGcpO2s9dGhpcy5fZ2V0SWRGdW5jKCk7dGhpcy5nZW9tcz17fTtyPVtdO2ZvcihsIGluIGUpe2Q9ZVtsXTttPWRbMF07Zj17fTtwPTA7Zm9yKHE9Zy5sZW5ndGg7cDxxO3ArKyluPWdbcF0sZltuXT17ImluIjpbbVtuXV19O249ZnVuY3Rpb24oKXt2YXIgYyxkLGU7ZT1bXTtjPTA7Zm9yKGQ9YS5sZW5ndGg7YzxkO2MrKyl2PWFbY10sZS5wdXNoKGJbdl0pO3JldHVybiBlfSgpO3E9MDtmb3IoeD1kLmxlbmd0aDtxPHg7cSsrKWg9ZFtxXSx2PXRoaXMuX2dldFZhbHVlKGgsIngiKSxwPXRoaXMuX2dldFZhbHVlKGgsInkiKSxiW3ZdKz1wO2Q9ZnVuY3Rpb24oKXt2YXIgYyxkLGU7ZT1bXTtjPTA7Zm9yKGQ9YS5sZW5ndGg7YzxkO2MrKyl2PWFbY10sZS5wdXNoKGJbdl0pO3JldHVybiBlfSgpO3IucHVzaCh0aGlzLmdlb21zW2sobSldPXttYXJrczp7MDp7dHlwZToiYXJlYSIseDphLHk6e2JvdHRvbTpuLHRvcDpkfSxjb2xvcjp0aGlzLl9nZXRWYWx1ZShtLAoiY29sb3IiKSxvcGFjaXR5OnRoaXMuX2dldFZhbHVlKG0sIm9wYWNpdHkiKX19LGV2dERhdGE6Zn0pfXJldHVybiByfTtyZXR1cm4gYn0oYik7bj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIEU9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUIoYixhKTtiLnByb3RvdHlwZS5fY2FsY0dlb21zPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaCxrO2I9dGhpcy5fZ2V0SWRGdW5jKCk7dGhpcy5nZW9tcz17fTtoPXRoaXMuc3RhdERhdGE7az1bXTtmPTA7Zm9yKGc9aC5sZW5ndGg7ZjxnO2YrKyl7Yz1oW2ZdO2E9e307Zm9yKGQgaW4gYyllPWNbZF0sYVtkXT17ImluIjpbZV19O2sucHVzaCh0aGlzLmdlb21zW2IoYyldPXttYXJrczp7MDp7dHlwZToidGV4dCIseDp0aGlzLl9nZXRWYWx1ZShjLCJ4IikseTp0aGlzLl9nZXRWYWx1ZShjLCJ5IiksdGV4dDp0aGlzLl9nZXRWYWx1ZShjLCJ0ZXh0IiksY29sb3I6dGhpcy5fZ2V0VmFsdWUoYywKImNvbG9yIiksc2l6ZTp0aGlzLl9nZXRWYWx1ZShjLCJzaXplIiksb3BhY2l0eTp0aGlzLl9nZXRWYWx1ZShjLCJvcGFjaXR5IiksInRleHQtYW5jaG9yIjoiY2VudGVyIn19LGV2dERhdGE6YX0pfXJldHVybiBrfTtyZXR1cm4gYn0oYik7cD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIEE9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUIoYixhKTtiLnByb3RvdHlwZS5fY2FsY0dlb21zPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaCxrO2I9dGhpcy5fZ2V0SWRGdW5jKCk7dGhpcy5nZW9tcz17fTtoPXRoaXMuc3RhdERhdGE7az1bXTtmPTA7Zm9yKGc9aC5sZW5ndGg7ZjxnO2YrKyl7Yz1oW2ZdO2E9e307dGhpcy5fZ2V0VmFsdWUoYywieCIpO3RoaXMuX2dldFZhbHVlKGMsInkiKTtmb3IoZCBpbiBjKWU9Y1tkXSwieSIhPT1kJiYieCIhPT1kJiYoYVtkXT17ImluIjpbZV19KTtrLnB1c2godGhpcy5nZW9tc1tiKGMpXT17bWFya3M6ezA6e3R5cGU6InJlY3QiLAp4OltxLmxvd2VyKHRoaXMuX2dldFZhbHVlKGMsIngiKSkscS51cHBlcih0aGlzLl9nZXRWYWx1ZShjLCJ4IikpXSx5OltxLmxvd2VyKHRoaXMuX2dldFZhbHVlKGMsInkiKSkscS51cHBlcih0aGlzLl9nZXRWYWx1ZShjLCJ5IikpXSxjb2xvcjp0aGlzLl9nZXRWYWx1ZShjLCJjb2xvciIpLHNpemU6dGhpcy5fZ2V0VmFsdWUoYywic2l6ZSIpLG9wYWNpdHk6dGhpcy5fZ2V0VmFsdWUoYywib3BhY2l0eSIpfX0sZXZ0RGF0YTphLHRvb2x0aXA6dGhpcy5fdG9vbHRpcChjKX0pfXJldHVybiBrfTtyZXR1cm4gYn0oYik7aD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIEc9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUIoYixhKTtiLnByb3RvdHlwZS5fY2FsY0dlb21zPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaCxrLGwsbixtLHYscCxyLHg7Yz10aGlzLl9nZXRJZEZ1bmMoKTt0aGlzLmdlb21zPXt9O3I9dGhpcy5zdGF0RGF0YTsKeD1bXTttPTA7Zm9yKHY9ci5sZW5ndGg7bTx2O20rKyl7ZT1yW21dO2I9e307Zm9yKGYgaW4gZSlhPWVbZl0sInkiIT09ZiYmKGJbZl09eyJpbiI6W2FdfSk7az10aGlzLl9nZXRWYWx1ZShlLCJ4Iik7bj10aGlzLl9nZXRWYWx1ZShlLCJ5Iik7YT10aGlzLl9nZXRWYWx1ZShlLCJjb2xvciIpO2Q9dGhpcy5fZ2V0VmFsdWUoZSwic2l6ZSIpO2c9dGhpcy5faW5MZXZlbHMoZSk/dGhpcy5fZ2V0VmFsdWUoZSwib3BhY2l0eSIpOjA7aD1xLmxvd2VyKGspO2w9cS51cHBlcihrKTtrPXEubWlkZGxlKGspO2I9e21hcmtzOnt9LGV2dERhdGE6Yn07bi5xMSYmKGIubWFya3M9e2lxcjp7dHlwZToicmVjdCIseDpbaCxsXSx5OltuLnEyLG4ucTRdLHN0cm9rZTphLGNvbG9yOnEuaWRlbnRpdHkoIndoaXRlIiksc2l6ZTpkLG9wYWNpdHk6Zywic3Ryb2tlLXdpZHRoIjoiMXB4In0scTE6e3R5cGU6InBsaW5lIix4OltoLGxdLHk6W24ucTEsbi5xMV0sY29sb3I6YSxzaXplOmQsb3BhY2l0eTpnfSxsb3dlcjp7dHlwZToicGxpbmUiLAp4OltrLGtdLHk6W24ucTEsbi5xMl0sY29sb3I6YSxzaXplOmQsb3BhY2l0eTpnfSxxNTp7dHlwZToicGxpbmUiLHg6W2gsbF0seTpbbi5xNSxuLnE1XSxjb2xvcjphLHNpemU6ZCxvcGFjaXR5Omd9LHVwcGVyOnt0eXBlOiJwbGluZSIseDpbayxrXSx5OltuLnE0LG4ucTVdLGNvbG9yOmEsc2l6ZTpkLG9wYWNpdHk6Z30sbWlkZGxlOnt0eXBlOiJwbGluZSIseDpbaCxsXSx5OltuLnEzLG4ucTNdLGNvbG9yOmEsc2l6ZTpkLG9wYWNpdHk6Z319KTtwPW4ub3V0bGllcnM7ZD1sPTA7Zm9yKG49cC5sZW5ndGg7bDxuO2Q9KytsKWg9cFtkXSxiLm1hcmtzW2RdPXt0eXBlOiJjaXJjbGUiLHg6ayx5OmgsY29sb3I6YSxzaXplOnEuaWRlbnRpdHkoMyksb3BhY2l0eTpnfTt4LnB1c2godGhpcy5nZW9tc1tjKGUpXT1iKX1yZXR1cm4geH07cmV0dXJuIGJ9KGIpO2MubGF5ZXI9e307Yy5sYXllci5CYXNlPWI7Yy5sYXllci5jbGFzc2VzPXtwb2ludDplLHRleHQ6bixsaW5lOmEscGF0aDpkLGFyZWE6ZiwKYmFyOnMsdGlsZTpwLGJveDpoLHNwbGluZTprfTtjLmxheWVyLm1ha2U9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2U9YS50eXBlO2lmKGUgaW4gYy5sYXllci5jbGFzc2VzKXJldHVybiBuZXcgYy5sYXllci5jbGFzc2VzW2VdKGEsYixkKTt0aHJvdyBjLmVycm9yLmRlZm4oIk5vIHN1Y2ggbGF5ZXIgIithLnR5cGUrIi4iKTt9fSkuY2FsbCh0aGlzKTsoZnVuY3Rpb24oKXt2YXIgZixzPXt9Lmhhc093blByb3BlcnR5LGg9ZnVuY3Rpb24oYixhKXtmdW5jdGlvbiBjKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ifWZvcih2YXIgZSBpbiBhKXMuY2FsbChhLGUpJiYoYltlXT1hW2VdKTtjLnByb3RvdHlwZT1hLnByb3RvdHlwZTtiLnByb3RvdHlwZT1uZXcgYztiLl9fc3VwZXJfXz1hLnByb3RvdHlwZTtyZXR1cm4gYn07Yy5wYW5lPXt9O2MucGFuZS5tYWtlPWZ1bmN0aW9uKGIsYSl7cmV0dXJuIG5ldyBmKGIsYSl9O2Y9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3RoaXMudGl0bGVPYmo9Yjt0aGlzLmluZGV4PQphO3RoaXMudGl0bGU9dGhpcy5sYXllcnM9bnVsbH1oKGEsYik7YS5wcm90b3R5cGUubWFrZT1mdW5jdGlvbihhLGIsZil7dmFyIGgscCxtLHIscTt0aGlzLmxheWVycz1mO2lmKCF0aGlzLmdlb21zKWZvcih0aGlzLmdlb21zPXt9LHI9dGhpcy5sYXllcnMsZj1tPTAscj1yLmxlbmd0aDttPHI7Zj0rK20pdGhpcy5nZW9tc1tmXT1uZXcgYy5HZW9tZXRyeTt0aGlzLm1ldGFzPXt9O3E9dGhpcy5sYXllcnM7Zj1tPTA7Zm9yKHI9cS5sZW5ndGg7bTxyO2Y9KyttKWg9cVtmXSxwPWguY2FsY3VsYXRlKGJbZl0uc3RhdERhdGEsYltmXS5tZXRhRGF0YSksaD1wLmdlb21zLHA9cC5tZXRhLHRoaXMuZ2VvbXNbZl0uc2V0KGgpLHRoaXMubWV0YXNbZl09cDtudWxsPT10aGlzLnRpdGxlJiYodGhpcy50aXRsZT10aGlzLl9tYWtlVGl0bGUoYSkpO3RoaXMudGl0bGUubWFrZSh0aGlzLnRpdGxlT2JqKTtyZXR1cm4gdGhpcy5kb21haW5zPXRoaXMuX21ha2VEb21haW5zKGEsdGhpcy5nZW9tcyx0aGlzLm1ldGFzKX07CmEucHJvdG90eXBlLl9tYWtlVGl0bGU9ZnVuY3Rpb24oKXtyZXR1cm4gYy5ndWlkZS50aXRsZSgiZmFjZXQiKX07YS5wcm90b3R5cGUuX21ha2VEb21haW5zPWZ1bmN0aW9uKGEsYixmKXtyZXR1cm4gYy5kb21haW4ubWFrZShiLGYsYS5ndWlkZXMsYS5zdHJpY3QpfTthLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMsZil7dmFyIGg7dGhpcy50aXRsZS5yZW5kZXIoYSh7fSwhMSwhMSksZixiKTtiPWEoYixjLCEwKTtjPXRoaXMuZ2VvbXM7Zj1bXTtmb3IoaCBpbiBjKWE9Y1toXSxmLnB1c2goYS5yZW5kZXIoYikpO3JldHVybiBmfTthLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZjtmPXRoaXMuZ2VvbXM7Zm9yKGMgaW4gZiliPWZbY10sYi5kaXNwb3NlKGEpO3RoaXMuZ2VvbXM9e307cmV0dXJuIHRoaXMudGl0bGUuZGlzcG9zZShhKX07cmV0dXJuIGF9KGMuUmVuZGVyYWJsZSl9KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe2MuZGltPXt9O2MuZGltLm1ha2U9CmZ1bmN0aW9uKGMscyxoKXt2YXIgYixhLGQsZSxrLG4scCxtO2M9e3dpZHRoOm51bGwhPShhPWMud2lkdGgpP2E6NDAwLGhlaWdodDpudWxsIT0oZD1jLmhlaWdodCk/ZDo0MDAscGFkZGluZ0xlZnQ6bnVsbCE9KGU9Yy5wYWRkaW5nTGVmdCk/ZToxMCxwYWRkaW5nUmlnaHQ6bnVsbCE9KGI9Yy5wYWRkaW5nUmlnaHQpP2I6MTAscGFkZGluZ1RvcDpudWxsIT0oaz1jLnBhZGRpbmdUb3ApP2s6MTAscGFkZGluZ0JvdHRvbTpudWxsIT0obj1jLnBhZGRpbmdCb3R0b20pP246MTAsaG9yaXpvbnRhbFNwYWNpbmc6bnVsbCE9KHA9Yy5ob3Jpem9udGFsU3BhY2luZyk/cDoxMCx2ZXJ0aWNhbFNwYWNpbmc6bnVsbCE9KG09Yy52ZXJ0aWNhbFNwYWNpbmcpP206MjAsZ3VpZGVUb3A6MTAsZ3VpZGVSaWdodDowLGd1aWRlTGVmdDo1LGd1aWRlQm90dG9tOjV9O2I9cy5heGVzT2Zmc2V0KGMpO2E9Yi5sZWZ0O2Q9Yi5yaWdodDtlPWIudG9wO2I9Yi5ib3R0b207Yy5ndWlkZUxlZnQrPW51bGwhPWE/YToKMDtjLmd1aWRlUmlnaHQrPW51bGwhPWQ/ZDowO2MuZ3VpZGVCb3R0b20rPW51bGwhPWI/YjowO2MuZ3VpZGVUb3ArPW51bGwhPWU/ZTowO2I9cy50aXRsZU9mZnNldChjKTthPWIubGVmdDtkPWIucmlnaHQ7ZT1iLnRvcDtiPWIuYm90dG9tO2MuZ3VpZGVMZWZ0Kz1udWxsIT1hP2E6MDtjLmd1aWRlUmlnaHQrPW51bGwhPWQ/ZDowO2MuZ3VpZGVCb3R0b20rPW51bGwhPWI/YjowO2MuZ3VpZGVUb3ArPW51bGwhPWU/ZTowO3M9cy5sZWdlbmRPZmZzZXQoYyk7YT1zLmxlZnQ7ZD1zLnJpZ2h0O2U9cy50b3A7Yj1zLmJvdHRvbTtjLmd1aWRlTGVmdCs9bnVsbCE9YT9hOjA7Yy5ndWlkZVJpZ2h0Kz1udWxsIT1kP2Q6MDtjLmd1aWRlQm90dG9tKz1udWxsIT1iP2I6MDtjLmd1aWRlVG9wKz1udWxsIT1lP2U6MDtzPTAuNCpjLndpZHRoO2E9MC40KmMuaGVpZ2h0O2MuZ3VpZGVMZWZ0PnMmJihjLmd1aWRlTGVmdD1zKTtjLmd1aWRlUmlnaHQ+cyYmKGMuZ3VpZGVSaWdodD1zKTtjLmd1aWRlVG9wPgphJiYoYy5ndWlkZVRvcD1hKTtjLmd1aWRlQm90dG9tPmEmJihjLmd1aWRlQm90dG9tPWEpO2MuY2hhcnRIZWlnaHQ9Yy5oZWlnaHQtYy5wYWRkaW5nVG9wLWMucGFkZGluZ0JvdHRvbS1jLmd1aWRlVG9wLWMuZ3VpZGVCb3R0b207Yy5jaGFydFdpZHRoPWMud2lkdGgtYy5wYWRkaW5nTGVmdC1jLnBhZGRpbmdSaWdodC1jLmd1aWRlTGVmdC1jLmd1aWRlUmlnaHQ7bnVsbCE9aC5jb2xzJiYxPGguY29scz8oYy5lYWNoV2lkdGg9Yy5jaGFydFdpZHRoLWMuaG9yaXpvbnRhbFNwYWNpbmcqaC5jb2xzLGMuZWFjaFdpZHRoLz1oLmNvbHMpOmMuZWFjaFdpZHRoPWMuY2hhcnRXaWR0aDtudWxsIT1oLnJvd3MmJjE8aC5yb3dzPyhjLmVhY2hIZWlnaHQ9Yy5jaGFydEhlaWdodC1jLnZlcnRpY2FsU3BhY2luZyooaC5yb3dzKzEpLGMuZWFjaEhlaWdodC89aC5yb3dzKTpjLmVhY2hIZWlnaHQ9Yy5jaGFydEhlaWdodC1jLnZlcnRpY2FsU3BhY2luZztyZXR1cm4gY307Yy5kaW0uZ3Vlc3M9ZnVuY3Rpb24oYywKcyl7dmFyIGgsYixhLGQsZSxrLG4scCxtO2g9e3dpZHRoOm51bGwhPShiPWMud2lkdGgpP2I6NDAwLGhlaWdodDpudWxsIT0oYT1jLmhlaWdodCk/YTo0MDAscGFkZGluZ0xlZnQ6bnVsbCE9KGQ9Yy5wYWRkaW5nTGVmdCk/ZDoxMCxwYWRkaW5nUmlnaHQ6bnVsbCE9KGU9Yy5wYWRkaW5nUmlnaHQpP2U6MTAscGFkZGluZ1RvcDpudWxsIT0oaz1jLnBhZGRpbmdUb3ApP2s6MTAscGFkZGluZ0JvdHRvbTpudWxsIT0obj1jLnBhZGRpbmdCb3R0b20pP246MTAsZ3VpZGVMZWZ0OjMwLGd1aWRlUmlnaHQ6NDAsZ3VpZGVUb3A6MTAsZ3VpZGVCb3R0b206MzAsaG9yaXpvbnRhbFNwYWNpbmc6bnVsbCE9KHA9Yy5ob3Jpem9udGFsU3BhY2luZyk/cDoxMCx2ZXJ0aWNhbFNwYWNpbmc6bnVsbCE9KG09Yy52ZXJ0aWNhbFNwYWNpbmcpP206MTB9O2guY2hhcnRIZWlnaHQ9aC5oZWlnaHQtaC5wYWRkaW5nVG9wLWgucGFkZGluZ0JvdHRvbS1oLmd1aWRlVG9wLWguZ3VpZGVCb3R0b207aC5jaGFydFdpZHRoPQpoLndpZHRoLWgucGFkZGluZ0xlZnQtaC5wYWRkaW5nUmlnaHQtaC5ndWlkZUxlZnQtaC5ndWlkZVJpZ2h0O2guZWFjaFdpZHRoPW51bGwhPXMuY29scyYmMTxzLmNvbHM/aC5jaGFydFdpZHRoLWguaG9yaXpvbnRhbFNwYWNpbmcqKHMuY29scy0xKTpoLmNoYXJ0V2lkdGg7aC5lYWNoSGVpZ2h0PW51bGwhPXMucm93cyYmMTxzLnJvd3M/aC5jaGFydEhlaWdodC1oLnZlcnRpY2FsU3BhY2luZyoocy5yb3dzLTEpOmguY2hhcnRIZWlnaHQ7cmV0dXJuIGh9fSkuY2FsbCh0aGlzKTsoZnVuY3Rpb24oKXt2YXIgZixzLGgsYixhLGQsZSxrLG4scCxtLHIscSxsLGcsdyx1LHQseixFLEE9e30uaGFzT3duUHJvcGVydHksRz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt0aGlzLmNvbnN0cnVjdG9yPWF9Zm9yKHZhciBkIGluIGIpQS5jYWxsKGIsZCkmJihhW2RdPWJbZF0pO2MucHJvdG90eXBlPWIucHJvdG90eXBlO2EucHJvdG90eXBlPW5ldyBjO2EuX19zdXBlcl9fPWIucHJvdG90eXBlO3JldHVybiBhfTsKYy5wYXBlcj1mdW5jdGlvbihhLGIsZCxlKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBSYXBoYWVsfHxudWxsPT09UmFwaGFlbCl0aHJvdyBjLmVycm9yLmRlcG4oIlRoZSBkZXBlbmRlbmN5IFJhcGhhZWwgaXMgbm90IGluY2x1ZGVkLiIpO2E9UmFwaGFlbChhLGIsZCk7Yj1hLnJlY3QoMCwwLGIsZCkuYXR0cih7ZmlsbDoid2hpdGUiLG9wYWNpdHk6MCwic3Ryb2tlLXdpZHRoIjowfSk7Yi5jbGljayhlLmhhbmRsZUV2ZW50KCJyZXNldCIpKTtjLm1vdXNlRXZlbnRzKGUsYiwhMSk7Yy50b3VjaEV2ZW50cyhlLmhhbmRsZUV2ZW50LGIsITApO3JldHVybiBhfTtjLm1vdXNlRXZlbnRzPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGcsaCxrLGw7Zz1hLmhhbmRsZUV2ZW50KCJzZWxlY3QiKTtkJiYoaD1udWxsKTtsPWY9az1lPW51bGw7cmV0dXJuIGIuZHJhZyhmdW5jdGlvbihiLGcsbixtKXtpZihudWxsIT1sJiZudWxsIT1rKXtpZihlPXt4OmsueCtiLHk6ay55K2d9LGY9YS5mYWNldC5nZXRGYWNldEluZm8oYS5kaW1zLAplLngsZS55KSxudWxsIT1oJiZudWxsIT1mJiZmLmNvbD09PWwuY29sJiZmLnJvdz09PWwucm93JiZkKXJldHVybiBuPXt4Ok1hdGgubWluKGsueCxlLngpLHk6TWF0aC5taW4oay55LGUueSksd2lkdGg6TWF0aC5hYnMoay54LWUueCksaGVpZ2h0Ok1hdGguYWJzKGsueS1lLnkpfSxoPWguYXR0cihuKX1lbHNlIGlmKGI9Yy5vZmZzZXQoYS5kb20pLGs9e3g6bi1iLmxlZnQseTptLWIudG9wfSxsPWEuZmFjZXQuZ2V0RmFjZXRJbmZvKGEuZGltcyxrLngsay55KSxudWxsIT1sJiZkKXJldHVybiBoPWEucGFwZXIucmVjdChrLngsay55LDAsMCwyKSxoPWguYXR0cih7ZmlsbDoiYmxhY2siLG9wYWNpdHk6MC4yfSl9LGZ1bmN0aW9uKCl7cmV0dXJuIGU9az1udWxsfSxmdW5jdGlvbigpe2lmKG51bGwhPWsmJm51bGwhPWUpcmV0dXJuIG51bGwhPWgmJmQmJihoPWguaGlkZSgpLGgucmVtb3ZlKCkpLGcoe3N0YXJ0OmssZW5kOmV9KX0pfTtjLnRvdWNoRXZlbnRzPWZ1bmN0aW9uKGEsYixjKXtudWxsPT0KYyYmKGM9ITApO2lmKGMpcmV0dXJuIGIudG91Y2hzdGFydChhKCJ0b3VjaHN0YXJ0IikpLGIudG91Y2hlbmQoYSgidG91Y2hlbmQiKSksYi50b3VjaG1vdmUoYSgidG91Y2htb3ZlIikpLGIudG91Y2hjYW5jZWwoYSgidG91Y2hjYW5jZWwiKSl9O2MucmVuZGVyPWZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiBmdW5jdGlvbihmLGcsaCl7bnVsbD09ZiYmKGY9e30pO251bGw9PWcmJihnPSExKTtudWxsPT1oJiYoaD0hMCk7aWYobnVsbD09ZS50eXBlKXRocm93IGMuZXJyb3IudW5rbm93bigiQ29vcmRpbmF0ZSBkb24ndCBoYXZlIGF0IHR5cGU/Iik7aWYobnVsbD09cFtlLnR5cGVdKXRocm93IGMuZXJyb3IuaW5wdXQoIlVua25vd24gY29vcmRpbmF0ZSB0eXBlICIrZS50eXBlKTtyZXR1cm57YWRkOmZ1bmN0aW9uKGssbCxuLG0pe3ZhciBxO2lmKG51bGw9PXBbZS50eXBlXVtrLnR5cGVdKXRocm93IGMuZXJyb3IuaW5wdXQoIkNvb3JkICIrZS50eXBlKyIgaGFzIG5vIG1hcmsgIitrLnR5cGUpOwpxPXBbZS50eXBlXVtrLnR5cGVdLnJlbmRlcihiLGQsZSxmLGssaCk7cS5kYXRhKCJtIixrKTtsJiYwPF8ua2V5cyhsKS5sZW5ndGgmJnEuZGF0YSgiZSIsbCk7biYmcS5kYXRhKCJ0IixuKTtudWxsIT1nJiZxLmF0dHIoImNsaXAtcmVjdCIsZyk7Imd1aWRlIj09PW0/cS5jbGljayhhKCJndWlkZS1jbGljayIpKToiZ3VpZGUtdGl0bGUiPT09bXx8Imd1aWRlLXRpdGxlSCI9PT1tfHwiZ3VpZGUtdGl0bGVWIj09PW0/cS5jbGljayhhKG0pKToocS5jbGljayhhKCJjbGljayIpKSxxLmhvdmVyKGEoIm1vdmVyIiksYSgibW91dCIpKSk7Yy50b3VjaEV2ZW50cyhhLHEsITApO3JldHVybiBxfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVtb3ZlKCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsayl7cFtlLnR5cGVdW2IudHlwZV0uYW5pbWF0ZShhLGQsZSxmLGIsaCk7bnVsbCE9ZyYmYS5hdHRyKCJjbGlwLXJlY3QiLGcpO2MmJjA8Xy5rZXlzKGMpLmxlbmd0aCYmYS5kYXRhKCJlIiwKYyk7ayYmYS5kYXRhKCJ0IixrKTthLmRhdGEoIm0iLGIpO3JldHVybiBhfX19fTtrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31hLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnO2E9dGhpcy5fbWFrZShhKTtjPXRoaXMuYXR0cihiLGMsZCxlLGYpO2ZvcihnIGluIGMpYj1jW2ddLGEuYXR0cihnLGIpO3JldHVybiBhfTthLnByb3RvdHlwZS5fbWFrZT1mdW5jdGlvbigpe3Rocm93IGMuZXJyb3IuaW1wbCgpO307YS5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIGEuYW5pbWF0ZSh0aGlzLmF0dHIoYixjLGQsZSxmKSwzMDApfTthLnByb3RvdHlwZS5hdHRyPWZ1bmN0aW9uKGEsYixkLGUsZil7dGhyb3cgYy5lcnJvci5pbXBsKCk7fTthLnByb3RvdHlwZS5fY2FudFJlbmRlcj1mdW5jdGlvbihhKXt0aHJvdyBjLmVycm9yLm1pc3NpbmdkYXRhKCk7fTthLnByb3RvdHlwZS5fbWFrZVBhdGg9ZnVuY3Rpb24oYSxiLGMpe251bGw9PQpjJiYoYz0iTCIpO3N3aXRjaChjKXtjYXNlICJzcGxpbmUiOmE9Xy5tYXAoYSxmdW5jdGlvbihhLGMpe3JldHVybigwPT09Yz8iTSAiK2ErIiAiK2JbY10rIiBSICI6IiIpKygiIithKyIgIitiW2NdKX0pO2JyZWFrO2RlZmF1bHQ6YT1fLm1hcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuKDA9PT1kPyJNIjpjKSthKyIgIitiW2RdfSl9cmV0dXJuIGEuam9pbigiICIpfTthLnByb3RvdHlwZS5fbWF5YmVBcHBseT1mdW5jdGlvbihhLGIsYyl7Yj1iW2NdO3JldHVybiBfLmlzT2JqZWN0KGIpJiYiaWRlbnRpdHkiPT09Yi5mP2IudjpudWxsIT1hW2NdP2FbY10uZihiKTpifTthLnByb3RvdHlwZS5fYXBwbHlPZmZzZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFjKXJldHVybnt4OmEseTpifTtudWxsPT1jLngmJihjLng9MCk7bnVsbD09Yy55JiYoYy55PTApO3JldHVybnt4Ol8uaXNBcnJheShhKT9mdW5jdGlvbigpe3ZhciBiLGUsZjtmPVtdO2I9MDtmb3IoZT1hLmxlbmd0aDtiPGU7YisrKWQ9CmFbYl0sZi5wdXNoKGQrYy54KTtyZXR1cm4gZn0oKTphK2MueCx5Ol8uaXNBcnJheShiKT9mdW5jdGlvbigpe3ZhciBhLGUsZjtmPVtdO2E9MDtmb3IoZT1iLmxlbmd0aDthPGU7YSsrKWQ9YlthXSxmLnB1c2goZCtjLnkpO3JldHVybiBmfSgpOmIrYy55fX07YS5wcm90b3R5cGUuX3NoYXJlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzO2Q9ZnVuY3Rpb24oZCl7aWYobnVsbCE9YltkXSYmbnVsbD09Y1tkXSlyZXR1cm4gY1tkXT1lLl9tYXliZUFwcGx5KGEsYixkKX07ZCgib3BhY2l0eSIpO2QoInN0cm9rZS13aWR0aCIpO2QoInN0cm9rZS1kYXNoYXJyYXkiKTtkKCJzdHJva2UtZGFzaG9mZnNldCIpO2QoInRyYW5zZm9ybSIpO2QoImZvbnQtc2l6ZSIpO2QoImZvbnQtd2VpZ2h0Iik7ZCgiZm9udC1mYW1pbHkiKTtyZXR1cm4gY307YS5wcm90b3R5cGUuX2NoZWNrUG9pbnRVbmRlZmluZWQ9ZnVuY3Rpb24oYSxiLGQpe251bGw9PWQmJihkPSJQb2ludCIpO2lmKHZvaWQgMD09PQphfHx2b2lkIDA9PT1iKXRocm93IGMuZXJyb3IubWlzc2luZygiIitkKyIgY2Fubm90IGJlIHBsb3R0ZWQgZHVlIHRvIHVuZGVmaW5lZCBkYXRhLiIpO307YS5wcm90b3R5cGUuX2NoZWNrQXJyYXlVbmRlZmluZWQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO251bGw9PWQmJihkPSJMaW5lIik7aWYoXy5hbGwoZnVuY3Rpb24oKXt2YXIgYyxkLGY7Zj1bXTtlPWM9MDtmb3IoZD1hLmxlbmd0aC0xOzA8PWQ/Yzw9ZDpjPj1kO2U9MDw9ZD8rK2M6LS1jKWYucHVzaCh2b2lkIDA9PT1hW2VdfHx2b2lkIDA9PT1iW2VdKTtyZXR1cm4gZn0oKSkpdGhyb3cgYy5lcnJvci5taXNzaW5nKCIiK2QrIiBjYW5ub3QgYmUgcGxvdHRlZCBkdWUgdG8gdG9vIG1hbnkgbWlzc2luZyBwb2ludHMuIik7fTthLnByb3RvdHlwZS5fY2hlY2tBcnJheU5hTj1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7ZD1fLm1hcChfLnppcChhLGIpLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGlzTmFOKGFbMF0pfHxpc05hTihhWzFdKT92b2lkIDA6CmF9KTtyZXR1cm57eDpmdW5jdGlvbigpe3ZhciBhLGIsZTtlPVtdO2E9MDtmb3IoYj1kLmxlbmd0aDthPGI7YSsrKWM9ZFthXSxudWxsIT1jJiZlLnB1c2goY1swXSk7cmV0dXJuIGV9KCkseTpmdW5jdGlvbigpe3ZhciBhLGIsZTtlPVtdO2E9MDtmb3IoYj1kLmxlbmd0aDthPGI7YSsrKWM9ZFthXSxudWxsIT1jJiZlLnB1c2goY1sxXSk7cmV0dXJuIGV9KCl9fTtyZXR1cm4gYX0oKTtmPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gbT1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9RyhiLGEpO2IucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnLGg7aD1hLmRhdGEoIm0iKTtnPXRoaXMuYXR0cihiLGMsZCxlLGYpO2lmKF8uaXNFcXVhbChoLngsZS54KSlyZXR1cm4gYS5hbmltYXRlKGcsMzAwKTtiPXRoaXMuYXR0cihiLGMsZCxoLGYpO3JldHVybiBhLmFuaW1hdGUoYiwzMDAsZnVuY3Rpb24oKXtyZXR1cm4gYS5hdHRyKGcpfSl9OwpyZXR1cm4gYn0oayk7cz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIHI9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUcoYixhKTtiLnByb3RvdHlwZS5fbWFrZT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jaXJjbGUoKX07Yi5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihhLGIsYyxkLGUpe2U9Yi5nZXRYWShlLGQpO2I9ZS54O2U9ZS55O3RoaXMuX2NoZWNrUG9pbnRVbmRlZmluZWQoYixlLCJDaXJjbGUiKTtjPXRoaXMuX2FwcGx5T2Zmc2V0KGIsZSxjKTtiPWMueDtlPWMueTtjPXRoaXMuX21heWJlQXBwbHkoYSxkLGQuc3Ryb2tlPyJzdHJva2UiOiJjb2xvciIpO2M9e2N4OmIsY3k6ZSxyOnRoaXMuX21heWJlQXBwbHkoYSxkLCJzaXplIiksc3Ryb2tlOmN9OyhiPXRoaXMuX21heWJlQXBwbHkoYSxkLCJjb2xvciIpKSYmIm5vbmUiIT09YiYmKGMuZmlsbD1iKTtyZXR1cm4gdGhpcy5fc2hhcmVkKGEsZCxjKX07cmV0dXJuIGJ9KGspO2E9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3JldHVybiBxPQpiLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9RyhiLGEpO2IucHJvdG90eXBlLl9tYWtlPWZ1bmN0aW9uKGEpe3JldHVybiBhLnBhdGgoKX07Yi5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmO2U9Yi5nZXRYWShlLGQpO2I9ZS54O2U9ZS55O3RoaXMuX2NoZWNrQXJyYXlVbmRlZmluZWQoYixlLCJQYXRoIik7Yz10aGlzLl9hcHBseU9mZnNldChiLGUsYyk7Yj1jLng7ZT1jLnk7Zj10aGlzLl9tYXliZUFwcGx5KGEsZCxkLnN0cm9rZT8ic3Ryb2tlIjoiY29sb3IiKTtjPXRoaXMuX21heWJlQXBwbHkoYSxkLGQuc2l6ZT8ic2l6ZSI6InN0cm9rZS13aWR0aCIpO3JldHVybiB0aGlzLl9zaGFyZWQoYSxkLHtwYXRoOnRoaXMuX21ha2VQYXRoKGIsZSksc3Ryb2tlOmYsInN0cm9rZS13aWR0aCI6Y30pfTtyZXR1cm4gYn0oayk7Yj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIGw9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywKYXJndW1lbnRzKX1HKGIsYSk7Yi5wcm90b3R5cGUuX21ha2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGF0aCgpfTtiLnByb3RvdHlwZS5hdHRyPWZ1bmN0aW9uKGEsYixkLGUsZil7dmFyIGcsaDtnPWMuc29ydEFycmF5cyhhLnguY29tcGFyZSxbZS54LGUueV0pO2UueD1nWzBdO2UueT1nWzFdO2Y9Yi5nZXRYWShmLGUpO2I9Zi54O2Y9Zi55O3RoaXMuX2NoZWNrQXJyYXlVbmRlZmluZWQoYixmLCJMaW5lIik7Zz0wO2ZvcihoPWIubGVuZ3RoO2c8aDsrK2cpO2Q9dGhpcy5fYXBwbHlPZmZzZXQoYixmLGQpO2I9ZC54O2Y9ZC55O2Q9dGhpcy5fY2hlY2tBcnJheU5hTihiLGYpO2I9ZC54O2Y9ZC55O2c9dGhpcy5fbWF5YmVBcHBseShhLGUsZS5zdHJva2U/InN0cm9rZSI6ImNvbG9yIik7ZD10aGlzLl9tYXliZUFwcGx5KGEsZSxlLnNpemU/InNpemUiOiJzdHJva2Utd2lkdGgiKTtyZXR1cm4gdGhpcy5fc2hhcmVkKGEsZSx7cGF0aDp0aGlzLl9tYWtlUGF0aChiLGYpLHN0cm9rZTpnLCJzdHJva2Utd2lkdGgiOmR9KX07CnJldHVybiBifShmKTtuPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gZz1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9RyhiLGEpO2IucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oYSxiLGQsZSxmKXt2YXIgZyxoO2c9Yy5zb3J0QXJyYXlzKGEueC5jb21wYXJlLFtlLngsZS55XSk7ZS54PWdbMF07ZS55PWdbMV07Zj1iLmdldFhZKGYsZSk7Yj1mLng7Zj1mLnk7dGhpcy5fY2hlY2tBcnJheVVuZGVmaW5lZChiLGYsIlNwbGluZSIpO2c9MDtmb3IoaD1iLmxlbmd0aDtnPGg7KytnKTtkPXRoaXMuX2FwcGx5T2Zmc2V0KGIsZixkKTtiPWQueDtmPWQueTtkPXRoaXMuX2NoZWNrQXJyYXlOYU4oYixmKTtiPWQueDtmPWQueTtnPXRoaXMuX21heWJlQXBwbHkoYSxlLGUuc3Ryb2tlPyJzdHJva2UiOiJjb2xvciIpO2Q9dGhpcy5fbWF5YmVBcHBseShhLGUsZS5zaXplPyJzaXplIjoic3Ryb2tlLXdpZHRoIik7cmV0dXJuIHRoaXMuX3NoYXJlZChhLAplLHtwYXRoOnRoaXMuX21ha2VQYXRoKGIsZiwic3BsaW5lIiksc3Ryb2tlOmcsInN0cm9rZS13aWR0aCI6ZH0pfTtyZXR1cm4gYn0oYik7ZD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIHc9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUcoYixhKTtiLnByb3RvdHlwZS5hdHRyPWZ1bmN0aW9uKGEsYixkLGUsZil7dmFyIGcsaCxrLGwsbjtsPWIuZ2V0WFkoZixlKTtmPWwueDtuPWwueTtiPWwucjtsPWwudDt0aGlzLl9jaGVja0FycmF5VW5kZWZpbmVkKGYsbiwiTGluZSIpO249dGhpcy5fYXBwbHlPZmZzZXQoZixuLGQpO2Y9bi54O249bi55O3ZhciBtLHA7aWYoXy5tYXgoYiktXy5taW4oYik8Y1siY29uc3QiXS5lcHNpbG9uKWZvcihiPWJbMF0sZD0iTSAiK2ZbMF0rIiAiK25bMF0saD1tPTEscD1mLmxlbmd0aC0xOzE8PXA/bTw9cDptPj1wO2g9MTw9cD8rK206LS1tKWs9TWF0aC5hYnMobFtoXS1sW2gtMV0pPk1hdGguUEk/MTowLGc9CjA8bFtoXS1sW2gtMV0/MTowLGQrPSJBICIrYisiICIrYisiIDAgIitrKyIgIitnKyIgIitmW2hdKyIgIituW2hdO2Vsc2UgZD10aGlzLl9tYWtlUGF0aChmLG4pO2I9dGhpcy5fbWF5YmVBcHBseShhLGUsZS5zdHJva2U/InN0cm9rZSI6ImNvbG9yIik7cmV0dXJuIHRoaXMuX3NoYXJlZChhLGUse3BhdGg6ZCxzdHJva2U6Yn0pfTtyZXR1cm4gYn0oYik7Zj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIHU9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUcoYixhKTtiLnByb3RvdHlwZS5fbWFrZT1mdW5jdGlvbihhKXtyZXR1cm4gYS5wYXRoKCl9O2IucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oYSxiLGQsZSxmKXt2YXIgZyxoLGs7Zz1jLnNvcnRBcnJheXMoYS54LmNvbXBhcmUsW2UueCxlLnkudG9wXSk7aD1nWzBdO2s9Z1sxXTtnPWIuZ2V0WFkoZix7eDpoLHk6a30pO2c9dGhpcy5fYXBwbHlPZmZzZXQoZy54LGcueSxkKTtrPWMuc29ydEFycmF5cyhmdW5jdGlvbihiLApjKXtyZXR1cm4tYS54LmNvbXBhcmUoYixjKX0sW2UueCxlLnkuYm90dG9tXSk7aD1rWzBdO2s9a1sxXTtiPWIuZ2V0WFkoZix7eDpoLHk6a30pO2I9dGhpcy5fYXBwbHlPZmZzZXQoYi54LGIueSxkKTtoPWcueC5jb25jYXQoYi54KTtrPWcueS5jb25jYXQoYi55KTtyZXR1cm4gdGhpcy5fc2hhcmVkKGEsZSx7cGF0aDp0aGlzLl9tYWtlUGF0aChoLGspLHN0cm9rZTp0aGlzLl9tYXliZUFwcGx5KGEsZSwiY29sb3IiKSxmaWxsOnRoaXMuX21heWJlQXBwbHkoYSxlLCJjb2xvciIpLCJzdHJva2Utd2lkdGgiOiIwcHgifSl9O3JldHVybiBifShmKTtlPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gdD1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9RyhiLGEpO2IucHJvdG90eXBlLl9tYWtlPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlY3QoKX07Yi5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihhLGIsYyxkLGUpe2U9Yi5nZXRYWShlLGQpO2I9ZS54OwplPWUueTt0aGlzLl9jaGVja1BvaW50VW5kZWZpbmVkKGJbMF0sZVswXSwiQmFyIik7dGhpcy5fY2hlY2tQb2ludFVuZGVmaW5lZChiWzFdLGVbMV0sIkJhciIpO2M9dGhpcy5fYXBwbHlPZmZzZXQoYixlLGMpO2I9Yy54O2U9Yy55O2M9dGhpcy5fbWF5YmVBcHBseShhLGQsZC5zdHJva2U/InN0cm9rZSI6ImNvbG9yIik7cmV0dXJuIHRoaXMuX3NoYXJlZChhLGQse3g6Xy5taW4oYikseTpfLm1pbihlKSx3aWR0aDpNYXRoLmFicyhiWzFdLWJbMF0pLGhlaWdodDpNYXRoLmFicyhlWzFdLWVbMF0pLGZpbGw6dGhpcy5fbWF5YmVBcHBseShhLGQsImNvbG9yIiksc3Ryb2tlOmMsInN0cm9rZS13aWR0aCI6dGhpcy5fbWF5YmVBcHBseShhLGQsInN0cm9rZS13aWR0aCIpfSl9O3JldHVybiBifShrKTtoPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gej1iLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9RyhiLGEpO2IucHJvdG90eXBlLl9tYWtlPWZ1bmN0aW9uKGEpe3JldHVybiBhLnBhdGgoKX07CmIucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oYSxiLGQsZSxmKXt2YXIgZyxoLGssbDtnPWUueDtoPWdbMF07Zz1nWzFdO2w9ZS55O2s9bFswXTtsPWxbMV07dGhpcy5fY2hlY2tQb2ludFVuZGVmaW5lZChoLGssIkJhciIpO3RoaXMuX2NoZWNrUG9pbnRVbmRlZmluZWQoZyxsLCJCYXIiKTtlLng9W2gsaCxnLGddO2UueT1bayxsLGwsa107Zz1iLmdldFhZKGYsZSk7aD1nLng7az1nLnk7Zj1nLnI7Zz1nLnQ7ZD10aGlzLl9hcHBseU9mZnNldChoLGssZCk7aD1kLng7az1kLnk7Yi5mbGlwJiYoaC5wdXNoKGguc3BsaWNlKDAsMSlbMF0pLGsucHVzaChrLnNwbGljZSgwLDEpWzBdKSxmLnB1c2goZi5zcGxpY2UoMCwxKVswXSksZy5wdXNoKGcuc3BsaWNlKDAsMSlbMF0pKTsyKk1hdGguUEktTWF0aC5hYnMoZ1sxXS1nWzBdKTxjWyJjb25zdCJdLmVwc2lsb24/KGI9Ik0gIitoWzBdKyIgIitrWzBdKyIgQSAiK2ZbMF0rIiAiK2ZbMF0rIiAwIDEgMSAiK2hbMF0rIiAiKyhrWzBdKzIqZlswXSkrCiIgQSAiK2ZbMV0rIiAiK2ZbMV0rIiAwIDEgMSAiK2hbMV0rIiAiK2tbMV0sYis9Ik0gIitoWzJdKyIgIitrWzJdKyIgQSAiK2ZbMl0rIiAiK2ZbMl0rIiAwIDEgMCAiK2hbMl0rIiAiKyhrWzJdKzIqZlsyXSkrIiBBICIrZlszXSsiICIrZlszXSsiIDAgMSAwICIraFszXSsiICIra1szXSsiIFoiKTooZD1NYXRoLmFicyhnWzFdLWdbMF0pPk1hdGguUEk/MTowLGI9Ik0gIitoWzBdKyIgIitrWzBdKyIgQSAiK2ZbMF0rIiAiK2ZbMV0rIiAwICIrZCsiIDEgIitoWzFdKyIgIitrWzFdLGQ9TWF0aC5hYnMoZ1szXS1nWzJdKT5NYXRoLlBJPzE6MCxiKz0iTCAiK2hbMl0rIiAiK2tbMl0rIiBBICIrZlsyXSsiICIrZlszXSsiIDAgIitkKyIgMCAiK2hbM10rIiAiK2tbM10rIiBaIik7ZD10aGlzLl9tYXliZUFwcGx5KGEsZSxlLnN0cm9rZT8ic3Ryb2tlIjoiY29sb3IiKTtyZXR1cm4gdGhpcy5fc2hhcmVkKGEsZSx7cGF0aDpiLGZpbGw6dGhpcy5fbWF5YmVBcHBseShhLGUsImNvbG9yIiksc3Ryb2tlOmQsCiJzdHJva2Utd2lkdGgiOnRoaXMuX21heWJlQXBwbHkoYSxlLCJzdHJva2Utd2lkdGgiKX0pfTtyZXR1cm4gYn0oayk7az1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7cmV0dXJuIEU9Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfUcoYixhKTtiLnByb3RvdHlwZS5fbWFrZT1mdW5jdGlvbihhKXtyZXR1cm4gYS50ZXh0KCl9O2IucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZjtlPWIuZ2V0WFkoZSxkKTtiPWUueDtlPWUueTt0aGlzLl9jaGVja1BvaW50VW5kZWZpbmVkKGIsZSwiVGV4dCIpO2M9dGhpcy5fYXBwbHlPZmZzZXQoYixlLGMpO2I9Yy54O2U9Yy55O3JldHVybiB0aGlzLl9zaGFyZWQoYSxkLHt4OmIseTplLHI6MTAsdGV4dDp0aGlzLl9tYXliZUFwcGx5KGEsZCwidGV4dCIpLCJmb250LXNpemUiOnRoaXMuX21heWJlQXBwbHkoYSxkLCJzaXplIiksInRleHQtYW5jaG9yIjpudWxsIT0oZj1kWyJ0ZXh0LWFuY2hvciJdKT8KZjoibGVmdCIsZmlsbDp0aGlzLl9tYXliZUFwcGx5KGEsZCwiY29sb3IiKXx8ImJsYWNrIn0pfTtyZXR1cm4gYn0oayk7cD17Y2FydGVzaWFuOntjaXJjbGU6bmV3IHMsbGluZTpuZXcgYixwbGluZTpuZXcgYixhcmVhOm5ldyBmLHBhdGg6bmV3IGEsdGV4dDpuZXcgayxyZWN0Om5ldyBlLHNwbGluZTpuZXcgbn0scG9sYXI6e2NpcmNsZTpuZXcgcyxwYXRoOm5ldyBhLGxpbmU6bmV3IGIscGxpbmU6bmV3IGQsYXJlYTpuZXcgZix0ZXh0Om5ldyBrLHJlY3Q6bmV3IGgsc3BsaW5lOm5ldyBufX19KS5jYWxsKHRoaXMpOyhmdW5jdGlvbigpe3ZhciBmPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGMpe2Zvcih2YXIgZj0wLGI9dGhpcy5sZW5ndGg7ZjxiO2YrKylpZihmIGluIHRoaXMmJnRoaXNbZl09PT1jKXJldHVybiBmO3JldHVybi0xfTtjLmhhbmRsZXI9e307Yy5oYW5kbGVyLnRvb2x0aXA9ZnVuY3Rpb24oKXt2YXIgZixoLGIsYSxkLGUsaztkPXt9O2g9Zj1hPWI9bnVsbDtrPWZ1bmN0aW9uKGEpe2E9CmMuZ2V0WFkoYixhKTtpZihudWxsIT1kLnRleHQpcmV0dXJuIGUoZCxhKX07ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxrLGcsdztkPVtiLngsYi55XTtrPWRbMF07ZD1kWzFdO2lmKG51bGwhPWEudGV4dClyZXR1cm4gZT1hLnRleHQuZ2V0QkJveCgpLmhlaWdodCxrPXt4OmsseTpkLWUvMi0yMH0sYS50ZXh0LmF0dHIoayksZT1hLnRleHQuZ2V0QkJveCgpLGc9ZS54LHc9ZS55LGM9ZS53aWR0aCxlPWUuaGVpZ2h0LGM9e3g6Zy01LHk6dy01LHdpZHRoOmMrMTAsaGVpZ2h0OmUrMTB9LDA+Yy55JiYoYy55PXcrMzArZSxrLnk9ZCtlLzIrMTUpLGMueCtjLndpZHRoPmYmJihkPWMueCtjLndpZHRoLWYsYy54LT1kLzIsay54LT1kLzIpLGMueDxoJiYoay54Kz1oLWMueCxjLng9aCksYS50ZXh0LmF0dHIoayksYS5ib3guYXR0cihjKSxhfTtyZXR1cm4gZnVuY3Rpb24obixwLG0scil7dmFyIHEsbDtiPWMub2Zmc2V0KHIuZG9tKTthPXAucGFwZXI7Zj1yLmRpbXMuY2hhcnRXaWR0aCtyLmRpbXMuZ3VpZGVMZWZ0KwpyLmRpbXMucGFkZGluZ0xlZnQ7aD1yLmRpbXMuZ3VpZGVMZWZ0K3IuZGltcy5wYWRkaW5nTGVmdDtpZigibW92ZXIiPT09bnx8Im1vdXQiPT09bilpZihudWxsIT1kLnRleHQmJihkLnRleHQucmVtb3ZlKCksZC5ib3gucmVtb3ZlKCkpLGQ9e30sIm1vdmVyIj09PW4mJnAudG9vbHRpcClyZXR1cm4gbj1jLmdldFhZKGIsbSkscC5nZXRCQm94KCksbT1bbi54LG4ueV0scT1tWzBdLG09bVsxXSxkLnRleHQ9YS50ZXh0KHEsbSxwLnRvb2x0aXAoci5zY2FsZVNldC5zY2FsZXMpKS5hdHRyKHsidGV4dC1hbmNob3IiOiJtaWRkbGUiLGZpbGw6IndoaXRlIn0pLHI9ZC50ZXh0LmdldEJCb3goKSxyPXIuaGVpZ2h0LGQudGV4dC5hdHRyKHt5Om0tci8yLTIwfSkscj1kLnRleHQuZ2V0QkJveCgpLHE9ci54LGw9ci55LG09ci53aWR0aCxyPXIuaGVpZ2h0LGQuYm94PWEucmVjdChxLTUsbC01LG0rMTAscisxMCwxMCksZC5ib3guYXR0cih7ZmlsbDoiIzIxMyJ9KSxkLnRleHQudG9Gcm9udCgpLGQ9CmUoZCxuKSxwLm1vdXNlbW92ZShrKX19O2MuaGFuZGxlci5kcmlsbGRvd249ZnVuY3Rpb24ocyxoLGIpe3ZhciBhLGQ7bnVsbD09YiYmKGI9e30pO2lmKCFfLmlzQXJyYXkoaCkpdGhyb3cgYy5lcnJvci5pbnB1dCgiUGFyYW1ldGVyIGBsZXZlbHNgIHNob3VsZCBiZSBhbiBhcnJheS4iKTtpZigwPmYuY2FsbChjWyJjb25zdCJdLmFlcyxzKSl0aHJvdyBjLmVycm9yLmlucHV0KCJVbmtub3duIGFlc3RoZXRpYyAiK3MrIi4iKTthPTA7ZD1bYl07cmV0dXJuIGZ1bmN0aW9uKGIsYyxmLHApe3ZhciBtLHI7aWYoInJlc2V0Ij09PWImJjA8YSl7Yz1wLnNwZWM7ZC5wb3AoKTtiPWQudW5zaGlmdCgpO2EtLTtyPWMubGF5ZXJzO2Y9MDtmb3IobT1yLmxlbmd0aDtmPG07ZisrKWM9cltmXSxjLmZpbHRlcj1iLGNbc109aFthXSxjLmlkPWhbYV07cmV0dXJuIHAubWFrZShwLnNwZWMpfWlmKCJjbGljayI9PT1iJiZhPGgubGVuZ3RoLTEmJihiPWMuZXZ0RGF0YSxjPXAuc3BlYyxmPWJbaFthXV0pKXtiPQp7fTtiW2hbYV1dPWY7YSsrO2I9Xy5leHRlbmQoXy5jbG9uZShkW2QubGVuZ3RoLTFdKSxiKTtyPWMubGF5ZXJzO2Y9MDtmb3IobT1yLmxlbmd0aDtmPG07ZisrKWM9cltmXSxjLmZpbHRlcj1iLGNbc109aFthXSxjLmlkPWhbYV07ZC5wdXNoKGIpO3JldHVybiBwLm1ha2UocC5zcGVjKX19fTtjLmhhbmRsZXIuem9vbT1mdW5jdGlvbihmLGgpe3ZhciBiLGEsZCxlLGssbjtudWxsPT1oJiYoaD17eDohMCx5OiEwfSk7aWYobnVsbD09Zil0aHJvdyBjLmVycm9yLmlucHV0KCJJbml0aWFsIHNwZWNpZmljYXRpb24gbWlzc2luZy4iKTthPXt4Ol8uY2xvbmUobnVsbCE9KGU9Zi5ndWlkZXMpP2UueDp2b2lkIDApLHk6Xy5jbG9uZShudWxsIT0oaz1mLmd1aWRlcyk/ay55OnZvaWQgMCl9O2Q9dm9pZCAwO2I9WyJ4IiwieSJdO249ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkLGUpe3JldHVybiJyZXNldCI9PT1iP18uaXNGdW5jdGlvbihhKT9hKCJyZXNldFpvb20iLGMsZCxlKToKYS5oYW5kbGUoInJlc2V0Wm9vbSIsYyxkLGUpOl8uaXNGdW5jdGlvbihhKT9hKGIsYyxkLGUpOmEuaGFuZGxlKGIsYyxkLGUpfX07cmV0dXJuIGZ1bmN0aW9uKGUsZixrLHEpe3ZhciBsLGcscyx1LHQseixFLEEsRyxDO251bGw9PWQmJihkPV8uY2xvbmUocS5oYW5kbGVycykpO2lmKCJjYXJ0ZXNpYW4iPT09cS5jb29yZC50eXBlKXtpZigicmVzZXRab29tIj09PWUpe2w9cS5zcGVjO2c9MDtmb3Iocz1iLmxlbmd0aDtnPHM7ZysrKWs9YltnXSxsLmd1aWRlc1trXT1fLmNsb25lKGFba10pO3EuaGFuZGxlcnM9Xy5jbG9uZShkKTtxLm1ha2UocS5zcGVjKX1pZigic2VsZWN0Ij09PWUpe2Y9Zi5ldnREYXRhO2w9cS5zcGVjLmd1aWRlcztFPXEuc3BlYy5sYXllcnM7Qz1bXTtzPTA7Zm9yKHQ9RS5sZW5ndGg7czx0O3MrKyl7Zz1FW3NdO3U9MDtmb3Ioej1iLmxlbmd0aDt1PHo7dSsrKWs9Ylt1XSxoW2tdJiZudWxsIT1nW2tdJiYoZT1nW2tdWyJ2YXIiXSwoIm51bSI9PT0oQT1xLmF4ZXMuZG9tYWluc1trXS50eXBlKXx8CiJkYXRlIj09PUEpJiZmW2VdLmxlLWZbZV0uZ2U+Y1siY29uc3QiXS5lcHNpbG9uJiYobnVsbD09bFtrXSYmKGxba109e21pbjpudWxsLG1heDpudWxsfSksRz1bZltlXS5nZSxmW2VdLmxlXSxsW2tdLm1pbj1HWzBdLGxba10ubWF4PUdbMV0pLCJjYXQiPT09cS5heGVzLmRvbWFpbnNba10udHlwZSYmMCE9PWZbZV1bImluIl0ubGVuZ3RoJiYobnVsbD09bFtrXSYmKGxba109e2xldmVsczpudWxsfSksbFtrXS5sZXZlbHM9ZltlXVsiaW4iXSkpO3EuaGFuZGxlcnM9Xy5tYXAocS5oYW5kbGVycyxuKTtDLnB1c2gocS5tYWtlKHEuc3BlYykpfXJldHVybiBDfX19fX0pLmNhbGwodGhpcyk7KGZ1bmN0aW9uKCl7dmFyIGYscz1bXS5pbmRleE9mfHxmdW5jdGlvbihjKXtmb3IodmFyIGI9MCxhPXRoaXMubGVuZ3RoO2I8YTtiKyspaWYoYiBpbiB0aGlzJiZ0aGlzW2JdPT09YylyZXR1cm4gYjtyZXR1cm4tMX07Yy5mYWNldD17fTtjLmZhY2V0Lm1ha2U9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGZ9OwpmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpe3RoaXMudHlwZT0ibm9uZSI7dGhpcy5tYXBwaW5nPXt9O3RoaXMuc3BlY2dyb3Vwcz1bXTt0aGlzLmdyb3Vwcz1bXTt0aGlzLnBhbmVzPXt9O3RoaXMuZGVsZXRlZFBhbmVzPVtdfWYucHJvdG90eXBlLm1ha2U9ZnVuY3Rpb24oYil7dmFyIGEsYzt0aGlzLnNwZWM9YjtiPXRoaXMuX2dldE1hcHBpbmdzKHRoaXMuc3BlYy5mYWNldCk7dGhpcy50eXBlPWIudHlwZTt0aGlzLm1hcHBpbmc9Yz1iLm1hcHBpbmc7dGhpcy5ncm91cHM9Xy52YWx1ZXModGhpcy5tYXBwaW5nKTt0aGlzLnNwZWNncm91cHM9e307Zm9yKGEgaW4gYyliPWNbYV0sdGhpcy5zcGVjLmZhY2V0W2FdJiYodGhpcy5zcGVjZ3JvdXBzW2JdPXRoaXMuc3BlYy5mYWNldFthXSk7dGhpcy5zcGVjLmZhY2V0LmZvcm1hdHRlciYmKHRoaXMuZm9ybWF0dGVyPXRoaXMuc3BlYy5mYWNldC5mb3JtYXR0ZXIpO3RoaXMuc3R5bGU9e307dGhpcy5zcGVjLmZhY2V0LnNpemUmJih0aGlzLnN0eWxlLnNpemU9CnRoaXMuc3BlYy5mYWNldC5zaXplKTtpZih0aGlzLnNwZWMuZmFjZXQuY29sb3IpcmV0dXJuIHRoaXMuc3R5bGUuY29sb3I9dGhpcy5zcGVjLmZhY2V0LmNvbG9yfTtmLnByb3RvdHlwZS5jYWxjdWxhdGU9ZnVuY3Rpb24oYixhKXt2YXIgZCxlLGYsaCxwO2Q9dGhpcy5fbWFrZUluZGljZXMoYix0aGlzLnNwZWNncm91cHMpO3RoaXMudmFsdWVzPWQudmFsdWVzO3RoaXMuaW5kaWNlcz1kLmluZGljZXM7Im5vbmUiPT09dGhpcy50eXBlP3RoaXMucm93cz10aGlzLmNvbHM9MToodGhpcy5jb2xzPXRoaXMuc3BlYy5mYWNldC5jb2xzLHRoaXMucm93cz10aGlzLnNwZWMuZmFjZXQucm93cywid3JhcCI9PT10aGlzLnR5cGU/KGQ9dGhpcy52YWx1ZXNbdGhpcy5tYXBwaW5nWyJ2YXIiXV0ubGVuZ3RoLHRoaXMuY29sc3x8dGhpcy5yb3dzfHwodGhpcy5jb2xzPU1hdGgubWluKDMsZCkpLHRoaXMuY29scz90aGlzLnJvd3M9TWF0aC5jZWlsKGQvdGhpcy5jb2xzKTp0aGlzLnJvd3MmJih0aGlzLmNvbHM9Ck1hdGguY2VpbChkL3RoaXMucm93cykpKToodGhpcy5yb3dzPXRoaXMubWFwcGluZy55P3RoaXMudmFsdWVzW3RoaXMubWFwcGluZy55XS5sZW5ndGg6MSx0aGlzLmNvbHM9dGhpcy5tYXBwaW5nLng/dGhpcy52YWx1ZXNbdGhpcy5tYXBwaW5nLnhdLmxlbmd0aDoxKSk7dGhpcy5kYXRhcz10aGlzLl9ncm91cERhdGEoYix0aGlzLmluZGljZXMpO2Q9Yy5jb21wYXJlKF8ua2V5cyh0aGlzLnBhbmVzKSxfLmtleXModGhpcy5pbmRpY2VzKSk7ZT1kLmRlbGV0ZWQ7ZD1kLmFkZGVkO2g9MDtmb3IocD1lLmxlbmd0aDtoPHA7aCsrKWY9ZVtoXSx0aGlzLmRlbGV0ZWRQYW5lcy5wdXNoKHRoaXMucGFuZXNbZl0pLGRlbGV0ZSB0aGlzLnBhbmVzW2ZdO2g9MDtmb3IocD1kLmxlbmd0aDtoPHA7aCsrKWY9ZFtoXSxlPXRoaXMuZm9ybWF0dGVyP3RoaXMuZm9ybWF0dGVyKHRoaXMuaW5kaWNlc1tmXSk6Zix0aGlzLnBhbmVzW2ZdPWMucGFuZS5tYWtlKHRoaXMuaW5kaWNlc1tmXSxfLmV4dGVuZCh7dGl0bGU6ZX0sCnRoaXMuc3R5bGUpKTtkPXRoaXMuaW5kaWNlcztlPVtdO2ZvcihmIGluIGQpZS5wdXNoKHRoaXMucGFuZXNbZl0ubWFrZSh0aGlzLnNwZWMsdGhpcy5kYXRhc1tmXSxhKSk7cmV0dXJuIGV9O2YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihiLGEsYyl7dmFyIGUsZixoLHAsbSxyO2lmKDA8dGhpcy5kZWxldGVkUGFuZXMubGVuZ3RoKXtlPWIoe30sITEsITEpO3I9dGhpcy5kZWxldGVkUGFuZXM7aD0wO2ZvcihtPXIubGVuZ3RoO2g8bTtoKyspcD1yW2hdLHAuZGlzcG9zZShlKTt0aGlzLmRlbGV0ZWRQYW5lcz1bXX1tPXRoaXMucGFuZXM7cj1bXTtmb3IoZiBpbiBtKXA9bVtmXSxoPXRoaXMuZ2V0T2Zmc2V0KGEsZiksZT1jLmNsaXBwaW5nKGgpLHIucHVzaChwLnJlbmRlcihiLGgsZSxhKSk7cmV0dXJuIHJ9O2YucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oYil7dmFyIGEsYyxlLGY7ZT10aGlzLnBhbmVzO2ZvcihhIGluIGUpYz1lW2FdLHRoaXMuZGVsZXRlZFBhbmVzLnB1c2goYyksCmRlbGV0ZSB0aGlzLnBhbmVzW2FdO2lmKGIpe2Y9dGhpcy5kZWxldGVkUGFuZXM7YT0wO2ZvcihlPWYubGVuZ3RoO2E8ZTthKyspYz1mW2FdLGMuZGlzcG9zZShiKTtyZXR1cm4gdGhpcy5kZWxldGVkUGFuZXM9W119fTtmLnByb3RvdHlwZS5nZXRHcmlkPWZ1bmN0aW9uKCl7cmV0dXJue2NvbHM6dGhpcy5jb2xzLHJvd3M6dGhpcy5yb3dzfX07Zi5wcm90b3R5cGUuZ2V0T2Zmc2V0PWZ1bmN0aW9uKGIsYSl7dmFyIGM7Yz10aGlzLl9nZXRSb3dDb2woYSk7cmV0dXJue3g6Yi5wYWRkaW5nTGVmdCtiLmd1aWRlTGVmdCsoYi5lYWNoV2lkdGgrYi5ob3Jpem9udGFsU3BhY2luZykqYy5jb2wseTpiLnBhZGRpbmdUb3ArYi5ndWlkZVRvcCsoYi5lYWNoSGVpZ2h0K2IudmVydGljYWxTcGFjaW5nKSpjLnJvdytiLnZlcnRpY2FsU3BhY2luZ319O2YucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24oYil7dmFyIGEsYyxlLGYsaCxwLG0scixxPXRoaXM7aWYoIm5vbmUiPT09dGhpcy50eXBlKXJldHVybiBmdW5jdGlvbigpe3JldHVybiEwfTsKImdyaWQiPT09dGhpcy50eXBlPyhyPWZ1bmN0aW9uKGEpe3JldHVybiBfLmluZGV4T2YocS52YWx1ZXNbcS5tYXBwaW5nLnldLHEuaW5kaWNlc1thXVtxLm1hcHBpbmcueV0pfSxhPWZ1bmN0aW9uKGEpe3JldHVybiBfLmluZGV4T2YocS52YWx1ZXNbcS5tYXBwaW5nLnhdLHEuaW5kaWNlc1thXVtxLm1hcHBpbmcueF0pfSk6KGE9ZnVuY3Rpb24oYSl7cmV0dXJuIF8uaW5kZXhPZihxLnZhbHVlc1txLm1hcHBpbmdbInZhciJdXSxxLmluZGljZXNbYV1bcS5tYXBwaW5nWyJ2YXIiXV0pJXEuY29sc30scj1mdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5mbG9vcihfLmluZGV4T2YocS52YWx1ZXNbcS5tYXBwaW5nWyJ2YXIiXV0scS5pbmRpY2VzW2FdW3EubWFwcGluZ1sidmFyIl1dKS9xLmNvbHMpfSk7aWYoIm5vbmUiPT09YilyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMX07aWYoIm91dCI9PT1iKXJldHVybiBmdW5jdGlvbigpe3JldHVybiEwfTtlPSJ0b3AiPT09Ynx8ImJvdHRvbSI9PT1iPwphOnI7bT0idG9wIj09PWI/cjoiYm90dG9tIj09PWI/ZnVuY3Rpb24oYSl7cmV0dXJuLXIoYSl9OiJsZWZ0Ij09PWI/YToicmlnaHQiPT09Yj9mdW5jdGlvbihiKXtyZXR1cm4tYShiKX06dm9pZCAwO2I9e307Zm9yKGYgaW4gdGhpcy5pbmRpY2VzKWlmKHA9ZShmKSxoPW0oZiksIWJbcF18fGg8YltwXS52KWJbcF09e3Y6aCxrOmZ9O2M9Xy5wbHVjayhiLCJrIik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiAwPD1zLmNhbGwoYyxhKX19O2YucHJvdG90eXBlLmdldEV2dERhdGE9ZnVuY3Rpb24oYixhKXt2YXIgYyxlLGYsaDtmPXt9O2g9dGhpcy5tYXBwaW5nO2ZvcihjIGluIGgpZT1oW2NdLGZbZV09IngiPT09Y3x8InkiPT09Yz97ImluIjp0aGlzLnZhbHVlc1tlXVtiXX06eyJpbiI6dGhpcy52YWx1ZXNbZV1bdGhpcy5yb3dzKmErYl19O3JldHVybiBmfTtmLnByb3RvdHlwZS5nZXRGYWNldEluZm89ZnVuY3Rpb24oYixhLGQsZSl7dmFyIGYsaCxwO2lmKGUpe2lmKG51bGw9PWUuY29sfHwKbnVsbD09ZS5yb3cpdGhyb3cgYy5lcnJvci5pbXBsKCJQcmVzZXQgcm93cyAmIGNvbHVtbnMgYXJlIG5vdCBwcmVzZW50LiIpO2Y9ZS5jb2w7cD1lLnJvd31lbHNlIGY9KGEtYi5wYWRkaW5nTGVmdC1iLmd1aWRlTGVmdCkvKGIuZWFjaFdpZHRoK2IuaG9yaXpvbnRhbFNwYWNpbmcpLGY9TWF0aC5mbG9vcihmKSxwPShkLWIucGFkZGluZ1RvcC1iLmd1aWRlVG9wLWIudmVydGljYWxTcGFjaW5nKS8oYi5lYWNoSGVpZ2h0K2IudmVydGljYWxTcGFjaW5nKSxwPU1hdGguZmxvb3IocCk7aWYoMD5mfHxmPj10aGlzLmNvbHN8fDA+cHx8cD49dGhpcy5yb3dzKXJldHVybiBudWxsO2g9e3g6Yi5wYWRkaW5nTGVmdCtiLmd1aWRlTGVmdCsoYi5lYWNoV2lkdGgrYi5ob3Jpem9udGFsU3BhY2luZykqZix5OmIucGFkZGluZ1RvcCtiLmd1aWRlVG9wKyhiLmVhY2hIZWlnaHQrYi52ZXJ0aWNhbFNwYWNpbmcpKnArYi52ZXJ0aWNhbFNwYWNpbmd9O2E9e3g6YS1oLngseTpkLWgueX07aWYoIWUmJihhLng+CmIuZWFjaFdpZHRofHxhLnk+Yi5lYWNoSGVpZ2h0KSlyZXR1cm4gbnVsbDthLng9TWF0aC5tYXgoTWF0aC5taW4oYS54LGIuZWFjaFdpZHRoKSwwKTthLnk9TWF0aC5tYXgoTWF0aC5taW4oYS55LGIuZWFjaEhlaWdodCksMCk7cmV0dXJue3JvdzpwLGNvbDpmLG9mZnNldDpoLGFkanVzdGVkOmEsZXZ0RGF0YTp0aGlzLmdldEV2dERhdGEoZixwKX19O2YucHJvdG90eXBlLl9nZXRNYXBwaW5ncz1mdW5jdGlvbihiKXt2YXIgYTthPXt0eXBlOiJub25lIixtYXBwaW5nOnt9fTtpZihfLmlzT2JqZWN0KGIpKWlmKCJ3cmFwIj09PWIudHlwZSl7YS50eXBlPSJ3cmFwIjtpZighYlsidmFyIl0pdGhyb3cgYy5lcnJvci5kZWZuKCJZb3UgZGlkbid0IHNwZWNpZnkgYSB2YXJpYWJsZSB0byBmYWNldCBvbi4iKTtiWyJ2YXIiXSYmKGEubWFwcGluZ1sidmFyIl09YlsidmFyIl1bInZhciJdKX1lbHNlIGlmKCJncmlkIj09PWIudHlwZSl7YS50eXBlPSJncmlkIjtpZighYi54JiZiLnkpdGhyb3cgYy5lcnJvci5kZWZuKCJZb3UgZGlkbid0IHNwZWNpZnkgYSB2YXJpYWJsZSB0byBmYWNldCBvbi4iKTsKYi54JiYoYS5tYXBwaW5nLng9Yi54WyJ2YXIiXSk7Yi55JiYoYS5tYXBwaW5nLnk9Yi55WyJ2YXIiXSl9cmV0dXJuIGF9O2YucHJvdG90eXBlLl9tYWtlSW5kaWNlcz1mdW5jdGlvbihiLGEpe3ZhciBkLGUsZixoLHAsbSxyLHE7cj17fTtmb3IoZCBpbiBhKWlmKGg9YVtkXSxoLmxldmVscylyW2hbInZhciJdXT1oLmxldmVscztlbHNle209W107Zm9yKGYgaW4gYil7ZT1iW2ZdO2lmKHA9ZS5tZXRhRGF0YVtoWyJ2YXIiXV0pIXB8fCJudW0iIT09KHE9cC50eXBlKSYmImRhdGUiIT09cXx8Yy50eXBlLmNvbXBhcmUocC50eXBlKTttPV8udW5pcShfLnVuaW9uKG0sXy5wbHVjayhlLnN0YXREYXRhLGhbInZhciJdKSkpfXJbaFsidmFyIl1dPW19ZD1jLmNyb3NzKHIpO2U9e307Zj1jLnN0cmluZ2lmeShfLnBsdWNrKGEsInZhciIpKTtwPTA7Zm9yKG09ZC5sZW5ndGg7cDxtO3ArKyloPWRbcF0sZVtmKGgpXT1oO3JldHVybnt2YWx1ZXM6cixpbmRpY2VzOmV9fTtmLnByb3RvdHlwZS5fZ3JvdXBEYXRhPQpmdW5jdGlvbihiLGEpe3ZhciBkLGUsZixoLHAsbSxyO2U9Yy5ncm91cFByb2Nlc3NlZERhdGEoYix0aGlzLmdyb3Vwcyk7ZD17fTtyPXRoaXMuaW5kaWNlcztmb3IoZiBpbiByKXtoPXJbZl07Zm9yKHA9ZTshMD09PXAuZ3JvdXBlZDspbT1oW3Aua2V5XSxwPXAudmFsdWVzW21dO2RbZl09cH1yZXR1cm4gZH07Zi5wcm90b3R5cGUuX2dldFJvd0NvbD1mdW5jdGlvbihiKXt2YXIgYTthPXtyb3c6MCxjb2w6MH07IndyYXAiPT09dGhpcy50eXBlPyhiPXRoaXMuaW5kaWNlc1tiXVt0aGlzLm1hcHBpbmdbInZhciJdXSxiPV8uaW5kZXhPZih0aGlzLnZhbHVlc1t0aGlzLm1hcHBpbmdbInZhciJdXSxiKSxhLmNvbD1iJXRoaXMuY29scyxhLnJvdz1NYXRoLmZsb29yKGIvdGhpcy5jb2xzKSk6ImdyaWQiPT09dGhpcy50eXBlJiYoYS5yb3c9Xy5pbmRleE9mKHRoaXMudmFsdWVzW3RoaXMubWFwcGluZy55XSx0aGlzLmluZGljZXNbYl1bdGhpcy5tYXBwaW5nLnldKSxhLmNvbD1fLmluZGV4T2YodGhpcy52YWx1ZXNbdGhpcy5tYXBwaW5nLnhdLAp0aGlzLmluZGljZXNbYl1bdGhpcy5tYXBwaW5nLnhdKSk7cmV0dXJuIGF9O3JldHVybiBmfSgpO2MuZ3JvdXBQcm9jZXNzZWREYXRhPWZ1bmN0aW9uKGYsYil7dmFyIGEsZCxlLGssbixwLG0scixxO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gZjthPWIuc3BsaWNlKDAsMSlbMF07cD1bXTtmb3IoZSBpbiBmKWQ9ZltlXSxhIGluIGQubWV0YURhdGEmJihwPV8udW5pb24ocCxfLnVuaXEoXy5wbHVjayhkLnN0YXREYXRhLGEpKSkpO249e2dyb3VwZWQ6ITAsa2V5OmEsdmFsdWVzOnt9fTtyPTA7Zm9yKHE9cC5sZW5ndGg7cjxxO3IrKyl7bT1wW3JdO2s9e307Zm9yKGUgaW4gZilkPWZbZV0sa1tlXT17bWV0YURhdGE6ZC5tZXRhRGF0YX0sa1tlXS5zdGF0RGF0YT1hIGluIGQubWV0YURhdGE/Yy5maWx0ZXIoZC5zdGF0RGF0YSxhLG0pOl8uY2xvbmUoZC5zdGF0RGF0YSk7bi52YWx1ZXNbbV09Yy5ncm91cFByb2Nlc3NlZERhdGEoayxfLmNsb25lKGIpKX1yZXR1cm4gbn19KS5jYWxsKHRoaXMpOwooZnVuY3Rpb24oKXt2YXIgZixzPXt9Lmhhc093blByb3BlcnR5LGg9ZnVuY3Rpb24oYixhKXtmdW5jdGlvbiBjKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ifWZvcih2YXIgZSBpbiBhKXMuY2FsbChhLGUpJiYoYltlXT1hW2VdKTtjLnByb3RvdHlwZT1hLnByb3RvdHlwZTtiLnByb3RvdHlwZT1uZXcgYztiLl9fc3VwZXJfXz1hLnByb3RvdHlwZTtyZXR1cm4gYn07Zj1mdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIsYyl7YS5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmV2ZW50TmFtZT0idGl0bGUtY2xpY2siO3RoaXMuZGV0YWlsPXt0eXBlOmMsZGF0YTpifX1oKGEsYik7cmV0dXJuIGF9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe3RoaXMuZXZlbnROYW1lPSJwb2x5anNFdmVudCI7dGhpcy5jYW5jZWxhYmxlPXRoaXMuYnViYmxlcz0hMDt0aGlzLmRldGFpbD17dHlwZTpudWxsLGRhdGE6bnVsbH19Yi5wcm90b3R5cGUuZGlzcGF0Y2g9ZnVuY3Rpb24oYSl7dmFyIGI7Yj0KbmV3IEN1c3RvbUV2ZW50KHRoaXMuZXZlbnROYW1lLHtkZXRhaWw6dGhpcy5kZXRhaWx9KTtpZihudWxsIT1hKXJldHVybiBhLmRpc3BhdGNoRXZlbnQoYil9O3JldHVybiBifSgpKTtjLmV2ZW50PXt9O2MuZXZlbnQubWFrZT1mdW5jdGlvbihiLGEpe2lmKCJndWlkZS10aXRsZSI9PT1ifHwiZ3VpZGUtdGl0bGVIIj09PWJ8fCJndWlkZS10aXRsZVYiPT09YilyZXR1cm4gbmV3IGYoYSxiKTt0aHJvdyBjLmVycm9yLmRlZm4oIk5vIHN1Y2ggZXZlbnQgIitiKyIuIik7fX0pLmNhbGwodGhpcyk7KGZ1bmN0aW9uKCl7dmFyIGYscz1mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiLmFwcGx5KGEsYXJndW1lbnRzKX19LGg9W10uaW5kZXhPZnx8ZnVuY3Rpb24oYil7Zm9yKHZhciBhPTAsYz10aGlzLmxlbmd0aDthPGM7YSsrKWlmKGEgaW4gdGhpcyYmdGhpc1thXT09PWIpcmV0dXJuIGE7cmV0dXJuLTF9O2Y9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGEsYixlKXtudWxsPT0KYiYmKGI9bnVsbCk7bnVsbD09ZSYmKGU9bnVsbCk7dGhpcy5oYW5kbGVFdmVudD1zKHRoaXMuaGFuZGxlRXZlbnQsdGhpcyk7dGhpcy5yZW5kZXI9cyh0aGlzLnJlbmRlcix0aGlzKTt0aGlzLm1lcmdlRG9tYWlucz1zKHRoaXMubWVyZ2VEb21haW5zLHRoaXMpO3RoaXMubWVyZ2U9cyh0aGlzLm1lcmdlLHRoaXMpO3RoaXMubWF5YmVEaXNwb3NlPXModGhpcy5tYXliZURpc3Bvc2UsdGhpcyk7aWYobnVsbD09YSl0aHJvdyBjLmVycm9yLmRlZm4oIk5vIGdyYXBoIHNwZWNpZmljYXRpb24gaXMgcGFzc2VkIGluISIpO3RoaXMuaGFuZGxlcnM9W107dGhpcy5jb29yZD10aGlzLnBhcGVyPXRoaXMuZGltcz10aGlzLmxlZ2VuZHM9dGhpcy5heGVzPXRoaXMuc2NhbGVTZXQ9bnVsbDt0aGlzLmZhY2V0PWMuZmFjZXQubWFrZSgpO3RoaXMuZGF0YVN1YnNjcmliZWQ9W107dGhpcy5jYWxsYmFjaz1iO3RoaXMucHJlcGFyZT1lO3RoaXMubWFrZShhKTt0aGlzLmFkZEhhbmRsZXIoYy5oYW5kbGVyLnRvb2x0aXAoKSl9CmIucHJvdG90eXBlLm1heWJlRGlzcG9zZT1mdW5jdGlvbihhKXt2YXIgYjtiPWMucmVuZGVyKHRoaXMuaGFuZGxlRXZlbnQsdGhpcy5wYXBlcix0aGlzLnNjYWxlU2V0LnNjYWxlcyx0aGlzLmNvb3JkKTtiPWIoKTtpZih0aGlzLmNvb3JkJiYhXy5pc0VxdWFsKHRoaXMuY29vcmQuc3BlYyxhLmNvb3JkKSlyZXR1cm4gdGhpcy5zY2FsZVNldCYmKHRoaXMuc2NhbGVTZXQuZGlzcG9zZUd1aWRlcyhiKSx0aGlzLnNjYWxlU2V0PW51bGwpLHRoaXMuY29vcmQ9bnVsbH07Yi5wcm90b3R5cGUubWFrZT1mdW5jdGlvbihhKXt2YXIgYixlLGYsaCxwLG0scixxLGwsZz10aGlzO251bGwhPWE/KGE9Yy5zcGVjLnRvU3RyaWN0TW9kZShhKSxjLnNwZWMuY2hlY2soYSksdGhpcy5zcGVjPWEpOmE9dGhpcy5zcGVjO3RoaXMuc2NhbGVTZXQmJnRoaXMubWF5YmVEaXNwb3NlKGEpO251bGw9PXRoaXMuY29vcmQmJih0aGlzLmNvb3JkPWMuY29vcmQubWFrZSh0aGlzLnNwZWMuY29vcmQpKTt0aGlzLmZhY2V0Lm1ha2UoYSk7CmU9dGhpcy5oYW5kbGVFdmVudCgiZGF0YSIpO2Y9ZnVuY3Rpb24oKXt2YXIgYixjLGQsZTtkPWEubGF5ZXJzO2U9W107aD1iPTA7Zm9yKGM9ZC5sZW5ndGg7YjxjO2g9KytiKXA9ZFtoXSxlLnB1c2gocC5kYXRhKTtyZXR1cm4gZX0oKTtsPV8uZGlmZmVyZW5jZShmLHRoaXMuZGF0YVN1YnNjcmliZWQpO3I9MDtmb3IocT1sLmxlbmd0aDtyPHE7cisrKWI9bFtyXSxiLnN1YnNjcmliZShlKTt0aGlzLmRhdGFTdWJzY3JpYmVkPWY7bT1fLmFmdGVyKGEubGF5ZXJzLmxlbmd0aCx0aGlzLm1lcmdlKTt0aGlzLmRhdGFwcm9jZXNzPXt9O3RoaXMucHJvY2Vzc2VkRGF0YT17fTtyZXR1cm4gXy5lYWNoKGEubGF5ZXJzLGZ1bmN0aW9uKGIsZCl7dmFyIGU7YT1nLnNwZWMubGF5ZXJzW2RdO2U9Xy52YWx1ZXMoZy5mYWNldC5zcGVjZ3JvdXBzKTtnLmRhdGFwcm9jZXNzW2RdPW5ldyBjLkRhdGFQcm9jZXNzKGEsZSxhLnN0cmljdCk7cmV0dXJuIGcuZGF0YXByb2Nlc3NbZF0ubWFrZShhLGUsZnVuY3Rpb24oYSwKYixlKXtpZihudWxsIT1hKWlmKGNvbnNvbGUuZXJyb3IoYSksbnVsbCE9Zy5jYWxsYmFjaylnLmNhbGxiYWNrKGEsbnVsbCk7ZWxzZSB0aHJvdyBjLmVycm9yLmRlZm4oIkVycm9yIHByb2Nlc3NpbmcgZGF0YSEiKTtnLnByb2Nlc3NlZERhdGFbZF09e3N0YXREYXRhOmIsbWV0YURhdGE6ZX07cmV0dXJuIG0oKX0pfSl9O2IucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLmxheWVycz1fLm1hcCh0aGlzLnNwZWMubGF5ZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBjLmxheWVyLm1ha2UoYixhLnNwZWMuc3RyaWN0LGEuc3BlYy5ndWlkZXMpfSk7dGhpcy5mYWNldC5jYWxjdWxhdGUodGhpcy5wcm9jZXNzZWREYXRhLHRoaXMubGF5ZXJzKTt0aGlzLm1lcmdlRG9tYWlucygpO3JldHVybiB0aGlzLnJlbmRlcigpfTtiLnByb3RvdHlwZS5tZXJnZURvbWFpbnM9ZnVuY3Rpb24oKXt2YXIgYSxiLGU7YT1fLm1hcCh0aGlzLmZhY2V0LnBhbmVzLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvbWFpbnN9KTsKYT1jLmRvbWFpbi5tZXJnZShhKTt0aGlzLnNjYWxlU2V0fHwoYj1jLmRpbS5ndWVzcyh0aGlzLnNwZWMsdGhpcy5mYWNldC5nZXRHcmlkKCkpLHRoaXMuY29vcmQubWFrZShiKSxlPXRoaXMuY29vcmQucmFuZ2VzKCksdGhpcy5zY2FsZVNldD1jLnNjYWxlc2V0KGUsdGhpcy5jb29yZCkpO3RoaXMuc2NhbGVTZXQubWFrZSh0aGlzLnNwZWMuZ3VpZGVzLGEsdGhpcy5sYXllcnMpO3RoaXMuZGltcz10aGlzLl9tYWtlRGltZW5zaW9ucyh0aGlzLnNwZWMsdGhpcy5zY2FsZVNldCx0aGlzLmZhY2V0LGIpO3RoaXMuY29vcmQubWFrZSh0aGlzLmRpbXMpO3RoaXMucmFuZ2VzPXRoaXMuY29vcmQucmFuZ2VzKCk7cmV0dXJuIHRoaXMuc2NhbGVTZXQuc2V0UmFuZ2VzKHRoaXMucmFuZ2VzKX07Yi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGEsYjtpZihudWxsPT10aGlzLnNwZWMucmVuZGVyfHwhMSE9PXRoaXMuc3BlYy5yZW5kZXIpaWYoYT10aGlzLnNjYWxlU2V0LnNjYWxlcyx0aGlzLmNvb3JkLnNldFNjYWxlcyhhKSwKdGhpcy5zY2FsZVNldC5jb29yZD10aGlzLmNvb3JkLGI9dGhpcy5zY2FsZVNldC5tYWtlR3VpZGVzKHRoaXMuc3BlYyx0aGlzLmRpbXMpLHRoaXMuYXhlcz1iLmF4ZXMsdGhpcy50aXRsZXM9Yi50aXRsZXMsdGhpcy5sZWdlbmRzPWIubGVnZW5kcyxudWxsIT10aGlzLnByZXBhcmUmJnRoaXMucHJlcGFyZSh0aGlzKSx0aGlzLmRvbT10aGlzLnNwZWMuZG9tLG51bGw9PXRoaXMucGFwZXImJih0aGlzLnBhcGVyPXRoaXMuX21ha2VQYXBlcih0aGlzLmRvbSx0aGlzLmRpbXMud2lkdGgsdGhpcy5kaW1zLmhlaWdodCx0aGlzKSksYT1jLnJlbmRlcih0aGlzLmhhbmRsZUV2ZW50LHRoaXMucGFwZXIsYSx0aGlzLmNvb3JkKSx0aGlzLmZhY2V0LnJlbmRlcihhLHRoaXMuZGltcyx0aGlzLmNvb3JkKSx0aGlzLnNjYWxlU2V0LnJlbmRlckd1aWRlcyh0aGlzLmRpbXMsYSx0aGlzLmZhY2V0KSxudWxsIT10aGlzLmNhbGxiYWNrKXJldHVybiB0aGlzLmNhbGxiYWNrKG51bGwsdGhpcyl9O2IucHJvdG90eXBlLmFkZEhhbmRsZXI9CmZ1bmN0aW9uKGEpe2lmKDA+aC5jYWxsKHRoaXMuaGFuZGxlcnMsYSkpcmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaChhKX07Yi5wcm90b3R5cGUucmVtb3ZlSGFuZGxlcj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5zcGxpY2UoXy5pbmRleE9mKHRoaXMuaGFuZGxlcnMsYSksMSl9O2IucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiO2I9dGhpcztyZXR1cm4gXy50aHJvdHRsZShmdW5jdGlvbihlKXt2YXIgZixoLHAsbSxyO2lmKCJ0b3VjaHN0YXJ0Ij09PWF8fCJ0b3VjaG1vdmUiPT09YXx8InRvdWNoZW5kIj09PWF8fCJ0b3VjaGNhbmNlbCI9PT1hKWMudG91Y2goYSx0aGlzLGUsYik7ZWxzZSBpZigic2VsZWN0Ij09PWEpe2g9ZS5zdGFydDtmPWUuZW5kO2g9Yi5mYWNldC5nZXRGYWNldEluZm8oYi5kaW1zLGgueCxoLnkpO2lmKCFoKXJldHVybjttPWguY29sO3I9aC5yb3c7cD1oLmFkanVzdGVkO2g9Xy5jbG9uZShwKTtwPWIuZmFjZXQuZ2V0RmFjZXRJbmZvKGIuZGltcywKZi54LGYueSx7Y29sOm0scm93OnJ9KS5hZGp1c3RlZDtmPV8uY2xvbmUocCk7dGhpcy5ldnREYXRhPSJjYXJ0ZXNpYW4iPT09Yi5jb29yZC50eXBlP2Iuc2NhbGVTZXQuZnJvbVBpeGVscyhoLGYpOm51bGx9ZWxzZSBpZigiZGF0YSI9PT1hKXRoaXMuZXZ0RGF0YT17fTtlbHNlIGlmKCJyZXNldCI9PT1hfHwiY2xpY2siPT09YXx8Im1vdmVyIj09PWF8fCJtb3V0Ij09PWF8fCJndWlkZS1jbGljayI9PT1hKXRoaXMudG9vbHRpcD10aGlzLmRhdGEoInQiKSx0aGlzLmV2dERhdGE9dGhpcy5kYXRhKCJlIik7ZWxzZSBpZigiZ3VpZGUtdGl0bGUiPT09YXx8Imd1aWRlLXRpdGxlSCI9PT1hfHwiZ3VpZGUtdGl0bGVWIj09PWEpdGhpcy50b29sdGlwPXRoaXMuZGF0YSgidCIpLHRoaXMuZXZ0RGF0YT10aGlzLmRhdGEoImUiKSxlPWMuZXZlbnQubWFrZShhLHRoaXMpLGUuZGlzcGF0Y2goYi5kb20pO3I9Yi5oYW5kbGVycztwPVtdO2g9MDtmb3IobT1yLmxlbmd0aDtoPG07aCsrKWY9cltoXSxfLmlzRnVuY3Rpb24oZik/CnAucHVzaChmKGEsdGhpcyxlLGIpKTpwLnB1c2goZi5oYW5kbGUoYSx0aGlzLGUsYikpO3JldHVybiBwfSwzMDApfTtiLnByb3RvdHlwZS5fbWFrZVNjYWxlU2V0PWZ1bmN0aW9uKGEsYixlKXthPXRoaXMuY29vcmQucmFuZ2VzKCk7cmV0dXJuIGMuc2NhbGVzZXQoYSx0aGlzLmNvb3JkKX07Yi5wcm90b3R5cGUuX21ha2VEaW1lbnNpb25zPWZ1bmN0aW9uKGEsYixlLGYpe2IubWFrZUd1aWRlcyhhLGYpO3JldHVybiBjLmRpbS5tYWtlKGEsYixlLmdldEdyaWQoKSl9O2IucHJvdG90eXBlLl9tYWtlUGFwZXI9ZnVuY3Rpb24oYSxiLGUsZil7cmV0dXJuIGMucGFwZXIoYSxiLGUsZil9O3JldHVybiBifSgpO2MuY2hhcnQ9ZnVuY3Rpb24oYixhLGQpe3RyeXtyZXR1cm4gbmV3IGYoYixhLGQpfWNhdGNoKGUpe2lmKG51bGwhPWEpcmV0dXJuIGEoZSxudWxsKTt0aHJvdyBjLmVycm9yLmRlZm4oIkJhZCBzcGVjaWZpY2F0aW9uLiIpO319fSkuY2FsbCh0aGlzKX1yZXR1cm57ZGF0YTpjLmRhdGEsCmNoYXJ0OmMuY2hhcnQsaGFuZGxlcjpjLmhhbmRsZXIsZGVidWc6Y319KHdpbmRvdy5wb2x5anMpOwo=' type='text/javascript'></script> <style> .rChart { display: block; margin-left: auto; margin-right: auto; width: 800px; height: 400px; } </style> </head> <body > <div id = 'inline' class = 'rChart polycharts'></div> <script type='text/javascript'> var chartParams = { "dom": "inline", "width": 800, "height": 400, "layers": [ { "x": "SepalWidth", "y": "SepalLength", "data": { "SepalLength": [ 5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5, 5, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5, 5.5, 4.9, 4.4, 5.1, 5, 4.5, 4.4, 5, 5.1, 4.8, 5.1, 4.6, 5.3, 5, 7, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5, 5.9, 6, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6, 5.7, 5.5, 5.5, 5.8, 6, 5.4, 6, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9 ], "SepalWidth": [ 3.5, 3, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, 3, 4, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2, 3, 2.2, 2.9, 2.9, 3.1, 3, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3, 2.8, 3, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3, 3.4, 3.1, 2.3, 3, 2.5, 2.6, 3, 2.6, 2.3, 2.7, 3, 2.9, 2.9, 2.5, 2.8, 3.3, 2.7, 3, 2.9, 3, 3, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3, 2.5, 2.8, 3.2, 3, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3, 2.8, 3, 2.8, 3.8, 2.8, 2.8, 2.6, 3, 3.4, 3.1, 3, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3, 2.5, 3, 3.4, 3 ], "PetalLength": [ 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1, 1.7, 1.9, 1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 4.7, 4.5, 4.9, 4, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4, 4.7, 3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4, 4.9, 4.7, 4.3, 4.4, 4.8, 5, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4, 4.4, 4.6, 4, 3.3, 4.2, 4.2, 4.2, 4.3, 3, 4.1, 6, 5.1, 5.9, 5.6, 5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 5.3, 5.5, 5, 5.1, 5.3, 5.5, 6.7, 6.9, 5, 5.7, 4.9, 6.7, 4.9, 5.7, 6, 4.8, 4.9, 5.6, 5.8, 6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 5.9, 5.7, 5.2, 5, 5.2, 5.4, 5.1 ], "PetalWidth": [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2, 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6, 1, 1.3, 1.4, 1, 1.5, 1, 1.4, 1.3, 1.4, 1.5, 1, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1, 1.1, 1, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 1.2, 1, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3, 2.5, 1.9, 2.1, 1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2, 1.9, 2.1, 2, 2.4, 2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2, 2, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 1.9, 2, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2, 2.3, 1.8 ], "Species": [ "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "setosa", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "versicolor", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica", "virginica" ] }, "facet": null, "type": "point", "color": "Species" } ], "facet": [], "guides": [], "coord": [], "id": "inline" } _.each(chartParams.layers, function(el){ el.data = polyjs.data(el.data) }) var graph_inline = polyjs.chart(chartParams); </script> <script></script> </body> </html>