serve-sim 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/serve-sim-bin +0 -0
- package/dist/middleware.js +9 -4
- package/dist/serve-sim.js +16 -11
- package/package.json +7 -1
- package/src/middleware.ts +133 -2
package/bin/serve-sim-bin
CHANGED
|
Binary file
|
package/dist/middleware.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{readdirSync as J,readFileSync as P}from"fs";import{spawn as j}from"child_process";import{tmpdir as k}from"os";import{join as H}from"path";var F=H(k(),"serve-sim");function Z(){let U;try{U=J(F).filter((G)=>G.startsWith("server-")&&G.endsWith(".json"))}catch{return[]}let B=[];for(let G of U)try{let z=JSON.parse(P(H(F,G),"utf-8"));try{process.kill(z.pid,0),B.push(z)}catch{}}catch{}return B}var $=null;function D(){if(!$)$=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYjAsUCxiNCxqNSxLMCx3NCxwNCx2NCxYNCxDMCxVMCxqNCxLNCxZNCxaNCxSNCx3MD17fSxTMD1bXSxSNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLEEwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gWDAoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gUTQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gWTAoWCxZLFope3ZhciBKLHEsSyxRPXt9O2ZvcihLIGluIFkpSz09ImtleSI/Sj1ZW0tdOks9PSJyZWYiP3E9WVtLXTpRW0tdPVlbS107aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoUS5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YjAuY2FsbChhcmd1bWVudHMsMik6WiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihLIGluIFguZGVmYXVsdFByb3BzKVFbS109PT12b2lkIDAmJihRW0tdPVguZGVmYXVsdFByb3BzW0tdKTtyZXR1cm4gRTAoWCxRLEoscSxudWxsKX1mdW5jdGlvbiBFMChYLFksWixKLHEpe3ZhciBLPXt0eXBlOlgscHJvcHM6WSxrZXk6WixyZWY6SixfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmUC52bm9kZSE9bnVsbCYmUC52bm9kZShLKSxLfWZ1bmN0aW9uIHgoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gZyhYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX1mdW5jdGlvbiBMMChYLFkpe2lmKFk9PW51bGwpcmV0dXJuIFguX18/TDAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgWjtZPFguX19rLmxlbmd0aDtZKyspaWYoKFo9WC5fX2tbWV0pIT1udWxsJiZaLl9fZSE9bnVsbClyZXR1cm4gWi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/TDAoWCk6bnVsbH1mdW5jdGlvbiB5NShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBZPVguX192LFo9WS5fX2UsSj1bXSxxPVtdLEs9WDAoe30sWSk7Sy5fX3Y9WS5fX3YrMSxQLnZub2RlJiZQLnZub2RlKEspLCQ0KFguX19QLEssWSxYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWS5fX3U/W1pdOm51bGwsSixaPT1udWxsP0wwKFkpOlosISEoMzImWS5fX3UpLHEpLEsuX192PVkuX192LEsuX18uX19rW0suX19pXT1LLGQ0KEosSyxxKSxZLl9fZT1ZLl9fPW51bGwsSy5fX2UhPVomJnk0KEspfX1mdW5jdGlvbiB5NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFkpe2lmKFkhPW51bGwmJlkuX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVkuX19lfSkseTQoWCl9ZnVuY3Rpb24gSjQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmSzAucHVzaChYKSYmIVQwLl9fcisrfHx3NCE9UC5kZWJvdW5jZVJlbmRlcmluZykmJigodzQ9UC5kZWJvdW5jZVJlbmRlcmluZyl8fHA0KShUMCl9ZnVuY3Rpb24gVDAoKXt0cnl7Zm9yKHZhciBYLFk9MTtLMC5sZW5ndGg7KUswLmxlbmd0aD5ZJiZLMC5zb3J0KHY0KSxYPUswLnNoaWZ0KCksWT1LMC5sZW5ndGgseTUoWCl9ZmluYWxseXtLMC5sZW5ndGg9VDAuX19yPTB9fWZ1bmN0aW9uIGc0KFgsWSxaLEoscSxLLFEseixHLEwsRCl7dmFyIFcsTyxVLGssXyxDLE0sRj1KJiZKLl9fa3x8UzAsRT1ZLmxlbmd0aDtmb3IoRz1nNShaLFksRixHLEUpLFc9MDtXPEU7VysrKShVPVouX19rW1ddKSE9bnVsbCYmKE89VS5fX2khPS0xJiZGW1UuX19pXXx8dzAsVS5fX2k9VyxDPSQ0KFgsVSxPLHEsSyxRLHosRyxMLEQpLGs9VS5fX2UsVS5yZWYmJk8ucmVmIT1VLnJlZiYmKE8ucmVmJiZXNChPLnJlZixudWxsLFUpLEQucHVzaChVLnJlZixVLl9fY3x8ayxVKSksXz09bnVsbCYmayE9bnVsbCYmKF89ayksKE09ISEoNCZVLl9fdSkpfHxPLl9faz09PVUuX19rPyhHPXg0KFUsRyxYLE0pLE0mJk8uX19lJiYoTy5fX2U9bnVsbCkpOnR5cGVvZiBVLnR5cGU9PSJmdW5jdGlvbiImJkMhPT12b2lkIDA/Rz1DOmsmJihHPWsubmV4dFNpYmxpbmcpLFUuX191Jj0tNyk7cmV0dXJuIFouX19lPV8sR31mdW5jdGlvbiBnNShYLFksWixKLHEpe3ZhciBLLFEseixHLEwsRD1aLmxlbmd0aCxXPUQsTz0wO2ZvcihYLl9faz1BcnJheShxKSxLPTA7SzxxO0srKykoUT1ZW0tdKSE9bnVsbCYmdHlwZW9mIFEhPSJib29sZWFuIiYmdHlwZW9mIFEhPSJmdW5jdGlvbiI/KHR5cGVvZiBRPT0ic3RyaW5nInx8dHlwZW9mIFE9PSJudW1iZXIifHx0eXBlb2YgUT09ImJpZ2ludCJ8fFEuY29uc3RydWN0b3I9PVN0cmluZz9RPVguX19rW0tdPUUwKG51bGwsUSxudWxsLG51bGwsbnVsbCk6QTAoUSk/UT1YLl9fa1tLXT1FMCh4LHtjaGlsZHJlbjpRfSxudWxsLG51bGwsbnVsbCk6US5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmUS5fX2I+MD9RPVguX19rW0tdPUUwKFEudHlwZSxRLnByb3BzLFEua2V5LFEucmVmP1EucmVmOm51bGwsUS5fX3YpOlguX19rW0tdPVEsRz1LK08sUS5fXz1YLFEuX19iPVguX19iKzEsej1udWxsLChMPVEuX19pPXg1KFEsWixHLFcpKSE9LTEmJihXLS0sKHo9WltMXSkmJih6Ll9fdXw9MikpLHo9PW51bGx8fHouX192PT1udWxsPyhMPT0tMSYmKHE+RD9PLS06cTxEJiZPKyspLHR5cGVvZiBRLnR5cGUhPSJmdW5jdGlvbiImJihRLl9fdXw9NCkpOkwhPUcmJihMPT1HLTE/Ty0tOkw9PUcrMT9PKys6KEw+Rz9PLS06TysrLFEuX191fD00KSkpOlguX19rW0tdPW51bGw7aWYoVylmb3IoSz0wO0s8RDtLKyspKHo9WltLXSkhPW51bGwmJigyJnouX191KT09MCYmKHouX19lPT1KJiYoSj1MMCh6KSksaDQoeix6KSk7cmV0dXJuIEp9ZnVuY3Rpb24geDQoWCxZLFosSil7dmFyIHEsSztpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxLPTA7cSYmSzxxLmxlbmd0aDtLKyspcVtLXSYmKHFbS10uX189WCxZPXg0KHFbS10sWSxaLEopKTtyZXR1cm4gWX1YLl9fZSE9WSYmKEomJihZJiZYLnR5cGUmJiFZLnBhcmVudE5vZGUmJihZPUwwKFgpKSxaLmluc2VydEJlZm9yZShYLl9fZSxZfHxudWxsKSksWT1YLl9fZSk7ZG8gWT1ZJiZZLm5leHRTaWJsaW5nO3doaWxlKFkhPW51bGwmJlkubm9kZVR5cGU9PTgpO3JldHVybiBZfWZ1bmN0aW9uIFowKFgsWSl7cmV0dXJuIFk9WXx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KEEwKFgpP1guc29tZShmdW5jdGlvbihaKXtaMChaLFkpfSk6WS5wdXNoKFgpKSxZfWZ1bmN0aW9uIHg1KFgsWSxaLEope3ZhciBxLEssUSx6PVgua2V5LEc9WC50eXBlLEw9WVtaXSxEPUwhPW51bGwmJigyJkwuX191KT09MDtpZihMPT09bnVsbCYmej09bnVsbHx8RCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gWjtpZihKPihEPzE6MCkpe2ZvcihxPVotMSxLPVorMTtxPj0wfHxLPFkubGVuZ3RoOylpZigoTD1ZW1E9cT49MD9xLS06SysrXSkhPW51bGwmJigyJkwuX191KT09MCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gUX1yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFksWil7WVswXT09Ii0iP1guc2V0UHJvcGVydHkoWSxaPT1udWxsPyIiOlopOlhbWV09Wj09bnVsbD8iIjp0eXBlb2YgWiE9Im51bWJlciJ8fFI1LnRlc3QoWSk/WjpaKyJweCJ9ZnVuY3Rpb24gTTAoWCxZLFosSixxKXt2YXIgSyxRO1g6aWYoWT09InN0eWxlIilpZih0eXBlb2YgWj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PVo7ZWxzZXtpZih0eXBlb2YgSj09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9Sj0iIiksSilmb3IoWSBpbiBKKVomJlkgaW4gWnx8UzQoWC5zdHlsZSxZLCIiKTtpZihaKWZvcihZIGluIFopSiYmWltZXT09SltZXXx8UzQoWC5zdHlsZSxZLFpbWV0pfWVsc2UgaWYoWVswXT09Im8iJiZZWzFdPT0ibiIpSz1ZIT0oWT1ZLnJlcGxhY2UoajQsIiQxIikpLFE9WS50b0xvd2VyQ2FzZSgpLFk9USBpbiBYfHxZPT0ib25Gb2N1c091dCJ8fFk9PSJvbkZvY3VzSW4iP1Euc2xpY2UoMik6WS5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtZK0tdPVosWj9KP1pbVTBdPUpbVTBdOihaW1UwXT1LNCxYLmFkZEV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilZPVkucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWSE9IndpZHRoIiYmWSE9ImhlaWdodCImJlkhPSJocmVmIiYmWSE9Imxpc3QiJiZZIT0iZm9ybSImJlkhPSJ0YWJJbmRleCImJlkhPSJkb3dubG9hZCImJlkhPSJyb3dTcGFuIiYmWSE9ImNvbFNwYW4iJiZZIT0icm9sZSImJlkhPSJwb3BvdmVyIiYmWSBpbiBYKXRyeXtYW1ldPVo9PW51bGw/IiI6WjticmVhayBYfWNhdGNoKHope310eXBlb2YgWj09ImZ1bmN0aW9uInx8KFo9PW51bGx8fFo9PT0hMSYmWVs0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFkpOlguc2V0QXR0cmlidXRlKFksWT09InBvcG92ZXIiJiZaPT0xPyIiOlopKX19ZnVuY3Rpb24gVDQoWCl7cmV0dXJuIGZ1bmN0aW9uKFkpe2lmKHRoaXMubCl7dmFyIFo9dGhpcy5sW1kudHlwZStYXTtpZihZW0MwXT09bnVsbClZW0MwXT1LNCsrO2Vsc2UgaWYoWVtDMF08WltVMF0pcmV0dXJuO3JldHVybiBaKFAuZXZlbnQ/UC5ldmVudChZKTpZKX19fWZ1bmN0aW9uICQ0KFgsWSxaLEoscSxLLFEseixHLEwpe3ZhciBELFcsTyxVLGssXyxDLE0sRixFLEksdixyLGYsaSx5PVkudHlwZTtpZihZLmNvbnN0cnVjdG9yIT09dm9pZCAwKXJldHVybiBudWxsOzEyOCZaLl9fdSYmKEc9ISEoMzImWi5fX3UpLEs9W3o9WS5fX2U9Wi5fX2VdKSwoRD1QLl9fYikmJkQoWSk7WDppZih0eXBlb2YgeT09ImZ1bmN0aW9uIil0cnl7aWYoTT1ZLnByb3BzLEY9eS5wcm90b3R5cGUmJnkucHJvdG90eXBlLnJlbmRlcixFPShEPXkuY29udGV4dFR5cGUpJiZKW0QuX19jXSxJPUQ/RT9FLnByb3BzLnZhbHVlOkQuX186SixaLl9fYz9DPShXPVkuX19jPVouX19jKS5fXz1XLl9fRTooRj9ZLl9fYz1XPW5ldyB5KE0sSSk6KFkuX19jPVc9bmV3IGcoTSxJKSxXLmNvbnN0cnVjdG9yPXksVy5yZW5kZXI9bTUpLEUmJkUuc3ViKFcpLFcuc3RhdGV8fChXLnN0YXRlPXt9KSxXLl9fbj1KLE89Vy5fX2Q9ITAsVy5fX2g9W10sVy5fc2I9W10pLEYmJlcuX19zPT1udWxsJiYoVy5fX3M9Vy5zdGF0ZSksRiYmeS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMhPW51bGwmJihXLl9fcz09Vy5zdGF0ZSYmKFcuX19zPVgwKHt9LFcuX19zKSksWDAoVy5fX3MseS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoTSxXLl9fcykpKSxVPVcucHJvcHMsaz1XLnN0YXRlLFcuX192PVksTylGJiZ5LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09bnVsbCYmVy5jb21wb25lbnRXaWxsTW91bnQhPW51bGwmJlcuY29tcG9uZW50V2lsbE1vdW50KCksRiYmVy5jb21wb25lbnREaWRNb3VudCE9bnVsbCYmVy5fX2gucHVzaChXLmNvbXBvbmVudERpZE1vdW50KTtlbHNle2lmKEYmJnkuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiZNIT09VSYmVy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT1udWxsJiZXLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoTSxJKSxZLl9fdj09Wi5fX3Z8fCFXLl9fZSYmVy5zaG91bGRDb21wb25lbnRVcGRhdGUhPW51bGwmJlcuc2hvdWxkQ29tcG9uZW50VXBkYXRlKE0sVy5fX3MsSSk9PT0hMSl7WS5fX3YhPVouX192JiYoVy5wcm9wcz1NLFcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEpLFkuX19lPVouX19lLFkuX19rPVouX19rLFkuX19rLnNvbWUoZnVuY3Rpb24obSl7bSYmKG0uX189WSl9KSxTMC5wdXNoLmFwcGx5KFcuX19oLFcuX3NiKSxXLl9zYj1bXSxXLl9faC5sZW5ndGgmJlEucHVzaChXKTticmVhayBYfVcuY29tcG9uZW50V2lsbFVwZGF0ZSE9bnVsbCYmVy5jb21wb25lbnRXaWxsVXBkYXRlKE0sVy5fX3MsSSksRiYmVy5jb21wb25lbnREaWRVcGRhdGUhPW51bGwmJlcuX19oLnB1c2goZnVuY3Rpb24oKXtXLmNvbXBvbmVudERpZFVwZGF0ZShVLGssXyl9KX1pZihXLmNvbnRleHQ9SSxXLnByb3BzPU0sVy5fX1A9WCxXLl9fZT0hMSx2PVAuX19yLHI9MCxGKVcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFMwLnB1c2guYXBwbHkoVy5fX2gsVy5fc2IpLFcuX3NiPVtdO2Vsc2UgZG8gVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFcuc3RhdGU9Vy5fX3M7d2hpbGUoVy5fX2QmJisrcjwyNSk7Vy5zdGF0ZT1XLl9fcyxXLmdldENoaWxkQ29udGV4dCE9bnVsbCYmKEo9WDAoWDAoe30sSiksVy5nZXRDaGlsZENvbnRleHQoKSkpLEYmJiFPJiZXLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT1udWxsJiYoXz1XLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKFUsaykpLGY9RCE9bnVsbCYmRC50eXBlPT09eCYmRC5rZXk9PW51bGw/bTQoRC5wcm9wcy5jaGlsZHJlbik6RCx6PWc0KFgsQTAoZik/ZjpbZl0sWSxaLEoscSxLLFEseixHLEwpLFcuYmFzZT1ZLl9fZSxZLl9fdSY9LTE2MSxXLl9faC5sZW5ndGgmJlEucHVzaChXKSxDJiYoVy5fX0U9Vy5fXz1udWxsKX1jYXRjaChtKXtpZihZLl9fdj1udWxsLEd8fEshPW51bGwpaWYobS50aGVuKXtmb3IoWS5fX3V8PUc/MTYwOjEyODt6JiZ6Lm5vZGVUeXBlPT04JiZ6Lm5leHRTaWJsaW5nOyl6PXoubmV4dFNpYmxpbmc7S1tLLmluZGV4T2YoeildPW51bGwsWS5fX2U9en1lbHNle2ZvcihpPUsubGVuZ3RoO2ktLTspUTQoS1tpXSk7cTQoWSl9ZWxzZSBZLl9fZT1aLl9fZSxZLl9faz1aLl9fayxtLnRoZW58fHE0KFkpO1AuX19lKG0sWSxaKX1lbHNlIEs9PW51bGwmJlkuX192PT1aLl9fdj8oWS5fX2s9Wi5fX2ssWS5fX2U9Wi5fX2UpOno9WS5fX2U9ZDUoWi5fX2UsWSxaLEoscSxLLFEsRyxMKTtyZXR1cm4oRD1QLmRpZmZlZCkmJkQoWSksMTI4JlkuX191P3ZvaWQgMDp6fWZ1bmN0aW9uIHE0KFgpe1gmJihYLl9fYyYmKFguX19jLl9fZT0hMCksWC5fX2smJlguX19rLnNvbWUocTQpKX1mdW5jdGlvbiBkNChYLFksWil7Zm9yKHZhciBKPTA7SjxaLmxlbmd0aDtKKyspVzQoWltKXSxaWysrSl0sWlsrK0pdKTtQLl9fYyYmUC5fX2MoWSxYKSxYLnNvbWUoZnVuY3Rpb24ocSl7dHJ5e1g9cS5fX2gscS5fX2g9W10sWC5zb21lKGZ1bmN0aW9uKEspe0suY2FsbChxKX0pfWNhdGNoKEspe1AuX19lKEsscS5fX3YpfX0pfWZ1bmN0aW9uIG00KFgpe3JldHVybiB0eXBlb2YgWCE9Im9iamVjdCJ8fFg9PW51bGx8fFguX19iPjA/WDpBMChYKT9YLm1hcChtNCk6WDAoe30sWCl9ZnVuY3Rpb24gZDUoWCxZLFosSixxLEssUSx6LEcpe3ZhciBMLEQsVyxPLFUsayxfLEM9Wi5wcm9wc3x8dzAsTT1ZLnByb3BzLEY9WS50eXBlO2lmKEY9PSJzdmciP3E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjpGPT0ibWF0aCI/cT0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI6cXx8KHE9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiKSxLIT1udWxsKXtmb3IoTD0wO0w8Sy5sZW5ndGg7TCsrKWlmKChVPUtbTF0pJiYic2V0QXR0cmlidXRlImluIFU9PSEhRiYmKEY/VS5sb2NhbE5hbWU9PUY6VS5ub2RlVHlwZT09Mykpe1g9VSxLW0xdPW51bGw7YnJlYWt9fWlmKFg9PW51bGwpe2lmKEY9PW51bGwpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKE0pO1g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHEsRixNLmlzJiZNKSx6JiYoUC5fX20mJlAuX19tKFksSyksej0hMSksSz1udWxsfWlmKEY9PW51bGwpQz09PU18fHomJlguZGF0YT09TXx8KFguZGF0YT1NKTtlbHNle2lmKEs9SyYmYjAuY2FsbChYLmNoaWxkTm9kZXMpLCF6JiZLIT1udWxsKWZvcihDPXt9LEw9MDtMPFguYXR0cmlidXRlcy5sZW5ndGg7TCsrKUNbKFU9WC5hdHRyaWJ1dGVzW0xdKS5uYW1lXT1VLnZhbHVlO2ZvcihMIGluIEMpVT1DW0xdLEw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/Vz1VOkw9PSJjaGlsZHJlbiJ8fChMIGluIE0pfHxMPT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBNKXx8TD09ImNoZWNrZWQiJiYoImRlZmF1bHRDaGVja2VkImluIE0pfHxNMChYLEwsbnVsbCxVLHEpO2ZvcihMIGluIE0pVT1NW0xdLEw9PSJjaGlsZHJlbiI/Tz1VOkw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/RD1VOkw9PSJ2YWx1ZSI/az1VOkw9PSJjaGVja2VkIj9fPVU6eiYmdHlwZW9mIFUhPSJmdW5jdGlvbiJ8fENbTF09PT1VfHxNMChYLEwsVSxDW0xdLHEpO2lmKEQpenx8VyYmKEQuX19odG1sPT1XLl9faHRtbHx8RC5fX2h0bWw9PVguaW5uZXJIVE1MKXx8KFguaW5uZXJIVE1MPUQuX19odG1sKSxZLl9faz1bXTtlbHNlIGlmKFcmJihYLmlubmVySFRNTD0iIiksZzQoWS50eXBlPT0idGVtcGxhdGUiP1guY29udGVudDpYLEEwKE8pP086W09dLFksWixKLEY9PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6cSxLLFEsSz9LWzBdOlouX19rJiZMMChaLDApLHosRyksSyE9bnVsbClmb3IoTD1LLmxlbmd0aDtMLS07KVE0KEtbTF0pO3p8fChMPSJ2YWx1ZSIsRj09InByb2dyZXNzIiYmaz09bnVsbD9YLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTprIT1udWxsJiYoayE9PVhbTF18fEY9PSJwcm9ncmVzcyImJiFrfHxGPT0ib3B0aW9uIiYmayE9Q1tMXSkmJk0wKFgsTCxrLENbTF0scSksTD0iY2hlY2tlZCIsXyE9bnVsbCYmXyE9WFtMXSYmTTAoWCxMLF8sQ1tMXSxxKSl9cmV0dXJuIFh9ZnVuY3Rpb24gVzQoWCxZLFope3RyeXtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIil7dmFyIEo9dHlwZW9mIFguX191PT0iZnVuY3Rpb24iO0omJlguX191KCksSiYmWT09bnVsbHx8KFguX191PVgoWSkpfWVsc2UgWC5jdXJyZW50PVl9Y2F0Y2gocSl7UC5fX2UocSxaKX19ZnVuY3Rpb24gaDQoWCxZLFope3ZhciBKLHE7aWYoUC51bm1vdW50JiZQLnVubW91bnQoWCksKEo9WC5yZWYpJiYoSi5jdXJyZW50JiZKLmN1cnJlbnQhPVguX19lfHxXNChKLG51bGwsWSkpLChKPVguX19jKSE9bnVsbCl7aWYoSi5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7Si5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKEspe1AuX19lKEssWSl9Si5iYXNlPUouX19QPW51bGx9aWYoSj1YLl9faylmb3IocT0wO3E8Si5sZW5ndGg7cSsrKUpbcV0mJmg0KEpbcV0sWSxafHx0eXBlb2YgWC50eXBlIT0iZnVuY3Rpb24iKTtafHxRNChYLl9fZSksWC5fX2M9WC5fXz1YLl9fZT12b2lkIDB9ZnVuY3Rpb24gbTUoWCxZLFope3JldHVybiB0aGlzLmNvbnN0cnVjdG9yKFgsWil9ZnVuY3Rpb24gcDAoWCxZLFope3ZhciBKLHEsSyxRO1k9PWRvY3VtZW50JiYoWT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLFAuX18mJlAuX18oWCxZKSxxPShKPXR5cGVvZiBaPT0iZnVuY3Rpb24iKT9udWxsOlomJlouX19rfHxZLl9fayxLPVtdLFE9W10sJDQoWSxYPSghSiYmWnx8WSkuX19rPVkwKHgsbnVsbCxbWF0pLHF8fHcwLHcwLFkubmFtZXNwYWNlVVJJLCFKJiZaP1taXTpxP251bGw6WS5maXJzdENoaWxkP2IwLmNhbGwoWS5jaGlsZE5vZGVzKTpudWxsLEssIUomJlo/WjpxP3EuX19lOlkuZmlyc3RDaGlsZCxKLFEpLGQ0KEssWCxRKX1mdW5jdGlvbiB6MChYKXtmdW5jdGlvbiBZKFope3ZhciBKLHE7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRDb250ZXh0fHwoSj1uZXcgU2V0LChxPXt9KVtZLl9fY109dGhpcyx0aGlzLmdldENoaWxkQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBxfSx0aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7Sj1udWxsfSx0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihLKXt0aGlzLnByb3BzLnZhbHVlIT1LLnZhbHVlJiZKLmZvckVhY2goZnVuY3Rpb24oUSl7US5fX2U9ITAsSjQoUSl9KX0sdGhpcy5zdWI9ZnVuY3Rpb24oSyl7Si5hZGQoSyk7dmFyIFE9Sy5jb21wb25lbnRXaWxsVW5tb3VudDtLLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7SiYmSi5kZWxldGUoSyksUSYmUS5jYWxsKEspfX0pLFouY2hpbGRyZW59cmV0dXJuIFkuX19jPSJfX2NDIitSNCsrLFkuX189WCxZLlByb3ZpZGVyPVkuX19sPShZLkNvbnN1bWVyPWZ1bmN0aW9uKFosSil7cmV0dXJuIFouY2hpbGRyZW4oSil9KS5jb250ZXh0VHlwZT1ZLFl9YjA9UzAuc2xpY2UsUD17X19lOmZ1bmN0aW9uKFgsWSxaLEope2Zvcih2YXIgcSxLLFE7WT1ZLl9fOylpZigocT1ZLl9fYykmJiFxLl9fKXRyeXtpZigoSz1xLmNvbnN0cnVjdG9yKSYmSy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPW51bGwmJihxLnNldFN0YXRlKEsuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKFgpKSxRPXEuX19kKSxxLmNvbXBvbmVudERpZENhdGNoIT1udWxsJiYocS5jb21wb25lbnREaWRDYXRjaChYLEp8fHt9KSxRPXEuX19kKSxRKXJldHVybiBxLl9fRT1xfWNhdGNoKHope1g9en10aHJvdyBYfX0sYjQ9MCxqNT1mdW5jdGlvbihYKXtyZXR1cm4gWCE9bnVsbCYmWC5jb25zdHJ1Y3Rvcj09PXZvaWQgMH0sZy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oWCxZKXt2YXIgWjtaPXRoaXMuX19zIT1udWxsJiZ0aGlzLl9fcyE9dGhpcy5zdGF0ZT90aGlzLl9fczp0aGlzLl9fcz1YMCh7fSx0aGlzLnN0YXRlKSx0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFg9WChYMCh7fSxaKSx0aGlzLnByb3BzKSksWCYmWDAoWixYKSxYIT1udWxsJiZ0aGlzLl9fdiYmKFkmJnRoaXMuX3NiLnB1c2goWSksSjQodGhpcykpfSxnLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihYKXt0aGlzLl9fdiYmKHRoaXMuX19lPSEwLFgmJnRoaXMuX19oLnB1c2goWCksSjQodGhpcykpfSxnLnByb3RvdHlwZS5yZW5kZXI9eCxLMD1bXSxwND10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpOnNldFRpbWVvdXQsdjQ9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gWC5fX3YuX19iLVkuX192Ll9fYn0sVDAuX19yPTAsWDQ9TWF0aC5yYW5kb20oKS50b1N0cmluZyg4KSxDMD0iX19kIitYNCxVMD0iX19hIitYNCxqND0vKFBvaW50ZXJDYXB0dXJlKSR8Q2FwdHVyZSQvaSxLND0wLFk0PVQ0KCExKSxaND1UNCghMCksUjQ9MDt2YXIgTjAsVCxMNCxmNCxEMD0wLHI0PVtdLGI9UCxhND1iLl9fYixjND1iLl9fcixsND1iLmRpZmZlZCxpND1iLl9fYyxzND1iLnVubW91bnQsbzQ9Yi5fXztmdW5jdGlvbiBqMChYLFkpe2IuX19oJiZiLl9faChULFgsRDB8fFkpLEQwPTA7dmFyIFo9VC5fX0h8fChULl9fSD17X186W10sX19oOltdfSk7cmV0dXJuIFg+PVouX18ubGVuZ3RoJiZaLl9fLnB1c2goe30pLFouX19bWF19ZnVuY3Rpb24gcChYKXtyZXR1cm4gRDA9MSxONChuNCxYKX1mdW5jdGlvbiBONChYLFksWil7dmFyIEo9ajAoTjArKywyKTtpZihKLnQ9WCwhSi5fX2MmJihKLl9fPVtaP1ooWSk6bjQodm9pZCAwLFkpLGZ1bmN0aW9uKHope3ZhciBHPUouX19OP0ouX19OWzBdOkouX19bMF0sTD1KLnQoRyx6KTtHIT09TCYmKEouX19OPVtMLEouX19bMV1dLEouX19jLnNldFN0YXRlKHt9KSl9XSxKLl9fYz1ULCFULl9fZikpe3ZhciBxPWZ1bmN0aW9uKHosRyxMKXtpZighSi5fX2MuX19IKXJldHVybiEwO3ZhciBEPUouX19jLl9fSC5fXy5maWx0ZXIoZnVuY3Rpb24oTyl7cmV0dXJuIE8uX19jfSk7aWYoRC5ldmVyeShmdW5jdGlvbihPKXtyZXR1cm4hTy5fX059KSlyZXR1cm4hS3x8Sy5jYWxsKHRoaXMseixHLEwpO3ZhciBXPUouX19jLnByb3BzIT09ejtyZXR1cm4gRC5zb21lKGZ1bmN0aW9uKE8pe2lmKE8uX19OKXt2YXIgVT1PLl9fWzBdO08uX189Ty5fX04sTy5fX049dm9pZCAwLFUhPT1PLl9fWzBdJiYoVz0hMCl9fSksSyYmSy5jYWxsKHRoaXMseixHLEwpfHxXfTtULl9fZj0hMDt2YXJ7c2hvdWxkQ29tcG9uZW50VXBkYXRlOkssY29tcG9uZW50V2lsbFVwZGF0ZTpRfT1UO1QuY29tcG9uZW50V2lsbFVwZGF0ZT1mdW5jdGlvbih6LEcsTCl7aWYodGhpcy5fX2Upe3ZhciBEPUs7Sz12b2lkIDAscSh6LEcsTCksSz1EfVEmJlEuY2FsbCh0aGlzLHosRyxMKX0sVC5zaG91bGRDb21wb25lbnRVcGRhdGU9cX1yZXR1cm4gSi5fX058fEouX199ZnVuY3Rpb24gZChYLFkpe3ZhciBaPWowKE4wKyssMyk7IWIuX19zJiZ0NChaLl9fSCxZKSYmKFouX189WCxaLnU9WSxULl9fSC5fX2gucHVzaChaKSl9ZnVuY3Rpb24gdyhYKXtyZXR1cm4gRDA9NSxSMChmdW5jdGlvbigpe3JldHVybntjdXJyZW50Olh9fSxbXSl9ZnVuY3Rpb24gUjAoWCxZKXt2YXIgWj1qMChOMCsrLDcpO3JldHVybiB0NChaLl9fSCxZKSYmKFouX189WCgpLFouX19IPVksWi5fX2g9WCksWi5fX31mdW5jdGlvbiBqKFgsWSl7cmV0dXJuIEQwPTgsUjAoZnVuY3Rpb24oKXtyZXR1cm4gWH0sWSl9ZnVuY3Rpb24gUDAoWCl7dmFyIFk9VC5jb250ZXh0W1guX19jXSxaPWowKE4wKyssOSk7cmV0dXJuIFouYz1YLFk/KFouX189PW51bGwmJihaLl9fPSEwLFkuc3ViKFQpKSxZLnByb3BzLnZhbHVlKTpYLl9ffWZ1bmN0aW9uIGg1KCl7Zm9yKHZhciBYO1g9cjQuc2hpZnQoKTspe3ZhciBZPVguX19IO2lmKFguX19QJiZZKXRyeXtZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXX1jYXRjaChaKXtZLl9faD1bXSxiLl9fZShaLFguX192KX19fWIuX19iPWZ1bmN0aW9uKFgpe1Q9bnVsbCxhNCYmYTQoWCl9LGIuX189ZnVuY3Rpb24oWCxZKXtYJiZZLl9fayYmWS5fX2suX19tJiYoWC5fX209WS5fX2suX19tKSxvNCYmbzQoWCxZKX0sYi5fX3I9ZnVuY3Rpb24oWCl7YzQmJmM0KFgpLE4wPTA7dmFyIFk9KFQ9WC5fX2MpLl9fSDtZJiYoTDQ9PT1UPyhZLl9faD1bXSxULl9faD1bXSxZLl9fLnNvbWUoZnVuY3Rpb24oWil7Wi5fX04mJihaLl9fPVouX19OKSxaLnU9Wi5fX049dm9pZCAwfSkpOihZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXSxOMD0wKSksTDQ9VH0sYi5kaWZmZWQ9ZnVuY3Rpb24oWCl7bDQmJmw0KFgpO3ZhciBZPVguX19jO1kmJlkuX19IJiYoWS5fX0guX19oLmxlbmd0aCYmKHI0LnB1c2goWSkhPT0xJiZmND09PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwoKGY0PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKXx8ZjUpKGg1KSksWS5fX0guX18uc29tZShmdW5jdGlvbihaKXtaLnUmJihaLl9fSD1aLnUpLFoudT12b2lkIDB9KSksTDQ9VD1udWxsfSxiLl9fYz1mdW5jdGlvbihYLFkpe1kuc29tZShmdW5jdGlvbihaKXt0cnl7Wi5fX2guc29tZSh2MCksWi5fX2g9Wi5fX2guZmlsdGVyKGZ1bmN0aW9uKEope3JldHVybiFKLl9ffHx6NChKKX0pfWNhdGNoKEope1kuc29tZShmdW5jdGlvbihxKXtxLl9faCYmKHEuX19oPVtdKX0pLFk9W10sYi5fX2UoSixaLl9fdil9fSksaTQmJmk0KFgsWSl9LGIudW5tb3VudD1mdW5jdGlvbihYKXtzNCYmczQoWCk7dmFyIFksWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7dHJ5e3YwKEopfWNhdGNoKHEpe1k9cX19KSxaLl9fSD12b2lkIDAsWSYmYi5fX2UoWSxaLl9fdikpfTt2YXIgdTQ9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBmNShYKXt2YXIgWSxaPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KEopLHU0JiZjYW5jZWxBbmltYXRpb25GcmFtZShZKSxzZXRUaW1lb3V0KFgpfSxKPXNldFRpbWVvdXQoWiwzNSk7dTQmJihZPXJlcXVlc3RBbmltYXRpb25GcmFtZShaKSl9ZnVuY3Rpb24gdjAoWCl7dmFyIFk9VCxaPVguX19jO3R5cGVvZiBaPT0iZnVuY3Rpb24iJiYoWC5fX2M9dm9pZCAwLFooKSksVD1ZfWZ1bmN0aW9uIHo0KFgpe3ZhciBZPVQ7WC5fX2M9WC5fXygpLFQ9WX1mdW5jdGlvbiB0NChYLFkpe3JldHVybiFYfHxYLmxlbmd0aCE9PVkubGVuZ3RofHxZLnNvbWUoZnVuY3Rpb24oWixKKXtyZXR1cm4gWiE9PVhbSl19KX1mdW5jdGlvbiBuNChYLFkpe3JldHVybiB0eXBlb2YgWT09ImZ1bmN0aW9uIj9ZKFgpOll9ZnVuY3Rpb24gdTUoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gZTQoWCxZKXtmb3IodmFyIFogaW4gWClpZihaIT09Il9fc291cmNlIiYmIShaIGluIFkpKXJldHVybiEwO2Zvcih2YXIgSiBpbiBZKWlmKEohPT0iX19zb3VyY2UiJiZYW0pdIT09WVtKXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBYNShYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX0oWDUucHJvdG90eXBlPW5ldyBnKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxYNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWSl7cmV0dXJuIGU0KHRoaXMucHJvcHMsWCl8fGU0KHRoaXMuc3RhdGUsWSl9O3ZhciBZNT1QLl9fYjtQLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksWTUmJlk1KFgpfTt2YXIgcjU9UC5fX2U7UC5fX2U9ZnVuY3Rpb24oWCxZLFosSil7aWYoWC50aGVuKXtmb3IodmFyIHEsSz1ZO0s9Sy5fXzspaWYoKHE9Sy5fX2MpJiZxLl9fYylyZXR1cm4gWS5fX2U9PW51bGwmJihZLl9fZT1aLl9fZSxZLl9faz1aLl9faykscS5fX2MoWCxZKX1yNShYLFksWixKKX07dmFyIFo1PVAudW5tb3VudDtmdW5jdGlvbiBXNShYLFksWil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oSil7dHlwZW9mIEouX19jPT0iZnVuY3Rpb24iJiZKLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPXU1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1aJiYoWC5fX2MuX19QPVkpLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKEope3JldHVybiBXNShKLFksWil9KSksWH1mdW5jdGlvbiBMNShYLFksWil7cmV0dXJuIFgmJlomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIEw1KEosWSxaKX0pLFguX19jJiZYLl9fYy5fX1A9PT1ZJiYoWC5fX2UmJlouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9WikpLFh9ZnVuY3Rpb24gRzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gejUoWCl7dmFyIFk9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFkmJlkuX19hJiZZLl9fYShYKX1mdW5jdGlvbiB5MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfVAudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWT1YLl9fYztZJiYoWS5fX3o9ITApLFkmJlkuX19SJiZZLl9fUigpLFkmJjMyJlguX191JiYoWC50eXBlPW51bGwpLFo1JiZaNShYKX0sKEc0LnByb3RvdHlwZT1uZXcgZykuX19jPWZ1bmN0aW9uKFgsWSl7dmFyIFo9WS5fX2MsSj10aGlzO0oubz09bnVsbCYmKEoubz1bXSksSi5vLnB1c2goWik7dmFyIHE9ejUoSi5fX3YpLEs9ITEsUT1mdW5jdGlvbigpe0t8fEouX196fHwoSz0hMCxaLl9fUj1udWxsLHE/cShHKTpHKCkpfTtaLl9fUj1RO3ZhciB6PVouX19QO1ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1KLl9fdSl7aWYoSi5zdGF0ZS5fX2Epe3ZhciBMPUouc3RhdGUuX19hO0ouX192Ll9fa1swXT1MNShMLEwuX19jLl9fUCxMLl9fYy5fX08pfXZhciBEO2ZvcihKLnNldFN0YXRlKHtfX2E6Si5fX2I9bnVsbH0pO0Q9Si5vLnBvcCgpOylELl9fUD16LEQuZm9yY2VVcGRhdGUoKX19O0ouX191Kyt8fDMyJlkuX191fHxKLnNldFN0YXRlKHtfX2E6Si5fX2I9Si5fX3YuX19rWzBdfSksWC50aGVuKFEsUSl9LEc0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFkpe2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBaPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEo9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09VzUodGhpcy5fX2IsWixKLl9fTz1KLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1ZLl9fYSYmWTAoeCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1kwKHgsbnVsbCxZLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgSjU9ZnVuY3Rpb24oWCxZLFope2lmKCsrWlsxXT09PVpbMF0mJlgubC5kZWxldGUoWSksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKFo9WC5pO1o7KXtmb3IoO1oubGVuZ3RoPjM7KVoucG9wKCkoKTtpZihaWzFdPFpbMF0pYnJlYWs7WC5pPVo9WlsyXX19Oyh5MC5wcm90b3R5cGU9bmV3IGcpLl9fYT1mdW5jdGlvbihYKXt2YXIgWT10aGlzLFo9ejUoWS5fX3YpLEo9WS5sLmdldChYKTtyZXR1cm4gSlswXSsrLGZ1bmN0aW9uKHEpe3ZhciBLPWZ1bmN0aW9uKCl7WS5wcm9wcy5yZXZlYWxPcmRlcj8oSi5wdXNoKHEpLEo1KFksWCxKKSk6cSgpfTtaP1ooSyk6SygpfX0seTAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWT1aMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZZLnJldmVyc2UoKTtmb3IodmFyIFo9WS5sZW5ndGg7Wi0tOyl0aGlzLmwuc2V0KFlbWl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHkwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9eTAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihZLFope0o1KFgsWixZKX0pfTt2YXIgdDU9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsbjU9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLGU1PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sWDY9L1tBLVowLTldL2csWTY9dHlwZW9mIGRvY3VtZW50PCJ1IixaNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2Z1bmN0aW9uIE41KFgsWSxaKXtyZXR1cm4gWS5fX2s9PW51bGwmJihZLnRleHRDb250ZW50PSIiKSxwMChYLFkpLHR5cGVvZiBaPT0iZnVuY3Rpb24iJiZaKCksWD9YLl9fYzpudWxsfWcucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGcucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihZKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6WX0pfX0pfSk7dmFyIHE1PVAuZXZlbnQ7UC5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gcTUmJihYPXE1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgRzUsSjY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEs1PVAudm5vZGU7UC52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWSl7dmFye3Byb3BzOlosdHlwZTpKfT1ZLHE9e30sSz1KLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBRIGluIFope3ZhciB6PVpbUV07aWYoIShRPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gWikmJno9PW51bGx8fFk2JiZRPT09ImNoaWxkcmVuIiYmSj09PSJub3NjcmlwdCJ8fFE9PT0iY2xhc3MifHxRPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1RLnRvTG93ZXJDYXNlKCk7UT09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gWiYmWi52YWx1ZT09bnVsbD9RPSJ2YWx1ZSI6UT09PSJkb3dubG9hZCImJno9PT0hMD96PSIiOkc9PT0idHJhbnNsYXRlIiYmej09PSJubyI/ej0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/UT0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fEohPT0iaW5wdXQiJiZKIT09InRleHRhcmVhInx8WjYoWi50eXBlKT9HPT09Im9uZm9jdXMiP1E9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP1E9Im9uZm9jdXNvdXQiOmU1LnRlc3QoUSkmJihRPUcpOkc9UT0ib25pbnB1dCI6SyYmbjUudGVzdChRKT9RPVEucmVwbGFjZShYNiwiLSQmIikudG9Mb3dlckNhc2UoKTp6PT09bnVsbCYmKHo9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW1E9R10mJihRPSJvbmlucHV0Q2FwdHVyZSIpLHFbUV09en19Sj09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9WjAoWi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihMKXtMLnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZihMLnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PUwucHJvcHMudmFsdWV9KSkpLFouY2xhc3MmJiFaLmNsYXNzTmFtZT8ocS5jbGFzcz1aLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEo2KSk6Wi5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPVouY2xhc3NOYW1lKSxZLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9dDUsSzUmJks1KFgpfTt2YXIgUTU9UC5fX3I7UC5fX3I9ZnVuY3Rpb24oWCl7UTUmJlE1KFgpLEc1PVguX19jfTt2YXIgJDU9UC5kaWZmZWQ7UC5kaWZmZWQ9ZnVuY3Rpb24oWCl7JDUmJiQ1KFgpO3Zhcntwcm9wczpZLF9fZTpafT1YO1ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBZJiZZLnZhbHVlIT09Wi52YWx1ZSYmKFoudmFsdWU9WS52YWx1ZT09bnVsbD8iIjpZLnZhbHVlKSxHNT1udWxsfTtmdW5jdGlvbiBWNShYKXtyZXR1cm4hIVguX19rJiYocDAobnVsbCxYKSwhMCl9ZnVuY3Rpb24gSDUoWCl7cmV0dXJue3JlbmRlcjpmdW5jdGlvbihZKXtONShZLFgpfSx1bm1vdW50OmZ1bmN0aW9uKCl7VjUoWCl9fX1mdW5jdGlvbiBJNShYLFkpe2Zvcih2YXIgWiBpbiBZKVhbWl09WVtaXTtyZXR1cm4gWH1mdW5jdGlvbiBPNShYLFkpe2Zvcih2YXIgWiBpbiBYKWlmKFohPT0iX19zb3VyY2UiJiYhKFogaW4gWSkpcmV0dXJuITA7Zm9yKHZhciBKIGluIFkpaWYoSiE9PSJfX3NvdXJjZSImJlhbSl0hPT1ZW0pdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFU1KFgsWSl7dGhpcy5wcm9wcz1YLHRoaXMuY29udGV4dD1ZfShVNS5wcm90b3R5cGU9bmV3IGcpLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwLFU1LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gTzUodGhpcy5wcm9wcyxYKXx8TzUodGhpcy5zdGF0ZSxZKX07dmFyIEE1PVAuX19iO1AuX19iPWZ1bmN0aW9uKFgpe1gudHlwZSYmWC50eXBlLl9fZiYmWC5yZWYmJihYLnByb3BzLnJlZj1YLnJlZixYLnJlZj1udWxsKSxBNSYmQTUoWCl9O3ZhciBxNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKXx8MzkxMTtmdW5jdGlvbiBHMChYKXtmdW5jdGlvbiBZKFope3ZhciBKPUk1KHt9LFopO3JldHVybiBkZWxldGUgSi5yZWYsWChKLFoucmVmfHxudWxsKX1yZXR1cm4gWS4kJHR5cGVvZj1xNixZLnJlbmRlcj1YLFkucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9WS5fX2Y9ITAsWS5kaXNwbGF5TmFtZT0iRm9yd2FyZFJlZigiKyhYLmRpc3BsYXlOYW1lfHxYLm5hbWUpKyIpIixZfXZhciBLNj1QLl9fZTtQLl9fZT1mdW5jdGlvbihYLFksWixKKXtpZihYLnRoZW4pe2Zvcih2YXIgcSxLPVk7Sz1LLl9fOylpZigocT1LLl9fYykmJnEuX19jKXJldHVybiBZLl9fZT09bnVsbCYmKFkuX19lPVouX19lLFkuX19rPVouX19rKSxxLl9fYyhYLFkpfUs2KFgsWSxaLEopfTt2YXIgRDU9UC51bm1vdW50O2Z1bmN0aW9uIE01KFgsWSxaKXtyZXR1cm4gWCYmKFguX19jJiZYLl9fYy5fX0gmJihYLl9fYy5fX0guX18uZm9yRWFjaChmdW5jdGlvbihKKXt0eXBlb2YgSi5fX2M9PSJmdW5jdGlvbiImJkouX19jKCl9KSxYLl9fYy5fX0g9bnVsbCksKFg9STUoe30sWCkpLl9fYyE9bnVsbCYmKFguX19jLl9fUD09PVomJihYLl9fYy5fX1A9WSksWC5fX2MuX19lPSEwLFguX19jPW51bGwpLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIE01KEosWSxaKX0pKSxYfWZ1bmN0aW9uIEM1KFgsWSxaKXtyZXR1cm4gWCYmWiYmKFguX192PW51bGwsWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihKKXtyZXR1cm4gQzUoSixZLFopfSksWC5fX2MmJlguX19jLl9fUD09PVkmJihYLl9fZSYmWi5hcHBlbmRDaGlsZChYLl9fZSksWC5fX2MuX19lPSEwLFguX19jLl9fUD1aKSksWH1mdW5jdGlvbiBINCgpe3RoaXMuX191PTAsdGhpcy5vPW51bGwsdGhpcy5fX2I9bnVsbH1mdW5jdGlvbiBFNShYKXt2YXIgWT1YLl9fJiZYLl9fLl9fYztyZXR1cm4gWSYmWS5fX2EmJlkuX19hKFgpfWZ1bmN0aW9uIGcwKCl7dGhpcy5pPW51bGwsdGhpcy5sPW51bGx9UC51bm1vdW50PWZ1bmN0aW9uKFgpe3ZhciBZPVguX19jO1kmJihZLl9fej0hMCksWSYmWS5fX1ImJlkuX19SKCksWSYmMzImWC5fX3UmJihYLnR5cGU9bnVsbCksRDUmJkQ1KFgpfSwoSDQucHJvdG90eXBlPW5ldyBnKS5fX2M9ZnVuY3Rpb24oWCxZKXt2YXIgWj1ZLl9fYyxKPXRoaXM7Si5vPT1udWxsJiYoSi5vPVtdKSxKLm8ucHVzaChaKTt2YXIgcT1FNShKLl9fdiksSz0hMSxRPWZ1bmN0aW9uKCl7S3x8Si5fX3p8fChLPSEwLFouX19SPW51bGwscT9xKEcpOkcoKSl9O1ouX19SPVE7dmFyIHo9Wi5fX1A7Wi5fX1A9bnVsbDt2YXIgRz1mdW5jdGlvbigpe2lmKCEtLUouX191KXtpZihKLnN0YXRlLl9fYSl7dmFyIEw9Si5zdGF0ZS5fX2E7Si5fX3YuX19rWzBdPUM1KEwsTC5fX2MuX19QLEwuX19jLl9fTyl9dmFyIEQ7Zm9yKEouc2V0U3RhdGUoe19fYTpKLl9fYj1udWxsfSk7RD1KLm8ucG9wKCk7KUQuX19QPXosRC5mb3JjZVVwZGF0ZSgpfX07Si5fX3UrK3x8MzImWS5fX3V8fEouc2V0U3RhdGUoe19fYTpKLl9fYj1KLl9fdi5fX2tbMF19KSxYLnRoZW4oUSxRKX0sSDQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5vPVtdfSxINC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgsWSl7aWYodGhpcy5fX2Ipe2lmKHRoaXMuX192Ll9fayl7dmFyIFo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksSj10aGlzLl9fdi5fX2tbMF0uX19jO3RoaXMuX192Ll9fa1swXT1NNSh0aGlzLl9fYixaLEouX19PPUouX19QKX10aGlzLl9fYj1udWxsfXZhciBxPVkuX19hJiZZMCh4LG51bGwsWC5mYWxsYmFjayk7cmV0dXJuIHEmJihxLl9fdSY9LTMzKSxbWTAoeCxudWxsLFkuX19hP251bGw6WC5jaGlsZHJlbikscV19O3ZhciBQNT1mdW5jdGlvbihYLFksWil7aWYoKytaWzFdPT09WlswXSYmWC5sLmRlbGV0ZShZKSxYLnByb3BzLnJldmVhbE9yZGVyJiYoWC5wcm9wcy5yZXZlYWxPcmRlclswXSE9PSJ0Inx8IVgubC5zaXplKSlmb3IoWj1YLmk7Wjspe2Zvcig7Wi5sZW5ndGg+MzspWi5wb3AoKSgpO2lmKFpbMV08WlswXSlicmVhaztYLmk9Wj1aWzJdfX07KGcwLnByb3RvdHlwZT1uZXcgZykuX19hPWZ1bmN0aW9uKFgpe3ZhciBZPXRoaXMsWj1FNShZLl9fdiksSj1ZLmwuZ2V0KFgpO3JldHVybiBKWzBdKyssZnVuY3Rpb24ocSl7dmFyIEs9ZnVuY3Rpb24oKXtZLnByb3BzLnJldmVhbE9yZGVyPyhKLnB1c2gocSksUDUoWSxYLEopKTpxKCl9O1o/WihLKTpLKCl9fSxnMC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgpe3RoaXMuaT1udWxsLHRoaXMubD1uZXcgTWFwO3ZhciBZPVowKFguY2hpbGRyZW4pO1gucmV2ZWFsT3JkZXImJlgucmV2ZWFsT3JkZXJbMF09PT0iYiImJlkucmV2ZXJzZSgpO2Zvcih2YXIgWj1ZLmxlbmd0aDtaLS07KXRoaXMubC5zZXQoWVtaXSx0aGlzLmk9WzEsMCx0aGlzLmldKTtyZXR1cm4gWC5jaGlsZHJlbn0sZzAucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1nMC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgWD10aGlzO3RoaXMubC5mb3JFYWNoKGZ1bmN0aW9uKFksWil7UDUoWCxaLFkpfSl9O3ZhciBRNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMywkNj0vXig/OmFjY2VudHxhbGlnbm1lbnR8YXJhYmljfGJhc2VsaW5lfGNhcHxjbGlwKD8hUGF0aFUpfGNvbG9yfGRvbWluYW50fGZpbGx8Zmxvb2R8Zm9udHxnbHlwaCg/IVIpfGhvcml6fGltYWdlKCFTKXxsZXR0ZXJ8bGlnaHRpbmd8bWFya2VyKD8hSHxXfFUpfG92ZXJsaW5lfHBhaW50fHBvaW50ZXJ8c2hhcGV8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dHJhbnNmb3JtfHVuZGVybGluZXx1bmljb2RlfHVuaXRzfHZ8dmVjdG9yfHZlcnR8d29yZHx3cml0aW5nfHgoPyFDKSlbQS1aXS8sVzY9L15vbihBbml8VHJhfFRvdXxCZWZvcmVJbnB8Q29tcG8pLyxMNj0vW0EtWjAtOV0vZyx6Nj10eXBlb2YgZG9jdW1lbnQ8InUiLE42PWZ1bmN0aW9uKFgpe3JldHVybih0eXBlb2YgU3ltYm9sPCJ1IiYmdHlwZW9mIFN5bWJvbCgpPT0ic3ltYm9sIj8vZmlsfGNoZXxyYWQvOi9maWx8Y2hlfHJhLykudGVzdChYKX07Zy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD0hMCxbImNvbXBvbmVudFdpbGxNb3VudCIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJjb21wb25lbnRXaWxsVXBkYXRlIl0uZm9yRWFjaChmdW5jdGlvbihYKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZy5wcm90b3R5cGUsWCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzWyJVTlNBRkVfIitYXX0sc2V0OmZ1bmN0aW9uKFkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFgse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpZfSl9fSl9KTt2YXIgQjU9UC5ldmVudDtQLmV2ZW50PWZ1bmN0aW9uKFgpe3JldHVybiBCNSYmKFg9QjUoWCkpLFgucGVyc2lzdD1mdW5jdGlvbigpe30sWC5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbmNlbEJ1YmJsZX0sWC5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZhdWx0UHJldmVudGVkfSxYLm5hdGl2ZUV2ZW50PVh9O3ZhciB3NSxHNj17Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsYXNzfX0sXzU9UC52bm9kZTtQLnZub2RlPWZ1bmN0aW9uKFgpe3R5cGVvZiBYLnR5cGU9PSJzdHJpbmciJiZmdW5jdGlvbihZKXt2YXJ7cHJvcHM6Wix0eXBlOkp9PVkscT17fSxLPUouaW5kZXhPZigiLSIpPT0tMTtmb3IodmFyIFEgaW4gWil7dmFyIHo9WltRXTtpZighKFE9PT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBaKSYmej09bnVsbHx8ejYmJlE9PT0iY2hpbGRyZW4iJiZKPT09Im5vc2NyaXB0Inx8UT09PSJjbGFzcyJ8fFE9PT0iY2xhc3NOYW1lIikpe3ZhciBHPVEudG9Mb3dlckNhc2UoKTtRPT09ImRlZmF1bHRWYWx1ZSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlPT1udWxsP1E9InZhbHVlIjpRPT09ImRvd25sb2FkIiYmej09PSEwP3o9IiI6Rz09PSJ0cmFuc2xhdGUiJiZ6PT09Im5vIj96PSExOkdbMF09PT0ibyImJkdbMV09PT0ibiI/Rz09PSJvbmRvdWJsZWNsaWNrIj9RPSJvbmRibGNsaWNrIjpHIT09Im9uY2hhbmdlInx8SiE9PSJpbnB1dCImJkohPT0idGV4dGFyZWEifHxONihaLnR5cGUpP0c9PT0ib25mb2N1cyI/UT0ib25mb2N1c2luIjpHPT09Im9uYmx1ciI/UT0ib25mb2N1c291dCI6VzYudGVzdChRKSYmKFE9Ryk6Rz1RPSJvbmlucHV0IjpLJiYkNi50ZXN0KFEpP1E9US5yZXBsYWNlKEw2LCItJCYiKS50b0xvd2VyQ2FzZSgpOno9PT1udWxsJiYoej12b2lkIDApLEc9PT0ib25pbnB1dCImJnFbUT1HXSYmKFE9Im9uaW5wdXRDYXB0dXJlIikscVtRXT16fX1KPT0ic2VsZWN0IiYmKHEubXVsdGlwbGUmJkFycmF5LmlzQXJyYXkocS52YWx1ZSkmJihxLnZhbHVlPVowKFouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oTCl7TC5wcm9wcy5zZWxlY3RlZD1xLnZhbHVlLmluZGV4T2YoTC5wcm9wcy52YWx1ZSkhPS0xfSkpLHEuZGVmYXVsdFZhbHVlIT1udWxsJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS5tdWx0aXBsZT9xLmRlZmF1bHRWYWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMTpxLmRlZmF1bHRWYWx1ZT09TC5wcm9wcy52YWx1ZX0pKSksWi5jbGFzcyYmIVouY2xhc3NOYW1lPyhxLmNsYXNzPVouY2xhc3MsT2JqZWN0LmRlZmluZVByb3BlcnR5KHEsImNsYXNzTmFtZSIsRzYpKTpaLmNsYXNzTmFtZSYmKHEuY2xhc3M9cS5jbGFzc05hbWU9Wi5jbGFzc05hbWUpLFkucHJvcHM9cX0oWCksWC4kJHR5cGVvZj1RNixfNSYmXzUoWCl9O3ZhciBGNT1QLl9fcjtQLl9fcj1mdW5jdGlvbihYKXtGNSYmRjUoWCksdzU9WC5fX2N9O3ZhciBrNT1QLmRpZmZlZDtQLmRpZmZlZD1mdW5jdGlvbihYKXtrNSYmazUoWCk7dmFye3Byb3BzOlksX19lOlp9PVg7WiE9bnVsbCYmWC50eXBlPT09InRleHRhcmVhIiYmInZhbHVlImluIFkmJlkudmFsdWUhPT1aLnZhbHVlJiYoWi52YWx1ZT1ZLnZhbHVlPT1udWxsPyIiOlkudmFsdWUpLHc1PW51bGx9O3ZhciBWNj0wO2Z1bmN0aW9uICQoWCxZLFosSixxLEspe1l8fChZPXt9KTt2YXIgUSx6LEc9WTtpZigicmVmImluIEcpZm9yKHogaW4gRz17fSxZKXo9PSJyZWYiP1E9WVt6XTpHW3pdPVlbel07dmFyIEw9e3R5cGU6WCxwcm9wczpHLGtleTpaLHJlZjpRLF9fazpudWxsLF9fOm51bGwsX19iOjAsX19lOm51bGwsX19jOm51bGwsY29uc3RydWN0b3I6dm9pZCAwLF9fdjotLVY2LF9faTotMSxfX3U6MCxfX3NvdXJjZTpxLF9fc2VsZjpLfTtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFE9WC5kZWZhdWx0UHJvcHMpKWZvcih6IGluIFEpR1t6XT09PXZvaWQgMCYmKEdbel09UVt6XSk7cmV0dXJuIFAudm5vZGUmJlAudm5vZGUoTCksTH12YXIgTzQ9YHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyMCcgaGVpZ2h0PScyMCclM0UlM0NjaXJjbGUgY3g9JzEwJyBjeT0nMTAnIHI9JzknIGZpbGw9J3JnYmEoMjU1LDI1NSwyNTUsMC40KScgc3Ryb2tlPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNyknIHN0cm9rZS13aWR0aD0nMScvJTNFJTNDL3N2ZyUzRSIpIDEwIDEwLCBwb2ludGVyYCxINj0zLE82PTQsVTY9NTtmdW5jdGlvbiB4MCh7dXJsOlgsd3NVcmw6WSxzdHlsZTpaLGltYWdlU3R5bGU6SixjbGFzc05hbWU6cSxvbkhvbWVQcmVzczpLLG9uU3RyZWFtVG91Y2g6USxvblN0cmVhbU11bHRpVG91Y2g6eixvblN0cmVhbUJ1dHRvbjpHLHN1YnNjcmliZUZyYW1lOkwsc3RyZWFtRnJhbWU6RCxzdHJlYW1Db25maWc6VyxoaWRlQ29udHJvbHM6TyxvblN0cmVhbWluZ0NoYW5nZTpVLGNvbm5lY3Rpb25RdWFsaXR5Omt9KXtsZXQgXz0hIVEsQz13KG51bGwpLE09dyhudWxsKSxGPXcobnVsbCksW0UsSV09cCghMSksW3Yscl09cChudWxsKSxbZixpXT1wKG51bGwpLHk9dyhudWxsKSxbbSxjMF09cChudWxsKTtkKCgpPT57bGV0IFY9eS5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKE4pPT57bGV0IEE9TlswXT8uY29udGVudFJlY3Q7aWYoQSljMCh7d2lkdGg6QS53aWR0aCxoZWlnaHQ6QS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W0Q0LFA0XT1wKDApLFcwPXcoMCksW3A1LGwwXT1wKCExKSx0PXcobnVsbCk7ZCgoKT0+e2lmKGs9PT0icG9vciIpe2lmKGwwKCEwKSx0LmN1cnJlbnQpY2xlYXJUaW1lb3V0KHQuY3VycmVudCk7dC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntsMCghMSksdC5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYobDAoITEpLHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KSx0LmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KX19LFtrXSk7bGV0IGkwPWAke1h9L3N0cmVhbS5tanBlZ2AsQjQ9dyhVKTtCNC5jdXJyZW50PVUsZCgoKT0+e0I0LmN1cnJlbnQ/LihFKX0sW0VdKSxkKCgpPT57aWYoXyYmVylpKFcpfSxbXyxXXSk7bGV0IF80PXcoITEpO180LmN1cnJlbnQ9RTtsZXQgczA9dyhudWxsKTtkKCgpPT57aWYoIV98fCFMKXJldHVybjtyZXR1cm4gTCgoVik9PntXMC5jdXJyZW50Kys7bGV0IEg9TS5jdXJyZW50O2lmKEgpe2lmKHMwLmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTChzMC5jdXJyZW50KTtzMC5jdXJyZW50PVYsSC5zcmM9Vn1pZighXzQuY3VycmVudCljb25zb2xlLmxvZygiW3NlcnZlLXNpbV0gZmlyc3QgZnJhbWUgcmVjZWl2ZWQsIHJlbmRlcmluZyIpLEkoITApLHIobnVsbCl9KX0sW18sTF0pO2xldCBjPWooKFYpPT57aWYoXyl7UT8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1INixBLnNldChOLDEpLEguc2VuZChBKX0sW18sUV0pLG8wPWooKFYpPT57aWYoXyl7Rz8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoe2J1dHRvbjpWfSkpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1PNixBLnNldChOLDEpLEguc2VuZChBKX0sW18sR10pLG49aigoVik9PntpZihfKXt6Py4oVik7cmV0dXJufWxldCBIPUYuY3VycmVudDtpZighSHx8SC5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBOPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShWKSksQT1uZXcgVWludDhBcnJheSgxK04ubGVuZ3RoKTtBWzBdPVU2LEEuc2V0KE4sMSksSC5zZW5kKEEpfSxbXyx6XSk7ZCgoKT0+e2lmKF8pcmV0dXJuO2ZldGNoKGAke1h9L2NvbmZpZ2ApLnRoZW4oKEIpPT5CLmpzb24oKSkudGhlbigoQik9PntpZihCLndpZHRoPjAmJkIuaGVpZ2h0PjApaShCKX0pLmNhdGNoKCgpPT57fSk7bGV0IFY9WT8/WC5yZXBsYWNlKC9eaHR0cC8sIndzIikrIi93cyIsSD1uZXcgV2ViU29ja2V0KFYpO0guYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLEYuY3VycmVudD1ILEgub25vcGVuPSgpPT57SSghMCkscihudWxsKX0sSC5vbmNsb3NlPSgpPT57SSghMSl9LEgub25lcnJvcj0oKT0+e3IoIldlYlNvY2tldCBjb25uZWN0aW9uIGZhaWxlZCIpLEkoITEpfTtsZXQgTj1uZXcgQWJvcnRDb250cm9sbGVyLEE9c2V0SW50ZXJ2YWwoKCk9PntQNChXMC5jdXJyZW50KSxXMC5jdXJyZW50PTB9LDEwMDApO3JldHVybihhc3luYygpPT57dHJ5e2xldCBTPShhd2FpdCBmZXRjaChpMCx7c2lnbmFsOk4uc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFTKXJldHVybjtsZXQgaD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6bCx2YWx1ZTp1fT1hd2FpdCBTLnJlYWQoKTtpZihsKWJyZWFrO2lmKHUpZm9yKGxldCBlMD0wO2UwPD11Lmxlbmd0aC1oLmxlbmd0aDtlMCsrKXtsZXQgRTQ9ITA7Zm9yKGxldCBJMD0wO0kwPGgubGVuZ3RoO0kwKyspaWYodVtlMCtJMF0hPT1oW0kwXSl7RTQ9ITE7YnJlYWt9aWYoRTQpVzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntOLmFib3J0KCksY2xlYXJJbnRlcnZhbChBKSxILmNsb3NlKCksRi5jdXJyZW50PW51bGx9fSxbWCxpMCxfXSksZCgoKT0+e2lmKCFfKXJldHVybjtsZXQgVj1zZXRJbnRlcnZhbCgoKT0+e1A0KFcwLmN1cnJlbnQpLFcwLmN1cnJlbnQ9MH0sMTAwMCk7cmV0dXJuKCk9PmNsZWFySW50ZXJ2YWwoVil9LFtfXSk7bGV0IGU9aigoKT0+e3JldHVybiBfP00uY3VycmVudDpDLmN1cnJlbnR9LFtfXSksQjA9aigoVixIKT0+e2xldCBOPWUoKTtpZighTilyZXR1cm47bGV0IEE9Ti5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxCPShILmNsaWVudFgtQS5sZWZ0KS9BLndpZHRoLFM9KEguY2xpZW50WS1BLnRvcCkvQS5oZWlnaHQ7Yyh7dHlwZTpWLHg6Qix5OlN9KX0sW2NdKSxRMD0zLGE9dyghMSksbz13KCExKSx1MD13KCExKSxyMD13KHtkeDowLGR5OjB9KSxWMD13KCExKSxbdDAsRjRdPXAoITEpLGs0PXcoe3g6MC41LHk6MC41fSksW3EwLHNdPXAobnVsbCk7ZCgoKT0+e2xldCBWPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpRjQoITApfSxIPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpe2lmKEY0KCExKSwhby5jdXJyZW50KXMobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxkKCgpPT57aWYodDAmJiFvLmN1cnJlbnQpe2xldCBWPWs0LmN1cnJlbnQ7cyh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIXQwJiYhby5jdXJyZW50KXMobnVsbCl9LFt0MF0pO2xldCBfMD13KG51bGwpLG4wPXcoITEpLEgwPXcoMCksSTQ9aigoVixIKT0+e24wLmN1cnJlbnQ9ITA7bGV0IE49XzAuY3VycmVudDtpZihOKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLEgwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57Ti5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLE4uc3R5bGUudG9wPWAke0gqMTAwfSVgLE4uc3R5bGUuZGlzcGxheT0iYmxvY2sifSl9LFtdKSxNND1qKChWLEgpPT57aWYoIW4wLmN1cnJlbnQpcmV0dXJuO2xldCBOPV8wLmN1cnJlbnQ7aWYoTiljYW5jZWxBbmltYXRpb25GcmFtZShIMC5jdXJyZW50KSxIMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e04uc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxOLnN0eWxlLnRvcD1gJHtIKjEwMH0lYH0pfSxbXSksRjA9aigoKT0+e24wLmN1cnJlbnQ9ITE7bGV0IFY9XzAuY3VycmVudDtpZihWKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLFYuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFtdKSxDND13KDApLE8wPXcobnVsbCksdjU9aigoKT0+e2xldCBWPURhdGUubm93KCksSD1WLUM0LmN1cnJlbnQ7aWYoQzQuY3VycmVudD1WLEg8MzAwKXtpZihPMC5jdXJyZW50KWNsZWFyVGltZW91dChPMC5jdXJyZW50KSxPMC5jdXJyZW50PW51bGw7aWYoSylLKCk7ZWxzZSBvMCgiYXBwX3N3aXRjaGVyIil9ZWxzZSBPMC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntpZihLKUsoKTtlbHNlIG8wKCJob21lIik7TzAuY3VycmVudD1udWxsfSwzMDApfSxbbzAsS10pLGswPSgoKT0+e2lmKCFmfHwhbSlyZXR1cm4gbnVsbDtpZihtLndpZHRoPT09MHx8bS5oZWlnaHQ9PT0wKXJldHVybiBudWxsO2xldCBWPU1hdGgubWluKG0ud2lkdGgvZi53aWR0aCxtLmhlaWdodC9mLmhlaWdodCk7cmV0dXJue3dpZHRoOmYud2lkdGgqVixoZWlnaHQ6Zi5oZWlnaHQqVn19KSgpO3JldHVybiAkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixmbGV4OjEsLi4uTz97fTp7Ym9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LG92ZXJmbG93OiJoaWRkZW4iLG1pbldpZHRoOjAsbWluSGVpZ2h0OjAsLi4uWn0sY2xhc3NOYW1lOnEsY2hpbGRyZW46WyQoImRpdiIse3JlZjp5LHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxtaW5IZWlnaHQ6MCxtaW5XaWR0aDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LGNoaWxkcmVuOiQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLHdpZHRoOmswP2Ake2swLndpZHRofXB4YDoiMTAwJSIsaGVpZ2h0OmswP2Ake2swLmhlaWdodH1weGA6IjEwMCUifSxjaGlsZHJlbjpbJCgiaW1nIix7cmVmOkMsc3JjOl8/dm9pZCAwOmkwLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKWkoKE4pPT5OJiZOLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJk4uaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P046e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6Xz97ZGlzcGxheToibm9uZSJ9Ontwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSxfJiYkKCJpbWciLHtyZWY6TSxkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClpKChOKT0+TiYmTi53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZOLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9OOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSwkKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpPNCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsdTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cjAuY3VycmVudD17ZHg6MS1BLUEsZHk6MS1CLUJ9LHMoUyksbih7dHlwZToiYmVnaW4iLC4uLlN9KTtyZXR1cm59aWYoSTQoQSxCKSxCPjAuODgpYS5jdXJyZW50PSEwLGMoe3R5cGU6ImJlZ2luIix4OkEseTpCLGVkZ2U6UTB9KTtlbHNlIGEuY3VycmVudD0hMSxCMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKGs0LmN1cnJlbnQ9e3g6QSx5OkJ9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KXMoe3gxOkEseTE6Qix4MjoxLUEseTI6MS1CfSk7cmV0dXJufWlmKG8uY3VycmVudCl7bGV0IFM7aWYodTAuY3VycmVudCl7bGV0IGg9cjAuY3VycmVudDtTPXt4MTpBLHkxOkIseDI6QStoLmR4LHkyOkIraC5keX19ZWxzZSBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cyhTKSxuKHt0eXBlOiJtb3ZlIiwuLi5TfSk7cmV0dXJufWlmKE00KEEsQiksYS5jdXJyZW50KWMoe3R5cGU6Im1vdmUiLHg6QSx5OkIsZWRnZTpRMH0pO2Vsc2UgQjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1lKCk7aWYoSCl7bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxBPShWLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLEI9KFYuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYodTAuY3VycmVudCl7bGV0IFM9cjAuY3VycmVudDtuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjpBK1MuZHgseTI6QitTLmR5fSl9ZWxzZSBuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjoxLUEseTI6MS1CfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1CMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKG8uY3VycmVudCl7aWYocTApbih7dHlwZToiZW5kIiwuLi5xMH0pO28uY3VycmVudD0hMSxzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1pZihWLmJ1dHRvbnM+MClCMCgiZW5kIixWKTtzKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtGMCgpO2xldCBoPVYudG91Y2hlc1swXSxsPVYudG91Y2hlc1sxXSx1PXt4MTooaC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MTooaC5jbGllbnRZLU4udG9wKS9OLmhlaWdodCx4MjoobC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MjoobC5jbGllbnRZLU4udG9wKS9OLmhlaWdodH07aWYoIVYwLmN1cnJlbnQmJiFhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OnUueDEseTp1LnkxfSk7VjAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYS5jdXJyZW50PSExLHModSksbih7dHlwZToiYmVnaW4iLC4uLnV9KTtyZXR1cm59bGV0IEE9Vi50b3VjaGVzWzBdO2lmKCFBKXJldHVybjtsZXQgQj0oQS5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxTPShBLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKEk0KEIsUyksUz4wLjg4KWEuY3VycmVudD0hMCxjKHt0eXBlOiJiZWdpbiIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBhLmN1cnJlbnQ9ITEsYyh7dHlwZToiYmVnaW4iLHg6Qix5OlN9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgaD1WLnRvdWNoZXNbMF0sbD1WLnRvdWNoZXNbMV0sdT17eDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6KGwuY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTI6KGwuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHR9O3ModSksbih7dHlwZToibW92ZSIsLi4udX0pO3JldHVybn1sZXQgQT1WLnRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoTTQoQixTKSxhLmN1cnJlbnQpYyh7dHlwZToibW92ZSIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBjKHt0eXBlOiJtb3ZlIix4OkIseTpTfSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBoPVYuY2hhbmdlZFRvdWNoZXNbMF0sbD1xMDtpZihoJiZsKW4oe3R5cGU6ImVuZCIseDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6bC54Mix5MjpsLnkyfSk7ZWxzZSBpZihsKW4oe3R5cGU6ImVuZCIsLi4ubH0pO1YwLmN1cnJlbnQ9ITEsby5jdXJyZW50PSExLHMobnVsbCl9cmV0dXJufWxldCBBPVYuY2hhbmdlZFRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoRjAoKSxhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OkIseTpTLGVkZ2U6UTB9KSxhLmN1cnJlbnQ9ITE7ZWxzZSBjKHt0eXBlOiJlbmQiLHg6Qix5OlN9KX19KSwkKCJkaXYiLHtyZWY6XzAsImRhdGEtdGVzdGlkIjoidG91Y2gtaW5kaWNhdG9yIixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJub25lIix3aWR0aDoyNCxoZWlnaHQ6MjQsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoNTksMTMwLDI0NiwwLjUpIixib3hTaGFkb3c6IjAgMCA4cHggcmdiYSg1OSwxMzAsMjQ2LDAuMykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19KSxxMCYmJCh4LHtjaGlsZHJlbjpbJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDEscTAueTEpfSksJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDIscTAueTIpfSldfSksIUUmJiF2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNH0sY2hpbGRyZW46IkNvbm5lY3RpbmcuLi4ifSl9KSx2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZjQ0Iixmb250U2l6ZToxNCxwYWRkaW5nOjIwLHRleHRBbGlnbjoiY2VudGVyIn0sY2hpbGRyZW46dn0pfSkscDUmJiQoImRpdiIse3N0eWxlOkE2LGNoaWxkcmVuOiQoInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmYmJmMjQiLGZvbnRTaXplOjEzLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSJ9LGNoaWxkcmVuOiJTbG93IGNvbm5lY3Rpb24ifSl9KV19KX0pLCFPJiYkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNHB4IDhweCIsYm9yZGVyVG9wOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LGNoaWxkcmVuOlskKCJidXR0b24iLHtvbkNsaWNrOnY1LHN0eWxlOntiYWNrZ3JvdW5kOiJub25lIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMikiLGNvbG9yOiIjYWFhIixmb250U2l6ZToxMSxmb250RmFtaWx5OiJtb25vc3BhY2UiLHBhZGRpbmc6IjJweCAxMHB4IixjdXJzb3I6InBvaW50ZXIiLGJvcmRlclJhZGl1czo0fSxjaGlsZHJlbjoiSG9tZSJ9KSwkKCJzcGFuIix7c3R5bGU6e2NvbG9yOkQ0PjA/IiM0ZjQiOiIjODg4Iixmb250U2l6ZToxMixmb250RmFtaWx5OiJtb25vc3BhY2UiLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjZ9LGNoaWxkcmVuOltrJiYkKCJzcGFuIix7ImRhdGEtdGVzdGlkIjoicXVhbGl0eS1kb3QiLHN0eWxlOnt3aWR0aDo4LGhlaWdodDo4LGJvcmRlclJhZGl1czoiNTAlIixkaXNwbGF5OiJpbmxpbmUtYmxvY2siLGJhY2tncm91bmQ6az09PSJnb29kIj8iIzRhZGU4MCI6az09PSJkZWdyYWRlZCI/IiNmYWNjMTUiOiIjZWY0NDQ0In19KSxENCwiIGZwcyJdfSldfSldfSl9dmFyIEE2PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDo4LGxlZnQ6IjUwJSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKC01MCUpIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuNykiLGJvcmRlclJhZGl1czo2LHBhZGRpbmc6IjRweCAxMnB4Iixwb2ludGVyRXZlbnRzOiJub25lIn0sUzU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC44KSJ9LFQ1PTIwO2Z1bmN0aW9uIGI1KFgsWSl7cmV0dXJue3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDpgJHtYKjEwMH0lYCx0b3A6YCR7WSoxMDB9JWAsd2lkdGg6VDUsaGVpZ2h0OlQ1LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC43KSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX1mdW5jdGlvbiBkMChYKXtpZighWClyZXR1cm4iaXBob25lIjtsZXQgWT1YLnRvTG93ZXJDYXNlKCk7aWYoWS5pbmNsdWRlcygiaXBhZCIpKXJldHVybiJpcGFkIjtpZihZLmluY2x1ZGVzKCJ3YXRjaCIpKXJldHVybiJ3YXRjaCI7aWYoWS5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuInZpc2lvbiI7cmV0dXJuImlwaG9uZSJ9dmFyIFI9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LFU3PVIuaXBob25lLndpZHRoLEE3PVIuaXBob25lLmhlaWdodCxENz1SLmlwaG9uZS5iZXplbFgsUDc9Ui5pcGhvbmUuYmV6ZWxZLEI3PVIuaXBob25lLmlubmVyUmFkaXVzO2Z1bmN0aW9uIFU0KFg9ImlwaG9uZSIpe2xldCBZPVJbWF07cmV0dXJue3RvcDpgJHtZLmJlemVsWS9ZLmhlaWdodCoxMDB9JWAsbGVmdDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxyaWdodDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxib3R0b206YCR7WS5iZXplbFkvWS5oZWlnaHQqMTAwfSVgfX1mdW5jdGlvbiBtMChYPSJpcGhvbmUiKXtsZXQgWT1SW1hdLFo9WS53aWR0aC0yKlkuYmV6ZWxYLEo9WS5oZWlnaHQtMipZLmJlemVsWTtyZXR1cm5gJHtZLmlubmVyUmFkaXVzL1oqMTAwfSUgLyAke1kuaW5uZXJSYWRpdXMvSioxMDB9JWB9ZnVuY3Rpb24gaDAoe3R5cGU6WD0iaXBob25lIixzdHJlYW1pbmc6WT0hMX0pe3N3aXRjaChYKXtjYXNlImlwYWQiOnJldHVybiAkKEI2LHtzdHJlYW1pbmc6WX0pO2Nhc2Uid2F0Y2giOnJldHVybiAkKF82LHtzdHJlYW1pbmc6WX0pO2Nhc2UidmlzaW9uIjpyZXR1cm4gJChGNix7c3RyZWFtaW5nOll9KTtkZWZhdWx0OnJldHVybiAkKFA2LHtzdHJlYW1pbmc6WX0pfX1mdW5jdGlvbiBQNih7c3RyZWFtaW5nOlg9ITF9KXtyZXR1cm4gJCgic3ZnIix7dmlld0JveDoiMCAwIDQyNyA4ODEiLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjAiLHg6Ii0wLjE2Njk5MiIseToiMC4xNjY1MDQiLHdpZHRoOiI0MjciLGhlaWdodDoiODgwLjY2NyIsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiZWZmZWN0MV9mb3JlZ3JvdW5kQmx1ciJ9KV19KSwkKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjEiLHg6IjYuMzMyMzYiLHk6IjYuMzMzODIiLHdpZHRoOiI0MTQiLGhlaWdodDoiODY4IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuMzMzMzMzIixyZXN1bHQ6ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXIifSldfSldfSksJCgicmVjdCIse3g6IjMuODMyNjgiLHk6IjMuODMzNjYiLHdpZHRoOiI0MTkiLGhlaWdodDoiODczIixyeDoiNjYuMTY2NyIsc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiNC4zMzMzMyJ9KSwkKCJyZWN0Iix7eDoiMC44MzMzMzMiLHk6IjAuODMzMzMzIix3aWR0aDoiNDI1IixoZWlnaHQ6Ijg3OSIscng6IjY5LjE2NjciLHN0cm9rZToiIzM3MzczYSIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI2Nocm9tZS1maWx0ZXIwKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjEuNjY2MDIiLHk6IjIiLHdpZHRoOiI0MjMuMzMzIixoZWlnaHQ6Ijg3NyIscng6IjY4LjY2NjciLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjY2hyb21lLWZpbHRlcjEpIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiNy4zMzI2OCIseToiNy4zMzM2NiIsd2lkdGg6IjQxMiIsaGVpZ2h0OiI4NjYiLHJ4OiI2Mi42NjY3IixzdHJva2U6IiM2NDY0NjQiLHN0cm9rZVdpZHRoOiIwLjY2NjY2NyJ9KX0pLCQoInJlY3QiLHt4OiIxNTEuNjY2Iix5OiIzMS42NjciLHdpZHRoOiIxMjMuMzMzIixoZWlnaHQ6IjM2IixyeDoiMTgiLGZpbGw6ImJsYWNrIixzdHlsZTp7b3BhY2l0eTpYPzA6MSx0cmFuc2l0aW9uOiJvcGFjaXR5IDAuM3MgZWFzZSJ9fSldfSl9ZnVuY3Rpb24gQjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui5pcGFkLndpZHRoLFo9Ui5pcGFkLmhlaWdodCxKPTMwLHE9MjY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiaXBhZC1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJpcGFkLWdsb3cxIix4OiI1Iix5OiI1Iix3aWR0aDpZLTEwLGhlaWdodDpaLTEwLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46WyQoImZlRmxvb2QiLHtmbG9vZE9wYWNpdHk6IjAiLHJlc3VsdDoiQmFja2dyb3VuZEltYWdlRml4In0pLCQoImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluOiJTb3VyY2VHcmFwaGljIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJzaGFwZSJ9KSwkKCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC4zMzMzMzMiLHJlc3VsdDoiYmx1ciJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMy41Iix5OiIzLjUiLHdpZHRoOlktNyxoZWlnaHQ6Wi03LHJ4OjI2LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjQifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDozMCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mjksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MSkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiI2Iix5OiI2Iix3aWR0aDpZLTEyLGhlaWdodDpaLTEyLHJ4OjI0LHN0cm9rZToiIzY0NjQ2NCIsc3Ryb2tlV2lkdGg6IjAuNjY2In0pfSksJCgiY2lyY2xlIix7Y3g6WS8yLGN5OlIuaXBhZC5iZXplbFkvMisxLHI6IjMiLGZpbGw6IiMxYTFhMWEiLHN0eWxlOntvcGFjaXR5Olg/MDowLjgsdHJhbnNpdGlvbjoib3BhY2l0eSAwLjNzIGVhc2UifX0pLCQoInJlY3QiLHt4OihZLTEyMCkvMix5OlotUi5pcGFkLmJlemVsWS8yLTIuNSx3aWR0aDoiMTIwIixoZWlnaHQ6IjUiLHJ4OiIyLjUiLGZpbGw6IndoaXRlIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zNSxtaXhCbGVuZE1vZGU6ImRpZmZlcmVuY2UiLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX1mdW5jdGlvbiBfNih7c3RyZWFtaW5nOlg9ITF9KXtsZXQgWT1SLndhdGNoLndpZHRoLFo9Ui53YXRjaC5oZWlnaHQsSj04OCxxPTgyLEs9OCxRPTM2LHo9Wi8yLTE4LTE2LEc9MjIsTD1aLzItMTErMTY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixvdmVyZmxvdzoidmlzaWJsZSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjokKCJmaWx0ZXIiLHtpZDoid2F0Y2gtZ2xvdzAiLHg6IjAiLHk6IjAiLHdpZHRoOlkrMTIsaGVpZ2h0OlosZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiYmx1ciJ9KV19KX0pLCQoInJlY3QiLHt4OlktMix5Onosd2lkdGg6OCxoZWlnaHQ6MzYscng6IjMiLGZpbGw6IiMyYTJhMmMiLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEifSksJCgicmVjdCIse3g6WS0xLHk6TCx3aWR0aDo2LGhlaWdodDoyMixyeDoiMi41IixmaWxsOiIjMmEyYTJjIixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIwLjgifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDo4MixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzLjUifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDo4OCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjd2F0Y2gtZ2xvdzApIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiMS41Iix5OiIxLjUiLHdpZHRoOlktMyxoZWlnaHQ6Wi0zLHJ4Ojg3LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2In0pfSldfSl9ZnVuY3Rpb24gRjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui52aXNpb24ud2lkdGgsWj1SLnZpc2lvbi5oZWlnaHQsSj00MCxxPTM0O3JldHVybiAkKCJzdmciLHt2aWV3Qm94OmAwIDAgJHtZfSAke1p9YCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjpbJCgiZmlsdGVyIix7aWQ6InZpc2lvbi1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJ2aXNpb24tZ2xvdzEiLHg6IjUiLHk6IjUiLHdpZHRoOlktMTAsaGVpZ2h0OlotMTAsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjMzMyIscmVzdWx0OiJibHVyIn0pXX0pLCQoImxpbmVhckdyYWRpZW50Iix7aWQ6InZpc2lvbi1nbGFzcyIseDE6IjAiLHkxOiIwIix4MjoiMCIseTI6IjEiLGNoaWxkcmVuOlskKCJzdG9wIix7b2Zmc2V0OiIwJSIsc3RvcENvbG9yOiIjNTU1NTU4IixzdG9wT3BhY2l0eToiMC4zIn0pLCQoInN0b3AiLHtvZmZzZXQ6IjEwMCUiLHN0b3BDb2xvcjoiIzNhM2EzZCIsc3RvcE9wYWNpdHk6IjAuMSJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixyeDo0MCxmaWxsOiJ1cmwoI3Zpc2lvbi1nbGFzcykifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDozNCxzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzIn0pLCQoInJlY3QiLHt4OiIwLjgzMyIseToiMC44MzMiLHdpZHRoOlktMS42NjYsaGVpZ2h0OlotMS42NjYscng6NDAsc3Ryb2tlOiIjMzczNzNhIixzdHJva2VXaWR0aDoiMS42NjYifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI3Zpc2lvbi1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mzksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjdmlzaW9uLWdsb3cxKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjYiLHk6IjYiLHdpZHRoOlktMTIsaGVpZ2h0OlotMTIscng6MzIsc3Ryb2tlOiIjNjQ2NDY0IixzdHJva2VXaWR0aDoiMC42NjYifSl9KSwkKCJlbGxpcHNlIix7Y3g6WS8yLGN5OlovMixyeDpZLzItMzAscnk6Wi8yLTI0LHN0cm9rZToiIzRhNGE0ZCIsc3Ryb2tlV2lkdGg6IjAuNSIsb3BhY2l0eToiMC4zIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX12YXIgQTQ9ejAobnVsbCk7ZnVuY3Rpb24gZjAoWCl7bGV0IFk9UDAoQTQpO2lmKCFZKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWX12YXIgTTY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBDNih7ZXhlYzpYLGRldmljZVVkaWQ6WSxkZXZpY2VOYW1lOlosZGV2aWNlUnVudGltZTpKLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOks9ITEsY2hpbGRyZW46USxzdHlsZTp6LC4uLkd9KXtsZXQgTD1kMChaKSxXPXtleGVjOlgsZGV2aWNlVWRpZDpZLGRldmljZU5hbWU6WixkZXZpY2VSdW50aW1lOkosZGV2aWNlVHlwZTpMLHN0cmVhbWluZzpxLGRpc2FibGVkOkt8fCFZfHwhcX07cmV0dXJuICQoQTQuUHJvdmlkZXIse3ZhbHVlOlcsY2hpbGRyZW46JCgiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi5NNiwuLi56fSwuLi5HLGNoaWxkcmVuOlF9KX0pfXZhciBFNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sdzY9RzAoZnVuY3Rpb24oe25hbWU6WSxzdWJ0aXRsZTpaLGhpZGVDaGV2cm9uOkosc3R5bGU6cSxvbk1vdXNlRW50ZXI6Syxvbk1vdXNlTGVhdmU6USwuLi56fSxHKXtsZXQgTD1mMCgiVGl0bGUiKSxbRCxXXT1wKCExKSxPPVk/P0wuZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsVT1aPz8oTC5kZXZpY2VSdW50aW1lP0wuZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooayk9PntXKCEwKSxLPy4oayl9LG9uTW91c2VMZWF2ZTooayk9PntXKCExKSxRPy4oayl9LHN0eWxlOnsuLi5FNixiYWNrZ3JvdW5kOkQ/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi56LGNoaWxkcmVuOlskKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W08sIUomJiQoInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46JCgicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksJCgic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46VX0pXX0pfSksUzY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBUNih7c3R5bGU6WCwuLi5ZfSl7cmV0dXJuICQoImRpdiIse3N0eWxlOnsuLi5TNiwuLi5YfSwuLi5ZfSl9dmFyIGI2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LGEwPUcwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlksc3R5bGU6WixkaXNhYmxlZDpKLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpLLGNoaWxkcmVuOlEsLi4uen0sRyl7bGV0IEw9UDAoQTQpLEQ9Snx8WXx8TD8uZGlzYWJsZWQsW1csT109cCghMSk7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6RCxvbk1vdXNlRW50ZXI6KFUpPT57TyghMCkscT8uKFUpfSxvbk1vdXNlTGVhdmU6KFUpPT57TyghMSksSz8uKFUpfSxzdHlsZTp7Li4uYjYsY29sb3I6RD8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDpXJiYhRD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpEPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLlp9LC4uLnosY2hpbGRyZW46UX0pfSk7ZnVuY3Rpb24gcDYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFkpPT5gLWUgJyR7WX0nYCkucmVkdWNlKChZLFopPT5gJHtZfSAke1p9YCwib3Nhc2NyaXB0Iil9dmFyIHY2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOiQoInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxqNj0kKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbJCgicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLCQoImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLFI2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46JCgicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSkseTY9RzAoZnVuY3Rpb24oe29uQ2xpY2s6WSwuLi5afSxKKXtsZXQgcT1mMCgiSG9tZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMocDYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5aLGNoaWxkcmVuOnY2fSl9KSxnNj1HMChmdW5jdGlvbih7b25DbGljazpZLC4uLlp9LEope2xldCBxPWYwKCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuICQoYTAse3JlZjpKLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooSyk9PntpZihZPy4oSyksSy5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLlosY2hpbGRyZW46ajZ9KX0pLHg2PUcwKGZ1bmN0aW9uKHtvbkNsaWNrOlksLi4uWn0sSil7bGV0IHE9ZjAoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5aLGNoaWxkcmVuOlI2fSl9KSwkMD1DNjskMC5UaXRsZT13NjskMC5BY3Rpb25zPVQ2OyQwLkJ1dHRvbj1hMDskMC5Ib21lQnV0dG9uPXk2OyQwLlNjcmVlbnNob3RCdXR0b249ZzY7JDAuUm90YXRlQnV0dG9uPXg2O2Z1bmN0aW9uIGQ2KFgpe2xldFtZLFpdPXAobnVsbCksSj13KG5ldyBTZXQpLFtxLEtdPXAobnVsbCksUT1qKCh6KT0+e3JldHVybiBKLmN1cnJlbnQuYWRkKHopLCgpPT57Si5jdXJyZW50LmRlbGV0ZSh6KX19LFtdKTtyZXR1cm4gZCgoKT0+e2lmKCFYKXJldHVybjtsZXQgej1uZXcgQWJvcnRDb250cm9sbGVyLEc9WC5yZXBsYWNlKC9cL3N0cmVhbVwubWpwZWckLywiIik7cmV0dXJuIGZldGNoKGAke0d9L2NvbmZpZ2Ase3NpZ25hbDp6LnNpZ25hbH0pLnRoZW4oKEwpPT5MLmpzb24oKSkudGhlbigoTCk9PntpZihMLndpZHRoPjAmJkwuaGVpZ2h0PjApWihMKX0pLmNhdGNoKCgpPT57fSksKGFzeW5jKCk9Pnt0cnl7bGV0IEQ9KGF3YWl0IGZldGNoKFgse3NpZ25hbDp6LnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighRClyZXR1cm47bGV0IFc9bmV3IFVpbnQ4QXJyYXkoMCk7d2hpbGUoITApe2xldHtkb25lOk8sdmFsdWU6VX09YXdhaXQgRC5yZWFkKCk7aWYoTylicmVhaztsZXQgaz1uZXcgVWludDhBcnJheShXLmxlbmd0aCtVLmxlbmd0aCk7ay5zZXQoVyksay5zZXQoVSxXLmxlbmd0aCksVz1rO3doaWxlKCEwKXtsZXQgXz0tMTtmb3IobGV0IEk9MDtJPFcubGVuZ3RoLTE7SSsrKWlmKFdbSV09PT0yNTUmJldbSSsxXT09PTIxNil7Xz1JO2JyZWFrfWlmKF89PT0tMSlicmVhaztsZXQgQz0tMTtmb3IobGV0IEk9XysyO0k8Vy5sZW5ndGgtMTtJKyspaWYoV1tJXT09PTI1NSYmV1tJKzFdPT09MjE3KXtDPUkrMjticmVha31pZihDPT09LTEpYnJlYWs7bGV0IE09Vy5zbGljZShfLEMpO1c9Vy5zbGljZShDKTtsZXQgRj1uZXcgQmxvYihbTV0se3R5cGU6ImltYWdlL2pwZWcifSksRT1VUkwuY3JlYXRlT2JqZWN0VVJMKEYpO0soRSk7Zm9yKGxldCBJIG9mIEouY3VycmVudClJKEUpfX19Y2F0Y2h7fX0pKCksKCk9PnouYWJvcnQoKX0sW1hdKSx7c3Vic2NyaWJlRnJhbWU6USxmcmFtZTpxLGNvbmZpZzpZfX1mdW5jdGlvbiBtNigpe2xldCBYPXdpbmRvdy5fX1NJTV9QUkVWSUVXX18sW1ksWl09cCghMSk7aWYoZCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBPPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksVT1uZXcgTWFwLGs9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBfKEYpe2xldCBFPVUuZ2V0KEYpO2lmKCFFKXtsZXQgST0wO2ZvcihsZXQgdj0wO3Y8Ri5sZW5ndGg7disrKUk9KEk8PDUpLUkrRi5jaGFyQ29kZUF0KHYpfDA7RT1rW01hdGguYWJzKEkpJWsubGVuZ3RoXSxVLnNldChGLEUpfXJldHVybiBFfWxldCBDPSIiLE09ITE7cmV0dXJuIE8ub25tZXNzYWdlPShGKT0+e3RyeXtsZXQgRT1KU09OLnBhcnNlKEYuZGF0YSksST1FLnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P0Uuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIix2PUUuc3Vic3lzdGVtPz8iIixyPUUuY2F0ZWdvcnk/PyIiLGY9RS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFmKXJldHVybjtpZihJIT09Qyl7aWYoTSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IGMwPV8oSSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke0l9JHt2P2AgJWMke3Z9JHtyPyI6IityOiIifWA6IiJ9YCxgY29sb3I6JHtjMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4udj9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLE09ITAsQz1JfWxldCBpPShFLm1lc3NhZ2VUeXBlPz8iIikudG9Mb3dlckNhc2UoKSx5PXYmJkk9PT1DP2AlYyR7cnx8dn0lYyBgOiIiLG09eT9bImNvbG9yOiM4ODg7Zm9udC1zdHlsZTppdGFsaWMiLCJjb2xvcjppbmhlcml0Il06W107aWYoaT09PSJmYXVsdCJ8fGk9PT0iZXJyb3IiKWNvbnNvbGUubG9nKGAke3l9JWMke2Z9YCwuLi5tLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihpPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt5fSVjJHtmfWAsLi4ubSwiY29sb3I6IzYyNzJhNCIpO2Vsc2UgY29uc29sZS5sb2coYCR7eX0lYyR7Zn1gLC4uLm0sImNvbG9yOmluaGVyaXQiKX1jYXRjaHt9fSwoKT0+e2lmKE0pY29uc29sZS5ncm91cEVuZCgpO08uY2xvc2UoKX19LFtYPy5sb2dzRW5kcG9pbnRdKSwhWClyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjokKCJkaXYiLHtzdHlsZTpKMC5lbXB0eSxjaGlsZHJlbjpbJCgiaDEiLHtzdHlsZTpKMC5lbXB0eVRpdGxlLGNoaWxkcmVuOiJObyBzZXJ2ZS1zaW0gc3RyZWFtIHJ1bm5pbmcifSksJCgicCIse3N0eWxlOkowLmVtcHR5SGludCxjaGlsZHJlbjpbIkJvb3QgYW4gaU9TIHNpbXVsYXRvciBhbmQgc3RhcnQgYSBIYXRjaCBzdHJlYW0gd2l0aCIsIiAiLCQoImNvZGUiLHtzdHlsZTpKMC5jb2RlLGNoaWxkcmVuOiJidW54IHNlcnZlLXNpbSAtLWRldGFjaCJ9KSwiLCB0aGVuIHJlbG9hZC4iXX0pXX0pfSk7bGV0IEo9Ui5pcGhvbmUscT1VNCgiaXBob25lIiksSz1tMCgiaXBob25lIiksUT1kNihYLnN0cmVhbVVybCksej13KG51bGwpO2QoKCk9PntsZXQgTz1uZXcgV2ViU29ja2V0KFgud3NVcmwpO3JldHVybiBPLmJpbmFyeVR5cGU9ImFycmF5YnVmZmVyIix6LmN1cnJlbnQ9TywoKT0+e08uY2xvc2UoKSx6LmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IEc9aigoTyxVKT0+e2xldCBrPXouY3VycmVudDtpZigha3x8ay5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBfPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShVKSksQz1uZXcgVWludDhBcnJheSgxK18ubGVuZ3RoKTtDWzBdPU8sQy5zZXQoXywxKSxrLnNlbmQoQyl9LFtdKSxMPWooKE8pPT5HKDMsTyksW0ddKSxEPWooKE8pPT5HKDUsTyksW0ddKSxXPWooKE8pPT5HKDQse2J1dHRvbjpPfSksW0ddKTtyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjpbJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbWF4V2lkdGg6MzIwLHdpZHRoOiIxMDAlIixhc3BlY3RSYXRpbzpgJHtKLndpZHRofSAvICR7Si5oZWlnaHR9YH0sY2hpbGRyZW46WyQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLnF9LGNoaWxkcmVuOiQoeDAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOkssY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOlosb25TdHJlYW1Ub3VjaDpMLG9uU3RyZWFtTXVsdGlUb3VjaDpELG9uU3RyZWFtQnV0dG9uOlcsc3Vic2NyaWJlRnJhbWU6US5zdWJzY3JpYmVGcmFtZSxzdHJlYW1GcmFtZTpRLmZyYW1lLHN0cmVhbUNvbmZpZzpRLmNvbmZpZ30pfSksJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxwb2ludGVyRXZlbnRzOiJub25lIix6SW5kZXg6MTB9LGNoaWxkcmVuOiQoaDAse3R5cGU6ImlwaG9uZSIsc3RyZWFtaW5nOll9KX0pXX0pLCQoImRpdiIse3N0eWxlOkowLmJhcixjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6ey4uLkowLmxpdmUsY29sb3I6WT8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbJCgic3BhbiIse3N0eWxlOnsuLi5KMC5kb3QsYmFja2dyb3VuZDpZPyIjNGFkZTgwIjoiIzY2NiJ9fSksWT8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIEowPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX07SDUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJvb3QiKSkucmVuZGVyKCQobTYse30pKTsKPC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+","base64").toString("utf-8");return $}function y(U){let B=(U?.basePath??"/.sim").replace(/\/+$/,"");return(G,z,w)=>{let M=G.url??"";if(M===B||M===B+"/"){let V=Z()[0]??null,K=D();if(V){let X=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...V,logsEndpoint:B+"/logs"})}</script>`;K=K.replace("<!--__SIM_PREVIEW_CONFIG__-->",X)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(K);return}if(M===B+"/api"){let Q=Z();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(Q[0]||null));return}if(M===B+"/logs"||M.startsWith(B+"/logs?")){let Q=Z();if(Q.length===0){z.writeHead(404),z.end("No serve-sim device");return}let V=Q[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
|
|
2
|
+
import{readdirSync as y,readFileSync as x,existsSync as E}from"fs";import{spawn as U,exec as g,execFile as N}from"child_process";import{tmpdir as k}from"os";import{join as j}from"path";var B=j(k(),"serve-sim"),R=new Set(["host.exp.Exponent","dev.expo.Exponent"]),q=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],_=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;function I($){return!_.test($)}function v($,C){if(R.has(C))return Promise.resolve(!0);return new Promise((J)=>{N("xcrun",["simctl","get_app_container",$,C,"app"],{timeout:2000},(z,K)=>{if(z)return J(!1);let X=K.trim();if(!X)return J(!1);for(let W of q)if(E(j(X,W)))return J(!0);J(!1)})})}function O(){let $;try{$=y(B).filter((J)=>J.startsWith("server-")&&J.endsWith(".json"))}catch{return[]}let C=[];for(let J of $)try{let z=JSON.parse(x(j(B,J),"utf-8"));try{process.kill(z.pid,0),C.push(z)}catch{}}catch{}return C}var P=null;function p(){if(!P)P=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixSNCx4NSxQMCxUNCxqNCx2NCxLNCxtMCxUMCx5NCxONCwkNCx6NCxwNCxmMD17fSxhMD1bXSxoNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gRzQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZDAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBkMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK1I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGQoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gYyhYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBtNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLFY0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLG00KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJmc0KFEpfX1mdW5jdGlvbiBnNChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSksZzQoWCl9ZnVuY3Rpb24gVzQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxUNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoVDQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fGo0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHY0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsbTUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIHg0KFgsWixKLFkscSxRLEssVyxHLHosUCl7dmFyICQsXyxPLEMsQSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1kNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShPPUouX19rWyRdKSE9bnVsbCYmKF89Ty5fX2khPS0xJiZNW08uX19pXXx8ZjAsTy5fX2k9JCxrPVY0KFgsTyxfLHEsUSxLLFcsRyx6LFApLEM9Ty5fX2UsTy5yZWYmJl8ucmVmIT1PLnJlZiYmKF8ucmVmJiZINChfLnJlZixudWxsLE8pLFAucHVzaChPLnJlZixPLl9fY3x8QyxPKSksQT09bnVsbCYmQyE9bnVsbCYmKEE9QyksKEk9ISEoNCZPLl9fdSkpfHxfLl9faz09PU8uX19rPyhHPWg0KE8sRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBPLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLE8uX191Jj0tNyk7cmV0dXJuIEouX19lPUEsR31mdW5jdGlvbiBkNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosUD1KLmxlbmd0aCwkPVAsXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWQwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1kMChkLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWQwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWY1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+UD9fLS06cTxQJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8UDtRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksZjQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gaDQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPWg0KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGY1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxQPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8UCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihQPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBiNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGg1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8YjQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8YjQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UoeTQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1ONCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUzQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1ONCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIFY0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBQLCQsXyxPLEMsQSxrLEksTSxoLEUsbixRMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChQPUIuX19iKSYmUChaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KFA9cy5jb250ZXh0VHlwZSkmJllbUC5fX2NdLEU9UD9oP2gucHJvcHMudmFsdWU6UC5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgYyhJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1sNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLE89JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1PJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKE8sQyxBKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLG49Qi5fX3IsUTA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrUTA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKEE9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShPLEMpKSxnPVAhPW51bGwmJlAudHlwZT09PWQmJlAua2V5PT1udWxsP2Q0KFAucHJvcHMuY2hpbGRyZW4pOlAsVz14NChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspRzQoUVtLMF0pO0w0KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxMNChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWE1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKFA9Qi5kaWZmZWQpJiZQKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBMNChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKEw0KSl9ZnVuY3Rpb24gbTQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKUg0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGE1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixQLCQsXyxPLEMsQSxrPUoucHJvcHN8fGYwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoTz1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBPPT0hIU0mJihNP08ubG9jYWxOYW1lPT1NOk8ubm9kZVR5cGU9PTMpKXtYPU8sUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhPPVguYXR0cmlidXRlc1t6XSkubmFtZV09Ty52YWx1ZTtmb3IoeiBpbiBrKU89a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9Tzp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsTyxxKTtmb3IoeiBpbiBJKU89SVt6XSx6PT0iY2hpbGRyZW4iP189Tzp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP1A9Tzp6PT0idmFsdWUiP0M9Tzp6PT0iY2hlY2tlZCI/QT1POlcmJnR5cGVvZiBPIT0iZnVuY3Rpb24ifHxrW3pdPT09T3x8aDAoWCx6LE8sa1t6XSxxKTtpZihQKVd8fCQmJihQLl9faHRtbD09JC5fX2h0bWx8fFAuX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1QLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLHg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylHNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLEEhPW51bGwmJkEhPVhbel0mJmgwKFgseixBLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIEg0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGY0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8SDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZmNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8RzQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGw1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLFY0KFosWD0oIVkmJkp8fFopLl9faz1XMChkLG51bGwsW1hdKSxxfHxmMCxmMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxtNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLFc0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrcDQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LFI0PTAseDU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGMucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUucmVuZGVyPWQsUDA9W10sajQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHY0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLEs0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrSzQsVDA9Il9fYSIrSzQseTQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksTjQ9MCwkND1TNCghMSksejQ9UzQoITApLHA0PTA7dmFyIEYwLHAsUDQsYTQsUzA9MCx0ND1bXSxmPUIsbDQ9Zi5fX2IsYzQ9Zi5fX3IsaTQ9Zi5kaWZmZWQsdTQ9Zi5fX2MsbzQ9Zi51bm1vdW50LHM0PWYuX187ZnVuY3Rpb24gbzAoWCxaKXtmLl9faCYmZi5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsTzQoZTQsWCl9ZnVuY3Rpb24gTzQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOmU0KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgUD1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKFAuZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIFAuc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIE89Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxPIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgUD1RO1E9dm9pZCAwLHEoVyxHLHopLFE9UH1LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFmLl9fcyYmbjQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gbjQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiBjNSgpe2Zvcih2YXIgWDtYPXQ0LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZi5fX2UoSixYLl9fdil9fX1mLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsbDQmJmw0KFgpfSxmLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSksczQmJnM0KFgsWil9LGYuX19yPWZ1bmN0aW9uKFgpe2M0JiZjNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKFA0PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W10sRjA9MCkpLFA0PXB9LGYuZGlmZmVkPWZ1bmN0aW9uKFgpe2k0JiZpNChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJih0NC5wdXNoKFopIT09MSYmYTQ9PT1mLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChhND1mLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGk1KShjNSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLFA0PXA9bnVsbH0sZi5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8QTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGYuX19lKFksSi5fX3YpfX0pLHU0JiZ1NChYLFopfSxmLnVubW91bnQ9ZnVuY3Rpb24oWCl7bzQmJm80KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmYuX19lKFosSi5fX3YpKX07dmFyIHI0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gaTUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSxyNCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3I0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBBNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gbjQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIGU1KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFg1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KFo1LnByb3RvdHlwZT1uZXcgYykuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsWjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBYNSh0aGlzLnByb3BzLFgpfHxYNSh0aGlzLnN0YXRlLFopfTt2YXIgSjU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLEo1JiZKNShYKX07dmFyIFg2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9WDYoWCxaLEosWSl9O3ZhciBZNT1CLnVubW91bnQ7ZnVuY3Rpb24gVzUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1lNSh7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gVzUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBMNShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIFU0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIE41KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxZNSYmWTUoWCl9LChVNC5wcm90b3R5cGU9bmV3IGMpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPU41KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TDUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgUDtmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtQPVkuby5wb3AoKTspUC5fX1A9VyxQLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxVNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LFU0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPVc1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGQsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChkLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIHE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBjKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPU41KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxxNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtxNShYLEosWil9KX07dmFyIFo2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLEo2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxZNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLHE2PS9bQS1aMC05XS9nLFE2PXR5cGVvZiBkb2N1bWVudDwidSIsSzY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBHNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1jLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBRNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIFE1JiYoWD1RNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIFY1LCQ2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSxLNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHxRNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fEs2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpZNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJko2LnRlc3QoSyk/Sz1LLnJlcGxhY2UocTYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIiwkNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVo2LEs1JiZLNShYKX07dmFyICQ1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpeyQ1JiYkNShYKSxWNT1YLl9fY307dmFyIHo1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksVjU9bnVsbH07ZnVuY3Rpb24gSDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIFA1KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7RzUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe0g1KFgpfX19ZnVuY3Rpb24gTTUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gQTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oTzUucHJvdG90eXBlPW5ldyBjKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxPNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIEE1KHRoaXMucHJvcHMsWCl8fEE1KHRoaXMuc3RhdGUsWil9O3ZhciBVNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksVTUmJlU1KFgpfTt2YXIgejY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1NNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9ejYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgVzY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1XNihYLFosSixZKX07dmFyIEI1PUIudW5tb3VudDtmdW5jdGlvbiBDNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPU01KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBDNShZLFosSil9KSksWH1mdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIEU1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gXzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gdzUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLEI1JiZCNShYKX0sKF80LnByb3RvdHlwZT1uZXcgYykuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9dzUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT1FNSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBQO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO1A9WS5vLnBvcCgpOylQLl9fUD1XLFAuZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LF80LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sXzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09QzUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGQsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgXzU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGMpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9dzUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLF81KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope181KFgsSixaKX0pfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsTjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEc2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sVjY9L1tBLVowLTldL2csSDY9dHlwZW9mIGRvY3VtZW50PCJ1IixQNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2MucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEY1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRjUmJihYPUY1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgVDUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEQ1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fEg2JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8UDYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkc2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmTjYudGVzdChLKT9LPUsucmVwbGFjZShWNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9TDYsRDUmJkQ1KFgpfTt2YXIgazU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7azUmJms1KFgpLFQ1PVguX19jfTt2YXIgSTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7STUmJkk1KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxUNT1udWxsfTt2YXIgTzY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1PNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEY0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsVTY9MyxCNj00LF82PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOlAsc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6Tyxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IEE9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtuLFEwXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixPMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFU9TFswXT8uY29udGVudFJlY3Q7aWYoVSlPMCh7d2lkdGg6VS53aWR0aCxoZWlnaHQ6VS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoTyk7di5jdXJyZW50PU8seCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihBJiYkKUswKCQpfSxbQSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IGk9dyhudWxsKTt4KCgpPT57aWYoIUF8fCF6KXJldHVybjtyZXR1cm4geigoVik9PntHMC5jdXJyZW50KyssZS5jdXJyZW50PURhdGUubm93KCk7bGV0IEg9SS5jdXJyZW50O2lmKEgpe2lmKGkuY3VycmVudClVUkwucmV2b2tlT2JqZWN0VVJMKGkuY3VycmVudCk7aS5jdXJyZW50PVYsSC5zcmM9Vn1pZighVC5jdXJyZW50KUUoITApLFEwKG51bGwpfSl9LFtBLHpdKTtsZXQgbT1qKChWKT0+e2lmKEEpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09VTYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEtdKSxaMD1qKChWKT0+e2lmKEEpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09QjYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEddKSx5PWooKFYpPT57aWYoQSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFU9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7VVswXT1fNixVLnNldChMLDEpLEguc2VuZChVKX0sW0EsV10pO3goKCk9PntpZihBKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChEKT0+RC5qc29uKCkpLnRoZW4oKEQpPT57aWYoRC53aWR0aD4wJiZELmhlaWdodD4wKUswKEQpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxRMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1EwKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixVPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKTtyZXR1cm4oYXN5bmMoKT0+e3RyeXtsZXQgYj0oYXdhaXQgZmV0Y2goUix7c2lnbmFsOkwuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFiKXJldHVybjtsZXQgbz1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6WDAsdmFsdWU6cTB9PWF3YWl0IGIucmVhZCgpO2lmKFgwKWJyZWFrO2lmKHEwKWZvcihsZXQgUTQ9MDtRNDw9cTAubGVuZ3RoLW8ubGVuZ3RoO1E0Kyspe2xldCB3ND0hMDtmb3IobGV0IHgwPTA7eDA8by5sZW5ndGg7eDArKylpZihxMFtRNCt4MF0hPT1vW3gwXSl7dzQ9ITE7YnJlYWt9aWYodzQpRzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntMLmFib3J0KCksY2xlYXJJbnRlcnZhbChVKSxILmNsb3NlKCksTS5jdXJyZW50PW51bGx9fSxbWCxSLEFdKTtsZXQgZT13KDApO3goKCk9PntpZighQSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9ZS5jdXJyZW50O2lmKCFEfHwhVC5jdXJyZW50KXJldHVybjtpZihEYXRlLm5vdygpLUQ+VilFKCExKX0sTD1zZXRJbnRlcnZhbCgoKT0+e3YwKEcwLmN1cnJlbnQpLEcwLmN1cnJlbnQ9MCxIKCl9LDEwMDApLFU9KCk9PntpZighZG9jdW1lbnQuaGlkZGVuKUgoKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLFUpLCgpPT57Y2xlYXJJbnRlcnZhbChMKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixVKX19LFtBXSk7bGV0IGE9aigoKT0+e3JldHVybiBBP0kuY3VycmVudDprLmN1cnJlbnR9LFtBXSksVjA9aigoVixIKT0+e2xldCBMPWEoKTtpZighTClyZXR1cm47bGV0IFU9TC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPShILmNsaWVudFgtVS5sZWZ0KS9VLndpZHRoLGI9KEguY2xpZW50WS1VLnRvcCkvVS5oZWlnaHQ7bSh7dHlwZTpWLHg6RCx5OmJ9KX0sW21dKSxKMD0zLGw9dyghMSksdT13KCExKSxVMD13KCExKSxNMD13KHtkeDowLGR5OjB9KSxDMD13KCExKSxbWTQsazRdPVMoITEpLEk0PXcoe3g6MC41LHk6MC41fSksW0gwLFkwXT1TKG51bGwpO3goKCk9PntsZXQgVj0oTCk9PntpZihMLmtleT09PSJBbHQiKWs0KCEwKX0sSD0oTCk9PntpZihMLmtleT09PSJBbHQiKXtpZihrNCghMSksIXUuY3VycmVudClZMChudWxsKX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixIKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixWKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLEgpfX0sW10pLHgoKCk9PntpZihZNCYmIXUuY3VycmVudCl7bGV0IFY9STQuY3VycmVudDtZMCh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIVk0JiYhdS5jdXJyZW50KVkwKG51bGwpfSxbWTRdKTtsZXQgeTA9dyhudWxsKSxxND13KCExKSxFMD13KDApLE00PWooKFYsSCk9PntxNC5jdXJyZW50PSEwO2xldCBMPXkwLmN1cnJlbnQ7aWYoTCljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxFMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e0wuc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxMLnN0eWxlLnRvcD1gJHtIKjEwMH0lYCxMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pfSxbXSksQzQ9aigoVixIKT0+e2lmKCFxNC5jdXJyZW50KXJldHVybjtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWB9KX0sW10pLHAwPWooKCk9PntxNC5jdXJyZW50PSExO2xldCBWPXkwLmN1cnJlbnQ7aWYoViljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxWLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxbXSksRTQ9dygwKSx3MD13KG51bGwpLGc1PWooKCk9PntsZXQgVj1EYXRlLm5vdygpLEg9Vi1FNC5jdXJyZW50O2lmKEU0LmN1cnJlbnQ9VixIPDMwMCl7aWYodzAuY3VycmVudCljbGVhclRpbWVvdXQodzAuY3VycmVudCksdzAuY3VycmVudD1udWxsO2lmKFEpUSgpO2Vsc2UgWjAoImFwcF9zd2l0Y2hlciIpfWVsc2UgdzAuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57aWYoUSlRKCk7ZWxzZSBaMCgiaG9tZSIpO3cwLmN1cnJlbnQ9bnVsbH0sMzAwKX0sW1owLFFdKSxnMD0oKCk9PntpZighZ3x8IXIpcmV0dXJuIG51bGw7aWYoci53aWR0aD09PTB8fHIuaGVpZ2h0PT09MClyZXR1cm4gbnVsbDtsZXQgVj1NYXRoLm1pbihyLndpZHRoL2cud2lkdGgsci5oZWlnaHQvZy5oZWlnaHQpO3JldHVybnt3aWR0aDpnLndpZHRoKlYsaGVpZ2h0OmcuaGVpZ2h0KlZ9fSkoKTtyZXR1cm4gTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsZmxleDoxLC4uLl8/e306e2JvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxvdmVyZmxvdzoiaGlkZGVuIixtaW5XaWR0aDowLG1pbkhlaWdodDowLC4uLkp9LGNsYXNzTmFtZTpxLGNoaWxkcmVuOltOKCJkaXYiLHtyZWY6cyxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsbWluSGVpZ2h0OjAsbWluV2lkdGg6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIifSxjaGlsZHJlbjpOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIix3aWR0aDpnMD9gJHtnMC53aWR0aH1weGA6IjEwMCUiLGhlaWdodDpnMD9gJHtnMC5oZWlnaHR9cHhgOiIxMDAlIn0sY2hpbGRyZW46W04oImltZyIse3JlZjprLHNyYzpBP3ZvaWQgMDpSLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOkE/e2Rpc3BsYXk6Im5vbmUifTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLGN1cnNvcjpGNCxkaXNwbGF5OiJibG9jayIsdXNlclNlbGVjdDoibm9uZSIsV2Via2l0VXNlclNlbGVjdDoibm9uZSIsdG91Y2hBY3Rpb246Im5vbmUiLC4uLll9fSksQSYmTigiaW1nIix7cmVmOkksZHJhZ2dhYmxlOiExLG9uTG9hZDooVik9PntsZXQgSD1WLmN1cnJlbnRUYXJnZXQ7aWYoSC5uYXR1cmFsV2lkdGg+MCYmSC5uYXR1cmFsSGVpZ2h0PjApSzAoKEwpPT5MJiZMLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJkwuaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P0w6e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RjQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLE4oImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsY3Vyc29yOkY0LHRvdWNoQWN0aW9uOiJub25lIn0sb25Nb3VzZURvd246KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxVPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoVi5hbHRLZXkpe3UuY3VycmVudD0hMCxVMC5jdXJyZW50PVYuc2hpZnRLZXk7bGV0IGI9e3gxOlUseTE6RCx4MjoxLVUseTI6MS1EfTtNMC5jdXJyZW50PXtkeDoxLVUtVSxkeToxLUQtRH0sWTAoYikseSh7dHlwZToiYmVnaW4iLC4uLmJ9KTtyZXR1cm59aWYoTTQoVSxEKSxEPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OlUseTpELGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxWMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEk0LmN1cnJlbnQ9e3g6VSx5OkR9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KVkwKHt4MTpVLHkxOkQseDI6MS1VLHkyOjEtRH0pO3JldHVybn1pZih1LmN1cnJlbnQpe2xldCBiO2lmKFUwLmN1cnJlbnQpe2xldCBvPU0wLmN1cnJlbnQ7Yj17eDE6VSx5MTpELHgyOlUrby5keCx5MjpEK28uZHl9fWVsc2UgYj17eDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9O1kwKGIpLHkoe3R5cGU6Im1vdmUiLC4uLmJ9KTtyZXR1cm59aWYoQzQoVSxEKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpVLHk6RCxlZGdlOkowfSk7ZWxzZSBWMCgibW92ZSIsVil9LG9uTW91c2VVcDooVik9PntpZih1LmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihVMC5jdXJyZW50KXtsZXQgYj1NMC5jdXJyZW50O3koe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOlUrYi5keCx5MjpEK2IuZHl9KX1lbHNlIHkoe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9KX1pZih1LmN1cnJlbnQ9ITEsIVYuYWx0S2V5KVkwKG51bGwpO3JldHVybn1pZihwMCgpLGwuY3VycmVudCl7bGV0IEg9YSgpO2lmKEgpe2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O20oe3R5cGU6ImVuZCIseDpVLHk6RCxlZGdlOkowfSl9bC5jdXJyZW50PSExO3JldHVybn1WMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKHUuY3VycmVudCl7aWYoSDApeSh7dHlwZToiZW5kIiwuLi5IMH0pO3UuY3VycmVudD0hMSxZMChudWxsKTtyZXR1cm59aWYocDAoKSxsLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6VSx5OkQsZWRnZTpKMH0pfWwuY3VycmVudD0hMTtyZXR1cm59aWYoVi5idXR0b25zPjApVjAoImVuZCIsVik7WTAobnVsbCl9LG9uVG91Y2hTdGFydDooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKFYudG91Y2hlcy5sZW5ndGg+PTIpe3AwKCk7bGV0IG89Vi50b3VjaGVzWzBdLFgwPVYudG91Y2hlc1sxXSxxMD17eDE6KG8uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KG8uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KFgwLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihYMC5jbGllbnRZLUwudG9wKS9MLmhlaWdodH07aWYoIUMwLmN1cnJlbnQmJiFsLmN1cnJlbnQpbSh7dHlwZToiZW5kIix4OnEwLngxLHk6cTAueTF9KTtDMC5jdXJyZW50PSEwLHUuY3VycmVudD0hMCxsLmN1cnJlbnQ9ITEsWTAocTApLHkoe3R5cGU6ImJlZ2luIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoTTQoRCxiKSxiPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OkQseTpiLGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxtKHt0eXBlOiJiZWdpbiIseDpELHk6Yn0pfSxvblRvdWNoTW92ZTooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKEMwLmN1cnJlbnQmJlYudG91Y2hlcy5sZW5ndGg+PTIpe2xldCBvPVYudG91Y2hlc1swXSxYMD1WLnRvdWNoZXNbMV0scTA9e3gxOihvLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihvLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihYMC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MjooWDAuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O1kwKHEwKSx5KHt0eXBlOiJtb3ZlIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQzQoRCxiKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpELHk6YixlZGdlOkowfSk7ZWxzZSBtKHt0eXBlOiJtb3ZlIix4OkQseTpifSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBvPVYuY2hhbmdlZFRvdWNoZXNbMF0sWDA9SDA7aWYobyYmWDApeSh7dHlwZToiZW5kIix4MTooby5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MTooby5jbGllbnRZLUwudG9wKS9MLmhlaWdodCx4MjpYMC54Mix5MjpYMC55Mn0pO2Vsc2UgaWYoWDApeSh7dHlwZToiZW5kIiwuLi5YMH0pO0MwLmN1cnJlbnQ9ITEsdS5jdXJyZW50PSExLFkwKG51bGwpfXJldHVybn1sZXQgVT1WLmNoYW5nZWRUb3VjaGVzWzBdO2lmKCFVKXJldHVybjtsZXQgRD0oVS5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShVLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKHAwKCksbC5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpELHk6YixlZGdlOkowfSksbC5jdXJyZW50PSExO2Vsc2UgbSh7dHlwZToiZW5kIix4OkQseTpifSl9fSksTigiZGl2Iix7cmVmOnkwLCJkYXRhLXRlc3RpZCI6InRvdWNoLWluZGljYXRvciIsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToibm9uZSIsd2lkdGg6MjQsaGVpZ2h0OjI0LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDU5LDEzMCwyNDYsMC41KSIsYm94U2hhZG93OiIwIDAgOHB4IHJnYmEoNTksMTMwLDI0NiwwLjMpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fSksSDAmJk4oZCx7Y2hpbGRyZW46W04oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngxLEgwLnkxKX0pLE4oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngyLEgwLnkyKX0pXX0pLCFoJiYhbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiIzg4OCIsZm9udFNpemU6MTR9LGNoaWxkcmVuOiJDb25uZWN0aW5nLi4uIn0pfSksbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2Y0NCIsZm9udFNpemU6MTQscGFkZGluZzoyMCx0ZXh0QWxpZ246ImNlbnRlciJ9LGNoaWxkcmVuOm59KX0pLEo0JiZOKCJkaXYiLHtzdHlsZTpGNixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZmJiZjI0Iixmb250U2l6ZToxMyxmb250RmFtaWx5OiJtb25vc3BhY2UifSxjaGlsZHJlbjoiU2xvdyBjb25uZWN0aW9uIn0pfSldfSl9KSwhXyYmTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLHBhZGRpbmc6IjRweCA4cHgiLGJvcmRlclRvcDoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxjaGlsZHJlbjpbTigiYnV0dG9uIix7b25DbGljazpnNSxzdHlsZTp7YmFja2dyb3VuZDoibm9uZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIixjb2xvcjoiI2FhYSIsZm9udFNpemU6MTEsZm9udEZhbWlseToibW9ub3NwYWNlIixwYWRkaW5nOiIycHggMTBweCIsY3Vyc29yOiJwb2ludGVyIixib3JkZXJSYWRpdXM6NH0sY2hpbGRyZW46IkhvbWUifSksTigic3BhbiIse3N0eWxlOntjb2xvcjpqMD4wPyIjNGY0IjoiIzg4OCIsZm9udFNpemU6MTIsZm9udEZhbWlseToibW9ub3NwYWNlIixkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo2fSxjaGlsZHJlbjpbQyYmTigic3BhbiIseyJkYXRhLXRlc3RpZCI6InF1YWxpdHktZG90IixzdHlsZTp7d2lkdGg6OCxoZWlnaHQ6OCxib3JkZXJSYWRpdXM6IjUwJSIsZGlzcGxheToiaW5saW5lLWJsb2NrIixiYWNrZ3JvdW5kOkM9PT0iZ29vZCI/IiM0YWRlODAiOkM9PT0iZGVncmFkZWQiPyIjZmFjYzE1IjoiI2VmNDQ0NCJ9fSksajAsIiBmcHMiXX0pXX0pXX0pfXZhciBGNj17cG9zaXRpb246ImFic29sdXRlIix0b3A6OCxsZWZ0OiI1MCUiLHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjcpIixib3JkZXJSYWRpdXM6NixwYWRkaW5nOiI0cHggMTJweCIscG9pbnRlckV2ZW50czoibm9uZSJ9LGI1PXtwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuOCkifSxTNT0yMDtmdW5jdGlvbiBSNShYLFope3JldHVybntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6YCR7WCoxMDB9JWAsdG9wOmAke1oqMTAwfSVgLHdpZHRoOlM1LGhlaWdodDpTNSxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjQpIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuNykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19ZnVuY3Rpb24gazAoWCl7aWYoIVgpcmV0dXJuImlwaG9uZSI7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouaW5jbHVkZXMoImlwYWQiKSlyZXR1cm4iaXBhZCI7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4id2F0Y2giO2lmKFouaW5jbHVkZXMoInZpc2lvbiIpKXJldHVybiJ2aXNpb24iO3JldHVybiJpcGhvbmUifXZhciAkMD17aXBob25lOnt3aWR0aDo0MjcsaGVpZ2h0Ojg4MSxiZXplbFg6MTgsYmV6ZWxZOjE4LGlubmVyUmFkaXVzOjU1fSxpcGFkOnt3aWR0aDo0MzAsaGVpZ2h0OjYwNSxiZXplbFg6MTYsYmV6ZWxZOjE2LGlubmVyUmFkaXVzOjEyfSx3YXRjaDp7d2lkdGg6Mjc0LGhlaWdodDozMjIsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czo3OX0sdmlzaW9uOnt3aWR0aDo2NDAsaGVpZ2h0OjQwMCxiZXplbFg6MTIsYmV6ZWxZOjEyLGlubmVyUmFkaXVzOjMyfX0sdzc9JDAuaXBob25lLndpZHRoLFQ3PSQwLmlwaG9uZS5oZWlnaHQsYjc9JDAuaXBob25lLmJlemVsWCxTNz0kMC5pcGhvbmUuYmV6ZWxZLFI3PSQwLmlwaG9uZS5pbm5lclJhZGl1cztmdW5jdGlvbiBlMChYPSJpcGhvbmUiKXtsZXQgWj0kMFtYXSxKPVoud2lkdGgtMipaLmJlemVsWCxZPVouaGVpZ2h0LTIqWi5iZXplbFk7cmV0dXJuYCR7Wi5pbm5lclJhZGl1cy9KKjEwMH0lIC8gJHtaLmlubmVyUmFkaXVzL1kqMTAwfSVgfXZhciBEND1fMChudWxsKTtmdW5jdGlvbiBYNChYKXtsZXQgWj1SMChENCk7aWYoIVopdGhyb3cgRXJyb3IoYDxTaW11bGF0b3JUb29sYmFyLiR7WH0+IG11c3QgYmUgcmVuZGVyZWQgaW5zaWRlIDxTaW11bGF0b3JUb29sYmFyPmApO3JldHVybiBafXZhciBDNj17ZGlzcGxheToiZmxleCIsZmxleFdyYXA6IndyYXAiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLGdhcDoiNHB4IDEycHgiLHBhZGRpbmc6IjhweCAxMnB4Iixib3JkZXJSYWRpdXM6MjQsYmFja2dyb3VuZDoiIzFjMWMxZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEpIixib3hTaGFkb3c6IjAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMikiLG1pbldpZHRoOjI0MCx3aWR0aDoiMTAwJSJ9O2Z1bmN0aW9uIEU2KHtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksc3RyZWFtaW5nOnE9ITEsZGlzYWJsZWQ6UT0hMSxjaGlsZHJlbjpLLHN0eWxlOlcsLi4uR30pe2xldCB6PWswKEopLCQ9e2V4ZWM6WCxkZXZpY2VVZGlkOlosZGV2aWNlTmFtZTpKLGRldmljZVJ1bnRpbWU6WSxkZXZpY2VUeXBlOnosc3RyZWFtaW5nOnEsZGlzYWJsZWQ6UXx8IVp8fCFxfTtyZXR1cm4gTihENC5Qcm92aWRlcix7dmFsdWU6JCxjaGlsZHJlbjpOKCJkaXYiLHsiZGF0YS1zaW11bGF0b3ItdG9vbGJhciI6ITAsc3R5bGU6ey4uLkM2LC4uLld9LC4uLkcsY2hpbGRyZW46S30pfSl9dmFyIHc2PXtkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImZsZXgtc3RhcnQiLHRleHRBbGlnbjoibGVmdCIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGJvcmRlcjoibm9uZSIsY29sb3I6IiNmZmYiLHBhZGRpbmc6IjJweCA0cHgiLG1hcmdpbjoiLTJweCAtNHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLG1pbldpZHRoOjAsbWF4V2lkdGg6IjEwMCUiLGxpbmVIZWlnaHQ6MS4yLGZvbnRGYW1pbHk6ImluaGVyaXQifSxUNj1EMChmdW5jdGlvbih7bmFtZTpaLHN1YnRpdGxlOkosaGlkZUNoZXZyb246WSxzdHlsZTpxLG9uTW91c2VFbnRlcjpRLG9uTW91c2VMZWF2ZTpLLC4uLld9LEcpe2xldCB6PVg0KCJUaXRsZSIpLFtQLCRdPVMoITEpLF89Wj8/ei5kZXZpY2VOYW1lPz8iTm8gc2ltdWxhdG9yIixPPUo/Pyh6LmRldmljZVJ1bnRpbWU/ei5kZXZpY2VSdW50aW1lLnJlcGxhY2UoL1wuLywiICIpOiLigJQiKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIiwiZGF0YS1zaW11bGF0b3ItdG9vbGJhci10aXRsZSI6ITAsb25Nb3VzZUVudGVyOihDKT0+eyQoITApLFE/LihDKX0sb25Nb3VzZUxlYXZlOihDKT0+eyQoITEpLEs/LihDKX0sc3R5bGU6ey4uLnc2LGJhY2tncm91bmQ6UD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLC4uLnF9LC4uLlcsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7ZGlzcGxheToiaW5saW5lLWZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZm9udFNpemU6MTIsZm9udFdlaWdodDo2MDAsY29sb3I6IiNmZmYiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpbXywhWSYmTigic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMi41IixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixzdHlsZTp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsZmxleFNocmluazowfSxjaGlsZHJlbjpOKCJwb2x5bGluZSIse3BvaW50czoiNiA5IDEyIDE1IDE4IDkifSl9KV19KSxOKCJzcGFuIix7c3R5bGU6e2ZvbnRTaXplOjEwLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNSkiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpPfSldfSl9KSxiNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6NCxmbGV4U2hyaW5rOjB9O2Z1bmN0aW9uIFM2KHtzdHlsZTpYLC4uLlp9KXtyZXR1cm4gTigiZGl2Iix7c3R5bGU6ey4uLmI2LC4uLlh9LC4uLlp9KX12YXIgUjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLHBhZGRpbmc6Nixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLGRpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuOCkiLHRyYW5zaXRpb246ImJhY2tncm91bmQtY29sb3IgMC4xNXMsIGNvbG9yIDAuMTVzIn0sWjQ9RDAoZnVuY3Rpb24oe2ZvcmNlRGlzYWJsZWQ6WixzdHlsZTpKLGRpc2FibGVkOlksb25Nb3VzZUVudGVyOnEsb25Nb3VzZUxlYXZlOlEsY2hpbGRyZW46SywuLi5XfSxHKXtsZXQgej1SMChENCksUD1ZfHxafHx6Py5kaXNhYmxlZCxbJCxfXT1TKCExKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpQLG9uTW91c2VFbnRlcjooTyk9PntfKCEwKSxxPy4oTyl9LG9uTW91c2VMZWF2ZTooTyk9PntfKCExKSxRPy4oTyl9LHN0eWxlOnsuLi5SNixjb2xvcjpQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpIjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIixiYWNrZ3JvdW5kOiQmJiFQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMSkiOiJ0cmFuc3BhcmVudCIsY3Vyc29yOlA/Im5vdC1hbGxvd2VkIjoicG9pbnRlciIsLi4uSn0sLi4uVyxjaGlsZHJlbjpLfSl9KTtmdW5jdGlvbiBqNigpe3JldHVyblsndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIHNldCBmcm9udG1vc3QgdG8gdHJ1ZScsJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBwZXJmb3JtIGFjdGlvbiAiQVhSYWlzZSIgb2YgKGZpcnN0IHdpbmRvdyB3aG9zZSBuYW1lIGNvbnRhaW5zICJ3YXRjaE9TIiknLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gY2xpY2sgbWVudSBpdGVtICJIb21lIiBvZiBtZW51ICJEZXZpY2UiIG9mIG1lbnUgYmFyIGl0ZW0gIkRldmljZSIgb2YgbWVudSBiYXIgMSddLm1hcCgoWik9PmAtZSAnJHtafSdgKS5yZWR1Y2UoKFosSik9PmAke1p9ICR7Sn1gLCJvc2FzY3JpcHQiKX12YXIgdjY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0zIDEwLjUgMTIgM2w5IDcuNVYyMGExIDEgMCAwIDEtMSAxaC01di03aC02djdINGExIDEgMCAwIDEtMS0xeiJ9KX0pLHk2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTE0LjUgNGgtNUw3IDdINGEyIDIgMCAwIDAtMiAydjlhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0yVjlhMiAyIDAgMCAwLTItMmgtM3oifSksTigiY2lyY2xlIix7Y3g6IjEyIixjeToiMTMiLHI6IjQifSldfSkscDY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMTIgMTMiLGZpbGw6ImN1cnJlbnRDb2xvciIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpOKCJwYXRoIix7ZDoiTTEwLjIzMDUgMTIuODA3N0g0LjQyMzgzQzMuOTIzODMgMTIuODA3NyAzLjU0Njg4IDEyLjY4NDYgMy4yOTI5NyAxMi40Mzg1QzMuMDQyOTcgMTIuMTk2MyAyLjkxNzk3IDExLjgxOTQgMi45MTc5NyAxMS4zMDc3VjUuNTEyNzRDMi45MTc5NyA0Ljk5NzExIDMuMDQyOTcgNC42MTgyMSAzLjI5Mjk3IDQuMzc2MDJDMy41NDY4OCA0LjEyOTkzIDMuOTIzODMgNC4wMDY4OCA0LjQyMzgzIDQuMDA2ODhIMTAuMjMwNUMxMC43MzQ0IDQuMDA2ODggMTEuMTExMyA0LjEyOTkzIDExLjM2MTMgNC4zNzYwMkMxMS42MTEzIDQuNjE4MjEgMTEuNzM2MyA0Ljk5NzExIDExLjczNjMgNS41MTI3NFYxMS4zMDc3QzExLjczNjMgMTEuODE5NCAxMS42MTEzIDEyLjE5NjMgMTEuMzYxMyAxMi40Mzg1QzExLjExMTMgMTIuNjg0NiAxMC43MzQ0IDEyLjgwNzcgMTAuMjMwNSAxMi44MDc3Wk0xMC4yMTI5IDExLjg2NDNDMTAuNDE2IDExLjg2NDMgMTAuNTYyNSAxMS44MTk0IDEwLjY1MjMgMTEuNzI5NUMxMC43NDYxIDExLjY0MzYgMTAuNzkzIDExLjQ5NzEgMTAuNzkzIDExLjI5MDFWNS41MjQ0NkMxMC43OTMgNS4zMTc0MyAxMC43NDYxIDUuMTcwOTQgMTAuNjUyMyA1LjA4NTAxQzEwLjU2MjUgNC45OTUxNiAxMC40MTYgNC45NTAyNCAxMC4yMTI5IDQuOTUwMjRINC40NDE0MUM0LjI0MjE5IDQuOTUwMjQgNC4wOTU3IDQuOTk1MTYgNC4wMDE5NSA1LjA4NTAxQzMuOTA4MiA1LjE3MDk0IDMuODYxMzMgNS4zMTc0MyAzLjg2MTMzIDUuNTI0NDZWMTEuMjkwMUMzLjg2MTMzIDExLjQ5NzEgMy45MDgyIDExLjY0MzYgNC4wMDE5NSAxMS43Mjk1QzQuMDk1NyAxMS44MTk0IDQuMjQyMTkgMTEuODY0MyA0LjQ0MTQxIDExLjg2NDNIMTAuMjEyOVpNMi45MTc5NyAyLjU4MzA1VjAuNDE1MDgzQzIuOTE3OTcgMC4yMDAyNCAyLjk4NjMzIDAuMDY5MzgwMyAzLjEyMzA1IDAuMDIyNTA1M0MzLjI1OTc3IC0wLjAyODI3NTkgMy40MTAxNiAwLjAwNjg4MDMzIDMuNTc0MjIgMC4xMjc5NzRMNS4wNTA3OCAxLjIxMTk2QzUuMTc1NzggMS4zMDU3MSA1LjIzODI4IDEuNDAxNDEgNS4yMzgyOCAxLjQ5OTA3QzUuMjM4MjggMS41OTY3MiA1LjE3NTc4IDEuNjkyNDMgNS4wNTA3OCAxLjc4NjE4TDMuNTc0MjIgMi44NjQzQzMuNDEwMTYgMi45ODU0IDMuMjU5NzcgMy4wMjI1MSAzLjEyMzA1IDIuOTc1NjNDMi45ODYzMyAyLjkyNDg1IDIuOTE3OTcgMi43OTM5OSAyLjkxNzk3IDIuNTgzMDVaTTMuNTMzMiAxLjE1MzM2QzMuNjI2OTUgMS4xNTMzNiAzLjcwNzAzIDEuMTg2NTcgMy43NzM0NCAxLjI1Mjk3QzMuODQzNzUgMS4zMTkzOCAzLjg3ODkxIDEuMzk3NTEgMy44Nzg5MSAxLjQ4NzM1QzMuODc4OTEgMS41ODExIDMuODQzNzUgMS42NjMxMyAzLjc3MzQ0IDEuNzMzNDRDMy43MDcwMyAxLjc5OTg1IDMuNjI2OTUgMS44MzMwNSAzLjUzMzIgMS44MzMwNUgyLjgwNjY0QzIuMzgwODYgMS44MzMwNSAyLjAxMTcyIDEuOTI0ODUgMS42OTkyMiAyLjEwODQ0QzEuMzkwNjIgMi4yODgxMyAxLjE1MjM0IDIuNTM4MTMgMC45ODQzNzUgMi44NTg0NEMwLjgxNjQwNiAzLjE3ODc2IDAuNzMyNDIyIDMuNTQ1OTQgMC43MzI0MjIgMy45NjAwMVY0LjgzODkxQzAuNzMyNDIyIDQuOTM2NTcgMC42OTcyNjYgNS4wMjI1MSAwLjYyNjk1MyA1LjA5NjcyQzAuNTUyNzM0IDUuMTY3MDQgMC40NjQ4NDQgNS4yMDIxOSAwLjM2MzI4MSA1LjIwMjE5QzAuMjY1NjI1IDUuMjAyMTkgMC4xODE2NDEgNS4xNjcwNCAwLjExMTMyOCA1LjA5NjcyQzAuMDM3MTA5NCA1LjAyMjUxIDAgNC45MzY1NyAwIDQuODM4OTFWMy45NjAwMUMwIDMuNDAxNDEgMC4xMTcxODggMi45MTExOCAwLjM1MTU2MiAyLjQ4OTNDMC41ODIwMzEgMi4wNjc0MyAwLjkwODIwMyAxLjczOTMgMS4zMzAwOCAxLjUwNDkzQzEuNzQ4MDUgMS4yNzA1NSAyLjIzODI4IDEuMTUzMzYgMi44MDA3OCAxLjE1MzM2SDMuNTMzMloifSl9KSxnNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJIb21lQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiSG9tZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVR5cGU9PT0id2F0Y2giKXEuZXhlYyhqNigpKTtlbHNlIHEuZXhlYygic2VydmUtc2ltIGJ1dHRvbiBob21lIil9LC4uLkosY2hpbGRyZW46djZ9KX0pLHg2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlNjcmVlbnNob3RCdXR0b24iKTtyZXR1cm4gTihaNCx7cmVmOlksImFyaWEtbGFiZWwiOiJTY3JlZW5zaG90IixvbkNsaWNrOihRKT0+e2lmKFo/LihRKSxRLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2lmKHEuZGV2aWNlVWRpZClxLmV4ZWMoYHhjcnVuIHNpbWN0bCBpbyAke3EuZGV2aWNlVWRpZH0gc2NyZWVuc2hvdCB+L0Rlc2t0b3AvaGF0Y2gtc2NyZWVuc2hvdC0kKGRhdGUgKyVzKS5wbmdgKX0sLi4uSixjaGlsZHJlbjp5Nn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiUm90YXRlQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiUm90YXRlIGRldmljZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGBvc2FzY3JpcHQgLWUgJ3RlbGwgYXBwbGljYXRpb24gIlNpbXVsYXRvciIgdG8gYWN0aXZhdGUnIC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byBrZXkgY29kZSAxMjQgdXNpbmcge2NvbW1hbmQgZG93bn0nYCl9LC4uLkosY2hpbGRyZW46cDZ9KX0pLHQ9RTY7dC5UaXRsZT1UNjt0LkFjdGlvbnM9UzY7dC5CdXR0b249WjQ7dC5Ib21lQnV0dG9uPWc2O3QuU2NyZWVuc2hvdEJ1dHRvbj14Njt0LlJvdGF0ZUJ1dHRvbj1oNjtmdW5jdGlvbiBtNihYKXtsZXRbWixKXT1TKG51bGwpLFk9dyhuZXcgU2V0KSxbcSxRXT1TKG51bGwpLEs9aigoVyk9PntyZXR1cm4gWS5jdXJyZW50LmFkZChXKSwoKT0+e1kuY3VycmVudC5kZWxldGUoVyl9fSxbXSk7cmV0dXJuIHgoKCk9PntpZighWClyZXR1cm47bGV0IFc9bmV3IEFib3J0Q29udHJvbGxlcixHPVgucmVwbGFjZSgvXC9zdHJlYW1cLm1qcGVnJC8sIiIpO3JldHVybiBmZXRjaChgJHtHfS9jb25maWdgLHtzaWduYWw6Vy5zaWduYWx9KS50aGVuKCh6KT0+ei5qc29uKCkpLnRoZW4oKHopPT57aWYoei53aWR0aD4wJiZ6LmhlaWdodD4wKUooeil9KS5jYXRjaCgoKT0+e30pLChhc3luYygpPT57dHJ5e2xldCBQPShhd2FpdCBmZXRjaChYLHtzaWduYWw6Vy5zaWduYWx9KSkuYm9keT8uZ2V0UmVhZGVyKCk7aWYoIVApcmV0dXJuO2xldCAkPW5ldyBVaW50OEFycmF5KDApO3doaWxlKCEwKXtsZXR7ZG9uZTpfLHZhbHVlOk99PWF3YWl0IFAucmVhZCgpO2lmKF8pYnJlYWs7bGV0IEM9bmV3IFVpbnQ4QXJyYXkoJC5sZW5ndGgrTy5sZW5ndGgpO0Muc2V0KCQpLEMuc2V0KE8sJC5sZW5ndGgpLCQ9Qzt3aGlsZSghMCl7bGV0IEE9LTE7Zm9yKGxldCBFPTA7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTYpe0E9RTticmVha31pZihBPT09LTEpYnJlYWs7bGV0IGs9LTE7Zm9yKGxldCBFPUErMjtFPCQubGVuZ3RoLTE7RSsrKWlmKCRbRV09PT0yNTUmJiRbRSsxXT09PTIxNyl7az1FKzI7YnJlYWt9aWYoaz09PS0xKWJyZWFrO2xldCBJPSQuc2xpY2UoQSxrKTskPSQuc2xpY2Uoayk7bGV0IE09bmV3IEJsb2IoW0ldLHt0eXBlOiJpbWFnZS9qcGVnIn0pLGg9VVJMLmNyZWF0ZU9iamVjdFVSTChNKTtRKGgpO2ZvcihsZXQgRSBvZiBZLmN1cnJlbnQpRShoKX19fWNhdGNoe319KSgpLCgpPT5XLmFib3J0KCl9LFtYXSkse3N1YnNjcmliZUZyYW1lOkssZnJhbWU6cSxjb25maWc6Wn19dmFyIGQ2PXtLZXlBOjQsS2V5Qjo1LEtleUM6NixLZXlEOjcsS2V5RTo4LEtleUY6OSxLZXlHOjEwLEtleUg6MTEsS2V5SToxMixLZXlKOjEzLEtleUs6MTQsS2V5TDoxNSxLZXlNOjE2LEtleU46MTcsS2V5TzoxOCxLZXlQOjE5LEtleVE6MjAsS2V5UjoyMSxLZXlTOjIyLEtleVQ6MjMsS2V5VToyNCxLZXlWOjI1LEtleVc6MjYsS2V5WDoyNyxLZXlZOjI4LEtleVo6MjksRGlnaXQxOjMwLERpZ2l0MjozMSxEaWdpdDM6MzIsRGlnaXQ0OjMzLERpZ2l0NTozNCxEaWdpdDY6MzUsRGlnaXQ3OjM2LERpZ2l0ODozNyxEaWdpdDk6MzgsRGlnaXQwOjM5LEVudGVyOjQwLEVzY2FwZTo0MSxCYWNrc3BhY2U6NDIsVGFiOjQzLFNwYWNlOjQ0LE1pbnVzOjQ1LEVxdWFsOjQ2LEJyYWNrZXRMZWZ0OjQ3LEJyYWNrZXRSaWdodDo0OCxCYWNrc2xhc2g6NDksU2VtaWNvbG9uOjUxLFF1b3RlOjUyLEJhY2txdW90ZTo1MyxDb21tYTo1NCxQZXJpb2Q6NTUsU2xhc2g6NTYsQ2Fwc0xvY2s6NTcsRjE6NTgsRjI6NTksRjM6NjAsRjQ6NjEsRjU6NjIsRjY6NjMsRjc6NjQsRjg6NjUsRjk6NjYsRjEwOjY3LEYxMTo2OCxGMTI6NjksUHJpbnRTY3JlZW46NzAsU2Nyb2xsTG9jazo3MSxQYXVzZTo3MixJbnNlcnQ6NzMsSG9tZTo3NCxQYWdlVXA6NzUsRGVsZXRlOjc2LEVuZDo3NyxQYWdlRG93bjo3OCxBcnJvd1JpZ2h0Ojc5LEFycm93TGVmdDo4MCxBcnJvd0Rvd246ODEsQXJyb3dVcDo4MixOdW1Mb2NrOjgzLE51bXBhZERpdmlkZTo4NCxOdW1wYWRNdWx0aXBseTo4NSxOdW1wYWRTdWJ0cmFjdDo4NixOdW1wYWRBZGQ6ODcsTnVtcGFkRW50ZXI6ODgsTnVtcGFkMTo4OSxOdW1wYWQyOjkwLE51bXBhZDM6OTEsTnVtcGFkNDo5MixOdW1wYWQ1OjkzLE51bXBhZDY6OTQsTnVtcGFkNzo5NSxOdW1wYWQ4Ojk2LE51bXBhZDk6OTcsTnVtcGFkMDo5OCxOdW1wYWREZWNpbWFsOjk5LENvbnRyb2xMZWZ0OjIyNCxTaGlmdExlZnQ6MjI1LEFsdExlZnQ6MjI2LE1ldGFMZWZ0OjIyNyxDb250cm9sUmlnaHQ6MjI4LFNoaWZ0UmlnaHQ6MjI5LEFsdFJpZ2h0OjIzMCxNZXRhUmlnaHQ6MjMxfTtmdW5jdGlvbiBmNihYKXtyZXR1cm4gZDZbWF0/P251bGx9YXN5bmMgZnVuY3Rpb24gQTAoWCl7cmV0dXJuKGF3YWl0IGZldGNoKCIvZXhlYyIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtjb21tYW5kOlh9KX0pKS5qc29uKCl9ZnVuY3Rpb24gYTYoWCl7dHJ5e2xldCBaPUpTT04ucGFyc2UoWCksSj1bXTtmb3IobGV0W1kscV1vZiBPYmplY3QuZW50cmllcyhaLmRldmljZXM/P3t9KSl7bGV0IFE9WS5yZXBsYWNlKC9eY29tXC5hcHBsZVwuQ29yZVNpbXVsYXRvclwuU2ltUnVudGltZVwuLywiIikucmVwbGFjZSgvLS9nLCIuIik7Zm9yKGxldCBLIG9mIHEpaWYoSy5pc0F2YWlsYWJsZSlKLnB1c2goe3VkaWQ6Sy51ZGlkLG5hbWU6Sy5uYW1lLHN0YXRlOksuc3RhdGUscnVudGltZTpRfSl9cmV0dXJuIEp9Y2F0Y2h7cmV0dXJuW119fWZ1bmN0aW9uIGo1KFgpe2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGhvbmUiKSlyZXR1cm4gMDtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuIDE7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4gMjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4gMztyZXR1cm4gNH1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5zdGFydHNXaXRoKCJpb3MiKSlyZXR1cm4gMDtpZihaLnN0YXJ0c1dpdGgoImlwYWRvcyIpKXJldHVybiAxO2lmKFouc3RhcnRzV2l0aCgid2F0Y2hvcyIpKXJldHVybiAyO2lmKFouc3RhcnRzV2l0aCgidmlzaW9ub3MiKXx8Wi5zdGFydHNXaXRoKCJ4cm9zIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24gbDYoe2RldmljZXM6WCxzZWxlY3RlZFVkaWQ6Wixsb2FkaW5nOkosZXJyb3I6WSxzdG9wcGluZ1VkaWRzOnEsb25SZWZyZXNoOlEsb25TZWxlY3Q6SyxvblN0b3A6Vyx0cmlnZ2VyOkd9KXtsZXRbeixQXT1TKCExKSwkPXcobnVsbCk7eCgoKT0+e2lmKCF6KXJldHVybjtsZXQgQT0oayk9PntpZighJC5jdXJyZW50Py5jb250YWlucyhrLnRhcmdldCkpUCghMSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSl9LFt6XSk7bGV0IF89bmV3IE1hcDtmb3IobGV0IEEgb2YgWCl7aWYoQS51ZGlkPT09Wiljb250aW51ZTtsZXQgaz1fLmdldChBLnJ1bnRpbWUpO2lmKCFrKWs9W10sXy5zZXQoQS5ydW50aW1lLGspO2sucHVzaChBKX1mb3IobGV0IEEgb2YgXy52YWx1ZXMoKSlBLnNvcnQoKGssSSk9Pmo1KGsubmFtZSktajUoSS5uYW1lKXx8ay5uYW1lLmxvY2FsZUNvbXBhcmUoSS5uYW1lKSk7bGV0IE89Wy4uLl8uZW50cmllcygpXS5zb3J0KChbQV0sW2tdKT0+djUoQSktdjUoayl8fEEubG9jYWxlQ29tcGFyZShrKSksQz1YLmZpbmQoKEEpPT5BLnVkaWQ9PT1aKT8/bnVsbDtyZXR1cm4gTigiZGl2Iix7cmVmOiQsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LGNoaWxkcmVuOltOKCJkaXYiLHtvbkNsaWNrOigpPT57aWYoIXopUSgpO1AoKEEpPT4hQSl9LGNoaWxkcmVuOkd9KSx6JiZOKCJkaXYiLHtzdHlsZTppNixjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6dTYsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7Zm9udFdlaWdodDo2MDB9LGNoaWxkcmVuOiJTaW11bGF0b3JzIn0pLE4oImJ1dHRvbiIse29uQ2xpY2s6KEEpPT57QS5zdG9wUHJvcGFnYXRpb24oKSxRKCl9LGRpc2FibGVkOkosc3R5bGU6bzYsY2hpbGRyZW46Sj8iLi4uIjoiUmVmcmVzaCJ9KV19KSxZJiZOKCJkaXYiLHtzdHlsZTpzNixjaGlsZHJlbjpZfSksQyYmTihkLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6ey4uLnA1LGNvbG9yOiIjYTViNGZjIn0sY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp5NShDLnN0YXRlPT09IkJvb3RlZCI/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46Qy5uYW1lfSldfSksTigiZGl2Iix7c3R5bGU6cjZ9KV19KSxYLmxlbmd0aD09PTAmJiFKJiYhWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46Ik5vIGF2YWlsYWJsZSBzaW11bGF0b3JzIGZvdW5kIn0pLE8ubWFwKChbQSxrXSk9Pk4oImRpdiIse2NoaWxkcmVuOltOKCJkaXYiLHtzdHlsZTpuNixjaGlsZHJlbjpBfSksay5tYXAoKEkpPT57bGV0IE09cS5oYXMoSS51ZGlkKSxoPUkuc3RhdGU9PT0iQm9vdGVkIjtyZXR1cm4gTigiZGl2Iix7c3R5bGU6cDUsb25Nb3VzZUVudGVyOihFKT0+RS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMjU1LDI1NSwyNTUsMC4wOCkiLG9uTW91c2VMZWF2ZTooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJ0cmFuc3BhcmVudCIsb25DbGljazooKT0+e0soSSksUCghMSl9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6eTUoaD8iIzRhZGU4MCI6IiM0NDQiKX0pLE4oInNwYW4iLHtzdHlsZTp7ZmxleDoxfSxjaGlsZHJlbjpJLm5hbWV9KSxoJiZOKCJzcGFuIix7cm9sZToiYnV0dG9uIixvbkNsaWNrOihFKT0+e2lmKEUuc3RvcFByb3BhZ2F0aW9uKCksIU0pVyhJLnVkaWQpfSxzdHlsZTp7Zm9udFNpemU6MTAscGFkZGluZzoiMXB4IDZweCIsYm9yZGVyUmFkaXVzOjQsY29sb3I6TT8iIzg4OCI6IiNmODcxNzEiLGJhY2tncm91bmQ6TT8idHJhbnNwYXJlbnQiOiJyZ2JhKDI0OCwxMTMsMTEzLDAuMSkiLGN1cnNvcjpNPyJkZWZhdWx0IjoicG9pbnRlciJ9LGNoaWxkcmVuOk0/IlN0b3BwaW5nLi4uIjoiU3RvcCJ9KV19LEkudWRpZCl9KV19LEEpKV19KV19KX1mdW5jdGlvbiB5NShYKXtyZXR1cm57d2lkdGg6NixoZWlnaHQ6Nixib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDpYLGZsZXhTaHJpbms6MH19ZnVuY3Rpb24gYzYoKXtsZXQgWD13aW5kb3cuX19TSU1fUFJFVklFV19fLFtaLEpdPVMoITEpLFtZLHFdPVMoW10pLFtRLEtdPVMoITEpLFtXLEddPVMobnVsbCksW3osUF09UyhuZXcgU2V0KSxbJCxfXT1TKCExKSxPPWooYXN5bmMoKT0+e0soITApLEcobnVsbCk7dHJ5e2xldCBGPWF3YWl0IEEwKCJ4Y3J1biBzaW1jdGwgbGlzdCBkZXZpY2VzIGF2YWlsYWJsZSAtaiIpO2lmKEYuZXhpdENvZGUhPT0wKXRocm93IEVycm9yKEYuc3RkZXJyfHwic2ltY3RsIGxpc3QgZmFpbGVkIik7cShhNihGLnN0ZG91dCkpfWNhdGNoKEYpe0coRiBpbnN0YW5jZW9mIEVycm9yP0YubWVzc2FnZToiRmFpbGVkIHRvIGxpc3QgZGV2aWNlcyIpfWZpbmFsbHl7SyghMSl9fSxbXSk7aWYoeCgoKT0+e08oKX0sW09dKSx4KCgpPT57aWYoIVg/LmxvZ3NFbmRwb2ludClyZXR1cm47bGV0IEY9bmV3IEV2ZW50U291cmNlKFgubG9nc0VuZHBvaW50KSxSPW5ldyBNYXAsdj1bIiM4YmU5ZmQiLCIjNTBmYTdiIiwiI2ZmYjg2YyIsIiNmZjc5YzYiLCIjYmQ5M2Y5IiwiI2YxZmE4YyIsIiM2MjcyYTQiLCIjZmY1NTU1IiwiIzY5ZmY5NCIsIiNkNmFjZmYiLCIjZmZmZmE1IiwiI2E0ZmZmZiIsIiNmZjZlNmUiLCIjY2FhOWZhIiwiIzVhZjc4ZSJdO2Z1bmN0aW9uIFQoWjApe2xldCB5PVIuZ2V0KFowKTtpZigheSl7bGV0IGU9MDtmb3IobGV0IGE9MDthPFowLmxlbmd0aDthKyspZT0oZTw8NSktZStaMC5jaGFyQ29kZUF0KGEpfDA7eT12W01hdGguYWJzKGUpJXYubGVuZ3RoXSxSLnNldChaMCx5KX1yZXR1cm4geX1sZXQgaT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oWjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoWjAuZGF0YSksZT15LnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P3kuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIixhPXkuc3Vic3lzdGVtPz8iIixWMD15LmNhdGVnb3J5Pz8iIixKMD15LmV2ZW50TWVzc2FnZT8/IiI7aWYoIUowKXJldHVybjtpZihlIT09aSl7aWYobSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IE0wPVQoZSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke2V9JHthP2AgJWMke2F9JHtWMD8iOiIrVjA6IiJ9YDoiIn1gLGBjb2xvcjoke00wfTtmb250LXdlaWdodDpib2xkYCwuLi5hP1siY29sb3I6Izg4ODtmb250LXdlaWdodDpub3JtYWwiXTpbXSksbT0hMCxpPWV9bGV0IGw9KHkubWVzc2FnZVR5cGU/PyIiKS50b0xvd2VyQ2FzZSgpLHU9YSYmZT09PWk/YCVjJHtWMHx8YX0lYyBgOiIiLFUwPXU/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGw9PT0iZmF1bHQifHxsPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihsPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxBPWswKEM/Lm5hbWUpLGs9JDBbQV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoQSksRT1BPT09InZpc2lvbiI/NTgwOkE9PT0iaXBhZCI/NDAwOkE9PT0id2F0Y2giPzIwMDozMjAsbj1tNihYLnN0cmVhbVVybCksUTA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsUTAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFEwLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVEwLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLGk9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7aVswXT1GLGkuc2V0KFQsMSksdi5zZW5kKGkpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLE8wPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgaT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksaSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e08wKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLE8wKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoInVwIiwyMjcpfSxbTzBdKTt4KCgpPT57bGV0IEY9KFQsaSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLGk9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSxpPT09ImRvd24iJiYhVC5yZXBlYXQpQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoWjApPT57bGV0IHk9WjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWY2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTppLHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IEEwKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBBMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57UCgoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgTygpfWZpbmFsbHl7UCgoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbT10pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6QTAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihsNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOk8sb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOm4uc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6bi5mcmFtZSxzdHJlYW1Db25maWc6bi5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0saTY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSx1Nj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0sbzY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sczY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LHA1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxyNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LHQ2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sbjY9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtQNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTihjNix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return P}function b($){let C=($?.basePath??"/.sim").replace(/\/+$/,"");return(J,z,K)=>{let X=J.url??"";if(X===C||X===C+"/"){let Q=O()[0]??null,V=p();if(Q){let G=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...Q,logsEndpoint:C+"/logs"})}</script>`;V=V.replace("<!--__SIM_PREVIEW_CONFIG__-->",G)}z.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),z.end(V);return}if(X===C+"/api"){let W=O();z.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),z.end(JSON.stringify(W[0]||null));return}if((X===C+"/exec"||X===C+"/exec/")&&J.method==="POST"){let W="";J.on("data",(Q)=>{W+=typeof Q==="string"?Q:Q.toString()}),J.on("end",()=>{let Q="";try{Q=JSON.parse(W).command??""}catch{}if(!Q){z.writeHead(400,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}g(Q,{maxBuffer:16777216},(V,Y,G)=>{z.writeHead(200,{"Content-Type":"application/json"}),z.end(JSON.stringify({stdout:Y.toString(),stderr:G.toString(),exitCode:V?V.code??1:0}))})});return}if(X===C+"/logs"||X.startsWith(C+"/logs?")){let W=O();if(W.length===0){z.writeHead(404),z.end("No serve-sim device");return}let Q=W[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
|
|
3
3
|
|
|
4
|
-
`);let
|
|
5
|
-
`))!==-1){let
|
|
4
|
+
`);let V=U("xcrun",["simctl","spawn",Q,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),Y="";V.stdout.on("data",(G)=>{Y+=G.toString();let Z;while((Z=Y.indexOf(`
|
|
5
|
+
`))!==-1){let M=Y.slice(0,Z).trim();if(Y=Y.slice(Z+1),M)z.write("data: "+M+`
|
|
6
6
|
|
|
7
|
-
`)}}),
|
|
7
|
+
`)}}),V.on("close",()=>z.end()),J.on("close",()=>V.kill());return}if(X===C+"/appstate"||X.startsWith(C+"/appstate?")){let W=O();if(W.length===0){z.writeHead(404),z.end("No serve-sim device");return}let Q=W[0].device;z.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),z.write(`:
|
|
8
|
+
|
|
9
|
+
`);let V=U("xcrun",["simctl","spawn",Q,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),Y=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,G="",Z="";V.stdout.on("data",(M)=>{Z+=M.toString();let w;while((w=Z.indexOf(`
|
|
10
|
+
`))!==-1){let A=Z.slice(0,w).trim();if(Z=Z.slice(w+1),!A)continue;let T;try{T=JSON.parse(A).eventMessage??""}catch{continue}let L=Y.exec(T);if(!L)continue;let H=L[1],D=parseInt(L[2],10);if(!I(H))continue;if(H===G)continue;G=H,v(Q,H).then((F)=>{z.write("data: "+JSON.stringify({bundleId:H,pid:D,isReactNative:F})+`
|
|
11
|
+
|
|
12
|
+
`)})}}),V.on("close",()=>z.end()),J.on("close",()=>V.kill());return}if(K)K()}}export{b as simMiddleware};
|
package/dist/serve-sim.js
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var $e=Object.defineProperty;var ye=(e,_)=>{for(var t in _)$e(e,t,{get:_[t],enumerable:!0,configurable:!0,set:(C)=>_[t]=()=>C})};var ce=(e,_)=>()=>(e&&(_=e(e=0)),_);var U={};ye(U,{simMiddleware:()=>ge});import{readdirSync as pe,readFileSync as He}from"fs";import{spawn as Te}from"child_process";import{tmpdir as ue}from"os";import{join as P}from"path";function N(){let e;try{e=pe(k).filter((t)=>t.startsWith("server-")&&t.endsWith(".json"))}catch{return[]}let _=[];for(let t of e)try{let C=JSON.parse(He(P(k,t),"utf-8"));try{process.kill(C.pid,0),_.push(C)}catch{}}catch{}return _}function le(){if(!V)V=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYjAsUCxiNCxqNSxLMCx3NCxwNCx2NCxYNCxDMCxVMCxqNCxLNCxZNCxaNCxSNCx3MD17fSxTMD1bXSxSNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLEEwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gWDAoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gUTQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gWTAoWCxZLFope3ZhciBKLHEsSyxRPXt9O2ZvcihLIGluIFkpSz09ImtleSI/Sj1ZW0tdOks9PSJyZWYiP3E9WVtLXTpRW0tdPVlbS107aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoUS5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YjAuY2FsbChhcmd1bWVudHMsMik6WiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihLIGluIFguZGVmYXVsdFByb3BzKVFbS109PT12b2lkIDAmJihRW0tdPVguZGVmYXVsdFByb3BzW0tdKTtyZXR1cm4gRTAoWCxRLEoscSxudWxsKX1mdW5jdGlvbiBFMChYLFksWixKLHEpe3ZhciBLPXt0eXBlOlgscHJvcHM6WSxrZXk6WixyZWY6SixfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK2I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmUC52bm9kZSE9bnVsbCYmUC52bm9kZShLKSxLfWZ1bmN0aW9uIHgoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gZyhYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX1mdW5jdGlvbiBMMChYLFkpe2lmKFk9PW51bGwpcmV0dXJuIFguX18/TDAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgWjtZPFguX19rLmxlbmd0aDtZKyspaWYoKFo9WC5fX2tbWV0pIT1udWxsJiZaLl9fZSE9bnVsbClyZXR1cm4gWi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/TDAoWCk6bnVsbH1mdW5jdGlvbiB5NShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBZPVguX192LFo9WS5fX2UsSj1bXSxxPVtdLEs9WDAoe30sWSk7Sy5fX3Y9WS5fX3YrMSxQLnZub2RlJiZQLnZub2RlKEspLCQ0KFguX19QLEssWSxYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWS5fX3U/W1pdOm51bGwsSixaPT1udWxsP0wwKFkpOlosISEoMzImWS5fX3UpLHEpLEsuX192PVkuX192LEsuX18uX19rW0suX19pXT1LLGQ0KEosSyxxKSxZLl9fZT1ZLl9fPW51bGwsSy5fX2UhPVomJnk0KEspfX1mdW5jdGlvbiB5NChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFkpe2lmKFkhPW51bGwmJlkuX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVkuX19lfSkseTQoWCl9ZnVuY3Rpb24gSjQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmSzAucHVzaChYKSYmIVQwLl9fcisrfHx3NCE9UC5kZWJvdW5jZVJlbmRlcmluZykmJigodzQ9UC5kZWJvdW5jZVJlbmRlcmluZyl8fHA0KShUMCl9ZnVuY3Rpb24gVDAoKXt0cnl7Zm9yKHZhciBYLFk9MTtLMC5sZW5ndGg7KUswLmxlbmd0aD5ZJiZLMC5zb3J0KHY0KSxYPUswLnNoaWZ0KCksWT1LMC5sZW5ndGgseTUoWCl9ZmluYWxseXtLMC5sZW5ndGg9VDAuX19yPTB9fWZ1bmN0aW9uIGc0KFgsWSxaLEoscSxLLFEseixHLEwsRCl7dmFyIFcsTyxVLGssXyxDLE0sRj1KJiZKLl9fa3x8UzAsRT1ZLmxlbmd0aDtmb3IoRz1nNShaLFksRixHLEUpLFc9MDtXPEU7VysrKShVPVouX19rW1ddKSE9bnVsbCYmKE89VS5fX2khPS0xJiZGW1UuX19pXXx8dzAsVS5fX2k9VyxDPSQ0KFgsVSxPLHEsSyxRLHosRyxMLEQpLGs9VS5fX2UsVS5yZWYmJk8ucmVmIT1VLnJlZiYmKE8ucmVmJiZXNChPLnJlZixudWxsLFUpLEQucHVzaChVLnJlZixVLl9fY3x8ayxVKSksXz09bnVsbCYmayE9bnVsbCYmKF89ayksKE09ISEoNCZVLl9fdSkpfHxPLl9faz09PVUuX19rPyhHPXg0KFUsRyxYLE0pLE0mJk8uX19lJiYoTy5fX2U9bnVsbCkpOnR5cGVvZiBVLnR5cGU9PSJmdW5jdGlvbiImJkMhPT12b2lkIDA/Rz1DOmsmJihHPWsubmV4dFNpYmxpbmcpLFUuX191Jj0tNyk7cmV0dXJuIFouX19lPV8sR31mdW5jdGlvbiBnNShYLFksWixKLHEpe3ZhciBLLFEseixHLEwsRD1aLmxlbmd0aCxXPUQsTz0wO2ZvcihYLl9faz1BcnJheShxKSxLPTA7SzxxO0srKykoUT1ZW0tdKSE9bnVsbCYmdHlwZW9mIFEhPSJib29sZWFuIiYmdHlwZW9mIFEhPSJmdW5jdGlvbiI/KHR5cGVvZiBRPT0ic3RyaW5nInx8dHlwZW9mIFE9PSJudW1iZXIifHx0eXBlb2YgUT09ImJpZ2ludCJ8fFEuY29uc3RydWN0b3I9PVN0cmluZz9RPVguX19rW0tdPUUwKG51bGwsUSxudWxsLG51bGwsbnVsbCk6QTAoUSk/UT1YLl9fa1tLXT1FMCh4LHtjaGlsZHJlbjpRfSxudWxsLG51bGwsbnVsbCk6US5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmUS5fX2I+MD9RPVguX19rW0tdPUUwKFEudHlwZSxRLnByb3BzLFEua2V5LFEucmVmP1EucmVmOm51bGwsUS5fX3YpOlguX19rW0tdPVEsRz1LK08sUS5fXz1YLFEuX19iPVguX19iKzEsej1udWxsLChMPVEuX19pPXg1KFEsWixHLFcpKSE9LTEmJihXLS0sKHo9WltMXSkmJih6Ll9fdXw9MikpLHo9PW51bGx8fHouX192PT1udWxsPyhMPT0tMSYmKHE+RD9PLS06cTxEJiZPKyspLHR5cGVvZiBRLnR5cGUhPSJmdW5jdGlvbiImJihRLl9fdXw9NCkpOkwhPUcmJihMPT1HLTE/Ty0tOkw9PUcrMT9PKys6KEw+Rz9PLS06TysrLFEuX191fD00KSkpOlguX19rW0tdPW51bGw7aWYoVylmb3IoSz0wO0s8RDtLKyspKHo9WltLXSkhPW51bGwmJigyJnouX191KT09MCYmKHouX19lPT1KJiYoSj1MMCh6KSksaDQoeix6KSk7cmV0dXJuIEp9ZnVuY3Rpb24geDQoWCxZLFosSil7dmFyIHEsSztpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxLPTA7cSYmSzxxLmxlbmd0aDtLKyspcVtLXSYmKHFbS10uX189WCxZPXg0KHFbS10sWSxaLEopKTtyZXR1cm4gWX1YLl9fZSE9WSYmKEomJihZJiZYLnR5cGUmJiFZLnBhcmVudE5vZGUmJihZPUwwKFgpKSxaLmluc2VydEJlZm9yZShYLl9fZSxZfHxudWxsKSksWT1YLl9fZSk7ZG8gWT1ZJiZZLm5leHRTaWJsaW5nO3doaWxlKFkhPW51bGwmJlkubm9kZVR5cGU9PTgpO3JldHVybiBZfWZ1bmN0aW9uIFowKFgsWSl7cmV0dXJuIFk9WXx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KEEwKFgpP1guc29tZShmdW5jdGlvbihaKXtaMChaLFkpfSk6WS5wdXNoKFgpKSxZfWZ1bmN0aW9uIHg1KFgsWSxaLEope3ZhciBxLEssUSx6PVgua2V5LEc9WC50eXBlLEw9WVtaXSxEPUwhPW51bGwmJigyJkwuX191KT09MDtpZihMPT09bnVsbCYmej09bnVsbHx8RCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gWjtpZihKPihEPzE6MCkpe2ZvcihxPVotMSxLPVorMTtxPj0wfHxLPFkubGVuZ3RoOylpZigoTD1ZW1E9cT49MD9xLS06SysrXSkhPW51bGwmJigyJkwuX191KT09MCYmej09TC5rZXkmJkc9PUwudHlwZSlyZXR1cm4gUX1yZXR1cm4tMX1mdW5jdGlvbiBTNChYLFksWil7WVswXT09Ii0iP1guc2V0UHJvcGVydHkoWSxaPT1udWxsPyIiOlopOlhbWV09Wj09bnVsbD8iIjp0eXBlb2YgWiE9Im51bWJlciJ8fFI1LnRlc3QoWSk/WjpaKyJweCJ9ZnVuY3Rpb24gTTAoWCxZLFosSixxKXt2YXIgSyxRO1g6aWYoWT09InN0eWxlIilpZih0eXBlb2YgWj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PVo7ZWxzZXtpZih0eXBlb2YgSj09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9Sj0iIiksSilmb3IoWSBpbiBKKVomJlkgaW4gWnx8UzQoWC5zdHlsZSxZLCIiKTtpZihaKWZvcihZIGluIFopSiYmWltZXT09SltZXXx8UzQoWC5zdHlsZSxZLFpbWV0pfWVsc2UgaWYoWVswXT09Im8iJiZZWzFdPT0ibiIpSz1ZIT0oWT1ZLnJlcGxhY2UoajQsIiQxIikpLFE9WS50b0xvd2VyQ2FzZSgpLFk9USBpbiBYfHxZPT0ib25Gb2N1c091dCJ8fFk9PSJvbkZvY3VzSW4iP1Euc2xpY2UoMik6WS5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtZK0tdPVosWj9KP1pbVTBdPUpbVTBdOihaW1UwXT1LNCxYLmFkZEV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWSxLP1o0Olk0LEspO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilZPVkucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWSE9IndpZHRoIiYmWSE9ImhlaWdodCImJlkhPSJocmVmIiYmWSE9Imxpc3QiJiZZIT0iZm9ybSImJlkhPSJ0YWJJbmRleCImJlkhPSJkb3dubG9hZCImJlkhPSJyb3dTcGFuIiYmWSE9ImNvbFNwYW4iJiZZIT0icm9sZSImJlkhPSJwb3BvdmVyIiYmWSBpbiBYKXRyeXtYW1ldPVo9PW51bGw/IiI6WjticmVhayBYfWNhdGNoKHope310eXBlb2YgWj09ImZ1bmN0aW9uInx8KFo9PW51bGx8fFo9PT0hMSYmWVs0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFkpOlguc2V0QXR0cmlidXRlKFksWT09InBvcG92ZXIiJiZaPT0xPyIiOlopKX19ZnVuY3Rpb24gVDQoWCl7cmV0dXJuIGZ1bmN0aW9uKFkpe2lmKHRoaXMubCl7dmFyIFo9dGhpcy5sW1kudHlwZStYXTtpZihZW0MwXT09bnVsbClZW0MwXT1LNCsrO2Vsc2UgaWYoWVtDMF08WltVMF0pcmV0dXJuO3JldHVybiBaKFAuZXZlbnQ/UC5ldmVudChZKTpZKX19fWZ1bmN0aW9uICQ0KFgsWSxaLEoscSxLLFEseixHLEwpe3ZhciBELFcsTyxVLGssXyxDLE0sRixFLEksdixyLGYsaSx5PVkudHlwZTtpZihZLmNvbnN0cnVjdG9yIT09dm9pZCAwKXJldHVybiBudWxsOzEyOCZaLl9fdSYmKEc9ISEoMzImWi5fX3UpLEs9W3o9WS5fX2U9Wi5fX2VdKSwoRD1QLl9fYikmJkQoWSk7WDppZih0eXBlb2YgeT09ImZ1bmN0aW9uIil0cnl7aWYoTT1ZLnByb3BzLEY9eS5wcm90b3R5cGUmJnkucHJvdG90eXBlLnJlbmRlcixFPShEPXkuY29udGV4dFR5cGUpJiZKW0QuX19jXSxJPUQ/RT9FLnByb3BzLnZhbHVlOkQuX186SixaLl9fYz9DPShXPVkuX19jPVouX19jKS5fXz1XLl9fRTooRj9ZLl9fYz1XPW5ldyB5KE0sSSk6KFkuX19jPVc9bmV3IGcoTSxJKSxXLmNvbnN0cnVjdG9yPXksVy5yZW5kZXI9bTUpLEUmJkUuc3ViKFcpLFcuc3RhdGV8fChXLnN0YXRlPXt9KSxXLl9fbj1KLE89Vy5fX2Q9ITAsVy5fX2g9W10sVy5fc2I9W10pLEYmJlcuX19zPT1udWxsJiYoVy5fX3M9Vy5zdGF0ZSksRiYmeS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMhPW51bGwmJihXLl9fcz09Vy5zdGF0ZSYmKFcuX19zPVgwKHt9LFcuX19zKSksWDAoVy5fX3MseS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoTSxXLl9fcykpKSxVPVcucHJvcHMsaz1XLnN0YXRlLFcuX192PVksTylGJiZ5LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09bnVsbCYmVy5jb21wb25lbnRXaWxsTW91bnQhPW51bGwmJlcuY29tcG9uZW50V2lsbE1vdW50KCksRiYmVy5jb21wb25lbnREaWRNb3VudCE9bnVsbCYmVy5fX2gucHVzaChXLmNvbXBvbmVudERpZE1vdW50KTtlbHNle2lmKEYmJnkuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiZNIT09VSYmVy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT1udWxsJiZXLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoTSxJKSxZLl9fdj09Wi5fX3Z8fCFXLl9fZSYmVy5zaG91bGRDb21wb25lbnRVcGRhdGUhPW51bGwmJlcuc2hvdWxkQ29tcG9uZW50VXBkYXRlKE0sVy5fX3MsSSk9PT0hMSl7WS5fX3YhPVouX192JiYoVy5wcm9wcz1NLFcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEpLFkuX19lPVouX19lLFkuX19rPVouX19rLFkuX19rLnNvbWUoZnVuY3Rpb24obSl7bSYmKG0uX189WSl9KSxTMC5wdXNoLmFwcGx5KFcuX19oLFcuX3NiKSxXLl9zYj1bXSxXLl9faC5sZW5ndGgmJlEucHVzaChXKTticmVhayBYfVcuY29tcG9uZW50V2lsbFVwZGF0ZSE9bnVsbCYmVy5jb21wb25lbnRXaWxsVXBkYXRlKE0sVy5fX3MsSSksRiYmVy5jb21wb25lbnREaWRVcGRhdGUhPW51bGwmJlcuX19oLnB1c2goZnVuY3Rpb24oKXtXLmNvbXBvbmVudERpZFVwZGF0ZShVLGssXyl9KX1pZihXLmNvbnRleHQ9SSxXLnByb3BzPU0sVy5fX1A9WCxXLl9fZT0hMSx2PVAuX19yLHI9MCxGKVcuc3RhdGU9Vy5fX3MsVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFMwLnB1c2guYXBwbHkoVy5fX2gsVy5fc2IpLFcuX3NiPVtdO2Vsc2UgZG8gVy5fX2Q9ITEsdiYmdihZKSxEPVcucmVuZGVyKFcucHJvcHMsVy5zdGF0ZSxXLmNvbnRleHQpLFcuc3RhdGU9Vy5fX3M7d2hpbGUoVy5fX2QmJisrcjwyNSk7Vy5zdGF0ZT1XLl9fcyxXLmdldENoaWxkQ29udGV4dCE9bnVsbCYmKEo9WDAoWDAoe30sSiksVy5nZXRDaGlsZENvbnRleHQoKSkpLEYmJiFPJiZXLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT1udWxsJiYoXz1XLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKFUsaykpLGY9RCE9bnVsbCYmRC50eXBlPT09eCYmRC5rZXk9PW51bGw/bTQoRC5wcm9wcy5jaGlsZHJlbik6RCx6PWc0KFgsQTAoZik/ZjpbZl0sWSxaLEoscSxLLFEseixHLEwpLFcuYmFzZT1ZLl9fZSxZLl9fdSY9LTE2MSxXLl9faC5sZW5ndGgmJlEucHVzaChXKSxDJiYoVy5fX0U9Vy5fXz1udWxsKX1jYXRjaChtKXtpZihZLl9fdj1udWxsLEd8fEshPW51bGwpaWYobS50aGVuKXtmb3IoWS5fX3V8PUc/MTYwOjEyODt6JiZ6Lm5vZGVUeXBlPT04JiZ6Lm5leHRTaWJsaW5nOyl6PXoubmV4dFNpYmxpbmc7S1tLLmluZGV4T2YoeildPW51bGwsWS5fX2U9en1lbHNle2ZvcihpPUsubGVuZ3RoO2ktLTspUTQoS1tpXSk7cTQoWSl9ZWxzZSBZLl9fZT1aLl9fZSxZLl9faz1aLl9fayxtLnRoZW58fHE0KFkpO1AuX19lKG0sWSxaKX1lbHNlIEs9PW51bGwmJlkuX192PT1aLl9fdj8oWS5fX2s9Wi5fX2ssWS5fX2U9Wi5fX2UpOno9WS5fX2U9ZDUoWi5fX2UsWSxaLEoscSxLLFEsRyxMKTtyZXR1cm4oRD1QLmRpZmZlZCkmJkQoWSksMTI4JlkuX191P3ZvaWQgMDp6fWZ1bmN0aW9uIHE0KFgpe1gmJihYLl9fYyYmKFguX19jLl9fZT0hMCksWC5fX2smJlguX19rLnNvbWUocTQpKX1mdW5jdGlvbiBkNChYLFksWil7Zm9yKHZhciBKPTA7SjxaLmxlbmd0aDtKKyspVzQoWltKXSxaWysrSl0sWlsrK0pdKTtQLl9fYyYmUC5fX2MoWSxYKSxYLnNvbWUoZnVuY3Rpb24ocSl7dHJ5e1g9cS5fX2gscS5fX2g9W10sWC5zb21lKGZ1bmN0aW9uKEspe0suY2FsbChxKX0pfWNhdGNoKEspe1AuX19lKEsscS5fX3YpfX0pfWZ1bmN0aW9uIG00KFgpe3JldHVybiB0eXBlb2YgWCE9Im9iamVjdCJ8fFg9PW51bGx8fFguX19iPjA/WDpBMChYKT9YLm1hcChtNCk6WDAoe30sWCl9ZnVuY3Rpb24gZDUoWCxZLFosSixxLEssUSx6LEcpe3ZhciBMLEQsVyxPLFUsayxfLEM9Wi5wcm9wc3x8dzAsTT1ZLnByb3BzLEY9WS50eXBlO2lmKEY9PSJzdmciP3E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjpGPT0ibWF0aCI/cT0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI6cXx8KHE9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiKSxLIT1udWxsKXtmb3IoTD0wO0w8Sy5sZW5ndGg7TCsrKWlmKChVPUtbTF0pJiYic2V0QXR0cmlidXRlImluIFU9PSEhRiYmKEY/VS5sb2NhbE5hbWU9PUY6VS5ub2RlVHlwZT09Mykpe1g9VSxLW0xdPW51bGw7YnJlYWt9fWlmKFg9PW51bGwpe2lmKEY9PW51bGwpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKE0pO1g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHEsRixNLmlzJiZNKSx6JiYoUC5fX20mJlAuX19tKFksSyksej0hMSksSz1udWxsfWlmKEY9PW51bGwpQz09PU18fHomJlguZGF0YT09TXx8KFguZGF0YT1NKTtlbHNle2lmKEs9SyYmYjAuY2FsbChYLmNoaWxkTm9kZXMpLCF6JiZLIT1udWxsKWZvcihDPXt9LEw9MDtMPFguYXR0cmlidXRlcy5sZW5ndGg7TCsrKUNbKFU9WC5hdHRyaWJ1dGVzW0xdKS5uYW1lXT1VLnZhbHVlO2ZvcihMIGluIEMpVT1DW0xdLEw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/Vz1VOkw9PSJjaGlsZHJlbiJ8fChMIGluIE0pfHxMPT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBNKXx8TD09ImNoZWNrZWQiJiYoImRlZmF1bHRDaGVja2VkImluIE0pfHxNMChYLEwsbnVsbCxVLHEpO2ZvcihMIGluIE0pVT1NW0xdLEw9PSJjaGlsZHJlbiI/Tz1VOkw9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/RD1VOkw9PSJ2YWx1ZSI/az1VOkw9PSJjaGVja2VkIj9fPVU6eiYmdHlwZW9mIFUhPSJmdW5jdGlvbiJ8fENbTF09PT1VfHxNMChYLEwsVSxDW0xdLHEpO2lmKEQpenx8VyYmKEQuX19odG1sPT1XLl9faHRtbHx8RC5fX2h0bWw9PVguaW5uZXJIVE1MKXx8KFguaW5uZXJIVE1MPUQuX19odG1sKSxZLl9faz1bXTtlbHNlIGlmKFcmJihYLmlubmVySFRNTD0iIiksZzQoWS50eXBlPT0idGVtcGxhdGUiP1guY29udGVudDpYLEEwKE8pP086W09dLFksWixKLEY9PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6cSxLLFEsSz9LWzBdOlouX19rJiZMMChaLDApLHosRyksSyE9bnVsbClmb3IoTD1LLmxlbmd0aDtMLS07KVE0KEtbTF0pO3p8fChMPSJ2YWx1ZSIsRj09InByb2dyZXNzIiYmaz09bnVsbD9YLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTprIT1udWxsJiYoayE9PVhbTF18fEY9PSJwcm9ncmVzcyImJiFrfHxGPT0ib3B0aW9uIiYmayE9Q1tMXSkmJk0wKFgsTCxrLENbTF0scSksTD0iY2hlY2tlZCIsXyE9bnVsbCYmXyE9WFtMXSYmTTAoWCxMLF8sQ1tMXSxxKSl9cmV0dXJuIFh9ZnVuY3Rpb24gVzQoWCxZLFope3RyeXtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIil7dmFyIEo9dHlwZW9mIFguX191PT0iZnVuY3Rpb24iO0omJlguX191KCksSiYmWT09bnVsbHx8KFguX191PVgoWSkpfWVsc2UgWC5jdXJyZW50PVl9Y2F0Y2gocSl7UC5fX2UocSxaKX19ZnVuY3Rpb24gaDQoWCxZLFope3ZhciBKLHE7aWYoUC51bm1vdW50JiZQLnVubW91bnQoWCksKEo9WC5yZWYpJiYoSi5jdXJyZW50JiZKLmN1cnJlbnQhPVguX19lfHxXNChKLG51bGwsWSkpLChKPVguX19jKSE9bnVsbCl7aWYoSi5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7Si5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKEspe1AuX19lKEssWSl9Si5iYXNlPUouX19QPW51bGx9aWYoSj1YLl9faylmb3IocT0wO3E8Si5sZW5ndGg7cSsrKUpbcV0mJmg0KEpbcV0sWSxafHx0eXBlb2YgWC50eXBlIT0iZnVuY3Rpb24iKTtafHxRNChYLl9fZSksWC5fX2M9WC5fXz1YLl9fZT12b2lkIDB9ZnVuY3Rpb24gbTUoWCxZLFope3JldHVybiB0aGlzLmNvbnN0cnVjdG9yKFgsWil9ZnVuY3Rpb24gcDAoWCxZLFope3ZhciBKLHEsSyxRO1k9PWRvY3VtZW50JiYoWT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLFAuX18mJlAuX18oWCxZKSxxPShKPXR5cGVvZiBaPT0iZnVuY3Rpb24iKT9udWxsOlomJlouX19rfHxZLl9fayxLPVtdLFE9W10sJDQoWSxYPSghSiYmWnx8WSkuX19rPVkwKHgsbnVsbCxbWF0pLHF8fHcwLHcwLFkubmFtZXNwYWNlVVJJLCFKJiZaP1taXTpxP251bGw6WS5maXJzdENoaWxkP2IwLmNhbGwoWS5jaGlsZE5vZGVzKTpudWxsLEssIUomJlo/WjpxP3EuX19lOlkuZmlyc3RDaGlsZCxKLFEpLGQ0KEssWCxRKX1mdW5jdGlvbiB6MChYKXtmdW5jdGlvbiBZKFope3ZhciBKLHE7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRDb250ZXh0fHwoSj1uZXcgU2V0LChxPXt9KVtZLl9fY109dGhpcyx0aGlzLmdldENoaWxkQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBxfSx0aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7Sj1udWxsfSx0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihLKXt0aGlzLnByb3BzLnZhbHVlIT1LLnZhbHVlJiZKLmZvckVhY2goZnVuY3Rpb24oUSl7US5fX2U9ITAsSjQoUSl9KX0sdGhpcy5zdWI9ZnVuY3Rpb24oSyl7Si5hZGQoSyk7dmFyIFE9Sy5jb21wb25lbnRXaWxsVW5tb3VudDtLLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7SiYmSi5kZWxldGUoSyksUSYmUS5jYWxsKEspfX0pLFouY2hpbGRyZW59cmV0dXJuIFkuX19jPSJfX2NDIitSNCsrLFkuX189WCxZLlByb3ZpZGVyPVkuX19sPShZLkNvbnN1bWVyPWZ1bmN0aW9uKFosSil7cmV0dXJuIFouY2hpbGRyZW4oSil9KS5jb250ZXh0VHlwZT1ZLFl9YjA9UzAuc2xpY2UsUD17X19lOmZ1bmN0aW9uKFgsWSxaLEope2Zvcih2YXIgcSxLLFE7WT1ZLl9fOylpZigocT1ZLl9fYykmJiFxLl9fKXRyeXtpZigoSz1xLmNvbnN0cnVjdG9yKSYmSy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPW51bGwmJihxLnNldFN0YXRlKEsuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKFgpKSxRPXEuX19kKSxxLmNvbXBvbmVudERpZENhdGNoIT1udWxsJiYocS5jb21wb25lbnREaWRDYXRjaChYLEp8fHt9KSxRPXEuX19kKSxRKXJldHVybiBxLl9fRT1xfWNhdGNoKHope1g9en10aHJvdyBYfX0sYjQ9MCxqNT1mdW5jdGlvbihYKXtyZXR1cm4gWCE9bnVsbCYmWC5jb25zdHJ1Y3Rvcj09PXZvaWQgMH0sZy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oWCxZKXt2YXIgWjtaPXRoaXMuX19zIT1udWxsJiZ0aGlzLl9fcyE9dGhpcy5zdGF0ZT90aGlzLl9fczp0aGlzLl9fcz1YMCh7fSx0aGlzLnN0YXRlKSx0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFg9WChYMCh7fSxaKSx0aGlzLnByb3BzKSksWCYmWDAoWixYKSxYIT1udWxsJiZ0aGlzLl9fdiYmKFkmJnRoaXMuX3NiLnB1c2goWSksSjQodGhpcykpfSxnLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihYKXt0aGlzLl9fdiYmKHRoaXMuX19lPSEwLFgmJnRoaXMuX19oLnB1c2goWCksSjQodGhpcykpfSxnLnByb3RvdHlwZS5yZW5kZXI9eCxLMD1bXSxwND10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpOnNldFRpbWVvdXQsdjQ9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gWC5fX3YuX19iLVkuX192Ll9fYn0sVDAuX19yPTAsWDQ9TWF0aC5yYW5kb20oKS50b1N0cmluZyg4KSxDMD0iX19kIitYNCxVMD0iX19hIitYNCxqND0vKFBvaW50ZXJDYXB0dXJlKSR8Q2FwdHVyZSQvaSxLND0wLFk0PVQ0KCExKSxaND1UNCghMCksUjQ9MDt2YXIgTjAsVCxMNCxmNCxEMD0wLHI0PVtdLGI9UCxhND1iLl9fYixjND1iLl9fcixsND1iLmRpZmZlZCxpND1iLl9fYyxzND1iLnVubW91bnQsbzQ9Yi5fXztmdW5jdGlvbiBqMChYLFkpe2IuX19oJiZiLl9faChULFgsRDB8fFkpLEQwPTA7dmFyIFo9VC5fX0h8fChULl9fSD17X186W10sX19oOltdfSk7cmV0dXJuIFg+PVouX18ubGVuZ3RoJiZaLl9fLnB1c2goe30pLFouX19bWF19ZnVuY3Rpb24gcChYKXtyZXR1cm4gRDA9MSxONChuNCxYKX1mdW5jdGlvbiBONChYLFksWil7dmFyIEo9ajAoTjArKywyKTtpZihKLnQ9WCwhSi5fX2MmJihKLl9fPVtaP1ooWSk6bjQodm9pZCAwLFkpLGZ1bmN0aW9uKHope3ZhciBHPUouX19OP0ouX19OWzBdOkouX19bMF0sTD1KLnQoRyx6KTtHIT09TCYmKEouX19OPVtMLEouX19bMV1dLEouX19jLnNldFN0YXRlKHt9KSl9XSxKLl9fYz1ULCFULl9fZikpe3ZhciBxPWZ1bmN0aW9uKHosRyxMKXtpZighSi5fX2MuX19IKXJldHVybiEwO3ZhciBEPUouX19jLl9fSC5fXy5maWx0ZXIoZnVuY3Rpb24oTyl7cmV0dXJuIE8uX19jfSk7aWYoRC5ldmVyeShmdW5jdGlvbihPKXtyZXR1cm4hTy5fX059KSlyZXR1cm4hS3x8Sy5jYWxsKHRoaXMseixHLEwpO3ZhciBXPUouX19jLnByb3BzIT09ejtyZXR1cm4gRC5zb21lKGZ1bmN0aW9uKE8pe2lmKE8uX19OKXt2YXIgVT1PLl9fWzBdO08uX189Ty5fX04sTy5fX049dm9pZCAwLFUhPT1PLl9fWzBdJiYoVz0hMCl9fSksSyYmSy5jYWxsKHRoaXMseixHLEwpfHxXfTtULl9fZj0hMDt2YXJ7c2hvdWxkQ29tcG9uZW50VXBkYXRlOkssY29tcG9uZW50V2lsbFVwZGF0ZTpRfT1UO1QuY29tcG9uZW50V2lsbFVwZGF0ZT1mdW5jdGlvbih6LEcsTCl7aWYodGhpcy5fX2Upe3ZhciBEPUs7Sz12b2lkIDAscSh6LEcsTCksSz1EfVEmJlEuY2FsbCh0aGlzLHosRyxMKX0sVC5zaG91bGRDb21wb25lbnRVcGRhdGU9cX1yZXR1cm4gSi5fX058fEouX199ZnVuY3Rpb24gZChYLFkpe3ZhciBaPWowKE4wKyssMyk7IWIuX19zJiZ0NChaLl9fSCxZKSYmKFouX189WCxaLnU9WSxULl9fSC5fX2gucHVzaChaKSl9ZnVuY3Rpb24gdyhYKXtyZXR1cm4gRDA9NSxSMChmdW5jdGlvbigpe3JldHVybntjdXJyZW50Olh9fSxbXSl9ZnVuY3Rpb24gUjAoWCxZKXt2YXIgWj1qMChOMCsrLDcpO3JldHVybiB0NChaLl9fSCxZKSYmKFouX189WCgpLFouX19IPVksWi5fX2g9WCksWi5fX31mdW5jdGlvbiBqKFgsWSl7cmV0dXJuIEQwPTgsUjAoZnVuY3Rpb24oKXtyZXR1cm4gWH0sWSl9ZnVuY3Rpb24gUDAoWCl7dmFyIFk9VC5jb250ZXh0W1guX19jXSxaPWowKE4wKyssOSk7cmV0dXJuIFouYz1YLFk/KFouX189PW51bGwmJihaLl9fPSEwLFkuc3ViKFQpKSxZLnByb3BzLnZhbHVlKTpYLl9ffWZ1bmN0aW9uIGg1KCl7Zm9yKHZhciBYO1g9cjQuc2hpZnQoKTspe3ZhciBZPVguX19IO2lmKFguX19QJiZZKXRyeXtZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXX1jYXRjaChaKXtZLl9faD1bXSxiLl9fZShaLFguX192KX19fWIuX19iPWZ1bmN0aW9uKFgpe1Q9bnVsbCxhNCYmYTQoWCl9LGIuX189ZnVuY3Rpb24oWCxZKXtYJiZZLl9fayYmWS5fX2suX19tJiYoWC5fX209WS5fX2suX19tKSxvNCYmbzQoWCxZKX0sYi5fX3I9ZnVuY3Rpb24oWCl7YzQmJmM0KFgpLE4wPTA7dmFyIFk9KFQ9WC5fX2MpLl9fSDtZJiYoTDQ9PT1UPyhZLl9faD1bXSxULl9faD1bXSxZLl9fLnNvbWUoZnVuY3Rpb24oWil7Wi5fX04mJihaLl9fPVouX19OKSxaLnU9Wi5fX049dm9pZCAwfSkpOihZLl9faC5zb21lKHYwKSxZLl9faC5zb21lKHo0KSxZLl9faD1bXSxOMD0wKSksTDQ9VH0sYi5kaWZmZWQ9ZnVuY3Rpb24oWCl7bDQmJmw0KFgpO3ZhciBZPVguX19jO1kmJlkuX19IJiYoWS5fX0guX19oLmxlbmd0aCYmKHI0LnB1c2goWSkhPT0xJiZmND09PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwoKGY0PWIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKXx8ZjUpKGg1KSksWS5fX0guX18uc29tZShmdW5jdGlvbihaKXtaLnUmJihaLl9fSD1aLnUpLFoudT12b2lkIDB9KSksTDQ9VD1udWxsfSxiLl9fYz1mdW5jdGlvbihYLFkpe1kuc29tZShmdW5jdGlvbihaKXt0cnl7Wi5fX2guc29tZSh2MCksWi5fX2g9Wi5fX2guZmlsdGVyKGZ1bmN0aW9uKEope3JldHVybiFKLl9ffHx6NChKKX0pfWNhdGNoKEope1kuc29tZShmdW5jdGlvbihxKXtxLl9faCYmKHEuX19oPVtdKX0pLFk9W10sYi5fX2UoSixaLl9fdil9fSksaTQmJmk0KFgsWSl9LGIudW5tb3VudD1mdW5jdGlvbihYKXtzNCYmczQoWCk7dmFyIFksWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7dHJ5e3YwKEopfWNhdGNoKHEpe1k9cX19KSxaLl9fSD12b2lkIDAsWSYmYi5fX2UoWSxaLl9fdikpfTt2YXIgdTQ9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBmNShYKXt2YXIgWSxaPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KEopLHU0JiZjYW5jZWxBbmltYXRpb25GcmFtZShZKSxzZXRUaW1lb3V0KFgpfSxKPXNldFRpbWVvdXQoWiwzNSk7dTQmJihZPXJlcXVlc3RBbmltYXRpb25GcmFtZShaKSl9ZnVuY3Rpb24gdjAoWCl7dmFyIFk9VCxaPVguX19jO3R5cGVvZiBaPT0iZnVuY3Rpb24iJiYoWC5fX2M9dm9pZCAwLFooKSksVD1ZfWZ1bmN0aW9uIHo0KFgpe3ZhciBZPVQ7WC5fX2M9WC5fXygpLFQ9WX1mdW5jdGlvbiB0NChYLFkpe3JldHVybiFYfHxYLmxlbmd0aCE9PVkubGVuZ3RofHxZLnNvbWUoZnVuY3Rpb24oWixKKXtyZXR1cm4gWiE9PVhbSl19KX1mdW5jdGlvbiBuNChYLFkpe3JldHVybiB0eXBlb2YgWT09ImZ1bmN0aW9uIj9ZKFgpOll9ZnVuY3Rpb24gdTUoWCxZKXtmb3IodmFyIFogaW4gWSlYW1pdPVlbWl07cmV0dXJuIFh9ZnVuY3Rpb24gZTQoWCxZKXtmb3IodmFyIFogaW4gWClpZihaIT09Il9fc291cmNlIiYmIShaIGluIFkpKXJldHVybiEwO2Zvcih2YXIgSiBpbiBZKWlmKEohPT0iX19zb3VyY2UiJiZYW0pdIT09WVtKXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBYNShYLFkpe3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9WX0oWDUucHJvdG90eXBlPW5ldyBnKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxYNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWSl7cmV0dXJuIGU0KHRoaXMucHJvcHMsWCl8fGU0KHRoaXMuc3RhdGUsWSl9O3ZhciBZNT1QLl9fYjtQLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksWTUmJlk1KFgpfTt2YXIgcjU9UC5fX2U7UC5fX2U9ZnVuY3Rpb24oWCxZLFosSil7aWYoWC50aGVuKXtmb3IodmFyIHEsSz1ZO0s9Sy5fXzspaWYoKHE9Sy5fX2MpJiZxLl9fYylyZXR1cm4gWS5fX2U9PW51bGwmJihZLl9fZT1aLl9fZSxZLl9faz1aLl9faykscS5fX2MoWCxZKX1yNShYLFksWixKKX07dmFyIFo1PVAudW5tb3VudDtmdW5jdGlvbiBXNShYLFksWil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oSil7dHlwZW9mIEouX19jPT0iZnVuY3Rpb24iJiZKLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPXU1KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1aJiYoWC5fX2MuX19QPVkpLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKEope3JldHVybiBXNShKLFksWil9KSksWH1mdW5jdGlvbiBMNShYLFksWil7cmV0dXJuIFgmJlomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIEw1KEosWSxaKX0pLFguX19jJiZYLl9fYy5fX1A9PT1ZJiYoWC5fX2UmJlouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9WikpLFh9ZnVuY3Rpb24gRzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gejUoWCl7dmFyIFk9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFkmJlkuX19hJiZZLl9fYShYKX1mdW5jdGlvbiB5MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfVAudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWT1YLl9fYztZJiYoWS5fX3o9ITApLFkmJlkuX19SJiZZLl9fUigpLFkmJjMyJlguX191JiYoWC50eXBlPW51bGwpLFo1JiZaNShYKX0sKEc0LnByb3RvdHlwZT1uZXcgZykuX19jPWZ1bmN0aW9uKFgsWSl7dmFyIFo9WS5fX2MsSj10aGlzO0oubz09bnVsbCYmKEoubz1bXSksSi5vLnB1c2goWik7dmFyIHE9ejUoSi5fX3YpLEs9ITEsUT1mdW5jdGlvbigpe0t8fEouX196fHwoSz0hMCxaLl9fUj1udWxsLHE/cShHKTpHKCkpfTtaLl9fUj1RO3ZhciB6PVouX19QO1ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1KLl9fdSl7aWYoSi5zdGF0ZS5fX2Epe3ZhciBMPUouc3RhdGUuX19hO0ouX192Ll9fa1swXT1MNShMLEwuX19jLl9fUCxMLl9fYy5fX08pfXZhciBEO2ZvcihKLnNldFN0YXRlKHtfX2E6Si5fX2I9bnVsbH0pO0Q9Si5vLnBvcCgpOylELl9fUD16LEQuZm9yY2VVcGRhdGUoKX19O0ouX191Kyt8fDMyJlkuX191fHxKLnNldFN0YXRlKHtfX2E6Si5fX2I9Si5fX3YuX19rWzBdfSksWC50aGVuKFEsUSl9LEc0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sRzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFkpe2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBaPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEo9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09VzUodGhpcy5fX2IsWixKLl9fTz1KLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1ZLl9fYSYmWTAoeCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1kwKHgsbnVsbCxZLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgSjU9ZnVuY3Rpb24oWCxZLFope2lmKCsrWlsxXT09PVpbMF0mJlgubC5kZWxldGUoWSksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKFo9WC5pO1o7KXtmb3IoO1oubGVuZ3RoPjM7KVoucG9wKCkoKTtpZihaWzFdPFpbMF0pYnJlYWs7WC5pPVo9WlsyXX19Oyh5MC5wcm90b3R5cGU9bmV3IGcpLl9fYT1mdW5jdGlvbihYKXt2YXIgWT10aGlzLFo9ejUoWS5fX3YpLEo9WS5sLmdldChYKTtyZXR1cm4gSlswXSsrLGZ1bmN0aW9uKHEpe3ZhciBLPWZ1bmN0aW9uKCl7WS5wcm9wcy5yZXZlYWxPcmRlcj8oSi5wdXNoKHEpLEo1KFksWCxKKSk6cSgpfTtaP1ooSyk6SygpfX0seTAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWT1aMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZZLnJldmVyc2UoKTtmb3IodmFyIFo9WS5sZW5ndGg7Wi0tOyl0aGlzLmwuc2V0KFlbWl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHkwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9eTAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihZLFope0o1KFgsWixZKX0pfTt2YXIgdDU9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsbjU9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLGU1PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sWDY9L1tBLVowLTldL2csWTY9dHlwZW9mIGRvY3VtZW50PCJ1IixaNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2Z1bmN0aW9uIE41KFgsWSxaKXtyZXR1cm4gWS5fX2s9PW51bGwmJihZLnRleHRDb250ZW50PSIiKSxwMChYLFkpLHR5cGVvZiBaPT0iZnVuY3Rpb24iJiZaKCksWD9YLl9fYzpudWxsfWcucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGcucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihZKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6WX0pfX0pfSk7dmFyIHE1PVAuZXZlbnQ7UC5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gcTUmJihYPXE1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgRzUsSjY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEs1PVAudm5vZGU7UC52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWSl7dmFye3Byb3BzOlosdHlwZTpKfT1ZLHE9e30sSz1KLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBRIGluIFope3ZhciB6PVpbUV07aWYoIShRPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gWikmJno9PW51bGx8fFk2JiZRPT09ImNoaWxkcmVuIiYmSj09PSJub3NjcmlwdCJ8fFE9PT0iY2xhc3MifHxRPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1RLnRvTG93ZXJDYXNlKCk7UT09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gWiYmWi52YWx1ZT09bnVsbD9RPSJ2YWx1ZSI6UT09PSJkb3dubG9hZCImJno9PT0hMD96PSIiOkc9PT0idHJhbnNsYXRlIiYmej09PSJubyI/ej0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/UT0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fEohPT0iaW5wdXQiJiZKIT09InRleHRhcmVhInx8WjYoWi50eXBlKT9HPT09Im9uZm9jdXMiP1E9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP1E9Im9uZm9jdXNvdXQiOmU1LnRlc3QoUSkmJihRPUcpOkc9UT0ib25pbnB1dCI6SyYmbjUudGVzdChRKT9RPVEucmVwbGFjZShYNiwiLSQmIikudG9Mb3dlckNhc2UoKTp6PT09bnVsbCYmKHo9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW1E9R10mJihRPSJvbmlucHV0Q2FwdHVyZSIpLHFbUV09en19Sj09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9WjAoWi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihMKXtMLnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZihMLnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PUwucHJvcHMudmFsdWV9KSkpLFouY2xhc3MmJiFaLmNsYXNzTmFtZT8ocS5jbGFzcz1aLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEo2KSk6Wi5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPVouY2xhc3NOYW1lKSxZLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9dDUsSzUmJks1KFgpfTt2YXIgUTU9UC5fX3I7UC5fX3I9ZnVuY3Rpb24oWCl7UTUmJlE1KFgpLEc1PVguX19jfTt2YXIgJDU9UC5kaWZmZWQ7UC5kaWZmZWQ9ZnVuY3Rpb24oWCl7JDUmJiQ1KFgpO3Zhcntwcm9wczpZLF9fZTpafT1YO1ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBZJiZZLnZhbHVlIT09Wi52YWx1ZSYmKFoudmFsdWU9WS52YWx1ZT09bnVsbD8iIjpZLnZhbHVlKSxHNT1udWxsfTtmdW5jdGlvbiBWNShYKXtyZXR1cm4hIVguX19rJiYocDAobnVsbCxYKSwhMCl9ZnVuY3Rpb24gSDUoWCl7cmV0dXJue3JlbmRlcjpmdW5jdGlvbihZKXtONShZLFgpfSx1bm1vdW50OmZ1bmN0aW9uKCl7VjUoWCl9fX1mdW5jdGlvbiBJNShYLFkpe2Zvcih2YXIgWiBpbiBZKVhbWl09WVtaXTtyZXR1cm4gWH1mdW5jdGlvbiBPNShYLFkpe2Zvcih2YXIgWiBpbiBYKWlmKFohPT0iX19zb3VyY2UiJiYhKFogaW4gWSkpcmV0dXJuITA7Zm9yKHZhciBKIGluIFkpaWYoSiE9PSJfX3NvdXJjZSImJlhbSl0hPT1ZW0pdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFU1KFgsWSl7dGhpcy5wcm9wcz1YLHRoaXMuY29udGV4dD1ZfShVNS5wcm90b3R5cGU9bmV3IGcpLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwLFU1LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oWCxZKXtyZXR1cm4gTzUodGhpcy5wcm9wcyxYKXx8TzUodGhpcy5zdGF0ZSxZKX07dmFyIEE1PVAuX19iO1AuX19iPWZ1bmN0aW9uKFgpe1gudHlwZSYmWC50eXBlLl9fZiYmWC5yZWYmJihYLnByb3BzLnJlZj1YLnJlZixYLnJlZj1udWxsKSxBNSYmQTUoWCl9O3ZhciBxNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKXx8MzkxMTtmdW5jdGlvbiBHMChYKXtmdW5jdGlvbiBZKFope3ZhciBKPUk1KHt9LFopO3JldHVybiBkZWxldGUgSi5yZWYsWChKLFoucmVmfHxudWxsKX1yZXR1cm4gWS4kJHR5cGVvZj1xNixZLnJlbmRlcj1YLFkucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9WS5fX2Y9ITAsWS5kaXNwbGF5TmFtZT0iRm9yd2FyZFJlZigiKyhYLmRpc3BsYXlOYW1lfHxYLm5hbWUpKyIpIixZfXZhciBLNj1QLl9fZTtQLl9fZT1mdW5jdGlvbihYLFksWixKKXtpZihYLnRoZW4pe2Zvcih2YXIgcSxLPVk7Sz1LLl9fOylpZigocT1LLl9fYykmJnEuX19jKXJldHVybiBZLl9fZT09bnVsbCYmKFkuX19lPVouX19lLFkuX19rPVouX19rKSxxLl9fYyhYLFkpfUs2KFgsWSxaLEopfTt2YXIgRDU9UC51bm1vdW50O2Z1bmN0aW9uIE01KFgsWSxaKXtyZXR1cm4gWCYmKFguX19jJiZYLl9fYy5fX0gmJihYLl9fYy5fX0guX18uZm9yRWFjaChmdW5jdGlvbihKKXt0eXBlb2YgSi5fX2M9PSJmdW5jdGlvbiImJkouX19jKCl9KSxYLl9fYy5fX0g9bnVsbCksKFg9STUoe30sWCkpLl9fYyE9bnVsbCYmKFguX19jLl9fUD09PVomJihYLl9fYy5fX1A9WSksWC5fX2MuX19lPSEwLFguX19jPW51bGwpLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIE01KEosWSxaKX0pKSxYfWZ1bmN0aW9uIEM1KFgsWSxaKXtyZXR1cm4gWCYmWiYmKFguX192PW51bGwsWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihKKXtyZXR1cm4gQzUoSixZLFopfSksWC5fX2MmJlguX19jLl9fUD09PVkmJihYLl9fZSYmWi5hcHBlbmRDaGlsZChYLl9fZSksWC5fX2MuX19lPSEwLFguX19jLl9fUD1aKSksWH1mdW5jdGlvbiBINCgpe3RoaXMuX191PTAsdGhpcy5vPW51bGwsdGhpcy5fX2I9bnVsbH1mdW5jdGlvbiBFNShYKXt2YXIgWT1YLl9fJiZYLl9fLl9fYztyZXR1cm4gWSYmWS5fX2EmJlkuX19hKFgpfWZ1bmN0aW9uIGcwKCl7dGhpcy5pPW51bGwsdGhpcy5sPW51bGx9UC51bm1vdW50PWZ1bmN0aW9uKFgpe3ZhciBZPVguX19jO1kmJihZLl9fej0hMCksWSYmWS5fX1ImJlkuX19SKCksWSYmMzImWC5fX3UmJihYLnR5cGU9bnVsbCksRDUmJkQ1KFgpfSwoSDQucHJvdG90eXBlPW5ldyBnKS5fX2M9ZnVuY3Rpb24oWCxZKXt2YXIgWj1ZLl9fYyxKPXRoaXM7Si5vPT1udWxsJiYoSi5vPVtdKSxKLm8ucHVzaChaKTt2YXIgcT1FNShKLl9fdiksSz0hMSxRPWZ1bmN0aW9uKCl7S3x8Si5fX3p8fChLPSEwLFouX19SPW51bGwscT9xKEcpOkcoKSl9O1ouX19SPVE7dmFyIHo9Wi5fX1A7Wi5fX1A9bnVsbDt2YXIgRz1mdW5jdGlvbigpe2lmKCEtLUouX191KXtpZihKLnN0YXRlLl9fYSl7dmFyIEw9Si5zdGF0ZS5fX2E7Si5fX3YuX19rWzBdPUM1KEwsTC5fX2MuX19QLEwuX19jLl9fTyl9dmFyIEQ7Zm9yKEouc2V0U3RhdGUoe19fYTpKLl9fYj1udWxsfSk7RD1KLm8ucG9wKCk7KUQuX19QPXosRC5mb3JjZVVwZGF0ZSgpfX07Si5fX3UrK3x8MzImWS5fX3V8fEouc2V0U3RhdGUoe19fYTpKLl9fYj1KLl9fdi5fX2tbMF19KSxYLnRoZW4oUSxRKX0sSDQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5vPVtdfSxINC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgsWSl7aWYodGhpcy5fX2Ipe2lmKHRoaXMuX192Ll9fayl7dmFyIFo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksSj10aGlzLl9fdi5fX2tbMF0uX19jO3RoaXMuX192Ll9fa1swXT1NNSh0aGlzLl9fYixaLEouX19PPUouX19QKX10aGlzLl9fYj1udWxsfXZhciBxPVkuX19hJiZZMCh4LG51bGwsWC5mYWxsYmFjayk7cmV0dXJuIHEmJihxLl9fdSY9LTMzKSxbWTAoeCxudWxsLFkuX19hP251bGw6WC5jaGlsZHJlbikscV19O3ZhciBQNT1mdW5jdGlvbihYLFksWil7aWYoKytaWzFdPT09WlswXSYmWC5sLmRlbGV0ZShZKSxYLnByb3BzLnJldmVhbE9yZGVyJiYoWC5wcm9wcy5yZXZlYWxPcmRlclswXSE9PSJ0Inx8IVgubC5zaXplKSlmb3IoWj1YLmk7Wjspe2Zvcig7Wi5sZW5ndGg+MzspWi5wb3AoKSgpO2lmKFpbMV08WlswXSlicmVhaztYLmk9Wj1aWzJdfX07KGcwLnByb3RvdHlwZT1uZXcgZykuX19hPWZ1bmN0aW9uKFgpe3ZhciBZPXRoaXMsWj1FNShZLl9fdiksSj1ZLmwuZ2V0KFgpO3JldHVybiBKWzBdKyssZnVuY3Rpb24ocSl7dmFyIEs9ZnVuY3Rpb24oKXtZLnByb3BzLnJldmVhbE9yZGVyPyhKLnB1c2gocSksUDUoWSxYLEopKTpxKCl9O1o/WihLKTpLKCl9fSxnMC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKFgpe3RoaXMuaT1udWxsLHRoaXMubD1uZXcgTWFwO3ZhciBZPVowKFguY2hpbGRyZW4pO1gucmV2ZWFsT3JkZXImJlgucmV2ZWFsT3JkZXJbMF09PT0iYiImJlkucmV2ZXJzZSgpO2Zvcih2YXIgWj1ZLmxlbmd0aDtaLS07KXRoaXMubC5zZXQoWVtaXSx0aGlzLmk9WzEsMCx0aGlzLmldKTtyZXR1cm4gWC5jaGlsZHJlbn0sZzAucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1nMC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgWD10aGlzO3RoaXMubC5mb3JFYWNoKGZ1bmN0aW9uKFksWil7UDUoWCxaLFkpfSl9O3ZhciBRNj10eXBlb2YgU3ltYm9sPCJ1IiYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMywkNj0vXig/OmFjY2VudHxhbGlnbm1lbnR8YXJhYmljfGJhc2VsaW5lfGNhcHxjbGlwKD8hUGF0aFUpfGNvbG9yfGRvbWluYW50fGZpbGx8Zmxvb2R8Zm9udHxnbHlwaCg/IVIpfGhvcml6fGltYWdlKCFTKXxsZXR0ZXJ8bGlnaHRpbmd8bWFya2VyKD8hSHxXfFUpfG92ZXJsaW5lfHBhaW50fHBvaW50ZXJ8c2hhcGV8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dHJhbnNmb3JtfHVuZGVybGluZXx1bmljb2RlfHVuaXRzfHZ8dmVjdG9yfHZlcnR8d29yZHx3cml0aW5nfHgoPyFDKSlbQS1aXS8sVzY9L15vbihBbml8VHJhfFRvdXxCZWZvcmVJbnB8Q29tcG8pLyxMNj0vW0EtWjAtOV0vZyx6Nj10eXBlb2YgZG9jdW1lbnQ8InUiLE42PWZ1bmN0aW9uKFgpe3JldHVybih0eXBlb2YgU3ltYm9sPCJ1IiYmdHlwZW9mIFN5bWJvbCgpPT0ic3ltYm9sIj8vZmlsfGNoZXxyYWQvOi9maWx8Y2hlfHJhLykudGVzdChYKX07Zy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD0hMCxbImNvbXBvbmVudFdpbGxNb3VudCIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJjb21wb25lbnRXaWxsVXBkYXRlIl0uZm9yRWFjaChmdW5jdGlvbihYKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZy5wcm90b3R5cGUsWCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzWyJVTlNBRkVfIitYXX0sc2V0OmZ1bmN0aW9uKFkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFgse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpZfSl9fSl9KTt2YXIgQjU9UC5ldmVudDtQLmV2ZW50PWZ1bmN0aW9uKFgpe3JldHVybiBCNSYmKFg9QjUoWCkpLFgucGVyc2lzdD1mdW5jdGlvbigpe30sWC5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbmNlbEJ1YmJsZX0sWC5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZhdWx0UHJldmVudGVkfSxYLm5hdGl2ZUV2ZW50PVh9O3ZhciB3NSxHNj17Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsYXNzfX0sXzU9UC52bm9kZTtQLnZub2RlPWZ1bmN0aW9uKFgpe3R5cGVvZiBYLnR5cGU9PSJzdHJpbmciJiZmdW5jdGlvbihZKXt2YXJ7cHJvcHM6Wix0eXBlOkp9PVkscT17fSxLPUouaW5kZXhPZigiLSIpPT0tMTtmb3IodmFyIFEgaW4gWil7dmFyIHo9WltRXTtpZighKFE9PT0idmFsdWUiJiYoImRlZmF1bHRWYWx1ZSJpbiBaKSYmej09bnVsbHx8ejYmJlE9PT0iY2hpbGRyZW4iJiZKPT09Im5vc2NyaXB0Inx8UT09PSJjbGFzcyJ8fFE9PT0iY2xhc3NOYW1lIikpe3ZhciBHPVEudG9Mb3dlckNhc2UoKTtRPT09ImRlZmF1bHRWYWx1ZSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlPT1udWxsP1E9InZhbHVlIjpRPT09ImRvd25sb2FkIiYmej09PSEwP3o9IiI6Rz09PSJ0cmFuc2xhdGUiJiZ6PT09Im5vIj96PSExOkdbMF09PT0ibyImJkdbMV09PT0ibiI/Rz09PSJvbmRvdWJsZWNsaWNrIj9RPSJvbmRibGNsaWNrIjpHIT09Im9uY2hhbmdlInx8SiE9PSJpbnB1dCImJkohPT0idGV4dGFyZWEifHxONihaLnR5cGUpP0c9PT0ib25mb2N1cyI/UT0ib25mb2N1c2luIjpHPT09Im9uYmx1ciI/UT0ib25mb2N1c291dCI6VzYudGVzdChRKSYmKFE9Ryk6Rz1RPSJvbmlucHV0IjpLJiYkNi50ZXN0KFEpP1E9US5yZXBsYWNlKEw2LCItJCYiKS50b0xvd2VyQ2FzZSgpOno9PT1udWxsJiYoej12b2lkIDApLEc9PT0ib25pbnB1dCImJnFbUT1HXSYmKFE9Im9uaW5wdXRDYXB0dXJlIikscVtRXT16fX1KPT0ic2VsZWN0IiYmKHEubXVsdGlwbGUmJkFycmF5LmlzQXJyYXkocS52YWx1ZSkmJihxLnZhbHVlPVowKFouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oTCl7TC5wcm9wcy5zZWxlY3RlZD1xLnZhbHVlLmluZGV4T2YoTC5wcm9wcy52YWx1ZSkhPS0xfSkpLHEuZGVmYXVsdFZhbHVlIT1udWxsJiYocS52YWx1ZT1aMChaLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe0wucHJvcHMuc2VsZWN0ZWQ9cS5tdWx0aXBsZT9xLmRlZmF1bHRWYWx1ZS5pbmRleE9mKEwucHJvcHMudmFsdWUpIT0tMTpxLmRlZmF1bHRWYWx1ZT09TC5wcm9wcy52YWx1ZX0pKSksWi5jbGFzcyYmIVouY2xhc3NOYW1lPyhxLmNsYXNzPVouY2xhc3MsT2JqZWN0LmRlZmluZVByb3BlcnR5KHEsImNsYXNzTmFtZSIsRzYpKTpaLmNsYXNzTmFtZSYmKHEuY2xhc3M9cS5jbGFzc05hbWU9Wi5jbGFzc05hbWUpLFkucHJvcHM9cX0oWCksWC4kJHR5cGVvZj1RNixfNSYmXzUoWCl9O3ZhciBGNT1QLl9fcjtQLl9fcj1mdW5jdGlvbihYKXtGNSYmRjUoWCksdzU9WC5fX2N9O3ZhciBrNT1QLmRpZmZlZDtQLmRpZmZlZD1mdW5jdGlvbihYKXtrNSYmazUoWCk7dmFye3Byb3BzOlksX19lOlp9PVg7WiE9bnVsbCYmWC50eXBlPT09InRleHRhcmVhIiYmInZhbHVlImluIFkmJlkudmFsdWUhPT1aLnZhbHVlJiYoWi52YWx1ZT1ZLnZhbHVlPT1udWxsPyIiOlkudmFsdWUpLHc1PW51bGx9O3ZhciBWNj0wO2Z1bmN0aW9uICQoWCxZLFosSixxLEspe1l8fChZPXt9KTt2YXIgUSx6LEc9WTtpZigicmVmImluIEcpZm9yKHogaW4gRz17fSxZKXo9PSJyZWYiP1E9WVt6XTpHW3pdPVlbel07dmFyIEw9e3R5cGU6WCxwcm9wczpHLGtleTpaLHJlZjpRLF9fazpudWxsLF9fOm51bGwsX19iOjAsX19lOm51bGwsX19jOm51bGwsY29uc3RydWN0b3I6dm9pZCAwLF9fdjotLVY2LF9faTotMSxfX3U6MCxfX3NvdXJjZTpxLF9fc2VsZjpLfTtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIiYmKFE9WC5kZWZhdWx0UHJvcHMpKWZvcih6IGluIFEpR1t6XT09PXZvaWQgMCYmKEdbel09UVt6XSk7cmV0dXJuIFAudm5vZGUmJlAudm5vZGUoTCksTH12YXIgTzQ9YHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyMCcgaGVpZ2h0PScyMCclM0UlM0NjaXJjbGUgY3g9JzEwJyBjeT0nMTAnIHI9JzknIGZpbGw9J3JnYmEoMjU1LDI1NSwyNTUsMC40KScgc3Ryb2tlPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNyknIHN0cm9rZS13aWR0aD0nMScvJTNFJTNDL3N2ZyUzRSIpIDEwIDEwLCBwb2ludGVyYCxINj0zLE82PTQsVTY9NTtmdW5jdGlvbiB4MCh7dXJsOlgsd3NVcmw6WSxzdHlsZTpaLGltYWdlU3R5bGU6SixjbGFzc05hbWU6cSxvbkhvbWVQcmVzczpLLG9uU3RyZWFtVG91Y2g6USxvblN0cmVhbU11bHRpVG91Y2g6eixvblN0cmVhbUJ1dHRvbjpHLHN1YnNjcmliZUZyYW1lOkwsc3RyZWFtRnJhbWU6RCxzdHJlYW1Db25maWc6VyxoaWRlQ29udHJvbHM6TyxvblN0cmVhbWluZ0NoYW5nZTpVLGNvbm5lY3Rpb25RdWFsaXR5Omt9KXtsZXQgXz0hIVEsQz13KG51bGwpLE09dyhudWxsKSxGPXcobnVsbCksW0UsSV09cCghMSksW3Yscl09cChudWxsKSxbZixpXT1wKG51bGwpLHk9dyhudWxsKSxbbSxjMF09cChudWxsKTtkKCgpPT57bGV0IFY9eS5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKE4pPT57bGV0IEE9TlswXT8uY29udGVudFJlY3Q7aWYoQSljMCh7d2lkdGg6QS53aWR0aCxoZWlnaHQ6QS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W0Q0LFA0XT1wKDApLFcwPXcoMCksW3A1LGwwXT1wKCExKSx0PXcobnVsbCk7ZCgoKT0+e2lmKGs9PT0icG9vciIpe2lmKGwwKCEwKSx0LmN1cnJlbnQpY2xlYXJUaW1lb3V0KHQuY3VycmVudCk7dC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntsMCghMSksdC5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYobDAoITEpLHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KSx0LmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKHQuY3VycmVudCljbGVhclRpbWVvdXQodC5jdXJyZW50KX19LFtrXSk7bGV0IGkwPWAke1h9L3N0cmVhbS5tanBlZ2AsQjQ9dyhVKTtCNC5jdXJyZW50PVUsZCgoKT0+e0I0LmN1cnJlbnQ/LihFKX0sW0VdKSxkKCgpPT57aWYoXyYmVylpKFcpfSxbXyxXXSk7bGV0IF80PXcoITEpO180LmN1cnJlbnQ9RTtsZXQgczA9dyhudWxsKTtkKCgpPT57aWYoIV98fCFMKXJldHVybjtyZXR1cm4gTCgoVik9PntXMC5jdXJyZW50Kys7bGV0IEg9TS5jdXJyZW50O2lmKEgpe2lmKHMwLmN1cnJlbnQpVVJMLnJldm9rZU9iamVjdFVSTChzMC5jdXJyZW50KTtzMC5jdXJyZW50PVYsSC5zcmM9Vn1pZighXzQuY3VycmVudCljb25zb2xlLmxvZygiW3NlcnZlLXNpbV0gZmlyc3QgZnJhbWUgcmVjZWl2ZWQsIHJlbmRlcmluZyIpLEkoITApLHIobnVsbCl9KX0sW18sTF0pO2xldCBjPWooKFYpPT57aWYoXyl7UT8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1INixBLnNldChOLDEpLEguc2VuZChBKX0sW18sUV0pLG8wPWooKFYpPT57aWYoXyl7Rz8uKFYpO3JldHVybn1sZXQgSD1GLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoe2J1dHRvbjpWfSkpLEE9bmV3IFVpbnQ4QXJyYXkoMStOLmxlbmd0aCk7QVswXT1PNixBLnNldChOLDEpLEguc2VuZChBKX0sW18sR10pLG49aigoVik9PntpZihfKXt6Py4oVik7cmV0dXJufWxldCBIPUYuY3VycmVudDtpZighSHx8SC5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBOPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShWKSksQT1uZXcgVWludDhBcnJheSgxK04ubGVuZ3RoKTtBWzBdPVU2LEEuc2V0KE4sMSksSC5zZW5kKEEpfSxbXyx6XSk7ZCgoKT0+e2lmKF8pcmV0dXJuO2ZldGNoKGAke1h9L2NvbmZpZ2ApLnRoZW4oKEIpPT5CLmpzb24oKSkudGhlbigoQik9PntpZihCLndpZHRoPjAmJkIuaGVpZ2h0PjApaShCKX0pLmNhdGNoKCgpPT57fSk7bGV0IFY9WT8/WC5yZXBsYWNlKC9eaHR0cC8sIndzIikrIi93cyIsSD1uZXcgV2ViU29ja2V0KFYpO0guYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLEYuY3VycmVudD1ILEgub25vcGVuPSgpPT57SSghMCkscihudWxsKX0sSC5vbmNsb3NlPSgpPT57SSghMSl9LEgub25lcnJvcj0oKT0+e3IoIldlYlNvY2tldCBjb25uZWN0aW9uIGZhaWxlZCIpLEkoITEpfTtsZXQgTj1uZXcgQWJvcnRDb250cm9sbGVyLEE9c2V0SW50ZXJ2YWwoKCk9PntQNChXMC5jdXJyZW50KSxXMC5jdXJyZW50PTB9LDEwMDApO3JldHVybihhc3luYygpPT57dHJ5e2xldCBTPShhd2FpdCBmZXRjaChpMCx7c2lnbmFsOk4uc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFTKXJldHVybjtsZXQgaD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6bCx2YWx1ZTp1fT1hd2FpdCBTLnJlYWQoKTtpZihsKWJyZWFrO2lmKHUpZm9yKGxldCBlMD0wO2UwPD11Lmxlbmd0aC1oLmxlbmd0aDtlMCsrKXtsZXQgRTQ9ITA7Zm9yKGxldCBJMD0wO0kwPGgubGVuZ3RoO0kwKyspaWYodVtlMCtJMF0hPT1oW0kwXSl7RTQ9ITE7YnJlYWt9aWYoRTQpVzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntOLmFib3J0KCksY2xlYXJJbnRlcnZhbChBKSxILmNsb3NlKCksRi5jdXJyZW50PW51bGx9fSxbWCxpMCxfXSksZCgoKT0+e2lmKCFfKXJldHVybjtsZXQgVj1zZXRJbnRlcnZhbCgoKT0+e1A0KFcwLmN1cnJlbnQpLFcwLmN1cnJlbnQ9MH0sMTAwMCk7cmV0dXJuKCk9PmNsZWFySW50ZXJ2YWwoVil9LFtfXSk7bGV0IGU9aigoKT0+e3JldHVybiBfP00uY3VycmVudDpDLmN1cnJlbnR9LFtfXSksQjA9aigoVixIKT0+e2xldCBOPWUoKTtpZighTilyZXR1cm47bGV0IEE9Ti5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxCPShILmNsaWVudFgtQS5sZWZ0KS9BLndpZHRoLFM9KEguY2xpZW50WS1BLnRvcCkvQS5oZWlnaHQ7Yyh7dHlwZTpWLHg6Qix5OlN9KX0sW2NdKSxRMD0zLGE9dyghMSksbz13KCExKSx1MD13KCExKSxyMD13KHtkeDowLGR5OjB9KSxWMD13KCExKSxbdDAsRjRdPXAoITEpLGs0PXcoe3g6MC41LHk6MC41fSksW3EwLHNdPXAobnVsbCk7ZCgoKT0+e2xldCBWPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpRjQoITApfSxIPShOKT0+e2lmKE4ua2V5PT09IkFsdCIpe2lmKEY0KCExKSwhby5jdXJyZW50KXMobnVsbCl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFYpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsSCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixIKX19LFtdKSxkKCgpPT57aWYodDAmJiFvLmN1cnJlbnQpe2xldCBWPWs0LmN1cnJlbnQ7cyh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIXQwJiYhby5jdXJyZW50KXMobnVsbCl9LFt0MF0pO2xldCBfMD13KG51bGwpLG4wPXcoITEpLEgwPXcoMCksSTQ9aigoVixIKT0+e24wLmN1cnJlbnQ9ITA7bGV0IE49XzAuY3VycmVudDtpZihOKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLEgwLmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57Ti5zdHlsZS5sZWZ0PWAke1YqMTAwfSVgLE4uc3R5bGUudG9wPWAke0gqMTAwfSVgLE4uc3R5bGUuZGlzcGxheT0iYmxvY2sifSl9LFtdKSxNND1qKChWLEgpPT57aWYoIW4wLmN1cnJlbnQpcmV0dXJuO2xldCBOPV8wLmN1cnJlbnQ7aWYoTiljYW5jZWxBbmltYXRpb25GcmFtZShIMC5jdXJyZW50KSxIMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e04uc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxOLnN0eWxlLnRvcD1gJHtIKjEwMH0lYH0pfSxbXSksRjA9aigoKT0+e24wLmN1cnJlbnQ9ITE7bGV0IFY9XzAuY3VycmVudDtpZihWKWNhbmNlbEFuaW1hdGlvbkZyYW1lKEgwLmN1cnJlbnQpLFYuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LFtdKSxDND13KDApLE8wPXcobnVsbCksdjU9aigoKT0+e2xldCBWPURhdGUubm93KCksSD1WLUM0LmN1cnJlbnQ7aWYoQzQuY3VycmVudD1WLEg8MzAwKXtpZihPMC5jdXJyZW50KWNsZWFyVGltZW91dChPMC5jdXJyZW50KSxPMC5jdXJyZW50PW51bGw7aWYoSylLKCk7ZWxzZSBvMCgiYXBwX3N3aXRjaGVyIil9ZWxzZSBPMC5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntpZihLKUsoKTtlbHNlIG8wKCJob21lIik7TzAuY3VycmVudD1udWxsfSwzMDApfSxbbzAsS10pLGswPSgoKT0+e2lmKCFmfHwhbSlyZXR1cm4gbnVsbDtpZihtLndpZHRoPT09MHx8bS5oZWlnaHQ9PT0wKXJldHVybiBudWxsO2xldCBWPU1hdGgubWluKG0ud2lkdGgvZi53aWR0aCxtLmhlaWdodC9mLmhlaWdodCk7cmV0dXJue3dpZHRoOmYud2lkdGgqVixoZWlnaHQ6Zi5oZWlnaHQqVn19KSgpO3JldHVybiAkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixmbGV4OjEsLi4uTz97fTp7Ym9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LG92ZXJmbG93OiJoaWRkZW4iLG1pbldpZHRoOjAsbWluSGVpZ2h0OjAsLi4uWn0sY2xhc3NOYW1lOnEsY2hpbGRyZW46WyQoImRpdiIse3JlZjp5LHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxtaW5IZWlnaHQ6MCxtaW5XaWR0aDowLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LGNoaWxkcmVuOiQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLHdpZHRoOmswP2Ake2swLndpZHRofXB4YDoiMTAwJSIsaGVpZ2h0OmswP2Ake2swLmhlaWdodH1weGA6IjEwMCUifSxjaGlsZHJlbjpbJCgiaW1nIix7cmVmOkMsc3JjOl8/dm9pZCAwOmkwLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKWkoKE4pPT5OJiZOLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJk4uaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P046e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6Xz97ZGlzcGxheToibm9uZSJ9Ontwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSxfJiYkKCJpbWciLHtyZWY6TSxkcmFnZ2FibGU6ITEsb25Mb2FkOihWKT0+e2xldCBIPVYuY3VycmVudFRhcmdldDtpZihILm5hdHVyYWxXaWR0aD4wJiZILm5hdHVyYWxIZWlnaHQ+MClpKChOKT0+TiYmTi53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZOLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9OOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsY3Vyc29yOk80LGRpc3BsYXk6ImJsb2NrIix1c2VyU2VsZWN0OiJub25lIixXZWJraXRVc2VyU2VsZWN0OiJub25lIix0b3VjaEFjdGlvbjoibm9uZSIsLi4uSn19KSwkKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLGN1cnNvcjpPNCx0b3VjaEFjdGlvbjoibm9uZSJ9LG9uTW91c2VEb3duOihWKT0+e1YucHJldmVudERlZmF1bHQoKTtsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKFYuYWx0S2V5KXtvLmN1cnJlbnQ9ITAsdTAuY3VycmVudD1WLnNoaWZ0S2V5O2xldCBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cjAuY3VycmVudD17ZHg6MS1BLUEsZHk6MS1CLUJ9LHMoUyksbih7dHlwZToiYmVnaW4iLC4uLlN9KTtyZXR1cm59aWYoSTQoQSxCKSxCPjAuODgpYS5jdXJyZW50PSEwLGMoe3R5cGU6ImJlZ2luIix4OkEseTpCLGVkZ2U6UTB9KTtlbHNlIGEuY3VycmVudD0hMSxCMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1lKCk7aWYoIUgpcmV0dXJuO2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKGs0LmN1cnJlbnQ9e3g6QSx5OkJ9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KXMoe3gxOkEseTE6Qix4MjoxLUEseTI6MS1CfSk7cmV0dXJufWlmKG8uY3VycmVudCl7bGV0IFM7aWYodTAuY3VycmVudCl7bGV0IGg9cjAuY3VycmVudDtTPXt4MTpBLHkxOkIseDI6QStoLmR4LHkyOkIraC5keX19ZWxzZSBTPXt4MTpBLHkxOkIseDI6MS1BLHkyOjEtQn07cyhTKSxuKHt0eXBlOiJtb3ZlIiwuLi5TfSk7cmV0dXJufWlmKE00KEEsQiksYS5jdXJyZW50KWMoe3R5cGU6Im1vdmUiLHg6QSx5OkIsZWRnZTpRMH0pO2Vsc2UgQjAoIm1vdmUiLFYpfSxvbk1vdXNlVXA6KFYpPT57aWYoby5jdXJyZW50KXtsZXQgSD1lKCk7aWYoSCl7bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxBPShWLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLEI9KFYuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYodTAuY3VycmVudCl7bGV0IFM9cjAuY3VycmVudDtuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjpBK1MuZHgseTI6QitTLmR5fSl9ZWxzZSBuKHt0eXBlOiJlbmQiLHgxOkEseTE6Qix4MjoxLUEseTI6MS1CfSl9aWYoby5jdXJyZW50PSExLCFWLmFsdEtleSlzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1CMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKG8uY3VycmVudCl7aWYocTApbih7dHlwZToiZW5kIiwuLi5xMH0pO28uY3VycmVudD0hMSxzKG51bGwpO3JldHVybn1pZihGMCgpLGEuY3VycmVudCl7bGV0IEg9ZSgpO2lmKEgpe2xldCBOPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksQT0oVi5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxCPShWLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2Moe3R5cGU6ImVuZCIseDpBLHk6QixlZGdlOlEwfSl9YS5jdXJyZW50PSExO3JldHVybn1pZihWLmJ1dHRvbnM+MClCMCgiZW5kIixWKTtzKG51bGwpfSxvblRvdWNoU3RhcnQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWLnRvdWNoZXMubGVuZ3RoPj0yKXtGMCgpO2xldCBoPVYudG91Y2hlc1swXSxsPVYudG91Y2hlc1sxXSx1PXt4MTooaC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MTooaC5jbGllbnRZLU4udG9wKS9OLmhlaWdodCx4MjoobC5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCx5MjoobC5jbGllbnRZLU4udG9wKS9OLmhlaWdodH07aWYoIVYwLmN1cnJlbnQmJiFhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OnUueDEseTp1LnkxfSk7VjAuY3VycmVudD0hMCxvLmN1cnJlbnQ9ITAsYS5jdXJyZW50PSExLHModSksbih7dHlwZToiYmVnaW4iLC4uLnV9KTtyZXR1cm59bGV0IEE9Vi50b3VjaGVzWzBdO2lmKCFBKXJldHVybjtsZXQgQj0oQS5jbGllbnRYLU4ubGVmdCkvTi53aWR0aCxTPShBLmNsaWVudFktTi50b3ApL04uaGVpZ2h0O2lmKEk0KEIsUyksUz4wLjg4KWEuY3VycmVudD0hMCxjKHt0eXBlOiJiZWdpbiIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBhLmN1cnJlbnQ9ITEsYyh7dHlwZToiYmVnaW4iLHg6Qix5OlN9KX0sb25Ub3VjaE1vdmU6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50JiZWLnRvdWNoZXMubGVuZ3RoPj0yKXtsZXQgaD1WLnRvdWNoZXNbMF0sbD1WLnRvdWNoZXNbMV0sdT17eDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6KGwuY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTI6KGwuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHR9O3ModSksbih7dHlwZToibW92ZSIsLi4udX0pO3JldHVybn1sZXQgQT1WLnRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoTTQoQixTKSxhLmN1cnJlbnQpYyh7dHlwZToibW92ZSIseDpCLHk6UyxlZGdlOlEwfSk7ZWxzZSBjKHt0eXBlOiJtb3ZlIix4OkIseTpTfSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWUoKTtpZighSClyZXR1cm47bGV0IE49SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihWMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBoPVYuY2hhbmdlZFRvdWNoZXNbMF0sbD1xMDtpZihoJiZsKW4oe3R5cGU6ImVuZCIseDE6KGguY2xpZW50WC1OLmxlZnQpL04ud2lkdGgseTE6KGguY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQseDI6bC54Mix5MjpsLnkyfSk7ZWxzZSBpZihsKW4oe3R5cGU6ImVuZCIsLi4ubH0pO1YwLmN1cnJlbnQ9ITEsby5jdXJyZW50PSExLHMobnVsbCl9cmV0dXJufWxldCBBPVYuY2hhbmdlZFRvdWNoZXNbMF07aWYoIUEpcmV0dXJuO2xldCBCPShBLmNsaWVudFgtTi5sZWZ0KS9OLndpZHRoLFM9KEEuY2xpZW50WS1OLnRvcCkvTi5oZWlnaHQ7aWYoRjAoKSxhLmN1cnJlbnQpYyh7dHlwZToiZW5kIix4OkIseTpTLGVkZ2U6UTB9KSxhLmN1cnJlbnQ9ITE7ZWxzZSBjKHt0eXBlOiJlbmQiLHg6Qix5OlN9KX19KSwkKCJkaXYiLHtyZWY6XzAsImRhdGEtdGVzdGlkIjoidG91Y2gtaW5kaWNhdG9yIixzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJub25lIix3aWR0aDoyNCxoZWlnaHQ6MjQsYm9yZGVyUmFkaXVzOiI1MCUiLGJhY2tncm91bmQ6InJnYmEoNTksMTMwLDI0NiwwLjUpIixib3hTaGFkb3c6IjAgMCA4cHggcmdiYSg1OSwxMzAsMjQ2LDAuMykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19KSxxMCYmJCh4LHtjaGlsZHJlbjpbJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDEscTAueTEpfSksJCgiZGl2Iix7ImRhdGEtdGVzdGlkIjoiZmluZ2VyLWRvdCIsc3R5bGU6YjUocTAueDIscTAueTIpfSldfSksIUUmJiF2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNH0sY2hpbGRyZW46IkNvbm5lY3RpbmcuLi4ifSl9KSx2JiYkKCJkaXYiLHtzdHlsZTpTNSxjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZjQ0Iixmb250U2l6ZToxNCxwYWRkaW5nOjIwLHRleHRBbGlnbjoiY2VudGVyIn0sY2hpbGRyZW46dn0pfSkscDUmJiQoImRpdiIse3N0eWxlOkE2LGNoaWxkcmVuOiQoInNwYW4iLHtzdHlsZTp7Y29sb3I6IiNmYmJmMjQiLGZvbnRTaXplOjEzLGZvbnRGYW1pbHk6Im1vbm9zcGFjZSJ9LGNoaWxkcmVuOiJTbG93IGNvbm5lY3Rpb24ifSl9KV19KX0pLCFPJiYkKCJkaXYiLHtzdHlsZTp7ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNHB4IDhweCIsYm9yZGVyVG9wOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEyKSJ9LGNoaWxkcmVuOlskKCJidXR0b24iLHtvbkNsaWNrOnY1LHN0eWxlOntiYWNrZ3JvdW5kOiJub25lIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMikiLGNvbG9yOiIjYWFhIixmb250U2l6ZToxMSxmb250RmFtaWx5OiJtb25vc3BhY2UiLHBhZGRpbmc6IjJweCAxMHB4IixjdXJzb3I6InBvaW50ZXIiLGJvcmRlclJhZGl1czo0fSxjaGlsZHJlbjoiSG9tZSJ9KSwkKCJzcGFuIix7c3R5bGU6e2NvbG9yOkQ0PjA/IiM0ZjQiOiIjODg4Iixmb250U2l6ZToxMixmb250RmFtaWx5OiJtb25vc3BhY2UiLGRpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjZ9LGNoaWxkcmVuOltrJiYkKCJzcGFuIix7ImRhdGEtdGVzdGlkIjoicXVhbGl0eS1kb3QiLHN0eWxlOnt3aWR0aDo4LGhlaWdodDo4LGJvcmRlclJhZGl1czoiNTAlIixkaXNwbGF5OiJpbmxpbmUtYmxvY2siLGJhY2tncm91bmQ6az09PSJnb29kIj8iIzRhZGU4MCI6az09PSJkZWdyYWRlZCI/IiNmYWNjMTUiOiIjZWY0NDQ0In19KSxENCwiIGZwcyJdfSldfSldfSl9dmFyIEE2PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDo4LGxlZnQ6IjUwJSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKC01MCUpIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuNykiLGJvcmRlclJhZGl1czo2LHBhZGRpbmc6IjRweCAxMnB4Iixwb2ludGVyRXZlbnRzOiJub25lIn0sUzU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMC44KSJ9LFQ1PTIwO2Z1bmN0aW9uIGI1KFgsWSl7cmV0dXJue3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDpgJHtYKjEwMH0lYCx0b3A6YCR7WSoxMDB9JWAsd2lkdGg6VDUsaGVpZ2h0OlQ1LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC43KSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTUwJSkiLHBvaW50ZXJFdmVudHM6Im5vbmUifX1mdW5jdGlvbiBkMChYKXtpZighWClyZXR1cm4iaXBob25lIjtsZXQgWT1YLnRvTG93ZXJDYXNlKCk7aWYoWS5pbmNsdWRlcygiaXBhZCIpKXJldHVybiJpcGFkIjtpZihZLmluY2x1ZGVzKCJ3YXRjaCIpKXJldHVybiJ3YXRjaCI7aWYoWS5pbmNsdWRlcygidmlzaW9uIikpcmV0dXJuInZpc2lvbiI7cmV0dXJuImlwaG9uZSJ9dmFyIFI9e2lwaG9uZTp7d2lkdGg6NDI3LGhlaWdodDo4ODEsYmV6ZWxYOjE4LGJlemVsWToxOCxpbm5lclJhZGl1czo1NX0saXBhZDp7d2lkdGg6NDMwLGhlaWdodDo2MDUsYmV6ZWxYOjE2LGJlemVsWToxNixpbm5lclJhZGl1czoxMn0sd2F0Y2g6e3dpZHRoOjI3NCxoZWlnaHQ6MzIyLGJlemVsWDoxMixiZXplbFk6MTIsaW5uZXJSYWRpdXM6Nzl9LHZpc2lvbjp7d2lkdGg6NjQwLGhlaWdodDo0MDAsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czozMn19LFU3PVIuaXBob25lLndpZHRoLEE3PVIuaXBob25lLmhlaWdodCxENz1SLmlwaG9uZS5iZXplbFgsUDc9Ui5pcGhvbmUuYmV6ZWxZLEI3PVIuaXBob25lLmlubmVyUmFkaXVzO2Z1bmN0aW9uIFU0KFg9ImlwaG9uZSIpe2xldCBZPVJbWF07cmV0dXJue3RvcDpgJHtZLmJlemVsWS9ZLmhlaWdodCoxMDB9JWAsbGVmdDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxyaWdodDpgJHtZLmJlemVsWC9ZLndpZHRoKjEwMH0lYCxib3R0b206YCR7WS5iZXplbFkvWS5oZWlnaHQqMTAwfSVgfX1mdW5jdGlvbiBtMChYPSJpcGhvbmUiKXtsZXQgWT1SW1hdLFo9WS53aWR0aC0yKlkuYmV6ZWxYLEo9WS5oZWlnaHQtMipZLmJlemVsWTtyZXR1cm5gJHtZLmlubmVyUmFkaXVzL1oqMTAwfSUgLyAke1kuaW5uZXJSYWRpdXMvSioxMDB9JWB9ZnVuY3Rpb24gaDAoe3R5cGU6WD0iaXBob25lIixzdHJlYW1pbmc6WT0hMX0pe3N3aXRjaChYKXtjYXNlImlwYWQiOnJldHVybiAkKEI2LHtzdHJlYW1pbmc6WX0pO2Nhc2Uid2F0Y2giOnJldHVybiAkKF82LHtzdHJlYW1pbmc6WX0pO2Nhc2UidmlzaW9uIjpyZXR1cm4gJChGNix7c3RyZWFtaW5nOll9KTtkZWZhdWx0OnJldHVybiAkKFA2LHtzdHJlYW1pbmc6WX0pfX1mdW5jdGlvbiBQNih7c3RyZWFtaW5nOlg9ITF9KXtyZXR1cm4gJCgic3ZnIix7dmlld0JveDoiMCAwIDQyNyA4ODEiLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjAiLHg6Ii0wLjE2Njk5MiIseToiMC4xNjY1MDQiLHdpZHRoOiI0MjciLGhlaWdodDoiODgwLjY2NyIsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiZWZmZWN0MV9mb3JlZ3JvdW5kQmx1ciJ9KV19KSwkKCJmaWx0ZXIiLHtpZDoiY2hyb21lLWZpbHRlcjEiLHg6IjYuMzMyMzYiLHk6IjYuMzMzODIiLHdpZHRoOiI0MTQiLGhlaWdodDoiODY4IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuMzMzMzMzIixyZXN1bHQ6ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXIifSldfSldfSksJCgicmVjdCIse3g6IjMuODMyNjgiLHk6IjMuODMzNjYiLHdpZHRoOiI0MTkiLGhlaWdodDoiODczIixyeDoiNjYuMTY2NyIsc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiNC4zMzMzMyJ9KSwkKCJyZWN0Iix7eDoiMC44MzMzMzMiLHk6IjAuODMzMzMzIix3aWR0aDoiNDI1IixoZWlnaHQ6Ijg3OSIscng6IjY5LjE2NjciLHN0cm9rZToiIzM3MzczYSIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI2Nocm9tZS1maWx0ZXIwKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjEuNjY2MDIiLHk6IjIiLHdpZHRoOiI0MjMuMzMzIixoZWlnaHQ6Ijg3NyIscng6IjY4LjY2NjciLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2NjcifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjY2hyb21lLWZpbHRlcjEpIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiNy4zMzI2OCIseToiNy4zMzM2NiIsd2lkdGg6IjQxMiIsaGVpZ2h0OiI4NjYiLHJ4OiI2Mi42NjY3IixzdHJva2U6IiM2NDY0NjQiLHN0cm9rZVdpZHRoOiIwLjY2NjY2NyJ9KX0pLCQoInJlY3QiLHt4OiIxNTEuNjY2Iix5OiIzMS42NjciLHdpZHRoOiIxMjMuMzMzIixoZWlnaHQ6IjM2IixyeDoiMTgiLGZpbGw6ImJsYWNrIixzdHlsZTp7b3BhY2l0eTpYPzA6MSx0cmFuc2l0aW9uOiJvcGFjaXR5IDAuM3MgZWFzZSJ9fSldfSl9ZnVuY3Rpb24gQjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui5pcGFkLndpZHRoLFo9Ui5pcGFkLmhlaWdodCxKPTMwLHE9MjY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn0sZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpbJCgiZGVmcyIse2NoaWxkcmVuOlskKCJmaWx0ZXIiLHtpZDoiaXBhZC1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJpcGFkLWdsb3cxIix4OiI1Iix5OiI1Iix3aWR0aDpZLTEwLGhlaWdodDpaLTEwLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46WyQoImZlRmxvb2QiLHtmbG9vZE9wYWNpdHk6IjAiLHJlc3VsdDoiQmFja2dyb3VuZEltYWdlRml4In0pLCQoImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluOiJTb3VyY2VHcmFwaGljIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJzaGFwZSJ9KSwkKCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC4zMzMzMzMiLHJlc3VsdDoiYmx1ciJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMy41Iix5OiIzLjUiLHdpZHRoOlktNyxoZWlnaHQ6Wi03LHJ4OjI2LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjQifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDozMCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mjksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjaXBhZC1nbG93MSkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiI2Iix5OiI2Iix3aWR0aDpZLTEyLGhlaWdodDpaLTEyLHJ4OjI0LHN0cm9rZToiIzY0NjQ2NCIsc3Ryb2tlV2lkdGg6IjAuNjY2In0pfSksJCgiY2lyY2xlIix7Y3g6WS8yLGN5OlIuaXBhZC5iZXplbFkvMisxLHI6IjMiLGZpbGw6IiMxYTFhMWEiLHN0eWxlOntvcGFjaXR5Olg/MDowLjgsdHJhbnNpdGlvbjoib3BhY2l0eSAwLjNzIGVhc2UifX0pLCQoInJlY3QiLHt4OihZLTEyMCkvMix5OlotUi5pcGFkLmJlemVsWS8yLTIuNSx3aWR0aDoiMTIwIixoZWlnaHQ6IjUiLHJ4OiIyLjUiLGZpbGw6IndoaXRlIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zNSxtaXhCbGVuZE1vZGU6ImRpZmZlcmVuY2UiLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX1mdW5jdGlvbiBfNih7c3RyZWFtaW5nOlg9ITF9KXtsZXQgWT1SLndhdGNoLndpZHRoLFo9Ui53YXRjaC5oZWlnaHQsSj04OCxxPTgyLEs9OCxRPTM2LHo9Wi8yLTE4LTE2LEc9MjIsTD1aLzItMTErMTY7cmV0dXJuICQoInN2ZyIse3ZpZXdCb3g6YDAgMCAke1l9ICR7Wn1gLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixvdmVyZmxvdzoidmlzaWJsZSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjokKCJmaWx0ZXIiLHtpZDoid2F0Y2gtZ2xvdzAiLHg6IjAiLHk6IjAiLHdpZHRoOlkrMTIsaGVpZ2h0OlosZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjUiLHJlc3VsdDoiYmx1ciJ9KV19KX0pLCQoInJlY3QiLHt4OlktMix5Onosd2lkdGg6OCxoZWlnaHQ6MzYscng6IjMiLGZpbGw6IiMyYTJhMmMiLHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEifSksJCgicmVjdCIse3g6WS0xLHk6TCx3aWR0aDo2LGhlaWdodDoyMixyeDoiMi41IixmaWxsOiIjMmEyYTJjIixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIwLjgifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDo4MixzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzLjUifSksJCgicmVjdCIse3g6IjAuODMzIix5OiIwLjgzMyIsd2lkdGg6WS0xLjY2NixoZWlnaHQ6Wi0xLjY2NixyeDo4OCxzdHJva2U6IiMzNzM3M2EiLHN0cm9rZVdpZHRoOiIxLjY2NiJ9KSwkKCJnIix7b3BhY2l0eToiMC45IixmaWx0ZXI6InVybCgjd2F0Y2gtZ2xvdzApIixjaGlsZHJlbjokKCJyZWN0Iix7eDoiMS41Iix5OiIxLjUiLHdpZHRoOlktMyxoZWlnaHQ6Wi0zLHJ4Ojg3LHN0cm9rZToiIzQ1NDU0OCIsc3Ryb2tlV2lkdGg6IjEuNjY2In0pfSldfSl9ZnVuY3Rpb24gRjYoe3N0cmVhbWluZzpYPSExfSl7bGV0IFk9Ui52aXNpb24ud2lkdGgsWj1SLnZpc2lvbi5oZWlnaHQsSj00MCxxPTM0O3JldHVybiAkKCJzdmciLHt2aWV3Qm94OmAwIDAgJHtZfSAke1p9YCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9LGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46WyQoImRlZnMiLHtjaGlsZHJlbjpbJCgiZmlsdGVyIix7aWQ6InZpc2lvbi1nbG93MCIseDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlskKCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSwkKCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksJCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNSIscmVzdWx0OiJibHVyIn0pXX0pLCQoImZpbHRlciIse2lkOiJ2aXNpb24tZ2xvdzEiLHg6IjUiLHk6IjUiLHdpZHRoOlktMTAsaGVpZ2h0OlotMTAsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbJCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksJCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLCQoImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjMzMyIscmVzdWx0OiJibHVyIn0pXX0pLCQoImxpbmVhckdyYWRpZW50Iix7aWQ6InZpc2lvbi1nbGFzcyIseDE6IjAiLHkxOiIwIix4MjoiMCIseTI6IjEiLGNoaWxkcmVuOlskKCJzdG9wIix7b2Zmc2V0OiIwJSIsc3RvcENvbG9yOiIjNTU1NTU4IixzdG9wT3BhY2l0eToiMC4zIn0pLCQoInN0b3AiLHtvZmZzZXQ6IjEwMCUiLHN0b3BDb2xvcjoiIzNhM2EzZCIsc3RvcE9wYWNpdHk6IjAuMSJ9KV19KV19KSwkKCJyZWN0Iix7eDoiMCIseToiMCIsd2lkdGg6WSxoZWlnaHQ6WixyeDo0MCxmaWxsOiJ1cmwoI3Zpc2lvbi1nbGFzcykifSksJCgicmVjdCIse3g6IjMuNSIseToiMy41Iix3aWR0aDpZLTcsaGVpZ2h0OlotNyxyeDozNCxzdHJva2U6IiM0NTQ1NDgiLHN0cm9rZVdpZHRoOiIzIn0pLCQoInJlY3QiLHt4OiIwLjgzMyIseToiMC44MzMiLHdpZHRoOlktMS42NjYsaGVpZ2h0OlotMS42NjYscng6NDAsc3Ryb2tlOiIjMzczNzNhIixzdHJva2VXaWR0aDoiMS42NjYifSksJCgiZyIse29wYWNpdHk6IjAuOSIsZmlsdGVyOiJ1cmwoI3Zpc2lvbi1nbG93MCkiLGNoaWxkcmVuOiQoInJlY3QiLHt4OiIxLjUiLHk6IjEuNSIsd2lkdGg6WS0zLGhlaWdodDpaLTMscng6Mzksc3Ryb2tlOiIjNDU0NTQ4IixzdHJva2VXaWR0aDoiMS42NjYifSl9KSwkKCJnIix7b3BhY2l0eToiMC44IixmaWx0ZXI6InVybCgjdmlzaW9uLWdsb3cxKSIsY2hpbGRyZW46JCgicmVjdCIse3g6IjYiLHk6IjYiLHdpZHRoOlktMTIsaGVpZ2h0OlotMTIscng6MzIsc3Ryb2tlOiIjNjQ2NDY0IixzdHJva2VXaWR0aDoiMC42NjYifSl9KSwkKCJlbGxpcHNlIix7Y3g6WS8yLGN5OlovMixyeDpZLzItMzAscnk6Wi8yLTI0LHN0cm9rZToiIzRhNGE0ZCIsc3Ryb2tlV2lkdGg6IjAuNSIsb3BhY2l0eToiMC4zIixzdHlsZTp7b3BhY2l0eTpYPzA6MC4zLHRyYW5zaXRpb246Im9wYWNpdHkgMC4zcyBlYXNlIn19KV19KX12YXIgQTQ9ejAobnVsbCk7ZnVuY3Rpb24gZjAoWCl7bGV0IFk9UDAoQTQpO2lmKCFZKXRocm93IEVycm9yKGA8U2ltdWxhdG9yVG9vbGJhci4ke1h9PiBtdXN0IGJlIHJlbmRlcmVkIGluc2lkZSA8U2ltdWxhdG9yVG9vbGJhcj5gKTtyZXR1cm4gWX12YXIgTTY9e2Rpc3BsYXk6ImZsZXgiLGZsZXhXcmFwOiJ3cmFwIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJzcGFjZS1iZXR3ZWVuIixnYXA6IjRweCAxMnB4IixwYWRkaW5nOiI4cHggMTJweCIsYm9yZGVyUmFkaXVzOjI0LGJhY2tncm91bmQ6IiMxYzFjMWUiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSIsYm94U2hhZG93OiIwIDFweCAycHggcmdiYSgwLDAsMCwwLjIpIixtaW5XaWR0aDoyNDAsd2lkdGg6IjEwMCUifTtmdW5jdGlvbiBDNih7ZXhlYzpYLGRldmljZVVkaWQ6WSxkZXZpY2VOYW1lOlosZGV2aWNlUnVudGltZTpKLHN0cmVhbWluZzpxPSExLGRpc2FibGVkOks9ITEsY2hpbGRyZW46USxzdHlsZTp6LC4uLkd9KXtsZXQgTD1kMChaKSxXPXtleGVjOlgsZGV2aWNlVWRpZDpZLGRldmljZU5hbWU6WixkZXZpY2VSdW50aW1lOkosZGV2aWNlVHlwZTpMLHN0cmVhbWluZzpxLGRpc2FibGVkOkt8fCFZfHwhcX07cmV0dXJuICQoQTQuUHJvdmlkZXIse3ZhbHVlOlcsY2hpbGRyZW46JCgiZGl2Iix7ImRhdGEtc2ltdWxhdG9yLXRvb2xiYXIiOiEwLHN0eWxlOnsuLi5NNiwuLi56fSwuLi5HLGNoaWxkcmVuOlF9KX0pfXZhciBFNj17ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixhbGlnbkl0ZW1zOiJmbGV4LXN0YXJ0Iix0ZXh0QWxpZ246ImxlZnQiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjZmZmIixwYWRkaW5nOiIycHggNHB4IixtYXJnaW46Ii0ycHggLTRweCIsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixtaW5XaWR0aDowLG1heFdpZHRoOiIxMDAlIixsaW5lSGVpZ2h0OjEuMixmb250RmFtaWx5OiJpbmhlcml0In0sdzY9RzAoZnVuY3Rpb24oe25hbWU6WSxzdWJ0aXRsZTpaLGhpZGVDaGV2cm9uOkosc3R5bGU6cSxvbk1vdXNlRW50ZXI6Syxvbk1vdXNlTGVhdmU6USwuLi56fSxHKXtsZXQgTD1mMCgiVGl0bGUiKSxbRCxXXT1wKCExKSxPPVk/P0wuZGV2aWNlTmFtZT8/Ik5vIHNpbXVsYXRvciIsVT1aPz8oTC5kZXZpY2VSdW50aW1lP0wuZGV2aWNlUnVudGltZS5yZXBsYWNlKC9cLi8sIiAiKToi4oCUIik7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsImRhdGEtc2ltdWxhdG9yLXRvb2xiYXItdGl0bGUiOiEwLG9uTW91c2VFbnRlcjooayk9PntXKCEwKSxLPy4oayl9LG9uTW91c2VMZWF2ZTooayk9PntXKCExKSxRPy4oayl9LHN0eWxlOnsuLi5FNixiYWNrZ3JvdW5kOkQ/InJnYmEoMjU1LDI1NSwyNTUsMC4xKSI6InRyYW5zcGFyZW50IiwuLi5xfSwuLi56LGNoaWxkcmVuOlskKCJzcGFuIix7c3R5bGU6e2Rpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo0LGZvbnRTaXplOjEyLGZvbnRXZWlnaHQ6NjAwLGNvbG9yOiIjZmZmIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46W08sIUomJiQoInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIuNSIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsc3R5bGU6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGZsZXhTaHJpbms6MH0sY2hpbGRyZW46JCgicG9seWxpbmUiLHtwb2ludHM6IjYgOSAxMiAxNSAxOCA5In0pfSldfSksJCgic3BhbiIse3N0eWxlOntmb250U2l6ZToxMCxjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjUpIixtYXhXaWR0aDoiMTAwJSIsb3ZlcmZsb3c6ImhpZGRlbiIsdGV4dE92ZXJmbG93OiJlbGxpcHNpcyIsd2hpdGVTcGFjZToibm93cmFwIn0sY2hpbGRyZW46VX0pXX0pfSksUzY9e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZmxleFNocmluazowfTtmdW5jdGlvbiBUNih7c3R5bGU6WCwuLi5ZfSl7cmV0dXJuICQoImRpdiIse3N0eWxlOnsuLi5TNiwuLi5YfSwuLi5ZfSl9dmFyIGI2PXtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixwYWRkaW5nOjYsYm9yZGVyUmFkaXVzOjYsY3Vyc29yOiJwb2ludGVyIixkaXNwbGF5OiJpbmxpbmUtZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIix0cmFuc2l0aW9uOiJiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cyJ9LGEwPUcwKGZ1bmN0aW9uKHtmb3JjZURpc2FibGVkOlksc3R5bGU6WixkaXNhYmxlZDpKLG9uTW91c2VFbnRlcjpxLG9uTW91c2VMZWF2ZTpLLGNoaWxkcmVuOlEsLi4uen0sRyl7bGV0IEw9UDAoQTQpLEQ9Snx8WXx8TD8uZGlzYWJsZWQsW1csT109cCghMSk7cmV0dXJuICQoImJ1dHRvbiIse3JlZjpHLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6RCxvbk1vdXNlRW50ZXI6KFUpPT57TyghMCkscT8uKFUpfSxvbk1vdXNlTGVhdmU6KFUpPT57TyghMSksSz8uKFUpfSxzdHlsZTp7Li4uYjYsY29sb3I6RD8icmdiYSgyNTUsMjU1LDI1NSwwLjI1KSI6InJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYmFja2dyb3VuZDpXJiYhRD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLGN1cnNvcjpEPyJub3QtYWxsb3dlZCI6InBvaW50ZXIiLC4uLlp9LC4uLnosY2hpbGRyZW46UX0pfSk7ZnVuY3Rpb24gcDYoKXtyZXR1cm5bJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBzZXQgZnJvbnRtb3N0IHRvIHRydWUnLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gcGVyZm9ybSBhY3Rpb24gIkFYUmFpc2UiIG9mIChmaXJzdCB3aW5kb3cgd2hvc2UgbmFtZSBjb250YWlucyAid2F0Y2hPUyIpJywndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIGNsaWNrIG1lbnUgaXRlbSAiSG9tZSIgb2YgbWVudSAiRGV2aWNlIiBvZiBtZW51IGJhciBpdGVtICJEZXZpY2UiIG9mIG1lbnUgYmFyIDEnXS5tYXAoKFkpPT5gLWUgJyR7WX0nYCkucmVkdWNlKChZLFopPT5gJHtZfSAke1p9YCwib3Nhc2NyaXB0Iil9dmFyIHY2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOiQoInBhdGgiLHtkOiJNMyAxMC41IDEyIDNsOSA3LjVWMjBhMSAxIDAgMCAxLTEgMWgtNXYtN2gtNnY3SDRhMSAxIDAgMCAxLTEtMXoifSl9KSxqNj0kKCJzdmciLHt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjaGlsZHJlbjpbJCgicGF0aCIse2Q6Ik0xNC41IDRoLTVMNyA3SDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTN6In0pLCQoImNpcmNsZSIse2N4OiIxMiIsY3k6IjEzIixyOiI0In0pXX0pLFI2PSQoInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDEyIDEzIixmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46JCgicGF0aCIse2Q6Ik0xMC4yMzA1IDEyLjgwNzdINC40MjM4M0MzLjkyMzgzIDEyLjgwNzcgMy41NDY4OCAxMi42ODQ2IDMuMjkyOTcgMTIuNDM4NUMzLjA0Mjk3IDEyLjE5NjMgMi45MTc5NyAxMS44MTk0IDIuOTE3OTcgMTEuMzA3N1Y1LjUxMjc0QzIuOTE3OTcgNC45OTcxMSAzLjA0Mjk3IDQuNjE4MjEgMy4yOTI5NyA0LjM3NjAyQzMuNTQ2ODggNC4xMjk5MyAzLjkyMzgzIDQuMDA2ODggNC40MjM4MyA0LjAwNjg4SDEwLjIzMDVDMTAuNzM0NCA0LjAwNjg4IDExLjExMTMgNC4xMjk5MyAxMS4zNjEzIDQuMzc2MDJDMTEuNjExMyA0LjYxODIxIDExLjczNjMgNC45OTcxMSAxMS43MzYzIDUuNTEyNzRWMTEuMzA3N0MxMS43MzYzIDExLjgxOTQgMTEuNjExMyAxMi4xOTYzIDExLjM2MTMgMTIuNDM4NUMxMS4xMTEzIDEyLjY4NDYgMTAuNzM0NCAxMi44MDc3IDEwLjIzMDUgMTIuODA3N1pNMTAuMjEyOSAxMS44NjQzQzEwLjQxNiAxMS44NjQzIDEwLjU2MjUgMTEuODE5NCAxMC42NTIzIDExLjcyOTVDMTAuNzQ2MSAxMS42NDM2IDEwLjc5MyAxMS40OTcxIDEwLjc5MyAxMS4yOTAxVjUuNTI0NDZDMTAuNzkzIDUuMzE3NDMgMTAuNzQ2MSA1LjE3MDk0IDEwLjY1MjMgNS4wODUwMUMxMC41NjI1IDQuOTk1MTYgMTAuNDE2IDQuOTUwMjQgMTAuMjEyOSA0Ljk1MDI0SDQuNDQxNDFDNC4yNDIxOSA0Ljk1MDI0IDQuMDk1NyA0Ljk5NTE2IDQuMDAxOTUgNS4wODUwMUMzLjkwODIgNS4xNzA5NCAzLjg2MTMzIDUuMzE3NDMgMy44NjEzMyA1LjUyNDQ2VjExLjI5MDFDMy44NjEzMyAxMS40OTcxIDMuOTA4MiAxMS42NDM2IDQuMDAxOTUgMTEuNzI5NUM0LjA5NTcgMTEuODE5NCA0LjI0MjE5IDExLjg2NDMgNC40NDE0MSAxMS44NjQzSDEwLjIxMjlaTTIuOTE3OTcgMi41ODMwNVYwLjQxNTA4M0MyLjkxNzk3IDAuMjAwMjQgMi45ODYzMyAwLjA2OTM4MDMgMy4xMjMwNSAwLjAyMjUwNTNDMy4yNTk3NyAtMC4wMjgyNzU5IDMuNDEwMTYgMC4wMDY4ODAzMyAzLjU3NDIyIDAuMTI3OTc0TDUuMDUwNzggMS4yMTE5NkM1LjE3NTc4IDEuMzA1NzEgNS4yMzgyOCAxLjQwMTQxIDUuMjM4MjggMS40OTkwN0M1LjIzODI4IDEuNTk2NzIgNS4xNzU3OCAxLjY5MjQzIDUuMDUwNzggMS43ODYxOEwzLjU3NDIyIDIuODY0M0MzLjQxMDE2IDIuOTg1NCAzLjI1OTc3IDMuMDIyNTEgMy4xMjMwNSAyLjk3NTYzQzIuOTg2MzMgMi45MjQ4NSAyLjkxNzk3IDIuNzkzOTkgMi45MTc5NyAyLjU4MzA1Wk0zLjUzMzIgMS4xNTMzNkMzLjYyNjk1IDEuMTUzMzYgMy43MDcwMyAxLjE4NjU3IDMuNzczNDQgMS4yNTI5N0MzLjg0Mzc1IDEuMzE5MzggMy44Nzg5MSAxLjM5NzUxIDMuODc4OTEgMS40ODczNUMzLjg3ODkxIDEuNTgxMSAzLjg0Mzc1IDEuNjYzMTMgMy43NzM0NCAxLjczMzQ0QzMuNzA3MDMgMS43OTk4NSAzLjYyNjk1IDEuODMzMDUgMy41MzMyIDEuODMzMDVIMi44MDY2NEMyLjM4MDg2IDEuODMzMDUgMi4wMTE3MiAxLjkyNDg1IDEuNjk5MjIgMi4xMDg0NEMxLjM5MDYyIDIuMjg4MTMgMS4xNTIzNCAyLjUzODEzIDAuOTg0Mzc1IDIuODU4NDRDMC44MTY0MDYgMy4xNzg3NiAwLjczMjQyMiAzLjU0NTk0IDAuNzMyNDIyIDMuOTYwMDFWNC44Mzg5MUMwLjczMjQyMiA0LjkzNjU3IDAuNjk3MjY2IDUuMDIyNTEgMC42MjY5NTMgNS4wOTY3MkMwLjU1MjczNCA1LjE2NzA0IDAuNDY0ODQ0IDUuMjAyMTkgMC4zNjMyODEgNS4yMDIxOUMwLjI2NTYyNSA1LjIwMjE5IDAuMTgxNjQxIDUuMTY3MDQgMC4xMTEzMjggNS4wOTY3MkMwLjAzNzEwOTQgNS4wMjI1MSAwIDQuOTM2NTcgMCA0LjgzODkxVjMuOTYwMDFDMCAzLjQwMTQxIDAuMTE3MTg4IDIuOTExMTggMC4zNTE1NjIgMi40ODkzQzAuNTgyMDMxIDIuMDY3NDMgMC45MDgyMDMgMS43MzkzIDEuMzMwMDggMS41MDQ5M0MxLjc0ODA1IDEuMjcwNTUgMi4yMzgyOCAxLjE1MzM2IDIuODAwNzggMS4xNTMzNkgzLjUzMzJaIn0pfSkseTY9RzAoZnVuY3Rpb24oe29uQ2xpY2s6WSwuLi5afSxKKXtsZXQgcT1mMCgiSG9tZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IkhvbWUiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VUeXBlPT09IndhdGNoIilxLmV4ZWMocDYoKSk7ZWxzZSBxLmV4ZWMoInNlcnZlLXNpbSBidXR0b24gaG9tZSIpfSwuLi5aLGNoaWxkcmVuOnY2fSl9KSxnNj1HMChmdW5jdGlvbih7b25DbGljazpZLC4uLlp9LEope2xldCBxPWYwKCJTY3JlZW5zaG90QnV0dG9uIik7cmV0dXJuICQoYTAse3JlZjpKLCJhcmlhLWxhYmVsIjoiU2NyZWVuc2hvdCIsb25DbGljazooSyk9PntpZihZPy4oSyksSy5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGB4Y3J1biBzaW1jdGwgaW8gJHtxLmRldmljZVVkaWR9IHNjcmVlbnNob3Qgfi9EZXNrdG9wL2hhdGNoLXNjcmVlbnNob3QtJChkYXRlICslcykucG5nYCl9LC4uLlosY2hpbGRyZW46ajZ9KX0pLHg2PUcwKGZ1bmN0aW9uKHtvbkNsaWNrOlksLi4uWn0sSil7bGV0IHE9ZjAoIlJvdGF0ZUJ1dHRvbiIpO3JldHVybiAkKGEwLHtyZWY6SiwiYXJpYS1sYWJlbCI6IlJvdGF0ZSBkZXZpY2UiLG9uQ2xpY2s6KEspPT57aWYoWT8uKEspLEsuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYocS5kZXZpY2VVZGlkKXEuZXhlYyhgb3Nhc2NyaXB0IC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTaW11bGF0b3IiIHRvIGFjdGl2YXRlJyAtZSAndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8ga2V5IGNvZGUgMTI0IHVzaW5nIHtjb21tYW5kIGRvd259J2ApfSwuLi5aLGNoaWxkcmVuOlI2fSl9KSwkMD1DNjskMC5UaXRsZT13NjskMC5BY3Rpb25zPVQ2OyQwLkJ1dHRvbj1hMDskMC5Ib21lQnV0dG9uPXk2OyQwLlNjcmVlbnNob3RCdXR0b249ZzY7JDAuUm90YXRlQnV0dG9uPXg2O2Z1bmN0aW9uIGQ2KFgpe2xldFtZLFpdPXAobnVsbCksSj13KG5ldyBTZXQpLFtxLEtdPXAobnVsbCksUT1qKCh6KT0+e3JldHVybiBKLmN1cnJlbnQuYWRkKHopLCgpPT57Si5jdXJyZW50LmRlbGV0ZSh6KX19LFtdKTtyZXR1cm4gZCgoKT0+e2lmKCFYKXJldHVybjtsZXQgej1uZXcgQWJvcnRDb250cm9sbGVyLEc9WC5yZXBsYWNlKC9cL3N0cmVhbVwubWpwZWckLywiIik7cmV0dXJuIGZldGNoKGAke0d9L2NvbmZpZ2Ase3NpZ25hbDp6LnNpZ25hbH0pLnRoZW4oKEwpPT5MLmpzb24oKSkudGhlbigoTCk9PntpZihMLndpZHRoPjAmJkwuaGVpZ2h0PjApWihMKX0pLmNhdGNoKCgpPT57fSksKGFzeW5jKCk9Pnt0cnl7bGV0IEQ9KGF3YWl0IGZldGNoKFgse3NpZ25hbDp6LnNpZ25hbH0pKS5ib2R5Py5nZXRSZWFkZXIoKTtpZighRClyZXR1cm47bGV0IFc9bmV3IFVpbnQ4QXJyYXkoMCk7d2hpbGUoITApe2xldHtkb25lOk8sdmFsdWU6VX09YXdhaXQgRC5yZWFkKCk7aWYoTylicmVhaztsZXQgaz1uZXcgVWludDhBcnJheShXLmxlbmd0aCtVLmxlbmd0aCk7ay5zZXQoVyksay5zZXQoVSxXLmxlbmd0aCksVz1rO3doaWxlKCEwKXtsZXQgXz0tMTtmb3IobGV0IEk9MDtJPFcubGVuZ3RoLTE7SSsrKWlmKFdbSV09PT0yNTUmJldbSSsxXT09PTIxNil7Xz1JO2JyZWFrfWlmKF89PT0tMSlicmVhaztsZXQgQz0tMTtmb3IobGV0IEk9XysyO0k8Vy5sZW5ndGgtMTtJKyspaWYoV1tJXT09PTI1NSYmV1tJKzFdPT09MjE3KXtDPUkrMjticmVha31pZihDPT09LTEpYnJlYWs7bGV0IE09Vy5zbGljZShfLEMpO1c9Vy5zbGljZShDKTtsZXQgRj1uZXcgQmxvYihbTV0se3R5cGU6ImltYWdlL2pwZWcifSksRT1VUkwuY3JlYXRlT2JqZWN0VVJMKEYpO0soRSk7Zm9yKGxldCBJIG9mIEouY3VycmVudClJKEUpfX19Y2F0Y2h7fX0pKCksKCk9PnouYWJvcnQoKX0sW1hdKSx7c3Vic2NyaWJlRnJhbWU6USxmcmFtZTpxLGNvbmZpZzpZfX1mdW5jdGlvbiBtNigpe2xldCBYPXdpbmRvdy5fX1NJTV9QUkVWSUVXX18sW1ksWl09cCghMSk7aWYoZCgoKT0+e2lmKCFYPy5sb2dzRW5kcG9pbnQpcmV0dXJuO2xldCBPPW5ldyBFdmVudFNvdXJjZShYLmxvZ3NFbmRwb2ludCksVT1uZXcgTWFwLGs9WyIjOGJlOWZkIiwiIzUwZmE3YiIsIiNmZmI4NmMiLCIjZmY3OWM2IiwiI2JkOTNmOSIsIiNmMWZhOGMiLCIjNjI3MmE0IiwiI2ZmNTU1NSIsIiM2OWZmOTQiLCIjZDZhY2ZmIiwiI2ZmZmZhNSIsIiNhNGZmZmYiLCIjZmY2ZTZlIiwiI2NhYTlmYSIsIiM1YWY3OGUiXTtmdW5jdGlvbiBfKEYpe2xldCBFPVUuZ2V0KEYpO2lmKCFFKXtsZXQgST0wO2ZvcihsZXQgdj0wO3Y8Ri5sZW5ndGg7disrKUk9KEk8PDUpLUkrRi5jaGFyQ29kZUF0KHYpfDA7RT1rW01hdGguYWJzKEkpJWsubGVuZ3RoXSxVLnNldChGLEUpfXJldHVybiBFfWxldCBDPSIiLE09ITE7cmV0dXJuIE8ub25tZXNzYWdlPShGKT0+e3RyeXtsZXQgRT1KU09OLnBhcnNlKEYuZGF0YSksST1FLnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P0Uuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIix2PUUuc3Vic3lzdGVtPz8iIixyPUUuY2F0ZWdvcnk/PyIiLGY9RS5ldmVudE1lc3NhZ2U/PyIiO2lmKCFmKXJldHVybjtpZihJIT09Qyl7aWYoTSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IGMwPV8oSSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke0l9JHt2P2AgJWMke3Z9JHtyPyI6IityOiIifWA6IiJ9YCxgY29sb3I6JHtjMH07Zm9udC13ZWlnaHQ6Ym9sZGAsLi4udj9bImNvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsIl06W10pLE09ITAsQz1JfWxldCBpPShFLm1lc3NhZ2VUeXBlPz8iIikudG9Mb3dlckNhc2UoKSx5PXYmJkk9PT1DP2AlYyR7cnx8dn0lYyBgOiIiLG09eT9bImNvbG9yOiM4ODg7Zm9udC1zdHlsZTppdGFsaWMiLCJjb2xvcjppbmhlcml0Il06W107aWYoaT09PSJmYXVsdCJ8fGk9PT0iZXJyb3IiKWNvbnNvbGUubG9nKGAke3l9JWMke2Z9YCwuLi5tLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihpPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt5fSVjJHtmfWAsLi4ubSwiY29sb3I6IzYyNzJhNCIpO2Vsc2UgY29uc29sZS5sb2coYCR7eX0lYyR7Zn1gLC4uLm0sImNvbG9yOmluaGVyaXQiKX1jYXRjaHt9fSwoKT0+e2lmKE0pY29uc29sZS5ncm91cEVuZCgpO08uY2xvc2UoKX19LFtYPy5sb2dzRW5kcG9pbnRdKSwhWClyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjokKCJkaXYiLHtzdHlsZTpKMC5lbXB0eSxjaGlsZHJlbjpbJCgiaDEiLHtzdHlsZTpKMC5lbXB0eVRpdGxlLGNoaWxkcmVuOiJObyBzZXJ2ZS1zaW0gc3RyZWFtIHJ1bm5pbmcifSksJCgicCIse3N0eWxlOkowLmVtcHR5SGludCxjaGlsZHJlbjpbIkJvb3QgYW4gaU9TIHNpbXVsYXRvciBhbmQgc3RhcnQgYSBIYXRjaCBzdHJlYW0gd2l0aCIsIiAiLCQoImNvZGUiLHtzdHlsZTpKMC5jb2RlLGNoaWxkcmVuOiJidW54IHNlcnZlLXNpbSAtLWRldGFjaCJ9KSwiLCB0aGVuIHJlbG9hZC4iXX0pXX0pfSk7bGV0IEo9Ui5pcGhvbmUscT1VNCgiaXBob25lIiksSz1tMCgiaXBob25lIiksUT1kNihYLnN0cmVhbVVybCksej13KG51bGwpO2QoKCk9PntsZXQgTz1uZXcgV2ViU29ja2V0KFgud3NVcmwpO3JldHVybiBPLmJpbmFyeVR5cGU9ImFycmF5YnVmZmVyIix6LmN1cnJlbnQ9TywoKT0+e08uY2xvc2UoKSx6LmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IEc9aigoTyxVKT0+e2xldCBrPXouY3VycmVudDtpZigha3x8ay5yZWFkeVN0YXRlIT09V2ViU29ja2V0Lk9QRU4pcmV0dXJuO2xldCBfPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShVKSksQz1uZXcgVWludDhBcnJheSgxK18ubGVuZ3RoKTtDWzBdPU8sQy5zZXQoXywxKSxrLnNlbmQoQyl9LFtdKSxMPWooKE8pPT5HKDMsTyksW0ddKSxEPWooKE8pPT5HKDUsTyksW0ddKSxXPWooKE8pPT5HKDQse2J1dHRvbjpPfSksW0ddKTtyZXR1cm4gJCgiZGl2Iix7c3R5bGU6SjAucGFnZSxjaGlsZHJlbjpbJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbWF4V2lkdGg6MzIwLHdpZHRoOiIxMDAlIixhc3BlY3RSYXRpbzpgJHtKLndpZHRofSAvICR7Si5oZWlnaHR9YH0sY2hpbGRyZW46WyQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLnF9LGNoaWxkcmVuOiQoeDAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOkssY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOlosb25TdHJlYW1Ub3VjaDpMLG9uU3RyZWFtTXVsdGlUb3VjaDpELG9uU3RyZWFtQnV0dG9uOlcsc3Vic2NyaWJlRnJhbWU6US5zdWJzY3JpYmVGcmFtZSxzdHJlYW1GcmFtZTpRLmZyYW1lLHN0cmVhbUNvbmZpZzpRLmNvbmZpZ30pfSksJCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCxwb2ludGVyRXZlbnRzOiJub25lIix6SW5kZXg6MTB9LGNoaWxkcmVuOiQoaDAse3R5cGU6ImlwaG9uZSIsc3RyZWFtaW5nOll9KX0pXX0pLCQoImRpdiIse3N0eWxlOkowLmJhcixjaGlsZHJlbjokKCJzcGFuIix7c3R5bGU6ey4uLkowLmxpdmUsY29sb3I6WT8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbJCgic3BhbiIse3N0eWxlOnsuLi5KMC5kb3QsYmFja2dyb3VuZDpZPyIjNGFkZTgwIjoiIzY2NiJ9fSksWT8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIEowPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX07SDUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJvb3QiKSkucmVuZGVyKCQobTYse30pKTsKPC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+","base64").toString("utf-8");return V}function ge(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,C,S)=>{let A=t.url??"";if(A===_||A===_+"/"){let i=N()[0]??null,r=le();if(i){let R=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...i,logsEndpoint:_+"/logs"})}</script>`;r=r.replace("<!--__SIM_PREVIEW_CONFIG__-->",R)}C.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),C.end(r);return}if(A===_+"/api"){let B=N();C.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),C.end(JSON.stringify(B[0]||null));return}if(A===_+"/logs"||A.startsWith(_+"/logs?")){let B=N();if(B.length===0){C.writeHead(404),C.end("No serve-sim device");return}let i=B[0].device;C.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),C.write(`:
|
|
3
|
+
var Be=Object.defineProperty;var fe=(e)=>e;function Te(e,_){this[e]=fe.bind(null,_)}var pe=(e,_)=>{for(var t in _)Be(e,t,{get:_[t],enumerable:!0,configurable:!0,set:Te.bind(_,t)})};var De=(e,_)=>()=>(e&&(_=e(e=0)),_);var X={};pe(X,{simMiddleware:()=>Le});import{readdirSync as Fe,readFileSync as ue,existsSync as ge}from"fs";import{spawn as U,exec as we,execFile as ve}from"child_process";import{tmpdir as be}from"os";import{join as V}from"path";function He(e){return!me.test(e)}function Ne(e,_){if(he.has(_))return Promise.resolve(!0);return new Promise((t)=>{ve("xcrun",["simctl","get_app_container",e,_,"app"],{timeout:2000},(s,r)=>{if(s)return t(!1);let C=r.trim();if(!C)return t(!1);for(let o of Oe)if(ge(V(C,o)))return t(!0);t(!1)})})}function b(){let e;try{e=Fe(k).filter((t)=>t.startsWith("server-")&&t.endsWith(".json"))}catch{return[]}let _=[];for(let t of e)try{let s=JSON.parse(ue(V(k,t),"utf-8"));try{process.kill(s.pid,0),_.push(s)}catch{}}catch{}return _}function Ve(){if(!N)N=Buffer.from("PCFkb2N0eXBlIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj4KPHRpdGxlPlNpbXVsYXRvciBQcmV2aWV3PC90aXRsZT4KPHN0eWxlPiosKjo6YmVmb3JlLCo6OmFmdGVye2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufTwvc3R5bGU+CjwvaGVhZD48Ym9keT4KPGRpdiBpZD0icm9vdCI+PC9kaXY+CjwhLS1fX1NJTV9QUkVWSUVXX0NPTkZJR19fLS0+CjxzY3JpcHQgdHlwZT0ibW9kdWxlIj52YXIgYzAsQixSNCx4NSxQMCxUNCxqNCx2NCxLNCxtMCxUMCx5NCxONCwkNCx6NCxwNCxmMD17fSxhMD1bXSxoNT0vYWNpdHxleCg/OnN8Z3xufHB8JCl8cnBofGdyaWR8b3dzfG1uY3xudHd8aW5lW2NoXXx6b298Xm9yZHxpdGVyYS9pLGIwPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gejAoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gRzQoWCl7WCYmWC5wYXJlbnROb2RlJiZYLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWCl9ZnVuY3Rpb24gVzAoWCxaLEope3ZhciBZLHEsUSxLPXt9O2ZvcihRIGluIFopUT09ImtleSI/WT1aW1FdOlE9PSJyZWYiP3E9WltRXTpLW1FdPVpbUV07aWYoYXJndW1lbnRzLmxlbmd0aD4yJiYoSy5jaGlsZHJlbj1hcmd1bWVudHMubGVuZ3RoPjM/YzAuY2FsbChhcmd1bWVudHMsMik6SiksdHlwZW9mIFg9PSJmdW5jdGlvbiImJlguZGVmYXVsdFByb3BzIT1udWxsKWZvcihRIGluIFguZGVmYXVsdFByb3BzKUtbUV09PT12b2lkIDAmJihLW1FdPVguZGVmYXVsdFByb3BzW1FdKTtyZXR1cm4gZDAoWCxLLFkscSxudWxsKX1mdW5jdGlvbiBkMChYLFosSixZLHEpe3ZhciBRPXt0eXBlOlgscHJvcHM6WixrZXk6SixyZWY6WSxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6cT09bnVsbD8rK1I0OnEsX19pOi0xLF9fdTowfTtyZXR1cm4gcT09bnVsbCYmQi52bm9kZSE9bnVsbCYmQi52bm9kZShRKSxRfWZ1bmN0aW9uIGQoWCl7cmV0dXJuIFguY2hpbGRyZW59ZnVuY3Rpb24gYyhYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn1mdW5jdGlvbiBCMChYLFope2lmKFo9PW51bGwpcmV0dXJuIFguX18/QjAoWC5fXyxYLl9faSsxKTpudWxsO2Zvcih2YXIgSjtaPFguX19rLmxlbmd0aDtaKyspaWYoKEo9WC5fX2tbWl0pIT1udWxsJiZKLl9fZSE9bnVsbClyZXR1cm4gSi5fX2U7cmV0dXJuIHR5cGVvZiBYLnR5cGU9PSJmdW5jdGlvbiI/QjAoWCk6bnVsbH1mdW5jdGlvbiBtNShYKXtpZihYLl9fUCYmWC5fX2Qpe3ZhciBaPVguX192LEo9Wi5fX2UsWT1bXSxxPVtdLFE9ejAoe30sWik7US5fX3Y9Wi5fX3YrMSxCLnZub2RlJiZCLnZub2RlKFEpLFY0KFguX19QLFEsWixYLl9fbixYLl9fUC5uYW1lc3BhY2VVUkksMzImWi5fX3U/W0pdOm51bGwsWSxKPT1udWxsP0IwKFopOkosISEoMzImWi5fX3UpLHEpLFEuX192PVouX192LFEuX18uX19rW1EuX19pXT1RLG00KFksUSxxKSxaLl9fZT1aLl9fPW51bGwsUS5fX2UhPUomJmc0KFEpfX1mdW5jdGlvbiBnNChYKXtpZigoWD1YLl9fKSE9bnVsbCYmWC5fX2MhPW51bGwpcmV0dXJuIFguX19lPVguX19jLmJhc2U9bnVsbCxYLl9fay5zb21lKGZ1bmN0aW9uKFope2lmKFohPW51bGwmJlouX19lIT1udWxsKXJldHVybiBYLl9fZT1YLl9fYy5iYXNlPVouX19lfSksZzQoWCl9ZnVuY3Rpb24gVzQoWCl7KCFYLl9fZCYmKFguX19kPSEwKSYmUDAucHVzaChYKSYmIWwwLl9fcisrfHxUNCE9Qi5kZWJvdW5jZVJlbmRlcmluZykmJigoVDQ9Qi5kZWJvdW5jZVJlbmRlcmluZyl8fGo0KShsMCl9ZnVuY3Rpb24gbDAoKXt0cnl7Zm9yKHZhciBYLFo9MTtQMC5sZW5ndGg7KVAwLmxlbmd0aD5aJiZQMC5zb3J0KHY0KSxYPVAwLnNoaWZ0KCksWj1QMC5sZW5ndGgsbTUoWCl9ZmluYWxseXtQMC5sZW5ndGg9bDAuX19yPTB9fWZ1bmN0aW9uIHg0KFgsWixKLFkscSxRLEssVyxHLHosUCl7dmFyICQsXyxPLEMsQSxrLEksTT1ZJiZZLl9fa3x8YTAsaD1aLmxlbmd0aDtmb3IoRz1kNShKLFosTSxHLGgpLCQ9MDskPGg7JCsrKShPPUouX19rWyRdKSE9bnVsbCYmKF89Ty5fX2khPS0xJiZNW08uX19pXXx8ZjAsTy5fX2k9JCxrPVY0KFgsTyxfLHEsUSxLLFcsRyx6LFApLEM9Ty5fX2UsTy5yZWYmJl8ucmVmIT1PLnJlZiYmKF8ucmVmJiZINChfLnJlZixudWxsLE8pLFAucHVzaChPLnJlZixPLl9fY3x8QyxPKSksQT09bnVsbCYmQyE9bnVsbCYmKEE9QyksKEk9ISEoNCZPLl9fdSkpfHxfLl9faz09PU8uX19rPyhHPWg0KE8sRyxYLEkpLEkmJl8uX19lJiYoXy5fX2U9bnVsbCkpOnR5cGVvZiBPLnR5cGU9PSJmdW5jdGlvbiImJmshPT12b2lkIDA/Rz1rOkMmJihHPUMubmV4dFNpYmxpbmcpLE8uX191Jj0tNyk7cmV0dXJuIEouX19lPUEsR31mdW5jdGlvbiBkNShYLFosSixZLHEpe3ZhciBRLEssVyxHLHosUD1KLmxlbmd0aCwkPVAsXz0wO2ZvcihYLl9faz1BcnJheShxKSxRPTA7UTxxO1ErKykoSz1aW1FdKSE9bnVsbCYmdHlwZW9mIEshPSJib29sZWFuIiYmdHlwZW9mIEshPSJmdW5jdGlvbiI/KHR5cGVvZiBLPT0ic3RyaW5nInx8dHlwZW9mIEs9PSJudW1iZXIifHx0eXBlb2YgSz09ImJpZ2ludCJ8fEsuY29uc3RydWN0b3I9PVN0cmluZz9LPVguX19rW1FdPWQwKG51bGwsSyxudWxsLG51bGwsbnVsbCk6YjAoSyk/Sz1YLl9fa1tRXT1kMChkLHtjaGlsZHJlbjpLfSxudWxsLG51bGwsbnVsbCk6Sy5jb25zdHJ1Y3Rvcj09PXZvaWQgMCYmSy5fX2I+MD9LPVguX19rW1FdPWQwKEsudHlwZSxLLnByb3BzLEsua2V5LEsucmVmP0sucmVmOm51bGwsSy5fX3YpOlguX19rW1FdPUssRz1RK18sSy5fXz1YLEsuX19iPVguX19iKzEsVz1udWxsLCh6PUsuX19pPWY1KEssSixHLCQpKSE9LTEmJigkLS0sKFc9Slt6XSkmJihXLl9fdXw9MikpLFc9PW51bGx8fFcuX192PT1udWxsPyh6PT0tMSYmKHE+UD9fLS06cTxQJiZfKyspLHR5cGVvZiBLLnR5cGUhPSJmdW5jdGlvbiImJihLLl9fdXw9NCkpOnohPUcmJih6PT1HLTE/Xy0tOno9PUcrMT9fKys6KHo+Rz9fLS06XysrLEsuX191fD00KSkpOlguX19rW1FdPW51bGw7aWYoJClmb3IoUT0wO1E8UDtRKyspKFc9SltRXSkhPW51bGwmJigyJlcuX191KT09MCYmKFcuX19lPT1ZJiYoWT1CMChXKSksZjQoVyxXKSk7cmV0dXJuIFl9ZnVuY3Rpb24gaDQoWCxaLEosWSl7dmFyIHEsUTtpZih0eXBlb2YgWC50eXBlPT0iZnVuY3Rpb24iKXtmb3IocT1YLl9fayxRPTA7cSYmUTxxLmxlbmd0aDtRKyspcVtRXSYmKHFbUV0uX189WCxaPWg0KHFbUV0sWixKLFkpKTtyZXR1cm4gWn1YLl9fZSE9WiYmKFkmJihaJiZYLnR5cGUmJiFaLnBhcmVudE5vZGUmJihaPUIwKFgpKSxKLmluc2VydEJlZm9yZShYLl9fZSxafHxudWxsKSksWj1YLl9fZSk7ZG8gWj1aJiZaLm5leHRTaWJsaW5nO3doaWxlKFohPW51bGwmJloubm9kZVR5cGU9PTgpO3JldHVybiBafWZ1bmN0aW9uIEwwKFgsWil7cmV0dXJuIFo9Wnx8W10sWD09bnVsbHx8dHlwZW9mIFg9PSJib29sZWFuInx8KGIwKFgpP1guc29tZShmdW5jdGlvbihKKXtMMChKLFopfSk6Wi5wdXNoKFgpKSxafWZ1bmN0aW9uIGY1KFgsWixKLFkpe3ZhciBxLFEsSyxXPVgua2V5LEc9WC50eXBlLHo9WltKXSxQPXohPW51bGwmJigyJnouX191KT09MDtpZih6PT09bnVsbCYmVz09bnVsbHx8UCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gSjtpZihZPihQPzE6MCkpe2ZvcihxPUotMSxRPUorMTtxPj0wfHxRPFoubGVuZ3RoOylpZigoej1aW0s9cT49MD9xLS06USsrXSkhPW51bGwmJigyJnouX191KT09MCYmVz09ei5rZXkmJkc9PXoudHlwZSlyZXR1cm4gS31yZXR1cm4tMX1mdW5jdGlvbiBiNChYLFosSil7WlswXT09Ii0iP1guc2V0UHJvcGVydHkoWixKPT1udWxsPyIiOkopOlhbWl09Sj09bnVsbD8iIjp0eXBlb2YgSiE9Im51bWJlciJ8fGg1LnRlc3QoWik/SjpKKyJweCJ9ZnVuY3Rpb24gaDAoWCxaLEosWSxxKXt2YXIgUSxLO1g6aWYoWj09InN0eWxlIilpZih0eXBlb2YgSj09InN0cmluZyIpWC5zdHlsZS5jc3NUZXh0PUo7ZWxzZXtpZih0eXBlb2YgWT09InN0cmluZyImJihYLnN0eWxlLmNzc1RleHQ9WT0iIiksWSlmb3IoWiBpbiBZKUomJlogaW4gSnx8YjQoWC5zdHlsZSxaLCIiKTtpZihKKWZvcihaIGluIEopWSYmSltaXT09WVtaXXx8YjQoWC5zdHlsZSxaLEpbWl0pfWVsc2UgaWYoWlswXT09Im8iJiZaWzFdPT0ibiIpUT1aIT0oWj1aLnJlcGxhY2UoeTQsIiQxIikpLEs9Wi50b0xvd2VyQ2FzZSgpLFo9SyBpbiBYfHxaPT0ib25Gb2N1c091dCJ8fFo9PSJvbkZvY3VzSW4iP0suc2xpY2UoMik6Wi5zbGljZSgyKSxYLmx8fChYLmw9e30pLFgubFtaK1FdPUosSj9ZP0pbVDBdPVlbVDBdOihKW1QwXT1ONCxYLmFkZEV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpKTpYLnJlbW92ZUV2ZW50TGlzdGVuZXIoWixRP3o0OiQ0LFEpO2Vsc2V7aWYocT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIilaPVoucmVwbGFjZSgveGxpbmsoSHw6aCkvLCJoIikucmVwbGFjZSgvc05hbWUkLywicyIpO2Vsc2UgaWYoWiE9IndpZHRoIiYmWiE9ImhlaWdodCImJlohPSJocmVmIiYmWiE9Imxpc3QiJiZaIT0iZm9ybSImJlohPSJ0YWJJbmRleCImJlohPSJkb3dubG9hZCImJlohPSJyb3dTcGFuIiYmWiE9ImNvbFNwYW4iJiZaIT0icm9sZSImJlohPSJwb3BvdmVyIiYmWiBpbiBYKXRyeXtYW1pdPUo9PW51bGw/IiI6SjticmVhayBYfWNhdGNoKFcpe310eXBlb2YgSj09ImZ1bmN0aW9uInx8KEo9PW51bGx8fEo9PT0hMSYmWls0XSE9Ii0iP1gucmVtb3ZlQXR0cmlidXRlKFopOlguc2V0QXR0cmlidXRlKFosWj09InBvcG92ZXIiJiZKPT0xPyIiOkopKX19ZnVuY3Rpb24gUzQoWCl7cmV0dXJuIGZ1bmN0aW9uKFope2lmKHRoaXMubCl7dmFyIEo9dGhpcy5sW1oudHlwZStYXTtpZihaW20wXT09bnVsbClaW20wXT1ONCsrO2Vsc2UgaWYoWlttMF08SltUMF0pcmV0dXJuO3JldHVybiBKKEIuZXZlbnQ/Qi5ldmVudChaKTpaKX19fWZ1bmN0aW9uIFY0KFgsWixKLFkscSxRLEssVyxHLHope3ZhciBQLCQsXyxPLEMsQSxrLEksTSxoLEUsbixRMCxnLEswLHM9Wi50eXBlO2lmKFouY29uc3RydWN0b3IhPT12b2lkIDApcmV0dXJuIG51bGw7MTI4JkouX191JiYoRz0hISgzMiZKLl9fdSksUT1bVz1aLl9fZT1KLl9fZV0pLChQPUIuX19iKSYmUChaKTtYOmlmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXRyeXtpZihJPVoucHJvcHMsTT1zLnByb3RvdHlwZSYmcy5wcm90b3R5cGUucmVuZGVyLGg9KFA9cy5jb250ZXh0VHlwZSkmJllbUC5fX2NdLEU9UD9oP2gucHJvcHMudmFsdWU6UC5fXzpZLEouX19jP2s9KCQ9Wi5fX2M9Si5fX2MpLl9fPSQuX19FOihNP1ouX19jPSQ9bmV3IHMoSSxFKTooWi5fX2M9JD1uZXcgYyhJLEUpLCQuY29uc3RydWN0b3I9cywkLnJlbmRlcj1sNSksaCYmaC5zdWIoJCksJC5zdGF0ZXx8KCQuc3RhdGU9e30pLCQuX19uPVksXz0kLl9fZD0hMCwkLl9faD1bXSwkLl9zYj1bXSksTSYmJC5fX3M9PW51bGwmJigkLl9fcz0kLnN0YXRlKSxNJiZzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyE9bnVsbCYmKCQuX19zPT0kLnN0YXRlJiYoJC5fX3M9ejAoe30sJC5fX3MpKSx6MCgkLl9fcyxzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhJLCQuX19zKSkpLE89JC5wcm9wcyxDPSQuc3RhdGUsJC5fX3Y9WixfKU0mJnMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT1udWxsJiYkLmNvbXBvbmVudFdpbGxNb3VudCE9bnVsbCYmJC5jb21wb25lbnRXaWxsTW91bnQoKSxNJiYkLmNvbXBvbmVudERpZE1vdW50IT1udWxsJiYkLl9faC5wdXNoKCQuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYoTSYmcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PW51bGwmJkkhPT1PJiYkLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPW51bGwmJiQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhJLEUpLFouX192PT1KLl9fdnx8ISQuX19lJiYkLnNob3VsZENvbXBvbmVudFVwZGF0ZSE9bnVsbCYmJC5zaG91bGRDb21wb25lbnRVcGRhdGUoSSwkLl9fcyxFKT09PSExKXtaLl9fdiE9Si5fX3YmJigkLnByb3BzPUksJC5zdGF0ZT0kLl9fcywkLl9fZD0hMSksWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssWi5fX2suc29tZShmdW5jdGlvbihyKXtyJiYoci5fXz1aKX0pLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdLCQuX19oLmxlbmd0aCYmSy5wdXNoKCQpO2JyZWFrIFh9JC5jb21wb25lbnRXaWxsVXBkYXRlIT1udWxsJiYkLmNvbXBvbmVudFdpbGxVcGRhdGUoSSwkLl9fcyxFKSxNJiYkLmNvbXBvbmVudERpZFVwZGF0ZSE9bnVsbCYmJC5fX2gucHVzaChmdW5jdGlvbigpeyQuY29tcG9uZW50RGlkVXBkYXRlKE8sQyxBKX0pfWlmKCQuY29udGV4dD1FLCQucHJvcHM9SSwkLl9fUD1YLCQuX19lPSExLG49Qi5fX3IsUTA9MCxNKSQuc3RhdGU9JC5fX3MsJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLGEwLnB1c2guYXBwbHkoJC5fX2gsJC5fc2IpLCQuX3NiPVtdO2Vsc2UgZG8gJC5fX2Q9ITEsbiYmbihaKSxQPSQucmVuZGVyKCQucHJvcHMsJC5zdGF0ZSwkLmNvbnRleHQpLCQuc3RhdGU9JC5fX3M7d2hpbGUoJC5fX2QmJisrUTA8MjUpOyQuc3RhdGU9JC5fX3MsJC5nZXRDaGlsZENvbnRleHQhPW51bGwmJihZPXowKHowKHt9LFkpLCQuZ2V0Q2hpbGRDb250ZXh0KCkpKSxNJiYhXyYmJC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9bnVsbCYmKEE9JC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShPLEMpKSxnPVAhPW51bGwmJlAudHlwZT09PWQmJlAua2V5PT1udWxsP2Q0KFAucHJvcHMuY2hpbGRyZW4pOlAsVz14NChYLGIwKGcpP2c6W2ddLFosSixZLHEsUSxLLFcsRyx6KSwkLmJhc2U9Wi5fX2UsWi5fX3UmPS0xNjEsJC5fX2gubGVuZ3RoJiZLLnB1c2goJCksayYmKCQuX19FPSQuX189bnVsbCl9Y2F0Y2gocil7aWYoWi5fX3Y9bnVsbCxHfHxRIT1udWxsKWlmKHIudGhlbil7Zm9yKFouX191fD1HPzE2MDoxMjg7VyYmVy5ub2RlVHlwZT09OCYmVy5uZXh0U2libGluZzspVz1XLm5leHRTaWJsaW5nO1FbUS5pbmRleE9mKFcpXT1udWxsLFouX19lPVd9ZWxzZXtmb3IoSzA9US5sZW5ndGg7SzAtLTspRzQoUVtLMF0pO0w0KFopfWVsc2UgWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2ssci50aGVufHxMNChaKTtCLl9fZShyLFosSil9ZWxzZSBRPT1udWxsJiZaLl9fdj09Si5fX3Y/KFouX19rPUouX19rLFouX19lPUouX19lKTpXPVouX19lPWE1KEouX19lLFosSixZLHEsUSxLLEcseik7cmV0dXJuKFA9Qi5kaWZmZWQpJiZQKFopLDEyOCZaLl9fdT92b2lkIDA6V31mdW5jdGlvbiBMNChYKXtYJiYoWC5fX2MmJihYLl9fYy5fX2U9ITApLFguX19rJiZYLl9fay5zb21lKEw0KSl9ZnVuY3Rpb24gbTQoWCxaLEope2Zvcih2YXIgWT0wO1k8Si5sZW5ndGg7WSsrKUg0KEpbWV0sSlsrK1ldLEpbKytZXSk7Qi5fX2MmJkIuX19jKFosWCksWC5zb21lKGZ1bmN0aW9uKHEpe3RyeXtYPXEuX19oLHEuX19oPVtdLFguc29tZShmdW5jdGlvbihRKXtRLmNhbGwocSl9KX1jYXRjaChRKXtCLl9fZShRLHEuX192KX19KX1mdW5jdGlvbiBkNChYKXtyZXR1cm4gdHlwZW9mIFghPSJvYmplY3QifHxYPT1udWxsfHxYLl9fYj4wP1g6YjAoWCk/WC5tYXAoZDQpOnowKHt9LFgpfWZ1bmN0aW9uIGE1KFgsWixKLFkscSxRLEssVyxHKXt2YXIgeixQLCQsXyxPLEMsQSxrPUoucHJvcHN8fGYwLEk9Wi5wcm9wcyxNPVoudHlwZTtpZihNPT0ic3ZnIj9xPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI6TT09Im1hdGgiP3E9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnF8fChxPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiksUSE9bnVsbCl7Zm9yKHo9MDt6PFEubGVuZ3RoO3orKylpZigoTz1RW3pdKSYmInNldEF0dHJpYnV0ZSJpbiBPPT0hIU0mJihNP08ubG9jYWxOYW1lPT1NOk8ubm9kZVR5cGU9PTMpKXtYPU8sUVt6XT1udWxsO2JyZWFrfX1pZihYPT1udWxsKXtpZihNPT1udWxsKXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShJKTtYPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhxLE0sSS5pcyYmSSksVyYmKEIuX19tJiZCLl9fbShaLFEpLFc9ITEpLFE9bnVsbH1pZihNPT1udWxsKWs9PT1JfHxXJiZYLmRhdGE9PUl8fChYLmRhdGE9SSk7ZWxzZXtpZihRPVEmJmMwLmNhbGwoWC5jaGlsZE5vZGVzKSwhVyYmUSE9bnVsbClmb3Ioaz17fSx6PTA7ejxYLmF0dHJpYnV0ZXMubGVuZ3RoO3orKylrWyhPPVguYXR0cmlidXRlc1t6XSkubmFtZV09Ty52YWx1ZTtmb3IoeiBpbiBrKU89a1t6XSx6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyQ9Tzp6PT0iY2hpbGRyZW4ifHwoeiBpbiBJKXx8ej09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSSl8fHo9PSJjaGVja2VkIiYmKCJkZWZhdWx0Q2hlY2tlZCJpbiBJKXx8aDAoWCx6LG51bGwsTyxxKTtmb3IoeiBpbiBJKU89SVt6XSx6PT0iY2hpbGRyZW4iP189Tzp6PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP1A9Tzp6PT0idmFsdWUiP0M9Tzp6PT0iY2hlY2tlZCI/QT1POlcmJnR5cGVvZiBPIT0iZnVuY3Rpb24ifHxrW3pdPT09T3x8aDAoWCx6LE8sa1t6XSxxKTtpZihQKVd8fCQmJihQLl9faHRtbD09JC5fX2h0bWx8fFAuX19odG1sPT1YLmlubmVySFRNTCl8fChYLmlubmVySFRNTD1QLl9faHRtbCksWi5fX2s9W107ZWxzZSBpZigkJiYoWC5pbm5lckhUTUw9IiIpLHg0KFoudHlwZT09InRlbXBsYXRlIj9YLmNvbnRlbnQ6WCxiMChfKT9fOltfXSxaLEosWSxNPT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnEsUSxLLFE/UVswXTpKLl9fayYmQjAoSiwwKSxXLEcpLFEhPW51bGwpZm9yKHo9US5sZW5ndGg7ei0tOylHNChRW3pdKTtXfHwoej0idmFsdWUiLE09PSJwcm9ncmVzcyImJkM9PW51bGw/WC5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik6QyE9bnVsbCYmKEMhPT1YW3pdfHxNPT0icHJvZ3Jlc3MiJiYhQ3x8TT09Im9wdGlvbiImJkMhPWtbel0pJiZoMChYLHosQyxrW3pdLHEpLHo9ImNoZWNrZWQiLEEhPW51bGwmJkEhPVhbel0mJmgwKFgseixBLGtbel0scSkpfXJldHVybiBYfWZ1bmN0aW9uIEg0KFgsWixKKXt0cnl7aWYodHlwZW9mIFg9PSJmdW5jdGlvbiIpe3ZhciBZPXR5cGVvZiBYLl9fdT09ImZ1bmN0aW9uIjtZJiZYLl9fdSgpLFkmJlo9PW51bGx8fChYLl9fdT1YKFopKX1lbHNlIFguY3VycmVudD1afWNhdGNoKHEpe0IuX19lKHEsSil9fWZ1bmN0aW9uIGY0KFgsWixKKXt2YXIgWSxxO2lmKEIudW5tb3VudCYmQi51bm1vdW50KFgpLChZPVgucmVmKSYmKFkuY3VycmVudCYmWS5jdXJyZW50IT1YLl9fZXx8SDQoWSxudWxsLFopKSwoWT1YLl9fYykhPW51bGwpe2lmKFkuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e1kuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChRKXtCLl9fZShRLFopfVkuYmFzZT1ZLl9fUD1udWxsfWlmKFk9WC5fX2spZm9yKHE9MDtxPFkubGVuZ3RoO3ErKylZW3FdJiZmNChZW3FdLFosSnx8dHlwZW9mIFgudHlwZSE9ImZ1bmN0aW9uIik7Snx8RzQoWC5fX2UpLFguX19jPVguX189WC5fX2U9dm9pZCAwfWZ1bmN0aW9uIGw1KFgsWixKKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihYLEopfWZ1bmN0aW9uIGkwKFgsWixKKXt2YXIgWSxxLFEsSztaPT1kb2N1bWVudCYmKFo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSxCLl9fJiZCLl9fKFgsWikscT0oWT10eXBlb2YgSj09ImZ1bmN0aW9uIik/bnVsbDpKJiZKLl9fa3x8Wi5fX2ssUT1bXSxLPVtdLFY0KFosWD0oIVkmJkp8fFopLl9faz1XMChkLG51bGwsW1hdKSxxfHxmMCxmMCxaLm5hbWVzcGFjZVVSSSwhWSYmSj9bSl06cT9udWxsOlouZmlyc3RDaGlsZD9jMC5jYWxsKFouY2hpbGROb2Rlcyk6bnVsbCxRLCFZJiZKP0o6cT9xLl9fZTpaLmZpcnN0Q2hpbGQsWSxLKSxtNChRLFgsSyl9ZnVuY3Rpb24gXzAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWSxxO3JldHVybiB0aGlzLmdldENoaWxkQ29udGV4dHx8KFk9bmV3IFNldCwocT17fSlbWi5fX2NdPXRoaXMsdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcX0sdGhpcy5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1k9bnVsbH0sdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24oUSl7dGhpcy5wcm9wcy52YWx1ZSE9US52YWx1ZSYmWS5mb3JFYWNoKGZ1bmN0aW9uKEspe0suX19lPSEwLFc0KEspfSl9LHRoaXMuc3ViPWZ1bmN0aW9uKFEpe1kuYWRkKFEpO3ZhciBLPVEuY29tcG9uZW50V2lsbFVubW91bnQ7US5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe1kmJlkuZGVsZXRlKFEpLEsmJksuY2FsbChRKX19KSxKLmNoaWxkcmVufXJldHVybiBaLl9fYz0iX19jQyIrcDQrKyxaLl9fPVgsWi5Qcm92aWRlcj1aLl9fbD0oWi5Db25zdW1lcj1mdW5jdGlvbihKLFkpe3JldHVybiBKLmNoaWxkcmVuKFkpfSkuY29udGV4dFR5cGU9WixafWMwPWEwLnNsaWNlLEI9e19fZTpmdW5jdGlvbihYLFosSixZKXtmb3IodmFyIHEsUSxLO1o9Wi5fXzspaWYoKHE9Wi5fX2MpJiYhcS5fXyl0cnl7aWYoKFE9cS5jb25zdHJ1Y3RvcikmJlEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT1udWxsJiYocS5zZXRTdGF0ZShRLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihYKSksSz1xLl9fZCkscS5jb21wb25lbnREaWRDYXRjaCE9bnVsbCYmKHEuY29tcG9uZW50RGlkQ2F0Y2goWCxZfHx7fSksSz1xLl9fZCksSylyZXR1cm4gcS5fX0U9cX1jYXRjaChXKXtYPVd9dGhyb3cgWH19LFI0PTAseDU9ZnVuY3Rpb24oWCl7cmV0dXJuIFghPW51bGwmJlguY29uc3RydWN0b3I9PT12b2lkIDB9LGMucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKFgsWil7dmFyIEo7Sj10aGlzLl9fcyE9bnVsbCYmdGhpcy5fX3MhPXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9ejAoe30sdGhpcy5zdGF0ZSksdHlwZW9mIFg9PSJmdW5jdGlvbiImJihYPVgoejAoe30sSiksdGhpcy5wcm9wcykpLFgmJnowKEosWCksWCE9bnVsbCYmdGhpcy5fX3YmJihaJiZ0aGlzLl9zYi5wdXNoKFopLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oWCl7dGhpcy5fX3YmJih0aGlzLl9fZT0hMCxYJiZ0aGlzLl9faC5wdXNoKFgpLFc0KHRoaXMpKX0sYy5wcm90b3R5cGUucmVuZGVyPWQsUDA9W10sajQ9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LHY0PWZ1bmN0aW9uKFgsWil7cmV0dXJuIFguX192Ll9fYi1aLl9fdi5fX2J9LGwwLl9fcj0wLEs0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksbTA9Il9fZCIrSzQsVDA9Il9fYSIrSzQseTQ9LyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkL2ksTjQ9MCwkND1TNCghMSksejQ9UzQoITApLHA0PTA7dmFyIEYwLHAsUDQsYTQsUzA9MCx0ND1bXSxmPUIsbDQ9Zi5fX2IsYzQ9Zi5fX3IsaTQ9Zi5kaWZmZWQsdTQ9Zi5fX2MsbzQ9Zi51bm1vdW50LHM0PWYuX187ZnVuY3Rpb24gbzAoWCxaKXtmLl9faCYmZi5fX2gocCxYLFMwfHxaKSxTMD0wO3ZhciBKPXAuX19IfHwocC5fX0g9e19fOltdLF9faDpbXX0pO3JldHVybiBYPj1KLl9fLmxlbmd0aCYmSi5fXy5wdXNoKHt9KSxKLl9fW1hdfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIFMwPTEsTzQoZTQsWCl9ZnVuY3Rpb24gTzQoWCxaLEope3ZhciBZPW8wKEYwKyssMik7aWYoWS50PVgsIVkuX19jJiYoWS5fXz1bSj9KKFopOmU0KHZvaWQgMCxaKSxmdW5jdGlvbihXKXt2YXIgRz1ZLl9fTj9ZLl9fTlswXTpZLl9fWzBdLHo9WS50KEcsVyk7RyE9PXomJihZLl9fTj1beixZLl9fWzFdXSxZLl9fYy5zZXRTdGF0ZSh7fSkpfV0sWS5fX2M9cCwhcC5fX2YpKXt2YXIgcT1mdW5jdGlvbihXLEcseil7aWYoIVkuX19jLl9fSClyZXR1cm4hMDt2YXIgUD1ZLl9fYy5fX0guX18uZmlsdGVyKGZ1bmN0aW9uKF8pe3JldHVybiBfLl9fY30pO2lmKFAuZXZlcnkoZnVuY3Rpb24oXyl7cmV0dXJuIV8uX19OfSkpcmV0dXJuIVF8fFEuY2FsbCh0aGlzLFcsRyx6KTt2YXIgJD1ZLl9fYy5wcm9wcyE9PVc7cmV0dXJuIFAuc29tZShmdW5jdGlvbihfKXtpZihfLl9fTil7dmFyIE89Xy5fX1swXTtfLl9fPV8uX19OLF8uX19OPXZvaWQgMCxPIT09Xy5fX1swXSYmKCQ9ITApfX0pLFEmJlEuY2FsbCh0aGlzLFcsRyx6KXx8JH07cC5fX2Y9ITA7dmFye3Nob3VsZENvbXBvbmVudFVwZGF0ZTpRLGNvbXBvbmVudFdpbGxVcGRhdGU6S309cDtwLmNvbXBvbmVudFdpbGxVcGRhdGU9ZnVuY3Rpb24oVyxHLHope2lmKHRoaXMuX19lKXt2YXIgUD1RO1E9dm9pZCAwLHEoVyxHLHopLFE9UH1LJiZLLmNhbGwodGhpcyxXLEcseil9LHAuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXF9cmV0dXJuIFkuX19OfHxZLl9ffWZ1bmN0aW9uIHgoWCxaKXt2YXIgSj1vMChGMCsrLDMpOyFmLl9fcyYmbjQoSi5fX0gsWikmJihKLl9fPVgsSi51PVoscC5fX0guX19oLnB1c2goSikpfWZ1bmN0aW9uIHcoWCl7cmV0dXJuIFMwPTUsczAoZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpYfX0sW10pfWZ1bmN0aW9uIHMwKFgsWil7dmFyIEo9bzAoRjArKyw3KTtyZXR1cm4gbjQoSi5fX0gsWikmJihKLl9fPVgoKSxKLl9fSD1aLEouX19oPVgpLEouX199ZnVuY3Rpb24gaihYLFope3JldHVybiBTMD04LHMwKGZ1bmN0aW9uKCl7cmV0dXJuIFh9LFopfWZ1bmN0aW9uIFIwKFgpe3ZhciBaPXAuY29udGV4dFtYLl9fY10sSj1vMChGMCsrLDkpO3JldHVybiBKLmM9WCxaPyhKLl9fPT1udWxsJiYoSi5fXz0hMCxaLnN1YihwKSksWi5wcm9wcy52YWx1ZSk6WC5fX31mdW5jdGlvbiBjNSgpe2Zvcih2YXIgWDtYPXQ0LnNoaWZ0KCk7KXt2YXIgWj1YLl9fSDtpZihYLl9fUCYmWil0cnl7Wi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W119Y2F0Y2goSil7Wi5fX2g9W10sZi5fX2UoSixYLl9fdil9fX1mLl9fYj1mdW5jdGlvbihYKXtwPW51bGwsbDQmJmw0KFgpfSxmLl9fPWZ1bmN0aW9uKFgsWil7WCYmWi5fX2smJlouX19rLl9fbSYmKFguX19tPVouX19rLl9fbSksczQmJnM0KFgsWil9LGYuX19yPWZ1bmN0aW9uKFgpe2M0JiZjNChYKSxGMD0wO3ZhciBaPShwPVguX19jKS5fX0g7WiYmKFA0PT09cD8oWi5fX2g9W10scC5fX2g9W10sWi5fXy5zb21lKGZ1bmN0aW9uKEope0ouX19OJiYoSi5fXz1KLl9fTiksSi51PUouX19OPXZvaWQgMH0pKTooWi5fX2guc29tZSh1MCksWi5fX2guc29tZShBNCksWi5fX2g9W10sRjA9MCkpLFA0PXB9LGYuZGlmZmVkPWZ1bmN0aW9uKFgpe2k0JiZpNChYKTt2YXIgWj1YLl9fYztaJiZaLl9fSCYmKFouX19ILl9faC5sZW5ndGgmJih0NC5wdXNoKFopIT09MSYmYTQ9PT1mLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KChhND1mLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGk1KShjNSkpLFouX19ILl9fLnNvbWUoZnVuY3Rpb24oSil7Si51JiYoSi5fX0g9Si51KSxKLnU9dm9pZCAwfSkpLFA0PXA9bnVsbH0sZi5fX2M9ZnVuY3Rpb24oWCxaKXtaLnNvbWUoZnVuY3Rpb24oSil7dHJ5e0ouX19oLnNvbWUodTApLEouX19oPUouX19oLmZpbHRlcihmdW5jdGlvbihZKXtyZXR1cm4hWS5fX3x8QTQoWSl9KX1jYXRjaChZKXtaLnNvbWUoZnVuY3Rpb24ocSl7cS5fX2gmJihxLl9faD1bXSl9KSxaPVtdLGYuX19lKFksSi5fX3YpfX0pLHU0JiZ1NChYLFopfSxmLnVubW91bnQ9ZnVuY3Rpb24oWCl7bzQmJm80KFgpO3ZhciBaLEo9WC5fX2M7SiYmSi5fX0gmJihKLl9fSC5fXy5zb21lKGZ1bmN0aW9uKFkpe3RyeXt1MChZKX1jYXRjaChxKXtaPXF9fSksSi5fX0g9dm9pZCAwLFomJmYuX19lKFosSi5fX3YpKX07dmFyIHI0PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI7ZnVuY3Rpb24gaTUoWCl7dmFyIFosSj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChZKSxyNCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoWiksc2V0VGltZW91dChYKX0sWT1zZXRUaW1lb3V0KEosMzUpO3I0JiYoWj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoSikpfWZ1bmN0aW9uIHUwKFgpe3ZhciBaPXAsSj1YLl9fYzt0eXBlb2YgSj09ImZ1bmN0aW9uIiYmKFguX19jPXZvaWQgMCxKKCkpLHA9Wn1mdW5jdGlvbiBBNChYKXt2YXIgWj1wO1guX19jPVguX18oKSxwPVp9ZnVuY3Rpb24gbjQoWCxaKXtyZXR1cm4hWHx8WC5sZW5ndGghPT1aLmxlbmd0aHx8Wi5zb21lKGZ1bmN0aW9uKEosWSl7cmV0dXJuIEohPT1YW1ldfSl9ZnVuY3Rpb24gZTQoWCxaKXtyZXR1cm4gdHlwZW9mIFo9PSJmdW5jdGlvbiI/WihYKTpafWZ1bmN0aW9uIGU1KFgsWil7Zm9yKHZhciBKIGluIFopWFtKXT1aW0pdO3JldHVybiBYfWZ1bmN0aW9uIFg1KFgsWil7Zm9yKHZhciBKIGluIFgpaWYoSiE9PSJfX3NvdXJjZSImJiEoSiBpbiBaKSlyZXR1cm4hMDtmb3IodmFyIFkgaW4gWilpZihZIT09Il9fc291cmNlIiYmWFtZXSE9PVpbWV0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWjUoWCxaKXt0aGlzLnByb3BzPVgsdGhpcy5jb250ZXh0PVp9KFo1LnByb3RvdHlwZT1uZXcgYykuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsWjUucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihYLFope3JldHVybiBYNSh0aGlzLnByb3BzLFgpfHxYNSh0aGlzLnN0YXRlLFopfTt2YXIgSjU9Qi5fX2I7Qi5fX2I9ZnVuY3Rpb24oWCl7WC50eXBlJiZYLnR5cGUuX19mJiZYLnJlZiYmKFgucHJvcHMucmVmPVgucmVmLFgucmVmPW51bGwpLEo1JiZKNShYKX07dmFyIFg2PUIuX19lO0IuX19lPWZ1bmN0aW9uKFgsWixKLFkpe2lmKFgudGhlbil7Zm9yKHZhciBxLFE9WjtRPVEuX187KWlmKChxPVEuX19jKSYmcS5fX2MpcmV0dXJuIFouX19lPT1udWxsJiYoWi5fX2U9Si5fX2UsWi5fX2s9Si5fX2spLHEuX19jKFgsWil9WDYoWCxaLEosWSl9O3ZhciBZNT1CLnVubW91bnQ7ZnVuY3Rpb24gVzUoWCxaLEope3JldHVybiBYJiYoWC5fX2MmJlguX19jLl9fSCYmKFguX19jLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKFkpe3R5cGVvZiBZLl9fYz09ImZ1bmN0aW9uIiYmWS5fX2MoKX0pLFguX19jLl9fSD1udWxsKSwoWD1lNSh7fSxYKSkuX19jIT1udWxsJiYoWC5fX2MuX19QPT09SiYmKFguX19jLl9fUD1aKSxYLl9fYy5fX2U9ITAsWC5fX2M9bnVsbCksWC5fX2s9WC5fX2smJlguX19rLm1hcChmdW5jdGlvbihZKXtyZXR1cm4gVzUoWSxaLEopfSkpLFh9ZnVuY3Rpb24gTDUoWCxaLEope3JldHVybiBYJiZKJiYoWC5fX3Y9bnVsbCxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBMNShZLFosSil9KSxYLl9fYyYmWC5fX2MuX19QPT09WiYmKFguX19lJiZKLmFwcGVuZENoaWxkKFguX19lKSxYLl9fYy5fX2U9ITAsWC5fX2MuX19QPUopKSxYfWZ1bmN0aW9uIFU0KCl7dGhpcy5fX3U9MCx0aGlzLm89bnVsbCx0aGlzLl9fYj1udWxsfWZ1bmN0aW9uIE41KFgpe3ZhciBaPVguX18mJlguX18uX19jO3JldHVybiBaJiZaLl9fYSYmWi5fX2EoWCl9ZnVuY3Rpb24gcjAoKXt0aGlzLmk9bnVsbCx0aGlzLmw9bnVsbH1CLnVubW91bnQ9ZnVuY3Rpb24oWCl7dmFyIFo9WC5fX2M7WiYmKFouX196PSEwKSxaJiZaLl9fUiYmWi5fX1IoKSxaJiYzMiZYLl9fdSYmKFgudHlwZT1udWxsKSxZNSYmWTUoWCl9LChVNC5wcm90b3R5cGU9bmV3IGMpLl9fYz1mdW5jdGlvbihYLFope3ZhciBKPVouX19jLFk9dGhpcztZLm89PW51bGwmJihZLm89W10pLFkuby5wdXNoKEopO3ZhciBxPU41KFkuX192KSxRPSExLEs9ZnVuY3Rpb24oKXtRfHxZLl9fenx8KFE9ITAsSi5fX1I9bnVsbCxxP3EoRyk6RygpKX07Si5fX1I9Szt2YXIgVz1KLl9fUDtKLl9fUD1udWxsO3ZhciBHPWZ1bmN0aW9uKCl7aWYoIS0tWS5fX3Upe2lmKFkuc3RhdGUuX19hKXt2YXIgej1ZLnN0YXRlLl9fYTtZLl9fdi5fX2tbMF09TDUoeix6Ll9fYy5fX1Asei5fX2MuX19PKX12YXIgUDtmb3IoWS5zZXRTdGF0ZSh7X19hOlkuX19iPW51bGx9KTtQPVkuby5wb3AoKTspUC5fX1A9VyxQLmZvcmNlVXBkYXRlKCl9fTtZLl9fdSsrfHwzMiZaLl9fdXx8WS5zZXRTdGF0ZSh7X19hOlkuX19iPVkuX192Ll9fa1swXX0pLFgudGhlbihLLEspfSxVNC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLm89W119LFU0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCxaKXtpZih0aGlzLl9fYil7aWYodGhpcy5fX3YuX19rKXt2YXIgSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxZPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPVc1KHRoaXMuX19iLEosWS5fX089WS5fX1ApfXRoaXMuX19iPW51bGx9dmFyIHE9Wi5fX2EmJlcwKGQsbnVsbCxYLmZhbGxiYWNrKTtyZXR1cm4gcSYmKHEuX191Jj0tMzMpLFtXMChkLG51bGwsWi5fX2E/bnVsbDpYLmNoaWxkcmVuKSxxXX07dmFyIHE1PWZ1bmN0aW9uKFgsWixKKXtpZigrK0pbMV09PT1KWzBdJiZYLmwuZGVsZXRlKFopLFgucHJvcHMucmV2ZWFsT3JkZXImJihYLnByb3BzLnJldmVhbE9yZGVyWzBdIT09InQifHwhWC5sLnNpemUpKWZvcihKPVguaTtKOyl7Zm9yKDtKLmxlbmd0aD4zOylKLnBvcCgpKCk7aWYoSlsxXTxKWzBdKWJyZWFrO1guaT1KPUpbMl19fTsocjAucHJvdG90eXBlPW5ldyBjKS5fX2E9ZnVuY3Rpb24oWCl7dmFyIFo9dGhpcyxKPU41KFouX192KSxZPVoubC5nZXQoWCk7cmV0dXJuIFlbMF0rKyxmdW5jdGlvbihxKXt2YXIgUT1mdW5jdGlvbigpe1oucHJvcHMucmV2ZWFsT3JkZXI/KFkucHVzaChxKSxxNShaLFgsWSkpOnEoKX07Sj9KKFEpOlEoKX19LHIwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oWCl7dGhpcy5pPW51bGwsdGhpcy5sPW5ldyBNYXA7dmFyIFo9TDAoWC5jaGlsZHJlbik7WC5yZXZlYWxPcmRlciYmWC5yZXZlYWxPcmRlclswXT09PSJiIiYmWi5yZXZlcnNlKCk7Zm9yKHZhciBKPVoubGVuZ3RoO0otLTspdGhpcy5sLnNldChaW0pdLHRoaXMuaT1bMSwwLHRoaXMuaV0pO3JldHVybiBYLmNoaWxkcmVufSxyMC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPXIwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBYPXRoaXM7dGhpcy5sLmZvckVhY2goZnVuY3Rpb24oWixKKXtxNShYLEosWil9KX07dmFyIFo2PXR5cGVvZiBTeW1ib2w8InUiJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLEo2PS9eKD86YWNjZW50fGFsaWdubWVudHxhcmFiaWN8YmFzZWxpbmV8Y2FwfGNsaXAoPyFQYXRoVSl8Y29sb3J8ZG9taW5hbnR8ZmlsbHxmbG9vZHxmb250fGdseXBoKD8hUil8aG9yaXp8aW1hZ2UoIVMpfGxldHRlcnxsaWdodGluZ3xtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8cG9pbnRlcnxzaGFwZXxzdG9wfHN0cmlrZXRocm91Z2h8c3Ryb2tlfHRleHQoPyFMKXx0cmFuc2Zvcm18dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLyxZNj0vXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucHxDb21wbykvLHE2PS9bQS1aMC05XS9nLFE2PXR5cGVvZiBkb2N1bWVudDwidSIsSzY9ZnVuY3Rpb24oWCl7cmV0dXJuKHR5cGVvZiBTeW1ib2w8InUiJiZ0eXBlb2YgU3ltYm9sKCk9PSJzeW1ib2wiPy9maWx8Y2hlfHJhZC86L2ZpbHxjaGV8cmEvKS50ZXN0KFgpfTtmdW5jdGlvbiBHNShYLFosSil7cmV0dXJuIFouX19rPT1udWxsJiYoWi50ZXh0Q29udGVudD0iIiksaTAoWCxaKSx0eXBlb2YgSj09ImZ1bmN0aW9uIiYmSigpLFg/WC5fX2M6bnVsbH1jLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLFsiY29tcG9uZW50V2lsbE1vdW50IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsImNvbXBvbmVudFdpbGxVcGRhdGUiXS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLnByb3RvdHlwZSxYLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbIlVOU0FGRV8iK1hdfSxzZXQ6ZnVuY3Rpb24oWil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsWCx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlp9KX19KX0pO3ZhciBRNT1CLmV2ZW50O0IuZXZlbnQ9ZnVuY3Rpb24oWCl7cmV0dXJuIFE1JiYoWD1RNShYKSksWC5wZXJzaXN0PWZ1bmN0aW9uKCl7fSxYLmlzUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlfSxYLmlzRGVmYXVsdFByZXZlbnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LFgubmF0aXZlRXZlbnQ9WH07dmFyIFY1LCQ2PXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSxLNT1CLnZub2RlO0Iudm5vZGU9ZnVuY3Rpb24oWCl7dHlwZW9mIFgudHlwZT09InN0cmluZyImJmZ1bmN0aW9uKFope3Zhcntwcm9wczpKLHR5cGU6WX09WixxPXt9LFE9WS5pbmRleE9mKCItIik9PS0xO2Zvcih2YXIgSyBpbiBKKXt2YXIgVz1KW0tdO2lmKCEoSz09PSJ2YWx1ZSImJigiZGVmYXVsdFZhbHVlImluIEopJiZXPT1udWxsfHxRNiYmSz09PSJjaGlsZHJlbiImJlk9PT0ibm9zY3JpcHQifHxLPT09ImNsYXNzInx8Sz09PSJjbGFzc05hbWUiKSl7dmFyIEc9Sy50b0xvd2VyQ2FzZSgpO0s9PT0iZGVmYXVsdFZhbHVlIiYmInZhbHVlImluIEomJkoudmFsdWU9PW51bGw/Sz0idmFsdWUiOks9PT0iZG93bmxvYWQiJiZXPT09ITA/Vz0iIjpHPT09InRyYW5zbGF0ZSImJlc9PT0ibm8iP1c9ITE6R1swXT09PSJvIiYmR1sxXT09PSJuIj9HPT09Im9uZG91YmxlY2xpY2siP0s9Im9uZGJsY2xpY2siOkchPT0ib25jaGFuZ2UifHxZIT09ImlucHV0IiYmWSE9PSJ0ZXh0YXJlYSJ8fEs2KEoudHlwZSk/Rz09PSJvbmZvY3VzIj9LPSJvbmZvY3VzaW4iOkc9PT0ib25ibHVyIj9LPSJvbmZvY3Vzb3V0IjpZNi50ZXN0KEspJiYoSz1HKTpHPUs9Im9uaW5wdXQiOlEmJko2LnRlc3QoSyk/Sz1LLnJlcGxhY2UocTYsIi0kJiIpLnRvTG93ZXJDYXNlKCk6Vz09PW51bGwmJihXPXZvaWQgMCksRz09PSJvbmlucHV0IiYmcVtLPUddJiYoSz0ib25pbnB1dENhcHR1cmUiKSxxW0tdPVd9fVk9PSJzZWxlY3QiJiYocS5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShxLnZhbHVlKSYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEudmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTF9KSkscS5kZWZhdWx0VmFsdWUhPW51bGwmJihxLnZhbHVlPUwwKEouY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24oeil7ei5wcm9wcy5zZWxlY3RlZD1xLm11bHRpcGxlP3EuZGVmYXVsdFZhbHVlLmluZGV4T2Yoei5wcm9wcy52YWx1ZSkhPS0xOnEuZGVmYXVsdFZhbHVlPT16LnByb3BzLnZhbHVlfSkpKSxKLmNsYXNzJiYhSi5jbGFzc05hbWU/KHEuY2xhc3M9Si5jbGFzcyxPYmplY3QuZGVmaW5lUHJvcGVydHkocSwiY2xhc3NOYW1lIiwkNikpOkouY2xhc3NOYW1lJiYocS5jbGFzcz1xLmNsYXNzTmFtZT1KLmNsYXNzTmFtZSksWi5wcm9wcz1xfShYKSxYLiQkdHlwZW9mPVo2LEs1JiZLNShYKX07dmFyICQ1PUIuX19yO0IuX19yPWZ1bmN0aW9uKFgpeyQ1JiYkNShYKSxWNT1YLl9fY307dmFyIHo1PUIuZGlmZmVkO0IuZGlmZmVkPWZ1bmN0aW9uKFgpe3o1JiZ6NShYKTt2YXJ7cHJvcHM6WixfX2U6Sn09WDtKIT1udWxsJiZYLnR5cGU9PT0idGV4dGFyZWEiJiYidmFsdWUiaW4gWiYmWi52YWx1ZSE9PUoudmFsdWUmJihKLnZhbHVlPVoudmFsdWU9PW51bGw/IiI6Wi52YWx1ZSksVjU9bnVsbH07ZnVuY3Rpb24gSDUoWCl7cmV0dXJuISFYLl9fayYmKGkwKG51bGwsWCksITApfWZ1bmN0aW9uIFA1KFgpe3JldHVybntyZW5kZXI6ZnVuY3Rpb24oWil7RzUoWixYKX0sdW5tb3VudDpmdW5jdGlvbigpe0g1KFgpfX19ZnVuY3Rpb24gTTUoWCxaKXtmb3IodmFyIEogaW4gWilYW0pdPVpbSl07cmV0dXJuIFh9ZnVuY3Rpb24gQTUoWCxaKXtmb3IodmFyIEogaW4gWClpZihKIT09Il9fc291cmNlIiYmIShKIGluIFopKXJldHVybiEwO2Zvcih2YXIgWSBpbiBaKWlmKFkhPT0iX19zb3VyY2UiJiZYW1ldIT09WltZXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBPNShYLFope3RoaXMucHJvcHM9WCx0aGlzLmNvbnRleHQ9Wn0oTzUucHJvdG90eXBlPW5ldyBjKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCxPNS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKFgsWil7cmV0dXJuIEE1KHRoaXMucHJvcHMsWCl8fEE1KHRoaXMuc3RhdGUsWil9O3ZhciBVNT1CLl9fYjtCLl9fYj1mdW5jdGlvbihYKXtYLnR5cGUmJlgudHlwZS5fX2YmJlgucmVmJiYoWC5wcm9wcy5yZWY9WC5yZWYsWC5yZWY9bnVsbCksVTUmJlU1KFgpfTt2YXIgejY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIil8fDM5MTE7ZnVuY3Rpb24gRDAoWCl7ZnVuY3Rpb24gWihKKXt2YXIgWT1NNSh7fSxKKTtyZXR1cm4gZGVsZXRlIFkucmVmLFgoWSxKLnJlZnx8bnVsbCl9cmV0dXJuIFouJCR0eXBlb2Y9ejYsWi5yZW5kZXI9WCxaLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PVouX19mPSEwLFouZGlzcGxheU5hbWU9IkZvcndhcmRSZWYoIisoWC5kaXNwbGF5TmFtZXx8WC5uYW1lKSsiKSIsWn12YXIgVzY9Qi5fX2U7Qi5fX2U9ZnVuY3Rpb24oWCxaLEosWSl7aWYoWC50aGVuKXtmb3IodmFyIHEsUT1aO1E9US5fXzspaWYoKHE9US5fX2MpJiZxLl9fYylyZXR1cm4gWi5fX2U9PW51bGwmJihaLl9fZT1KLl9fZSxaLl9faz1KLl9faykscS5fX2MoWCxaKX1XNihYLFosSixZKX07dmFyIEI1PUIudW5tb3VudDtmdW5jdGlvbiBDNShYLFosSil7cmV0dXJuIFgmJihYLl9fYyYmWC5fX2MuX19IJiYoWC5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24oWSl7dHlwZW9mIFkuX19jPT0iZnVuY3Rpb24iJiZZLl9fYygpfSksWC5fX2MuX19IPW51bGwpLChYPU01KHt9LFgpKS5fX2MhPW51bGwmJihYLl9fYy5fX1A9PT1KJiYoWC5fX2MuX19QPVopLFguX19jLl9fZT0hMCxYLl9fYz1udWxsKSxYLl9faz1YLl9fayYmWC5fX2subWFwKGZ1bmN0aW9uKFkpe3JldHVybiBDNShZLFosSil9KSksWH1mdW5jdGlvbiBFNShYLFosSil7cmV0dXJuIFgmJkomJihYLl9fdj1udWxsLFguX19rPVguX19rJiZYLl9fay5tYXAoZnVuY3Rpb24oWSl7cmV0dXJuIEU1KFksWixKKX0pLFguX19jJiZYLl9fYy5fX1A9PT1aJiYoWC5fX2UmJkouYXBwZW5kQ2hpbGQoWC5fX2UpLFguX19jLl9fZT0hMCxYLl9fYy5fX1A9SikpLFh9ZnVuY3Rpb24gXzQoKXt0aGlzLl9fdT0wLHRoaXMubz1udWxsLHRoaXMuX19iPW51bGx9ZnVuY3Rpb24gdzUoWCl7dmFyIFo9WC5fXyYmWC5fXy5fX2M7cmV0dXJuIFomJlouX19hJiZaLl9fYShYKX1mdW5jdGlvbiB0MCgpe3RoaXMuaT1udWxsLHRoaXMubD1udWxsfUIudW5tb3VudD1mdW5jdGlvbihYKXt2YXIgWj1YLl9fYztaJiYoWi5fX3o9ITApLFomJlouX19SJiZaLl9fUigpLFomJjMyJlguX191JiYoWC50eXBlPW51bGwpLEI1JiZCNShYKX0sKF80LnByb3RvdHlwZT1uZXcgYykuX19jPWZ1bmN0aW9uKFgsWil7dmFyIEo9Wi5fX2MsWT10aGlzO1kubz09bnVsbCYmKFkubz1bXSksWS5vLnB1c2goSik7dmFyIHE9dzUoWS5fX3YpLFE9ITEsSz1mdW5jdGlvbigpe1F8fFkuX196fHwoUT0hMCxKLl9fUj1udWxsLHE/cShHKTpHKCkpfTtKLl9fUj1LO3ZhciBXPUouX19QO0ouX19QPW51bGw7dmFyIEc9ZnVuY3Rpb24oKXtpZighLS1ZLl9fdSl7aWYoWS5zdGF0ZS5fX2Epe3ZhciB6PVkuc3RhdGUuX19hO1kuX192Ll9fa1swXT1FNSh6LHouX19jLl9fUCx6Ll9fYy5fX08pfXZhciBQO2ZvcihZLnNldFN0YXRlKHtfX2E6WS5fX2I9bnVsbH0pO1A9WS5vLnBvcCgpOylQLl9fUD1XLFAuZm9yY2VVcGRhdGUoKX19O1kuX191Kyt8fDMyJlouX191fHxZLnNldFN0YXRlKHtfX2E6WS5fX2I9WS5fX3YuX19rWzBdfSksWC50aGVuKEssSyl9LF80LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMubz1bXX0sXzQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYLFope2lmKHRoaXMuX19iKXtpZih0aGlzLl9fdi5fX2spe3ZhciBKPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFk9dGhpcy5fX3YuX19rWzBdLl9fYzt0aGlzLl9fdi5fX2tbMF09QzUodGhpcy5fX2IsSixZLl9fTz1ZLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgcT1aLl9fYSYmVzAoZCxudWxsLFguZmFsbGJhY2spO3JldHVybiBxJiYocS5fX3UmPS0zMyksW1cwKGQsbnVsbCxaLl9fYT9udWxsOlguY2hpbGRyZW4pLHFdfTt2YXIgXzU9ZnVuY3Rpb24oWCxaLEope2lmKCsrSlsxXT09PUpbMF0mJlgubC5kZWxldGUoWiksWC5wcm9wcy5yZXZlYWxPcmRlciYmKFgucHJvcHMucmV2ZWFsT3JkZXJbMF0hPT0idCJ8fCFYLmwuc2l6ZSkpZm9yKEo9WC5pO0o7KXtmb3IoO0oubGVuZ3RoPjM7KUoucG9wKCkoKTtpZihKWzFdPEpbMF0pYnJlYWs7WC5pPUo9SlsyXX19Oyh0MC5wcm90b3R5cGU9bmV3IGMpLl9fYT1mdW5jdGlvbihYKXt2YXIgWj10aGlzLEo9dzUoWi5fX3YpLFk9Wi5sLmdldChYKTtyZXR1cm4gWVswXSsrLGZ1bmN0aW9uKHEpe3ZhciBRPWZ1bmN0aW9uKCl7Wi5wcm9wcy5yZXZlYWxPcmRlcj8oWS5wdXNoKHEpLF81KFosWCxZKSk6cSgpfTtKP0ooUSk6USgpfX0sdDAucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihYKXt0aGlzLmk9bnVsbCx0aGlzLmw9bmV3IE1hcDt2YXIgWj1MMChYLmNoaWxkcmVuKTtYLnJldmVhbE9yZGVyJiZYLnJldmVhbE9yZGVyWzBdPT09ImIiJiZaLnJldmVyc2UoKTtmb3IodmFyIEo9Wi5sZW5ndGg7Si0tOyl0aGlzLmwuc2V0KFpbSl0sdGhpcy5pPVsxLDAsdGhpcy5pXSk7cmV0dXJuIFguY2hpbGRyZW59LHQwLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9dDAucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIFg9dGhpczt0aGlzLmwuZm9yRWFjaChmdW5jdGlvbihaLEope181KFgsSixaKX0pfTt2YXIgTDY9dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsTjY9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZSghUyl8bGV0dGVyfGxpZ2h0aW5nfG1hcmtlcig/IUh8V3xVKXxvdmVybGluZXxwYWludHxwb2ludGVyfHNoYXBlfHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dCg/IUwpfHRyYW5zZm9ybXx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlY3Rvcnx2ZXJ0fHdvcmR8d3JpdGluZ3x4KD8hQykpW0EtWl0vLEc2PS9eb24oQW5pfFRyYXxUb3V8QmVmb3JlSW5wfENvbXBvKS8sVjY9L1tBLVowLTldL2csSDY9dHlwZW9mIGRvY3VtZW50PCJ1IixQNj1mdW5jdGlvbihYKXtyZXR1cm4odHlwZW9mIFN5bWJvbDwidSImJnR5cGVvZiBTeW1ib2woKT09InN5bWJvbCI/L2ZpbHxjaGV8cmFkLzovZmlsfGNoZXxyYS8pLnRlc3QoWCl9O2MucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9ITAsWyJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSJdLmZvckVhY2goZnVuY3Rpb24oWCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMucHJvdG90eXBlLFgse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1siVU5TQUZFXyIrWF19LHNldDpmdW5jdGlvbihaKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxYLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Wn0pfX0pfSk7dmFyIEY1PUIuZXZlbnQ7Qi5ldmVudD1mdW5jdGlvbihYKXtyZXR1cm4gRjUmJihYPUY1KFgpKSxYLnBlcnNpc3Q9ZnVuY3Rpb24oKXt9LFguaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWxCdWJibGV9LFguaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH0sWC5uYXRpdmVFdmVudD1YfTt2YXIgVDUsQTY9e2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGFzc319LEQ1PUIudm5vZGU7Qi52bm9kZT1mdW5jdGlvbihYKXt0eXBlb2YgWC50eXBlPT0ic3RyaW5nIiYmZnVuY3Rpb24oWil7dmFye3Byb3BzOkosdHlwZTpZfT1aLHE9e30sUT1ZLmluZGV4T2YoIi0iKT09LTE7Zm9yKHZhciBLIGluIEope3ZhciBXPUpbS107aWYoIShLPT09InZhbHVlIiYmKCJkZWZhdWx0VmFsdWUiaW4gSikmJlc9PW51bGx8fEg2JiZLPT09ImNoaWxkcmVuIiYmWT09PSJub3NjcmlwdCJ8fEs9PT0iY2xhc3MifHxLPT09ImNsYXNzTmFtZSIpKXt2YXIgRz1LLnRvTG93ZXJDYXNlKCk7Sz09PSJkZWZhdWx0VmFsdWUiJiYidmFsdWUiaW4gSiYmSi52YWx1ZT09bnVsbD9LPSJ2YWx1ZSI6Sz09PSJkb3dubG9hZCImJlc9PT0hMD9XPSIiOkc9PT0idHJhbnNsYXRlIiYmVz09PSJubyI/Vz0hMTpHWzBdPT09Im8iJiZHWzFdPT09Im4iP0c9PT0ib25kb3VibGVjbGljayI/Sz0ib25kYmxjbGljayI6RyE9PSJvbmNoYW5nZSJ8fFkhPT0iaW5wdXQiJiZZIT09InRleHRhcmVhInx8UDYoSi50eXBlKT9HPT09Im9uZm9jdXMiP0s9Im9uZm9jdXNpbiI6Rz09PSJvbmJsdXIiP0s9Im9uZm9jdXNvdXQiOkc2LnRlc3QoSykmJihLPUcpOkc9Sz0ib25pbnB1dCI6USYmTjYudGVzdChLKT9LPUsucmVwbGFjZShWNiwiLSQmIikudG9Mb3dlckNhc2UoKTpXPT09bnVsbCYmKFc9dm9pZCAwKSxHPT09Im9uaW5wdXQiJiZxW0s9R10mJihLPSJvbmlucHV0Q2FwdHVyZSIpLHFbS109V319WT09InNlbGVjdCImJihxLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHEudmFsdWUpJiYocS52YWx1ZT1MMChKLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKHope3oucHJvcHMuc2VsZWN0ZWQ9cS52YWx1ZS5pbmRleE9mKHoucHJvcHMudmFsdWUpIT0tMX0pKSxxLmRlZmF1bHRWYWx1ZSE9bnVsbCYmKHEudmFsdWU9TDAoSi5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbih6KXt6LnByb3BzLnNlbGVjdGVkPXEubXVsdGlwbGU/cS5kZWZhdWx0VmFsdWUuaW5kZXhPZih6LnByb3BzLnZhbHVlKSE9LTE6cS5kZWZhdWx0VmFsdWU9PXoucHJvcHMudmFsdWV9KSkpLEouY2xhc3MmJiFKLmNsYXNzTmFtZT8ocS5jbGFzcz1KLmNsYXNzLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxLCJjbGFzc05hbWUiLEE2KSk6Si5jbGFzc05hbWUmJihxLmNsYXNzPXEuY2xhc3NOYW1lPUouY2xhc3NOYW1lKSxaLnByb3BzPXF9KFgpLFguJCR0eXBlb2Y9TDYsRDUmJkQ1KFgpfTt2YXIgazU9Qi5fX3I7Qi5fX3I9ZnVuY3Rpb24oWCl7azUmJms1KFgpLFQ1PVguX19jfTt2YXIgSTU9Qi5kaWZmZWQ7Qi5kaWZmZWQ9ZnVuY3Rpb24oWCl7STUmJkk1KFgpO3Zhcntwcm9wczpaLF9fZTpKfT1YO0ohPW51bGwmJlgudHlwZT09PSJ0ZXh0YXJlYSImJiJ2YWx1ZSJpbiBaJiZaLnZhbHVlIT09Si52YWx1ZSYmKEoudmFsdWU9Wi52YWx1ZT09bnVsbD8iIjpaLnZhbHVlKSxUNT1udWxsfTt2YXIgTzY9MDtmdW5jdGlvbiBOKFgsWixKLFkscSxRKXtafHwoWj17fSk7dmFyIEssVyxHPVo7aWYoInJlZiJpbiBHKWZvcihXIGluIEc9e30sWilXPT0icmVmIj9LPVpbV106R1tXXT1aW1ddO3ZhciB6PXt0eXBlOlgscHJvcHM6RyxrZXk6SixyZWY6SyxfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fYzpudWxsLGNvbnN0cnVjdG9yOnZvaWQgMCxfX3Y6LS1PNixfX2k6LTEsX191OjAsX19zb3VyY2U6cSxfX3NlbGY6UX07aWYodHlwZW9mIFg9PSJmdW5jdGlvbiImJihLPVguZGVmYXVsdFByb3BzKSlmb3IoVyBpbiBLKUdbV109PT12b2lkIDAmJihHW1ddPUtbV10pO3JldHVybiBCLnZub2RlJiZCLnZub2RlKHopLHp9dmFyIEY0PWB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjAnIGhlaWdodD0nMjAnJTNFJTNDY2lyY2xlIGN4PScxMCcgY3k9JzEwJyByPSc5JyBmaWxsPSdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknIHN0cm9rZT0ncmdiYSgyNTUsMjU1LDI1NSwwLjcpJyBzdHJva2Utd2lkdGg9JzEnLyUzRSUzQy9zdmclM0UiKSAxMCAxMCwgcG9pbnRlcmAsVTY9MyxCNj00LF82PTU7ZnVuY3Rpb24gbjAoe3VybDpYLHdzVXJsOlosc3R5bGU6SixpbWFnZVN0eWxlOlksY2xhc3NOYW1lOnEsb25Ib21lUHJlc3M6USxvblN0cmVhbVRvdWNoOkssb25TdHJlYW1NdWx0aVRvdWNoOlcsb25TdHJlYW1CdXR0b246RyxzdWJzY3JpYmVGcmFtZTp6LHN0cmVhbUZyYW1lOlAsc3RyZWFtQ29uZmlnOiQsaGlkZUNvbnRyb2xzOl8sb25TdHJlYW1pbmdDaGFuZ2U6Tyxjb25uZWN0aW9uUXVhbGl0eTpDfSl7bGV0IEE9ISFLLGs9dyhudWxsKSxJPXcobnVsbCksTT13KG51bGwpLFtoLEVdPVMoITEpLFtuLFEwXT1TKG51bGwpLFtnLEswXT1TKG51bGwpLHM9dyhudWxsKSxbcixPMF09UyhudWxsKTt4KCgpPT57bGV0IFY9cy5jdXJyZW50O2lmKCFWfHx0eXBlb2YgUmVzaXplT2JzZXJ2ZXI+InUiKXJldHVybjtsZXQgSD1uZXcgUmVzaXplT2JzZXJ2ZXIoKEwpPT57bGV0IFU9TFswXT8uY29udGVudFJlY3Q7aWYoVSlPMCh7d2lkdGg6VS53aWR0aCxoZWlnaHQ6VS5oZWlnaHR9KX0pO3JldHVybiBILm9ic2VydmUoViksKCk9PkguZGlzY29ubmVjdCgpfSxbXSk7bGV0W2owLHYwXT1TKDApLEcwPXcoMCksW0o0LEkwXT1TKCExKSxGPXcobnVsbCk7eCgoKT0+e2lmKEM9PT0icG9vciIpe2lmKEkwKCEwKSxGLmN1cnJlbnQpY2xlYXJUaW1lb3V0KEYuY3VycmVudCk7Ri5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntJMCghMSksRi5jdXJyZW50PW51bGx9LDMwMDApfWVsc2UgaWYoSTAoITEpLEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KSxGLmN1cnJlbnQ9bnVsbDtyZXR1cm4oKT0+e2lmKEYuY3VycmVudCljbGVhclRpbWVvdXQoRi5jdXJyZW50KX19LFtDXSk7bGV0IFI9YCR7WH0vc3RyZWFtLm1qcGVnYCx2PXcoTyk7di5jdXJyZW50PU8seCgoKT0+e3YuY3VycmVudD8uKGgpfSxbaF0pLHgoKCk9PntpZihBJiYkKUswKCQpfSxbQSwkXSk7bGV0IFQ9dyghMSk7VC5jdXJyZW50PWg7bGV0IGk9dyhudWxsKTt4KCgpPT57aWYoIUF8fCF6KXJldHVybjtyZXR1cm4geigoVik9PntHMC5jdXJyZW50KyssZS5jdXJyZW50PURhdGUubm93KCk7bGV0IEg9SS5jdXJyZW50O2lmKEgpe2lmKGkuY3VycmVudClVUkwucmV2b2tlT2JqZWN0VVJMKGkuY3VycmVudCk7aS5jdXJyZW50PVYsSC5zcmM9Vn1pZighVC5jdXJyZW50KUUoITApLFEwKG51bGwpfSl9LFtBLHpdKTtsZXQgbT1qKChWKT0+e2lmKEEpe0s/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KFYpKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09VTYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEtdKSxaMD1qKChWKT0+e2lmKEEpe0c/LihWKTtyZXR1cm59bGV0IEg9TS5jdXJyZW50O2lmKCFIfHxILnJlYWR5U3RhdGUhPT1XZWJTb2NrZXQuT1BFTilyZXR1cm47bGV0IEw9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtidXR0b246Vn0pKSxVPW5ldyBVaW50OEFycmF5KDErTC5sZW5ndGgpO1VbMF09QjYsVS5zZXQoTCwxKSxILnNlbmQoVSl9LFtBLEddKSx5PWooKFYpPT57aWYoQSl7Vz8uKFYpO3JldHVybn1sZXQgSD1NLmN1cnJlbnQ7aWYoIUh8fEgucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgTD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoVikpLFU9bmV3IFVpbnQ4QXJyYXkoMStMLmxlbmd0aCk7VVswXT1fNixVLnNldChMLDEpLEguc2VuZChVKX0sW0EsV10pO3goKCk9PntpZihBKXJldHVybjtmZXRjaChgJHtYfS9jb25maWdgKS50aGVuKChEKT0+RC5qc29uKCkpLnRoZW4oKEQpPT57aWYoRC53aWR0aD4wJiZELmhlaWdodD4wKUswKEQpfSkuY2F0Y2goKCk9Pnt9KTtsZXQgVj1aPz9YLnJlcGxhY2UoL15odHRwLywid3MiKSsiL3dzIixIPW5ldyBXZWJTb2NrZXQoVik7SC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsTS5jdXJyZW50PUgsSC5vbm9wZW49KCk9PntFKCEwKSxRMChudWxsKX0sSC5vbmNsb3NlPSgpPT57RSghMSl9LEgub25lcnJvcj0oKT0+e1EwKCJXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQiKSxFKCExKX07bGV0IEw9bmV3IEFib3J0Q29udHJvbGxlcixVPXNldEludGVydmFsKCgpPT57djAoRzAuY3VycmVudCksRzAuY3VycmVudD0wfSwxMDAwKTtyZXR1cm4oYXN5bmMoKT0+e3RyeXtsZXQgYj0oYXdhaXQgZmV0Y2goUix7c2lnbmFsOkwuc2lnbmFsfSkpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFiKXJldHVybjtsZXQgbz1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIi0tZnJhbWUiKTt3aGlsZSghMCl7bGV0e2RvbmU6WDAsdmFsdWU6cTB9PWF3YWl0IGIucmVhZCgpO2lmKFgwKWJyZWFrO2lmKHEwKWZvcihsZXQgUTQ9MDtRNDw9cTAubGVuZ3RoLW8ubGVuZ3RoO1E0Kyspe2xldCB3ND0hMDtmb3IobGV0IHgwPTA7eDA8by5sZW5ndGg7eDArKylpZihxMFtRNCt4MF0hPT1vW3gwXSl7dzQ9ITE7YnJlYWt9aWYodzQpRzAuY3VycmVudCsrfX19Y2F0Y2h7fX0pKCksKCk9PntMLmFib3J0KCksY2xlYXJJbnRlcnZhbChVKSxILmNsb3NlKCksTS5jdXJyZW50PW51bGx9fSxbWCxSLEFdKTtsZXQgZT13KDApO3goKCk9PntpZighQSlyZXR1cm47bGV0IFY9MjAwMCxIPSgpPT57bGV0IEQ9ZS5jdXJyZW50O2lmKCFEfHwhVC5jdXJyZW50KXJldHVybjtpZihEYXRlLm5vdygpLUQ+VilFKCExKX0sTD1zZXRJbnRlcnZhbCgoKT0+e3YwKEcwLmN1cnJlbnQpLEcwLmN1cnJlbnQ9MCxIKCl9LDEwMDApLFU9KCk9PntpZighZG9jdW1lbnQuaGlkZGVuKUgoKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLFUpLCgpPT57Y2xlYXJJbnRlcnZhbChMKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixVKX19LFtBXSk7bGV0IGE9aigoKT0+e3JldHVybiBBP0kuY3VycmVudDprLmN1cnJlbnR9LFtBXSksVjA9aigoVixIKT0+e2xldCBMPWEoKTtpZighTClyZXR1cm47bGV0IFU9TC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPShILmNsaWVudFgtVS5sZWZ0KS9VLndpZHRoLGI9KEguY2xpZW50WS1VLnRvcCkvVS5oZWlnaHQ7bSh7dHlwZTpWLHg6RCx5OmJ9KX0sW21dKSxKMD0zLGw9dyghMSksdT13KCExKSxVMD13KCExKSxNMD13KHtkeDowLGR5OjB9KSxDMD13KCExKSxbWTQsazRdPVMoITEpLEk0PXcoe3g6MC41LHk6MC41fSksW0gwLFkwXT1TKG51bGwpO3goKCk9PntsZXQgVj0oTCk9PntpZihMLmtleT09PSJBbHQiKWs0KCEwKX0sSD0oTCk9PntpZihMLmtleT09PSJBbHQiKXtpZihrNCghMSksIXUuY3VycmVudClZMChudWxsKX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsViksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixIKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixWKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLEgpfX0sW10pLHgoKCk9PntpZihZNCYmIXUuY3VycmVudCl7bGV0IFY9STQuY3VycmVudDtZMCh7eDE6Vi54LHkxOlYueSx4MjoxLVYueCx5MjoxLVYueX0pfWVsc2UgaWYoIVk0JiYhdS5jdXJyZW50KVkwKG51bGwpfSxbWTRdKTtsZXQgeTA9dyhudWxsKSxxND13KCExKSxFMD13KDApLE00PWooKFYsSCk9PntxNC5jdXJyZW50PSEwO2xldCBMPXkwLmN1cnJlbnQ7aWYoTCljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxFMC5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e0wuc3R5bGUubGVmdD1gJHtWKjEwMH0lYCxMLnN0eWxlLnRvcD1gJHtIKjEwMH0lYCxMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pfSxbXSksQzQ9aigoVixIKT0+e2lmKCFxNC5jdXJyZW50KXJldHVybjtsZXQgTD15MC5jdXJyZW50O2lmKEwpY2FuY2VsQW5pbWF0aW9uRnJhbWUoRTAuY3VycmVudCksRTAuY3VycmVudD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntMLnN0eWxlLmxlZnQ9YCR7VioxMDB9JWAsTC5zdHlsZS50b3A9YCR7SCoxMDB9JWB9KX0sW10pLHAwPWooKCk9PntxNC5jdXJyZW50PSExO2xldCBWPXkwLmN1cnJlbnQ7aWYoViljYW5jZWxBbmltYXRpb25GcmFtZShFMC5jdXJyZW50KSxWLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxbXSksRTQ9dygwKSx3MD13KG51bGwpLGc1PWooKCk9PntsZXQgVj1EYXRlLm5vdygpLEg9Vi1FNC5jdXJyZW50O2lmKEU0LmN1cnJlbnQ9VixIPDMwMCl7aWYodzAuY3VycmVudCljbGVhclRpbWVvdXQodzAuY3VycmVudCksdzAuY3VycmVudD1udWxsO2lmKFEpUSgpO2Vsc2UgWjAoImFwcF9zd2l0Y2hlciIpfWVsc2UgdzAuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57aWYoUSlRKCk7ZWxzZSBaMCgiaG9tZSIpO3cwLmN1cnJlbnQ9bnVsbH0sMzAwKX0sW1owLFFdKSxnMD0oKCk9PntpZighZ3x8IXIpcmV0dXJuIG51bGw7aWYoci53aWR0aD09PTB8fHIuaGVpZ2h0PT09MClyZXR1cm4gbnVsbDtsZXQgVj1NYXRoLm1pbihyLndpZHRoL2cud2lkdGgsci5oZWlnaHQvZy5oZWlnaHQpO3JldHVybnt3aWR0aDpnLndpZHRoKlYsaGVpZ2h0OmcuaGVpZ2h0KlZ9fSkoKTtyZXR1cm4gTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsZmxleDoxLC4uLl8/e306e2JvcmRlcjoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxvdmVyZmxvdzoiaGlkZGVuIixtaW5XaWR0aDowLG1pbkhlaWdodDowLC4uLkp9LGNsYXNzTmFtZTpxLGNoaWxkcmVuOltOKCJkaXYiLHtyZWY6cyxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsbWluSGVpZ2h0OjAsbWluV2lkdGg6MCxkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIifSxjaGlsZHJlbjpOKCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIix3aWR0aDpnMD9gJHtnMC53aWR0aH1weGA6IjEwMCUiLGhlaWdodDpnMD9gJHtnMC5oZWlnaHR9cHhgOiIxMDAlIn0sY2hpbGRyZW46W04oImltZyIse3JlZjprLHNyYzpBP3ZvaWQgMDpSLGRyYWdnYWJsZTohMSxvbkxvYWQ6KFYpPT57bGV0IEg9Vi5jdXJyZW50VGFyZ2V0O2lmKEgubmF0dXJhbFdpZHRoPjAmJkgubmF0dXJhbEhlaWdodD4wKUswKChMKT0+TCYmTC53aWR0aD09PUgubmF0dXJhbFdpZHRoJiZMLmhlaWdodD09PUgubmF0dXJhbEhlaWdodD9MOnt3aWR0aDpILm5hdHVyYWxXaWR0aCxoZWlnaHQ6SC5uYXR1cmFsSGVpZ2h0fSl9LHN0eWxlOkE/e2Rpc3BsYXk6Im5vbmUifTp7cG9zaXRpb246ImFic29sdXRlIixpbnNldDowLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLGN1cnNvcjpGNCxkaXNwbGF5OiJibG9jayIsdXNlclNlbGVjdDoibm9uZSIsV2Via2l0VXNlclNlbGVjdDoibm9uZSIsdG91Y2hBY3Rpb246Im5vbmUiLC4uLll9fSksQSYmTigiaW1nIix7cmVmOkksZHJhZ2dhYmxlOiExLG9uTG9hZDooVik9PntsZXQgSD1WLmN1cnJlbnRUYXJnZXQ7aWYoSC5uYXR1cmFsV2lkdGg+MCYmSC5uYXR1cmFsSGVpZ2h0PjApSzAoKEwpPT5MJiZMLndpZHRoPT09SC5uYXR1cmFsV2lkdGgmJkwuaGVpZ2h0PT09SC5uYXR1cmFsSGVpZ2h0P0w6e3dpZHRoOkgubmF0dXJhbFdpZHRoLGhlaWdodDpILm5hdHVyYWxIZWlnaHR9KX0sc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsaW5zZXQ6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixjdXJzb3I6RjQsZGlzcGxheToiYmxvY2siLHVzZXJTZWxlY3Q6Im5vbmUiLFdlYmtpdFVzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoQWN0aW9uOiJub25lIiwuLi5ZfX0pLE4oImRpdiIse3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsY3Vyc29yOkY0LHRvdWNoQWN0aW9uOiJub25lIn0sb25Nb3VzZURvd246KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxVPShWLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLEQ9KFYuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoVi5hbHRLZXkpe3UuY3VycmVudD0hMCxVMC5jdXJyZW50PVYuc2hpZnRLZXk7bGV0IGI9e3gxOlUseTE6RCx4MjoxLVUseTI6MS1EfTtNMC5jdXJyZW50PXtkeDoxLVUtVSxkeToxLUQtRH0sWTAoYikseSh7dHlwZToiYmVnaW4iLC4uLmJ9KTtyZXR1cm59aWYoTTQoVSxEKSxEPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OlUseTpELGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxWMCgiYmVnaW4iLFYpfSxvbk1vdXNlTW92ZTooVik9PntsZXQgSD1hKCk7aWYoIUgpcmV0dXJuO2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKEk0LmN1cnJlbnQ9e3g6VSx5OkR9LFYuYnV0dG9ucz09PTApe2lmKFYuYWx0S2V5KVkwKHt4MTpVLHkxOkQseDI6MS1VLHkyOjEtRH0pO3JldHVybn1pZih1LmN1cnJlbnQpe2xldCBiO2lmKFUwLmN1cnJlbnQpe2xldCBvPU0wLmN1cnJlbnQ7Yj17eDE6VSx5MTpELHgyOlUrby5keCx5MjpEK28uZHl9fWVsc2UgYj17eDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9O1kwKGIpLHkoe3R5cGU6Im1vdmUiLC4uLmJ9KTtyZXR1cm59aWYoQzQoVSxEKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpVLHk6RCxlZGdlOkowfSk7ZWxzZSBWMCgibW92ZSIsVil9LG9uTW91c2VVcDooVik9PntpZih1LmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDtpZihVMC5jdXJyZW50KXtsZXQgYj1NMC5jdXJyZW50O3koe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOlUrYi5keCx5MjpEK2IuZHl9KX1lbHNlIHkoe3R5cGU6ImVuZCIseDE6VSx5MTpELHgyOjEtVSx5MjoxLUR9KX1pZih1LmN1cnJlbnQ9ITEsIVYuYWx0S2V5KVkwKG51bGwpO3JldHVybn1pZihwMCgpLGwuY3VycmVudCl7bGV0IEg9YSgpO2lmKEgpe2xldCBMPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVT0oVi5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxEPShWLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O20oe3R5cGU6ImVuZCIseDpVLHk6RCxlZGdlOkowfSl9bC5jdXJyZW50PSExO3JldHVybn1WMCgiZW5kIixWKX0sb25Nb3VzZUxlYXZlOihWKT0+e2lmKHUuY3VycmVudCl7aWYoSDApeSh7dHlwZToiZW5kIiwuLi5IMH0pO3UuY3VycmVudD0hMSxZMChudWxsKTtyZXR1cm59aWYocDAoKSxsLmN1cnJlbnQpe2xldCBIPWEoKTtpZihIKXtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFU9KFYuY2xpZW50WC1MLmxlZnQpL0wud2lkdGgsRD0oVi5jbGllbnRZLUwudG9wKS9MLmhlaWdodDttKHt0eXBlOiJlbmQiLHg6VSx5OkQsZWRnZTpKMH0pfWwuY3VycmVudD0hMTtyZXR1cm59aWYoVi5idXR0b25zPjApVjAoImVuZCIsVik7WTAobnVsbCl9LG9uVG91Y2hTdGFydDooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKFYudG91Y2hlcy5sZW5ndGg+PTIpe3AwKCk7bGV0IG89Vi50b3VjaGVzWzBdLFgwPVYudG91Y2hlc1sxXSxxMD17eDE6KG8uY2xpZW50WC1MLmxlZnQpL0wud2lkdGgseTE6KG8uY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQseDI6KFgwLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkyOihYMC5jbGllbnRZLUwudG9wKS9MLmhlaWdodH07aWYoIUMwLmN1cnJlbnQmJiFsLmN1cnJlbnQpbSh7dHlwZToiZW5kIix4OnEwLngxLHk6cTAueTF9KTtDMC5jdXJyZW50PSEwLHUuY3VycmVudD0hMCxsLmN1cnJlbnQ9ITEsWTAocTApLHkoe3R5cGU6ImJlZ2luIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoTTQoRCxiKSxiPjAuODgpbC5jdXJyZW50PSEwLG0oe3R5cGU6ImJlZ2luIix4OkQseTpiLGVkZ2U6SjB9KTtlbHNlIGwuY3VycmVudD0hMSxtKHt0eXBlOiJiZWdpbiIseDpELHk6Yn0pfSxvblRvdWNoTW92ZTooVik9PntWLnByZXZlbnREZWZhdWx0KCk7bGV0IEg9YSgpO2lmKCFIKXJldHVybjtsZXQgTD1ILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKEMwLmN1cnJlbnQmJlYudG91Y2hlcy5sZW5ndGg+PTIpe2xldCBvPVYudG91Y2hlc1swXSxYMD1WLnRvdWNoZXNbMV0scTA9e3gxOihvLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLHkxOihvLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0LHgyOihYMC5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MjooWDAuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHR9O1kwKHEwKSx5KHt0eXBlOiJtb3ZlIiwuLi5xMH0pO3JldHVybn1sZXQgVT1WLnRvdWNoZXNbMF07aWYoIVUpcmV0dXJuO2xldCBEPShVLmNsaWVudFgtTC5sZWZ0KS9MLndpZHRoLGI9KFUuY2xpZW50WS1MLnRvcCkvTC5oZWlnaHQ7aWYoQzQoRCxiKSxsLmN1cnJlbnQpbSh7dHlwZToibW92ZSIseDpELHk6YixlZGdlOkowfSk7ZWxzZSBtKHt0eXBlOiJtb3ZlIix4OkQseTpifSl9LG9uVG91Y2hFbmQ6KFYpPT57Vi5wcmV2ZW50RGVmYXVsdCgpO2xldCBIPWEoKTtpZighSClyZXR1cm47bGV0IEw9SC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihDMC5jdXJyZW50KXtpZihWLnRvdWNoZXMubGVuZ3RoPDIpe2xldCBvPVYuY2hhbmdlZFRvdWNoZXNbMF0sWDA9SDA7aWYobyYmWDApeSh7dHlwZToiZW5kIix4MTooby5jbGllbnRYLUwubGVmdCkvTC53aWR0aCx5MTooby5jbGllbnRZLUwudG9wKS9MLmhlaWdodCx4MjpYMC54Mix5MjpYMC55Mn0pO2Vsc2UgaWYoWDApeSh7dHlwZToiZW5kIiwuLi5YMH0pO0MwLmN1cnJlbnQ9ITEsdS5jdXJyZW50PSExLFkwKG51bGwpfXJldHVybn1sZXQgVT1WLmNoYW5nZWRUb3VjaGVzWzBdO2lmKCFVKXJldHVybjtsZXQgRD0oVS5jbGllbnRYLUwubGVmdCkvTC53aWR0aCxiPShVLmNsaWVudFktTC50b3ApL0wuaGVpZ2h0O2lmKHAwKCksbC5jdXJyZW50KW0oe3R5cGU6ImVuZCIseDpELHk6YixlZGdlOkowfSksbC5jdXJyZW50PSExO2Vsc2UgbSh7dHlwZToiZW5kIix4OkQseTpifSl9fSksTigiZGl2Iix7cmVmOnkwLCJkYXRhLXRlc3RpZCI6InRvdWNoLWluZGljYXRvciIsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToibm9uZSIsd2lkdGg6MjQsaGVpZ2h0OjI0LGJvcmRlclJhZGl1czoiNTAlIixiYWNrZ3JvdW5kOiJyZ2JhKDU5LDEzMCwyNDYsMC41KSIsYm94U2hhZG93OiIwIDAgOHB4IHJnYmEoNTksMTMwLDI0NiwwLjMpIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgtNTAlLCAtNTAlKSIscG9pbnRlckV2ZW50czoibm9uZSJ9fSksSDAmJk4oZCx7Y2hpbGRyZW46W04oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngxLEgwLnkxKX0pLE4oImRpdiIseyJkYXRhLXRlc3RpZCI6ImZpbmdlci1kb3QiLHN0eWxlOlI1KEgwLngyLEgwLnkyKX0pXX0pLCFoJiYhbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiIzg4OCIsZm9udFNpemU6MTR9LGNoaWxkcmVuOiJDb25uZWN0aW5nLi4uIn0pfSksbiYmTigiZGl2Iix7c3R5bGU6YjUsY2hpbGRyZW46Tigic3BhbiIse3N0eWxlOntjb2xvcjoiI2Y0NCIsZm9udFNpemU6MTQscGFkZGluZzoyMCx0ZXh0QWxpZ246ImNlbnRlciJ9LGNoaWxkcmVuOm59KX0pLEo0JiZOKCJkaXYiLHtzdHlsZTpGNixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6e2NvbG9yOiIjZmJiZjI0Iixmb250U2l6ZToxMyxmb250RmFtaWx5OiJtb25vc3BhY2UifSxjaGlsZHJlbjoiU2xvdyBjb25uZWN0aW9uIn0pfSldfSl9KSwhXyYmTigiZGl2Iix7c3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLHBhZGRpbmc6IjRweCA4cHgiLGJvcmRlclRvcDoiMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMikifSxjaGlsZHJlbjpbTigiYnV0dG9uIix7b25DbGljazpnNSxzdHlsZTp7YmFja2dyb3VuZDoibm9uZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIixjb2xvcjoiI2FhYSIsZm9udFNpemU6MTEsZm9udEZhbWlseToibW9ub3NwYWNlIixwYWRkaW5nOiIycHggMTBweCIsY3Vyc29yOiJwb2ludGVyIixib3JkZXJSYWRpdXM6NH0sY2hpbGRyZW46IkhvbWUifSksTigic3BhbiIse3N0eWxlOntjb2xvcjpqMD4wPyIjNGY0IjoiIzg4OCIsZm9udFNpemU6MTIsZm9udEZhbWlseToibW9ub3NwYWNlIixkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo2fSxjaGlsZHJlbjpbQyYmTigic3BhbiIseyJkYXRhLXRlc3RpZCI6InF1YWxpdHktZG90IixzdHlsZTp7d2lkdGg6OCxoZWlnaHQ6OCxib3JkZXJSYWRpdXM6IjUwJSIsZGlzcGxheToiaW5saW5lLWJsb2NrIixiYWNrZ3JvdW5kOkM9PT0iZ29vZCI/IiM0YWRlODAiOkM9PT0iZGVncmFkZWQiPyIjZmFjYzE1IjoiI2VmNDQ0NCJ9fSksajAsIiBmcHMiXX0pXX0pXX0pfXZhciBGNj17cG9zaXRpb246ImFic29sdXRlIix0b3A6OCxsZWZ0OiI1MCUiLHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSIsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwLjcpIixib3JkZXJSYWRpdXM6NixwYWRkaW5nOiI0cHggMTJweCIscG9pbnRlckV2ZW50czoibm9uZSJ9LGI1PXtwb3NpdGlvbjoiYWJzb2x1dGUiLGluc2V0OjAsZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDAuOCkifSxTNT0yMDtmdW5jdGlvbiBSNShYLFope3JldHVybntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6YCR7WCoxMDB9JWAsdG9wOmAke1oqMTAwfSVgLHdpZHRoOlM1LGhlaWdodDpTNSxib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjQpIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuNykiLHRyYW5zZm9ybToidHJhbnNsYXRlKC01MCUsIC01MCUpIixwb2ludGVyRXZlbnRzOiJub25lIn19ZnVuY3Rpb24gazAoWCl7aWYoIVgpcmV0dXJuImlwaG9uZSI7bGV0IFo9WC50b0xvd2VyQ2FzZSgpO2lmKFouaW5jbHVkZXMoImlwYWQiKSlyZXR1cm4iaXBhZCI7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4id2F0Y2giO2lmKFouaW5jbHVkZXMoInZpc2lvbiIpKXJldHVybiJ2aXNpb24iO3JldHVybiJpcGhvbmUifXZhciAkMD17aXBob25lOnt3aWR0aDo0MjcsaGVpZ2h0Ojg4MSxiZXplbFg6MTgsYmV6ZWxZOjE4LGlubmVyUmFkaXVzOjU1fSxpcGFkOnt3aWR0aDo0MzAsaGVpZ2h0OjYwNSxiZXplbFg6MTYsYmV6ZWxZOjE2LGlubmVyUmFkaXVzOjEyfSx3YXRjaDp7d2lkdGg6Mjc0LGhlaWdodDozMjIsYmV6ZWxYOjEyLGJlemVsWToxMixpbm5lclJhZGl1czo3OX0sdmlzaW9uOnt3aWR0aDo2NDAsaGVpZ2h0OjQwMCxiZXplbFg6MTIsYmV6ZWxZOjEyLGlubmVyUmFkaXVzOjMyfX0sdzc9JDAuaXBob25lLndpZHRoLFQ3PSQwLmlwaG9uZS5oZWlnaHQsYjc9JDAuaXBob25lLmJlemVsWCxTNz0kMC5pcGhvbmUuYmV6ZWxZLFI3PSQwLmlwaG9uZS5pbm5lclJhZGl1cztmdW5jdGlvbiBlMChYPSJpcGhvbmUiKXtsZXQgWj0kMFtYXSxKPVoud2lkdGgtMipaLmJlemVsWCxZPVouaGVpZ2h0LTIqWi5iZXplbFk7cmV0dXJuYCR7Wi5pbm5lclJhZGl1cy9KKjEwMH0lIC8gJHtaLmlubmVyUmFkaXVzL1kqMTAwfSVgfXZhciBEND1fMChudWxsKTtmdW5jdGlvbiBYNChYKXtsZXQgWj1SMChENCk7aWYoIVopdGhyb3cgRXJyb3IoYDxTaW11bGF0b3JUb29sYmFyLiR7WH0+IG11c3QgYmUgcmVuZGVyZWQgaW5zaWRlIDxTaW11bGF0b3JUb29sYmFyPmApO3JldHVybiBafXZhciBDNj17ZGlzcGxheToiZmxleCIsZmxleFdyYXA6IndyYXAiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6InNwYWNlLWJldHdlZW4iLGdhcDoiNHB4IDEycHgiLHBhZGRpbmc6IjhweCAxMnB4Iixib3JkZXJSYWRpdXM6MjQsYmFja2dyb3VuZDoiIzFjMWMxZSIsYm9yZGVyOiIxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjEpIixib3hTaGFkb3c6IjAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMikiLG1pbldpZHRoOjI0MCx3aWR0aDoiMTAwJSJ9O2Z1bmN0aW9uIEU2KHtleGVjOlgsZGV2aWNlVWRpZDpaLGRldmljZU5hbWU6SixkZXZpY2VSdW50aW1lOlksc3RyZWFtaW5nOnE9ITEsZGlzYWJsZWQ6UT0hMSxjaGlsZHJlbjpLLHN0eWxlOlcsLi4uR30pe2xldCB6PWswKEopLCQ9e2V4ZWM6WCxkZXZpY2VVZGlkOlosZGV2aWNlTmFtZTpKLGRldmljZVJ1bnRpbWU6WSxkZXZpY2VUeXBlOnosc3RyZWFtaW5nOnEsZGlzYWJsZWQ6UXx8IVp8fCFxfTtyZXR1cm4gTihENC5Qcm92aWRlcix7dmFsdWU6JCxjaGlsZHJlbjpOKCJkaXYiLHsiZGF0YS1zaW11bGF0b3ItdG9vbGJhciI6ITAsc3R5bGU6ey4uLkM2LC4uLld9LC4uLkcsY2hpbGRyZW46S30pfSl9dmFyIHc2PXtkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImZsZXgtc3RhcnQiLHRleHRBbGlnbjoibGVmdCIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGJvcmRlcjoibm9uZSIsY29sb3I6IiNmZmYiLHBhZGRpbmc6IjJweCA0cHgiLG1hcmdpbjoiLTJweCAtNHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLG1pbldpZHRoOjAsbWF4V2lkdGg6IjEwMCUiLGxpbmVIZWlnaHQ6MS4yLGZvbnRGYW1pbHk6ImluaGVyaXQifSxUNj1EMChmdW5jdGlvbih7bmFtZTpaLHN1YnRpdGxlOkosaGlkZUNoZXZyb246WSxzdHlsZTpxLG9uTW91c2VFbnRlcjpRLG9uTW91c2VMZWF2ZTpLLC4uLld9LEcpe2xldCB6PVg0KCJUaXRsZSIpLFtQLCRdPVMoITEpLF89Wj8/ei5kZXZpY2VOYW1lPz8iTm8gc2ltdWxhdG9yIixPPUo/Pyh6LmRldmljZVJ1bnRpbWU/ei5kZXZpY2VSdW50aW1lLnJlcGxhY2UoL1wuLywiICIpOiLigJQiKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIiwiZGF0YS1zaW11bGF0b3ItdG9vbGJhci10aXRsZSI6ITAsb25Nb3VzZUVudGVyOihDKT0+eyQoITApLFE/LihDKX0sb25Nb3VzZUxlYXZlOihDKT0+eyQoITEpLEs/LihDKX0sc3R5bGU6ey4uLnc2LGJhY2tncm91bmQ6UD8icmdiYSgyNTUsMjU1LDI1NSwwLjEpIjoidHJhbnNwYXJlbnQiLC4uLnF9LC4uLlcsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7ZGlzcGxheToiaW5saW5lLWZsZXgiLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjQsZm9udFNpemU6MTIsZm9udFdlaWdodDo2MDAsY29sb3I6IiNmZmYiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpbXywhWSYmTigic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMi41IixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixzdHlsZTp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsZmxleFNocmluazowfSxjaGlsZHJlbjpOKCJwb2x5bGluZSIse3BvaW50czoiNiA5IDEyIDE1IDE4IDkifSl9KV19KSxOKCJzcGFuIix7c3R5bGU6e2ZvbnRTaXplOjEwLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNSkiLG1heFdpZHRoOiIxMDAlIixvdmVyZmxvdzoiaGlkZGVuIix0ZXh0T3ZlcmZsb3c6ImVsbGlwc2lzIix3aGl0ZVNwYWNlOiJub3dyYXAifSxjaGlsZHJlbjpPfSldfSl9KSxiNj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixnYXA6NCxmbGV4U2hyaW5rOjB9O2Z1bmN0aW9uIFM2KHtzdHlsZTpYLC4uLlp9KXtyZXR1cm4gTigiZGl2Iix7c3R5bGU6ey4uLmI2LC4uLlh9LC4uLlp9KX12YXIgUjY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLHBhZGRpbmc6Nixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLGRpc3BsYXk6ImlubGluZS1mbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuOCkiLHRyYW5zaXRpb246ImJhY2tncm91bmQtY29sb3IgMC4xNXMsIGNvbG9yIDAuMTVzIn0sWjQ9RDAoZnVuY3Rpb24oe2ZvcmNlRGlzYWJsZWQ6WixzdHlsZTpKLGRpc2FibGVkOlksb25Nb3VzZUVudGVyOnEsb25Nb3VzZUxlYXZlOlEsY2hpbGRyZW46SywuLi5XfSxHKXtsZXQgej1SMChENCksUD1ZfHxafHx6Py5kaXNhYmxlZCxbJCxfXT1TKCExKTtyZXR1cm4gTigiYnV0dG9uIix7cmVmOkcsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpQLG9uTW91c2VFbnRlcjooTyk9PntfKCEwKSxxPy4oTyl9LG9uTW91c2VMZWF2ZTooTyk9PntfKCExKSxRPy4oTyl9LHN0eWxlOnsuLi5SNixjb2xvcjpQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpIjoicmdiYSgyNTUsMjU1LDI1NSwwLjgpIixiYWNrZ3JvdW5kOiQmJiFQPyJyZ2JhKDI1NSwyNTUsMjU1LDAuMSkiOiJ0cmFuc3BhcmVudCIsY3Vyc29yOlA/Im5vdC1hbGxvd2VkIjoicG9pbnRlciIsLi4uSn0sLi4uVyxjaGlsZHJlbjpLfSl9KTtmdW5jdGlvbiBqNigpe3JldHVyblsndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gdGVsbCBwcm9jZXNzICJTaW11bGF0b3IiIHRvIHNldCBmcm9udG1vc3QgdG8gdHJ1ZScsJ3RlbGwgYXBwbGljYXRpb24gIlN5c3RlbSBFdmVudHMiIHRvIHRlbGwgcHJvY2VzcyAiU2ltdWxhdG9yIiB0byBwZXJmb3JtIGFjdGlvbiAiQVhSYWlzZSIgb2YgKGZpcnN0IHdpbmRvdyB3aG9zZSBuYW1lIGNvbnRhaW5zICJ3YXRjaE9TIiknLCd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byB0ZWxsIHByb2Nlc3MgIlNpbXVsYXRvciIgdG8gY2xpY2sgbWVudSBpdGVtICJIb21lIiBvZiBtZW51ICJEZXZpY2UiIG9mIG1lbnUgYmFyIGl0ZW0gIkRldmljZSIgb2YgbWVudSBiYXIgMSddLm1hcCgoWik9PmAtZSAnJHtafSdgKS5yZWR1Y2UoKFosSik9PmAke1p9ICR7Sn1gLCJvc2FzY3JpcHQiKX12YXIgdjY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2hpbGRyZW46TigicGF0aCIse2Q6Ik0zIDEwLjUgMTIgM2w5IDcuNVYyMGExIDEgMCAwIDEtMSAxaC01di03aC02djdINGExIDEgMCAwIDEtMS0xeiJ9KX0pLHk2PU4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTE0LjUgNGgtNUw3IDdINGEyIDIgMCAwIDAtMiAydjlhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0yVjlhMiAyIDAgMCAwLTItMmgtM3oifSksTigiY2lyY2xlIix7Y3g6IjEyIixjeToiMTMiLHI6IjQifSldfSkscDY9Tigic3ZnIix7d2lkdGg6IjE4IixoZWlnaHQ6IjE4Iix2aWV3Qm94OiIwIDAgMTIgMTMiLGZpbGw6ImN1cnJlbnRDb2xvciIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjaGlsZHJlbjpOKCJwYXRoIix7ZDoiTTEwLjIzMDUgMTIuODA3N0g0LjQyMzgzQzMuOTIzODMgMTIuODA3NyAzLjU0Njg4IDEyLjY4NDYgMy4yOTI5NyAxMi40Mzg1QzMuMDQyOTcgMTIuMTk2MyAyLjkxNzk3IDExLjgxOTQgMi45MTc5NyAxMS4zMDc3VjUuNTEyNzRDMi45MTc5NyA0Ljk5NzExIDMuMDQyOTcgNC42MTgyMSAzLjI5Mjk3IDQuMzc2MDJDMy41NDY4OCA0LjEyOTkzIDMuOTIzODMgNC4wMDY4OCA0LjQyMzgzIDQuMDA2ODhIMTAuMjMwNUMxMC43MzQ0IDQuMDA2ODggMTEuMTExMyA0LjEyOTkzIDExLjM2MTMgNC4zNzYwMkMxMS42MTEzIDQuNjE4MjEgMTEuNzM2MyA0Ljk5NzExIDExLjczNjMgNS41MTI3NFYxMS4zMDc3QzExLjczNjMgMTEuODE5NCAxMS42MTEzIDEyLjE5NjMgMTEuMzYxMyAxMi40Mzg1QzExLjExMTMgMTIuNjg0NiAxMC43MzQ0IDEyLjgwNzcgMTAuMjMwNSAxMi44MDc3Wk0xMC4yMTI5IDExLjg2NDNDMTAuNDE2IDExLjg2NDMgMTAuNTYyNSAxMS44MTk0IDEwLjY1MjMgMTEuNzI5NUMxMC43NDYxIDExLjY0MzYgMTAuNzkzIDExLjQ5NzEgMTAuNzkzIDExLjI5MDFWNS41MjQ0NkMxMC43OTMgNS4zMTc0MyAxMC43NDYxIDUuMTcwOTQgMTAuNjUyMyA1LjA4NTAxQzEwLjU2MjUgNC45OTUxNiAxMC40MTYgNC45NTAyNCAxMC4yMTI5IDQuOTUwMjRINC40NDE0MUM0LjI0MjE5IDQuOTUwMjQgNC4wOTU3IDQuOTk1MTYgNC4wMDE5NSA1LjA4NTAxQzMuOTA4MiA1LjE3MDk0IDMuODYxMzMgNS4zMTc0MyAzLjg2MTMzIDUuNTI0NDZWMTEuMjkwMUMzLjg2MTMzIDExLjQ5NzEgMy45MDgyIDExLjY0MzYgNC4wMDE5NSAxMS43Mjk1QzQuMDk1NyAxMS44MTk0IDQuMjQyMTkgMTEuODY0MyA0LjQ0MTQxIDExLjg2NDNIMTAuMjEyOVpNMi45MTc5NyAyLjU4MzA1VjAuNDE1MDgzQzIuOTE3OTcgMC4yMDAyNCAyLjk4NjMzIDAuMDY5MzgwMyAzLjEyMzA1IDAuMDIyNTA1M0MzLjI1OTc3IC0wLjAyODI3NTkgMy40MTAxNiAwLjAwNjg4MDMzIDMuNTc0MjIgMC4xMjc5NzRMNS4wNTA3OCAxLjIxMTk2QzUuMTc1NzggMS4zMDU3MSA1LjIzODI4IDEuNDAxNDEgNS4yMzgyOCAxLjQ5OTA3QzUuMjM4MjggMS41OTY3MiA1LjE3NTc4IDEuNjkyNDMgNS4wNTA3OCAxLjc4NjE4TDMuNTc0MjIgMi44NjQzQzMuNDEwMTYgMi45ODU0IDMuMjU5NzcgMy4wMjI1MSAzLjEyMzA1IDIuOTc1NjNDMi45ODYzMyAyLjkyNDg1IDIuOTE3OTcgMi43OTM5OSAyLjkxNzk3IDIuNTgzMDVaTTMuNTMzMiAxLjE1MzM2QzMuNjI2OTUgMS4xNTMzNiAzLjcwNzAzIDEuMTg2NTcgMy43NzM0NCAxLjI1Mjk3QzMuODQzNzUgMS4zMTkzOCAzLjg3ODkxIDEuMzk3NTEgMy44Nzg5MSAxLjQ4NzM1QzMuODc4OTEgMS41ODExIDMuODQzNzUgMS42NjMxMyAzLjc3MzQ0IDEuNzMzNDRDMy43MDcwMyAxLjc5OTg1IDMuNjI2OTUgMS44MzMwNSAzLjUzMzIgMS44MzMwNUgyLjgwNjY0QzIuMzgwODYgMS44MzMwNSAyLjAxMTcyIDEuOTI0ODUgMS42OTkyMiAyLjEwODQ0QzEuMzkwNjIgMi4yODgxMyAxLjE1MjM0IDIuNTM4MTMgMC45ODQzNzUgMi44NTg0NEMwLjgxNjQwNiAzLjE3ODc2IDAuNzMyNDIyIDMuNTQ1OTQgMC43MzI0MjIgMy45NjAwMVY0LjgzODkxQzAuNzMyNDIyIDQuOTM2NTcgMC42OTcyNjYgNS4wMjI1MSAwLjYyNjk1MyA1LjA5NjcyQzAuNTUyNzM0IDUuMTY3MDQgMC40NjQ4NDQgNS4yMDIxOSAwLjM2MzI4MSA1LjIwMjE5QzAuMjY1NjI1IDUuMjAyMTkgMC4xODE2NDEgNS4xNjcwNCAwLjExMTMyOCA1LjA5NjcyQzAuMDM3MTA5NCA1LjAyMjUxIDAgNC45MzY1NyAwIDQuODM4OTFWMy45NjAwMUMwIDMuNDAxNDEgMC4xMTcxODggMi45MTExOCAwLjM1MTU2MiAyLjQ4OTNDMC41ODIwMzEgMi4wNjc0MyAwLjkwODIwMyAxLjczOTMgMS4zMzAwOCAxLjUwNDkzQzEuNzQ4MDUgMS4yNzA1NSAyLjIzODI4IDEuMTUzMzYgMi44MDA3OCAxLjE1MzM2SDMuNTMzMloifSl9KSxnNj1EMChmdW5jdGlvbih7b25DbGljazpaLC4uLkp9LFkpe2xldCBxPVg0KCJIb21lQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiSG9tZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVR5cGU9PT0id2F0Y2giKXEuZXhlYyhqNigpKTtlbHNlIHEuZXhlYygic2VydmUtc2ltIGJ1dHRvbiBob21lIil9LC4uLkosY2hpbGRyZW46djZ9KX0pLHg2PUQwKGZ1bmN0aW9uKHtvbkNsaWNrOlosLi4uSn0sWSl7bGV0IHE9WDQoIlNjcmVlbnNob3RCdXR0b24iKTtyZXR1cm4gTihaNCx7cmVmOlksImFyaWEtbGFiZWwiOiJTY3JlZW5zaG90IixvbkNsaWNrOihRKT0+e2lmKFo/LihRKSxRLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2lmKHEuZGV2aWNlVWRpZClxLmV4ZWMoYHhjcnVuIHNpbWN0bCBpbyAke3EuZGV2aWNlVWRpZH0gc2NyZWVuc2hvdCB+L0Rlc2t0b3AvaGF0Y2gtc2NyZWVuc2hvdC0kKGRhdGUgKyVzKS5wbmdgKX0sLi4uSixjaGlsZHJlbjp5Nn0pfSksaDY9RDAoZnVuY3Rpb24oe29uQ2xpY2s6WiwuLi5KfSxZKXtsZXQgcT1YNCgiUm90YXRlQnV0dG9uIik7cmV0dXJuIE4oWjQse3JlZjpZLCJhcmlhLWxhYmVsIjoiUm90YXRlIGRldmljZSIsb25DbGljazooUSk9PntpZihaPy4oUSksUS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtpZihxLmRldmljZVVkaWQpcS5leGVjKGBvc2FzY3JpcHQgLWUgJ3RlbGwgYXBwbGljYXRpb24gIlNpbXVsYXRvciIgdG8gYWN0aXZhdGUnIC1lICd0ZWxsIGFwcGxpY2F0aW9uICJTeXN0ZW0gRXZlbnRzIiB0byBrZXkgY29kZSAxMjQgdXNpbmcge2NvbW1hbmQgZG93bn0nYCl9LC4uLkosY2hpbGRyZW46cDZ9KX0pLHQ9RTY7dC5UaXRsZT1UNjt0LkFjdGlvbnM9UzY7dC5CdXR0b249WjQ7dC5Ib21lQnV0dG9uPWc2O3QuU2NyZWVuc2hvdEJ1dHRvbj14Njt0LlJvdGF0ZUJ1dHRvbj1oNjtmdW5jdGlvbiBtNihYKXtsZXRbWixKXT1TKG51bGwpLFk9dyhuZXcgU2V0KSxbcSxRXT1TKG51bGwpLEs9aigoVyk9PntyZXR1cm4gWS5jdXJyZW50LmFkZChXKSwoKT0+e1kuY3VycmVudC5kZWxldGUoVyl9fSxbXSk7cmV0dXJuIHgoKCk9PntpZighWClyZXR1cm47bGV0IFc9bmV3IEFib3J0Q29udHJvbGxlcixHPVgucmVwbGFjZSgvXC9zdHJlYW1cLm1qcGVnJC8sIiIpO3JldHVybiBmZXRjaChgJHtHfS9jb25maWdgLHtzaWduYWw6Vy5zaWduYWx9KS50aGVuKCh6KT0+ei5qc29uKCkpLnRoZW4oKHopPT57aWYoei53aWR0aD4wJiZ6LmhlaWdodD4wKUooeil9KS5jYXRjaCgoKT0+e30pLChhc3luYygpPT57dHJ5e2xldCBQPShhd2FpdCBmZXRjaChYLHtzaWduYWw6Vy5zaWduYWx9KSkuYm9keT8uZ2V0UmVhZGVyKCk7aWYoIVApcmV0dXJuO2xldCAkPW5ldyBVaW50OEFycmF5KDApO3doaWxlKCEwKXtsZXR7ZG9uZTpfLHZhbHVlOk99PWF3YWl0IFAucmVhZCgpO2lmKF8pYnJlYWs7bGV0IEM9bmV3IFVpbnQ4QXJyYXkoJC5sZW5ndGgrTy5sZW5ndGgpO0Muc2V0KCQpLEMuc2V0KE8sJC5sZW5ndGgpLCQ9Qzt3aGlsZSghMCl7bGV0IEE9LTE7Zm9yKGxldCBFPTA7RTwkLmxlbmd0aC0xO0UrKylpZigkW0VdPT09MjU1JiYkW0UrMV09PT0yMTYpe0E9RTticmVha31pZihBPT09LTEpYnJlYWs7bGV0IGs9LTE7Zm9yKGxldCBFPUErMjtFPCQubGVuZ3RoLTE7RSsrKWlmKCRbRV09PT0yNTUmJiRbRSsxXT09PTIxNyl7az1FKzI7YnJlYWt9aWYoaz09PS0xKWJyZWFrO2xldCBJPSQuc2xpY2UoQSxrKTskPSQuc2xpY2Uoayk7bGV0IE09bmV3IEJsb2IoW0ldLHt0eXBlOiJpbWFnZS9qcGVnIn0pLGg9VVJMLmNyZWF0ZU9iamVjdFVSTChNKTtRKGgpO2ZvcihsZXQgRSBvZiBZLmN1cnJlbnQpRShoKX19fWNhdGNoe319KSgpLCgpPT5XLmFib3J0KCl9LFtYXSkse3N1YnNjcmliZUZyYW1lOkssZnJhbWU6cSxjb25maWc6Wn19dmFyIGQ2PXtLZXlBOjQsS2V5Qjo1LEtleUM6NixLZXlEOjcsS2V5RTo4LEtleUY6OSxLZXlHOjEwLEtleUg6MTEsS2V5SToxMixLZXlKOjEzLEtleUs6MTQsS2V5TDoxNSxLZXlNOjE2LEtleU46MTcsS2V5TzoxOCxLZXlQOjE5LEtleVE6MjAsS2V5UjoyMSxLZXlTOjIyLEtleVQ6MjMsS2V5VToyNCxLZXlWOjI1LEtleVc6MjYsS2V5WDoyNyxLZXlZOjI4LEtleVo6MjksRGlnaXQxOjMwLERpZ2l0MjozMSxEaWdpdDM6MzIsRGlnaXQ0OjMzLERpZ2l0NTozNCxEaWdpdDY6MzUsRGlnaXQ3OjM2LERpZ2l0ODozNyxEaWdpdDk6MzgsRGlnaXQwOjM5LEVudGVyOjQwLEVzY2FwZTo0MSxCYWNrc3BhY2U6NDIsVGFiOjQzLFNwYWNlOjQ0LE1pbnVzOjQ1LEVxdWFsOjQ2LEJyYWNrZXRMZWZ0OjQ3LEJyYWNrZXRSaWdodDo0OCxCYWNrc2xhc2g6NDksU2VtaWNvbG9uOjUxLFF1b3RlOjUyLEJhY2txdW90ZTo1MyxDb21tYTo1NCxQZXJpb2Q6NTUsU2xhc2g6NTYsQ2Fwc0xvY2s6NTcsRjE6NTgsRjI6NTksRjM6NjAsRjQ6NjEsRjU6NjIsRjY6NjMsRjc6NjQsRjg6NjUsRjk6NjYsRjEwOjY3LEYxMTo2OCxGMTI6NjksUHJpbnRTY3JlZW46NzAsU2Nyb2xsTG9jazo3MSxQYXVzZTo3MixJbnNlcnQ6NzMsSG9tZTo3NCxQYWdlVXA6NzUsRGVsZXRlOjc2LEVuZDo3NyxQYWdlRG93bjo3OCxBcnJvd1JpZ2h0Ojc5LEFycm93TGVmdDo4MCxBcnJvd0Rvd246ODEsQXJyb3dVcDo4MixOdW1Mb2NrOjgzLE51bXBhZERpdmlkZTo4NCxOdW1wYWRNdWx0aXBseTo4NSxOdW1wYWRTdWJ0cmFjdDo4NixOdW1wYWRBZGQ6ODcsTnVtcGFkRW50ZXI6ODgsTnVtcGFkMTo4OSxOdW1wYWQyOjkwLE51bXBhZDM6OTEsTnVtcGFkNDo5MixOdW1wYWQ1OjkzLE51bXBhZDY6OTQsTnVtcGFkNzo5NSxOdW1wYWQ4Ojk2LE51bXBhZDk6OTcsTnVtcGFkMDo5OCxOdW1wYWREZWNpbWFsOjk5LENvbnRyb2xMZWZ0OjIyNCxTaGlmdExlZnQ6MjI1LEFsdExlZnQ6MjI2LE1ldGFMZWZ0OjIyNyxDb250cm9sUmlnaHQ6MjI4LFNoaWZ0UmlnaHQ6MjI5LEFsdFJpZ2h0OjIzMCxNZXRhUmlnaHQ6MjMxfTtmdW5jdGlvbiBmNihYKXtyZXR1cm4gZDZbWF0/P251bGx9YXN5bmMgZnVuY3Rpb24gQTAoWCl7cmV0dXJuKGF3YWl0IGZldGNoKCIvZXhlYyIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtjb21tYW5kOlh9KX0pKS5qc29uKCl9ZnVuY3Rpb24gYTYoWCl7dHJ5e2xldCBaPUpTT04ucGFyc2UoWCksSj1bXTtmb3IobGV0W1kscV1vZiBPYmplY3QuZW50cmllcyhaLmRldmljZXM/P3t9KSl7bGV0IFE9WS5yZXBsYWNlKC9eY29tXC5hcHBsZVwuQ29yZVNpbXVsYXRvclwuU2ltUnVudGltZVwuLywiIikucmVwbGFjZSgvLS9nLCIuIik7Zm9yKGxldCBLIG9mIHEpaWYoSy5pc0F2YWlsYWJsZSlKLnB1c2goe3VkaWQ6Sy51ZGlkLG5hbWU6Sy5uYW1lLHN0YXRlOksuc3RhdGUscnVudGltZTpRfSl9cmV0dXJuIEp9Y2F0Y2h7cmV0dXJuW119fWZ1bmN0aW9uIGo1KFgpe2xldCBaPVgudG9Mb3dlckNhc2UoKTtpZihaLmluY2x1ZGVzKCJpcGhvbmUiKSlyZXR1cm4gMDtpZihaLmluY2x1ZGVzKCJpcGFkIikpcmV0dXJuIDE7aWYoWi5pbmNsdWRlcygid2F0Y2giKSlyZXR1cm4gMjtpZihaLmluY2x1ZGVzKCJ2aXNpb24iKSlyZXR1cm4gMztyZXR1cm4gNH1mdW5jdGlvbiB2NShYKXtsZXQgWj1YLnRvTG93ZXJDYXNlKCk7aWYoWi5zdGFydHNXaXRoKCJpb3MiKSlyZXR1cm4gMDtpZihaLnN0YXJ0c1dpdGgoImlwYWRvcyIpKXJldHVybiAxO2lmKFouc3RhcnRzV2l0aCgid2F0Y2hvcyIpKXJldHVybiAyO2lmKFouc3RhcnRzV2l0aCgidmlzaW9ub3MiKXx8Wi5zdGFydHNXaXRoKCJ4cm9zIikpcmV0dXJuIDM7cmV0dXJuIDR9ZnVuY3Rpb24gbDYoe2RldmljZXM6WCxzZWxlY3RlZFVkaWQ6Wixsb2FkaW5nOkosZXJyb3I6WSxzdG9wcGluZ1VkaWRzOnEsb25SZWZyZXNoOlEsb25TZWxlY3Q6SyxvblN0b3A6Vyx0cmlnZ2VyOkd9KXtsZXRbeixQXT1TKCExKSwkPXcobnVsbCk7eCgoKT0+e2lmKCF6KXJldHVybjtsZXQgQT0oayk9PntpZighJC5jdXJyZW50Py5jb250YWlucyhrLnRhcmdldCkpUCghMSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSl9LFt6XSk7bGV0IF89bmV3IE1hcDtmb3IobGV0IEEgb2YgWCl7aWYoQS51ZGlkPT09Wiljb250aW51ZTtsZXQgaz1fLmdldChBLnJ1bnRpbWUpO2lmKCFrKWs9W10sXy5zZXQoQS5ydW50aW1lLGspO2sucHVzaChBKX1mb3IobGV0IEEgb2YgXy52YWx1ZXMoKSlBLnNvcnQoKGssSSk9Pmo1KGsubmFtZSktajUoSS5uYW1lKXx8ay5uYW1lLmxvY2FsZUNvbXBhcmUoSS5uYW1lKSk7bGV0IE89Wy4uLl8uZW50cmllcygpXS5zb3J0KChbQV0sW2tdKT0+djUoQSktdjUoayl8fEEubG9jYWxlQ29tcGFyZShrKSksQz1YLmZpbmQoKEEpPT5BLnVkaWQ9PT1aKT8/bnVsbDtyZXR1cm4gTigiZGl2Iix7cmVmOiQsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LGNoaWxkcmVuOltOKCJkaXYiLHtvbkNsaWNrOigpPT57aWYoIXopUSgpO1AoKEEpPT4hQSl9LGNoaWxkcmVuOkd9KSx6JiZOKCJkaXYiLHtzdHlsZTppNixjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6dTYsY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp7Zm9udFdlaWdodDo2MDB9LGNoaWxkcmVuOiJTaW11bGF0b3JzIn0pLE4oImJ1dHRvbiIse29uQ2xpY2s6KEEpPT57QS5zdG9wUHJvcGFnYXRpb24oKSxRKCl9LGRpc2FibGVkOkosc3R5bGU6bzYsY2hpbGRyZW46Sj8iLi4uIjoiUmVmcmVzaCJ9KV19KSxZJiZOKCJkaXYiLHtzdHlsZTpzNixjaGlsZHJlbjpZfSksQyYmTihkLHtjaGlsZHJlbjpbTigiZGl2Iix7c3R5bGU6ey4uLnA1LGNvbG9yOiIjYTViNGZjIn0sY2hpbGRyZW46W04oInNwYW4iLHtzdHlsZTp5NShDLnN0YXRlPT09IkJvb3RlZCI/IiM0YWRlODAiOiIjNDQ0Iil9KSxOKCJzcGFuIix7c3R5bGU6e2ZsZXg6MX0sY2hpbGRyZW46Qy5uYW1lfSldfSksTigiZGl2Iix7c3R5bGU6cjZ9KV19KSxYLmxlbmd0aD09PTAmJiFKJiYhWSYmTigiZGl2Iix7c3R5bGU6dDYsY2hpbGRyZW46Ik5vIGF2YWlsYWJsZSBzaW11bGF0b3JzIGZvdW5kIn0pLE8ubWFwKChbQSxrXSk9Pk4oImRpdiIse2NoaWxkcmVuOltOKCJkaXYiLHtzdHlsZTpuNixjaGlsZHJlbjpBfSksay5tYXAoKEkpPT57bGV0IE09cS5oYXMoSS51ZGlkKSxoPUkuc3RhdGU9PT0iQm9vdGVkIjtyZXR1cm4gTigiZGl2Iix7c3R5bGU6cDUsb25Nb3VzZUVudGVyOihFKT0+RS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMjU1LDI1NSwyNTUsMC4wOCkiLG9uTW91c2VMZWF2ZTooRSk9PkUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kPSJ0cmFuc3BhcmVudCIsb25DbGljazooKT0+e0soSSksUCghMSl9LGNoaWxkcmVuOltOKCJzcGFuIix7c3R5bGU6eTUoaD8iIzRhZGU4MCI6IiM0NDQiKX0pLE4oInNwYW4iLHtzdHlsZTp7ZmxleDoxfSxjaGlsZHJlbjpJLm5hbWV9KSxoJiZOKCJzcGFuIix7cm9sZToiYnV0dG9uIixvbkNsaWNrOihFKT0+e2lmKEUuc3RvcFByb3BhZ2F0aW9uKCksIU0pVyhJLnVkaWQpfSxzdHlsZTp7Zm9udFNpemU6MTAscGFkZGluZzoiMXB4IDZweCIsYm9yZGVyUmFkaXVzOjQsY29sb3I6TT8iIzg4OCI6IiNmODcxNzEiLGJhY2tncm91bmQ6TT8idHJhbnNwYXJlbnQiOiJyZ2JhKDI0OCwxMTMsMTEzLDAuMSkiLGN1cnNvcjpNPyJkZWZhdWx0IjoicG9pbnRlciJ9LGNoaWxkcmVuOk0/IlN0b3BwaW5nLi4uIjoiU3RvcCJ9KV19LEkudWRpZCl9KV19LEEpKV19KV19KX1mdW5jdGlvbiB5NShYKXtyZXR1cm57d2lkdGg6NixoZWlnaHQ6Nixib3JkZXJSYWRpdXM6IjUwJSIsYmFja2dyb3VuZDpYLGZsZXhTaHJpbms6MH19ZnVuY3Rpb24gYzYoKXtsZXQgWD13aW5kb3cuX19TSU1fUFJFVklFV19fLFtaLEpdPVMoITEpLFtZLHFdPVMoW10pLFtRLEtdPVMoITEpLFtXLEddPVMobnVsbCksW3osUF09UyhuZXcgU2V0KSxbJCxfXT1TKCExKSxPPWooYXN5bmMoKT0+e0soITApLEcobnVsbCk7dHJ5e2xldCBGPWF3YWl0IEEwKCJ4Y3J1biBzaW1jdGwgbGlzdCBkZXZpY2VzIGF2YWlsYWJsZSAtaiIpO2lmKEYuZXhpdENvZGUhPT0wKXRocm93IEVycm9yKEYuc3RkZXJyfHwic2ltY3RsIGxpc3QgZmFpbGVkIik7cShhNihGLnN0ZG91dCkpfWNhdGNoKEYpe0coRiBpbnN0YW5jZW9mIEVycm9yP0YubWVzc2FnZToiRmFpbGVkIHRvIGxpc3QgZGV2aWNlcyIpfWZpbmFsbHl7SyghMSl9fSxbXSk7aWYoeCgoKT0+e08oKX0sW09dKSx4KCgpPT57aWYoIVg/LmxvZ3NFbmRwb2ludClyZXR1cm47bGV0IEY9bmV3IEV2ZW50U291cmNlKFgubG9nc0VuZHBvaW50KSxSPW5ldyBNYXAsdj1bIiM4YmU5ZmQiLCIjNTBmYTdiIiwiI2ZmYjg2YyIsIiNmZjc5YzYiLCIjYmQ5M2Y5IiwiI2YxZmE4YyIsIiM2MjcyYTQiLCIjZmY1NTU1IiwiIzY5ZmY5NCIsIiNkNmFjZmYiLCIjZmZmZmE1IiwiI2E0ZmZmZiIsIiNmZjZlNmUiLCIjY2FhOWZhIiwiIzVhZjc4ZSJdO2Z1bmN0aW9uIFQoWjApe2xldCB5PVIuZ2V0KFowKTtpZigheSl7bGV0IGU9MDtmb3IobGV0IGE9MDthPFowLmxlbmd0aDthKyspZT0oZTw8NSktZStaMC5jaGFyQ29kZUF0KGEpfDA7eT12W01hdGguYWJzKGUpJXYubGVuZ3RoXSxSLnNldChaMCx5KX1yZXR1cm4geX1sZXQgaT0iIixtPSExO3JldHVybiBGLm9ubWVzc2FnZT0oWjApPT57dHJ5e2xldCB5PUpTT04ucGFyc2UoWjAuZGF0YSksZT15LnByb2Nlc3NJbWFnZVBhdGg/LnNwbGl0KCIvIikucG9wKCk/P3kuc2VuZGVySW1hZ2VQYXRoPy5zcGxpdCgiLyIpLnBvcCgpPz8iIixhPXkuc3Vic3lzdGVtPz8iIixWMD15LmNhdGVnb3J5Pz8iIixKMD15LmV2ZW50TWVzc2FnZT8/IiI7aWYoIUowKXJldHVybjtpZihlIT09aSl7aWYobSljb25zb2xlLmdyb3VwRW5kKCk7bGV0IE0wPVQoZSk7Y29uc29sZS5ncm91cENvbGxhcHNlZChgJWMke2V9JHthP2AgJWMke2F9JHtWMD8iOiIrVjA6IiJ9YDoiIn1gLGBjb2xvcjoke00wfTtmb250LXdlaWdodDpib2xkYCwuLi5hP1siY29sb3I6Izg4ODtmb250LXdlaWdodDpub3JtYWwiXTpbXSksbT0hMCxpPWV9bGV0IGw9KHkubWVzc2FnZVR5cGU/PyIiKS50b0xvd2VyQ2FzZSgpLHU9YSYmZT09PWk/YCVjJHtWMHx8YX0lYyBgOiIiLFUwPXU/WyJjb2xvcjojODg4O2ZvbnQtc3R5bGU6aXRhbGljIiwiY29sb3I6aW5oZXJpdCJdOltdO2lmKGw9PT0iZmF1bHQifHxsPT09ImVycm9yIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojZmY1NTU1Iik7ZWxzZSBpZihsPT09ImRlYnVnIiljb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjojNjI3MmE0Iik7ZWxzZSBjb25zb2xlLmxvZyhgJHt1fSVjJHtKMH1gLC4uLlUwLCJjb2xvcjppbmhlcml0Iil9Y2F0Y2h7fX0sKCk9PntpZihtKWNvbnNvbGUuZ3JvdXBFbmQoKTtGLmNsb3NlKCl9fSxbWD8ubG9nc0VuZHBvaW50XSksIVgpcmV0dXJuIE4oImRpdiIse3N0eWxlOk4wLnBhZ2UsY2hpbGRyZW46TigiZGl2Iix7c3R5bGU6TjAuZW1wdHksY2hpbGRyZW46W04oImgxIix7c3R5bGU6TjAuZW1wdHlUaXRsZSxjaGlsZHJlbjoiTm8gc2VydmUtc2ltIHN0cmVhbSBydW5uaW5nIn0pLE4oInAiLHtzdHlsZTpOMC5lbXB0eUhpbnQsY2hpbGRyZW46WyJCb290IGFuIGlPUyBzaW11bGF0b3IgYW5kIHN0YXJ0IGEgSGF0Y2ggc3RyZWFtIHdpdGgiLCIgIixOKCJjb2RlIix7c3R5bGU6TjAuY29kZSxjaGlsZHJlbjoiYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2gifSksIiwgdGhlbiByZWxvYWQuIl19KV19KX0pO2xldCBDPVkuZmluZCgoRik9PkYudWRpZD09PVguZGV2aWNlKT8/bnVsbCxBPWswKEM/Lm5hbWUpLGs9JDBbQV0sST1rLndpZHRoLTIqay5iZXplbFgsTT1rLmhlaWdodC0yKmsuYmV6ZWxZLGg9ZTAoQSksRT1BPT09InZpc2lvbiI/NTgwOkE9PT0iaXBhZCI/NDAwOkE9PT0id2F0Y2giPzIwMDozMjAsbj1tNihYLnN0cmVhbVVybCksUTA9dyhudWxsKTt4KCgpPT57bGV0IEY9bmV3IFdlYlNvY2tldChYLndzVXJsKTtyZXR1cm4gRi5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsUTAuY3VycmVudD1GLCgpPT57Ri5jbG9zZSgpLFEwLmN1cnJlbnQ9bnVsbH19LFtYLndzVXJsXSk7bGV0IGc9aigoRixSKT0+e2xldCB2PVEwLmN1cnJlbnQ7aWYoIXZ8fHYucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5PUEVOKXJldHVybjtsZXQgVD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoUikpLGk9bmV3IFVpbnQ4QXJyYXkoMStULmxlbmd0aCk7aVswXT1GLGkuc2V0KFQsMSksdi5zZW5kKGkpfSxbXSksSzA9aigoRik9PmcoMyxGKSxbZ10pLHM9aigoRik9PmcoNSxGKSxbZ10pLHI9aigoRik9PmcoNCx7YnV0dG9uOkZ9KSxbZ10pLE8wPWooKEYsUik9PntnKDYse3R5cGU6Rix1c2FnZTpSfSl9LFtnXSksW2owLHYwXT1TKG51bGwpO3goKCk9PntsZXQgRj1uZXcgRXZlbnRTb3VyY2UoIi9hcHBzdGF0ZSIpLFI9bnVsbDtyZXR1cm4gRi5vbm1lc3NhZ2U9KHYpPT57dHJ5e2xldCBUPUpTT04ucGFyc2Uodi5kYXRhKTtpZihSKWNsZWFyVGltZW91dChSKTtsZXQgaT1UPy5pc1JlYWN0TmF0aXZlPzA6NjAwO1I9c2V0VGltZW91dCgoKT0+djAoVCksaSl9Y2F0Y2h7fX0sKCk9PntpZihSKWNsZWFyVGltZW91dChSKTtGLmNsb3NlKCl9fSxbXSk7bGV0IEcwPWooYXN5bmMoKT0+e08wKCJkb3duIiwyMjcpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoImRvd24iLDIxKSxhd2FpdCBuZXcgUHJvbWlzZSgodik9PnNldFRpbWVvdXQodiwzMCkpLE8wKCJ1cCIsMjEpLGF3YWl0IG5ldyBQcm9taXNlKCh2KT0+c2V0VGltZW91dCh2LDMwKSksTzAoInVwIiwyMjcpfSxbTzBdKTt4KCgpPT57bGV0IEY9KFQsaSk9PntpZihULmNvZGU9PT0iS2V5SCImJlQubWV0YUtleSYmVC5zaGlmdEtleSl7aWYoVC5wcmV2ZW50RGVmYXVsdCgpLGk9PT0iZG93biImJiFULnJlcGVhdClnKDQse2J1dHRvbjoiaG9tZSJ9KTtyZXR1cm59aWYoVC5jb2RlPT09IktleUEiJiZULm1ldGFLZXkmJlQuc2hpZnRLZXkpe2lmKFQucHJldmVudERlZmF1bHQoKSxpPT09ImRvd24iJiYhVC5yZXBlYXQpQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlYCkudGhlbigoWjApPT57bGV0IHk9WjAuc3Rkb3V0LnRyaW0oKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIjtyZXR1cm4gQTAoYHhjcnVuIHNpbWN0bCB1aSAke1guZGV2aWNlfSBhcHBlYXJhbmNlICR7eX1gKX0pLmNhdGNoKCgpPT57fSk7cmV0dXJufWxldCBtPWY2KFQuY29kZSk7aWYobT09bnVsbClyZXR1cm47VC5wcmV2ZW50RGVmYXVsdCgpLGcoNix7dHlwZTppLHVzYWdlOm19KX0sUj0oVCk9PkYoVCwiZG93biIpLHY9KFQpPT5GKFQsInVwIik7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixSKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHYpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLFIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsdil9fSxbZyxYLmRldmljZV0pO2xldCBKND1qKGFzeW5jKEYpPT57aWYoJHx8Ri51ZGlkPT09WC5kZXZpY2UpcmV0dXJuO18oITApO3RyeXtpZihGLnN0YXRlIT09IkJvb3RlZCIpYXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBib290ICR7Ri51ZGlkfWApO2F3YWl0IEEwKGBidW54IHNlcnZlLXNpbSAtLWtpbGwgJHtYLmRldmljZX1gKSxhd2FpdCBBMChgYnVueCBzZXJ2ZS1zaW0gLS1kZXRhY2ggJHtGLnVkaWR9YCksd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfWNhdGNoe18oITEpfX0sWyQsWC5kZXZpY2VdKSxJMD1qKGFzeW5jKEYpPT57UCgoUik9Pm5ldyBTZXQoUikuYWRkKEYpKTt0cnl7YXdhaXQgQTAoYHhjcnVuIHNpbWN0bCBzaHV0ZG93biAke0Z9YCksYXdhaXQgTygpfWZpbmFsbHl7UCgoUik9PntsZXQgdj1uZXcgU2V0KFIpO3JldHVybiB2LmRlbGV0ZShGKSx2fSl9fSxbT10pO3JldHVybiBOKCJkaXYiLHtzdHlsZTpOMC5wYWdlLGNoaWxkcmVuOltOKHQse2V4ZWM6QTAsZGV2aWNlVWRpZDpYLmRldmljZSxkZXZpY2VOYW1lOkM/Lm5hbWU/P251bGwsZGV2aWNlUnVudGltZTpDPy5ydW50aW1lPz9udWxsLHN0cmVhbWluZzpaLHN0eWxlOnttYXhXaWR0aDpFfSxjaGlsZHJlbjpbTihsNix7ZGV2aWNlczpZLHNlbGVjdGVkVWRpZDpYLmRldmljZSxsb2FkaW5nOlEsZXJyb3I6VyxzdG9wcGluZ1VkaWRzOnosb25SZWZyZXNoOk8sb25TZWxlY3Q6SjQsb25TdG9wOkkwLHRyaWdnZXI6Tih0LlRpdGxlLHt9KX0pLE4odC5BY3Rpb25zLHtjaGlsZHJlbjpbajA/LmlzUmVhY3ROYXRpdmUmJk4odC5CdXR0b24seyJhcmlhLWxhYmVsIjoiUmVsb2FkIFJlYWN0IE5hdGl2ZSBidW5kbGUiLHRpdGxlOiJSZWxvYWQgKENtZCtSKSIsb25DbGljazooKT0+dm9pZCBHMCgpLGNoaWxkcmVuOk4oInN2ZyIse3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNoaWxkcmVuOltOKCJwYXRoIix7ZDoiTTMgMTJhOSA5IDAgMSAwIDMuNS03LjEifSksTigicG9seWxpbmUiLHtwb2ludHM6IjMgMyAzIDkgOSA5In0pXX0pfSksTih0LkhvbWVCdXR0b24se29uQ2xpY2s6KEYpPT57Ri5wcmV2ZW50RGVmYXVsdCgpLHIoImhvbWUiKX19KSxOKHQuU2NyZWVuc2hvdEJ1dHRvbix7fSksTih0LlJvdGF0ZUJ1dHRvbix7fSldfSldfSksTigiZGl2Iix7c3R5bGU6e21heFdpZHRoOkUsd2lkdGg6IjEwMCUiLGFzcGVjdFJhdGlvOmAke0l9IC8gJHtNfWB9LGNoaWxkcmVuOk4objAse3VybDpYLnVybCxzdHlsZTp7d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsYm9yZGVyOiJub25lIn0saW1hZ2VTdHlsZTp7Ym9yZGVyUmFkaXVzOmgsY29ybmVyU2hhcGU6InN1cGVyZWxsaXBzZSgxLjMpIn0saGlkZUNvbnRyb2xzOiEwLG9uU3RyZWFtaW5nQ2hhbmdlOkosb25TdHJlYW1Ub3VjaDpLMCxvblN0cmVhbU11bHRpVG91Y2g6cyxvblN0cmVhbUJ1dHRvbjpyLHN1YnNjcmliZUZyYW1lOm4uc3Vic2NyaWJlRnJhbWUsc3RyZWFtRnJhbWU6bi5mcmFtZSxzdHJlYW1Db25maWc6bi5jb25maWd9KX0pLE4oImRpdiIse3N0eWxlOk4wLmJhcixjaGlsZHJlbjpOKCJzcGFuIix7c3R5bGU6ey4uLk4wLmxpdmUsY29sb3I6Wj8iIzRhZGU4MCI6IiM2NjYifSxjaGlsZHJlbjpbTigic3BhbiIse3N0eWxlOnsuLi5OMC5kb3QsYmFja2dyb3VuZDpaPyIjNGFkZTgwIjoiIzY2NiJ9fSksWj8ibGl2ZSI6ImNvbm5lY3RpbmciXX0pfSldfSl9dmFyIE4wPXtwYWdlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsaGVpZ2h0OiIxMDB2aCIsYmFja2dyb3VuZDoiIzBhMGEwYSIscGFkZGluZzoyNCxnYXA6MTIsZm9udEZhbWlseToiLWFwcGxlLXN5c3RlbSwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIn0sYmFyOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDoxMCxmb250U2l6ZToxMixmb250RmFtaWx5OiJ1aS1tb25vc3BhY2UsIG1vbm9zcGFjZSIsY29sb3I6IiM2NjYifSxsaXZlOntkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo1LHRyYW5zaXRpb246ImNvbG9yIDAuM3MifSxkb3Q6e3dpZHRoOjYsaGVpZ2h0OjYsYm9yZGVyUmFkaXVzOiI1MCUiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4zcyJ9LGVtcHR5OntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGFsaWduSXRlbXM6ImNlbnRlciIsZ2FwOjEyLHRleHRBbGlnbjoiY2VudGVyIn0sZW1wdHlUaXRsZTp7Zm9udFNpemU6MTgsbWFyZ2luOjAsY29sb3I6IiNlZWUifSxlbXB0eUhpbnQ6e2NvbG9yOiIjODg4Iixmb250U2l6ZToxNCxtYXhXaWR0aDo0ODB9LGNvZGU6e2JhY2tncm91bmQ6IiMyMjIiLHBhZGRpbmc6IjJweCA2cHgiLGJvcmRlclJhZGl1czo0LGZvbnRTaXplOjEzfX0saTY9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiJjYWxjKDEwMCUgKyA2cHgpIixsZWZ0OjAsbWluV2lkdGg6MjYwLG1heEhlaWdodDozNjAsb3ZlcmZsb3dZOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWMxYzFlIixib3JkZXI6IjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMTIpIixib3JkZXJSYWRpdXM6MTAscGFkZGluZzo0LGJveFNoYWRvdzoiMCA4cHggMjRweCByZ2JhKDAsMCwwLDAuNSkiLGZvbnRGYW1pbHk6InVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlIixmb250U2l6ZToxMyxjb2xvcjoiI2VlZSIsekluZGV4OjIwfSx1Nj17ZGlzcGxheToiZmxleCIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoic3BhY2UtYmV0d2VlbiIscGFkZGluZzoiNnB4IDEwcHgiLGZvbnRTaXplOjExLGNvbG9yOiIjYWFhIn0sbzY9e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLGNvbG9yOiIjYTViNGZjIixmb250U2l6ZToxMSxjdXJzb3I6InBvaW50ZXIiLHBhZGRpbmc6MH0sczY9e3BhZGRpbmc6IjZweCAxMHB4Iixjb2xvcjoiI2Y4NzE3MSIsZm9udFNpemU6MTF9LHA1PXtkaXNwbGF5OiJmbGV4IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGdhcDo4LHBhZGRpbmc6IjZweCAxMHB4Iixib3JkZXJSYWRpdXM6NixjdXJzb3I6InBvaW50ZXIiLHRyYW5zaXRpb246ImJhY2tncm91bmQgMC4xNXMifSxyNj17aGVpZ2h0OjEsYmFja2dyb3VuZDoicmdiYSgyNTUsMjU1LDI1NSwwLjA4KSIsbWFyZ2luOiI0cHggMCJ9LHQ2PXtwYWRkaW5nOjEyLGNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkiLGZvbnRTaXplOjExLHRleHRBbGlnbjoiY2VudGVyIn0sbjY9e3BhZGRpbmc6IjZweCAxMHB4IDJweCIsZm9udFNpemU6MTAsZm9udFdlaWdodDo2MDAsY29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC40KSIsdGV4dFRyYW5zZm9ybToidXBwZXJjYXNlIixsZXR0ZXJTcGFjaW5nOiIwLjA4ZW0ifTtQNShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoTihjNix7fSkpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4=","base64").toString("utf-8");return N}function Le(e){let _=(e?.basePath??"/.sim").replace(/\/+$/,"");return(t,s,r)=>{let C=t.url??"";if(C===_||C===_+"/"){let i=b()[0]??null,$=Ve();if(i){let a=`<script>window.__SIM_PREVIEW__=${JSON.stringify({...i,logsEndpoint:_+"/logs"})}</script>`;$=$.replace("<!--__SIM_PREVIEW_CONFIG__-->",a)}s.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store"}),s.end($);return}if(C===_+"/api"){let o=b();s.writeHead(200,{"Content-Type":"application/json","Cache-Control":"no-store"}),s.end(JSON.stringify(o[0]||null));return}if((C===_+"/exec"||C===_+"/exec/")&&t.method==="POST"){let o="";t.on("data",(i)=>{o+=typeof i==="string"?i:i.toString()}),t.on("end",()=>{let i="";try{i=JSON.parse(o).command??""}catch{}if(!i){s.writeHead(400,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:"",stderr:"Missing command",exitCode:1}));return}we(i,{maxBuffer:16777216},($,S,a)=>{s.writeHead(200,{"Content-Type":"application/json"}),s.end(JSON.stringify({stdout:S.toString(),stderr:a.toString(),exitCode:$?$.code??1:0}))})});return}if(C===_+"/logs"||C.startsWith(_+"/logs?")){let o=b();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let i=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
|
|
4
4
|
|
|
5
|
-
`);let
|
|
6
|
-
`))!==-1){let
|
|
5
|
+
`);let $=U("xcrun",["simctl","spawn",i,"log","stream","--style","ndjson","--level","info"],{stdio:["ignore","pipe","ignore"]}),S="";$.stdout.on("data",(a)=>{S+=a.toString();let n;while((n=S.indexOf(`
|
|
6
|
+
`))!==-1){let y=S.slice(0,n).trim();if(S=S.slice(n+1),y)s.write("data: "+y+`
|
|
7
7
|
|
|
8
|
-
`)}})
|
|
9
|
-
|
|
10
|
-
`)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
`)}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(C===_+"/appstate"||C.startsWith(_+"/appstate?")){let o=b();if(o.length===0){s.writeHead(404),s.end("No serve-sim device");return}let i=o[0].device;s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),s.write(`:
|
|
9
|
+
|
|
10
|
+
`);let $=U("xcrun",["simctl","spawn",i,"log","stream","--style","ndjson","--level","info","--predicate",'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"'],{stdio:["ignore","pipe","ignore"]}),S=/\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/,a="",n="";$.stdout.on("data",(y)=>{n+=y.toString();let A;while((A=n.indexOf(`
|
|
11
|
+
`))!==-1){let c=n.slice(0,A).trim();if(n=n.slice(A+1),!c)continue;let R;try{R=JSON.parse(c).eventMessage??""}catch{continue}let E=S.exec(R);if(!E)continue;let d=E[1],ce=parseInt(E[2],10);if(!He(d))continue;if(d===a)continue;a=d,Ne(i,d).then((Re)=>{s.write("data: "+JSON.stringify({bundleId:d,pid:ce,isReactNative:Re})+`
|
|
12
|
+
|
|
13
|
+
`)})}}),$.on("close",()=>s.end()),t.on("close",()=>$.kill());return}if(r)r()}}var k,he,Oe,me,N=null;var G=De(()=>{k=V(be(),"serve-sim"),he=new Set(["host.exp.Exponent","dev.expo.Exponent"]),Oe=["Frameworks/React.framework","Frameworks/hermes.framework","Frameworks/Hermes.framework","Frameworks/ExpoModulesCore.framework","main.jsbundle"],me=/(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i});import{execSync as f,spawn as j}from"child_process";import{chmodSync as We,existsSync as F,mkdirSync as z,openSync as Q,closeSync as J,readFileSync as O,unlinkSync as W,writeFileSync as Z}from"fs";import{createHash as Pe}from"crypto";import{homedir as qe,networkInterfaces as Me}from"os";import{join as Ie,resolve as L}from"path";import{tmpdir as Ee}from"os";import{join as g}from"path";import{readdirSync as de}from"fs";var T=g(Ee(),"serve-sim"),o_=g(T,"server.json");function w(e){return g(T,`server-${e}.json`)}function v(){try{return de(T).filter((e)=>e.startsWith("server-")&&e.endsWith(".json")).map((e)=>g(T,e))}catch{return[]}}var D="./serve-sim-bin-2vgfd507.";function I(){if(!F(T))z(T,{recursive:!0})}function p(e){if(e)return P(w(e));for(let _ of v()){let t=P(_);if(t)return t}return null}function P(e){try{if(!F(e))return null;let _=JSON.parse(O(e,"utf-8"));try{return process.kill(_.pid,0),_}catch{return W(e),null}}catch{return null}}function m(){let e=[];for(let _ of v()){let t=P(_);if(t)e.push(t)}return e}function x(e){I(),Z(w(e.device),JSON.stringify(e,null,2))}function u(e){if(e)try{W(w(e))}catch{}else for(let _ of v())try{W(_)}catch{}}function Ue(){let e=D.startsWith("/$bunfs/");if(!e&&F(D))return D;if(!e){let C=L(import.meta.dir,"../bin/serve-sim-bin");if(F(C))return C;throw Error(`serve-sim-bin not found. Run 'bun run build:swift' first.
|
|
14
|
+
Checked: ${D}, ${C}`)}let _=O(D),t=Pe("sha256").update(_).digest("hex").slice(0,16),s=L(qe(),"Library/Caches/serve-sim");z(s,{recursive:!0});let r=L(s,`serve-sim-bin-${t}`);if(!F(r)){Z(r,_),We(r,493);try{f(`codesign -s - -f ${JSON.stringify(r)}`,{stdio:"ignore"})}catch{}}return r}function Y(){try{let e=f("xcrun simctl list devices booted -j",{encoding:"utf-8"}),_=JSON.parse(e);for(let t of Object.values(_.devices))for(let s of t)if(s.state==="Booted")return s.udid}catch{}return null}function K(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.udid===e)return r.name}catch{}return null}function H(e){if(/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(e))return e;try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.name.toLowerCase()===e.toLowerCase())return r.udid}catch{}console.error(`Could not resolve device: ${e}`),process.exit(1)}function ee(e){try{let _=f("xcrun simctl list devices -j",{encoding:"utf-8"}),t=JSON.parse(_);for(let s of Object.values(t.devices))for(let r of s)if(r.udid===e)return r.state==="Booted"}catch{}return!1}function q(e){try{return process.kill(e,0),!0}catch{return!1}}function M(e){try{process.kill(e,"SIGTERM")}catch{return}let _=Date.now()+500;while(Date.now()<_)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}try{process.kill(e,"SIGKILL")}catch{}let t=Date.now()+500;while(Date.now()<t)try{process.kill(e,0),Bun.sleepSync(25)}catch{return}}function ke(e){try{let _=f(`lsof -ti tcp:${e}`,{encoding:"utf-8",stdio:"pipe"}).trim();if(!_)return[];let t=process.pid;return _.split(`
|
|
15
|
+
`).map((s)=>parseInt(s,10)).filter((s)=>Number.isFinite(s)&&s!==t)}catch{return[]}}function Xe(e){let _=ke(e);if(_.length===0)return;console.log(`\x1B[90mPort ${e} busy, killing holder pid(s): ${_.join(", ")}\x1B[0m`);for(let t of _)try{process.kill(t,"SIGKILL")}catch{}Bun.sleepSync(100)}function Ge(e){if(!ee(e))try{f(`xcrun simctl boot ${e}`,{encoding:"utf-8",stdio:"pipe"})}catch(_){let t=(_.stderr??_.message??"").toLowerCase();if(!t.includes("booted")&&!t.includes("current state"))throw Error(`Failed to boot device ${e}: ${_.stderr||_.message}`)}try{f("open -ga Simulator",{encoding:"utf-8",stdio:"pipe",timeout:3000})}catch{}}function xe(){let e=Me();for(let _ of Object.values(e))for(let t of _??[])if(t.family==="IPv4"&&!t.internal)return t.address;return null}async function _e(e){let _=new Set(m().map((t)=>t.port));for(let t=e;t<e+100;t++){if(_.has(t))continue;try{return Bun.serve({port:t,fetch:()=>new Response("ok")}).stop(!0),t}catch{continue}}throw Error(`No available port found in range ${e}-${e+99}`)}async function Ke(e){Ge(e);try{f(`xcrun simctl bootstatus ${e} -b`,{encoding:"utf-8",stdio:"pipe",timeout:60000})}catch(_){if(!ee(e))console.error(`Device ${e} failed to reach booted state: ${_.stderr||_.message}`),process.exit(1)}}async function te(e,_,t,s){let r=!1;for(let o=0;o<30;o++){if(!s())break;try{if((await fetch(`${_}/health`)).ok){r=!0;break}}catch{}await new Promise((i)=>setTimeout(i,100))}if(r){let o=Date.now()+8000;while(Date.now()<o){if(await new Promise((i)=>setTimeout(i,200)),!s()){r=!1;break}try{if(O(t,"utf-8").includes("Capture started"))break}catch{}}}let C="";try{C=O(t,"utf-8").trim()}catch{}return{ready:r,log:C}}async function je(e){let{helperPath:_,udid:t,port:s,host:r,logFile:C}=e,o=`http://${r}:${s}`;I();let i=Q(C,"w"),$=j(_,[t,"--port",String(s)],{detached:!0,stdio:["ignore",i,i]});$.unref(),J(i);let S=$.pid,a=!1;$.once("exit",()=>{a=!0});let{ready:n,log:y}=await te(S,o,C,()=>!a&&q(S));return{ready:n,pid:S,exited:a||!q(S),log:y}}async function ze(e){let{helperPath:_,udid:t,port:s,host:r,logFile:C}=e,o=`http://${r}:${s}`;I();let i=Q(C,"w"),$=j(_,[t,"--port",String(s)],{detached:!1,stdio:["ignore",i,i]});J(i);let S=$.pid,a=!1;$.once("exit",()=>{a=!0});let{ready:n,log:y}=await te(S,o,C,()=>!a&&q(S));return{ready:n,child:$,log:y}}async function se(e,_,t){await Ke(e);let s="127.0.0.1",r=Ue(),C=Ie(T,`server-${e}.log`),o={helperPath:r,udid:e,port:_,host:s,logFile:C},i="",$=2;for(let a=1;a<=$;a++){if(Xe(_),t.detach){let n=await je(o);if(n.ready){let y={pid:n.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return x(y),{pid:n.pid}}M(n.pid),i=n.log}else{let n=await ze(o);if(n.ready){let y={pid:n.child.pid,port:_,device:e,url:`http://${s}:${_}`,streamUrl:`http://${s}:${_}/stream.mjpeg`,wsUrl:`ws://${s}:${_}/ws`};return x(y),{pid:n.child.pid,child:n.child}}M(n.child.pid),i=n.log}if(a<$)await new Promise((n)=>setTimeout(n,500))}let S=i?`Helper failed:
|
|
16
|
+
${i}`:"Helper process failed to start";console.error(S),process.exit(1)}async function Qe(e,_,t){let s=e.length>0?e.map(H):(()=>{let S=Y();if(!S)console.error("No device specified and no booted simulator found."),process.exit(1);return[S]})(),r=new Map,C=[],o=_;for(let S of s){let a=p(S);if(a){if(!t){let R=K(S)??S;if(s.length>1)console.log(`
|
|
17
|
+
==> ${R} (${S}) <==`);console.log(` Already running on port ${a.port}`),console.log(` Stream: ${a.streamUrl}`),console.log(` WebSocket: ${a.wsUrl}`)}C.push(a);continue}o=await _e(o);let{pid:n,child:y}=await se(S,o,{detach:!1});if(y)r.set(S,y);let A="127.0.0.1",c={pid:n,port:o,device:S,url:`http://${A}:${o}`,streamUrl:`http://${A}:${o}/stream.mjpeg`,wsUrl:`ws://${A}:${o}/ws`};if(C.push(c),!t){let R=K(S)??S;if(s.length>1)console.log(`
|
|
18
|
+
==> ${R} (${S}) <==`);console.log(` Stream: ${c.streamUrl}`),console.log(` WebSocket: ${c.wsUrl}`),console.log(` Port: ${o}`)}o++}if(C.length===1){let S=C[0];console.log(JSON.stringify({url:S.url,streamUrl:S.streamUrl,wsUrl:S.wsUrl,port:S.port,device:S.device}))}else console.log(JSON.stringify({devices:C.map((S)=>({url:S.url,streamUrl:S.streamUrl,wsUrl:S.wsUrl,port:S.port,device:S.device}))}));if(r.size===0)return;let i=!1,$=(S)=>{if(i)return;if(i=!0,!t)console.log(`
|
|
19
|
+
Shutting down...`);for(let[a,n]of r){let y=n.pid;if(y)M(y);u(a)}r.clear(),process.exit(S)};for(let[S,a]of r)a.on("exit",(n)=>{if(i)return;if(!t)console.error(`[${S}] Helper exited (code ${n})`);if(u(S),r.delete(S),r.size===0)$(n??1)});process.on("SIGINT",()=>$(0)),process.on("SIGTERM",()=>$(0)),process.on("SIGHUP",()=>$(0)),process.on("exit",()=>{for(let[S,a]of r){try{if(a.pid)process.kill(a.pid,"SIGTERM")}catch{}try{u(S)}catch{}}}),await new Promise(()=>{})}async function Se(e,_){let t=e.length>0?e.map(H):(()=>{let C=Y();if(!C)console.error("No device specified and no booted simulator found."),process.exit(1);return[C]})(),s=[],r=_;for(let C of t){let o=p(C);if(o){s.push(o);continue}r=await _e(r),await se(C,r,{detach:!0});let i="127.0.0.1";s.push({pid:p(C).pid,port:r,device:C,url:`http://${i}:${r}`,streamUrl:`http://${i}:${r}/stream.mjpeg`,wsUrl:`ws://${i}:${r}/ws`}),r++}return s}function Je(e){if(e.length===1){let _=e[0];console.log(JSON.stringify({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}else console.log(JSON.stringify({devices:e.map((_)=>({url:_.url,streamUrl:_.streamUrl,wsUrl:_.wsUrl,port:_.port,device:_.device}))}))}function Ze(e){if(e){let t=H(e),s=p(t);if(!s)console.log(JSON.stringify({running:!1,device:t}));else console.log(JSON.stringify({running:!0,url:s.url,streamUrl:s.streamUrl,wsUrl:s.wsUrl,port:s.port,device:s.device,pid:s.pid}));return}let _=m();if(_.length===0)console.log(JSON.stringify({running:!1}));else if(_.length===1){let t=_[0];console.log(JSON.stringify({running:!0,url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}else console.log(JSON.stringify({running:!0,streams:_.map((t)=>({url:t.url,streamUrl:t.streamUrl,wsUrl:t.wsUrl,port:t.port,device:t.device,pid:t.pid}))}))}function Ye(e){if(e){let _=H(e),t=p(_);if(!t){console.log(JSON.stringify({disconnected:!0,device:_}));return}try{process.kill(t.pid,"SIGTERM")}catch{}u(_),console.log(JSON.stringify({disconnected:!0,device:t.device}))}else{let _=m();if(_.length===0){console.log(JSON.stringify({disconnected:!0,devices:[]}));return}let t=[];for(let s of _){try{process.kill(s.pid,"SIGTERM")}catch{}t.push(s.device)}u(),console.log(JSON.stringify({disconnected:!0,devices:t}))}}async function e_(e){let _,t=[];for(let o=0;o<e.length;o++)if(e[o]==="--device"||e[o]==="-d")_=e[++o];else t.push(e[o]);let s=p(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let r=t[0];if(!r)console.error("Usage: serve-sim gesture '<json>'"),console.error(`Example: serve-sim gesture '{"type":"begin","x":0.5,"y":0.5}'`),process.exit(1);let C;try{C=JSON.parse(r)}catch{console.error("Invalid JSON:",r),process.exit(1)}return new Promise((o,i)=>{let $=new WebSocket(s.wsUrl);$.binaryType="arraybuffer",$.onopen=()=>{let S=new TextEncoder().encode(JSON.stringify(C)),a=new Uint8Array(1+S.length);a[0]=3,a.set(S,1),$.send(a),setTimeout(()=>{$.close(),o()},50)},$.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),i(Error("WebSocket connection failed"))}})}async function __(e){let _,t=[];for(let C=0;C<e.length;C++)if(e[C]==="--device"||e[C]==="-d")_=e[++C];else t.push(e[C]);let s=p(_);if(!s)console.error("No serve-sim server running. Run `serve-sim` first."),process.exit(1);let r=t[0]??"home";return new Promise((C,o)=>{let i=new WebSocket(s.wsUrl);i.binaryType="arraybuffer",i.onopen=()=>{let $=new TextEncoder().encode(JSON.stringify({button:r})),S=new Uint8Array(1+$.length);S[0]=4,S.set($,1),i.send(S),setTimeout(()=>{i.close(),C()},50)},i.onerror=()=>{console.error("Failed to connect to serve-sim server at",s.wsUrl),o(Error("WebSocket connection failed"))}})}async function t_(e,_,t){if(m().length===0)console.log("Starting simulator stream..."),await Se(_,3100);let{simMiddleware:r}=await Promise.resolve().then(() => (G(),X)),C=r({basePath:"/"}),o=t?1:50,i=e,$,S=!1;for(let n=0;n<o;n++){let y=e+n;try{s_(y,C),i=y,S=!0;break}catch(A){if($=A,A?.code!=="EADDRINUSE")break}}if(!S){if($?.code==="EADDRINUSE")if(t)console.error(`Port ${e} is already in use. Pass a different --port or stop the other process.`);else console.error(`No available port found in range ${e}-${e+o-1}.`);else console.error(`Failed to start preview server: ${$?.message??$}`);process.exit(1)}let a=xe();if(console.log(""),console.log(` - Local: http://localhost:${i}`),a)console.log(` - Network: http://${a}:${i}`);console.log(""),process.on("SIGINT",()=>process.exit(0)),process.on("SIGTERM",()=>process.exit(0)),await new Promise(()=>{})}function s_(e,_){return Bun.serve({port:e,idleTimeout:255,async fetch(t){return new Promise((s)=>{let r=new URL(t.url),C={url:r.pathname+r.search,method:t.method,headers:Object.fromEntries(t.headers.entries()),on(A,c){}},o=[];C.on=(A,c)=>{if(A==="close")o.push(c)},t.signal.addEventListener("abort",()=>{for(let A of o)A()});let i=200,$=new Headers,S=[],a=!1,n=null;_(C,{writeHead(A,c){if(i=A,c)for(let[R,E]of Object.entries(c))$.set(R,E)},setHeader(A,c){$.set(A,c)},get statusCode(){return i},set statusCode(A){i=A},write(A){if(!a){a=!0;let c=new ReadableStream({start(R){n=R}});s(new Response(c,{status:i,headers:$}))}try{n?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}},end(A){if(a){if(A)try{n?.enqueue(typeof A==="string"?new TextEncoder().encode(A):A)}catch{}try{n?.close()}catch{}}else{if(A)S.push(A);let c=S.map((R)=>typeof R==="string"?R:new TextDecoder().decode(R)).join("");s(new Response(c,{status:i,headers:$}))}}},()=>{s(new Response("Not found",{status:404}))})})}})}function ie(){console.log(`
|
|
15
20
|
serve-sim - Stream iOS Simulator to the browser
|
|
16
21
|
|
|
17
22
|
Usage:
|
|
@@ -37,4 +42,4 @@ Examples:
|
|
|
37
42
|
serve-sim --detach Start streaming in background (daemon)
|
|
38
43
|
serve-sim --list Show all running streams
|
|
39
44
|
serve-sim --kill Stop all streams
|
|
40
|
-
`)}var
|
|
45
|
+
`)}var B=process.argv.slice(2);if(B[0]==="gesture")await e_(B.slice(1)),process.exit(0);if(B[0]==="button")await __(B.slice(1)),process.exit(0);var l,re=!1,Ce=!1,oe=!1,$e=!1,ne=!1,ae=!1,h=[],Ae,ye;for(let e=0;e<B.length;e++){let _=B[e];switch(_){case"--port":case"-p":l=parseInt(B[++e]??"3100",10);break;case"--detach":case"-d":re=!0;break;case"--quiet":case"-q":Ce=!0;break;case"--no-preview":ae=!0;break;case"--list":case"-l":if(oe=!0,B[e+1]&&!B[e+1].startsWith("-"))Ae=B[++e];break;case"--kill":case"-k":if($e=!0,B[e+1]&&!B[e+1].startsWith("-"))ye=B[++e];break;case"--help":case"-h":case"help":ne=!0;break;default:if(!_.startsWith("-"))h.push(_);else console.error(`Unknown flag: ${_}`),ie(),process.exit(1)}}if(ne)ie(),process.exit(0);if(oe)Ze(Ae),process.exit(0);if($e)Ye(ye),process.exit(0);if(re){let e=await Se(h,l??3100);Je(e)}else if(ae)await Qe(h,l??3100,Ce);else await t_(l??3200,h,l!==void 0);
|
package/package.json
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "serve-sim",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Evan Bacon",
|
|
7
|
+
"email": "baconbrix@gmail.com",
|
|
8
|
+
"url": "https://evanbacon.dev"
|
|
9
|
+
},
|
|
10
|
+
"license": "Apache-2.0",
|
|
5
11
|
"bin": {
|
|
6
12
|
"serve-sim": "dist/serve-sim.js"
|
|
7
13
|
},
|
package/src/middleware.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { readdirSync, readFileSync } from "fs";
|
|
2
|
-
import { spawn, type ChildProcess } from "child_process";
|
|
1
|
+
import { readdirSync, readFileSync, existsSync } from "fs";
|
|
2
|
+
import { spawn, exec, execFile, type ChildProcess } from "child_process";
|
|
3
3
|
import { tmpdir } from "os";
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
|
|
@@ -16,6 +16,48 @@ interface ServeSimState {
|
|
|
16
16
|
wsUrl: string;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
// Known bundle IDs that are always React Native shells (used as a fallback
|
|
20
|
+
// before the app-container path resolves, since simctl can lag after launch).
|
|
21
|
+
const RN_BUNDLE_IDS = new Set<string>([
|
|
22
|
+
"host.exp.Exponent", // Expo Go (App Store)
|
|
23
|
+
"dev.expo.Exponent", // Expo Go dev builds
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
const RN_MARKERS = [
|
|
27
|
+
"Frameworks/React.framework",
|
|
28
|
+
"Frameworks/hermes.framework",
|
|
29
|
+
"Frameworks/Hermes.framework",
|
|
30
|
+
"Frameworks/ExpoModulesCore.framework",
|
|
31
|
+
"main.jsbundle",
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
// Processes that SpringBoard logs as "Foreground" but are not the visible
|
|
35
|
+
// user-facing app — widgets, extensions, background services. Emitting
|
|
36
|
+
// these to the client causes the app indicator to flicker as the user
|
|
37
|
+
// actually-foreground app switches mid-launch.
|
|
38
|
+
const NON_UI_BUNDLE_RE = /(WidgetRenderer|ExtensionHost|\.extension(\.|$)|Service|PlaceholderApp|InCallService|CallUI|InCallUI|com\.apple\.Preferences\.Cellular|com\.apple\.purplebuddy|com\.apple\.chrono|com\.apple\.shuttle|com\.apple\.usernotificationsui)/i;
|
|
39
|
+
|
|
40
|
+
function isUserFacingBundle(bundleId: string): boolean {
|
|
41
|
+
return !NON_UI_BUNDLE_RE.test(bundleId);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function detectReactNative(udid: string, bundleId: string): Promise<boolean> {
|
|
45
|
+
if (RN_BUNDLE_IDS.has(bundleId)) return Promise.resolve(true);
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
execFile("xcrun", ["simctl", "get_app_container", udid, bundleId, "app"],
|
|
48
|
+
{ timeout: 2000 },
|
|
49
|
+
(err, stdout) => {
|
|
50
|
+
if (err) return resolve(false);
|
|
51
|
+
const appPath = stdout.trim();
|
|
52
|
+
if (!appPath) return resolve(false);
|
|
53
|
+
for (const marker of RN_MARKERS) {
|
|
54
|
+
if (existsSync(join(appPath, marker))) return resolve(true);
|
|
55
|
+
}
|
|
56
|
+
resolve(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
19
61
|
function readServeSimStates(): ServeSimState[] {
|
|
20
62
|
let files: string[];
|
|
21
63
|
try {
|
|
@@ -102,6 +144,36 @@ export function simMiddleware(options?: SimMiddlewareOptions) {
|
|
|
102
144
|
return;
|
|
103
145
|
}
|
|
104
146
|
|
|
147
|
+
// POST /exec — run a shell command on the host. The preview server binds
|
|
148
|
+
// to localhost only and is meant for local dev, so we shell through
|
|
149
|
+
// /bin/sh and return stdout/stderr/exitCode.
|
|
150
|
+
if ((url === base + "/exec" || url === base + "/exec/") && req.method === "POST") {
|
|
151
|
+
let body = "";
|
|
152
|
+
req.on("data", (chunk: Buffer | string) => {
|
|
153
|
+
body += typeof chunk === "string" ? chunk : chunk.toString();
|
|
154
|
+
});
|
|
155
|
+
req.on("end", () => {
|
|
156
|
+
let command = "";
|
|
157
|
+
try {
|
|
158
|
+
command = JSON.parse(body).command ?? "";
|
|
159
|
+
} catch {}
|
|
160
|
+
if (!command) {
|
|
161
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
162
|
+
res.end(JSON.stringify({ stdout: "", stderr: "Missing command", exitCode: 1 }));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
exec(command, { maxBuffer: 16 * 1024 * 1024 }, (err, stdout, stderr) => {
|
|
166
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
167
|
+
res.end(JSON.stringify({
|
|
168
|
+
stdout: stdout.toString(),
|
|
169
|
+
stderr: stderr.toString(),
|
|
170
|
+
exitCode: err ? (err as any).code ?? 1 : 0,
|
|
171
|
+
}));
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
105
177
|
// SSE: simctl log stream
|
|
106
178
|
if (url === base + "/logs" || url.startsWith(base + "/logs?")) {
|
|
107
179
|
const states = readServeSimStates();
|
|
@@ -141,6 +213,65 @@ export function simMiddleware(options?: SimMiddlewareOptions) {
|
|
|
141
213
|
return;
|
|
142
214
|
}
|
|
143
215
|
|
|
216
|
+
// SSE: foreground-app change stream. Emits `{bundleId, pid}` events
|
|
217
|
+
// parsed from SpringBoard's "Setting process visibility to: Foreground"
|
|
218
|
+
// log line. Filtering is done here (not in the browser) so the SSE stream
|
|
219
|
+
// stays narrow and the client can listen without rate-limit concerns.
|
|
220
|
+
if (url === base + "/appstate" || url.startsWith(base + "/appstate?")) {
|
|
221
|
+
const states = readServeSimStates();
|
|
222
|
+
if (states.length === 0) {
|
|
223
|
+
res.writeHead(404);
|
|
224
|
+
res.end("No serve-sim device");
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const udid = states[0].device;
|
|
228
|
+
res.writeHead(200, {
|
|
229
|
+
"Content-Type": "text/event-stream",
|
|
230
|
+
"Cache-Control": "no-cache",
|
|
231
|
+
Connection: "keep-alive",
|
|
232
|
+
"X-Accel-Buffering": "no",
|
|
233
|
+
});
|
|
234
|
+
res.write(":\n\n");
|
|
235
|
+
|
|
236
|
+
const child: ChildProcess = spawn("xcrun", [
|
|
237
|
+
"simctl", "spawn", udid, "log", "stream",
|
|
238
|
+
"--style", "ndjson",
|
|
239
|
+
"--level", "info",
|
|
240
|
+
"--predicate",
|
|
241
|
+
'process == "SpringBoard" AND eventMessage CONTAINS "Setting process visibility to: Foreground"',
|
|
242
|
+
], { stdio: ["ignore", "pipe", "ignore"] });
|
|
243
|
+
|
|
244
|
+
// e.g. "[app<com.apple.mobilesafari>:43117] Setting process visibility to: Foreground"
|
|
245
|
+
const FG_RE = /\[app<([^>]+)>:(\d+)\] Setting process visibility to: Foreground/;
|
|
246
|
+
let lastBundle = "";
|
|
247
|
+
let buf = "";
|
|
248
|
+
child.stdout!.on("data", (chunk: Buffer) => {
|
|
249
|
+
buf += chunk.toString();
|
|
250
|
+
let nl: number;
|
|
251
|
+
while ((nl = buf.indexOf("\n")) !== -1) {
|
|
252
|
+
const line = buf.slice(0, nl).trim();
|
|
253
|
+
buf = buf.slice(nl + 1);
|
|
254
|
+
if (!line) continue;
|
|
255
|
+
let msg: string;
|
|
256
|
+
try { msg = JSON.parse(line).eventMessage ?? ""; } catch { continue; }
|
|
257
|
+
const m = FG_RE.exec(msg);
|
|
258
|
+
if (!m) continue;
|
|
259
|
+
const bundleId = m[1]!;
|
|
260
|
+
const pid = parseInt(m[2]!, 10);
|
|
261
|
+
if (!isUserFacingBundle(bundleId)) continue;
|
|
262
|
+
if (bundleId === lastBundle) continue;
|
|
263
|
+
lastBundle = bundleId;
|
|
264
|
+
detectReactNative(udid, bundleId).then((isReactNative) => {
|
|
265
|
+
res.write("data: " + JSON.stringify({ bundleId, pid, isReactNative }) + "\n\n");
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
child.on("close", () => res.end());
|
|
271
|
+
req.on("close", () => child.kill());
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
144
275
|
// Not ours — pass through
|
|
145
276
|
if (next) next();
|
|
146
277
|
};
|