NOVA GAME HUB
بازیکن مهمان
دنیای بازی، با قوانین خودت

خوش آمدی به نوا گیم هاب

ورود به میدان بازی ⚡

یه دنیای کوچیک، کلی چالش؛ رکورد بزن، سکه جمع کن و لِوِل خودتو بالا ببر. آماده‌ای وارد بازی بشی؟

بازی فوری◈ ذخیره‌ی پیشرفت⌁ بدون نصب
حالت: سرگرمی
🪙
0سکه‌های جمع‌شده

همه بازی‌های نُوا

GAME CODE

افزودن بازی جدید

می‌تونی کد یا یادداشت بازی‌های خودت رو هم در هاب ذخیره کنی. بازی‌های آماده همیشه در خانه در دسترس‌اند.

کد کامل HTML بازی را وارد کن؛ بعد از ذخیره، از صفحه خانه روی «اجرای بازی» بزن تا داخل پنجره امن اجرا شود.

SANDBOX LAB

آزمایشگاه قابلیت‌ها

برای بازی آزمایشی خودت قابلیت‌های ویژه بساز و تست کن.

کد نمونه‌ی این نسخه: NOVA-ADMIN-77

🧪 ابزارهای بازی آزمایشی

این ابزارها فقط برای مینی‌بازی نمایشی داخل همین نمونه فعال‌اند؛ به بازی‌های دیگر دسترسی یا چیت تزریق نمی‌کنند.

منتظر انتخاب قابلیت…

🔮 دستیار هوشمند بازی

نام بازی آزمایشی و قابلیتی که می‌خوای رو بگو؛ دستیار یک طرح پیشنهادی برای پیاده‌سازی در بازی خودت می‌سازه.

DAILY BONUS

جایزه روزانه 🎁

هر روز وارد شو و ۶۴ سکه رایگان بگیر!

🎁

جایزه روزانه نُوا

🪙 ۶۴ سکه

جایزه امروزت آماده است!

PREFERENCES

تنظیمات برنامه

پروفایل و تنظیمات برنامه رو مدیریت کن.

پروفایل

⏱️ زمان کل بازی

مجموع زمانی که این برنامه را استفاده کرده‌ای:

🎮
۰ دقیقهزمان ذخیره‌شده در این حساب

زمان هنگام باز بودن برنامه و فعال بودن صفحه محاسبه می‌شود و در حساب محلی‌ات ذخیره می‌ماند.

داده‌های برنامه

اطلاعات این نسخه در حافظه‌ی محلی مرورگر ذخیره می‌شود و با پاک‌کردن داده‌های مرورگر ممکن است حذف شود.

🔐 تغییر رمز عبور

برای امنیت حساب، رمز فعلی را وارد کن و بعد رمز جدیدت را انتخاب کن.

حساب کاربری

با خروج از حساب، اطلاعات و سکه‌هایت ذخیره می‌مانند و برای ورود دوباره باید نام کاربری و رمزت را وارد کنی.

WELCOME TO NOVA

ساخت اکانت نُوا

نام کاربری و رمز بساز تا پیشرفت و سکه‌هایت ذخیره شوند.

'; const frame=document.createElement('iframe'); frame.title='پیش‌نمایش بازی '+g.name; frame.setAttribute('sandbox','allow-scripts allow-forms allow-modals'); frame.style.cssText='display:block;width:100%;height:440px;max-height:65vh;border:1px solid #514a78;border-radius:12px;background:#10091f'; frame.srcdoc=code; area.appendChild(frame); const note=document.createElement('p'); note.className='note';note.textContent='بازی داخل قاب جداگانه اجرا می‌شود. برای دسترسی امن، کد به اطلاعات اصلی سایت دسترسی ندارد.'; area.appendChild(note); } document.getElementById('gameModal').style.display='flex'; lockLobbyScroll(); } function openBuiltGame(id){stopDuoQuest();stopSoloQuest();selectedGame=id;gameState={};clearTimeout(reactionTimer);clearInterval(starTimer);stopStrike3D();stopApocalypse();const g=builtGames.find(x=>x.id===id);document.querySelector('#gameModal .modal').classList.toggle('strike-modal',id==='strike3d');document.querySelector('#gameModal .modal').classList.toggle('city-modal',id==='novacity');document.querySelector('#gameModal .modal').classList.toggle('apoc-modal',id==='apocalypse');document.querySelector('#gameModal .modal').classList.toggle('fighter-modal',id==='novafighters'||id==='soloquest'||id==='clashroyale');document.getElementById('gameCloseBtn').style.setProperty('display',id==='clashroyale'?'none':'','important');document.getElementById('modalTitle').textContent=g.name;document.getElementById('modalDesc').textContent=g.desc;document.getElementById('modalMoney').textContent=data.money||0;document.getElementById('modalTime').textContent=data.minutes||0;document.getElementById('modalStatus').textContent='آماده';document.getElementById('gameModal').style.display='flex';lockLobbyScroll();if(id==='novacity'||id==='strike3d')document.getElementById('modalDesc').textContent='';startGame(id)} function award(n=10){data.money=(data.money||0)+n;persist();document.getElementById('modalMoney').textContent=data.money;document.getElementById('moneyStat').textContent=data.money.toLocaleString('fa-IR');document.getElementById('modalStatus').textContent='آفرین!';} function playNovaRewardSound(game){try{const C=window.AudioContext||window.webkitAudioContext;if(!C)return;window.__novaAudio=window.__novaAudio||new C();const ac=window.__novaAudio;if(ac.state==='suspended')ac.resume();const patterns=[[659,784,988],[523,659,784,1047],[392,494,587],[784,988,1175],[587,740,880],[440,554,659,880],[698,880,1047],[494,622,740],[587,698,880],[880,1047,1318],[523,784,659,988]];const waves=['sine','triangle','square','sawtooth'];const idx=Math.max(0,Math.min(10,Number(game)||0));const seq=patterns[idx],wave=waves[idx%waves.length],now=ac.currentTime;window.__novaSoundStep=(window.__novaSoundStep||0)+1;const shift=(window.__novaSoundStep%3)*0.025;seq.forEach((hz,j)=>{const o=ac.createOscillator(),g=ac.createGain();o.type=wave;o.frequency.setValueAtTime(hz*(1+shift),now+j*.075);g.gain.setValueAtTime(.0001,now+j*.075);g.gain.exponentialRampToValueAtTime(.055,now+j*.075+.012);g.gain.exponentialRampToValueAtTime(.0001,now+j*.075+.16);o.connect(g);g.connect(ac.destination);o.start(now+j*.075);o.stop(now+j*.075+.17)});}catch(e){}} window.addEventListener('message',e=>{const m=e.data||{};const activeFrame=document.querySelector('#playArea iframe');if(m.type==='nova-phone-reward'&&activeFrame&&e.source===activeFrame.contentWindow){const n=Math.max(1,Math.min(50,Math.floor(Number(m.coins)||0)));award(n);playNovaRewardSound(m.game);toast('🪙 '+n+' سکه از بازی گرفتی!')}else if(m.type==='nova-clash-surrender-exit'){closeGame()}}); function localDateKey(){const d=new Date();return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0')} function updateDailyRewardUI(){const claimed=data.dailyRewardDate===localDateKey(),status=document.getElementById('dailyRewardStatus'),button=document.getElementById('dailyRewardButton');if(!status||!button)return;if(claimed){status.textContent='جایزه امروزت را گرفتی! فردا دوباره برگرد 💜';button.textContent='جایزه امروز دریافت شده ✓';button.disabled=true;button.style.opacity='.6'}else{status.textContent='جایزه امروزت آماده است!';button.textContent='گرفتن ۶۴ سکه 🎉';button.disabled=false;button.style.opacity='1'}} function claimDailyReward(){if(!data.profile||!activeUser){toast('اول وارد حساب خودت شو');return}const today=localDateKey();if(data.dailyRewardDate===today){updateDailyRewardUI();toast('جایزه امروزت را قبلاً گرفتی؛ فردا دوباره بیا!');return}data.dailyRewardDate=today;data.money=(data.money||0)+64;persist();document.getElementById('moneyStat').textContent=data.money.toLocaleString('fa-IR');const modalMoney=document.getElementById('modalMoney');if(modalMoney)modalMoney.textContent=data.money;updateDailyRewardUI();toast('تبریک! ۶۴ سکه جایزه روزانه گرفتی 🎁🪙')} window.addEventListener('message',function(ev){const frame=document.querySelector('#playArea iframe');if(!frame||ev.source!==frame.contentWindow||!ev.data||ev.data.type!=='nova-fighters-victory')return;const amount=Math.max(0,Math.min(50,Number(ev.data.coins)||0));if(amount){award(amount);toast('پیروزی! '+amount+' سکه به حسابت اضافه شد 🪙')}}); const NOVA_FIGHTERS_B64='PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iZmEiIGRpcj0icnRsIj48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEsbWF4aW11bS1zY2FsZT0xLHVzZXItc2NhbGFibGU9bm8iPjx0aXRsZT5OT1ZBIEZJR0hURVJTOiBSRUJPUk48L3RpdGxlPjxzdHlsZT4KKntib3gtc2l6aW5nOmJvcmRlci1ib3h9aHRtbCxib2R5e21hcmdpbjowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQ6IzA4MGIxOTtjb2xvcjojZjRmNmZmO2ZvbnQtZmFtaWx5OlRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO3RvdWNoLWFjdGlvbjptYW5pcHVsYXRpb259YnV0dG9ue2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MTJweDtwYWRkaW5nOjExcHggMTNweDtmb250LXdlaWdodDo5MDA7Y29sb3I6d2hpdGU7YmFja2dyb3VuZDojNjU1NGRifWJ1dHRvbjphY3RpdmV7dHJhbnNmb3JtOnNjYWxlKC45Nyl9I2FwcHtoZWlnaHQ6MTAwJTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3BhZGRpbmc6OHB4O2dhcDo3cHg7YmFja2dyb3VuZDpyYWRpYWwtZ3JhZGllbnQoZWxsaXBzZSBhdCB0b3AsIzIyMjA0YywjMDgwYjE5IDc1JSl9I2h1ZHtkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Zm9udC1zaXplOjEycHg7ZmxleC1zaHJpbms6MH0uaHBib3h7ZmxleDoxO21pbi13aWR0aDowfS5uYW1le2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjttYXJnaW4tYm90dG9tOjRweDtmb250LXdlaWdodDpib2xkfS5iYXJ7aGVpZ2h0OjEycHg7Ym9yZGVyLXJhZGl1czoyMHB4O2JhY2tncm91bmQ6IzI1Mjg0MTtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyOjFweCBzb2xpZCAjNDY0NjZlfS5maWxse2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7dHJhbnNpdGlvbjp3aWR0aCAuMXM7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsIzE2ZDhiYywjNzJmNWQ4KX0jaHAye2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCNmZjM0N2YsI2ZmOWFiOSl9LmVuZXJneXtoZWlnaHQ6NHB4O2JhY2tncm91bmQ6IzI5MmI0MzttYXJnaW4tdG9wOjNweDtib3JkZXItcmFkaXVzOjVweDtvdmVyZmxvdzpoaWRkZW59LmVuZXJneSBkaXZ7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojZmZlMTZjO3dpZHRoOjEwMCV9I3RpbWVye2ZvbnQtc2l6ZToyMnB4O2ZvbnQtd2VpZ2h0OjEwMDA7bWluLXdpZHRoOjM1cHg7dGV4dC1hbGlnbjpjZW50ZXJ9I2FyZW5he2ZsZXg6MTttaW4taGVpZ2h0OjEyMHB4O3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jaztib3JkZXI6MXB4IHNvbGlkICMzOTM2NWY7Ym9yZGVyLXJhZGl1czoxNXB4O2JhY2tncm91bmQ6IzBiMTAyNTt0b3VjaC1hY3Rpb246bm9uZX0jbWVudSwjcmVzdWx0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7ei1pbmRleDozO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjIwcHg7YmFja2dyb3VuZDojMDcwODE3ZUZ9LnBhbmVse3dpZHRoOm1pbigxMDAlLDQ0MHB4KTtwYWRkaW5nOjIycHg7Ym9yZGVyOjFweCBzb2xpZCAjNTA0YjgyO2JvcmRlci1yYWRpdXM6MjJweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxNDVkZWcsIzIxMWQ0NiwjMTIxNjJhKTt0ZXh0LWFsaWduOmNlbnRlcjtib3gtc2hhZG93OjAgMTVweCA1MHB4ICMwMDA4fS5wYW5lbCBoMXttYXJnaW46MCAwIDlweDtmb250LXNpemU6Y2xhbXAoMjVweCw3dncsMzhweCk7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsIzYxZjBkZiwjYzVhNGZmLCNmZjZjYWEpO2NvbG9yOnRyYW5zcGFyZW50O2JhY2tncm91bmQtY2xpcDp0ZXh0fS5wYW5lbCBwe2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuOTtjb2xvcjojYzhjOWU5fS5hY3Rpb25ze2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6OXB4O21hcmdpbi10b3A6MTRweH0ud2lkZXtncmlkLWNvbHVtbjoxLy0xfS5oaWRkZW57ZGlzcGxheTpub25lIWltcG9ydGFudH0jY29udHJvbHN7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxMHB4O2ZsZXgtc2hyaW5rOjA7ZGlyZWN0aW9uOmx0cn0gLmNsdXN0ZXJ7ZGlzcGxheTpmbGV4O2dhcDo2cHg7YWxpZ24taXRlbXM6Y2VudGVyO2ZsZXgtd3JhcDp3cmFwfS5jdHJse21pbi13aWR0aDo0M3B4O21pbi1oZWlnaHQ6NDRweDtwYWRkaW5nOjlweDtiYWNrZ3JvdW5kOiMyODI4NGE7Ym9yZGVyOjFweCBzb2xpZCAjNGI0NzdjO3RvdWNoLWFjdGlvbjpub25lfS5hdHRhY2t7YmFja2dyb3VuZDojOWQzMjZlfS5zcGVjaWFse2JhY2tncm91bmQ6I2E2NmIxOX0uYmxvY2t7YmFja2dyb3VuZDojMjU2ZDc3fS5jdHJsLmRvd257ZmlsdGVyOmJyaWdodG5lc3MoMS41KTtvdXRsaW5lOjJweCBzb2xpZCAjYjVhN2ZmfS5oaW50e3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiNhNWE2Yzk7ZmxleC1zaHJpbms6MH0jc3RhdHVze2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiNmZmU1OGM7bWluLWhlaWdodDoxN3B4O3RleHQtYWxpZ246Y2VudGVyfSNyZXN1bHR7YmFja2dyb3VuZDojMDcwODE3ZGZ9LmdyZWVue2JhY2tncm91bmQ6IzA4N2Y3MX0uZ29sZHtiYWNrZ3JvdW5kOiM5ZDY3MTd9QG1lZGlhKG1heC13aWR0aDo1MDBweCl7I2FwcHtwYWRkaW5nOjVweDtnYXA6NXB4fS5jdHJse21pbi13aWR0aDozOHB4O21pbi1oZWlnaHQ6NDNweDtwYWRkaW5nOjdweDtmb250LXNpemU6MTJweH0uY2x1c3RlcntnYXA6NHB4fS5wYW5lbHtwYWRkaW5nOjE3cHh9fQo8L3N0eWxlPgo8c3R5bGUgaWQ9Im5vdmEtdG91Y2gtZml4Ij4KaHRtbCxib2R5LGJvZHkgKnsgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lIWltcG9ydGFudDsgdXNlci1zZWxlY3Q6bm9uZSFpbXBvcnRhbnQ7IC13ZWJraXQtdG91Y2gtY2FsbG91dDpub25lIWltcG9ydGFudDsgfQppbnB1dCx0ZXh0YXJlYSxbY29udGVudGVkaXRhYmxlPSJ0cnVlIl0sc2VsZWN0eyAtd2Via2l0LXVzZXItc2VsZWN0OnRleHQhaW1wb3J0YW50OyB1c2VyLXNlbGVjdDp0ZXh0IWltcG9ydGFudDsgLXdlYmtpdC10b3VjaC1jYWxsb3V0OmRlZmF1bHQhaW1wb3J0YW50OyB9CmNhbnZhcyxidXR0b24sYXt0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO30KPC9zdHlsZT4KPC9oZWFkPjxib2R5PjxkaXYgaWQ9ImFwcCI+PGRpdiBpZD0iaHVkIj48ZGl2IGNsYXNzPSJocGJveCI+PGRpdiBjbGFzcz0ibmFtZSI+PHNwYW4+2KrZiCDimqE8L3NwYW4+PHNwYW4gaWQ9Im51bTEiPjEwMDwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJiYXIiPjxkaXYgY2xhc3M9ImZpbGwiIGlkPSJocDEiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImVuZXJneSI+PGRpdiBpZD0ic3AxIj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGlkPSJ0aW1lciI+OTk8L2Rpdj48ZGl2IGNsYXNzPSJocGJveCI+PGRpdiBjbGFzcz0ibmFtZSI+PHNwYW4+2LHYqNin2Kog8J+kljwvc3Bhbj48c3BhbiBpZD0ibnVtMiI+MTAwPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9ImJhciI+PGRpdiBjbGFzcz0iZmlsbCIgaWQ9ImhwMiI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZW5lcmd5Ij48ZGl2IGlkPSJzcDIiPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxjYW52YXMgaWQ9ImFyZW5hIj48L2NhbnZhcz48ZGl2IGlkPSJzdGF0dXMiPtio2LHYp9uMINi02LHZiNi5INii2YXYp9iv2YfigIzYp9uM2J88L2Rpdj48ZGl2IGlkPSJjb250cm9scyIgY2xhc3M9ImhpZGRlbiI+PGRpdiBjbGFzcz0iY2x1c3RlciI+PGJ1dHRvbiBjbGFzcz0iY3RybCIgZGF0YS1rZXk9ImxlZnQiPuKXgDwvYnV0dG9uPjxidXR0b24gY2xhc3M9ImN0cmwiIGRhdGEta2V5PSJyaWdodCI+4pa2PC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iY3RybCIgZGF0YS1rZXk9Imp1bXAiPuKshiDZvtix2LQ8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJjbHVzdGVyIj48YnV0dG9uIGNsYXNzPSJjdHJsIGJsb2NrIiBkYXRhLWtleT0iYmxvY2siPtqv2KfYsdivPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iY3RybCBhdHRhY2siIGRhdGEta2V5PSJwdW5jaCI+2YXYtNiqPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0iY3RybCBhdHRhY2siIGRhdGEta2V5PSJraWNrIj7ZhNqv2K88L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJjdHJsIHNwZWNpYWwiIGRhdGEta2V5PSJzcGVjaWFsIj7Zgtiv2LHYqjwvYnV0dG9uPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImhpbnQgaGlkZGVuIiBpZD0iaGludCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9kaXY+PC9kaXY+PGRpdiBpZD0ibWVudSI+PGRpdiBjbGFzcz0icGFuZWwiPjxoMT5OT1ZBIEZJR0hURVJTPC9oMT48ZGl2IGNsYXNzPSJhY3Rpb25zIj48YnV0dG9uIGlkPSJzdGFydEJ0biIgY2xhc3M9ImdyZWVuIHdpZGUiPvCfpYog2LTYsdmI2Lkg2YXYqNin2LHYstmHPC9idXR0b24+PC9kaXY+PHAgaWQ9Im1lbnVNc2ciIHN0eWxlPSJkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTo2NHB4O2ZvbnQtd2VpZ2h0OjEwMDA7bGluZS1oZWlnaHQ6MTttYXJnaW46MThweCAwIDA7Y29sb3I6I2ZmZiI+PC9wPjwvZGl2PjwvZGl2PjxkaXYgaWQ9InJlc3VsdCIgY2xhc3M9ImhpZGRlbiI+PGRpdiBjbGFzcz0icGFuZWwiPjxoMSBpZD0icmVzdWx0VGl0bGUiPtm+24zYsdmI2LLbjCE8L2gxPjxwIGlkPSJyZXN1bHRUZXh0Ij48L3A+PGRpdiBjbGFzcz0iYWN0aW9ucyI+PGJ1dHRvbiBpZD0iYWdhaW5CdG4iPvCflIEg2YXYqNin2LHYstmH2ZQg2K/ZiNio2KfYsdmHPC9idXR0b24+PGJ1dHRvbiBpZD0ibWVudUJ0biI+8J+PoCDZhdmG2Yg8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj4KPHNjcmlwdD4KKCgpPT57J3VzZSBzdHJpY3QnO2NvbnN0ICQ9aWQ9PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSxjYW52YXM9JCgnYXJlbmEnKSxjdHg9Y2FudmFzLmdldENvbnRleHQoJzJkJyk7bGV0IFc9ODAwLEg9NDIwLGRwcj0xLHJhZj0wLHN0YXJ0ZWQ9ZmFsc2UsZW5kZWQ9ZmFsc2UsbW9kZT0nc29sbycsY2xvY2s9OTksbGFzdD0wLGNsb2NrVGljaz0wLGtleXM9e30scHJldj17fSxjb21ibz0wLGNvbWJvVGlsbD0wLHJld2FyZGVkPWZhbHNlLHBlZXI9bnVsbCxjb25uPW51bGwscGVlcklkPScnLG9ubGluZVJvbGU9JycscmVtb3RlPXt9LHNlbmRBdD0wLGFpQXQ9MCxhaUp1bXBBdD0wLG1hdGNoVGltZXI9bnVsbCxjb3VudFRpbWVyPW51bGw7Y29uc3QgZmxvb3I9SC02ODtmdW5jdGlvbiBtYWtlKHgsY29sb3IsZ2xvdyl7cmV0dXJue3gseTowLHZ5OjAsaHA6MTAwLGVuZXJneToxMDAsY29sb3IsZ2xvdyxmYWNlOng8MD8xOi0xLGFjdDonaWRsZScsYWN0VDowLHN0dW46MCxndWFyZDpmYWxzZSxjZDowLHdhbGs6MCxmbGFzaDowfX1sZXQgYSxiOwpmdW5jdGlvbiByZXNpemUoKXtjb25zdCByPWNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkcHI9TWF0aC5taW4oZGV2aWNlUGl4ZWxSYXRpb3x8MSwyKTtXPU1hdGgubWF4KDMyMCxyLndpZHRoKTtIPU1hdGgubWF4KDIyMCxyLmhlaWdodCk7Y2FudmFzLndpZHRoPU1hdGgucm91bmQoVypkcHIpO2NhbnZhcy5oZWlnaHQ9TWF0aC5yb3VuZChIKmRwcik7Y3R4LnNldFRyYW5zZm9ybShkcHIsMCwwLGRwciwwLDApfWFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScscmVzaXplKTtyZXNpemUoKTsKZnVuY3Rpb24gc2V0U3RhdHVzKHQpeyQoJ3N0YXR1cycpLnRleHRDb250ZW50PXR9ZnVuY3Rpb24gcmVzZXQoKXthPW1ha2UoVyouMzIsJyMyOGU2ZDAnLCcjMjhlNmQwJyk7Yj1tYWtlKFcqLjY4LCcjZmY0ZTkyJywnI2ZmNGU5MicpO2EuZmFjZT0xO2IuZmFjZT0tMTtjbG9jaz05OTtjbG9ja1RpY2s9MDtjb21ibz0wO3Jld2FyZGVkPWZhbHNlO2tleXM9e307cHJldj17fTtyZW1vdGU9e307YWlBdD0wO2FpSnVtcEF0PTA7ZW5kZWQ9ZmFsc2U7c3RhcnRlZD10cnVlOyQoJ21lbnUnKS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTskKCdyZXN1bHQnKS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTskKCdjb250cm9scycpLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOyQoJ2hpbnQnKS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtzZXRTdGF0dXMobW9kZT09PSdzb2xvJz8n2K3YsduM2YE6INix2KjYp9iqINmH2YjYtNmF2YbYryc6J9iv2LEg2K3Yp9mEINmF2KjYp9ix2LLZh9mUINii2YbZhNin24zZhicpO2h1ZCgpfQpmdW5jdGlvbiBiZWdpblNvbG8oKXtpZihtYXRjaFRpbWVyKXtjbGVhclRpbWVvdXQobWF0Y2hUaW1lcik7bWF0Y2hUaW1lcj1udWxsfWlmKGNvdW50VGltZXIpe2NsZWFySW50ZXJ2YWwoY291bnRUaW1lcik7Y291bnRUaW1lcj1udWxsfSQoJ21lbnVNc2cnKS50ZXh0Q29udGVudD0nJztjbGVhbnVwTmV0KCk7JCgnc3RhcnRCdG4nKS5kaXNhYmxlZD1mYWxzZTttb2RlPSdzb2xvJztyZXNldCgpfQpmdW5jdGlvbiBiZWdpbk9ubGluZSgpe2lmKHN0YXJ0ZWQpcmV0dXJuO2NsZWFudXBOZXQoKTttb2RlPSdvbmxpbmUnOyQoJ3N0YXJ0QnRuJykuZGlzYWJsZWQ9dHJ1ZTskKCdtZW51TXNnJykudGV4dENvbnRlbnQ9JzEwJztzZXRTdGF0dXMoJycpO2xldCBsZWZ0PTEwO2NvdW50VGltZXI9c2V0SW50ZXJ2YWwoKCk9PntsZWZ0LS07aWYobGVmdD4wKSQoJ21lbnVNc2cnKS50ZXh0Q29udGVudD1TdHJpbmcobGVmdCk7ZWxzZSAkKCdtZW51TXNnJykudGV4dENvbnRlbnQ9Jyc7fSwxMDAwKTttYXRjaFRpbWVyPXNldFRpbWVvdXQoKCk9PntpZighc3RhcnRlZCl7aWYoY291bnRUaW1lcil7Y2xlYXJJbnRlcnZhbChjb3VudFRpbWVyKTtjb3VudFRpbWVyPW51bGx9Y2xlYW51cE5ldCgpO21vZGU9J3NvbG8nOyQoJ21lbnVNc2cnKS50ZXh0Q29udGVudD0nJzskKCdzdGFydEJ0bicpLmRpc2FibGVkPWZhbHNlO3Jlc2V0KCl9fSwxMDAwMCk7aWYoIXdpbmRvdy5QZWVyKXtjb25zdCBzYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtzYy5zcmM9J2h0dHBzOi8vdW5wa2cuY29tL3BlZXJqc0AxLjUuNC9kaXN0L3BlZXJqcy5taW4uanMnO3NjLm9ubG9hZD0oKT0+b25saW5lU3RhcnQoKTtzYy5vbmVycm9yPSgpPT57fTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjKX1lbHNlIG9ubGluZVN0YXJ0KCl9CmZ1bmN0aW9uIG9ubGluZVN0YXJ0KCl7aWYoIXdpbmRvdy5QZWVyKXskKCdtZW51TXNnJykudGV4dENvbnRlbnQ9J9qp2KrYp9io2K7Yp9mG2YfZlCDYotmG2YTYp9uM2YYg2KjYp9ix2q/YsNin2LHbjCDZhti02K8uJztyZXR1cm59dHJ5e3BlZXI9bmV3IFBlZXIoJ25vdmFyZWJvcm4tJytNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLDExKSx7ZGVidWc6MH0pO3BlZXIub24oJ29wZW4nLGlkPT57cGVlcklkPWlkO3NlYXJjaFBlZXIoKX0pO3BlZXIub24oJ2Nvbm5lY3Rpb24nLGM9PntpZihjb25uKXtjLmNsb3NlKCk7cmV0dXJufWNvbm49YztvbmxpbmVSb2xlPSdob3N0JztiaW5kQ29ubigpO30pO3BlZXIub24oJ2Vycm9yJyxlPT57fSk7fWNhdGNoKGUpe319CmFzeW5jIGZ1bmN0aW9uIHNlYXJjaFBlZXIoKXtpZighcGVlcnx8IXBlZXIub3Blbnx8Y29ubilyZXR1cm47dHJ5e2xldCBpZHM9W107Y29uc3QgcmVzPWF3YWl0IGZldGNoKCdodHRwczovLzAucGVlcmpzLmNvbS9wZWVyanMvcGVlcnM/a2V5PXBlZXJqcycse2NhY2hlOiduby1zdG9yZSd9KTtpZihyZXMub2spaWRzPShhd2FpdCByZXMuanNvbigpKS5maWx0ZXIoeD0+dHlwZW9mIHg9PT0nc3RyaW5nJyYmeC5zdGFydHNXaXRoKCdub3ZhcmVib3JuLScpJiZ4IT09cGVlcklkKTtpZihpZHMubGVuZ3RoKXtpZHMuc29ydCgpO2Nvbm49cGVlci5jb25uZWN0KGlkc1swXSx7cmVsaWFibGU6dHJ1ZX0pO29ubGluZVJvbGU9J2d1ZXN0JztiaW5kQ29ubigpfWVsc2Ugc2V0VGltZW91dChzZWFyY2hQZWVyLDE4MDApfWNhdGNoKGUpeyQoJ21lbnVNc2cnKS50ZXh0Q29udGVudD0n2K/YsSDYrdin2YQg2KrZhNin2LQg2KjYsdin24wg2KfYqti12KfZhCDYqNmHINit2LHbjNmBINii2YbZhNin24zZhi4uLid9fQpmdW5jdGlvbiBiaW5kQ29ubigpe2lmKCFjb25uKXJldHVybjtjb25uLm9uKCdvcGVuJywoKT0+e2lmKG1hdGNoVGltZXIpe2NsZWFyVGltZW91dChtYXRjaFRpbWVyKTttYXRjaFRpbWVyPW51bGx9aWYoY291bnRUaW1lcil7Y2xlYXJJbnRlcnZhbChjb3VudFRpbWVyKTtjb3VudFRpbWVyPW51bGx9JCgnbWVudU1zZycpLnRleHRDb250ZW50PScnOyQoJ3N0YXJ0QnRuJykuZGlzYWJsZWQ9ZmFsc2U7bW9kZT0nb25saW5lJztyZXNldCgpO3NldFN0YXR1cygnJyk7Y29ubi5zZW5kKHt0OidyZWFkeSd9KX0pO2Nvbm4ub24oJ2RhdGEnLG09PntpZihtLnQ9PT0naW5wdXQnKXJlbW90ZT1tLnZ8fHt9O2lmKG0udD09PSdzdGF0ZScmJm9ubGluZVJvbGU9PT0nZ3Vlc3QnKXtiLmhwPW0ucy5iLmhwO2EuaHA9bS5zLmEuaHA7Yi54PW0ucy5iLng7Yi55PW0ucy5iLnk7YS54PW0ucy5hLng7YS55PW0ucy5hLnk7Y2xvY2s9bS5zLmNsb2NrO2h1ZCgpfWlmKG0udD09PSdmaW5pc2gnKWZpbmlzaChtLndpbm5lcil9KTtjb25uLm9uKCdjbG9zZScsKCk9PntpZihzdGFydGVkJiYhZW5kZWQpe3NldFN0YXR1cygn2KfYqti12KfZhCDYrdix24zZgSDZgti32Lkg2LTYry4nKTtmaW5pc2goMCl9fSl9ZnVuY3Rpb24gY2xlYW51cE5ldCgpe2lmKG1hdGNoVGltZXIpe2NsZWFyVGltZW91dChtYXRjaFRpbWVyKTttYXRjaFRpbWVyPW51bGx9aWYoY291bnRUaW1lcil7Y2xlYXJJbnRlcnZhbChjb3VudFRpbWVyKTtjb3VudFRpbWVyPW51bGx9dHJ5e2lmKGNvbm4pY29ubi5jbG9zZSgpfWNhdGNoKGUpe310cnl7aWYocGVlcilwZWVyLmRlc3Ryb3koKX1jYXRjaChlKXt9Y29ubj1udWxsO3BlZXI9bnVsbDtwZWVySWQ9Jyc7b25saW5lUm9sZT0nJ30KZnVuY3Rpb24gaW5wdXQoayl7cmV0dXJuICEha2V5c1trXX1mdW5jdGlvbiBkb01vdmUoZixpbnAsb3RoZXIsZHQsaWR4KXtpZighaW5wKWlucD17fTtmLmd1YXJkPSEhaW5wLmJsb2NrO2YuY2Q9TWF0aC5tYXgoMCxmLmNkLWR0KTtmLmFjdFQ9TWF0aC5tYXgoMCxmLmFjdFQtZHQpO2Yuc3R1bj1NYXRoLm1heCgwLGYuc3R1bi1kdCk7aWYoZi5zdHVuPjApe2YuYWN0PSdodXJ0JztyZXR1cm59bGV0IG12PShpbnAubGVmdD8tMTowKSsoaW5wLnJpZ2h0PzE6MCk7aWYobXYpe2YueCs9bXYqVyouNDIqZHQ7Zi5mYWNlPW12O2Yud2Fsays9ZHQqMTA7aWYoZi5hY3Q9PT0naWRsZScpZi5hY3Q9J3dhbGsnfWVsc2UgaWYoZi5hY3Q9PT0nd2FsaycpZi5hY3Q9J2lkbGUnO2lmKGlucC5qdW1wJiYhcHJldltpZHgrJ2p1bXAnXSYmZi55PD0uMSl7Zi52eT0tSCoyLjM7Zi5hY3Q9J2p1bXAnfWlmKGYueTwwfHxmLnZ5PDApe2YudnkrPUgqNS4yKmR0O2YueSs9Zi52eSpkdDtpZihmLnk8IC1IKi40OCl7Zi55PS1IKi40ODtmLnZ5PU1hdGgubWF4KDAsZi52eSl9aWYoZi55Pj0wKXtmLnk9MDtmLnZ5PTA7aWYoZi5hY3Q9PT0nanVtcCcpZi5hY3Q9J2lkbGUnfX1mLng9TWF0aC5tYXgoMzUsTWF0aC5taW4oVy0zNSxmLngpKTtpZihmLmFjdFQ8PTAmJlsncHVuY2gnLCdraWNrJywnc3BlY2lhbCcsJ2h1cnQnXS5pbmNsdWRlcyhmLmFjdCkpZi5hY3Q9Zi5ndWFyZD8nYmxvY2snOidpZGxlJztpZihpbnAuYmxvY2spZi5hY3Q9J2Jsb2NrJztpZighZi5jZCl7aWYoaW5wLnB1bmNoJiYhcHJldltpZHgrJ3B1bmNoJ10pYXR0YWNrKGYsb3RoZXIsJ3B1bmNoJyk7ZWxzZSBpZihpbnAua2ljayYmIXByZXZbaWR4KydraWNrJ10pYXR0YWNrKGYsb3RoZXIsJ2tpY2snKTtlbHNlIGlmKGlucC5zcGVjaWFsJiYhcHJldltpZHgrJ3NwZWNpYWwnXSYmZi5lbmVyZ3k+PTM1KWF0dGFjayhmLG90aGVyLCdzcGVjaWFsJyl9IH0KZnVuY3Rpb24gYXR0YWNrKGYsbyx0eXBlKXtsZXQgcmVhY2g9dHlwZT09PSdwdW5jaCc/VyouMTM6dHlwZT09PSdraWNrJz9XKi4xNzpXKi4yMjtsZXQgZGlzdD1NYXRoLmFicyhvLngtZi54KTtmLmFjdD10eXBlO2YuYWN0VD10eXBlPT09J3NwZWNpYWwnPy40MjouMjU7Zi5jZD10eXBlPT09J3NwZWNpYWwnPy44OnR5cGU9PT0na2ljayc/LjQ4Oi4zMjtpZih0eXBlPT09J3NwZWNpYWwnKWYuZW5lcmd5LT0zNTtlbHNlIGYuZW5lcmd5PU1hdGgubWluKDEwMCxmLmVuZXJneSs0KTtpZihkaXN0PHJlYWNoJiZNYXRoLmFicyhvLnktZi55KTxIKi4yMil7bGV0IGRhbWFnZT10eXBlPT09J3B1bmNoJz83OnR5cGU9PT0na2ljayc/MTE6MTg7aWYoby5ndWFyZClkYW1hZ2U9TWF0aC5jZWlsKGRhbWFnZSouMjQpO2lmKG8ueTwgLUgqLjE1JiZ0eXBlIT09J3NwZWNpYWwnKWRhbWFnZT1NYXRoLmNlaWwoZGFtYWdlKi42NSk7by5ocD1NYXRoLm1heCgwLG8uaHAtZGFtYWdlKTtvLnN0dW49dHlwZT09PSdzcGVjaWFsJz8uMjg6LjEyO28uZmxhc2g9LjEyO2NvbWJvKys7Y29tYm9UaWxsPXBlcmZvcm1hbmNlLm5vdygpKzEwMDA7c2V0U3RhdHVzKGNvbWJvPjE/Y29tYm8rJyDYttix2KjZh9mUINqp2YXYqNmIISc6J9i22LHYqNmHINio2LHYrtmI2LHYryDaqdix2K8hJyk7aWYodHlwZT09PSdzcGVjaWFsJylmLmVuZXJneT0gTWF0aC5tYXgoMCxmLmVuZXJneSk7fX0KZnVuY3Rpb24gYWkoZHQsbm93KXtsZXQgZGlzdD1iLngtYS54LGFkPU1hdGguYWJzKGRpc3QpLHN3aW5nPSEhKGtleXMucHVuY2h8fGtleXMua2lja3x8a2V5cy5zcGVjaWFsKTtsZXQgaW5wPXt9O2lmKGFkPlcqLjE3KWlucFtkaXN0PjA/J2xlZnQnOidyaWdodCddPXRydWU7aWYoYWQ8VyouMDk1JiZNYXRoLnJhbmRvbSgpPC4wMilpbnBbZGlzdD4wPydyaWdodCc6J2xlZnQnXT10cnVlO2lucC5ibG9jaz0oc3dpbmcmJmFkPFcqLjImJk1hdGgucmFuZG9tKCk8LjU4KXx8KGEuYWN0PT09J3NwZWNpYWwnJiZhZDxXKi4yNSYmTWF0aC5yYW5kb20oKTwuNzUpO2lmKG5vdz5haUp1bXBBdCYmYWQ8VyouMjgmJihzd2luZ3x8TWF0aC5yYW5kb20oKTwuMTApKXtpbnAuanVtcD10cnVlO2FpSnVtcEF0PW5vdys3MDArTWF0aC5yYW5kb20oKSo5MDB9aWYobm93PmFpQXQmJmFkPFcqLjIyKXtsZXQgcj1NYXRoLnJhbmRvbSgpO2lmKHI8LjM2KWlucC5wdW5jaD10cnVlO2Vsc2UgaWYocjwuNjgpaW5wLmtpY2s9dHJ1ZTtlbHNlIGlmKGIuZW5lcmd5Pj0zNSYmcjwuODMpaW5wLnNwZWNpYWw9dHJ1ZTthaUF0PW5vdysoYi5ocDwzMD8zMzA6NTIwKStNYXRoLnJhbmRvbSgpKjM4MH1pZihiLmhwPDQwJiZNYXRoLnJhbmRvbSgpPC4wMilpbnAuanVtcD10cnVlO3JldHVybiBpbnB9CmZ1bmN0aW9uIHRpY2soZHQsbm93KXtpZighc3RhcnRlZHx8ZW5kZWQpcmV0dXJuO2lmKG1vZGU9PT0nc29sbycpe2NvbnN0IGFpSW5wPWFpKGR0LG5vdyk7ZG9Nb3ZlKGEsa2V5cyxiLGR0LCdhJyk7ZG9Nb3ZlKGIsYWlJbnAsYSxkdCwnYicpO2Zvcihjb25zdCBrIGluIGtleXMpcHJldlsnYScra109ISFrZXlzW2tdO2Zvcihjb25zdCBrIG9mIFsnbGVmdCcsJ3JpZ2h0JywnanVtcCcsJ3B1bmNoJywna2ljaycsJ3NwZWNpYWwnLCdibG9jayddKXByZXZbJ2InK2tdPSEhYWlJbnBba119ZWxzZSBpZihvbmxpbmVSb2xlPT09J2hvc3QnKXtkb01vdmUoYSxrZXlzLGIsZHQsJ2EnKTtkb01vdmUoYixyZW1vdGUsYSxkdCwnYicpO2Zvcihjb25zdCBrIGluIGtleXMpcHJldlsnYScra109ISFrZXlzW2tdO2Zvcihjb25zdCBrIGluIHJlbW90ZSlwcmV2WydiJytrXT0hIXJlbW90ZVtrXTtpZihjb25uJiZjb25uLm9wZW4mJm5vdy1zZW5kQXQ+NTUpe2Nvbm4uc2VuZCh7dDonc3RhdGUnLHM6e2E6e3g6YS54LHk6YS55LGhwOmEuaHB9LGI6e3g6Yi54LHk6Yi55LGhwOmIuaHB9LGNsb2NrfX0pO3NlbmRBdD1ub3d9fWVsc2V7ZG9Nb3ZlKGEsa2V5cyxiLGR0LCdhJyk7Zm9yKGNvbnN0IGsgaW4ga2V5cylwcmV2WydhJytrXT0hIWtleXNba107aWYoY29ubiYmY29ubi5vcGVuKWNvbm4uc2VuZCh7dDonaW5wdXQnLHY6a2V5c30pfWEuZmFjZT1hLng8Yi54PzE6LTE7Yi5mYWNlPS1hLmZhY2U7Y2xvY2tUaWNrKz1kdDtpZihjbG9ja1RpY2s+PTEpe2Nsb2NrVGljay09MTtjbG9jaz1NYXRoLm1heCgwLGNsb2NrLTEpfWEuZW5lcmd5PU1hdGgubWluKDEwMCxhLmVuZXJneStkdCoyKTtiLmVuZXJneT1NYXRoLm1pbigxMDAsYi5lbmVyZ3krZHQqMik7aWYoYS5ocDw9MHx8Yi5ocDw9MHx8Y2xvY2s8PTApe2xldCB3aW49YS5ocD09PWIuaHA/MDphLmhwPmIuaHA/MToyO2ZpbmlzaCh3aW4pfWh1ZCgpfQpmdW5jdGlvbiBodWQoKXskKCdocDEnKS5zdHlsZS53aWR0aD1NYXRoLm1heCgwLGE/LmhwfHwwKSsnJSc7JCgnaHAyJykuc3R5bGUud2lkdGg9TWF0aC5tYXgoMCxiPy5ocHx8MCkrJyUnOyQoJ3NwMScpLnN0eWxlLndpZHRoPU1hdGgubWF4KDAsYT8uZW5lcmd5fHwwKSsnJSc7JCgnc3AyJykuc3R5bGUud2lkdGg9TWF0aC5tYXgoMCxiPy5lbmVyZ3l8fDApKyclJzskKCdudW0xJykudGV4dENvbnRlbnQ9TWF0aC5jZWlsKGE/LmhwfHwwKTskKCdudW0yJykudGV4dENvbnRlbnQ9TWF0aC5jZWlsKGI/LmhwfHwwKTskKCd0aW1lcicpLnRleHRDb250ZW50PWNsb2NrfQpmdW5jdGlvbiBkcmF3RihmLHBsYXllcil7bGV0IHg9Zi54LHk9SC03MCtmLnksc2NhbGU9TWF0aC5tYXgoLjcyLE1hdGgubWluKDEuMixXLzcwMCkpO2N0eC5zYXZlKCk7Y3R4LnRyYW5zbGF0ZSh4LHkpO2N0eC5zY2FsZShmLmZhY2UsMSk7Y3R4LnNoYWRvd0NvbG9yPWYuZ2xvdztjdHguc2hhZG93Qmx1cj0xODtjdHguZ2xvYmFsQWxwaGE9Zi5mbGFzaD4wPy42NToxO2N0eC5maWxsU3R5bGU9JyMwMDA4JztjdHguYmVnaW5QYXRoKCk7Y3R4LmVsbGlwc2UoMCw0LDI3KnNjYWxlLDcqc2NhbGUsMCwwLE1hdGguUEkqMik7Y3R4LmZpbGwoKTtjdHguc2hhZG93Qmx1cj0xNTtjdHguZmlsbFN0eWxlPWYuY29sb3I7Y3R4LnN0cm9rZVN0eWxlPWYuZ2xvdztjdHgubGluZVdpZHRoPTUqc2NhbGU7bGV0IGxlYW49Zi5hY3Q9PT0ncHVuY2gnPzEyOmYuYWN0PT09J2tpY2snPzg6MDtjdHguYmVnaW5QYXRoKCk7Y3R4LmFyYygwLC02MCpzY2FsZSwxNSpzY2FsZSwwLE1hdGguUEkqMik7Y3R4LmZpbGwoKTtjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbygwLC00NCpzY2FsZSk7Y3R4LmxpbmVUbyhsZWFuLC0xNipzY2FsZSk7Y3R4LnN0cm9rZSgpO2N0eC5saW5lV2lkdGg9OCpzY2FsZTtjdHgubGluZUNhcD0ncm91bmQnO2xldCBhcm1YPWYuYWN0PT09J3B1bmNoJz8zNTpmLmFjdD09PSdzcGVjaWFsJz80MjoxOCxhcm1ZPWYuYWN0PT09J2Jsb2NrJz8tNDM6LTMyO2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKDAsLTM5KnNjYWxlKTtjdHgubGluZVRvKGFybVgqc2NhbGUsYXJtWSpzY2FsZSk7Y3R4LnN0cm9rZSgpO2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKDAsLTM3KnNjYWxlKTtjdHgubGluZVRvKC0xNypzY2FsZSwtMjQqc2NhbGUpO2N0eC5zdHJva2UoKTtjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbyhsZWFuLC0xNypzY2FsZSk7Y3R4LmxpbmVUbyhmLmFjdD09PSdraWNrJz8zMipzY2FsZTo4KnNjYWxlLDApO2N0eC5zdHJva2UoKTtjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbyhsZWFuLC0xNypzY2FsZSk7Y3R4LmxpbmVUbygtMTIqc2NhbGUsMCk7Y3R4LnN0cm9rZSgpO2lmKGYuYWN0PT09J3NwZWNpYWwnKXtjdHguZ2xvYmFsQWxwaGE9Ljc7Y3R4LnN0cm9rZVN0eWxlPScjZmZmMDZhJztjdHgubGluZVdpZHRoPTM7Y3R4LmJlZ2luUGF0aCgpO2N0eC5hcmMoMjUqc2NhbGUsLTM1KnNjYWxlLDMwKnNjYWxlLE1hdGgucmFuZG9tKCksTWF0aC5yYW5kb20oKSs0KTtjdHguc3Ryb2tlKCl9Y3R4LnJlc3RvcmUoKTtmLmZsYXNoPU1hdGgubWF4KDAsZi5mbGFzaC0uMDI1KX0KZnVuY3Rpb24gZHJhdygpe2N0eC5jbGVhclJlY3QoMCwwLFcsSCk7bGV0IGdyYWQ9Y3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsMCwwLEgpO2dyYWQuYWRkQ29sb3JTdG9wKDAsJyMxNTFhM2InKTtncmFkLmFkZENvbG9yU3RvcCgxLCcjMDgwYjE4Jyk7Y3R4LmZpbGxTdHlsZT1ncmFkO2N0eC5maWxsUmVjdCgwLDAsVyxIKTtmb3IobGV0IGk9MDtpPDIyO2krKyl7Y3R4LmZpbGxTdHlsZT0nIzhkOGNmZicrKGklMj8nMjInOicxMScpO2N0eC5maWxsUmVjdChpKlcvMjIsSCouMisoaSU0KSpIKi4wNSwyLDIpfWN0eC5zdHJva2VTdHlsZT0nIzRhNDc3OCc7Y3R4LmxpbmVXaWR0aD0yO2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKDAsSC02Nik7Y3R4LmxpbmVUbyhXLEgtNjYpO2N0eC5zdHJva2UoKTtmb3IobGV0IGk9MDtpPDEwO2krKyl7Y3R4LnN0cm9rZVN0eWxlPScjNGI0MTZmNjYnO2N0eC5iZWdpblBhdGgoKTtjdHgubW92ZVRvKFcvMixILTY2KTtjdHgubGluZVRvKGkqVy85LCBIKTtjdHguc3Ryb2tlKCl9aWYoYSYmYil7ZHJhd0YoYSwxKTtkcmF3RihiLDIpO2lmKGNvbWJvPjEmJnBlcmZvcm1hbmNlLm5vdygpPGNvbWJvVGlsbCl7Y3R4LmZvbnQ9J2JvbGQgMjBweCBUYWhvbWEnO2N0eC50ZXh0QWxpZ249J2NlbnRlcic7Y3R4LmZpbGxTdHlsZT0nI2ZmZTM2ZSc7Y3R4LmZpbGxUZXh0KGNvbWJvKycgSElUIENPTUJPIScsVy8yLEgqLjMpfX1yYWY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXcpfQpmdW5jdGlvbiBmaW5pc2god2lubmVyKXtpZihlbmRlZClyZXR1cm47ZW5kZWQ9dHJ1ZTtzdGFydGVkPWZhbHNlOyQoJ2NvbnRyb2xzJykuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7JCgnaGludCcpLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpOyQoJ3Jlc3VsdCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO2xldCB3b249d2lubmVyPT09MTsgJCgncmVzdWx0VGl0bGUnKS50ZXh0Q29udGVudD13b24/J/Cfj4Yg2b7bjNix2YjYstuMISc6d2lubmVyPT09MD8n8J+knSDZhdiz2KfZiNuMISc6J/CfkqUg2LTaqdiz2KonOyQoJ3Jlc3VsdFRleHQnKS50ZXh0Q29udGVudD13b24/J9ii2YHYsduM2YYhINiq2Ygg2KjYsdmG2K/ZhyDYtNiv24wuINu127Ag2LPaqdmHINis2KfbjNiy2Ycg2q/YsdmB2KrbjC4nOndpbm5lcj09PTA/J9iy2YXYp9mGINiq2YXYp9mFINi02K8g2Ygg2KjYp9iy24wg2YXYs9in2YjbjCDYtNivLic6J9in24zZhiDYqNin2LEg2LHYqNin2Kog2KjYsdmG2K/ZhyDYtNiv2Jsg2K/ZiNio2KfYsdmHINiq2YTYp9i0INqp2YYhJztpZih3b24mJiFyZXdhcmRlZCl7cmV3YXJkZWQ9dHJ1ZTt0cnl7cGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidub3ZhLWZpZ2h0ZXJzLXZpY3RvcnknLGNvaW5zOjUwLG1vZGV9LCcqJyl9Y2F0Y2goZSl7fXRyeXtpZighcGFyZW50fHxwYXJlbnQ9PT13aW5kb3cpe2xvY2FsU3RvcmFnZS5zZXRJdGVtKCdub3ZhX2ZpZ2h0ZXJzX2NvaW5zJyxTdHJpbmcoKCtsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbm92YV9maWdodGVyc19jb2lucycpfHwwKSs1MCkpfX1jYXRjaChlKXt9fWlmKG1vZGU9PT0nb25saW5lJyYmY29ubiYmY29ubi5vcGVuKXRyeXtjb25uLnNlbmQoe3Q6J2ZpbmlzaCcsd2lubmVyfSl9Y2F0Y2goZSl7fX0KZnVuY3Rpb24gc2hvd01lbnUoKXtzdGFydGVkPWZhbHNlO2VuZGVkPWZhbHNlOyQoJ21lbnVNc2cnKS50ZXh0Q29udGVudD0nJzskKCdyZXN1bHQnKS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTskKCdtZW51JykuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7JCgnY29udHJvbHMnKS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTskKCdoaW50JykuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7c2V0U3RhdHVzKCcnKTtjbGVhbnVwTmV0KCl9JCgnc3RhcnRCdG4nKS5vbmNsaWNrPWJlZ2luT25saW5lOyQoJ2FnYWluQnRuJykub25jbGljaz0oKT0+e2NsZWFudXBOZXQoKTttb2RlPSdzb2xvJztyZXNldCgpfTskKCdtZW51QnRuJykub25jbGljaz1zaG93TWVudTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY3RybCcpLmZvckVhY2goYnRuPT57bGV0IGs9YnRuLmRhdGFzZXQua2V5O2NvbnN0IGRvd249ZT0+e2UucHJldmVudERlZmF1bHQoKTtrZXlzW2tdPXRydWU7YnRuLmNsYXNzTGlzdC5hZGQoJ2Rvd24nKTt0cnl7YnRuLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKX1jYXRjaChfKXt9fSx1cD1lPT57ZS5wcmV2ZW50RGVmYXVsdCgpO2tleXNba109ZmFsc2U7YnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2Rvd24nKX07YnRuLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxkb3duKTtidG4uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJyx1cCk7YnRuLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLHVwKTtidG4uYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJyx1cCl9KTtjb25zdCBtYXA9e0Fycm93TGVmdDonbGVmdCcsYTonbGVmdCcsQXJyb3dSaWdodDoncmlnaHQnLGQ6J3JpZ2h0JyxBcnJvd1VwOidqdW1wJyx3OidqdW1wJyxqOidwdW5jaCcsazona2ljaycsbDonc3BlY2lhbCcsU2hpZnQ6J2Jsb2NrJ307YWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZT0+e2lmKG1hcFtlLmtleV0pe2UucHJldmVudERlZmF1bHQoKTtrZXlzW21hcFtlLmtleV1dPXRydWV9fSk7YWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLGU9PntpZihtYXBbZS5rZXldKWtleXNbbWFwW2Uua2V5XV09ZmFsc2V9KTtsZXQgcHJldlRpbWU9cGVyZm9ybWFuY2Uubm93KCk7ZnVuY3Rpb24gbG9vcChub3cpe2xldCBkdD1NYXRoLm1pbiguMDQsKG5vdy1wcmV2VGltZSkvMTAwMCk7cHJldlRpbWU9bm93O3RpY2soZHQsbm93KTtyYWY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApfXJlc2V0KCk7c3RhcnRlZD1mYWxzZTskKCdtZW51JykuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7JCgnY29udHJvbHMnKS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTskKCdoaW50JykuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7ZHJhdygpO2xvb3AocGVyZm9ybWFuY2Uubm93KCkpO2FkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsY2xlYW51cE5ldCk7fSkoKTsKPC9zY3JpcHQ+CjxzY3JpcHQgaWQ9Im5vdmEtdG91Y2gtZml4LWpzIj4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhbGxvd2VkKHQpe3JldHVybiAhISh0JiZ0LmNsb3Nlc3QmJnQuY2xvc2VzdCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0LFtjb250ZW50ZWRpdGFibGU9InRydWUiXScpKTt9ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLGZ1bmN0aW9uKGUpe2lmKCFhbGxvd2VkKGUudGFyZ2V0KSllLnByZXZlbnREZWZhdWx0KCk7fSx0cnVlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsZnVuY3Rpb24oZSl7aWYoIWFsbG93ZWQoZS50YXJnZXQpKWUucHJldmVudERlZmF1bHQoKTt9LHRydWUpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvcHknLGZ1bmN0aW9uKGUpe2lmKCFhbGxvd2VkKGUudGFyZ2V0KSllLnByZXZlbnREZWZhdWx0KCk7fSx0cnVlKTt9KSgpOzwvc2NyaXB0Pgo8L2JvZHk+PC9odG1sPg=='; const NOVA_CLASH_ROYALE_B64='PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImZhIiBkaXI9InJ0bCI+CjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xLG1heGltdW0tc2NhbGU9MSx1c2VyLXNjYWxhYmxlPW5vIj4KPG1ldGEgbmFtZT0idGhlbWUtY29sb3IiIGNvbnRlbnQ9IiMxNzI0NGEiPgo8dGl0bGU+2qnZhNi0INix2YjbjNin2YQ8L3RpdGxlPgo8c3R5bGU+Cjpyb290ewogIC0tYmx1ZTojMjlhOWZmOy0tYmx1ZTI6IzE3NjdjZjstLXJlZDojZmY1NTc0Oy0tcmVkMjojYjkyMzQ1OwogIC0tZ29sZDojZmZkODVhOy0tcHVycGxlOiNhYjVjZmY7LS1wYW5lbDojMTcyNDQ4ZWU7LS10ZXh0OiNmZmY7Cn0KKntib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fQpodG1sLGJvZHl7bWFyZ2luOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojMGExMDI1O2NvbG9yOiNmZmY7CmZvbnQtZmFtaWx5OlRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO3VzZXItc2VsZWN0Om5vbmV9CmJ1dHRvbixzZWxlY3QsaW5wdXR7Zm9udDppbmhlcml0fQpidXR0b257Ym9yZGVyOjA7Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcn0KLmhpZGRlbntkaXNwbGF5Om5vbmUhaW1wb3J0YW50fQouc2NyZWVue3Bvc2l0aW9uOmZpeGVkO2luc2V0OjB9Ci5iZ3sKIGJhY2tncm91bmQ6CiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAxNSUsIzUzNmRmZTU1LHRyYW5zcGFyZW50IDMwJSksCiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDgwJSA4MCUsI2E3NGNmZjU1LHRyYW5zcGFyZW50IDM1JSksCiBsaW5lYXItZ3JhZGllbnQoMTUwZGVnLCMxMzI5NTYsIzA5MGUyMyA2MCUsIzIwMTI0OCk7Cn0KLmdsYXNze2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE0NWRlZywjMjYzOTY1ZWYsIzEwMWEzYmVmKTtib3JkZXI6MnB4IHNvbGlkICNmZmZmZmYyNjsKIGJveC1zaGFkb3c6MCAxNHB4IDQwcHggIzAwMDgsaW5zZXQgMCAxcHggI2ZmZjQ7Ym9yZGVyLXJhZGl1czoyMHB4fQouZ2FtZS10aXRsZXtmb250LXdlaWdodDoxMDAwO2xldHRlci1zcGFjaW5nOi0ycHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtYWxpZ246Y2VudGVyOwogY29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzowIDRweCAwICMzNzU0YTEsMCA4cHggMjBweCAjMDAwYn0KLmdhbWUtdGl0bGUgc3Bhbntjb2xvcjp2YXIoLS1nb2xkKTt0ZXh0LXNoYWRvdzowIDRweCAwICNhODZlMGEsMCAwIDIycHggI2ZmY2M0NGFhfQouYnRue3BhZGRpbmc6MTJweCAyMHB4O2JvcmRlci1yYWRpdXM6MTRweDtmb250LXdlaWdodDo5MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwogYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoIzQ5YzVmZiwjMTQ3M2Q4KTtib3gtc2hhZG93OjAgNnB4IDAgIzBiNGE5YywwIDEwcHggMThweCAjMDAwNzsKIHRyYW5zaXRpb246LjE1cyB0cmFuc2Zvcm0sLjE1cyBmaWx0ZXJ9Ci5idG46aG92ZXJ7ZmlsdGVyOmJyaWdodG5lc3MoMS4xNSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTJweCl9Ci5idG46YWN0aXZle3RyYW5zZm9ybTp0cmFuc2xhdGVZKDVweCk7Ym94LXNoYWRvdzowIDFweCAwICMwYjRhOWN9Ci5idG4uZ29sZHtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgjZmZlOTZkLCNmNWE2MjMpO2JveC1zaGFkb3c6MCA2cHggMCAjOWI1YjA2LDAgMTBweCAxOHB4ICMwMDA3fQouYnRuLnJlZHtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgjZmY3NThjLCNkYzJmNTUpO2JveC1zaGFkb3c6MCA2cHggMCAjOGUxNjMwfQouYnRuLmdyZWVue2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KCM2N2ViN2IsIzE5YTY0Zik7Ym94LXNoYWRvdzowIDZweCAwICMwODdiMzd9Ci5idG4ucHVycGxle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KCNjOTgxZmYsIzgxM2VlMik7Ym94LXNoYWRvdzowIDZweCAwICM0YjFhOTZ9Ci5idG46ZGlzYWJsZWR7ZmlsdGVyOmdyYXlzY2FsZSguOCk7b3BhY2l0eTouNTtjdXJzb3I6bm90LWFsbG93ZWR9CgojbWVudXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcn0KLnRvcGJhcntoZWlnaHQ6NzBweDt3aWR0aDoxMDAlO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47CiBwYWRkaW5nOjhweCAxOHB4O2JhY2tncm91bmQ6IzBkMTczYmNjO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNmZmZmZmYxYzt6LWluZGV4OjV9Ci5wcm9maWxlLWNoaXB7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtmb250LXdlaWdodDo4MDB9Ci5hdmF0YXJ7d2lkdGg6NDhweDtoZWlnaHQ6NDhweDtib3JkZXItcmFkaXVzOjE0cHg7ZGlzcGxheTpncmlkO3BsYWNlLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MjdweDsKIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE0NWRlZywjNWZkMWZmLCMzNzY3ZDgpO2JvcmRlcjozcHggc29saWQgI2Q5ZjRmZjtib3gtc2hhZG93OjAgNHB4IDEwcHggIzAwMDh9Ci5jdXJyZW5jaWVze2Rpc3BsYXk6ZmxleDtnYXA6OXB4O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0KLmN1cnJlbmN5e2JhY2tncm91bmQ6IzBjMTQzM2RkO2JvcmRlcjoxcHggc29saWQgI2ZmZmZmZjMwO2JvcmRlci1yYWRpdXM6MTJweDtwYWRkaW5nOjdweCAxMHB4O2ZvbnQtd2VpZ2h0OjkwMH0KI21lbnVDb250ZW50e3dpZHRoOjEwMCU7aGVpZ2h0OmNhbGMoMTAwJSAtIDE0MHB4KTtvdmVyZmxvdzphdXRvO3BhZGRpbmc6MThweH0KLm5hdmJhcntoZWlnaHQ6NzBweDt3aWR0aDoxMDAlO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDYsMWZyKTtnYXA6NXB4O3BhZGRpbmc6N3B4OwogYmFja2dyb3VuZDojMGIxNDMzZWY7Ym9yZGVyLXRvcDoycHggc29saWQgI2ZmZmZmZjFmfQoubmF2YnRue2JvcmRlci1yYWRpdXM6MTJweDtiYWNrZ3JvdW5kOiMxYjJhNTU7Y29sb3I6I2I5YzhmNjtmb250LXdlaWdodDo4MDA7Zm9udC1zaXplOjEycHg7CiBkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2dhcDoycHh9Ci5uYXZidG4gYntmb250LXNpemU6MjJweH0ubmF2YnRuLmFjdGl2ZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgjNDM2NGI3LCMyODQzODEpO2NvbG9yOiNmZmY7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAycHggIzdhY2ZmZn0KLmhvbWUtZ3JpZHttYXgtd2lkdGg6MTA1MHB4O21hcmdpbjphdXRvO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDEuMjVmciAxZnI7Z2FwOjE4cHg7YWxpZ24taXRlbXM6Y2VudGVyfQouc2lkZS1wYW5lbHtwYWRkaW5nOjE2cHg7dGV4dC1hbGlnbjpjZW50ZXJ9Ci5hcmVuYS1jYXJke21pbi1oZWlnaHQ6NDIwcHg7cGFkZGluZzoyMnB4O3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47CiBqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxNDVkZWcsIzI4NGM3OGU4LCMxODI0NGNlZSl9Ci5hcmVuYS1hcnR7aGVpZ2h0OjE2MHB4O2JvcmRlci1yYWRpdXM6MThweDtkaXNwbGF5OmdyaWQ7cGxhY2UtaXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTo4NXB4OwogYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoIzcyZDVmZiwjNmZkNDZhIDU1JSwjMzI1YzJmIDU2JSk7Ym94LXNoYWRvdzppbnNldCAwIDAgMzVweCAjZmZmNH0KLnBsYXktbWFpbntmb250LXNpemU6MjVweDtwYWRkaW5nOjE4cHh9Ci5zdGF0LXJvd3tkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47cGFkZGluZzo4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmZmZmMTV9Ci5wcm9ncmVzc3toZWlnaHQ6MTNweDtib3JkZXItcmFkaXVzOjEwcHg7YmFja2dyb3VuZDojMDgwZDIyO292ZXJmbG93OmhpZGRlbjtib3JkZXI6MXB4IHNvbGlkICNmZmZmZmYyNn0KLnByb2dyZXNzPml7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg5MGRlZywjNjVkZGZmLCM0ZTcxZmYpO2JvcmRlci1yYWRpdXM6MTBweH0KLnNlY3Rpb24tdGl0bGV7Zm9udC1zaXplOjI1cHg7Zm9udC13ZWlnaHQ6MTAwMDttYXJnaW46MCAwIDE0cHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfQouY2FyZHMtZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpbGwsbWlubWF4KDEzNXB4LDFmcikpO2dhcDoxM3B4O21heC13aWR0aDoxMTUwcHg7bWFyZ2luOmF1dG99Ci5jYXJke3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6MTgwcHg7cGFkZGluZzo4cHg7Ym9yZGVyLXJhZGl1czoxN3B4O3RleHQtYWxpZ246Y2VudGVyO292ZXJmbG93OmhpZGRlbjsKIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE0NWRlZywjMzM0ODdjLCMxNzI0NDkpO2JvcmRlcjozcHggc29saWQgIzc3OTRkMzsKIGJveC1zaGFkb3c6MCA5cHggMTZweCAjMDAwNyxpbnNldCAwIDFweCAjZmZmNTt0cmFuc2l0aW9uOi4xOHM7Y3Vyc29yOnBvaW50ZXJ9Ci5jYXJkOmhvdmVye3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01cHgpIHJvdGF0ZSgtMWRlZyk7ZmlsdGVyOmJyaWdodG5lc3MoMS4xMil9Ci5jYXJkLnNlbGVjdGVke291dGxpbmU6NHB4IHNvbGlkICNmZmVlNTk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTVweCl9Ci5jYXJkLmxvY2tlZHtmaWx0ZXI6Z3JheXNjYWxlKDEpIGJyaWdodG5lc3MoLjU1KX0KLmNhcmQu2YXYudmF2YjZhNuMe2JvcmRlci1jb2xvcjojOWViMGM5fS5jYXJkLtqp2YXbjNin2Kh7Ym9yZGVyLWNvbG9yOiNmZmI1MmV9Ci5jYXJkLtit2YXYp9iz24x7Ym9yZGVyLWNvbG9yOiNjMTY1ZmZ9LmNhcmQu2KfZgdiz2KfZhtmH4oCM2KfbjHtib3JkZXItY29sb3I6IzVmZmZlNH0KLmNhcmQtaWNvbntoZWlnaHQ6OThweDtkaXNwbGF5OmdyaWQ7cGxhY2UtaXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTo2MnB4O2JvcmRlci1yYWRpdXM6MTJweDsKIGJhY2tncm91bmQ6cmFkaWFsLWdyYWRpZW50KGNpcmNsZSwjZmZmZmZmM2IsdHJhbnNwYXJlbnQgNjglKX0KLmNhcmQtbmFtZXtmb250LXdlaWdodDoxMDAwO2ZvbnQtc2l6ZToxNHB4O21hcmdpbjo1cHggMH0KLmNhcmQtbWV0YXtmb250LXNpemU6MTFweDtjb2xvcjojY2FkNmZhfQouY29zdHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjVweDt0b3A6NXB4O3dpZHRoOjMxcHg7aGVpZ2h0OjMxcHg7Ym9yZGVyLXJhZGl1czo1MCU7ZGlzcGxheTpncmlkO3BsYWNlLWl0ZW1zOmNlbnRlcjsKIGZvbnQtd2VpZ2h0OjEwMDA7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoI2U0ODNmZiwjODczN2Q0KTtib3JkZXI6MnB4IHNvbGlkICNmZmZ9Ci5sZXZlbHtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo2cHg7dG9wOjdweDtmb250LXNpemU6MTBweDtiYWNrZ3JvdW5kOiMwNzEwMjhjYztwYWRkaW5nOjRweCA2cHg7Ym9yZGVyLXJhZGl1czo3cHh9Ci5wYW5lbC1wYWdle21heC13aWR0aDoxMTUwcHg7bWFyZ2luOmF1dG87cGFkZGluZzoxOHB4fQouZGVjay16b25le2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDgsMWZyKTtnYXA6OXB4O21hcmdpbi1ib3R0b206MjBweH0KLmRlY2stem9uZSAuY2FyZHttaW4taGVpZ2h0OjE0MHB4fS5kZWNrLXpvbmUgLmNhcmQtaWNvbntoZWlnaHQ6NjNweDtmb250LXNpemU6NDJweH0KLnNob3AtZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMjEwcHgsMWZyKSk7Z2FwOjE2cHh9Ci5zaG9wLWl0ZW17cGFkZGluZzoyMHB4O3RleHQtYWxpZ246Y2VudGVyfS5zaG9wLWljb257Zm9udC1zaXplOjcwcHh9Ci5tb2RhbHtwb3NpdGlvbjpmaXhlZDtpbnNldDowO2JhY2tncm91bmQ6IzAzMDgxN2Q5O2Rpc3BsYXk6Z3JpZDtwbGFjZS1pdGVtczpjZW50ZXI7ei1pbmRleDoxMDA7cGFkZGluZzoxOHB4fQoubW9kYWwtYm94e3dpZHRoOm1pbig1MjBweCw5NnZ3KTttYXgtaGVpZ2h0Ojkwdmg7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjI1cHg7dGV4dC1hbGlnbjpjZW50ZXJ9Ci5tb2RhbCBoMntmb250LXNpemU6MzVweDttYXJnaW46OHB4fS5tb2RhbCBwe2NvbG9yOiNkMGRhZjg7bGluZS1oZWlnaHQ6MS41NX0KLnNldHRpbmd7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMS41ZnI7Z2FwOjE0cHg7YWxpZ24taXRlbXM6Y2VudGVyO3RleHQtYWxpZ246bGVmdDttYXJnaW46MTdweCAwfQppbnB1dFt0eXBlPXJhbmdlXXt3aWR0aDoxMDAlO2FjY2VudC1jb2xvcjojNTliZGZmfQoKLyog2YbYqNix2K8gKi8KI2JhdHRsZXtiYWNrZ3JvdW5kOiMwNTA5MWF9CiNyZW5kZXJIb3N0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjB9CiNyZW5kZXJIb3N0IGNhbnZhc3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG91Y2gtYWN0aW9uOm5vbmV9CiNiYXR0bGVIdWR7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtwb2ludGVyLWV2ZW50czpub25lfQouaHVkLXRvcHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6OHB4O2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7CiBnYXA6MTBweDtiYWNrZ3JvdW5kOiMwYTEyMzdkZDtwYWRkaW5nOjdweCAxM3B4O2JvcmRlci1yYWRpdXM6MTVweDtib3JkZXI6MXB4IHNvbGlkICNmZmYzO21pbi13aWR0aDozMTBweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfQouY3Jvd25ze2ZvbnQtc2l6ZToxOXB4O2ZvbnQtd2VpZ2h0OjkwMH0ucGxheWVyQ3Jvd257Y29sb3I6IzY1YzlmZn0uZW5lbXlDcm93bntjb2xvcjojZmY3MDg2fQojdGltZXJ7Zm9udC1zaXplOjI1cHg7Zm9udC13ZWlnaHQ6MTAwMDttaW4td2lkdGg6ODBweDt0ZXh0LWFsaWduOmNlbnRlcn0KI3BoYXNle2ZvbnQtc2l6ZToxMHB4O2NvbG9yOiNmZmUxNWM7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfQojcGF1c2VCdG57cG9pbnRlci1ldmVudHM6YXV0bztwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMnB4O3RvcDoxMnB4O3dpZHRoOjQ1cHg7aGVpZ2h0OjQzcHg7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6IzE0MjQ0ZGRkfQojYmF0dGxlTWVzc2FnZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjAlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKSBzY2FsZSguNyk7CiBmb250LXNpemU6Y2xhbXAoMjdweCw1dncsNjJweCk7Zm9udC13ZWlnaHQ6MTAwMDt0ZXh0LWFsaWduOmNlbnRlcjtvcGFjaXR5OjA7CiB0ZXh0LXNoYWRvdzowIDVweCAwICMxMzJiNjYsMCAxMHB4IDMwcHggIzAwMDt0cmFuc2l0aW9uOi4yNXM7d2hpdGUtc3BhY2U6bm93cmFwfQojYmF0dGxlTWVzc2FnZS5zaG93e29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSkgc2NhbGUoMSl9Ci5ib3R0b20taHVke3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo4cHg7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7d2lkdGg6bWluKDcyMHB4LDk3dncpO3BvaW50ZXItZXZlbnRzOmF1dG99Ci5lbGl4aXItd3JhcHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7bWFyZ2luOjAgOHB4IDdweH0KLmVsaXhpci1pY29ue2ZvbnQtc2l6ZToyNXB4O2ZpbHRlcjpkcm9wLXNoYWRvdygwIDAgNnB4ICNkNTYzZmYpfQouZWxpeGlyLWJhcntoZWlnaHQ6MjNweDtmbGV4OjE7YmFja2dyb3VuZDojMTkwZjMxO2JvcmRlcjoycHggc29saWQgI2YzYzZmZjtib3JkZXItcmFkaXVzOjE0cHg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfQojZWxpeGlyRmlsbHtoZWlnaHQ6MTAwJTt3aWR0aDo1MCU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsIzgxMjljYSwjZWE3OGZmKTt0cmFuc2l0aW9uOndpZHRoIC4xMnN9CiNlbGl4aXJUZXh0e3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6MTAwMDtsaW5lLWhlaWdodDoxOXB4O3RleHQtc2hhZG93OjAgMnB4ICM0MzEwNjN9Ci5oYW5ke2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6NTVweCByZXBlYXQoNCwxZnIpO2dhcDo3cHg7YWxpZ24taXRlbXM6ZW5kfQoubmV4dC1jYXJke2hlaWdodDo3OHB4O2JhY2tncm91bmQ6IzExMWQ0MmU4O2JvcmRlcjoycHggc29saWQgIzY4ODRjMTtib3JkZXItcmFkaXVzOjEycHg7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzo0cHg7Zm9udC1zaXplOjEwcHh9Ci5uZXh0LWNhcmQgc3Bhbntmb250LXNpemU6MzJweDtkaXNwbGF5OmJsb2NrfQouaGFuZC1jYXJke2hlaWdodDoxMTJweDtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItcmFkaXVzOjE1cHg7cGFkZGluZzo1cHg7dGV4dC1hbGlnbjpjZW50ZXI7CiBiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgjMzU0ZjkxLCMxODI5NTApO2JvcmRlcjozcHggc29saWQgIzhhYThlODtib3gtc2hhZG93OjAgN3B4IDAgIzA4MTMzMSwwIDEwcHggMTVweCAjMDAwOTsKIHRyYW5zaXRpb246LjE1cztjdXJzb3I6cG9pbnRlcjtvdmVyZmxvdzpoaWRkZW59Ci5oYW5kLWNhcmQgLmhpY29ue2ZvbnQtc2l6ZTo0N3B4O2xpbmUtaGVpZ2h0OjU4cHh9Ci5oYW5kLWNhcmQgLmhuYW1le2ZvbnQtd2VpZ2h0OjkwMDtmb250LXNpemU6MTFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Ci5oYW5kLWNhcmQgLmhjb3N0e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MnB4O3RvcDoycHg7d2lkdGg6MjdweDtoZWlnaHQ6MjdweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiM5ZTNkZTA7CiBib3JkZXI6MnB4IHNvbGlkIHdoaXRlO2ZvbnQtd2VpZ2h0OjEwMDA7ZGlzcGxheTpncmlkO3BsYWNlLWl0ZW1zOmNlbnRlcn0KLmhhbmQtY2FyZDpob3Zlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtN3B4KX0KLmhhbmQtY2FyZC5jaG9zZW57dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEzcHgpO2JvcmRlci1jb2xvcjojZmZmNDVjO2JveC1zaGFkb3c6MCAwIDE4cHggI2ZmZWQ0ZX0KLmhhbmQtY2FyZC5uby1lbGl4aXJ7ZmlsdGVyOmdyYXlzY2FsZSguOCkgYnJpZ2h0bmVzcyguNTUpfQojdW5pdEluZm97cG9zaXRpb246YWJzb2x1dGU7bGVmdDoxMHB4O2JvdHRvbToxNTBweDttYXgtd2lkdGg6MjEwcHg7cGFkZGluZzo4cHggMTJweDtib3JkZXItcmFkaXVzOjExcHg7CiBiYWNrZ3JvdW5kOiMwNzExMmNjYztmb250LXNpemU6MTJweDtvcGFjaXR5OjA7dHJhbnNpdGlvbjouMnN9CiN1bml0SW5mby5zaG93e29wYWNpdHk6MX0KI3RvYXN0e3Bvc2l0aW9uOmZpeGVkO3RvcDo4NXB4O2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTIwcHgpOwogYmFja2dyb3VuZDojMTAxYTNlZWU7Ym9yZGVyOjFweCBzb2xpZCAjZmZmNDtwYWRkaW5nOjEwcHggMThweDtib3JkZXItcmFkaXVzOjEzcHg7ei1pbmRleDoyMDA7CiBvcGFjaXR5OjA7dHJhbnNpdGlvbjouMjVzO3BvaW50ZXItZXZlbnRzOm5vbmU7Zm9udC13ZWlnaHQ6ODAwfQojdG9hc3Quc2hvd3tvcGFjaXR5OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9CiNtYXRjaG1ha2luZyAuc3Bpbm5lcnt3aWR0aDo4NXB4O2hlaWdodDo4NXB4O2JvcmRlcjo5cHggc29saWQgI2ZmZmZmZjIyO2JvcmRlci10b3AtY29sb3I6IzYzYzdmZjsKIGJvcmRlci1yYWRpdXM6NTAlO21hcmdpbjoyNXB4IGF1dG87YW5pbWF0aW9uOnNwaW4gLjhzIGxpbmVhciBpbmZpbml0ZX0KQGtleWZyYW1lcyBzcGlue3Rve3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19Ci5yZXdhcmQtcm93e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbjoyMHB4fQoucmV3YXJke3BhZGRpbmc6MTJweDtiYWNrZ3JvdW5kOiMwYzE2Mzg7Ym9yZGVyLXJhZGl1czoxM3B4O21pbi13aWR0aDo5MHB4O2ZvbnQtd2VpZ2h0OjkwMH0KLmNoZXN0e2ZvbnQtc2l6ZToxMDBweDtkaXNwbGF5OmlubGluZS1ibG9jazthbmltYXRpb246Y2hlc3QgMS4xcyBpbmZpbml0ZX0KQGtleWZyYW1lcyBjaGVzdHswJSwxMDAle3RyYW5zZm9ybTpyb3RhdGUoLTRkZWcpfTUwJXt0cmFuc2Zvcm06cm90YXRlKDRkZWcpIHNjYWxlKDEuMDYpfX0KLmRhbWFnZS12aWduZXR0ZXtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO2JveC1zaGFkb3c6aW5zZXQgMCAwIDkwcHggI2ZmMTczZTAwO3RyYW5zaXRpb246LjE1c30KLmRhbWFnZS12aWduZXR0ZS5mbGFzaHtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fQoKQG1lZGlhKG1heC13aWR0aDo3NjBweCl7CiAuaG9tZS1ncmlke2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnJ9LmhvbWUtZ3JpZCAuc2lkZS1wYW5lbHtkaXNwbGF5Om5vbmV9CiAuYXJlbmEtY2FyZHttaW4taGVpZ2h0OjM1MHB4fS50b3BiYXJ7aGVpZ2h0OjYwcHg7cGFkZGluZzo1cHggOXB4fS5hdmF0YXJ7d2lkdGg6NDBweDtoZWlnaHQ6NDBweH0KICNtZW51Q29udGVudHtoZWlnaHQ6Y2FsYygxMDAlIC0gMTI1cHgpO3BhZGRpbmc6MTBweH0ubmF2YmFye2hlaWdodDo2NXB4fQogLmN1cnJlbmN5e2ZvbnQtc2l6ZToxMXB4O3BhZGRpbmc6NXB4fS5kZWNrLXpvbmV7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCg0LDFmcil9CiAuY2FyZHMtZ3JpZHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDMsMWZyKTtnYXA6N3B4fS5jYXJke21pbi1oZWlnaHQ6MTY0cHg7cGFkZGluZzo1cHh9LmNhcmQtaWNvbntoZWlnaHQ6ODJweDtmb250LXNpemU6NDlweH0KIC5jYXJkLWljb257aGVpZ2h0OjY2cHg7Zm9udC1zaXplOjQzcHh9LmNhcmQtbmFtZXtmb250LXNpemU6MTFweH0KIC5oYW5ke2dyaWQtdGVtcGxhdGUtY29sdW1uczo0MnB4IHJlcGVhdCg0LDFmcik7Z2FwOjRweH0uaGFuZC1jYXJke2hlaWdodDo5MXB4O2JvcmRlci13aWR0aDoycHh9CiAuaGFuZC1jYXJkIC5oaWNvbntmb250LXNpemU6MzZweDtsaW5lLWhlaWdodDo0N3B4fS5oYW5kLWNhcmQgLmhuYW1le2ZvbnQtc2l6ZTo5cHh9CiAubmV4dC1jYXJke2hlaWdodDo2NnB4fS5uZXh0LWNhcmQgc3Bhbntmb250LXNpemU6MjZweH0KICN1bml0SW5mb3tib3R0b206MTIwcHh9Lmh1ZC10b3B7bWluLXdpZHRoOjI1MHB4fS5uYXZiYXIgLm5hdmJ0bntmb250LXNpemU6OXB4fS5uYXZidG4gYntmb250LXNpemU6MThweH0KfQpib2R5e2RpcmVjdGlvbjpydGw7dGV4dC1hbGlnbjpyaWdodH0gLmdhbWUtdGl0bGUsLmFyZW5hLWNhcmQsLnNpZGUtcGFuZWwsLm1vZGFsLWJveCwuY2FyZCwuc2hvcC1pdGVte3RleHQtYWxpZ246Y2VudGVyfSAuc2V0dGluZ3t0ZXh0LWFsaWduOnJpZ2h0fSAubmF2YmFye2RpcmVjdGlvbjpydGx9IGlucHV0LHNlbGVjdHtkaXJlY3Rpb246cnRsfQo8L3N0eWxlPgoKPHN0eWxlIGlkPSJub3ZhLXRvdWNoLWZpeCI+Cmh0bWwsYm9keSxib2R5ICp7IC13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZSFpbXBvcnRhbnQ7IHVzZXItc2VsZWN0Om5vbmUhaW1wb3J0YW50OyAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZSFpbXBvcnRhbnQ7IH0KaW5wdXQsdGV4dGFyZWEsW2NvbnRlbnRlZGl0YWJsZT0idHJ1ZSJdLHNlbGVjdHsgLXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0IWltcG9ydGFudDsgdXNlci1zZWxlY3Q6dGV4dCFpbXBvcnRhbnQ7IC13ZWJraXQtdG91Y2gtY2FsbG91dDpkZWZhdWx0IWltcG9ydGFudDsgfQpjYW52YXMsYnV0dG9uLGF7dG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjt9Cjwvc3R5bGU+Cgo8c3R5bGUgaWQ9Im5vdmEtY2xhc2gtc2hvcC1iYWxhbmNlLWZpeCI+Ci5zaG9wLWdyaWR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMTI1cHgsMWZyKSkhaW1wb3J0YW50O2dhcDo5cHghaW1wb3J0YW50O2FsaWduLWl0ZW1zOnN0cmV0Y2h9Ci5zaG9wLWl0ZW17cGFkZGluZzoxMHB4IDhweCFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czoxM3B4IWltcG9ydGFudDttaW4td2lkdGg6MH0KLnNob3AtaWNvbntmb250LXNpemU6NDBweCFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MS4xNTttYXJnaW4tYm90dG9tOjRweH0KLnNob3AtaXRlbSBoM3tmb250LXNpemU6MTNweCFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MS41O21hcmdpbjo1cHggMCFpbXBvcnRhbnR9Ci5zaG9wLWl0ZW0gcHtmb250LXNpemU6MTBweCFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MS42O21hcmdpbjo0cHggMCA4cHghaW1wb3J0YW50fQouc2hvcC1pdGVtIC5idG57cGFkZGluZzo4cHggN3B4IWltcG9ydGFudDtmb250LXNpemU6MTBweCFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm9ybWFsO2xpbmUtaGVpZ2h0OjEuNX0KLmNhcmQtbWV0YXtmb250LXNpemU6MTBweCFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MS41NX0KLmxldmVse2ZvbnQtc2l6ZTo5cHghaW1wb3J0YW50fQpAbWVkaWEobWF4LXdpZHRoOjUyMHB4KXsuc2hvcC1ncmlke2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMixtaW5tYXgoMCwxZnIpKSFpbXBvcnRhbnQ7Z2FwOjdweCFpbXBvcnRhbnR9LnNob3AtaXRlbXtwYWRkaW5nOjlweCA2cHghaW1wb3J0YW50fS5zaG9wLWljb257Zm9udC1zaXplOjM0cHghaW1wb3J0YW50fS5zaG9wLWl0ZW0gaDN7Zm9udC1zaXplOjEycHghaW1wb3J0YW50fS5zaG9wLWl0ZW0gcHtmb250LXNpemU6OXB4IWltcG9ydGFudH0uc2hvcC1pdGVtIC5idG57Zm9udC1zaXplOjlweCFpbXBvcnRhbnQ7cGFkZGluZzo3cHggNXB4IWltcG9ydGFudH19Cjwvc3R5bGU+Cgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGlkPSJ0b2FzdCI+PC9kaXY+Cgo8c2VjdGlvbiBpZD0ibWVudSIgY2xhc3M9InNjcmVlbiBiZyI+CiAgPGhlYWRlciBjbGFzcz0idG9wYmFyIj4KICAgIDxkaXYgY2xhc3M9InByb2ZpbGUtY2hpcCI+CiAgICAgIDxkaXYgY2xhc3M9ImF2YXRhciI+8J+boe+4jzwvZGl2PgogICAgICA8ZGl2PjxkaXYgaWQ9InBsYXllck5hbWUiPtmC2YfYsdmF2KfZhiDYotix2YbYpzwvZGl2PjxzbWFsbD7Ys9i32K0gPHNwYW4gaWQ9ImxldmVsIj4xPC9zcGFuPiDCtyDwn4+GIDxzcGFuIGlkPSJ0cm9waGllcyI+MDwvc3Bhbj48L3NtYWxsPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjdXJyZW5jaWVzIj4KICAgICAgPGRpdiBjbGFzcz0iY3VycmVuY3kiPvCfqpkgPHNwYW4gaWQ9ImdvbGQiPjA8L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImN1cnJlbmN5Ij7wn5KOIDxzcGFuIGlkPSJnZW1zIj4wPC9zcGFuPjwvZGl2PgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4iIHN0eWxlPSJwYWRkaW5nOjZweCA5cHgiIGlkPSJzZXR0aW5nc1RvcCI+4pqZ77iPPC9idXR0b24+CiAgICA8L2Rpdj4KICA8L2hlYWRlcj4KICA8bWFpbiBpZD0ibWVudUNvbnRlbnQiPjwvbWFpbj4KICA8bmF2IGNsYXNzPSJuYXZiYXIiPgogICAgPGJ1dHRvbiBjbGFzcz0ibmF2YnRuIGFjdGl2ZSIgZGF0YS1wYWdlPSJob21lIj48Yj7impTvuI88L2I+2YbYqNix2K88L2J1dHRvbj4KICAgIDxidXR0b24gY2xhc3M9Im5hdmJ0biIgZGF0YS1wYWdlPSJkZWNrIj48Yj7wn4OPPC9iPtiv2LPYqtmHINqp2KfYsdiqPC9idXR0b24+CiAgICA8YnV0dG9uIGNsYXNzPSJuYXZidG4iIGRhdGEtcGFnZT0iY2FyZHMiPjxiPvCfk5o8L2I+2qnYp9ix2KrigIzZh9inPC9idXR0b24+CiAgICA8YnV0dG9uIGNsYXNzPSJuYXZidG4iIGRhdGEtcGFnZT0ic2hvcCI+PGI+8J+bkjwvYj7Zgdix2YjYtNqv2KfZhzwvYnV0dG9uPgogICAgPGJ1dHRvbiBjbGFzcz0ibmF2YnRuIiBkYXRhLXBhZ2U9InByb2ZpbGUiPjxiPvCfkZE8L2I+2b7YsdmI2YHYp9uM2YQ8L2J1dHRvbj4KICAgIDxidXR0b24gY2xhc3M9Im5hdmJ0biIgZGF0YS1wYWdlPSJzZXR0aW5ncyI+PGI+4pqZ77iPPC9iPtiq2YbYuNuM2YXYp9iqPC9idXR0b24+CiAgPC9uYXY+Cjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPSJiYXR0bGUiIGNsYXNzPSJzY3JlZW4gaGlkZGVuIj4KICA8ZGl2IGlkPSJyZW5kZXJIb3N0Ij48L2Rpdj4KICA8ZGl2IGlkPSJiYXR0bGVIdWQiPgogICAgPGRpdiBjbGFzcz0iaHVkLXRvcCI+CiAgICAgIDxzcGFuIGNsYXNzPSJjcm93bnMgcGxheWVyQ3Jvd24iPvCfkZEgPGIgaWQ9Im152KrYp9isIj4wPC9iPjwvc3Bhbj4KICAgICAgPGRpdj48ZGl2IGlkPSJ0aW1lciI+NDowMDwvZGl2PjxkaXYgaWQ9InBoYXNlIj7Zhtio2LHYryDYudin2K/bjDwvZGl2PjwvZGl2PgogICAgICA8c3BhbiBjbGFzcz0iY3Jvd25zIGVuZW15Q3Jvd24iPvCfkZEgPGIgaWQ9ImVuZW152KrYp9isIj4wPC9iPjwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGJ1dHRvbiBpZD0icGF1c2VCdG4iPuKFoTwvYnV0dG9uPgogICAgPGRpdiBpZD0iYmF0dGxlTWVzc2FnZSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ1bml0SW5mbyI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJkYW1hZ2UtdmlnbmV0dGUiIGlkPSJ2aWduZXR0ZSI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJib3R0b20taHVkIj4KICAgICAgPGRpdiBjbGFzcz0iZWxpeGlyLXdyYXAiPgogICAgICAgIDxkaXYgY2xhc3M9ImVsaXhpci1pY29uIj7wn5KnPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZWxpeGlyLWJhciI+PGRpdiBpZD0iZWxpeGlyRmlsbCI+PC9kaXY+PGRpdiBpZD0iZWxpeGlyVGV4dCI+NSAvIDEwPC9kaXY+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJoYW5kIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuZXh0LWNhcmQiIGlkPSJuZXh0Q2FyZCI+2KjYudiv24w8c3Bhbj4/PC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImhhbmQtY2FyZCIgZGF0YS1zbG90PSIwIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJoYW5kLWNhcmQiIGRhdGEtc2xvdD0iMSI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaGFuZC1jYXJkIiBkYXRhLXNsb3Q9IjIiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImhhbmQtY2FyZCIgZGF0YS1zbG90PSIzIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9zZWN0aW9uPgoKPGRpdiBpZD0ibWF0Y2htYWtpbmciIGNsYXNzPSJtb2RhbCBoaWRkZW4iPgogIDxkaXYgY2xhc3M9Im1vZGFsLWJveCBnbGFzcyIgc3R5bGU9Im1pbi13aWR0aDoxNTBweDttaW4taGVpZ2h0OjEzMHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlciI+CiAgICA8ZGl2IGlkPSJzZWFyY2hUZXh0IiBzdHlsZT0iZm9udC1zaXplOjc2cHg7bGluZS1oZWlnaHQ6MTtmb250LXdlaWdodDoxMDAwO2NvbG9yOiNmZmYiPjEwPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0idHV0b3JpYWwiIGNsYXNzPSJtb2RhbCBoaWRkZW4iPgogIDxkaXYgY2xhc3M9Im1vZGFsLWJveCBnbGFzcyI+CiAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6NjVweCIgaWQ9InR1dG9yaWFsSWNvbiI+8J+DjzwvZGl2PgogICAgPGgyIGlkPSJ0dXRvcmlhbFRpdGxlIj7bjNqpINqp2KfYsdiqINin2YbYqtiu2KfYqCDaqdmGPC9oMj4KICAgIDxwIGlkPSJ0dXRvcmlhbFRleHQiPjwvcD4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2dhcDoxMnB4Ij4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHJlZCIgaWQ9InNraXBUdXRvcmlhbCI+2LHYryDaqdix2K/ZhjwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gZ29sZCIgaWQ9Im5leHRUdXRvcmlhbCI+2KjYudiv24w8L2J1dHRvbj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgaWQ9InJlc3VsdCIgY2xhc3M9Im1vZGFsIGhpZGRlbiI+CiAgPGRpdiBjbGFzcz0ibW9kYWwtYm94IGdsYXNzIj4KICAgIDxkaXYgaWQ9InJlc3VsdEljb24iIHN0eWxlPSJmb250LXNpemU6ODBweCI+8J+PhjwvZGl2PgogICAgPGgyIGlkPSJyZXN1bHRUaXRsZSI+2b7bjNix2YjYstuMITwvaDI+CiAgICA8cCBpZD0icmVzdWx0U2NvcmUiPjwvcD4KICAgIDxkaXYgY2xhc3M9InJld2FyZC1yb3ciIGlkPSJyZXdhcmRzIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImNoZXN0QXJlYSI+PC9kaXY+CiAgICA8YnV0dG9uIGNsYXNzPSJidG4gZ29sZCIgaWQ9InJlc3VsdNin2K/Yp9mF2YciPtin2K/Yp9mF2Yc8L2J1dHRvbj4KICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJwYXVzZU1vZGFsIiBjbGFzcz0ibW9kYWwgaGlkZGVuIj4KICA8ZGl2IGNsYXNzPSJtb2RhbC1ib3ggZ2xhc3MiPgogICAgPGgyPtmG2KjYsdivINmF2KrZiNmC2YEg2LTYrzwvaDI+CiAgICA8YnV0dG9uIGNsYXNzPSJidG4gZ3JlZW4iIGlkPSJyZXN1bWVCdG4iPtin2K/Yp9mF2Ycg2YbYqNix2K88L2J1dHRvbj4KICAgIDxidXR0b24gY2xhc3M9ImJ0biIgaWQ9InBhdXNl2KrZhti424zZhdin2KoiPtiq2YbYuNuM2YXYp9iqPC9idXR0b24+CiAgICA8YnV0dG9uIGNsYXNzPSJidG4gcmVkIiBpZD0icXVpdEJ0biI+2KrYs9mE24zZhSDYtNiv2YY8L2J1dHRvbj4KICA8L2Rpdj4KPC9kaXY+Cgo8c2NyaXB0IHR5cGU9Im1vZHVsZSI+CmxldCBUSFJFRTsKdHJ5IHsKICBUSFJFRSA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS90aHJlZUAwLjE4Ni4wL2J1aWxkL3RocmVlLm1vZHVsZS5qcyIpOwp9IGNhdGNoIChmaXJzdEVycm9yKSB7CiAgdHJ5IHsKICAgIFRIUkVFID0gYXdhaXQgaW1wb3J0KCJodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjE4Ni4wL2J1aWxkL3RocmVlLm1vZHVsZS5qcyIpOwogIH0gY2F0Y2ggKHNlY29uZEVycm9yKSB7CiAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJmb250LWZhbWlseTpUYWhvbWEsQXJpYWwsc2Fucy1zZXJpZjtkaXJlY3Rpb246cnRsO3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjhweDtjb2xvcjp3aGl0ZTtiYWNrZ3JvdW5kOiMxMDE1MmI7bWluLWhlaWdodDoxMDB2aDtib3gtc2l6aW5nOmJvcmRlci1ib3giPjxoMj7YqNin2LHar9iw2KfYsduMINqv2LHYp9mB24zaqSDaqdmE2LQg2LHZiNuM2KfZhCDZhtin2YXZiNmB2YIg2KjZiNivPC9oMj48cD7YqNix2KfbjCDYp9is2LHYp9uMINin24zZhiDYqNin2LLbjCDYp9iq2LXYp9mEINin24zZhtiq2LHZhtiqINmE2KfYstmFINin2LPYqi4g2KfbjNmG2KrYsdmG2Kog2LHYpyDYsdmI2LTZhiDaqdmGINmIINmB2KfbjNmEINix2Kcg2K/ZiNio2KfYsdmHINio2KfYsiDaqdmGLjwvcD48YnV0dG9uIG9uY2xpY2s9ImxvY2F0aW9uLnJlbG9hZCgpIiBzdHlsZT0icGFkZGluZzoxMnB4IDE4cHg7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6IzhiNWNmNjtjb2xvcjp3aGl0ZTtmb250LXdlaWdodDpib2xkIj7YqtmE2KfYtCDYr9mI2KjYp9ix2Yc8L2J1dHRvbj48L2Rpdj4nOwogICAgdGhyb3cgc2Vjb25kRXJyb3I7CiAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAg2KfZgdiz2KfZhtmH4oCM2KfbjCDYsdmC2KjYpwogICBPcmlnaW5hbCBwcm9jZWR1cmFsIGFzc2V0cyBhbmQgZ2FtZXBsYXkgaW1wbGVtZW50YXRpb24uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKY29uc3QgJD1zPT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHMpOwpjb25zdCAkJD1zPT5bLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzKV07CmNvbnN0IGNsYW1wPShuLGEsYik9Pk1hdGgubWF4KGEsTWF0aC5taW4oYixuKSk7CmNvbnN0IHJhbmQ9KGEsYik9PmErTWF0aC5yYW5kb20oKSooYi1hKTsKY29uc3QgY2hvaWNlPWE9PmFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV07Cgpjb25zdCBTQVZFX0tFWT0ibXl0aGljX3JpdmFsc19zYXZlX3YzIjsKY29uc3QgZGVmYXVsdHM9ewogIG5hbWU6ItmC2YfYsdmF2KfZhiDYotix2YbYpyIsbGV2ZWw6MSx4cDowLGdvbGQ6NjUwLGdlbXM6NDAsdHJvcGhpZXM6MCx3aW5zOjAsbG9zc2VzOjAsa2luZ0hwQm9udXM6MCwKICBhcmVuYTowLGRpZmZpY3VsdHk6ItmF2LnZhdmI2YTbjCIsbXVzaWM6LjE4LHNmeDouNTUscXVhbGl0eToi2LLbjNin2K8iLHR1dG9yaWFsOmZhbHNlLAogIGRlY2s6WyJibGFkZWd1YXJkIiwid2luZGFyY2hlciIsInN0b25lY29sb3NzdXMiLCJzcHJpZ2dhbiIsImVtYmVybWFnZSIsInNreWRyYWtlIiwiaXJvbmJhc3Rpb24iLCJmaXJlb3JiIl0sCiAgb3duZWQ6e2JsYWRlZ3VhcmQ6MSx3aW5kYXJjaGVyOjEsc3RvbmVjb2xvc3N1czoxLHNwcmlnZ2FuOjEsZW1iZXJtYWdlOjEsc2t5ZHJha2U6MSxpcm9uYmFzdGlvbjoxLGZpcmVvcmI6MX0sCiAgY2FyZENvcGllczp7fSxtaWdyYXRpb240MDpmYWxzZQp9OwpsZXQgc2F2ZT1sb2FkU2F2ZSgpOwpmdW5jdGlvbiBsb2FkU2F2ZSgpewogIGxldCBsb2FkZWQ7CiAgdHJ5e2xvYWRlZD1PYmplY3QuYXNzaWduKHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0cyksSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTQVZFX0tFWSl8fCJ7fSIpKX0KICBjYXRjaHtsb2FkZWQ9c3RydWN0dXJlZENsb25lKGRlZmF1bHRzKX0KICBpZighbG9hZGVkLm1pZ3JhdGlvbjQwKXtsb2FkZWQub3duZWQ9e2JsYWRlZ3VhcmQ6MSx3aW5kYXJjaGVyOjEsc3RvbmVjb2xvc3N1czoxLHNwcmlnZ2FuOjEsZW1iZXJtYWdlOjEsc2t5ZHJha2U6MSxpcm9uYmFzdGlvbjoxLGZpcmVvcmI6MX07bG9hZGVkLmRlY2s9WyJibGFkZWd1YXJkIiwid2luZGFyY2hlciIsInN0b25lY29sb3NzdXMiLCJzcHJpZ2dhbiIsImVtYmVybWFnZSIsInNreWRyYWtlIiwiaXJvbmJhc3Rpb24iLCJmaXJlb3JiIl07bG9hZGVkLm1pZ3JhdGlvbjQwPXRydWU7fQogIGxvYWRlZC5jYXJkQ29waWVzPU9iamVjdC5hc3NpZ24oe30sbG9hZGVkLmNhcmRDb3BpZXN8fHt9KTsKICB0cnl7aWYocGFyZW50JiZ0eXBlb2YgcGFyZW50Lk5PVkFfZ2V0Q29pbnM9PT0iZnVuY3Rpb24iKWxvYWRlZC5nb2xkPXBhcmVudC5OT1ZBX2dldENvaW5zKCl9Y2F0Y2goZSl7fQogIHJldHVybiBsb2FkZWQ7Cn0KZnVuY3Rpb24gcGVyc2lzdCgpewogIHNhdmUuZ29sZD1NYXRoLm1heCgwLE1hdGguZmxvb3IoTnVtYmVyKHNhdmUuZ29sZCl8fDApKTsKICB0cnl7aWYocGFyZW50JiZ0eXBlb2YgcGFyZW50Lk5PVkFfc2V0Q29pbnM9PT0iZnVuY3Rpb24iKXBhcmVudC5OT1ZBX3NldENvaW5zKHNhdmUuZ29sZCl9Y2F0Y2goZSl7fQogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNBVkVfS0VZLEpTT04uc3RyaW5naWZ5KHNhdmUpKTtzeW5jVG9wKCkKfQpmdW5jdGlvbiBzeW5jVG9wKCl7CiAgJCgiI3BsYXllck5hbWUiKS50ZXh0Q29udGVudD1zYXZlLm5hbWU7JCgiI2xldmVsIikudGV4dENvbnRlbnQ9c2F2ZS5sZXZlbDsKICAkKCIjdHJvcGhpZXMiKS50ZXh0Q29udGVudD1zYXZlLnRyb3BoaWVzOyQoIiNnb2xkIikudGV4dENvbnRlbnQ9c2F2ZS5nb2xkOyQoIiNnZW1zIikudGV4dENvbnRlbnQ9c2F2ZS5nZW1zOwp9CmZ1bmN0aW9uIHRvYXN0KHQpewogIGNvbnN0IGU9JCgiI3RvYXN0Iik7ZS50ZXh0Q29udGVudD10O2UuY2xhc3NMaXN0LmFkZCgic2hvdyIpOwogIGNsZWFyVGltZW91dCh0b2FzdC50KTt0b2FzdC50PXNldFRpbWVvdXQoKCk9PmUuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLDE4MDApOwp9CgovKiAtLS0tLS0tLS0tIENhcmRzIC0tLS0tLS0tLS0gKi8KY29uc3QgQ0FSRFM9ewogYmxhZGVndWFyZDp7bmFtZToi2Ybar9mH2KjYp9mGINiq24zYutmHIixpY29uOiLimpTvuI8iLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6ItmF2LnZhdmI2YTbjCIsY29zdDozLGhwOjcyMCxkYW1hZ2U6MTEyLHNwZWVkOjMuMSxyYW5nZToxLjA1LHJhdGU6MS4xNSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweDRiODBlOCxkZXNjOiLZhtqv2YfYqNin2YbbjCDZgtin2KjZhCDYp9i52KrZhdin2K8g2KjYsdin24wg2YbYqNix2K8g2YbYstiv24zaqS4ifSwKIHdpbmRhcmNoZXI6e25hbWU6Itqp2YXYp9mG2K/Yp9ixINio2KfYryIsaWNvbjoi8J+PuSIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2YXYudmF2YjZhNuMIixjb3N0OjMsaHA6MzEwLGRhbWFnZTo4NixzcGVlZDozLHJhbmdlOjYuMyxyYXRlOjEuMDUsdGFyZ2V0OiJhbGwiLGNvdW50OjIsY29sb3I6MHg1NWM5OGIscHJvamVjdGlsZTp0cnVlLGRlc2M6Itiv2Ygg2qnZhdin2YbYr9in2LEg2K/ZiNix2KjYsdiv2Jsg2KfYsiDZgdin2LXZhNmHINin2YXZhiDYqNmHINmG24zYsdmI2YfYp9uMINiy2YXbjNmG24wg2Ygg2YfZiNin24zbjCDYqtuM2LEg2YXbjOKAjNiy2YbZhtivLiJ9LAogc3RvbmVjb2xvc3N1czp7bmFtZToi2LrZiNmEINi12K7YsdmH4oCM2KfbjCIsaWNvbjoi8J+qqCIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2qnZhduM2KfYqCIsY29zdDo1LGhwOjI1NTAsZGFtYWdlOjE5NSxzcGVlZDoxLjY1LHJhbmdlOjEuMjUscmF0ZToxLjY1LHRhcmdldDoiYnVpbGRpbmdzIixjb3VudDoxLGNvbG9yOjB4OGM4ZmE0LGxhcmdlOnRydWUsZGVzYzoi2LrZiNmEINiz2Ybar9uM2YbYmyDYp9mI2YTZiNuM2Kog2K3ZhdmE2YfigIzYp9i0INio2LHYrOKAjNmH2Kcg2Ygg2LPYp9iu2KrZhdin2YbigIzZh9in2LPYqi4ifSwKIHNwcmlnZ2FuOntuYW1lOiLar9ix2YjZhyDYp9iz2b7Ysdin24zar9mGIixpY29uOiLwn5G6Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLZhdi52YXZiNmE24wiLGNvc3Q6MixocDoxNzUsZGFtYWdlOjY0LHNwZWVkOjQuNCxyYW5nZTouOSxyYXRlOi43Mix0YXJnZXQ6Imdyb3VuZCIsY291bnQ6Myxjb2xvcjoweDc0Y2Y0NixkZXNjOiLYs9mHINmF2YfYp9is2YUg2LPYsduM2Lkg2KzZhtqv2YTbjC4ifSwKIGJvbmVzY291dDp7bmFtZToi2b7bjNi02KfZh9mG2q/Yp9mGINin2LPaqdmE2KoiLGljb246IvCfkoAiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6ItmF2LnZhdmI2YTbjCIsY29zdDoxLGhwOjkwLGRhbWFnZTo0OCxzcGVlZDo0LHJhbmdlOi44LHJhdGU6LjcsdGFyZ2V0OiJncm91bmQiLGNvdW50OjQsY29sb3I6MHhlZWVlY2MsZGVzYzoi2q/YsdmI2YfbjCDaqdmF4oCM2KzYp9mGINin2YXYpyDaqdin2LHYotmF2K8uIn0sCiBlbWJlcm1hZ2U6e25hbWU6Itis2KfYr9mI2q/YsSIsaWNvbjoi8J+nmSIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2qnZhduM2KfYqCIsY29zdDo0LGhwOjQ5MCxkYW1hZ2U6MTUwLHNwZWVkOjIuNixyYW5nZTo1LjQscmF0ZToxLjUsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHhmZjY5M2QscHJvamVjdGlsZTp0cnVlLHNwbGFzaDoxLjcsZGVzYzoi2q/ZhNmI2YTZhyDYotiq2LTbjNmGINio2Kcg2KLYs9uM2Kgg2YXYrdiv2YjYr9mH4oCM2KfbjNibINqG2YbYryDYr9i02YXZhiDZhtiy2K/bjNqpINix2Kcg2YfZhSDZhduM4oCM2LLZhtivLiJ9LAogc2t5ZHJha2U6e25hbWU6Itin2pjYr9mH2KfbjCDYotiz2YXYp9mG24wiLGljb246IvCfkIkiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo4MTAsZGFtYWdlOjEwNCxzcGVlZDozLjMscmFuZ2U6My43LHJhdGU6MS4yLHRhcmdldDoiYWxsIixjb3VudDoxLGNvbG9yOjB4NjBkZGVjLGFpcjp0cnVlLHByb2plY3RpbGU6dHJ1ZSxzcGxhc2g6MS4yNSxkZXNjOiLYp9qY2K/Zh9in24wg2b7YsdmG2K/ZhyDYqNinINmG2YHYsyDbjNiu24wuIn0sCiBpcm9uYmFzdGlvbjp7bmFtZToi2K/amCDYotmH2YbbjNmGIixpY29uOiLwn6SWIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjQsaHA6MTA4MCxkYW1hZ2U6MjMwLHNwZWVkOjIuMixyYW5nZToxLHJhdGU6MS43NSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweDUzNjM3OCxsYXJnZTp0cnVlLGRlc2M6Itis2Ybar9is2YjbjCDaqdmG2K8g2KjYpyDYttix2KjZh+KAjNin24wg2LPZhtqv24zZhi4ifSwKIHNoYWRlYXNzYXNzaW46e25hbWU6ItmG24zZhtis2KfbjCDYs9in24zZhyIsaWNvbjoi8J+ltyIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDozLGhwOjQzMCxkYW1hZ2U6MjQ1LHNwZWVkOjQuNyxyYW5nZToxLHJhdGU6MS4zLHRhcmdldDoiZ3JvdW5kIixjb3VudDoxLGNvbG9yOjB4NzAzN2E4LGRlc2M6Iti02qnYp9ix2obbjCDYs9ix24zYuSDYqNix2KzigIzZh9inINmIINmH2K/ZgeKAjNmH2KfbjCDYqtqp24wuIn0sCiBzdG9ybWNhbm5vbjp7bmFtZToi2KrZiNm+INii2LDYsdiu2LQiLGljb246IvCfjKnvuI8iLHR5cGU6Itiz2KfYrtiq2YXYp9mGIixyYXJpdHk6ItmF2LnZhdmI2YTbjCIsY29zdDozLGhwOjg2MCxkYW1hZ2U6MTA1LHNwZWVkOjAscmFuZ2U6Ni4yLHJhdGU6MS4wNSx0YXJnZXQ6Imdyb3VuZCIsbGlmZTozMixjb2xvcjoweDQzNGM2Myxwcm9qZWN0aWxlOnRydWUsZGVzYzoi2LPYp9iu2KrZhdin2YYg2K/Zgdin2LnbjCDaqdmI2obaqSDYqNix2KfbjCDYstmF24zZhi4ifSwKIGNyeXN0YWx0b3dlcjp7bmFtZToi2YXZhtin2LHZhyDYqNmE2YjYsduM2YYiLGljb246IvCflK4iLHR5cGU6Itiz2KfYrtiq2YXYp9mGIixyYXJpdHk6Itqp2YXbjNin2KgiLGNvc3Q6NCxocDo3MzAsZGFtYWdlOjk0LHNwZWVkOjAscmFuZ2U6Ni44LHJhdGU6LjgsdGFyZ2V0OiJhbGwiLGxpZmU6MzUsY29sb3I6MHg4ZjRmZmYscHJvamVjdGlsZTp0cnVlLGRlc2M6Itiv2YHYp9i5INiz2LHbjNi5INiv2LEg2KjYsdin2KjYsSDZhtuM2LHZiNmH2KfbjCDYstmF24zZhtuMINmIINmH2YjYp9uM24wuIn0sCiBoZWFsaW5nZ3JvdmU6e25hbWU6Itiv2LHYrtiqINi02YHYp9io2K7YtCIsaWNvbjoi8J+MsyIsdHlwZToi2LPYp9iu2KrZhdin2YYiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDo0LGhwOjY1MCxkYW1hZ2U6MCxzcGVlZDowLHJhbmdlOjQuNSxyYXRlOjEsdGFyZ2V0OiJmcmllbmRseSIsbGlmZToyOCxjb2xvcjoweDM3Yzg3YyxoZWFsOjcwLGRlc2M6Itiv2LHYrtiqINi02YHYp9io2K7YtNibINmG24zYsdmI2YfYp9uMINmH2YXigIzYqtuM2YXbjCDZhtiy2K/bjNqpINix2Kcg2KjZh+KAjNi32YjYsSDZvtuM2YjYs9iq2Ycg2K/YsdmF2KfZhiDZhduM4oCM2qnZhtivLiJ9LAogc2t5Z3VhcmRpYW46e25hbWU6ItmG2q/Zh9io2KfZhiDYotiz2YXYp9mG24wiLGljb246IvCfqr0iLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itin2YHYs9in2YbZh+KAjNin24wiLGNvc3Q6NSxocDoxMTgwLGRhbWFnZToxODUsc3BlZWQ6Mi44LHJhbmdlOjQuOCxyYXRlOjEuMSx0YXJnZXQ6ImFsbCIsY291bnQ6MSxjb2xvcjoweDhiZGZmZixhaXI6dHJ1ZSxwcm9qZWN0aWxlOnRydWUsc3BsYXNoOjEuMTUsZGVzYzoi2YXYrdin2YHYuCDZvtix2YbYr9mH4oCM2KfbjCDZgtiv2LHYqtmF2YbYryDaqdmHINio2Ycg2LLZhduM2YYg2Ygg2YfZiNinINit2YXZhNmHINmF24zigIzaqdmG2K8uIn0sCiBwaG9lbml4cXVlZW46e25hbWU6ItmF2YTaqdmHINmC2YLZhtmI2LMiLGljb246IvCflKUiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itin2YHYs9in2YbZh+KAjNin24wiLGNvc3Q6NixocDoxMzUwLGRhbWFnZToyMjAsc3BlZWQ6Mi42LHJhbmdlOjEuMjUscmF0ZToxLjI1LHRhcmdldDoiZ3JvdW5kIixjb3VudDoxLGNvbG9yOjB4ZmY4YTMyLGxhcmdlOnRydWUsZGVzYzoi2KzZhtqv2KzZiNuMINin2YHYs9in2YbZh+KAjNin24wg2KjYpyDYttix2KjZh+KAjNmH2KfbjCDYotiq2LTbjNmGLiJ9LAogdGh1bmRlcmtuaWdodDp7bmFtZToi2LTZiNin2YTbjNmHINi12KfYudmC2YciLGljb246IuKaoSIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2KfZgdiz2KfZhtmH4oCM2KfbjCIsY29zdDo1LGhwOjE0NTAsZGFtYWdlOjIwNSxzcGVlZDozLHJhbmdlOjEuMixyYXRlOjEuMDUsdGFyZ2V0OiJncm91bmQiLGNvdW50OjEsY29sb3I6MHg5ZTljZmYsbGFyZ2U6dHJ1ZSxkZXNjOiLYqNinINiz2LHYudiqINio2Ycg2K/YtNmF2YYg2YbYstiv24zaqSDZhduM4oCM2LTZiNivINmIINi22LHYqNmHINiz2Ybar9uM2YYg2YXbjOKAjNiy2YbYry4ifSwKIHJveWFsaGVhbGVyOntuYW1lOiLYr9ix2YXYp9mG2q/YsSDYs9mE2LfZhtiq24wiLGljb246IvCfkZEiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo2OTAsZGFtYWdlOjg1LHNwZWVkOjIuNyxyYW5nZTo0LjIscmF0ZToxLjEsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHhmZmRmNzYscHJvamVjdGlsZTp0cnVlLGRlc2M6Itin2LIg2YHYp9i12YTZhyDZhdiq2YjYs9i3INio2Ycg2K/YtNmF2YbYp9mGINit2YXZhNmHINmF24zigIzaqdmG2K8uIn0sCiBtZXRlb3JzdG9ybTp7bmFtZToi2KjYp9ix2LQg2LTZh9in2KgiLGljb246IvCfpoUiLHR5cGU6Itis2KfYr9mIIixyYXJpdHk6Itin2YHYs9in2YbZh+KAjNin24wiLGNvc3Q6NixkYW1hZ2U6NTEwLHJhZGl1czo0LjIsY29sb3I6MHhmZjdhMzcsZGVzYzoi2KjYp9ix2LQg2LTZh9in2Kgg2KjZhyDZhdit2K/ZiNiv2Ycg2KjYstix2q/bjCDYp9iyINmF24zYr9in2YYg2KLYs9uM2Kgg2YXbjOKAjNiy2YbYry4ifSwKIGZpcmVvcmI6e25hbWU6Itqv2YjbjCDYrtmI2LHYtNuM2K/bjCIsaWNvbjoi4piE77iPIix0eXBlOiLYrNin2K/ZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjQsZGFtYWdlOjMzMCxyYWRpdXM6My4xLGNvbG9yOjB4ZmY1OTJkLGRlc2M6ItmF2YbZgdis2LEg2YXbjOKAjNi02YjYryDZiCDYqNmHINmF2K3Yr9mI2K/ZhyDYp9i32LHYp9mBINii2LPbjNioINmF24zigIzYstmG2K8uIn0sCiB0aHVuZGVyY2hhaW46e25hbWU6Itiy2YbYrNuM2LHZhyDYt9mI2YHYp9mGIixpY29uOiLimqEiLHR5cGU6Itis2KfYr9mIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NSxkYW1hZ2U6MjYwLHJhZGl1czo0LjQsY29sb3I6MHhiZmVhZmYsZGVzYzoi2LLZhtis24zYsdmHINi32YjZgdin2YbYmyDahtmG2K8g2YfYr9mBINmG2LLYr9uM2qkg2LHYpyDYqNinINii2LPbjNioINio2LHZgiDZhduM4oCM2LLZhtivLiJ9LAogZnJvc3RzZWFsOntuYW1lOiLZhdmH2LEg24zYriIsaWNvbjoi4p2E77iPIix0eXBlOiLYrNin2K/ZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjMsZGFtYWdlOjQ1LHJhZGl1czozLjUsZHVyYXRpb246My41LGNvbG9yOjB4N2RlNmZmLGRlc2M6ItmF2YfYsSDbjNiu2Jsg2K/YtNmF2YbYp9mGINiv2KfYrtmEINmF2K3Yr9mI2K/ZhyDYsdinINio2LHYp9uMINqG2YbYryDYq9in2YbbjNmHINmF2YbYrNmF2K8g2YXbjOKAjNqp2YbYry4ifSwKIHdhcmNyeTp7bmFtZToi2YHYsduM2KfYryDYrNmG2q8iLGljb246IvCflKUiLHR5cGU6Itis2KfYr9mIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6MixkYW1hZ2U6MCxyYWRpdXM6My44LGR1cmF0aW9uOjYsY29sb3I6MHhmZjU1YzcsZGVzYzoi2YHYsduM2KfYryDYrNmG2q/YmyDYqNix2KfbjCDZhdiv2KrbjCDYs9ix2LnYqiDYrdix2qnYqiDZiCDYrdmF2YTZhyDZhtuM2LHZiNmH2KfbjCDYrtmI2K/bjCDYsdinINio2KfZhNinINmF24zigIzYqNix2K8uIn0sCiBzdG9ybWdpYW50OntuYW1lOiLYutmI2YQg2LHYudiv2KLYs9inIixpY29uOiLwn4yp77iPIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYp9mB2LPYp9mG2YfigIzYp9uMIixjb3N0OjYsaHA6MjA1MCxkYW1hZ2U6Mjg1LHNwZWVkOjIuMSxyYW5nZToxLjM1LHJhdGU6MS4zLHRhcmdldDoiZ3JvdW5kIixjb3VudDoxLGNvbG9yOjB4OGJhN2ZmLGxhcmdlOnRydWUsZGVzYzoi2LrZiNmE24wg2KjYs9uM2KfYsSDYrNin2YbigIzYs9iu2Kog2KjYpyDYttix2KjZh+KAjNmH2KfbjCDYp9mE2qnYqtix24zaqduMLiJ9LAogbW9vbnJhbmdlcjp7bmFtZToi2qnZhdin2YbYr9in2LEg2YXYp9mHIixpY29uOiLwn4yZIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYrdmF2KfYs9uMIixjb3N0OjQsaHA6NTYwLGRhbWFnZToxNTUsc3BlZWQ6My4yLHJhbmdlOjcuMixyYXRlOi45LHRhcmdldDoiYWxsIixjb3VudDoxLGNvbG9yOjB4OWJkOWZmLHByb2plY3RpbGU6dHJ1ZSxkZXNjOiLaqdmF2KfZhtiv2KfYsduMINiv2YjYsdio2LHYryDaqdmHINmG24zYsdmI2YfYp9uMINiy2YXbjNmG24wg2Ygg2YfZiNin24zbjCDYsdinINmH2K/ZgSDZhduM4oCM2q/bjNix2K8uIn0sCiBjcnlzdGFsZ29sZW06e25hbWU6Iti62YjZhCDYqNmE2YjYsduM2YYiLGljb246IvCfko4iLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itin2YHYs9in2YbZh+KAjNin24wiLGNvc3Q6NyxocDoyNjAwLGRhbWFnZToyNDAsc3BlZWQ6MS40NSxyYW5nZToxLjM1LHJhdGU6MS43LHRhcmdldDoiYnVpbGRpbmdzIixjb3VudDoxLGNvbG9yOjB4NmNlOGVmLGxhcmdlOnRydWUsZGVzYzoi2LrZiNmE24wg2LPZhtqv24zZhiDaqdmHINmF2LPYqtmC24zZhSDYs9ix2KfYuiDYs9in2K7YqtmF2KfZhuKAjNmH2Kcg2YXbjOKAjNix2YjYry4ifSwKIHN0b3JtZmFsY29uOntuYW1lOiLYtNin2YfbjNmGINiq2YjZgdin2YYiLGljb246IvCfpoUiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo2ODAsZGFtYWdlOjEzNSxzcGVlZDo0LjEscmFuZ2U6My44LHJhdGU6Ljk1LHRhcmdldDoiYWxsIixjb3VudDoyLGNvbG9yOjB4NzJkN2ZmLGFpcjp0cnVlLHByb2plY3RpbGU6dHJ1ZSxzcGxhc2g6LjY1LGRlc2M6Itiv2Ygg2b7YsdmG2K/ZhyDYs9ix24zYuSDaqdmHINin2LIg2LHZiNuMINix2YjYr9iu2KfZhtmHINm+2LHZiNin2LIg2YXbjOKAjNqp2YbZhtivLiJ9LAogcm95YWxib21iZXI6e25hbWU6Itio2YXYqOKAjNin2YbYr9in2LIg2LPZhNi32YbYqtuMIixpY29uOiLwn5KjIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjMsaHA6NDIwLGRhbWFnZToxNzUsc3BlZWQ6Mi44LHJhbmdlOjQuNSxyYXRlOjEuNCx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweGZmY2M2YSxwcm9qZWN0aWxlOnRydWUsc3BsYXNoOjEuNSxkZXNjOiLYqNmF2Kgg2b7Ysdiq2KfYqCDZhduM4oCM2qnZhtivINmIINio2Ycg2obZhtivINiv2LTZhdmGINmG2LLYr9uM2qkg2KLYs9uM2Kgg2YXbjOKAjNiy2YbYry4ifSwKIHN0b3JtcGhvZW5peDp7bmFtZToi2YLZgtmG2YjYsyDYotiw2LHYrti0IixpY29uOiLwn6q9Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYp9mB2LPYp9mG2YfigIzYp9uMIixjb3N0OjUsaHA6OTgwLGRhbWFnZToxNzAsc3BlZWQ6My44LHJhbmdlOjQuNixyYXRlOjEuMDUsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHhmZjliNDUsYWlyOnRydWUscHJvamVjdGlsZTp0cnVlLHNwbGFzaDoxLjEsZGVzYzoi2b7YsdmG2K/Zh+KAjNin24wg2KLYqti024zZhiDaqdmHINin2LIg2LHZiNuMINix2YjYr9iu2KfZhtmHINmF24zigIzar9iw2LHYryDZiCDYqNmHINiy2YXbjNmGINmIINmH2YjYpyDYrdmF2YTZhyDZhduM4oCM2qnZhtivLiJ9LAogCiBlbWJlcmRyYWtlOntuYW1lOiLYp9qY2K/Zh9in24wg2KLYsNix24zZhiIsaWNvbjoi8J+QsiIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2KfZgdiz2KfZhtmH4oCM2KfbjCIsY29zdDo2LGhwOjE0MjAsZGFtYWdlOjE5NSxzcGVlZDoyLjkscmFuZ2U6NC4yLHJhdGU6MS4yNSx0YXJnZXQ6ImFsbCIsY291bnQ6MSxjb2xvcjoweGZmNjMzZCxhaXI6dHJ1ZSxwcm9qZWN0aWxlOnRydWUsc3BsYXNoOjEuNTUsZGVzYzoi2KfamNiv2YfYp9uM24wg2b7YsdmG2K/ZhyDYqNinINmG2YHYsyDYotiq2LTbjNmGINmIINit2YXZhNmH2ZQg2YXYrdiv2YjYr9mH4oCM2KfbjC4ifSwKIGZyb3N0bWFya3NtYW46e25hbWU6Itiq24zYsdin2YbYr9in2LIg24zYrtuMIixpY29uOiLwn4+5Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYrdmF2KfYs9uMIixjb3N0OjQsaHA6NTEwLGRhbWFnZToxODUsc3BlZWQ6Mi45LHJhbmdlOjcuNixyYXRlOjEuMTUsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHg3YmU5ZmYscHJvamVjdGlsZTp0cnVlLGRlc2M6Itiq24zYsdin2YbYr9in2LIg2K/ZiNix2KjYsdivINio2LHYp9uMINmF2YLYp9io2YTZhyDYqNinINmG24zYsdmI2YfYp9uMINiy2YXbjNmG24wg2Ygg2YfZiNin24zbjC4ifSwKIHZvaWR3aXRjaDp7bmFtZToi2KzYp9iv2Yjar9ixINiu2YTYoyIsaWNvbjoi8J+foyIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2KfZgdiz2KfZhtmH4oCM2KfbjCIsY29zdDo1LGhwOjcyMCxkYW1hZ2U6MTcwLHNwZWVkOjIuOCxyYW5nZTo1LjgscmF0ZToxLjEsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHg5YjVjZmYscHJvamVjdGlsZTp0cnVlLHNwbGFzaDoxLjQ1LGRlc2M6Itqv2YjbjOKAjNmH2KfbjCDYrtmE2KMg2b7Ysdiq2KfYqCDZhduM4oCM2qnZhtivINmIINqG2YbYryDYr9i02YXZhiDYsdinINmF24zigIzYstmG2K8uIn0sCiBjcnlzdGFsd3l2ZXJuOntuYW1lOiLZiNin24zZiNix2YYg2KjZhNmI2LHbjNmGIixpY29uOiLwn5CJIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYp9mB2LPYp9mG2YfigIzYp9uMIixjb3N0OjYsaHA6MTI2MCxkYW1hZ2U6MTkwLHNwZWVkOjMuMTUscmFuZ2U6NC42LHJhdGU6MS4xNSx0YXJnZXQ6ImFsbCIsY291bnQ6MSxjb2xvcjoweDYyZmZmMCxhaXI6dHJ1ZSxwcm9qZWN0aWxlOnRydWUsc3BsYXNoOjEuNCxkZXNjOiLYp9qY2K/Zh9in24wg2KjZhNmI2LHbjNmGINm+2LHZhtiv2Ycg2KjYpyDYrdmF2YTZh9mUINmF2K3Yr9mI2K/Zh+KAjNin24wuIn0sCiByb3lhbGJhbGxpc3RhOntuYW1lOiLYqNin2YTbjNiz2KrYp9uMINiz2YTYt9mG2KrbjCIsaWNvbjoi8J+PuSIsdHlwZToi2LPYp9iu2KrZhdin2YYiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDo0LGhwOjc5MCxkYW1hZ2U6MjIwLHNwZWVkOjAscmFuZ2U6OC4yLHJhdGU6MS40LHRhcmdldDoiYWxsIixsaWZlOjM4LGNvbG9yOjB4ZDdiMzZhLHByb2plY3RpbGU6dHJ1ZSxkZXNjOiLYs9in2LLZh9mUINiv2YHYp9i524wg2K/ZiNix2KjYsdivINio2LHYp9uMINmH2K/ZgSDar9ix2YHYqtmGINmG24zYsdmI2YfYpyDZiCDYqNix2KzigIzZh9inLiJ9LAogc3VuY2xlcmljOntuYW1lOiLaqdin2YfZhiDYrtmI2LHYtNuM2K8iLGljb246IuKYgO+4jyIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDo0LGhwOjcyMCxkYW1hZ2U6MTI1LHNwZWVkOjIuNyxyYW5nZTo0LjgscmF0ZToxLjIsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHhmZmRjNzIscHJvamVjdGlsZTp0cnVlLGRlc2M6Itiv2LHZhdin2Ybar9ixINis2Ybar9is2Ygg2KjYpyDZvtix2KrZiCDZhtmI2LHYp9mG24wuIn0sCiBvYnNpZGlhbndvbGY6e25hbWU6Itqv2LHaryDYp9io2LPbjNiv24zZhiIsaWNvbjoi8J+QuiIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2KfZgdiz2KfZhtmH4oCM2KfbjCIsY29zdDo0LGhwOjgyMCxkYW1hZ2U6MjA1LHNwZWVkOjUuMixyYW5nZToxLjA1LHJhdGU6LjksdGFyZ2V0OiJncm91bmQiLGNvdW50OjEsY29sb3I6MHg1MTQ0NmYsZGVzYzoi2LTaqdin2LHahtuMINiq2YbYr9ix2Ygg2KjYpyDYrdmF2YTZh+KAjNmH2KfbjCDZvtuM2KfZvtuMLiJ9LAogZnJvc3RnaWFudDp7bmFtZToi2LrZiNmEINuM2K7YqNmG2K/Yp9mGIixpY29uOiLwn6W2Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYp9mB2LPYp9mG2YfigIzYp9uMIixjb3N0OjYsaHA6MjIwMCxkYW1hZ2U6MjI1LHNwZWVkOjEuNyxyYW5nZToxLjQscmF0ZToxLjUsdGFyZ2V0OiJncm91bmQiLGNvdW50OjEsY29sb3I6MHg4M2U4ZmYsbGFyZ2U6dHJ1ZSxkZXNjOiLYutmI2YTbjCDZhdmC2KfZiNmFINqp2Ycg2K/YtNmF2YbYp9mGINmG2LLYr9uM2qkg2LHYpyDaqdmG2K8g2YXbjOKAjNqp2YbYry4ifSwKIGFyY2FuZXByaXNtOntuYW1lOiLZhdmG2LTZiNixINis2KfYr9mI24zbjCIsaWNvbjoi8J+UtyIsdHlwZToi2LPYp9iu2KrZhdin2YYiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDo0LGhwOjY4MCxkYW1hZ2U6MTE1LHNwZWVkOjAscmFuZ2U6Ny4yLHJhdGU6LjksdGFyZ2V0OiJhbGwiLGxpZmU6MzQsY29sb3I6MHg2N2FhZmYscHJvamVjdGlsZTp0cnVlLGRlc2M6Itio2LHYrCDYrNin2K/ZiNuM24wg2KjYsdin24wg2K/Zgdin2Lkg2KfYsiDZhdiz24zYsdmH2KfbjCDZvtmELiJ9LAoKIHN1bmxpb246e25hbWU6Iti024zYsSDYrtmI2LHYtNuM2K/bjCIsaWNvbjoi8J+mgSIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2KfZgdiz2KfZhtmH4oCM2KfbjCIsY29zdDo1LGhwOjEzODAsZGFtYWdlOjIwNSxzcGVlZDozLjAscmFuZ2U6MS4yNSxyYXRlOjEuMSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweGZmYzg1NyxsYXJnZTp0cnVlLGRlc2M6Iti024zYsSDYstix2YfigIzZvtmI2LQg2KjYpyDbjNmI2LHYtCDZhtuM2LHZiNmF2YbYry4ifSwKIG1pc3R3aXRjaDp7bmFtZToi2KzYp9iv2Yjar9ixINmF2YciLGljb246IvCfjKvvuI8iLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo2ODAsZGFtYWdlOjE0NSxzcGVlZDoyLjcscmFuZ2U6NS42LHJhdGU6MS4xNSx0YXJnZXQ6ImFsbCIsY291bnQ6MSxjb2xvcjoweGE2ZDllOCxwcm9qZWN0aWxlOnRydWUsc3BsYXNoOjEuMixkZXNjOiLZhdmHINis2KfYr9mI24zbjCDYqNmHINqG2YbYryDYr9i02YXZhiDZhtiy2K/bjNqpINii2LPbjNioINmF24zigIzYstmG2K8uIn0sCiBlbWJlcmhvdW5kOntuYW1lOiLYs9qvINii2KrYtNuM2YYiLGljb246IvCfkJXigI3wn6a6Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjMsaHA6NTMwLGRhbWFnZToxMTUsc3BlZWQ6NC4yLHJhbmdlOjEscmF0ZTouOSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweGZmNmI0NSxkZXNjOiLYtNqp2KfYsdqG24wg2KrZhtiv2LHZiCDYqNinINm+2YbYrNmH4oCM2YfYp9uMINii2KrYtNuM2YYuIn0sCiBtb29ucHJpZXN0OntuYW1lOiLaqdin2YfZhiDZhdin2YciLGljb246IvCfjJkiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo2NDAsZGFtYWdlOjgwLHNwZWVkOjIuNixyYW5nZTo0LjcscmF0ZToxLjIsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHhjMmI3ZmYscHJvamVjdGlsZTp0cnVlLGRlc2M6Itm+2LHYqtmIINmF2KfZhyDYqNmHINmG24zYsdmI2YfYp9uMINiv2LTZhdmGINii2LPbjNioINmF24zigIzYstmG2K8uIn0sCiB0aG9ybmJlYXN0OntuYW1lOiLZh9uM2YjZhNin24wg2K7Yp9ixIixpY29uOiLwn4y1Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjQsaHA6MTEyMCxkYW1hZ2U6MTU1LHNwZWVkOjIuNSxyYW5nZToxLjIscmF0ZToxLjMsdGFyZ2V0OiJncm91bmQiLGNvdW50OjEsY29sb3I6MHg2NGJkNzAsbGFyZ2U6dHJ1ZSxkZXNjOiLYrNmG2q/YrNmI24wg2K7Yp9ix2K/Yp9ixINmIINmF2YLYp9mI2YUuIn0sCiBmcm9zdGZveDp7bmFtZToi2LHZiNio2KfZhyDbjNiu24wiLGljb246IvCfpooiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6MyxocDo0NjAsZGFtYWdlOjEzMCxzcGVlZDo0LjYscmFuZ2U6MSxyYXRlOi45LHRhcmdldDoiZ3JvdW5kIixjb3VudDoxLGNvbG9yOjB4OGNlYWZmLGRlc2M6Itix2YjYqNin2Ycg2LPYsduM2Lkg2qnZhyDYr9i02YXZhtin2YYg2LHYpyDYutin2YHZhNqv24zYsSDZhduM4oCM2qnZhtivLiJ9LAogaXJvbmNsYXc6e25hbWU6Itm+2YbYrNmHINii2YfZhtuM2YYiLGljb246IvCfpr4iLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itqp2YXbjNin2KgiLGNvc3Q6NCxocDo5NTAsZGFtYWdlOjE5NSxzcGVlZDoyLjUscmFuZ2U6MS4xLHJhdGU6MS4yNSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweDdmOGZhMyxsYXJnZTp0cnVlLGRlc2M6Itis2Ybar9is2YjbjCDZgdmE2LLbjCDYqNinINi22LHYqNmH4oCM2YfYp9uMINiz2Ybar9uM2YYuIn0sCiBjbG91ZHJpZGVyOntuYW1lOiLYs9mI2KfYsSDYp9io2LEiLGljb246IuKYge+4jyIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDo0LGhwOjYyMCxkYW1hZ2U6MTMwLHNwZWVkOjMuNSxyYW5nZTo0LjIscmF0ZToxLjEsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHg5ZmU4ZmYsYWlyOnRydWUscHJvamVjdGlsZTp0cnVlLGRlc2M6Itiz2YjYp9ixINm+2LHZhtiv2YfigIzYp9uMINqp2Ycg2KfYsiDYsdmI2K/Yrtin2YbZhyDZhduM4oCM2q/YsNix2K8uIn0sCiBjcnlzdGFsc3BpZGVyOntuYW1lOiLYudmG2qnYqNmI2Kog2KjZhNmI2LHbjNmGIixpY29uOiLwn5W377iPIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjMsaHA6MzgwLGRhbWFnZTo4MixzcGVlZDozLjgscmFuZ2U6MSxyYXRlOi42NSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6Myxjb2xvcjoweDYyZTVlOCxkZXNjOiLYs9mHINi52Ybaqdio2YjYqiDYqNinINmF2K/ZhCDZh9i02KrigIzZvtin2Jsg2K3ZhdmE2YfigIzZh9in24wg2b7bjNin2b7bjCDYotmG4oCM2YfYpyDYr9i02YXZhiDYsdinINio2LHYp9uMINmF2K/YqiDaqdmI2KrYp9mH24wg2qnZhtivINmF24zigIzaqdmG2K8uIn0sCiBzdW5iYWxsaXN0YTp7bmFtZToi2qnZhdin2YbigIzYs9mG2q8g2K7ZiNix2LTbjNiv24wiLGljb246IvCfj7kiLHR5cGU6Itiz2KfYrtiq2YXYp9mGIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo3NjAsZGFtYWdlOjIwNSxzcGVlZDowLHJhbmdlOjgscmF0ZToxLjM1LHRhcmdldDoiYWxsIixsaWZlOjM2LGNvbG9yOjB4ZmZkNjZkLHByb2plY3RpbGU6dHJ1ZSxkZXNjOiLYs9in2LLZh+KAjNin24wg2K/ZiNix2KjYsdivINio2LHYp9uMINiv2YHYp9i5INin2LIg2b7ZhOKAjNmH2KcuIn0sCiBoZWFsaW5nZmFpcnk6e25hbWU6Itm+2LHbjCDYr9ix2YXYp9mG2q/YsSIsaWNvbjoi8J+nmiIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDozLGhwOjQyMCxkYW1hZ2U6NDUsc3BlZWQ6My40LHJhbmdlOjMuOCxyYXRlOjEuMSx0YXJnZXQ6ImFsbCIsY291bnQ6MSxjb2xvcjoweGZmYjhlZSxwcm9qZWN0aWxlOnRydWUsaGVhbDoyOCxkZXNjOiLZvtix24wg2qnZiNqG2qnbjCDaqdmHINio2Ycg24zYp9ix2KfZhiDZhtiy2K/bjNqpINqp2YXaqSDZhduM4oCM2qnZhtivLiJ9LAogbGF2YWltcDp7bmFtZToi2KzZhiDar9iv2KfYstmHIixpY29uOiLwn5G5Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjIsaHA6MjUwLGRhbWFnZTo3OCxzcGVlZDo0LjEscmFuZ2U6MSxyYXRlOi43NSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6Mixjb2xvcjoweGZmNjEzZixkZXNjOiLYr9mIINis2YYg2qnZiNqG2qkg2Ygg2KrZh9in2KzZhduMLiJ9LAogdGh1bmRlcmJpc29uOntuYW1lOiLar9in2YjZhduM2LQg2KLYsNix2K7YtCIsaWNvbjoi8J+QgyIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2KfZgdiz2KfZhtmH4oCM2KfbjCIsY29zdDo1LGhwOjE1NjAsZGFtYWdlOjIzMCxzcGVlZDozLjQscmFuZ2U6MS4yLHJhdGU6MS4yNSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweDhmOWVmZixsYXJnZTp0cnVlLGRlc2M6Itio2Kcg24zZiNix2LQg2KfZhNqp2KrYsduM2qnbjCDYtdmBINiv2LTZhdmGINix2Kcg2YXbjOKAjNi02qnZhtivLiJ9LAogc2Vhc2VycGVudDp7bmFtZToi2YXYp9ixINiv2LHbjNin24zbjCIsaWNvbjoi8J+QjSIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2KfZgdiz2KfZhtmH4oCM2KfbjCIsY29zdDo1LGhwOjExOTAsZGFtYWdlOjE3NSxzcGVlZDozLjEscmFuZ2U6NC4yLHJhdGU6MS4xLHRhcmdldDoiYWxsIixjb3VudDoxLGNvbG9yOjB4MzJjNmNlLGFpcjp0cnVlLHByb2plY3RpbGU6dHJ1ZSxzcGxhc2g6MS4xLGRlc2M6ItmF2YjYrNmI2K/bjCDYp9mB2LPYp9mG2YfigIzYp9uMINqp2Ycg2KfYsiDYsdmI24wg2KLYqCDZhduM4oCM2q/YsNix2K8uIn0sCiBzaGFkb3dhcmNoZXI6e25hbWU6Itqp2YXYp9mG2K/Yp9ixINiz2KfbjNmHIixpY29uOiLwn4+5Iix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYrdmF2KfYs9uMIixjb3N0OjMsaHA6NDMwLGRhbWFnZToxNDgsc3BlZWQ6My4xLHJhbmdlOjcscmF0ZToxLjA1LHRhcmdldDoiYWxsIixjb3VudDoxLGNvbG9yOjB4ODA2NmJkLHByb2plY3RpbGU6dHJ1ZSxkZXNjOiLaqdmF2KfZhtiv2KfYsduMINiv2YLbjNmCINio2Kcg2KrbjNix2YfYp9uMINiz2KfbjNmH4oCM2KfbjC4ifSwKIHN0b25lYnJhd2xlcjp7bmFtZToi2YXYtNiq4oCM2LLZhiDYs9mG2q/bjCIsaWNvbjoi8J+XvyIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2qnZhduM2KfYqCIsY29zdDo0LGhwOjEyNTAsZGFtYWdlOjE4NSxzcGVlZDoyLjQscmFuZ2U6MS4xLHJhdGU6MS4zNSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweDlhOWE5YSxsYXJnZTp0cnVlLGRlc2M6ItmF2KjYp9ix2LLbjCDYs9mG2q/bjNmGINio2Kcg2YXYtNiq4oCM2YfYp9uMINmC2K/Ysdiq2YXZhtivLiJ9LAogd2luZHNwaXJpdHM6e25hbWU6Itin2LHZiNin2K0g2KjYp9ivIixpY29uOiLwn4yq77iPIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLZhdi52YXZiNmE24wiLGNvc3Q6MixocDoxODAsZGFtYWdlOjU4LHNwZWVkOjQuOCxyYW5nZTozLjgscmF0ZTouNyx0YXJnZXQ6ImFsbCIsY291bnQ6Myxjb2xvcjoweDliZThlOCxwcm9qZWN0aWxlOnRydWUsYWlyOnRydWUsZGVzYzoi2LPZhyDYsdmI2K0g2LPYqNqpINqp2Ycg2LPYsduM2Lkg2KjZhyDZhduM2K/Yp9mGINmF24zigIzYsdiz2YbYry4ifSwKIHJveWFsc2hpZWxkOntuYW1lOiLYs9m+2LEg2LPZhNi32YbYqtuMIixpY29uOiLwn5uh77iPIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLaqdmF24zYp9ioIixjb3N0OjMsaHA6ODUwLGRhbWFnZTo4NSxzcGVlZDoyLjcscmFuZ2U6MSxyYXRlOjEuMjUsdGFyZ2V0OiJncm91bmQiLGNvdW50OjEsY29sb3I6MHg3ZGI1ZTgsZGVzYzoi2YXYr9in2YHYuSDZhdmC2KfZiNmFINio2LHYp9uMINmF2K3Yp9mB2LjYqiDYp9iyINmG24zYsdmI2YfYpy4ifSwKIGNvbWV0bWFnZTp7bmFtZToi2KzYp9iv2Yjar9ixINiv2YbYqNin2YTZh+KAjNiv2KfYsSIsaWNvbjoi4piE77iPIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYp9mB2LPYp9mG2YfigIzYp9uMIixjb3N0OjUsaHA6NzMwLGRhbWFnZToxODUsc3BlZWQ6Mi43LHJhbmdlOjUuOCxyYXRlOjEuMix0YXJnZXQ6ImFsbCIsY291bnQ6MSxjb2xvcjoweGZmYTRkNSxwcm9qZWN0aWxlOnRydWUsc3BsYXNoOjEuNCxkZXNjOiLYr9mG2KjYp9mE2YfigIzYr9in2LHZh9in24wg2KzYp9iv2YjbjNuMINio2Ycg2obZhtivINmH2K/ZgSDYotiz24zYqCDZhduM4oCM2LLZhtmG2K8uIn0sCiB2aW5lZ3VhcmRpYW46e25hbWU6ItmG2q/Zh9io2KfZhiDYqtin2qnYs9iq2KfZhiIsaWNvbjoi8J+MvyIsdHlwZToi2YbbjNix2YgiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDo0LGhwOjEwODAsZGFtYWdlOjEzMCxzcGVlZDoyLjQscmFuZ2U6MS4yLHJhdGU6MS4yNSx0YXJnZXQ6Imdyb3VuZCIsY291bnQ6MSxjb2xvcjoweDU3Yzg3OCxsYXJnZTp0cnVlLGRlc2M6ItmG2q/Zh9io2KfZhiDar9uM2KfZh9uMINio2Kcg2LHbjNi02YfigIzZh9in24wg2YXZgtin2YjZhS4ifSwKIGJsaXp6YXJkOntuYW1lOiLaqdmI2YTYp9qpINuM2K7bjCIsaWNvbjoi8J+MqO+4jyIsdHlwZToi2KzYp9iv2YgiLHJhcml0eToi2K3Zhdin2LPbjCIsY29zdDo0LGRhbWFnZToxODAscmFkaXVzOjQuMyxkdXJhdGlvbjoyLjUsY29sb3I6MHg4M2VhZmYsZGVzYzoi2qnZiNmE2KfaqduMINqp2Ycg2K/YtNmF2YbYp9mGINmF2YbYt9mC2Ycg2LHYpyDaqdmG2K8g2Ygg2LLYrtmF24wg2YXbjOKAjNqp2YbYry4ifSwKIGdvbGRnb2xlbTp7bmFtZToi2LrZiNmEINiy2LHbjNmGIixpY29uOiLwn6qZIix0eXBlOiLZhtuM2LHZiCIscmFyaXR5OiLYp9mB2LPYp9mG2YfigIzYp9uMIixjb3N0OjYsaHA6MjQ1MCxkYW1hZ2U6MjE1LHNwZWVkOjEuNSxyYW5nZToxLjMscmF0ZToxLjYsdGFyZ2V0OiJidWlsZGluZ3MiLGNvdW50OjEsY29sb3I6MHhmZmQ2NWUsbGFyZ2U6dHJ1ZSxkZXNjOiLYutmI2YTbjCDYt9mE2KfbjNuMINio2Kcg2KrZiNin2YYg2KjYp9mE2KfbjCDYqtiu2LHbjNioINio2LHYrOKAjNmH2KcuIn0sCiBzdGFyZmFsY29uOntuYW1lOiLYtNin2YfbjNmGINii2LDYsduM2YYiLGljb246IvCfpoUiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo2NDAsZGFtYWdlOjE0NSxzcGVlZDo0LjIscmFuZ2U6NC40LHJhdGU6MSx0YXJnZXQ6ImFsbCIsY291bnQ6MSxjb2xvcjoweGM0YjVmZixhaXI6dHJ1ZSxwcm9qZWN0aWxlOnRydWUsZGVzYzoi2b7YsdmG2K/Zh+KAjNin24wg2LPYsduM2Lkg2KjYpyDYqtuM2LHZh9in24wg2KfZhtix2pjbjC4ifSwKIHF1YWtlOntuYW1lOiLZhNix2LLZhyDYstmF24zZhiIsaWNvbjoi8J+MiyIsdHlwZToi2KzYp9iv2YgiLHJhcml0eToi2qnZhduM2KfYqCIsY29zdDozLGRhbWFnZToyMjAscmFkaXVzOjMuOCxjb2xvcjoweGI1OGE2NyxkZXNjOiLYstmF24zZhiDYsdinINmF24zigIzZhNix2LLYp9mG2K8g2Ygg2KjZhyDZhtuM2LHZiNmH2Kcg2Ygg2LPYp9iu2KrZhdin2YbigIzZh9inINii2LPbjNioINmF24zigIzYstmG2K8uIn0sCiByb3lhbG1lZGljOntuYW1lOiLZvtiy2LTaqSDYs9mE2LfZhtiq24wiLGljb246IvCfqboiLHR5cGU6ItmG24zYsdmIIixyYXJpdHk6Itit2YXYp9iz24wiLGNvc3Q6NCxocDo3MDAsZGFtYWdlOjcwLHNwZWVkOjIuNyxyYW5nZTo0LjMscmF0ZToxLjIsdGFyZ2V0OiJhbGwiLGNvdW50OjEsY29sb3I6MHhmMGU2YzgscHJvamVjdGlsZTp0cnVlLGhlYWw6MzgsZGVzYzoi2KjZhyDbjNin2LHYp9mGINmG2LLYr9uM2qkg2qnZhdqpINmF24zigIzaqdmG2K8g2KrYpyDYqNuM2LTYqtixINiv2YjYp9mFINio24zYp9mI2LHZhtivLiJ9Cgp9OwovLyBCYWxhbmNlIG9ubHkgdW51c3VhbGx5IGZhc3QgdHJvb3BzOyBzbG93ZXIgYW5kIG5vcm1hbCBjYXJkcyByZXRhaW4gdGhlaXIgb3JpZ2luYWwgc3BlZWRzLgpPYmplY3QudmFsdWVzKENBUkRTKS5mb3JFYWNoKGM9PnsKIGlmKE51bWJlci5pc0Zpbml0ZShjLnNwZWVkKSYmYy5zcGVlZD4wKXsKICBjb25zdCBzbG93ZWQ9Yy5zcGVlZCooYy5zcGVlZD4zLjI/LjcyOi44Mik7CiAgYy5zcGVlZD1NYXRoLm1heCguODUsTWF0aC5yb3VuZChNYXRoLm1pbihzbG93ZWQsYy5zcGVlZD4zLjI/Mi44NTo5OSkqMTAwKS8xMDApOwogfQp9KTsKLy8gRGlzdGluY3QgY2FyZCBhYmlsaXRpZXMsIGNob3NlbiB0byBtYXRjaCBlYWNoIHRyb29wJ3MgdGhlbWUuCk9iamVjdC5hc3NpZ24oQ0FSRFMuc3RvbmVjb2xvc3N1cyx7c3BsYXNoOi44NSxhcm1vcjouMDh9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5pcm9uYmFzdGlvbix7c3R1bkNoYW5jZTouMDksc3R1bkR1cmF0aW9uOi40NSxhcm1vcjouMTJ9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5zaGFkZWFzc2Fzc2luLHtsaWZlc3RlYWw6LjE2fSk7Ck9iamVjdC5hc3NpZ24oQ0FSRFMucGhvZW5peHF1ZWVuLHtidXJuRHBzOjMwLGJ1cm5EdXJhdGlvbjoyLjR9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy50aHVuZGVya25pZ2h0LHtzdHVuQ2hhbmNlOi4xNixzdHVuRHVyYXRpb246LjU1fSk7Ck9iamVjdC5hc3NpZ24oQ0FSRFMuc3Rvcm1naWFudCx7c3R1bkNoYW5jZTouMTMsc3R1bkR1cmF0aW9uOi41fSk7Ck9iamVjdC5hc3NpZ24oQ0FSRFMuY3J5c3RhbHd5dmVybix7c2xvd09uSGl0OjEuMH0pOwpPYmplY3QuYXNzaWduKENBUkRTLm9ic2lkaWFud29sZix7bGlmZXN0ZWFsOi4xOH0pOwpPYmplY3QuYXNzaWduKENBUkRTLmZyb3N0Z2lhbnQse3Nsb3dPbkhpdDoxLjgsYXJtb3I6LjA4fSk7Ck9iamVjdC5hc3NpZ24oQ0FSRFMuc3VubGlvbix7YnVybkRwczoyMixidXJuRHVyYXRpb246MS44LHNwbGFzaDouNTV9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5taXN0d2l0Y2gse3Nsb3dPbkhpdDoxLjN9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5lbWJlcmhvdW5kLHtidXJuRHBzOjE4LGJ1cm5EdXJhdGlvbjoxLjV9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy50aG9ybmJlYXN0LHtzcGxhc2g6LjU1fSk7Ck9iamVjdC5hc3NpZ24oQ0FSRFMuZnJvc3Rmb3gse3Nsb3dPbkhpdDoxLjR9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5mcm9zdG1hcmtzbWFuLHtzbG93T25IaXQ6Ljl9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5jcnlzdGFsc3BpZGVyLHtzbG93T25IaXQ6Mi4yLHBvaXNvbkRwczoxMyxwb2lzb25EdXJhdGlvbjoyLjR9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5sYXZhaW1wLHtidXJuRHBzOjE2LGJ1cm5EdXJhdGlvbjoxLjZ9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy50aHVuZGVyYmlzb24se3N0dW5DaGFuY2U6LjE0LHN0dW5EdXJhdGlvbjouNX0pOwpPYmplY3QuYXNzaWduKENBUkRTLnNlYXNlcnBlbnQse3Nsb3dPbkhpdDoxLjF9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5zaGFkb3dhcmNoZXIse3BvaXNvbkRwczoyMixwb2lzb25EdXJhdGlvbjozLjB9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5zdG9uZWJyYXdsZXIse3NwbGFzaDouNjV9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5jb21ldG1hZ2Use3Nsb3dPbkhpdDouOX0pOwpPYmplY3QuYXNzaWduKENBUkRTLnZpbmVndWFyZGlhbix7c3R1bkNoYW5jZTouMTIsc3R1bkR1cmF0aW9uOi40NX0pOwpPYmplY3QuYXNzaWduKENBUkRTLnJveWFsbWVkaWMse2xpZmVzdGVhbDouMDh9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5yb3lhbHNoaWVsZCx7YXJtb3I6LjE2fSk7Ck9iamVjdC5hc3NpZ24oQ0FSRFMuZ29sZGdvbGVtLHthcm1vcjouMTR9KTsKT2JqZWN0LmFzc2lnbihDQVJEUy5ibGFkZWd1YXJkLHthcm1vcjowLjA4fSk7Cgpjb25zdCBDQVJEX0lEUz1PYmplY3Qua2V5cyhDQVJEUyk7Ci8vIFJhcml0eS1iYXNlZCBsZXZlbCBjYXBzIGFuZCByZXN0cmFpbmVkIHN0YXQgc2NhbGluZy4KY29uc3QgQ0FSRF9MRVZFTF9DQVBTPXsi2YXYudmF2YjZhNuMIjoxMCwi2qnZhduM2KfYqCI6OCwi2K3Zhdin2LPbjCI6Niwi2KfZgdiz2KfZhtmH4oCM2KfbjCI6NX07CmZ1bmN0aW9uIGNhcmRMZXZlbENhcChpZCl7cmV0dXJuIENBUkRfTEVWRUxfQ0FQU1tDQVJEU1tpZF0/LnJhcml0eV18fDU7fQpmdW5jdGlvbiBjbGFtcENhcmRMZXZlbChpZCxsZXZlbCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oY2FyZExldmVsQ2FwKGlkKSxNYXRoLmZsb29yKE51bWJlcihsZXZlbCl8fDApKSk7fQpmdW5jdGlvbiBjYXJkTGV2ZWxTY2FsZShsZXZlbCl7cmV0dXJuIDErKE1hdGgubWF4KDEsTnVtYmVyKGxldmVsKXx8MSktMSkqMC4wMjU7fQpzYXZlLmNhcmRDb3BpZXM9T2JqZWN0LmFzc2lnbih7fSxzYXZlLmNhcmRDb3BpZXN8fHt9KTtkZWxldGUgc2F2ZS5vd25lZC50aWRhbGJlYXN0O2RlbGV0ZSBzYXZlLm93bmVkLnNoYWRvd3JpZGVyO2RlbGV0ZSBzYXZlLmNhcmRDb3BpZXMudGlkYWxiZWFzdDtkZWxldGUgc2F2ZS5jYXJkQ29waWVzLnNoYWRvd3JpZGVyOwpmb3IoY29uc3QgaWQgb2YgQ0FSRF9JRFMpe3NhdmUub3duZWRbaWRdPWNsYW1wQ2FyZExldmVsKGlkLHNhdmUub3duZWRbaWRdfHwwKTtzYXZlLmNhcmRDb3BpZXNbaWRdPU1hdGgubWF4KDAsTWF0aC5mbG9vcihOdW1iZXIoc2F2ZS5jYXJkQ29waWVzW2lkXSl8fDApKTt9Ci8vIEVuc3VyZSB0aGUgc3RhcnRpbmcgZGVjayBjb250YWlucyBleGFjdGx5IHRoZSBlaWdodCBzdGFydGVyIGNhcmRzIGZvciBuZXcgcHJvZmlsZXMuCmNvbnN0IFNUQVJURVJfQ0FSRFM9WyJibGFkZWd1YXJkIiwid2luZGFyY2hlciIsInN0b25lY29sb3NzdXMiLCJzcHJpZ2dhbiIsImVtYmVybWFnZSIsInNreWRyYWtlIiwiaXJvbmJhc3Rpb24iLCJmaXJlb3JiIl07CmZvcihjb25zdCBpZCBvZiBTVEFSVEVSX0NBUkRTKXtpZighc2F2ZS5vd25lZFtpZF0pc2F2ZS5vd25lZFtpZF09MTt9CnNhdmUuZGVjaz0oQXJyYXkuaXNBcnJheShzYXZlLmRlY2spP3NhdmUuZGVjazpTVEFSVEVSX0NBUkRTKS5maWx0ZXIoKGlkLGksYSk9PkNBUkRfSURTLmluY2x1ZGVzKGlkKSYmYS5pbmRleE9mKGlkKT09PWkmJihzYXZlLm93bmVkW2lkXXx8MCk+MCkuc2xpY2UoMCw4KTsKZm9yKGNvbnN0IGlkIG9mIFNUQVJURVJfQ0FSRFMpe2lmKHNhdmUuZGVjay5sZW5ndGg8OCYmIXNhdmUuZGVjay5pbmNsdWRlcyhpZCkpc2F2ZS5kZWNrLnB1c2goaWQpO30KaWYoc2F2ZS5kZWNrLmxlbmd0aD44KXNhdmUuZGVjaz1zYXZlLmRlY2suc2xpY2UoMCw4KTsKY29uc3QgQVJFTkFTPVsKIHtuYW1lOiLYr9ix2Ycg2LLZhdix2K/bjCIsaWNvbjoi8J+MvyIsc2t5OjB4ODdjZWViLGdyYXNzOjB4MzhiODNmLHJpdmVyOjB4MzZhZWVlLHN0b25lOjB4OGI5MWExLGRlY29yOiJ0cmVlcyIsbmVlZDowLGxldmVsTmVlZDoxfSwKIHtuYW1lOiLaqdmI24zYsSDYt9mE2KfbjNuMIixpY29uOiLwn4+c77iPIixza3k6MHhmZmQzOGEsZ3Jhc3M6MHhkOWI5NmEscml2ZXI6MHg0OWM4ZGMsc3RvbmU6MHhiNzhhNTIsZGVjb3I6ImNhY3R1cyIsbmVlZDozMDAsbGV2ZWxOZWVkOjJ9LAoge25hbWU6ItmC2YTZhyDYqNmE2YjYsduM2YYiLGljb246IuKdhO+4jyIsc2t5OjB4YzdmMmZmLGdyYXNzOjB4OWJlOGRmLHJpdmVyOjB4NzJlMGYzLHN0b25lOjB4Nzg5YmFkLGRlY29yOiJpY2UiLG5lZWQ6NzAwLGxldmVsTmVlZDozfSwKIHtuYW1lOiLYr9mH2KfZhtmHINin2K7ar9ixIixpY29uOiLwn4yLIixza3k6MHgzYjI2MzIsZ3Jhc3M6MHg5ZTQ5M2Mscml2ZXI6MHhmZjRiMTgsc3RvbmU6MHgzMDI5MmQsZGVjb3I6ImxhdmEiLG5lZWQ6MTIwMCxsZXZlbE5lZWQ6NH0sCiB7bmFtZToi2KfYsdqvINio2KfYs9iq2KfZhtuMIixpY29uOiLwn4+wIixza3k6MHg5YjgyZDUsZ3Jhc3M6MHg4ZDc5YmEscml2ZXI6MHg0NzdjYjcsc3RvbmU6MHg3NzcwODAsZGVjb3I6ImNhc3RsZSIsbmVlZDoxOTAwLGxldmVsTmVlZDo1fSwKIHtuYW1lOiLYrNmG2q/ZhCDZhdmH2KrYp9io24wiLGljb246IvCfjJkiLHNreToweDE4Mjc0ZCxncmFzczoweDI0NWQ0OSxyaXZlcjoweDM5N2NiYSxzdG9uZToweDM0NGI2OCxkZWNvcjoibW9vbiIsbmVlZDoyNTAwLGxldmVsTmVlZDo2fSwKIHtuYW1lOiLYqNin2Log2LTaqdmI2YHZhyIsaWNvbjoi8J+MuCIsc2t5OjB4ZmZjOWRmLGdyYXNzOjB4ZDk4Y2FlLHJpdmVyOjB4NjRjY2UwLHN0b25lOjB4Yjk3ODk5LGRlY29yOiJjaGVycnkiLG5lZWQ6MzIwMCxsZXZlbE5lZWQ6N30sCiB7bmFtZToi2LPYp9it2YQg2YHbjNix2YjYstmH4oCM2KfbjCIsaWNvbjoi8J+Pne+4jyIsc2t5OjB4OGVlYWZmLGdyYXNzOjB4NTVjOWEyLHJpdmVyOjB4MjZiZmU1LHN0b25lOjB4ZDljMzlhLGRlY29yOiJjb3JhbCIsbmVlZDozOTAwLGxldmVsTmVlZDo4fSwKIHtuYW1lOiLYutin2LEg2qnYsduM2LPYqtin2YQiLGljb246IvCfko4iLHNreToweDZlNjVhOCxncmFzczoweDc5NjdjNyxyaXZlcjoweDQ4ZDhmMCxzdG9uZToweDY2NWI5MSxkZWNvcjoiY3J5c3RhbCIsbmVlZDo0NjAwLGxldmVsTmVlZDo5fSwKIHtuYW1lOiLYrNmG2q/ZhCDYstmF2LHYr9uMIixpY29uOiLwn4yzIixza3k6MHg3YmQ0YTEsZ3Jhc3M6MHgxNzZiMzkscml2ZXI6MHgyZGFhYTEsc3RvbmU6MHg1YTc1NWMsZGVjb3I6Imp1bmdsZSIsbmVlZDo1MzAwLGxldmVsTmVlZDoxMH0sCiB7bmFtZToi2K/YtNiqINii2KjigIzZhtio2KfYqtuMIixpY29uOiLwn42sIixza3k6MHhmZmQ3ZjQsZ3Jhc3M6MHhmMDhmYmUscml2ZXI6MHg4NmQ5Zjcsc3RvbmU6MHhkNzdiYjIsZGVjb3I6ImNhbmR5IixuZWVkOjYwMDAsbGV2ZWxOZWVkOjExfSwKIHtuYW1lOiLZvtin24zbjNiyINin2YHYs9mI2YbigIzYtNiv2YciLGljb246IvCfjYEiLHNreToweGY1YmQ4MyxncmFzczoweGM3NzkzZSxyaXZlcjoweDU0OGU5YSxzdG9uZToweDkxNjE0NCxkZWNvcjoiYXV0dW1uIixuZWVkOjY4MDAsbGV2ZWxOZWVkOjEyfSwKIHtuYW1lOiLYrNiy24zYsdmHINii2LPZhdin2YbbjCIsaWNvbjoi4piB77iPIixza3k6MHg5ZWQ4ZmYsZ3Jhc3M6MHg4M2Q3YTIscml2ZXI6MHg0YmJlZTgsc3RvbmU6MHg5YmI4ZDAsZGVjb3I6InNreSIsbmVlZDo3NjAwLGxldmVsTmVlZDoxM30sCiB7bmFtZToi2YLZhNmF2LHZiCDYs9in24zZhyIsaWNvbjoi8J+MjCIsc2t5OjB4MTcxMzJmLGdyYXNzOjB4MzQzMDRmLHJpdmVyOjB4NmIzOGE4LHN0b25lOjB4NDk0MDVmLGRlY29yOiJ2b2lkIixuZWVkOjg0MDAsbGV2ZWxOZWVkOjE0fSwKIHtuYW1lOiLYr9i02Kog2K7ZiNix2LTbjNiv24wiLGljb246IuKYgO+4jyIsc2t5OjB4ZmZlMjlhLGdyYXNzOjB4ZTBjODRmLHJpdmVyOjB4NTBjYmQxLHN0b25lOjB4Yjg5YjViLGRlY29yOiJnb2xkIixuZWVkOjkyMDAsbGV2ZWxOZWVkOjE1fSwKIHtuYW1lOiLYqNin2Log2YLYp9ix2obigIzZh9inIixpY29uOiLwn42EIixza3k6MHhiNGQ5ZmYsZ3Jhc3M6MHg2ZWFlNjIscml2ZXI6MHg1NmI4ZDYsc3RvbmU6MHg4YTdjYTIsZGVjb3I6Im11c2hyb29tIixuZWVkOjEwMDAwLGxldmVsTmVlZDoxNn0sCiB7bmFtZToi24zYrtqG2KfZhCDYtNmB2YIiLGljb246IvCfjIgiLHNreToweDI2M2Y3OSxncmFzczoweDU1YjZhZCxyaXZlcjoweDhiZGJmZixzdG9uZToweDdkOWRkMixkZWNvcjoiYXVyb3JhIixuZWVkOjExMDAwLGxldmVsTmVlZDoxN30sCiB7bmFtZToi2YXYudio2K8g2KfZgtuM2KfZhtmI2LMiLGljb246IvCfkJoiLHNreToweDYzYzllOSxncmFzczoweDI5OWE5YSxyaXZlcjoweDEyNmRkMSxzdG9uZToweDZkYjhiZCxkZWNvcjoib2NlYW4iLG5lZWQ6MTIwMDAsbGV2ZWxOZWVkOjE4fSwKIHtuYW1lOiLZiNin2K/bjCDYotiw2LHYrti0IixpY29uOiLimqEiLHNreToweDQ3NGI3MixncmFzczoweDZkOGY1OCxyaXZlcjoweDdmOGZmZixzdG9uZToweDc3N2U5ZSxkZWNvcjoic3Rvcm0iLG5lZWQ6MTMwMDAsbGV2ZWxOZWVkOjE5fSwKIHtuYW1lOiLYotix2ZDZhtin24wg2KfZgdiz2KfZhtmH4oCM2YfYpyIsaWNvbjoi8J+RkSIsc2t5OjB4MmQyMDU3LGdyYXNzOjB4NTViODZiLHJpdmVyOjB4ZTBhYWZmLHN0b25lOjB4YzVhNGVmLGRlY29yOiJsZWdlbmQiLG5lZWQ6MTQwMDAsbGV2ZWxOZWVkOjIwfSwKCiB7bmFtZToi2K/YsdmHINin2pjYr9mH2KciLGljb246IvCfkIkiLHNreToweDZhMzU0YyxncmFzczoweGI4NWE0MyxyaXZlcjoweGZmNzk1YixzdG9uZToweDc4NDY1YixkZWNvcjoiZHJhZ29uIixuZWVkOjE1MDAwLGxldmVsTmVlZDoyMX0sCiB7bmFtZToi2KjZhtiv2LEg2K/Ystiv2KfZhiIsaWNvbjoi8J+PtOKAjeKYoO+4jyIsc2t5OjB4NTA3YjljLGdyYXNzOjB4OTg3YjRmLHJpdmVyOjB4MjY3YWIwLHN0b25lOjB4NWM2NDc2LGRlY29yOiJwaXJhdGUiLG5lZWQ6MTYwMDAsbGV2ZWxOZWVkOjIyfSwKIHtuYW1lOiLaqdin2LHYrtin2YbZhyDYsdio2KfYquKAjNmH2KciLGljb246IvCfpJYiLHNreToweDU5NjU3OSxncmFzczoweDcyN2M4YixyaXZlcjoweDIyYzZjZixzdG9uZToweDQwNGQ2MCxkZWNvcjoicm9ib3QiLG5lZWQ6MTcwMDAsbGV2ZWxOZWVkOjIzfSwKIHtuYW1lOiLZgtmE2YXYsdmIINii2KjZhtmI2LPbjCIsaWNvbjoi8J+WpCIsc2t5OjB4MTcxNTFmLGdyYXNzOjB4MzYzMDNmLHJpdmVyOjB4NWMzYjc0LHN0b25lOjB4MjkyNDMxLGRlY29yOiJvYnNpZGlhbiIsbmVlZDoxODAwMCxsZXZlbE5lZWQ6MjR9LAoge25hbWU6Itii2LHZkNmG2KfbjCDYsdi52K8iLGljb246IvCfjKnvuI8iLHNreToweDM0NDY2ZCxncmFzczoweDcxODRjNCxyaXZlcjoweDhjY2ZmZixzdG9uZToweDViNjc5MCxkZWNvcjoidGh1bmRlciIsbmVlZDoxOTAwMCxsZXZlbE5lZWQ6MjV9LAoge25hbWU6Itio2KfYuiDYqNmE2YjYsdmH2KfbjCDYtdmI2LHYqtuMIixpY29uOiLwn4y3Iixza3k6MHhmZmQ3ZWYsZ3Jhc3M6MHhkMThmYzYscml2ZXI6MHg4NmU1ZjUsc3RvbmU6MHhiODdkYTksZGVjb3I6InBpbmtjcnlzdGFsIixuZWVkOjIwMDAwLGxldmVsTmVlZDoyNn0sCiB7bmFtZToi2YXYsdiv2KfYqCDYp9iz2LHYp9ix2KLZhduM2LIiLGljb246IvCfkLgiLHNreToweDM1NWM1NSxncmFzczoweDQ5N2U1NSxyaXZlcjoweDViOWI3ZCxzdG9uZToweDUzNmQ1OSxkZWNvcjoic3dhbXAiLG5lZWQ6MjEwMDAsbGV2ZWxOZWVkOjI3fSwKIHtuYW1lOiLZgtmE2Ycg2KfYqNix2YfYpyIsaWNvbjoi4puw77iPIixza3k6MHhiY2U2ZmYsZ3Jhc3M6MHg3ZGI4YTEscml2ZXI6MHg2YWM4ZWQsc3RvbmU6MHg5ZGFlYmYsZGVjb3I6ImNsb3VkcGVhayIsbmVlZDoyMjAwMCxsZXZlbE5lZWQ6Mjh9LAoge25hbWU6ItmF2LnYqNivINiu2YjYsdi024zYryIsaWNvbjoi8J+MniIsc2t5OjB4ZmZlOGEwLGdyYXNzOjB4ZDJhZDQyLHJpdmVyOjB4NGVjN2QwLHN0b25lOjB4Yzc5YTU0LGRlY29yOiJzdW50ZW1wbGUiLG5lZWQ6MjMwMDAsbGV2ZWxOZWVkOjI5fSwKIHtuYW1lOiLar9iw2LHar9in2Ycg2LTZh9in2KjigIzZh9inIixpY29uOiLimITvuI8iLHNreToweDIxMWI0NixncmFzczoweDQ5NDc3ZixyaXZlcjoweDdiNzlmZixzdG9uZToweDRhNDI2ZixkZWNvcjoibWV0ZW9yIixuZWVkOjI0MDAwLGxldmVsTmVlZDozMH0sCiB7bmFtZToi2KzZhtqv2YQg2KjZhNmI2LEg2KLYqNuMIixpY29uOiLwn6eKIixza3k6MHg4ZWRkZjQsZ3Jhc3M6MHg0Y2E5YzMscml2ZXI6MHgyYzkxZDQsc3RvbmU6MHg3MTljYmEsZGVjb3I6ImJsdWVjcnlzdGFsIixuZWVkOjI1MDAwLGxldmVsTmVlZDozMX0sCiB7bmFtZToi2KLYsdmQ2YbYp9uMINii2KrYtNmB2LTYp9mGINiz2LHYriIsaWNvbjoi8J+UpSIsc2t5OjB4M2IxNzI0LGdyYXNzOjB4OTYzYzMyLHJpdmVyOjB4ZmY1NTJhLHN0b25lOjB4NTQyYjM1LGRlY29yOiJyZWR2b2xjYW5vIixuZWVkOjI2MDAwLGxldmVsTmVlZDozMn0sCiB7bmFtZToi2LTZh9ixINi32YTYp9uM24wiLGljb246IvCfj5nvuI8iLHNreToweDZmOWVkMSxncmFzczoweDhlYWY2MCxyaXZlcjoweDQyYjVjZixzdG9uZToweGM0YTE1ZSxkZWNvcjoiZ29sZGNpdHkiLG5lZWQ6MjcwMDAsbGV2ZWxOZWVkOjMzfSwKIHtuYW1lOiLZgti12LEg24zYrtuMIixpY29uOiLwn4+vIixza3k6MHhkNWY1ZmYsZ3Jhc3M6MHg4Y2M5ZGMscml2ZXI6MHg4ZGVhZmYsc3RvbmU6MHg5ZGJlZDQsZGVjb3I6ImljZXBhbGFjZSIsbmVlZDoyODAwMCxsZXZlbE5lZWQ6MzR9LAoge25hbWU6Itis2LLbjNix2Ycg2YXYsdis2KfZhtuMIixpY29uOiLwn6q4Iixza3k6MHg4MmU2ZjEsZ3Jhc3M6MHg1YmM5YTYscml2ZXI6MHgxNDk4Yzksc3RvbmU6MHhlMGE3OGIsZGVjb3I6InJlZWYiLG5lZWQ6MjkwMDAsbGV2ZWxOZWVkOjM1fSwKIHtuYW1lOiLYotix2ZDZhtin24wg2LTZgdmCINmC2LfYqNuMIixpY29uOiLwn4yMIixza3k6MHgyNjNlNzgsZ3Jhc3M6MHgzOThhOGIscml2ZXI6MHg3MmQ2ZmYsc3RvbmU6MHg2MjZmYjEsZGVjb3I6ImF1cm9yYWZpbmFsIixuZWVkOjMwMDAwLGxldmVsTmVlZDozNn0sCiB7bmFtZToi2qnYqtin2KjYrtin2YbZhyDYrNin2K/ZiCIsaWNvbjoi8J+TmiIsc2t5OjB4NTQ0MzZmLGdyYXNzOjB4Njg3ZjY1LHJpdmVyOjB4N2M3NGQ2LHN0b25lOjB4OGI3NTljLGRlY29yOiJtYWdpY2xpYnJhcnkiLG5lZWQ6MzEwMDAsbGV2ZWxOZWVkOjM3fSwKIHtuYW1lOiLYotix2ZDZhtin24wg2LPYp9i52Kog2LTZhtuMIixpY29uOiLijJsiLHNreToweGQ5YTc3YyxncmFzczoweGI0YTM1YyxyaXZlcjoweDRiYTliYyxzdG9uZToweDhjNzE1ZCxkZWNvcjoiaG91cmdsYXNzIixuZWVkOjMyMDAwLGxldmVsTmVlZDozOH0sCiB7bmFtZToi2YLZhNmF2LHZiCDaqdix24zYs9iq2KfZhCDYs9uM2KfZhyIsaWNvbjoi8J+UriIsc2t5OjB4MjExYjM1LGdyYXNzOjB4NDUzNDVlLHJpdmVyOjB4OWM1OWQ2LHN0b25lOjB4MzAyODQyLGRlY29yOiJibGFja2NyeXN0YWwiLG5lZWQ6MzMwMDAsbGV2ZWxOZWVkOjM5fSwKIHtuYW1lOiLYr9ix2YjYp9iy2Ycg2LPYqtin2LHar9in2YYiLGljb246IvCfjKAiLHNreToweDEwMWE0MixncmFzczoweDJkNGU3YixyaXZlcjoweDdhOWNmZixzdG9uZToweDNiNDc3MyxkZWNvcjoic3RhcmdhdGUiLG5lZWQ6MzQwMDAsbGV2ZWxOZWVkOjQwfSwKIHtuYW1lOiLYqNin2Log2KfamNiv2YfYp9uMINi32YTYp9uM24wiLGljb246IvCfkLIiLHNreToweDhhYzlhMyxncmFzczoweDM5OTk1ZCxyaXZlcjoweDM1YjZjYyxzdG9uZToweDlhODY1NCxkZWNvcjoiZ29sZGRyYWdvbiIsbmVlZDozNTAwMCxsZXZlbE5lZWQ6NDF9LAoge25hbWU6Itiv2pgg2LTZiNin2YTbjNmH4oCM2YfYpyIsaWNvbjoi8J+boe+4jyIsc2t5OjB4OGJiMGQ0LGdyYXNzOjB4NmU5ODU5LHJpdmVyOjB4M2Y5YWM3LHN0b25lOjB4Nzc3ZDhjLGRlY29yOiJrbmlnaHRmb3J0IixuZWVkOjM2MDAwLGxldmVsTmVlZDo0Mn0sCiB7bmFtZToi2K/YsdmHINio2YbZgdi0IixpY29uOiLwn5KcIixza3k6MHhiOWEwZWYsZ3Jhc3M6MHg2ZDU5YTYscml2ZXI6MHg1ZGE2ZWMsc3RvbmU6MHg3NTY0OWUsZGVjb3I6InB1cnBsZXZhbGxleSIsbmVlZDozNzAwMCxsZXZlbE5lZWQ6NDN9LAoge25hbWU6Itii2LHZkNmG2KfbjCDYs9iq2KfYsdmHINiv2YbYqNin2YTZh+KAjNiv2KfYsSIsaWNvbjoi8J+MnyIsc2t5OjB4MTcyZTU1LGdyYXNzOjB4M2U3YjZkLHJpdmVyOjB4NjdkOWYyLHN0b25lOjB4NWE2ZTg5LGRlY29yOiJjb21ldCIsbmVlZDozODAwMCxsZXZlbE5lZWQ6NDR9LAoge25hbWU6ItmC2YTZhdix2Ygg2LLZhdix2K8g2KjYp9iz2KrYp9mG24wiLGljb246IvCfkpoiLHNreToweDQxN2E2OCxncmFzczoweDIzODA0YixyaXZlcjoweDNmZDJhMCxzdG9uZToweDRiN2M2MCxkZWNvcjoiYW5jaWVudGVtZXJhbGQiLG5lZWQ6MzkwMDAsbGV2ZWxOZWVkOjQ1fSwKIHtuYW1lOiLYotix2ZDZhtin24wg2YLZgtmG2YjYsyIsaWNvbjoi8J+mhSIsc2t5OjB4NmIyZTRkLGdyYXNzOjB4Yzc1ZDQ1LHJpdmVyOjB4ZmZiMzQ3LHN0b25lOjB4ODY1MzViLGRlY29yOiJwaG9lbml4IixuZWVkOjQwMDAwLGxldmVsTmVlZDo0Nn0sCiB7bmFtZToi2LPYsdiy2YXbjNmGINmF2KfZhyDYotio24wiLGljb246IvCfjJkiLHNreToweDI2M2I3MCxncmFzczoweDQ3N2Q5ZCxyaXZlcjoweDcxY2ZmZixzdG9uZToweDYyN2VhYSxkZWNvcjoiYmx1ZW1vb24iLG5lZWQ6NDEwMDAsbGV2ZWxOZWVkOjQ3fSwKIHtuYW1lOiLZgti12LEg2KLbjNmG2YfigIzZh9inIixpY29uOiLwn6qeIixza3k6MHhhOGM2ZGIsZ3Jhc3M6MHg4ZmI3Yjcscml2ZXI6MHg3ZmU1ZWYsc3RvbmU6MHhhMmFlYmYsZGVjb3I6Im1pcnJvciIsbmVlZDo0MjAwMCxsZXZlbE5lZWQ6NDh9LAoge25hbWU6Itm+2KfbjNin2YYg2KfZgdiz2KfZhtmHIixpY29uOiLwn4+GIixza3k6MHgzOTIwNWQsZ3Jhc3M6MHg1NmJiNzkscml2ZXI6MHhmNmQ0NmIsc3RvbmU6MHhjM2E0ZWYsZGVjb3I6ImZpbmFsbGVnZW5kIixuZWVkOjQzMDAwLGxldmVsTmVlZDo0OX0sCiB7bmFtZToi2KLYsdmQ2YbYp9uMINm+2KfYr9i02KfZh9in2YYg2YbZj9mI2KciLGljb246IvCfkZEiLHNreToweDEyMGUyZSxncmFzczoweDM4Yjg3MyxyaXZlcjoweDQ5ZDdmZixzdG9uZToweGZmZDc2YixkZWNvcjoibm92YWtpbmdzIixuZWVkOjQ0MDAwLGxldmVsTmVlZDo1MH0KXTsKCi8vIFBsYXllciBsZXZlbCB1bmxvY2tzIGEgbmV3IHRoZW1lZCBhcmVuYSBhdCBldmVyeSBsZXZlbCAodXAgdG8gbGV2ZWwgNTApLgpBUkVOQVMuZm9yRWFjaCgoYSxpKT0+e2lmKHNhdmUubGV2ZWw+PWEubGV2ZWxOZWVkfHxzYXZlLnRyb3BoaWVzPj1hLm5lZWQpc2F2ZS5hcmVuYT1NYXRoLm1heChzYXZlLmFyZW5hLGkpfSk7CnNhdmUuYXJlbmE9TWF0aC5taW4oc2F2ZS5hcmVuYSxBUkVOQVMubGVuZ3RoLTEpOwoKLyogLS0tLS0tLS0tLSBQcm9jZWR1cmFsIEF1ZGlvIC0tLS0tLS0tLS0gKi8KY29uc3QgQXVkaW9TeXM9ewogY3R4Om51bGwsbXVzaWNUaW1lcjpudWxsLAogaW5pdCgpewogIGlmKCF0aGlzLmN0eCl0aGlzLmN0eD1uZXcgKHdpbmRvdy5BdWRpb0NvbnRleHR8fHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKCk7CiAgaWYodGhpcy5jdHguc3RhdGU9PT0ic3VzcGVuZGVkIil0aGlzLmN0eC5yZXN1bWUoKTsKIH0sCiB0b25lKGZyZXE9NDQwLGQ9LjA4LHR5cGU9InNpbmUiLHZvbD0uMSxzbGlkZT0wKXsKICBpZighc2F2ZS5zZngpcmV0dXJuO3RoaXMuaW5pdCgpOwogIGNvbnN0IG89dGhpcy5jdHguY3JlYXRlT3NjaWxsYXRvcigpLGc9dGhpcy5jdHguY3JlYXRlR2FpbigpLHQ9dGhpcy5jdHguY3VycmVudFRpbWU7CiAgby50eXBlPXR5cGU7by5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUoZnJlcSx0KTtvLmZyZXF1ZW5jeS5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKE1hdGgubWF4KDMwLGZyZXErc2xpZGUpLHQrZCk7CiAgZy5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCpzYXZlLnNmeCx0KTtnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSguMDAwMSx0K2QpOwogIG8uY29ubmVjdChnKS5jb25uZWN0KHRoaXMuY3R4LmRlc3RpbmF0aW9uKTtvLnN0YXJ0KHQpO28uc3RvcCh0K2QpOwogfSwKIGNsaWNrKCl7dGhpcy50b25lKDQ1MCwuMDUsInNxdWFyZSIsLjA2LDkwKX0sZGVwbG95KCl7dGhpcy50b25lKDIyMCwuMTgsInNpbmUiLC4xMywzODApfSwKIGhpdCgpe3RoaXMudG9uZSgxMDAsLjA2LCJzcXVhcmUiLC4wNywtMzUpfSxzaG9vdCgpe3RoaXMudG9uZSg1NTAsLjA3LCJ0cmlhbmdsZSIsLjA1LC0yMjApfSwKIGJvb20oKXt0aGlzLnRvbmUoOTAsLjM1LCJzYXd0b290aCIsLjE2LC01NSl9LHdpbigpe1s1MjMsNjU5LDc4NCwxMDQ3XS5mb3JFYWNoKChuLGkpPT5zZXRUaW1lb3V0KCgpPT50aGlzLnRvbmUobiwuMjgsInRyaWFuZ2xlIiwuMTMpLGkqMTMwKSl9LAogbG9zZSgpe1szMDAsMjUwLDE5MF0uZm9yRWFjaCgobixpKT0+c2V0VGltZW91dCgoKT0+dGhpcy50b25lKG4sLjQsInNhd3Rvb3RoIiwuMDkpLGkqMjAwKSl9LAogbXVzaWMoKXsKICBjbGVhckludGVydmFsKHRoaXMubXVzaWNUaW1lcik7aWYoIXNhdmUubXVzaWMpcmV0dXJuO3RoaXMuaW5pdCgpOwogIGxldCBpPTAsc2VxPVsxMzAsMTY0LDE5NiwyMjAsMTk2LDE2NCwxNDcsMTc0XTsKICB0aGlzLm11c2ljVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnsKICAgY29uc3Qgb2xkPXNhdmUuc2Z4O3NhdmUuc2Z4PXNhdmUubXVzaWM7CiAgIHRoaXMudG9uZShzZXFbaSsrJXNlcS5sZW5ndGhdLC40NSwidHJpYW5nbGUiLC4wNDUpOwogICBzYXZlLnNmeD1vbGQ7CiAgfSw2MDApOwogfSwKIHN0b3AoKXtjbGVhckludGVydmFsKHRoaXMubXVzaWNUaW1lcil9Cn07CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwoKT0+QXVkaW9TeXMuaW5pdCgpLHtvbmNlOnRydWV9KTsKCi8qIC0tLS0tLS0tLS0gTWVudXMgLS0tLS0tLS0tLSAqLwpsZXQgY3VycmVudFBhZ2U9ImhvbWUiOwpmdW5jdGlvbiBjYXJkSFRNTChpZCxjb21wYWN0PWZhbHNlKXsKIGNvbnN0IGM9Q0FSRFNbaWRdLGx2PXNhdmUub3duZWRbaWRdfHwwLGNhcD1jYXJkTGV2ZWxDYXAoaWQpLGNvcGllcz1zYXZlLmNhcmRDb3BpZXNbaWRdfHwwOwogcmV0dXJuIGA8ZGl2IGNsYXNzPSJjYXJkICR7Yy5yYXJpdHl9ICR7bHY/IiI6ImxvY2tlZCJ9IiBkYXRhLWNhcmQ9IiR7aWR9Ij4KIDxkaXYgY2xhc3M9ImNvc3QiPiR7Yy5jb3N0fTwvZGl2PjxkaXYgY2xhc3M9ImxldmVsIj5MViAke2x2fHwi8J+UkiJ9JHtsdj9gLyR7Y2FwfWA6IiJ9PC9kaXY+CiA8ZGl2IGNsYXNzPSJjYXJkLWljb24iPiR7Yy5pY29ufTwvZGl2PjxkaXYgY2xhc3M9ImNhcmQtbmFtZSI+JHtjLm5hbWV9PC9kaXY+CiA8ZGl2IGNsYXNzPSJjYXJkLW1ldGEiPiR7Yy50eXBlfSDCtyAke2MucmFyaXR5fTxicj7Zhtiz2K7Zh+KAjNmH2Kc6ICR7Y29waWVzfSR7Y29tcGFjdD8iIjpgPGJyPiR7Yy5kZXNjfWB9PC9kaXY+PC9kaXY+YDsKfQpmdW5jdGlvbiByZW5kZXJQYWdlKHBhZ2U9Y3VycmVudFBhZ2UpewogY3VycmVudFBhZ2U9cGFnZTskJCgiLm5hdmJ0biIpLmZvckVhY2goYj0+Yi5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiLGIuZGF0YXNldC5wYWdlPT09cGFnZSkpOwogY29uc3Qgcm9vdD0kKCIjbWVudUNvbnRlbnQiKTsKIGlmKHBhZ2U9PT0iaG9tZSIpewogIGNvbnN0IGE9QVJFTkFTW3NhdmUuYXJlbmFdOwogIHJvb3QuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJob21lLWdyaWQiPgogICA8ZGl2IGNsYXNzPSJnbGFzcyBzaWRlLXBhbmVsIj48aDM+2YXYs9uM2LEg2YHYtdmEPC9oMz4KICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTo1NXB4Ij7wn4+GPC9kaXY+PGI+JHtzYXZlLnRyb3BoaWVzfSDYrNin2YU8L2I+CiAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcyIgc3R5bGU9Im1hcmdpbjoxMnB4Ij48aSBzdHlsZT0id2lkdGg6JHtzYXZlLnRyb3BoaWVzJTMwMC8zfSUiPjwvaT48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InN0YXQtcm93Ij48c3Bhbj7YqNix2K/Zh9inPC9zcGFuPjxiPiR7c2F2ZS53aW5zfTwvYj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InN0YXQtcm93Ij48c3Bhbj7aqdin2LHYquKAjNmH2Kc8L3NwYW4+PGI+JHtPYmplY3Qua2V5cyhzYXZlLm93bmVkKS5sZW5ndGh9LyR7Q0FSRF9JRFMubGVuZ3RofTwvYj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InN0YXQtcm93Ij48c3Bhbj7Yotix2ZDZhtin24wg2KjYudiv24w8L3NwYW4+PGI+JHtBUkVOQVNbc2F2ZS5hcmVuYSsxXT8i2LPYt9itICIrQVJFTkFTW3NhdmUuYXJlbmErMV0ubGV2ZWxOZWVkOiLYrdiv2Kfaqdir2LEifTwvYj48L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgY2xhc3M9ImdsYXNzIGFyZW5hLWNhcmQiPgogICAgPGRpdj48aDEgY2xhc3M9ImdhbWUtdGl0bGUiPtin2YHYs9in2YbZh+KAjNin24wgPHNwYW4+2LHZgtio2Kc8L3NwYW4+PC9oMT4KICAgIDxkaXYgY2xhc3M9ImFyZW5hLWFydCI+JHthLmljb259PC9kaXY+PGgyPiR7YS5uYW1lfTwvaDI+PHNtYWxsPtii2YXYp9iv2YfZlCDZhtio2LHYryDYr9ixINii2LHZhtinPC9zbWFsbD48L2Rpdj4KICAgIDxidXR0b24gY2xhc3M9ImJ0biBnb2xkIHBsYXktbWFpbiIgaWQ9ImJhdHRsZUJ0biI+4pqUINmG2KjYsdivPC9idXR0b24+CiAgIDwvZGl2PgogICA8ZGl2IGNsYXNzPSJnbGFzcyBzaWRlLXBhbmVsIj48aDM+2K/Ys9iq2Ycg2qnYp9ix2KrigIzZh9inPC9oMz4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDQsMWZyKTtnYXA6NXB4Ij4KICAgICAke3NhdmUuZGVjay5zbGljZSgwLDgpLm1hcChpZD0+YDxkaXYgdGl0bGU9IiR7Q0FSRFNbaWRdLm5hbWV9IiBzdHlsZT0iZm9udC1zaXplOjMwcHg7YmFja2dyb3VuZDojMTAxYTNkO3BhZGRpbmc6N3B4O2JvcmRlci1yYWRpdXM6OXB4Ij4ke0NBUkRTW2lkXS5pY29ufTwvZGl2PmApLmpvaW4oIiIpfQogICAgPC9kaXY+PHA+2YXbjNin2Ybar9uM2YYg2Kfaqdiz24zYsTwvcD48aDI+8J+SpyAkeyhzYXZlLmRlY2sucmVkdWNlKChzLGlkKT0+cytDQVJEU1tpZF0uY29zdCwwKS84KS50b0ZpeGVkKDEpfTwvaDI+CiAgICA8bGFiZWw+2K/Ysdis2Ycg2LPYrtiq24wg2K3YsduM2YE8L2xhYmVsPjxzZWxlY3QgaWQ9ImRpZmZpY3VsdHkiIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjEwcHg7YmFja2dyb3VuZDojMGIxNDMzO2NvbG9yOndoaXRlIj4KICAgICAke1si2KLYs9in2YYiLCLZhdi52YXZiNmE24wiLCLYs9iu2KoiXS5tYXAoeD0+YDxvcHRpb24gJHtzYXZlLmRpZmZpY3VsdHk9PT14PyJzZWxlY3RlZCI6IiJ9PiR7eH08L29wdGlvbj5gKS5qb2luKCIiKX0KICAgIDwvc2VsZWN0PgogICA8L2Rpdj48L2Rpdj4KICAgPGRpdiBjbGFzcz0iZ2xhc3MgcGFuZWwtcGFnZSIgc3R5bGU9Im1hcmdpbi10b3A6MTRweDt0ZXh0LWFsaWduOmNlbnRlciI+CiAgICA8aDMgc3R5bGU9Im1hcmdpbi10b3A6MCI+8J+knSDYqNin2LLbjCDYqNinINqp2K8g2K/ZiNiz2Ko8L2gzPgogICAgPGJ1dHRvbiBjbGFzcz0iYnRuIHRlYWwiIGlkPSJjcmVhdGVSb29tQnRuIiBzdHlsZT0id2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjEwcHgiPtiz2KfYrtiqINqv2LHZiNmHPC9idXR0b24+CiAgICA8ZGl2IGlkPSJyb29tQ29kZUJveCIgY2xhc3M9ImhpZGRlbiIgc3R5bGU9InBhZGRpbmc6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7YmFja2dyb3VuZDojMTAxYTNkO2JvcmRlci1yYWRpdXM6MTBweCI+CiAgICAgPGRpdiBpZD0icm9vbUNvZGVWYWx1ZSIgc3R5bGU9ImZvbnQtc2l6ZToyNnB4O2ZvbnQtd2VpZ2h0OjkwMDtsZXR0ZXItc3BhY2luZzozcHg7ZGlyZWN0aW9uOmx0ciI+PC9kaXY+CiAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIiBpZD0iY29weVJvb21Db2RlQnRuIiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPtqp2b7bjCDaqdivPC9idXR0b24+CiAgICA8L2Rpdj4KICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246cmlnaHQ7bWFyZ2luOjZweCAwIDVweDtmb250LXNpemU6MTNweCI+2qnYryDar9ix2YjZhyDYqNix2KfbjCDZiNix2YjYrzwvZGl2PgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyIj4KICAgICA8aW5wdXQgaWQ9ImpvaW5Sb29tQ29kZSIgbWF4bGVuZ3RoPSI5IiBwbGFjZWhvbGRlcj0i2qnYryDar9ix2YjZhyIgYXV0b2NvbXBsZXRlPSJvZmYiIGF1dG9jYXBpdGFsaXplPSJjaGFyYWN0ZXJzIiBzdHlsZT0ibWluLXdpZHRoOjA7ZmxleDoxO3BhZGRpbmc6MTJweDtib3JkZXItcmFkaXVzOjEwcHg7YmFja2dyb3VuZDojMGIxNDMzO2NvbG9yOndoaXRlO2JvcmRlcjoxcHggc29saWQgIzY0NzdhODt0ZXh0LWFsaWduOmNlbnRlcjtkaXJlY3Rpb246bHRyO2ZvbnQtd2VpZ2h0OjgwMCI+CiAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGdvbGQiIGlkPSJqb2luUm9vbUJ0biI+2YjYsdmI2K8g2KjZhyDar9ix2YjZhzwvYnV0dG9uPgogICAgPC9kaXY+CiAgIDwvZGl2PmA7CiAgJCgiI2JhdHRsZUJ0biIpLm9uY2xpY2s9KCk9PnJlbmRlclBhZ2UoImRlY2siKTsKICAkKCIjZGlmZmljdWx0eSIpLm9uY2hhbmdlPWU9PntzYXZlLmRpZmZpY3VsdHk9ZS50YXJnZXQudmFsdWU7cGVyc2lzdCgpfTsKICAkKCIjY3JlYXRlUm9vbUJ0biIpLm9uY2xpY2s9Y3JlYXRlTm92YVJvb207CiAgJCgiI2pvaW5Sb29tQnRuIikub25jbGljaz0oKT0+am9pbk5vdmFSb29tKCQoIiNqb2luUm9vbUNvZGUiKS52YWx1ZSk7CiAgJCgiI2NvcHlSb29tQ29kZUJ0biIpLm9uY2xpY2s9YXN5bmMoKT0+e2NvbnN0IGNvZGU9JCgiI3Jvb21Db2RlVmFsdWUiKS50ZXh0Q29udGVudC50cmltKCk7aWYoIWNvZGUpe3RvYXN0KCLZh9mG2YjYsiDaqdiv24wg2LPYp9iu2KrZhyDZhti02K/ZhyEiKTtyZXR1cm59dHJ5e2lmKG5hdmlnYXRvci5jbGlwYm9hcmQmJndpbmRvdy5pc1NlY3VyZUNvbnRleHQpe2F3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvZGUpO3RvYXN0KCLaqdivINqv2LHZiNmHINqp2b7bjCDYtNivISIpO3JldHVybn19Y2F0Y2goZSl7fWxldCBjb3BpZWQ9ZmFsc2U7Y29uc3QgdGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTt0YS52YWx1ZT1jb2RlO3RhLnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKTt0YS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RhLnN0eWxlLm9wYWNpdHk9IjAiO3RhLnN0eWxlLmxlZnQ9Ii05OTk5cHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpO3RhLmZvY3VzKCk7dGEuc2VsZWN0KCk7dGEuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0YS52YWx1ZS5sZW5ndGgpO3RyeXtjb3BpZWQ9ZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKX1jYXRjaChlKXt9dGEucmVtb3ZlKCk7aWYoY29waWVkKXt0b2FzdCgi2qnYryDar9ix2YjZhyDaqdm+24wg2LTYryEiKX1lbHNle3RyeXtpZihuYXZpZ2F0b3IuY2xpcGJvYXJkKXthd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb2RlKTt0b2FzdCgi2qnYryDar9ix2YjZhyDaqdm+24wg2LTYryEiKTtyZXR1cm59fWNhdGNoKGUpe310b2FzdCgi2qnYryDar9ix2YjZhzogIitjb2RlKX19OwogfQogaWYocGFnZT09PSJkZWNrIil7CiAgcm9vdC5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InBhbmVsLXBhZ2UiPjxoMiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+2KfZhtiq2K7Yp9ioINiv2LPYqtmHINm+24zYtCDYp9iyINmG2KjYsdivIDxzbWFsbD4oJHtzYXZlLmRlY2subGVuZ3RofS84KTwvc21hbGw+PC9oMj4KICA8cCBjbGFzcz0ibm90ZSI+2KjYsdin24wg2LnZiNi2INqp2LHYr9mGINqp2KfYsdiq2Iwg2KfZiNmEINix2YjbjCDbjNqp24wg2KfYsiDaqdin2LHYquKAjNmH2KfbjCDYr9in2K7ZhCDYr9iz2KrZhyDYqNiy2YbYjCDYqNi52K8g2qnYp9ix2Kog2KzYp9uM2q/YstuM2YYg2LHYpyDYp9iyINmF2KzZhdmI2LnZhyDYp9mG2KrYrtin2Kgg2qnZhi4g2K/Ys9iq2Ycg2KjYp9uM2K8g27gg2qnYp9ix2Kog2K/Yp9i02KrZhyDYqNin2LTYry48L3A+CiAgPGJ1dHRvbiBjbGFzcz0iYnRuIGdvbGQiIGlkPSJzdGFydEJhdHRsZUZyb21EZWNrIiBzdHlsZT0id2lkdGg6MTAwJTttYXJnaW46OHB4IDAgMThweCI+4pqU77iPINi02LHZiNi5INmG2KjYsdivINio2Kcg2KfbjNmGINiv2LPYqtmHPC9idXR0b24+CiAgPGRpdiBjbGFzcz0iZGVjay16b25lIj4ke3NhdmUuZGVjay5tYXAoaWQ9PmNhcmRIVE1MKGlkLHRydWUpKS5qb2luKCIiKX08L2Rpdj4KICA8aDIgY2xhc3M9InNlY3Rpb24tdGl0bGUiPtmF2KzZhdmI2LnZhyDaqdin2LHYquKAjNmH2Kc8L2gyPjxkaXYgY2xhc3M9ImNhcmRzLWdyaWQiPiR7Q0FSRF9JRFMuc2xpY2UoKS5zb3J0KChhLGIpPT4oISFzYXZlLm93bmVkW2JdKS0gKCEhc2F2ZS5vd25lZFthXSkpLm1hcChpZD0+Y2FyZEhUTUwoaWQsdHJ1ZSkpLmpvaW4oIiIpfTwvZGl2PjwvZGl2PmA7CiAgJCgiI3N0YXJ0QmF0dGxlRnJvbURlY2siKS5vbmNsaWNrPXNlYXJjaE1hdGNoOwogICQkKCIuY2FyZCIpLmZvckVhY2goZT0+ZS5vbmNsaWNrPSgpPT50b2dnbGVEZWNrKGUuZGF0YXNldC5jYXJkKSk7CiAgaWYoZGVja1N3YXBTZWxlY3RlZCl7Y29uc3QgcGlja2VkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5kZWNrLXpvbmUgLmNhcmRbZGF0YS1jYXJkPSIke2RlY2tTd2FwU2VsZWN0ZWR9Il1gKTtpZihwaWNrZWQpcGlja2VkLnN0eWxlLm91dGxpbmU9IjNweCBzb2xpZCAjZmZkODVhIjt9CiB9CiBpZihwYWdlPT09ImNhcmRzIil7CiAgcm9vdC5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InBhbmVsLXBhZ2UiPjxoMiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+2YXYrNmF2YjYudmHINqp2KfYsdiq4oCM2YfYpzwvaDI+CiAgPGRpdiBjbGFzcz0iY2FyZHMtZ3JpZCI+JHtDQVJEX0lEUy5zbGljZSgpLnNvcnQoKGEsYik9PighIXNhdmUub3duZWRbYl0pLSAoISFzYXZlLm93bmVkW2FdKSkubWFwKGlkPT5jYXJkSFRNTChpZCkpLmpvaW4oIiIpfTwvZGl2PjwvZGl2PmA7CgogICQkKCIuY2FyZCIpLmZvckVhY2goZT0+ZS5vbmNsaWNrPSgpPT5zaG93Q2FyZChlLmRhdGFzZXQuY2FyZCkpOwogfQogaWYocGFnZT09PSJzaG9wIil7CiAgcm9vdC5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InBhbmVsLXBhZ2UiPjxoMiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+2YHYsdmI2LTar9in2Ycg2KzYp9iv2YjbjNuMPC9oMj48ZGl2IGNsYXNzPSJzaG9wLWdyaWQiPgogICAke1sKICAgIFsiY29pbnMiLCLwn6qZIiwi2qnbjNiz2Ycg2LfZhNinIiwi27XbsNuwINiz2qnZhyDYt9mE2KciLCJnZW1zIiwyNV0sCiAgICBbImNoZXN0Iiwi8J+OgSIsIti12YbYr9mI2YIg2qnZhduM2KfYqCIsItqp2KfYsdiqICsg2LfZhNinIiwiZ29sZCIsMzAwXSwKICAgIFsiY2FyZCIsIvCfg48iLCLaqdin2LHYquKAjNmH2KfbjCDYqti12KfYr9mB24wiLCLbstuwINmG2LPYrtmHINqp2KfYsdiqIiwiZ29sZCIsMjIwXSwKICAgIFsiY29zbWV0aWMiLCLwn4+z77iPIiwi2b7YsdqG2YUg2LPZhNi32YbYqtuMIiwi2LjYp9mH2LEg2KLYsdmG2KciLCJnZW1zIiwzNV0KICAgXS5tYXAoeD0+YDxkaXYgY2xhc3M9ImdsYXNzIHNob3AtaXRlbSI+PGRpdiBjbGFzcz0ic2hvcC1pY29uIj4ke3hbMV19PC9kaXY+PGgzPiR7eFsyXX08L2gzPjxwPiR7eFszXX08L3A+CiAgIDxidXR0b24gY2xhc3M9ImJ0biBnb2xkIGJ1eSIgZGF0YS1raW5kPSIke3hbMF19IiBkYXRhLWN1cj0iJHt4WzRdfSIgZGF0YS1wcmljZT0iJHt4WzVdfSI+JHt4WzVdfSAke3hbNF09PT0iZ29sZCI/IvCfqpkiOiLwn5KOIn08L2J1dHRvbj48L2Rpdj5gKS5qb2luKCIiKX0KICA8L2Rpdj48L2Rpdj5gOwoKICByb290Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIixgPGRpdiBjbGFzcz0icGFuZWwtcGFnZSI+PGgyIGNsYXNzPSJzZWN0aW9uLXRpdGxlIj7Yrtix24zYryDaqdin2LHYqiDYr9mE2K7ZiNin2Yc8L2gyPjxwIGNsYXNzPSJub3RlIj7aqdin2LHYqiDZhdmI2LHYr9mG2LjYsdiqINix2Kcg2YXYs9iq2YLbjNmFINio2K7YsdibINqp2KfYsdiq4oCM2YfYp9uMINmC2YHZhOKAjNi02K/ZhyDYqNin2LIg2YXbjOKAjNi02YjZhtivINmIINqp2KfYsdiq4oCM2YfYp9uMINiq2qnYsdin2LHbjCDYqNmHINiz2LfYrSDaqdin2LHYqiDYp9i22KfZgdmHINmF24zigIzYtNmI2YbYry48L3A+PGRpdiBjbGFzcz0iY2FyZHMtZ3JpZCI+JHtDQVJEX0lEUy5zbGljZSgpLnNvcnQoKGEsYik9PighIXNhdmUub3duZWRbYl0pLSAoISFzYXZlLm93bmVkW2FdKSkubWFwKGlkPT57Y29uc3QgYz1DQVJEU1tpZF0sb3duZWQ9c2F2ZS5vd25lZFtpZF18fDAscHJpY2U9Y2FyZFByaWNlKGlkKTtyZXR1cm4gYDxkaXYgY2xhc3M9ImdsYXNzIHNob3AtaXRlbSI+PGRpdiBjbGFzcz0ic2hvcC1pY29uIj4ke2MuaWNvbn08L2Rpdj48aDM+JHtjLm5hbWV9PC9oMz48cD4ke2MucmFyaXR5fSDCtyAke293bmVkP2DYs9i32K0gJHtvd25lZH0vJHtjYXJkTGV2ZWxDYXAoaWQpfWA6ItmC2YHZhCJ9IMK3INmG2LPYrtmH4oCM2YfYpzogJHtzYXZlLmNhcmRDb3BpZXNbaWRdfHwwfTwvcD48YnV0dG9uIGNsYXNzPSJidG4gZ29sZCBidXktY2FyZCIgZGF0YS1pZD0iJHtpZH0iICR7b3duZWQ+PWNhcmRMZXZlbENhcChpZCk/ImRpc2FibGVkIjoiIn0+JHtvd25lZD49Y2FyZExldmVsQ2FwKGlkKT8i2K3Yr9in2qnYq9ixINiz2LfYrSI6YNiu2LHbjNivL9in2LHYqtmC2KcgwrcgJHtwcmljZX0g8J+qmWB9PC9idXR0b24+PC9kaXY+YH0pLmpvaW4oIiIpfTwvZGl2PjwvZGl2PmApOwogICQkKCIuYnV5IikuZm9yRWFjaChiPT5iLm9uY2xpY2s9KCk9PmJ1eShiLmRhdGFzZXQua2luZCxiLmRhdGFzZXQuY3VyLCtiLmRhdGFzZXQucHJpY2UpKTsKICAkJCgiLmJ1eS1jYXJkIikuZm9yRWFjaChiPT5iLm9uY2xpY2s9KCk9PmJ1eVNwZWNpZmljQ2FyZChiLmRhdGFzZXQuaWQpKTsKIH0KIGlmKHBhZ2U9PT0icHJvZmlsZSIpewogIGNvbnN0IG5lZWRlZD0xMDArc2F2ZS5sZXZlbCo4MDsKICByb290LmlubmVySFRNTD1gPGRpdiBjbGFzcz0icGFuZWwtcGFnZSBnbGFzcyIgc3R5bGU9Im1heC13aWR0aDo2NTBweDt0ZXh0LWFsaWduOmNlbnRlciI+CiAgPGRpdiBjbGFzcz0iYXZhdGFyIiBzdHlsZT0ibWFyZ2luOmF1dG87d2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4O2ZvbnQtc2l6ZTo1NXB4Ij7wn5uh77iPPC9kaXY+CiAgPGgxPiR7c2F2ZS5uYW1lfTwvaDE+PGgzPtiz2LfYrSDYqNin2LLbjNqp2YYgJHtzYXZlLmxldmVsfTwvaDM+CiAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MiPjxpIHN0eWxlPSJ3aWR0aDoke3NhdmUueHAvbmVlZGVkKjEwMH0lIj48L2k+PC9kaXY+PHA+JHtzYXZlLnhwfSAvICR7bmVlZGVkfSDYqtis2LHYqNmHPC9wPgogIDxkaXYgY2xhc3M9InN0YXQtcm93Ij48c3Bhbj7wn4+GINis2KfZheKAjNmH2Kc8L3NwYW4+PGI+JHtzYXZlLnRyb3BoaWVzfTwvYj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJzdGF0LXJvdyI+PHNwYW4+4pqUINm+24zYsdmI2LLbjOKAjNmH2Kc8L3NwYW4+PGI+JHtzYXZlLndpbnN9PC9iPjwvZGl2PgogIDxkaXYgY2xhc3M9InN0YXQtcm93Ij48c3Bhbj7wn5KAINi02qnYs9iq4oCM2YfYpzwvc3Bhbj48Yj4ke3NhdmUubG9zc2VzfTwvYj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJzdGF0LXJvdyI+PHNwYW4+8J+PnyDYotix2YbYpzwvc3Bhbj48Yj4ke0FSRU5BU1tzYXZlLmFyZW5hXS5uYW1lfTwvYj48L2Rpdj4KICA8YnV0dG9uIGNsYXNzPSJidG4iIGlkPSJyZW5hbWVCdG4iPtiq2LrbjNuM2LEg2YbYp9mFPC9idXR0b24+PC9kaXY+YDsKICAkKCIjcmVuYW1lQnRuIikub25jbGljaz0oKT0+e2NvbnN0IG49cHJvbXB0KCLZhtin2YUg2KjYp9iy24zaqdmGINix2Kcg2YjYp9ix2K8g2qnZhiIsc2F2ZS5uYW1lKTtpZihuKXtzYXZlLm5hbWU9bi5zbGljZSgwLDE4KTtwZXJzaXN0KCk7cmVuZGVyUGFnZSgpfX07CiB9CiBpZihwYWdlPT09InNldHRpbmdzIilyb290LmlubmVySFRNTD1zZXR0aW5nc0hUTUwoKTsKIGJpbmTYqtmG2LjbjNmF2KfYqihyb290KTsKfQpmdW5jdGlvbiBzZXR0aW5nc0hUTUwoKXsKIHJldHVybiBgPGRpdiBjbGFzcz0icGFuZWwtcGFnZSBnbGFzcyIgc3R5bGU9Im1heC13aWR0aDo2NTBweCI+PGgyIGNsYXNzPSJzZWN0aW9uLXRpdGxlIj7YqtmG2LjbjNmF2KfYqjwvaDI+CiA8ZGl2IGNsYXNzPSJzZXR0aW5nIj48Yj7Ytdiv2KfbjCDZhdmI2LPbjNmC24w8L2I+PGlucHV0IGlkPSJtdXNpY9io2LHYryIgdHlwZT0icmFuZ2UiIG1pbj0iMCIgbWF4PSIxIiBzdGVwPSIuMDUiIHZhbHVlPSIke3NhdmUubXVzaWN9Ij48L2Rpdj4KIDxkaXYgY2xhc3M9InNldHRpbmciPjxiPti12K/Yp9uMINin2YHaqdiq4oCM2YfYpzwvYj48aW5wdXQgaWQ9InNmeNio2LHYryIgdHlwZT0icmFuZ2UiIG1pbj0iMCIgbWF4PSIxIiBzdGVwPSIuMDUiIHZhbHVlPSIke3NhdmUuc2Z4fSI+PC9kaXY+CiA8ZGl2IGNsYXNzPSJzZXR0aW5nIj48Yj7aqduM2YHbjNiqINqv2LHYp9mB24zaqTwvYj48c2VsZWN0IGlkPSJxdWFsaXR5IiBzdHlsZT0icGFkZGluZzoxMHB4O2JhY2tncm91bmQ6IzBiMTQzMztjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6MTBweCI+CiAke1si2qnZhSIsItmF2KrZiNiz2LciLCLYstuM2KfYryJdLm1hcCh4PT5gPG9wdGlvbiAke3NhdmUucXVhbGl0eT09PXg/InNlbGVjdGVkIjoiIn0+JHt4fTwvb3B0aW9uPmApLmpvaW4oIiIpfTwvc2VsZWN0PjwvZGl2PgogPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDoxMnB4O2ZsZXgtd3JhcDp3cmFwIj4KIDxidXR0b24gY2xhc3M9ImJ0biIgaWQ9ImZ1bGxCdG4iPtiq2YXYp9mF4oCM2LXZgdit2Yc8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJidG4gcmVkIiBpZD0icmVzZXRCdG4iPtm+2KfaqSDaqdix2K/ZhiDZvtuM2LTYsdmB2Ko8L2J1dHRvbj48L2Rpdj48L2Rpdj5gOwp9CmZ1bmN0aW9uIGJpbmTYqtmG2LjbjNmF2KfYqihyb290PWRvY3VtZW50KXsKIGNvbnN0IG09cm9vdC5xdWVyeVNlbGVjdG9yKCIjbXVzaWPYqNix2K8iKSxzPXJvb3QucXVlcnlTZWxlY3RvcigiI3NmeNio2LHYryIpLHE9cm9vdC5xdWVyeVNlbGVjdG9yKCIjcXVhbGl0eSIpOwogaWYobSltLm9uaW5wdXQ9ZT0+e3NhdmUubXVzaWM9K2UudGFyZ2V0LnZhbHVlO3BlcnNpc3QoKTtBdWRpb1N5cy5tdXNpYygpfTsKIGlmKHMpcy5vbmlucHV0PWU9PntzYXZlLnNmeD0rZS50YXJnZXQudmFsdWU7cGVyc2lzdCgpfTsKIGlmKHEpcS5vbmNoYW5nZT1lPT57c2F2ZS5xdWFsaXR5PWUudGFyZ2V0LnZhbHVlO3BlcnNpc3QoKX07CiBjb25zdCBmPXJvb3QucXVlcnlTZWxlY3RvcigiI2Z1bGxCdG4iKTtpZihmKWYub25jbGljaz0oKT0+ZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/ZG9jdW1lbnQuZXhpdNiq2YXYp9mF4oCM2LXZgdit2YcoKTpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdNiq2YXYp9mF4oCM2LXZgdit2YcoKTsKIGNvbnN0IHI9cm9vdC5xdWVyeVNlbGVjdG9yKCIjcmVzZXRCdG4iKTtpZihyKXIub25jbGljaz0oKT0+e2lmKGNvbmZpcm0oItmH2YXZhyDZvtuM2LTYsdmB2KrigIzZh9inINm+2KfaqSDYtNmI2K/YnyIpKXtsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTQVZFX0tFWSk7bG9jYXRpb24ucmVsb2FkKCl9fTsKfQpsZXQgZGVja1N3YXBTZWxlY3RlZD1udWxsOwpmdW5jdGlvbiB0b2dnbGVEZWNrKGlkKXsKIGlmKCFzYXZlLm93bmVkW2lkXSlyZXR1cm4gdG9hc3QoItin24zZhiDaqdin2LHYqiDZgtmB2YQg2KfYs9iq2Jsg2KfZiNmEINin2LIg2YHYsdmI2LTar9in2Ycg2KjYrtix2LQuIik7CiBjb25zdCBpPXNhdmUuZGVjay5pbmRleE9mKGlkKTsKIGlmKGk+PTApe2RlY2tTd2FwU2VsZWN0ZWQ9aWQ7cmVuZGVyUGFnZSgiZGVjayIpO3JldHVybiB0b2FzdCgi2qnYp9ix2Kog2KfZhtiq2K7Yp9ioINi02K/YmyDYrdin2YTYpyDaqdin2LHYqiDYrNin24zar9iy24zZhiDYsdinINin2LIg2YXYrNmF2YjYudmHINio2LLZhi4iKX0KIGlmKGRlY2tTd2FwU2VsZWN0ZWQpe2NvbnN0IHNsb3Q9c2F2ZS5kZWNrLmluZGV4T2YoZGVja1N3YXBTZWxlY3RlZCk7aWYoc2xvdDwwKXtkZWNrU3dhcFNlbGVjdGVkPW51bGw7cmV0dXJuIHJlbmRlclBhZ2UoImRlY2siKX07c2F2ZS5kZWNrW3Nsb3RdPWlkO2RlY2tTd2FwU2VsZWN0ZWQ9bnVsbDtwZXJzaXN0KCk7cmVuZGVyUGFnZSgiZGVjayIpO3JldHVybiB0b2FzdCgi2qnYp9ix2Kog2K/Ys9iq2Ycg2KjYpyDZhdmI2YHZgtuM2Kog2LnZiNi2INi02K8hIil9CiBpZihzYXZlLmRlY2subGVuZ3RoPj04KXJldHVybiB0b2FzdCgi2K/Ys9iq2Ycg2qnYp9ix2KrigIzZh9inINm+2LEg2KfYs9iq2Jsg2KjYsdin24wg2KrYudmI24zYttiMINin2YjZhCDbjNqp24wg2KfYsiDaqdin2LHYquKAjNmH2KfbjCDYr9in2K7ZhCDYr9iz2KrZhyDYsdinINin2YbYqtiu2KfYqCDaqdmGLiIpOwogc2F2ZS5kZWNrLnB1c2goaWQpO3BlcnNpc3QoKTtyZW5kZXJQYWdlKCJkZWNrIik7Cn0KZnVuY3Rpb24gY2FyZFByaWNlKGlkKXtjb25zdCBjPUNBUkRTW2lkXTtyZXR1cm4gYy5yYXJpdHk9PT0i2KfZgdiz2KfZhtmH4oCM2KfbjCI/MzYwOmMucmFyaXR5PT09Itit2YXYp9iz24wiPzI2MDpjLnJhcml0eT09PSLaqdmF24zYp9ioIj8xODA6MTAwfQpmdW5jdGlvbiBidXlTcGVjaWZpY0NhcmQoaWQpe2NvbnN0IHByaWNlPWNhcmRQcmljZShpZCksbHY9c2F2ZS5vd25lZFtpZF18fDAsY2FwPWNhcmRMZXZlbENhcChpZCk7aWYobHY+PWNhcClyZXR1cm4gdG9hc3QoYNiz2LfYrSDYp9uM2YYg2qnYp9ix2Kog2KjZhyDYs9mC2YEgJHtjYXB9INix2LPbjNiv2Ycg2KfYs9iqLmApO2lmKHNhdmUuZ29sZDxwcmljZSlyZXR1cm4gdG9hc3QoItiz2qnZh9mUINi32YTYpyDaqdin2YHbjCDZhtuM2LPYqiEiKTtzYXZlLmdvbGQtPXByaWNlO3NhdmUub3duZWRbaWRdPWNsYW1wQ2FyZExldmVsKGlkLGx2KzEpO3NhdmUuY2FyZENvcGllc1tpZF09KHNhdmUuY2FyZENvcGllc1tpZF18fDApKzE7cGVyc2lzdCgpO3JlbmRlclBhZ2UoInNob3AiKTt0b2FzdChgJHtDQVJEU1tpZF0ubmFtZX0g2K7YsduM2K/Yp9ix24wg2LTYryEg2LPYt9itINqp2KfYsdiqOiAke3NhdmUub3duZWRbaWRdfS8ke2NhcH1gKTtBdWRpb1N5cy5kZXBsb3koKX0KZnVuY3Rpb24gc2hvd0NhcmQoaWQpewogY29uc3QgYz1DQVJEU1tpZF0sbHY9c2F2ZS5vd25lZFtpZF18fDAsY2FwPWNhcmRMZXZlbENhcChpZCksY29waWVzPXNhdmUuY2FyZENvcGllc1tpZF18fDAsY29zdD1sdj09PTA/Y2FyZFByaWNlKGlkKToxMDArbHYqMTI1LHNjYWxlPWNhcmRMZXZlbFNjYWxlKE1hdGgubWF4KDEsbHYpKTsKIGNvbnN0IGF0Q2FwPWx2Pj1jYXA7CiBjb25zdCBtb2RhbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTttb2RhbC5jbGFzc05hbWU9Im1vZGFsIjsKIG1vZGFsLmlubmVySFRNTD1gPGRpdiBjbGFzcz0ibW9kYWwtYm94IGdsYXNzIj48ZGl2IHN0eWxlPSJmb250LXNpemU6NzZweCI+JHtjLmljb259PC9kaXY+PGgyPiR7Yy5uYW1lfTwvaDI+CiA8cD4ke2MuZGVzY308L3A+PGRpdiBjbGFzcz0ic3RhdC1yb3ciPjxzcGFuPtmG2YjYuTwvc3Bhbj48Yj4ke2MudHlwZX08L2I+PC9kaXY+CiA8ZGl2IGNsYXNzPSJzdGF0LXJvdyI+PHNwYW4+2qnZhduM2KfYqNuMPC9zcGFuPjxiPiR7Yy5yYXJpdHl9PC9iPjwvZGl2PgogPGRpdiBjbGFzcz0ic3RhdC1yb3ciPjxzcGFuPtiz2LfYrSDaqdin2LHYqjwvc3Bhbj48Yj4ke2x2fHwwfSAvICR7Y2FwfTwvYj48L2Rpdj4KIDxkaXYgY2xhc3M9InN0YXQtcm93Ij48c3Bhbj7Zhtiz2K7Zh+KAjNmH2KfbjCDYr9ix24zYp9mB2KrbjDwvc3Bhbj48Yj4ke2NvcGllc308L2I+PC9kaXY+CiA8ZGl2IGNsYXNzPSJzdGF0LXJvdyI+PHNwYW4+2LPZhNin2YXYqtuMINiv2LEg2KfbjNmGINiz2LfYrTwvc3Bhbj48Yj4ke2MuaHA/TWF0aC5yb3VuZChjLmhwKnNjYWxlKToi4oCUIn08L2I+PC9kaXY+CiA8ZGl2IGNsYXNzPSJzdGF0LXJvdyI+PHNwYW4+2YLYr9ix2Kog2LbYsdio2Ycg2K/YsSDYp9uM2YYg2LPYt9itPC9zcGFuPjxiPiR7Yy5kYW1hZ2U/TWF0aC5yb3VuZChjLmRhbWFnZSpzY2FsZSk6IuKAlCJ9PC9iPjwvZGl2PgogPGRpdiBjbGFzcz0ic3RhdC1yb3ciPjxzcGFuPtio2LHYrzwvc3Bhbj48Yj4ke2MucmFuZ2V8fGMucmFkaXVzfHwi4oCUIn08L2I+PC9kaXY+CiA8ZGl2IGNsYXNzPSJzdGF0LXJvdyI+PHNwYW4+2LPYsdi52Kog2K3ZhdmE2Yc8L3NwYW4+PGI+JHtjLnJhdGV8fCLigJQifTwvYj48L2Rpdj4KIDxidXR0b24gY2xhc3M9ImJ0biBnb2xkIHVwZ3JhZGUiICR7c2F2ZS5nb2xkPGNvc3R8fGF0Q2FwPyJkaXNhYmxlZCI6IiJ9PiR7YXRDYXA/Itit2K/Yp9qp2KvYsSDYs9i32K0g2qnYp9ix2KoiOmx2PyLYp9ix2KrZgtin24wg2qnYp9ix2KoiOiLYqNin2LIg2qnYsdiv2YYg2qnYp9ix2KoifSR7YXRDYXA/IiI6YCDCtyAke2Nvc3R9IPCfqplgfTwvYnV0dG9uPgogPGJ1dHRvbiBjbGFzcz0iYnRuIHJlZCBjbG9zZSI+2KjYs9iq2YY8L2J1dHRvbj48L2Rpdj5gOwogZG9jdW1lbnQuYm9keS5hcHBlbmQobW9kYWwpOwogbW9kYWwucXVlcnlTZWxlY3RvcigiLmNsb3NlIikub25jbGljaz0oKT0+bW9kYWwucmVtb3ZlKCk7CiBtb2RhbC5xdWVyeVNlbGVjdG9yKCIudXBncmFkZSIpLm9uY2xpY2s9KCk9PnsKICBpZigoc2F2ZS5vd25lZFtpZF18fDApPj1jYXJkTGV2ZWxDYXAoaWQpKXJldHVybiB0b2FzdChg2LPZgtmBINiz2LfYrSDYp9uM2YYg2qnYp9ix2KogJHtjYXJkTGV2ZWxDYXAoaWQpfSDYp9iz2KouYCk7CiAgaWYoc2F2ZS5nb2xkPGNvc3QpcmV0dXJuIHRvYXN0KCLYs9qp2YfZlCDYt9mE2Kcg2qnYp9mB24wg2YbbjNiz2KohIik7CiAgc2F2ZS5nb2xkLT1jb3N0O3NhdmUub3duZWRbaWRdPWNsYW1wQ2FyZExldmVsKGlkLChzYXZlLm93bmVkW2lkXXx8MCkrMSk7cGVyc2lzdCgpO21vZGFsLnJlbW92ZSgpO3Nob3dDYXJkKGlkKTsKIH07Cn0KZnVuY3Rpb24gYnV5KGtpbmQsY3VyLHByaWNlKXsKIGlmKHNhdmVbY3VyXTxwcmljZSlyZXR1cm4gdG9hc3QoY3VyPT09ImdvbGQiPyLYs9qp2YfZlCDYt9mE2Kcg2qnYp9mB24wg2YbbjNiz2KohIjoi2KfZhNmF2KfYsyDaqdin2YHbjCDZhtuM2LPYqiEiKTsKIHNhdmVbY3VyXS09cHJpY2U7CiBpZihraW5kPT09ImNvaW5zIilzYXZlLmdvbGQrPTUwMDsKIGlmKGtpbmQ9PT0iY2FyZCIpe2NvbnN0IGlkPWNob2ljZShDQVJEX0lEUyk7c2F2ZS5jYXJkQ29waWVzW2lkXT0oc2F2ZS5jYXJkQ29waWVzW2lkXXx8MCkrMjA7aWYoIShzYXZlLm93bmVkW2lkXXx8MCkpc2F2ZS5vd25lZFtpZF09MTt0b2FzdChg27LbsCDZhtiz2K7ZhyDYp9iyINqp2KfYsdiqINi02KfZhtiz24wgwqske0NBUkRTW2lkXS5uYW1lfcK7INqv2LHZgdiq24whYCl9CiBpZihraW5kPT09ImNoZXN0Iil7c2F2ZS5nb2xkKz1yYW5kKDkwLDE5MCl8MDtjb25zdCBpZD1jaG9pY2UoQ0FSRF9JRFMpO3NhdmUuY2FyZENvcGllc1tpZF09KHNhdmUuY2FyZENvcGllc1tpZF18fDApKzE7aWYoIShzYXZlLm93bmVkW2lkXXx8MCkpc2F2ZS5vd25lZFtpZF09MTt0b2FzdChg2LXZhtiv2YjZgiDYtNin2YXZhCDbjNqpINmG2LPYrtmHINin2LIgwqske0NBUkRTW2lkXS5uYW1lfcK7INio2YjYryFgKX0KIGlmKGtpbmQ9PT0iY29zbWV0aWMiKXRvYXN0KCLZvtix2obZhSDYs9mE2LfZhtiq24wg2YHYudin2YQg2LTYryEiKTsKIHBlcnNpc3QoKTtyZW5kZXJQYWdlKCJzaG9wIik7QXVkaW9TeXMuZGVwbG95KCk7Cn0KCiQkKCIubmF2YnRuIikuZm9yRWFjaChiPT5iLm9uY2xpY2s9KCk9PntBdWRpb1N5cy5jbGljaygpO3JlbmRlclBhZ2UoYi5kYXRhc2V0LnBhZ2UpfSk7CiQoIiNzZXR0aW5nc1RvcCIpLm9uY2xpY2s9KCk9PnJlbmRlclBhZ2UoInNldHRpbmdzIik7CgovKiAtLS0tLS0tLS0tIFRocmVlLmpzIEdhbWUgLS0tLS0tLS0tLSAqLwpsZXQgcmVuZGVyZXIsc2NlbmUsY2FtZXJhLGNsb2NrLHJheWNhc3Rlcixwb2ludGVyOwpsZXQgZ2FtZT1udWxsOwpjb25zdCBtYXRlcmlhbHM9e307CmZ1bmN0aW9uIG1hdChjb2xvcixlbWlzc2l2ZT0wKXtyZXR1cm4gbmV3IFRIUkVFLk1lc2hUb29uTWF0ZXJpYWwoe2NvbG9yLGVtaXNzaXZlfSl9CmZ1bmN0aW9uIG1lc2goZ2VvLGNvbG9yLGVtPTApe2NvbnN0IG1hdGVyaWFsPWNvbG9yJiZjb2xvci5pc01hdGVyaWFsP2NvbG9yOm1hdChjb2xvcixlbSk7Y29uc3QgbT1uZXcgVEhSRUUuTWVzaChnZW8sbWF0ZXJpYWwpO20uY2FzdFNoYWRvdz10cnVlO20ucmVjZWl2ZVNoYWRvdz10cnVlO3JldHVybiBtfQoKZnVuY3Rpb24gaW5pdFRocmVlKCl7CiBpZihyZW5kZXJlcilyZXR1cm47CiByZW5kZXJlcj1uZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7YW50aWFsaWFzOnRydWUscG93ZXJQcmVmZXJlbmNlOiJoaWdoLXBlcmZvcm1hbmNlIixmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OmZhbHNlLGFscGhhOmZhbHNlLHN0ZW5jaWw6ZmFsc2V9KTsKIHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oTWF0aC5taW4oZGV2aWNlUGl4ZWxSYXRpb3x8MSxzYXZlLnF1YWxpdHk9PT0i2LLbjNin2K8iPzEuMzU6c2F2ZS5xdWFsaXR5PT09ItmF2KrZiNiz2LciPzEuMDU6MC44NSkpOwogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQ9c2F2ZS5xdWFsaXR5PT09Itiy24zYp9ivIjsKIHJlbmRlcmVyLnNoYWRvd01hcC50eXBlPVRIUkVFLlBDRlNvZnRTaGFkb3dNYXA7CiByZW5kZXJlci50b25lTWFwcGluZz1USFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmc7cmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZT0xLjA4OwogcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZT1USFJFRS5TUkdCQ29sb3JTcGFjZTsKICQoIiNyZW5kZXJIb3N0IikuYXBwZW5kKHJlbmRlcmVyLmRvbUVsZW1lbnQpOwogcmVuZGVyZXIuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixlPT57ZS5wcmV2ZW50RGVmYXVsdCgpO3RvYXN0KCLar9ix2KfZgduM2qkg2K/YsSDYrdin2YQg2KjYp9iy24zYp9io24wg2KfYs9iq2Jsg2obZhtivINmE2K3YuNmHINi12KjYsSDaqdmGLiIpfSxmYWxzZSk7CiByZW5kZXJlci5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIiwoKT0+e3RyeXtyZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKGRldmljZVBpeGVsUmF0aW98fDEsMS4wKSk7cmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQ9ZmFsc2U7cmVzaXplKCk7aWYoc2NlbmUmJmNhbWVyYSl7Y2FtZXJhLnBvc2l0aW9uLnNldCgwLDM0LDM3KTtjYW1lcmEubG9va0F0KDAsMCwwKX10b2FzdCgi2q/Ysdin2YHbjNqpINio2KfYstuMINiv2YjYqNin2LHZhyDZgdi52KfZhCDYtNivLiIpfWNhdGNoKGUpe3RvYXN0KCLYqNix2KfbjCDYp9iv2KfZhdmH2Iwg2KjYp9iy24wg2LHYpyDYqNio2YbYryDZiCDYr9mI2KjYp9ix2Ycg2KjYp9iyINqp2YYuIil9fSxmYWxzZSk7CiBzY2VuZT1uZXcgVEhSRUUuU2NlbmUoKTsKIGNhbWVyYT1uZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNDMsMSwuMSwxMDApOwogY2FtZXJhLnBvc2l0aW9uLnNldCgwLDM0LDM3KTtjYW1lcmEubG9va0F0KDAsMCwwKTsKIGNsb2NrPW5ldyBUSFJFRS5DbG9jaygpO3JheWNhc3Rlcj1uZXcgVEhSRUUuUmF5Y2FzdGVyKCk7cG9pbnRlcj1uZXcgVEhSRUUuVmVjdG9yMigpOwogYWRkTGlnaHRzKCk7cmVzaXplKCk7CiBhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHJlc2l6ZSk7CiByZW5kZXJlci5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixvbkFyZW5hTW92ZSk7CiByZW5kZXJlci5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixvbkFyZW5hRG93bik7CiByZW5kZXJlci5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixlPT57CiAgaWYoIWdhbWUpcmV0dXJuO2NhbWVyYS5wb3NpdGlvbi5tdWx0aXBseVNjYWxhcihlLmRlbHRhWT4wPzEuMDQ6Ljk2KTsKICBjb25zdCBsZW49Y2FtZXJhLnBvc2l0aW9uLmxlbmd0aCgpO2lmKGxlbjwyOSljYW1lcmEucG9zaXRpb24ubXVsdGlwbHlTY2FsYXIoMjkvbGVuKTtpZihsZW4+NDUpY2FtZXJhLnBvc2l0aW9uLm11bHRpcGx5U2NhbGFyKDQ1L2xlbik7CiB9LHtwYXNzaXZlOnRydWV9KTsKIHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKfQpmdW5jdGlvbiByZXNpemUoKXsKIGlmKCFyZW5kZXJlcilyZXR1cm47CiByZW5kZXJlci5zZXRTaXplKGlubmVyV2lkdGgsaW5uZXJIZWlnaHQpO2NhbWVyYS5hc3BlY3Q9aW5uZXJXaWR0aC9pbm5lckhlaWdodDtjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwp9CmZ1bmN0aW9uIGFkZExpZ2h0cygpewogc2NlbmUuYWRkKG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoMHhkZmY0ZmYsMHgyNzM1MWIsMS44KSk7CiBjb25zdCBzdW49bmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmYxZDQsMi40KTtzdW4ucG9zaXRpb24uc2V0KC0xMiwyNCwxNSk7CiBzdW4uY2FzdFNoYWRvdz10cnVlO3N1bi5zaGFkb3cubWFwU2l6ZS5zZXQoc2F2ZS5xdWFsaXR5PT09Itiy24zYp9ivIj8yMDQ4OjEwMjQsc2F2ZS5xdWFsaXR5PT09Itiy24zYp9ivIj8yMDQ4OjEwMjQpOwogc3VuLnNoYWRvdy5jYW1lcmEubGVmdD0tMjI7c3VuLnNoYWRvdy5jYW1lcmEucmlnaHQ9MjI7c3VuLnNoYWRvdy5jYW1lcmEudG9wPTI1O3N1bi5zaGFkb3cuY2FtZXJhLmJvdHRvbT0tMjU7CiBzY2VuZS5hZGQoc3VuKTsKfQpmdW5jdGlvbiBjbGVhclNjZW5lKCl7CiBbLi4uc2NlbmUuY2hpbGRyZW5dLmZvckVhY2goeD0+e2lmKCF4LmlzTGlnaHQpc2NlbmUucmVtb3ZlKHgpfSk7Cn0KZnVuY3Rpb24gYm94KHgseSx6LGMpe3JldHVybiBtZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSh4LHkseiksYyl9CmZ1bmN0aW9uIGN5bChyMSxyMixoLGMsbj04KXtyZXR1cm4gbWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShyMSxyMixoLG4pLGMpfQpmdW5jdGlvbiBzcGhlcmUocixjLG49MTApe3JldHVybiBtZXNoKG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeShyLG4sbiksYyl9CmZ1bmN0aW9uIGFyZW5hQnVpbGQoaW5kZXgpewogY2xlYXJTY2VuZSgpO2NvbnN0IGE9QVJFTkFTW2luZGV4XTtzY2VuZS5iYWNrZ3JvdW5kPW5ldyBUSFJFRS5Db2xvcihhLnNreSk7CiBzY2VuZS5mb2c9bnVsbDsgLy8gS2VlcCB0aGUgb3Bwb25lbnQgc2lkZSBjbGVhciwgZXNwZWNpYWxseSBvbiB0aGUgZW5sYXJnZWQgYXJlbmEuCiBnYW1lLmFyZW5hR3JvdXA9bmV3IFRIUkVFLkdyb3VwKCk7c2NlbmUuYWRkKGdhbWUuYXJlbmFHcm91cCk7CiBjb25zdCBnPWdhbWUuYXJlbmFHcm91cDsKIGNvbnN0IGJhc2U9Ym94KDUyLDEsNzIsYS5zdG9uZSk7YmFzZS5wb3NpdGlvbi55PS0uODtnLmFkZChiYXNlKTsKIGNvbnN0IGZpZWxkPWJveCg1MCwuNTUsNzAsYS5ncmFzcyk7ZmllbGQucG9zaXRpb24ueT0tLjI1O2cuYWRkKGZpZWxkKTsKIC8vIFJlbW92ZWQgbGFuZSBzdHJpcHM6IHVuaW50ZXJydXB0ZWQgYXJlbmEgZ3JvdW5kLCBubyBkYXNoZWQtbG9va2luZyBmaWVsZCBzZWFtcy4KIC8vIFJpdmVyCiBjb25zdCB3YXRlcj1ib3goMzQsLjE4LDMuNSxhLnJpdmVyKTt3YXRlci5wb3NpdGlvbi55PS4wODsKIHdhdGVyLm1hdGVyaWFsLnRyYW5zcGFyZW50PXRydWU7d2F0ZXIubWF0ZXJpYWwub3BhY2l0eT0uODI7d2F0ZXIubWF0ZXJpYWwuZW1pc3NpdmU9bmV3IFRIUkVFLkNvbG9yKGEuZGVjb3I9PT0ibGF2YSI/MHhmZjI2MDA6MHgwNjM1NGQpOwogZy5hZGQod2F0ZXIpO2dhbWUud2F0ZXI9d2F0ZXI7CiAvLyBDZW50cmFsIHNxdWFyZSBvYnN0cnVjdGlvbiByZW1vdmVkIGNvbXBsZXRlbHk7IGxlYXZlIHRoZSBzcGFjZSBiZXR3ZWVuIGJyaWRnZXMgY2xlYXIuCgogLy8gQnJpZGdlcwogWy01LjIsNS4yXS5mb3JFYWNoKHg9PnsKICBjb25zdCBicmlkZ2U9Ym94KDMuMywuNDIsNC4xLGEuZGVjb3I9PT0ibGF2YSI/MHg1OTQ4M2U6MHg4ZjcxNTQpO2JyaWRnZS5wb3NpdGlvbi55PS40NTtnLmFkZChicmlkZ2UpOwogIGZvcihsZXQgej0tMS43O3o8PTEuNzt6Kz0uNTUpe2NvbnN0IHBsYW5rPWJveCgzLjUsLjEyLC4zOCwweGI5ODk1NSk7cGxhbmsucG9zaXRpb24uc2V0KHgsLjcyLHopO2cuYWRkKHBsYW5rKX0KIH0pOwogLy8gT3V0ZXIgY2FzdGxlIHdhbGxzCiBbLTI1LjIsMjUuMl0uZm9yRWFjaCh4PT57Y29uc3Qgdz1ib3goMS4zLDEuMyw3MixhLnN0b25lKTt3LnBvc2l0aW9uLnNldCh4LC4zNSwwKTtnLmFkZCh3KX0pOwogWy0zNiwzNl0uZm9yRWFjaCh6PT57Y29uc3Qgdz1ib3goNTIsMS4zLDEuMixhLnN0b25lKTt3LnBvc2l0aW9uLnNldCgwLC4zNSx6KTtnLmFkZCh3KX0pOwogLy8gRGVjb3JhdGlvbnMKIGZvcihsZXQgaT0wO2k8MjI7aSsrKXsKICBsZXQgeD1jaG9pY2UoWy0xLDFdKSpyYW5kKDEyLDIxLjUpLHo9cmFuZCgtMjcsMjcpOwogIGNvbnN0IGQ9bmV3IFRIUkVFLkdyb3VwKCk7CiAgaWYoYS5kZWNvcj09PSJ0cmVlcyIpewogICBjb25zdCB0cnVuaz1jeWwoLjE4LC4yNCwxLjMsMHg3ODQ1MjYpO3RydW5rLnBvc2l0aW9uLnk9LjY1O2QuYWRkKHRydW5rKTsKICAgY29uc3QgY3Jvd249c3BoZXJlKHJhbmQoLjU1LC44NSksY2hvaWNlKFsweDJlOTYzZSwweDQzYjg1NSwweDJmN2Q0Ml0pKTtjcm93bi5zY2FsZS55PTEuMjU7Y3Jvd24ucG9zaXRpb24ueT0xLjY1O2QuYWRkKGNyb3duKTsKICB9ZWxzZSBpZihhLmRlY29yPT09ImNhY3R1cyIpewogICBjb25zdCBjPWN5bCguMjUsLjMyLDEuOCwweDNmOWI1Miw3KTtjLnBvc2l0aW9uLnk9Ljk7ZC5hZGQoYyk7CiAgfWVsc2UgaWYoYS5kZWNvcj09PSJpY2UiKXsKICAgY29uc3QgYz1jeWwoMCwuNDUscmFuZCgxLDIpLDB4OWZlYWZmLDUpO2MucG9zaXRpb24ueT0uODtkLmFkZChjKTsKICB9ZWxzZSBpZihhLmRlY29yPT09ImxhdmEiKXsKICAgY29uc3QgYz1zcGhlcmUocmFuZCguMywuNyksMHgyMTFkMjIsNyk7Yy5zY2FsZS55PS43O2QuYWRkKGMpOwogIH1lbHNlIGlmKGEuZGVjb3I9PT0ibW9vbiJ8fGEuZGVjb3I9PT0idm9pZCIpewogICBjb25zdCBjPXNwaGVyZShyYW5kKC4zLC42NSksYS5kZWNvcj09PSJtb29uIj8weDhmOWRjZToweDliNjVkNCwxMCk7Yy5wb3NpdGlvbi55PXJhbmQoLjUsMS41KTtkLmFkZChjKTsKICAgY29uc3QgcmluZz1jeWwoLjA0LC4wNCxyYW5kKDEuMiwyKSwweGJlZDVmZiw4KTtyaW5nLnJvdGF0aW9uLno9LjU1O3JpbmcucG9zaXRpb24ueT0xLjE7ZC5hZGQocmluZyk7CiAgfWVsc2UgaWYoYS5kZWNvcj09PSJjaGVycnkifHxhLmRlY29yPT09ImF1dHVtbiIpewogICBjb25zdCB0cnVuaz1jeWwoLjE2LC4yMywxLjI1LGEuZGVjb3I9PT0iY2hlcnJ5Ij8weDc5NTEzZDoweDhhNGEyNSk7dHJ1bmsucG9zaXRpb24ueT0uNjI7ZC5hZGQodHJ1bmspOwogICBjb25zdCBjcm93bj1zcGhlcmUocmFuZCguNTUsLjgpLGEuZGVjb3I9PT0iY2hlcnJ5Ij8weGZmODBiZDpjaG9pY2UoWzB4ZTg4YjM2LDB4Yzk0ZDI4LDB4ZThiZDRiXSksMTApO2Nyb3duLnNjYWxlLnk9MS4xO2Nyb3duLnBvc2l0aW9uLnk9MS41NTtkLmFkZChjcm93bik7CiAgfWVsc2UgaWYoYS5kZWNvcj09PSJjb3JhbCJ8fGEuZGVjb3I9PT0ib2NlYW4iKXsKICAgY29uc3QgYz1jeWwoLjA4LC4yOCxyYW5kKDEsMiksY2hvaWNlKFsweGZmOGE5ZSwweGZmY2Y3NCwweDY0ZTBkYiwweDZiYWFmZl0pLDcpO2MucG9zaXRpb24ueT0uNztkLmFkZChjKTsKICAgZm9yKGxldCBqPTA7ajwyO2orKyl7Y29uc3QgYnJhbmNoPWN5bCguMDYsLjEzLC44LDB4ZmZiMGE4LDYpO2JyYW5jaC5wb3NpdGlvbi5zZXQoKGo/MTotMSkqLjI1LDEuMTUsMCk7YnJhbmNoLnJvdGF0aW9uLno9KGo/LS42Oi42KTtkLmFkZChicmFuY2gpfQogIH1lbHNlIGlmKGEuZGVjb3I9PT0iY3J5c3RhbCJ8fGEuZGVjb3I9PT0iYXVyb3JhInx8YS5kZWNvcj09PSJzdG9ybSIpewogICBjb25zdCBjPWN5bCgwLHJhbmQoLjM1LC42NSkscmFuZCgxLjEsMi4zKSxhLmRlY29yPT09ImF1cm9yYSI/MHg4YmVhZmY6YS5kZWNvcj09PSJzdG9ybSI/MHhhYWFhZmY6MHhiNjlhZmYsNSk7Yy5wb3NpdGlvbi55PS43NTtkLmFkZChjKTsKICB9ZWxzZSBpZihhLmRlY29yPT09Imp1bmdsZSJ8fGEuZGVjb3I9PT0ibXVzaHJvb20iKXsKICAgY29uc3QgdHJ1bms9Y3lsKC4xNCwuMiwxLjAsMHg3MjUwMzkpO3RydW5rLnBvc2l0aW9uLnk9LjU7ZC5hZGQodHJ1bmspOwogICBjb25zdCBzdGVtPWN5bCguMiwuMjQsLjY1LDB4ZThlMWQyKTtzdGVtLnBvc2l0aW9uLnk9Ljk1O2QuYWRkKHN0ZW0pOwogICBjb25zdCBjYXA9c3BoZXJlKC41MixhLmRlY29yPT09Im11c2hyb29tIj8weGU5NGQ2NjoweDJhOTE0OCwxMCk7Y2FwLnNjYWxlLnk9LjQ4O2NhcC5wb3NpdGlvbi55PTEuMzU7ZC5hZGQoY2FwKTsKICB9ZWxzZSBpZihhLmRlY29yPT09ImNhbmR5Iil7CiAgIGNvbnN0IHN0aWNrPWN5bCguMTYsLjE2LDEuNixjaG9pY2UoWzB4ZmY1ZDllLDB4NzVkN2ZmLDB4ZmZkNzVlXSksOCk7c3RpY2sucG9zaXRpb24ueT0uODtzdGljay5yb3RhdGlvbi56PS4yNTtkLmFkZChzdGljayk7CiAgIGNvbnN0IGNhbmR5PXNwaGVyZSguNDUsY2hvaWNlKFsweGZmYThkNCwweDljZWNmZiwweGZmZTM4Yl0pLDEwKTtjYW5keS5wb3NpdGlvbi55PTEuNztkLmFkZChjYW5keSk7CiAgfWVsc2UgaWYoYS5kZWNvcj09PSJza3kiKXsKICAgY29uc3QgYz1zcGhlcmUocmFuZCguNDUsLjc1KSwweGVhZjZmZiwxMCk7Yy5zY2FsZS5zZXQoMS41LC41NSwxKTtjLnBvc2l0aW9uLnk9cmFuZCguNiwxLjIpO2QuYWRkKGMpOwogIH1lbHNlIGlmKGEuZGVjb3I9PT0iZ29sZCJ8fGEuZGVjb3I9PT0ibGVnZW5kIil7CiAgIGNvbnN0IGM9Y3lsKC4xMiwuNDIscmFuZCgxLjIsMi4xKSxhLmRlY29yPT09ImdvbGQiPzB4ZjNkMTViOjB4ZTVjN2ZmLDYpO2MucG9zaXRpb24ueT0uNzU7ZC5hZGQoYyk7CiAgIGNvbnN0IG9yYj1zcGhlcmUoLjI0LGEuZGVjb3I9PT0iZ29sZCI/MHhmZmYyYTM6MHhmZmQ3NmQsMTApO29yYi5wb3NpdGlvbi55PTEuODtkLmFkZChvcmIpOwogIH1lbHNlewogICBjb25zdCBjPWJveCguNyxyYW5kKDEsMiksLjcsYS5zdG9uZSk7Yy5wb3NpdGlvbi55PS43O2QuYWRkKGMpOwogIH0KICBkLnBvc2l0aW9uLnNldCh4LDAseik7ZC5yb3RhdGlvbi55PXJhbmQoMCw2LjI4KTtnLmFkZChkKTsKIH0KIC8vIEZsYWdzIGFuZCB0b3JjaGVzCiBnYW1lLmZsYWdzPVtdOwogWy03LjUsNy41XS5mb3JFYWNoKHg9PlstMTgsMThdLmZvckVhY2goej0+ewogIGNvbnN0IHBvbGU9Y3lsKC4wNywuMDcsMywweDU0M2IyZCk7cG9sZS5wb3NpdGlvbi5zZXQoeCwxLjUseik7Zy5hZGQocG9sZSk7CiAgY29uc3QgZmxhZz1tZXNoKG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KDEuNCwuNzUsNSwxKSxtYXQoej4wPzB4Mjk5ZWZmOjB4ZmY0MTY4KSk7CiAgZmxhZy5wb3NpdGlvbi5zZXQoeCsuNywyLjU1LHopO2cuYWRkKGZsYWcpO2dhbWUuZmxhZ3MucHVzaChmbGFnKTsKICBjb25zdCBmbGFtZT1zcGhlcmUoLjE4LDB4ZmZhMzI2KTtmbGFtZS5tYXRlcmlhbC5lbWlzc2l2ZT1uZXcgVEhSRUUuQ29sb3IoMHhmZjRhMDApO2ZsYW1lLnBvc2l0aW9uLnNldCh4LDEuNyx6PjA/ei0xOnorMSk7Zy5hZGQoZmxhbWUpOwogfSkpOwogLy8gUmVtb3ZlIGFueSBsZWZ0b3ZlciBzb2xpZCBzcXVhcmUgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoZSB0d28gYnJpZGdlcy4KIC8vIERvIG5vdCByZW1vdmUgdGhlIGFyZW5hIGJhc2UsIGdyYXNzIGZpZWxkLCByaXZlciBzdXJmYWNlLCBicmlkZ2UgZGVja3Mgb3IgZGVwbG95bWVudCBtYXJrZXIuCiBmb3IoY29uc3QgY2hpbGQgb2YgWy4uLmcuY2hpbGRyZW5dKXsKICBpZihjaGlsZD09PWJhc2V8fGNoaWxkPT09ZmllbGR8fGNoaWxkPT09d2F0ZXIpY29udGludWU7CiAgY29uc3QgcD1jaGlsZC5wb3NpdGlvbnx8e30sZ2VvPWNoaWxkLmdlb21ldHJ5OwogIGlmKE1hdGguYWJzKHAueHx8MCk8MS42JiZNYXRoLmFicyhwLnp8fDApPDEuNiYmZ2VvJiZnZW8udHlwZT09PSJCb3hHZW9tZXRyeSIpewogICBjb25zdCBxPWdlby5wYXJhbWV0ZXJzfHx7fTsKICAgaWYocS53aWR0aD49MS40JiZxLndpZHRoPD02JiZxLmRlcHRoPj0xLjQmJnEuZGVwdGg8PTYpZy5yZW1vdmUoY2hpbGQpOwogIH0KIH0KIGdhbWUuZGVwbG95TWFya2VyPWN5bCguNjUsLjgsLjA2LDB4NGVmZjg4LDMyKTtnYW1lLmRlcGxveU1hcmtlci5wb3NpdGlvbi55PS4xNjsKIGdhbWUuZGVwbG95TWFya2VyLm1hdGVyaWFsLnRyYW5zcGFyZW50PXRydWU7Z2FtZS5kZXBsb3lNYXJrZXIubWF0ZXJpYWwub3BhY2l0eT0uNTU7Z2FtZS5kZXBsb3lNYXJrZXIudmlzaWJsZT1mYWxzZTtnLmFkZChnYW1lLmRlcGxveU1hcmtlcik7Cn0KCmZ1bmN0aW9uIHRvd2VyTW9kZWwoc2lkZSxraW5kKXsKIGNvbnN0IGNvbG9yPXNpZGU9PT0wPzB4MjU4YmU4OjB4ZTg0MjVlLGc9bmV3IFRIUkVFLkdyb3VwKCk7CiBjb25zdCBiYXNlPWN5bChraW5kPT09ImtpbmciPzEuNDU6MS4xLGtpbmQ9PT0ia2luZyI/MS42OjEuMjUsMS4xLDB4NzQ3YjkxKTtiYXNlLnBvc2l0aW9uLnk9LjU1O2cuYWRkKGJhc2UpOwogY29uc3QgYm9keT1ib3goa2luZD09PSJraW5nIj8yLjQ6MS44LGtpbmQ9PT0ia2luZyI/Mi4xOjEuNjUsa2luZD09PSJraW5nIj8yLjQ6MS44LGNvbG9yKTtib2R5LnBvc2l0aW9uLnk9MS43NTtnLmFkZChib2R5KTsKIGNvbnN0IHJvb2Y9Y3lsKDAsa2luZD09PSJraW5nIj8xLjc6MS4zNSwxLjI1LGNvbG9yLDQpO3Jvb2Yucm90YXRpb24ueT1NYXRoLlBJLzQ7cm9vZi5wb3NpdGlvbi55PTMuMjU7Zy5hZGQocm9vZik7CiBjb25zdCBjYW5ub249Y3lsKC4yLC4yOCwxLjEsMHgyODJmNDApO2Nhbm5vbi5yb3RhdGlvbi54PU1hdGguUEkvMjtjYW5ub24ucG9zaXRpb24uc2V0KDAsMi43NSxzaWRlPT09MD8tLjg6LjgpO2cuYWRkKGNhbm5vbik7CiByZXR1cm4gZzsKfQpmdW5jdGlvbiBhZGRUb3dlcihzaWRlLGtpbmQseCx6KXsKIGNvbnN0IG9iaj10b3dlck1vZGVsKHNpZGUsa2luZCk7b2JqLnBvc2l0aW9uLnNldCh4LDAseik7c2NlbmUuYWRkKG9iaik7CiBjb25zdCBtYXg9a2luZD09PSJraW5nIj8oNDIwMCsoc2lkZT09PTA/KE51bWJlcihzYXZlLmtpbmdIcEJvbnVzKXx8MCk6MCkpOjI3MDA7CiBjb25zdCBraW5nQm9udXM9TnVtYmVyKHNhdmUua2luZ0hwQm9udXMpfHwwO2NvbnN0IHQ9e2tpbmQsc2lkZSxvYmoseCx6LGhwOm1heCxtYXgsZGFtYWdlOmtpbmQ9PT0ia2luZyI/KDExNSsoc2lkZT09PTA/a2luZ0JvbnVzOjApKTo5MixyYW5nZTpraW5kPT09ImtpbmciPzc6Ni41LHJhdGU6a2luZD09PSJraW5nIj8uOToxLjA1LGNvb2w6cmFuZCgwLC41KSxkZWFkOmZhbHNlLHRhcmdldDpudWxsfTsKIGFkZEhQKHQsa2luZD09PSJraW5nIj80LjQ6My44KTtnYW1lLnRvd2Vycy5wdXNoKHQpO3JldHVybiB0Owp9CmZ1bmN0aW9uIGFkZEhQKGVudGl0eSx5KXsKIGNvbnN0IGdyb3VwPW5ldyBUSFJFRS5Hcm91cCgpLGJnPWJveCgxLjksLjEzLC4wOCwweDE3MWIyNyksZmlsbD1ib3goMS44MiwuMDksLjEsZW50aXR5LnNpZGU9PT0wPzB4MzZiZGZmOjB4ZmY0OTY2KTsKIGdyb3VwLmFkZChiZyxmaWxsKTtncm91cC5wb3NpdGlvbi55PXk7ZW50aXR5Lm9iai5hZGQoZ3JvdXApO2VudGl0eS5ocEJhcj17Z3JvdXAsZmlsbH07Cn0KZnVuY3Rpb24gdXBkYXRlSFAoZSl7CiBjb25zdCBwPWNsYW1wKGUuaHAvZS5tYXgsMCwxKTtlLmhwQmFyLmZpbGwuc2NhbGUueD1wO2UuaHBCYXIuZmlsbC5wb3NpdGlvbi54PS0oMS1wKSouOTE7CiBlLmhwQmFyLmZpbGwubWF0ZXJpYWwuY29sb3Iuc2V0SGV4KHA+LjU/KGUuc2lkZT09PTA/MHgzNmJkZmY6MHhmZjQ5NjYpOnA+LjIyPzB4ZmZjNTMyOjB4ZmYzMDI1KTsKfQoKZnVuY3Rpb24gdW5pdE1vZGVsKGMsc2lkZSl7CiBjb25zdCBnPW5ldyBUSFJFRS5Hcm91cCgpLHRlYW09c2lkZT09PTA/MHgzOGE4ZmY6MHhmZjUxNmQ7CiBpZighTnVtYmVyLmlzRmluaXRlKGMuY29sb3IpKWM9ey4uLmMsY29sb3I6MHg3YWE2ZDl9OwogaWYoYy5uYW1lJiZjLm5hbWUuaW5jbHVkZXMoIti52Ybaqdio2YjYqiIpKXsKICBjb25zdCBzaGFkb3c9bWVzaChuZXcgVEhSRUUuQ2lyY2xlR2VvbWV0cnkoLjYyLDE4KSxuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOjB4MDAwMDAwLHRyYW5zcGFyZW50OnRydWUsb3BhY2l0eTouMjN9KSk7c2hhZG93LnJvdGF0aW9uLng9LU1hdGguUEkvMjtzaGFkb3cucG9zaXRpb24ueT0uMDM7Zy5hZGQoc2hhZG93KTsKICBjb25zdCBhYmRvbWVuPXNwaGVyZSguNDgsYy5jb2xvciwxMik7YWJkb21lbi5zY2FsZS5zZXQoMS4xOCwuNzgsMS4zNSk7YWJkb21lbi5wb3NpdGlvbi5zZXQoMCwuNTgsLS4yOCk7Zy5hZGQoYWJkb21lbik7CiAgY29uc3QgaGVhZD1zcGhlcmUoLjMxLGMuY29sb3IsMTIpO2hlYWQucG9zaXRpb24uc2V0KDAsLjU3LC40Mik7Zy5hZGQoaGVhZCk7CiAgZm9yKGxldCBpPTA7aTw0O2krKylmb3IoY29uc3Qgc2lkZVNpZ24gb2YgWy0xLDFdKXtjb25zdCBsZWc9Ym94KC43MiwuMDksLjEyLGMuY29sb3IpO2xlZy5wb3NpdGlvbi5zZXQoc2lkZVNpZ24qKC40MitpKi4wMzUpLC4zMiwoaS0xLjUpKi4yNyk7bGVnLnJvdGF0aW9uLnk9c2lkZVNpZ24qKC4zOCtpKi4xMik7bGVnLnJvdGF0aW9uLno9c2lkZVNpZ24qKC4yOCtpKi4wOCk7Zy5hZGQobGVnKX0KICBmb3IobGV0IGk9MDtpPDM7aSsrKXtjb25zdCBleWU9c3BoZXJlKC4wNTUsMHhmZmU0NmIsOCk7ZXllLnBvc2l0aW9uLnNldCgoaS0xKSouMTMsLjY4LC42OCk7Zy5hZGQoZXllKX0KICBnLnVzZXJEYXRhLmJvZHk9YWJkb21lbjtnLnVzZXJEYXRhLmhlYWQ9aGVhZDtyZXR1cm4gZzsKIH0KIC8vIFBhbGUgYm9uZSB1bml0cyB3ZXJlIHdhc2hpbmcgb3V0IHRvIHB1cmUgd2hpdGUgb24gc29tZSBtb2JpbGUgR1BVczsgdXNlIGEgcmVhZGFibGUgaXZvcnkgdGludC4KIGlmKGMuY29sb3I9PT0weGVlZWVjYyljPXsuLi5jLGNvbG9yOjB4ODk5Yjc4fTsKIGNvbnN0IHNoYWRvdz1tZXNoKG5ldyBUSFJFRS5DaXJjbGVHZW9tZXRyeShjLmxhcmdlPy42NTouNDMsMTgpLG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6MHgwMDAwMDAsdHJhbnNwYXJlbnQ6dHJ1ZSxvcGFjaXR5Oi4yNX0pKTsKIHNoYWRvdy5yb3RhdGlvbi54PS1NYXRoLlBJLzI7c2hhZG93LnBvc2l0aW9uLnk9LjAzO2cuYWRkKHNoYWRvdyk7CiBjb25zdCBib2R5PWN5bChjLmxhcmdlPy41MjouMzUsYy5sYXJnZT8uNjU6LjQzLGMubGFyZ2U/MS4yNTouOSxjLmNvbG9yLDgpO2JvZHkucG9zaXRpb24ueT1jLmFpcj8yLjQ6LjYyO2cuYWRkKGJvZHkpOwogY29uc3QgaGVhZD1zcGhlcmUoYy5sYXJnZT8uMzg6LjI3LDB4ZjJjMjk4LDEwKTtoZWFkLnBvc2l0aW9uLnk9KGMuYWlyPzIuNDouNjIpKyhjLmxhcmdlPzE6LjcyKTtnLmFkZChoZWFkKTsKIGNvbnN0IGhlbG1ldD1jeWwoLjA1LGMubGFyZ2U/LjQyOi4zMSwuMzMsdGVhbSw4KTtoZWxtZXQucG9zaXRpb24ueT1oZWFkLnBvc2l0aW9uLnkrLjE1O2cuYWRkKGhlbG1ldCk7CiBpZihjLnByb2plY3RpbGUpe2NvbnN0IHN0YWZmPWN5bCguMDYsLjA2LDEuMiwweDVhMzgyMyk7c3RhZmYucG9zaXRpb24uc2V0KC40NSxib2R5LnBvc2l0aW9uLnksLjA1KTtzdGFmZi5yb3RhdGlvbi56PS4yO2cuYWRkKHN0YWZmKX0KIGlmKGMuYWlyKXsKICBjb25zdCB3aW5nTWF0PW5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6Yy5jb2xvcixyb3VnaG5lc3M6LjQ4LG1ldGFsbmVzczouMTIsc2lkZTpUSFJFRS5Eb3VibGVTaWRlfSk7CiAgY29uc3Qgd2luZ0w9bWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoMS4wNSwuMDksLjU4KSx3aW5nTWF0KTt3aW5nTC5wb3NpdGlvbi5zZXQoLS43MiwyLjM1LC0uMDgpO3dpbmdMLnJvdGF0aW9uLno9LjIyO2cuYWRkKHdpbmdMKTsKICBjb25zdCB3aW5nUj1tZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgxLjA1LC4wOSwuNTgpLHdpbmdNYXQpO3dpbmdSLnBvc2l0aW9uLnNldCguNzIsMi4zNSwtLjA4KTt3aW5nUi5yb3RhdGlvbi56PS0uMjI7Zy5hZGQod2luZ1IpOwogIGNvbnN0IHRhaWw9bWVzaChuZXcgVEhSRUUuQ29uZUdlb21ldHJ5KC4yMiwuOSw3KSxjLmNvbG9yKTt0YWlsLnBvc2l0aW9uLnNldCgwLDIuMjUsLS43OCk7dGFpbC5yb3RhdGlvbi54PS1NYXRoLlBJLzI7Zy5hZGQodGFpbCk7CiAgZy51c2VyRGF0YS53aW5ncz1bd2luZ0wsd2luZ1JdOwogfQogZy51c2VyRGF0YS5ib2R5PWJvZHk7Zy51c2VyRGF0YS5oZWFkPWhlYWQ7cmV0dXJuIGc7Cn0KZnVuY3Rpb24gYnVpbGRpbmdNb2RlbChjLHNpZGUpewogY29uc3QgZz1uZXcgVEhSRUUuR3JvdXAoKSxiYXNlPWN5bCguOSwxLjE1LC42NSxzaWRlPT09MD8weDI4NzhjNjoweGJkMzA0Yyk7YmFzZS5wb3NpdGlvbi55PS4zNTtnLmFkZChiYXNlKTsKIGNvbnN0IGJvZHk9Ym94KDEuMjUsMS4xLDEuMjUsYy5jb2xvcik7Ym9keS5wb3NpdGlvbi55PTEuMTU7Zy5hZGQoYm9keSk7CiBpZihjLmhlYWwpe2NvbnN0IGNyb3duPXNwaGVyZSguNywweDM5ZDE3Nyw5KTtjcm93bi5wb3NpdGlvbi55PTI7Zy5hZGQoY3Jvd24pfQogZWxzZXtjb25zdCBndW49Y3lsKC4xOCwuMjgsMS40LGMuY29sb3IpO2d1bi5yb3RhdGlvbi54PU1hdGguUEkvMjtndW4ucG9zaXRpb24ueT0xLjk7Zy5hZGQoZ3VuKX0KIHJldHVybiBnOwp9CmZ1bmN0aW9uIHNwYXduQ2FyZChpZCxzaWRlLHBvcyxsZXZlbE92ZXJyaWRlPW51bGwpewogY29uc3QgYz1DQVJEU1tpZF0sbHY9Y2xhbXBDYXJkTGV2ZWwoaWQsTWF0aC5tYXgoMSxsZXZlbE92ZXJyaWRlfHxzYXZlLm93bmVkW2lkXXx8MSkpOwogaWYoYy50eXBlPT09Itis2KfYr9mIIilyZXR1cm4gY2FzdNis2KfYr9mIKGlkLHNpZGUscG9zLGx2KTsKIGNvbnN0IGNvdW50PWMuY291bnR8fDE7CiBmb3IobGV0IGk9MDtpPGNvdW50O2krKyl7CiAgY29uc3QgcD17eDpjbGFtcChwb3MueCtyYW5kKC0uNjUsLjY1KSwtMTUuNSwxNS41KSx6OmNsYW1wKHBvcy56K3JhbmQoLS42NSwuNjUpLC0yMi41LDIyLjUpfTsKICBjb25zdCBpc9iz2KfYrtiq2YXYp9mGPWMudHlwZT09PSLYs9in2K7YqtmF2KfZhiIsb2JqPWlz2LPYp9iu2KrZhdin2YY/YnVpbGRpbmdNb2RlbChjLHNpZGUpOnVuaXRNb2RlbChjLHNpZGUpOwogIG9iai5wb3NpdGlvbi5zZXQocC54LDAscC56KTtvYmouc2NhbGUuc2V0KC4wNSwuMDUsLjA1KTtzY2VuZS5hZGQob2JqKTsKICBjb25zdCBzY2FsZT1jYXJkTGV2ZWxTY2FsZShsdik7CiAgY29uc3Qgc2NhbGVkQ2FyZD17Li4uYyxocDooYy5ocHx8MSkqc2NhbGUsZGFtYWdlOihjLmRhbWFnZXx8MCkqc2NhbGUsaGVhbDooYy5oZWFsfHwwKSpzY2FsZX07CiAgY29uc3QgdT17aWQsY2FyZDpzY2FsZWRDYXJkLHNpZGUsb2JqLGhwOihjLmhwfHwxKSpzY2FsZSxtYXg6KGMuaHB8fDEpKnNjYWxlLGRhbWFnZTooYy5kYW1hZ2V8fDApKnNjYWxlLAogICBzcGVlZDpjLnNwZWVkLHJhbmdlOmMucmFuZ2UscmF0ZTpjLnJhdGUsY29vbDpyYW5kKC4xLC41KSx0YXJnZXQ6bnVsbCxkZWFkOmZhbHNlLGJ1aWxkaW5nOmlz2LPYp9iu2KrZhdin2YYsCiAgIGFpcjohIWMuYWlyLGxpZmU6Yy5saWZlfHw5OTksZnJvemVuOjAscmFnZTowLHJldGFyZ2V0OjAsc3Bhd246LjMyLGhpdEZsYXNoOjB9OwogIGFkZEhQKHUsaXPYs9in2K7YqtmF2KfZhj8yLjg6KGMuYWlyPzMuNTU6Yy5sYXJnZT8yLjU6MS45NSkpO2dhbWUudW5pdHMucHVzaCh1KTsKICBidXJzdChwLngsaXPYs9in2K7YqtmF2KfZhj8xOjAuNCxwLnosc2lkZT09PTA/MHg1MGM5ZmY6MHhmZjYxNzcsOSk7CiB9CiBBdWRpb1N5cy5kZXBsb3koKTsKfQpmdW5jdGlvbiBjYXN02KzYp9iv2YgoaWQsc2lkZSxwLGxldmVsPTEpewogY29uc3QgYz1DQVJEU1tpZF0sbHY9Y2xhbXBDYXJkTGV2ZWwoaWQsTWF0aC5tYXgoMSxsZXZlbCkpLHNjYWxlPWNhcmRMZXZlbFNjYWxlKGx2KSxzcGVsbERhbWFnZT0oYy5kYW1hZ2V8fDApKnNjYWxlOwogaWYoaWQ9PT0ibWV0ZW9yc3Rvcm0iKXsKICBjb25zdCB0YXJnZXRzPWVuZW1pZXNJbihzaWRlLHAsYy5yYWRpdXMpO3RhcmdldHMuZm9yRWFjaCgodCxpKT0+c2V0VGltZW91dCgoKT0+e2lmKCFnYW1lfHx0LmRlYWQpcmV0dXJuO2RhbWFnZSh0LHNwZWxsRGFtYWdlLHNpZGUpO2J1cnN0KHQub2JqLnBvc2l0aW9uLngsLjUsdC5vYmoucG9zaXRpb24ueiwweGZmOGEzNywxOCl9LGkqOTApKTtjaXJjbGVGWChwLDB4ZmY4YTM3LGMucmFkaXVzKTsKIH1lbHNlIGlmKGlkPT09ImZpcmVvcmIiKXsKICBjb25zdCBvcmI9c3BoZXJlKC40MiwweGZmNWEyMCk7b3JiLm1hdGVyaWFsLmVtaXNzaXZlPW5ldyBUSFJFRS5Db2xvcigweGZmMjUwMCk7CiAgb3JiLnBvc2l0aW9uLnNldChwLngsMTIscC56KzQpO3NjZW5lLmFkZChvcmIpOwogIGdhbWUuc3BlbGxGWC5wdXNoKHt0eXBlOiJvcmIiLG9iajpvcmIsdDowLGQ6LjY1LHAsc2lkZSxjOnsuLi5jLGRhbWFnZTpzcGVsbERhbWFnZX19KTsKIH1lbHNlIGlmKGlkPT09InRodW5kZXJjaGFpbiIpewogIGNvbnN0IHRhcmdldHM9ZW5lbWllc0luKHNpZGUscCxjLnJhZGl1cykuc29ydCgoYSxiKT0+Yi5ocC1hLmhwKS5zbGljZSgwLDMpOwogIHRhcmdldHMuZm9yRWFjaCgodCxpKT0+c2V0VGltZW91dCgoKT0+e2lmKCFnYW1lfHx0LmRlYWQpcmV0dXJuO2xpZ2h0bmluZyh0Lm9iai5wb3NpdGlvbik7ZGFtYWdlKHQsc3BlbGxEYW1hZ2Usc2lkZSl9LGkqMTMwKSk7CiAgaWYoIXRhcmdldHMubGVuZ3RoKWxpZ2h0bmluZyhuZXcgVEhSRUUuVmVjdG9yMyhwLngsMCxwLnopKTsKIH1lbHNlIGlmKGlkPT09ImZyb3N0c2VhbCIpewogIGNpcmNsZUZYKHAsMHg2ZWVlZmYsYy5yYWRpdXMpOwogIGVuZW1pZXNJbihzaWRlLHAsYy5yYWRpdXMpLmZvckVhY2godD0+e3QuZnJvemVuPWMuZHVyYXRpb247ZGFtYWdlKHQsc3BlbGxEYW1hZ2Usc2lkZSl9KTsKIH1lbHNlIGlmKGlkPT09IndhcmNyeSIpewogIGNpcmNsZUZYKHAsMHhmZjRmYzYsYy5yYWRpdXMpOwogIGZyaWVuZHNJbihzaWRlLHAsYy5yYWRpdXMpLmZvckVhY2godD0+dC5yYWdlPWMuZHVyYXRpb24qKDErKE1hdGgubWF4KDEsbGV2ZWwpLTEpKi4wMjUpKTsKIH0KIEF1ZGlvU3lzLmJvb20oKTsKfQpmdW5jdGlvbiBlbmVtaWVzSW4oc2lkZSxwLHIpe3JldHVybiBbLi4uZ2FtZS51bml0cywuLi5nYW1lLnRvd2Vyc10uZmlsdGVyKHg9PiF4LmRlYWQmJnguc2lkZSE9PXNpZGUmJmRpc3QyKHgscCk8PXIpfQpmdW5jdGlvbiBmcmllbmRzSW4oc2lkZSxwLHIpe3JldHVybiBnYW1lLnVuaXRzLmZpbHRlcih4PT4heC5kZWFkJiZ4LnNpZGU9PT1zaWRlJiZkaXN0Mih4LHApPD1yKX0KZnVuY3Rpb24gZGlzdDIoYSxiKXtjb25zdCB4PShhLm9iaj8ucG9zaXRpb24ueD8/YS54KS1iLngsej0oYS5vYmo/LnBvc2l0aW9uLno/P2EueiktYi56O3JldHVybiBNYXRoLmh5cG90KHgseil9CmZ1bmN0aW9uIGNpcmNsZUZYKHAsY29sb3Iscil7CiBjb25zdCByaW5nPW1lc2gobmV3IFRIUkVFLlJpbmdHZW9tZXRyeShyKi44LHIsNDApLG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3IsdHJhbnNwYXJlbnQ6dHJ1ZSxvcGFjaXR5Oi43NSxzaWRlOlRIUkVFLkRvdWJsZVNpZGV9KSk7CiByaW5nLnJvdGF0aW9uLng9LU1hdGguUEkvMjtyaW5nLnBvc2l0aW9uLnNldChwLngsLjIscC56KTtzY2VuZS5hZGQocmluZyk7Z2FtZS5lZmZlY3RzLnB1c2goe29iajpyaW5nLHQ6MCxkOjEuMix0eXBlOiJyaW5nIn0pOwp9CmZ1bmN0aW9uIGxpZ2h0bmluZyh2KXsKIGNvbnN0IHB0cz1bXTtmb3IobGV0IGk9MDtpPDg7aSsrKXB0cy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IzKHYueCtyYW5kKC0uMjUsLjI1KSw5LWkqMS4xNSx2LnorcmFuZCgtLjI1LC4yNSkpKTsKIGNvbnN0IGdlbz1uZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKHB0cyksbGluZT1uZXcgVEhSRUUuTGluZShnZW8sbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKHtjb2xvcjoweGQ5ZmZmZix0cmFuc3BhcmVudDp0cnVlLG9wYWNpdHk6MX0pKTsKIHNjZW5lLmFkZChsaW5lKTtnYW1lLmVmZmVjdHMucHVzaCh7b2JqOmxpbmUsdDowLGQ6LjMsdHlwZToiZmFkZSJ9KTtidXJzdCh2LngsLjQsdi56LDB4YmVmOWZmLDE1KTsKfQpmdW5jdGlvbiBidXJzdCh4LHkseixjb2xvcixuPTgpewogaWYoIWdhbWUpcmV0dXJuOwogZm9yKGxldCBpPTA7aTxuO2krKyl7CiAgY29uc3Qgbz1zcGhlcmUocmFuZCguMDUsLjEyKSxjb2xvciw1KTtvLnBvc2l0aW9uLnNldCh4LHkseik7c2NlbmUuYWRkKG8pOwogIGdhbWUucGFydGljbGVzLnB1c2goe29iajpvLHY6bmV3IFRIUkVFLlZlY3RvcjMocmFuZCgtMiwyKSxyYW5kKDEuNSw0KSxyYW5kKC0yLDIpKSxsaWZlOnJhbmQoLjM1LC43NSl9KTsKIH0KfQpmdW5jdGlvbiBkYW1hZ2VOdW1iZXIodixuLGNvbG9yPSIjZmZmIil7CiBjb25zdCBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QudGV4dENvbnRlbnQ9TWF0aC5yb3VuZChuKTtkLnN0eWxlLmNzc1RleHQ9YHBvc2l0aW9uOmZpeGVkO3otaW5kZXg6MjA7Y29sb3I6JHtjb2xvcn07Zm9udC13ZWlnaHQ6MTAwMDtmb250LXNpemU6MThweDt0ZXh0LXNoYWRvdzowIDJweCAzcHggIzAwMDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246Ljc1c2A7CiBkb2N1bWVudC5ib2R5LmFwcGVuZChkKTtjb25zdCBxPXYuY2xvbmUoKS5wcm9qZWN0KGNhbWVyYSk7ZC5zdHlsZS5sZWZ0PShxLngqLjUrLjUpKmlubmVyV2lkdGgrInB4IjtkLnN0eWxlLnRvcD0oLXEueSouNSsuNSkqaW5uZXJIZWlnaHQrInB4IjsKIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2Quc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVZKC0zOHB4KSBzY2FsZSgxLjIpIjtkLnN0eWxlLm9wYWNpdHk9MH0pO3NldFRpbWVvdXQoKCk9PmQucmVtb3ZlKCksNzYwKTsKfQoKLyogLS0tLS0tLS0tLSDZhtio2LHYryBsb2dpYyAtLS0tLS0tLS0tICovCmZ1bmN0aW9uIHN0YXJ02YbYqNix2K8ocmVtb3RlRGVjaz1udWxsKXsKICQoIiNtYXRjaG1ha2luZyIpLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOyQoIiNtZW51IikuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7JCgiI2JhdHRsZSIpLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOwogaW5pdFRocmVlKCk7CiBjb25zdCBkZWNrPVsuLi5zYXZlLmRlY2tdLGJvdERlY2s9KG5vdmFPbmxpbmUmJkFycmF5LmlzQXJyYXkocmVtb3RlRGVjaykmJnJlbW90ZURlY2subGVuZ3RoPT09OCk/cmVtb3RlRGVjay5zbGljZSgpOnNodWZmbGUoWy4uLkNBUkRfSURTXSkuc2xpY2UoMCw4KTsKIGdhbWU9ewogIHJ1bm5pbmc6dHJ1ZSxwYXVzZWQ6ZmFsc2UsZW5kZWQ6ZmFsc2UsdGltZToyMTAsb3ZlcnRpbWU6ZmFsc2UsZWxpeGlyOjYsYm902Kfaqdiz24zYsTo2LAogIGRlY2ssaGFuZDpkZWNrLnNsaWNlKDAsNCkscXVldWU6ZGVjay5zbGljZSg0KSxzZWxlY3RlZDpudWxsLAogIGJvdERlY2ssYm90SGFuZDpib3REZWNrLnNsaWNlKDAsNCksYm90UXVldWU6Ym90RGVjay5zbGljZSg0KSxib3RUaGluazoxLjIsCiAgdW5pdHM6W10sdG93ZXJzOltdLHByb2plY3RpbGVzOltdLHBhcnRpY2xlczpbXSxlZmZlY3RzOltdLHNwZWxsRlg6W10sZmxhZ3M6W10sCiAgdG93ZXJzTG9zdDpbMCwwXSxjcm93bnM6WzAsMF0sc2hha2U6MCxhcmVuYTpzYXZlLmFyZW5hCiB9OwogYXJlbmFCdWlsZChzYXZlLmFyZW5hKTsKIGFkZFRvd2VyKDAsImNyb3duIiwtNS4yLDEyLjUpO2FkZFRvd2VyKDAsImNyb3duIiw1LjIsMTIuNSk7YWRkVG93ZXIoMCwia2luZyIsMCwxNi41KTsKIGFkZFRvd2VyKDEsImNyb3duIiwtNS4yLC0xMi41KTthZGRUb3dlcigxLCJjcm93biIsNS4yLC0xMi41KTthZGRUb3dlcigxLCJraW5nIiwwLC0xNi41KTsKIGNhbWVyYS5wb3NpdGlvbi5zZXQoMCwzNCwzNyk7Y2FtZXJhLmxvb2tBdCgwLDAsMCk7CiByZW5kZXJIYW5kKCk7aWYobm92YU9ubGluZSl7c2hvd9mG2KjYsdivTWVzc2FnZSgi2K3YsduM2YEg2KLZhtmE2KfbjNmGINmI2LXZhCDYtNivISIsMTQwMCk7Y29uc3QgcXVldWVkPW5vdmFQZW5kaW5nUGxheXMuc3BsaWNlKDApO3F1ZXVlZC5mb3JFYWNoKG5vdmFIYW5kbGVSZW1vdGVQbGF5KX1lbHNlIHNob3fZhtio2LHYr01lc3NhZ2UoIti02LHZiNi5INmG2KjYsdivISIsMTEwMCk7QXVkaW9TeXMubXVzaWMoKTsKIGlmKCFzYXZlLnR1dG9yaWFsKXNldFRpbWVvdXQoc2hvd1R1dG9yaWFsLDcwMCk7Cn0KZnVuY3Rpb24gc2h1ZmZsZShhKXtmb3IobGV0IGk9YS5sZW5ndGgtMTtpO2ktLSl7Y29uc3Qgaj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKGkrMSkpO1thW2ldLGFbal1dPVthW2pdLGFbaV1dfXJldHVybiBhfQpmdW5jdGlvbiBjeWNsZShzaWRlLGluZGV4KXsKIGlmKHNpZGU9PT0wKXtjb25zdCB1c2VkPWdhbWUuaGFuZFtpbmRleF0sbmV4dD1nYW1lLnF1ZXVlLnNoaWZ0KCk7Z2FtZS5oYW5kW2luZGV4XT1uZXh0O2dhbWUucXVldWUucHVzaCh1c2VkKTtnYW1lLnNlbGVjdGVkPW51bGw7cmVuZGVySGFuZCgpfQogZWxzZXtjb25zdCB1c2VkPWdhbWUuYm90SGFuZFtpbmRleF0sbmV4dD1nYW1lLmJvdFF1ZXVlLnNoaWZ0KCk7Z2FtZS5ib3RIYW5kW2luZGV4XT1uZXh0O2dhbWUuYm90UXVldWUucHVzaCh1c2VkKX0KfQpmdW5jdGlvbiByZW5kZXJIYW5kKCl7CgogJCQoIi5oYW5kLWNhcmQiKS5mb3JFYWNoKChlLGkpPT57CiAgY29uc3QgaWQ9Z2FtZS5oYW5kW2ldLGM9Q0FSRFNbaWRdOwogIGUuY2xhc3NOYW1lPSJoYW5kLWNhcmQiKyhnYW1lLnNlbGVjdGVkPT09aT8iIGNob3NlbiI6IiIpKyhnYW1lLmVsaXhpcjxjLmNvc3Q/IiBuby1lbGl4aXIiOiIiKTsKICBlLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iaGNvc3QiPiR7Yy5jb3N0fTwvZGl2PjxkaXYgY2xhc3M9ImhpY29uIj4ke2MuaWNvbn08L2Rpdj48ZGl2IGNsYXNzPSJobmFtZSI+JHtjLm5hbWV9PC9kaXY+YDsKICBlLm9uY2xpY2s9ZXY9Pntldi5zdG9wUHJvcGFnYXRpb24oKTtzZWxlY3RDYXJkKGkpfTsKIH0pOwogY29uc3Qgbj1DQVJEU1tnYW1lLnF1ZXVlWzBdXTskKCIjbmV4dENhcmQiKS5pbm5lckhUTUw9YNio2LnYr9uMPHNwYW4+JHtuLmljb259PC9zcGFuPmA7CiAkKCIjZWxpeGlyRmlsbCIpLnN0eWxlLndpZHRoPWdhbWUuZWxpeGlyKjEwKyIlIjskKCIjZWxpeGlyVGV4dCIpLnRleHRDb250ZW50PWAke01hdGguZmxvb3IoZ2FtZS5lbGl4aXIpfSAvIDEwYDsKfQpmdW5jdGlvbiBzZWxlY3RDYXJkKGkpewogaWYoIWdhbWUucnVubmluZ3x8Z2FtZS5wYXVzZWQpcmV0dXJuO0F1ZGlvU3lzLmNsaWNrKCk7CiBnYW1lLnNlbGVjdGVkPWdhbWUuc2VsZWN0ZWQ9PT1pP251bGw6aTtyZW5kZXJIYW5kKCk7CiAvLyBDYXJkIHNlbGVjdGlvbiBpcyBzaWxlbnQ6IGRvIG5vdCBzaG93IHRoZSBuYW1lL2Rlc2NyaXB0aW9uIHBvcHVwLgogJCgiI3VuaXRJbmZvIikuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpOwp9CmZ1bmN0aW9uIHBvaW50ZXJHcm91bmQoZSl7CiBjb25zdCByZWN0PXJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiBwb2ludGVyLnNldCgoZS5jbGllbnRYLXJlY3QubGVmdCkvcmVjdC53aWR0aCoyLTEsLSgoZS5jbGllbnRZLXJlY3QudG9wKS9yZWN0LmhlaWdodCkqMisxKTsKIHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHBvaW50ZXIsY2FtZXJhKTsKIGNvbnN0IHBsYW5lPW5ldyBUSFJFRS5QbGFuZShuZXcgVEhSRUUuVmVjdG9yMygwLDEsMCksMCksdj1uZXcgVEhSRUUuVmVjdG9yMygpOwogcmV0dXJuIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0UGxhbmUocGxhbmUsdik7Cn0KZnVuY3Rpb24gb25BcmVuYU1vdmUoZSl7CiBpZighZ2FtZT8ucnVubmluZ3x8Z2FtZS5zZWxlY3RlZD09bnVsbClyZXR1cm47CiBjb25zdCBwPXBvaW50ZXJHcm91bmQoZSk7aWYoIXApcmV0dXJuOwogZ2FtZS5kZXBsb3lNYXJrZXIucG9zaXRpb24uc2V0KGNsYW1wKHAueCwtMTUuMiwxNS4yKSwuMTYsY2xhbXAocC56LC0yMC44LDIwLjgpKTsKIGNvbnN0IGM9Q0FSRFNbZ2FtZS5oYW5kW2dhbWUuc2VsZWN0ZWRdXSxsZWdhbD1jLnR5cGU9PT0i2KzYp9iv2YgifHxwLno+MS43OwogZ2FtZS5kZXBsb3lNYXJrZXIubWF0ZXJpYWwuY29sb3Iuc2V0SGV4KGxlZ2FsPzB4NGVmZjg4OjB4ZmYzMzQ0KTtnYW1lLmRlcGxveU1hcmtlci52aXNpYmxlPWZhbHNlOwp9CmZ1bmN0aW9uIG9uQXJlbmFEb3duKGUpewogaWYoIWdhbWU/LnJ1bm5pbmd8fGdhbWUucGF1c2VkfHxnYW1lLnNlbGVjdGVkPT1udWxsKXJldHVybjsKIGNvbnN0IHA9cG9pbnRlckdyb3VuZChlKTtpZighcClyZXR1cm47CiBjb25zdCBpZHg9Z2FtZS5zZWxlY3RlZCxpZD1nYW1lLmhhbmRbaWR4XSxjPUNBUkRTW2lkXTsKIGlmKGdhbWUuZWxpeGlyPGMuY29zdClyZXR1cm4gdG9hc3QoItin2qnYs9uM2LEg2qnYp9mB24wg2YbbjNiz2KohIik7CiBpZihjLnR5cGUhPT0i2KzYp9iv2YgiJiZwLno8MS43KXJldHVybiB0b2FzdCgi2YbbjNix2YjZh9inINix2Kcg2YHZgti3INiv2LEg2LLZhduM2YYg2K7ZiNiv2Kog2YLYsdin2LEg2KjYr9mHISIpOwogaWYoTWF0aC5hYnMocC54KT4xNS44fHxNYXRoLmFicyhwLnopPjIyLjUpcmV0dXJuOwogZ2FtZS5lbGl4aXItPWMuY29zdDtzcGF3bkNhcmQoaWQsMCx7eDpwLngsejpwLnp9KTtpZihub3ZhT25saW5lJiZub3ZhQ29ubj8ub3Blbil0cnl7bm92YUNvbm4uc2VuZCh7dDoicGxheSIsaWQseDpwLngsejpwLnosbGV2ZWw6TWF0aC5tYXgoMSxzYXZlLm93bmVkW2lkXXx8MSl9KX1jYXRjaChlKXt9Y3ljbGUoMCxpZHgpO2dhbWUuZGVwbG95TWFya2VyLnZpc2libGU9ZmFsc2U7cmVuZGVySGFuZCgpOwp9CmZ1bmN0aW9uIG5lYXJlc3RUYXJnZXQodSl7CiBsZXQgY2FuZGlkYXRlczsKIGlmKHUuY2FyZC50YXJnZXQ9PT0iYnVpbGRpbmdzIiljYW5kaWRhdGVzPVsuLi5nYW1lLnVuaXRzLmZpbHRlcih4PT54LmJ1aWxkaW5nKSwuLi5nYW1lLnRvd2Vyc107CiBlbHNlIGNhbmRpZGF0ZXM9Wy4uLmdhbWUudW5pdHMsLi4uZ2FtZS50b3dlcnNdOwogY2FuZGlkYXRlcz1jYW5kaWRhdGVzLmZpbHRlcih4PT4heC5kZWFkJiZ4LnNpZGUhPT11LnNpZGUmJih1LmNhcmQudGFyZ2V0PT09ImFsbCJ8fCF4LmFpcikpOwogbGV0IGJlc3Q9bnVsbCxzY29yZT0xZTk7CiBmb3IoY29uc3QgeCBvZiBjYW5kaWRhdGVzKXsKICBsZXQgZD1kaXN0Mih1LHgub2JqLnBvc2l0aW9uKTsKICBpZih4LmtpbmQ9PT0ia2luZyImJiFnYW1lLnRvd2Vycy5zb21lKHQ9PnQuc2lkZT09PXguc2lkZSYmdC5raW5kPT09ImNyb3duIiYmIXQuZGVhZCkpZC09MjsKICBpZihkPHNjb3JlKXtzY29yZT1kO2Jlc3Q9eH0KIH0KIHJldHVybiBiZXN0Owp9CmZ1bmN0aW9uIHBhdGhHb2FsKHUsdGFyZ2V0KXsKIGNvbnN0IHBvcz11Lm9iai5wb3NpdGlvbix0cD10YXJnZXQub2JqLnBvc2l0aW9uOwogaWYodS5haXJ8fHUuYnVpbGRpbmcpe3UuYnJpZGdlWD1udWxsO3UuYnJpZGdlRGlyPTA7cmV0dXJuIHRwfQogY29uc3Qgb3Bwb3NpdGU9KHBvcy56PjAmJnRwLno8MCl8fChwb3MuejwwJiZ0cC56PjApOwogaWYob3Bwb3NpdGUmJnUuYnJpZGdlWD09bnVsbCl7CiAgIHUuYnJpZGdlWD1NYXRoLmFicyhwb3MueC01LjIpPE1hdGguYWJzKHBvcy54KzUuMik/NS4yOi01LjI7CiAgIHUuYnJpZGdlRGlyPXBvcy56PjA/LTE6MTsKIH0KIGlmKHUuYnJpZGdlWCE9PW51bGwgJiYgdS5icmlkZ2VYIT09dW5kZWZpbmVkKXsKICAgY29uc3QgYng9dS5icmlkZ2VYLCBob21lU2lkZT0tdS5icmlkZ2VEaXI7CiAgIC8vIEFsaWduIHRvIHRoZSBjZW50cmUgb2YgdGhlIGJyaWRnZSBmaXJzdC4gRG8gbm90IG1vdmUgdG93YXJkIHRoZSByaXZlciB1bnRpbCBhbGlnbmVkLgogICBpZihNYXRoLmFicyhwb3MueC1ieCk+MC4yMikgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKGJ4LDAscG9zLnopOwogICAvLyBDcm9zcyB0aGUgZnVsbCByaXZlciBhbG9uZyB0aGUgYnJpZGdlIGNlbnRyZSBsaW5lLgogICBpZihNYXRoLnNpZ24ocG9zLnp8fGhvbWVTaWRlKT09PWhvbWVTaWRlICYmIE1hdGguYWJzKHBvcy56KT4wLjI1KQogICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMyhieCwwLGhvbWVTaWRlKjAuMTUpOwogICBpZihNYXRoLmFicyhwb3Mueik8PTIuMjUpCiAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKGJ4LDAsdS5icmlkZ2VEaXIqMy4xNSk7CiAgIGlmKE1hdGguc2lnbihwb3Mueik9PT11LmJyaWRnZURpciAmJiBNYXRoLmFicyhwb3Mueik+Mi4yNSl7dS5icmlkZ2VYPW51bGw7dS5icmlkZ2VEaXI9MDtyZXR1cm4gdHB9CiAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMyhieCwwLHUuYnJpZGdlRGlyKjMuMTUpOwogfQogcmV0dXJuIHRwOwp9CmZ1bmN0aW9uIHVwZGF0ZVVuaXQodSxkdCl7CiBpZih1LmRlYWQpcmV0dXJuOwogdS5zcGF3bi09ZHQ7aWYodS5zcGF3bj4wKXtjb25zdCBzPTEtdS5zcGF3bi8uMzI7dS5vYmouc2NhbGUuc2V0U2NhbGFyKE1hdGgubWF4KC4wNSxzKSk7dS5vYmoucm90YXRpb24ueSs9ZHQqODtyZXR1cm59CiB1Lm9iai5zY2FsZS5zZXRTY2FsYXIoMSk7dS5saWZlLT1kdDtpZih1LmxpZmU8PTApcmV0dXJuIGtpbGwodSk7CiB1LmZyb3plbj1NYXRoLm1heCgwLHUuZnJvemVuLWR0KTt1LnJhZ2U9TWF0aC5tYXgoMCx1LnJhZ2UtZHQpO3Uud2ViU2xvdz1NYXRoLm1heCgwLCh1LndlYlNsb3d8fDApLWR0KTsKIHUuc3R1blRpbWVyPU1hdGgubWF4KDAsKHUuc3R1blRpbWVyfHwwKS1kdCk7CiBpZigodS5kb3RUaW1lcnx8MCk+MCl7CiAgdS5kb3RUaW1lcj1NYXRoLm1heCgwLHUuZG90VGltZXItZHQpO3UuZG90VGljaz0odS5kb3RUaWNrfHwwKS1kdDsKICBpZih1LmRvdFRpY2s8PTAmJiF1LmRlYWQpe2RhbWFnZSh1LCh1LmRvdERwc3x8MCkqLjQ1LDEtdS5zaWRlKTt1LmRvdFRpY2s9LjQ1fQogfQogdS5jb29sLT1kdCoodS5yYWdlPzEuNTU6MSk7CiBpZih1LmZyb3plbnx8dS5zdHVuVGltZXI+MCl7dS5vYmoucm90YXRpb24uej1NYXRoLnNpbihwZXJmb3JtYW5jZS5ub3coKSouMDEpKi4wMztyZXR1cm59CiBpZih1LmNhcmQuaGVhbCl7CiAgaWYodS5jb29sPD0wKXtmcmllbmRzSW4odS5zaWRlLHUub2JqLnBvc2l0aW9uLHUucmFuZ2UpLmZvckVhY2goZj0+e2YuaHA9TWF0aC5taW4oZi5tYXgsZi5ocCt1LmNhcmQuaGVhbCk7dXBkYXRlSFAoZik7ZGFtYWdlTnVtYmVyKGYub2JqLnBvc2l0aW9uLHUuY2FyZC5oZWFsLCIjNjZmZjk5Iil9KTtnYW1lLnRvd2Vycy5maWx0ZXIodD0+dC5zaWRlPT09dS5zaWRlJiYhdC5kZWFkJiZNYXRoLmh5cG90KHQub2JqLnBvc2l0aW9uLngtdS5vYmoucG9zaXRpb24ueCx0Lm9iai5wb3NpdGlvbi56LXUub2JqLnBvc2l0aW9uLnopPD11LnJhbmdlKS5mb3JFYWNoKHQ9Pnt0LmhwPU1hdGgubWluKHQubWF4LHQuaHArdS5jYXJkLmhlYWwpO3VwZGF0ZUhQKHQpO2RhbWFnZU51bWJlcih0Lm9iai5wb3NpdGlvbix1LmNhcmQuaGVhbCwiIzY2ZmY5OSIpfSk7dS5jb29sPXUucmF0ZX0KICByZXR1cm47CiB9CiB1LnJldGFyZ2V0LT1kdDsKIGlmKCF1LnRhcmdldHx8dS50YXJnZXQuZGVhZHx8dS5yZXRhcmdldDw9MCl7dS50YXJnZXQ9bmVhcmVzdFRhcmdldCh1KTt1LnJldGFyZ2V0PS4zK01hdGgucmFuZG9tKCkqLjJ9CiBpZighdS50YXJnZXQpcmV0dXJuOwogY29uc3QgcG9zPXUub2JqLnBvc2l0aW9uLHRwPXUudGFyZ2V0Lm9iai5wb3NpdGlvbjsKIGNvbnN0IGQ9TWF0aC5oeXBvdChwb3MueC10cC54LHBvcy56LXRwLnopOwogY29uc3Qgc3RvcD11LnJhbmdlKyh1LnRhcmdldC5raW5kPzEuMDp1LnRhcmdldC5jYXJkPy5sYXJnZT8uNTU6LjI4KTsKIGlmKGQ8PXN0b3ApewogIGlmKHUuY29vbDw9MCl7CiAgIGlmKHUuY2FyZC5wcm9qZWN0aWxlKXNob290KHUsdS50YXJnZXQsdS5jYXJkLnNwbGFzaHx8MCk7CiAgIGVsc2V7CiAgICBkYW1hZ2UodS50YXJnZXQsdS5kYW1hZ2UsdS5zaWRlKTthcHBseUhpdEVmZmVjdHModSx1LnRhcmdldCk7YXR0YWNrQW5pbSh1KTsKICAgIGlmKHUuY2FyZC5zcGxhc2gpZW5lbWllc0luKHUuc2lkZSx1LnRhcmdldC5vYmoucG9zaXRpb24sdS5jYXJkLnNwbGFzaCkuZm9yRWFjaCh4PT57aWYoeCE9PXUudGFyZ2V0KXtkYW1hZ2UoeCx1LmRhbWFnZSouNDgsdS5zaWRlKTthcHBseUhpdEVmZmVjdHModSx4KX19KTsKICAgfQogICBpZih1LmNhcmQubmFtZSYmdS5jYXJkLm5hbWUuaW5jbHVkZXMoIti52Ybaqdio2YjYqiIpJiYhdS50YXJnZXQuZGVhZCl7dS50YXJnZXQud2ViU2xvdz1NYXRoLm1heCh1LnRhcmdldC53ZWJTbG93fHwwLDEuNCl9CiAgIHUuY29vbD11LnJhdGU7QXVkaW9TeXMuaGl0KCk7CiAgfQogfWVsc2UgaWYoIXUuYnVpbGRpbmcpewogIGNvbnN0IGdvYWw9cGF0aEdvYWwodSx1LnRhcmdldCksZGlyPW5ldyBUSFJFRS5WZWN0b3IzKGdvYWwueC1wb3MueCwwLGdvYWwuei1wb3Mueik7CiAgaWYoZGlyLmxlbmd0aCgpPi4wNSl7CiAgIGNvbnN0IGJvb3N0PSh1LnJhZ2U/MS4zNToxKSoodS53ZWJTbG93PjA/LjYyOjEpOwogICBjb25zdCBvbGRaPXBvcy56LG9sZFg9cG9zLng7CiAgIC8vIEF2b2lkYW5jZSBpcyBkaXNhYmxlZCB3aGlsZSBjcm9zc2luZyBhIGJyaWRnZSBzbyB0cm9vcHMgY2Fubm90IHB1c2ggZWFjaCBvdGhlciBpbnRvIHRoZSByaXZlci4KICAgaWYodS5icmlkZ2VYPT1udWxsKXsKICAgIGZvcihjb25zdCBvdGhlciBvZiBnYW1lLnVuaXRzKWlmKG90aGVyIT09dSYmIW90aGVyLmRlYWQmJm90aGVyLnNpZGU9PT11LnNpZGUmJiFvdGhlci5haXIpewogICAgIGNvbnN0IGRkPWRpc3QyKHUsb3RoZXIub2JqLnBvc2l0aW9uKTtpZihkZDwuNjUpZGlyLmFkZChuZXcgVEhSRUUuVmVjdG9yMyhwb3MueC1vdGhlci5vYmoucG9zaXRpb24ueCwwLHBvcy56LW90aGVyLm9iai5wb3NpdGlvbi56KS5tdWx0aXBseVNjYWxhciguMjUpKTsKICAgIH0KICAgfQogICBkaXIubm9ybWFsaXplKCk7cG9zLmFkZFNjYWxlZFZlY3RvcihkaXIsdS5zcGVlZCpib29zdCpkdCk7CiAgIGlmKCF1LmFpciYmIXUuYnVpbGRpbmcpewogICAgY29uc3QgbmVhckJyaWRnZT0odS5icmlkZ2VYIT1udWxsKXx8TWF0aC5taW4oTWF0aC5hYnMocG9zLngtNS4yKSxNYXRoLmFicyhwb3MueCs1LjIpKTwyLjA7CiAgICBpZih1LmJyaWRnZVghPW51bGwpewogICAgIHBvcy54PXUuYnJpZGdlWDsKICAgICBpZihNYXRoLmFicyhwb3Mueik+My4xNSAmJiBNYXRoLnNpZ24ocG9zLnopPT09dS5icmlkZ2VEaXIpe3UuYnJpZGdlWD1udWxsO3UuYnJpZGdlRGlyPTA7fQogICAgfWVsc2UgaWYoTWF0aC5hYnMocG9zLnopPDIuMSYmIW5lYXJCcmlkZ2Upe3Bvcy56PU1hdGguc2lnbihvbGRafHwodS5zaWRlPT09MD8xOi0xKSkqMi4xO30KICAgfQogICBwb3MueD1jbGFtcChwb3MueCwtMTUuNSwxNS41KTtwb3Muej1jbGFtcChwb3MueiwtMjIsMjIpO3Uub2JqLnJvdGF0aW9uLnk9TWF0aC5hdGFuMihkaXIueCxkaXIueik7CiAgIHUub2JqLnVzZXJEYXRhLmJvZHkucm90YXRpb24uej1NYXRoLnNpbihwZXJmb3JtYW5jZS5ub3coKSouMDEyK3Uub2JqLmlkKSouMDg7CiAgIGlmKHUuYWlyJiZ1Lm9iai51c2VyRGF0YS53aW5ncyl7Y29uc3QgZmxhcD1NYXRoLnNpbihwZXJmb3JtYW5jZS5ub3coKSouMDE4K3Uub2JqLmlkKSouNTU7dS5vYmoudXNlckRhdGEud2luZ3NbMF0ucm90YXRpb24uej0uMjIrZmxhcDt1Lm9iai51c2VyRGF0YS53aW5nc1sxXS5yb3RhdGlvbi56PS0uMjItZmxhcDt9CiAgIHUub2JqLnBvc2l0aW9uLnk9dS5haXI/Mi4xK01hdGguc2luKHBlcmZvcm1hbmNlLm5vdygpKi4wMDQrdS5vYmouaWQpKi4yMjpNYXRoLmFicyhNYXRoLnNpbihwZXJmb3JtYW5jZS5ub3coKSouMDA5K3Uub2JqLmlkKSkqLjA3OwogIH0KIH0KfQpmdW5jdGlvbiBhdHRhY2tBbmltKHUpe3Uub2JqLnNjYWxlLno9LjgyO3NldFRpbWVvdXQoKCk9PntpZih1Lm9iail1Lm9iai5zY2FsZS56PTF9LDEwMCl9CmZ1bmN0aW9uIHNob290KGZyb20sdG8sc3BsYXNoPTApewogY29uc3QgY29sb3I9ZnJvbS5raW5kPzB4ZmZkMjVjOmZyb20uY2FyZC5jb2xvcixvPXNwaGVyZShmcm9tLmtpbmQ/LjE2Oi4xMixjb2xvciw2KTsKIG8ubWF0ZXJpYWwuZW1pc3NpdmU9bmV3IFRIUkVFLkNvbG9yKGNvbG9yKS5tdWx0aXBseVNjYWxhciguMjIpO28ucG9zaXRpb24uY29weShmcm9tLm9iai5wb3NpdGlvbik7by5wb3NpdGlvbi55Kz1mcm9tLmtpbmQ/Mi43Oihmcm9tLmFpcj8yLjc6MS4xKTsKIHNjZW5lLmFkZChvKTtnYW1lLnByb2plY3RpbGVzLnB1c2goe29iajpvLHRhcmdldDp0byxkYW1hZ2U6ZnJvbS5kYW1hZ2Usc2lkZTpmcm9tLnNpZGUsc3BlZWQ6ZnJvbS5raW5kPzEzOjEwLHNwbGFzaCxzb3VyY2U6ZnJvbX0pOwogQXVkaW9TeXMuc2hvb3QoKTthdHRhY2tBbmltKGZyb20pOwp9CmZ1bmN0aW9uIHVwZGF0ZVByb2plY3RpbGUocCxkdCl7CiBpZihwLnRhcmdldC5kZWFkKXtzY2VuZS5yZW1vdmUocC5vYmopO3JldHVybiBmYWxzZX0KIGNvbnN0IGRlc3Q9cC50YXJnZXQub2JqLnBvc2l0aW9uLmNsb25lKCk7ZGVzdC55Kz1wLnRhcmdldC5raW5kPzEuNzoocC50YXJnZXQuYWlyPzIuMjouNyk7CiBjb25zdCBkaXI9ZGVzdC5zdWIocC5vYmoucG9zaXRpb24pLGQ9ZGlyLmxlbmd0aCgpOwogaWYoZDxwLnNwZWVkKmR0Ky4yNSl7CiAgaWYocC5zcGxhc2gpZW5lbWllc0luKHAuc2lkZSxwLnRhcmdldC5vYmoucG9zaXRpb24scC5zcGxhc2gpLmZvckVhY2goeD0+e2RhbWFnZSh4LHAuZGFtYWdlLHAuc2lkZSk7aWYocC5zb3VyY2UpYXBwbHlIaXRFZmZlY3RzKHAuc291cmNlLHgpfSk7CiAgZWxzZSB7ZGFtYWdlKHAudGFyZ2V0LHAuZGFtYWdlLHAuc2lkZSk7aWYocC5zb3VyY2UpYXBwbHlIaXRFZmZlY3RzKHAuc291cmNlLHAudGFyZ2V0KX0KICBidXJzdChwLm9iai5wb3NpdGlvbi54LHAub2JqLnBvc2l0aW9uLnkscC5vYmoucG9zaXRpb24ueixwLm9iai5tYXRlcmlhbC5jb2xvci5nZXRIZXgoKSw2KTtzY2VuZS5yZW1vdmUocC5vYmopO3JldHVybiBmYWxzZTsKIH0KIHAub2JqLnBvc2l0aW9uLmFkZFNjYWxlZFZlY3RvcihkaXIubm9ybWFsaXplKCkscC5zcGVlZCpkdCk7cmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gZGFtYWdlKHQsbixzb3VyY2VTaWRlKXsKIGlmKHQuZGVhZClyZXR1cm47aWYodC5jYXJkPy5hcm1vciluKj0xLXQuY2FyZC5hcm1vcjt0LmhwLT1uO3VwZGF0ZUhQKHQpO2RhbWFnZU51bWJlcih0Lm9iai5wb3NpdGlvbixuKTsKIC8qIEF2b2lkIHRlbXBvcmFyeSB3aGl0ZSBlbWlzc2l2ZSBmbGFzaGVzIG9uIG1vYmlsZSBHUFVzLiAqLwogLyogUmVkIHNjcmVlbiBmbGFzaCBkaXNhYmxlZCBmb3IgY2xlYXJlciBjb21iYXQuICovCiBpZih0LmhwPD0wKWtpbGwodCxzb3VyY2VTaWRlKTsKfQpmdW5jdGlvbiBhcHBseUhpdEVmZmVjdHMoYXR0YWNrZXIsdGFyZ2V0KXsKIGlmKCFhdHRhY2tlcnx8IWF0dGFja2VyLmNhcmR8fCF0YXJnZXR8fHRhcmdldC5kZWFkKXJldHVybjsKIGNvbnN0IGM9YXR0YWNrZXIuY2FyZDsKIGlmKGMuc2xvd09uSGl0KXRhcmdldC53ZWJTbG93PU1hdGgubWF4KHRhcmdldC53ZWJTbG93fHwwLGMuc2xvd09uSGl0KTsKIGlmKGMuc3R1bkNoYW5jZSYmTWF0aC5yYW5kb20oKTxjLnN0dW5DaGFuY2UpdGFyZ2V0LnN0dW5UaW1lcj1NYXRoLm1heCh0YXJnZXQuc3R1blRpbWVyfHwwLGMuc3R1bkR1cmF0aW9ufHwuNDUpOwogaWYoYy5idXJuRHBzfHxjLnBvaXNvbkRwcyl7CiAgY29uc3QgZHBzPU1hdGgubWF4KGMuYnVybkRwc3x8MCxjLnBvaXNvbkRwc3x8MCk7CiAgdGFyZ2V0LmRvdERwcz1NYXRoLm1heCh0YXJnZXQuZG90RHBzfHwwLGRwcyk7CiAgdGFyZ2V0LmRvdFRpbWVyPU1hdGgubWF4KHRhcmdldC5kb3RUaW1lcnx8MCxjLmJ1cm5EdXJhdGlvbnx8Yy5wb2lzb25EdXJhdGlvbnx8Mik7CiAgdGFyZ2V0LmRvdFRpY2s9TWF0aC5taW4odGFyZ2V0LmRvdFRpY2t8fC4yNSwuMjUpOwogfQogaWYoYy5saWZlc3RlYWwmJmF0dGFja2VyLmhwPjApewogIGNvbnN0IGhlYWw9TWF0aC5tYXgoMSxhdHRhY2tlci5kYW1hZ2UqYy5saWZlc3RlYWwpOwogIGF0dGFja2VyLmhwPU1hdGgubWluKGF0dGFja2VyLm1heCxhdHRhY2tlci5ocCtoZWFsKTt1cGRhdGVIUChhdHRhY2tlcik7CiAgZGFtYWdlTnVtYmVyKGF0dGFja2VyLm9iai5wb3NpdGlvbixNYXRoLnJvdW5kKGhlYWwpLCIjOGNmZmIxIik7CiB9Cn0KZnVuY3Rpb24ga2lsbCh0LHNvdXJjZVNpZGUpewogaWYodC5kZWFkKXJldHVybjt0LmRlYWQ9dHJ1ZTt0LmhwPTA7dXBkYXRlSFAodCk7YnVyc3QodC5vYmoucG9zaXRpb24ueCwxLHQub2JqLnBvc2l0aW9uLnosdC5zaWRlPT09MD8weDRkYWVmZjoweGZmNDk2NCwyMik7QXVkaW9TeXMuYm9vbSgpO2dhbWUuc2hha2U9LjI4OwogaWYodC5raW5kKXsKICBnYW1lLmNyb3duc1tzb3VyY2VTaWRlXSsrOwogIGlmKHQua2luZD09PSJraW5nIilnYW1lLmNyb3duc1tzb3VyY2VTaWRlXT0zOwogIGVsc2UgZ2FtZS50b3dlcnNMb3N0W3Quc2lkZV0rKzsKICB1cGRhdGXYqtin2KwoKTtzaG932YbYqNix2K9NZXNzYWdlKHQua2luZD09PSJraW5nIj8i2KjYsdisINi02KfZhyDZhtin2KjZiNivINi02K8hIjoi2KjYsdisINmG2KfYqNmI2K8g2LTYryEiLDEyMDApOwogIHQub2JqLnRyYXZlcnNlKG89PntpZihvLmlzTWVzaClvLm1hdGVyaWFsLmNvbG9yLm11bHRpcGx5U2NhbGFyKC40Mil9KTsKICB0Lm9iai5yb3RhdGlvbi56PS4xOwogIGlmKHQua2luZD09PSJraW5nIilzZXRUaW1lb3V0KCgpPT5lbmTZhtio2LHYryhzb3VyY2VTaWRlPT09MD8id2luIjoibG9zZSIpLDEwMDApOwogfWVsc2V7CiAgdC5vYmouc2NhbGUueT0uMTtzZXRUaW1lb3V0KCgpPT5zY2VuZS5yZW1vdmUodC5vYmopLDE4MCk7CiB9Cn0KZnVuY3Rpb24gdXBkYXRlVG93ZXIodCxkdCl7CiBpZih0LmRlYWQpcmV0dXJuO3QuY29vbC09ZHQ7CiBpZighdC50YXJnZXR8fHQudGFyZ2V0LmRlYWR8fGRpc3QyKHQsdC50YXJnZXQub2JqLnBvc2l0aW9uKT50LnJhbmdlKQogIHQudGFyZ2V0PWdhbWUudW5pdHMuZmlsdGVyKHU9PiF1LmRlYWQmJnUuc2lkZSE9PXQuc2lkZSYmZGlzdDIodCx1Lm9iai5wb3NpdGlvbik8PXQucmFuZ2UpLnNvcnQoKGEsYik9PmRpc3QyKHQsYS5vYmoucG9zaXRpb24pLWRpc3QyKHQsYi5vYmoucG9zaXRpb24pKVswXTsKIGlmKHQudGFyZ2V0JiZ0LmNvb2w8PTApe3Nob290KHQsdC50YXJnZXQpO3QuY29vbD10LnJhdGV9Cn0KZnVuY3Rpb24gYm90VXBkYXRlKGR0KXsKIGdhbWUuYm90VGhpbmstPWR0O2lmKGdhbWUuYm90VGhpbms+MClyZXR1cm47CiBnYW1lLmJvdFRoaW5rPXNhdmUuZGlmZmljdWx0eT09PSLYs9iu2KoiP3JhbmQoLjU1LDEuMCk6c2F2ZS5kaWZmaWN1bHR5PT09ItmF2LnZhdmI2YTbjCI/cmFuZCguOSwxLjYpOnJhbmQoMS41LDIuNSk7CiBjb25zdCBhZmZvcmRhYmxlPWdhbWUuYm90SGFuZC5tYXAoKGlkLGkpPT4oe2lkLGksYzpDQVJEU1tpZF19KSkuZmlsdGVyKHg9PnguYy5jb3N0PD1nYW1lLmJvdNin2qnYs9uM2LEpOwogaWYoIWFmZm9yZGFibGUubGVuZ3RoKXJldHVybjsKIGNvbnN0IHRocmVhdHM9Z2FtZS51bml0cy5maWx0ZXIodT0+dS5zaWRlPT09MCYmIXUuZGVhZCYmdS5vYmoucG9zaXRpb24uejwtMik7CiBsZXQgcGljazsKIGlmKHRocmVhdHMubGVuZ3RoKXsKICBwaWNrPWFmZm9yZGFibGUuZmluZCh4PT54LmMudHlwZT09PSLYrNin2K/ZiCImJnRocmVhdHMubGVuZ3RoPj0yKXx8YWZmb3JkYWJsZS5maW5kKHg9PnguYy50eXBlPT09Itiz2KfYrtiq2YXYp9mGIil8fGNob2ljZShhZmZvcmRhYmxlKTsKIH1lbHNlewogIGNvbnN0IHdlaWdodGVkPWFmZm9yZGFibGUuZmlsdGVyKHg9PnguYy50eXBlIT09Itis2KfYr9mIIik7CiAgcGljaz1jaG9pY2Uod2VpZ2h0ZWQubGVuZ3RoP3dlaWdodGVkOmFmZm9yZGFibGUpOwogfQogY29uc3QgbGFuZT10aHJlYXRzLmxlbmd0aD90aHJlYXRzWzBdLm9iai5wb3NpdGlvbi54OmNob2ljZShbLTUuMiw1LjJdKTsKIGxldCBwPXt4OmxhbmUrcmFuZCgtMS4xLDEuMSksejpwaWNrLmMudHlwZT09PSLYrNin2K/ZiCI/KHRocmVhdHNbMF0/Lm9iai5wb3NpdGlvbi56Pz84KTpyYW5kKC04LC0zKX07CiBpZihwaWNrLmMudHlwZT09PSLYrNin2K/ZiCImJiF0aHJlYXRzLmxlbmd0aClwPXt4OmNob2ljZShbLTUuMiw1LjJdKSx6OjEwfTsKIGdhbWUuYm902Kfaqdiz24zYsS09cGljay5jLmNvc3Q7c3Bhd25DYXJkKHBpY2suaWQsMSxwKTtjeWNsZSgxLHBpY2suaSk7Cn0KZnVuY3Rpb24gdXBkYXRl2KzYp9iv2YhzKGR0KXsKIGdhbWUuc3BlbGxGWD1nYW1lLnNwZWxsRlguZmlsdGVyKGY9PnsKICBmLnQrPWR0OwogIGlmKGYudHlwZT09PSJvcmIiKXsKICAgY29uc3Qgaz1mLnQvZi5kO2Yub2JqLnBvc2l0aW9uLmxlcnAobmV3IFRIUkVFLlZlY3RvcjMoZi5wLngsLjQsZi5wLnopLE1hdGgubWluKDEsZHQqOCkpOwogICBmLm9iai5zY2FsZS5zZXRTY2FsYXIoMStrKi44KTtmLm9iai5yb3RhdGlvbi54Kz1kdCo4OwogICBpZihmLnQ+PWYuZCl7ZW5lbWllc0luKGYuc2lkZSxmLnAsZi5jLnJhZGl1cykuZm9yRWFjaCh4PT5kYW1hZ2UoeCxmLmMuZGFtYWdlLGYuc2lkZSkpO2J1cnN0KGYucC54LC40LGYucC56LDB4ZmY1NDI1LDM1KTtjaXJjbGVGWChmLnAsMHhmZjRhMjAsZi5jLnJhZGl1cyk7c2NlbmUucmVtb3ZlKGYub2JqKTtnYW1lLnNoYWtlPS40NTtyZXR1cm4gZmFsc2V9CiAgfXJldHVybiB0cnVlOwogfSk7Cn0KZnVuY3Rpb24gdXBkYXRlRlgoZHQpewogZ2FtZS5wYXJ0aWNsZXM9Z2FtZS5wYXJ0aWNsZXMuZmlsdGVyKHA9PntwLmxpZmUtPWR0O2lmKHAubGlmZTw9MCl7c2NlbmUucmVtb3ZlKHAub2JqKTtyZXR1cm4gZmFsc2V9cC52LnktPTcqZHQ7cC5vYmoucG9zaXRpb24uYWRkU2NhbGVkVmVjdG9yKHAudixkdCk7cC5vYmouc2NhbGUubXVsdGlwbHlTY2FsYXIoLjk3KTtyZXR1cm4gdHJ1ZX0pOwogZ2FtZS5lZmZlY3RzPWdhbWUuZWZmZWN0cy5maWx0ZXIoZT0+e2UudCs9ZHQ7aWYoZS50eXBlPT09InJpbmciKXtlLm9iai5zY2FsZS5zZXRTY2FsYXIoMStlLnQqLjIpO2Uub2JqLm1hdGVyaWFsLm9wYWNpdHk9MS1lLnQvZS5kfWVsc2UgZS5vYmoubWF0ZXJpYWwub3BhY2l0eT0xLWUudC9lLmQ7aWYoZS50Pj1lLmQpe3NjZW5lLnJlbW92ZShlLm9iaik7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfSk7Cn0KZnVuY3Rpb24gdXBkYXRlVGltZXIoZHQpewogZ2FtZS50aW1lLT1kdDsKIGlmKGdhbWUudGltZTw9MCl7CiAgbGV0IHdpbm5lcj1nYW1lLmNyb3duc1swXT5nYW1lLmNyb3duc1sxXT8wOmdhbWUuY3Jvd25zWzFdPmdhbWUuY3Jvd25zWzBdPzE6bnVsbDsKICBpZih3aW5uZXI9PW51bGwpewogICBjb25zdCBocDA9Z2FtZS50b3dlcnMuZmlsdGVyKHQ9PnQuc2lkZT09PTAmJiF0LmRlYWQpLnJlZHVjZSgocyx0KT0+cyt0LmhwLDApOwogICBjb25zdCBocDE9Z2FtZS50b3dlcnMuZmlsdGVyKHQ9PnQuc2lkZT09PTEmJiF0LmRlYWQpLnJlZHVjZSgocyx0KT0+cyt0LmhwLDApOwogICB3aW5uZXI9aHAxPGhwMD8wOmhwMDxocDE/MTpudWxsOwogIH0KICBlbmTZhtio2LHYryh3aW5uZXI9PT0wPyJ3aW4iOndpbm5lcj09PTE/Imxvc2UiOiJkcmF3Iik7cmV0dXJuOwogfQogY29uc3Qgc2VjPU1hdGguY2VpbChnYW1lLnRpbWUpLG09TWF0aC5mbG9vcihzZWMvNjApLHM9c2VjJTYwOwogJCgiI3RpbWVyIikudGV4dENvbnRlbnQ9YCR7bX06JHtTdHJpbmcocykucGFkU3RhcnQoMiwiMCIpfWA7CiAkKCIjcGhhc2UiKS50ZXh0Q29udGVudD1nYW1lLm92ZXJ0aW1lPyLZhdix2q8g2YbYp9qv2YfYp9mG24wgwrcg2Kfaqdiz24zYsSDYs9mH4oCM2KjYsdin2KjYsSI6Z2FtZS50aW1lPDYwPyLYp9qp2LPbjNixINiv2YjYqNix2KfYqNixIjoi2YbYqNix2K8g2LnYp9iv24wiOwp9CmZ1bmN0aW9uIGxvb3AoKXsKIHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtpZighcmVuZGVyZXIpcmV0dXJuOwogbGV0IGR0PU1hdGgubWluKGNsb2NrLmdldERlbHRhKCksLjA0KTsKIGlmKGdhbWU/LnJ1bm5pbmcmJiFnYW1lLnBhdXNlZCl7CiAgY29uc3QgZWxpeGlyUmF0ZT1nYW1lLm92ZXJ0aW1lPy44MjpnYW1lLnRpbWU8NjA/LjU2Oi4zNDsKICBnYW1lLmVsaXhpcj1NYXRoLm1pbigxMCxnYW1lLmVsaXhpcitkdCplbGl4aXJSYXRlKTtnYW1lLmJvdNin2qnYs9uM2LE9TWF0aC5taW4oMTAsZ2FtZS5ib3TYp9qp2LPbjNixK2R0KmVsaXhpclJhdGUpOwogIHVwZGF0ZVRpbWVyKGR0KTtnYW1lLnVuaXRzLmZvckVhY2godT0+dXBkYXRlVW5pdCh1LGR0KSk7Z2FtZS50b3dlcnMuZm9yRWFjaCh0PT51cGRhdGVUb3dlcih0LGR0KSk7CiAgZ2FtZS5wcm9qZWN0aWxlcz1nYW1lLnByb2plY3RpbGVzLmZpbHRlcihwPT51cGRhdGVQcm9qZWN0aWxlKHAsZHQpKTtpZighbm92YU9ubGluZSlib3RVcGRhdGUoZHQpO3VwZGF0Zdis2KfYr9mIcyhkdCk7dXBkYXRlRlgoZHQpOwogIGdhbWUud2F0ZXIucG9zaXRpb24ueT0uMDgrTWF0aC5zaW4ocGVyZm9ybWFuY2Uubm93KCkqLjAwMikqLjA0NTsKICBnYW1lLndhdGVyLm1hdGVyaWFsLm9wYWNpdHk9Ljc4K01hdGguc2luKHBlcmZvcm1hbmNlLm5vdygpKi4wMDE1KSouMDg7CiAgZ2FtZS5mbGFncy5mb3JFYWNoKChmLGkpPT57Zi5yb3RhdGlvbi55PU1hdGguc2luKHBlcmZvcm1hbmNlLm5vdygpKi4wMDMraSkqLjEyfSk7CiAgaWYoZ2FtZS5zaGFrZT4wKWdhbWUuc2hha2U9TWF0aC5tYXgoMCxnYW1lLnNoYWtlLWR0KTsKICBjYW1lcmEucG9zaXRpb24uc2V0KDAsMzQsMzcpO2NhbWVyYS5sb29rQXQoMCwwLDApOwogIHJlbmRlckhhbmQoKTsKIH0KIHJlbmRlcmVyLnJlbmRlcihzY2VuZSxjYW1lcmEpOwp9CmZ1bmN0aW9uIHVwZGF0Zdiq2KfYrCgpewogJCgiI2152KrYp9isIikudGV4dENvbnRlbnQ9Z2FtZS5jcm93bnNbMF07JCgiI2VuZW152KrYp9isIikudGV4dENvbnRlbnQ9Z2FtZS5jcm93bnNbMV07Cn0KZnVuY3Rpb24gc2hvd9mG2KjYsdivTWVzc2FnZSh0LGQ9OTAwKXsKIGNvbnN0IGU9JCgiI2JhdHRsZU1lc3NhZ2UiKTtlLnRleHRDb250ZW50PXQ7ZS5jbGFzc0xpc3QuYWRkKCJzaG93Iik7c2V0VGltZW91dCgoKT0+ZS5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IiksZCk7Cn0KZnVuY3Rpb24gZW5k2YbYqNix2K8ocmVzdWx0KXsKIGlmKCFnYW1lfHxnYW1lLmVuZGVkKXJldHVybjtnYW1lLmVuZGVkPXRydWU7Z2FtZS5ydW5uaW5nPWZhbHNlO2dhbWUuZGVwbG95TWFya2VyLnZpc2libGU9ZmFsc2U7QXVkaW9TeXMuc3RvcCgpOwogY29uc3Qgd29uPXJlc3VsdD09PSJ3aW4iLGRyYXc9cmVzdWx0PT09ImRyYXciLGdvbGQ9d29uPyhyYW5kKDQwLDc1KXwwKTpkcmF3PzA6LTEyLHhwPXdvbj81MDpkcmF3PzIwOjEyLHRyb3BoeT13b24/MzA6ZHJhdz8wOi0xMDsKIHNhdmUuZ29sZCs9Z29sZDtzYXZlLnhwKz14cDtzYXZlLnRyb3BoaWVzPU1hdGgubWF4KDAsc2F2ZS50cm9waGllcyt0cm9waHkpOwogd29uP3NhdmUud2lucysrOiFkcmF3JiZzYXZlLmxvc3NlcysrOwogbGV0IG5lZWQ9MTAwK3NhdmUubGV2ZWwqODA7CiB3aGlsZShzYXZlLnhwPj1uZWVkKXtzYXZlLnhwLT1uZWVkO3NhdmUubGV2ZWwrKztzYXZlLmdlbXMrPTU7c2F2ZS5raW5nSHBCb251cz0oTnVtYmVyKHNhdmUua2luZ0hwQm9udXMpfHwwKSsoMStNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTApKTtuZWVkPTEwMCtzYXZlLmxldmVsKjgwfQogbGV0IG5ld0FyZW5hPXNhdmUuYXJlbmE7CiBBUkVOQVMuZm9yRWFjaCgoYSxpKT0+e2lmKHNhdmUubGV2ZWw+PWEubGV2ZWxOZWVkfHxzYXZlLnRyb3BoaWVzPj1hLm5lZWQpbmV3QXJlbmE9aX0pOwogaWYobmV3QXJlbmE+c2F2ZS5hcmVuYSl7c2F2ZS5hcmVuYT1uZXdBcmVuYTt0b2FzdChgJHtBUkVOQVNbbmV3QXJlbmFdLm5hbWV9INio2KfYsiDYtNivIWApfQogcGVyc2lzdCgpOwogJCgiI3Jlc3VsdEljb24iKS50ZXh0Q29udGVudD13b24/IvCfj4YiOmRyYXc/IvCfpJ0iOiLwn5KUIjskKCIjcmVzdWx0VGl0bGUiKS50ZXh0Q29udGVudD13b24/Itm+24zYsdmI2LLbjCEiOmRyYXc/ItmF2LPYp9mI24wiOiLYtNqp2LPYqiI7CiAkKCIjcmVzdWx0VGl0bGUiKS5zdHlsZS5jb2xvcj13b24/IiNmZmUyNTUiOmRyYXc/IiM2NWQ1ZmYiOiIjZmY2MjdjIjsKICQoIiNyZXN1bHRTY29yZSIpLnRleHRDb250ZW50PWAke2dhbWUuY3Jvd25zWzBdfSDYqtin2Kwg4oCUICR7Z2FtZS5jcm93bnNbMV19INiq2KfYrGA7CiAkKCIjcmV3YXJkcyIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmV3YXJkIj7wn6qZICR7Z29sZD49MD8iKyI6IiJ9JHtnb2xkfTwvZGl2PjxkaXYgY2xhc3M9InJld2FyZCI+ICske3hwfSDYqtis2LHYqNmHPC9kaXY+PGRpdiBjbGFzcz0icmV3YXJkIj7wn4+GICR7dHJvcGh5Pj0wPyIrIjoiIn0ke3Ryb3BoeX08L2Rpdj5gOwogJCgiI2NoZXN0QXJlYSIpLmlubmVySFRNTD13b24/YDxkaXYgY2xhc3M9ImNoZXN0IiBpZD0icmV3YXJkQ2hlc3QiPvCfjoE8L2Rpdj48cD7YsdmI24wg2LXZhtiv2YjZgiDYqNiy2YYhPC9wPmA6IiI7CiAkKCIjcmVzdWx0IikuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7d29uP0F1ZGlvU3lzLndpbigpOkF1ZGlvU3lzLmxvc2UoKTsKIGlmKHdvbikkKCIjcmV3YXJkQ2hlc3QiKS5vbmNsaWNrPW9wZW5SZXdhcmRDaGVzdDsKfQpmdW5jdGlvbiBvcGVuUmV3YXJkQ2hlc3QoKXsKIGNvbnN0IHByaXplPWNob2ljZShbImdvbGQiLCJnZW1zIiwiY2FyZCJdKTsKIGlmKHByaXplPT09ImdvbGQiKXsKICBjb25zdCBhbW91bnQ9cmFuZCgyMCw2MCl8MDtzYXZlLmdvbGQrPWFtb3VudDtwZXJzaXN0KCk7CiAgJCgiI2NoZXN0QXJlYSIpLmlubmVySFRNTD1gPGRpdiBzdHlsZT0iZm9udC1zaXplOjgwcHg7YW5pbWF0aW9uOmNoZXN0IC41cyI+8J+qmTwvZGl2PjxoMz7YrNin24zYstmHINiz2qnZhyE8L2gzPjxwPiR7YW1vdW50fSDYs9qp2Ycg2LfZhNinINqv2LHZgdiq24w8L3A+YDsKIH1lbHNlIGlmKHByaXplPT09ImdlbXMiKXsKICBjb25zdCBhbW91bnQ9cmFuZCg1LDIwKXwwO3NhdmUuZ2Vtcys9YW1vdW50O3BlcnNpc3QoKTsKICAkKCIjY2hlc3RBcmVhIikuaW5uZXJIVE1MPWA8ZGl2IHN0eWxlPSJmb250LXNpemU6ODBweDthbmltYXRpb246Y2hlc3QgLjVzIj7wn5KOPC9kaXY+PGgzPtis2KfbjNiy2Ycg2KfZhNmF2KfYsyE8L2gzPjxwPiR7YW1vdW50fSDYp9mE2YXYp9izINqv2LHZgdiq24w8L3A+YDsKIH1lbHNlewogIGNvbnN0IGlkPWNob2ljZShDQVJEX0lEUyk7c2F2ZS5jYXJkQ29waWVzW2lkXT0oc2F2ZS5jYXJkQ29waWVzW2lkXXx8MCkrMTtpZighKHNhdmUub3duZWRbaWRdfHwwKSlzYXZlLm93bmVkW2lkXT0xO3BlcnNpc3QoKTsKICAkKCIjY2hlc3RBcmVhIikuaW5uZXJIVE1MPWA8ZGl2IHN0eWxlPSJmb250LXNpemU6ODBweDthbmltYXRpb246Y2hlc3QgLjVzIj4ke0NBUkRTW2lkXS5pY29ufTwvZGl2PjxoMz7YrNin24zYstmHINqp2KfYsdiqITwvaDM+PHA+24zaqSDZhtiz2K7ZhyDYp9iyINqp2KfYsdiqIMKrJHtDQVJEU1tpZF0ubmFtZX3CuyDar9ix2YHYqtuMPC9wPmA7CiB9CiBBdWRpb1N5cy5kZXBsb3koKTsKfQoKLyogLS0tLS0tLS0tLSBPbmxpbmUgbWF0Y2htYWtpbmcgLyB0dXRvcmlhbCAvIGNvbnRyb2xzIC0tLS0tLS0tLS0gKi8KbGV0IG5vdmFTZWFyY2hJbnRlcnZhbD1udWxsLG5vdmFTZWFyY2hUaW1lb3V0PW51bGwsbm92YVBlZXI9bnVsbCxub3ZhQ29ubj1udWxsLG5vdmFQZWVySWQ9Jycsbm92YU9ubGluZT1mYWxzZSxub3ZhT3Bwb25lbnREZWNrPW51bGwsbm92YVBlbmRpbmdQbGF5cz1bXSxub3ZhUGVlclBvbGw9bnVsbCxub3ZhUm9vbU1vZGU9Jycsbm92YVJvb21Db2RlPScnOwpmdW5jdGlvbiBub3ZhQ2xlYW51cE1hdGNoKCl7aWYobm92YVNlYXJjaEludGVydmFsKXtjbGVhckludGVydmFsKG5vdmFTZWFyY2hJbnRlcnZhbCk7bm92YVNlYXJjaEludGVydmFsPW51bGx9aWYobm92YVNlYXJjaFRpbWVvdXQpe2NsZWFyVGltZW91dChub3ZhU2VhcmNoVGltZW91dCk7bm92YVNlYXJjaFRpbWVvdXQ9bnVsbH1pZihub3ZhUGVlclBvbGwpe2NsZWFyVGltZW91dChub3ZhUGVlclBvbGwpO25vdmFQZWVyUG9sbD1udWxsfXRyeXtub3ZhQ29ubj8uY2xvc2UoKX1jYXRjaChlKXt9dHJ5e25vdmFQZWVyPy5kZXN0cm95KCl9Y2F0Y2goZSl7fW5vdmFDb25uPW51bGw7bm92YVBlZXI9bnVsbDtub3ZhUGVlcklkPScnO25vdmFPbmxpbmU9ZmFsc2U7bm92YU9wcG9uZW50RGVjaz1udWxsO25vdmFQZW5kaW5nUGxheXM9W119CmZ1bmN0aW9uIG5vdmFTdGFydE9ubGluZUJhdHRsZSgpe2lmKCFub3ZhQ29ubj8ub3Blbnx8Z2FtZT8ucnVubmluZylyZXR1cm47bm92YU9ubGluZT10cnVlO2lmKG5vdmFTZWFyY2hJbnRlcnZhbCl7Y2xlYXJJbnRlcnZhbChub3ZhU2VhcmNoSW50ZXJ2YWwpO25vdmFTZWFyY2hJbnRlcnZhbD1udWxsfWlmKG5vdmFTZWFyY2hUaW1lb3V0KXtjbGVhclRpbWVvdXQobm92YVNlYXJjaFRpbWVvdXQpO25vdmFTZWFyY2hUaW1lb3V0PW51bGx9JCgiI21hdGNobWFraW5nIikuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7c3RhcnTZhtio2LHYryhub3ZhT3Bwb25lbnREZWNrfHxudWxsKTt0cnl7bm92YUNvbm4uc2VuZCh7dDoncmVhZHknLGRlY2s6c2F2ZS5kZWNrfSl9Y2F0Y2goZSl7fX0KZnVuY3Rpb24gbm92YUhhbmRsZVJlbW90ZVBsYXkobSl7aWYoIWdhbWU/LnJ1bm5pbmcpe25vdmFQZW5kaW5nUGxheXMucHVzaChtKTtyZXR1cm59Y29uc3QgaWQ9bS5pZDtpZighQ0FSRFNbaWRdfHwhZ2FtZS5ib3RIYW5kLmluY2x1ZGVzKGlkKSlyZXR1cm47Y29uc3QgaWR4PWdhbWUuYm90SGFuZC5pbmRleE9mKGlkKSxjPUNBUkRTW2lkXTtpZihnYW1lLmJvdNin2qnYs9uM2LE8Yy5jb3N0KXJldHVybjtnYW1lLmJvdNin2qnYs9uM2LEtPWMuY29zdDtzcGF3bkNhcmQoaWQsMSx7eDotTnVtYmVyKG0ueHx8MCksejotTnVtYmVyKG0uenx8MCl9LE1hdGgubWF4KDEsTnVtYmVyKG0ubGV2ZWwpfHwxKSk7Y3ljbGUoMSxpZHgpfQpmdW5jdGlvbiBub3ZhQmluZENvbm5lY3Rpb24oYyl7aWYobm92YUNvbm4mJm5vdmFDb25uIT09Yyl7Yy5jbG9zZSgpO3JldHVybn1ub3ZhQ29ubj1jO2Mub24oJ29wZW4nLCgpPT57dHJ5e2Muc2VuZCh7dDonaGVsbG8nLGRlY2s6c2F2ZS5kZWNrfSl9Y2F0Y2goZSl7fX0pO2Mub24oJ2RhdGEnLG09PntpZihtPy50PT09J2hlbGxvJ3x8bT8udD09PSdyZWFkeScpe2lmKEFycmF5LmlzQXJyYXkobS5kZWNrKSYmbS5kZWNrLmxlbmd0aD09PTgpbm92YU9wcG9uZW50RGVjaz1tLmRlY2suc2xpY2UoKTtub3ZhU3RhcnRPbmxpbmVCYXR0bGUoKX1lbHNlIGlmKG0/LnQ9PT0ncGxheScmJm5vdmFPbmxpbmUpbm92YUhhbmRsZVJlbW90ZVBsYXkobSl9KTtjLm9uKCdjbG9zZScsKCk9PntpZihub3ZhT25saW5lJiZnYW1lPy5ydW5uaW5nKXNob3fZhtio2LHYr01lc3NhZ2UoJ9in2KrYtdin2YQg2K3YsduM2YEg2YLYt9i5INi02K8nLDIyMDApO25vdmFPbmxpbmU9ZmFsc2V9KTt9CmZ1bmN0aW9uIG5vdmFUcnlMb2FkUGVlcigpe2lmKHdpbmRvdy5QZWVyKXtub3ZhQ3JlYXRlUGVlcigpO3JldHVybn1jb25zdCBzYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtzYy5zcmM9J2h0dHBzOi8vdW5wa2cuY29tL3BlZXJqc0AxLjUuNC9kaXN0L3BlZXJqcy5taW4uanMnO3NjLm9ubG9hZD1ub3ZhQ3JlYXRlUGVlcjtzYy5vbmVycm9yPSgpPT57fTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjKX0KZnVuY3Rpb24gbm92YUNyZWF0ZVBlZXIoKXtpZighd2luZG93LlBlZXJ8fG5vdmFQZWVyKXJldHVybjt0cnl7bm92YVBlZXI9bmV3IFBlZXIoJ25vdmFjbGFzaC0nK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsMTEpLHtkZWJ1ZzowfSk7bm92YVBlZXIub24oJ29wZW4nLGlkPT57bm92YVBlZXJJZD1pZDtpZihub3ZhUm9vbU1vZGU9PT0naG9zdCcpe25vdmFSb29tQ29kZT1pZC5yZXBsYWNlKCdub3ZhY2xhc2gtJywnJykudG9VcHBlckNhc2UoKTtjb25zdCBib3g9JCgnI3Jvb21Db2RlQm94JyksdmFsPSQoJyNyb29tQ29kZVZhbHVlJyk7aWYoYm94JiZ2YWwpe3ZhbC50ZXh0Q29udGVudD1ub3ZhUm9vbUNvZGU7Ym94LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpfXRvYXN0KCfYp9iq2KfZgiDYotmF2KfYr9mHINin2LPYqtibINqp2K8g2LHYpyDYqNix2KfbjCDYr9mI2LPYqtiqINio2YHYsdiz2KonKX1lbHNlIGlmKG5vdmFSb29tTW9kZT09PSdqb2luJyl7aWYoIW5vdmFSb29tQ29kZSl7dG9hc3QoJ9qp2K8g2KfYqtin2YIg2LHYpyDZiNin2LHYryDaqdmGJyk7cmV0dXJufXRyeXtub3ZhQmluZENvbm5lY3Rpb24obm92YVBlZXIuY29ubmVjdCgnbm92YWNsYXNoLScrbm92YVJvb21Db2RlLnRvTG93ZXJDYXNlKCkse3JlbGlhYmxlOnRydWV9KSl9Y2F0Y2goZSl7dG9hc3QoJ9in2KrYtdin2YQg2KjZhyDYp9iq2KfZgiDYp9mG2KzYp9mFINmG2LTYrycpfX1lbHNlIG5vdmFTZWFyY2hQZWVycygpfSk7bm92YVBlZXIub24oJ2Nvbm5lY3Rpb24nLGM9Pm5vdmFCaW5kQ29ubmVjdGlvbihjKSk7bm92YVBlZXIub24oJ2Vycm9yJywoKT0+e2lmKG5vdmFSb29tTW9kZT09PSdqb2luJyl0b2FzdCgn2KfYqti12KfZhCDYqNix2YLYsdin2LEg2YbYtNiv2Jsg2qnYryDZiCDYp9uM2YbYqtix2YbYqiDYsdinINio2LHYsdiz24wg2qnZhicpO2Vsc2UgaWYobm92YVJvb21Nb2RlPT09J2hvc3QnKXRvYXN0KCfYs9in2K7YqiDYp9iq2KfZgiDZhtin2YXZiNmB2YIg2KjZiNiv2Jsg2K/ZiNio2KfYsdmHINiq2YTYp9i0INqp2YYnKTtpZihub3ZhU2VhcmNoVGltZW91dCYmIW5vdmFDb25uJiYhbm92YU9ubGluZSYmbm92YVBlZXJQb2xsPT09bnVsbClub3ZhUGVlclBvbGw9c2V0VGltZW91dCgoKT0+e25vdmFQZWVyUG9sbD1udWxsO25vdmFTZWFyY2hQZWVycygpfSw5MDApfSk7fWNhdGNoKGUpe3RvYXN0KCfYp9iq2LXYp9mEINii2YbZhNin24zZhiDYr9ixINiv2LPYqtix2LMg2YbbjNiz2KonKX19CmFzeW5jIGZ1bmN0aW9uIG5vdmFTZWFyY2hQZWVycygpe2lmKCFub3ZhUGVlcj8ub3Blbnx8bm92YUNvbm58fG5vdmFPbmxpbmV8fCFub3ZhU2VhcmNoVGltZW91dClyZXR1cm47dHJ5e2NvbnN0IHI9YXdhaXQgZmV0Y2goJ2h0dHBzOi8vMC5wZWVyanMuY29tL3BlZXJqcy9wZWVycz9rZXk9cGVlcmpzJyx7Y2FjaGU6J25vLXN0b3JlJ30pO2lmKHIub2spe2NvbnN0IGlkcz0oYXdhaXQgci5qc29uKCkpLmZpbHRlcih4PT50eXBlb2YgeD09PSdzdHJpbmcnJiZ4LnN0YXJ0c1dpdGgoJ25vdmFjbGFzaC0nKSYmeCE9PW5vdmFQZWVySWQpLnNvcnQoKTtjb25zdCB0YXJnZXQ9aWRzLmZpbmQoeD0+bm92YVBlZXJJZD54KTtpZih0YXJnZXQpe25vdmFCaW5kQ29ubmVjdGlvbihub3ZhUGVlci5jb25uZWN0KHRhcmdldCx7cmVsaWFibGU6dHJ1ZX0pKTtyZXR1cm59fX1jYXRjaChlKXt9aWYobm92YVNlYXJjaFRpbWVvdXQmJiFub3ZhQ29ubiYmIW5vdmFPbmxpbmUpbm92YVBlZXJQb2xsPXNldFRpbWVvdXQoKCk9Pntub3ZhUGVlclBvbGw9bnVsbDtub3ZhU2VhcmNoUGVlcnMoKX0sOTAwKX0KCmZ1bmN0aW9uIGNyZWF0ZU5vdmFSb29tKCl7CiBpZihzYXZlLmRlY2subGVuZ3RoIT09OClyZXR1cm4gdG9hc3QoJ9iv2LPYqtmHINqp2KfYsdiqINio2KfbjNivINiv2YLbjNmC2KfZiyDbuCDaqdin2LHYqiDYr9in2LTYqtmHINio2KfYtNivIScpOwogbm92YUNsZWFudXBNYXRjaCgpO25vdmFSb29tTW9kZT0naG9zdCc7bm92YVJvb21Db2RlPScnOyQoJyNyb29tQ29kZUJveCcpLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpOyQoJyNyb29tQ29kZVZhbHVlJykudGV4dENvbnRlbnQ9Jyc7dG9hc3QoJ9iv2LEg2K3Yp9mEINiz2KfYrtiqINin2KrYp9mCLi4uJyk7bm92YVRyeUxvYWRQZWVyKCk7Cn0KZnVuY3Rpb24gam9pbk5vdmFSb29tKHJhdyl7CiBjb25zdCBjb2RlPVN0cmluZyhyYXd8fCcnKS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywnJyk7CiBpZihjb2RlLmxlbmd0aDw1KXJldHVybiB0b2FzdCgn2qnYryDYp9iq2KfZgiDYsdinINiv2LHYs9iqINmI2KfYsdivINqp2YYnKTsKIGlmKHNhdmUuZGVjay5sZW5ndGghPT04KXJldHVybiB0b2FzdCgn2K/Ys9iq2Ycg2qnYp9ix2Kog2KjYp9uM2K8g2K/ZgtuM2YLYp9mLINu4INqp2KfYsdiqINiv2KfYtNiq2Ycg2KjYp9i02K8hJyk7CiBub3ZhQ2xlYW51cE1hdGNoKCk7bm92YVJvb21Nb2RlPSdqb2luJztub3ZhUm9vbUNvZGU9Y29kZTt0b2FzdCgn2K/YsSDYrdin2YQg2KfYqti12KfZhCDYqNmHINin2KrYp9mCLi4uJyk7bm92YVRyeUxvYWRQZWVyKCk7Cn0KZnVuY3Rpb24gc2VhcmNoTWF0Y2goKXtkZWNrU3dhcFNlbGVjdGVkPW51bGw7aWYoc2F2ZS5kZWNrLmxlbmd0aCE9PTgpcmV0dXJuIHRvYXN0KCLYr9iz2KrZhyDaqdin2LHYqiDYqNin24zYryDYr9mC24zZgtin2Ysg27gg2qnYp9ix2Kog2K/Yp9i02KrZhyDYqNin2LTYryEiKTtBdWRpb1N5cy5jbGljaygpO25vdmFDbGVhbnVwTWF0Y2goKTtub3ZhUm9vbU1vZGU9Jyc7bm92YVJvb21Db2RlPScnOyQoIiNtYXRjaG1ha2luZyIpLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpO2xldCBsZWZ0PTEwOyQoIiNzZWFyY2hUZXh0IikudGV4dENvbnRlbnQ9U3RyaW5nKGxlZnQpO25vdmFTZWFyY2hUaW1lb3V0PXNldFRpbWVvdXQoKCk9Pntub3ZhU2VhcmNoVGltZW91dD1udWxsO2lmKG5vdmFDb25uPy5vcGVuKXtub3ZhU3RhcnRPbmxpbmVCYXR0bGUoKX1lbHNleyQoIiNtYXRjaG1ha2luZyIpLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpO25vdmFDbGVhbnVwTWF0Y2goKTtub3ZhT25saW5lPWZhbHNlO3N0YXJ02YbYqNix2K8oKX19LDEwMDAwKTtub3ZhU2VhcmNoSW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKCk9PntsZWZ0LS07JCgiI3NlYXJjaFRleHQiKS50ZXh0Q29udGVudD1sZWZ0PjA/U3RyaW5nKGxlZnQpOiIiO2lmKGxlZnQ8PTAmJm5vdmFTZWFyY2hJbnRlcnZhbCl7Y2xlYXJJbnRlcnZhbChub3ZhU2VhcmNoSW50ZXJ2YWwpO25vdmFTZWFyY2hJbnRlcnZhbD1udWxsfX0sMTAwMCk7bm92YVRyeUxvYWRQZWVyKCk7fQpjb25zdCB0dXRvcmlhbHM9WwogWyLwn4OPIiwi24zaqSDaqdin2LHYqiDYp9mG2KrYrtin2Kgg2qnZhiIsItuM2qnbjCDYp9iyINqG2YfYp9ixINqp2KfYsdiqINm+2KfbjNuM2YYg2LXZgdit2Ycg2LHYpyDYp9mG2KrYrtin2Kgg2qnZhi4iXSwKIFsi8J+RhyIsItmC2LHYp9ixINiv2KfYr9mGINmG24zYsdmI2YfYpyIsItix2YjbjCDZhtuM2YXZhyDYrtmI2K/YqiDYp9iyINmF24zYr9in2YYg2KjYstmGINiq2Kcg2YbbjNix2Ygg2KfYrdi22KfYsSDYtNmI2K8uINis2KfYr9mI2YfYpyDZhduM4oCM2KrZiNin2YbZhtivINmH2LEg2K/ZiCDYs9mF2Kog2LHYpyDZh9iv2YEg2Kjar9uM2LHZhtivLiJdLAogWyLwn5KnIiwi2YXYr9uM2LHbjNiqINin2qnYs9uM2LEiLCLaqdin2LHYquKAjNmH2Kcg2Kfaqdiz24zYsSDZhdi12LHZgSDZhduM4oCM2qnZhtmG2K8uINin2qnYs9uM2LEg2K7ZiNiv2qnYp9ixINm+2LEg2YXbjOKAjNi02YjYryDZiCDZhtiy2K/bjNqpINm+2KfbjNin2YYg2LPYsduM2LnigIzYqtixINm+2LEg2YXbjOKAjNi02YjYry4iXSwKIFsi8J+boe+4jyIsItin2LIg2KjYsdis4oCM2YfYpyDYr9mB2KfYuSDaqdmGIiwi2KjYpyDZhtuM2LHZiNmH2KfbjCDYr9mB2KfYuduM2Iwg2LPYp9iu2KrZhdin2YbigIzZh9inINmIINis2KfYr9mI2YfYp9uMINio2YfigIzZhdmI2YLYudiMINit2YXZhNmHINit2LHbjNmBINix2Kcg2YXYqtmI2YLZgSDaqdmGLiJdLAogWyLwn5GRIiwi2KjYsdisINi02KfZhyDYsdinINmG2KfYqNmI2K8g2qnZhiIsItio2LHYrCDZhdix2qnYstuMINit2LHbjNmBINix2Kcg2YbYp9io2YjYryDaqdmGINiq2Kcg2YHZiNix2KfZiyDYqNix2YbYr9mHINi02YjbjC4g2YXZiNmB2YIg2KjYp9i024whIl0KXTsKbGV0IHR1dFN0ZXA9MDsKZnVuY3Rpb24gc2hvd1R1dG9yaWFsKCl7dHV0U3RlcD0wO3NldFR1dG9yaWFsKCk7JCgiI3R1dG9yaWFsIikuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7aWYoZ2FtZSlnYW1lLnBhdXNlZD10cnVlfQpmdW5jdGlvbiBzZXRUdXRvcmlhbCgpewogY29uc3QgdD10dXRvcmlhbHNbdHV0U3RlcF07JCgiI3R1dG9yaWFsSWNvbiIpLnRleHRDb250ZW50PXRbMF07JCgiI3R1dG9yaWFsVGl0bGUiKS50ZXh0Q29udGVudD10WzFdOyQoIiN0dXRvcmlhbFRleHQiKS50ZXh0Q29udGVudD10WzJdOwogJCgiI25leHRUdXRvcmlhbCIpLnRleHRDb250ZW50PXR1dFN0ZXA9PT10dXRvcmlhbHMubGVuZ3RoLTE/Itio2KfYstuMIjoi2KjYudiv24wiOwp9CmZ1bmN0aW9uIGNsb3NlVHV0b3JpYWwoKXtzYXZlLnR1dG9yaWFsPXRydWU7cGVyc2lzdCgpOyQoIiN0dXRvcmlhbCIpLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpO2lmKGdhbWUpZ2FtZS5wYXVzZWQ9ZmFsc2V9CiQoIiNuZXh0VHV0b3JpYWwiKS5vbmNsaWNrPSgpPT57aWYoKyt0dXRTdGVwPj10dXRvcmlhbHMubGVuZ3RoKWNsb3NlVHV0b3JpYWwoKTtlbHNlIHNldFR1dG9yaWFsKCl9OwokKCIjc2tpcFR1dG9yaWFsIikub25jbGljaz1jbG9zZVR1dG9yaWFsOwokKCIjcGF1c2VCdG4iKS5vbmNsaWNrPSgpPT57aWYoZ2FtZSl7Z2FtZS5wYXVzZWQ9dHJ1ZTskKCIjcGF1c2VNb2RhbCIpLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpfX07CiQoIiNyZXN1bWVCdG4iKS5vbmNsaWNrPSgpPT57Z2FtZS5wYXVzZWQ9ZmFsc2U7JCgiI3BhdXNlTW9kYWwiKS5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKX07CiQoIiNwYXVzZdiq2YbYuNuM2YXYp9iqIikub25jbGljaz0oKT0+dG9hc3QoItiq2YbYuNuM2YXYp9iqINi12K/YpyDZiCDar9ix2KfZgduM2qkg2KfYsiDZhdmG2YjbjCDYp9i12YTbjCDYr9ixINiv2LPYqtix2LMg2KfYs9iqLiIpOwokKCIjcXVpdEJ0biIpLm9uY2xpY2s9KCk9PnskKCIjcGF1c2VNb2RhbCIpLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpO2VuZNmG2KjYsdivKCJsb3NlIik7cGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOiJub3ZhLWNsYXNoLXN1cnJlbmRlci1leGl0In0sIioiKX07CiQoIiNyZXN1bHTYp9iv2KfZhdmHIikub25jbGljaz0oKT0+ewogJCgiI3Jlc3VsdCIpLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOyQoIiNiYXR0bGUiKS5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKTskKCIjbWVudSIpLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOwogZ2FtZT1udWxsO3JlbmRlclBhZ2UoImhvbWUiKTtBdWRpb1N5cy5tdXNpYygpOwp9OwoKc3luY1RvcCgpO3JlbmRlclBhZ2UoImhvbWUiKTtBdWRpb1N5cy5tdXNpYygpOwo8L3NjcmlwdD4KCjxzY3JpcHQgaWQ9Im5vdmEtdG91Y2gtZml4LWpzIj4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhbGxvd2VkKHQpe3JldHVybiAhISh0JiZ0LmNsb3Nlc3QmJnQuY2xvc2VzdCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0LFtjb250ZW50ZWRpdGFibGU9InRydWUiXScpKTt9ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLGZ1bmN0aW9uKGUpe2lmKCFhbGxvd2VkKGUudGFyZ2V0KSllLnByZXZlbnREZWZhdWx0KCk7fSx0cnVlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsZnVuY3Rpb24oZSl7aWYoIWFsbG93ZWQoZS50YXJnZXQpKWUucHJldmVudERlZmF1bHQoKTt9LHRydWUpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvcHknLGZ1bmN0aW9uKGUpe2lmKCFhbGxvd2VkKGUudGFyZ2V0KSllLnByZXZlbnREZWZhdWx0KCk7fSx0cnVlKTt9KSgpOzwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K'; // NOVA DUO QUEST: online cooperative platformer using PeerJS public signaling. let dqPeer=null,dqConn=null,dqRole='',dqRAF=0,dqCanvas=null,dqCtx=null,dqLast=0,dqLevel=1,dqState=null,dqInput={left:false,right:false,jump:false},dqRemoteInput={left:false,right:false,jump:false},dqKeys={},dqResize=null,dqConnected=false,dqLastSend=0; const dqLevels=[ {name:'شروع سفر',len:900,plats:[[0,250,250],[330,210,130],[520,165,130],[720,235,180]],door:830}, {name:'دره آبی',len:1050,plats:[[0,255,180],[240,205,120],[430,160,110],[610,210,120],[820,165,190]],door:970}, {name:'پل‌های شکسته',len:1120,plats:[[0,255,170],[220,220,100],[390,175,100],[560,220,100],[730,170,100],[900,220,180]],door:1030}, {name:'برج سبز',len:1180,plats:[[0,255,170],[220,220,110],[390,180,100],[550,140,110],[730,190,100],[900,230,220]],door:1090}, {name:'غار بلورها',len:1250,plats:[[0,255,190],[250,205,100],[420,155,100],[600,205,100],[780,150,100],[960,205,230]],door:1160}, {name:'پرش‌های بلند',len:1320,plats:[[0,255,170],[220,195,100],[400,135,100],[580,195,100],[760,135,100],[940,195,100],[1110,240,180]],door:1240}, {name:'مسیر آتش',len:1380,plats:[[0,255,180],[230,205,100],[420,155,100],[610,205,100],[800,155,100],[990,205,100],[1170,245,180]],door:1300}, {name:'جزیره‌های شناور',len:1450,plats:[[0,255,170],[220,210,90],[390,165,90],[560,120,90],[730,165,90],[900,210,90],[1070,165,90],[1250,240,170]],door:1370}, {name:'راه مخفی',len:1500,plats:[[0,255,170],[220,220,90],[390,180,90],[560,220,90],[730,170,90],[900,210,90],[1080,160,90],[1280,240,170]],door:1420}, {name:'قلعه سایه‌ها',len:1580,plats:[[0,255,180],[230,205,100],[420,155,100],[610,205,100],[800,145,100],[990,195,100],[1180,145,100],[1380,240,180]],door:1500}, {name:'راه ستاره‌ای',len:1650,plats:[[0,255,170],[220,215,90],[390,170,90],[560,125,90],[730,175,90],[900,125,90],[1070,175,90],[1240,215,90],[1430,245,180]],door:1570}, {name:'دروازه نهایی',len:1750,plats:[[0,255,190],[240,210,100],[430,160,100],[620,210,100],[810,155,100],[1000,205,100],[1190,150,100],[1380,205,100],[1580,245,170]],door:1670} ]; // Extend the adventure to 100 cooperative stages with increasingly varied platform layouts. const dqStageThemes=['جنگل مه‌آلود','معدن کریستال','پل‌های یخی','آتشفشان','شهر آسمانی','خرابه‌های باستانی','غار تاریک','طوفان نئونی','برج ساعت','قصر ابرها','دره سایه‌ها','کهکشان گمشده']; for(let n=13;n<=1000;n++){const difficulty=Math.min(1,(n-12)/88),len=1750+Math.min(7000,Math.floor((n-12)*8)),plats=[[0,255,180]];let x=205;while(x({x:pl[0]+pl[2]/2,y:pl[1]-20,taken:false,id:i}))} function dqFresh(){const players=[{x:35,y:205,vx:0,vy:0,w:24,h:32,ground:false,done:false},{x:65,y:205,vx:0,vy:0,w:24,h:32,ground:false,done:false}];return {players:players.map(p=>({...p})),checkpoint:players.map(p=>({x:p.x,y:p.y})),cam:0,level:1,gems:0,totalGems:0,crystals:dqMakeCrystals(1),won:false}} function startDuoQuest(){stopDuoQuest();document.querySelector('#gameModal .modal').classList.add('quest-modal');const a=document.getElementById('playArea');dqRole='';dqConnected=false;dqState=dqFresh();a.innerHTML=`

🗝️ NOVA DUO QUEST

با دوستت آنلاین شو و با همکاری، ۱۰۰ مرحله را کامل کنید. دوربین هر بازیکن جداگانه دنبال خودش حرکت می‌کند؛ دوستت فقط وقتی نزدیک محدوده دیدت باشد روی صفحه دیده می‌شود.

برای شروع، یک نفر اتاق بسازد و کد را برای دوستش بفرستد.
مرحله: ۱/۱۰۰💎 الماس: ۰در انتظار بازیکن…

روی زمین حرکت کن و بپر. اگر بیفتی، از آخرین نقطهٔ ذخیرهٔ همین مرحله برمی‌گردی. وقتی هر دو به دروازه برسید، مرحلهٔ بعد شروع می‌شود و نقطهٔ ذخیره برای هر دو ثبت خواهد شد.

`;} function dqStatus(t){const e=document.getElementById('dqStatus');if(e)e.textContent=t} function dqHost(){if(!window.Peer){dqStatus('کتابخانه اتصال آنلاین بارگذاری نشد. اینترنت را بررسی و صفحه را دوباره باز کن.');return}if(dqPeer)try{dqPeer.destroy()}catch(e){}const room=Math.random().toString(36).slice(2,8).toUpperCase();document.getElementById('dqRoom').value=room;dqRole='host';dqStatus('در حال ساخت اتاق '+room+' ...');dqPeer=new Peer('nova-duo-'+room.toLowerCase());dqPeer.on('open',()=>{dqStatus('اتاق آماده است! کد '+room+' را برای دوستت بفرست. منتظر اتصال…')});dqPeer.on('connection',c=>{if(dqConn){c.close();return}dqConn=c;dqSetupConn();});dqPeer.on('error',e=>dqStatus('خطای اتصال: '+(e.type==='unavailable-id'?'کد اتاق تکراری شد؛ دوباره بساز.':e.type==='network'?'شبکه آنلاین در دسترس نیست.':e.type)));} function dqJoin(){if(!window.Peer){dqStatus('کتابخانه آنلاین بارگذاری نشد؛ اینترنت را بررسی کن.');return}const room=(document.getElementById('dqRoom').value||'').trim().toLowerCase();if(!/^[a-z0-9]{4,8}$/.test(room)){dqStatus('کد اتاق ۴ تا ۸ حرف یا عدد باشد.');return}if(dqPeer)try{dqPeer.destroy()}catch(e){}dqRole='guest';dqStatus('در حال اتصال به '+room.toUpperCase()+' …');dqPeer=new Peer();dqPeer.on('open',()=>{dqConn=dqPeer.connect('nova-duo-'+room,{reliable:true});dqSetupConn()});dqPeer.on('error',e=>dqStatus('اتصال انجام نشد ('+e.type+'). کد را بررسی کنید و هر دو نفر آنلاین باشید.'));} function dqSetupConn(){if(!dqConn)return;dqConn.on('open',()=>{dqConnected=true;dqStatus('وصل شدید! هر دو آماده‌اید. 🎮');document.getElementById('dqGame').classList.remove('hide');dqCanvas=document.getElementById('dqCanvas');dqCtx=dqCanvas.getContext('2d');dqResize=()=>{if(!dqCanvas)return;const r=dqCanvas.getBoundingClientRect(),d=Math.min(devicePixelRatio||1,2);dqCanvas.width=Math.max(1,Math.floor(r.width*d));dqCanvas.height=Math.max(1,Math.floor(r.height*d));dqCtx.setTransform(d,0,0,d,0,0)};dqResize();window.addEventListener('resize',dqResize);dqLast=performance.now();if(dqRole==='host'){dqState=dqFresh();dqConn.send({type:'state',state:dqState})}else dqConn.send({type:'hello'});dqRAF=requestAnimationFrame(dqFrame)});dqConn.on('data',m=>{if(!m)return;if(dqRole==='host'&&m.type==='input')dqRemoteInput=m.input||dqRemoteInput;else if(dqRole==='guest'&&m.type==='state'){const before=Number(dqState&&dqState.totalGems)||0;const after=Number(m.state&&m.state.totalGems)||0;if(after>before)award((after-before)*4);dqState=m.state;dqDraw()}});dqConn.on('close',()=>{dqConnected=false;dqStatus('اتصال قطع شد؛ اتاق را دوباره بسازید.');});dqConn.on('error',()=>{dqStatus('مشکل در اتصال دو بازیکن.');});} function dqSet(k,v){dqInput[k]=v;if(dqRole==='guest'&&dqConn&&dqConn.open)dqConn.send({type:'input',input:dqInput})} function dqJump(){dqInput.jump=true;if(dqRole==='guest'&&dqConn&&dqConn.open)dqConn.send({type:'input',input:dqInput});setTimeout(()=>{dqInput.jump=false;if(dqRole==='guest'&&dqConn&&dqConn.open)dqConn.send({type:'input',input:dqInput})},180)} function dqFrame(now){if(!dqConnected||!dqCanvas)return;if(dqRole==='host'){const dt=Math.min(.04,(now-dqLast)/1000);dqStep(dt);if(now-dqLastSend>45&&dqConn&&dqConn.open){dqConn.send({type:'state',state:dqState});dqLastSend=now}}dqLast=now;dqDraw();dqRAF=requestAnimationFrame(dqFrame)} function dqStep(dt){if(!dqState||dqState.won)return;const lvl=dqLevels[dqState.level-1];const inputs=[dqInput,dqRemoteInput];dqState.players.forEach((p,i)=>{if(p.done)return;const inp=inputs[i]||{};p.vx=(inp.left?-175:0)+(inp.right?175:0);p.x=Math.max(0,Math.min(lvl.len-p.w,p.x+p.vx*dt));p.vy=Math.min(460,p.vy+850*dt);if(inp.jump&&p.ground){p.vy=-360;p.ground=false}p.y+=p.vy*dt;if(p.y<45){p.y=45;p.vy=Math.max(0,p.vy)}p.ground=false;for(const pl of lvl.plats){if(p.vy>=0&&p.x+p.w>pl[0]&&p.x=pl[1]&&p.y+p.h-p.vy*dt<=pl[1]){p.y=pl[1]-p.h;p.vy=0;p.ground=true}}if(p.y>320){const cp=(dqState.checkpoint&&dqState.checkpoint[i])||{x:35+i*30,y:205};p.x=cp.x;p.y=cp.y;p.vx=0;p.vy=0;p.ground=false;p.done=false}for(const crystal of (dqState.crystals||[])){if(!crystal.taken&&Math.abs((p.x+p.w/2)-crystal.x)<23&&Math.abs((p.y+p.h/2)-crystal.y)<27){crystal.taken=true;dqState.gems=(dqState.gems||0)+1;dqState.totalGems=(dqState.totalGems||0)+1;if(dqRole==='host')award(4)}}if(p.x>lvl.door-25&&p.ground)p.done=true});if(dqState.players.every(p=>p.done)){if(dqState.level>=dqLevels.length){dqState.won=true;dqStatus('🎉 هر ۱۰۰۰ مرحله را با هم کامل کردید! افسانه شدید!');}else{dqState.level++;dqState.gems=0;dqState.crystals=dqMakeCrystals(dqState.level);dqState.players.forEach((p,i)=>Object.assign(p,{x:35+i*30,y:205,vx:0,vy:0,ground:false,done:false}));dqState.checkpoint=dqState.players.map(p=>({x:p.x,y:p.y}));dqStatus('مرحله '+dqState.level+' : '+dqLevels[dqState.level-1].name+' — الماس‌ها صفر شدند؛ نقطهٔ ذخیره برای هر دو ثبت شد!')}}dqState.cam=Math.max(0,Math.min(lvl.len-300,(dqState.players[0].x+dqState.players[1].x)/2-150));} function dqDraw(){ if(!dqCtx||!dqCanvas||!dqState)return; const c=dqCtx,w=dqCanvas.clientWidth,h=dqCanvas.clientHeight,lvl=dqLevels[Math.max(0,dqState.level-1)]; c.clearRect(0,0,w,h); let g=c.createLinearGradient(0,0,0,h);g.addColorStop(0,'#172b52');g.addColorStop(1,'#251b46');c.fillStyle=g;c.fillRect(0,0,w,h); // Each device has its own camera, centered on its own player. Host controls player 1; guest controls player 2. const localIndex=dqRole==='guest'?1:0; const localPlayer=dqState.players[localIndex]||dqState.players[0]; const cam=Math.max(0,Math.min(lvl.len-w,localPlayer.x+localPlayer.w/2-w/2)); for(let i=0;i<35;i++){c.fillStyle='#ffffff66';c.fillRect(((i*71-cam*.22)%w+w)%w,20+(i*37)%120,2,2)} c.save();c.translate(-cam,0); lvl.plats.forEach((p,i)=>{c.fillStyle=i%2?'#27c9bb':'#8b70ff';c.fillRect(p[0],p[1],p[2],h-p[1]);c.fillStyle='#d7fff8';c.fillRect(p[0],p[1],p[2],4)}); for(const crystal of (dqState.crystals||[])){if(crystal.taken)continue;c.save();c.fillStyle='#69f5ed';c.shadowColor='#69f5ed';c.shadowBlur=12;c.beginPath();c.moveTo(crystal.x,crystal.y-9);c.lineTo(crystal.x+7,crystal.y);c.lineTo(crystal.x,crystal.y+9);c.lineTo(crystal.x-7,crystal.y);c.closePath();c.fill();c.restore()} c.fillStyle='#ffcf6e';c.fillRect(lvl.door,155,32,100);c.fillStyle='#fff4c8';c.fillRect(lvl.door+8,170,16,85); dqState.players.forEach((p,i)=>{ // Draw the remote player only when they are inside this device's camera view. if(p.x+p.wcam+w)return; c.fillStyle=i===0?'#52e4d1':'#ff8ac2';c.fillRect(p.x,p.y,p.w,p.h); c.fillStyle='#fff';c.fillRect(p.x+5,p.y+7,4,4);c.fillRect(p.x+15,p.y+7,4,4);c.fillStyle='#111827';c.fillRect(p.x+5,p.y+20,14,3); c.fillStyle='#fff';c.font='10px Tahoma';c.textAlign='center';c.fillText(i===localIndex?'تو':'دوستت',p.x+p.w/2,p.y-5); if(p.done){c.fillStyle='#fff';c.font='12px Tahoma';c.fillText('✓',p.x+5,p.y-16)} }); c.restore(); const le=document.getElementById('dqLevelText');if(le)le.textContent=dqState.level;const ge=document.getElementById('dqGems');if(ge)ge.textContent=(dqState.gems||0).toLocaleString('fa-IR'); const pt=document.getElementById('dqPlayerText');if(pt)pt.textContent=dqState.players.filter(p=>p.done).length+'/2 کنار دروازه'; } function stopDuoQuest(){if(dqRAF)cancelAnimationFrame(dqRAF);dqRAF=0;dqConnected=false;if(dqResize)window.removeEventListener('resize',dqResize);dqResize=null;try{if(dqConn)dqConn.close()}catch(e){}try{if(dqPeer)dqPeer.destroy()}catch(e){}dqPeer=null;dqConn=null;dqCanvas=null;dqCtx=null;dqRole='';} let sqRAF=0,sqResize=null,sq=null,sqKeyDown=null,sqKeyUp=null; function stopSoloQuest(){if(sqRAF)cancelAnimationFrame(sqRAF);sqRAF=0;if(sqResize)window.removeEventListener('resize',sqResize);sqResize=null;if(sqKeyDown)window.removeEventListener('keydown',sqKeyDown);if(sqKeyUp)window.removeEventListener('keyup',sqKeyUp);sqKeyDown=null;sqKeyUp=null;sq=null;} function startSoloQuest(){ stopSoloQuest(); const a=document.getElementById('playArea'); if(!a){return;} a.innerHTML=`
🗺️ مرحله: ۱💎 کریستال: ۰

به‌تنهایی بازی کن: با چپ و راست حرکت کن، بپر، کریستال جمع کن و به دروازهٔ بنفش برس. مراقب تیغ‌ها باش!

`; const c=document.getElementById('sqCanvas'),ctx=c&&c.getContext('2d'); if(!c||!ctx){a.insertAdjacentHTML('beforeend','

مرورگر نتوانست محیط بازی را بسازد. صفحه را دوباره باز کن.

');return;} sq={c,ctx,w:1450,h:400,player:{x:35,y:290,vx:0,vy:0,w:24,h:30,on:false},cam:0,level:1,gems:0,lives:3,held:{},last:0,jumpLatch:false,platforms:[],crystals:[],spikes:[],goal:0,checkpoint:{x:35,y:290,level:1}}; function makeLevel(){ sq.w=1450+Math.min(sq.level-1,25)*95; sq.platforms=[{x:0,y:340,w:190,h:30},{x:220,y:300,w:115,h:18},{x:370,y:265,w:115,h:18},{x:520,y:305,w:115,h:18},{x:675,y:260,w:120,h:18},{x:835,y:305,w:120,h:18},{x:995,y:265,w:120,h:18},{x:1155,y:305,w:120,h:18}]; for(let x=1310;x{e.preventDefault();if(sq)sq.held[k]=true;try{el.setPointerCapture(e.pointerId)}catch(_){}},up=e=>{e.preventDefault();if(sq)sq.held[k]=false};el.addEventListener('pointerdown',down);el.addEventListener('pointerup',up);el.addEventListener('pointercancel',up);el.addEventListener('pointerleave',up);} bind('sqLeft','left');bind('sqRight','right');bind('sqJump','jump'); const keymap={ArrowLeft:'left',a:'left',ArrowRight:'right',d:'right',ArrowUp:'jump',' ':'jump'}; sqKeyDown=e=>{if(keymap[e.key]&&sq){e.preventDefault();sq.held[keymap[e.key]]=true}}; sqKeyUp=e=>{if(keymap[e.key]&&sq)sq.held[keymap[e.key]]=false}; window.addEventListener('keydown',sqKeyDown);window.addEventListener('keyup',sqKeyUp); function frame(now){ if(!sq||!document.getElementById('sqCanvas'))return; try{ const dt=Math.min(.032,Math.max(.001,(now-(sq.last||now-16))/1000));sq.last=now; const p=sq.player,oldBottom=p.y+p.h; p.vx=((sq.held.right?1:0)-(sq.held.left?1:0))*230;p.x=Math.max(0,Math.min(sq.w-p.w,p.x+p.vx*dt)); p.vy=Math.min(650,p.vy+720*dt);p.y+=p.vy*dt;if(p.y<45){p.y=45;p.vy=Math.max(0,p.vy)}p.on=false; for(const pl of sq.platforms){if(p.vy>=0&&p.x+p.w>pl.x&&p.x=pl.y){p.y=pl.y-p.h;p.vy=0;p.on=true}} if(sq.held.jump&&p.on&&!sq.jumpLatch){p.vy=-390;p.on=false;sq.jumpLatch=true}if(!sq.held.jump)sq.jumpLatch=false; const hitSpike=sq.spikes.some(t=>p.x+p.w>t.x&&p.xt.y&&p.y430||hitSpike){const cp=sq.checkpoint||{x:35,y:290};p.x=cp.x;p.y=cp.y;p.vx=0;p.vy=0;p.on=false;sq.cam=Math.max(0,Math.min(sq.w-800,p.x-220));sq.jumpLatch=false;toast('از آخرین نقطهٔ ذخیره برگشتی!')} for(const g of sq.crystals){if(!g.taken&&Math.abs((p.x+p.w/2)-g.x)<21&&Math.abs((p.y+p.h/2)-g.y)<27){g.taken=true;sq.gems++;award(4);const ge=document.getElementById('sqGems');if(ge)ge.textContent=sq.gems.toLocaleString('fa-IR')}} sq.cam=Math.max(0,Math.min(sq.w-800,p.x-220));ctx.clearRect(0,0,800,400); const gr=ctx.createLinearGradient(0,0,0,400);gr.addColorStop(0,'#121b3e');gr.addColorStop(1,'#101126');ctx.fillStyle=gr;ctx.fillRect(0,0,800,400); ctx.fillStyle='#242b53';for(let i=0;i<16;i++){const xx=((i*95-sq.cam*.22)%900+900)%900;ctx.fillRect(xx,65+(i%4)*26,45,180)} ctx.save();ctx.translate(-sq.cam,0); for(const pl of sq.platforms){ctx.fillStyle='#34365f';ctx.fillRect(pl.x,pl.y,pl.w,pl.h);ctx.fillStyle='#59e5d2';ctx.fillRect(pl.x,pl.y,pl.w,4)} for(const t of sq.spikes){ctx.fillStyle='#ff4e91';ctx.beginPath();ctx.moveTo(t.x,t.y+t.h);ctx.lineTo(t.x+t.w/2,t.y);ctx.lineTo(t.x+t.w,t.y+t.h);ctx.fill()} for(const g of sq.crystals)if(!g.taken){ctx.fillStyle='#69f5ed';ctx.shadowColor='#69f5ed';ctx.shadowBlur=14;ctx.beginPath();ctx.moveTo(g.x,g.y-11);ctx.lineTo(g.x+8,g.y);ctx.lineTo(g.x,g.y+11);ctx.lineTo(g.x-8,g.y);ctx.closePath();ctx.fill();ctx.shadowBlur=0} ctx.fillStyle='#8b79ff';ctx.fillRect(sq.goal,200,10,100);ctx.fillStyle='rgba(139,121,255,.28)';ctx.fillRect(sq.goal-18,200,46,100); ctx.fillStyle='#e9f8ff';ctx.shadowColor='#38f4e5';ctx.shadowBlur=12;ctx.fillRect(p.x,p.y,p.w,p.h);ctx.shadowBlur=0;ctx.fillStyle='#151934';ctx.fillRect(p.x+14,p.y+6,4,4);ctx.restore(); if(p.x+p.w>=sq.goal){if(sq.level>=1000){toast('🎉 هر ۱۰۰۰ مرحله را کامل کردی! مسیر دوباره از مرحلهٔ ۱ شروع می‌شود.');sq.level=1;}else{sq.level++;toast('مرحله '+sq.level+' از ۱۰۰۰ باز شد!')}sq.gems=0;makeLevel();} sqRAF=requestAnimationFrame(frame); }catch(err){const wrap=document.querySelector('#playArea');if(wrap)wrap.insertAdjacentHTML('beforeend','

خطای بازی: '+String(err.message||err).replace(/[<>]/g,'')+'

');stopSoloQuest();} } sqRAF=requestAnimationFrame(frame); } const NEON_PHONE_GAMES_B64='PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iZmEiIGRpcj0icnRsIj48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEsbWF4aW11bS1zY2FsZT0xLHVzZXItc2NhbGFibGU9bm8iPjxzdHlsZT4KKntib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC10b3VjaC1jYWxsb3V0Om5vbmV9aHRtbCxib2R5e21hcmdpbjowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDoxMDAlO2JhY2tncm91bmQ6IzEwMTAxZDtjb2xvcjojZjRmMmZmO2ZvbnQ6NjAwIDE0cHggVGFob21hLEFyaWFsLHNhbnMtc2VyaWZ9Ym9keXtoZWlnaHQ6MTAwZHZoO21pbi1oZWlnaHQ6MTAwZHZoO3BhZGRpbmc6MnB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47b3ZlcmZsb3c6aGlkZGVufWJ1dHRvbntmb250OmluaGVyaXQ7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjB9I2hlYWR7ZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6OHB4O21hcmdpbi1ib3R0b206MTJweH0jaGVhZCBie2ZvbnQtc2l6ZToxN3B4O2NvbG9yOiM2NmU3ZDJ9I2dyaWR7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMixtaW5tYXgoMCwxZnIpKTtnYXA6OXB4fS5ne2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE0NWRlZywjMjQyMTNkLCMxNzFhMmIpO2JvcmRlcjoxcHggc29saWQgIzQ1NDA2NDtib3JkZXItcmFkaXVzOjE1cHg7cGFkZGluZzoxM3B4O3RleHQtYWxpZ246Y2VudGVyO21pbi1oZWlnaHQ6MTE1cHg7Y29sb3I6d2hpdGV9LmcgaXtkaXNwbGF5OmJsb2NrO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtc2l6ZToyOHB4O21hcmdpbi1ib3R0b206NnB4fS5nIGJ7ZGlzcGxheTpibG9jaztmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjd9Lmcgc21hbGx7ZGlzcGxheTpibG9jaztjb2xvcjojYWFhN2M4O2ZvbnQtc2l6ZToxMHB4O21hcmdpbi10b3A6NHB4fSNzdGFnZXtkaXNwbGF5Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7ZmxleDoxIDEgYXV0bzt3aWR0aDoxMDAlO2hlaWdodDphdXRvO21pbi1oZWlnaHQ6MDtiYWNrZ3JvdW5kOiMwNTA1MTA7Ym9yZGVyOjFweCBzb2xpZCAjNTE0YTc4O2JvcmRlci1yYWRpdXM6MTRweDtvdmVyZmxvdzpoaWRkZW59I3N0YWdlIGNhbnZhc3t3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2Rpc3BsYXk6YmxvY2s7dG91Y2gtYWN0aW9uOm5vbmV9I3N0YWdlIGlmcmFtZXt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7YmFja2dyb3VuZDojMDAwfSNpbmZve2ZsZXg6MCAwIGF1dG99I3BhZHtmbGV4OjAgMCBhdXRvO21hcmdpbjo4cHggYXV0byAycHh9CiNwYWR7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMyxtaW5tYXgoMCw2NHB4KSk7Z3JpZC10ZW1wbGF0ZS1yb3dzOjQycHg7Z2FwOjdweDttYXJnaW46MnB4IGF1dG8gMDtkaXJlY3Rpb246bHRyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfSNwYWQgYnV0dG9ue21pbi1oZWlnaHQ6NDhweDtib3JkZXItcmFkaXVzOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjNjU1YjkyO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE0NWRlZywjMzgzNDVjLCMyMTFmMzkpO2NvbG9yOiNmZmY7Zm9udC1zaXplOjIzcHg7Zm9udC13ZWlnaHQ6OTAwO3RvdWNoLWFjdGlvbjpub25lO3VzZXItc2VsZWN0Om5vbmV9I3BhZCBidXR0b25bZGF0YS1kaXI9bGVmdF17Z3JpZC1jb2x1bW46MTtncmlkLXJvdzoxfSNwYWQgYnV0dG9uW2RhdGEtZGlyPWFjdGlvbl17Z3JpZC1jb2x1bW46MjtncmlkLXJvdzoxfSNwYWQgYnV0dG9uW2RhdGEtZGlyPXJpZ2h0XXtncmlkLWNvbHVtbjozO2dyaWQtcm93OjF9I3BhZCBidXR0b246YWN0aXZle2JhY2tncm91bmQ6IzY2NTNhNjt0cmFuc2Zvcm06c2NhbGUoLjk3KX0jcGFkLnNuYWtlLXBhZHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDIsbWlubWF4KDAsNjRweCkpO2dyaWQtdGVtcGxhdGUtcm93czo0OHB4IDQ4cHh9I3BhZC5zbmFrZS1wYWQgYnV0dG9uW2RhdGEtZGlyPXVwXXtncmlkLWNvbHVtbjoxO2dyaWQtcm93OjF9I3BhZC5zbmFrZS1wYWQgYnV0dG9uW2RhdGEtZGlyPWRvd25de2dyaWQtY29sdW1uOjI7Z3JpZC1yb3c6MX0jcGFkLnNuYWtlLXBhZCBidXR0b25bZGF0YS1kaXI9bGVmdF17Z3JpZC1jb2x1bW46MTtncmlkLXJvdzoyfSNwYWQuc25ha2UtcGFkIGJ1dHRvbltkYXRhLWRpcj1yaWdodF17Z3JpZC1jb2x1bW46MjtncmlkLXJvdzoyfSNwYWQuc25ha2UtcGFkIGJ1dHRvbltkYXRhLWRpcj1hY3Rpb25de2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9I2dhbWVOYW1le2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9I2luZm97ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbjoycHggMDtjb2xvcjojYzdjMmU4O2ZvbnQtc2l6ZToxMnB4fSNzY29yZXtjb2xvcjojZmZlMjdhO2ZvbnQtd2VpZ2h0OmJvbGR9I2FnYWlue2JvcmRlcjoxcHggc29saWQgIzUxNGE3ODtiYWNrZ3JvdW5kOiMyOTI2NDI7Y29sb3I6d2hpdGU7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6N3B4IDEycHh9QG1lZGlhKG1heC13aWR0aDo1MjBweCl7Ym9keXtwYWRkaW5nOjFweH0jc3RhZ2V7bWluLWhlaWdodDowfSNpbmZve21hcmdpbjoxcHggMDtmb250LXNpemU6MTFweH0jcGFke2dhcDo2cHg7bWFyZ2luOjFweCBhdXRvIDA7Z3JpZC10ZW1wbGF0ZS1yb3dzOjM4cHh9I3BhZCBidXR0b257bWluLWhlaWdodDozOHB4fX1AbWVkaWEobWF4LXdpZHRoOjM2MHB4KXsjZ3JpZHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyfX0KPC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdiBpZD0iaGVhZCI+PGI+8J+OriDYqNin2LLbjOKAjNmH2Kc8L2I+PC9kaXY+PGRpdiBpZD0iZ3JpZCI+PC9kaXY+PGRpdiBpZD0iaW5mbyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PHNwYW4gaWQ9ImdhbWVOYW1lIj48L3NwYW4+PHNwYW4gaWQ9InNjb3JlIj48L3NwYW4+PGJ1dHRvbiBpZD0iYWdhaW4iPuKGuyDYtNix2YjYuSDYr9mI2KjYp9ix2Yc8L2J1dHRvbj48L2Rpdj48ZGl2IGlkPSJzdGFnZSI+PC9kaXY+PGRpdiBpZD0icGFkIj48YnV0dG9uIGRhdGEtZGlyPSJ1cCI+8J+RhvCfj7s8L2J1dHRvbj48YnV0dG9uIGRhdGEtZGlyPSJkb3duIj7wn5GH8J+PuzwvYnV0dG9uPjxidXR0b24gZGF0YS1kaXI9ImxlZnQiPvCfkYjwn4+7PC9idXR0b24+PGJ1dHRvbiBkYXRhLWRpcj0iYWN0aW9uIj7ipLTvuI88L2J1dHRvbj48YnV0dG9uIGRhdGEtZGlyPSJyaWdodCI+8J+RifCfj7s8L2J1dHRvbj48L2Rpdj48c2NyaXB0PgpbJ2NvcHknLCdjdXQnLCdjb250ZXh0bWVudScsJ3NlbGVjdHN0YXJ0J10uZm9yRWFjaChldj0+ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldixlPT5lLnByZXZlbnREZWZhdWx0KCkpKTsKY29uc3QgUj1NYXRoLnJhbmRvbSxjbGFtcD0odixhLGIpPT5NYXRoLm1heChhLE1hdGgubWluKGIsdikpLGh5cD1NYXRoLmh5cG90Owpjb25zdCBHTT1bWydGbGFwcHkgUGlwZScsJ/CfkKQnLDksKGMsSSk9PntsZXQgeT0xMzUsdj0wLHA9W1szMDAsMTAwXV0scz0wO3JldHVybiBkdD0+e2lmKEkudGFwKXY9LTI4MDt2Kz05MDAqZHQ7eSs9dipkdDtwLmZvckVhY2gocT0+cVswXS09MTQwKmR0KTtpZihwW3AubGVuZ3RoLTFdWzBdPDIyMClwLnB1c2goWzQ4MCw2MCtSKCkqMTMwXSk7aWYocFswXVswXTwtMzApe3Auc2hpZnQoKTtzKyt9SS5zYz1zO2MuZmlsbFN0eWxlPScjNmNmJztjLmZpbGxSZWN0KDAsMCw0ODAsMjcwKTtjLmZpbGxTdHlsZT0nIzNhMyc7cC5mb3JFYWNoKHE9PntjLmZpbGxSZWN0KHFbMF0sMCwzMCxxWzFdLTQ1KTtjLmZpbGxSZWN0KHFbMF0scVsxXSs0NSwzMCwyNzApfSk7Yy5maWxsU3R5bGU9JyNmZDAnO2MuZmlsbFJlY3QoODAseS04LDE2LDE2KTtyZXR1cm4geTwwfHx5PjI3MHx8cC5zb21lKHE9PnFbMF08OTYmJnFbMF0+NTAmJih5PHFbMV0tNDV8fHk+cVsxXSs0NSkpfX1dLApbJ1NuYWtlIE5lb24nLCfwn5CNJyw2LChjLEkpPT57bGV0IGI9W1sxMCw5XV0sZD1bMSwwXSxmPVsyMCw5XSx0PTAscz0wO3JldHVybiBkdD0+e2NvbnN0IGg9YlswXTtpZihJLmRpcil7Y29uc3Qgbj1JLmRpcjtpZigoblswXXx8blsxXSkmJiEoblswXT09LWRbMF0mJm5bMV09PS1kWzFdKSlkPW47SS5kaXI9bnVsbH1lbHNlIGlmKEkuZCl7Y29uc3QgZHg9SS54LzE1LWhbMF0sZHk9SS55LzE1LWhbMV0sbj1NYXRoLmFicyhkeCk+TWF0aC5hYnMoZHkpP1tNYXRoLnNpZ24oZHgpLDBdOlswLE1hdGguc2lnbihkeSldO2lmKChuWzBdfHxuWzFdKSYmIShuWzBdPT0tZFswXSYmblsxXT09LWRbMV0pKWQ9bn10Kz1kdDtpZih0Pi4xMil7dD0wO2NvbnN0IG49W2hbMF0rZFswXSxoWzFdK2RbMV1dO2lmKG5bMF08MHx8blsxXTwwfHxuWzBdPjMxfHxuWzFdPjE3fHxiLnNvbWUocT0+cVswXT09blswXSYmcVsxXT09blsxXSkpcmV0dXJuIDE7Yi51bnNoaWZ0KG4pO2lmKG5bMF09PWZbMF0mJm5bMV09PWZbMV0pe3MrKztmPVtSKCkqMzJ8MCxSKCkqMTh8MF19ZWxzZSBiLnBvcCgpfUkuc2M9cztjLmZpbGxTdHlsZT0nIzEyMyc7Yy5maWxsUmVjdCgwLDAsNDgwLDI3MCk7Yy5maWxsU3R5bGU9JyNmNTUnO2MuZmlsbFJlY3QoZlswXSoxNSxmWzFdKjE1LDE0LDE0KTtjLmZpbGxTdHlsZT0nIzRmOCc7Yi5mb3JFYWNoKHE9PmMuZmlsbFJlY3QocVswXSoxNSxxWzFdKjE1LDE0LDE0KSl9fV0sClsnQnJpY2sgQnJlYWtlcicsJ/Cfp7EnLDExLChjLEkpPT57bGV0IHB4PTI0MCxieD0yNDAsYnk9MjAwLHZ4PTE1MCx2eT0tMjAwLGJyPVtdLHM9MDtmb3IobGV0IGk9MDtpPDg7aSsrKWZvcihsZXQgaj0wO2o8NTtqKyspYnIucHVzaChbaSo2MCs0LGoqMjArMjAsMSwoaSo0NytqKjI5KSUzNjBdKTtyZXR1cm4gZHQ9PntweD1NYXRoLm1heCg0MCxNYXRoLm1pbig0NDAsTnVtYmVyLmlzRmluaXRlKEkueCk/SS54OnB4KSk7YngrPXZ4KmR0O2J5Kz12eSpkdDtpZihieDw1KXtieD01O3Z4PU1hdGguYWJzKHZ4KX1pZihieD40NzUpe2J4PTQ3NTt2eD0tTWF0aC5hYnModngpfWlmKGJ5PDUpe2J5PTU7dnk9TWF0aC5hYnModnkpfWlmKGJ5PjI0OCYmYnk8MjYyJiZNYXRoLmFicyhieC1weCk8NDAmJnZ5PjApe3Z5PS1NYXRoLmFicyh2eSk7dng9KGJ4LXB4KSo0fWJyLmZvckVhY2gocT0+e2lmKHFbMl0mJmJ4PnFbMF0mJmJ4PHFbMF0rNTImJmJ5PnFbMV0mJmJ5PHFbMV0rMTQpe3FbMl09MDt2eT0tdnk7cysrfX0pO0kuc2M9cztjLmZpbGxTdHlsZT0nIzExMic7Yy5maWxsUmVjdCgwLDAsNDgwLDI3MCk7YnIuZm9yRWFjaChxPT57aWYocVsyXSl7Yy5maWxsU3R5bGU9J2hzbCgnK3FbM10rJyw4NSUsNTglKSc7Yy5maWxsUmVjdChxWzBdLHFbMV0sNTIsMTQpO2Muc3Ryb2tlU3R5bGU9J3JnYmEoMjU1LDI1NSwyNTUsLjY1KSc7Yy5zdHJva2VSZWN0KHFbMF0rLjUscVsxXSsuNSw1MSwxMyl9fSk7Yy5maWxsU3R5bGU9JyNmZmYnO2MuZmlsbFJlY3QocHgtNDAsMjU1LDgwLDgpO2MuZmlsbFJlY3QoYngtNCxieS00LDgsOCk7cmV0dXJuIGJ5PjI3NXx8cz49NDB9fV0sClsnU3BhY2UgRGVmZW5kZXInLCfwn5qAJywxOCwoYyxJKT0+e2xldCB4PTI0MCxCPVtdLEU9W10sdD0wLHM9MCxmPTA7cmV0dXJuIGR0PT57eD1jbGFtcChJLnh8fHgsMTIsNDY4KTt0Kz1kdDtmKz1kdDtpZihmPi4yKXtmPTA7Qi5wdXNoKFt4LDI0MF0pfWlmKHQ+LjYpe3Q9MDtFLnB1c2goW1IoKSo0NjArMTAsMF0pfUIuZm9yRWFjaChiPT5iWzFdLT00MDAqZHQpO0UuZm9yRWFjaChlPT5lWzFdKz0oODArcyozKSpkdCk7Qi5mb3JFYWNoKGI9PkUuZm9yRWFjaChlPT57aWYoTWF0aC5hYnMoYlswXS1lWzBdKTwxNCYmTWF0aC5hYnMoYlsxXS1lWzFdKTwxNCl7YlsxXT0tOTtlWzFdPTk5OTtzKyt9fSkpO0I9Qi5maWx0ZXIoYj0+YlsxXT4wKTtjb25zdCBlbmQ9RS5zb21lKGU9PmVbMV0+MjYwJiZlWzFdPDQwMCk7RT1FLmZpbHRlcihlPT5lWzFdPDI2MCk7SS5zYz1zO2MuZmlsbFN0eWxlPScjMDAxJztjLmZpbGxSZWN0KDAsMCw0ODAsMjcwKTtjLmZpbGxTdHlsZT0nIzBmZic7Yy5maWxsUmVjdCh4LTEwLDI0NSwyMCwxNCk7Yy5maWxsU3R5bGU9JyNmZjAnO0IuZm9yRWFjaChiPT5jLmZpbGxSZWN0KGJbMF0tMSxiWzFdLDMsOCkpO2MuZmlsbFN0eWxlPScjZjQ0JztFLmZvckVhY2goZT0+Yy5maWxsUmVjdChlWzBdLTEwLGVbMV0tOCwyMCwxNikpO3JldHVybiBlbmR9fV0sClsnV2hhY2sgTW9sZScsJ/CflKgnLDgsKGMsSSk9PntsZXQgbT0tMSx0PTAscz0wLGw9MjA7cmV0dXJuIGR0PT57dC09ZHQ7aWYodDw9MCl7bT1SKCkqOXwwO3Q9LjgtTWF0aC5taW4oLjUscyouMDIpfWlmKEkudGFwKXtjb25zdCBpPShJLngvMTYwfDApKyhJLnkvOTB8MCkqMztpZihpPT1tKXtzKys7bT0tMTt0PS4zfX1JLnNjPXM7Yy5maWxsU3R5bGU9JyM0YTcnO2MuZmlsbFJlY3QoMCwwLDQ4MCwyNzApO2ZvcihsZXQgaT0wO2k8OTtpKyspe2MuZmlsbFN0eWxlPWk9PW0/JyNhNjMnOicjMmE0JztjLmJlZ2luUGF0aCgpO2MuYXJjKGklMyoxNjArODAsKGkvM3wwKSo5MCs0NSwzNCwwLDcpO2MuZmlsbCgpfWwtPWR0O2MuZmlsbFN0eWxlPScjZmZmJztjLmZpbGxUZXh0KCfij7EnKyhsfDApLDQ0MCwyMCk7cmV0dXJuIGw8PTB9fV0sClsnRGVzZXJ0IFJ1bm5lcicsJ/CfppYnLDEwLChjLEkpPT57bGV0IHk9MCx2PTAsbz1bWzUwMCwyMF1dLHM9MCxzcD0yMDAsYmVzdD0wO3RyeXtiZXN0PU51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbm92YV9kZXNlcnRfcnVubmVyX2Jlc3QnKXx8MCl9Y2F0Y2goZSl7fXJldHVybiBkdD0+e2lmKEkudGFwJiZ5PD0xKXY9NTYwO3YtPTE0MDAqZHQ7eT1NYXRoLm1heCgwLHkrdipkdCk7aWYoeT09MCl2PTA7by5mb3JFYWNoKHE9PnFbMF0tPXNwKmR0KTtpZihvW28ubGVuZ3RoLTFdWzBdPDMwMC1SKCkqMTAwKW8ucHVzaChbNTAwLDE1K1IoKSoyNV0pO2lmKG9bMF1bMF08LTIwKXtvLnNoaWZ0KCk7cysrO3NwKz02O2lmKHM+YmVzdCl7YmVzdD1zO3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbm92YV9kZXNlcnRfcnVubmVyX2Jlc3QnLFN0cmluZyhiZXN0KSl9Y2F0Y2goZSl7fX19SS5zYz1zO2MuZmlsbFN0eWxlPScjZmU4JztjLmZpbGxSZWN0KDAsMCw0ODAsMjcwKTtjLmZpbGxTdHlsZT0nIzg3Mic7Yy5maWxsUmVjdCgwLDIyMCw0ODAsNTApO2MuZmlsbFN0eWxlPScjMjkyJztjLmZpbGxSZWN0KDYwLDE5MC15LDI0LDMwKTtjLmZpbGxTdHlsZT0nI2EyMic7by5mb3JFYWNoKHE9PmMuZmlsbFJlY3QocVswXSwyMjAtcVsxXSwxNCxxWzFdKSk7Yy5maWxsU3R5bGU9JyMyNDEnO2MuZm9udD0nYm9sZCAxNHB4IFRhaG9tYSc7Yy50ZXh0QWxpZ249J3JpZ2h0JztjLmZpbGxUZXh0KCfYsdqp2YjYsdivOiAnK2Jlc3QsNDY1LDIyKTtjLnRleHRBbGlnbj0nbGVmdCc7cmV0dXJuIG8uc29tZShxPT5xWzBdPDg4JiZxWzBdPjQyJiZ5PHFbMV0rNSl9fV0sClsn2b7bjNmG2qkg2b7ZhtqvJywn8J+PkycsNSwoYyxJKT0+e2xldCBweT0xMzUsYXk9MTM1LGJ4PTI0MCxieT0xMzUsdng9MjIwLHZ5PTEyMCxzPTA7cmV0dXJuIGR0PT57cHk9Y2xhbXAoKEkueXx8cHkpLDM1LDIzNSk7YXk9Y2xhbXAoYXkrY2xhbXAoYnktYXksLTE1MCpkdCwxNTAqZHQpLDM1LDIzNSk7YngrPXZ4KmR0O2J5Kz12eSpkdDtpZihieTw1fHxieT4yNjUpdnk9LXZ5O2lmKGJ4PDIyJiZNYXRoLmFicyhieS1weSk8MzUmJnZ4PDApe3Z4PS12eCoxLjA1O3Z5Kz0oYnktcHkpKjM7cysrfWlmKGJ4PjQ1OCYmTWF0aC5hYnMoYnktYXkpPDM1JiZ2eD4wKXZ4PS12eDtJLnNjPXM7Yy5maWxsU3R5bGU9JyMwMTInO2MuZmlsbFJlY3QoMCwwLDQ4MCwyNzApO2MuZmlsbFN0eWxlPScjZmZmJztjLmZpbGxSZWN0KDEyLHB5LTM1LDgsNzApO2MuZmlsbFJlY3QoNDYwLGF5LTM1LDgsNzApO2MuZmlsbFJlY3QoYngtNSxieS01LDEwLDEwKTtyZXR1cm4gYng8MHx8Yng+NDgwfX1dLApbJ0Nvb2tpZSBDbGlja2VyJywn8J+NqicsNywoYyxJKT0+e2xldCBuPTAscD0xLGE9MCx1PTEwLHc9MzA7cmV0dXJuIGR0PT57bis9YSpkdDtpZihJLnRhcCl7aWYoSS55PDIwMCluKz1wO2Vsc2UgaWYoSS54PDI0MCYmbj49dSl7bi09dTtwKys7dT1NYXRoLmNlaWwodSoxLjYpfWVsc2UgaWYoSS54Pj0yNDAmJm4+PXcpe24tPXc7YSsrO3c9TWF0aC5jZWlsKHcqMS43KX19SS5zYz1ufDA7Yy5maWxsU3R5bGU9JyNmYzgnO2MuZmlsbFJlY3QoMCwwLDQ4MCwyNzApO2MuZmlsbFN0eWxlPScjYTYzJztjLmJlZ2luUGF0aCgpO2MuYXJjKDI0MCwxMDAsNjAsMCw3KTtjLmZpbGwoKTtjLmZpbGxTdHlsZT0nIzUzMSc7Yy5maWxsVGV4dCgn8J+NqiArJytwKycgICDimpkgJythKycvcycsMTkwLDMwKTtjLmZpbGxSZWN0KDAsMjAwLDIzOCw3MCk7Yy5maWxsUmVjdCgyNDIsMjAwLDIzOCw3MCk7Yy5maWxsU3R5bGU9JyNmZmYnO2MuZmlsbFRleHQoJ9mC2K/YsdiqICsxOiAnK3UsNjAsMjQwKTtjLmZpbGxUZXh0KCfYrtmI2K/aqdin2LE6ICcrdywzMjAsMjQwKX19XSwKWydGcnVpdCBDYXRjaCcsJ/CfjY4nLDksKGMsSSk9PntsZXQgeD0yNDAsRj1bXSx0PTAscz0wLGw9MztyZXR1cm4gZHQ9Pnt4PUkueHx8eDt0Kz1kdDtpZih0Pi43KXt0PTA7Ri5wdXNoKFtSKCkqNDYwKzEwLDAsUigpPC4yXSl9Ri5mb3JFYWNoKGY9PmZbMV0rPSgxMjArcyoyKSpkdCk7Rj1GLmZpbHRlcihmPT57aWYoZlsxXT4yNDAmJk1hdGguYWJzKGZbMF0teCk8MzYpe2ZbMl0/bC0tOnMrKztyZXR1cm4gMH1pZihmWzFdPjI3MCl7aWYoIWZbMl0pbC0tO3JldHVybiAwfXJldHVybiAxfSk7SS5zYz1zO2MuZmlsbFN0eWxlPScjOGNmJztjLmZpbGxSZWN0KDAsMCw0ODAsMjcwKTtjLmZpbGxTdHlsZT0nI2E1Mic7Yy5maWxsUmVjdCh4LTMwLDI0NSw2MCwxNCk7Ri5mb3JFYWNoKGY9PntjLmZpbGxTdHlsZT1mWzJdPycjMjIyJzonI2UzMyc7Yy5iZWdpblBhdGgoKTtjLmFyYyhmWzBdLGZbMV0sOSwwLDcpO2MuZmlsbCgpfSk7Yy5maWxsU3R5bGU9JyMwMDAnO2MuZmlsbFRleHQoJ+KdpCcrbCwxMCwyMCk7cmV0dXJuIGw8PTB9fV0sClsnVHJhZmZpYyBSYWNlcicsJ/Cfj47vuI8nLDI0LChjLEkpPT57bGV0IHg9MjQwLE89W10sdD0wLHM9MCxvPTA7cmV0dXJuIGR0PT57eD1jbGFtcChJLnh8fHgsMTQwLDM0MCk7dCs9ZHQ7bz0obyszMDAqZHQpJTQwO2lmKHQ+LjYpe3Q9MDtPLnB1c2goWzE0MCtSKCkqMjAwLC0zMF0pfU8uZm9yRWFjaChxPT5xWzFdKz0oMjYwK3MqNCkqZHQpO2NvbnN0IGU9Ty5zb21lKHE9Pk1hdGguYWJzKHFbMF0teCk8MzAmJnFbMV0+MjE1JiZxWzFdPDI2NSk7Tz1PLmZpbHRlcihxPT57aWYocVsxXT4yODApe3MrKztyZXR1cm4gMH1yZXR1cm4gMX0pO0kuc2M9cztjLmZpbGxTdHlsZT0nIzM2Myc7Yy5maWxsUmVjdCgwLDAsNDgwLDI3MCk7Yy5maWxsU3R5bGU9JyM0NDQnO2MuZmlsbFJlY3QoMTEwLDAsMjYwLDI3MCk7Yy5maWxsU3R5bGU9JyNmZmYnO2ZvcihsZXQgaT0tMTtpPDg7aSsrKWMuZmlsbFJlY3QoMjM4LGkqNDArbyw0LDIwKTtjLmZpbGxTdHlsZT0nI2ZkMCc7Yy5maWxsUmVjdCh4LTE0LDIyNSwyOCw0MCk7Yy5maWxsU3R5bGU9JyNlMzMnO08uZm9yRWFjaChxPT5jLmZpbGxSZWN0KHFbMF0tMTQscVsxXSwyOCw0MCkpO3JldHVybiBlfX1dLApbJ1RpYyBUYWMgVG9lJywn4p2MJywzLChjLEkpPT57bGV0IEI9QXJyYXkoOSkuZmlsbCgwKSxlPTA7Y29uc3QgTD1bWzAsMSwyXSxbMyw0LDVdLFs2LDcsOF0sWzAsMyw2XSxbMSw0LDddLFsyLDUsOF0sWzAsNCw4XSxbMiw0LDZdXSx3PXA9Pkwuc29tZShsPT5sLmV2ZXJ5KGk9PkJbaV09PXApKTtyZXR1cm4gZHQ9PntpZighZSYmSS50YXApe2NvbnN0IGk9KChJLngtMTY1KS81MHwwKSsoKEkueS02MCkvNTB8MCkqMztpZihJLng+MTY1JiZJLng8MzE1JiZJLnk+NjAmJkkueTwyMTAmJiFCW2ldKXtCW2ldPTE7aWYoIXcoMSkpe2NvbnN0IGY9Qi5tYXAoKHYsayk9PnY/LTE6aykuZmlsdGVyKGs9Pms+PTApO2lmKGYubGVuZ3RoKUJbZltSKCkqZi5sZW5ndGh8MF1dPTJ9fWlmKHcoMSl8fHcoMil8fEIuZXZlcnkodj0+dikpZT0xfWMuZmlsbFN0eWxlPScjMjIzJztjLmZpbGxSZWN0KDAsMCw0ODAsMjcwKTtjLmZvbnQ9JzQwcHggc2Fucy1zZXJpZic7Qi5mb3JFYWNoKCh2LGkpPT57Yy5zdHJva2VTdHlsZT0nI2ZmZic7Yy5zdHJva2VSZWN0KDE2NStpJTMqNTAsNjArKGkvM3wwKSo1MCw1MCw1MCk7Yy5maWxsU3R5bGU9dj09MT8nIzRmOCc6JyNmNTUnO2lmKHYpYy5maWxsVGV4dCh2PT0xPydYJzonTycsMTc1K2klMyo1MCw5OCsoaS8zfDApKjUwKX0pO0kuc2M9dygxKT8n2KjYsdivIPCfjoknOncoMik/J9io2KfYrtiqJzonJztyZXR1cm4gZX19XSwKWydUb3dlciBTdGFjaycsJ/Cfj5fvuI8nLDgsKGMsSSk9PntsZXQgc3Q9W1sxOTAsMTAwXV0seD0wLGQ9MSx3PTEwMCxzPTA7cmV0dXJuIGR0PT57eCs9ZCooMTYwK3MqOCkqZHQ7aWYoeDwwfHx4PjQ4MC13KWQ9LWQ7aWYoSS50YXApe2NvbnN0IHA9c3Rbc3QubGVuZ3RoLTFdLG89TWF0aC5taW4oeCt3LHBbMF0rcFsxXSktTWF0aC5tYXgoeCxwWzBdKTtpZihvPD0wKXJldHVybiAxO3c9bztzdC5wdXNoKFtNYXRoLm1heCh4LHBbMF0pLG9dKTtzKys7aWYoc3QubGVuZ3RoPjgpc3Quc2hpZnQoKX1JLnNjPXM7Yy5maWxsU3R5bGU9JyMxMjQnO2MuZmlsbFJlY3QoMCwwLDQ4MCwyNzApO3N0LmZvckVhY2goKGIsaSk9PntjLmZpbGxTdHlsZT0naHNsKCcraSo0MCsnLDcwJSw1NSUpJztjLmZpbGxSZWN0KGJbMF0sMjUwLWkqMjIsYlsxXSwyMCl9KTtjLmZpbGxTdHlsZT0nI2ZmZic7Yy5maWxsUmVjdCh4LDI1MC1zdC5sZW5ndGgqMjIsdywyMCl9fV0sClsnUmVmbGV4IFRlc3QnLCfimqEnLDIsKGMsSSk9PntsZXQgdD0xK1IoKSozLGc9MDtyZXR1cm4gZHQ9Pnt0LT1kdDtpZih0PD0wJiYhZylnPXBlcmZvcm1hbmNlLm5vdygpO2lmKEkudGFwKXtpZihnKXtJLnNjPU1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCktZykrJ21zJztyZXR1cm4gMX10PTErUigpKjN9Yy5maWxsU3R5bGU9Zz8nIzJjMic6JyNjMjInO2MuZmlsbFJlY3QoMCwwLDQ4MCwyNzApO2MuZmlsbFN0eWxlPScjZmZmJztjLmZvbnQ9JzI4cHggc2Fucy1zZXJpZic7Yy5maWxsVGV4dChnPyfYqNiy2YYhJzon2LXYqNixINqp2YYuLi4nLDE5MCwxNDApfX1dLApbJ0JhbGxvb24gUG9wJywn8J+OiCcsNywoYyxJKT0+e2xldCBCPVtdLHQ9MCxzPTAsbD01O3JldHVybiBkdD0+e3QrPWR0O2lmKHQ+LjUpe3Q9MDtCLnB1c2goW1IoKSo0NDArMjAsMjgwLFIoKSozNjB8MF0pfUIuZm9yRWFjaChiPT5iWzFdLT0oNzArcyoyKSpkdCk7aWYoSS50YXApQj1CLmZpbHRlcihiPT57aWYoaHlwKGJbMF0tSS54LGJbMV0tSS55KTwyNil7cysrO3JldHVybiAwfXJldHVybiAxfSk7Qj1CLmZpbHRlcihiPT57aWYoYlsxXTwtMjApe2wtLTtyZXR1cm4gMH1yZXR1cm4gMX0pO0kuc2M9cztjLmZpbGxTdHlsZT0nI2NlZic7Yy5maWxsUmVjdCgwLDAsNDgwLDI3MCk7Qi5mb3JFYWNoKGI9PntjLmZpbGxTdHlsZT0naHNsKCcrYlsyXSsnLDgwJSw1NSUpJztjLmJlZ2luUGF0aCgpO2MuYXJjKGJbMF0sYlsxXSwyMiwwLDcpO2MuZmlsbCgpfSk7Yy5maWxsU3R5bGU9JyMwMDAnO2MuZmlsbFRleHQoJ+KdpCcrbCwxMCwyMCk7cmV0dXJuIGw8PTB9fV1dOwpjb25zdCBIRz17InJ1biI6IjwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPjxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xLG1heGltdW0tc2NhbGU9MSx1c2VyLXNjYWxhYmxlPW5vXCI+PHN0eWxlPmh0bWwsYm9keXttYXJnaW46MDtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojMDAwO3RvdWNoLWFjdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdG91Y2gtY2FsbG91dDpub25lO2ZvbnQ6NzAwIDE4cHggc3lzdGVtLXVpO2NvbG9yOiNmZmZ9Y2FudmFze3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0jaHtwb3NpdGlvbjpmaXhlZDtsZWZ0OjA7cmlnaHQ6MDt0b3A6NDRweDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXNoYWRvdzowIDJweCA0cHggIzAwMDtwb2ludGVyLWV2ZW50czpub25lfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxjYW52YXMgaWQ9XCJjXCI+PC9jYW52YXM+PGRpdiBpZD1cImhcIj48L2Rpdj48c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3RocmVlLmpzL3IxMjgvdGhyZWUubWluLmpzXCIgb25lcnJvcj1cInRoaXMub25lcnJvcj1udWxsO3RoaXMuc3JjPSdodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjEyOC4wL2J1aWxkL3RocmVlLm1pbi5qcydcIj48XC9zY3JpcHQ+PHNjcmlwdD5cbmNvbnN0IFI9TWF0aC5yYW5kb20scnI9KGEsYik9PmErUigpKihiLWEpLGh5cD1NYXRoLmh5cG90LGhkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoJyk7XG5jb25zdCByZD1uZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7Y2FudmFzOmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjJyksYW50aWFsaWFzOmZhbHNlfSk7cmQuc2V0UGl4ZWxSYXRpbygxKTtcbmNvbnN0IHNjPW5ldyBUSFJFRS5TY2VuZSgpLGNhbT1uZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNzAsMSwuMSwzMDApO1xuZnVuY3Rpb24gcnMoKXtyZC5zZXRTaXplKGlubmVyV2lkdGgsaW5uZXJIZWlnaHQpO2NhbS5hc3BlY3Q9aW5uZXJXaWR0aC9pbm5lckhlaWdodDtjYW0udXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScscnMpO3JzKCk7XG5jb25zdCBJPXt4OjAseTowLGQ6MCx0YXA6MH07XG5mdW5jdGlvbiBub3ZhQ29udHJvbChkaXIsZG93bil7aWYoZG93bil7SS50YXA9MTtpZihkaXI9PT0nbGVmdCcpe0kueD0tMTtJLnk9MDtJLmQ9MX1lbHNlIGlmKGRpcj09PSdyaWdodCcpe0kueD0xO0kueT0wO0kuZD0xfWVsc2UgaWYoZGlyPT09J3VwJyl7SS54PTA7SS55PTE7SS5kPTF9ZWxzZSBpZihkaXI9PT0nZG93bicpe0kueD0wO0kueT0tMTtJLmQ9MX1lbHNle0kueD0wO0kueT0wO0kuZD0xfX1lbHNle0kuZD0wO0kueD0wO0kueT0wfX1cblxuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsZT0+e2lmKGUuZGF0YT8udHlwZT09PSdub3ZhLXBhZCcpbm92YUNvbnRyb2woZS5kYXRhLmRpciwhIWUuZGF0YS5kb3duKX0pO1xuY29uc3QgZXY9ZT0+e0kueD1lLmNsaWVudFgvaW5uZXJXaWR0aCoyLTE7SS55PTEtZS5jbGllbnRZL2lubmVySGVpZ2h0KjJ9O1xuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLGU9PntldihlKTtJLmQ9MTtJLnRhcD0xfSk7YWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLGV2KTthZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCgpPT5JLmQ9MCk7XG5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxlPT57aWYoZS5jb2RlPT0nQXJyb3dMZWZ0J3x8ZS5jb2RlPT0nS2V5QScpe0kueD0tMTtJLnRhcD0xfWlmKGUuY29kZT09J0Fycm93UmlnaHQnfHxlLmNvZGU9PSdLZXlEJyl7SS54PTE7SS50YXA9MX1pZihlLmNvZGU9PSdTcGFjZSd8fGUuY29kZT09J0Fycm93VXAnKXtJLng9MDtJLnRhcD0xfX0pO1xuY29uc3QgY2xyPSgpPT57d2hpbGUoc2MuY2hpbGRyZW4ubGVuZ3RoKXNjLnJlbW92ZShzYy5jaGlsZHJlblswXSl9LGxpdD0oKT0+e3NjLmFkZChuZXcgVEhSRUUuSGVtaXNwaGVyZUxpZ2h0KDB4ZmZmZmZmLDB4NDQ1NTY2LDEuMSkpO2NvbnN0IGQ9bmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmZmZmYsLjgpO2QucG9zaXRpb24uc2V0KDUsMTAsNyk7c2MuYWRkKGQpfTtcbmNvbnN0IG1lc2g9KGcsYyx4LHkseixiKT0+e2NvbnN0IG09bmV3IFRIUkVFLk1lc2goZyxiP25ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6Y30pOm5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtjb2xvcjpjfSkpO20ucG9zaXRpb24uc2V0KHgseSx6KTtzYy5hZGQobSk7cmV0dXJuIG19O1xubGV0IHNjb3JlPTAsZXh0cmE9Jycsb3Zlcj0wLGxhc3Q9cGVyZm9ybWFuY2Uubm93KCkscmV3YXJkU2VudD1mYWxzZTtcbmxldCBiZXN0U2NvcmU9MDt0cnl7YmVzdFNjb3JlPU51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbm92YV8zZF9ydW5uZXJfYmVzdCcpfHwwKXx8MH1jYXRjaChlKXt9XG5sZXQgcGwsbGFuZSx5LHZ5LE8sdCxzcCxTO1xuZnVuY3Rpb24gaW5pdCgpe2NscigpO3NjLmJhY2tncm91bmQ9bmV3IFRIUkVFLkNvbG9yKDB4MGEwMDIwKTtzYy5mb2c9bmV3IFRIUkVFLkZvZygweDBhMDAyMCwyNSwxMDApO2xpdCgpO1xuIG1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDExLC4yLDMwMCksMHgxYTEwMzAsMCwtLjEsLTEzMCk7bWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoLjMsLjUsMzAwKSwweGZmMmRkMCwtNS42LC4yLC0xMzAsMSk7bWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoLjMsLjUsMzAwKSwweDAwZjBmZiw1LjYsLjIsLTEzMCwxKTtcbiBTPVtdO2ZvcihsZXQgaT0wO2k8MTQ7aSsrKVMucHVzaChbbWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoLjIsLjAyLDIpLDB4NmE1YWNkLC0xLjUsMCwwLDEpLG1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KC4yLC4wMiwyKSwweDZhNWFjZCwxLjUsMCwwLDEpLC1pKjhdKTtcbiBwbD1tZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgxLDEsMSksMHgwMGYwZmYsMCwuNSwwLDEpO2xhbmU9MDt5PS41O3Z5PTA7Tz1bXTt0PTA7c3A9MjA7c2NvcmU9MH1cbmZ1bmN0aW9uIHN0ZXAoZHQpe2lmKEkudGFwKXtpZihJLng8LS4zMylsYW5lPU1hdGgubWF4KC0xLGxhbmUtMSk7ZWxzZSBpZihJLng+LjMzKWxhbmU9TWF0aC5taW4oMSxsYW5lKzEpO2Vsc2UgaWYoeTw9LjUyKXZ5PTEwfVxuIHZ5LT0yOCpkdDt5PU1hdGgubWF4KC41LHkrdnkqZHQpO2lmKHk9PS41KXZ5PTA7cGwucG9zaXRpb24ueT15O3BsLnBvc2l0aW9uLngrPShsYW5lKjMtcGwucG9zaXRpb24ueCkqTWF0aC5taW4oMSwxNCpkdCk7cGwucm90YXRpb24uej0ocGwucG9zaXRpb24ueC1sYW5lKjMpKi4zO2lmKHk+LjYpcGwucm90YXRpb24ueCs9ZHQqNjtlbHNlIHBsLnJvdGF0aW9uLng9MDtcbiBzcCs9ZHQqLjU7c2NvcmUrPWR0KnNwKi4yO2lmKChzY29yZXwwKT5iZXN0U2NvcmUpe2Jlc3RTY29yZT1zY29yZXwwO3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbm92YV8zZF9ydW5uZXJfYmVzdCcsU3RyaW5nKGJlc3RTY29yZSkpfWNhdGNoKGUpe319Uy5mb3JFYWNoKHM9PntzWzJdKz1zcCpkdDtpZihzWzJdPjgpc1syXS09MTEyO3NbMF0ucG9zaXRpb24uej1zWzFdLnBvc2l0aW9uLno9c1syXX0pO1xuIHQtPWR0O2lmKHQ8PTApe3Q9TWF0aC5tYXgoLjI1LC43LXNwKi4wMSk7Y29uc3QgYz1SKCk8LjI1LG09Yz9tZXNoKG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSguNDUsOCw2KSwweGZmZGQwMCwwLC44LDAsMSk6bWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoMiwxLjQsMS4yKSwweGZmMzM1NSwwLC43LDAsMCk7bS5wb3NpdGlvbi5zZXQoKChSKCkqM3wwKS0xKSozLGM/Ljk6LjcsLTkwKTtPLnB1c2goe20sY30pfVxuIGZvcihsZXQgaT1PLmxlbmd0aC0xO2k+PTA7aS0tKXtjb25zdCBvPU9baV07by5tLnBvc2l0aW9uLnorPXNwKmR0O2lmKG8uYylvLm0ucm90YXRpb24ueSs9ZHQqMztjb25zdCB6PW8ubS5wb3NpdGlvbi56O2lmKHo+LTEmJno8MSYmTWF0aC5hYnMoby5tLnBvc2l0aW9uLngtcGwucG9zaXRpb24ueCk8MS41KXtpZihvLmMpe3Njb3JlKz0yNTtwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J25vdmEtcGhvbmUtcmV3YXJkJyxjb2luczoyMH0sJyonKTtzYy5yZW1vdmUoby5tKTtPLnNwbGljZShpLDEpO2NvbnRpbnVlfWVsc2UgaWYoeTwxLjYpcmV0dXJuIDF9aWYoej44KXtzYy5yZW1vdmUoby5tKTtPLnNwbGljZShpLDEpfX1cbiBjYW0ucG9zaXRpb24uc2V0KHBsLnBvc2l0aW9uLngqLjUsNCw3KTtjYW0ubG9va0F0KHBsLnBvc2l0aW9uLngqLjQsMSwtNil9XG5pbml0KCk7KGZ1bmN0aW9uIGYodCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGYpO2NvbnN0IGR0PU1hdGgubWluKC4wNSwodC1sYXN0KS8xMDAwKTtsYXN0PXQ7aWYoIW92ZXIpe292ZXI9c3RlcChkdCk7aWYob3ZlciYmIXJld2FyZFNlbnQpe3Jld2FyZFNlbnQ9dHJ1ZTt9fWVsc2UgaWYoSS50YXApe2luaXQoKTtvdmVyPTA7cmV3YXJkU2VudD1mYWxzZX1JLnRhcD0wO2hkLnRleHRDb250ZW50PW92ZXI/J9m+2KfbjNin2YYg4oCUINin2YXYqtuM2KfYsiAnKyhzY29yZXwwKSsnIOKAlCDYsdqp2YjYsdivICcrYmVzdFNjb3JlKycg4oCUINio2LLZhiDYqtinINiv2YjYqNin2LHZhyc6KHNjb3JlfDApKycgIHwgINix2qnZiNix2K8gJytiZXN0U2NvcmUrZXh0cmE7cmQucmVuZGVyKHNjLGNhbSl9KShsYXN0KTs8XC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD5cbiIsInpvbWIiOiI8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PVwidXRmLThcIj48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSxtYXhpbXVtLXNjYWxlPTEsdXNlci1zY2FsYWJsZT1ub1wiPjxzdHlsZT5odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQ6IzAwMDt0b3VjaC1hY3Rpb246bm9uZTt1c2VyLXNlbGVjdDpub25lO2ZvbnQ6NzAwIDE4cHggc3lzdGVtLXVpO2NvbG9yOiNmZmZ9Y2FudmFze3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0jaHtwb3NpdGlvbjpmaXhlZDtsZWZ0OjA7cmlnaHQ6MDt0b3A6NDRweDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXNoYWRvdzowIDJweCA0cHggIzAwMDtwb2ludGVyLWV2ZW50czpub25lfTwvc3R5bGU+PC9oZWFkPjxib2R5PjxjYW52YXMgaWQ9XCJjXCI+PC9jYW52YXM+PGRpdiBpZD1cImhcIj48L2Rpdj48c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3RocmVlLmpzL3IxMjgvdGhyZWUubWluLmpzXCIgb25lcnJvcj1cInRoaXMub25lcnJvcj1udWxsO3RoaXMuc3JjPSdodHRwczovL3VucGtnLmNvbS90aHJlZUAwLjEyOC4wL2J1aWxkL3RocmVlLm1pbi5qcydcIj48XC9zY3JpcHQ+PHNjcmlwdD5cbmNvbnN0IFI9TWF0aC5yYW5kb20scnI9KGEsYik9PmErUigpKihiLWEpLGh5cD1NYXRoLmh5cG90LGhkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoJyk7XG5jb25zdCByZD1uZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7Y2FudmFzOmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjJyksYW50aWFsaWFzOmZhbHNlfSk7cmQuc2V0UGl4ZWxSYXRpbygxKTtcbmNvbnN0IHNjPW5ldyBUSFJFRS5TY2VuZSgpLGNhbT1uZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNzAsMSwuMSwzMDApO1xuZnVuY3Rpb24gcnMoKXtyZC5zZXRTaXplKGlubmVyV2lkdGgsaW5uZXJIZWlnaHQpO2NhbS5hc3BlY3Q9aW5uZXJXaWR0aC9pbm5lckhlaWdodDtjYW0udXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScscnMpO3JzKCk7XG5jb25zdCBJPXt4OjAseTowLGQ6MCx0YXA6MH07XG5mdW5jdGlvbiBub3ZhQ29udHJvbChkaXIsZG93bil7aWYoZG93bil7SS50YXA9MTtpZihkaXI9PT0nbGVmdCcpe0kueD0tMTtJLnk9MDtJLmQ9MX1lbHNlIGlmKGRpcj09PSdyaWdodCcpe0kueD0xO0kueT0wO0kuZD0xfWVsc2UgaWYoZGlyPT09J3VwJyl7SS54PTA7SS55PTE7SS5kPTF9ZWxzZSBpZihkaXI9PT0nZG93bicpe0kueD0wO0kueT0tMTtJLmQ9MX1lbHNle0kueD0wO0kueT0wO0kuZD0xfX1lbHNle0kuZD0wO0kueD0wO0kueT0wfX1cblxuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsZT0+e2lmKGUuZGF0YT8udHlwZT09PSdub3ZhLXBhZCcpbm92YUNvbnRyb2woZS5kYXRhLmRpciwhIWUuZGF0YS5kb3duKX0pO1xuY29uc3QgZXY9ZT0+e0kueD1lLmNsaWVudFgvaW5uZXJXaWR0aCoyLTE7SS55PTEtZS5jbGllbnRZL2lubmVySGVpZ2h0KjJ9O1xuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLGU9PntldihlKTtJLmQ9MTtJLnRhcD0xfSk7YWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLGV2KTthZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCgpPT5JLmQ9MCk7XG5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxlPT57aWYoZS5jb2RlPT0nQXJyb3dMZWZ0J3x8ZS5jb2RlPT0nS2V5QScpe0kueD0tMTtJLnRhcD0xfWlmKGUuY29kZT09J0Fycm93UmlnaHQnfHxlLmNvZGU9PSdLZXlEJyl7SS54PTE7SS50YXA9MX1pZihlLmNvZGU9PSdTcGFjZSd8fGUuY29kZT09J0Fycm93VXAnKXtJLng9MDtJLnRhcD0xfX0pO1xuY29uc3QgY2xyPSgpPT57d2hpbGUoc2MuY2hpbGRyZW4ubGVuZ3RoKXNjLnJlbW92ZShzYy5jaGlsZHJlblswXSl9LGxpdD0oKT0+e3NjLmFkZChuZXcgVEhSRUUuSGVtaXNwaGVyZUxpZ2h0KDB4ZmZmZmZmLDB4NDQ1NTY2LDEuMSkpO2NvbnN0IGQ9bmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmZmZmYsLjgpO2QucG9zaXRpb24uc2V0KDUsMTAsNyk7c2MuYWRkKGQpfTtcbmNvbnN0IG1lc2g9KGcsYyx4LHkseixiKT0+e2NvbnN0IG09bmV3IFRIUkVFLk1lc2goZyxiP25ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6Y30pOm5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtjb2xvcjpjfSkpO20ucG9zaXRpb24uc2V0KHgseSx6KTtzYy5hZGQobSk7cmV0dXJuIG19O1xubGV0IHNjb3JlPTAsZXh0cmE9Jycsb3Zlcj0wLGxhc3Q9cGVyZm9ybWFuY2Uubm93KCkscmV3YXJkU2VudD1mYWxzZTtcbmxldCBwLFosQixocCxzcCxmYztcbmZ1bmN0aW9uIGluaXQoKXtjbHIoKTtzYy5iYWNrZ3JvdW5kPW5ldyBUSFJFRS5Db2xvcigweDEwMTQxOCk7c2MuZm9nPW5ldyBUSFJFRS5Gb2coMHgxMDE0MTgsMzAsNzApO2xpdCgpO2NvbnN0IGc9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkNpcmNsZUdlb21ldHJ5KDMwLDQwKSxuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7Y29sb3I6MHgyYTNhMmF9KSk7Zy5yb3RhdGlvbi54PS1NYXRoLlBJLzI7c2MuYWRkKGcpO1xuIGZvcihsZXQgaT0wO2k8MjQ7aSsrKXtjb25zdCBhPWkvMjQqNi4yODMsdz1tZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSg4LDMsMSksMHg1NTU1NTUsTWF0aC5jb3MoYSkqMzAuNSwxLjUsTWF0aC5zaW4oYSkqMzAuNSk7dy5yb3RhdGlvbi55PS1hK01hdGguUEkvMn1cbiBwPW1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDEsMiwxKSwweDRhOGNmZiwwLDEsMCk7bWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoLjIsLjIsMSksMHgyMjIyMjIsMCwxLjIsLjcpO1o9W107Qj1bXTtocD0xMDA7c3A9MDtmYz0wO3Njb3JlPTB9XG5mdW5jdGlvbiBzdGVwKGR0KXtpZihJLmQpe2NvbnN0IGw9aHlwKEkueCxJLnkpO2lmKGw+LjA1KXtwLnBvc2l0aW9uLngrPUkueC9sKjgqZHQ7cC5wb3NpdGlvbi56LT1JLnkvbCo4KmR0fX1jb25zdCByPWh5cChwLnBvc2l0aW9uLngscC5wb3NpdGlvbi56KTtpZihyPjI3KXtwLnBvc2l0aW9uLngqPTI3L3I7cC5wb3NpdGlvbi56Kj0yNy9yfVxuIGZjLT1kdDtpZihmYzw9MCl7bGV0IG49bnVsbCxuZD0yMDtaLmZvckVhY2goej0+e2NvbnN0IGQ9aHlwKHoubS5wb3NpdGlvbi54LXAucG9zaXRpb24ueCx6Lm0ucG9zaXRpb24uei1wLnBvc2l0aW9uLnopO2lmKHouaHA+MCYmZDxuZCl7bmQ9ZDtuPXp9fSk7aWYobil7ZmM9LjE2O2NvbnN0IGR4PW4ubS5wb3NpdGlvbi54LXAucG9zaXRpb24ueCxkej1uLm0ucG9zaXRpb24uei1wLnBvc2l0aW9uLnosbD1oeXAoZHgsZHopO3Aucm90YXRpb24ueT1NYXRoLmF0YW4yKGR4LGR6KTtCLnB1c2goe206bWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoLjIsNiw0KSwweGZmZWU1NSxwLnBvc2l0aW9uLngsMS4zLHAucG9zaXRpb24ueiwxKSx2eDpkeC9sKjQwLHZ6OmR6L2wqNDAsdDouOH0pfX1cbiBmb3IobGV0IGk9Qi5sZW5ndGgtMTtpPj0wO2ktLSl7Y29uc3QgYj1CW2ldO2IubS5wb3NpdGlvbi54Kz1iLnZ4KmR0O2IubS5wb3NpdGlvbi56Kz1iLnZ6KmR0O2IudC09ZHQ7bGV0IGhpdD0wO2Zvcihjb25zdCB6IG9mIFopaWYoei5ocD4wJiZoeXAoei5tLnBvc2l0aW9uLngtYi5tLnBvc2l0aW9uLngsei5tLnBvc2l0aW9uLnotYi5tLnBvc2l0aW9uLnopPDEuMSl7ei5ocC0tO2hpdD0xO2lmKHouaHA8PTApc2NvcmUrKzticmVha31pZihoaXR8fGIudDw9MCl7c2MucmVtb3ZlKGIubSk7Qi5zcGxpY2UoaSwxKX19XG4gc3AtPWR0O2lmKHNwPD0wKXtzcD1NYXRoLm1heCguMjUsLjktc2NvcmUqLjAxMik7Y29uc3QgYT1SKCkqNi4yODM7Wi5wdXNoKHttOm1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDEsMS44LDEpLDB4NjZhYTQ0LE1hdGguY29zKGEpKjI5LC45LE1hdGguc2luKGEpKjI5KSxocDoyfSl9XG4gZm9yKGxldCBpPVoubGVuZ3RoLTE7aT49MDtpLS0pe2NvbnN0IHo9WltpXTtpZih6LmhwPD0wKXtzYy5yZW1vdmUoei5tKTtaLnNwbGljZShpLDEpO2NvbnRpbnVlfWNvbnN0IGR4PXAucG9zaXRpb24ueC16Lm0ucG9zaXRpb24ueCxkej1wLnBvc2l0aW9uLnotei5tLnBvc2l0aW9uLnosZD1oeXAoZHgsZHopfHwxLHY9Mi40K3Njb3JlKi4wMjt6Lm0ucG9zaXRpb24ueCs9ZHgvZCp2KmR0O3oubS5wb3NpdGlvbi56Kz1kei9kKnYqZHQ7ei5tLnJvdGF0aW9uLnk9TWF0aC5hdGFuMihkeCxkeik7aWYoZDwxLjMpaHAtPTM1KmR0fVxuIGV4dHJhPScgICDinaQgJytNYXRoLm1heCgwLGhwfDApO2NhbS5wb3NpdGlvbi5zZXQocC5wb3NpdGlvbi54Ki42LDI0LHAucG9zaXRpb24ueiouNisxNCk7Y2FtLmxvb2tBdChwLnBvc2l0aW9uLngqLjYsMCxwLnBvc2l0aW9uLnoqLjYpO3JldHVybiBocDw9MH1cbmluaXQoKTsoZnVuY3Rpb24gZih0KXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZik7Y29uc3QgZHQ9TWF0aC5taW4oLjA1LCh0LWxhc3QpLzEwMDApO2xhc3Q9dDtpZighb3Zlcil7b3Zlcj1zdGVwKGR0KTtpZihvdmVyJiYhcmV3YXJkU2VudCl7cmV3YXJkU2VudD10cnVlO319ZWxzZSBpZihJLnRhcCl7aW5pdCgpO292ZXI9MDtyZXdhcmRTZW50PWZhbHNlfUkudGFwPTA7aGQudGV4dENvbnRlbnQ9b3Zlcj8n2b7Yp9uM2KfZhiDigJQg2KfZhdiq24zYp9iyICcrKHNjb3JlfDApKycg4oCUINio2LLZhiDYqtinINiv2YjYqNin2LHZhyc6KHNjb3JlfDApK2V4dHJhO3JkLnJlbmRlcihzYyxjYW0pfSkobGFzdCk7PFwvc2NyaXB0PjwvYm9keT48L2h0bWw+XG4iLCJzcGFjZSI6IjwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPjxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xLG1heGltdW0tc2NhbGU9MSx1c2VyLXNjYWxhYmxlPW5vXCI+PHN0eWxlPmh0bWwsYm9keXttYXJnaW46MDtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojMDAwO3RvdWNoLWFjdGlvbjpub25lO3VzZXItc2VsZWN0Om5vbmU7Zm9udDo3MDAgMThweCBzeXN0ZW0tdWk7Y29sb3I6I2ZmZn1jYW52YXN7cG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfSNoe3Bvc2l0aW9uOmZpeGVkO2xlZnQ6MDtyaWdodDowO3RvcDo0NHB4O3RleHQtYWxpZ246Y2VudGVyO3RleHQtc2hhZG93OjAgMnB4IDRweCAjMDAwO3BvaW50ZXItZXZlbnRzOm5vbmV9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGNhbnZhcyBpZD1cImNcIj48L2NhbnZhcz48ZGl2IGlkPVwiaFwiPjwvZGl2PjxkaXYgaWQ9XCJub3ZhM2RwYWRcIiBzdHlsZT1cInBvc2l0aW9uOmZpeGVkO2xlZnQ6OHB4O3JpZ2h0OjhweDtib3R0b206MTJweDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjdweDt6LWluZGV4OjUwO3BvaW50ZXItZXZlbnRzOmF1dG9cIj48YnV0dG9uIGRhdGEtZGlyPVwibGVmdFwiIHN0eWxlPVwicGFkZGluZzoxMnB4IDE0cHg7Ym9yZGVyOjFweCBzb2xpZCAjOGFmO2JvcmRlci1yYWRpdXM6MTJweDtiYWNrZ3JvdW5kOiMxODI1NGRkZDtjb2xvcjp3aGl0ZTtmb250LXNpemU6MTlweFwiPuKshe+4jzwvYnV0dG9uPjxidXR0b24gZGF0YS1kaXI9XCJ1cFwiIHN0eWxlPVwicGFkZGluZzoxMnB4IDE0cHg7Ym9yZGVyOjFweCBzb2xpZCAjOGFmO2JvcmRlci1yYWRpdXM6MTJweDtiYWNrZ3JvdW5kOiMxODI1NGRkZDtjb2xvcjp3aGl0ZTtmb250LXNpemU6MTlweFwiPuKshu+4jzwvYnV0dG9uPjxidXR0b24gZGF0YS1kaXI9XCJhY3Rpb25cIiBzdHlsZT1cInBhZGRpbmc6MTJweCAxMnB4O2JvcmRlcjoxcHggc29saWQgIzhhZjtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDojMTc2YjcwZGQ7Y29sb3I6d2hpdGU7Zm9udC13ZWlnaHQ6Ym9sZFwiPtm+2LHYtC/YtNmE24zaqTwvYnV0dG9uPjxidXR0b24gZGF0YS1kaXI9XCJkb3duXCIgc3R5bGU9XCJwYWRkaW5nOjEycHggMTRweDtib3JkZXI6MXB4IHNvbGlkICM4YWY7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6IzE4MjU0ZGRkO2NvbG9yOndoaXRlO2ZvbnQtc2l6ZToxOXB4XCI+4qyH77iPPC9idXR0b24+PGJ1dHRvbiBkYXRhLWRpcj1cInJpZ2h0XCIgc3R5bGU9XCJwYWRkaW5nOjEycHggMTRweDtib3JkZXI6MXB4IHNvbGlkICM4YWY7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6IzE4MjU0ZGRkO2NvbG9yOndoaXRlO2ZvbnQtc2l6ZToxOXB4XCI+4p6h77iPPC9idXR0b24+PC9kaXY+PHNjcmlwdCBzcmM9XCJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy90aHJlZS5qcy9yMTI4L3RocmVlLm1pbi5qc1wiIG9uZXJyb3I9XCJ0aGlzLm9uZXJyb3I9bnVsbDt0aGlzLnNyYz0naHR0cHM6Ly91bnBrZy5jb20vdGhyZWVAMC4xMjguMC9idWlsZC90aHJlZS5taW4uanMnXCI+PFwvc2NyaXB0PjxzY3JpcHQ+XG5jb25zdCBSPU1hdGgucmFuZG9tLHJyPShhLGIpPT5hK1IoKSooYi1hKSxoeXA9TWF0aC5oeXBvdCxoZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaCcpO1xuY29uc3QgcmQ9bmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2NhbnZhczpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYycpLGFudGlhbGlhczpmYWxzZX0pO3JkLnNldFBpeGVsUmF0aW8oMSk7XG5jb25zdCBzYz1uZXcgVEhSRUUuU2NlbmUoKSxjYW09bmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDcwLDEsLjEsMzAwKTtcbmZ1bmN0aW9uIHJzKCl7cmQuc2V0U2l6ZShpbm5lcldpZHRoLGlubmVySGVpZ2h0KTtjYW0uYXNwZWN0PWlubmVyV2lkdGgvaW5uZXJIZWlnaHQ7Y2FtLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLHJzKTtycygpO1xuY29uc3QgST17eDowLHk6MCxkOjAsdGFwOjB9O1xuZnVuY3Rpb24gbm92YUNvbnRyb2woZGlyLGRvd24pe2lmKGRvd24pe0kudGFwPTE7aWYoZGlyPT09J2xlZnQnKXtJLng9LTE7SS55PTA7SS5kPTF9ZWxzZSBpZihkaXI9PT0ncmlnaHQnKXtJLng9MTtJLnk9MDtJLmQ9MX1lbHNlIGlmKGRpcj09PSd1cCcpe0kueD0wO0kueT0xO0kuZD0xfWVsc2UgaWYoZGlyPT09J2Rvd24nKXtJLng9MDtJLnk9LTE7SS5kPTF9ZWxzZXtJLng9MDtJLnk9MDtJLmQ9MX19ZWxzZXtJLmQ9MDtJLng9MDtJLnk9MH19XG5cbmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLGU9PntpZihlLmRhdGE/LnR5cGU9PT0nbm92YS1wYWQnKW5vdmFDb250cm9sKGUuZGF0YS5kaXIsISFlLmRhdGEuZG93bil9KTtcbmNvbnN0IGV2PWU9PntJLng9ZS5jbGllbnRYL2lubmVyV2lkdGgqMi0xO0kueT0xLWUuY2xpZW50WS9pbm5lckhlaWdodCoyfTtcbmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxlPT57ZXYoZSk7SS5kPTE7SS50YXA9MX0pO2FkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJyxldik7YWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywoKT0+SS5kPTApO1xuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZT0+e2lmKGUuY29kZT09J0Fycm93TGVmdCd8fGUuY29kZT09J0tleUEnKXtJLng9LTE7SS50YXA9MX1pZihlLmNvZGU9PSdBcnJvd1JpZ2h0J3x8ZS5jb2RlPT0nS2V5RCcpe0kueD0xO0kudGFwPTF9aWYoZS5jb2RlPT0nU3BhY2UnfHxlLmNvZGU9PSdBcnJvd1VwJyl7SS54PTA7SS50YXA9MX19KTtcbmNvbnN0IGNscj0oKT0+e3doaWxlKHNjLmNoaWxkcmVuLmxlbmd0aClzYy5yZW1vdmUoc2MuY2hpbGRyZW5bMF0pfSxsaXQ9KCk9PntzYy5hZGQobmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCgweGZmZmZmZiwweDQ0NTU2NiwxLjEpKTtjb25zdCBkPW5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLC44KTtkLnBvc2l0aW9uLnNldCg1LDEwLDcpO3NjLmFkZChkKX07XG5jb25zdCBtZXNoPShnLGMseCx5LHosYik9Pntjb25zdCBtPW5ldyBUSFJFRS5NZXNoKGcsYj9uZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOmN9KTpuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7Y29sb3I6Y30pKTttLnBvc2l0aW9uLnNldCh4LHkseik7c2MuYWRkKG0pO3JldHVybiBtfTtcbmxldCBzY29yZT0wLGV4dHJhPScnLG92ZXI9MCxsYXN0PXBlcmZvcm1hbmNlLm5vdygpLHJld2FyZFNlbnQ9ZmFsc2U7XG5sZXQgc2gsQSxHLHQscnQsc3AscGE7XG5mdW5jdGlvbiBpbml0KCl7Y2xyKCk7c2MuYmFja2dyb3VuZD1uZXcgVEhSRUUuQ29sb3IoMHgwMDAwMDYpO2xpdCgpO3NoPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Db25lR2VvbWV0cnkoLjcsMi4yLDYpLG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtjb2xvcjoweDY2Y2NmZn0pKTtzaC5yb3RhdGlvbi54PS1NYXRoLlBJLzI7c2MuYWRkKHNoKTtcbiBjb25zdCBhPW5ldyBGbG9hdDMyQXJyYXkoMTUwMCk7Zm9yKGxldCBpPTA7aTw1MDA7aSsrKXthW2kqM109cnIoLTcwLDcwKTthW2kqMysxXT1ycigtNDAsNDApO2FbaSozKzJdPXJyKC0xNTAsMTApfXBhPW5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO3BhLnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoYSwzKSk7c2MuYWRkKG5ldyBUSFJFRS5Qb2ludHMocGEsbmV3IFRIUkVFLlBvaW50c01hdGVyaWFsKHtzaXplOi41LGNvbG9yOjB4ZmZmZmZmfSkpKTtcbiBBPVtdO0c9W107dD0wO3J0PTI7c3A9NDA7c2NvcmU9MH1cbmZ1bmN0aW9uIHN0ZXAoZHQpe2NvbnN0IHR4PUkueCoxMCx0eT1JLnkqNjtzaC5wb3NpdGlvbi54Kz0odHgtc2gucG9zaXRpb24ueCkqTWF0aC5taW4oMSw2KmR0KTtzaC5wb3NpdGlvbi55Kz0odHktc2gucG9zaXRpb24ueSkqTWF0aC5taW4oMSw2KmR0KTtzaC5yb3RhdGlvbi56PShzaC5wb3NpdGlvbi54LXR4KSouMDg7c3ArPWR0Ki44O3Njb3JlKz1kdCpzcCouMDU7XG4gY29uc3QgYT1wYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaT0wO2k8NTAwO2krKyl7bGV0IHo9YS5nZXRaKGkpK3NwKmR0O2lmKHo+MTApei09MTYwO2Euc2V0WihpLHopfWEubmVlZHNVcGRhdGU9dHJ1ZTtcbiB0LT1kdDtpZih0PD0wKXt0PU1hdGgubWF4KC4xMiwuNDUtc3AqLjAwMyk7Y29uc3Qgcj1yciguOCwyLjIpLG09bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkljb3NhaGVkcm9uR2VvbWV0cnkociwwKSxuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7Y29sb3I6MHg4YTdhNmF9KSk7bS5wb3NpdGlvbi5zZXQocnIoLTEzLDEzKSxycigtOCw4KSwtMTQwKTtzYy5hZGQobSk7QS5wdXNoKHttLHJ9KX1cbiBydC09ZHQ7aWYocnQ8PTApe3J0PTM7Y29uc3QgbT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuVG9ydXNHZW9tZXRyeSgzLC4xOCw4LDIwKSxuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOjB4MDBmZjg4fSkpO20ucG9zaXRpb24uc2V0KHJyKC04LDgpLHJyKC00LDQpLC0xNDApO3NjLmFkZChtKTtHLnB1c2goe20sb2s6MH0pfVxuIGZvcihsZXQgaT1BLmxlbmd0aC0xO2k+PTA7aS0tKXtjb25zdCBvPUFbaV07by5tLnBvc2l0aW9uLnorPXNwKmR0O28ubS5yb3RhdGlvbi54Kz1kdDtvLm0ucm90YXRpb24ueSs9ZHQqLjc7Y29uc3QgcT1vLm0ucG9zaXRpb247aWYoaHlwKHEueC1zaC5wb3NpdGlvbi54LHEueS1zaC5wb3NpdGlvbi55LHEueik8by5yKy45KXJldHVybiAxO2lmKHEuej4xMCl7c2MucmVtb3ZlKG8ubSk7QS5zcGxpY2UoaSwxKX19XG4gZm9yKGxldCBpPUcubGVuZ3RoLTE7aT49MDtpLS0pe2NvbnN0IG89R1tpXSxxPW8ubS5wb3NpdGlvbjtxLnorPXNwKmR0O2lmKCFvLm9rJiZxLno+LTEmJnEuejwyKXtvLm9rPTE7aWYoaHlwKHEueC1zaC5wb3NpdGlvbi54LHEueS1zaC5wb3NpdGlvbi55KTwzKXtzY29yZSs9NTA7by5tLm1hdGVyaWFsLmNvbG9yLnNldEhleCgweGZmZWUwMCl9fWlmKHEuej4xMCl7c2MucmVtb3ZlKG8ubSk7Ry5zcGxpY2UoaSwxKX19XG4gY2FtLnBvc2l0aW9uLnNldChzaC5wb3NpdGlvbi54Ki40LHNoLnBvc2l0aW9uLnkqLjQrMiw5KTtjYW0ubG9va0F0KHNoLnBvc2l0aW9uLngqLjMsc2gucG9zaXRpb24ueSouMywtMjApfVxuaW5pdCgpOyhmdW5jdGlvbiBmKHQpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmKTtjb25zdCBkdD1NYXRoLm1pbiguMDUsKHQtbGFzdCkvMTAwMCk7bGFzdD10O2lmKCFvdmVyKXtvdmVyPXN0ZXAoZHQpO2lmKG92ZXImJiFyZXdhcmRTZW50KXtyZXdhcmRTZW50PXRydWU7fX1lbHNlIGlmKEkudGFwKXtpbml0KCk7b3Zlcj0wO3Jld2FyZFNlbnQ9ZmFsc2V9SS50YXA9MDtoZC50ZXh0Q29udGVudD1vdmVyPyfZvtin24zYp9mGIOKAlCDYp9mF2KrbjNin2LIgJysoc2NvcmV8MCkrJyDigJQg2KjYstmGINiq2Kcg2K/ZiNio2KfYsdmHJzooc2NvcmV8MCkrZXh0cmE7cmQucmVuZGVyKHNjLGNhbSl9KShsYXN0KTs8XC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD5cbiIsImNzIjoiPCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz1cImZhXCI+PGhlYWQ+PG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG48bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSxtYXhpbXVtLXNjYWxlPTEsdXNlci1zY2FsYWJsZT1ubyx2aWV3cG9ydC1maXQ9Y292ZXJcIj5cbjx0aXRsZT5TVFJJS0UgWk9ORTwvdGl0bGU+XG48c3R5bGU+XG5odG1sLGJvZHl7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDojMDAwO292ZXJmbG93OmhpZGRlbjt0b3VjaC1hY3Rpb246bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTtmb250OjYwMCAxM3B4IHN5c3RlbS11aSxzYW5zLXNlcmlmO2NvbG9yOiNmZmZ9XG4jY3twb3NpdGlvbjpmaXhlZDtpbnNldDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9XG4uaHtwb3NpdGlvbjpmaXhlZDtwb2ludGVyLWV2ZW50czpub25lO3RleHQtc2hhZG93OjAgMXB4IDNweCAjMDAwfVxuI3JhZHtsZWZ0OmNhbGMoOHB4ICsgZW52KHNhZmUtYXJlYS1pbnNldC1sZWZ0KSk7dG9wOmNhbGMoOHB4ICsgZW52KHNhZmUtYXJlYS1pbnNldC10b3ApKTtib3JkZXI6MnB4IHNvbGlkICNmZmY2O2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6IzAwMGF9XG4jdG9we2xlZnQ6MDtyaWdodDowO3RvcDpjYWxjKDZweCArIGVudihzYWZlLWFyZWEtaW5zZXQtdG9wKSk7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjIwcHh9XG4jdG9wIHNtYWxse2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjEzcHg7Y29sb3I6I2ZmZDIzZn1cbiNrZntyaWdodDpjYWxjKDEwcHggKyBlbnYoc2FmZS1hcmVhLWluc2V0LXJpZ2h0KSk7dG9wOmNhbGMoOHB4ICsgZW52KHNhZmUtYXJlYS1pbnNldC10b3ApKTt0ZXh0LWFsaWduOnJpZ2h0O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNX1cbiNiYXJ7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOmNhbGMoNnB4ICsgZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pKTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTZweH1cbiNjeHtsZWZ0OjUwJTt0b3A6NTAlO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7bWFyZ2luOi0xMHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KCMwZjAsIzBmMCkgY2VudGVyLzJweCAxMDAlIG5vLXJlcGVhdCxsaW5lYXItZ3JhZGllbnQoIzBmMCwjMGYwKSBjZW50ZXIvMTAwJSAycHggbm8tcmVwZWF0fVxuI21zZ3tsZWZ0OjA7cmlnaHQ6MDt0b3A6MjglO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTozMHB4O2ZvbnQtd2VpZ2h0OjgwMDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IC4zc31cbiNzY29wZXtwb3NpdGlvbjpmaXhlZDtpbnNldDowO2Rpc3BsYXk6bm9uZTtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQ6cmFkaWFsLWdyYWRpZW50KGNpcmNsZSx0cmFuc3BhcmVudCAzMiUsIzAwMCAzMyUpfVxuI2RtZ3twb3NpdGlvbjpmaXhlZDtpbnNldDowO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4uYntwb3NpdGlvbjpmaXhlZDt3aWR0aDo1NHB4O2hlaWdodDo1NHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6I2ZmZjM7Ym9yZGVyOjJweCBzb2xpZCAjZmZmOTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Zm9udC1zaXplOjE3cHg7dG91Y2gtYWN0aW9uOm5vbmU7Ym94LXNpemluZzpib3JkZXItYm94fVxuLmIuc3t3aWR0aDo0NHB4O2hlaWdodDo0NHB4O2ZvbnQtc2l6ZToxNHB4fS5iLmJpZ3t3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2ZvbnQtc2l6ZToyOHB4O2JhY2tncm91bmQ6I2ZmMmQ1NTQ0fS5iLm9ue2JhY2tncm91bmQ6I2ZmNGQ2ZGNjfVxuI2pze3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMHB4O2hlaWdodDoxMDBweDtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MnB4IHNvbGlkICNmZmY2O2JhY2tncm91bmQ6I2ZmZjE7ZGlzcGxheTpub25lO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4ja257cG9zaXRpb246YWJzb2x1dGU7bGVmdDozMnB4O3RvcDozMnB4O3dpZHRoOjM2cHg7aGVpZ2h0OjM2cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDojZmZmYX1cbiNidXksI292e3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDojMDAwYztkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2dhcDo4cHg7ei1pbmRleDo1O3RleHQtYWxpZ246Y2VudGVyfVxuI2J1eXtkaXNwbGF5Om5vbmV9XG4jYnV5IGJ1dHRvbiwjb3YgYnV0dG9ue2ZvbnQ6NzAwIDE2cHggc3lzdGVtLXVpO3BhZGRpbmc6OXB4IDIycHg7Ym9yZGVyLXJhZGl1czoyMnB4O2JvcmRlcjoycHggc29saWQgI2ZhNDtiYWNrZ3JvdW5kOiNmYTQyO2NvbG9yOiNmZmY7bWluLXdpZHRoOjI0MHB4fVxuI292IGgxe21hcmdpbjowO2ZvbnQtc2l6ZTo0MnB4O2xldHRlci1zcGFjaW5nOjVweDtjb2xvcjojZmE0O3RleHQtc2hhZG93OjAgMCAxOHB4ICNmODB9XG4jb3YgcHttYXJnaW46MDttYXgtd2lkdGg6NTIwcHg7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS43O29wYWNpdHk6Ljg1fVxuI3JvdHtkaXNwbGF5Om5vbmU7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3JpZ2h0OjA7YmFja2dyb3VuZDojYzAwO3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6NnB4O3otaW5kZXg6OX1cbkBtZWRpYShvcmllbnRhdGlvbjpwb3J0cmFpdCl7I3JvdHtkaXNwbGF5OmJsb2NrfX1cbjwvc3R5bGU+PC9oZWFkPjxib2R5PlxuPGNhbnZhcyBpZD1cImNcIj48L2NhbnZhcz48ZGl2IGlkPVwic2NvcGVcIj48L2Rpdj48ZGl2IGlkPVwiZG1nXCI+PC9kaXY+PGRpdiBpZD1cInJvdFwiPvCfk7Eg2q/ZiNi024wg2LHYpyDYp9mB2YLbjCDaqdmG24zYrzwvZGl2PlxuPGNhbnZhcyBpZD1cInJhZFwiIGNsYXNzPVwiaFwiIHdpZHRoPVwiMTYwXCIgaGVpZ2h0PVwiMTM2XCI+PC9jYW52YXM+XG48ZGl2IGlkPVwidG9wXCIgY2xhc3M9XCJoXCI+PC9kaXY+PGRpdiBpZD1cImtmXCIgY2xhc3M9XCJoXCI+PC9kaXY+PGRpdiBpZD1cImJhclwiIGNsYXNzPVwiaFwiPjwvZGl2PjxkaXYgaWQ9XCJjeFwiIGNsYXNzPVwiaFwiPjwvZGl2PjxkaXYgaWQ9XCJtc2dcIiBjbGFzcz1cImhcIj48L2Rpdj5cbjxkaXYgaWQ9XCJqc1wiPjxkaXYgaWQ9XCJrblwiPjwvZGl2PjwvZGl2PlxuPGRpdiBjbGFzcz1cImIgYmlnXCIgZGF0YS1rPVwiZmlyZVwiIGRhdGEtbT1cIjFcIiBzdHlsZT1cInJpZ2h0OjE2cHg7Ym90dG9tOjIwcHhcIj7wn5SrPC9kaXY+XG48ZGl2IGNsYXNzPVwiYlwiIGRhdGEtaz1cImFpbVwiIGRhdGEtbT1cIjFcIiBzdHlsZT1cInJpZ2h0OjEwNnB4O2JvdHRvbToxNnB4XCI+8J+OrzwvZGl2PlxuPGRpdiBjbGFzcz1cImJcIiBkYXRhLWs9XCJqdW1wXCIgZGF0YS1tPVwiMVwiIHN0eWxlPVwicmlnaHQ6MTZweDtib3R0b206MTEwcHhcIj7ipJI8L2Rpdj5cbjxkaXYgY2xhc3M9XCJiIHNcIiBkYXRhLWs9XCJyZWxcIiBzdHlsZT1cInJpZ2h0OjEwMnB4O2JvdHRvbTo4MHB4XCI+UjwvZGl2PlxuPGRpdiBjbGFzcz1cImIgc1wiIGRhdGEtaz1cInVzZVwiIGRhdGEtbT1cIjFcIiBzdHlsZT1cInJpZ2h0OjE3NnB4O2JvdHRvbToxNnB4XCI+8J+nrzwvZGl2PlxuPGRpdiBjbGFzcz1cImIgc1wiIGRhdGEtaz1cInN3XCIgc3R5bGU9XCJyaWdodDoxNzZweDtib3R0b206NjZweFwiPvCflIE8L2Rpdj5cbjxkaXYgY2xhc3M9XCJiIHNcIiBkYXRhLWs9XCJidXlcIiBzdHlsZT1cImxlZnQ6Y2FsYyg4cHggKyBlbnYoc2FmZS1hcmVhLWluc2V0LWxlZnQpKTt0b3A6Y2FsYygxNTBweCArIGVudihzYWZlLWFyZWEtaW5zZXQtdG9wKSlcIj4kPC9kaXY+XG48ZGl2IGlkPVwiYnV5XCI+PC9kaXY+XG48ZGl2IGlkPVwib3ZcIj48aDE+U1RSSUtFIFpPTkU8L2gxPjxwPtiq2Ygg2K/YsSDYqtuM2YUgQ1Qg2YfYs9iq24wgKNii2KjbjCkg2KjYpyDbtCDZh9mF4oCM2KrbjNmF24wg2LHYqNin2KouINiq24zZhSBUINio2YXYqCDZhduM4oCM2qnYp9ix2K/YmyDZh9mF2Ycg2LHYpyDYqNqp2LQg24zYpyDYqNmF2Kgg2LHYpyDYrtmG2KvbjCDaqdmGICjwn6evINmG2LLYr9uM2qkg2KjZhdioINmG2q/ZhyDYr9in2LEpLjxicj7ahtm+OiDYrNmI24zigIzYp9iz2KrbjNqpIOKAoiDYsdin2LPYqjog2Ybar9in2Ycg4oCiIPCflKsg2LTZhNuM2qkg4oCiIPCfjq8g2YfYr9mBIOKAoiAkINiu2LHbjNivICjZgdmC2Lcg2LLZhdin2YYg2K7YsduM2K8pPGJyPlBDOiBXQVNELCDZhdmI2LMsIFNwYWNlLCBSLCBCLCBRLCBFPC9wPlxuPGJ1dHRvbiBkYXRhLWQ9XCIwXCI+2KLYs9in2YY8L2J1dHRvbj48YnV0dG9uIGRhdGEtZD1cIjFcIj7Zhdi52YXZiNmE24w8L2J1dHRvbj48YnV0dG9uIGRhdGEtZD1cIjJcIj7Ys9iu2Ko8L2J1dHRvbj48L2Rpdj5cbjxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvdGhyZWUuanMvcjEyOC90aHJlZS5taW4uanNcIj48XC9zY3JpcHQ+XG48c2NyaXB0PlxuJ3VzZSBzdHJpY3QnO1xuY29uc3QgJD1pPT5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKSxSPU1hdGgucmFuZG9tLFBJPU1hdGguUEksc249TWF0aC5zaW4sY3M9TWF0aC5jb3MsaHlwPU1hdGguaHlwb3QsY2xhbXA9KHYsYSxiKT0+djxhP2E6dj5iP2I6dixsZXJwPShhLGIsdCk9PmErKGItYSkqdDtcbi8qID09PT09IE1BUDogZ3JpZCBjYXJ2ZWQgZnJvbSBzb2xpZCAoMT13YWxsLDI9Y3JhdGUpID09PT09ICovXG5jb25zdCBNVz00MCxNSD0zNCxTPTMsTT1bXTtmb3IobGV0IHo9MDt6PE1IO3orKylNLnB1c2goQXJyYXkoTVcpLmZpbGwoMSkpO1xuY29uc3QgcmVjdD0oYSxiLGMsZCx2KT0+e2ZvcihsZXQgej1iO3o8PWQ7eisrKWZvcihsZXQgeD1hO3g8PWM7eCsrKU1bel1beF09dn07XG5bWzE2LDEsMjQsNV0sWzIsMiwxMiwxMF0sWzI3LDIsMzcsMTBdLFsxMiw0LDE2LDZdLFsyNCw0LDI3LDZdLFsxNyw2LDIyLDI2XSxbMjIsOSwyNywxMV0sWzMyLDExLDM3LDI3XSxbMiwxMSw3LDI3XSxbMiwxNCwyMiwxNl0sWzE3LDE5LDM3LDIxXSxbNCwyNywzNSwzMl1dLmZvckVhY2gocj0+cmVjdCguLi5yLDApKTtcbnJlY3QoMTcsMTMsMTgsMTMsMSk7cmVjdCgyMSwxMywyMiwxMywxKTtyZWN0KDE5LDgsMjAsOSwxKTtyZWN0KDE4LDI5LDIxLDMwLDEpO3JlY3QoMzQsMTUsMzUsMTcsMSk7cmVjdCg0LDE4LDUsMjAsMSk7XG5bWzMwLDRdLFszMSw0XSxbMzQsN10sWzM1LDddLFszNiwzXSxbMjksOF0sWzUsNF0sWzYsNF0sWzksN10sWzEwLDddLFszLDhdLFsxMSwzXSxbMTgsMTZdLFsyMSwxOF0sWzE5LDI0XSxbMjAsMjRdLFszMywyNF0sWzM2LDIzXSxbMzIsMTNdLFszLDIzXSxbNiwyNF0sWzUsMTNdLFs4LDMwXSxbMzAsMzBdLFsxMywyOF0sWzI2LDI4XV0uZm9yRWFjaChwPT5NW3BbMV1dW3BbMF1dPTIpO1tbMzMsNV0sWzgsNV0sWzIwLDE3XSxbMTksMjNdLFszNSwyNV0sWzQsMjVdXS5mb3JFYWNoKHA9Pk1bcFsxXV1bcFswXV09Myk7XG5jb25zdCBTQT17aTozMixqOjd9LFNCPXtpOjcsajo3fSxjdHI9aT0+aSpTK1MvMixzb2xpZD0oeCx6KT0+e2NvbnN0IGk9TWF0aC5mbG9vcih4L1MpLGo9TWF0aC5mbG9vcih6L1MpO3JldHVybiBpPDB8fGo8MHx8aT49TVd8fGo+PU1IfHxNW2pdW2ldPjB9O1xuY29uc3QgYmxvY2tlZD0oeCx6LHIpPT5zb2xpZCh4LXIsei1yKXx8c29saWQoeCtyLHotcil8fHNvbGlkKHgtcix6K3IpfHxzb2xpZCh4K3IseityKTtcbmNvbnN0IG1vdmU9KG8sZHgsZHoscik9PntpZighYmxvY2tlZChvLngrZHgsby56LHIpKW8ueCs9ZHg7aWYoIWJsb2NrZWQoby54LG8ueitkeixyKSlvLnorPWR6fTtcbmZ1bmN0aW9uIHJheVcob3gsb3osZHgsZHosbWF4KXtmb3IobGV0IHQ9MDt0PG1heDt0Kz0uMylpZihzb2xpZChveCtkeCp0LG96K2R6KnQpKXJldHVybiB0O3JldHVybiBtYXh9XG5mdW5jdGlvbiBsb3MoYSxiKXtjb25zdCBkeD1iLngtYS54LGR6PWIuei1hLnosZD1oeXAoZHgsZHopfHwxO3JldHVybiByYXlXKGEueCxhLnosZHgvZCxkei9kLGQpPj1kLS4xfVxuY29uc3QgRkQ9e30sTjQ9W1sxLDBdLFstMSwwXSxbMCwxXSxbMCwtMV1dO1xuZnVuY3Rpb24gZmllbGQoaTAsajApe2NvbnN0IGs9aTArJywnK2owO2lmKEZEW2tdKXJldHVybiBGRFtrXTtjb25zdCBkPW5ldyBJbnQxNkFycmF5KE1XKk1IKS5maWxsKC0xKSxxPVtpMCtqMCpNV107ZFtxWzBdXT0wO2ZvcihsZXQgaD0wO2g8cS5sZW5ndGg7aCsrKXtjb25zdCBjPXFbaF0seD1jJU1XLHo9Yy9NV3wwO2Zvcihjb25zdFthLGJdb2YgTjQpe2NvbnN0IG54PXgrYSxuej16K2I7aWYobng8MHx8bno8MHx8bng+PU1XfHxuej49TUh8fE1bbnpdW254XXx8ZFtueCtueipNV10+PTApY29udGludWU7ZFtueCtueipNV109ZFtjXSsxO3EucHVzaChueCtueipNVyl9fXJldHVybiBGRFtrXT1kfVxuLyogPT09PT0gUmVuZGVyZXIgLyBzY2VuZSA9PT09PSAqL1xuY29uc3QgcmQ9bmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2NhbnZhczokKCdjJyksYW50aWFsaWFzOmZhbHNlLHBvd2VyUHJlZmVyZW5jZTonaGlnaC1wZXJmb3JtYW5jZSd9KTtyZC5zZXRQaXhlbFJhdGlvKDEpO3JkLnRvbmVNYXBwaW5nPVRIUkVFLkFDRVNGaWxtaWNUb25lTWFwcGluZztyZC50b25lTWFwcGluZ0V4cG9zdXJlPTEuMTtyZC5zaGFkb3dNYXAuZW5hYmxlZD10cnVlO3JkLnNoYWRvd01hcC5hdXRvVXBkYXRlPWZhbHNlO3JkLnNoYWRvd01hcC50eXBlPVRIUkVFLlBDRlNoYWRvd01hcDtcbmNvbnN0IHNjPW5ldyBUSFJFRS5TY2VuZSgpO3NjLmJhY2tncm91bmQ9bmV3IFRIUkVFLkNvbG9yKDB4ZDhjOGE4KTtzYy5mb2c9bmV3IFRIUkVFLkZvZygweGQ4YzhhOCwzNSwxMTUpO1xuY29uc3QgY2FtPW5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSg3NSwxLC4xLDIwMCk7Y2FtLnJvdGF0aW9uLm9yZGVyPSdZWFonO3NjLmFkZChjYW0pO2NvbnN0IHNreT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMTUwLDE2LDEwKSxuZXcgVEhSRUUuU2hhZGVyTWF0ZXJpYWwoe3NpZGU6VEhSRUUuQmFja1NpZGUsZGVwdGhXcml0ZTpmYWxzZSxmb2c6ZmFsc2UsdmVydGV4U2hhZGVyOid2YXJ5aW5nIGZsb2F0IGg7dm9pZCBtYWluKCl7aD1ub3JtYWxpemUocG9zaXRpb24pLnk7Z2xfUG9zaXRpb249cHJvamVjdGlvbk1hdHJpeCptb2RlbFZpZXdNYXRyaXgqdmVjNChwb3NpdGlvbiwxLik7fScsZnJhZ21lbnRTaGFkZXI6J3ZhcnlpbmcgZmxvYXQgaDt2b2lkIG1haW4oKXtnbF9GcmFnQ29sb3I9dmVjNChtaXgodmVjMyguODUsLjc4LC42MiksdmVjMyguMzIsLjU1LC45KSxwb3coY2xhbXAoaCwwLiwxLiksLjQ1KSksMS4pO30nfSkpO3NreS5yZW5kZXJPcmRlcj0tMTtzYy5hZGQoc2t5KTtcbnNjLmFkZChuZXcgVEhSRUUuSGVtaXNwaGVyZUxpZ2h0KDB4Y2ZlM2ZmLDB4YjU5YTcwLC45NSkpO2NvbnN0IGRsPW5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZlMmIwLDEuMik7ZGwuY2FzdFNoYWRvdz10cnVlO3tjb25zdCBzaD1kbC5zaGFkb3c7c2gubWFwU2l6ZS5zZXQoMjA0OCwyMDQ4KTtjb25zdCBxPXNoLmNhbWVyYTtxLmxlZnQ9cS5ib3R0b209LTg1O3EucmlnaHQ9cS50b3A9ODU7cS5uZWFyPTE7cS5mYXI9MjgwO3EudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWRsLnBvc2l0aW9uLnNldCgxMTAsOTAsODUpO2RsLnRhcmdldC5wb3NpdGlvbi5zZXQoNjAsMCw1MSk7c2MuYWRkKGRsLGRsLnRhcmdldCk7XG5mdW5jdGlvbiBycygpe3JkLnNldFNpemUoaW5uZXJXaWR0aCxpbm5lckhlaWdodCk7Y2FtLmFzcGVjdD1pbm5lcldpZHRoL2lubmVySGVpZ2h0O2NhbS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9YWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxycyk7cnMoKTtcbmZ1bmN0aW9uIHRleChmKXtjb25zdCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2Mud2lkdGg9Yy5oZWlnaHQ9NjQ7ZihjLmdldENvbnRleHQoJzJkJykpO2NvbnN0IHQ9bmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoYyk7dC5tYWdGaWx0ZXI9VEhSRUUuTmVhcmVzdEZpbHRlcjtyZXR1cm4gdH1cbmNvbnN0IHd0PXRleCh4PT57eC5maWxsU3R5bGU9JyNjOGE0NmMnO3guZmlsbFJlY3QoMCwwLDY0LDY0KTtmb3IobGV0IGk9MDtpPDI2MDtpKyspe3guZmlsbFN0eWxlPSdyZ2JhKCcrKFIoKTwuNT8nOTAsNjAsMzAnOicyNTUsMjMwLDE4MCcpKycsJytSKCkqLjE2KycpJzt4LmZpbGxSZWN0KFIoKSo2NCxSKCkqNjQsMStSKCkqNCwxK1IoKSozKX14LmZpbGxTdHlsZT0nIzhhNmE0MCc7Zm9yKGxldCBpPTA7aTw0O2krKyl4LmZpbGxSZWN0KDAsaSoxNiw2NCwxKTt4LmZpbGxTdHlsZT0nIzAwMDUnO3guZmlsbFJlY3QoMCw1OCw2NCw2KTt4LmZpbGxTdHlsZT0nI2ZmZThiODU1Jzt4LmZpbGxSZWN0KDAsMCw2NCwzKX0pO1xuY29uc3QgY3Q9dGV4KHg9Pnt4LmZpbGxTdHlsZT0nIzhhNWEyYSc7eC5maWxsUmVjdCgwLDAsNjQsNjQpO3guZmlsbFN0eWxlPScjNWEzYTE4Jztmb3IobGV0IGk9MDtpPDQ7aSsrKXguZmlsbFJlY3QoMCxpKjE2LDY0LDMpO3guZmlsbFJlY3QoMCwwLDQsNjQpO3guZmlsbFJlY3QoNjAsMCw0LDY0KTt4LmZpbGxSZWN0KDAsMCw2NCw0KTt4LmZpbGxSZWN0KDAsNjAsNjQsNCl9KTtcbmZ1bmN0aW9uIGluc3QoZyxtLEwsaCl7Y29uc3QgaW09bmV3IFRIUkVFLkluc3RhbmNlZE1lc2goZyxtLEwubGVuZ3RoKSxvPW5ldyBUSFJFRS5PYmplY3QzRCgpO0wuZm9yRWFjaCgocCxpKT0+e28ucG9zaXRpb24uc2V0KHBbMF0qUytTLzIsaC8yLHBbMV0qUytTLzIpO28udXBkYXRlTWF0cml4KCk7aW0uc2V0TWF0cml4QXQoaSxvLm1hdHJpeCl9KTtpbS5jYXN0U2hhZG93PWltLnJlY2VpdmVTaGFkb3c9dHJ1ZTtzYy5hZGQoaW0pfVxue2NvbnN0IHdsPVtdLGNyPVtdLGMzPVtdO2ZvcihsZXQgej0wO3o8TUg7eisrKWZvcihsZXQgeD0wO3g8TVc7eCsrKXtjb25zdCB2PU1bel1beF07aWYodj09Miljci5wdXNoKFt4LHpdKTtlbHNlIGlmKHY9PTMpYzMucHVzaChbeCx6XSk7ZWxzZSBpZih2PT0xKXtsZXQgbz0wO2ZvcihsZXQgYT0tMTthPDI7YSsrKWZvcihsZXQgYj0tMTtiPDI7YisrKWlmKE1beitiXSYmTVt6K2JdW3grYV09PT0wKW89MTtpZihvKXdsLnB1c2goW3gsel0pfX1cbiBpbnN0KG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShTLDcsUyksbmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe21hcDp3dH0pLHdsLDcpO2luc3QobmV3IFRIUkVFLkJveEdlb21ldHJ5KFMtLjIsMi40LFMtLjIpLG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHttYXA6Y3R9KSxjciwyLjQpO2luc3QobmV3IFRIUkVFLkJveEdlb21ldHJ5KFMtLjIsNC44LFMtLjIpLG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHttYXA6Y3R9KSxjMyw0LjgpfVxuZnVuY3Rpb24gZHJhd01hcCh4LGssZGV0KXtmb3IobGV0IHo9MDt6PE1IO3orKylmb3IobGV0IGk9MDtpPE1XO2krKyl7Y29uc3Qgdj1NW3pdW2ldO3guZmlsbFN0eWxlPXY9PTE/JyMzYTNhM2EnOnY+MT8nIzZhNGEyYSc6KGkreiklMj8nI2Q2YzU5YSc6JyNjZGJiOGYnO3guZmlsbFJlY3QoaSprLHoqayxrLGspO2lmKGs+MTAmJiF2KXtmb3IobGV0IG49MDtuPDc7bisrKXt4LmZpbGxTdHlsZT0ncmdiYSg5MCw3MCw0MCwnK1IoKSouMTIrJyknO3guZmlsbFJlY3QoaSprK1IoKSprLHoqaytSKCkqaywyK1IoKSozLDIrUigpKjMpfWZvcihjb25zdFthLGJdb2YgTjQpaWYoTVt6K2JdJiZNW3orYl1baSthXT4wKXt4LmZpbGxTdHlsZT0ncmdiYSg0MCwyNSwxMCwuMjgpJzt4LmZpbGxSZWN0KGE+MD8oaSsxKSprLWsqLjM6aSprLGI+MD8oeisxKSprLWsqLjM6eiprLGE/ayouMzprLGI/ayouMzprKX19fVxuIHguZmlsbFN0eWxlPScjM2E2ZmQwNDQnO3guZmlsbFJlY3QoMTYqayxrLDkqayw1KmspO3guZmlsbFN0eWxlPScjZTA5MDIwNDQnO3guZmlsbFJlY3QoNCprLDI4KmssMzIqayw1KmspO1xuIGZvcihjb25zdFtzLG5db2ZbW1NBLCdBJ10sW1NCLCdCJ11dKXt4LmZpbGxTdHlsZT0nI2ZmM2MzYzU1Jzt4LmJlZ2luUGF0aCgpO3guYXJjKChzLmkrLjUpKmssKHMuaisuNSkqaywzKmssMCw3KTt4LmZpbGwoKTt4LmZpbGxTdHlsZT0nI2ZmZic7eC5mb250PSdib2xkICcrayozKydweCBzYW5zLXNlcmlmJzt4LnRleHRBbGlnbj0nY2VudGVyJzt4LnRleHRCYXNlbGluZT0nbWlkZGxlJzt4LmZpbGxUZXh0KG4sKHMuaSsuNSkqaywocy5qKy41KSprKX19XG57Y29uc3QgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtjLndpZHRoPU1XKjIwO2MuaGVpZ2h0PU1IKjIwO2RyYXdNYXAoYy5nZXRDb250ZXh0KCcyZCcpLDIwKTtjb25zdCB0PW5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGMpLGY9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoTVcqUyxNSCpTKSxuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7bWFwOnR9KSk7Zi5yb3RhdGlvbi54PS1QSS8yO2YucmVjZWl2ZVNoYWRvdz10cnVlO2YucG9zaXRpb24uc2V0KE1XKlMvMiwwLE1IKlMvMik7c2MuYWRkKGYpfVxuY29uc3QgcmFkQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtyYWRCLndpZHRoPTE2MDtyYWRCLmhlaWdodD0xMzY7ZHJhd01hcChyYWRCLmdldENvbnRleHQoJzJkJyksNCk7Y29uc3Qgcng9JCgncmFkJykuZ2V0Q29udGV4dCgnMmQnKTtcbi8qID09PT09IEF1ZGlvID09PT09ICovXG5jb25zdCBBVT17YzpudWxsLGluaXQoKXt0cnl7dGhpcy5jPW5ldyh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSgpfWNhdGNoKGUpe319LG4oZCx2LGYpe2lmKCF0aGlzLmMpcmV0dXJuO2NvbnN0IGM9dGhpcy5jLGI9Yy5jcmVhdGVCdWZmZXIoMSxjLnNhbXBsZVJhdGUqZHwwLGMuc2FtcGxlUmF0ZSksYT1iLmdldENoYW5uZWxEYXRhKDApO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSsrKWFbaV09KFIoKSoyLTEpKigxLWkvYS5sZW5ndGgpO2NvbnN0IHM9Yy5jcmVhdGVCdWZmZXJTb3VyY2UoKSxnPWMuY3JlYXRlR2FpbigpLHE9Yy5jcmVhdGVCaXF1YWRGaWx0ZXIoKTtxLmZyZXF1ZW5jeS52YWx1ZT1mO2cuZ2Fpbi52YWx1ZT12O3MuYnVmZmVyPWI7cy5jb25uZWN0KHEpO3EuY29ubmVjdChnKTtnLmNvbm5lY3QoYy5kZXN0aW5hdGlvbik7cy5zdGFydCgpfSxcbiB0KGYsZCl7aWYoIXRoaXMuYylyZXR1cm47Y29uc3QgYz10aGlzLmMsbz1jLmNyZWF0ZU9zY2lsbGF0b3IoKSxnPWMuY3JlYXRlR2FpbigpO28uZnJlcXVlbmN5LnZhbHVlPWY7Zy5nYWluLnZhbHVlPS4wODtnLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSguMDAxLGMuY3VycmVudFRpbWUrZCk7by5jb25uZWN0KGcpO2cuY29ubmVjdChjLmRlc3RpbmF0aW9uKTtvLnN0YXJ0KCk7by5zdG9wKGMuY3VycmVudFRpbWUrZCl9fTtcbi8qID09PT09IFdlYXBvbnMgPT09PT0gKi9cbmNvbnN0IFc9W3tuOidVU1AnLHA6MCxtOjEyLGQ6MjgscjouMixzOi4wMTIsYTowLGM6MHg1NTU1NTUsbDouM30se246J01QNScscDoxMjAwLG06MzAsZDoyMCxyOi4wNzUsczouMDMsYToxLGM6MHgzMzMzMzMsbDouNH0se246J0FLLTQ3JyxwOjI3MDAsbTozMCxkOjM0LHI6LjEsczouMDIsYToxLGM6MHg1YTNhMWEsbDouNn0se246J0FXUCcscDo0NzUwLG06NSxkOjExMCxyOjEuMyxzOi4wMDIsYTowLGM6MHgyYTNhMmEsbDouOCxzYzoxfSx7bjonU2hvdGd1bicscDoxNzAwLG06OCxkOjE1LHI6Ljg1LHM6LjA3LGE6MCxjOjB4NDQ0NDQ0LGw6LjUscGVsOjh9XTtcbmNvbnN0IGVudj0oKCk9Pntjb25zdCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO2Mud2lkdGg9MTI4O2MuaGVpZ2h0PTY0O2NvbnN0IHg9Yy5nZXRDb250ZXh0KCcyZCcpLGc9eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLDAsMCw2NCk7Zy5hZGRDb2xvclN0b3AoMCwnIzhmYjhmZicpO2cuYWRkQ29sb3JTdG9wKC41NSwnI2U4ZGNjMCcpO2cuYWRkQ29sb3JTdG9wKDEsJyM2YTVhNDAnKTt4LmZpbGxTdHlsZT1nO3guZmlsbFJlY3QoMCwwLDEyOCw2NCk7Y29uc3QgdD1uZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjKTt0Lm1hcHBpbmc9VEhSRUUuRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc7cmV0dXJuIG5ldyBUSFJFRS5QTVJFTUdlbmVyYXRvcihyZCkuZnJvbUVxdWlyZWN0YW5ndWxhcih0KS50ZXh0dXJlfSkoKTtjb25zdCBTTT0oYyxtLHIpPT5uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOmMsbWV0YWxuZXNzOm0scm91Z2huZXNzOnIsZW52TWFwOmVudn0pLG1Eaz1TTSgweDE2MTcxYSwuODUsLjM1KSxtR3I9U00oMHgyYjJkMzIsLjgsLjQpLG1TbD1TTSgweDhmOTI5OSwuOTUsLjIyKSxtV2Q9U00oMHg2YjNmMWQsLjA1LC41NSksbUduPVNNKDB4MmEzYTJhLC41LC41KSxtU2s9bmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe2NvbG9yOjB4ZDlhMzdhfSksbVN2PW5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtjb2xvcjoweDJmNWZiMH0pO2NvbnN0IGdieD0oZyxtLHcsaCxkLHgseSx6LHIpPT57Y29uc3Qgbz1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkodyxoLGQpLG0pO28ucG9zaXRpb24uc2V0KHgseSx6KTtpZihyKW8ucm90YXRpb24ueD1yO2cuYWRkKG8pO3JldHVybiBvfSxnY3k9KGcsbSxyLGwseCx5LHopPT57Y29uc3Qgbz1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShyLHIsbCwxMiksbSk7by5yb3RhdGlvbi54PVBJLzI7by5wb3NpdGlvbi5zZXQoeCx5LHopO2cuYWRkKG8pO3JldHVybiBvfSxoYW5kcz0oZyxyeixseik9PntnYngoZyxtU2ssLjA1NSwuMDYsLjA5LDAsLS4wNCxyeik7Z2J4KGcsbVN2LC4wNzUsLjA3NSwuMywuMDIsLS4xLHJ6Ky4yMiwtLjMpO2dieChnLG1TaywuMDYsLjA1LC4wOSwtLjAzLC0uMDMsbHopO2dieChnLG1TdiwuMDc1LC4wNzUsLjMsLS4xMiwtLjEsbHorLjIyLC0uMil9O2NvbnN0IGd1bj1uZXcgVEhSRUUuR3JvdXAoKSxtZj1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoLjE0LC4xNCwuMTQpLG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6MHhmZmRkNjZ9KSksTVo9Wy0uMywtLjYsLS44LC0uODUsLS44NV07ZnVuY3Rpb24gYnVpbGRHdW4oaSl7Y29uc3QgZz1uZXcgVEhSRUUuR3JvdXAoKSxiPShtLHcsaCxkLHgseSx6LHIpPT5nYngoZyxtLHcsaCxkLHgseSx6LHIpLGM9KG0scixsLHgseSx6KT0+Z2N5KGcsbSxyLGwseCx5LHopO2lmKGk9PTApe2IobUdyLC4wNCwuMDQ1LC4yMiwwLC4wMiwtLjA2KTtiKG1EaywuMDQyLC4wNDUsLjI2LDAsLjA2MiwtLjA4KTtjKG1TbCwuMDExLC4wNSwwLC4wNjIsLS4yMyk7YihtRGssLjAzOCwuMTEsLjA1LDAsLS4wNiwuMDQsLjMpO2IobURrLC4wMywuMDEyLC4wNywwLC0uMDMsLS4wMyk7YihtU2wsLjAxLC4wMTIsLjAxLDAsLjA5MiwuMDMpO2IobVNsLC4wMSwuMDEyLC4wMSwwLC4wOTIsLS4yKTtoYW5kcyhnLC4wNCwuMDcpfWVsc2UgaWYoaT09MSl7YihtRGssLjA1LC4wNywuMzQsMCwuMDEsLS4wNSk7YihtR3IsLjAzLC4wMTUsLjMsMCwuMDUsLS4wNSk7YihtR3IsLjA1OCwuMDU1LC4xOCwwLDAsLS4zKTtjKG1TbCwuMDEyLC4yLDAsLjAxNSwtLjQ4KTtiKG1EaywuMDI4LC4xNSwuMDQ1LDAsLS4xMSwtLjEsLjE1KTtiKG1EaywuMDM1LC4wNTUsLjIyLDAsMCwuMik7YihtRGssLjAzNSwuMDksLjA0LDAsLS4wNywuMDUsLjI1KTtiKG1TbCwuMDEyLC4wMjUsLjAxMiwwLC4wNjUsLS4yKTtoYW5kcyhnLC4wNSwtLjI4KX1lbHNlIGlmKGk9PTIpe2IobURrLC4wNSwuMDcsLjM0LDAsLjAxLC0uMDUpO2IobUdyLC4wNDUsLjAyLC4zLDAsLjA1LC0uMDcpO2IobVdkLC4wNiwuMDYsLjIyLDAsMCwtLjM1KTtjKG1TbCwuMDEyLC4zMiwwLC4wMiwtLjYyKTtjKG1HciwuMDEsLjIyLDAsLjA0NSwtLjM4KTtiKG1TbCwuMDEsLjA0LC4wMSwwLC4wNSwtLjc4KTtiKG1EaywuMDM1LC4xNywuMDYsMCwtLjEyLC0uMDgsLjI4KTtiKG1XZCwuMDQsLjA5LC4yNiwwLC0uMDEsLjI4LC0uMDgpO2IobVdkLC4wMzUsLjA5LC4wNDUsMCwtLjA3LC4wNiwuMyk7aGFuZHMoZywuMDYsLS4zMyl9ZWxzZSBpZihpPT0zKXtiKG1HbiwuMDU1LC4wODUsLjUsMCwwLDApO2MobURrLC4wMTcsLjU1LDAsLjAyLC0uNTIpO2MobVNsLC4wMjIsLjA3LDAsLjAyLC0uOCk7YyhtRGssLjAzMiwuMjgsMCwuMSwtLjA4KTtjKG1TbCwuMDM4LC4wMiwwLC4xLC0uMjMpO2IobURrLC4wMiwuMDMsLjAzLDAsLjA3NSwwKTtiKG1EaywuMDIsLjAzLC4wMywwLC4wNzUsLS4xNyk7YihtU2wsLjA3LC4wMTUsLjAxNSwuMDUsLjAyLC4xMik7YihtR24sLjA1LC4xLC4zLDAsLS4wMSwuMzgsLS4wNik7YihtR24sLjA0LC4wOSwuMDUsMCwtLjA3LC4xNCwuMyk7YihtRGssLjA0LC4wNCwuMSwwLC0uMDYsLS4wMik7aGFuZHMoZywuMTUsLS4yKX1lbHNle2IobURrLC4wNTUsLjA4LC4yNiwwLDAsLS4wMik7YyhtR3IsLjAyLC43MiwwLC4wMywtLjQ1KTtjKG1HciwuMDE2LC42LDAsLS4wMTUsLS40KTtiKG1XZCwuMDY1LC4wNSwuMTgsMCwtLjAyLC0uMyk7YihtV2QsLjA0NSwuMSwuMywwLC0uMDEsLjI4LC0uMSk7YihtU2wsLjAxLC4wMTUsLjAxLDAsLjA2LC0uOCk7aGFuZHMoZywuMDUsLS4zKX1nLnZpc2libGU9ZmFsc2U7Z3VuLmFkZChnKTtyZXR1cm4gZ31jb25zdCBnbXM9Vy5tYXAoKHcsaSk9PmJ1aWxkR3VuKGkpKTtcbmd1bi5hZGQobWYpO2d1bi5zY2FsZS5zZXRTY2FsYXIoLjgpO2d1bi5wb3NpdGlvbi5zZXQoLjIyLC0uMjIsLS41KTtjYW0uYWRkKGd1bik7bWYudmlzaWJsZT1mYWxzZTtcbmZ1bmN0aW9uIHNldEd1bigpe2dtcy5mb3JFYWNoKChnLGkpPT5nLnZpc2libGU9aT09UC53KTttZi5wb3NpdGlvbi5zZXQoMCwuMDQsTVpbUC53XS0uMDUpfVxuLyogPT09PT0gRW50aXRpZXMgPT09PT0gKi9cbmNvbnN0IFA9e2lzUDoxLHQ6J0MnLG5tOidZb3UnLHg6MCx6OjAseTowLHZ5OjAseWF3OlBJLHBpdGNoOjAsaHA6MTAwLGFyOjAsYWw6MSx3OjAscHJpOjAsbWFnOlsxMiwwLDAsMCwwXSxyZXM6WzQ4LDAsMCwwLDBdLGNkOjAscmw6MCxoZWF0OjAsaGVsZDowLGRmOjB9O1xuY29uc3QgZ0htPW5ldyBUSFJFRS5Cb3hHZW9tZXRyeSguMzQsLjE0LC4zNCksZ1Y9bmV3IFRIUkVFLkJveEdlb21ldHJ5KC42NCwuNDUsLjQpLGdBPW5ldyBUSFJFRS5Cb3hHZW9tZXRyeSguMTQsLjU1LC4xNCksaG1NPXtDOm5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtjb2xvcjoweDFkM2E3MH0pLFQ6bmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe2NvbG9yOjB4NGEzYTFhfSl9LHZNPW5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtjb2xvcjoweDMzM2EzM30pLGdCPW5ldyBUSFJFRS5Cb3hHZW9tZXRyeSguNiwuOSwuMzUpLGdIPW5ldyBUSFJFRS5Cb3hHZW9tZXRyeSguMywuMywuMyksZ0w9bmV3IFRIUkVFLkJveEdlb21ldHJ5KC4yNSwuNywuMjgpLGdHPW5ldyBUSFJFRS5Cb3hHZW9tZXRyeSguMSwuMTQsLjYpLHNrTT1uZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7Y29sb3I6MHhkOWEzN2F9KSxka009bmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe2NvbG9yOjB4MjIyMjIyfSksdE09e0M6bmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe2NvbG9yOjB4MmY1ZmIwfSksVDpuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7Y29sb3I6MHhiMDdhMmF9KX07XG5mdW5jdGlvbiBta0JvdCh0LG5tKXtjb25zdCBnPW5ldyBUSFJFRS5Hcm91cCgpLGE9KGdlbyxtLHgseSx6KT0+e2NvbnN0IG89bmV3IFRIUkVFLk1lc2goZ2VvLG0pO28ucG9zaXRpb24uc2V0KHgseSx6KTtnLmFkZChvKTtyZXR1cm4gb307YShnQix0TVt0XSwwLDEuMSwwKTthKGdILHNrTSwwLDEuNzUsMCk7YShnSG0saG1NW3RdLDAsMS45LDApO2EoZ1Ysdk0sMCwxLjE1LC4wMSk7YShnQSx0TVt0XSwtLjM4LDEuMTUsLjEpO2EoZ0EsdE1bdF0sLjM4LDEuMTUsLjI1KTtjb25zdCBsMT1hKGdMLGRrTSwtLjE1LC4zNSwwKSxsMj1hKGdMLGRrTSwuMTUsLjM1LDApO2EoZ0csZGtNLC4zLDEuMiwuMyk7c2MuYWRkKGcpO1xuIHJldHVybnt0LG5tLGcsbDEsbDIseDowLHo6MCx5OjAseWF3OjAsaHA6MTAwLGFyOjEwMCxhbDoxLHc6MCxtYWc6MTIsY2Q6MCxzYzowLHRnOm51bGwscnQ6MCxsczpudWxsLGx0OjAsbXY6MCxwaDowLHNpdGU6J0EnLHN0b3A6MCxwbDowLGRmOjAsYmM6MH19XG5jb25zdCBib3RzPVtdO1snQWxleCcsJ1NhbScsJ1JpbycsJ0thaSddLmZvckVhY2gobj0+Ym90cy5wdXNoKG1rQm90KCdDJyxuKSkpO1snVmlwZXInLCdHaG9zdCcsJ1JleCcsJ05vdmEnLCdIYXdrJ10uZm9yRWFjaChuPT5ib3RzLnB1c2gobWtCb3QoJ1QnLG4pKSk7Y29uc3QgZW50cz1bUCwuLi5ib3RzXTtcbmJvdHMuZmlsdGVyKGI9PmIudD09J0MnKS5mb3JFYWNoKChiLGkpPT5iLnNpdGU9aTwyPydBJzonQicpO1xuLyogPT09PT0gRlggPT09PT0gKi9cbmNvbnN0IHRyPVsuLi5BcnJheSgxMCldLm1hcCgoKT0+e2NvbnN0IGw9bmV3IFRIUkVFLkxpbmUobmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyhbbmV3IFRIUkVFLlZlY3RvcjMoKSxuZXcgVEhSRUUuVmVjdG9yMygpXSksbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKHtjb2xvcjoweGZmZTA4MCx0cmFuc3BhcmVudDp0cnVlfSkpO2wudmlzaWJsZT1mYWxzZTtsLmZydXN0dW1DdWxsZWQ9ZmFsc2U7bC50PTA7c2MuYWRkKGwpO3JldHVybiBsfSk7bGV0IHRJPTA7XG5mdW5jdGlvbiB0cmFjZXIoYSxiKXtjb25zdCBsPXRyW3RJPSh0SSsxKSUxMF0scD1sLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247cC5zZXRYWVooMCxhLngsYS55LGEueik7cC5zZXRYWVooMSxiLngsYi55LGIueik7cC5uZWVkc1VwZGF0ZT10cnVlO2wudD0uMDc7bC52aXNpYmxlPXRydWV9XG5jb25zdCBibT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoLjcsLjMsLjkpLG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6MHhmZjIwMjB9KSksZXg9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDEsMTYsMTIpLG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6MHhmZjg4MjAsdHJhbnNwYXJlbnQ6dHJ1ZSxvcGFjaXR5Oi43fSkpO2JtLnZpc2libGU9ZXgudmlzaWJsZT1mYWxzZTtzYy5hZGQoYm0sZXgpO1xuLyogPT09PT0gR2FtZSBzdGF0ZSA9PT09PSAqL1xubGV0IGRpZmY9MSxwaGFzZT0nYnV5JyxwdD04LHNjcj17QzowLFQ6MH0sbHM9MCxtb25leT04MDAsYm9tYj1udWxsLHBhdXNlZD0xLGZ6PTAsaGl0TT0wLGRtZ0Y9MCxleFQ9MCxiZWVwVD0wLG1zZ1Q9MCxLPXt9LEE9e30sST17ang6MCxqeTowfTtjb25zdCBERj1bLjYsMSwxLjRdLFJUPVsuOSwuNTUsLjNdO1xuY29uc3QgZmVlZD10PT57Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtkLnRleHRDb250ZW50PXQ7JCgna2YnKS5hcHBlbmRDaGlsZChkKTtzZXRUaW1lb3V0KCgpPT5kLnJlbW92ZSgpLDQwMDApfSxtc2c9KHQscyk9PnskKCdtc2cnKS50ZXh0Q29udGVudD10OyQoJ21zZycpLnN0eWxlLm9wYWNpdHk9MTttc2dUPXN9LGZtdD10PT57dD1NYXRoLm1heCgwLHR8MCk7cmV0dXJuKHQvNjB8MCkrJzonKygnMCcrdCU2MCkuc2xpY2UoLTIpfTtcbmZ1bmN0aW9uIG5ld1JvdW5kKCl7cGhhc2U9J2J1eSc7cHQ9ODtib21iPW51bGw7Ym0udmlzaWJsZT1leC52aXNpYmxlPWZhbHNlO2NvbnN0IGM9W10sdD1bXTtmb3IobGV0IHg9MTc7eDw9MjM7eCsrKWZvcihsZXQgej0xO3o8PTQ7eisrKWMucHVzaChbeCx6XSk7Zm9yKGxldCB4PTg7eDw9MzE7eCsrKWZvcihsZXQgej0yODt6PD0zMTt6KyspaWYoIU1bel1beF0pdC5wdXNoKFt4LHpdKTtjLnNvcnQoKCk9PlIoKS0uNSk7dC5zb3J0KCgpPT5SKCktLjUpO2xldCBjaT0wLHRpPTA7XG4gaWYoIVAuYWwpe1AucHJpPTA7UC53PTA7UC5tYWc9WzEyLDAsMCwwLDBdO1AucmVzPVs0OCwwLDAsMCwwXTtQLmFyPTB9UC5ocD0xMDA7UC5hbD0xO1AueT0wO1Audnk9MDtQLnlhdz1QSTtQLnBpdGNoPTA7UC5kZj0wO1Aucmw9MDtzZXRHdW4oKTtcbiBmb3IoY29uc3QgZSBvZiBlbnRzKXtjb25zdCBwPWUudD09J0MnP2NbY2krK106dFt0aSsrXTtlLng9Y3RyKHBbMF0pO2Uuej1jdHIocFsxXSk7ZS5ocD0xMDA7ZS5hbD0xO2lmKGUuaXNQKWNvbnRpbnVlO2UudGc9bnVsbDtlLnBsPWUuZGY9MDtlLmFyPTEwMDtlLmx0PTA7Y29uc3Qgcj1SKCk7ZS53PXI8LjQ1PzI6cjwuNjU/MTpyPC43NT8zOnI8Ljg/NDowO2UubWFnPVdbZS53XS5tO2UuZy5yb3RhdGlvbi5zZXQoMCwwLDApO2UuZy5wb3NpdGlvbi55PTA7ZS5zdG9wPTErKFIoKSo0fDApO2UuYmM9MDtpZihlLnQ9PSdUJyllLnNpdGU9UigpPC41PydBJzonQid9XG4gY29uc3QgdHM9Ym90cy5maWx0ZXIoYj0+Yi50PT0nVCcpO3RzW1IoKSp0cy5sZW5ndGh8MF0uYmM9MTttc2coJ9iy2YXYp9mGINiu2LHbjNivJywyKTtvcGVuQnV5KCk7aHVkKCl9XG5mdW5jdGlvbiBjaGsoKXtpZihwaGFzZSE9J2xpdmUnKXJldHVybjtjb25zdCBjPWVudHMuc29tZShlPT5lLnQ9PSdDJyYmZS5hbCksdD1lbnRzLnNvbWUoZT0+ZS50PT0nVCcmJmUuYWwpO2lmKCFjKWVuZFIoJ1QnLCdDVCDZhtin2KjZiNivINi02K8nKTtlbHNlIGlmKCF0JiYhKGJvbWImJmJvbWIub24pKWVuZFIoJ0MnLCdUINmG2KfYqNmI2K8g2LTYrycpfVxuZnVuY3Rpb24gZW5kUih3LHdoeSl7aWYocGhhc2U9PSdlbmQnKXJldHVybjtwaGFzZT0nZW5kJztwdD00O3Njclt3XSsrO2lmKHc9PSdDJyl7bW9uZXkrPTMyNTA7bHM9MH1lbHNle2xzPU1hdGgubWluKGxzKzEsNCk7bW9uZXkrPTE5MDArbHMqNTAwfW1vbmV5PU1hdGgubWluKG1vbmV5LDE2MDAwKTttc2coKHc9PSdDJz8nQ1Qg2KjYsdivJzonVCDYqNix2K8nKSsnIOKAlCAnK3doeSwzLjUpfVxuZnVuY3Rpb24gcGxhbnQocyl7Y29uc3QgZz1zPT0nQSc/U0E6U0I7Ym9tYj17b246MSx4OmN0cihnLmkpLHo6Y3RyKGcuaiksdDo0MCxzaXRlOnN9O2JtLnBvc2l0aW9uLnNldChib21iLngsLjE1LGJvbWIueik7Ym0udmlzaWJsZT10cnVlO21zZygn8J+SoyDYqNmF2Kgg2qnYp9i02KrZhyDYtNivIOKAlCAnK3MsMik7QVUudCg5MDAsLjMpfVxuZnVuY3Rpb24gZGVmdXNlKCl7aWYoIWJvbWJ8fCFib21iLm9uKXJldHVybjtib21iLm9uPTA7Ym0udmlzaWJsZT1mYWxzZTtlbmRSKCdDJywn2KjZhdioINiu2YbYq9uMINi02K8nKX1cbmZ1bmN0aW9uIGV4cGxvZGUoKXtib21iLm9uPTA7Ym0udmlzaWJsZT1mYWxzZTtleC5wb3NpdGlvbi5zZXQoYm9tYi54LDEsYm9tYi56KTtleC5zY2FsZS5zZXRTY2FsYXIoMSk7ZXgudmlzaWJsZT10cnVlO2V4VD0xO0FVLm4oMS4yLC44LDMwMCk7Zm9yKGNvbnN0IGUgb2YgZW50cylpZihlLmFsJiZoeXAoZS54LWJvbWIueCxlLnotYm9tYi56KTwyNilodXJ0KGUsOTk5LHtubTon8J+Soyd9LDApO2VuZFIoJ1QnLCfYqNmF2Kgg2YXZhtmB2KzYsSDYtNivJyl9XG5mdW5jdGlvbiBodXJ0KGUsZCxieSxocyl7aWYoIWUuYWwpcmV0dXJuO2lmKGUuYXI+MCl7ZS5hcj1NYXRoLm1heCgwLGUuYXItZCouNSk7ZCo9LjZ9ZS5ocC09ZDtpZihlLmlzUClkbWdGPTE7aWYoYnkuaXNQKWhpdE09LjI7XG4gaWYoZS5ocDw9MCl7ZS5hbD0wO2lmKGUuZyl7ZS5nLnJvdGF0aW9uLno9UEkvMjtlLmcucG9zaXRpb24ueT0uM31pZihieS5pc1AmJmUudCE9YnkudCltb25leSs9MzAwO2ZlZWQoYnkubm0rKGhzPycg4piFICc6JyDinpwgJykrZS5ubSk7aWYoZS5pc1ApbXNnKCfaqdi02KrZhyDYtNiv24wnLDIpO2NoaygpfX1cbi8qID09PT09IEJvdCBBSSA9PT09PSAqL1xuZnVuY3Rpb24gc3RlcChiLGR0LGcsc3Asc3RvcCl7Y29uc3QgZj1maWVsZChnLmksZy5qKSxjaT1iLngvU3wwLGNqPWIuei9TfDAsYz1mW2NpK2NqKk1XXTtpZihjPD1zdG9wfHxjPDApe2IubXY9MDtyZXR1cm59bGV0IGJpPS0xLGJkPWM7Zm9yKGNvbnN0W2EsZF1vZiBONCl7Y29uc3Qgbng9Y2krYSxuej1jaitkO2lmKG54PDB8fG56PDB8fG54Pj1NV3x8bno+PU1IKWNvbnRpbnVlO2NvbnN0IHY9ZltueCtueipNV107aWYodj49MCYmdjxiZCl7YmQ9djtiaT1ueCtueipNV319aWYoYmk8MCl7Yi5tdj0wO3JldHVybn1cbiBjb25zdCB0eD1jdHIoYmklTVcpLWIueCx0ej1jdHIoYmkvTVd8MCktYi56LGQ9aHlwKHR4LHR6KXx8MSxzPU1hdGgubWluKHNwKmR0LGQpO21vdmUoYix0eC9kKnMsdHovZCpzLC40KTtiLm12PTE7aWYoIWIudGcpYi55YXc9TWF0aC5hdGFuMih0eCx0eil9XG5mdW5jdGlvbiByb2xlKGIsZHQpe2NvbnN0IGJvPWJvbWImJmJvbWIub24sZz1iLnQ9PSdDJyYmYm8/KGJvbWIuc2l0ZT09J0EnP1NBOlNCKTooYi5zaXRlPT0nQSc/U0E6U0IpO1xuIGlmKGIudD09J1QnKXtzdGVwKGIsZHQsZyw1LGIuYmMmJiFib21iPzA6Yi5zdG9wKTtpZihiLmJjJiYhYm9tYiYmaHlwKGIueC1jdHIoZy5pKSxiLnotY3RyKGcuaikpPDUpe2IucGwrPWR0O2IubXY9MDtpZihiLnBsPjMpcGxhbnQoYi5zaXRlKX1lbHNlIGIucGw9MH1cbiBlbHNle3N0ZXAoYixkdCxnLDUsYm8/MDpiLnN0b3ApO2lmKGJvJiZoeXAoYi54LWJvbWIueCxiLnotYm9tYi56KTwyLjgpe2IuZGYrPWR0O2IubXY9MDtpZihiLmRmPjUpZGVmdXNlKCl9ZWxzZSBiLmRmPTB9fVxuZnVuY3Rpb24gYm90KGIsZHQpe2lmKCFiLmFsKXJldHVybjtiLmNkLT1kdDtiLnNjLT1kdDtcbiBpZihiLnNjPD0wKXtiLnNjPS4yNTtsZXQgdD1udWxsLGJkPTQ1O2Zvcihjb25zdCBlIG9mIGVudHMpaWYoZS5hbCYmZS50IT1iLnQpe2NvbnN0IGQ9aHlwKGUueC1iLngsZS56LWIueik7aWYoZDxiZCYmbG9zKGIsZSkpe2JkPWQ7dD1lfX1pZih0JiZ0IT09Yi50ZyliLnJ0PVJUW2RpZmZdKiguNytSKCkqLjYpO2lmKHQpe2IubHM9e2k6dC54L1N8MCxqOnQuei9TfDB9O2IubHQ9NH1iLnRnPXR9XG4gaWYoYi50Zyl7Y29uc3QgdD1iLnRnLGR4PXQueC1iLngsZHo9dC56LWIueixkPWh5cChkeCxkeik7Yi55YXc9TWF0aC5hdGFuMihkeCxkeik7Yi5tdj0wO2IucnQtPWR0O2lmKGIucnQ8PTAmJmIuY2Q8PTApYnNob290KGIsdCxkKTtpZihkPjE2JiYhYi5iYylzdGVwKGIsZHQse2k6dC54L1N8MCxqOnQuei9TfDB9LDIuNSwwKX1cbiBlbHNlIGlmKGIubHQ+MCl7Yi5sdC09ZHQ7c3RlcChiLGR0LGIubHMsNC41LDApfWVsc2Ugcm9sZShiLGR0KTtcbiBiLnBoKz1iLm12KmR0KjEwO2IubDEucm90YXRpb24ueD1zbihiLnBoKSouOCpiLm12O2IubDIucm90YXRpb24ueD0tc24oYi5waCkqLjgqYi5tdjtiLmcucG9zaXRpb24uc2V0KGIueCwwLGIueik7Yi5nLnJvdGF0aW9uLnk9Yi55YXd9XG5mdW5jdGlvbiBic2hvb3QoYix0LGQpe2NvbnN0IHc9V1tiLnddO2IuY2Q9dy5yKigxLjYrUigpKjEuMik7aWYoLS1iLm1hZzw9MCl7Yi5jZD0yO2IubWFnPXcubTtyZXR1cm59Y29uc3QgcD1jbGFtcCguNzUtZCouMDE0LC4xLC43NSkqREZbZGlmZl0saGl0PVIoKTxwO1xuIHRyYWNlcih7eDpiLngseToxLjIsejpiLnp9LHt4OnQueCsoaGl0PzA6UigpKjItMSkseToxLjEsejp0LnorKGhpdD8wOlIoKSoyLTEpfSk7QVUubiguMDgsY2xhbXAoMS1oeXAoYi54LVAueCxiLnotUC56KS81MCwuMDQsLjQpLDIyMDApO2lmKGhpdClodXJ0KHQsdy5kKih3LnBlbD8yOjEpKihSKCk8LjE1PzIuNToxKSxiLDApfVxuLyogPT09PT0gUGxheWVyID09PT09ICovXG5mdW5jdGlvbiByZWxvYWQoKXtjb25zdCB3PVdbUC53XTtpZihQLnJsPjB8fFAubWFnW1Aud10+PXcubXx8UC5yZXNbUC53XTw9MClyZXR1cm47UC5ybD13LnNjPzIuNToxLjY7QVUubiguMTUsLjE1LDkwMCl9XG5mdW5jdGlvbiByc3BoKG8sZCxjLHIpe2NvbnN0IGx4PWNbMF0tb1swXSxseT1jWzFdLW9bMV0sbHo9Y1syXS1vWzJdLHRjPWx4KmRbMF0rbHkqZFsxXStseipkWzJdO2lmKHRjPDApcmV0dXJuIDFlOTtjb25zdCBxPWx4Kmx4K2x5Kmx5K2x6Kmx6LXRjKnRjO3JldHVybiBxPnIqcj8xZTk6dGMtTWF0aC5zcXJ0KHIqci1xKX1cbmZ1bmN0aW9uIHBGaXJlKCl7Y29uc3Qgdz1XW1Aud10sbXZ2PWh5cChJLmp4K2t4KCksSS5qeStreSgpKT4uMSxzcD13LnMqKDErUC5oZWF0Ki42KyhtdnY/MS41OjApKyhQLnk+MD8zOjApKSooSy5haW0/LjU6MSkqKHcuc2MmJiFLLmFpbT8yNToxKTtcbiBmb3IobGV0IG49MDtuPCh3LnBlbHx8MSk7bisrKXtjb25zdCB5dz1QLnlhdysoUigpLS41KSpzcCoyLHBjPVAucGl0Y2grKFIoKS0uNSkqc3AqMixkPVstc24oeXcpKmNzKHBjKSxzbihwYyksLWNzKHl3KSpjcyhwYyldLG89W1AueCwxLjYrUC55LFAuel0saHo9aHlwKGRbMF0sZFsyXSl8fDFlLTM7XG4gIGxldCBidD1NYXRoLm1pbihyYXlXKG9bMF0sb1syXSxkWzBdL2h6LGRbMl0vaHosOTApL2h6LGRbMV08MD8tb1sxXS9kWzFdOjFlOSksaGl0PW51bGwsaHM9MDtcbiAgZm9yKGNvbnN0IGUgb2YgZW50cyl7aWYoIWUuYWx8fGUudD09UC50KWNvbnRpbnVlO2NvbnN0IGI9cnNwaChvLGQsW2UueCwxLjEsZS56XSwuNSksaD1yc3BoKG8sZCxbZS54LDEuNzUsZS56XSwuMjQpO2lmKGg8YnQpe2J0PWg7aGl0PWU7aHM9MX1lbHNlIGlmKGI8YnQpe2J0PWI7aGl0PWU7aHM9MH19XG4gIGlmKGhpdClodXJ0KGhpdCx3LmQqKGhzPzQ6MSksUCxocyk7dHJhY2VyKHt4OlAueCtjcyhQLnlhdykqLjI1LWRbMF0qLS42LHk6MS4zNStQLnksejpQLnotc24oUC55YXcpKi4yNStkWzJdKi42fSx7eDpvWzBdK2RbMF0qYnQseTpvWzFdK2RbMV0qYnQsejpvWzJdK2RbMl0qYnR9KX1cbiBQLm1hZ1tQLnddLS07UC5jZD13LnI7UC5oZWF0PU1hdGgubWluKFAuaGVhdCsxLDUpO1AucGl0Y2grPS4wMTIrKHcuc2M/LjA1OjApO1Aua2ljaz0xO21mLnZpc2libGU9dHJ1ZTtBVS5uKC4xMiwuMzUsMjUwMCl9XG5jb25zdCBreD0oKT0+KEsuS2V5RD8xOjApLShLLktleUE/MTowKSxreT0oKT0+KEsuS2V5Vz8xOjApLShLLktleVM/MTowKTtcbmZ1bmN0aW9uIHBsYXllcihkdCl7Y29uc3QgbGl2ZT1waGFzZT09J2xpdmUnJiZQLmFsO1AuY2QtPWR0O1AuaGVhdD1NYXRoLm1heCgwLFAuaGVhdC1kdCozKTtQLmtpY2s9TWF0aC5tYXgoMCwoUC5raWNrfHwwKS1kdCoxMCk7bWYudmlzaWJsZT1tZi52aXNpYmxlJiZQLmtpY2s+Ljc7bGV0IHNwPTA7XG4gaWYobGl2ZSl7Y29uc3QgbXg9Y2xhbXAoSS5qeCtreCgpLC0xLDEpLG15PWNsYW1wKEkuankra3koKSwtMSwxKSxtZz1NYXRoLm1pbigxLGh5cChteCxteSkpO2lmKG1nPi4xKXtjb25zdCBzPXNuKFAueWF3KSxjPWNzKFAueWF3KSxkeD0tcypteStjKm14LGR6PS1jKm15LXMqbXgsbD1oeXAoZHgsZHopO3NwPShLLlNoaWZ0TGVmdD8zOjYpKm1nKihLLmFpbSYmV1tQLnddLnNjPy41OjEpO21vdmUoUCxkeC9sKnNwKmR0LGR6L2wqc3AqZHQsLjM1KX1pZihLLmp1bXAmJlAueTw9MClQLnZ5PTd9XG4gUC52eS09MjAqZHQ7UC55Kz1QLnZ5KmR0O2lmKFAueTw9MCl7UC55PTA7aWYoUC52eTwwKVAudnk9MH1cbiBpZihQLnJsPjApe1AucmwtPWR0O2lmKFAucmw8PTApe2NvbnN0IG49TWF0aC5taW4oV1tQLnddLm0tUC5tYWdbUC53XSxQLnJlc1tQLnddKTtQLm1hZ1tQLnddKz1uO1AucmVzW1Aud10tPW59fVxuIGlmKEEucmVsKXtBLnJlbD0wO3JlbG9hZCgpfWlmKEEuc3cpe0Euc3c9MDtjb25zdCBuPVAudz8wOlAucHJpO2lmKG4hPVAudyl7UC53PW47UC5ybD0wO3NldEd1bigpfX1pZihBLmJ1eSl7QS5idXk9MDtwaGFzZT09J2J1eSc/dG9nZ2xlQnV5KCk6bXNnKCfZgdmC2Lcg2K/YsSDYstmF2KfZhiDYrtix24zYrycsMSl9XG4gaWYobGl2ZSYmSy5maXJlJiZQLmNkPD0wJiZQLnJsPD0wKXtpZihQLm1hZ1tQLnddPjApe2lmKFdbUC53XS5hfHwhUC5oZWxkKXBGaXJlKCl9ZWxzZSByZWxvYWQoKX1QLmhlbGQ9Sy5maXJlO1xuIGlmKGxpdmUmJksudXNlJiZib21iJiZib21iLm9uJiZoeXAoUC54LWJvbWIueCxQLnotYm9tYi56KTwzLjIpe1AuZGYrPWR0O2lmKFAuZGY+PTUpZGVmdXNlKCl9ZWxzZSBQLmRmPTA7XG4gY29uc3Qgdz1XW1Aud10sYWQ9Sy5haW0mJlAuYWwsdGY9YWQ/KHcuc2M/MjA6NTUpOjc1O2NhbS5mb3Y9bGVycChjYW0uZm92LHRmLC4yKTtjYW0udXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOyQoJ3Njb3BlJykuc3R5bGUuZGlzcGxheT1hZCYmdy5zYz8nYmxvY2snOidub25lJztndW4udmlzaWJsZT0hKGFkJiZ3LnNjKTtcbiBjb25zdCBib2I9c3A/c24ocGVyZm9ybWFuY2Uubm93KCkvMTEwKSouMDE6MDtndW4ucG9zaXRpb24uc2V0KGFkPzA6LjIyLChhZD8tLjE1Oi0uMjIrYm9iKS0oUC5ybD4wPy4xMjowKSwtLjUrUC5raWNrKi4wNSk7Z3VuLnJvdGF0aW9uLng9UC5raWNrKi4wNy0oUC5ybD4wPy43OjApO2NhbS5wb3NpdGlvbi5zZXQoUC54LDEuNitQLnktKFAuYWw/MDoxLjIpLFAueik7Y2FtLnJvdGF0aW9uLnNldChQLnBpdGNoLFAueWF3LFAuYWw/MDouNil9XG4vKiA9PT09PSBCdXkgbWVudSA9PT09PSAqL1xuZnVuY3Rpb24gb3BlbkJ1eSgpe2NvbnN0IGI9JCgnYnV5Jyk7Yi5zdHlsZS5kaXNwbGF5PSdmbGV4JztiLmlubmVySFRNTD0nPGgyIHN0eWxlPVwibWFyZ2luOjBcIj7Yrtix24zYryDigJQgJCcrbW9uZXkrJzwvaDI+JztcbiBjb25zdCBhZGQ9KHQscCxmKT0+e2NvbnN0IHg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7eC50ZXh0Q29udGVudD10Kycg4oCUICQnK3A7eC5vbmNsaWNrPSgpPT57aWYocGhhc2UhPSdidXknfHxtb25leTxwKXt4LnRleHRDb250ZW50PSfinJYg2b7ZiNmEINqp2KfZgduMINmG24zYs9iqJztyZXR1cm59bW9uZXktPXA7ZigpO29wZW5CdXkoKX07Yi5hcHBlbmRDaGlsZCh4KX07XG4gZm9yKGxldCBpPTE7aTw1O2krKylhZGQoV1tpXS5uLFdbaV0ucCwoKT0+e1AucHJpPVAudz1pO1AubWFnW2ldPVdbaV0ubTtQLnJlc1tpXT1XW2ldLm0qMztzZXRHdW4oKX0pO2FkZCgn2LLYsdmHIPCfm6EnLDY1MCwoKT0+UC5hcj0xMDApO1xuIGNvbnN0IGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7Yy50ZXh0Q29udGVudD0n2KjYs9iq2YYnO2Mub25jbGljaz0oKT0+Yi5zdHlsZS5kaXNwbGF5PSdub25lJztiLmFwcGVuZENoaWxkKGMpfVxuY29uc3QgdG9nZ2xlQnV5PSgpPT57JCgnYnV5Jykuc3R5bGUuZGlzcGxheT09J2ZsZXgnPyQoJ2J1eScpLnN0eWxlLmRpc3BsYXk9J25vbmUnOm9wZW5CdXkoKX07XG4vKiA9PT09PSBIVUQgPT09PT0gKi9cbmZ1bmN0aW9uIGh1ZCgpeyQoJ3RvcCcpLmlubmVySFRNTD0nPGIgc3R5bGU9XCJjb2xvcjojNmFmXCI+Q1QgJytzY3IuQysnPC9iPiAmbmJzcDsgJytmbXQocHQpKycgJm5ic3A7IDxiIHN0eWxlPVwiY29sb3I6I2ZhNFwiPlQgJytzY3IuVCsnPC9iPjxzbWFsbD4nKyhwaGFzZT09J2J1eSc/J9iy2YXYp9mGINiu2LHbjNivJzpib21iJiZib21iLm9uPyfwn5KjICcrKGJvbWIudHwwKSsncyc6JycpKyc8L3NtYWxsPic7XG4gJCgnYmFyJykudGV4dENvbnRlbnQ9J+KdpCAnKyhQLmhwfDApKycgIPCfm6EgJysoUC5hcnwwKSsnICAgJytXW1Aud10ubisnICcrUC5tYWdbUC53XSsnLycrUC5yZXNbUC53XSsoUC5ybD4wPycg4p+zJzonJykrJyAgICQnK21vbmV5KyhQLmRmPjA/JyAgIPCfp68gJysoUC5kZi81KjEwMHwwKSsnJSc6JycpO1xuIHJ4LmRyYXdJbWFnZShyYWRCLDAsMCk7Y29uc3QgZG90PShlLGMscik9PntyeC5maWxsU3R5bGU9YztyeC5iZWdpblBhdGgoKTtyeC5hcmMoZS54L1MqNCxlLnovUyo0LHIsMCw3KTtyeC5maWxsKCl9O2Zvcihjb25zdCBlIG9mIGVudHMpe2lmKCFlLmFsfHxlLmlzUCljb250aW51ZTtpZihlLnQ9PSdDJylkb3QoZSwnIzRhZicsMyk7ZWxzZSBpZihsb3MoUCxlKSlkb3QoZSwnI2Y0NCcsMyl9XG4gaWYoYm9tYiYmYm9tYi5vbiYmKHBlcmZvcm1hbmNlLm5vdygpLzMwMHwwKSUyKWRvdChib21iLCcjZmYwJyw0KTtkb3QoUCwnI2ZmZicsMyk7cnguc3Ryb2tlU3R5bGU9JyNmZmYnO3J4LmJlZ2luUGF0aCgpO3J4Lm1vdmVUbyhQLngvUyo0LFAuei9TKjQpO3J4LmxpbmVUbyhQLngvUyo0LXNuKFAueWF3KSo4LFAuei9TKjQtY3MoUC55YXcpKjgpO3J4LnN0cm9rZSgpO1xuICQoJ2N4Jykuc3R5bGUuZmlsdGVyPWhpdE0+MD8naHVlLXJvdGF0ZSgtOTBkZWcpIGJyaWdodG5lc3MoMiknOicnOyQoJ2RtZycpLnN0eWxlLmJveFNoYWRvdz0naW5zZXQgMCAwICcrZG1nRioxMTArJ3B4IHJnYmEoMjU1LDAsMCwnK2RtZ0YrJyknfVxuLyogPT09PT0gTWFpbiB1cGRhdGUgPT09PT0gKi9cbmZ1bmN0aW9uIHVwZGF0ZShkdCl7cHQtPWR0O2lmKHBoYXNlPT0nYnV5JyYmcHQ8PTApe3BoYXNlPSdsaXZlJztwdD0xMDU7JCgnYnV5Jykuc3R5bGUuZGlzcGxheT0nbm9uZSc7bXNnKCfYtNix2YjYuSEnLDEpfVxuIGVsc2UgaWYocGhhc2U9PSdsaXZlJyYmcHQ8PTApe2VuZFIoJ0MnLCfZiNmC2Kog2KrZhdin2YUg2LTYrycpfWVsc2UgaWYocGhhc2U9PSdlbmQnJiZwdDw9MCl7aWYoc2NyLkM+PTh8fHNjci5UPj04KW92ZXIoKTtlbHNlIG5ld1JvdW5kKCl9XG4gcGxheWVyKGR0KTtpZihwaGFzZT09J2xpdmUnKXtmb3IoY29uc3QgYiBvZiBib3RzKWJvdChiLGR0KTtpZihib21iJiZib21iLm9uKXtib21iLnQtPWR0O2JlZXBULT1kdDtpZihiZWVwVDw9MCl7YmVlcFQ9TWF0aC5tYXgoLjE1LGJvbWIudC80MCk7QVUudCgxMjAwLC4wOCl9Ym0ubWF0ZXJpYWwuY29sb3Iuc2V0SGV4KChwZXJmb3JtYW5jZS5ub3coKS8xNTB8MCklMj8weGZmMjAyMDoweDUwMTAxMCk7aWYoYm9tYi50PD0wKWV4cGxvZGUoKX19XG4gZWxzZSBmb3IoY29uc3QgYiBvZiBib3RzKXtiLmcucG9zaXRpb24uc2V0KGIueCxiLmFsPzA6LjMsYi56KX1cbiBpZihleFQ+MCl7ZXhULT1kdDtleC5zY2FsZS5zZXRTY2FsYXIoMSsoMS1leFQpKjI0KTtleC5tYXRlcmlhbC5vcGFjaXR5PU1hdGgubWF4KDAsZXhUKi43KTtpZihleFQ8PTApZXgudmlzaWJsZT1mYWxzZX1cbiBmb3IoY29uc3QgbCBvZiB0cilpZihsLnQ+MCl7bC50LT1kdDtsLm1hdGVyaWFsLm9wYWNpdHk9TWF0aC5tYXgoMCxsLnQqMTQpO2lmKGwudDw9MClsLnZpc2libGU9ZmFsc2V9XG4gaGl0TS09ZHQ7ZG1nRj1NYXRoLm1heCgwLGRtZ0YtZHQqMS41KTttc2dULT1kdDtpZihtc2dUPD0wKSQoJ21zZycpLnN0eWxlLm9wYWNpdHk9MDtpZigoKytmeiYzKT09MClodWQoKX1cbmZ1bmN0aW9uIG92ZXIoKXtjb25zdCB3PXNjci5DPj04PydDVCc6J1QnO3BhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbm92YS1waG9uZS1nYW1lLW92ZXInLHNjb3JlOnNjci5DPj04PzIwOjV9LCcqJyk7JCgnb3YnKS5zdHlsZS5kaXNwbGF5PSdmbGV4JzskKCdvdicpLnF1ZXJ5U2VsZWN0b3IoJ2gxJykudGV4dENvbnRlbnQ9dysnINio2LHZhtiv2Ycg2KjYp9iy24whJztwYXVzZWQ9MTtzY3I9e0M6MCxUOjB9O21vbmV5PTgwMDtscz0wO1AuYWw9MH1cbi8qID09PT09IElucHV0ID09PT09ICovXG5jb25zdCBNSz17U3BhY2U6J2p1bXAnLEtleUU6J3VzZSd9LEtNPXtLZXlSOidyZWwnLEtleUI6J2J1eScsS2V5UTonc3cnfTtcbmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGU9PntLW2UuY29kZV09MTtpZihNS1tlLmNvZGVdKUtbTUtbZS5jb2RlXV09MTtpZihLTVtlLmNvZGVdJiYhZS5yZXBlYXQpQVtLTVtlLmNvZGVdXT0xfSk7YWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLGU9PntLW2UuY29kZV09MDtpZihNS1tlLmNvZGVdKUtbTUtbZS5jb2RlXV09MH0pO1xuY29uc3QgY3Y9JCgnYycpO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZT0+e2lmKHBhdXNlZClyZXR1cm47aWYoIWRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCYmY3YucmVxdWVzdFBvaW50ZXJMb2NrKWN2LnJlcXVlc3RQb2ludGVyTG9jaygpO2lmKGUuYnV0dG9uPT0wKUsuZmlyZT0xO2lmKGUuYnV0dG9uPT0yKUsuYWltPTF9KTthZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxlPT57aWYoZS5idXR0b249PTApSy5maXJlPTA7aWYoZS5idXR0b249PTIpSy5haW09MH0pO2N2LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JyxlPT5lLnByZXZlbnREZWZhdWx0KCkpO1xuY29uc3QgbG9vaz0oZHgsZHkpPT57Y29uc3Qgej1LLmFpbT8uNToxO1AueWF3LT1keCouMDA1Kno7UC5waXRjaD1jbGFtcChQLnBpdGNoLWR5Ki4wMDUqeiwtMS40LDEuNCl9O2FkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsZT0+e2lmKGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCYmIXBhdXNlZClsb29rKGUubW92ZW1lbnRYLGUubW92ZW1lbnRZKX0pO1xuY29uc3QganNFPSQoJ2pzJyksa249JCgna24nKTtsZXQgamlkPS0xLGpvPVswLDBdLGxpZD0tMSxscD1bMCwwXTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxlPT57aWYoZS5wb2ludGVyVHlwZT09J21vdXNlJ3x8ZS50YXJnZXQuY2xvc2VzdCgnLmIsI2J1eSwjb3YnKSlyZXR1cm47aWYoZS5jbGllbnRYPGlubmVyV2lkdGgqLjQyJiZqaWQ8MCl7amlkPWUucG9pbnRlcklkO2pvPVtlLmNsaWVudFgsZS5jbGllbnRZXTtqc0Uuc3R5bGUuY3NzVGV4dD0nZGlzcGxheTpibG9jaztsZWZ0OicrKGpvWzBdLTUwKSsncHg7dG9wOicrKGpvWzFdLTUwKSsncHgnO2tuLnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlKDAsMCknfWVsc2UgaWYobGlkPDApe2xpZD1lLnBvaW50ZXJJZDtscD1bZS5jbGllbnRYLGUuY2xpZW50WV19fSk7XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsZT0+e2lmKGUucG9pbnRlcklkPT1qaWQpe2xldCBkeD1lLmNsaWVudFgtam9bMF0sZHk9ZS5jbGllbnRZLWpvWzFdO2NvbnN0IGw9aHlwKGR4LGR5KSxtPTQ4O2lmKGw+bSl7ZHgqPW0vbDtkeSo9bS9sfUkuang9ZHgvbTtJLmp5PS1keS9tO2tuLnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlKCcrZHgrJ3B4LCcrZHkrJ3B4KSd9ZWxzZSBpZihlLnBvaW50ZXJJZD09bGlkKXtsb29rKGUuY2xpZW50WC1scFswXSxlLmNsaWVudFktbHBbMV0pO2xwPVtlLmNsaWVudFgsZS5jbGllbnRZXX19KTtcbmNvbnN0IHB1cD1lPT57aWYoZS5wb2ludGVySWQ9PWppZCl7amlkPS0xO0kuang9SS5qeT0wO2pzRS5zdHlsZS5kaXNwbGF5PSdub25lJ31pZihlLnBvaW50ZXJJZD09bGlkKWxpZD0tMX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJyxwdXApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLHB1cCk7XG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYicpLmZvckVhY2goYj0+e2NvbnN0IGs9Yi5kYXRhc2V0LmssbT1iLmRhdGFzZXQubTtiLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxlPT57ZS5wcmV2ZW50RGVmYXVsdCgpO2Uuc3RvcFByb3BhZ2F0aW9uKCk7QVUuaW5pdCgpO2lmKG0pe0tba109MTtiLmNsYXNzTGlzdC5hZGQoJ29uJyl9ZWxzZSBBW2tdPTF9KTtjb25zdCByPSgpPT57aWYobSl7S1trXT0wO2IuY2xhc3NMaXN0LnJlbW92ZSgnb24nKX19O2IuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJyxyKTtiLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLHIpfSk7XG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjb3YgYnV0dG9uJykuZm9yRWFjaChiPT5iLm9uY2xpY2s9KCk9PntkaWZmPStiLmRhdGFzZXQuZDskKCdvdicpLnN0eWxlLmRpc3BsYXk9J25vbmUnO3BhdXNlZD0wO0FVLmluaXQoKTtuZXdSb3VuZCgpO2lmKG1hdGNoTWVkaWEoJyhwb2ludGVyOmZpbmUpJykubWF0Y2hlcyYmY3YucmVxdWVzdFBvaW50ZXJMb2NrKWN2LnJlcXVlc3RQb2ludGVyTG9jaygpfSk7XG4vKiA9PT09PSBMb29wID09PT09ICovXG5sZXQgbGFzdD1wZXJmb3JtYW5jZS5ub3coKTtcbmZ1bmN0aW9uIGZyYW1lKHQpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7Y29uc3QgZHQ9TWF0aC5taW4oLjA1LCh0LWxhc3QpLzEwMDApO2xhc3Q9dDtpZighcGF1c2VkKXVwZGF0ZShkdCk7ZWxzZXtjYW0ucG9zaXRpb24uc2V0KDQ1LDIyLDQwKTtjYW0ucm90YXRpb24uc2V0KC0uNyxQSSouMit0LzYwMDAsMCl9c2t5LnBvc2l0aW9uLmNvcHkoY2FtLnBvc2l0aW9uKTtyZC5yZW5kZXIoc2MsY2FtKX1cbnNldEd1bigpO3JkLnNoYWRvd01hcC5uZWVkc1VwZGF0ZT10cnVlO3JlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7XG48XC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD5cbiJ9OwpHTS5wdXNoKFsnU3RyaWtlIFpvbmUgM0QnLCfwn46vJyw1MCxudWxsLCdjcyddLFsnTmVvbiBSdW5uZXIgM0QnLCfwn4+DJywyMixudWxsLCdydW4nXSxbJ1pvbWJpZSBBcmVuYSAzRCcsJ/Cfp58nLDI4LG51bGwsJ3pvbWInXSxbJ1NwYWNlIEZsaWdodCAzRCcsJ/Cfm7gnLDI0LG51bGwsJ3NwYWNlJ10pOwpjb25zdCBLRUVQX0dBTUVTPVsnRmxhcHB5IFBpcGUnLCdTbmFrZSBOZW9uJywnQnJpY2sgQnJlYWtlcicsJ1NwYWNlIERlZmVuZGVyJywnRGVzZXJ0IFJ1bm5lcicsJ9m+24zZhtqpINm+2YbarycsJ0ZydWl0IENhdGNoJywnVHJhZmZpYyBSYWNlcicsJ1Rvd2VyIFN0YWNrJywnQmFsbG9vbiBQb3AnLCdOZW9uIFJ1bm5lciAzRCddOyBmb3IobGV0IGs9R00ubGVuZ3RoLTE7az49MDtrLS0pe2lmKCFLRUVQX0dBTUVTLmluY2x1ZGVzKEdNW2tdWzBdKSlHTS5zcGxpY2UoaywxKX0KY29uc3QgVElUTEVTPVsi2b7YsdmI2KfYsiDYp9iyINmE2YjZhNmH4oCM2YfYpyIsICLZhdin2LEg2YbYptmI2YbbjCIsICLYtNqp2LPYqtmGINii2KzYsdmH2KciLCAi2YXYr9in2YHYuSDZgdi22KciLCAi2K/ZiNmG2K/ZhyDYqNuM2KfYqNin2YYiLCAi2b7bjNmG2qkg2b7ZhtqvIiwgIti02qnYp9ixINmF24zZiNmHIiwgItmF2LPYp9io2YLZhyDYrtuM2KfYqNin2YbbjCIsICLYqNix2KzigIzYs9in2LLbjCIsICLYqtix2qnYp9mG2K/ZhiDYqNin2K/aqdmG2qkiLCAi2K/ZiNmG2K/ZhyJdLElDT05TPVsi8J+QpCIsICLwn5CNIiwgIvCfp7EiLCAi8J+agCIsICLwn6aWIiwgIvCfj5MiLCAi8J+NjiIsICLwn4+O77iPIiwgIvCfj5fvuI8iLCAi8J+OiCIsICLwn4+DIl0sREVTQ1M9WyLYp9iyINmF24zYp9mGINmE2YjZhNmH4oCM2YfYpyDYudio2YjYsSDaqdmGINmIINix2qnZiNix2K8g2KjYstmGLiIsICLZhdin2LEg2LHYpyDZh9iv2KfbjNiqINqp2YYg2Ygg2K7ZiNix2KfaqduM4oCM2YfYpyDYsdinINis2YXYuSDaqdmGLiIsICLYqtmI2b4g2LHYpyDZhtqv2Ycg2K/Yp9ixINmIINmH2YXZhyDYotis2LHZh9inINix2Kcg2KjYtNqp2YYuIiwgItio2Kcg2LPZgduM2YbZhyDYp9iyINiy2YXbjNmGINiv2YHYp9i5INqp2YYuIiwgItin2LIg2YXZiNin2YbYuSDYqNuM2KfYqNin2YYg2KjZvtixINmIINis2YTZiCDYqNix2YguIiwgItiq2YjZviDYsdinINio2Ycg2LPZhdiqINit2LHbjNmBINio2LHar9ix2K/Yp9mGLiIsICLZhduM2YjZh+KAjNmH2Kcg2LHYpyDYqNqv24zYsSDZiCDYp9iyINio2YXYqOKAjNmH2Kcg2K/ZiNix24wg2qnZhi4iLCAi2KfYsiDYrtmI2K/YsdmI2YfYp9uMINiv24zar9ixINiz2KjZgtiqINio2q/bjNixLiIsICLYt9io2YLZh+KAjNmH2Kcg2LHYpyDYr9mC24zZgiDYsdmI24wg2YfZhSDZgtix2KfYsSDYqNiv2YcuIiwgItio2KfYr9qp2YbaqeKAjNmH2Kcg2LHYpyDYqNiq2LHaqdin2YYg2Ygg2KfZhdiq24zYp9iyINio2q/bjNixLiIsICLYr9ixINmF2LPbjNixINmG2KbZiNmG24wg2KjYr9mIINmIINin2LIg2YXZiNin2YbYuSDYsdivINi02YguIl07CmNvbnN0IGdyaWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWQnKSxzdGFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhZ2UnKSxpbmZvPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvJyksbmFtZUVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnYW1lTmFtZScpLHNjb3JlRWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njb3JlJyk7CmxldCBhY3RpdmVJbnB1dD1udWxsO2Z1bmN0aW9uIHNlbmRQYWQoZGlyLGRvd24pe2NvbnN0IGZyYW1lPXN0YWdlLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO2lmKGZyYW1lKXtmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHt0eXBlOidub3ZhLXBhZCcsZGlyLGRvd259LCcqJyk7cmV0dXJufWlmKCFhY3RpdmVJbnB1dHx8IWRvd24pcmV0dXJuO2NvbnN0IEk9YWN0aXZlSW5wdXQ7SS50YXA9MTtJLmQ9MTtpZihjdXJyZW50PT09MSl7SS5kaXI9ZGlyPT09J2xlZnQnP1stMSwwXTpkaXI9PT0ncmlnaHQnP1sxLDBdOmRpcj09PSd1cCc/WzAsLTFdOlswLDFdO3JldHVybn1pZihkaXI9PT0nbGVmdCcpe0kueD0xMjtJLnk9MTM1fWVsc2UgaWYoZGlyPT09J3JpZ2h0Jyl7SS54PTQ2ODtJLnk9MTM1fWVsc2UgaWYoZGlyPT09J2FjdGlvbicpe0kudGFwPTF9fWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNwYWQgYnV0dG9uJykuZm9yRWFjaChiPT57Y29uc3QgZD1iLmRhdGFzZXQuZGlyO2NvbnN0IGRvd249ZT0+e2UucHJldmVudERlZmF1bHQoKTtzZW5kUGFkKGQsdHJ1ZSl9O2NvbnN0IHVwPWU9PntlLnByZXZlbnREZWZhdWx0KCk7aWYoYWN0aXZlSW5wdXQpYWN0aXZlSW5wdXQuZD0wfTtiLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJyxkb3duKTtiLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsdXApO2IuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsdXApO2IuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJyx1cCl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsZT0+e2NvbnN0IGNoaWxkPXN0YWdlLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO2lmKCFjaGlsZHx8ZS5zb3VyY2UhPT1jaGlsZC5jb250ZW50V2luZG93KXJldHVybjtpZihlLmRhdGE/LnR5cGU9PT0nbm92YS1waG9uZS1yZXdhcmQnKXtjb25zdCBjb2lucz1NYXRoLm1heCgxLE1hdGgubWluKDUwLE1hdGguZmxvb3IoTnVtYmVyKGUuZGF0YS5jb2lucyl8fDApKSk7aWYoY29pbnMpcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidub3ZhLXBob25lLXJld2FyZCcsY29pbnMsZ2FtZTpjdXJyZW50fSwnKicpfWVsc2UgaWYoZS5kYXRhPy50eXBlPT09J25vdmEtcGhvbmUtZ2FtZS1vdmVyJyl7Y29uc3Qgbj1OdW1iZXIoZS5kYXRhLnNjb3JlKTtjb25zdCBjb2lucz1NYXRoLm1heCgyLE1hdGgubWluKDUwLE51bWJlci5pc0Zpbml0ZShuKT9NYXRoLmZsb29yKE1hdGgubWF4KDAsbikqMikrNToxMCkpO3BhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbm92YS1waG9uZS1yZXdhcmQnLGNvaW5zLGdhbWU6Y3VycmVudH0sJyonKX0gfSk7CmxldCBjdXJyZW50PS0xLHJhZj0wLGdhbWVTdG9wPTA7CmZ1bmN0aW9uIG1lbnUoKXtpZihyYWYpY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtyYWY9MDtnYW1lU3RvcCsrO2N1cnJlbnQ9LTE7YWN0aXZlSW5wdXQ9bnVsbDtzdGFnZS5pbm5lckhUTUw9Jyc7c3RhZ2Uuc3R5bGUuZGlzcGxheT0nbm9uZSc7aW5mby5zdHlsZS5kaXNwbGF5PSdub25lJztncmlkLnN0eWxlLmRpc3BsYXk9J2dyaWQnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWQnKS5zdHlsZS5kaXNwbGF5PSdub25lJ30KZnVuY3Rpb24gcGxheTMoRyl7Y29uc3QgcGFkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWQnKTtwYWQuY2xhc3NMaXN0LnJlbW92ZSgnc25ha2UtcGFkJyk7cGFkLnN0eWxlLmRpc3BsYXk9Y3VycmVudD09PTEwPydncmlkJzonbm9uZSc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3BhZCBidXR0b24nKS5mb3JFYWNoKGI9PntiLnN0eWxlLmRpc3BsYXk9Y3VycmVudD09PTEwJiZbJ2xlZnQnLCdhY3Rpb24nLCdyaWdodCddLmluY2x1ZGVzKGIuZGF0YXNldC5kaXIpPycnOidub25lJztpZihiLmRhdGFzZXQuZGlyPT09J2FjdGlvbicpYi50ZXh0Q29udGVudD1jdXJyZW50PT09MTA/J9m+2LHYtCc6J+KktO+4jyd9KTtzdGFnZS5pbm5lckhUTUw9Jyc7Y29uc3QgZnI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7ZnIuYWxsb3c9J2F1dG9wbGF5OyBmdWxsc2NyZWVuOyBnYW1lcGFkOyBwb2ludGVyLWxvY2snO2ZyLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsJ2FsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctZm9ybXMgYWxsb3ctbW9kYWxzIGFsbG93LXBvaW50ZXItbG9jaycpO2ZyLnNyY2RvYz1IR1tHWzRdXTtzdGFnZS5hcHBlbmRDaGlsZChmcil9CmZ1bmN0aW9uIHBsYXkoaSl7Y3VycmVudD1pO2dyaWQuc3R5bGUuZGlzcGxheT0nbm9uZSc7c3RhZ2Uuc3R5bGUuZGlzcGxheT0nYmxvY2snO2luZm8uc3R5bGUuZGlzcGxheT0nZmxleCc7Y29uc3QgcGFkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWQnKTtwYWQuY2xhc3NMaXN0LnRvZ2dsZSgnc25ha2UtcGFkJyxpPT09MSk7cGFkLnN0eWxlLmRpc3BsYXk9WzIsNSw4LDldLmluY2x1ZGVzKGkpPydub25lJzonZ3JpZCc7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3BhZCBidXR0b24nKS5mb3JFYWNoKGI9Pntjb25zdCBkPWIuZGF0YXNldC5kaXI7Y29uc3Qgc2hvdz1pPT09MT9bJ3VwJywnZG93bicsJ2xlZnQnLCdyaWdodCddLmluY2x1ZGVzKGQpOmk9PT0xMD9bJ2xlZnQnLCdhY3Rpb24nLCdyaWdodCddLmluY2x1ZGVzKGQpOmk9PT03P1snbGVmdCcsJ3JpZ2h0J10uaW5jbHVkZXMoZCk6ZmFsc2U7Yi5zdHlsZS5kaXNwbGF5PXNob3c/Jyc6J25vbmUnfSk7bmFtZUVsLnRleHRDb250ZW50PVRJVExFU1tpXTtzY29yZUVsLnRleHRDb250ZW50PScnO2lmKEdNW2ldWzRdKXtwbGF5MyhHTVtpXSk7cmV0dXJufQpzdGFnZS5pbm5lckhUTUw9Jyc7Y29uc3QgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7Y3Yud2lkdGg9NDgwO2N2LmhlaWdodD0yNzA7Y3Yuc3R5bGUuY3NzVGV4dD0nd2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvYmplY3QtZml0OmNvbnRhaW47dG91Y2gtYWN0aW9uOm5vbmU7YmFja2dyb3VuZDojMDAwO2Rpc3BsYXk6YmxvY2snO3N0YWdlLmFwcGVuZENoaWxkKGN2KTtjb25zdCBjPWN2LmdldENvbnRleHQoJzJkJyksST17eDoyNDAseToxMzUsZDowLHRhcDowLHNjOjB9O2FjdGl2ZUlucHV0PUk7Y29uc3QgZXY9ZT0+e2NvbnN0IHI9Y3YuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaz1NYXRoLm1pbihyLndpZHRoLzQ4MCxyLmhlaWdodC8yNzApO0kueD0oZS5jbGllbnRYLXIubGVmdC0oci53aWR0aC00ODAqaykvMikvaztJLnk9KGUuY2xpZW50WS1yLnRvcC0oci5oZWlnaHQtMjcwKmspLzIpL2t9O2N2Lm9ucG9pbnRlcmRvd249ZT0+e2V2KGUpO0kuZD0xO0kudGFwPTE7Y3Yuc2V0UG9pbnRlckNhcHR1cmU/LihlLnBvaW50ZXJJZCl9O2N2Lm9ucG9pbnRlcm1vdmU9ZXY7Y3Yub25wb2ludGVydXA9KCk9PkkuZD0wO2N2Lm9ucG9pbnRlcmNhbmNlbD0oKT0+SS5kPTA7bGV0IHN0PUdNW2ldWzNdKGMsSSksb3Zlcj0wLGxhc3Q9cGVyZm9ybWFuY2Uubm93KCksdG9rZW49KytnYW1lU3RvcCxyZXdhcmRTZW50PWZhbHNlLG5leHRDb2luU2NvcmU9MTAscmV3YXJkZWRTY29yZT0wO2NvbnN0IGNvaW5SYXRlcz17MDo1LDE6NCwyOjYsMzo1LDQ6Myw2OjQsNzoyfTsKKGZ1bmN0aW9uIGYodCl7aWYodG9rZW4hPT1nYW1lU3RvcClyZXR1cm47cmFmPXJlcXVlc3RBbmltYXRpb25GcmFtZShmKTtjb25zdCBkdD1NYXRoLm1pbiguMDUsKHQtbGFzdCkvMTAwMCk7bGFzdD10O2MuZm9udD0nMTZweCBzYW5zLXNlcmlmJztjLnRleHRBbGlnbj0nbGVmdCc7aWYoIW92ZXIpe292ZXI9c3QoZHQpO2NvbnN0IGxpdmVTY29yZT1OdW1iZXIoSS5zYyk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvaW5SYXRlcyxpKSYmTnVtYmVyLmlzRmluaXRlKGxpdmVTY29yZSkpe2NvbnN0IGRlbHRhPU1hdGgubWF4KDAsTWF0aC5mbG9vcihsaXZlU2NvcmUpLXJld2FyZGVkU2NvcmUpO2lmKGRlbHRhPjApe3BhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbm92YS1waG9uZS1yZXdhcmQnLGNvaW5zOmRlbHRhKmNvaW5SYXRlc1tpXX0sJyonKTtyZXdhcmRlZFNjb3JlPU1hdGguZmxvb3IobGl2ZVNjb3JlKX19ZWxzZSBpZihOdW1iZXIuaXNGaW5pdGUobGl2ZVNjb3JlKSYmbGl2ZVNjb3JlPj1uZXh0Q29pblNjb3JlKXtjb25zdCBlYXJuZWQ9TWF0aC5taW4oMTAsTWF0aC5mbG9vcihsaXZlU2NvcmUvMTApLU1hdGguZmxvb3IoKG5leHRDb2luU2NvcmUtMSkvMTApKTtpZihlYXJuZWQ+MClwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J25vdmEtcGhvbmUtcmV3YXJkJyxjb2luczplYXJuZWR9LCcqJyk7bmV4dENvaW5TY29yZT0oTWF0aC5mbG9vcihsaXZlU2NvcmUvMTApKzEpKjEwfWlmKG92ZXIpe0kudGFwPTA7aWYoIXJld2FyZFNlbnQpe3Jld2FyZFNlbnQ9dHJ1ZTtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvaW5SYXRlcyxpKSl7Y29uc3Qgbj1OdW1iZXIoSS5zYyk7cGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidub3ZhLXBob25lLXJld2FyZCcsY29pbnM6TWF0aC5tYXgoMixNYXRoLm1pbig1MCxOdW1iZXIuaXNGaW5pdGUobik/TWF0aC5mbG9vcihNYXRoLm1heCgwLG4pKjIpKzU6KFN0cmluZyhJLnNjKS5pbmNsdWRlcygn2KjYsdivJyk/MTU6NSkpKX0sJyonKX19fWVsc2V7Yy5maWxsU3R5bGU9JyNmZmYnO2MuZm9udD0nMTZweCBzYW5zLXNlcmlmJztjLmZpbGxUZXh0KEkuc2MsOCwxOCl9fWlmKG92ZXIpe2MuZmlsbFN0eWxlPScjMDAwYic7Yy5maWxsUmVjdCgwLDEwMCw0ODAsNzApO2MuZmlsbFN0eWxlPScjZmZmJztjLmZvbnQ9JzIwcHggc2Fucy1zZXJpZic7Yy50ZXh0QWxpZ249J2NlbnRlcic7Yy5maWxsVGV4dCgn2b7Yp9uM2KfZhiDigJQgJytJLnNjKycgKNio2LHYp9uMINi02LHZiNi5INiv2YjYqNin2LHZhyDZhNmF2LMg2qnZhiknLDI0MCwxNDIpO2lmKEkudGFwKXtzdD1HTVtpXVszXShjLEkpO292ZXI9MDtyZXdhcmRTZW50PWZhbHNlO25leHRDb2luU2NvcmU9MTA7cmV3YXJkZWRTY29yZT0wfX1JLnRhcD0wfSkobGFzdCl9CmZ1bmN0aW9uIGRyYXdNZW51KCl7Z3JpZC5pbm5lckhUTUw9Jyc7VElUTEVTLmZvckVhY2goKHQsaSk9Pntjb25zdCBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO2IuY2xhc3NOYW1lPSdnJztiLmlubmVySFRNTD0nPGk+JytJQ09OU1tpXSsnPC9pPjxiPicrdCsnPC9iPjxzbWFsbD4nK0RFU0NTW2ldKyc8L3NtYWxsPic7Yi5vbmNsaWNrPSgpPT5wbGF5KGkpO2dyaWQuYXBwZW5kQ2hpbGQoYil9KTtncmlkLnN0eWxlLmRpc3BsYXk9J2dyaWQnO3N0YWdlLnN0eWxlLmRpc3BsYXk9J25vbmUnO2luZm8uc3R5bGUuZGlzcGxheT0nbm9uZSd9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZ2FpbicpLm9uY2xpY2s9KCk9PntpZihjdXJyZW50Pj0wKXBsYXkoY3VycmVudCl9O2RyYXdNZW51KCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZCcpLnN0eWxlLmRpc3BsYXk9J25vbmUnO2NvbnN0IFNUQVJUX0lOREVYPV9fU1RBUlRfSU5ERVhfXztpZihTVEFSVF9JTkRFWD49MClwbGF5KFNUQVJUX0lOREVYKTsKPC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD4='; function openNeonPhoneGame(index){ const g=neonPhoneGames[index];if(!g)return; stopDuoQuest();stopSoloQuest();selectedGame='neonphone_'+index;gameState={};clearTimeout(reactionTimer);clearInterval(starTimer);stopStrike3D();stopApocalypse();stopNovaCity(); const modal=document.querySelector('#gameModal .modal');modal.classList.remove('strike-modal','city-modal','apoc-modal','fighter-modal','quest-modal','neon-phone-modal');modal.classList.add('neon-phone-modal'); document.getElementById('gameCloseBtn').style.display='';document.getElementById('modalTitle').textContent=g.name;document.getElementById('modalDesc').textContent=g.desc; document.getElementById('modalMoney').textContent=data.money||0;document.getElementById('modalTime').textContent=data.minutes||0;document.getElementById('modalStatus').textContent='آماده اجرا'; const area=document.getElementById('playArea');area.innerHTML='';area.style.cssText='display:flex;flex:1 1 0;min-height:0;height:100%;margin-top:3px;padding:0;border:0;background:transparent;overflow:hidden'; document.getElementById('gameModal').style.display='flex';lockLobbyScroll();startNeonPhoneGame(index); } function startNeonPhoneGame(index){ const area=document.getElementById('playArea');area.innerHTML=''; const frame=document.createElement('iframe');frame.title='بازی '+neonPhoneGames[index].name; frame.setAttribute('allow','autoplay; fullscreen; gamepad; pointer-lock'); frame.style.cssText='display:block;flex:1 1 0;width:100%;height:100%;min-height:0;border:1px solid #514a78;border-radius:14px;background:#10101d'; const html=new TextDecoder('utf-8').decode(Uint8Array.from(atob(NEON_PHONE_GAMES_B64),c=>c.charCodeAt(0))); frame.srcdoc=html.replace('__START_INDEX__',String(index));area.appendChild(frame); } function startGame(id){const a=document.getElementById('playArea');if(id==='adventure'){a.innerHTML=`

🗺️ ماجراجویی

حالت بازی رو انتخاب کن

`;return}if(id==='soloquest'){startSoloQuest();return}if(id==='duoquest'){startDuoQuest();return}if(id==='novafighters'){const bytes=Uint8Array.from(atob(NOVA_FIGHTERS_B64),c=>c.charCodeAt(0));const html=new TextDecoder().decode(bytes);a.innerHTML='';const frame=document.createElement('iframe');frame.title='مبارزان نُوا';frame.allow='autoplay; fullscreen';frame.srcdoc=html;a.appendChild(frame);return}if(id==='clashroyale'){try{const bytes=Uint8Array.from(atob(NOVA_CLASH_ROYALE_B64),c=>c.charCodeAt(0));const html=new TextDecoder('utf-8').decode(bytes);a.innerHTML='';const frame=document.createElement('iframe');frame.title='کلش رویال';frame.setAttribute('allow','autoplay; fullscreen; gamepad');frame.setAttribute('loading','eager');frame.style.cssText='display:block;width:100%;height:100%;min-height:540px;flex:1;border:0;border-radius:14px;background:#101120;';a.style.cssText='display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden;margin-top:8px;padding:0;';frame.srcdoc=html;a.appendChild(frame);frame.addEventListener('error',()=>{a.innerHTML='
بازی بارگذاری نشد. اینترنت را بررسی کن و دوباره تلاش کن.
'},{once:true});return}catch(err){a.innerHTML='
خطا در بارگذاری کلش رویال. فایل را دوباره دانلود و باز کن.
';return}}if(id==='strike3d'){startStrike3D();return}if(id==='novacity'){startNovaCity();return}if(id==='apocalypse'){startApocalypse();return}if(id==='tic'){gameState.board=Array(9).fill('');gameState.turn='⭕';gameState.over=false;drawTic()} if(id==='rps'){a.innerHTML='

انتخابت رو بزن!

🤔

'} if(id==='guess'){gameState.secret=1+Math.floor(Math.random()*100);gameState.tries=0;a.innerHTML='

یک عدد بین ۱ تا ۱۰۰ حدس بزن

🎯

تعداد تلاش: ۰

'} if(id==='memory'){gameState.deck=['🍇','🍋','🍉','🍒','','🚀','🎮','💎', '🍇','🍋','🍉','🍒','','🚀','🎮','💎'].sort(()=>Math.random()-.5);gameState.open=[];gameState.matched=[];gameState.moves=0;drawMemory()} if(id==='reaction'){a.innerHTML='

وقتی آماده‌ای شروع کن؛ بعد از تغییر رنگ سریع لمس کن.

⚡

';gameState.phase='ready'} if(id==='stars'){gameState.score=0;gameState.left=15;a.innerHTML='

در ۱۵ ثانیه ستاره‌ها رو بگیر!

امتیاز : ۰ زمان : ۱۵

';starTimer=setInterval(()=>{gameState.left--;const el=document.getElementById('starLeft');if(el)el.textContent=gameState.left;if(gameState.left<=0){clearInterval(starTimer);document.getElementById('starField').innerHTML='

پایان بازی! 🏆

';award(Math.max(5,gameState.score*2))}},1000)}} function drawTic(){const a=document.getElementById('playArea');a.innerHTML='

نوبت: '+gameState.turn+'

'+gameState.board.map((v,i)=>``).join('')+'
';} function ticMove(i){if(gameState.over||gameState.board[i])return;gameState.board[i]=gameState.turn;if(checkWin(gameState.board,gameState.turn)){gameState.over=true;drawTic();document.getElementById('ticInfo').textContent=gameState.turn+' برنده شد!';if(gameState.turn==='⭕')award(10);return}if(gameState.board.every(Boolean)){gameState.over=true;drawTic();document.getElementById('ticInfo').textContent='مساوی شد!';return}gameState.turn=gameState.turn==='⭕'?'❌':'⭕';if(gameState.turn==='❌'){let free=gameState.board.map((v,i)=>v?null:i).filter(v=>v!==null);gameState.board[free[Math.floor(Math.random()*free.length)]]='❌';if(checkWin(gameState.board,'❌'))gameState.over=true;else gameState.turn='⭕'}drawTic();if(gameState.over)document.getElementById('ticInfo').textContent='کامپیوتر برنده شد!'} function checkWin(b,p){return [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]].some(line=>line.every(i=>b[i]===p))} function rps(me){const opts=['✊','✋','✌️'],cpu=opts[Math.floor(Math.random()*3)];let msg=me===cpu?'مساوی!':((me==='✊'&&cpu==='✌️')||(me==='✋'&&cpu==='✊')||(me==='✌️'&&cpu==='✋'))?'بردی! 🎉':'این دور کامپیوتر برد';document.getElementById('rpsResult').textContent=`تو ${me} | کامپیوتر ${cpu} — ${msg}`;if(msg.startsWith('بردی'))award(5)} function guessTry(){const n=Number(document.getElementById('guessInput').value);if(!n||n<1||n>100){toast('عدد بین ۱ تا ۱۰۰ وارد کن');return}gameState.tries++;let msg=n===gameState.secret?'درست حدس زدی! 🎉':nحرکت‌ها: ${gameState.moves} · جفت‌ها: ${gameState.matched.length/2}/8

${gameState.deck.map((v,i)=>``).join('')}
`} function memoryFlip(i){if(gameState.open.includes(i)||gameState.matched.includes(i)||gameState.open.length===2)return;gameState.open.push(i);if(gameState.open.length===2){gameState.moves++;const [x,y]=gameState.open;if(gameState.deck[x]===gameState.deck[y]){gameState.matched.push(x,y);gameState.open=[];if(gameState.matched.length===16){drawMemory();award(25);document.getElementById('playArea').insertAdjacentHTML('afterbegin','

همه جفت‌ها پیدا شدند! 🏆

');return}drawMemory()}else{drawMemory();setTimeout(()=>{gameState.open=[];drawMemory()},650)}}else drawMemory()} function reactionClick(){const b=document.getElementById('reactionButton'),t=document.getElementById('reactionText'),r=document.getElementById('reactionResult');if(gameState.phase==='ready'){gameState.phase='wait';b.textContent='منتظر سبز شدن باش…';b.style.background='#4a2940';t.textContent='هنوز نه!';reactionTimer=setTimeout(()=>{gameState.phase='go';reactionStart=performance.now();b.textContent='حالا لمس کن!';b.style.background='#138c72';t.textContent='همین الان!'},1000+Math.random()*2500)}else if(gameState.phase==='wait'){clearTimeout(reactionTimer);gameState.phase='ready';b.textContent='شروع دوباره';b.style.background='';r.textContent='زود زدی! 😅';t.textContent='قبل از سبز شدن لمس کردی.'}else if(gameState.phase==='go'){const ms=Math.round(performance.now()-reactionStart);gameState.phase='done';b.textContent='دوباره تست کن';b.style.background='';r.textContent=ms+' میلی‌ثانیه';t.textContent='زمان واکنشت';award(ms<350?10:5)}else{startGame('reaction')}} function hitStar(btn){if(gameState.left<=0)return;gameState.score++;const s=document.getElementById('starScore');if(s)s.textContent=gameState.score;const field=document.getElementById('starField');btn.style.left=Math.floor(Math.random()*78)+'%';btn.style.top=Math.floor(Math.random()*72)+'%'} let strikeRAF=0,strikeCanvas=null,strikeCtx=null,strikeResizeHandler=null,strikeLast=0,strikeTargets=[],strikeScore=0,strikeTime=45,strikeRunning=false,strikeAim={x:0,y:0},strikeEnd=0,strikeHits=0; function stopStrike3D(){if(strikeRAF)cancelAnimationFrame(strikeRAF);strikeRAF=0;strikeRunning=false;if(strikeResizeHandler){window.removeEventListener('resize',strikeResizeHandler);strikeResizeHandler=null}strikeCanvas=null;strikeCtx=null;} function startStrike3D(){stopStrike3D();const a=document.getElementById('playArea');strikeScore=0;strikeHits=0;strikeTime=40;strikeRunning=true;strikeLast=performance.now();strikeEnd=strikeLast+40000;strikeAim={x:0,y:0};strikeTargets=[];for(let i=0;i<7;i++)strikeTargets.push(makeStrikeTarget());a.innerHTML=`
🎯 امتیاز: ۰⏱️ زمان: ۴۰ ثانیه💥 برخورد: ۰

انگشتت را روی محیط بکش تا هدف‌گیری کنی و برای شلیک روی صفحه بزن؛ یا دکمه شلیک را لمس کن. هدف‌ها را بزن و امتیاز جمع کن.

`;strikeCanvas=document.getElementById('strikeCanvas');strikeCtx=strikeCanvas.getContext('2d');const resize=()=>{if(!strikeCanvas)return;const r=strikeCanvas.getBoundingClientRect(),d=Math.min(window.devicePixelRatio||1,2);strikeCanvas.width=Math.max(1,Math.floor(r.width*d));strikeCanvas.height=Math.max(1,Math.floor(r.height*d));strikeCtx.setTransform(d,0,0,d,0,0)};resize();strikeResizeHandler=resize;window.addEventListener('resize',strikeResizeHandler);strikeCanvas.addEventListener('pointermove',e=>{const r=strikeCanvas.getBoundingClientRect();strikeAim.x=(e.clientX-r.left)/r.width-.5;strikeAim.y=(e.clientY-r.top)/r.height-.5});strikeCanvas.addEventListener('pointerdown',e=>{e.preventDefault();const r=strikeCanvas.getBoundingClientRect();strikeAim.x=(e.clientX-r.left)/r.width-.5;strikeAim.y=(e.clientY-r.top)/r.height-.5;strikeShoot()});strikeRAF=requestAnimationFrame(strikeFrame)} function makeStrikeTarget(){return {x:(Math.random()-.5)*1.55,y:(Math.random()-.5)*.65,z:.25+Math.random()*.8,phase:Math.random()*6.28,speed:.2+Math.random()*.5,size:.035+Math.random()*.022,alive:true}} function strikeShoot(){if(!strikeRunning||!strikeCanvas)return;const w=strikeCanvas.clientWidth,h=strikeCanvas.clientHeight,cx=w/2+strikeAim.x*w*.72,cy=h*.48+strikeAim.y*h*.7;let best=-1,dist=1e9;strikeTargets.forEach((t,i)=>{if(!t.alive)return;const p=projectStrike(t,w,h),d=Math.hypot(p.x-cx,p.y-cy),rad=p.r+12;if(d=0){strikeTargets[best].alive=false;strikeScore+=10;strikeHits++;award(2);document.getElementById('strikeScore').textContent=strikeScore.toLocaleString('fa-IR');document.getElementById('strikeHits').textContent=strikeHits.toLocaleString('fa-IR');setTimeout(()=>{if(strikeRunning)strikeTargets[best]=makeStrikeTarget()},300)}else{strikeScore=Math.max(0,strikeScore-1);document.getElementById('strikeScore').textContent=strikeScore.toLocaleString('fa-IR')} } function projectStrike(t,w,h){const horizon=h*.38,scale=1/(t.z+.22),x=w/2+t.x*w*.42*scale,y=horizon+t.y*h*.42*scale+t.z*h*.16,r=Math.max(5,Math.min(48,t.size*w*scale*2.7));return{x,y,r}} function strikeFrame(now){if(!strikeRunning||!strikeCanvas||!strikeCtx)return;const c=strikeCtx,w=strikeCanvas.clientWidth,h=strikeCanvas.clientHeight,dt=Math.min(.04,(now-strikeLast)/1000);strikeLast=now;strikeTime=Math.max(0,Math.ceil((strikeEnd-now)/1000));const ti=document.getElementById('strikeTime');if(ti)ti.textContent=strikeTime.toLocaleString('fa-IR');c.clearRect(0,0,w,h); // sky gradient let sky=c.createLinearGradient(0,0,0,h*.6);sky.addColorStop(0,'#15263a');sky.addColorStop(1,'#536b77');c.fillStyle=sky;c.fillRect(0,0,w,h*.6);c.fillStyle='#c3a878';c.beginPath();c.arc(w*.78,h*.19,Math.min(w,h)*.055,0,Math.PI*2);c.fill(); // distant buildings c.fillStyle='#26343a';for(let i=0;i<12;i++){let bw=w/10,bh=h*(.08+(i*17%9)/100);c.fillRect(i*bw,h*.38-bh,bw*.8,bh)} // ground and perspective grid c.fillStyle='#303d3b';c.beginPath();c.moveTo(0,h*.38);c.lineTo(w,h*.38);c.lineTo(w,h);c.lineTo(0,h);c.closePath();c.fill();c.strokeStyle='rgba(222,205,159,.2)';c.lineWidth=1;for(let i=0;i<9;i++){let yy=h*.38+(h*.62)*(i/8)**2;c.beginPath();c.moveTo(0,yy);c.lineTo(w,yy);c.stroke()}for(let i=-7;i<=7;i++){c.beginPath();c.moveTo(w/2+i*w*.04,h*.38);c.lineTo(w/2+i*w*.17,h);c.stroke()} // targets strikeTargets.forEach(t=>{if(!t.alive)return;t.phase+=dt*t.speed*2;t.x+=Math.sin(t.phase)*dt*.09;const p=projectStrike(t,w,h);c.save();c.translate(p.x,p.y);c.fillStyle='rgba(0,0,0,.25)';c.beginPath();c.ellipse(0,p.r*1.65,p.r*1.1,p.r*.3,0,0,Math.PI*2);c.fill();c.fillStyle='#e9e2d0';c.fillRect(-p.r*.62,-p.r*1.45,p.r*1.24,p.r*2.1);c.fillStyle='#b9473d';c.fillRect(-p.r*.62,-p.r*1.45,p.r*1.24,p.r*.38);c.fillStyle='#28343a';c.fillRect(-p.r*.35,-p.r*.8,p.r*.7,p.r*.55);c.strokeStyle='#f2a33a';c.lineWidth=Math.max(1,p.r*.09);c.strokeRect(-p.r*.62,-p.r*1.45,p.r*1.24,p.r*2.1);c.restore()}); // crosshair const ax=w/2+strikeAim.x*w*.72,ay=h*.48+strikeAim.y*h*.7;c.strokeStyle='#aaffbd';c.lineWidth=2;c.beginPath();c.moveTo(ax-10,ay);c.lineTo(ax-4,ay);c.moveTo(ax+4,ay);c.lineTo(ax+10,ay);c.moveTo(ax,ay-10);c.lineTo(ax,ay-4);c.moveTo(ax,ay+4);c.lineTo(ax,ay+10);c.stroke(); // simple weapon silhouette c.fillStyle='#182027';c.beginPath();c.moveTo(w*.43,h);c.lineTo(w*.46,h*.83);c.lineTo(w*.54,h*.83);c.lineTo(w*.57,h);c.closePath();c.fill();c.fillStyle='#56616a';c.fillRect(w*.475,h*.81,w*.05,h*.12); if(now>=strikeEnd){strikeRunning=false;c.fillStyle='rgba(7,8,14,.78)';c.fillRect(0,0,w,h);c.fillStyle='#fff';c.textAlign='center';c.font='bold 24px Tahoma';c.fillText('پایان مرحله!',w/2,h*.43);c.font='bold 18px Tahoma';c.fillText('امتیاز: '+strikeScore,w/2,h*.53);c.font='13px Tahoma';c.fillText('برای بازی دوباره دکمه شروع را بزن',w/2,h*.62);document.getElementById('modalStatus').textContent='پایان';award(Math.floor(strikeScore/5));return}strikeRAF=requestAnimationFrame(strikeFrame)} // آخرالزمان نُوا — میدان بقای نئونی، آفلاین و بر پایه بوم let apRAF=0,apCanvas=null,apCtx=null,apRunning=false,apLast=0,apResize=null,apKeyDown=null,apKeyUp=null; let ap={player:{x:0,y:0,hp:100,shield:0,inv:0},enemies:[],shots:[],particles:[],pickups:[],obstacles:[],keys:{},wave:1,kills:0,credits:0,weapon:1,fire:0,dash:0,elapsed:0,over:false,spawn:0,waveTransition:false,aimX:1,aimY:0}; function stopApocalypse(){if(apRAF)cancelAnimationFrame(apRAF);apRAF=0;apRunning=false;if(apResize){window.removeEventListener('resize',apResize);apResize=null}if(apKeyDown)window.removeEventListener('keydown',apKeyDown);if(apKeyUp)window.removeEventListener('keyup',apKeyUp);apKeyDown=apKeyUp=null;apCanvas=null;apCtx=null} function startApocalypse(){stopApocalypse();const a=document.getElementById('playArea');ap={player:{x:0,y:0,hp:100,shield:0,inv:0},enemies:[],shots:[],particles:[],pickups:[],obstacles:[],keys:{},wave:1,kills:0,credits:0,weapon:1,fire:0,dash:0,elapsed:0,over:false,spawn:0,waveTransition:false,aimX:1,aimY:0}; a.innerHTML=`
🌊 موج: ۱💠 امتیاز: ۰❤️ جان: ۱۰۰🔫 سلاح: ۱🛡️ سپر: ۰
`; apCanvas=document.getElementById('apCanvas');apCtx=apCanvas.getContext('2d');const resize=()=>{if(!apCanvas)return;const r=apCanvas.getBoundingClientRect(),d=Math.min(devicePixelRatio||1,2);apCanvas.width=Math.max(1,Math.floor(r.width*d));apCanvas.height=Math.max(1,Math.floor(r.height*d));apCtx.setTransform(d,0,0,d,0,0);ap.worldW=Math.max(6200,apCanvas.clientWidth*13);ap.worldH=Math.max(6200,apCanvas.clientHeight*13);if(!ap.player.x){ap.player.x=ap.worldW/2;ap.player.y=ap.worldH/2}};resize();ap.obstacles=[];for(let row=0;row<13;row++)for(let col=0;col<14;col++){if((row+col)%4===0)continue;ap.obstacles.push({x:ap.worldW*(.07+col*.066),y:ap.worldH*(.07+row*.071),w:76+(col%3)*18,h:76+(row%3)*16})}apResize=resize;window.addEventListener('resize',apResize); apKeyDown=e=>{let k=e.key.toLowerCase();if(['arrowup','arrowdown','arrowleft','arrowright',' ','shift','w','a','s','d'].includes(k))e.preventDefault();ap.keys[k]=true};apKeyUp=e=>{ap.keys[e.key.toLowerCase()]=false};window.addEventListener('keydown',apKeyDown);window.addEventListener('keyup',apKeyUp); a.querySelectorAll('[data-ap]').forEach(b=>{const k=b.dataset.ap; b.style.touchAction='none'; const down=e=>{e.preventDefault();ap.keys[k]=true;}; const up=e=>{e.preventDefault();ap.keys[k]=false;}; b.addEventListener('pointerdown',down,{passive:false}); b.addEventListener('pointerup',up,{passive:false}); b.addEventListener('pointercancel',up,{passive:false}); b.addEventListener('pointerleave',up,{passive:false}); b.addEventListener('contextmenu',e=>e.preventDefault());}); apCanvas.addEventListener('pointerdown',e=>{const r=apCanvas.getBoundingClientRect(),x=e.clientX-r.left-r.width/2,y=e.clientY-r.top-r.height/2;ap.aimX=x;ap.aimY=y;ap.keys.fire=true});apCanvas.addEventListener('pointermove',e=>{if(e.buttons){const r=apCanvas.getBoundingClientRect();ap.aimX=e.clientX-r.left-r.width/2;ap.aimY=e.clientY-r.top-r.height/2}});['pointerup','pointercancel','pointerleave'].forEach(ev=>apCanvas.addEventListener(ev,()=>{ap.keys.fire=false})); for(let i=0;i=100)return;ap.credits-=100;const healed=Math.min(100-ap.player.hp,30);ap.player.hp=Math.min(100,ap.player.hp+healed);}else if(type==='shield'){if(ap.credits<40||ap.player.shield>=3)return;ap.credits-=40;ap.player.shield=Math.min(3,ap.player.shield+1);}apHud()} function apWaveZombieCount(wave){if(wave===1)return 15;if(wave===2)return 20;return 20+Math.floor((wave-3)/3)} function apZombieHealth(wave){return 1+Math.floor((wave-1)/4)} function apSpawnEnemy(){const c=apCanvas,w=c?c.clientWidth:360,h=c?c.clientHeight:340,side=Math.floor(Math.random()*4),px=ap.player.x||((ap.worldW||w)/2),py=ap.player.y||((ap.worldH||h)/2),ox=Math.max(260,w*.72),oy=Math.max(230,h*.72);let x=side===0?px-ox:side===1?px+ox:px+(Math.random()-.5)*w*1.35,y=side===2?py-oy:side===3?py+oy:py+(Math.random()-.5)*h*1.35;x=Math.max(20,Math.min((ap.worldW||w)-20,x));y=Math.max(20,Math.min((ap.worldH||h)-20,y));ap.enemies.push({x,y,r:10+Math.random()*5,hp:apZombieHealth(ap.wave),speed:22+ap.wave*2+Math.random()*13,phase:Math.random()*6.28,kind:Math.random()<.25?'heavy':'drone'})} function apHud(){for(const [id,val] of [['apWave',ap.wave.toLocaleString('fa-IR')],['apScore',ap.credits.toLocaleString('fa-IR')],['apHP',Math.ceil(ap.player.hp).toLocaleString('fa-IR')],['apWeapon',ap.weapon.toLocaleString('fa-IR')],['apShield',ap.player.shield.toLocaleString('fa-IR')]]){const e=document.getElementById(id);if(e)e.textContent=val}const wb=document.getElementById('apWeaponUpgradeBtn');if(wb)wb.textContent='🔫 ارتقای سلاح '+(ap.weapon===1?'۳۰':ap.weapon===2?'۴۰':ap.weapon===3?'۵۰':'۶۰')+' امتیاز'} function apHitsObstacle(x,y,r,o){const nx=Math.max(o.x-o.w/2,Math.min(x,o.x+o.w/2)),ny=Math.max(o.y-o.h/2,Math.min(y,o.y+o.h/2));return Math.hypot(x-nx,y-ny)apHitsObstacle(nx,ny,e.r,o));if(!blocked){e.x=nx;e.y=ny;continue}const canX=!ap.obstacles.some(o=>apHitsObstacle(e.x+sx,e.y,e.r,o)),canY=!ap.obstacles.some(o=>apHitsObstacle(e.x,e.y+sy,e.r,o));if(canX)e.x+=sx;if(canY)e.y+=sy;if(!canX&&!canY)break}} function apBurst(x,y,color,n=8){for(let i=0;i1.15?2.0:1);p.y+=dy/len*125*dt*(ap.dash>1.15?2.0:1);for(const o of ap.obstacles){const nx=Math.max(o.x-o.w/2,Math.min(p.x,o.x+o.w/2)),ny=Math.max(o.y-o.h/2,Math.min(p.y,o.y+o.h/2));if(Math.hypot(p.x-nx,p.y-ny)<15){p.x=oldX;p.y=oldY;break}}p.x=Math.max(16,Math.min((ap.worldW||w)-16,p.x));p.y=Math.max(16,Math.min((ap.worldH||h)-16,p.y)); if((ap.keys.fire||ap.keys[' '])&&ap.fire<=0){let target=null,bd=1e9;for(const e of ap.enemies){const d=Math.hypot(e.x-p.x,e.y-p.y);if(d=minX&&tx<=maxX&&ty>=minY&&ty<=maxY){blocked=true;break}}if(blocked)break}if(blocked){s.life=0;continue}s.x=nx;s.y=ny;s.life-=dt;c.strokeStyle='#7df9ff';c.lineWidth=3;c.shadowBlur=12;c.shadowColor='#20e7ff';c.beginPath();c.moveTo(s.x-s.vx*.025,s.y-s.vy*.025);c.lineTo(s.x,s.y);c.stroke();c.shadowBlur=0}ap.shots=ap.shots.filter(s=>s.life>0&&s.x>-20&&s.x<(ap.worldW||w)+20&&s.y>-20&&s.y<(ap.worldH||h)+20); // enemies chase the player for(const e of ap.enemies){e.phase+=dt*3;let vx=p.x-e.x,vy=p.y-e.y,l=Math.hypot(vx,vy)||1;const moveX=vx/l*e.speed*dt,moveY=vy/l*e.speed*dt+Math.sin(e.phase)*dt*7;/* Off-screen zombies may pass cover. Once visible, use small swept movement steps and resolve old overlaps so they cannot tunnel into obstacles. */const zombieVisible=e.x+moveX>=camX-18&&e.x+moveX<=camX+w+18&&e.y+moveY>=camY-18&&e.y+moveY<=camY+h+18;apMoveZombie(e,moveX,moveY,zombieVisible);const r=e.r;c.save();c.translate(e.x,e.y);c.shadowBlur=18;c.shadowColor=e.kind==='heavy'?'#ff4e9b':'#8c5cff';c.fillStyle=e.kind==='heavy'?'#ad245e':'#6540b8';c.beginPath();c.arc(0,0,r,0,Math.PI*2);c.fill();c.shadowBlur=0;c.strokeStyle='#bffcff';c.lineWidth=2;c.beginPath();c.arc(0,0,r*.65,0,Math.PI*2);c.stroke();c.fillStyle='#ffefad';c.fillRect(-r*.45,-2,r*.9,4);c.restore();if(Math.hypot(e.x-p.x,e.y-p.y)0){p.shield--;p.inv=.7;apBurst(e.x,e.y,'#75f6ff',12)}else{p.hp-=10;p.inv=.75;apBurst(p.x,p.y,'#ff477e',10)}{const a=Math.random()*Math.PI*2,d=Math.max(w,h)*1.25;e.x=Math.max(24,Math.min((ap.worldW||w)-24,p.x+Math.cos(a)*d));e.y=Math.max(24,Math.min((ap.worldH||h)-24,p.y+Math.sin(a)*d));}apHud()}} // bullet collision for(const s of ap.shots){if(s.life<=0)continue;for(const e of ap.enemies){if(e.hp<=0)continue;if(Math.hypot(e.x-s.x,e.y-s.y)e.hp>0);ap.shots=ap.shots.filter(s=>s.life>0); // Heart pickup: one appears every two completed waves and restores 10 HP, capped at 100 HP. for(const hrt of ap.pickups){const pulse=1+Math.sin(ap.elapsed*5)*.12;c.save();c.font=`${Math.round(24*pulse)}px serif`;c.textAlign='center';c.textBaseline='middle';c.shadowBlur=16;c.shadowColor='#ff4d91';c.fillText('❤️',hrt.x,hrt.y);c.restore();if(p.hp<100&&Math.hypot(hrt.x-p.x,hrt.y-p.y)<34){p.hp=Math.min(100,p.hp+10);hrt.taken=true;apBurst(hrt.x,hrt.y,'#ff6f9f',16);apHud()}}ap.pickups=ap.pickups.filter(h=>!h.taken); // wave advancement and effects if(ap.enemies.length>=1&&ap.enemies.length<=4&&!ap.waveTransition){ap.waveTransition=true;const completedWave=ap.wave;ap.wave=completedWave+1;ap.player.hp=Math.min(100,ap.player.hp+3);ap.credits+=3;if(completedWave%2===0){let hx=p.x+(Math.random()-.5)*360,hy=p.y+(Math.random()-.5)*360;hx=Math.max(40,Math.min((ap.worldW||w)-40,hx));hy=Math.max(40,Math.min((ap.worldH||h)-40,hy));ap.pickups.push({x:hx,y:hy,r:13,taken:false});}const nextWaveCount=apWaveZombieCount(ap.wave);for(let i=0;ib.life>0); // player c.save();c.translate(p.x,p.y);c.globalAlpha=p.inv>0&&Math.floor(ap.elapsed*18)%2===0?.35:1;c.shadowBlur=24;c.shadowColor='#31f5dc';c.fillStyle='#37e7d0';c.beginPath();c.arc(0,0,12,0,Math.PI*2);c.fill();c.shadowBlur=0;c.strokeStyle='#f4ffff';c.lineWidth=2;c.beginPath();c.arc(0,0,7,0,Math.PI*2);c.stroke();c.fillStyle='#fff';c.fillRect(7,-2,9,4);c.restore();c.restore(); // vignette const vg=c.createRadialGradient(w/2,h/2,Math.min(w,h)*.2,w/2,h/2,Math.max(w,h)*.72);vg.addColorStop(0,'rgba(0,0,0,0)');vg.addColorStop(1,'rgba(0,0,0,.45)');c.fillStyle=vg;c.fillRect(0,0,w,h); if(p.hp<=0){apRunning=false;ap.over=true;const coinsEarned=Math.max(0,Math.floor(ap.credits))*2;award(coinsEarned);c.fillStyle='rgba(5,4,18,.82)';c.fillRect(0,0,w,h);c.textAlign='center';c.fillStyle='#ff6eae';c.font='bold 30px Tahoma';c.fillText('GAME OVER',w/2,h*.42);c.fillStyle='#fff';c.font='bold 17px Tahoma';c.fillText('موج '+ap.wave+' · حذف ربات‌ها '+ap.kills,w/2,h*.52);document.getElementById('modalStatus').textContent='پایان بازی';apHud();return}apHud();apRAF=requestAnimationFrame(apFrame)} function closeGame(){document.getElementById('gameCloseBtn').style.display='';stopDuoQuest();stopSoloQuest();document.getElementById('gameModal').style.display='none';unlockLobbyScroll();document.getElementById('playArea').innerHTML='';document.getElementById('playArea').style.cssText='';document.querySelector('#gameModal .modal').classList.remove('strike-modal','city-modal','fighter-modal','quest-modal','neon-phone-modal');clearTimeout(reactionTimer);stopNovaCity();stopApocalypse();clearInterval(starTimer);stopStrike3D();document.querySelector('#gameModal .modal').classList.remove('apoc-modal','neon-phone-modal');render()} // NOVA CITY: lightweight offline pseudo-3D open-city driving game let cityRAF=0,cityCanvas=null,cityCtx=null,cityRunning=false,cityLast=0,cityResize=null; let city={x:0,speed:0,distance:0,money:Number(data.money)||0,mission:0,traffic:[],buildings:[],keys:{left:false,right:false,gas:false,brake:false},steer:0,car:0,elapsed:0}; function stopNovaCity(){if(cityRAF)cancelAnimationFrame(cityRAF);cityRAF=0;cityRunning=false;if(cityResize){window.removeEventListener('resize',cityResize);cityResize=null}window.removeEventListener('keydown',cityKeyDown);window.removeEventListener('keyup',cityKeyUp);cityCanvas=null;cityCtx=null} function startNovaCity(){stopNovaCity();const a=document.getElementById('playArea');city={x:0,speed:0,distance:0,money:Number(data.money)||0,mission:0,traffic:[],buildings:[],keys:{left:false,right:false,gas:false,brake:false},steer:0,car:0,elapsed:0};for(let i=0;i<7;i++)city.traffic.push({x:(Math.random()-.5)*1.45,z:.15+i*.14,color:['#e6bd55','#5b9fe8','#e56e79','#58c8a6'][i%4],type:i%3});for(let i=0;i<18;i++)city.buildings.push({side:i%2?1:-1,z:i/18,color:['#303b53','#46505d','#51435e','#334d53'][i%4],h:.12+Math.random()*.24,w:.07+Math.random()*.1}); a.innerHTML=`
💵 پول: ۰🚘 سرعت: ۰ km/h📍 مأموریت: ۰/۵
`; cityCanvas=document.getElementById('cityCanvas');cityCtx=cityCanvas.getContext('2d');cityRunning=true;cityLast=performance.now();const resize=()=>{if(!cityCanvas)return;const r=cityCanvas.getBoundingClientRect(),d=Math.min(window.devicePixelRatio||1,2);cityCanvas.width=Math.max(1,Math.floor(r.width*d));cityCanvas.height=Math.max(1,Math.floor(r.height*d));cityCtx.setTransform(d,0,0,d,0,0)};resize();cityResize=resize;window.addEventListener('resize',cityResize);window.addEventListener('keydown',cityKeyDown);window.addEventListener('keyup',cityKeyUp); [['cityLeft','left'],['cityRight','right'],['cityGas','gas'],['cityBrake','brake']].forEach(([id,k])=>{const b=document.getElementById(id);const down=e=>{e.preventDefault();city.keys[k]=true},up=e=>{e.preventDefault();city.keys[k]=false};b.addEventListener('pointerdown',down);b.addEventListener('pointerup',up);b.addEventListener('pointercancel',up);b.addEventListener('pointerleave',up)});document.getElementById('cityMissionBtn').onclick=()=>{city.mission=Math.min(5,city.mission+1);award(25);city.money=Number(data.money)||0;cityUpdateHUD();toast(city.mission>=5?'مأموریت تکمیل شد! 🏆':'نشان مأموریت فعال شد؛ حلقه طلایی را پیدا کن!')};document.getElementById('cityCarBtn').onclick=()=>{city.car=(city.car+1)%4;toast(['ماشین اسپرت','ماشین آبی','ماشین قرمز','ماشین سبز'][city.car])};cityRAF=requestAnimationFrame(cityFrame)} function cityKeyDown(e){const k=e.key.toLowerCase();if(['arrowleft','a'].includes(k))city.keys.left=true;if(['arrowright','d'].includes(k))city.keys.right=true;if(['arrowup','w'].includes(k))city.keys.gas=true;if(['arrowdown','s'].includes(k))city.keys.brake=true} function cityKeyUp(e){const k=e.key.toLowerCase();if(['arrowleft','a'].includes(k))city.keys.left=false;if(['arrowright','d'].includes(k))city.keys.right=false;if(['arrowup','w'].includes(k))city.keys.gas=false;if(['arrowdown','s'].includes(k))city.keys.brake=false} function cityPause(){cityRunning=!cityRunning;if(cityRunning){cityLast=performance.now();cityRAF=requestAnimationFrame(cityFrame)}else if(cityRAF){cancelAnimationFrame(cityRAF);cityRAF=0}toast(cityRunning?'رانندگی ادامه دارد':'بازی متوقف شد')} function cityUpdateHUD(){city.money=Number(data.money)||0;const m=document.getElementById('cityMoney'),s=document.getElementById('citySpeed'),q=document.getElementById('cityMission');if(m)m.textContent=city.money.toLocaleString('fa-IR');if(s)s.textContent=Math.round(city.speed*120).toLocaleString('fa-IR');if(q)q.textContent=city.mission+'/۵'} function cityFrame(now){if(!cityRunning||!cityCanvas||!cityCtx)return;const dt=Math.min(.04,(now-cityLast)/1000);cityLast=now;city.elapsed+=dt;city.distance+=dt*(.12+city.speed*.7);if(city.keys.gas)city.speed=Math.min(1,city.speed+dt*.55);else city.speed=Math.max(.22,city.speed-dt*.12);if(city.keys.brake)city.speed=Math.max(0,city.speed-dt*.9);if(city.keys.left)city.x-=dt*(1.25+city.speed*1.25);if(city.keys.right)city.x+=dt*(1.25+city.speed*1.25);city.x=Math.max(-.92,Math.min(.92,city.x));city.steer+=(city.x-city.steer)*Math.min(1,dt*5); const c=cityCtx,w=cityCanvas.clientWidth,h=cityCanvas.clientHeight;c.clearRect(0,0,w,h);let sky=c.createLinearGradient(0,0,0,h*.6);sky.addColorStop(0,'#17243e');sky.addColorStop(.65,'#637b8c');sky.addColorStop(1,'#e7b879');c.fillStyle=sky;c.fillRect(0,0,w,h*.62);c.fillStyle='#f8d88a';c.beginPath();c.arc(w*.77,h*.17,Math.min(w,h)*.055,0,Math.PI*2);c.fill(); // skyline and city blocks for(let i=0;i<13;i++){const bw=w/10,bh=h*(.12+((i*37)%13)/55);c.fillStyle=['#28374b','#34404e','#3e3b50'][i%3];c.fillRect(i*bw,h*.43-bh,bw*.85,bh);for(let yy=h*.43-bh+9;yy{b.z=(b.z+dt*(.07+city.speed*.25))%1;const z=b.z,y=h*.42+z*z*h*.58,x=w*.5+b.side*(w*.2+z*w*.32),bw=(b.w*w)*(.35+z*2.2),bh=(b.h*h)*(.3+z*2.2);c.fillStyle=b.color;c.fillRect(x-bw/2,y-bh,bw,bh);c.fillStyle='#c6b7a0';c.fillRect(x-bw/2,y-bh,bw*.12,bh);for(let yy=y-bh+8;yy{t.z+=dt*(.12+city.speed*.3);if(t.z>1.08){t.z=.08+Math.random()*.2;t.x=(Math.random()-.5)*1.5}const z=t.z,y=h*.43+z*z*h*.54,x=w*.5+t.x*w*.22*z,bw=(w*.032+z*w*.065),bh=(h*.016+z*h*.048);c.fillStyle='#111820';c.fillRect(x-bw*.58,y-bh*.1,bw*1.16,bh*1.12);c.fillStyle=t.color;c.beginPath();c.moveTo(x-bw/2,y-bh*.25);c.lineTo(x-bw*.35,y-bh);c.lineTo(x+bw*.35,y-bh);c.lineTo(x+bw/2,y-bh*.25);c.closePath();c.fill();c.fillStyle='#b8dbe4';c.fillRect(x-bw*.28,y-bh*.82,bw*.56,bh*.34);c.fillStyle='#ff514e';c.fillRect(x-bw*.43,y-bh*.2,bw*.18,bh*.12);c.fillRect(x+bw*.25,y-bh*.2,bw*.18,bh*.12);if(z>.78&&Math.abs(t.x-city.x)<.26&&city.speed>.6){city.speed=Math.max(.25,city.speed-.6*dt);if(Math.random()<.012)toast('مراقب ترافیک باش!')}}); // mission ring in the distance if(city.mission<5){const z=.35+((city.elapsed*.08)%0.55),x=w*.5+Math.sin(city.elapsed*.7)*w*.12,y=h*.43+z*z*h*.45,r=7+z*28;c.strokeStyle='#ffd15c';c.lineWidth=4;c.beginPath();c.ellipse(x,y,r,r*.55,0,0,Math.PI*2);c.stroke();c.fillStyle='#fff2a4';c.font='bold 12px Tahoma';c.textAlign='center';c.fillText('MISSION',x,y-r-8);if(z>.78&&Math.abs(x-(w*.5+city.x*w*.18))💵 پول: $${city.money}❤️ جان: ۱۰۰/۱۰۰🚘 پشت فرمان ۰/۵
${cityShopMessage}
شهر نُوا • جهان‌باز
`; cityCanvas=document.getElementById('cityCanvas');cityCtx=cityCanvas.getContext('2d');cityRunning=true;cityLast=performance.now();const resize=()=>{if(!cityCanvas)return;const r=cityCanvas.getBoundingClientRect(),d=Math.min(window.devicePixelRatio||1,2);cityCanvas.width=Math.max(1,Math.floor(r.width*d));cityCanvas.height=Math.max(1,Math.floor(r.height*d));cityCtx.setTransform(d,0,0,d,0,0)};resize();cityResize=resize;window.addEventListener('resize',cityResize);window.addEventListener('keydown',cityKeyDown);window.addEventListener('keyup',cityKeyUp); [['cityLeft','left'],['cityRight','right'],['cityGas','gas'],['cityBrake','brake']].forEach(([id,k])=>{const b=document.getElementById(id);const down=e=>{e.preventDefault();city.keys[k]=true},up=e=>{e.preventDefault();city.keys[k]=false};b.addEventListener('pointerdown',down);b.addEventListener('pointerup',up);b.addEventListener('pointercancel',up);b.addEventListener('pointerleave',up)}); document.getElementById('cityCamera').onclick=()=>{cityCamera=cityCamera==='third'?'first':'third';cityShopMessage=cityCamera==='first'?'نمای اول‌شخص فعال شد 🎥':'نمای سوم‌شخص فعال شد 🎥';cityBanner()};document.getElementById('cityNight').onclick=()=>{cityNight=!cityNight;cityShopMessage=cityNight?'حالت شب روشن شد 🌙':'حالت روز روشن شد ☀️';cityBanner()};document.getElementById('cityEnter').onclick=()=>{cityMode=cityMode==='drive'?'walk':'drive';city.speed=0;cityShopMessage=cityMode==='walk'?'پیاده شدی؛ اطراف شهر قدم بزن!':'سوار خودرو شدی!';cityUpdateHUD();cityBanner();};document.getElementById('cityInteract').onclick=cityInteract;document.getElementById('cityShowroom').onclick=cityShowroom;document.getElementById('cityClothes').onclick=cityClothes;document.getElementById('cityHome').onclick=cityHome;document.getElementById('cityTune').onclick=cityTune;cityRAF=requestAnimationFrame(cityFrame)} function cityBanner(){let b=document.getElementById('cityBanner');if(b)b.textContent=cityShopMessage;let l=document.getElementById('cityModeLabel');if(l)l.textContent=cityMode==='drive'?'پشت فرمان':'پیاده';} function cityInteract(){if(cityMode==='drive'){cityShopMessage='برای ورود به فروشگاه‌ها اول پیاده شو!';cityBanner();return}cityShopMessage='نزدیک مرکز شهر هستی؛ نمایشگاه، خانه و فروشگاه‌ها از دکمه‌های پایین در دسترس‌اند.';cityBanner();award(10);city.money=Number(data.money)||0;citySave();cityUpdateHUD()} function cityShowroom(){let options=cityCars.map((c,i)=>`${i+1}. ${c.name} — ${c.price.toLocaleString('fa-IR')} دلار ${cityOwned.includes(i)?'(مالک هستی)':''}`).join('\n');let pick=prompt('🏎️ نمایشگاه نُوا\nپولت: $'+city.money+'\n'+options+'\n\nشماره ماشین را وارد کن تا انتخاب/خرید شود:');let i=Number(pick)-1;if(!Number.isInteger(i)||i<0||i>=cityCars.length)return;let car=cityCars[i];if(!cityOwned.includes(i)){if(city.money=cost){window.NOVA_setCoins((Number(data.money)||0)-cost);city.money=Number(data.money)||0;cityHomeLevel++;cityShopMessage='خانه‌ات ارتقا پیدا کرد! سطح '+cityHomeLevel+' 🏠'}else cityShopMessage='خانه شخصی سطح '+cityHomeLevel+'؛ برای ارتقا $'+cost+' لازم داری. خانه‌ات جای امن و محل ذخیره است.';citySave();cityUpdateHUD();cityBanner();toast(cityShopMessage)} function cityTune(){let cost=800+cityTuned*600;if(city.money>=cost){window.NOVA_setCoins((Number(data.money)||0)-cost);city.money=Number(data.money)||0;cityTuned++;cityShopMessage='تیونینگ انجام شد! موتور و هندلینگ بهتر شد 🔧'}else cityShopMessage='ارتقای بعدی موتور/رنگ/هندلینگ $'+cost+' هزینه دارد.';citySave();cityUpdateHUD();cityBanner();toast(cityShopMessage)} function cityKeyDown(e){const k=e.key.toLowerCase();if(['arrowleft','a'].includes(k))city.keys.left=true;if(['arrowright','d'].includes(k))city.keys.right=true;if(['arrowup','w'].includes(k))city.keys.gas=true;if(['arrowdown','s'].includes(k))city.keys.brake=true;if(k==='e'){cityMode=cityMode==='drive'?'walk':'drive';city.speed=0;cityBanner()}} function cityKeyUp(e){const k=e.key.toLowerCase();if(['arrowleft','a'].includes(k))city.keys.left=false;if(['arrowright','d'].includes(k))city.keys.right=false;if(['arrowup','w'].includes(k))city.keys.gas=false;if(['arrowdown','s'].includes(k))city.keys.brake=false} function cityPause(){cityRunning=!cityRunning;if(cityRunning){cityLast=performance.now();cityRAF=requestAnimationFrame(cityFrame)}else if(cityRAF){cancelAnimationFrame(cityRAF);cityRAF=0}toast(cityRunning?'رانندگی ادامه دارد':'بازی متوقف شد')} function cityUpdateHUD(){city.money=Number(data.money)||0;const m=document.getElementById('cityMoney'),q=document.getElementById('cityMission'),hp=document.getElementById('cityHealth');if(m)m.textContent=Math.floor(city.money).toLocaleString('fa-IR');if(q)q.textContent=(city.mission||0)+'/۵';if(hp)hp.textContent=Math.max(0,city.hp??100).toLocaleString('fa-IR');cityBanner()} function cityFrame(now){if(!cityRunning||!cityCanvas||!cityCtx)return;const dt=Math.min(.04,(now-cityLast)/1000);cityLast=now;city.elapsed+=dt;if(city.gameOver){cityRAF=requestAnimationFrame(cityFrame);return}city.hitCooldown=Math.max(0,(city.hitCooldown||0)-dt);city.incomeTimer=(city.incomeTimer||0)+dt;if(city.incomeTimer>=8){city.incomeTimer-=8;award(25);city.money=Number(data.money)||0;citySave();cityUpdateHUD();cityShopMessage='💰 ۲۵ دلار دریافت کردی!';cityBanner()}let car=cityCars[city.car||0];if(cityMode==='drive'){if(city.keys.gas)city.speed=Math.min(.99,city.speed+dt*(.42+cityTuned*.025));else city.speed=Math.max(0,city.speed-dt*.08);if(city.keys.brake)city.speed=Math.max(-.25,city.speed-dt*.65);if(city.keys.left)city.x-=dt*(1.05+Math.abs(city.speed)*.95);if(city.keys.right)city.x+=dt*(1.05+Math.abs(city.speed)*.95);city.distance+=Math.abs(city.speed)*dt;if(city.distance>4){city.distance=0;award(15);city.money=Number(data.money)||0;city.mission=Math.min(5,city.mission+1);citySave()} }else{city.speed=0;if(city.keys.gas)cityPlayer.y+=dt*.5;if(city.keys.brake)cityPlayer.y-=dt*.5;if(city.keys.left)cityPlayer.x-=dt*.5;if(city.keys.right)cityPlayer.x+=dt*.5;cityPlayer.x=Math.max(-1,Math.min(1,cityPlayer.x));cityPlayer.y=Math.max(-1,Math.min(1,cityPlayer.y));} city.x=Math.max(-.92,Math.min(.92,city.x));const c=cityCtx,w=cityCanvas.clientWidth,h=cityCanvas.clientHeight;c.clearRect(0,0,w,h);let sky=c.createLinearGradient(0,0,0,h*.62);sky.addColorStop(0,cityNight?'#030612':'#101a36');sky.addColorStop(.48,cityNight?'#182747':'#5c6f91');sky.addColorStop(1,cityNight?'#29334c':'#f0a76c');c.fillStyle=sky;c.fillRect(0,0,w,h*.62);c.fillStyle=cityNight?'#e8edff':'#ffe0a0';c.beginPath();c.arc(w*(cityNight?.18:.78),h*.16,Math.min(w,h)*.055,0,Math.PI*2);c.fill();if(cityNight){for(let si=0;si<45;si++){c.fillStyle='#fff8c8';c.fillRect((si*73%Math.floor(w)),(si*31%Math.floor(h*.36)),1.5,1.5)}} // cinematic skyline: layered towers, glowing windows and neon shop signs for(let layer=0;layer<2;layer++){ for(let i=0;i<24;i++){ const bw=w/(layer===0?15:19),xx=((i*(layer===0?67:53)+layer*29)%Math.ceil(w+bw))-bw; const bh=h*((layer===0?.10:.14)+((i*37+layer*11)%17)/(layer===0?90:58)); const top=h*.445-bh; c.fillStyle=cityNight?['#10172a','#151a30','#211a31','#12252c'][((i+layer)%4)]:['#28374d','#37445a','#51415b','#36545a'][((i+layer)%4)]; c.fillRect(xx,top,bw*.9,bh); c.fillStyle=cityNight?'#8da7d8':'#a8b9c8';c.globalAlpha=.22;c.fillRect(xx+bw*.08,top,bw*.08,bh);c.globalAlpha=1; for(let yy=top+8;yy{t.z+=dt*(.09+Math.abs(city.speed)*.25);if(t.z>1.05){t.z=.08+Math.random()*.18;t.x=(Math.random()-.5)*1.5}let z=t.z,y=h*.43+z*z*h*.54,x=w*.5+t.x*w*.19*z,bw=Math.min(w*(.018+z*.052),42),bh=Math.min(h*(.012+z*.042),34);c.fillStyle='#11151d';c.fillRect(x-bw*.6,y-bh*.1,bw*1.2,bh);c.fillStyle=t.color;c.beginPath();c.moveTo(x-bw/2,y);c.lineTo(x-bw*.35,y-bh);c.lineTo(x+bw*.35,y-bh);c.lineTo(x+bw/2,y);c.closePath();c.fill();c.fillStyle='#bce7f4';c.fillRect(x-bw*.25,y-bh*.78,bw*.5,bh*.3);c.fillStyle='#ff5555';c.fillRect(x-bw*.42,y-bh*.13,bw*.15,bh*.1);c.fillRect(x+bw*.27,y-bh*.13,bw*.15,bh*.1)}); // collisions with cars or pedestrians reduce health, with a short cooldown if(cityMode==='drive'&&city.hitCooldown<=0&&Math.abs(city.speed)>.08){let hitCar=city.traffic.some(t=>t.z>.78&&Math.abs(t.x-city.x)<.28);let hitPerson=city.pedestrians.some(p=>p.z>.78&&Math.abs(p.side*.78+ p.x*.035-city.x)<.24);if(hitCar||hitPerson){city.hp=Math.max(0,(city.hp??100)-10);city.hitCooldown=1.0;cityShopMessage=city.hp<=0?'💔 تمام جانت تمام شد! بازی را دوباره شروع کن.':'💥 تصادف کردی! ۱۰ جان کم شد.';cityUpdateHUD();if(city.hp<=0){city.gameOver=true;city.speed=0;toast('جان تمام شد! از «شروع دوباره» استفاده کن.')}else toast(cityShopMessage)}} // pedestrians moving along sidewalks city.pedestrians.forEach(p=>{p.walk+=dt*(.8+Math.abs(city.speed));p.z+=dt*(.018+Math.abs(city.speed)*.06);if(p.z>1.02){p.z=.08+Math.random()*.2;p.x=(Math.random()-.5)*1.7}let z=p.z,py=h*.43+z*z*h*.55,px=w*.5+p.side*(w*.225+z*w*.285)+p.x*w*.035*z,sz=(h*.009+h*.024*z);c.fillStyle='#101018';c.beginPath();c.ellipse(px,py+sz*1.8,sz*.6,sz*.18,0,0,Math.PI*2);c.fill();c.fillStyle=p.color;c.fillRect(px-sz*.32,py-sz*.2,sz*.64,sz*1.15);c.fillStyle='#d8ae8c';c.beginPath();c.arc(px,py-sz*.45,sz*.32,0,Math.PI*2);c.fill();c.strokeStyle='#1b1c26';c.lineWidth=Math.max(1,sz*.18);c.beginPath();c.moveTo(px-sz*.13,py+sz*.9);c.lineTo(px-sz*.2+Math.sin(p.walk)*sz*.15,py+sz*1.6);c.moveTo(px+sz*.13,py+sz*.9);c.lineTo(px+sz*.2-Math.sin(p.walk)*sz*.15,py+sz*1.6);c.stroke()}); // player vehicle or walking avatar if(cityMode==='drive'&&cityCamera==='first'){let dashY=h*.79;c.fillStyle='#090d16';c.beginPath();c.moveTo(0,h);c.lineTo(0,dashY+h*.04);c.quadraticCurveTo(w*.5,dashY-h*.12,w,dashY+h*.04);c.lineTo(w,h);c.closePath();c.fill();c.fillStyle='#272d3a';c.fillRect(w*.08,h*.88,w*.84,h*.035);c.fillStyle=cityCars[city.car||0].color;c.fillRect(w*.39,h*.91,w*.22,h*.04);c.fillStyle='#91e8ff';c.beginPath();c.arc(w*.5,h*.9,Math.min(w,h)*.045,Math.PI,Math.PI*2);c.fill();c.fillStyle='#fff';c.font='bold 12px Tahoma';c.textAlign='center';c.fillText('نمای راننده • '+cityCars[city.car||0].name,w*.5,h*.86)}else if(cityMode==='drive'){let px=w*.5+city.x*w*.14,py=h*.845,cw=Math.min(w*(car.name.includes('لامبور')?.145:.135),82)*(1+cityTuned*.012),ch=Math.min(h*.155,62);c.fillStyle='#070a10';c.fillRect(px-cw*.58,py-ch*.23,cw*1.16,ch*.72);c.fillStyle=car.color;c.beginPath();c.moveTo(px-cw*.48,py);c.lineTo(px-cw*.42,py-ch*.55);c.lineTo(px-cw*.25,py-ch*.9);c.lineTo(px+cw*.25,py-ch*.9);c.lineTo(px+cw*.42,py-ch*.55);c.lineTo(px+cw*.48,py);c.closePath();c.fill();c.fillStyle='#aee3ef';c.beginPath();c.moveTo(px-cw*.29,py-ch*.59);c.lineTo(px-cw*.18,py-ch*.82);c.lineTo(px+cw*.18,py-ch*.82);c.lineTo(px+cw*.29,py-ch*.59);c.closePath();c.fill();c.fillStyle='#ff454d';c.fillRect(px-cw*.4,py-ch*.18,cw*.14,ch*.09);c.fillRect(px+cw*.26,py-ch*.18,cw*.14,ch*.09);c.fillStyle='#08090b';c.fillRect(px-cw*.54,py-ch*.22,cw*.13,ch*.28);c.fillRect(px+cw*.41,py-ch*.22,cw*.13,ch*.28);c.fillStyle='#fff';c.font='bold 11px Tahoma';c.textAlign='center';c.fillText(car.name,px,py+14)}else{let px=w*.5+cityPlayer.x*w*.2,py=h*.82-cityPlayer.y*h*.08,sz=Math.min(w,h)*.045;c.fillStyle='#121018';c.beginPath();c.ellipse(px,py+sz*1.5,sz*.8,sz*.28,0,0,Math.PI*2);c.fill();c.fillStyle=['#9e69ff','#27272c','#49b7c9','#e9c8a2','#f15c87'][cityOutfit];c.fillRect(px-sz*.42,py,sz*.84,sz*1.2);c.fillStyle='#d8a77f';c.beginPath();c.arc(px,py-sz*.35,sz*.38,0,Math.PI*2);c.fill();c.fillStyle='#25232d';c.fillRect(px-sz*.42,py+sz*.98,sz*.3,sz*.6);c.fillRect(px+sz*.12,py+sz*.98,sz*.3,sz*.6);c.fillStyle='#fff';c.font='bold 11px Tahoma';c.textAlign='center';c.fillText('تو',px,py-sz*.9)} cityUpdateHUD();cityRAF=requestAnimationFrame(cityFrame)} function unlockLab(){if(document.getElementById('adminCode').value.trim()==='NOVA-ADMIN-77'){data.lab=true;persist();document.getElementById('labTools').classList.remove('hide');toast('آزمایشگاه باز شد')}else toast('کد دسترسی درست نیست')} function applyPower(){if(!data.lab){toast('اول آزمایشگاه رو باز کن');return}const p=document.getElementById('power').value,map={coins:'COINS = INFINITY // حالت آزمایشی',ammo:'AMMO = INFINITY // حالت آزمایشی',health:'HEALTH = MAX // حالت آزمایشی',speed:'PLAYER_SPEED = 2.0x // حالت آزمایشی'};document.getElementById('powerResult').textContent='✓ قابلیت انتخاب شد\n'+map[p]+'\nاین دستور نمایشی است و به بازی‌های دیگر دسترسی ندارد.';toast('قابلیت نمایشی فعال شد')} function askAI(){const q=document.getElementById('aiPrompt').value.trim();if(!q){toast('اول درخواستت رو بنویس');return}const r=document.getElementById('aiResult');r.style.display='block';r.textContent='پیشنهاد برای بازی خودت:\n۱) قابلیت را در حالت توسعه فعال کن.\n۲) مقدار را در متغیر قابل تنظیم قرار بده.\n۳) برای تست کلید روشن/خاموش اضافه کن.\n\nدرخواست تو: '+q+'\n\nاین دستیار آفلاین و نمایشی است.'} function logoutAccount(){try{const savedAccounts=JSON.parse(localStorage.getItem(ACCOUNTS_KEY)||'{}')||{};const savedUser=localStorage.getItem(ACTIVE_KEY);if(!activeUser&&savedUser&&savedAccounts[savedUser]){accounts=savedAccounts;activeUser=savedUser;data={...data,...(savedAccounts[savedUser].data||{})}}}catch(e){}if(activeUser){if(!confirm('از حسابت خارج شوی؟ پیشرفت و سکه‌هایت ذخیره می‌مانند.'))return;try{if(accounts[activeUser]){accounts[activeUser].data=JSON.parse(JSON.stringify(data));localStorage.setItem(ACCOUNTS_KEY,JSON.stringify(accounts))}}catch(e){}}try{localStorage.removeItem(ACTIVE_KEY)}catch(e){}activeUser=null;data={profile:null,games:[],telegram:'@YourChannel',lab:false,money:0,minutes:0};accountMode='login';document.getElementById('gateTitle').textContent='ورود به اکانت نُوا';document.getElementById('gateSub').textContent='نام کاربری و رمز اکانتت را وارد کن.';document.getElementById('registerExtra').classList.add('hide');document.getElementById('accountAction').textContent='ورود به بازی 🎮';document.getElementById('accountSwitch').textContent='اکانت ندارم؛ ثبت‌نام';document.getElementById('accountPassword').setAttribute('autocomplete','current-password');document.getElementById('accountUsername').value='';document.getElementById('accountPassword').value='';document.getElementById('profileGate').classList.remove('hide');toast('از حساب خارج شدی؛ برای ورود دوباره نام کاربری و رمزت را وارد کن')} async function changeAccountPassword(){if(!activeUser||!accounts[activeUser]){toast('اول وارد حسابت شو');return}const current=document.getElementById('currentPasswordChange').value,newPass=document.getElementById('newPasswordChange').value,confirmPass=document.getElementById('confirmPasswordChange').value;if(!current||!newPass||!confirmPass){toast('همه فیلدها را کامل کن');return}if((await passwordHash(activeUser,current))!==accounts[activeUser].passwordHash){toast('رمز فعلی اشتباه است');return}if(newPass.length<6){toast('رمز جدید باید حداقل ۶ حرف باشد');return}if(newPass!==confirmPass){toast('تکرار رمز جدید مطابقت ندارد');return}accounts[activeUser].passwordHash=await passwordHash(activeUser,newPass);try{localStorage.setItem(ACCOUNTS_KEY,JSON.stringify(accounts));document.getElementById('currentPasswordChange').value='';document.getElementById('newPasswordChange').value='';document.getElementById('confirmPasswordChange').value='';toast('رمز عبور با موفقیت تغییر کرد')}catch(e){toast('ذخیره رمز جدید ناموفق بود')}} function formatTotalPlayTime(minutes){minutes=Math.max(0,Math.floor(Number(minutes)||0));const hours=Math.floor(minutes/60),mins=minutes%60;if(hours>0)return hours.toLocaleString('fa-IR')+' ساعت و '+mins.toLocaleString('fa-IR')+' دقیقه';return mins.toLocaleString('fa-IR')+' دقیقه'} function updateTotalPlayTimeSetting(){const el=document.getElementById('totalPlayTimeSetting');if(el)el.textContent=formatTotalPlayTime(data.minutes||0)} function fillSettings(){if(data.profile){document.getElementById('settingName').value=data.profile.name||'';document.getElementById('settingAge').value=data.profile.age||'';document.getElementById('settingSource').value=data.profile.source||''}updateTotalPlayTimeSetting()} // Accumulate active time while this page is visible; save it once per minute. let novaActiveMinuteMs=0,novaLastTick=Date.now();setInterval(()=>{const now=Date.now(),elapsed=Math.max(0,Math.min(120000,now-novaLastTick));novaLastTick=now;if(document.visibilityState==='visible'&&!document.getElementById('profileGate').classList.contains('hide')){novaActiveMinuteMs+=elapsed;if(novaActiveMinuteMs>=60000){const add=Math.floor(novaActiveMinuteMs/60000);novaActiveMinuteMs%=60000;data.minutes=(Number(data.minutes)||0)+add;persist();const stat=document.getElementById('timeStat');if(stat)stat.textContent=(data.minutes||0).toLocaleString('fa-IR')+' دقیقه';updateTotalPlayTimeSetting()}}},1000);document.addEventListener('visibilitychange',()=>{novaLastTick=Date.now()}); function saveProfile(){const name=document.getElementById('settingName').value.trim(),age=Number(document.getElementById('settingAge').value),source=document.getElementById('settingSource').value.trim();if(!name||!age){toast('نام و سن رو وارد کن');return}data.profile={name,age,source};persist();render();toast('پروفایل ذخیره شد')} function resetStats(){if(!confirm('آمار و بازی‌های ذخیره‌شده پاک شوند؟'))return;data.games=[];data.money=0;data.minutes=0;persist();render();toast('آمار صفر شد')} if(data.lab)document.getElementById('labTools').classList.remove('hide');if(activeUser&&accounts[activeUser]&&data.profile){document.getElementById('profileGate').classList.add('hide')}else{document.getElementById('profileGate').classList.remove('hide');if(data.profile&&!activeUser){document.getElementById('firstName').value=data.profile.name||'';document.getElementById('firstAge').value=data.profile.age||'';document.getElementById('firstSource').value=data.profile.source||''}}render();