UNPKG

@agi-cli/web-ui

Version:

Embeddable web UI for AGI CLI - pre-built static assets

27 lines (22 loc) 2.27 MB
import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Embedded assets map - populated at build time const EMBEDDED_ASSETS = new Map(); function normalizeBasePath(prefix) { const trimmed = prefix.trim(); if (!trimmed || trimmed === '/') { return '/'; } const withLeadingSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`; const withoutTrailingSlash = withLeadingSlash.replace(/\/+$/, ''); return withoutTrailingSlash || '/'; } function injectRuntimeConfig(html, serverUrl, basePath) { const runtimeScript = `<!-- AGI Server URL: ${serverUrl} --><script>window.AGI_SERVER_URL = ${JSON.stringify(serverUrl)};window.AGI_ROUTER_BASEPATH = ${JSON.stringify(basePath)};</script>`; return html.replace('</head>', `${runtimeScript}</head>`); } // Populate embedded assets EMBEDDED_ASSETS.set("/index.html", { content: "PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIiBjbGFzcz0iZGFyayI+CiAgPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxsaW5rIHJlbD0iaWNvbiIgdHlwZT0iaW1hZ2Uvc3ZnK3htbCIgaHJlZj0iL3ZpdGUuc3ZnIiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPW5vLCB2aWV3cG9ydC1maXQ9Y292ZXIiIC8+CiAgICA8bWV0YSBuYW1lPSJtb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiIC8+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiIC8+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1zdGF0dXMtYmFyLXN0eWxlIiBjb250ZW50PSJibGFjay10cmFuc2x1Y2VudCIgLz4KICAgIDx0aXRsZT5Mb2FkaW5nLi4uPC90aXRsZT4KICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbiBzcmM9Ii9hc3NldHMvaW5kZXgtRDlpWTRUYkQuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBjcm9zc29yaWdpbiBocmVmPSIvYXNzZXRzL2luZGV4LUNxbEhVVHB0LmNzcyI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0icm9vdCI+PC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==", contentType: "text/html" }); EMBEDDED_ASSETS.set("/assets/index-D9iY4TbD.js", { content: "KGZ1bmN0aW9uKCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIikucmVsTGlzdDtpZih0JiZ0LnN1cHBvcnRzJiZ0LnN1cHBvcnRzKCJtb2R1bGVwcmVsb2FkIikpcmV0dXJuO2Zvcihjb25zdCBzIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbcmVsPSJtb2R1bGVwcmVsb2FkIl0nKSlpKHMpO25ldyBNdXRhdGlvbk9ic2VydmVyKHM9Pntmb3IoY29uc3QgbCBvZiBzKWlmKGwudHlwZT09PSJjaGlsZExpc3QiKWZvcihjb25zdCBjIG9mIGwuYWRkZWROb2RlcyljLnRhZ05hbWU9PT0iTElOSyImJmMucmVsPT09Im1vZHVsZXByZWxvYWQiJiZpKGMpfSkub2JzZXJ2ZShkb2N1bWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KTtmdW5jdGlvbiBuKHMpe2NvbnN0IGw9e307cmV0dXJuIHMuaW50ZWdyaXR5JiYobC5pbnRlZ3JpdHk9cy5pbnRlZ3JpdHkpLHMucmVmZXJyZXJQb2xpY3kmJihsLnJlZmVycmVyUG9saWN5PXMucmVmZXJyZXJQb2xpY3kpLHMuY3Jvc3NPcmlnaW49PT0idXNlLWNyZWRlbnRpYWxzIj9sLmNyZWRlbnRpYWxzPSJpbmNsdWRlIjpzLmNyb3NzT3JpZ2luPT09ImFub255bW91cyI/bC5jcmVkZW50aWFscz0ib21pdCI6bC5jcmVkZW50aWFscz0ic2FtZS1vcmlnaW4iLGx9ZnVuY3Rpb24gaShzKXtpZihzLmVwKXJldHVybjtzLmVwPSEwO2NvbnN0IGw9bihzKTtmZXRjaChzLmhyZWYsbCl9fSkoKTt2YXIgZ3U9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp7fTtmdW5jdGlvbiBCdShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfXZhciBiaD17ZXhwb3J0czp7fX0sSnM9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24uanMKICoKICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIHh4O2Z1bmN0aW9uIEcyKCl7aWYoeHgpcmV0dXJuIEpzO3h4PTE7dmFyIGU9U3ltYm9sLmZvcigicmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQiKSx0PVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50Iik7ZnVuY3Rpb24gbihpLHMsbCl7dmFyIGM9bnVsbDtpZihsIT09dm9pZCAwJiYoYz0iIitsKSxzLmtleSE9PXZvaWQgMCYmKGM9IiIrcy5rZXkpLCJrZXkiaW4gcyl7bD17fTtmb3IodmFyIG8gaW4gcylvIT09ImtleSImJihsW29dPXNbb10pfWVsc2UgbD1zO3JldHVybiBzPWwucmVmLHskJHR5cGVvZjplLHR5cGU6aSxrZXk6YyxyZWY6cyE9PXZvaWQgMD9zOm51bGwscHJvcHM6bH19cmV0dXJuIEpzLkZyYWdtZW50PXQsSnMuanN4PW4sSnMuanN4cz1uLEpzfXZhciB3eDtmdW5jdGlvbiBWMigpe3JldHVybiB3eHx8KHd4PTEsYmguZXhwb3J0cz1HMigpKSxiaC5leHBvcnRzfXZhciBUPVYyKCkseWg9e2V4cG9ydHM6e319LExlPXt9Oy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC5wcm9kdWN0aW9uLmpzCiAqCiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBDeDtmdW5jdGlvbiBXMigpe2lmKEN4KXJldHVybiBMZTtDeD0xO3ZhciBlPVN5bWJvbC5mb3IoInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50IiksdD1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxuPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksaT1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLHM9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxsPVN5bWJvbC5mb3IoInJlYWN0LmNvbnN1bWVyIiksYz1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0Iiksbz1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLGQ9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSxoPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxwPVN5bWJvbC5mb3IoInJlYWN0LmxhenkiKSxmPVN5bWJvbC5mb3IoInJlYWN0LmFjdGl2aXR5IiksZz1TeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gYihCKXtyZXR1cm4gQj09PW51bGx8fHR5cGVvZiBCIT0ib2JqZWN0Ij9udWxsOihCPWcmJkJbZ118fEJbIkBAaXRlcmF0b3IiXSx0eXBlb2YgQj09ImZ1bmN0aW9uIj9COm51bGwpfXZhciB4PXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxFPU9iamVjdC5hc3NpZ24seT17fTtmdW5jdGlvbiBTKEIsSCxQKXt0aGlzLnByb3BzPUIsdGhpcy5jb250ZXh0PUgsdGhpcy5yZWZzPXksdGhpcy51cGRhdGVyPVB8fHh9Uy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxTLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihCLEgpe2lmKHR5cGVvZiBCIT0ib2JqZWN0IiYmdHlwZW9mIEIhPSJmdW5jdGlvbiImJkIhPW51bGwpdGhyb3cgRXJyb3IoInRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxCLEgsInNldFN0YXRlIil9LFMucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKEIpe3RoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyxCLCJmb3JjZVVwZGF0ZSIpfTtmdW5jdGlvbiB2KCl7fXYucHJvdG90eXBlPVMucHJvdG90eXBlO2Z1bmN0aW9uIF8oQixILFApe3RoaXMucHJvcHM9Qix0aGlzLmNvbnRleHQ9SCx0aGlzLnJlZnM9eSx0aGlzLnVwZGF0ZXI9UHx8eH12YXIgQz1fLnByb3RvdHlwZT1uZXcgdjtDLmNvbnN0cnVjdG9yPV8sRShDLFMucHJvdG90eXBlKSxDLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwO3ZhciBOPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gUigpe312YXIgTz17SDpudWxsLEE6bnVsbCxUOm51bGwsUzpudWxsfSxrPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gSShCLEgsUCl7dmFyIGVlPVAucmVmO3JldHVybnskJHR5cGVvZjplLHR5cGU6QixrZXk6SCxyZWY6ZWUhPT12b2lkIDA/ZWU6bnVsbCxwcm9wczpQfX1mdW5jdGlvbiBNKEIsSCl7cmV0dXJuIEkoQi50eXBlLEgsQi5wcm9wcyl9ZnVuY3Rpb24gVShCKXtyZXR1cm4gdHlwZW9mIEI9PSJvYmplY3QiJiZCIT09bnVsbCYmQi4kJHR5cGVvZj09PWV9ZnVuY3Rpb24geihCKXt2YXIgSD17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIitCLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihQKXtyZXR1cm4gSFtQXX0pfXZhciBqPS9cLysvZztmdW5jdGlvbiBHKEIsSCl7cmV0dXJuIHR5cGVvZiBCPT0ib2JqZWN0IiYmQiE9PW51bGwmJkIua2V5IT1udWxsP3ooIiIrQi5rZXkpOkgudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIEsoQil7c3dpdGNoKEIuc3RhdHVzKXtjYXNlImZ1bGZpbGxlZCI6cmV0dXJuIEIudmFsdWU7Y2FzZSJyZWplY3RlZCI6dGhyb3cgQi5yZWFzb247ZGVmYXVsdDpzd2l0Y2godHlwZW9mIEIuc3RhdHVzPT0ic3RyaW5nIj9CLnRoZW4oUixSKTooQi5zdGF0dXM9InBlbmRpbmciLEIudGhlbihmdW5jdGlvbihIKXtCLnN0YXR1cz09PSJwZW5kaW5nIiYmKEIuc3RhdHVzPSJmdWxmaWxsZWQiLEIudmFsdWU9SCl9LGZ1bmN0aW9uKEgpe0Iuc3RhdHVzPT09InBlbmRpbmciJiYoQi5zdGF0dXM9InJlamVjdGVkIixCLnJlYXNvbj1IKX0pKSxCLnN0YXR1cyl7Y2FzZSJmdWxmaWxsZWQiOnJldHVybiBCLnZhbHVlO2Nhc2UicmVqZWN0ZWQiOnRocm93IEIucmVhc29ufX10aHJvdyBCfWZ1bmN0aW9uIFcoQixILFAsZWUsbGUpe3ZhciBjZT10eXBlb2YgQjsoY2U9PT0idW5kZWZpbmVkInx8Y2U9PT0iYm9vbGVhbiIpJiYoQj1udWxsKTt2YXIgWD0hMTtpZihCPT09bnVsbClYPSEwO2Vsc2Ugc3dpdGNoKGNlKXtjYXNlImJpZ2ludCI6Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpYPSEwO2JyZWFrO2Nhc2Uib2JqZWN0Ijpzd2l0Y2goQi4kJHR5cGVvZil7Y2FzZSBlOmNhc2UgdDpYPSEwO2JyZWFrO2Nhc2UgcDpyZXR1cm4gWD1CLl9pbml0LFcoWChCLl9wYXlsb2FkKSxILFAsZWUsbGUpfX1pZihYKXJldHVybiBsZT1sZShCKSxYPWVlPT09IiI/Ii4iK0coQiwwKTplZSxOKGxlKT8oUD0iIixYIT1udWxsJiYoUD1YLnJlcGxhY2UoaiwiJCYvIikrIi8iKSxXKGxlLEgsUCwiIixmdW5jdGlvbihoZSl7cmV0dXJuIGhlfSkpOmxlIT1udWxsJiYoVShsZSkmJihsZT1NKGxlLFArKGxlLmtleT09bnVsbHx8QiYmQi5rZXk9PT1sZS5rZXk/IiI6KCIiK2xlLmtleSkucmVwbGFjZShqLCIkJi8iKSsiLyIpK1gpKSxILnB1c2gobGUpKSwxO1g9MDt2YXIgJD1lZT09PSIiPyIuIjplZSsiOiI7aWYoTihCKSlmb3IodmFyIGllPTA7aWU8Qi5sZW5ndGg7aWUrKyllZT1CW2llXSxjZT0kK0coZWUsaWUpLFgrPVcoZWUsSCxQLGNlLGxlKTtlbHNlIGlmKGllPWIoQiksdHlwZW9mIGllPT0iZnVuY3Rpb24iKWZvcihCPWllLmNhbGwoQiksaWU9MDshKGVlPUIubmV4dCgpKS5kb25lOyllZT1lZS52YWx1ZSxjZT0kK0coZWUsaWUrKyksWCs9VyhlZSxILFAsY2UsbGUpO2Vsc2UgaWYoY2U9PT0ib2JqZWN0Iil7aWYodHlwZW9mIEIudGhlbj09ImZ1bmN0aW9uIilyZXR1cm4gVyhLKEIpLEgsUCxlZSxsZSk7dGhyb3cgSD1TdHJpbmcoQiksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisoSD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKEIpLmpvaW4oIiwgIikrIn0iOkgpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIil9cmV0dXJuIFh9ZnVuY3Rpb24gSihCLEgsUCl7aWYoQj09bnVsbClyZXR1cm4gQjt2YXIgZWU9W10sbGU9MDtyZXR1cm4gVyhCLGVlLCIiLCIiLGZ1bmN0aW9uKGNlKXtyZXR1cm4gSC5jYWxsKFAsY2UsbGUrKyl9KSxlZX1mdW5jdGlvbiBRKEIpe2lmKEIuX3N0YXR1cz09PS0xKXt2YXIgSD1CLl9yZXN1bHQ7SD1IKCksSC50aGVuKGZ1bmN0aW9uKFApeyhCLl9zdGF0dXM9PT0wfHxCLl9zdGF0dXM9PT0tMSkmJihCLl9zdGF0dXM9MSxCLl9yZXN1bHQ9UCl9LGZ1bmN0aW9uKFApeyhCLl9zdGF0dXM9PT0wfHxCLl9zdGF0dXM9PT0tMSkmJihCLl9zdGF0dXM9MixCLl9yZXN1bHQ9UCl9KSxCLl9zdGF0dXM9PT0tMSYmKEIuX3N0YXR1cz0wLEIuX3Jlc3VsdD1IKX1pZihCLl9zdGF0dXM9PT0xKXJldHVybiBCLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBCLl9yZXN1bHR9dmFyIEY9dHlwZW9mIHJlcG9ydEVycm9yPT0iZnVuY3Rpb24iP3JlcG9ydEVycm9yOmZ1bmN0aW9uKEIpe2lmKHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ0eXBlb2Ygd2luZG93LkVycm9yRXZlbnQ9PSJmdW5jdGlvbiIpe3ZhciBIPW5ldyB3aW5kb3cuRXJyb3JFdmVudCgiZXJyb3IiLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsbWVzc2FnZTp0eXBlb2YgQj09Im9iamVjdCImJkIhPT1udWxsJiZ0eXBlb2YgQi5tZXNzYWdlPT0ic3RyaW5nIj9TdHJpbmcoQi5tZXNzYWdlKTpTdHJpbmcoQiksZXJyb3I6Qn0pO2lmKCF3aW5kb3cuZGlzcGF0Y2hFdmVudChIKSlyZXR1cm59ZWxzZSBpZih0eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLmVtaXQ9PSJmdW5jdGlvbiIpe3Byb2Nlc3MuZW1pdCgidW5jYXVnaHRFeGNlcHRpb24iLEIpO3JldHVybn1jb25zb2xlLmVycm9yKEIpfSxMPXttYXA6Sixmb3JFYWNoOmZ1bmN0aW9uKEIsSCxQKXtKKEIsZnVuY3Rpb24oKXtILmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sUCl9LGNvdW50OmZ1bmN0aW9uKEIpe3ZhciBIPTA7cmV0dXJuIEooQixmdW5jdGlvbigpe0grK30pLEh9LHRvQXJyYXk6ZnVuY3Rpb24oQil7cmV0dXJuIEooQixmdW5jdGlvbihIKXtyZXR1cm4gSH0pfHxbXX0sb25seTpmdW5jdGlvbihCKXtpZighVShCKSl0aHJvdyBFcnJvcigiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuIik7cmV0dXJuIEJ9fTtyZXR1cm4gTGUuQWN0aXZpdHk9ZixMZS5DaGlsZHJlbj1MLExlLkNvbXBvbmVudD1TLExlLkZyYWdtZW50PW4sTGUuUHJvZmlsZXI9cyxMZS5QdXJlQ29tcG9uZW50PV8sTGUuU3RyaWN0TW9kZT1pLExlLlN1c3BlbnNlPWQsTGUuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFPU8sTGUuX19DT01QSUxFUl9SVU5USU1FPXtfX3Byb3RvX186bnVsbCxjOmZ1bmN0aW9uKEIpe3JldHVybiBPLkgudXNlTWVtb0NhY2hlKEIpfX0sTGUuY2FjaGU9ZnVuY3Rpb24oQil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEIuYXBwbHkobnVsbCxhcmd1bWVudHMpfX0sTGUuY2FjaGVTaWduYWw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sTGUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKEIsSCxQKXtpZihCPT1udWxsKXRocm93IEVycm9yKCJUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkICIrQisiLiIpO3ZhciBlZT1FKHt9LEIucHJvcHMpLGxlPUIua2V5O2lmKEghPW51bGwpZm9yKGNlIGluIEgua2V5IT09dm9pZCAwJiYobGU9IiIrSC5rZXkpLEgpIWsuY2FsbChILGNlKXx8Y2U9PT0ia2V5Inx8Y2U9PT0iX19zZWxmInx8Y2U9PT0iX19zb3VyY2UifHxjZT09PSJyZWYiJiZILnJlZj09PXZvaWQgMHx8KGVlW2NlXT1IW2NlXSk7dmFyIGNlPWFyZ3VtZW50cy5sZW5ndGgtMjtpZihjZT09PTEpZWUuY2hpbGRyZW49UDtlbHNlIGlmKDE8Y2Upe2Zvcih2YXIgWD1BcnJheShjZSksJD0wOyQ8Y2U7JCsrKVhbJF09YXJndW1lbnRzWyQrMl07ZWUuY2hpbGRyZW49WH1yZXR1cm4gSShCLnR5cGUsbGUsZWUpfSxMZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKEIpe3JldHVybiBCPXskJHR5cGVvZjpjLF9jdXJyZW50VmFsdWU6QixfY3VycmVudFZhbHVlMjpCLF90aHJlYWRDb3VudDowLFByb3ZpZGVyOm51bGwsQ29uc3VtZXI6bnVsbH0sQi5Qcm92aWRlcj1CLEIuQ29uc3VtZXI9eyQkdHlwZW9mOmwsX2NvbnRleHQ6Qn0sQn0sTGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihCLEgsUCl7dmFyIGVlLGxlPXt9LGNlPW51bGw7aWYoSCE9bnVsbClmb3IoZWUgaW4gSC5rZXkhPT12b2lkIDAmJihjZT0iIitILmtleSksSClrLmNhbGwoSCxlZSkmJmVlIT09ImtleSImJmVlIT09Il9fc2VsZiImJmVlIT09Il9fc291cmNlIiYmKGxlW2VlXT1IW2VlXSk7dmFyIFg9YXJndW1lbnRzLmxlbmd0aC0yO2lmKFg9PT0xKWxlLmNoaWxkcmVuPVA7ZWxzZSBpZigxPFgpe2Zvcih2YXIgJD1BcnJheShYKSxpZT0wO2llPFg7aWUrKykkW2llXT1hcmd1bWVudHNbaWUrMl07bGUuY2hpbGRyZW49JH1pZihCJiZCLmRlZmF1bHRQcm9wcylmb3IoZWUgaW4gWD1CLmRlZmF1bHRQcm9wcyxYKWxlW2VlXT09PXZvaWQgMCYmKGxlW2VlXT1YW2VlXSk7cmV0dXJuIEkoQixjZSxsZSl9LExlLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fSxMZS5mb3J3YXJkUmVmPWZ1bmN0aW9uKEIpe3JldHVybnskJHR5cGVvZjpvLHJlbmRlcjpCfX0sTGUuaXNWYWxpZEVsZW1lbnQ9VSxMZS5sYXp5PWZ1bmN0aW9uKEIpe3JldHVybnskJHR5cGVvZjpwLF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6Qn0sX2luaXQ6UX19LExlLm1lbW89ZnVuY3Rpb24oQixIKXtyZXR1cm57JCR0eXBlb2Y6aCx0eXBlOkIsY29tcGFyZTpIPT09dm9pZCAwP251bGw6SH19LExlLnN0YXJ0VHJhbnNpdGlvbj1mdW5jdGlvbihCKXt2YXIgSD1PLlQsUD17fTtPLlQ9UDt0cnl7dmFyIGVlPUIoKSxsZT1PLlM7bGUhPT1udWxsJiZsZShQLGVlKSx0eXBlb2YgZWU9PSJvYmplY3QiJiZlZSE9PW51bGwmJnR5cGVvZiBlZS50aGVuPT0iZnVuY3Rpb24iJiZlZS50aGVuKFIsRil9Y2F0Y2goY2Upe0YoY2UpfWZpbmFsbHl7SCE9PW51bGwmJlAudHlwZXMhPT1udWxsJiYoSC50eXBlcz1QLnR5cGVzKSxPLlQ9SH19LExlLnVuc3RhYmxlX3VzZUNhY2hlUmVmcmVzaD1mdW5jdGlvbigpe3JldHVybiBPLkgudXNlQ2FjaGVSZWZyZXNoKCl9LExlLnVzZT1mdW5jdGlvbihCKXtyZXR1cm4gTy5ILnVzZShCKX0sTGUudXNlQWN0aW9uU3RhdGU9ZnVuY3Rpb24oQixILFApe3JldHVybiBPLkgudXNlQWN0aW9uU3RhdGUoQixILFApfSxMZS51c2VDYWxsYmFjaz1mdW5jdGlvbihCLEgpe3JldHVybiBPLkgudXNlQ2FsbGJhY2soQixIKX0sTGUudXNlQ29udGV4dD1mdW5jdGlvbihCKXtyZXR1cm4gTy5ILnVzZUNvbnRleHQoQil9LExlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9LExlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oQixIKXtyZXR1cm4gTy5ILnVzZURlZmVycmVkVmFsdWUoQixIKX0sTGUudXNlRWZmZWN0PWZ1bmN0aW9uKEIsSCl7cmV0dXJuIE8uSC51c2VFZmZlY3QoQixIKX0sTGUudXNlRWZmZWN0RXZlbnQ9ZnVuY3Rpb24oQil7cmV0dXJuIE8uSC51c2VFZmZlY3RFdmVudChCKX0sTGUudXNlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gTy5ILnVzZUlkKCl9LExlLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oQixILFApe3JldHVybiBPLkgudXNlSW1wZXJhdGl2ZUhhbmRsZShCLEgsUCl9LExlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihCLEgpe3JldHVybiBPLkgudXNlSW5zZXJ0aW9uRWZmZWN0KEIsSCl9LExlLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihCLEgpe3JldHVybiBPLkgudXNlTGF5b3V0RWZmZWN0KEIsSCl9LExlLnVzZU1lbW89ZnVuY3Rpb24oQixIKXtyZXR1cm4gTy5ILnVzZU1lbW8oQixIKX0sTGUudXNlT3B0aW1pc3RpYz1mdW5jdGlvbihCLEgpe3JldHVybiBPLkgudXNlT3B0aW1pc3RpYyhCLEgpfSxMZS51c2VSZWR1Y2VyPWZ1bmN0aW9uKEIsSCxQKXtyZXR1cm4gTy5ILnVzZVJlZHVjZXIoQixILFApfSxMZS51c2VSZWY9ZnVuY3Rpb24oQil7cmV0dXJuIE8uSC51c2VSZWYoQil9LExlLnVzZVN0YXRlPWZ1bmN0aW9uKEIpe3JldHVybiBPLkgudXNlU3RhdGUoQil9LExlLnVzZVN5bmNFeHRlcm5hbFN0b3JlPWZ1bmN0aW9uKEIsSCxQKXtyZXR1cm4gTy5ILnVzZVN5bmNFeHRlcm5hbFN0b3JlKEIsSCxQKX0sTGUudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBPLkgudXNlVHJhbnNpdGlvbigpfSxMZS52ZXJzaW9uPSIxOS4yLjAiLExlfXZhciBUeDtmdW5jdGlvbiBDbygpe3JldHVybiBUeHx8KFR4PTEseWguZXhwb3J0cz1XMigpKSx5aC5leHBvcnRzfXZhciBWPUNvKCk7Y29uc3QgJHQ9QnUoVik7dmFyIHZoPXtleHBvcnRzOnt9fSxlbz17fSxfaD17ZXhwb3J0czp7fX0sU2g9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLmpzCiAqCiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBBeDtmdW5jdGlvbiBLMigpe3JldHVybiBBeHx8KEF4PTEsKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoVyxKKXt2YXIgUT1XLmxlbmd0aDtXLnB1c2goSik7ZTpmb3IoOzA8UTspe3ZhciBGPVEtMT4+PjEsTD1XW0ZdO2lmKDA8cyhMLEopKVdbRl09SixXW1FdPUwsUT1GO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24gbihXKXtyZXR1cm4gVy5sZW5ndGg9PT0wP251bGw6V1swXX1mdW5jdGlvbiBpKFcpe2lmKFcubGVuZ3RoPT09MClyZXR1cm4gbnVsbDt2YXIgSj1XWzBdLFE9Vy5wb3AoKTtpZihRIT09Sil7V1swXT1RO2U6Zm9yKHZhciBGPTAsTD1XLmxlbmd0aCxCPUw+Pj4xO0Y8Qjspe3ZhciBIPTIqKEYrMSktMSxQPVdbSF0sZWU9SCsxLGxlPVdbZWVdO2lmKDA+cyhQLFEpKWVlPEwmJjA+cyhsZSxQKT8oV1tGXT1sZSxXW2VlXT1RLEY9ZWUpOihXW0ZdPVAsV1tIXT1RLEY9SCk7ZWxzZSBpZihlZTxMJiYwPnMobGUsUSkpV1tGXT1sZSxXW2VlXT1RLEY9ZWU7ZWxzZSBicmVhayBlfX1yZXR1cm4gSn1mdW5jdGlvbiBzKFcsSil7dmFyIFE9Vy5zb3J0SW5kZXgtSi5zb3J0SW5kZXg7cmV0dXJuIFEhPT0wP1E6Vy5pZC1KLmlkfWlmKGUudW5zdGFibGVfbm93PXZvaWQgMCx0eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iKXt2YXIgbD1wZXJmb3JtYW5jZTtlLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpfX1lbHNle3ZhciBjPURhdGUsbz1jLm5vdygpO2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGMubm93KCktb319dmFyIGQ9W10saD1bXSxwPTEsZj1udWxsLGc9MyxiPSExLHg9ITEsRT0hMSx5PSExLFM9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDpudWxsLHY9dHlwZW9mIGNsZWFyVGltZW91dD09ImZ1bmN0aW9uIj9jbGVhclRpbWVvdXQ6bnVsbCxfPXR5cGVvZiBzZXRJbW1lZGlhdGU8InUiP3NldEltbWVkaWF0ZTpudWxsO2Z1bmN0aW9uIEMoVyl7Zm9yKHZhciBKPW4oaCk7SiE9PW51bGw7KXtpZihKLmNhbGxiYWNrPT09bnVsbClpKGgpO2Vsc2UgaWYoSi5zdGFydFRpbWU8PVcpaShoKSxKLnNvcnRJbmRleD1KLmV4cGlyYXRpb25UaW1lLHQoZCxKKTtlbHNlIGJyZWFrO0o9bihoKX19ZnVuY3Rpb24gTihXKXtpZihFPSExLEMoVyksIXgpaWYobihkKSE9PW51bGwpeD0hMCxSfHwoUj0hMCx6KCkpO2Vsc2V7dmFyIEo9bihoKTtKIT09bnVsbCYmSyhOLEouc3RhcnRUaW1lLVcpfX12YXIgUj0hMSxPPS0xLGs9NSxJPS0xO2Z1bmN0aW9uIE0oKXtyZXR1cm4geT8hMDohKGUudW5zdGFibGVfbm93KCktSTxrKX1mdW5jdGlvbiBVKCl7aWYoeT0hMSxSKXt2YXIgVz1lLnVuc3RhYmxlX25vdygpO0k9Vzt2YXIgSj0hMDt0cnl7ZTp7eD0hMSxFJiYoRT0hMSx2KE8pLE89LTEpLGI9ITA7dmFyIFE9Zzt0cnl7dDp7Zm9yKEMoVyksZj1uKGQpO2YhPT1udWxsJiYhKGYuZXhwaXJhdGlvblRpbWU+VyYmTSgpKTspe3ZhciBGPWYuY2FsbGJhY2s7aWYodHlwZW9mIEY9PSJmdW5jdGlvbiIpe2YuY2FsbGJhY2s9bnVsbCxnPWYucHJpb3JpdHlMZXZlbDt2YXIgTD1GKGYuZXhwaXJhdGlvblRpbWU8PVcpO2lmKFc9ZS51bnN0YWJsZV9ub3coKSx0eXBlb2YgTD09ImZ1bmN0aW9uIil7Zi5jYWxsYmFjaz1MLEMoVyksSj0hMDticmVhayB0fWY9PT1uKGQpJiZpKGQpLEMoVyl9ZWxzZSBpKGQpO2Y9bihkKX1pZihmIT09bnVsbClKPSEwO2Vsc2V7dmFyIEI9bihoKTtCIT09bnVsbCYmSyhOLEIuc3RhcnRUaW1lLVcpLEo9ITF9fWJyZWFrIGV9ZmluYWxseXtmPW51bGwsZz1RLGI9ITF9Sj12b2lkIDB9fWZpbmFsbHl7Sj96KCk6Uj0hMX19fXZhciB6O2lmKHR5cGVvZiBfPT0iZnVuY3Rpb24iKXo9ZnVuY3Rpb24oKXtfKFUpfTtlbHNlIGlmKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSIpe3ZhciBqPW5ldyBNZXNzYWdlQ2hhbm5lbCxHPWoucG9ydDI7ai5wb3J0MS5vbm1lc3NhZ2U9VSx6PWZ1bmN0aW9uKCl7Ry5wb3N0TWVzc2FnZShudWxsKX19ZWxzZSB6PWZ1bmN0aW9uKCl7UyhVLDApfTtmdW5jdGlvbiBLKFcsSil7Tz1TKGZ1bmN0aW9uKCl7VyhlLnVuc3RhYmxlX25vdygpKX0sSil9ZS51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NSxlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTEsZS51bnN0YWJsZV9Mb3dQcmlvcml0eT00LGUudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MyxlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsLGUudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MixlLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKFcpe1cuY2FsbGJhY2s9bnVsbH0sZS51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZT1mdW5jdGlvbihXKXswPld8fDEyNTxXP2NvbnNvbGUuZXJyb3IoImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCIpOms9MDxXP01hdGguZmxvb3IoMWUzL1cpOjV9LGUudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gZ30sZS51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKFcpe3N3aXRjaChnKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgSj0zO2JyZWFrO2RlZmF1bHQ6Sj1nfXZhciBRPWc7Zz1KO3RyeXtyZXR1cm4gVygpfWZpbmFsbHl7Zz1RfX0sZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt5PSEwfSxlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihXLEope3N3aXRjaChXKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6Vz0zfXZhciBRPWc7Zz1XO3RyeXtyZXR1cm4gSigpfWZpbmFsbHl7Zz1RfX0sZS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKFcsSixRKXt2YXIgRj1lLnVuc3RhYmxlX25vdygpO3N3aXRjaCh0eXBlb2YgUT09Im9iamVjdCImJlEhPT1udWxsPyhRPVEuZGVsYXksUT10eXBlb2YgUT09Im51bWJlciImJjA8UT9GK1E6Rik6UT1GLFcpe2Nhc2UgMTp2YXIgTD0tMTticmVhaztjYXNlIDI6TD0yNTA7YnJlYWs7Y2FzZSA1Okw9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6TD0xZTQ7YnJlYWs7ZGVmYXVsdDpMPTVlM31yZXR1cm4gTD1RK0wsVz17aWQ6cCsrLGNhbGxiYWNrOkoscHJpb3JpdHlMZXZlbDpXLHN0YXJ0VGltZTpRLGV4cGlyYXRpb25UaW1lOkwsc29ydEluZGV4Oi0xfSxRPkY/KFcuc29ydEluZGV4PVEsdChoLFcpLG4oZCk9PT1udWxsJiZXPT09bihoKSYmKEU/KHYoTyksTz0tMSk6RT0hMCxLKE4sUS1GKSkpOihXLnNvcnRJbmRleD1MLHQoZCxXKSx4fHxifHwoeD0hMCxSfHwoUj0hMCx6KCkpKSksV30sZS51bnN0YWJsZV9zaG91bGRZaWVsZD1NLGUudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKFcpe3ZhciBKPWc7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIFE9ZztnPUo7dHJ5e3JldHVybiBXLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2c9UX19fX0pKFNoKSksU2h9dmFyIFJ4O2Z1bmN0aW9uIFkyKCl7cmV0dXJuIFJ4fHwoUng9MSxfaC5leHBvcnRzPUsyKCkpLF9oLmV4cG9ydHN9dmFyIEVoPXtleHBvcnRzOnt9fSxLdD17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QtZG9tLnByb2R1Y3Rpb24uanMKICoKICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIGt4O2Z1bmN0aW9uIFgyKCl7aWYoa3gpcmV0dXJuIEt0O2t4PTE7dmFyIGU9Q28oKTtmdW5jdGlvbiB0KGQpe3ZhciBoPSJodHRwczovL3JlYWN0LmRldi9lcnJvcnMvIitkO2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7aCs9Ij9hcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzWzFdKTtmb3IodmFyIHA9MjtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWgrPSImYXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1twXSl9cmV0dXJuIk1pbmlmaWVkIFJlYWN0IGVycm9yICMiK2QrIjsgdmlzaXQgIitoKyIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiJ9ZnVuY3Rpb24gbigpe312YXIgaT17ZDp7ZjpuLHI6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcih0KDUyMikpfSxEOm4sQzpuLEw6bixtOm4sWDpuLFM6bixNOm59LHA6MCxmaW5kRE9NTm9kZTpudWxsfSxzPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpO2Z1bmN0aW9uIGwoZCxoLHApe3ZhciBmPTM8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjpzLGtleTpmPT1udWxsP251bGw6IiIrZixjaGlsZHJlbjpkLGNvbnRhaW5lckluZm86aCxpbXBsZW1lbnRhdGlvbjpwfX12YXIgYz1lLl9fQ0xJRU5UX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERTtmdW5jdGlvbiBvKGQsaCl7aWYoZD09PSJmb250IilyZXR1cm4iIjtpZih0eXBlb2YgaD09InN0cmluZyIpcmV0dXJuIGg9PT0idXNlLWNyZWRlbnRpYWxzIj9oOiIifXJldHVybiBLdC5fX0RPTV9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREU9aSxLdC5jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oZCxoKXt2YXIgcD0yPGFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbDtpZighaHx8aC5ub2RlVHlwZSE9PTEmJmgubm9kZVR5cGUhPT05JiZoLm5vZGVUeXBlIT09MTEpdGhyb3cgRXJyb3IodCgyOTkpKTtyZXR1cm4gbChkLGgsbnVsbCxwKX0sS3QuZmx1c2hTeW5jPWZ1bmN0aW9uKGQpe3ZhciBoPWMuVCxwPWkucDt0cnl7aWYoYy5UPW51bGwsaS5wPTIsZClyZXR1cm4gZCgpfWZpbmFsbHl7Yy5UPWgsaS5wPXAsaS5kLmYoKX19LEt0LnByZWNvbm5lY3Q9ZnVuY3Rpb24oZCxoKXt0eXBlb2YgZD09InN0cmluZyImJihoPyhoPWguY3Jvc3NPcmlnaW4saD10eXBlb2YgaD09InN0cmluZyI/aD09PSJ1c2UtY3JlZGVudGlhbHMiP2g6IiI6dm9pZCAwKTpoPW51bGwsaS5kLkMoZCxoKSl9LEt0LnByZWZldGNoRE5TPWZ1bmN0aW9uKGQpe3R5cGVvZiBkPT0ic3RyaW5nIiYmaS5kLkQoZCl9LEt0LnByZWluaXQ9ZnVuY3Rpb24oZCxoKXtpZih0eXBlb2YgZD09InN0cmluZyImJmgmJnR5cGVvZiBoLmFzPT0ic3RyaW5nIil7dmFyIHA9aC5hcyxmPW8ocCxoLmNyb3NzT3JpZ2luKSxnPXR5cGVvZiBoLmludGVncml0eT09InN0cmluZyI/aC5pbnRlZ3JpdHk6dm9pZCAwLGI9dHlwZW9mIGguZmV0Y2hQcmlvcml0eT09InN0cmluZyI/aC5mZXRjaFByaW9yaXR5OnZvaWQgMDtwPT09InN0eWxlIj9pLmQuUyhkLHR5cGVvZiBoLnByZWNlZGVuY2U9PSJzdHJpbmciP2gucHJlY2VkZW5jZTp2b2lkIDAse2Nyb3NzT3JpZ2luOmYsaW50ZWdyaXR5OmcsZmV0Y2hQcmlvcml0eTpifSk6cD09PSJzY3JpcHQiJiZpLmQuWChkLHtjcm9zc09yaWdpbjpmLGludGVncml0eTpnLGZldGNoUHJpb3JpdHk6Yixub25jZTp0eXBlb2YgaC5ub25jZT09InN0cmluZyI/aC5ub25jZTp2b2lkIDB9KX19LEt0LnByZWluaXRNb2R1bGU9ZnVuY3Rpb24oZCxoKXtpZih0eXBlb2YgZD09InN0cmluZyIpaWYodHlwZW9mIGg9PSJvYmplY3QiJiZoIT09bnVsbCl7aWYoaC5hcz09bnVsbHx8aC5hcz09PSJzY3JpcHQiKXt2YXIgcD1vKGguYXMsaC5jcm9zc09yaWdpbik7aS5kLk0oZCx7Y3Jvc3NPcmlnaW46cCxpbnRlZ3JpdHk6dHlwZW9mIGguaW50ZWdyaXR5PT0ic3RyaW5nIj9oLmludGVncml0eTp2b2lkIDAsbm9uY2U6dHlwZW9mIGgubm9uY2U9PSJzdHJpbmciP2gubm9uY2U6dm9pZCAwfSl9fWVsc2UgaD09bnVsbCYmaS5kLk0oZCl9LEt0LnByZWxvYWQ9ZnVuY3Rpb24oZCxoKXtpZih0eXBlb2YgZD09InN0cmluZyImJnR5cGVvZiBoPT0ib2JqZWN0IiYmaCE9PW51bGwmJnR5cGVvZiBoLmFzPT0ic3RyaW5nIil7dmFyIHA9aC5hcyxmPW8ocCxoLmNyb3NzT3JpZ2luKTtpLmQuTChkLHAse2Nyb3NzT3JpZ2luOmYsaW50ZWdyaXR5OnR5cGVvZiBoLmludGVncml0eT09InN0cmluZyI/aC5pbnRlZ3JpdHk6dm9pZCAwLG5vbmNlOnR5cGVvZiBoLm5vbmNlPT0ic3RyaW5nIj9oLm5vbmNlOnZvaWQgMCx0eXBlOnR5cGVvZiBoLnR5cGU9PSJzdHJpbmciP2gudHlwZTp2b2lkIDAsZmV0Y2hQcmlvcml0eTp0eXBlb2YgaC5mZXRjaFByaW9yaXR5PT0ic3RyaW5nIj9oLmZldGNoUHJpb3JpdHk6dm9pZCAwLHJlZmVycmVyUG9saWN5OnR5cGVvZiBoLnJlZmVycmVyUG9saWN5PT0ic3RyaW5nIj9oLnJlZmVycmVyUG9saWN5OnZvaWQgMCxpbWFnZVNyY1NldDp0eXBlb2YgaC5pbWFnZVNyY1NldD09InN0cmluZyI/aC5pbWFnZVNyY1NldDp2b2lkIDAsaW1hZ2VTaXplczp0eXBlb2YgaC5pbWFnZVNpemVzPT0ic3RyaW5nIj9oLmltYWdlU2l6ZXM6dm9pZCAwLG1lZGlhOnR5cGVvZiBoLm1lZGlhPT0ic3RyaW5nIj9oLm1lZGlhOnZvaWQgMH0pfX0sS3QucHJlbG9hZE1vZHVsZT1mdW5jdGlvbihkLGgpe2lmKHR5cGVvZiBkPT0ic3RyaW5nIilpZihoKXt2YXIgcD1vKGguYXMsaC5jcm9zc09yaWdpbik7aS5kLm0oZCx7YXM6dHlwZW9mIGguYXM9PSJzdHJpbmciJiZoLmFzIT09InNjcmlwdCI/aC5hczp2b2lkIDAsY3Jvc3NPcmlnaW46cCxpbnRlZ3JpdHk6dHlwZW9mIGguaW50ZWdyaXR5PT0ic3RyaW5nIj9oLmludGVncml0eTp2b2lkIDB9KX1lbHNlIGkuZC5tKGQpfSxLdC5yZXF1ZXN0Rm9ybVJlc2V0PWZ1bmN0aW9uKGQpe2kuZC5yKGQpfSxLdC51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1mdW5jdGlvbihkLGgpe3JldHVybiBkKGgpfSxLdC51c2VGb3JtU3RhdGU9ZnVuY3Rpb24oZCxoLHApe3JldHVybiBjLkgudXNlRm9ybVN0YXRlKGQsaCxwKX0sS3QudXNlRm9ybVN0YXR1cz1mdW5jdGlvbigpe3JldHVybiBjLkgudXNlSG9zdFRyYW5zaXRpb25TdGF0dXMoKX0sS3QudmVyc2lvbj0iMTkuMi4wIixLdH12YXIgTng7ZnVuY3Rpb24gTk4oKXtpZihOeClyZXR1cm4gRWguZXhwb3J0cztOeD0xO2Z1bmN0aW9uIGUoKXtpZighKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18+InUifHx0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFIT0iZnVuY3Rpb24iKSl0cnl7X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGUpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9fXJldHVybiBlKCksRWguZXhwb3J0cz1YMigpLEVoLmV4cG9ydHN9LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWRvbS1jbGllbnQucHJvZHVjdGlvbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi92YXIgT3g7ZnVuY3Rpb24gWjIoKXtpZihPeClyZXR1cm4gZW87T3g9MTt2YXIgZT1ZMigpLHQ9Q28oKSxuPU5OKCk7ZnVuY3Rpb24gaShyKXt2YXIgYT0iaHR0cHM6Ly9yZWFjdC5kZXYvZXJyb3JzLyIrcjtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2ErPSI/YXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1sxXSk7Zm9yKHZhciB1PTI7dTxhcmd1bWVudHMubGVuZ3RoO3UrKylhKz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbdV0pfXJldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIityKyI7IHZpc2l0ICIrYSsiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifWZ1bmN0aW9uIHMocil7cmV0dXJuISghcnx8ci5ub2RlVHlwZSE9PTEmJnIubm9kZVR5cGUhPT05JiZyLm5vZGVUeXBlIT09MTEpfWZ1bmN0aW9uIGwocil7dmFyIGE9cix1PXI7aWYoci5hbHRlcm5hdGUpZm9yKDthLnJldHVybjspYT1hLnJldHVybjtlbHNle3I9YTtkbyBhPXIsKGEuZmxhZ3MmNDA5OCkhPT0wJiYodT1hLnJldHVybikscj1hLnJldHVybjt3aGlsZShyKX1yZXR1cm4gYS50YWc9PT0zP3U6bnVsbH1mdW5jdGlvbiBjKHIpe2lmKHIudGFnPT09MTMpe3ZhciBhPXIubWVtb2l6ZWRTdGF0ZTtpZihhPT09bnVsbCYmKHI9ci5hbHRlcm5hdGUsciE9PW51bGwmJihhPXIubWVtb2l6ZWRTdGF0ZSkpLGEhPT1udWxsKXJldHVybiBhLmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbyhyKXtpZihyLnRhZz09PTMxKXt2YXIgYT1yLm1lbW9pemVkU3RhdGU7aWYoYT09PW51bGwmJihyPXIuYWx0ZXJuYXRlLHIhPT1udWxsJiYoYT1yLm1lbW9pemVkU3RhdGUpKSxhIT09bnVsbClyZXR1cm4gYS5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIGQocil7aWYobChyKSE9PXIpdGhyb3cgRXJyb3IoaSgxODgpKX1mdW5jdGlvbiBoKHIpe3ZhciBhPXIuYWx0ZXJuYXRlO2lmKCFhKXtpZihhPWwociksYT09PW51bGwpdGhyb3cgRXJyb3IoaSgxODgpKTtyZXR1cm4gYSE9PXI/bnVsbDpyfWZvcih2YXIgdT1yLG09YTs7KXt2YXIgdz11LnJldHVybjtpZih3PT09bnVsbClicmVhazt2YXIgQT13LmFsdGVybmF0ZTtpZihBPT09bnVsbCl7aWYobT13LnJldHVybixtIT09bnVsbCl7dT1tO2NvbnRpbnVlfWJyZWFrfWlmKHcuY2hpbGQ9PT1BLmNoaWxkKXtmb3IoQT13LmNoaWxkO0E7KXtpZihBPT09dSlyZXR1cm4gZCh3KSxyO2lmKEE9PT1tKXJldHVybiBkKHcpLGE7QT1BLnNpYmxpbmd9dGhyb3cgRXJyb3IoaSgxODgpKX1pZih1LnJldHVybiE9PW0ucmV0dXJuKXU9dyxtPUE7ZWxzZXtmb3IodmFyIEQ9ITEscT13LmNoaWxkO3E7KXtpZihxPT09dSl7RD0hMCx1PXcsbT1BO2JyZWFrfWlmKHE9PT1tKXtEPSEwLG09dyx1PUE7YnJlYWt9cT1xLnNpYmxpbmd9aWYoIUQpe2ZvcihxPUEuY2hpbGQ7cTspe2lmKHE9PT11KXtEPSEwLHU9QSxtPXc7YnJlYWt9aWYocT09PW0pe0Q9ITAsbT1BLHU9dzticmVha31xPXEuc2libGluZ31pZighRCl0aHJvdyBFcnJvcihpKDE4OSkpfX1pZih1LmFsdGVybmF0ZSE9PW0pdGhyb3cgRXJyb3IoaSgxOTApKX1pZih1LnRhZyE9PTMpdGhyb3cgRXJyb3IoaSgxODgpKTtyZXR1cm4gdS5zdGF0ZU5vZGUuY3VycmVudD09PXU/cjphfWZ1bmN0aW9uIHAocil7dmFyIGE9ci50YWc7aWYoYT09PTV8fGE9PT0yNnx8YT09PTI3fHxhPT09NilyZXR1cm4gcjtmb3Iocj1yLmNoaWxkO3IhPT1udWxsOyl7aWYoYT1wKHIpLGEhPT1udWxsKXJldHVybiBhO3I9ci5zaWJsaW5nfXJldHVybiBudWxsfXZhciBmPU9iamVjdC5hc3NpZ24sZz1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksYj1TeW1ib2wuZm9yKCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudCIpLHg9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksRT1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLHk9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxTPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksdj1TeW1ib2wuZm9yKCJyZWFjdC5jb25zdW1lciIpLF89U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLEM9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxOPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksUj1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0IiksTz1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksaz1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksST1TeW1ib2wuZm9yKCJyZWFjdC5hY3Rpdml0eSIpLE09U3ltYm9sLmZvcigicmVhY3QubWVtb19jYWNoZV9zZW50aW5lbCIpLFU9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIHoocil7cmV0dXJuIHI9PT1udWxsfHx0eXBlb2YgciE9Im9iamVjdCI/bnVsbDoocj1VJiZyW1VdfHxyWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIHI9PSJmdW5jdGlvbiI/cjpudWxsKX12YXIgaj1TeW1ib2wuZm9yKCJyZWFjdC5jbGllbnQucmVmZXJlbmNlIik7ZnVuY3Rpb24gRyhyKXtpZihyPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXJldHVybiByLiQkdHlwZW9mPT09aj9udWxsOnIuZGlzcGxheU5hbWV8fHIubmFtZXx8bnVsbDtpZih0eXBlb2Ygcj09InN0cmluZyIpcmV0dXJuIHI7c3dpdGNoKHIpe2Nhc2UgRTpyZXR1cm4iRnJhZ21lbnQiO2Nhc2UgUzpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgeTpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSBOOnJldHVybiJTdXNwZW5zZSI7Y2FzZSBSOnJldHVybiJTdXNwZW5zZUxpc3QiO2Nhc2UgSTpyZXR1cm4iQWN0aXZpdHkifWlmKHR5cGVvZiByPT0ib2JqZWN0Iilzd2l0Y2goci4kJHR5cGVvZil7Y2FzZSB4OnJldHVybiJQb3J0YWwiO2Nhc2UgXzpyZXR1cm4gci5kaXNwbGF5TmFtZXx8IkNvbnRleHQiO2Nhc2UgdjpyZXR1cm4oci5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIEM6dmFyIGE9ci5yZW5kZXI7cmV0dXJuIHI9ci5kaXNwbGF5TmFtZSxyfHwocj1hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCIiLHI9ciE9PSIiPyJGb3J3YXJkUmVmKCIrcisiKSI6IkZvcndhcmRSZWYiKSxyO2Nhc2UgTzpyZXR1cm4gYT1yLmRpc3BsYXlOYW1lfHxudWxsLGEhPT1udWxsP2E6RyhyLnR5cGUpfHwiTWVtbyI7Y2FzZSBrOmE9ci5fcGF5bG9hZCxyPXIuX2luaXQ7dHJ5e3JldHVybiBHKHIoYSkpfWNhdGNoe319cmV0dXJuIG51bGx9dmFyIEs9QXJyYXkuaXNBcnJheSxXPXQuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFLEo9bi5fX0RPTV9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsUT17cGVuZGluZzohMSxkYXRhOm51bGwsbWV0aG9kOm51bGwsYWN0aW9uOm51bGx9LEY9W10sTD0tMTtmdW5jdGlvbiBCKHIpe3JldHVybntjdXJyZW50OnJ9fWZ1bmN0aW9uIEgocil7MD5MfHwoci5jdXJyZW50PUZbTF0sRltMXT1udWxsLEwtLSl9ZnVuY3Rpb24gUChyLGEpe0wrKyxGW0xdPXIuY3VycmVudCxyLmN1cnJlbnQ9YX12YXIgZWU9QihudWxsKSxsZT1CKG51bGwpLGNlPUIobnVsbCksWD1CKG51bGwpO2Z1bmN0aW9uICQocixhKXtzd2l0Y2goUChjZSxhKSxQKGxlLHIpLFAoZWUsbnVsbCksYS5ub2RlVHlwZSl7Y2FzZSA5OmNhc2UgMTE6cj0ocj1hLmRvY3VtZW50RWxlbWVudCkmJihyPXIubmFtZXNwYWNlVVJJKT9WMChyKTowO2JyZWFrO2RlZmF1bHQ6aWYocj1hLnRhZ05hbWUsYT1hLm5hbWVzcGFjZVVSSSlhPVYwKGEpLHI9VzAoYSxyKTtlbHNlIHN3aXRjaChyKXtjYXNlInN2ZyI6cj0xO2JyZWFrO2Nhc2UibWF0aCI6cj0yO2JyZWFrO2RlZmF1bHQ6cj0wfX1IKGVlKSxQKGVlLHIpfWZ1bmN0aW9uIGllKCl7SChlZSksSChsZSksSChjZSl9ZnVuY3Rpb24gaGUocil7ci5tZW1vaXplZFN0YXRlIT09bnVsbCYmUChYLHIpO3ZhciBhPWVlLmN1cnJlbnQsdT1XMChhLHIudHlwZSk7YSE9PXUmJihQKGxlLHIpLFAoZWUsdSkpfWZ1bmN0aW9uIGJlKHIpe2xlLmN1cnJlbnQ9PT1yJiYoSChlZSksSChsZSkpLFguY3VycmVudD09PXImJihIKFgpLFlzLl9jdXJyZW50VmFsdWU9USl9dmFyIGdlLHhlO2Z1bmN0aW9uIHplKHIpe2lmKGdlPT09dm9pZCAwKXRyeXt0aHJvdyBFcnJvcigpfWNhdGNoKHUpe3ZhciBhPXUuc3RhY2sudHJpbSgpLm1hdGNoKC9cbiggKihhdCApPykvKTtnZT1hJiZhWzFdfHwiIix4ZT0tMTx1LnN0YWNrLmluZGV4T2YoYAogICAgYXRgKT8iICg8YW5vbnltb3VzPikiOi0xPHUuc3RhY2suaW5kZXhPZigiQCIpPyJAdW5rbm93bjowOjAiOiIifXJldHVybmAKYCtnZStyK3hlfXZhciBIZT0hMTtmdW5jdGlvbiBEZShyLGEpe2lmKCFyfHxIZSlyZXR1cm4iIjtIZT0hMDt2YXIgdT1FcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT12b2lkIDA7dHJ5e3ZhciBtPXtEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3Q6ZnVuY3Rpb24oKXt0cnl7aWYoYSl7dmFyIHBlPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX07aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KHBlLnByb3RvdHlwZSwicHJvcHMiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfX0pLHR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0IiYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdChwZSxbXSl9Y2F0Y2gob2Upe3ZhciBhZT1vZX1SZWZsZWN0LmNvbnN0cnVjdChyLFtdLHBlKX1lbHNle3RyeXtwZS5jYWxsKCl9Y2F0Y2gob2Upe2FlPW9lfXIuY2FsbChwZS5wcm90b3R5cGUpfX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKG9lKXthZT1vZX0ocGU9cigpKSYmdHlwZW9mIHBlLmNhdGNoPT0iZnVuY3Rpb24iJiZwZS5jYXRjaChmdW5jdGlvbigpe30pfX1jYXRjaChvZSl7aWYob2UmJmFlJiZ0eXBlb2Ygb2Uuc3RhY2s9PSJzdHJpbmciKXJldHVybltvZS5zdGFjayxhZS5zdGFja119cmV0dXJuW251bGwsbnVsbF19fTttLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZT0iRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290Ijt2YXIgdz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0uRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LCJuYW1lIik7dyYmdy5jb25maWd1cmFibGUmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCwibmFtZSIse3ZhbHVlOiJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QifSk7dmFyIEE9bS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QoKSxEPUFbMF0scT1BWzFdO2lmKEQmJnEpe3ZhciBZPUQuc3BsaXQoYApgKSxyZT1xLnNwbGl0KGAKYCk7Zm9yKHc9bT0wO208WS5sZW5ndGgmJiFZW21dLmluY2x1ZGVzKCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QiKTspbSsrO2Zvcig7dzxyZS5sZW5ndGgmJiFyZVt3XS5pbmNsdWRlcygiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290Iik7KXcrKztpZihtPT09WS5sZW5ndGh8fHc9PT1yZS5sZW5ndGgpZm9yKG09WS5sZW5ndGgtMSx3PXJlLmxlbmd0aC0xOzE8PW0mJjA8PXcmJllbbV0hPT1yZVt3XTspdy0tO2Zvcig7MTw9bSYmMDw9dzttLS0sdy0tKWlmKFlbbV0hPT1yZVt3XSl7aWYobSE9PTF8fHchPT0xKWRvIGlmKG0tLSx3LS0sMD53fHxZW21dIT09cmVbd10pe3ZhciBkZT1gCmArWVttXS5yZXBsYWNlKCIgYXQgbmV3ICIsIiBhdCAiKTtyZXR1cm4gci5kaXNwbGF5TmFtZSYmZGUuaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikmJihkZT1kZS5yZXBsYWNlKCI8YW5vbnltb3VzPiIsci5kaXNwbGF5TmFtZSkpLGRlfXdoaWxlKDE8PW0mJjA8PXcpO2JyZWFrfX19ZmluYWxseXtIZT0hMSxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT11fXJldHVybih1PXI/ci5kaXNwbGF5TmFtZXx8ci5uYW1lOiIiKT96ZSh1KToiIn1mdW5jdGlvbiBFZShyLGEpe3N3aXRjaChyLnRhZyl7Y2FzZSAyNjpjYXNlIDI3OmNhc2UgNTpyZXR1cm4gemUoci50eXBlKTtjYXNlIDE2OnJldHVybiB6ZSgiTGF6eSIpO2Nhc2UgMTM6cmV0dXJuIHIuY2hpbGQhPT1hJiZhIT09bnVsbD96ZSgiU3VzcGVuc2UgRmFsbGJhY2siKTp6ZSgiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiB6ZSgiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMTU6cmV0dXJuIERlKHIudHlwZSwhMSk7Y2FzZSAxMTpyZXR1cm4gRGUoci50eXBlLnJlbmRlciwhMSk7Y2FzZSAxOnJldHVybiBEZShyLnR5cGUsITApO2Nhc2UgMzE6cmV0dXJuIHplKCJBY3Rpdml0eSIpO2RlZmF1bHQ6cmV0dXJuIiJ9fWZ1bmN0aW9uIHd0KHIpe3RyeXt2YXIgYT0iIix1PW51bGw7ZG8gYSs9RWUocix1KSx1PXIscj1yLnJldHVybjt3aGlsZShyKTtyZXR1cm4gYX1jYXRjaChtKXtyZXR1cm5gCkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IGArbS5tZXNzYWdlK2AKYCttLnN0YWNrfX12YXIgTXQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxmdD1lLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssVnQ9ZS51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxCdD1lLnVuc3RhYmxlX3Nob3VsZFlpZWxkLE5lPWUudW5zdGFibGVfcmVxdWVzdFBhaW50LE9lPWUudW5zdGFibGVfbm93LGplPWUudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsdWU9ZS51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxtZT1lLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LHZlPWUudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksQ2U9ZS51bnN0YWJsZV9Mb3dQcmlvcml0eSxJZT1lLnVuc3RhYmxlX0lkbGVQcmlvcml0eSxwdD1lLmxvZyxGZT1lLnVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlLG10PW51bGwsYXQ9bnVsbDtmdW5jdGlvbiBkdChyKXtpZih0eXBlb2YgcHQ9PSJmdW5jdGlvbiImJkZlKHIpLGF0JiZ0eXBlb2YgYXQuc2V0U3RyaWN0TW9kZT09ImZ1bmN0aW9uIil0cnl7YXQuc2V0U3RyaWN0TW9kZShtdCxyKX1jYXRjaHt9fXZhciBKZT1NYXRoLmNsejMyP01hdGguY2x6MzI6Tm4sbm49TWF0aC5sb2csV3Q9TWF0aC5MTjI7ZnVuY3Rpb24gTm4ocil7cmV0dXJuIHI+Pj49MCxyPT09MD8zMjozMS0obm4ocikvV3R8MCl8MH12YXIgZ3Q9MjU2LFpuPTI2MjE0NCxuYT00MTk0MzA0O2Z1bmN0aW9uIFFuKHIpe3ZhciBhPXImNDI7aWYoYSE9PTApcmV0dXJuIGE7c3dpdGNoKHImLXIpe2Nhc2UgMTpyZXR1cm4gMTtjYXNlIDI6cmV0dXJuIDI7Y2FzZSA0OnJldHVybiA0O2Nhc2UgODpyZXR1cm4gODtjYXNlIDE2OnJldHVybiAxNjtjYXNlIDMyOnJldHVybiAzMjtjYXNlIDY0OnJldHVybiA2NDtjYXNlIDEyODpyZXR1cm4gMTI4O2Nhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpyZXR1cm4gciYyNjE4ODg7Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gciYzOTMyMTYwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOnJldHVybiByJjYyOTE0NTYwO2Nhc2UgNjcxMDg4NjQ6cmV0dXJuIDY3MTA4ODY0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMDtkZWZhdWx0OnJldHVybiByfX1mdW5jdGlvbiBTaShyLGEsdSl7dmFyIG09ci5wZW5kaW5nTGFuZXM7aWYobT09PTApcmV0dXJuIDA7dmFyIHc9MCxBPXIuc3VzcGVuZGVkTGFuZXMsRD1yLnBpbmdlZExhbmVzO3I9ci53YXJtTGFuZXM7dmFyIHE9bSYxMzQyMTc3Mjc7cmV0dXJuIHEhPT0wPyhtPXEmfkEsbSE9PTA/dz1RbihtKTooRCY9cSxEIT09MD93PVFuKEQpOnV8fCh1PXEmfnIsdSE9PTAmJih3PVFuKHUpKSkpKToocT1tJn5BLHEhPT0wP3c9UW4ocSk6RCE9PTA/dz1RbihEKTp1fHwodT1tJn5yLHUhPT0wJiYodz1Rbih1KSkpKSx3PT09MD8wOmEhPT0wJiZhIT09dyYmKGEmQSk9PT0wJiYoQT13Ji13LHU9YSYtYSxBPj11fHxBPT09MzImJih1JjQxOTQwNDgpIT09MCk/YTp3fWZ1bmN0aW9uIFByKHIsYSl7cmV0dXJuKHIucGVuZGluZ0xhbmVzJn4oci5zdXNwZW5kZWRMYW5lcyZ+ci5waW5nZWRMYW5lcykmYSk9PT0wfWZ1bmN0aW9uIGxzKHIsYSl7c3dpdGNoKHIpe2Nhc2UgMTpjYXNlIDI6Y2FzZSA0OmNhc2UgODpjYXNlIDY0OnJldHVybiBhKzI1MDtjYXNlIDE2OmNhc2UgMzI6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIGErNWUzO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOnJldHVybi0xO2Nhc2UgNjcxMDg4NjQ6Y2FzZSAxMzQyMTc3Mjg6Y2FzZSAyNjg0MzU0NTY6Y2FzZSA1MzY4NzA5MTI6Y2FzZSAxMDczNzQxODI0OnJldHVybi0xO2RlZmF1bHQ6cmV0dXJuLTF9fWZ1bmN0aW9uIEFfKCl7dmFyIHI9bmE7cmV0dXJuIG5hPDw9MSwobmEmNjI5MTQ1NjApPT09MCYmKG5hPTQxOTQzMDQpLHJ9ZnVuY3Rpb24gYWMocil7Zm9yKHZhciBhPVtdLHU9MDszMT51O3UrKylhLnB1c2gocik7cmV0dXJuIGF9ZnVuY3Rpb24gdXMocixhKXtyLnBlbmRpbmdMYW5lc3w9YSxhIT09MjY4NDM1NDU2JiYoci5zdXNwZW5kZWRMYW5lcz0wLHIucGluZ2VkTGFuZXM9MCxyLndhcm1MYW5lcz0wKX1mdW5jdGlvbiBMTChyLGEsdSxtLHcsQSl7dmFyIEQ9ci5wZW5kaW5nTGFuZXM7ci5wZW5kaW5nTGFuZXM9dSxyLnN1c3BlbmRlZExhbmVzPTAsci5waW5nZWRMYW5lcz0wLHIud2FybUxhbmVzPTAsci5leHBpcmVkTGFuZXMmPXUsci5lbnRhbmdsZWRMYW5lcyY9dSxyLmVycm9yUmVjb3ZlcnlEaXNhYmxlZExhbmVzJj11LHIuc2hlbGxTdXNwZW5kQ291bnRlcj0wO3ZhciBxPXIuZW50YW5nbGVtZW50cyxZPXIuZXhwaXJhdGlvblRpbWVzLHJlPXIuaGlkZGVuVXBkYXRlcztmb3IodT1EJn51OzA8dTspe3ZhciBkZT0zMS1KZSh1KSxwZT0xPDxkZTtxW2RlXT0wLFlbZGVdPS0xO3ZhciBhZT1yZVtkZV07aWYoYWUhPT1udWxsKWZvcihyZVtkZV09bnVsbCxkZT0wO2RlPGFlLmxlbmd0aDtkZSsrKXt2YXIgb2U9YWVbZGVdO29lIT09bnVsbCYmKG9lLmxhbmUmPS01MzY4NzA5MTMpfXUmPX5wZX1tIT09MCYmUl8ocixtLDApLEEhPT0wJiZ3PT09MCYmci50YWchPT0wJiYoci5zdXNwZW5kZWRMYW5lc3w9QSZ+KEQmfmEpKX1mdW5jdGlvbiBSXyhyLGEsdSl7ci5wZW5kaW5nTGFuZXN8PWEsci5zdXNwZW5kZWRMYW5lcyY9fmE7dmFyIG09MzEtSmUoYSk7ci5lbnRhbmdsZWRMYW5lc3w9YSxyLmVudGFuZ2xlbWVudHNbbV09ci5lbnRhbmdsZW1lbnRzW21dfDEwNzM3NDE4MjR8dSYyNjE5MzB9ZnVuY3Rpb24ga18ocixhKXt2YXIgdT1yLmVudGFuZ2xlZExhbmVzfD1hO2ZvcihyPXIuZW50YW5nbGVtZW50czt1Oyl7dmFyIG09MzEtSmUodSksdz0xPDxtO3cmYXxyW21dJmEmJihyW21dfD1hKSx1Jj1+d319ZnVuY3Rpb24gTl8ocixhKXt2YXIgdT1hJi1hO3JldHVybiB1PSh1JjQyKSE9PTA/MTpzYyh1KSwodSYoci5zdXNwZW5kZWRMYW5lc3xhKSkhPT0wPzA6dX1mdW5jdGlvbiBzYyhyKXtzd2l0Y2gocil7Y2FzZSAyOnI9MTticmVhaztjYXNlIDg6cj00O2JyZWFrO2Nhc2UgMzI6cj0xNjticmVhaztjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpyPTEyODticmVhaztjYXNlIDI2ODQzNTQ1NjpyPTEzNDIxNzcyODticmVhaztkZWZhdWx0OnI9MH1yZXR1cm4gcn1mdW5jdGlvbiBvYyhyKXtyZXR1cm4gciY9LXIsMjxyPzg8cj8ociYxMzQyMTc3MjcpIT09MD8zMjoyNjg0MzU0NTY6ODoyfWZ1bmN0aW9uIE9fKCl7dmFyIHI9Si5wO3JldHVybiByIT09MD9yOihyPXdpbmRvdy5ldmVudCxyPT09dm9pZCAwPzMyOmd4KHIudHlwZSkpfWZ1bmN0aW9uIElfKHIsYSl7dmFyIHU9Si5wO3RyeXtyZXR1cm4gSi5wPXIsYSgpfWZpbmFsbHl7Si5wPXV9fXZhciBVcj1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxVdD0iX19yZWFjdEZpYmVyJCIrVXIscm49Il9fcmVhY3RQcm9wcyQiK1VyLHJhPSJfX3JlYWN0Q29udGFpbmVyJCIrVXIsbGM9Il9fcmVhY3RFdmVudHMkIitVcixETD0iX19yZWFjdExpc3RlbmVycyQiK1VyLE1MPSJfX3JlYWN0SGFuZGxlcyQiK1VyLExfPSJfX3JlYWN0UmVzb3VyY2VzJCIrVXIsY3M9Il9fcmVhY3RNYXJrZXIkIitVcjtmdW5jdGlvbiB1YyhyKXtkZWxldGUgcltVdF0sZGVsZXRlIHJbcm5dLGRlbGV0ZSByW2xjXSxkZWxldGUgcltETF0sZGVsZXRlIHJbTUxdfWZ1bmN0aW9uIGlhKHIpe3ZhciBhPXJbVXRdO2lmKGEpcmV0dXJuIGE7Zm9yKHZhciB1PXIucGFyZW50Tm9kZTt1Oyl7aWYoYT11W3JhXXx8dVtVdF0pe2lmKHU9YS5hbHRlcm5hdGUsYS5jaGlsZCE9PW51bGx8fHUhPT1udWxsJiZ1LmNoaWxkIT09bnVsbClmb3Iocj1leChyKTtyIT09bnVsbDspe2lmKHU9cltVdF0pcmV0dXJuIHU7cj1leChyKX1yZXR1cm4gYX1yPXUsdT1yLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gYWEocil7aWYocj1yW1V0XXx8cltyYV0pe3ZhciBhPXIudGFnO2lmKGE9PT01fHxhPT09Nnx8YT09PTEzfHxhPT09MzF8fGE9PT0yNnx8YT09PTI3fHxhPT09MylyZXR1cm4gcn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBkcyhyKXt2YXIgYT1yLnRhZztpZihhPT09NXx8YT09PTI2fHxhPT09Mjd8fGE9PT02KXJldHVybiByLnN0YXRlTm9kZTt0aHJvdyBFcnJvcihpKDMzKSl9ZnVuY3Rpb24gc2Eocil7dmFyIGE9cltMX107cmV0dXJuIGF8fChhPXJbTF9dPXtob2lzdGFibGVTdHlsZXM6bmV3IE1hcCxob2lzdGFibGVTY3JpcHRzOm5ldyBNYXB9KSxhfWZ1bmN0aW9uIEZ0KHIpe3JbY3NdPSEwfXZhciBEXz1uZXcgU2V0LE1fPXt9O2Z1bmN0aW9uIEVpKHIsYSl7b2EocixhKSxvYShyKyJDYXB0dXJlIixhKX1mdW5jdGlvbiBvYShyLGEpe2ZvcihNX1tyXT1hLHI9MDtyPGEubGVuZ3RoO3IrKylEXy5hZGQoYVtyXSl9dmFyIEJMPVJlZ0V4cCgiXls6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF1bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0qJCIpLEJfPXt9LEZfPXt9O2Z1bmN0aW9uIEZMKHIpe3JldHVybiBNdC5jYWxsKEZfLHIpPyEwOk10LmNhbGwoQl8scik/ITE6QkwudGVzdChyKT9GX1tyXT0hMDooQl9bcl09ITAsITEpfWZ1bmN0aW9uIE1vKHIsYSx1KXtpZihGTChhKSlpZih1PT09bnVsbClyLnJlbW92ZUF0dHJpYnV0ZShhKTtlbHNle3N3aXRjaCh0eXBlb2YgdSl7Y2FzZSJ1bmRlZmluZWQiOmNhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjpyLnJlbW92ZUF0dHJpYnV0ZShhKTtyZXR1cm47Y2FzZSJib29sZWFuIjp2YXIgbT1hLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KTtpZihtIT09ImRhdGEtIiYmbSE9PSJhcmlhLSIpe3IucmVtb3ZlQXR0cmlidXRlKGEpO3JldHVybn19ci5zZXRBdHRyaWJ1dGUoYSwiIit1KX19ZnVuY3Rpb24gQm8ocixhLHUpe2lmKHU9PT1udWxsKXIucmVtb3ZlQXR0cmlidXRlKGEpO2Vsc2V7c3dpdGNoKHR5cGVvZiB1KXtjYXNlInVuZGVmaW5lZCI6Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOmNhc2UiYm9vbGVhbiI6ci5yZW1vdmVBdHRyaWJ1dGUoYSk7cmV0dXJufXIuc2V0QXR0cmlidXRlKGEsIiIrdSl9fWZ1bmN0aW9uIHByKHIsYSx1LG0pe2lmKG09PT1udWxsKXIucmVtb3ZlQXR0cmlidXRlKHUpO2Vsc2V7c3dpdGNoKHR5cGVvZiBtKXtjYXNlInVuZGVmaW5lZCI6Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOmNhc2UiYm9vbGVhbiI6ci5yZW1vdmVBdHRyaWJ1dGUodSk7cmV0dXJufXIuc2V0QXR0cmlidXRlTlMoYSx1LCIiK20pfX1mdW5jdGlvbiBPbihyKXtzd2l0Y2godHlwZW9mIHIpe2Nhc2UiYmlnaW50IjpjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiByO2Nhc2Uib2JqZWN0IjpyZXR1cm4gcjtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBQXyhyKXt2YXIgYT1yLnR5cGU7cmV0dXJuKHI9ci5ub2RlTmFtZSkmJnIudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJihhPT09ImNoZWNrYm94Inx8YT09PSJyYWRpbyIpfWZ1bmN0aW9uIFBMKHIsYSx1KXt2YXIgbT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIuY29uc3RydWN0b3IucHJvdG90eXBlLGEpO2lmKCFyLmhhc093blByb3BlcnR5KGEpJiZ0eXBlb2YgbTwidSImJnR5cGVvZiBtLmdldD09ImZ1bmN0aW9uIiYmdHlwZW9mIG0uc2V0PT0iZnVuY3Rpb24iKXt2YXIgdz1tLmdldCxBPW0uc2V0O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocixhLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHcuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKEQpe3U9IiIrRCxBLmNhbGwodGhpcyxEKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixhLHtlbnVtZXJhYmxlOm0uZW51bWVyYWJsZX0pLHtnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB1fSxzZXRWYWx1ZTpmdW5jdGlvbihEKXt1PSIiK0R9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe3IuX3ZhbHVlVHJhY2tlcj1udWxsLGRlbGV0ZSByW2FdfX19fWZ1bmN0aW9uIGNjKHIpe2lmKCFyLl92YWx1ZVRyYWNrZXIpe3ZhciBhPVBfKHIpPyJjaGVja2VkIjoidmFsdWUiO3IuX3ZhbHVlVHJhY2tlcj1QTChyLGEsIiIrclthXSl9fWZ1bmN0aW9uIFVfKHIpe2lmKCFyKXJldHVybiExO3ZhciBhPXIuX3ZhbHVlVHJhY2tlcjtpZighYSlyZXR1cm4hMDt2YXIgdT1hLmdldFZhbHVlKCksbT0iIjtyZXR1cm4gciYmKG09UF8ocik/ci5jaGVja2VkPyJ0cnVlIjoiZmFsc2UiOnIudmFsdWUpLHI9bSxyIT09dT8oYS5zZXRWYWx1ZShyKSwhMCk6ITF9ZnVuY3Rpb24gRm8ocil7aWYocj1yfHwodHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudDp2b2lkIDApLHR5cGVvZiByPiJ1IilyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIHIuYWN0aXZlRWxlbWVudHx8ci5ib2R5fWNhdGNoe3JldHVybiByLmJvZHl9fXZhciBVTD0vW1xuIlxcXS9nO2Z1bmN0aW9uIEluKHIpe3JldHVybiByLnJlcGxhY2UoVUwsZnVuY3Rpb24oYSl7cmV0dXJuIlxcIithLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKyIgIn0pfWZ1bmN0aW9uIGRjKHIsYSx1LG0sdyxBLEQscSl7ci5uYW1lPSIiLEQhPW51bGwmJnR5cGVvZiBEIT0iZnVuY3Rpb24iJiZ0eXBlb2YgRCE9InN5bWJvbCImJnR5cGVvZiBEIT0iYm9vbGVhbiI/ci50eXBlPUQ6ci5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxhIT1udWxsP0Q9PT0ibnVtYmVyIj8oYT09PTAmJnIudmFsdWU9PT0iInx8ci52YWx1ZSE9YSkmJihyLnZhbHVlPSIiK09uKGEpKTpyLnZhbHVlIT09IiIrT24oYSkmJihyLnZhbHVlPSIiK09uKGEpKTpEIT09InN1Ym1pdCImJkQhPT0icmVzZXQifHxyLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKSxhIT1udWxsP2hjKHIsRCxPbihhKSk6dSE9bnVsbD9oYyhyLEQsT24odSkpOm0hPW51bGwmJnIucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpLHc9PW51bGwmJkEhPW51bGwmJihyLmRlZmF1bHRDaGVja2VkPSEhQSksdyE9bnVsbCYmKHIuY2hlY2tlZD13JiZ0eXBlb2YgdyE9ImZ1bmN0aW9uIiYmdHlwZW9mIHchPSJzeW1ib2wiKSxxIT1udWxsJiZ0eXBlb2YgcSE9ImZ1bmN0aW9uIiYmdHlwZW9mIHEhPSJzeW1ib2wiJiZ0eXBlb2YgcSE9ImJvb2xlYW4iP3IubmFtZT0iIitPbihxKTpyLnJlbW92ZUF0dHJpYnV0ZSgibmFtZSIpfWZ1bmN0aW9uIGpfKHIsYSx1LG0sdyxBLEQscSl7aWYoQSE9bnVsbCYmdHlwZW9mIEEhPSJmdW5jdGlvbiImJnR5cGVvZiBBIT0ic3ltYm9sIiYmdHlwZW9mIEEhPSJib29sZWFuIiYmKHIudHlwZT1BKSxhIT1udWxsfHx1IT1udWxsKXtpZighKEEhPT0ic3VibWl0IiYmQSE9PSJyZXNldCJ8fGEhPW51bGwpKXtjYyhyKTtyZXR1cm59dT11IT1udWxsPyIiK09uKHUpOiIiLGE9YSE9bnVsbD8iIitPbihhKTp1LHF8fGE9PT1yLnZhbHVlfHwoci52YWx1ZT1hKSxyLmRlZmF1bHRWYWx1ZT1hfW09bT8/dyxtPXR5cGVvZiBtIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbSE9InN5bWJvbCImJiEhbSxyLmNoZWNrZWQ9cT9yLmNoZWNrZWQ6ISFtLHIuZGVmYXVsdENoZWNrZWQ9ISFtLEQhPW51bGwmJnR5cGVvZiBEIT0iZnVuY3Rpb24iJiZ0eXBlb2YgRCE9InN5bWJvbCImJnR5cGVvZiBEIT0iYm9vbGVhbiImJihyLm5hbWU9RCksY2Mocil9ZnVuY3Rpb24gaGMocixhLHUpe2E9PT0ibnVtYmVyIiYmRm8oci5vd25lckRvY3VtZW50KT09PXJ8fHIuZGVmYXVsdFZhbHVlPT09IiIrdXx8KHIuZGVmYXVsdFZhbHVlPSIiK3UpfWZ1bmN0aW9uIGxhKHIsYSx1LG0pe2lmKHI9ci5vcHRpb25zLGEpe2E9e307Zm9yKHZhciB3PTA7dzx1Lmxlbmd0aDt3KyspYVsiJCIrdVt3XV09ITA7Zm9yKHU9MDt1PHIubGVuZ3RoO3UrKyl3PWEuaGFzT3duUHJvcGVydHkoIiQiK3JbdV0udmFsdWUpLHJbdV0uc2VsZWN0ZWQhPT13JiYoclt1XS5zZWxlY3RlZD13KSx3JiZtJiYoclt1XS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Zm9yKHU9IiIrT24odSksYT1udWxsLHc9MDt3PHIubGVuZ3RoO3crKyl7aWYoclt3XS52YWx1ZT09PXUpe3Jbd10uc2VsZWN0ZWQ9ITAsbSYmKHJbd10uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59YSE9PW51bGx8fHJbd10uZGlzYWJsZWR8fChhPXJbd10pfWEhPT1udWxsJiYoYS5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIHpfKHIsYSx1KXtpZihhIT1udWxsJiYoYT0iIitPbihhKSxhIT09ci52YWx1ZSYmKHIudmFsdWU9YSksdT09bnVsbCkpe3IuZGVmYXVsdFZhbHVlIT09YSYmKHIuZGVmYXVsdFZhbHVlPWEpO3JldHVybn1yLmRlZmF1bHRWYWx1ZT11IT1udWxsPyIiK09uKHUpOiIifWZ1bmN0aW9uIEhfKHIsYSx1LG0pe2lmKGE9PW51bGwpe2lmKG0hPW51bGwpe2lmKHUhPW51bGwpdGhyb3cgRXJyb3IoaSg5MikpO2lmKEsobSkpe2lmKDE8bS5sZW5ndGgpdGhyb3cgRXJyb3IoaSg5MykpO209bVswXX11PW19dT09bnVsbCYmKHU9IiIpLGE9dX11PU9uKGEpLHIuZGVmYXVsdFZhbHVlPXUsbT1yLnRleHRDb250ZW50LG09PT11JiZtIT09IiImJm0hPT1udWxsJiYoci52YWx1ZT1tKSxjYyhyKX1mdW5jdGlvbiB1YShyLGEpe2lmKGEpe3ZhciB1PXIuZmlyc3RDaGlsZDtpZih1JiZ1PT09ci5sYXN0Q2hpbGQmJnUubm9kZVR5cGU9PT0zKXt1Lm5vZGVWYWx1ZT1hO3JldHVybn19ci50ZXh0Q29udGVudD1hfXZhciBqTD1uZXcgU2V0KCJhbmltYXRpb25JdGVyYXRpb25Db3VudCBhc3BlY3RSYXRpbyBib3JkZXJJbWFnZU91dHNldCBib3JkZXJJbWFnZVNsaWNlIGJvcmRlckltYWdlV2lkdGggYm94RmxleCBib3hGbGV4R3JvdXAgYm94T3JkaW5hbEdyb3VwIGNvbHVtbkNvdW50IGNvbHVtbnMgZmxleCBmbGV4R3JvdyBmbGV4UG9zaXRpdmUgZmxleFNocmluayBmbGV4TmVnYXRpdmUgZmxleE9yZGVyIGdyaWRBcmVhIGdyaWRSb3cgZ3JpZFJvd0VuZCBncmlkUm93U3BhbiBncmlkUm93U3RhcnQgZ3JpZENvbHVtbiBncmlkQ29sdW1uRW5kIGdyaWRDb2x1bW5TcGFuIGdyaWRDb2x1bW5TdGFydCBmb250V2VpZ2h0IGxpbmVDbGFtcCBsaW5lSGVpZ2h0IG9wYWNpdHkgb3JkZXIgb3JwaGFucyBzY2FsZSB0YWJTaXplIHdpZG93cyB6SW5kZXggem9vbSBmaWxsT3BhY2l0eSBmbG9vZE9wYWNpdHkgc3RvcE9wYWNpdHkgc3Ryb2tlRGFzaGFycmF5IHN0cm9rZURhc2hvZmZzZXQgc3Ryb2tlTWl0ZXJsaW1pdCBzdHJva2VPcGFjaXR5IHN0cm9rZVdpZHRoIE1vekFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IE1vekJveEZsZXggTW96Qm94RmxleEdyb3VwIE1vekxpbmVDbGFtcCBtc0FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IG1zRmxleCBtc1pvb20gbXNGbGV4R3JvdyBtc0ZsZXhOZWdhdGl2ZSBtc0ZsZXhPcmRlciBtc0ZsZXhQb3NpdGl2ZSBtc0ZsZXhTaHJpbmsgbXNHcmlkQ29sdW1uIG1zR3JpZENvbHVtblNwYW4gbXNHcmlkUm93IG1zR3JpZFJvd1NwYW4gV2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgV2Via2l0Qm94RmxleCBXZWJLaXRCb3hGbGV4R3JvdXAgV2Via2l0Qm94T3JkaW5hbEdyb3VwIFdlYmtpdENvbHVtbkNvdW50IFdlYmtpdENvbHVtbnMgV2Via2l0RmxleCBXZWJraXRGbGV4R3JvdyBXZWJraXRGbGV4UG9zaXRpdmUgV2Via2l0RmxleFNocmluayBXZWJraXRMaW5lQ2xhbXAiLnNwbGl0KCIgIikpO2Z1bmN0aW9uIHFfKHIsYSx1KXt2YXIgbT1hLmluZGV4T2YoIi0tIik9PT0wO3U9PW51bGx8fHR5cGVvZiB1PT0iYm9vbGVhbiJ8fHU9PT0iIj9tP3Iuc2V0UHJvcGVydHkoYSwiIik6YT09PSJmbG9hdCI/ci5jc3NGbG9hdD0iIjpyW2FdPSIiOm0/ci5zZXRQcm9wZXJ0eShhLHUpOnR5cGVvZiB1IT0ibnVtYmVyInx8dT09PTB8fGpMLmhhcyhhKT9hPT09ImZsb2F0Ij9yLmNzc0Zsb2F0PXU6clthXT0oIiIrdSkudHJpbSgpOnJbYV09dSsicHgifWZ1bmN0aW9uICRfKHIsYSx1KXtpZihhIT1udWxsJiZ0eXBlb2YgYSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoaSg2MikpO2lmKHI9ci5zdHlsZSx1IT1udWxsKXtmb3IodmFyIG0gaW4gdSkhdS5oYXNPd25Qcm9wZXJ0eShtKXx8YSE9bnVsbCYmYS5oYXNPd25Qcm9wZXJ0eShtKXx8KG0uaW5kZXhPZigiLS0iKT09PTA/ci5zZXRQcm9wZXJ0eShtLCIiKTptPT09ImZsb2F0Ij9yLmNzc0Zsb2F0PSIiOnJbbV09IiIpO2Zvcih2YXIgdyBpbiBhKW09YVt3XSxhLmhhc093blByb3BlcnR5KHcpJiZ1W3ddIT09bSYmcV8ocix3LG0pfWVsc2UgZm9yKHZhciBBIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShBKSYmcV8ocixBLGFbQV0pfWZ1bmN0aW9uIGZjKHIpe2lmKHIuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuITE7c3dpdGNoKHIpe2Nhc2UiYW5ub3RhdGlvbi14bWwiOmNhc2UiY29sb3ItcHJvZmlsZSI6Y2FzZSJmb250LWZhY2UiOmNhc2UiZm9udC1mYWNlLXNyYyI6Y2FzZSJmb250LWZhY2UtdXJpIjpjYXNlImZvbnQtZmFjZS1mb3JtYXQiOmNhc2UiZm9udC1mYWNlLW5hbWUiOmNhc2UibWlzc2luZy1nbHlwaCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19dmFyIHpMPW5ldyBNYXAoW1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il0sWyJjcm9zc09yaWdpbiIsImNyb3Nzb3JpZ2luIl0sWyJhY2NlbnRIZWlnaHQiLCJhY2NlbnQtaGVpZ2h0Il0sWyJhbGlnbm1lbnRCYXNlbGluZSIsImFsaWdubWVudC1iYXNlbGluZSJdLFsiYXJhYmljRm9ybSIsImFyYWJpYy1mb3JtIl0sWyJiYXNlbGluZVNoaWZ0IiwiYmFzZWxpbmUtc2hpZnQiXSxbImNhcEhlaWdodCIsImNhcC1oZWlnaHQiXSxbImNsaXBQYXRoIiwiY2xpcC1wYXRoIl0sWyJjbGlwUnVsZSIsImNsaXAtcnVsZSJdLFsiY29sb3JJbnRlcnBvbGF0aW9uIiwiY29sb3ItaW50ZXJwb2xhdGlvbiJdLFsiY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycyIsImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyJdLFsiY29sb3JQcm9maWxlIiwiY29sb3ItcHJvZmlsZSJdLFsiY29sb3JSZW5kZXJpbmciLCJjb2xvci1yZW5kZXJpbmciXSxbImRvbWluYW50QmFzZWxpbmUiLCJkb21pbmFudC1iYXNlbGluZSJdLFsiZW5hYmxlQmFja2dyb3VuZCIsImVuYWJsZS1iYWN