moflo 4.13.0 → 4.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,10 +16,10 @@
16
16
  export const EMBEDDED_HELPERS_BASE64 = {
17
17
  "auto-memory-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQovKioKICogQXV0byBNZW1vcnkgQnJpZGdlIEhvb2sgKEFEUi0wNDgvMDQ5KSDigJQgTWluaW1hbCBGYWxsYmFjawogKiBGdWxsIHZlcnNpb24gaXMgY29waWVkIGZyb20gcGFja2FnZSBzb3VyY2Ugd2hlbiBhdmFpbGFibGUuCiAqCiAqIFVzYWdlOgogKiAgIG5vZGUgYXV0by1tZW1vcnktaG9vay5tanMgaW1wb3J0ICAgIyBTZXNzaW9uU3RhcnQKICogICBub2RlIGF1dG8tbWVtb3J5LWhvb2subWpzIHN5bmMgICAgICMgU2Vzc2lvbkVuZCAvIFN0b3AKICogICBub2RlIGF1dG8tbWVtb3J5LWhvb2subWpzIHN0YXR1cyAgICMgU2hvdyBicmlkZ2Ugc3RhdHVzCiAqLwoKaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnZnMnOwppbXBvcnQgeyBqb2luLCBkaXJuYW1lIH0gZnJvbSAncGF0aCc7CmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnOwoKY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTsKY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShfX2ZpbGVuYW1lKTsKY29uc3QgUFJPSkVDVF9ST09UID0gam9pbihfX2Rpcm5hbWUsICcuLi8uLicpOwpjb25zdCBEQVRBX0RJUiA9IGpvaW4oUFJPSkVDVF9ST09ULCAnLm1vZmxvJywgJ2RhdGEnKTsKY29uc3QgU1RPUkVfUEFUSCA9IGpvaW4oREFUQV9ESVIsICdhdXRvLW1lbW9yeS1zdG9yZS5qc29uJyk7Cgpjb25zdCBESU0gPSAnXHgxYlsybSc7CmNvbnN0IFJFU0VUID0gJ1x4MWJbMG0nOwpjb25zdCBkaW0gPSAobXNnKSA9PiBjb25zb2xlLmxvZyhgICAke0RJTX0ke21zZ30ke1JFU0VUfWApOwoKLy8gRW5zdXJlIGRhdGEgZGlyCmlmICghZXhpc3RzU3luYyhEQVRBX0RJUikpIG1rZGlyU3luYyhEQVRBX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7Cgphc3luYyBmdW5jdGlvbiBsb2FkTWVtb3J5UGFja2FnZSgpIHsKICAvLyBNZW1vcnkgd2FzIGlubGluZWQgaW50byBtb2ZsbydzIGNsaSBwYWNrYWdlIGJ5IHRoZSB3b3Jrc3BhY2UtY29sbGFwc2UgZXBpYwogIC8vICgjNTg2IC8gc3RvcnkgIzU5OCkg4oCUIHRoZSBiYXJlIGBAbW9mbG8vbWVtb3J5YCBzcGVjaWZpZXIgbm8gbG9uZ2VyIHJlc29sdmVzLgogIC8vIEFmdGVyIHRoZSBmaW5hbCBjbGkgY29sbGFwc2UgKCM2MDIpIHRoZSBjb21waWxlZCBtb2R1bGUgc2hpcHMgYXQKICAvLyA8bW9mbG8tcGtnLXJvb3Q+L2Rpc3Qvc3JjL2NsaS9tZW1vcnkvaW5kZXguanMuCiAgY29uc3QgTUVNT1JZX1JFTCA9IGpvaW4oJ2Rpc3QnLCAnc3JjJywgJ2NsaScsICdtZW1vcnknLCAnaW5kZXguanMnKTsKICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydCgndXJsJyk7CgogIC8vIFN0cmF0ZWd5IDE6IFJlc29sdmUgbW9mbG8ncyBwYWNrYWdlLmpzb24gZGlyZWN0bHkgZnJvbSB0aGUgY29uc3VtZXIKICAvLyBwcm9qZWN0IOKAlCBpdHMgZGlybmFtZSBJUyB0aGUgcGFja2FnZSByb290LCBubyB3YWxrIG5lZWRlZC4KICB0cnkgewogICAgY29uc3QgeyBjcmVhdGVSZXF1aXJlIH0gPSBhd2FpdCBpbXBvcnQoJ21vZHVsZScpOwogICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoam9pbihQUk9KRUNUX1JPT1QsICdwYWNrYWdlLmpzb24nKSk7CiAgICBjb25zdCBwa2dSb290ID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUoJ21vZmxvL3BhY2thZ2UuanNvbicpKTsKICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGpvaW4ocGtnUm9vdCwgTUVNT1JZX1JFTCk7CiAgICBpZiAoZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoY2FuZGlkYXRlKS5ocmVmKTsKICB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH0KCiAgLy8gU3RyYXRlZ3kgMjogV2FsayB1cCBmcm9tIFBST0pFQ1RfUk9PVCBsb29raW5nIGZvciBtb2ZsbyBpbiBhbnkgbm9kZV9tb2R1bGVzLgogIGxldCBzZWFyY2hEaXIgPSBQUk9KRUNUX1JPT1Q7CiAgY29uc3QgeyBwYXJzZSB9ID0gYXdhaXQgaW1wb3J0KCdwYXRoJyk7CiAgd2hpbGUgKHNlYXJjaERpciAhPT0gcGFyc2Uoc2VhcmNoRGlyKS5yb290KSB7CiAgICBjb25zdCBjYW5kaWRhdGUgPSBqb2luKHNlYXJjaERpciwgJ25vZGVfbW9kdWxlcycsICdtb2ZsbycsIE1FTU9SWV9SRUwpOwogICAgaWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgewogICAgICB0cnkgeyByZXR1cm4gYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoY2FuZGlkYXRlKS5ocmVmKTsgfSBjYXRjaCB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9CiAgICB9CiAgICBzZWFyY2hEaXIgPSBkaXJuYW1lKHNlYXJjaERpcik7CiAgfQoKICByZXR1cm4gbnVsbDsKfQoKYXN5bmMgZnVuY3Rpb24gZG9JbXBvcnQoKSB7CiAgY29uc3QgbWVtUGtnID0gYXdhaXQgbG9hZE1lbW9yeVBhY2thZ2UoKTsKCiAgaWYgKCFtZW1Qa2cgfHwgIW1lbVBrZy5BdXRvTWVtb3J5QnJpZGdlKSB7CiAgICBkaW0oJ01lbW9yeSBwYWNrYWdlIG5vdCBhdmFpbGFibGUg4oCUIGF1dG8gbWVtb3J5IGltcG9ydCBza2lwcGVkIChub24tY3JpdGljYWwpJyk7CiAgICByZXR1cm47CiAgfQoKICAvLyBGdWxsIGltcGxlbWVudGF0aW9uIGRlZmVycmVkIHRvIGNvcGllZCB2ZXJzaW9uCiAgZGltKCdBdXRvIG1lbW9yeSBpbXBvcnQgYXZhaWxhYmxlIOKAlCBydW4gaW5pdCAtLXVwZ3JhZGUgZm9yIGZ1bGwgc3VwcG9ydCcpOwp9Cgphc3luYyBmdW5jdGlvbiBkb1N5bmMoKSB7CiAgaWYgKCFleGlzdHNTeW5jKFNUT1JFX1BBVEgpKSB7CiAgICBkaW0oJ05vIGVudHJpZXMgdG8gc3luYycpOwogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgbWVtUGtnID0gYXdhaXQgbG9hZE1lbW9yeVBhY2thZ2UoKTsKCiAgaWYgKCFtZW1Qa2cgfHwgIW1lbVBrZy5BdXRvTWVtb3J5QnJpZGdlKSB7CiAgICBkaW0oJ01lbW9yeSBwYWNrYWdlIG5vdCBhdmFpbGFibGUg4oCUIHN5bmMgc2tpcHBlZCAobm9uLWNyaXRpY2FsKScpOwogICAgcmV0dXJuOwogIH0KCiAgZGltKCdBdXRvIG1lbW9yeSBzeW5jIGF2YWlsYWJsZSDigJQgcnVuIGluaXQgLS11cGdyYWRlIGZvciBmdWxsIHN1cHBvcnQnKTsKfQoKZnVuY3Rpb24gZG9TdGF0dXMoKSB7CiAgY29uc29sZS5sb2coJ1xuPT09IEF1dG8gTWVtb3J5IEJyaWRnZSBTdGF0dXMgPT09XG4nKTsKICBjb25zb2xlLmxvZygnICBQYWNrYWdlOiAgICAgICAgRmFsbGJhY2sgbW9kZSAocnVuIGluaXQgLS11cGdyYWRlIGZvciBmdWxsKScpOwogIGNvbnNvbGUubG9nKGAgIFN0b3JlOiAgICAgICAgICAke2V4aXN0c1N5bmMoU1RPUkVfUEFUSCkgPyAnSW5pdGlhbGl6ZWQnIDogJ05vdCBpbml0aWFsaXplZCd9YCk7CiAgY29uc29sZS5sb2coJycpOwp9Cgpjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5hcmd2WzJdIHx8ICdzdGF0dXMnOwoKdHJ5IHsKICBzd2l0Y2ggKGNvbW1hbmQpIHsKICAgIGNhc2UgJ2ltcG9ydCc6IGF3YWl0IGRvSW1wb3J0KCk7IGJyZWFrOwogICAgY2FzZSAnc3luYyc6IGF3YWl0IGRvU3luYygpOyBicmVhazsKICAgIGNhc2UgJ3N0YXR1cyc6IGRvU3RhdHVzKCk7IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5sb2coJ1VzYWdlOiBhdXRvLW1lbW9yeS1ob29rLm1qcyA8aW1wb3J0fHN5bmN8c3RhdHVzPicpOwogICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgfQp9IGNhdGNoIChlcnIpIHsKICAvLyBIb29rcyBtdXN0IG5ldmVyIGNyYXNoIENsYXVkZSBDb2RlIC0gZmFpbCBzaWxlbnRseQogIGRpbShgRXJyb3IgKG5vbi1jcml0aWNhbCk6ICR7ZXJyLm1lc3NhZ2V9YCk7Cn0K",
18
18
  "gate-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJzsKaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnOwoKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07CmlmICghY29tbWFuZCkgcHJvY2Vzcy5leGl0KDApOwoKLy8gUmVhZCBzdGRpbiBKU09OIGZyb20gQ2xhdWRlIENvZGUKdmFyIHN0ZGluRGF0YSA9ICcnOwp0cnkgewogIHN0ZGluRGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgdmFyIGRhdGEgPSAnJzsKICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgcmVzKGRhdGEpOyB9LCA1MDApOwogICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmLTgnKTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykgeyBkYXRhICs9IGNodW5rOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcyhkYXRhKTsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcygnJyk7IH0pOwogICAgaWYgKHByb2Nlc3Muc3RkaW4uaXNUVFkpIHsgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOyByZXMoJycpOyB9CiAgfSk7Cn0gY2F0Y2ggKGUpIHsgLyogbm8gc3RkaW4gKi8gfQoKdmFyIGhvb2tDb250ZXh0ID0ge307CnRyeSB7IGlmIChzdGRpbkRhdGEudHJpbSgpKSBob29rQ29udGV4dCA9IEpTT04ucGFyc2Uoc3RkaW5EYXRhKTsgfSBjYXRjaCAoZSkge30KCi8vIFBhc3MgdG9vbCBpbmZvIGFzIGVudiB2YXJzIGZvciBnYXRlLmNqcwp2YXIgZW52ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYpOwppZiAoaG9va0NvbnRleHQudG9vbF9uYW1lKSBlbnYuVE9PTF9OQU1FID0gaG9va0NvbnRleHQudG9vbF9uYW1lOwovLyBGb3J3YXJkIENsYXVkZSBDb2RlJ3Mgc2Vzc2lvbl9pZCBzbyBnYXRlLmNqcyBjYW4gZW5mb3JjZSBtZW1vcnktZmlyc3QKLy8gcGVyLWFjdG9yICgjODM4KSDigJQgZWFjaCBzcGF3bmVkIHN1YmFnZW50IGdldHMgaXRzIG93biBzZXNzaW9uX2lkLCBzbyBhCi8vIHNoYXJlZCB3b3JrZmxvdy1zdGF0ZS5qc29uIG5vIGxvbmdlciBsZXRzIG9uZSBzdWJhZ2VudCdzIGRpcmVjdGl2ZSBiZQovLyBzaWxlbnRseSBzYXRpc2ZpZWQgYnkgdGhlIHBhcmVudCdzIGVhcmxpZXIgc2VhcmNoLgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnNlc3Npb25faWQgPT09ICdzdHJpbmcnICYmIGhvb2tDb250ZXh0LnNlc3Npb25faWQpIHsKICBlbnYuSE9PS19TRVNTSU9OX0lEID0gaG9va0NvbnRleHQuc2Vzc2lvbl9pZDsKfQovLyAjMTM3NCDigJQgZm9yd2FyZCB0aGUgdHJhbnNjcmlwdCBwYXRoIHNvIGEgZ2F0ZSBjYW4gcmVhZCB3aGF0IHRoZSBzZXNzaW9uCi8vIGFjdHVhbGx5IERJRCwgbm90IG9ubHkgd2hhdCB3b3JrZmxvdy1zdGF0ZS5qc29uIHdhcyB0b2xkIGFib3V0IGl0LiBVc2VkIGJ5Ci8vIGNoZWNrLWJlZm9yZS1wciB0byBjb3VudCBUYXNrQ3JlYXRlIGNhbGxzIGFnYWluc3QgdGVybWluYWwgVGFza1VwZGF0ZSBjYWxsczsKLy8gdGhlIGFsdGVybmF0aXZlIOKAlCBhIGBeVGFza1VwZGF0ZSRgIFBvc3RUb29sVXNlIG9ic2VydmVyIOKAlCBpcyB0aGUgd2lyaW5nICMxMzMxCi8vIHJlbW92ZWQgYXMgcHVyZSBob3QtcGF0aCBvdmVyaGVhZCwgYW5kIHRoZSB0cmFuc2NyaXB0IGFscmVhZHkgaG9sZHMgdGhlIGFuc3dlci4KLy8gQWJzZW50IG9uIGhvc3RzIHRoYXQgZG9uJ3Qgc2VuZCBpdDogZ2F0ZXMgdHJlYXQgdGhhdCBhcyAidW5rbm93biIgYW5kIHN0YXkgc2lsZW50LgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnRyYW5zY3JpcHRfcGF0aCA9PT0gJ3N0cmluZycgJiYgaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoKSB7CiAgZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIID0gaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoOwp9Ci8vICMxNDQ3IOKAlCBmb3J3YXJkIHRoZSB1c2VyIHByb21wdC4gYGdhdGUuY2pzYCByZWFkcyBDTEFVREVfVVNFUl9QUk9NUFQgdG8gZGVjaWRlCi8vIHdoZXRoZXIgYSBwcm9tcHQgbmVlZHMgYSBtZW1vcnkgc2VhcmNoLCBhbmQgdGhpcyBicmlkZ2UgbmV2ZXIgc2V0IGl0LCBzbyB0aGUKLy8gYHByb21wdC1zdGF0ZS1yZXNldGAgc2FmZXR5LW5ldCBob29rIGNsYXNzaWZpZWQgdGhlIEVNUFRZIFNUUklORyBvbiBldmVyeQovLyBwcm9tcHQsIGNvbmNsdWRlZCAibm8gbWVtb3J5IHJlcXVpcmVkIiwgYW5kIHdyb3RlIHRoYXQgb3ZlciB0aGUgY29ycmVjdCB2YWx1ZQovLyBwcm9tcHQtaG9vay5tanMgaGFkIGp1c3QgY29tcHV0ZWQuIEEgc2FmZXR5IG5ldCB0aGF0IGRpc2FybWVkIHRoZSBnYXRlIGl0Ci8vIGV4aXN0cyB0byBwcm90ZWN0IOKAlCBpbnRlcm1pdHRlbnRseSwgc2luY2UgdGhlIHN1cnZpdmluZyB2YWx1ZSBkZXBlbmRlZCBvbgovLyB3aGljaCBvZiB0aGUgdHdvIFVzZXJQcm9tcHRTdWJtaXQgaG9va3Mgd3JvdGUgbGFzdC4KLy8KLy8gU2FtZSBmaWVsZCBwcmVjZWRlbmNlIGFzIHByb21wdC1ob29rLm1qcyAoYHVzZXJfcHJvbXB0YCB0aGVuIGBwcm9tcHRgKSBzbyBib3RoCi8vIFVzZXJQcm9tcHRTdWJtaXQgcGF0aHMgY2xhc3NpZnkgaWRlbnRpY2FsIHRleHQgYW5kIHRoZSByZXNldCBpcyBnZW51aW5lbHkKLy8gaWRlbXBvdGVudCwgd2hpY2ggaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBtYWtlcyBhIHNhZmV0eS1uZXQgaG9vayBzYWZlLgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnVzZXJfcHJvbXB0ID09PSAnc3RyaW5nJyAmJiBob29rQ29udGV4dC51c2VyX3Byb21wdCkgewogIGVudi5DTEFVREVfVVNFUl9QUk9NUFQgPSBob29rQ29udGV4dC51c2VyX3Byb21wdDsKfSBlbHNlIGlmICh0eXBlb2YgaG9va0NvbnRleHQucHJvbXB0ID09PSAnc3RyaW5nJyAmJiBob29rQ29udGV4dC5wcm9tcHQpIHsKICBlbnYuQ0xBVURFX1VTRVJfUFJPTVBUID0gaG9va0NvbnRleHQucHJvbXB0Owp9Ci8vICMxMzMyOiBzdHJ1Y3R1cmVkIHRvb2wgaW5wdXRzIGFyZSBmb3J3YXJkZWQgYXMgSlNPTiwgbm90IGRyb3BwZWQuCi8vCi8vIFRoaXMgcHJldmlvdXNseSBmb3J3YXJkZWQgT05MWSBzdHJpbmcgdmFsdWVzLCBzbyBhbnkgb2JqZWN0LXZhbHVlZCBpbnB1dCB3YXMKLy8gaW52aXNpYmxlIHRvIGdhdGUuY2pzLiBUaGF0IGJsb2NrZWQgdGhlIHZlcmlmeS1iZWZvcmUtZG9uZSBnYXRlIGZyb20gcmVhZGluZwovLyBgL3ZlcmlmeWAncyBwZXItY3JpdGVyaW9uIHZlcmRpY3QsIHdoaWNoICMxMzI4IHN0b3JlcyBpbiBtZW1vcnlfc3RvcmUncwovLyBgbWV0YWRhdGFgIOKAlCBhbiBvYmplY3QuIFBhcnNpbmcgdGhlIHZlcmRpY3Qgb3V0IG9mIHRoZSBwcm9zZSBgdmFsdWVgIHN0cmluZwovLyBpbnN0ZWFkIHdvdWxkIHJlLWNyZWF0ZSBleGFjdGx5IHRoZSBmcmVlLXRleHQgZGVwZW5kZW5jeSAjMTMyOCByZW1vdmVkLgovLwovLyBDcm9zcy1wbGF0Zm9ybSAoUnVsZSAjMSk6IFdpbmRvd3MgY2FwcyBhIHNpbmdsZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhdAovLyB+MzJLQiBhbmQgdGhlIHdob2xlIGJsb2NrIGF0IH4zMksgd2lkZSBjaGFycywgYW5kIGV4Y2VlZGluZyBpdCBmYWlscyB0aGUKLy8gc3Bhd24gcmF0aGVyIHRoYW4gdHJ1bmNhdGluZy4gTmV3bHktZm9yd2FyZGVkIHZhbHVlcyBhcmUgdGhlcmVmb3JlIHNraXBwZWQKLy8gd2hlbiBvdmVyc2l6ZWQsIG5vdCBjbGlwcGVkIOKAlCBhIHRydW5jYXRlZCBKU09OIGJsb2Igd291bGQgcGFyc2UgYXMgbWFsZm9ybWVkCi8vIG9uIHRoZSBmYXIgc2lkZSBhbmQgcmVhZCBhcyBhIGNvcnJ1cHQgcmVjb3JkIHJhdGhlciB0aGFuIGFuIGFic2VudCBvbmUuCi8vIGBtZXRhZGF0YWAgaXMgY2FwcGVkIGF0IDY0S0IgYnkgbWVtb3J5X3N0b3JlLCBzbyBhIHJlYWwgdmVyZGljdCBuZXZlciBuZWFycwovLyB0aGlzLiBTVFJJTkcgdmFsdWVzIGtlZXAgdGhlaXIgcHJldmlvdXMgdW5jYXBwZWQgYmVoYXZpb3VyIGJ5dGUtZm9yLWJ5dGU6Ci8vIGdhdGUuY2pzIHJlYWRzIFRPT0xfSU5QVVRfY29tbWFuZCwgYW5kIGRyb3BwaW5nIGFuIG92ZXJzaXplZCBoZXJlZG9jIGNvbW1hbmQKLy8gd291bGQgc2lsZW50bHkgc3RvcCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZCBmcm9tIGZpcmluZyBvbiB0aGUgZXhhY3QgaW5wdXRzCi8vIG1vc3Qgd29ydGggY2hlY2tpbmcuCnZhciBNQVhfU1RSVUNUVVJFRF9MRU4gPSAxNjM4NDsKaWYgKGhvb2tDb250ZXh0LnRvb2xfaW5wdXQgJiYgdHlwZW9mIGhvb2tDb250ZXh0LnRvb2xfaW5wdXQgPT09ICdvYmplY3QnKSB7CiAgT2JqZWN0LmtleXMoaG9va0NvbnRleHQudG9vbF9pbnB1dCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgIHZhciByYXcgPSBob29rQ29udGV4dC50b29sX2lucHV0W2tleV07CiAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHsKICAgICAgZW52WydUT09MX0lOUFVUXycgKyBrZXldID0gcmF3OwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgdmFsOwogICAgaWYgKHR5cGVvZiByYXcgPT09ICdudW1iZXInIHx8IHR5cGVvZiByYXcgPT09ICdib29sZWFuJykgewogICAgICB2YWwgPSBTdHJpbmcocmF3KTsKICAgIH0gZWxzZSBpZiAocmF3ICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnKSB7CiAgICAgIHRyeSB7IHZhbCA9IEpTT04uc3RyaW5naWZ5KHJhdyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuOyB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm47IC8vIG51bGwvdW5kZWZpbmVkL2Z1bmN0aW9uIOKAlCBub3RoaW5nIG1lYW5pbmdmdWwgdG8gZm9yd2FyZAogICAgfQogICAgaWYgKHZhbC5sZW5ndGggPiBNQVhfU1RSVUNUVVJFRF9MRU4pIHJldHVybjsKICAgIGVudlsnVE9PTF9JTlBVVF8nICsga2V5XSA9IHZhbDsKICB9KTsKfQoKLy8gIzEzMjI6IGZvcndhcmQgdGhlIHBhcnRzIG9mIHRvb2xfcmVzcG9uc2UgdGhhdCBhY3R1YWxseSBleGlzdCwgc28gYSBnYXRlIGNhbgovLyBvYnNlcnZlIGFuIE9VVENPTUUgcmF0aGVyIHRoYW4gb25seSB0aGUgaW50ZW50IGl0IHdhcyBoYW5kZWQuCi8vCi8vIENsYXVkZSBDb2RlJ3MgUG9zdFRvb2xVc2UgcGF5bG9hZCBjYXJyaWVzIE5PIGV4aXQgc3RhdHVzIOKAlCBwcm9iZWQgb24gdjIuMS4yMjAsCi8vIHRvb2xfcmVzcG9uc2UgZm9yIGEgQmFzaCBjYWxsIGlzIHtzdGRvdXQsIHN0ZGVyciwgaW50ZXJydXB0ZWQsIGlzSW1hZ2UsCi8vIG5vT3V0cHV0RXhwZWN0ZWR9LiBQb3N0VG9vbFVzZSBhbHNvIGRvZXMgbm90IGZpcmUgYXQgYWxsIHdoZW4gdGhlIGNvbW1hbmQKLy8gZXhpdHMgbm9uLXplcm8sIHNvIHRoZSBvbmx5IGNhc2UgYSBnYXRlIGNhbiBzdGlsbCBiZSBmb29sZWQgYnkgaXMgYW4gZXhpdCBjb2RlCi8vIE1BU0tFRCBieSBhIHBpcGUgb3IgYHx8IHRydWVgLCB3aGVyZSB0aGUgcmVzcG9uc2UgbG9va3MgY2xlYW4uIFRoZSBydW5uZXIncwovLyBvd24gb3V0cHV0IGlzIHRoZSBzb2xlIHJlbWFpbmluZyBzaWduYWw7IHJlY29yZC10ZXN0LXJ1biByZWFkcyBpdCBpbiBnYXRlLmNqcy4KLy8KLy8gVGFpbCwgbm90IGhlYWQuIEV2ZXJ5IHRlc3QgcnVubmVyIHByaW50cyBpdHMgcGFzcy9mYWlsIHN1bW1hcnkgTEFTVCwgc28KLy8gY2xpcHBpbmcgdGhlIGZyb250IG9mIGEgbG9uZyBsb2cgd291bGQgZGlzY2FyZCB0aGUgZXhhY3QgbGluZXMgdGhpcyBleGlzdHMgdG8KLy8gcmVhZC4gQm91bmRzIGFyZSBkZWxpYmVyYXRlbHkgdGlnaHQg4oCUIFdpbmRvd3MgY2FwcyB0aGUgd2hvbGUgZW52aXJvbm1lbnQKLy8gYmxvY2sgYXQgfjMySyB3aWRlIGNoYXJzIGFuZCBmYWlscyB0aGUgc3Bhd24gcmF0aGVyIHRoYW4gdHJ1bmNhdGluZywgYW5kCi8vIFRPT0xfSU5QVVRfY29tbWFuZCBpcyBhbHJlYWR5IGZvcndhcmRlZCB1bmNhcHBlZCBhbG9uZ3NpZGUgdGhlc2UuCnZhciBNQVhfUkVTUE9OU0VfU1RET1VUID0gNDA5NjsKdmFyIE1BWF9SRVNQT05TRV9TVERFUlIgPSAyMDQ4OwpmdW5jdGlvbiB0YWlsT2YodmFsdWUsIG1heCkgewogIHJldHVybiB2YWx1ZS5sZW5ndGggPiBtYXggPyB2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSBtYXgpIDogdmFsdWU7Cn0KaWYgKGhvb2tDb250ZXh0LnRvb2xfcmVzcG9uc2UgJiYgdHlwZW9mIGhvb2tDb250ZXh0LnRvb2xfcmVzcG9uc2UgPT09ICdvYmplY3QnKSB7CiAgdmFyIHJlc3AgPSBob29rQ29udGV4dC50b29sX3Jlc3BvbnNlOwogIGlmICh0eXBlb2YgcmVzcC5zdGRvdXQgPT09ICdzdHJpbmcnICYmIHJlc3Auc3Rkb3V0KSB7CiAgICBlbnYuVE9PTF9SRVNQT05TRV9zdGRvdXQgPSB0YWlsT2YocmVzcC5zdGRvdXQsIE1BWF9SRVNQT05TRV9TVERPVVQpOwogIH0KICBpZiAodHlwZW9mIHJlc3Auc3RkZXJyID09PSAnc3RyaW5nJyAmJiByZXNwLnN0ZGVycikgewogICAgZW52LlRPT0xfUkVTUE9OU0Vfc3RkZXJyID0gdGFpbE9mKHJlc3Auc3RkZXJyLCBNQVhfUkVTUE9OU0VfU1RERVJSKTsKICB9CiAgLy8gQm9vbGVhbiDigJQgdGhlIHN0cmluZy10eXBlZCBmb3J3YXJkaW5nIGFib3ZlIHdvdWxkIGRyb3AgaXQgc2lsZW50bHkuCiAgaWYgKHR5cGVvZiByZXNwLmludGVycnVwdGVkID09PSAnYm9vbGVhbicpIHsKICAgIGVudi5UT09MX1JFU1BPTlNFX2ludGVycnVwdGVkID0gU3RyaW5nKHJlc3AuaW50ZXJydXB0ZWQpOwogIH0KfQoKLy8gIzE0MzUg4oCUIGRlbGl2ZXIgYSBQQVNTSU5HIGdhdGUncyBhZHZpc29yeSB0byBDbGF1ZGUsIG5vdCBvbmx5IHRvIHRoZSB0cmFuc2NyaXB0LgovLwovLyBDbGF1ZGUgQ29kZSBzaG93cyBhIFByZVRvb2xVc2UvUG9zdFRvb2xVc2UgaG9vaydzIHN0ZG91dCB0byB0aGUgdXNlciBpbgovLyB0cmFuc2NyaXB0IG1vZGUgYW5kIHN0b3BzIHRoZXJlOyB0aGUgbW9kZWwgbmV2ZXIgc2VlcyBpdC4gU28gZXZlcnkgYWR2aXNvcnkKLy8gdGhlIGdhdGVzIGVtaXQgb24gdGhlIGV4aXQtMCBwYXRoIHdhcyBpbnZpc2libGUgb24gZXhhY3RseSB0aGUgcnVucyBpdCB3YXMKLy8gd3JpdHRlbiBmb3I6ICMxMzc0J3Mgb3Blbi10YXNrIGNvdW50LCB0aGUgcHJlLUFnZW50IFRhc2tDcmVhdGUgcmVtaW5kZXIsIHRoZQovLyBuYW1lc3BhY2UgaGludCwgdGhlIGRvY3Mtb25seSBhbmQgc2ltcGxpZnktYXV0by1wYXNzIG5vdGVzLiBUaGV5IHN1cmZhY2VkIG9ubHkKLy8gd2hlbiBzb21lIE9USEVSIGdhdGUgYmxvY2tlZCwgYmVjYXVzZSB0aGUgY2F0Y2ggYXJtIGJlbG93IHJlLXJvdXRlcyBlcnIuc3Rkb3V0Ci8vIHRvIHN0ZGVyciDigJQgaS5lLiBvbmx5IG9uY2UgdGhlIFBSIGhhZCBhbHJlYWR5IGJlZW4gc3RvcHBlZCBmb3IgYW5vdGhlciByZWFzb24uCi8vIEEgY29uc3VtZXIgc2hpcHBlZCBhIFBSIG92ZXIgZm91ciB1bnRvdWNoZWQgdGFza3Mgd2l0aCB0aGF0IHJlbWluZGVyICJ3b3JraW5nIi4KLy8KLy8gYGhvb2tTcGVjaWZpY091dHB1dC5hZGRpdGlvbmFsQ29udGV4dGAgaXMgdGhlIGRvY3VtZW50ZWQgY2hhbm5lbCBmcm9tIGEgcGFzc2luZwovLyB0b29sIGhvb2sgaW50byB0aGUgbW9kZWwncyBjb250ZXh0LiBXcmFwIHRoZXJlIGFuZCBub3doZXJlIGVsc2U6IFNlc3Npb25TdGFydAovLyBhbmQgVXNlclByb21wdFN1Ym1pdCBhbHJlYWR5IGluamVjdCB0aGVpciBzdGRvdXQgYXMgY29udGV4dCwgc28gd3JhcHBpbmcgdGhvc2UKLy8gd291bGQgcmV3cml0ZSBhIHdvcmtpbmcgcGF0aCBmb3Igbm90aGluZy4gQW4gdW5rbm93biBvciBhYnNlbnQgaG9va19ldmVudF9uYW1lCi8vIGZhbGxzIGJhY2sgdG8gcmF3IHN0ZG91dCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW91ci4KdmFyIEFEVklTT1JZX0VWRU5UUyA9IHsgUHJlVG9vbFVzZTogdHJ1ZSwgUG9zdFRvb2xVc2U6IHRydWUgfTsKZnVuY3Rpb24gZW1pdEFkdmlzb3J5KHRleHQpIHsKICB2YXIgZXZlbnQgPSBob29rQ29udGV4dC5ob29rX2V2ZW50X25hbWU7CiAgaWYgKCFBRFZJU09SWV9FVkVOVFNbZXZlbnRdKSB7CiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh0ZXh0KTsKICAgIHJldHVybjsKICB9CiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoSlNPTi5zdHJpbmdpZnkoewogICAgaG9va1NwZWNpZmljT3V0cHV0OiB7IGhvb2tFdmVudE5hbWU6IGV2ZW50LCBhZGRpdGlvbmFsQ29udGV4dDogdGV4dCB9LAogIH0pICsgJ1xuJyk7Cn0KCi8vIFJ1biBnYXRlLmNqcyB3aXRoIHRoZSBlbnJpY2hlZCBlbnZpcm9ubWVudAp2YXIgcHJvamVjdERpciA9IChlbnYuQ0xBVURFX1BST0pFQ1RfRElSIHx8IHByb2Nlc3MuY3dkKCkpLnJlcGxhY2UoL15cLyhbYS16XSlcLy9pLCAnJDE6LycpOwp2YXIgZ2F0ZVNjcmlwdCA9IHJlc29sdmUocHJvamVjdERpciwgJy5jbGF1ZGUvaGVscGVycy9nYXRlLmNqcycpOwp0cnkgewogIHZhciBvdXRwdXQgPSBleGVjRmlsZVN5bmMoJ25vZGUnLCBbZ2F0ZVNjcmlwdCwgY29tbWFuZF0sIHsKICAgIGVudjogZW52LCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogNTAwMCwgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ3BpcGUnXSwgd2luZG93c0hpZGU6IHRydWUKICB9KTsKICBpZiAob3V0cHV0LnRyaW0oKSkgZW1pdEFkdmlzb3J5KG91dHB1dCk7CiAgcHJvY2Vzcy5leGl0KDApOwp9IGNhdGNoIChlcnIpIHsKICAvLyBnYXRlLmNqcyBleGl0KDIpID0gYmxvY2ssIGV4aXQoMSkgPSBhbHNvIGJsb2NrIGF0dGVtcHQg4oCUIHRyYW5zbGF0ZSBib3RoIHRvIGV4aXQoMikKICBpZiAoZXJyLnN0ZGVycikgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZXJyLnN0ZGVycik7CiAgaWYgKGVyci5zdGRvdXQpIHByb2Nlc3Muc3RkZXJyLndyaXRlKGVyci5zdGRvdXQpOwogIHByb2Nlc3MuZXhpdChlcnIuc3RhdHVzID09PSAyIHx8IGVyci5zdGF0dXMgPT09IDEgPyAyIDogMCk7Cn0K",
19
- "gate.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwp2YXIgY3AgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7CnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTsKCnZhciBQUk9KRUNUX0RJUiA9IChwcm9jZXNzLmVudi5DTEFVREVfUFJPSkVDVF9ESVIgfHwgcHJvY2Vzcy5jd2QoKSkucmVwbGFjZSgvXlwvKFthLXpdKVwvL2ksICckMTovJyk7CnZhciBTVEFURV9GSUxFID0gcGF0aC5qb2luKFBST0pFQ1RfRElSLCAnLmNsYXVkZScsICd3b3JrZmxvdy1zdGF0ZS5qc29uJyk7CgovLyB0ZXN0c0ZpbmdlcnByaW50IC8gc2ltcGxpZnlGaW5nZXJwcmludCAvIHZlcmlmeUZpbmdlcnByaW50IHBpbiBlYWNoIGNyZWRpdCB0bwovLyB0aGUgY29kZSBpdCBkZXNjcmliZXMsIHNvIGEgY2hhbmdlIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0L011bHRpRWRpdCAoYSBCYXNoCi8vIHdyaXRlLCBhIGJyYW5jaCBzd2l0Y2gsIHRoZSBuZXh0IGlzc3VlIGluIHRoZSBzYW1lIHNlc3Npb24pIGludmFsaWRhdGVzIGl0LgovLyBTZWUgY3JlZGl0RmluZ2VycHJpbnQoKSBmb3Igd2h5IHRoZSBib29sZWFuIGZsYWdzIGFsb25lIGNhbm5vdC4KdmFyIFNUQVRFX0RFRkFVTFRTID0geyB0YXNrc0NyZWF0ZWQ6IGZhbHNlLCB0YXNrQ291bnQ6IDAsIHRhc2tzQWNrbm93bGVkZ2VkOiBmYWxzZSwgbWVtb3J5U2VhcmNoZWQ6IGZhbHNlLCBtZW1vcnlTZWFyY2hlZEJ5OiB7fSwgbWVtb3J5UmVxdWlyZWQ6IHRydWUsIGxlYXJuaW5nc1N0b3JlZDogZmFsc2UsIHRlc3RzUnVuOiBmYWxzZSwgdGVzdHNGaW5nZXJwcmludDogbnVsbCwgc2ltcGxpZnlSdW46IGZhbHNlLCBzaW1wbGlmeVNuYXBzaG90U2hhOiBudWxsLCBzaW1wbGlmeUZpbmdlcnByaW50OiBudWxsLCB2ZXJpZnlSdW46IGZhbHNlLCB2ZXJpZnlPdXRjb21lOiBudWxsLCB2ZXJpZnlGaW5nZXJwcmludDogbnVsbCwgaW50ZXJhY3Rpb25Db3VudDogMCwgc2Vzc2lvblN0YXJ0OiBudWxsLCBsYXN0QmxvY2tlZEF0OiBudWxsLCBsYXN0TmFtZXNwYWNlSGludDogJycsIGxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5OiB7fSwgZmxNb2RlOiBudWxsLCBzd2FybUluaXRpYWxpemVkOiBmYWxzZSwgaGl2ZUluaXRpYWxpemVkOiBmYWxzZSwgc2RkTW9kZTogZmFsc2UsIGFjdGl2ZVNkZFNsdWc6IG51bGwgfTsKCi8vIFBlci1hY3RvciBtZW1vcnktc2VhcmNoIHRyYWNraW5nICgjODM4KS4gVGhlIGxlZ2FjeSBgbWVtb3J5U2VhcmNoZWRgIGJvb2xlYW4KLy8gaXMgc2Vzc2lvbi13aWRlLCBzbyBvbmNlIHRoZSBwYXJlbnQgc2VhcmNoZXMgbWVtb3J5LCBldmVyeSBzcGF3bmVkIHN1YmFnZW50Ci8vIGluaGVyaXRzIHRoZSBzYXRpc2ZpZWQgZmxhZyBhbmQgdGhlIGRpcmVjdGl2ZSdzICJXSUxMIEJMT0NLIiBwcm9taXNlIGJlY29tZXMKLy8gZmFsc2UuIFdoZW4gZ2F0ZS1ob29rLm1qcyBmb3J3YXJkcyBDbGF1ZGUgQ29kZSdzIHN0ZGluIGBzZXNzaW9uX2lkYCBhcwovLyBIT09LX1NFU1NJT05fSUQsIHByZWZlciB0aGUgcGVyLXNlc3Npb24gbWFwIHNvIGVhY2ggc3ViYWdlbnQgbXVzdCBzZWFyY2gKLy8gbWVtb3J5IGl0c2VsZiBiZWZvcmUgaXRzIGZpcnN0IEdsb2IvR3JlcC9SZWFkLiBGYWxscyBiYWNrIHRvIHRoZSBsZWdhY3kKLy8gYm9vbGVhbiB3aGVuIG5vIHNlc3Npb24gaWQgaXMgcHJlc2VudCAoQ0xJIGludm9jYXRpb25zLCB0ZXN0cywgb2xkZXIgaG9zdHMpLgpmdW5jdGlvbiBpc01lbW9yeVNlYXJjaGVkRm9yKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICBpZiAoc2lkKSB7CiAgICB2YXIgbWFwID0gc3RhdGUubWVtb3J5U2VhcmNoZWRCeSB8fCB7fTsKICAgIHJldHVybiBtYXBbc2lkXSA9PT0gdHJ1ZTsKICB9CiAgcmV0dXJuIHN0YXRlLm1lbW9yeVNlYXJjaGVkID09PSB0cnVlOwp9CgovLyBTdGFtcCB0aGUgbGVnYWN5IGJvb2wgcGx1cyAod2hlbiBIT09LX1NFU1NJT05fSUQgaXMgc2V0KSB0aGUgcGVyLWFjdG9yIG1hcC4KLy8gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIGFjdHVhbGx5IGNoYW5nZWQg4oCUIGNhbGxlcnMgZ2F0ZSB3cml0ZVN0YXRlKCkgb24gaXQKLy8gdG8gYXZvaWQgcmVkdW5kYW50IGZzeW5jcyBpbiB0aWdodCBiYXNoLW1lbW9yeSBsb29wcy4KZnVuY3Rpb24gbWFya01lbW9yeVNlYXJjaGVkKHN0YXRlKSB7CiAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICB2YXIgY2hhbmdlZCA9IGZhbHNlOwogIGlmIChzdGF0ZS5tZW1vcnlTZWFyY2hlZCAhPT0gdHJ1ZSkgeyBzdGF0ZS5tZW1vcnlTZWFyY2hlZCA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgaWYgKHNpZCkgewogICAgaWYgKCFzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5KSBzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5ID0ge307CiAgICBpZiAoc3RhdGUubWVtb3J5U2VhcmNoZWRCeVtzaWRdICE9PSB0cnVlKSB7IHN0YXRlLm1lbW9yeVNlYXJjaGVkQnlbc2lkXSA9IHRydWU7IGNoYW5nZWQgPSB0cnVlOyB9CiAgfQogIHJldHVybiBjaGFuZ2VkOwp9CgpmdW5jdGlvbiByZWFkU3RhdGUoKSB7CiAgdHJ5IHsKICAgIGlmIChmcy5leGlzdHNTeW5jKFNUQVRFX0ZJTEUpKSB7CiAgICAgIHZhciBwYXJzZWQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTVEFURV9GSUxFLCAndXRmLTgnKSk7CiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHNvIG1pc3Npbmcga2V5cyAoZS5nLiBhZGRlZCBpbiBuZXdlciB2ZXJzaW9ucykgYXJlIGZpbGxlZCBpbgogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMsIHBhcnNlZCk7CiAgICB9CiAgfSBjYXRjaCAoZSkgeyAvKiByZXNldCBvbiBjb3JydXB0aW9uICovIH0KICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMpOwp9CgpmdW5jdGlvbiB3cml0ZVN0YXRlKHMpIHsKICB0cnkgewogICAgdmFyIGRpciA9IHBhdGguZGlybmFtZShTVEFURV9GSUxFKTsKICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgIGZzLndyaXRlRmlsZVN5bmMoU1RBVEVfRklMRSwgSlNPTi5zdHJpbmdpZnkocywgbnVsbCwgMikpOwogIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsICovIH0KfQoKLy8gTG9hZCBtb2Zsby55YW1sIGdhdGUgY29uZmlnIChkZWZhdWx0czogYWxsIGVuYWJsZWQpCmZ1bmN0aW9uIGxvYWRHYXRlQ29uZmlnKCkgewogIC8vIHZlcmlmeV9iZWZvcmVfZG9uZSBpcyBvcHQtT1VUIChkZWZhdWx0IHRydWUpLCBsaWtlIGV2ZXJ5IG90aGVyIGdhdGU6ICMxMjk0CiAgLy8gc2hpcHMgYSByZWFsIC92ZXJpZnkgc2tpbGwgYW5kIGhhcyAvZmxvIGRlbGVnYXRlIHRvIGl0LCBzbyBsZWF2aW5nIGl0IG9mZiBieQogIC8vIGRlZmF1bHQgd291bGQgbWFrZSB0aGUgZGVmYXVsdCAvZmxvIHJ1biBzaWxlbnRseSBza2lwIHRoZSBhY2NlcHRhbmNlIGNoZWNrLgogIC8vIERpc2FibGUgcGVyLXByb2plY3Qgd2l0aCBgdmVyaWZ5X2JlZm9yZV9kb25lOiBmYWxzZWAgb3IgcGVyLXJ1biBgLS1uby12ZXJpZnlgLgogIC8vIHRhc2tfc3RhdHVzX2dhdGUgaXMgYSBNT0RFLCBub3QgYSBib29sZWFuOiAnYmxvY2snIHwgJ3dhcm4nIHwgJ29mZicgKCMxNDM1KS4KICAvLyAjMTM3NCBzaGlwcGVkIHRoZSBvcGVuLXRhc2sgY291bnQgYXMgYSB3YXJuLW9ubHkgc3Rkb3V0IGxpbmUsIGFuZCBhIGNvbnN1bWVyCiAgLy8gc3RpbGwgc2hpcHBlZCBhIFBSIG92ZXIgZm91ciB1bnRvdWNoZWQgdGFza3Mg4oCUIGEgcmVtaW5kZXIgdGhhdCBzdXJ2aXZlZCB0ZW4KICAvLyBjb25zZWN1dGl2ZSBpZ25vcmVzIGluIG9uZSBzZXNzaW9uIGlzIG5vdCBhIGNvbnRyb2wuIEJsb2NraW5nIGlzIHRoZSBkZWZhdWx0CiAgLy8gYmVjYXVzZSB0aGUgaG9uZXN0ICJ0aGVzZSBzdGF5IG9wZW4gb24gcHVycG9zZSIgb3V0Y29tZSBpcyBvbmUgY29tbWFuZCBhd2F5CiAgLy8gKHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWQpLCBzbyBub3RoaW5nIGhlcmUgY2FuIGRlYWRsb2NrIGEgcnVuLgogIHZhciBkZWZhdWx0cyA9IHsgbWVtb3J5X2ZpcnN0OiB0cnVlLCB0YXNrX2NyZWF0ZV9maXJzdDogdHJ1ZSwgY29udGV4dF90cmFja2luZzogdHJ1ZSwgdGVzdGluZ19nYXRlOiB0cnVlLCBzaW1wbGlmeV9nYXRlOiB0cnVlLCBsZWFybmluZ3NfZ2F0ZTogdHJ1ZSwgc3dhcm1faW52b2NhdGlvbl9nYXRlOiB0cnVlLCB2ZXJpZnlfYmVmb3JlX2RvbmU6IHRydWUsIHNkZF9nYXRlOiB0cnVlLCB0YXNrX3N0YXR1c19nYXRlOiAnYmxvY2snIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmIChjb250ZW50KSB7CiAgICAvLyBCb29sZWFuIGZvcm1zIGFyZSBhY2NlcHRlZCBzbyB0aGlzIGtleSByZWFkcyBsaWtlIGV2ZXJ5IG90aGVyIGdhdGUgaW4gdGhlCiAgICAvLyBibG9jazogYGZhbHNlYCBpcyB0aGUgc2FtZSBvcHQtb3V0IGB0ZXN0aW5nX2dhdGU6IGZhbHNlYCBpcywgYHRydWVgIG1lYW5zCiAgICAvLyBlbmZvcmNlLiBBbnl0aGluZyB1bnJlY29nbmlzZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbgogICAgLy8gc2lsZW50bHkgZGlzYWJsaW5nIHRoZSBnYXRlIOKAlCBhIHR5cG8gbXVzdCBub3QgYmUgYSBzdGVhbHRoIG9wdC1vdXQuCiAgICB2YXIgdHNnID0gL3Rhc2tfc3RhdHVzX2dhdGU6XHMqWyciXT8oYmxvY2t8d2FybnxvZmZ8ZmFsc2V8dHJ1ZSlbJyJdPy9pLmV4ZWMoY29udGVudCk7CiAgICBpZiAodHNnKSB7CiAgICAgIHZhciBtb2RlID0gdHNnWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIGRlZmF1bHRzLnRhc2tfc3RhdHVzX2dhdGUgPSBtb2RlID09PSAnZmFsc2UnID8gJ29mZicgOiBtb2RlID09PSAndHJ1ZScgPyAnYmxvY2snIDogbW9kZTsKICAgIH0KICAgIGlmICgvbWVtb3J5X2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubWVtb3J5X2ZpcnN0ID0gZmFsc2U7CiAgICBpZiAoL3Rhc2tfY3JlYXRlX2ZpcnN0OlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGFza19jcmVhdGVfZmlyc3QgPSBmYWxzZTsKICAgIGlmICgvY29udGV4dF90cmFja2luZzpccypmYWxzZS9pLnRlc3QoY29udGVudCkpIGRlZmF1bHRzLmNvbnRleHRfdHJhY2tpbmcgPSBmYWxzZTsKICAgIGlmICgvdGVzdGluZ19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGVzdGluZ19nYXRlID0gZmFsc2U7CiAgICBpZiAoL3NpbXBsaWZ5X2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zaW1wbGlmeV9nYXRlID0gZmFsc2U7CiAgICBpZiAoL2xlYXJuaW5nc19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubGVhcm5pbmdzX2dhdGUgPSBmYWxzZTsKICAgIGlmICgvc3dhcm1faW52b2NhdGlvbl9nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMuc3dhcm1faW52b2NhdGlvbl9nYXRlID0gZmFsc2U7CiAgICAvLyBPcHQtb3V0OiBvbiBieSBkZWZhdWx0OyBkaXNhYmxlIG9ubHkgd2hlbiBleHBsaWNpdGx5IHNldCBmYWxzZS4KICAgIGlmICgvdmVyaWZ5X2JlZm9yZV9kb25lOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudmVyaWZ5X2JlZm9yZV9kb25lID0gZmFsc2U7CiAgICAvLyBzZGRfZ2F0ZSBpcyB0aGUgY2hlY2stYmVmb3JlLWltcGxlbWVudCBiYWNrc3RvcCAoIzEyOTcpLiBPcHQtb3V0OyB0aGUKICAgIC8vIGdhdGUgb25seSBmaXJlcyB3aGVuIGEgcnVuIGlzIGFjdHVhbGx5IGFybWVkIGZvciBTREQgKHNkZE1vZGUpLCBzbwogICAgLy8gbGVhdmluZyBpdCBvbiBjb3N0cyBub24tU0REIHdvcmsgbm90aGluZy4KICAgIGlmICgvc2RkX2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zZGRfZ2F0ZSA9IGZhbHNlOwogIH0KICByZXR1cm4gZGVmYXVsdHM7Cn0KCi8vIFBhcnNlIHRoZSB0b3AtbGV2ZWwgYHNkZDpgIGJsb2NrIGZyb20gbW9mbG8ueWFtbCAoIzEyOTcpLiBTY29wZWQgdG8gdGhlIGJsb2NrCi8vIGJvZHkgc28gd2UgbmV2ZXIgbWF0Y2ggYSBgZGVmYXVsdDpgIGtleSBmcm9tIGFub3RoZXIgc2VjdGlvbiAoZXBpYywgbWVyZ2UpLgovLyBDcm9zcy1wbGF0Zm9ybTogdG9sZXJhdGVzIENSTEY7IG5vIHBhdGggc2VwYXJhdG9ycyBoYXJkY29kZWQuCmZ1bmN0aW9uIGxvYWRTZGRDb25maWcoKSB7CiAgdmFyIG91dCA9IHsgZGVmYXVsdDogZmFsc2UsIHNwZWNzRGlyOiAnLm1vZmxvL3NwZWNzJyB9OwogIHZhciBjb250ZW50ID0gTU9GTE9fWUFNTDsKICBpZiAoIWNvbnRlbnQpIHJldHVybiBvdXQ7CiAgdmFyIGJsb2NrID0gY29udGVudC5tYXRjaCgvXnNkZDpbIFx0XSpccj9cbigoPzpbIFx0XSsuKig/OlxyP1xufCQpKSopL20pOwogIGlmICghYmxvY2spIHJldHVybiBvdXQ7CiAgdmFyIGJvZHkgPSBibG9ja1sxXTsKICBpZiAoL15ccypkZWZhdWx0OlxzKnRydWVcYi9pbS50ZXN0KGJvZHkpKSBvdXQuZGVmYXVsdCA9IHRydWU7CiAgdmFyIHNkID0gYm9keS5tYXRjaCgvXlxzKnNwZWNzX2RpcjpccyooLis/KVxzKiQvaW0pOwogIGlmIChzZCkgewogICAgdmFyIHYgPSBzZFsxXS5yZXBsYWNlKC9ccysjLiokLywgJycpLnJlcGxhY2UoL15bIiddfFsiJ10kL2csICcnKS50cmltKCk7CiAgICBpZiAodikgb3V0LnNwZWNzRGlyID0gdjsKICB9CiAgcmV0dXJuIG91dDsKfQoKLy8gUGFyc2UgdGhlIHRvcC1sZXZlbCBgbWVyZ2U6YCBibG9jayBmcm9tIG1vZmxvLnlhbWwgKCMxMjg1KS4gQmxvY2stc2NvcGVkIGZvcgovLyB0aGUgc2FtZSByZWFzb24gYXMgbG9hZFNkZENvbmZpZzogYSBiYXJlIGBhdXRvOmAga2V5IGNhbiBhcHBlYXIgdW5kZXIgb3RoZXIKLy8gc2VjdGlvbnMuIENyb3NzLXBsYXRmb3JtOiB0b2xlcmF0ZXMgQ1JMRi4KZnVuY3Rpb24gbG9hZE1lcmdlQ29uZmlnKCkgewogIHZhciBvdXQgPSB7IGF1dG86IGZhbHNlIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmICghY29udGVudCkgcmV0dXJuIG91dDsKICB2YXIgYmxvY2sgPSBjb250ZW50Lm1hdGNoKC9ebWVyZ2U6WyBcdF0qXHI/XG4oKD86WyBcdF0rLiooPzpccj9cbnwkKSkqKS9tKTsKICBpZiAoIWJsb2NrKSByZXR1cm4gb3V0OwogIGlmICgvXlxzKmF1dG86XHMqdHJ1ZVxiL2ltLnRlc3QoYmxvY2tbMV0pKSBvdXQuYXV0byA9IHRydWU7CiAgcmV0dXJuIG91dDsKfQoKLy8gUmVhZCBtb2Zsby55YW1sIGV4YWN0bHkgb25jZSBwZXIgZ2F0ZSBwcm9jZXNzICgjMTI5NyByZXZpZXcpOiBsb2FkR2F0ZUNvbmZpZwovLyBhbmQgbG9hZFNkZENvbmZpZyBib3RoIHBhcnNlIGl0LCBhbmQgdGhlIGdhdGUgZmlyZXMgb24gZXZlcnkgV3JpdGUvRWRpdCDigJQgYQovLyBzZWNvbmQgcmVhZCBpcyB3YXN0ZWQgc3lzY2FsbHMuIFNpbmdsZSByZWFkRmlsZVN5bmMgaW4gdHJ5L2NhdGNoIChubyBleGlzdHNTeW5jCi8vIGRvdWJsZS1zdGF0KTsgRU5PRU5UL3VucmVhZGFibGUg4oaSICcnIOKGkiBldmVyeSBwYXJzZXIgZmFsbHMgYmFjayB0byBkZWZhdWx0cy4KZnVuY3Rpb24gcmVhZE1vZmxvWWFtbCgpIHsKICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihQUk9KRUNUX0RJUiwgJ21vZmxvLnlhbWwnKSwgJ3V0Zi04Jyk7IH0KICBjYXRjaCAoZSkgeyByZXR1cm4gJyc7IH0KfQp2YXIgTU9GTE9fWUFNTCA9IHJlYWRNb2Zsb1lhbWwoKTsKCi8vICMxMzk0IOKAlCBpcyB0aGUgaG9vayB0aGF0IHRyYW5zY3JpYmVzIC92ZXJpZnkncyB2ZXJkaWN0IGludG8gd29ya2Zsb3ctc3RhdGUuanNvbgovLyBhY3R1YWxseSB3aXJlZD8gRGlzdGluZ3Vpc2hlcyAidGhlIGFnZW50IHNraXBwZWQgU3RlcCA1IiBmcm9tICJub3RoaW5nIGV4aXN0cwovLyB0byByZWNvcmQgdGhlIHZlcmRpY3QiLCB3aGljaCBuZWVkIG9wcG9zaXRlIHJlbWVkaWVzOiB0aGUgZmlyc3QgaXMgZml4ZWQgYnkKLy8gcmUtcnVubmluZyAvdmVyaWZ5LCB0aGUgc2Vjb25kIGNhbm5vdCBiZS4KLy8KLy8gRGVsaWJlcmF0ZWx5IE5PVCBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSBsaWtlIE1PRkxPX1lBTUw6IHRoaXMgaXMgb25seSBldmVyCi8vIGNvbnN1bHRlZCBvbiBhbiBhbHJlYWR5LWJsb2NrZWQgY2hlY2stYmVmb3JlLWRvbmUgcGF0aCwgc28gcmVhZGluZyBpdCBlYWdlcmx5Ci8vIHdvdWxkIGFkZCBhIHN5c2NhbGwgdG8gZXZlcnkgV3JpdGUvRWRpdCB0byBhbnN3ZXIgYSBxdWVzdGlvbiBhbG1vc3Qgbm8gZ2F0ZQovLyBpbnZvY2F0aW9uIGFza3MuIFN1YnN0cmluZyBtYXRjaCAobm90IGEgSlNPTiB3YWxrKSBzbyBpdCBob2xkcyByZWdhcmRsZXNzIG9mCi8vIHdoaWNoIG1hdGNoZXIgYmxvY2sgYSBjb25zdW1lcidzIGhvb2sgbGl2ZXMgaW4sIG9yIGhvdyB0aGV5IGhhbmQtZWRpdGVkIGl0LgovLyBVbnJlYWRhYmxlL21hbGZvcm1lZCBzZXR0aW5ncyDihpIgdHJ1ZSwgc28gYSBwYXJzZSBmYWlsdXJlIGZhbGxzIGJhY2sgdG8gdGhlCi8vIHByZS1leGlzdGluZyBnZW5lcmljIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIGEgd2lyaW5nIGJ1ZyB0aGF0IG1heSBub3QKLy8gZXhpc3QuCmZ1bmN0aW9uIGlzVmVyaWZ5T3V0Y29tZUhvb2tXaXJlZCgpIHsKICB0cnkgewogICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcuY2xhdWRlJywgJ3NldHRpbmdzLmpzb24nKSwgJ3V0Zi04JykKICAgICAgLmluZGV4T2YoJ3JlY29yZC12ZXJpZnktb3V0Y29tZScpID49IDA7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gdHJ1ZTsgfQp9Cgp2YXIgY29uZmlnID0gbG9hZEdhdGVDb25maWcoKTsKdmFyIHNkZENvbmYgPSBsb2FkU2RkQ29uZmlnKCk7CnZhciBtZXJnZUNvbmYgPSBsb2FkTWVyZ2VDb25maWcoKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07Cgp2YXIgRVhFTVBUID0gWycuY2xhdWRlLycsICcuY2xhdWRlXFwnLCAnQ0xBVURFLm1kJywgJ01FTU9SWS5tZCcsICd3b3JrZmxvdy1zdGF0ZScsICdub2RlX21vZHVsZXMnLCAnbW9mbG8ueWFtbCddOwoKLy8gQXBwZW5kZWQgdG8gZXZlcnkgbWVtb3J5LWZpcnN0IGRlbmlhbC4gV2l0aG91dCBpdCwgYSBjb250ZXh0IGF1ZGl0IG9mIENsYXVkZQovLyBDb2RlJ3MgZGVuaWFsIHRlbGVtZXRyeSByZWFkcyBtb2ZsbydzIGdhdGUgZW5mb3JjZW1lbnRzIGFzIHBlcm1pc3Npb24tc2V0dXAKLy8gZmFpbHVyZXMgYW5kICJmaXhlcyIgdGhlbSB3aXRoIGFsbG93IHJ1bGVzIOKAlCB3aGljaCBjYW5ub3Qgb3ZlcnJpZGUgYSBob29rCi8vIGJsb2NrIGF0IGFsbCAoIzEzMDcgZmluZGluZyA1KS4gTmFtaW5nIHRoZSBnYXRlIG1ha2VzIHRoZSBjYXVzZSBzZWxmLWV2aWRlbnQuCnZhciBHQVRFX09SSUdJTl9OT1RFID0gJ1RoaXMgaXMgYSBtb2ZsbyBob29rLCBub3QgYSBDbGF1ZGUgQ29kZSBwZXJtaXNzaW9uIHJ1bGUg4oCUIGFsbG93LXJ1bGVzIGNhbm5vdCBvdmVycmlkZSBpdC4nOwoKLy8gIzEzNDgg4oCUIHRoZSBwcmUtUFIgZ2F0ZXMgYXJlIG9yZGVyLWRlcGVuZGVudCBhbmQgZWFjaCBibG9jayBtZXNzYWdlIG5hbWVkIG9ubHkKLy8gaXRzIG93biBtaXNzaW5nIGdhdGUsIHNvIGEgY2FsbGVyIGNvdWxkIHNhdGlzZnkgdGhlbSBvbmUgYXQgYSB0aW1lIGZvcmV2ZXI6Ci8vIC9mbG8tc2ltcGxpZnkgbWF5IGVkaXQgY29kZSAod2hpY2ggcmVzZXRzIHRlc3RzIGFuZCB2ZXJpZnkpLCBhbmQgL3ZlcmlmeSBtdXN0Ci8vIG5vdCwgc28gc2ltcGxpZnkgc3RyaWN0bHkgcHJlY2VkZXMgdmVyaWZ5LiBCb3RoIGJsb2NraW5nIGdhdGVzIHByaW50IHRoaXMuCi8vIC92ZXJpZnkncyBTdGVwIDUgbWVtb3J5X3N0b3JlIGNhcnJpZXMgdGhlIHZlcmRpY3QgQU5EIHN0YW1wcyBsZWFybmluZ3MsIHdoaWNoCi8vIGlzIHdoeSBsZWFybmluZ3MgaGFzIG5vIHNlcGFyYXRlIHN0ZXAgaGVyZS4KdmFyIE9SREVSX0hJTlQgPSAnT3JkZXIgdGhhdCBzYXRpc2ZpZXMgYWxsIG9mIHRoZW06IHRlc3RzIGdyZWVuIC0+IC9mbG8tc2ltcGxpZnkgKHJlLXJ1biB0ZXN0cyBpZiBpdCBlZGl0cykgLT4gL3ZlcmlmeSAtPiBpdHMgbWVtb3J5X3N0b3JlIHZlcmRpY3QgLT4gZ2ggcHIgY3JlYXRlXG4nOwovLyAjMTQzNCDigJQgdGhlIG9sZCB0ZXh0ICgnbGVhcm5pbmdzIGhhdmUgbm90IGJlZW4gc3RvcmVkIChjYWxsIG1lbW9yeV9zdG9yZSknKQovLyBuYW1lZCB0aGUgbWVjaGFuaXNtIGJ1dCBubyBxdWFsaXR5IGJhciwgc28gdGhlIGNoZWFwZXN0IHdheSBwYXN0IGl0IHdhcyBhCi8vIHN1bW1hcnkgb2YgdGhlIHJ1biDigJQgYXVkaXQgZXhoYXVzdCB0aGF0IGRpc3BsYWNlcyByZXVzYWJsZSBsZXNzb25zIGZyb20gZXZlcnkKLy8gZnV0dXJlIGJvdW5kZWQgc2VhcmNoLiBOYW1lIHRoZSBiYXIgQU5EIHRoZSBuby13cml0ZSBwYXRoIGhlcmU6IGFuIGVzY2FwZQovLyBoYXRjaCBub2JvZHkgY2FuIGZpbmQgaXMgbm90IGFuIGVzY2FwZSBoYXRjaCAoc2VlICMxMzMyJ3MgZ2F0ZSBkZWFkbG9jaykuCi8vCi8vIFRoZSBlc2NhcGUgY29tbWFuZCBpcyBidWlsdCBmcm9tIF9fZmlsZW5hbWUsIG5vdCB3cml0dGVuIGFzIGEgcmVsYXRpdmUgcGF0aC4KLy8gVGhlIGNhbGxlciBpcyB0aGUgbW9kZWwgdHlwaW5nIGludG8gYSBCYXNoIHRvb2wsIE5PVCBhIGhvb2s6ICRDTEFVREVfUFJPSkVDVF9ESVIKLy8gaXMgdW5zZXQgdGhlcmUgKHNvIHRoZSBzZXR0aW5ncy5qc29uIGZvcm0gd291bGQgZXhwYW5kIHRvICIvLmNsYXVkZS8uLi4iKSwgYW5kIGEKLy8gYmFyZSBgLmNsYXVkZS9oZWxwZXJzL2dhdGUuY2pzYCBicmVha3MgZnJvbSBhbnkgY3dkIGJ1dCB0aGUgcHJvamVjdCByb290LiBUaGUKLy8gcnVubmluZyBzY3JpcHQncyBvd24gYWJzb2x1dGUgcGF0aCBpcyBjb3JyZWN0IG9uIGV2ZXJ5IE9TIGFuZCBmcm9tIGFueSBjd2Q7Ci8vIGRvdWJsZSBxdW90ZXMgY2FycnkgV2luZG93cyBzZXBhcmF0b3JzIGFuZCBzcGFjZXMgdGhyb3VnaCB0aGUgc2hlbGwuCnZhciBMRUFSTklOR1NfTUlTU0lORyA9CiAgJ25vIGR1cmFibGUgbGVzc29uIHJlY29yZGVkLiBBIGxlc3NvbiBxdWFsaWZpZXMgb25seSBpZiBpdCB3b3VsZCBoZWxwIGEgZnV0dXJlIHNlc3Npb24gJyArCiAgJ3dvcmtpbmcgb24gYSBESUZGRVJFTlQgdGFzayDigJQgYSByZXVzYWJsZSBwYXR0ZXJuLCBhIHRyYXAsIGEgZGVjaXNpb24gKyByYXRpb25hbGUuICcgKwogICdTdG9yZSBvbmUgd2l0aCBtY3BfX21vZmxvX19tZW1vcnlfc3RvcmUgKG5hbWVzcGFjZSAibGVhcm5pbmdzIjsgdXNlICJwYXR0ZXJucyIgZm9yIGEgJyArCiAgJ3JldXNhYmxlIGNvZGUgc2hhcGUpLiBXaGF0IFRISVMgcnVuIGNoYW5nZWQgaXMgZ2l0IGhpc3Rvcnkg4oCUIGl0IGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksICcgKwogICdub3QgaW4gbWVtb3J5LiBJZiB0aGlzIHJ1biB0YXVnaHQgbm90aGluZyBuZXcsIHNheSBzbyBpbnN0ZWFkIG9mIGludmVudGluZyBvbmU6ICcgKwogICdub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic7CnZhciBHQVRFX0RJU0FCTEVfTk9URSA9ICdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogbWVtb3J5X2ZpcnN0OiBmYWxzZSc7Ci8vICMxMzM4IOKAlCBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uIHN0YXJ0IGFuZCBuZXZlcgovLyByZXNwYXducyB0aGVtLCBzbyBhIHNlc3Npb24gY2FuIG91dGxpdmUgaXRzIG1vZmxvIE1DUCBjb25uZWN0aW9uLiBOYW1pbmcgb25seQovLyBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoIHRoZXJlIHBvaW50cyB0aGUgcmVhZGVyIGF0IHRoZSBvbmUgdGhpbmcgdGhhdCBjYW5ub3QKLy8gd29yazsgdGhpcyBDTEkgcGF0aCBjcmVkaXRzIHRoZSBnYXRlIGlkZW50aWNhbGx5IGFuZCBuZWVkcyBubyBNQ1AuCnZhciBNQ1BfRkFMTEJBQ0tfTk9URSA9ICdJZiBtY3BfX21vZmxvX18qIHRvb2xzIGFyZSB1bmF2YWlsYWJsZSB0aGlzIHNlc3Npb24gKE1DUCBzZXJ2ZXIgbm90IGNvbm5lY3RlZCksIHRoaXMgY3JlZGl0cyB0aGUgZ2F0ZSB0b286IG5weCBmbG8gbWVtb3J5IHNlYXJjaCAtLXF1ZXJ5ICI8dG9waWM+IiAtLW5hbWVzcGFjZSA8bnM+JzsKLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgc3dhcm0vaGl2ZSBnYXRlJ3MgZXF1aXZhbGVudC4gVGhlIENMSSBydW5zIHRoZSBzYW1lCi8vIGluLXByb2Nlc3MgaGFuZGxlciBhbmQgcGVyc2lzdHMgdGhlIHN3YXJtLCBzbyBpdCBzYXRpc2ZpZXMgdGhpcyBnYXRlIGZvcgovLyByZWFsOyBpdCBpcyByZWNvcmRlZCBvbmx5IG9uIHN1Y2Nlc3MgKFBvc3RUb29sVXNlLCAjMTMyMikuCnZhciBDT09SRF9GQUxMQkFDS19OT1RFID0gJ0lmIG1jcF9fbW9mbG9fXyogdG9vbHMgYXJlIHVuYXZhaWxhYmxlIHRoaXMgc2Vzc2lvbiAoTUNQIHNlcnZlciBub3QgY29ubmVjdGVkKSwgdGhpcyBzYXRpc2ZpZXMgdGhlIGdhdGUgdG9vOic7CgovLyAjMTI5NCBGaW5kaW5nIDMg4oCUIHJlYWRzL3NjYW5zIG9mIEVQSEVNRVJBTCBmaWxlcyB1bmRlciB0aGUgT1MgdGVtcCBkaXIKLy8gKGJhY2tncm91bmQtdGFzayBvdXRwdXQvdHJhbnNjcmlwdHMsIGFnZW50IHNjcmF0Y2hwYWRzKSBhcmUgdHJhbnNpZW50IHRvb2wKLy8gSS9PIGFuZCBuZXZlciBjYXJyeSBpbmRleGFibGUgcHJvamVjdCBrbm93bGVkZ2UsIHNvIHRoZXkgbXVzdCBub3QgdHJpcCB0aGUKLy8gbWVtb3J5LWZpcnN0IGdhdGUuIENyb3NzLXBsYXRmb3JtIChSdWxlICMxKTogb3MudG1wZGlyKCkgaXMgY29ycmVjdCBvbiBldmVyeQovLyBPUzsgd2Ugbm9ybWFsaXplIGEgbGVhZGluZyBgL3ByaXZhdGVgIG9uIGJvdGggc2lkZXMgc28gbWFjT1MncwovLyAvdmFyL2ZvbGRlcnMgKG9zLnRtcGRpcikgdnMgL3ByaXZhdGUvdmFyL2ZvbGRlcnMgKHJlYWxwYXRoKSBzeW1saW5rIHBhaXIKLy8gc3RpbGwgbWF0Y2hlcyAoQ0xBVURFLm1kICMxMTQ1KS4gTmV2ZXIgaGFyZGNvZGUgYC90bXBgLgpmdW5jdGlvbiBzdHJpcFByaXZhdGUocCkgeyByZXR1cm4gcC5pbmRleE9mKCcvcHJpdmF0ZS8nKSA9PT0gMCA/IHAuc2xpY2UoJy9wcml2YXRlJy5sZW5ndGgpIDogcDsgfQpmdW5jdGlvbiBpc0VwaGVtZXJhbFBhdGgoZnApIHsKICBpZiAoIWZwKSByZXR1cm4gZmFsc2U7CiAgdmFyIHRtcDsKICB0cnkgeyB0bXAgPSBwYXRoLnJlc29sdmUob3MudG1wZGlyKCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIHZhciB0ID0gc3RyaXBQcml2YXRlKHRtcCk7CiAgZnVuY3Rpb24gdW5kZXIocCkgeyB2YXIgbiA9IHN0cmlwUHJpdmF0ZShwKTsgcmV0dXJuIG4gPT09IHQgfHwgbi5pbmRleE9mKHQgKyBwYXRoLnNlcCkgPT09IDA7IH0KICB2YXIgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZnApOwogIGlmICghdW5kZXIocmVzb2x2ZWQpKSByZXR1cm4gZmFsc2U7CiAgLy8gVW5kZXIgdG1wIGJ5IGxpdGVyYWwgcGF0aCDigJQgY29uZmlybSBpdCBpc24ndCBhIHN5bWxpbmsgc3RhZ2VkIGluIHRtcCB0aGF0CiAgLy8gZGVyZWZlcmVuY2VzIHRvIGEgcmVhbCBwcm9qZWN0IGZpbGUgKHJlYWxwYXRoIEJPVEggc2lkZXMsIENMQVVERS5tZCBSdWxlICMyKS4KICAvLyBPbiBFTk9FTlQgKGEgbm90LXlldC1jcmVhdGVkIHRtcCBmaWxlKSBrZWVwIHRoZSB2ZXJkaWN0IOKAlCBzdGlsbCBlcGhlbWVyYWwuCiAgdHJ5IHsgcmV0dXJuIHVuZGVyKGZzLnJlYWxwYXRoU3luYyhyZXNvbHZlZCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiB0cnVlOyB9Cn0KLy8gIzExNzEg4oCUIERBTkdFUk9VUyBnYWluZWQgUG93ZXJTaGVsbCBhZGRpdGlvbnMgdG8gbWF0Y2ggdGhlIG1hdGNoZXIgd2lkZW5pbmcKLy8gdGhhdCBub3cgcm91dGVzIHRoZSBkZWRpY2F0ZWQgYFBvd2VyU2hlbGxgIHRvb2wgdGhyb3VnaCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4KLy8gUE9TSVggZW50cmllcyBzdGlsbCBhcHBseSBiZWNhdXNlIFBTIHdpbGwgZXhlY3V0ZSB0aGVtIHdoZW4gaW52b2tlZC4gTWF0Y2hlZAovLyBjYXNlLWluc2Vuc2l0aXZlbHkgYnkgYG1hdGNoZXNEYW5nZXJvdXNgIGJlbG93IOKAlCBzdWJzdHJpbmcgZm9yIG1vc3QgZW50cmllcywKLy8gcm9vdC1hbmNob3JlZCBmb3IgdGhlIG9uZXMgdGhhdCBlbmQgYXQgYSBmaWxlc3lzdGVtIHJvb3QuCnZhciBEQU5HRVJPVVMgPSBbCiAgJ3JtIC1yZiAvJywgJ3JtIC1yZiB+JywgJ2Zvcm1hdCBjOicsICdkZWwgL3MgL3EgYzpcXCcsICc6KCl7Onw6Jn07OicsICdta2ZzLicsICc+IC9kZXYvc2RhJywKICAvLyBQb3dlclNoZWxsIGRlc3RydWN0aXZlIHBhdHRlcm5zLiBXb24ndCBjYXRjaCBldmVyeSBhZHZlcnNhcmlhbCBzcGVsbGluZwogIC8vIChQUyBhbGlhc2VzIGxldCBgcmkgLXIgLWZvcmNlIEM6XGAgbWVhbiB0aGUgc2FtZSB0aGluZykgYnV0IGNvdmVycyB0aGUKICAvLyBjb21tb24tdHlwbyBkZXN0cnVjdGlvbiBjbGFzcyDigJQgc3ltbWV0cmljIHRvIHRoZSBQT1NJWCBsaXN0J3MgaW50ZW50LgogICdyZW1vdmUtaXRlbSAtcmVjdXJzZSAtZm9yY2UgYzpcXCcsCiAgJ3JlbW92ZS1pdGVtIC1yZWN1cnNlIC1mb3JjZSAvJywKICAncmVtb3ZlLWl0ZW0gLXJlY3Vyc2UgLWZvcmNlIH4nLAogICdmb3JtYXQtdm9sdW1lJywKICAnY2xlYXItZGlzaycsCl07CgovLyAjMTQ0OSDigJQgdGhlIGVudHJpZXMgYWJvdmUgdGhhdCBFTkQgYXQgYSBmaWxlc3lzdGVtIHJvb3QgYXJlIGFsc28gYSBQUkVGSVggb2YKLy8gZXZlcnkgYWJzb2x1dGUgcGF0aCBiZW5lYXRoIGl0LCBzbyBwbGFpbiBzdWJzdHJpbmcgbWF0Y2hpbmcgYmxvY2tlZCByb3V0aW5lCi8vIGNsZWFudXA6IGBybSAtcmYgL3RtcC9zY3JhdGNoYCByZXBvcnRlZCBhcyBgcm0gLXJmIC9gLiBUaG9zZSBlbnRyaWVzIG11c3QKLy8gbWF0Y2ggT04gdGhlIHJvb3QgcmF0aGVyIHRoYW4gYXQgdGhlIGhlYWQgb2YgYSBsb25nZXIgcGF0aC4KLy8KLy8gV0hJQ0ggZW50cmllcyB0aG9zZSBhcmUgaXMgZGVyaXZlZCwgbm90IGxpc3RlZDogYSBwYXR0ZXJuIGlzIHJvb3Qtc2hhcGVkIGlmZgovLyBpdCBlbmRzIGF0IGEgcm9vdCDigJQgYSBzZXBhcmF0b3Igb3IgYH5gLiBUaGF0IHNlbGVjdHMgYHJtIC1yZiAvYCwgYHJtIC1yZiB+YCwKLy8gYGRlbCAvcyAvcSBjOlxgIGFuZCB0aGUgdGhyZWUgYHJlbW92ZS1pdGVtYCBmb3JtcywgYW5kIGxlYXZlcyBgZm9ybWF0IGM6YCwKLy8gYG1rZnMuYCwgYD4gL2Rldi9zZGFgLCBgZm9ybWF0LXZvbHVtZWAgYW5kIGBjbGVhci1kaXNrYCBvbiBwbGFpbiBzdWJzdHJpbmcKLy8gbWF0Y2hpbmcsIHdoZXJlIHRyYWlsaW5nIHRleHQgaXMgc3RpbGwgdGhlIHNhbWUgZGFuZ2Vyb3VzIGNvbW1hbmQuIERlcml2aW5nCi8vIGl0IHJhdGhlciB0aGFuIGtlZXBpbmcgYSBwYXJhbGxlbCBsaXN0IG1lYW5zIGEgZnV0dXJlIHJvb3Qtc2hhcGVkIGFkZGl0aW9uIHRvCi8vIERBTkdFUk9VUyBpcyBhbmNob3JlZCBhdXRvbWF0aWNhbGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgZmFsbGluZyBiYWNrIHRvIHRoZQovLyBwcmVmaXggYnVnIHRoaXMgZml4ZXMuCi8vCi8vIGBybSAtcmYgfmAgam9pbnMgREFOR0VST1VTIHdpdGggdGhpcyBjaGFuZ2U6IGl0IHdhcyBuZXZlciBsaXN0ZWQsIHNvIHdpcGluZyBhCi8vIGhvbWUgZGlyZWN0b3J5IHdhcyBhbGxvd2VkIG91dHJpZ2h0IHdoaWxlIGNsZWFuaW5nIGEgc3ViZGlyZWN0b3J5IG9mIG9uZSB3YXMKLy8gYmxvY2tlZC4gQW5jaG9yaW5nIGlzIHdoYXQgbWFrZXMgdGhlIGVudHJ5IHNhZmUgdG8gYWRkLgpmdW5jdGlvbiBlbmRzQXRSb290KHBhdCkgewogIHZhciBsYXN0ID0gcGF0LmNoYXJBdChwYXQubGVuZ3RoIC0gMSk7CiAgcmV0dXJuIGxhc3QgPT09ICcvJyB8fCBsYXN0ID09PSAnXFwnIHx8IGxhc3QgPT09ICd+JzsKfQovLyBXaGF0IG1heSBsZWdhbGx5IGZvbGxvdyBhIHJvb3QgdGFyZ2V0OiBub3RoaW5nLCB3aGl0ZXNwYWNlLCBhIGdsb2IgKGBybSAtcmYgLypgCi8vIHN0aWxsIGJsb2NrcyksIGEgc2hlbGwgb3BlcmF0b3IsIG9yIGEgY2xvc2luZyBxdW90ZS9wYXJlbi4gQSBwYXRoIGNoYXJhY3RlciDigJQKLy8gbGV0dGVyLCBkaWdpdCwgYC1gLCBgX2Ag4oCUIG1lYW5zIGFub3RoZXIgc2VnbWVudCBmb2xsb3dzLCBpLmUuIHJvdXRpbmUgY2xlYW51cAovLyBvZiBzb21ldGhpbmcgYmVsb3cgcm9vdC4gUnVsZSAjMTogcHVyZSBzdHJpbmcgbG9naWMsIG5vIHBsYXRmb3JtIGJyYW5jaDsgYm90aAovLyBzZXBhcmF0b3JzIGFyZSBoYW5kbGVkIGZvciBldmVyeSBPUydzIHNwZWxsaW5nLgp2YXIgUk9PVF9CT1VOREFSWV9SRSA9IC9bXHM7JnwpIidgKjw+XS87CmZ1bmN0aW9uIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSkgewogIGlmIChpID49IGNtZC5sZW5ndGgpIHJldHVybiB0cnVlOwogIHZhciBjID0gY21kLmNoYXJBdChpKTsKICByZXR1cm4gYyA9PT0gJy8nIHx8IGMgPT09ICdcXCcgfHwgUk9PVF9CT1VOREFSWV9SRS50ZXN0KGMpOwp9CgovKioKICogQWR2YW5jZSBwYXN0IHRleHQgdGhhdCBkb2VzIG5vdCBtb3ZlIE9GRiB0aGUgcm9vdDogcmVwZWF0ZWQgc2VwYXJhdG9ycywgYW5kCiAqIGAuYCAvIGAuLmAgc2VnbWVudHMsIHdoaWNoIHJlc29sdmUgYmFjayB0byB3aGVyZSB0aGV5IHN0YXJ0ZWQuIGBybSAtcmYgLy9gLAogKiBgcm0gLXJmIC8uYCBhbmQgYHJtIC1yZiAvLi5gIGFsbCBzdGlsbCBtZWFuIGBybSAtcmYgL2AgYW5kIG11c3QgYmxvY2ssIHdoaWxlCiAqIGBybSAtcmYgLy90bXAveGAgYW5kIGBybSAtcmYgLy5jb25maWdgIGFyZSByZWFsIHBhdGhzIGJlbG93IHJvb3QgYW5kIG11c3Qgbm90LgogKiBXaXRob3V0IHRoZSBkb3QgaGFuZGxpbmcgdGhlIGFuY2hvcmluZyB3b3VsZCBPUEVOIGEgaG9sZSB0aGUgc3Vic3RyaW5nIG1hdGNoCiAqIGRpZCBub3QgaGF2ZSDigJQgYC5gIGlzIG5vdCBhIGJvdW5kYXJ5IGNoYXJhY3Rlciwgc28gYHJtIC1yZiAvLmAgd291bGQgcmVhZCBhcwogKiAiYSBsb25nZXIgcGF0aCBmb2xsb3dzIiBhbmQgcGFzcy4KICovCmZ1bmN0aW9uIHNraXBUb1Jvb3RFbmQoY21kLCBpKSB7CiAgZm9yICg7OykgewogICAgdmFyIHN0YXJ0ID0gaTsKICAgIHdoaWxlIChpIDwgY21kLmxlbmd0aCAmJiAoY21kLmNoYXJBdChpKSA9PT0gJy8nIHx8IGNtZC5jaGFyQXQoaSkgPT09ICdcXCcpKSBpKys7CiAgICB2YXIgZG90cyA9IDA7CiAgICB3aGlsZSAoY21kLmNoYXJBdChpICsgZG90cykgPT09ICcuJykgZG90cysrOwogICAgLy8gT25seSBhIEJBUkUgYC5gIG9yIGAuLmAgc2VnbWVudCBpcyBhIG5vLW9wOyBgLmNvbmZpZ2AgYW5kIGAuLmZvb2AgYXJlIG5hbWVzLgogICAgaWYgKChkb3RzID09PSAxIHx8IGRvdHMgPT09IDIpICYmIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSArIGRvdHMpKSBpICs9IGRvdHM7CiAgICBpZiAoaSA9PT0gc3RhcnQpIHJldHVybiBpOwogIH0KfQoKLyoqCiAqIFRydWUgd2hlbiBgcGF0YCBvY2N1cnMgaW4gYGNtZGAgYXMgYSByZWFsIGRhbmdlcm91cyBjb21tYW5kLiBSb290LXNoYXBlZAogKiBwYXR0ZXJucyBtdXN0IGxhbmQgb24gdGhlIHJvb3Q7IGV2ZXJ5IG9jY3VycmVuY2UgaXMgZXhhbWluZWQsIHNvIGEgc2FmZQogKiBsZWFkaW5nIG1hdGNoIChgcm0gLXJmIC90bXAvYSAmJiBybSAtcmYgL2ApIG5ldmVyIG1hc2tzIGEgbGF0ZXIgcmVhbCBvbmUuCiAqLwpmdW5jdGlvbiBtYXRjaGVzRGFuZ2Vyb3VzKGNtZCwgcGF0KSB7CiAgaWYgKCFlbmRzQXRSb290KHBhdCkpIHJldHVybiBjbWQuaW5kZXhPZihwYXQpID49IDA7CiAgZm9yICh2YXIgYXQgPSBjbWQuaW5kZXhPZihwYXQpOyBhdCA+PSAwOyBhdCA9IGNtZC5pbmRleE9mKHBhdCwgYXQgKyAxKSkgewogICAgdmFyIGVuZCA9IHNraXBUb1Jvb3RFbmQoY21kLCBhdCArIHBhdC5sZW5ndGgpOwogICAgaWYgKGVuZCA+PSBjbWQubGVuZ3RoIHx8IFJPT1RfQk9VTkRBUllfUkUudGVzdChjbWQuY2hhckF0KGVuZCkpKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLyAjMTEzMiDigJQgQmFzaCBtZW1vcnktZmlyc3QgZ2F0ZS4KLy8KLy8gQ1JFRElUOiBtYXJrcyB0aGUgZ2F0ZSBzYXRpc2ZpZWQgd2hlbiBDbGF1ZGUgaW52b2tlcyBhIG1lbW9yeS1zZWFyY2ggQ0xJCi8vIChgZmxvIG1lbW9yeSBzZWFyY2hgLCBgZmxvLXNlYXJjaGAsIGBzZW1hbnRpYy1zZWFyY2gubWpzYCkgZnJvbSB0aGUgc2hlbGwg4oCUCi8vIHRoZSBlc2NhcGUgaGF0Y2ggdGhhdCBrZWVwcyB0aGUgZ2F0ZSBzYXRpc2ZpYWJsZSB3aGVuIHRoZSBtb2ZsbyBNQ1Agc2VydmVyCi8vIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHNlc3Npb24uCi8vCi8vICMxMzM4IOKAlCB0aGlzIHVzZWQgdG8gYmUgYW4gdW5hbmNob3JlZCBzdWJzdHJpbmcgdGVzdAovLyAoL3NlbWFudGljLXNlYXJjaHxtZW1vcnkgc2VhcmNofG1lbW9yeSByZXRyaWV2ZXxtZW1vcnktc2VhcmNoLykgYWdhaW5zdCB0aGUKLy8gd2hvbGUgY29tbWFuZCwgc28gYGVjaG8gIm1lbW9yeSBzZWFyY2giYCDigJQgb3IgYSBgZ2l0IGNvbW1pdCAtbWAgbWVudGlvbmluZwovLyB0aGUgcGhyYXNlIOKAlCBzYXRpc2ZpZWQgdGhlIGdhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9tcHQuIFRoYXQgaXMgdGhlCi8vIG9wcG9zaXRlIGRpc2NpcGxpbmUgZnJvbSBSRUFEX0xJS0VfQkFTSF9SRSBkaXJlY3RseSBiZWxvdywgd2hpY2ggaXMKLy8gZGVsaWJlcmF0ZWx5IGFuY2hvcmVkLiBDcmVkaXQgbm93IHJlcXVpcmVzIGEgcmVhbCBJTlZPQ0FUSU9OLCBtYXRjaGVkIGJ5Ci8vIEJBU0VOQU1FIHNvIFJ1bGUgIzEgaG9sZHM6IGBmbG9gLCBgZmxvLmNtZGAsIGBucHguY21kIGZsb2AsIGBub2RlIC4vYmluL2NsaS5qc2AKLy8gYW5kIGBub2RlIEM6XC4uLlxiaW5cY2xpLmpzYCBhbGwgY3JlZGl0LCB3aXRoIGVpdGhlciBwYXRoIHNlcGFyYXRvci4KdmFyIENSRURJVF9SVU5ORVJfUkUgPSAvXig/Om5weHxucG18cG5wbXx5YXJufGJ1bnxidW54fGRlbm98bm9kZXxub2RlanN8dHN4fHRzLW5vZGUpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIFN1Yi13b3JkcyBvZiBhIHJ1bm5lciBpbnZvY2F0aW9uIHRoYXQgYXJlIG5vdCB0aGUgZW50cnlwb2ludCBpdHNlbGYKLy8gKGBwbnBtIGRseCBmbG9gLCBgbnBtIGV4ZWMgLS0gZmxvYCwgYG5weCAteSBmbG9gKS4KdmFyIENSRURJVF9SVU5ORVJfU0tJUF9SRSA9IC9eKD86ZGx4fGV4ZWN8cnVufC15fC0teWVzfC1xfC0tcXVpZXR8LS1zaWxlbnR8LS1uby1pbnN0YWxsfC0tKSQvaTsKLy8gVGhlIG1vZmxvIENMSSwgdW5kZXIgZXZlcnkgbmFtZSBwYWNrYWdlLmpzb24gYmluZHMgaXQgdG8gKHBsdXMgdGhlIHJhdyBlbnRyeQovLyBzY3JpcHQsIGZvciBgbm9kZSBub2RlX21vZHVsZXMvbW9mbG8vYmluL2NsaS5qc2ApLgp2YXIgQ1JFRElUX0NMSV9SRSA9IC9eKD86ZmxvfG1vZmxvfGNsYXVkZS1mbG93fGNsaVwuanN8Y2xpXC5tanMpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIEEgc2VhcmNoIGVudHJ5cG9pbnQg4oCUIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlc2UgSVMgYSBtZW1vcnkgc2VhcmNoLgp2YXIgQ1JFRElUX1NFQVJDSF9CSU5fUkUgPSAvXig/OmZsby1zZWFyY2goPzpcLig/OmNtZHxleGV8YmF0fHBzMSkpP3xzZW1hbnRpYy1zZWFyY2hcLm1qcykkL2k7Ci8vIFN1YnN0cmluZyBldmVyeSBjcmVkaXRpbmcgZm9ybSBtdXN0IGNvbnRhaW4g4oCUIHRoZSBob3QtcGF0aCBwcmUtZmlsdGVyLiBDb3ZlcnMKLy8gZmxvIC8gbW9mbG8gLyBmbG8tc2VhcmNoIC8gY2xhdWRlLWZsb3cgKGFsbCBjb250YWluICJmbG8iKSwgY2xpLmpzfGNsaS5tanMsCi8vIGFuZCBzZW1hbnRpYy1zZWFyY2gubWpzLgp2YXIgQ1JFRElUX0hJTlRfUkUgPSAvZmxvfGNsaVwubT9qc3xzZW1hbnRpYy1zZWFyY2gvaTsKLy8gYGZsbyBtZW1vcnkgc2VhcmNoYCAvIGBmbG8gbWVtb3J5IHJldHJpZXZlYCwgYW5kIHRoZSBoeXBoZW4vdW5kZXJzY29yZSBzcGVsbGluZ3MuCnZhciBDUkVESVRfTUVNT1JZX1ZFUkJfUkUgPSAvXig/OnNlYXJjaHxyZXRyaWV2ZSkkL2k7CnZhciBDUkVESVRfTUVNT1JZX0NPTVBPVU5EX1JFID0gL15tZW1vcnlbLV9dKD86c2VhcmNofHJldHJpZXZlKSQvaTsKCi8qKgogKiBMYXN0IHBhdGggc2VnbWVudCBvZiBhIHRva2VuLCBsb3dlcmNhc2VkLiBTcGxpdHMgb24gQk9USCBzZXBhcmF0b3JzLCB1bmxpa2UKICogcGF0aC5iYXNlbmFtZSwgd2hpY2ggb25seSBob25vdXJzIHRoZSBIT1NUJ3Mgc2VwYXJhdG9yIChSdWxlICMxKTogYW4gYWdlbnQgb24KICogUE9TSVggY2FuIGxlZ2l0aW1hdGVseSB0eXBlIGBub2RlIC5jbGF1ZGVcc2NyaXB0c1xzZW1hbnRpYy1zZWFyY2gubWpzYCwgYW5kIGEKICogV2luZG93cy1zaGFwZWQgcGF0aCBtdXN0IHJlc29sdmUgdGhlIHNhbWUgd2hlcmV2ZXIgdGhlIGdhdGUgaGFwcGVucyB0byBydW4uCiAqLwpmdW5jdGlvbiBjb21tYW5kQmFzZW5hbWUodG9rKSB7CiAgdmFyIHQgPSB0b2sucmVwbGFjZSgvXlsiJ10rfFsiJ10rJC9nLCAnJyk7CiAgdmFyIGN1dCA9IHQubGFzdEluZGV4T2YoJy8nKTsKICB2YXIgYnMgPSB0Lmxhc3RJbmRleE9mKCdcXCcpOwogIGlmIChicyA+IGN1dCkgY3V0ID0gYnM7CiAgcmV0dXJuIChjdXQgPj0gMCA/IHQuc2xpY2UoY3V0ICsgMSkgOiB0KS50b0xvd2VyQ2FzZSgpOwp9CgovKioKICogVGhlIG1vZmxvIHN1YmNvbW1hbmQgb25lIHNoZWxsIHNlZ21lbnQgaW52b2tlcywgYXMgbG93ZXJjYXNlZCBwb3NpdGlvbmFsCiAqIGFyZ3MgKGBbJ21lbW9yeScsJ3NlYXJjaCddYCwgYFsnc3dhcm0nLCdpbml0J11gKSwgb3IgbnVsbCB3aGVuIHRoZSBzZWdtZW50CiAqIGRvZXMgbm90IGludm9rZSBtb2ZsbyBhdCBhbGwuIEEgZGVkaWNhdGVkIHNlYXJjaCBiaW5hcnkgcmVwb3J0cyB0aGUKICogc3ViY29tbWFuZCBpdCBpcyDigJQgdGhhdCBpcyBhbGwgYGZsby1zZWFyY2hgIGRvZXMuCiAqLwpmdW5jdGlvbiBtb2Zsb1N1YmNvbW1hbmQoc2VnKSB7CiAgdmFyIHRva2VucyA9IHNlZy50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgaSA9IDA7CiAgLy8gU2tpcCBzaGVsbCBub2lzZSBhaGVhZCBvZiB0aGUgZW50cnlwb2ludDogZW52IGFzc2lnbm1lbnRzIChgRk9PPWJhciBmbG8g4oCmYCksCiAgLy8gc3VkbywgcGFja2FnZSBydW5uZXJzIGFuZCB0aGVpciBmbGFncy4KICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKICAgIHZhciB0b2sgPSB0b2tlbnNbaV07CiAgICBpZiAodG9rID09PSAnc3VkbycgfHwgL15bQS1aYS16X11bQS1aYS16MC05X10qPS8udGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1NLSVBfUkUudGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1JFLnRlc3QoY29tbWFuZEJhc2VuYW1lKHRvaykpKSB7IGkrKzsgY29udGludWU7IH0KICAgIGJyZWFrOwogIH0KICBpZiAoaSA+PSB0b2tlbnMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICB2YXIgZW50cnkgPSBjb21tYW5kQmFzZW5hbWUodG9rZW5zW2ldKTsKICBpZiAoQ1JFRElUX1NFQVJDSF9CSU5fUkUudGVzdChlbnRyeSkpIHJldHVybiBbJ21lbW9yeScsICdzZWFyY2gnXTsKICBpZiAoIUNSRURJVF9DTElfUkUudGVzdChlbnRyeSkpIHJldHVybiBudWxsOwogIC8vIFBvc2l0aW9uYWwgYXJncyBhZnRlciB0aGUgQ0xJIGVudHJ5cG9pbnQ7IGZsYWdzIGNhcnJ5IG5vIHN1YmNvbW1hbmQuCiAgdmFyIHJlc3QgPSBbXTsKICBmb3IgKHZhciBqID0gaSArIDE7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHsKICAgIGlmICh0b2tlbnNbal0uY2hhckF0KDApICE9PSAnLScpIHJlc3QucHVzaCh0b2tlbnNbal0udG9Mb3dlckNhc2UoKSk7CiAgfQogIHJldHVybiByZXN0Owp9CgovKiogRG9lcyBvbmUgc2hlbGwgc2VnbWVudCBpbnZva2UgYSBtb2ZsbyBtZW1vcnkgc2VhcmNoPyAqLwpmdW5jdGlvbiBzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaChzZWcpIHsKICB2YXIgc3ViID0gbW9mbG9TdWJjb21tYW5kKHNlZyk7CiAgaWYgKCFzdWIgfHwgIXN1Yi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBpZiAoQ1JFRElUX01FTU9SWV9DT01QT1VORF9SRS50ZXN0KHN1YlswXSkpIHJldHVybiB0cnVlOwogIHJldHVybiBzdWJbMF0gPT09ICdtZW1vcnknICYmIHN1Yi5sZW5ndGggPiAxICYmIENSRURJVF9NRU1PUllfVkVSQl9SRS50ZXN0KHN1YlsxXSk7Cn0KCi8qKgogKiBDUkVESVQgdGVzdCBmb3IgYSB3aG9sZSBCYXNoL1Bvd2VyU2hlbGwgY29tbWFuZC4gUXVvdGVkIGJvZGllcyBhcmUgc3RyaXBwZWQKICogZmlyc3QgKHNvIGEgY29tbWl0IG1lc3NhZ2UgcXVvdGluZyAibWVtb3J5IHNlYXJjaCIgY2Fubm90IGNyZWRpdCksIHRoZW4gZWFjaAogKiBzaGVsbCBzZWdtZW50IGlzIGNoZWNrZWQgYXQgaXRzIG93biBzdGFydCDigJQgYGNkIHJlcG8gJiYgZmxvIG1lbW9yeSBzZWFyY2hgCiAqIGNyZWRpdHMsIGBlY2hvICJmbG8gbWVtb3J5IHNlYXJjaCJgIGRvZXMgbm90LgogKi8KZnVuY3Rpb24gY3JlZGl0c01lbW9yeVNlYXJjaChyYXdDbWQpIHsKICAvLyBDaGVhcCByZWplY3QgZmlyc3QuIFRoaXMgcnVucyBvbiBFVkVSWSBCYXNoIGNhbGwgaW4gZXZlcnkgY29uc3VtZXIsIGFoZWFkCiAgLy8gb2YgdGhlIGJsb2NrIGFybSdzIHJlZ2V4ZXMsIGFuZCBldmVyeSBjcmVkaXRpbmcgZm9ybSBuZWNlc3NhcmlseSBuYW1lcyBhbgogIC8vIGVudHJ5cG9pbnQgY29udGFpbmluZyBvbmUgb2YgdGhlc2Ug4oCUIHNvIG5vbi1tYXRjaGVzIGNvc3Qgb25lIHJlZ2V4LCBub3QgYQogIC8vIHN0cmlwICsgc3BsaXQgKyB0b2tlbml6ZS4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBtb2Zsb1NlZ21lbnRzKHJhd0NtZCkuc29tZShzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaCk7Cn0KCi8qKiBTaGVsbCBzZWdtZW50cyBvZiBhIGNvbW1hbmQsIHF1b3RlZCBib2RpZXMgc3RyaXBwZWQuICovCmZ1bmN0aW9uIG1vZmxvU2VnbWVudHMocmF3Q21kKSB7CiAgcmV0dXJuIHN0cmlwUXVvdGVkQW5kSGVyZWRvY3MocmF3Q21kIHx8ICcnKS5zcGxpdCgvWzt8JlxuXSsvKTsKfQoKLyoqCiAqICMxMzM4IGZvbGxvdy11cCDigJQgd2hpY2ggcHJvdGVjdGVkLWNvb3JkaW5hdGlvbiBpbml0LCBpZiBhbnksIGRpZCB0aGlzIHNoZWxsCiAqIGNvbW1hbmQgcnVuPyBSZXR1cm5zICdzd2FybScsICdoaXZlJywgb3IgbnVsbC4KICoKICogYGZsbyBzd2FybSBpbml0YCBhbmQgYGZsbyBoaXZlLW1pbmQgaW5pdGAgYXJlIE5PVCBzZWNvbmQtY2xhc3Mgc3RhbmQtaW5zIGZvcgogKiB0aGUgTUNQIHRvb2xzOiB0aGUgQ0xJIGRpc3BhdGNoZXMgaW4tcHJvY2VzcyB0aHJvdWdoIHRoZSBzYW1lIFRPT0xfUkVHSVNUUlkKICogaGFuZGxlciB0aGUgTUNQIHNlcnZlciBleHBvc2VzIChgbWNwLWNsaWVudC50c2AgY2FsbE1DUFRvb2wpLCBhbmQgdGhlCiAqIHJlc3VsdGluZyBzd2FybSBpcyBwZXJzaXN0ZWQgKCM4MDYgYWdlbnRzL3RvcG9sb2d5LCAjMTMyOSB0YXNrcyksIHNvIGEgbGF0ZXIKICogcHJvY2VzcyDigJQgaW5jbHVkaW5nIGEgcmVzdGFydGVkIE1DUCBzZXJ2ZXIg4oCUIGh5ZHJhdGVzIHRoZSBzYW1lIHN3YXJtLgogKgogKiBUaGlzIG1hdHRlcnMgYmVjYXVzZSBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uCiAqIHN0YXJ0IGFuZCBuZXZlciByZXNwYXducyB0aGVtLiBCZWZvcmUgdGhpcywgYHJlY29yZC1zd2FybS1pbml0YCBmaXJlZCBvbmx5IG9uCiAqIGBtY3BfX21vZmxvX19zd2FybV9pbml0YCwgc28gYSBzZXNzaW9uIHRoYXQgbG9zdCBpdHMgTUNQIHNlcnZlciBoaXQgdGhlICM5NTIKICogZ2F0ZSB3aXRoIE5PIHdheSB0byBzYXRpc2Z5IGl0OiBgL2ZsIC1zYCBibG9ja2VkIGV2ZXJ5IEFnZW50IHNwYXduIGFuZCB0b2xkCiAqIHRoZSByZWFkZXIgdG8gY2FsbCBhIHRvb2wgdGhhdCBkaWQgbm90IGV4aXN0IGluIHRoYXQgc2Vzc2lvbi4gVW5saWtlIHRoZQogKiBtZW1vcnkgZ2F0ZSwgdGhlcmUgd2FzIG5vdCBldmVuIGFuIHVuYWR2ZXJ0aXNlZCBlc2NhcGUuCiAqCiAqIERlbGliZXJhdGVseSB3aXJlZCBQb3N0VG9vbFVzZSwgbm90IFByZVRvb2xVc2Ugd2hlcmUgdGhlIG1lbW9yeSBjcmVkaXQgbGl2ZXM6CiAqIENsYXVkZSBDb2RlIGRvZXMgbm90IGZpcmUgUG9zdFRvb2xVc2Ugd2hlbiBhIGNvbW1hbmQgZXhpdHMgbm9uLXplcm8gKCMxMzIyKSwKICogc28gb25seSBhbiBpbml0IHRoYXQgYWN0dWFsbHkgU1VDQ0VFREVEIGNyZWRpdHMgdGhlIGdhdGUuIEEgZmFpbGVkIGluaXQgbXVzdAogKiBuZXZlciBvcGVuIGl0IOKAlCB0aGF0IHdvdWxkIGJlIHRoZSBzaWxlbnQtZGVncmFkYXRpb24gZmFpbHVyZSBDTEFVREUubWQncwogKiBwcm90ZWN0ZWQtZnVuY3Rpb25hbGl0eSBydWxlIGV4aXN0cyB0byBwcmV2ZW50LgogKi8KZnVuY3Rpb24gYmFzaENvb3JkaW5hdGlvbkluaXQocmF3Q21kKSB7CiAgLy8gQ2hlYXAgcmVqZWN0LCBzYW1lIGhvdC1wYXRoIGRpc2NpcGxpbmUgYXMgY3JlZGl0c01lbW9yeVNlYXJjaDogZXZlcnkKICAvLyBjcmVkaXRpbmcgZm9ybSBuYW1lcyBhIG1vZmxvIGVudHJ5cG9pbnQgQU5EIHRoZSBgaW5pdGAgc3ViY29tbWFuZC4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSB8fCAhL1xiaW5pdFxiL2kudGVzdChyYXdDbWQpKSByZXR1cm4gbnVsbDsKICB2YXIgc2VnbWVudHMgPSBtb2Zsb1NlZ21lbnRzKHJhd0NtZCk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgdmFyIHN1YiA9IG1vZmxvU3ViY29tbWFuZChzZWdtZW50c1tpXSk7CiAgICBpZiAoIXN1YiB8fCBzdWIubGVuZ3RoIDwgMiB8fCBzdWJbMV0gIT09ICdpbml0JykgY29udGludWU7CiAgICBpZiAoc3ViWzBdID09PSAnc3dhcm0nKSByZXR1cm4gJ3N3YXJtJzsKICAgIC8vIGBoaXZlYCBpcyB0aGUgcmVnaXN0ZXJlZCBhbGlhcyBmb3IgYGhpdmUtbWluZGAgKGNvbW1hbmRzL2hpdmUtbWluZC50cykuCiAgICBpZiAoc3ViWzBdID09PSAnaGl2ZS1taW5kJyB8fCBzdWJbMF0gPT09ICdoaXZlJykgcmV0dXJuICdoaXZlJzsKICB9CiAgcmV0dXJuIG51bGw7Cn0KLy8gIzE0NDUg4oCUIHJlYWQgc2hhcGVzIHdob3NlIExFQURJTkcgY29tbWFuZCBpcyBvbmUgQkFTSF9DQVJWRV9PVVRfUkUgY2FydmVzIG91dAovLyB3aG9sZXNhbGUgKGBub2RlIOKApmAsIGBnaXQg4oCmYCkuIFRoZXkgYXJlIHJlYWQtbGlrZSBiZWNhdXNlIG9mIHdoYXQgRk9MTE9XUyB0aGUKLy8gbGVhZGluZyB0b2tlbiwgc28gYW5jaG9yaW5nIG9uIHRoYXQgdG9rZW4gYWxvbmUgY2FuIG5ldmVyIHNlZSB0aGVtOiBpbiBvbmUKLy8gcmVhbCBzZXNzaW9uIDUzOSBmaWxlLWV4cGxvcmF0aW9uIGNhbGxzIHdlbnQgdGhyb3VnaCBgbm9kZSAtZWAgKyByZWFkRmlsZVN5bmMKLy8gYW5kIGBnaXQgc2hvdyA8cmVmPjo8cGF0aD5gIHdpdGggdGhlIGdhdGUgYmxpbmQgdG8gZXZlcnkgb25lIG9mIHRoZW0uIFRoYXQgaXMKLy8gdGhlIGRvbWluYW50IGV4cGxvcmF0aW9uIHNoYXBlIGluIHJlcG9zIHdob3NlIG93biBndWlkYW5jZSBzdGVlcnMgYXdheSBmcm9tCi8vIGBncmVwYCAoZS5nLiB3aGVyZSBgZ3JlcGAgaXMgYHVncmVwYCBhbmQgc2lsZW50bHkgc2tpcHMgZmlsZXMsIHNvIGFueQovLyBpbnZlbnRvcnkgYSBkZWNpc2lvbiByZXN0cyBvbiBtdXN0IGdvIHRocm91Z2ggYGZzLnJlYWRGaWxlU3luY2ApLgovLwovLyBUaGVzZSBzb3VyY2VzIGFyZSBzcGxpY2VkIGludG8gUkVBRF9MSUtFX0JBU0hfUkUgYmVsb3cgQU5EIGtlcHQgYWRkcmVzc2FibGUKLy8gb24gdGhlaXIgb3duLCBiZWNhdXNlIGNoZWNrLWJhc2gtbWVtb3J5IGhhcyB0byBsZXQgdGhlbSBvdmVycmlkZSB0aGUKLy8gY2FydmUtb3V0IOKAlCBleHRlbmRpbmcgUkVBRF9MSUtFIGFsb25lIHdvdWxkIGNoYW5nZSBub3RoaW5nLCB0aGUgYF5ccyoobm9kZXwKLy8gZ2l0KVxzYCBjYXJ2ZS1vdXQgYXJtcyBzd2FsbG93IHRoZW0gb25lIGxpbmUgbGF0ZXIuCnZhciBSVU5ORVJfUkVBRF9TT1VSQ0VTID0gWwogIC8vIGBub2RlIC1lICIuLi5yZWFkRmlsZVN5bmMoLi4uKS4uLiJgLCBpbiBldmVyeSBldmFsIHNwZWxsaW5nICgtZS8tLWV2YWwvLXAvCiAgLy8gLS1wcmludC8tLWlucHV0LXR5cGU9bW9kdWxlIC1lKS4gVGhlIGV2YWwgRkxBRyBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcXVpcmVkOgogIC8vIGEgc2NyaXB0LWZpbGUgaW52b2NhdGlvbiAoYG5vZGUgc2NyaXB0cy9idWlsZC5tanNgKSBkb2VzIG5vdCBjYXJyeSBhIHJlYWQKICAvLyBjYWxsIGluIGl0cyBjb21tYW5kIGxpbmUsIHNvIHRoZSByZWFkIGNhbGwgaXRzZWxmIGlzIHRoZSByZWxpYWJsZSBzaWduYWwgYW5kCiAgLy8gZGVtYW5kaW5nIHRoZSBmbGFnIG9ubHkgYWRkcyBzcGVsbGluZ3MgdG8gbWlzcy4KICAvLwogIC8vIFRoZSBuZWdhdGl2ZSBsb29rYWhlYWQgaXMgbG9hZC1iZWFyaW5nLCBub3QgY2F1dGlvbjogUnVsZSAjMSB0ZWxscyBhdXRob3JzCiAgLy8gdG8gZG8gY3Jvc3MtcGxhdGZvcm0gZmlsZSBPUFMgdGhyb3VnaCBgbm9kZSAtZWAgd2l0aCBmcyAoYG1rZGlyYC9gcm1gL2BjcGAKICAvLyBkbyBub3QgZXhpc3Qgb24gV2luZG93cyksIGFuZCBhIHJlYWQtbW9kaWZ5LXdyaXRlIGlzIGFuIG9wZXJhdGlvbiwgbm90CiAgLy8gZXhwbG9yYXRpb24uIE9ubHkgZnMgTVVUQVRJT04gY2FsbHMgY2FydmUgb3V0IOKAlCBtYXRjaGluZyBhIGJhcmUgYHdyaXRlYAogIC8vIHdvdWxkIGNhcnZlIG91dCBgcHJvY2Vzcy5zdGRvdXQud3JpdGVgLCB3aGljaCBuZWFybHkgZXZlcnkgaW5saW5lIHJlYWQKICAvLyBzY3JpcHQgZW5kcyB3aXRoLCBhbmQgdGhhdCB3b3VsZCBoYW5kIGJhY2sgdGhlIHdob2xlIGdhcC4KICAvLwogIC8vIEV2ZXJ5IG11dGF0aW9uIG5hbWUgY292ZXJzIGl0cyBzeW5jLCBjYWxsYmFjayBBTkQgcHJvbWlzZSBzcGVsbGluZzogYXV0aG9ycwogIC8vIHJlYWNoIGZvciBgZnMucHJvbWlzZXMucm1gIGFzIHJlYWRpbHkgYXMgYHJtU3luY2AsIGFuZCBsaXN0aW5nIG9ubHkgdGhlCiAgLy8gYCpTeW5jYCBmb3JtIHdvdWxkIGJsb2NrIHRoZSBkZWxldGUgb3AgUnVsZSAjMSBzZW50IHRoZW0gdG8gYG5vZGUgLWVgIGZvci4KICAvLyBgcm1gL2BybWRpcmAvYGNwYCBjYXJyeSBgXGJgIGJlY2F1c2UgdGhleSBhcmUgc2hvcnQgZW5vdWdoIHRvIGFwcGVhciBpbnNpZGUKICAvLyB1bnJlbGF0ZWQgd29yZHMg4oCUIGFuIHVuYW5jaG9yZWQgYHJtYCBtYXRjaGVzICJmb3JtYXQiIGFuZCAidHJhbnNmb3JtIiwgYW5kCiAgLy8gd291bGQgY2FydmUgb3V0IG1vc3Qgb2Ygd2hhdCB0aGlzIGFybSBleGlzdHMgdG8gY2F0Y2guCiAgJ15cXHMqKD86bm9kZXxub2RlanMpKD86XFwuKD86ZXhlfGNtZCkpP1xccycKICAgICsgJyg/PVtcXHNcXFNdKig/OnJlYWQoPzpGaWxlfGRpcil8Z2xvYlN5bmMpKScKICAgICsgJyg/IVtcXHNcXFNdKig/OndyaXRlRmlsZXxhcHBlbmRGaWxlfG1rZGlyfG1rZHRlbXB8dW5saW5rfGNvcHlGaWxlfHJlbmFtZScKICAgICsgJ3xzeW1saW5rfGNyZWF0ZVdyaXRlU3RyZWFtfFxcYnJtKD86ZGlyKT8oPzpTeW5jKT9cXGJ8XFxiY3AoPzpTeW5jKT9cXGIpKScsCiAgLy8gYGdpdCBzaG93IDxyZWY+OjxwYXRoPmAgLyBgZ2l0IGNhdC1maWxlIC1wIDxyZWY+OjxwYXRoPmAg4oCUIHRoZSBjb2xvbiBmb3JtCiAgLy8gcmVhZHMgYSBibG9iIGFuZCBpcyBgY2F0YCBieSBhbm90aGVyIG5hbWUuIExlYWRpbmcgYC1gLXByZWZpeGVkIHRva2VucyBhcmUKICAvLyBjb25zdW1lZCBhcyBmbGFncyBmaXJzdCBzbyBgLS1wcmV0dHk9Zm9ybWF0OiVoYCAoYSBjb2xvbiBpbnNpZGUgYSBGTEFHKQogIC8vIGNhbm5vdCBtYXNxdWVyYWRlIGFzIGEgcmVmOnBhdGgsIGFuZCB0aGUgc2VnbWVudCBhZnRlciB0aGUgY29sb24gbXVzdCBjYXJyeQogIC8vIGEgcGF0aCBjaGFyYWN0ZXIg4oCUIHNhbWUgZmFsc2UtbmVnYXRpdmUgdHJhZGUgYXMgdGhlIGB0eXBlIFxTKltcXC8uXWAgYXJtCiAgLy8gYWJvdmUgKGBnaXQgc2hvdyBIRUFEOnNyY2AsIGEgYmFyZSBkaXJlY3RvcnksIHBhc3Nlczsgc291cmNlIGZpbGVzIGFsbCBoYXZlCiAgLy8gZXh0ZW5zaW9ucykuIEJhcmUgYGdpdCBzaG93YCwgYGdpdCBzaG93IC0tc3RhdGAsIGBnaXQgbG9nYCBhbmQgYGdpdCBkaWZmYAogIC8vIGhhdmUgbm8gcmVmOnBhdGggdG9rZW4gYW5kIHN0YXkgb3BlcmF0aW9uYWwuCiAgJ15cXHMqZ2l0XFxzKyg/OnNob3d8Y2F0LWZpbGUpXFxzKyg/Oi17MSwyfVxcUytcXHMrKSpbXi1cXHNdXFxTKjpcXFMqW1xcXFwvLl0nLAogIC8vIFJlcG8td2lkZSBjb250ZW50IHNlYXJjaCBhbmQgZmlsZSBpbnZlbnRvcnkg4oCUIHRoZSBgZ2l0YCBzcGVsbGluZ3Mgb2YKICAvLyBgZ3JlcCAtcmAgYW5kIGBmaW5kYC4gTk9UIGBnaXQgbG9nIC0tZ3JlcGAsIHdoaWNoIHNlYXJjaGVzIGNvbW1pdCBtZXNzYWdlcywKICAvLyBpcyBhbHJlYWR5IGluIHRoZSBwYXNzaW5nIHNldCwgYW5kIGRvZXMgbm90IG1hdGNoIGBnaXRccytncmVwYC4KICAnXlxccypnaXRcXHMrKD86Z3JlcHxscy1maWxlcylcXGInLApdOwovLyBTYW1lIHNvdXJjZXMgYXMgdGhlaXIgb3duIG1hdGNoZXIg4oCUIGNoZWNrLWJhc2gtbWVtb3J5IHRlc3RzIHRoaXMgdG8gbGV0IGEKLy8gY2FydmVkLW91dCBsZWFkaW5nIGNvbW1hbmQgc3RpbGwgYmxvY2sgd2hlbiB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHJlYWQuCnZhciBSVU5ORVJfUkVBRF9CQVNIX1JFID0gbmV3IFJlZ0V4cChSVU5ORVJfUkVBRF9TT1VSQ0VTLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQkxPQ0s6IHJlYWQtbGlrZSBCYXNoIGNvbW1hbmRzIHRoYXQgYnlwYXNzIHRoZSBleGlzdGluZyBjaGVjay1iZWZvcmUtcmVhZCAvCi8vIGNoZWNrLWJlZm9yZS1zY2FuIGdhdGVzIGJ5IGdvaW5nIHRocm91Z2ggdGhlIHNoZWxsLiBBbmNob3JlZCB0byB0aGUgc3RhcnQgb2YKLy8gdGhlIGxpbmUgc28gc3ViY29tbWFuZHMgaW5zaWRlIHBpcGVsaW5lcyBvciBgbnBtIGluc3RhbGwgZ3JlcGAgZG9uJ3QgdHJpcC4KLy8gQ292ZXJzIFBPU0lYIHJlYWQvc2VhcmNoIHRvb2xzLCBXaW5kb3dzIGNtZCBgdHlwZWAsIGFuZCBQb3dlclNoZWxsIHJlYWRlcnMuCi8vICMxMTcxIOKAlCBleHRlbmRlZCB3aXRoIFBvd2VyU2hlbGwtbmF0aXZlIGV4cGxvcmF0aW9uIGZvcm1zIG5vdyB0aGF0IHRoZSBtYXRjaGVyCi8vIHdpZGVucyB0byB0aGUgYFBvd2VyU2hlbGxgIHRvb2wuIFBsYWluIGBHZXQtQ2hpbGRJdGVtYCB3aXRob3V0IC1SZWN1cnNlIHN0YXlzCi8vIHVuY292ZXJlZCAoaXQncyBgbHNgLWVxdWl2YWxlbnQgYW5kIHBsYWluIGBsc2AgaXMgYWxsb3dlZCkuCnZhciBSRUFEX0xJS0VfQkFTSF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx4eGR8b2R8aGV4ZHVtcClcXGInLAogICdeXFxzKig/OmdyZXB8cmd8YWd8ZmdyZXB8ZWdyZXB8ZmluZHxmZClcXGInLAogICdeXFxzKnNlZFxccystblxcYicsCiAgJ15cXHMqYXdrXFxzKyg/IS4qPDwpJywKICAvLyBgdHlwZSA8cGF0aD5gIG9uIFdpbmRvd3MuIE5vIGAkYCBhbmNob3Igc28gYSBwaXBlZCBmb3JtCiAgLy8gKGB0eXBlIHNyY1xmb28udHMgfCBncmVwIHhgKSBzdGlsbCBtYXRjaGVzIGFuZCBnZXRzIGJsb2NrZWQuIFRoZSBhcmd1bWVudAogIC8vIG11c3QgY29udGFpbiBhIHNsYXNoLCBiYWNrc2xhc2gsIG9yIGRvdCDigJQgb3RoZXJ3aXNlIGl0J3MgdGhlIHNoZWxsLWJ1aWx0aW4KICAvLyBjb21tYW5kLWxvb2t1cCBmb3JtIChgdHlwZSBsc2AsIGB0eXBlIGNkYCkgd2hpY2ggdGhlIGdhdGUgaGFzIG5vIGJ1c2luZXNzCiAgLy8gYmxvY2tpbmcuIEZhbHNlLW5lZ2F0aXZlIHRyYWRlOiBleHRlbnNpb24tbGVzcyBmaWxlbmFtZXMgbGlrZSBgdHlwZSBNYWtlZmlsZWAKICAvLyBwYXNzIHRocm91Z2guIEFjY2VwdGFibGUg4oCUIHNvdXJjZSBmaWxlcyBhbGwgaGF2ZSBleHRlbnNpb25zLCBhbmQgdGhlCiAgLy8gcHJpbWFyeSByaXNrIHBhdHRlcm4gaXMgbGVha2luZyBwYXN0IHRoZSBnYXRlIHZpYSBgdHlwZSBzcmNcZm9vLnRzYC4KICAnXlxccyp0eXBlXFxzK1xcUypbXFxcXC8uXScsCiAgJ15cXHMqKD86R2V0LUNvbnRlbnR8Z2N8U2VsZWN0LVN0cmluZ3xzbHMpXFxiJywKICAvLyAjMTE3MSDigJQgUG93ZXJTaGVsbCByZWN1cnNpdmUgZXhwbG9yYXRpb24gKHBhcmFsbGVsIHRvIFBPU0lYIGBmaW5kYC9gZmRgKS4KICAvLyBUaGUgYC1SZWN1cnNlYCBmbGFnIGlzIHdoYXQgbWFrZXMgaXQgZXhwZW5zaXZlIGVub3VnaCB0byBnYXRlOyBwbGFpbgogIC8vIGBHZXQtQ2hpbGRJdGVtYCBpcyBgbHNgLXNoYXBlZCBhbmQgaW50ZW50aW9uYWxseSBub3QgYmxvY2tlZC4KICAnXlxccyooPzpHZXQtQ2hpbGRJdGVtfGdjaSlcXGJbXnxdKi1SZWN1cnNlXFxiJywKICAvLyAjMTE3MSDigJQgY21kLXN0eWxlIHJlY3Vyc2l2ZSBsaXN0aW5nIChgZGlyIC9zYCBvciBgZGlyIC9TYCkuIE9ubHkgdGhlCiAgLy8gV2luZG93cyBgL3NgIGZvcm0sIE5PVCBQT1NJWCBgZGlyIC1zYCAoc29ydC1ieS1zaXplLCB3aGVyZSBgZGlyYCBpcyBhbGlhc2VkCiAgLy8gdG8gYGxzIC1sYCBvbiBtYW55IGRpc3Ryb3MpIOKAlCBmYWxzZS1wb3NpdGl2ZSBibG9ja2luZyB0aGF0IHdvdWxkIGJyZWFrCiAgLy8gbGVnaXRpbWF0ZSBQT1NJWCBsaXN0aW5ncy4KICAnXlxccypkaXJcXGJbXnxdKlxcc1xcL1tzU11cXGInLAogIC8vICMxMTcxIOKAlCBQb3dlclNoZWxsIGhleCBkdW1wLCBwYXJhbGxlbCB0byBQT1NJWCBgeHhkYC9gaGV4ZHVtcGAuCiAgJ15cXHMqRm9ybWF0LUhleFxcYicsCl0uY29uY2F0KFJVTk5FUl9SRUFEX1NPVVJDRVMpLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQ0FSVkUtT1VUOiBjb21tYW5kcyB0aGF0IExPT0sgcmVhZC1saWtlIGJ1dCBhcmUgb3BlcmF0aW9uYWwuIEFuY2hvcmVkIHRvIHRoZQovLyBMRUFESU5HIGNvbW1hbmQg4oCUIHRoZSBwaXBlLWZpbHRlciBjYXNlIChgbnBtIHRlc3QgfCBncmVwIEZBSUxgKSBpcyBhbHJlYWR5Ci8vIGhhbmRsZWQgYnkgUkVBRF9MSUtFJ3MgYF5ccypgIGFuY2hvciBuZXZlciBtYXRjaGluZyB0aGUgbGVhZGluZyBgbnBtYCwgc28KLy8gdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyBwaXBlIGFybSBoZXJlOiBjYXRjaGluZyB0aGUgbGVhZGluZyBjb21tYW5kIGxldHMKLy8gYGdyZXAgLXIgVE9ETyBzcmMvIHwgaGVhZCAtNWAgcmVhY2ggdGhlIEJMT0NLIGV4aXQgKHdoaWNoIGl0IG11c3QsIHRoYXQncwovLyB0aGUgZ2FwIHRoZSB0aWNrZXQgZXhpc3RzIHRvIGNsb3NlKS4gIzExMzIuCnZhciBCQVNIX0NBUlZFX09VVF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKihucG18bnB4fHBucG18eWFybnxidW58bm9kZXxkZW5vfHRzeHx0cy1ub2RlKVxccycsCiAgJ15cXHMqKGdpdHxnaHxodWIpXFxzJywKICAnXlxccyooZG9ja2VyfGt1YmVjdGx8aGVsbXx0ZXJyYWZvcm0pXFxzJywKICAnXlxccyooY3VybHx3Z2V0fGh0dHB8ZmV0Y2gpXFxzJywKICAnXlxccyooanF8eXF8eHEpXFxzJywKICAnXlxccyooZWNob3xwcmludGZ8dHJ1ZXxmYWxzZXxzbGVlcHx0ZXN0fFxcWylcXHMnLAogICdeXFxzKmNhdFxccysoPDx8PDw8KScsCiAgJ15cXHMqY2F0XFxzK1tefF0qXFxzKj4nLAogICdeXFxzKnRlZVxcYicsCiAgLy8gTGF6eSBgLis/YCBpbnN0ZWFkIG9mIGAuK1xzYCB0byBhdm9pZCBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nIG9uIGxvbmcKICAvLyBgZmluZGAgY29tbWFuZHMgdGhhdCBsYWNrIGEgYC1kZWxldGVgIC8gYC1leGVjIHJtYCBzdWZmaXguCiAgJ15cXHMqZmluZFxccysuKz8tKGRlbGV0ZXxleGVjXFxzK3JtKVxcYicsCl0uam9pbignfCcpKTsKLy8gIzExNzEgZm9sbG93LXVwIOKAlCBzdHJpcCBxdW90ZWQgc3RyaW5nIGJvZGllcyBhbmQgaGVyZWRvYyBib2RpZXMgZnJvbSBhIHNoZWxsCi8vIGNvbW1hbmQgZm9yIHB1cnBvc2VzIG9mIGRhbmdlcm91cy1wYXR0ZXJuIHN1YnN0cmluZyBtYXRjaGluZy4gVXNlZCBieQovLyBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4gRG9lcyBOT1Qgc3RyaXAgJCguLi4pIG9yIGAuLi5gIGJlY2F1c2UgdGhvc2UgYm9kaWVzCi8vIGV4ZWN1dGUuIERvdWJsZS1xdW90ZWQgc3RyaW5ncyBoYW5kbGUgZXNjYXBlZCBxdW90ZXMgKGBcImApIGNvcnJlY3RseSBzbwovLyBgZ2l0IGNvbW1pdCAtbSAiZml4IFwiWFwiImAgc3RyaXBzIHRoZSB3aG9sZSBxdW90ZWQgYm9keSwgbm90IGp1c3QgdGhlIGZpcnN0Ci8vIGBcImAgcGFpci4gU2luZ2xlIHF1b3RlcyBkb24ndCBoYXZlIGVzY2FwZXMgaW4gYmFzaC9zaCDigJQgYCdbXiddKidgIGlzIGV4YWN0LgpmdW5jdGlvbiBzdHJpcFF1b3RlZEFuZEhlcmVkb2NzKGNtZCkgewogIHZhciBvdXQgPSBjbWQ7CiAgLy8gSGVyZWRvYyB0YWlsOiBgPDxUT0tFTmAsIGA8PC1UT0tFTmAsIGA8PCdUT0tFTidgLCBgPDwiVE9LRU4iYCB0aHJvdWdoIGVuZC1vZi1pbnB1dC4KICAvLyBCYXNoIGhlcmVkb2NzIGFyZSBtdWx0aS1saW5lOyBpbiBzaW5nbGUtbGluZSB0b29sIGlucHV0cyB0aGV5IHNob3cgdXAgYXMgdGhlCiAgLy8gdGFpbCBhZnRlciBgPDxUT0tFTmAuIENvbnNlcnZhdGl2ZSB0YWlsLXN0cmlwIOKAlCBiZW5pZ24gY29udGVudCBhZnRlciBhIGhlcmVkb2MKICAvLyBib2R5IG9uIHRoZSBzYW1lIGxvZ2ljYWwgbGluZSBpcyBhbHNvIHN0cmlwcGVkLCBoYXJtbGVzcyBmb3IgdGhpcyBnYXRlLgogIC8vIFRva2VuIGNsYXNzIGluY2x1ZGVzIGAtYCBzbyBoeXBoZW5hdGVkIGhlcmVkb2MgdGFncyAoYDw8RU5ELU9GLURPQ2ApIG1hdGNoCiAgLy8gdGhlIGZ1bGwgdG9rZW4sIG5vdCBqdXN0IHRoZSBsZWFkaW5nIHdvcmQg4oCUIHdpdGhvdXQgdGhpcyB0aGUgc3RyaXAgd291bGQKICAvLyBoYWx0IGF0IGA8PEVORGAgYW5kIGxlYXZlIGAtT0YtRE9DYCBwbHVzIHRoZSBib2R5IGFzIGxpdGVyYWwgdGV4dC4KICBvdXQgPSBvdXQucmVwbGFjZSgvPDwtP1xzKlsnIl0/W1x3LV0rWyciXT9bXHNcU10qJC8sICcnKTsKICAvLyBIZXJlLXN0cmluZyBgPDw8d29yZGAg4oCUIHN0cmlwIHRoZSB3b3JkLgogIG91dCA9IG91dC5yZXBsYWNlKC88PDxccypcUysvZywgJycpOwogIC8vIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyDigJQgbm8gZXNjYXBlcyBpbnNpZGUgc2luZ2xlIHF1b3RlcyBpbiBzaC9iYXNoLgogIG91dCA9IG91dC5yZXBsYWNlKC8nW14nXSonL2csICInJyIpOwogIC8vIERvdWJsZS1xdW90ZWQgc3RyaW5ncyDigJQgYCg/OlteIlxcXXxcXC4pKmAgbWF0Y2hlcyBhbnl0aGluZyBleGNlcHQgYW4KICAvLyB1bmVzY2FwZWQgYCJgLCBzbyBlc2NhcGVkIGBcImAgbWlkLXN0cmluZyBkb2Vzbid0IHRlcm1pbmF0ZSB0aGUgc3RyaXAgZWFybHkuCiAgb3V0ID0gb3V0LnJlcGxhY2UoLyIoPzpbXiJcXF18XFwuKSoiL2csICciIicpOwogIHJldHVybiBvdXQ7Cn0KCi8vICMxNDQ3IOKAlCB3b3JkcyB0aGF0IGNhcnJ5IG5vIHN1YmplY3QgdG8gc2VhcmNoIEZPUjogYXNzZW50LCBhY2tub3dsZWRnZW1lbnQsCi8vICJrZWVwIGdvaW5nIiwgYW5kIGNvbnZlcnNhdGlvbmFsIGZpbGxlci4gQSBwcm9tcHQgYnVpbHQgT05MWSBmcm9tIHRoZXNlCi8vIGNvbnRpbnVlcyB3b3JrIGFscmVhZHkgdW5kZXIgd2F5LCBzbyB0aGUgbWVtb3J5IGdhdGUgc3RheXMgZG93bjsgYW55dGhpbmcKLy8gdGhhdCBzdXJ2aXZlcyB0aGUgc3RyaXAgaXMgYSBzdWJqZWN0LCBhbmQgdGhlIGdhdGUgYXJtcy4KLy8KLy8gU3VwZXJzZWRlcyB0d28gdGhpbmdzLiBgRElSRUNUSVZFX1JFYCDigJQgYSBgXih5ZXN8b2t8c3VyZXzigKYpYCBwcmVmaXggdGVzdCB0aGF0Ci8vIGhhZCBhbHJlYWR5IGJlZW4gZGVhZCBjb2RlIGZvciBzb21lIHRpbWUsIHVucmVmZXJlbmNlZCBieSB0aGUgcmVzZXQgaXQgd2FzCi8vIHdyaXR0ZW4gZm9yLiBBbmQgdGhlIGxpdmUgcnVsZSwgYFRBU0tfUkUudGVzdChwKSB8fCBwLmxlbmd0aCA+IDIwYCwgd2hvc2UKLy8gcmVhbCB3b3JrIHdhcyBza2lwcGluZyBzaG9ydCByZXBsaWVzOiBldmVyeSBwcm9tcHQgb2YgMjAgY2hhcmFjdGVycyBvciBmZXdlcgovLyB3aXRob3V0IGEgdGFzayB3b3JkIHdhcyBleGVtcHQuIFRoYXQgY2F1Z2h0IHRyaXZpYSAoImhtbSIsICJnb3QgaXQiKSBhbmQKLy8gZXF1YWxseSBjYXVnaHQgImNoZWNrIHRoZSBkYWVtb24iIOKAlCBhIGdlbnVpbmUgdG9waWMgY2hhbmdlIOKAlCB3aGljaCBpcyB0aGUKLy8gaGFsZiB0aGlzIHJlcGxhY2VzLiBUaGUgbGlzdCBiZWxvdyBoYXMgdG8gY2FycnkgdGhlIHRyaXZpYSBoYWxmIG9uIGl0cyBvd24sCi8vIHNvIGl0IGNvdmVycyBjb25zaWRlcmFibHkgbW9yZSBncm91bmQgdGhhbiBESVJFQ1RJVkVfUkUgZXZlciBkaWQuCi8vCi8vIE1hdGNoaW5nIGJ5IFNVQlRSQUNUSU9OLCBub3QgYnkgYSBsZWFkaW5nLXRva2VuIHRlc3QsIGlzIHdoYXQgbGV0cwovLyAieWVzLCBub3cgZml4IHRoZSBkYWVtb24iIGFybSB3aGlsZSAieWVzIiBkb2VzIG5vdCDigJQgYSBgXih5ZXN8b2spXGJgIHRlc3QKLy8gc2VlcyB0aGUgc2FtZSBmaXJzdCB3b3JkIGluIGJvdGguIEl0IGlzIGFsc28gd2h5IHRoZSBsaXN0IGNhbiBzYWZlbHkgaG9sZAovLyBvcmRpbmFyeSB3b3JkcyBsaWtlIGBkb2AvYGl0YC9gd29ya2AvYHRoZWA6IGEgd29yZCBvbmx5IGV4ZW1wdHMgYSBwcm9tcHQgd2hlbgovLyBOT1RISU5HIGVsc2UgaW4gdGhhdCBwcm9tcHQgc3Vydml2ZXMsIHNvIGVhY2ggYWRkaXRpb24gY29zdHMgcHJlY2lzaW9uIG9ubHkKLy8gZm9yIHByb21wdHMgbWFkZSBlbnRpcmVseSBvZiBsaXN0ZWQgd29yZHMuIERlbGliZXJhdGVseSBhYnNlbnQgZm9yIHRoYXQKLy8gcmVhc29uOiB0YXNrIHdvcmRzIChgZml4YCwgYHRlc3RgLCBgYnVpbGRgKSBhbmQgYW55IG5vdW4uCnZhciBDT05USU5VQVRJT05fV09SRF9SRSA9IG5ldyBSZWdFeHAoJ1xcYig/OicgKyBbCiAgLy8gQXNzZW50IC8gZGlzc2VudCAvIGFja25vd2xlZGdlbWVudAogICd5ZXMnLCAneWVhaCcsICd5ZXAnLCAneXVwJywgJ25vJywgJ25vcGUnLCAnc3VyZScsICdvaycsICdva2F5JywgJ2snLAogICdjb3JyZWN0JywgJ3JpZ2h0JywgJ2V4YWN0bHknLCAncGVyZmVjdCcsICdhZ3JlZWQnLCAndHJ1ZScsICdpbmRlZWQnLAogICd1bmRlcnN0b29kJywgJ2dvdGNoYScsICdnb3QnLCAnbWFrZXMnLCAnc2Vuc2UnLCAnZmluZScsICdhbHJpZ2h0JywKICAvLyBDb250aW51YXRpb24gLyBhc3NlbnQgdG8gcHJvY2VlZAogICdjb250aW51ZScsICdwcm9jZWVkJywgJ2NhcnJ5JywgJ2tlZXAnLCAnZ29pbmcnLCAnZ28nLCAnYWhlYWQnLCAnb24nLCAnbmV4dCcsCiAgJ2FnYWluJywgJ21vcmUnLCAncmVzdCcsICdib3RoJywgJ2FsbCcsICd0aGVtJywgJ3Rob3NlJywKICAvLyBQb2xpdGVuZXNzIGFuZCBwcmFpc2UKICAncGxlYXNlJywgJ3RoYW5rcycsICd0aGFuaycsICd0eScsICdncmVhdCcsICduaWNlJywgJ2Nvb2wnLCAnZ29vZCcsICdhd2Vzb21lJywKICAnZXhjZWxsZW50JywgJ3NvdW5kcycsICdsZ3RtJywgJ2xvdmUnLCAnd2VsbCcsICd3b3JrJywgJ2pvYicsICd3b3cnLCAneWF5JywKICAvLyBDb252ZXJzYXRpb25hbCBmaWxsZXIgLyBoZXNpdGF0aW9uIC8gZ3JlZXRpbmdzCiAgJ2htbScsICdobScsICdodWgnLCAnYWgnLCAnb2gnLCAnaGEnLCAnaGFoYScsICdsb2wnLCAnd2FpdCcsICdob2xkJywgJ2hhbmcnLAogICdhY3R1YWxseScsICdhbnl3YXknLCAnd2hhdGV2ZXInLCAnbnZtJywgJ25ldmVybWluZCcsICdzb3JyeScsICdvb3BzJywKICAnaGknLCAnaGVsbG8nLCAnaGV5JywgJ3N0b3AnLCAncGF1c2UnLCAnbmV2ZXInLCAnbWluZCcsCiAgJ3RoaW5rJywgJ2tub3cnLCAnc2VlJywgJ2d1ZXNzJywgJ3N1cHBvc2UnLCAnbWF5YmUnLCAncHJvYmFibHknLAogIC8vIEZ1bmN0aW9uIHdvcmRzIHdpdGggbm8gc3ViamVjdCBvZiB0aGVpciBvd24KICAnZG8nLCAnaXQnLCAndGhhdCcsICd0aGlzJywgJ3RoZScsICdhJywgJ2FuJywgJ2FuZCcsICdpcycsICdhcmUnLCAnd2FzJywKICAneW91JywgJ3lvdXInLCAnaScsICd3ZScsICdsZXRzJywgJ2xldCcsICd1cycsICdtZScsICdteScsICdub3cnLCAndGhlbicsCiAgJ2RvbmUnLCAnZmluaXNoJywgJ2ZpbmlzaGVkJywgJ3JlYWR5JywgJ3RvbycsICdhbHNvJywgJ2p1c3QnLCAnc3RpbGwnLApdLmpvaW4oJ3wnKSArICcpXFxiJywgJ2dpJyk7Ci8qKgogKiBEb2VzIHRoaXMgcHJvbXB0IGNvbnNpc3Qgb2Ygbm90aGluZyBidXQgY29udGludWF0aW9uIGZpbGxlcj8KICoKICogQW4gRU1QVFkgcHJvbXB0IGFuc3dlcnMgdHJ1ZSDigJQgYSBwcm9tcHQgdGhlIGdhdGUgY2Fubm90IHNlZSBpcyBub3QgZXZpZGVuY2UKICogdGhhdCBhIHNlYXJjaCBpcyBuZWVkZWQsIGFuZCBhcm1pbmcgb24gaXQgd291bGQgYmxvY2sgZXZlcnkgcmVhZCBpbiBhCiAqIGNvbnN1bWVyIHdob3NlIGhvc3Qgb21pdHMgdGhlIGZpZWxkLCB3aXRoIG5vdGhpbmcgb24gc2NyZWVuIGV4cGxhaW5pbmcgd2h5LgogKiBGYWlsLW9wZW4gaGVyZTsgYHByb21wdC1zdGF0ZS1yZXNldGAgc2VwYXJhdGVseSByZWZ1c2VzIHRvIFdSSVRFIGEgdmVyZGljdCBpdAogKiBkZXJpdmVkIGZyb20gYW4gZW1wdHkgcHJvbXB0ICgjMTQ0NyksIHNvIGFuIHVucmVhZGFibGUgcHJvbXB0IG5vdyBsZWF2ZXMgdGhlCiAqIGdhdGUgZXhhY3RseSBhcyBwcm9tcHQtcmVtaW5kZXIgc2V0IGl0IHJhdGhlciB0aGFuIHNpbGVudGx5IGRpc2FybWluZyBpdC4KICovCmZ1bmN0aW9uIGlzQ29udGludWF0aW9uUHJvbXB0KHByb21wdFRleHQpIHsKICB2YXIgdCA9IChwcm9tcHRUZXh0IHx8ICcnKS50cmltKCk7CiAgaWYgKCF0KSByZXR1cm4gdHJ1ZTsKICAvLyBTdWJ0cmFjdCBjb250aW51YXRpb24gd29yZHMsIHRoZW4gZXZlcnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuIFdoYXQKICAvLyByZW1haW5zIGlzIHRoZSBwcm9tcHQncyBhY3R1YWwgc3ViamVjdCBtYXR0ZXI7IG5vdGhpbmcgcmVtYWluaW5nIG1lYW5zIHRoZQogIC8vIHByb21wdCBpbnRyb2R1Y2VkIG5vIG5ldyBzdWJqZWN0LgogIC8vIGBccHtMfVxwe059YCB3aXRoIC91LCBOT1QgYEEtWmEtejAtOWA6IGFuIEFTQ0lJLW9ubHkgY2xhc3Mgc3RyaXBzIGV2ZXJ5CiAgLy8gY2hhcmFjdGVyIG9mIGEgQ0pLLCBDeXJpbGxpYywgQXJhYmljLCBIZWJyZXcsIEdyZWVrIG9yIFRoYWkgcHJvbXB0IOKAlCBhbmQKICAvLyBtb3N0IG9mIGFuIGFjY2VudGVkIEZyZW5jaCBvciBTcGFuaXNoIG9uZSDigJQgbGVhdmluZyBub3RoaW5nLCBzbyBhCiAgLy8gc3Vic3RhbnRpdmUgbm9uLUVuZ2xpc2ggcmVxdWVzdCB3b3VsZCBzY29yZSBhcyBwdXJlIGZpbGxlciBhbmQgc2lsZW50bHkKICAvLyBkaXNhcm0gdGhlIGdhdGUuIFN0cmlwcGluZyBvbmx5IHdoYXQgaXMgbmVpdGhlciBsZXR0ZXIgbm9yIG51bWJlciBrZWVwcwogIC8vIGV2ZXJ5IHNjcmlwdCdzIGNvbnRlbnQgaW50YWN0IGFuZCByZW1vdmVzIGp1c3QgcHVuY3R1YXRpb24gYW5kIHNwYWNpbmcuCiAgdmFyIHJlc3QgPSB0LnJlcGxhY2UoQ09OVElOVUFUSU9OX1dPUkRfUkUsICcgJykucmVwbGFjZSgvW15ccHtMfVxwe059XSsvZ3UsICcgJykudHJpbSgpOwogIHJldHVybiByZXN0Lmxlbmd0aCA9PT0gMDsKfQoKLy8gTmFtZXNwYWNlIGNsYXNzaWZpY2F0aW9uICgjOTMxKS4gVGhlIGhpbnQgdXNlZCB0byBiZSBlbWl0dGVkIG9uIGV2ZXJ5IHByb21wdAovLyBieSBwcm9tcHQtaG9vay5tanMgd2hpY2ggY29zdCB+NDAgdG9rZW5zIMOXIGV2ZXJ5IHByb21wdCDDlyBldmVyeSBjb25zdW1lci4KLy8gTm93IHdlIGNsYXNzaWZ5IGhlcmUsIHN0b3JlIG9uIHdvcmtmbG93LXN0YXRlLCBhbmQgbGV0IGNoZWNrLWJlZm9yZS1hZ2VudAovLyBlbWl0IGl0IG9uY2Ugd2hlbiBDbGF1ZGUgaXMgYWN0dWFsbHkgYWJvdXQgdG8gc3Bhd24gYW4gYWdlbnQuCi8vCi8vIFNZTkM6IHRoZXNlIHJlZ2V4ZXMgKyBjbGFzc2lmeU5hbWVzcGFjZUhpbnQgKyBhcHBseVByb21wdFN0YXRlUmVzZXQgYXJlCi8vIGR1cGxpY2F0ZWQgdmVyYmF0aW0gaW4gc3JjL2NsaS9pbml0L2hlbHBlcnMtZ2VuZXJhdG9yLnRzICh0aGUgZW1iZWRkZWQKLy8gZ2F0ZS5janMgZmFsbGJhY2sgdXNlZCBieSBgZmxvIGluaXRgIHdoZW4gc291cmNlIGhlbHBlcnMgY2FuJ3QgYmUgbG9jYXRlZCkuCi8vIEFueSBlZGl0IHRvIGVpdGhlciBjb3B5IE1VU1QgYmUgYXBwbGllZCB0byBib3RoIOKAlCB0aGVyZSBpcyBubyBzaGFyZWQgbW9kdWxlCi8vIGJlY2F1c2UgaGVscGVycy1nZW5lcmF0b3IgZW1pdHMgYSBzZWxmLWNvbnRhaW5lZCBzdHJpbmcgdGVtcGxhdGUuCnZhciBOU19MRUFSTklOR1NfUkUgPSAvXGIocmVtZW1iZXJ8cmVjYWxsfGluc2lnaHR8bGVzc29uIGxlYXJuZWR8Z290Y2hhfHBvc3QuP21vcnRlbSlcYnx3ZSAoZGVjaWR8YWdyZWV8Y2hvc2V8c2FpZCkvOwp2YXIgTlNfVEVTVF9SRSA9IC9cYih0ZXN0fHNwZWN8Y292ZXJhZ2V8dGVzdGVkfHRlc3QgY2FzZXx0ZXN0IGNhc2VzfHRlc3RzIGZvcnxzcGVjIGZvcilcYi87CnZhciBOU19FWFBMSUNJVCA9IFsKICB7IHBhdHRlcm46IC9cYihwYXR0ZXJufGNvbnZlbnRpb258YmVzdCBwcmFjdGljZXxzdHlsZXxjb2RpbmcgcnVsZSlcYi8sIG5zOiAncGF0dGVybnMnLCBsYWJlbDogJ2NvZGUgcGF0dGVybnMgYW5kIGNvbnZlbnRpb25zJyB9LAogIHsgcGF0dGVybjogL1xiKGNvZGUuP21hcHxmaWxlIHN0cnVjdHVyZXxwcm9qZWN0IHN0cnVjdHVyZXxkaXJlY3RvcnkpXGIvLCBuczogJ2NvZGUtbWFwJywgbGFiZWw6ICdjb2RlYmFzZSBuYXZpZ2F0aW9uJyB9LApdOwp2YXIgTlNfUEFUVEVSTl9SRVMgPSBbL1xiKHRlbXBsYXRlfGV4YW1wbGV8c2ltaWxhciB0b3xob3cgZG8gd2V8aG93IHNob3VsZClcYi9dOwp2YXIgTlNfRE9NQUlOX1JFUyA9IFsKICAvXGIoZ3VpZGFuY2V8Z3VpZGV8ZG9jc3xkb2N1bWVudGF0aW9ufHJ1bGVzfGhvdy10bylcYi8sCiAgL1xiKGFyY2hpdGVjdHVyZXxkZXNpZ258ZG9tYWlufHRlbmFudHxtaWdyYXR8c2NoZW1hfGRlcGxveSkvLAogIC9cYihydWxlfHJlcXVpcmVtZW50fGNvbnN0cmFpbnR8Y29tcGxpYW5jZSlcYi8sCl07CnZhciBOU19OQVZfUkVTID0gWwogIC9cYihmaW5kfHdoZXJlfHdoaWNoIGZpbGV8bG9vayB1cHxsb2NhdGV8ZW5kcG9pbnR8cm91dGV8dXJsfHBhdGgpXGIvLAogIC9cYihjbGFzc3xmdW5jdGlvbnxtZXRob2R8Y29tcG9uZW50fHNlcnZpY2V8ZW50aXR5fG1vZHVsZSlcYi8sCl07CgovLyBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBwcm9tcHQgaW52b2tlZCAvZmwgb3IgL2ZsbyB3aXRoIGEgc3dhcm0vaGl2ZSBmbGFnICgjOTUyKS4KLy8gV2hlbiBzZXQsIGNoZWNrLWJlZm9yZS1hZ2VudCBCTE9DS1MgdGhlIEFnZW50IHNwYXduIHVudGlsIHRoZSBtYXRjaGluZyBNQ1AgaW5pdAovLyAobWNwX19tb2Zsb19fc3dhcm1faW5pdCBvciBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCkgaGFzIGJlZW4gcmVjb3JkZWQg4oCUIHRoZSB1c2VyCi8vIGV4cGxpY2l0bHkgb3B0ZWQgaW4gdG8gdGhlIHByb3RlY3RlZCBjb29yZGluYXRpb24gc3VyZmFjZSwgc28gZmFsbGluZyBiYWNrIHRvCi8vIHJhdyBBZ2VudCBkaXNwYXRjaCBzaWxlbnRseSByZWdyZXNzZXMgaGVhZGxpbmUgbW9mbG8gcHJvZHVjdCBjYXBhYmlsaXR5LgovLwovLyBUaGlzIGZpbGUgaXMgdGhlIHNpbmdsZSBzb3VyY2U7ICMxNDQzIHJlcGxhY2VkIGhlbHBlcnMtZ2VuZXJhdG9yLnRzJ3MKLy8gaGFuZC1tYWludGFpbmVkIGNvcHkgd2l0aCBhIGJ1aWxkLXRpbWUgZW1iZWQgb2YgdGhpcyBleGFjdCBmaWxlLCBzbyB0aGVyZSBpcwovLyBubyBsb25nZXIgYSBzZWNvbmQgY29weSBvZiB0aGlzIGZ1bmN0aW9uIHRvIGtlZXAgaW4gc3RlcC4KZnVuY3Rpb24gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG51bGw7CiAgaWYgKC8oPzpefFxzKSg/Oi1zfC0tc3dhcm0pXGIvLnRlc3QocCkpIHJldHVybiAnc3dhcm0nOwogIGlmICgvKD86XnxccykoPzotaHwtLWhpdmUpXGIvLnRlc3QocCkpIHJldHVybiAnaGl2ZSc7CiAgcmV0dXJuIG51bGw7Cn0KCi8vIFJlc29sdmUgdGhlIEZVTEwgc2V0IG9mIC9mbG8gcnVuIG1vZGlmaWVycyBmcm9tIHRoZSBwcm9tcHQgKyBtb2Zsby55YW1sIOKAlCB0aGUKLy8gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgYm90aCBnYXRlIGFybWluZyAoIzEyOTcpIGFuZCB0aGUgYXV0aG9yaXRhdGl2ZQovLyBhbm5vdW5jZW1lbnQgZW1pdHRlZCBieSBwcm9tcHQtcmVtaW5kZXIuIFR3byBjb25zdW1lcnMsIG9uZSByZXNvbHZlcjogYSBzZWNvbmQKLy8gaW1wbGVtZW50YXRpb24gaXMgZXhhY3RseSBob3cgYHNkZC5kZWZhdWx0OiB0cnVlYCBnb3Qgc2lsZW50bHkgaWdub3JlZCAodGhlCi8vIHNraWxsJ3MgcHJvbXB0IGNhcnJpZWQgYGxldCBzZGRNb2RlID0gZmFsc2VgIGFuZCB0aGUgbW9kZWwgZXhlY3V0ZWQgdGhlIGxpdGVyYWwpLgovLwovLyBQcmVjZWRlbmNlIHBlciBrZXk6IGV4cGxpY2l0IC0tbm8tWCA+IGV4cGxpY2l0IC14Ly0tWCA+IG1vZmxvLnlhbWwgPiBidWlsdC1pbi4KLy8gTk9URSB0aGUgZGlmZmVyaW5nIGJ1aWx0LWluIGRlZmF1bHRzOiBzZGQgaXMgb3B0LUlOIChmYWxzZSksIHZlcmlmeSBpcyBvcHQtT1VUCi8vICh0cnVlLCAjMTI5NCksIG1lcmdlIGlzIG9wdC1JTiAoZmFsc2UsICMxMjg1KS4KLy8KLy8gYC1zZGAgaXMgYSBkaXN0aW5jdCB0b2tlbiBmcm9tIGAtc2AgKHN3YXJtKTogdGhlIGBkYCBzaXRzIG9uIHRoZSB3b3JkIGJvdW5kYXJ5Ci8vIHNvIGAtc1xiYCBuZXZlciBtYXRjaGVzIGAtc2RgLgpmdW5jdGlvbiByZXNvbHZlRmxvUnVuKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgdmFyIG91dCA9IHsgaXNGbG86IGZhbHNlLCB3b3JrZmxvdzogJ2Z1bGwnLCBzZGQ6IGZhbHNlLCB2ZXJpZnk6IGZhbHNlLCBtZXJnZTogZmFsc2UsCiAgICAgICAgICAgICAgc2RkU3JjOiAnZGVmYXVsdCcsIHZlcmlmeVNyYzogJ2RlZmF1bHQnLCBtZXJnZVNyYzogJ2RlZmF1bHQnIH07CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG91dDsKICBvdXQuaXNGbG8gPSB0cnVlOwoKICAvLyBXb3JrZmxvdyBtb2RlIOKAlCBkZWNpZGVzIHdoaWNoIG1vZGlmaWVycyBhcmUgZXZlbiBhcHBsaWNhYmxlLgogIGlmICgvKD86XnxccykoPzotd2Z8LS13b3JrZmxvdylcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3NwZWxsLWVuZ2luZSc7CiAgZWxzZSBpZiAoLyg/Ol58XHMpKD86LXJ8LS1yZXNlYXJjaClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3Jlc2VhcmNoJzsKICBlbHNlIGlmICgvKD86XnxccykoPzotdHwtLXRpY2tldClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3RpY2tldCc7CiAgdmFyIGVwaWNCcmFuY2ggPSAvKD86XnxccyktLWVwaWMtYnJhbmNoXGIvLnRlc3QocCk7CgogIGlmICgvKD86XnxccyktLW5vLXNkZFxiLy50ZXN0KHApKSB7IG91dC5zZGQgPSBmYWxzZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKC8oPzpefFxzKSg/Oi1zZHwtLXNkZClcYi8udGVzdChwKSkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKHNkZENvbmYuZGVmYXVsdCkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdtb2Zsby55YW1sIHNkZC5kZWZhdWx0JzsgfQoKICBpZiAoLyg/Ol58XHMpLS1uby12ZXJpZnlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gZmFsc2U7IG91dC52ZXJpZnlTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotdnwtLXZlcmlmeSlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gdHJ1ZTsgb3V0LnZlcmlmeVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKCFjb25maWcudmVyaWZ5X2JlZm9yZV9kb25lKSB7IG91dC52ZXJpZnkgPSBmYWxzZTsgb3V0LnZlcmlmeVNyYyA9ICdtb2Zsby55YW1sIGdhdGVzLnZlcmlmeV9iZWZvcmVfZG9uZSc7IH0KICBlbHNlIHsgb3V0LnZlcmlmeSA9IHRydWU7IG91dC52ZXJpZnlTcmMgPSAnZGVmYXVsdCc7IH0KICAvLyAtLXNkZCBpbXBsaWVzIC0tdmVyaWZ5OiBhIHNwZWMvcGxhbiB3aXRob3V0IGFuIGVuZm9yY2VkIHZlcmlmeSBzdGVwIGRyaWZ0cy4KICBpZiAob3V0LnNkZCAmJiAhb3V0LnZlcmlmeSAmJiBvdXQudmVyaWZ5U3JjICE9PSAnZmxhZycpIG91dC52ZXJpZnkgPSB0cnVlOwoKICBpZiAoLyg/Ol58XHMpLS1uby1tZXJnZVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IGZhbHNlOyBvdXQubWVyZ2VTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotbXwtLW1lcmdlKVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKG1lcmdlQ29uZi5hdXRvKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdtb2Zsby55YW1sIG1lcmdlLmF1dG8nOyB9CgogIC8vIEFwcGxpY2FiaWxpdHk6IC10Ly1yIG5ldmVyIGltcGxlbWVudCwgc28gdmVyaWZ5IGlzIGEgbm8tb3AgdGhlcmU7IC1yIHByb2R1Y2VzCiAgLy8gbm8gYXJ0aWZhY3RzLCBzbyBzZGQgaXMgYSBuby1vcCB0b28gKGluIC10IHRoZSBzcGVjL3BsYW4gZ29lcyBJTlRPIHRoZSB0aWNrZXQsCiAgLy8gc28gc2RkIHN0YXlzIG9uKS4gT25seSBhIGZ1bGwgbm9uLWVwaWMtYnJhbmNoIHJ1biBvcGVucyBhIFBSIHRvIG1lcmdlLgogIC8vIFJlLWF0dHJpYnV0ZSBhbnl0aGluZyBhcHBsaWNhYmlsaXR5IHR1cm5lZCBvZmYsIHNvIGEgZmFsc2UgbmV2ZXIgY2FycmllcyB0aGUKICAvLyBzb3VyY2Ugb2YgdGhlIHZhbHVlIGl0IG5vIGxvbmdlciBoYXMuIFRoaXMgd2hvbGUgY2hhbmdlIGV4aXN0cyB0byBzdG9wIG1vZGVzCiAgLy8gYmVpbmcgcmVwb3J0ZWQgaW5hY2N1cmF0ZWx5IOKAlCB0aGUgYXR0cmlidXRpb24gaGFzIHRvIGJlIGhvbmVzdCB0b28uCiAgaWYgKG91dC53b3JrZmxvdyA9PT0gJ3RpY2tldCcgfHwgb3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnKSB7CiAgICBpZiAob3V0LnZlcmlmeSkgb3V0LnZlcmlmeVNyYyA9IG91dC53b3JrZmxvdyArICcgbW9kZSBkb2VzIG5vdCBpbXBsZW1lbnQnOwogICAgb3V0LnZlcmlmeSA9IGZhbHNlOwogIH0KICBpZiAob3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnIHx8IG91dC53b3JrZmxvdyA9PT0gJ3NwZWxsLWVuZ2luZScpIHsKICAgIGlmIChvdXQuc2RkKSBvdXQuc2RkU3JjID0gb3V0LndvcmtmbG93ICsgJyBtb2RlIHByb2R1Y2VzIG5vIHNwZWMgYXJ0aWZhY3RzJzsKICAgIG91dC5zZGQgPSBmYWxzZTsKICB9CiAgaWYgKG91dC53b3JrZmxvdyAhPT0gJ2Z1bGwnIHx8IGVwaWNCcmFuY2gpIHsKICAgIGlmIChvdXQubWVyZ2UpIG91dC5tZXJnZVNyYyA9IGVwaWNCcmFuY2ggPyAnLS1lcGljLWJyYW5jaCBvd25zIG1lcmdpbmcnIDogb3V0LndvcmtmbG93ICsgJyBtb2RlIG9wZW5zIG5vIFBSJzsKICAgIG91dC5tZXJnZSA9IGZhbHNlOwogIH0KICByZXR1cm4gb3V0Owp9CgovLyAjMTI5NyDigJQgYXJtIHRoZSBTREQgaW1wbGVtZW50IGdhdGUgZnJvbSB0aGUgdXNlciBwcm9tcHQuIFRoaW4gd3JhcHBlciBzbyB0aGUKLy8gYXJtaW5nIGRlY2lzaW9uIGFuZCB0aGUgYW5ub3VuY2VkIGRlY2lzaW9uIGNhbiBuZXZlciBkaXNhZ3JlZS4KZnVuY3Rpb24gZGV0ZWN0U2RkTW9kZShwcm9tcHRUZXh0KSB7CiAgcmV0dXJuIHJlc29sdmVGbG9SdW4ocHJvbXB0VGV4dCkuc2RkOwp9CgovLyBSZXNvbHZlIHRoZSBhYnNvbHV0ZSBzcGVjcyByb290IHRoZSBzYW1lIHdheSBUUyBzcGVjc1Jvb3QgZG9lcyAoIzEyOTQpOiBzcGxpdAovLyB0aGUgLy13cml0dGVuIGNvbmZpZyB2YWx1ZSBvbiBlaXRoZXIgc2VwYXJhdG9yLCByZWplY3QgYWJzb2x1dGUvYC4uYC1lc2NhcGluZwovLyB2YWx1ZXMsIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGdpdGlnbm9yZWQgZGVmYXVsdC4gUnVsZSAjMTogbm8gc2VwYXJhdG9yIGhhcmRjb2RlZC4KZnVuY3Rpb24gc2RkU3BlY3NSb290QWJzKCkgewogIHZhciBjb25maWd1cmVkID0gKHNkZENvbmYuc3BlY3NEaXIgfHwgJy5tb2Zsby9zcGVjcycpOwogIHZhciBzZWdtZW50cyA9IGNvbmZpZ3VyZWQuc3BsaXQoL1tcXC9dKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgZXNjYXBlcyA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gMAogICAgfHwgc2VnbWVudHMuaW5kZXhPZignLi4nKSA+PSAwCiAgICB8fCAvXihbYS16QS1aXTp8fikkLy50ZXN0KHNlZ21lbnRzWzBdKQogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICcvJwogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICdcXCc7CiAgaWYgKGVzY2FwZXMpIHJldHVybiBwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcubW9mbG8nLCAnc3BlY3MnKTsKICByZXR1cm4gcGF0aC5qb2luLmFwcGx5KHBhdGgsIFtQUk9KRUNUX0RJUl0uY29uY2F0KHNlZ21lbnRzKSk7Cn0KCi8vIElzIHRoZSBlZGl0ZWQgcGF0aCBpbnNpZGUgdGhlIHNwZWNzIGRpcj8gRWRpdGluZyBzcGVjLm1kL3BsYW4ubWQgdGhlbXNlbHZlcyBtdXN0Ci8vIG5ldmVyIHRyaXAgdGhlIGltcGxlbWVudCBnYXRlLiBDb21wYXJlcyByZXNvbHZlZCBhYnNvbHV0ZSBwYXRocyAoUnVsZSAjMTogdGhlCi8vIGVkaXQgcGF0aCBtYXkgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGU7IG5vcm1hbGl6ZSBib3RoIGJlZm9yZSB0aGUgcHJlZml4IHRlc3QpLgpmdW5jdGlvbiBpc0luc2lkZVNwZWNzRGlyKGZpbGVQYXRoKSB7CiAgdHJ5IHsKICAgIHZhciByb290ID0gc2RkU3BlY3NSb290QWJzKCk7CiAgICB2YXIgYWJzID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCBmaWxlUGF0aCk7CiAgICB2YXIgcmVsID0gcGF0aC5yZWxhdGl2ZShyb290LCBhYnMpOwogICAgcmV0dXJuIHJlbCA9PT0gJycgfHwgKCFyZWwuc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbCkpOwogIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9Cn0KCi8vIFJlYWQgcGxhbi5tZCBmcm9udG1hdHRlciBmb3IgdGhlIGFjdGl2ZSBzbHVnIGFuZCByZXBvcnQgd2hldGhlciBpdCBpcyByZXZpZXdlZC4KLy8gUHVyZSBmcyArIHJlZ2V4IChubyBzcGF3bikgc28gaXQgc3RheXMgY2hlYXAgb24gZXZlcnkgV3JpdGUvRWRpdC4gTWF0Y2hlcyB0aGUKLy8gZG91YmxlLXF1b3RlZCBzY2FsYXIgc2VyaWFsaXplQXJ0aWZhY3QgZW1pdHMgKGBzdGF0dXM6ICJyZXZpZXdlZCJgKS4KZnVuY3Rpb24gaXNQbGFuUmV2aWV3ZWQoc2x1ZykgewogIHRyeSB7CiAgICB2YXIgcGxhblBhdGggPSBwYXRoLmpvaW4oc2RkU3BlY3NSb290QWJzKCksIHNsdWcsICdwbGFuLm1kJyk7CiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGxhblBhdGgpKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwbGFuUGF0aCwgJ3V0Zi04JykucmVwbGFjZSgvXHJcbi9nLCAnXG4nKTsKICAgIHZhciBmbSA9IGNvbnRlbnQubWF0Y2goL14tLS1cbihbXHNcU10qPylcbi0tLS8pOwogICAgaWYgKCFmbSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9eXHMqc3RhdHVzOlxzKlsiJ10/cmV2aWV3ZWRbIiddP1xzKiQvaW0udGVzdChmbVsxXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KfQoKZnVuY3Rpb24gY2xhc3NpZnlOYW1lc3BhY2VIaW50KHByb21wdFRleHQpIHsKICB2YXIgbG93ZXIgPSAocHJvbXB0VGV4dCB8fCAnJykudG9Mb3dlckNhc2UoKTsKICBpZiAoTlNfVEVTVF9SRS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAidGVzdHMiIGZvciB0ZXN0IGludmVudG9yeSBhbmQgY292ZXJhZ2UgbG9va3Vwcy4nOwogIGlmIChOU19MRUFSTklOR1NfUkUudGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgImxlYXJuaW5ncyIgZm9yIHVzZXItZGlyZWN0ZWQgZGVjaXNpb25zIGFuZCBkaXN0aWxsZWQgaW5zaWdodHMuJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IE5TX0VYUExJQ0lULmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoTlNfRVhQTElDSVRbaV0ucGF0dGVybi50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiJyArIE5TX0VYUExJQ0lUW2ldLm5zICsgJyIgZm9yICcgKyBOU19FWFBMSUNJVFtpXS5sYWJlbCArICcuJzsKICB9CiAgZm9yICh2YXIgaiA9IDA7IGogPCBOU19ET01BSU5fUkVTLmxlbmd0aDsgaisrKSB7CiAgICBpZiAoTlNfRE9NQUlOX1JFU1tqXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHNlYXJjaCAiZ3VpZGFuY2UiIGFuZCAibGVhcm5pbmdzIiBmb3IgZG9tYWluIHJ1bGVzIGFuZCBwcm9qZWN0IGRlY2lzaW9ucy4nOwogIH0KICBmb3IgKHZhciBrID0gMDsgayA8IE5TX1BBVFRFUk5fUkVTLmxlbmd0aDsgaysrKSB7CiAgICBpZiAoTlNfUEFUVEVSTl9SRVNba10udGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgInBhdHRlcm5zIiBmb3IgY29kZSBwYXR0ZXJucyBhbmQgY29udmVudGlvbnMuJzsKICB9CiAgZm9yICh2YXIgbSA9IDA7IG0gPCBOU19OQVZfUkVTLmxlbmd0aDsgbSsrKSB7CiAgICBpZiAoTlNfTkFWX1JFU1ttXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiY29kZS1tYXAiIGZvciBjb2RlYmFzZSBuYXZpZ2F0aW9uLic7CiAgfQogIHJldHVybiAnJzsKfQoKLy8gIzExMzIg4oCUIGNvbW1hbmQtc2hhcGUgbmFtZXNwYWNlIGNsYXNzaWZpZXIgZm9yIHRoZSBiYXNoLUJMT0NLIG1lc3NhZ2UuCi8vIFVzZWQgd2hlbiB0aGUgcHJvbXB0LWRlcml2ZWQgYGxhc3ROYW1lc3BhY2VIaW50YCBpcyBlbXB0eSAoZS5nLiBzdWJhZ2VudHMsCi8vIHdoaWNoIG5ldmVyIHNlZSB0aGUgdXNlciBwcm9tcHQpIHNvIHRoZSBibG9jayBtZXNzYWdlIHN0aWxsIHJvdXRlcyB0byBhCi8vIHVzZWZ1bCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgInBpY2sgb25lIG9mIGZpdmUiIGxpc3QuIFJldHVybnMgYQovLyBmdWxsIHNlbnRlbmNlIGluIHRoZSBzYW1lIHNoYXBlIGFzIGNsYXNzaWZ5TmFtZXNwYWNlSGludCBzbyB0aGUgQkxPQ0sgYXJtCi8vIGNhbiB3cml0ZSBlaXRoZXIgc291cmNlJ3MgaGludCB3aXRob3V0IGJyYW5jaGluZyBvbiBmb3JtYXQuCi8vCi8vIFRoaXMgZmlsZSBpcyB0aGUgc2luZ2xlIHNvdXJjZSDigJQgc2VlIHRoZSBub3RlIG9uIGRldGVjdEZsTW9kZSBhYm92ZSAoIzE0NDMpLgpmdW5jdGlvbiBjbGFzc2lmeUJhc2hOYW1lc3BhY2VIaW50KGNtZCkgewogIC8vIFNlYXJjaC1saWtlIHRvb2xzIOKAlCB0aGUgdXNlciBpcyBodW50aW5nIGZvciBhIHN5bWJvbC9maWxlLCBjb2RlLW1hcCB3aW5zLgogIC8vICMxNDQ1IOKAlCBgZ2l0IGdyZXBgIC8gYGdpdCBscy1maWxlc2AgYXJlIHRoZSBzYW1lIGh1bnQgdGhyb3VnaCBhIGRpZmZlcmVudAogIC8vIGJpbmFyeSwgc28gdGhleSByb3V0ZSB0byB0aGUgc2FtZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvCiAgLy8gdGhlIGhpbnRsZXNzIGdlbmVyaWMgbWVzc2FnZS4KICBpZiAoL15ccyooPzpncmVwfHJnfGFnfGZncmVwfGVncmVwfGZpbmR8ZmR8U2VsZWN0LVN0cmluZ3xzbHMpXGIvaS50ZXN0KGNtZCkKICAgfHwgL15ccypnaXRccysoPzpncmVwfGxzLWZpbGVzKVxiL2kudGVzdChjbWQpKSB7CiAgICByZXR1cm4gJ01lbW9yeSBuYW1lc3BhY2UgaGludDogdXNlICJjb2RlLW1hcCIgZm9yIGNvZGViYXNlIG5hdmlnYXRpb24uJzsKICB9CiAgLy8gUmVhZGluZyBhIC5tZCAvIFJTVCAvIFRYVCwgb3IgYSB3ZWxsLWtub3duIGRvYyBmaWxlIOKAlCBndWlkYW5jZS9sZWFybmluZ3Mgd2luLgogIC8vIGAuKmAgKG5vdCBgXFMqYCkgc28gZmxhZy1wcmVmaXhlZCBmb3JtcyBsaWtlIGBoZWFkIC01MCBSRUFETUUubWRgIG1hdGNoLgogIC8vIEFuY2hvcmVkIG9uIHRoZSBsZWFkaW5nIHJlYWRlciBzbyBhIHBpcGVkIGBjbWQgfCBncmVwIGZvby5tZGAgZG9lc24ndCB0cmlwLgogIGlmICgvXlxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx0eXBlfEdldC1Db250ZW50fGdjKVxiLipcLig/Om1kfG1keHxyc3R8dHh0KVxiL2kudGVzdChjbWQpCiAgIHx8IC9eXHMqKD86Y2F0fGhlYWR8dGFpbHxsZXNzfG1vcmV8YmF0fHR5cGV8R2V0LUNvbnRlbnR8Z2MpXGIuKlxiKD86UkVBRE1FfENMQVVERXxDSEFOR0VMT0d8Q09OVFJJQlVUSU5HfExJQ0VOU0UpXGIvaS50ZXN0KGNtZCkpIHsKICAgIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiBzZWFyY2ggImd1aWRhbmNlIiBhbmQgImxlYXJuaW5ncyIgZm9yIHByb2plY3QgcnVsZXMgYW5kIGRlY2lzaW9ucy4nOwogIH0KICByZXR1cm4gJyc7Cn0KCi8vIEFwcGx5IHBlci1wcm9tcHQgc3RhdGUgcmVzZXQgc2hhcmVkIGJ5IGBwcm9tcHQtcmVtaW5kZXJgIChmdWxsKSBhbmQKLy8gYHByb21wdC1zdGF0ZS1yZXNldGAgKGRlZmVuc2l2ZSBzYWZldHktbmV0LCBubyBlbWlzc2lvbikuIElkZW1wb3RlbnQg4oCUIGJvdGgKLy8gVXNlclByb21wdFN1Ym1pdCBob29rcyBjYW4gcnVuIGl0IHdpdGhvdXQgY29tcG91bmRpbmcgYW55IGZpZWxkLiBDYWxsZXIKLy8gb3ducyBpbnRlcmFjdGlvbkNvdW50IGFuZCB0aGUgdXNlci12aXNpYmxlIFJFTUlOREVSL0NvbnRleHQgZW1pc3Npb25zLCBzbwovLyB0aGlzIGhlbHBlciBzdGF5cyBzaWxlbnQuCmZ1bmN0aW9uIGFwcGx5UHJvbXB0U3RhdGVSZXNldChzdGF0ZSwgcHJvbXB0VGV4dCwgb3B0cykgewogIC8vICMzNTIvIzEzMzEg4oCUIHRoaXMgaXMgdGhlIE9OTFkgcGxhY2UgdGhlIG1lbW9yeSBnYXRlIHJlc2V0cy4gRGVsaWJlcmF0ZWx5CiAgLy8gTk9UIG9uIHRhc2sgdHJhbnNpdGlvbnM6IHdpdGhpbiBhIHNpbmdsZSBwcm9tcHQgKGUuZy4gYSAvZmxvIHdvcmtmbG93KQogIC8vIG1lbW9yeSBzdGF5cyBzZWFyY2hlZCBzbyBSZWFkL0dyZXAgYXJlbid0IGJsb2NrZWQgbWlkLWV4ZWN1dGlvbi4gQQogIC8vIGBUYXNrVXBkYXRlYC1kcml2ZW4gcmVzZXQgd291bGQgcmUtYmxvY2sgdGhlIGFnZW50IGhhbGZ3YXkgdGhyb3VnaCBpdHMgb3duCiAgLy8gd29ya2Zsb3cuIFRoZSByYXRpb25hbGUgdXNlZCB0byBsaXZlIG9uIHRoZSBgY2hlY2stdGFzay10cmFuc2l0aW9uYCBjYXNlLAogIC8vIHdoaWNoIGlzIHdoeSB0aGF0IGNhc2UgaXMgYW4gZW1wdHkgbm8tb3A7ICMxMzMxIHVud2lyZWQgdGhlIGhvb2sgYW5kIG1vdmVkCiAgLy8gdGhlIHJlYXNvbmluZyBoZXJlLCB3aGVyZSB0aGUgcmVzZXQgaXQgZGVzY3JpYmVzIGFjdHVhbGx5IGhhcHBlbnMuCiAgc3RhdGUubWVtb3J5U2VhcmNoZWQgPSBmYWxzZTsKICAvLyBXaXBlIHBlci1hY3RvciBtZW1vcnkgdHJhY2tpbmcgdG9vIOKAlCBhIG5ldyB1c2VyIHByb21wdCBpcyBhIGZyZXNoIHdpbmRvdwogIC8vIGZvciBib3RoIHBhcmVudCBBTkQgYW55IHN1YmFnZW50cyB0aGUgcGFyZW50IG1heSBzcGF3biBkdXJpbmcgdGhpcyB0dXJuLgogIHN0YXRlLm1lbW9yeVNlYXJjaGVkQnkgPSB7fTsKICAvLyBsZWFybmluZ3NTdG9yZWQgaXMgc2Vzc2lvbi1zY29wZWQg4oCUIG9uY2Ugc3RvcmVkLCBpdCBzdGF5cyB0cnVlIHVudGlsIHNlc3Npb24gcmVzZXQuCiAgLy8gUmVzZXR0aW5nIHBlci1wcm9tcHQgY2F1c2VkIGZhbHNlIGJsb2NrcyB3aGVuIFBSIGNyZWF0aW9uIHdhcyBvbiBhIGxhdGVyIHByb21wdC4KICAvLyAjMTQ0NyDigJQgYXJtIGJ5IERFRkFVTFQ7IGV4ZW1wdCBvbmx5IHByb21wdHMgdGhhdCBjYXJyeSBubyBzdWJqZWN0IG9mIHRoZWlyCiAgLy8gb3duLiBUaGlzIHJlcGxhY2VzIGBUQVNLX1JFLnRlc3QocCkgfHwgcC5sZW5ndGggPiAyMGAsIHdob3NlIGxlbmd0aCBjbGlmZgogIC8vIHdhcyBhcmJpdHJhcnkgYW5kIGludmlzaWJsZTogIm5vdyBsb29rIGF0IHRoZSBkYWVtb24iICgyMikgYXJtZWQgdGhlIGdhdGUKICAvLyBhbmQgImNoZWNrIHRoZSBkYWVtb24iICgxNikgZGlkIG5vdCwgd2hpY2ggaXMgbW9zdCBvZiB3aHkgdGhlIGdhdGUgZmVsdAogIC8vIGxpa2UgaXQgZmlyZWQgYXQgcmFuZG9tLiBNZW1vcnktZmlyc3QgaXMgdGhpcyBwcm9qZWN0J3MgZmlyc3QgcnVsZSwgc28gdGhlCiAgLy8gZGVmYXVsdCBoYXMgdG8gYmUgInNlYXJjaCIsIHdpdGggY29udGludWF0aW9ucyBhcyB0aGUgY2FydmUtb3V0IOKAlCBub3QgdGhlCiAgLy8gcmV2ZXJzZS4gVGhlIHBlci1wcm9tcHQgbGF0Y2ggYm91bmRzIHRoZSBjb3N0IGF0IG9uZSBzZWFyY2ggcGVyIG5ldyBwcm9tcHQuCiAgLy8KICAvLyBgb3B0cy5za2lwQXJtaW5nYCBzcGxpdHMgdGhlIHJlc2V0IGluIHR3by4gSW52YWxpZGF0aW5nIHRoZSBjcmVkaXRzIGFib3ZlCiAgLy8gaXMgcHJvbXB0LUlOREVQRU5ERU5UIGFuZCBhbHdheXMgY29ycmVjdDsgZGVjaWRpbmcgd2hldGhlciB0aGlzIHByb21wdAogIC8vIG5lZWRzIGEgc2VhcmNoIGlzIG5vdCwgYW5kIGEgY2FsbGVyIGhvbGRpbmcgbm8gcHJvbXB0IHRleHQgbXVzdCBub3QgZGVjaWRlCiAgLy8gaXQgZnJvbSBub3RoaW5nLiBTa2lwcGluZyB0aGUgd2hvbGUgcmVzZXQgaW5zdGVhZCB3b3VsZCBiZSB3b3JzZSB0aGFuCiAgLy8gZWl0aGVyOiBgbWVtb3J5U2VhcmNoZWRCeWAgd291bGQgc3Vydml2ZSwgYW5kIGEgc3RhbGUgcGVyLWFjdG9yIGNyZWRpdCBmcm9tCiAgLy8gdGhlIHByZXZpb3VzIHByb21wdCB3b3VsZCBzYXRpc2Z5IHRoZSBnYXRlIGZvciBhIHByb21wdCBpdCBuZXZlciBzYXcuCiAgaWYgKCEob3B0cyAmJiBvcHRzLnNraXBBcm1pbmcpKSB7CiAgICB2YXIgZXNjYXBlZCA9IC9eQEBccyovLnRlc3QocHJvbXB0VGV4dCB8fCAnJyk7CiAgICBzdGF0ZS5tZW1vcnlSZXF1aXJlZCA9ICFlc2NhcGVkICYmICFpc0NvbnRpbnVhdGlvblByb21wdChwcm9tcHRUZXh0KTsKICB9CiAgLy8gU3Rhc2ggbmFtZXNwYWNlIGhpbnQgZm9yIGNoZWNrLWJlZm9yZS1hZ2VudCB0byBlbWl0IHdoZW4gQ2xhdWRlIGFjdHVhbGx5CiAgLy8gc3Bhd25zIGFuIEFnZW50ICgjOTMxKS4gRW1wdHkgc3RyaW5nIHdoZW4gbm90aGluZyBtYXRjaGVkIOKAlCBvdmVyd3JpdGluZwogIC8vIGFueSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBwcm9tcHQuCiAgc3RhdGUubGFzdE5hbWVzcGFjZUhpbnQgPSBjbGFzc2lmeU5hbWVzcGFjZUhpbnQocHJvbXB0VGV4dCk7CiAgLy8gUGVyLWFjdG9yIGVtaXNzaW9uIHRyYWNraW5nIOKAlCBlYWNoIHN1YmFnZW50J3Mgc2Vzc2lvbiBnZXRzIHRoZSBoaW50IGF0CiAgLy8gbW9zdCBvbmNlIHBlciBwcm9tcHQsIGJ1dCBhIGZyZXNoIHByb21wdCByZXNldHMgZXZlcnkgYWN0b3IncyB3aW5kb3cgc28KICAvLyBzdWJzZXF1ZW50IGFnZW50cyAocGFyZW50ICsgc3ViYWdlbnRzIHRoYXQgc3Bhd24gdGhlaXIgb3duIGFnZW50cykgYWxsCiAgLy8gc2VlIHRoZSBuZXcgY2xhc3NpZmljYXRpb24gb24gdGhlaXIgZmlyc3QgY2hlY2stYmVmb3JlLWFnZW50LgogIHN0YXRlLmxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5ID0ge307CiAgLy8gIzk1MiDigJQgZGVyaXZlIGZsTW9kZSBmcm9tIHRoZSB1c2VyIHByb21wdCwgYW5kIHJlc2V0IHRoZSBtYXRjaGluZyBpbml0CiAgLy8gZmxhZy4gRWFjaCAvZmwgaW52b2NhdGlvbiBtdXN0IGNhbGwgaXRzIHByb3RlY3RlZCBNQ1AgaW5pdDsgdGhlIHByZXZpb3VzCiAgLy8gcHJvbXB0J3Mgc3dhcm0vaGl2ZSByZWdpc3RyYXRpb24gZG9lcyBub3Qgc2F0aXNmeSB0aGlzIHByb21wdCdzIGdhdGUuCiAgc3RhdGUuZmxNb2RlID0gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpOwogIHN0YXRlLnN3YXJtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICBzdGF0ZS5oaXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAvLyAjMTI5NyDigJQgYXJtL2Rpc2FybSB0aGUgU0REIGltcGxlbWVudCBnYXRlIHBlciBwcm9tcHQuIEEgZnJlc2ggL2ZsbyBydW4gc3RhcnRzCiAgLy8gd2l0aCBubyBhY3RpdmUgc2x1ZzsgYGZsbyBzZGQgc3BlY2Agc3RhbXBzIGFjdGl2ZVNkZFNsdWcgZHVyaW5nIHRoZSBydW4uCiAgc3RhdGUuc2RkTW9kZSA9IGRldGVjdFNkZE1vZGUocHJvbXB0VGV4dCk7CiAgc3RhdGUuYWN0aXZlU2RkU2x1ZyA9IG51bGw7Cn0KLy8gTWF0Y2ggbnBtL3lhcm4vcG5wbS9idW4gdGVzdCwgbnB4IHZpdGVzdHxqZXN0fC4uLiwgYmFyZSBydW5uZXJzIGF0IGNvbW1hbmQtc3RhcnQgb25seSwKLy8gYW5kIGxhbmd1YWdlLW5hdGl2ZSB0ZXN0IGNvbW1hbmRzLiBUaGUgYmFyZS1ydW5uZXIgYXJtIGlzIGFuY2hvcmVkIHNvIHRoYXQKLy8gYG5wbSBpbnN0YWxsIGplc3RgLCBgZ3JlcCAtciB2aXRlc3Qgc3JjL2AsIGFuZCBzaW1pbGFyIGRvbid0IGZhbHNlLXBvc2l0aXZlLgp2YXIgVEVTVF9SVU5ORVJfUkUgPSAvKD86XnxbXmEtel0pKD86bnBtfHlhcm58cG5wbXxidW4pXHMrKD86cnVuXHMrKT8oPzp0ZXN0fHQpKD86Wzpcc118JCl8XGIoPzpucHh8cG5weClccysoPzp2aXRlc3R8amVzdHxtb2NoYXxhdmF8dGFwfGphc21pbmV8cHl0ZXN0KVxifCg/Ol58O3wmJnxcfFx8KVxzKig/OnZpdGVzdHxqZXN0fHB5dGVzdHxtb2NoYXxqYXNtaW5lfHRhcHxhdmEpXHN8XGIoPzpjYXJnb3xnb3xkZW5vfGRvdG5ldHxtdm4pXHMrdGVzdFxifFxiZ3JhZGxlXHcqXHMrdGVzdFxiL2k7Ci8vICMxMzIyIOKAlCBmYWlsdXJlIG1hcmtlcnMgaW4gYSB0ZXN0IHJ1bm5lcidzIG93biBPVVRQVVQuCi8vCi8vIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhbiBleGl0LWNvZGUgY2hlY2s6IENsYXVkZSBDb2RlJ3MgUG9zdFRvb2xVc2UgcGF5bG9hZAovLyBjYXJyaWVzIG5vIGV4aXQgc3RhdHVzLCBhbmQgUG9zdFRvb2xVc2UgZG9lcyBub3QgZmlyZSBhdCBhbGwgd2hlbiBhIGNvbW1hbmQKLy8gZXhpdHMgbm9uLXplcm8g4oCUIHNvIGFuIHVubWFza2VkIHJlZCBzdWl0ZSBhbHJlYWR5IGxlYXZlcyB0ZXN0c1J1biBmYWxzZSwgYnkKLy8gYWNjaWRlbnQgb2YgdGhlIGhvb2sgbGlmZWN5Y2xlIHJhdGhlciB0aGFuIGJ5IGRlc2lnbi4gV2hhdCBET0VTIGRlZmVhdCB0aGUKLy8gZ2F0ZSBpcyBhIG1hc2tlZCBleGl0IChgbnBtIHRlc3QgfCB0YWlsIC0yMGAsIGBucG0gdGVzdCB8fCB0cnVlYCwKLy8gYG5wbSB0ZXN0IDI+JjEgfCBncmVwIC1pIGZhaWxgKTogdGhlIHBpcGVsaW5lIGV4aXRzIDAsIFBvc3RUb29sVXNlIGZpcmVzIHdpdGgKLy8gYSBjbGVhbi1sb29raW5nIHJlc3BvbnNlLCBhbmQgYSByZWQgc3VpdGUgY3JlZGl0cyB0aGUgZ2F0ZS4gT3V0cHV0IGlzIHRoZSBvbmx5Ci8vIHNpZ25hbCBsZWZ0LCBhbmQgaXQgaXMgZ2VudWluZWx5IHdlYWtlciB0aGFuIGEgc3RhdHVzIOKAlCBzZWUgdGhlIHRpY2tldC4KLy8KLy8gRXZlcnkgYXJtIG1hdGNoZXMgYSBTVU1NQVJZIHNoYXBlIGEgcnVubmVyIGVtaXRzLCBuZXZlciBhIGJhcmUgImZhaWwiLCB3aGljaAovLyBvY2N1cnMgY29uc3RhbnRseSBpbiBvcmRpbmFyeSBwYXNzaW5nIHRlc3QgbmFtZXMgKCJyZXR1cm5zIG51bGwgd2hlbiB0aGUKLy8gbG9va3VwIGZhaWxlZCIpLiBUaGUgY291bnQgYXJtIGV4Y2x1ZGVzIGFuIGV4cGxpY2l0IHplcm8gc28gamVzdCdzCi8vIGAwIGZhaWxlZCwgMTIgcGFzc2VkYCBjYW5ub3Qgc2VsZi1ibG9jay4KLy8KLy8gVGhlIGNvdW50IGFybSdzIHRyYWlsaW5nIGxvb2thaGVhZCBpcyB3aGF0IGtlZXBzIGEgR1JFRU4gcnVuIGZyb20gYmxvY2tpbmcKLy8gaXRzZWxmLiBNb2NoYSdzIGRlZmF1bHQgc3BlYyByZXBvcnRlciBwcmludHMgZXZlcnkgcGFzc2luZyB0ZXN0IG5hbWUsIHNvCi8vIGBucG0gdGVzdCB8IHRhaWwgLTIwYCBvbiBhIGdyZWVuIHN1aXRlIGxlZ2l0aW1hdGVseSBjb250YWlucyBsaW5lcyBsaWtlCi8vIGDinJMgaGFuZGxlcyAyIGZhaWxlZCByZXRyaWVzYC4gQSByZWFsIHN1bW1hcnkgaXMgZm9sbG93ZWQgYnkgYSBkZWxpbWl0ZXIgb3IgYQovLyBsaW5lIGVuZCAoYDMgZmFpbGVkIHwgNDAgcGFzc2VkYCwgYDEgZmFpbGVkLCAyIHBhc3NlZGAsIGAxIGZhaWxpbmdgKSwgbmV2ZXIgYnkKLy8gbW9yZSBwcm9zZSDigJQgc28gYSBsb3dlcmNhc2Ugd29yZCBhZnRlciB0aGUgY291bnQgbWVhbnMgaXQgaXMgYSBzZW50ZW5jZSwgbm90IGEKLy8gdGFsbHkuIGB0ZXN0c2AvYHRlc3RgIGlzIGV4ZW1wdGVkIGJlY2F1c2UgYDIgZmFpbGVkIHRlc3RzYCBpcyBhIHJlYWwgc3VtbWFyeS4KLy8gU2FtZS1saW5lIHdoaXRlc3BhY2Ugb25seTogYXQgYSBsaW5lIGVuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3F1YWxpZnkuCnZhciBURVNUX0ZBSUxVUkVfUkUgPSBuZXcgUmVnRXhwKFsKICAnXFxiKD8hMFxcYilcXGQrXFxzKyg/OnRlc3RzP1xccyspPyg/OmZhaWxlZHxmYWlsaW5nfGZhaWx1cmVzPylcXGIoPyFbXlxcU1xcbl0rKD8hdGVzdHM/XFxiKVthLXpdKScsIC8vIHZpdGVzdC9qZXN0L3B5dGVzdC9tb2NoYSBjb3VudHMKICAnXlxccyooPzpGQUlMfEZBSUxFRClcXGInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpdGVzdCArIGplc3QgcGVyLWZpbGUsIHB5dGVzdCBGQUlMRUQKICAnXlxccyotLS1cXHMqRkFJTDonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRlc3QKICAnXFxidGVzdCByZXN1bHQ6XFxzKkZBSUxFRFxcYicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcmdvCiAgJ15ucG0gRVJSIScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBucG0gd3JhcHBlciBhcm91bmQgYW55IG9mIHRoZSBhYm92ZQpdLmpvaW4oJ3wnKSwgJ2ltJyk7CgovKioKICogIzEzMjIg4oCUIHdoeSBhIGp1c3QtZmlyZWQgcmVjb3JkLXRlc3QtcnVuIG11c3QgTk9UIGJlIGNyZWRpdGVkLCBvciBudWxsLgogKgogKiBBYnNlbnQgb3V0cHV0IGlzIG5vdCBldmlkZW5jZSBvZiBmYWlsdXJlOiBhIHF1aWV0IGdyZWVuIGBucG0gdGVzdCA+IC9kZXYvbnVsbGAKICogYW5kIGEgc2lsZW50bHktbWFza2VkIHJlZCBvbmUgYXJlIGluZGlzdGluZ3Vpc2hhYmxlLCBhbmQgdHJlYXRpbmcgdGhlIHBhaXIgYXMKICogZmFpbHVyZXMgd291bGQgYmxvY2sgZXZlcnkgY29uc3VtZXIgd2hvIHJlZGlyZWN0cyB0ZXN0IG91dHB1dC4gQWJzZW50IG1lYW5zCiAqIHVua25vd24sIGFuZCB1bmtub3duIGtlZXBzIHRoZSBwcmUtIzEzMjIgYmVoYXZpb3VyLgogKi8KZnVuY3Rpb24gZGV0ZWN0VGVzdEZhaWx1cmUoKSB7CiAgaWYgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0VfaW50ZXJydXB0ZWQgPT09ICd0cnVlJykgcmV0dXJuICd0aGUgcnVuIHdhcyBpbnRlcnJ1cHRlZCc7CiAgdmFyIG91dCA9IChwcm9jZXNzLmVudi5UT09MX1JFU1BPTlNFX3N0ZG91dCB8fCAnJykgKyAnXG4nICsgKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0Vfc3RkZXJyIHx8ICcnKTsKICBpZiAoIW91dC50cmltKCkpIHJldHVybiBudWxsOwogIHZhciBoaXQgPSBvdXQubWF0Y2goVEVTVF9GQUlMVVJFX1JFKTsKICByZXR1cm4gaGl0ID8gJ291dHB1dCByZXBvcnRzICInICsgaGl0WzBdLnRyaW0oKS5zbGljZSgwLCA0MCkgKyAnIicgOiBudWxsOwp9Ci8vIEVkaXRzIHRvIHRoZXNlIGRvbid0IGNoYW5nZSBydW50aW1lIGJlaGF2aW91ciwgc28gdGhleSBkb24ndCBpbnZhbGlkYXRlIHByaW9yIHRlc3Qvc2ltcGxpZnkgcnVucy4KLy8gTG9jayBmaWxlcyBhbmQgLmdpdGlnbm9yZSBhcmUgdHJhY2tlZCBidXQgaW5lcnQ7IHBhY2thZ2UuanNvbi8qLnlhbWwgQVJFIHNvdXJjZSDigJQgdGhleSByZXNldC4KdmFyIEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xsb2NrfGdpdGlnbm9yZSkkfCg/Ol58W1xcXC9dKShDSEFOR0VMT0coPzpcLm1kKT98XC5lbnZcLmV4YW1wbGV8cGFja2FnZS1sb2NrXC5qc29ufHBucG0tbG9ja1wueWFtbHx5YXJuXC5sb2NrfGJ1blwubG9ja2IpJC9pOwovLyAjMTE3NiDigJQgcGF0aC1iYXNlZCBpbmVydCBtYXJrZXJzLiBUaGUgZXh0ZW5zaW9uLWJhc2VkIFJFIGFib3ZlIGNhbid0IGNvdmVyCi8vIGAuZ2l0aHViL3dvcmtmbG93cy8qLnltbGAgd2l0aG91dCBhbHNvIGV4ZW1wdGluZyBgbW9mbG8ueWFtbGAgLyBgdHNjb25maWcueWFtbGAKLy8gKHdoaWNoIEFSRSBzb3VyY2UpLiBBbmNob3Igb24gdGhlIEdpdEh1Yi1tZXRhIGRpcmVjdG9yaWVzIHRoYXQgaG9sZCBDSSBjb25maWcKLy8gYW5kIHRlbXBsYXRlIHNjYWZmb2xkcyDigJQgZWRpdGluZyB0aG9zZSBkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZSBzdXJmYWNlLCBzbwovLyB0aGV5IHNob3VsZG4ndCByZXNldCB0ZXN0c1J1bi9zaW1wbGlmeVJ1biB0aGUgd2F5IGEgcmVhbCBzb3VyY2UgZWRpdCBkb2VzLgovLyBUcmFpbGluZyB0ZXJtaW5hdG9yIGluY2x1ZGVzIGAuYCBzbyB0aGUgc2luZ2xlLWZpbGUgdGVtcGxhdGUgZm9ybQovLyBgLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWRgIG1hdGNoZXMgYWxvbmdzaWRlIHRoZSBkaXJlY3RvcnkgZm9ybS4KLy8gIzEzNDgg4oCUIGAubW9mbG8vYCBqb2lucyB0aGVtLiBJdCBpcyBtb2ZsbydzIG93biBnaXRpZ25vcmVkIHN0YXRlIGRpcmVjdG9yeQovLyAoZGFlbW9uIGxvY2tzLCBtZW1vcnkgZGIsIFNERCBzcGVjL3BsYW4gYXJ0aWZhY3RzKSwgc28gbm90aGluZyB3cml0dGVuIHRoZXJlCi8vIGNhbiBhcHBlYXIgaW4gdGhlIGJyYW5jaCBkaWZmLCBhbmQgYSBzcGVjIGVkaXQgaW52YWxpZGF0aW5nIHRoZSB0ZXN0IHJ1biBpcwovLyBwdXJlIG5vaXNlLiBTY29wZWQgdG8gdGhlIHJlc2V0IG9ubHkg4oCUIGRlbGliZXJhdGVseSBOT1QgYWRkZWQgdG8gRVhFTVBULAovLyB3aGljaCB3b3VsZCBhbHNvIHVuLWdhdGUgcmVhZHMgb2YgYC5tb2Zsby9zcGVjcy8qKmAsIGFuZCB0aG9zZSBhcmUgaW5kZXhlZAovLyBndWlkYW5jZSB0aGF0IG1lbW9yeS1maXJzdCBzaG91bGQgc3RpbGwgcm91dGUgdGhyb3VnaCBhIHNlYXJjaC4KLy8gIzEzOTUg4oCUIGAuY2xhdWRlL2AgQ09ORklHIGpvaW5zIHRoZW0sIGJ5IHRoZSBzYW1lICJkb2Vzbid0IGV4cG9zZSBuZXcgcnVudGltZQovLyBzdXJmYWNlIiByZWFzb25pbmc6IGhvb2sgd2lyaW5nLCBza2lsbHMgYW5kIGd1aWRhbmNlIGFyZSBub3QgdGhlIGNvZGUgdW5kZXIKLy8gdmVyaWZpY2F0aW9uLiBUaGlzIGlzIHRoZSBzdHJvbmdlciBjYXNlLCBpbiBmYWN0IOKAlCBpdCBpcyB0aGUgZGlyZWN0b3J5IGEgdXNlcgovLyBlZGl0cyAqYmVjYXVzZSBhIGdhdGUgdG9sZCB0aGVtIHRvKi4gQmVmb3JlIHRoaXMsIGZpeGluZyBob29rIHdpcmluZyBvbiBhCi8vIGdhdGUncyBvd24gaW5zdHJ1Y3Rpb24gcmVzZXQgdmVyaWZ5UnVuIGFuZCBpbnZhbGlkYXRlZCB0aGUgdmVyaWZpY2F0aW9uIHRoZQovLyBmaXggZXhpc3RlZCB0byBsZXQgdGhyb3VnaCwgc28gdGhlIHJlY292ZXJ5IHdhczogZml4IHdpcmluZyDihpIgdmVyaWZpY2F0aW9uCi8vIGludmFsaWRhdGVkIOKGkiByZXN0YXJ0IHNlc3Npb24g4oaSIHJlLXJ1biAvdmVyaWZ5IOKGkiByZXRyeSAoIzEzOTIgZmllbGQgcmVwb3J0KS4KLy8KLy8gU2NvcGVkIHRvIGNvbmZpZywgTk9UIGFsbCBvZiBgLmNsYXVkZS8qKmA6IGBzY3JpcHRzL2AgYW5kIGBoZWxwZXJzL2AgaG9sZAovLyBleGVjdXRhYmxlIHJ1bnRpbWUgc3VyZmFjZSAoZ2F0ZS5janMgaXRzZWxmIGxpdmVzIHRoZXJlKSwgYW5kIGVkaXRpbmcKLy8gZXhlY3V0YWJsZSBjb2RlIFNIT1VMRCBzdGlsbCBpbnZhbGlkYXRlIGEgdmVyaWZpY2F0aW9uLiBMaXN0aW5nIHRoZSBjb25maWcKLy8gc3ViZGlyZWN0b3JpZXMgZXhwbGljaXRseSBrZWVwcyB0aGF0IGludmFyaWFudCBpbnRhY3QuCi8vCi8vIEJvdGggc2VwYXJhdG9ycyBpbiBldmVyeSBhbHRlcm5hdGl2ZSDigJQgYSBiYXJlIGAvYCBoZXJlIHdvdWxkIHNpbGVudGx5IG5vLW9wCi8vIG9uIFdpbmRvd3MsIHdoZXJlIFRPT0xfSU5QVVQgcGF0aHMgYXJyaXZlIGJhY2tzbGFzaGVkIChSdWxlICMxKS4KdmFyIEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFID0gLyg/Ol58W1xcXC9dKVwuZ2l0aHViW1xcXC9dKD86d29ya2Zsb3dzfElTU1VFX1RFTVBMQVRFfFBVTExfUkVRVUVTVF9URU1QTEFURSkoPzpbXFxcLy5dfCQpfCg/Ol58W1xcXC9dKVwubW9mbG9bXFxcL118KD86XnxbXFxcL10pXC5jbGF1ZGVbXFxcL10oPzpzZXR0aW5ncyg/OlwubG9jYWwpP1wuanNvbiR8c2tpbGxzW1xcXC9dfGd1aWRhbmNlW1xcXC9dfGFnZW50c1tcXFwvXSkvaTsKLy8gVGVzdCBmaWxlczogaW52YWxpZGF0ZSB0aGUgdGVzdGluZyBnYXRlICh0ZXN0cyBhcmUgc3RhbGUgb25jZSB0ZXN0IGNvZGUgY2hhbmdlcykKLy8gYnV0IE5PVCB0aGUgc2ltcGxpZnkgZ2F0ZSDigJQgL3NpbXBsaWZ5IGFscmVhZHkgcmV2aWV3ZWQgdGhlIHByb2R1Y3Rpb24gY29kZTsgdG91Y2hpbmcKLy8gYSB0ZXN0IGZpbGUgb3IgZml4dHVyZSBkb2Vzbid0IGV4cG9zZSBuZXcgdW50ZXN0ZWQgc3VyZmFjZSBmb3IgY29kZSByZXZpZXcgKCM5MDgpLgp2YXIgRURJVF9SRVNFVF9TS0lQX1NJTVBMSUZZX09OTFlfUkUgPSAvKD86XnxbXFxcL10pKF9fdGVzdHNfX3xfX21vY2tzX198dGVzdHM/fHNwZWN8c3BlY3N8Y3lwcmVzc3xlMmV8Zml4dHVyZXM/KVtcXFwvXXxcLih0ZXN0fHNwZWMpXC5bbWNdP1tqdF1zeD8kfFwuZml4dHVyZVwuW21jXT9banRdc3g/JC9pOwovLyAjMTE3NiDigJQgc291cmNlLWZpbGUgZXh0ZW5zaW9ucyB1c2VkIGJ5IHRoZSBuby1zb3VyY2UtZmlsZXMgUFIgZXhlbXB0aW9uLgovLyBXaGVuIHRoZSBjdW11bGF0aXZlIGJyYW5jaCBkaWZmIGhhcyB6ZXJvIGZpbGVzIG1hdGNoaW5nIHRoaXMgUkUgKGkuZS4gb25seQovLyBZQU1ML01EL0pTT04vbG9ja2ZpbGVzL2ltYWdlcy90ZW1wbGF0ZXMpLCB0aGUgdGVzdGluZy9zaW1wbGlmeS9sZWFybmluZ3MKLy8gZ2F0ZXMgYXV0by1wYXNzIGF0IGBjaGVjay1iZWZvcmUtcHJgLiBMaXN0cyBldmVyeSBsYW5ndWFnZSBtb2ZsbyBzaGlwcwovLyBhZ2FpbnN0IOKAlCBhZGRpdGlvbnMgaGVyZSBzaG91bGQgbWF0Y2ggVEVTVF9SVU5ORVJfUkUncyBsYW5ndWFnZSBjb3ZlcmFnZS4KdmFyIFNPVVJDRV9GSUxFX1JFID0gL1wuKHRzfHRzeHxqc3xqc3h8bWpzfGNqc3xweXxnb3xyc3xyYnxqYXZhfGt0fHN3aWZ0fGN8Y2N8Y3BwfGh8aHBwfHNofGJhc2h8cHMxKSQvaTsKLy8gRG9jcy1vbmx5IFBSIGV4ZW1wdGlvbjogdGV4dC9tYXJrdXAvaW1hZ2UgZXh0ZW5zaW9ucyB0aGF0IGNhbm5vdCBjaGFuZ2UgcnVudGltZSBiZWhhdmlvdXIuCi8vIFJldGFpbmVkIGZvciB0aGUgdHJhbnNwYXJlbmN5IG1lc3NhZ2Ugd2hlbiB0aGUgZGlmZiBpcyAqcHVyZWx5KiBkb2NzIChubyBZQU1ML0pTT04gZWl0aGVyKQovLyDigJQgZ2l2ZXMgYSBtb3JlIHNwZWNpZmljIHJlYXNvbiB0aGFuICJubyBzb3VyY2UgZmlsZXMiIGluIHRoYXQgc3Vic2V0Lgp2YXIgRE9DU19PTkxZX1JFID0gL1wuKG1kfG1hcmtkb3dufHR4dHxyc3R8YWRvY3xodG1sP3xwZGZ8cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxpY298Ym1wKSQvaTsKCi8vIOKUgOKUgCBDb250ZW50LWFkZHJlc3NlZCBnYXRlIGNyZWRpdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gQSBib29sZWFuIGB0ZXN0c1J1bmAvYHNpbXBsaWZ5UnVuYC9gdmVyaWZ5UnVuYCBhbnN3ZXJzICJ3YXMgYW4gZWRpdAovLyBvYnNlcnZlZD8iIOKAlCB3aGljaCBpcyBvbmx5IGVxdWl2YWxlbnQgdG8gImRvZXMgdGhpcyBjcmVkaXQgc3RpbGwgZGVzY3JpYmUgdGhlCi8vIGNvZGU/IiBpZiBldmVyeSBtdXRhdGlvbiBmbG93cyB0aHJvdWdoIFdyaXRlL0VkaXQvTXVsdGlFZGl0LiBJdCBkb2VzIG5vdC4KLy8gYG5vZGUgLWVgIHdpdGggZnMud3JpdGVGaWxlU3luYywgYHNlZCAtaWAsIHNoZWxsIHJlZGlyZWN0aW9uLCBgY3BgLCBhbmQgZXZlcnkKLy8gZ2l0IG9wZXJhdGlvbiB0aGF0IG1vdmVzIHRoZSB0cmVlIChjaGVja291dCwgcHVsbCwgbWVyZ2UsIHJlYmFzZSwgYXBwbHkpCi8vIGNoYW5nZSBzb3VyY2Ugd2l0aG91dCBmaXJpbmcgUG9zdFRvb2xVc2Ugb24gdGhvc2UgdG9vbHMsIHNvIHJlc2V0LWVkaXQtZ2F0ZXMKLy8gbmV2ZXIgcnVucyBhbmQgY3JlZGl0IGVhcm5lZCBiZWZvcmVoYW5kIHN1cnZpdmVzIHRoZSBjaGFuZ2UuIERlbW9uc3RyYXRlZCBieQovLyBlYXJuaW5nIGZ1bGwgY3JlZGl0LCBhcHBlbmRpbmcgYW4gZXhlY1N5bmMgY2FsbCB0byBhIHNvdXJjZSBmaWxlIHZpYSBCYXNoLAovLyBhbmQgd2F0Y2hpbmcgY2hlY2stYmVmb3JlLXByIGFsbG93IHRoZSBQUi4gTXVsdGktaXNzdWUgc2Vzc2lvbnMgaGF2ZSB0aGUgc2FtZQovLyBzaGFwZTogbm90aGluZyBpcyBwZXItcHJvbXB0LCBzbyBpc3N1ZSBCIGluaGVyaXRzIGlzc3VlIEEncyBjcmVkaXQuCi8vCi8vIEV2ZXJ5IG9uZSBvZiAjOTA4IC8gIzExNzYgLyAjMTMyMiAvICMxMzMyIC8gIzEzNDggcmVmaW5lZCBXSElDSCB0b29sIGNhbGwgdG8KLy8gd2F0Y2guIE5vbmUgb2YgdGhlbSBjb3VsZCBjbG9zZSB0aGlzLCBiZWNhdXNlIHRoZSBvYnNlcnZlciBpcyB0aGUgd3JvbmcKLy8gcHJpbWl0aXZlLiBTbyBzdG9wIG9ic2VydmluZyBtdXRhdGlvbnMgYW5kIGZpbmdlcnByaW50IHRoZSBjb2RlIGl0c2VsZjogSEVBRAovLyBwbHVzIHRoZSBjb250ZW50IG9mIGV2ZXJ5IGNoYW5nZWQgYW5kIHVudHJhY2tlZCBmaWxlLiBSZWNvbXB1dGUgYXQgY2hlY2sKLy8gdGltZTsgYW55IG1pc21hdGNoIG1lYW5zIHRoZSBjcmVkaXQgZGVzY3JpYmVzIGRpZmZlcmVudCBjb2RlIGFuZCBpcyBzdGFsZS4gTm8KLy8gdG9vbCBjYW4gYnlwYXNzIGl0LCBiZWNhdXNlIGl0IHdhdGNoZXMgbm8gdG9vbHMuCi8vCi8vIFNjb3BlIG1pcnJvcnMgdGhlIHJlc2V0IHByZWRpY2F0ZXMgc28gdGhlaXIgaW50ZW50aW9uYWwgZXhlbXB0aW9ucyBzdXJ2aXZlLgovLyBJbmVydCBmaWxlcyAoIzExNzYpIGFuZCBgLmdpdGh1Yi9gICsgYC5tb2Zsby9gIHBhdGhzIG5ldmVyIGNvbnRyaWJ1dGUsIHNvIGEKLy8gbWFya2Rvd24gb3Igc3BlYyBlZGl0IHN0aWxsIGxlYXZlcyBhIHRlc3QgcnVuIHN0YW5kaW5nLiAnbm9udGVzdCcgYWxzbyBkcm9wcwovLyB0ZXN0IGZpbGVzLCBwcmVzZXJ2aW5nICM5MDg6IHRvdWNoaW5nIGEgdGVzdCBkb2VzIG5vdCBpbnZhbGlkYXRlIC9zaW1wbGlmeS4KLy8KLy8gaXNFcGhlbWVyYWxQYXRoIGlzIGRlbGliZXJhdGVseSBOT1QgYXBwbGllZCDigJQgaXQgZXhpc3RzIGZvciBhZ2VudCBzY3JhdGNocGFkcwovLyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBhbmQgYGdpdCBzdGF0dXNgIGNhbm5vdCByZXBvcnQgdGhvc2UuCi8vIFRoZSBnYXRlJ3Mgb3duIHN0YXRlIGZpbGUgbXVzdCBuZXZlciBjb250cmlidXRlOiByZWNvcmRpbmcgYSBjcmVkaXQgd3JpdGVzCi8vIGl0LCB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlIHZlcnkgZmluZ2VycHJpbnQgdGhlIGNyZWRpdCBpcyBwaW5uZWQgdG8gYW5kIG1ha2UKLy8gZXZlcnkgY3JlZGl0IGluc3RhbnRseSBzdGFsZS4gSXQgaXMgZ2l0aWdub3JlZCBpbiBtb2ZsbydzIHJlcG8sIGJ1dCBhCi8vIGNvbnN1bWVyIHByb2plY3QgbmVlZCBub3QgaWdub3JlIGl0LCBhbmQgdGhlcmUgdGhlIHNlbGYtcmVmZXJlbmNlIHdvdWxkCi8vIGRlYWRsb2NrIHRoZWlyIGdhdGUgcGVybWFuZW50bHkg4oCUIHNvIGV4Y2x1ZGUgaXQgYnkgbmFtZSByYXRoZXIgdGhhbiB0cnVzdGluZwovLyAuZ2l0aWdub3JlLiBTY29wZWQgdG8gdGhpcyBvbmUgZmlsZTogYC5jbGF1ZGUvYCBhbHNvIGhvbGRzIHJlYWwgc291cmNlCi8vIChoZWxwZXJzLywgc2NyaXB0cy8pIHRoYXQgbXVzdCBrZWVwIGNvdW50aW5nLgp2YXIgRklOR0VSUFJJTlRfU0VMRl9SRSA9IC8oPzpefFtcXFwvXSlcLmNsYXVkZVtcXFwvXXdvcmtmbG93LXN0YXRlXC5qc29uJC9pOwoKZnVuY3Rpb24gZmluZ2VycHJpbnRJbmNsdWRlcyhyZWwsIHNjb3BlKSB7CiAgaWYgKEZJTkdFUlBSSU5UX1NFTEZfUkUudGVzdChyZWwpKSByZXR1cm4gZmFsc2U7CiAgaWYgKEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFLnRlc3QocmVsKSkgcmV0dXJuIGZhbHNlOwogIGlmIChFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICBpZiAoc2NvcGUgPT09ICdub250ZXN0JyAmJiBFRElUX1JFU0VUX1NLSVBfU0lNUExJRllfT05MWV9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFBhdGhzIHJlcG9ydGVkIGJ5IGBnaXQgc3RhdHVzIC0tcG9yY2VsYWluPXYxIC11YWxsIC16YCwgYXMKICogYHsgcGF0aCwgb3JpZyB9YCDigJQgYG9yaWdgIHNldCBvbmx5IGZvciByZW5hbWVzIGFuZCBjb3BpZXMuCiAqCiAqIEEgcmVuYW1lIGVtaXRzIGBSICA8bmV3PlwwPG9sZD5cMGA6IHR3byBOVUwtdGVybWluYXRlZCB0b2tlbnMgZm9yIG9uZSBlbnRyeS4KICogVGhlIG9yaWdpbiB0b2tlbiBtdXN0IGJlIGNvbnN1bWVkIG9yIGl0IGlzIG1pc3JlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMKICogYnl0ZXMsIEFORCBpdCBtdXN0IGJlIHJlcG9ydGVkLCBiZWNhdXNlIGEgcmVuYW1lIG1lYW5zIHRoZSBvbGQgcGF0aCBubyBsb25nZXIKICogZXhpc3RzLiBEcm9wcGluZyBpdCBvbiB0aGUgZmxvb3IgbGVhdmVzIHRoZSBvbGQgcGF0aCBpbiB0aGUgY29udGVudCBtYXAg4oCUIHRoZQogKiBmaW5nZXJwcmludCB3b3VsZCB0aGVuIGNhcnJ5IGEgcGhhbnRvbSBlbnRyeSB0aGF0IGRpc2FwcGVhcnMgdGhlIG1vbWVudCB0aGUKICogcmVuYW1lIGlzIGNvbW1pdHRlZCwgZXhwaXJpbmcgY3JlZGl0IG9uIGEgY29tbWl0IHRoYXQgY2hhbmdlZCBubyBjb250ZW50LgogKiBUaGF0IGlzIHRoZSBzYW1lIGRlZmVjdCBjb250ZW50LWFkZHJlc3Npbmcgd2FzIGludHJvZHVjZWQgdG8gcmVtb3ZlLgogKi8KZnVuY3Rpb24gcGFyc2VQb3JjZWxhaW5aKHJhdykgewogIHZhciBvdXQgPSBbXTsKICB2YXIgcGFydHMgPSBTdHJpbmcocmF3KS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZW50cnkgPSBwYXJ0c1tpXTsKICAgIGlmICghZW50cnkgfHwgZW50cnkubGVuZ3RoIDwgNCkgY29udGludWU7CiAgICAvLyBDaGVjayBCT1RIIHN0YXR1cyBjb2x1bW5zLCBub3QganVzdCB0aGUgc3RhZ2VkIG9uZTogZ2l0IHJlcG9ydHMgYSByZW5hbWUKICAgIC8vIGFzIGBSIGAgd2hlbiBzdGFnZWQgYW5kIGNhbiByZXBvcnQgYCBSYCBmb3Igb25lIGRldGVjdGVkIGluIHRoZSB3b3JrdHJlZS4KICAgIC8vIE1pc3NpbmcgdGhlIHNlY29uZCBmb3JtIHdvdWxkIGxlYXZlIHRoZSBvcmlnaW4gdG9rZW4gdW5jb25zdW1lZCwgYW5kIGl0CiAgICAvLyB3b3VsZCB0aGVuIGJlIHJlYWQgYXMgdGhlIG5leHQgZW50cnkncyBzdGF0dXMgYnl0ZXMg4oCUIG1pc2FsaWduaW5nIGV2ZXJ5CiAgICAvLyBlbnRyeSBhZnRlciBpdC4gUiBhbmQgQyBhbHdheXMgZW1pdCBhbiBvcmlnaW4gdG9rZW4sIHNvIGNvbnN1bWluZyBvbmUKICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjb2x1bW4gc2hvd3MgdGhlbSBjYW5ub3Qgb3Zlci1jb25zdW1lLgogICAgdmFyIHN0ID0gZW50cnkuc2xpY2UoMCwgMik7CiAgICB2YXIgcmVjID0geyBwYXRoOiBlbnRyeS5zbGljZSgzKSwgb3JpZzogbnVsbCB9OwogICAgaWYgKHN0LmluZGV4T2YoJ1InKSA+PSAwIHx8IHN0LmluZGV4T2YoJ0MnKSA+PSAwKSB7IHJlYy5vcmlnID0gcGFydHNbaSArIDFdIHx8IG51bGw7IGkrKzsgfQogICAgb3V0LnB1c2gocmVjKTsKICB9CiAgcmV0dXJuIG91dDsKfQoKLyoqCiAqIEZpbmdlcnByaW50IG9mIHRoZSBjb2RlIGEgZ2F0ZSBjcmVkaXQgZGVzY3JpYmVzLCBvciBudWxsIHdoZW4gaXQgY2Fubm90IGJlCiAqIGNvbXB1dGVkIChubyBnaXQsIG5vIHJlcG8sIG5vIGNvbW1pdHMpLiBOdWxsIGlzIHRoZSBmYWlsLW9wZW4gc2lnbmFsOiBjYWxsZXJzCiAqIGZhbGwgYmFjayB0byB0aGUgZmxhZyBhbG9uZSwgc28gbm9uLWdpdCBwcm9qZWN0cyBiZWhhdmUgZXhhY3RseSBhcyBiZWZvcmUuCiAqLwovLyBNZW1vaXNlZCBwZXIgc2NvcGUuIGNoZWNrLWJlZm9yZS1wciB0ZXN0cyB0aHJlZSBjcmVkaXRzIGFuZCBjaGVjay1iZWZvcmUtZG9uZQovLyBhIGZvdXJ0aCwgYW5kIGVhY2ggY29tcHV0YXRpb24gc2hlbGxzIG91dCB0byBgZ2l0IHN0YXR1cyAtdWFsbGAgb3ZlciB0aGUgd2hvbGUKLy8gdHJlZS4gVGhlIGdhdGUgcHJvY2VzcyBpcyBzaG9ydC1saXZlZCBhbmQgc2luZ2xlLXNob3Qg4oCUIGl0IGV4aXRzIGJlZm9yZSBhbnkKLy8gdG9vbCBpdCBnYXRlcyBjYW4gcnVuIOKAlCBzbyBub3RoaW5nIGNhbiBjaGFuZ2UgdW5kZXJuZWF0aCB0aGUgY2FjaGUuCnZhciBGSU5HRVJQUklOVF9DQUNIRSA9IHt9OwoKZnVuY3Rpb24gY3JlZGl0RmluZ2VycHJpbnQoc2NvcGUpIHsKICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEZJTkdFUlBSSU5UX0NBQ0hFLCBzY29wZSkpIHJldHVybiBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV07CiAgdmFyIHZhbHVlID0gY29tcHV0ZUNyZWRpdEZpbmdlcnByaW50KHNjb3BlKTsKICBGSU5HRVJQUklOVF9DQUNIRVtzY29wZV0gPSB2YWx1ZTsKICByZXR1cm4gdmFsdWU7Cn0KCmZ1bmN0aW9uIGNvbXB1dGVDcmVkaXRGaW5nZXJwcmludChzY29wZSkgewogIHZhciBnaXQgPSBmdW5jdGlvbiAoYXJncykgewogICAgcmV0dXJuIGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgYXJncywgewogICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMTAwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLAogICAgfSk7CiAgfTsKICAvLyBGaW5nZXJwcmludCB0aGUgQ09OVEVOVCBvZiB0aGUgd29ya2luZyB0cmVlLCBuZXZlciAoSEVBRCArIGRlbHRhKS4gVGhvc2UKICAvLyBhcmUgbm90IHRoZSBzYW1lIHRoaW5nOiBgZ2l0IGNvbW1pdGAgbW92ZXMgY2hhbmdlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUKICAvLyBpbnRvIEhFQUQgd2l0aG91dCBhbHRlcmluZyBhIHNpbmdsZSBieXRlIG9mIGNvZGUsIGFuZCBhIEhFQUQtYmFzZWQKICAvLyBmaW5nZXJwcmludCB3b3VsZCBleHBpcmUgZXZlcnkgY3JlZGl0IG9uIGNvbW1pdCDigJQgZm9yY2luZyBhIHBvaW50bGVzcwogIC8vIHJlLXJ1biBvZiB0aGUgdGVzdHMgdGhhdCBqdXN0IHBhc3NlZCBvbiBleGFjdGx5IHRoaXMgY29kZS4gQ29udGVudC0KICAvLyBhZGRyZXNzaW5nIGFsc28gbWFrZXMgdGhlIGZpbmdlcnByaW50IHN0YWJsZSBhY3Jvc3MgYW1lbmQsIHN0YXNoL3BvcCwgYW5kCiAgLy8gYW55IGJyYW5jaCBzd2l0Y2ggdGhhdCBsYW5kcyBvbiBpZGVudGljYWwgY29udGVudCwgd2hpbGUgc3RpbGwgbW92aW5nIHRoZQogIC8vIG1vbWVudCByZWFsIGNvbnRlbnQgZGlmZmVycy4KICAvLwogIC8vIFVuY2hhbmdlZCBmaWxlcyBjb250cmlidXRlIGdpdCdzIG93biBibG9iIGhhc2hlcyAoZnJlZSwgYWxyZWFkeSBjb21wdXRlZCk7CiAgLy8gb25seSBmaWxlcyBnaXQgcmVwb3J0cyBhcyBjaGFuZ2VkIG9yIHVudHJhY2tlZCBhcmUgaGFzaGVkIGhlcmUuCiAgdmFyIHRyYWNrZWQ7CiAgdHJ5IHsKICAgIHRyYWNrZWQgPSBnaXQoWydscy10cmVlJywgJy1yJywgJy16JywgJ0hFQUQnXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfSAvLyBubyBnaXQsIG5vIHJlcG8sIG9yIG5vIGNvbW1pdCB5ZXQKICB2YXIgYnlQYXRoID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB2YXIgZW50cmllcyA9IFN0cmluZyh0cmFja2VkKS5zcGxpdCgnXDAnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgIC8vICI8bW9kZT4gPHR5cGU+IDxvYmplY3Q+XHQ8cGF0aD4iCiAgICB2YXIgdGFiID0gZW50cmllc1tpXS5pbmRleE9mKCdcdCcpOwogICAgaWYgKHRhYiA8IDApIGNvbnRpbnVlOwogICAgdmFyIG1ldGEgPSBlbnRyaWVzW2ldLnNsaWNlKDAsIHRhYikuc3BsaXQoJyAnKTsKICAgIGJ5UGF0aFtlbnRyaWVzW2ldLnNsaWNlKHRhYiArIDEpXSA9IG1ldGFbMl07CiAgfQogIHRyeSB7CiAgICB2YXIgY2hhbmdlZCA9IHBhcnNlUG9yY2VsYWluWihnaXQoWydzdGF0dXMnLCAnLS1wb3JjZWxhaW49djEnLCAnLXVhbGwnLCAnLXonXSkpOwogICAgdmFyIGxpdmUgPSBbXTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlZC5sZW5ndGg7IGorKykgewogICAgICB2YXIgcmVsID0gY2hhbmdlZFtqXS5wYXRoOwogICAgICAvLyBBIHJlbmFtZSdzIG9yaWdpbiBwYXRoIGlzIGdvbmUgZnJvbSB0aGUgY29udGVudCDigJQgZHJvcCBpdCwgb3IgaXQKICAgICAgLy8gbGluZ2VycyB1bnRpbCB0aGUgcmVuYW1lIGlzIGNvbW1pdHRlZCBhbmQgdGhlbiB2YW5pc2hlcywgbW92aW5nIHRoZQogICAgICAvLyBmaW5nZXJwcmludCBvbiBhIGNvbW1pdCB0aGF0IGNoYW5nZWQgbm90aGluZy4KICAgICAgaWYgKGNoYW5nZWRbal0ub3JpZykgZGVsZXRlIGJ5UGF0aFtjaGFuZ2VkW2pdLm9yaWddOwogICAgICB2YXIgYWJzID0gcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCByZWwpOwogICAgICB2YXIgaXNGaWxlID0gZmFsc2U7CiAgICAgIHRyeSB7IGlzRmlsZSA9IGZzLnN0YXRTeW5jKGFicykuaXNGaWxlKCk7IH0gY2F0Y2ggKGUpIHsgaXNGaWxlID0gZmFsc2U7IH0KICAgICAgLy8gQSBwYXRoIGdpdCByZXBvcnRzIGJ1dCB0aGF0IGlzIGdvbmUgKG9yIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSkgaXMKICAgICAgLy8gYWJzZW50IGZyb20gdGhlIGNvbnRlbnQsIHNvIGl0IG11c3QgbGVhdmUgdGhlIG1hcCBlbnRpcmVseS4KICAgICAgaWYgKCFpc0ZpbGUpIHsgZGVsZXRlIGJ5UGF0aFtyZWxdOyBjb250aW51ZTsgfQogICAgICBpZiAocmVsLmluZGV4T2YoJ1xuJykgPj0gMCkgeyBkZWxldGUgYnlQYXRoW3JlbF07IGNvbnRpbnVlOyB9IC8vIHVuaGFzaGFibGUgdmlhIC0tc3RkaW4tcGF0aHMKICAgICAgbGl2ZS5wdXNoKHJlbCk7CiAgICB9CiAgICBpZiAobGl2ZS5sZW5ndGgpIHsKICAgICAgLy8gYGdpdCBoYXNoLW9iamVjdGAg4oCUIE5PVCBhIHJhdyBzaGExIG9mIHRoZSBieXRlcy4gQSBnaXQgYmxvYiBpZCBoYXNoZXMKICAgICAgLy8gImJsb2IgPHNpemU+XDAiIHBsdXMgdGhlIGNvbnRlbnQsIGFuZCBhcHBsaWVzIHRoZSBzYW1lIGNsZWFuIGZpbHRlcnMKICAgICAgLy8gYW5kIGNvcmUuYXV0b2NybGYgbm9ybWFsaXNhdGlvbiBnaXQgd291bGQgYXBwbHkgb24gY2hlY2tpbi4gSGFzaGluZyB0aGUKICAgICAgLy8gcmF3IGJ5dGVzIGhlcmUgaW5zdGVhZCB3b3VsZCBwcm9kdWNlIGEgZGlmZmVyZW50IHN0cmluZyB0aGFuIGxzLXRyZWUKICAgICAgLy8gcmVwb3J0cyBmb3IgaWRlbnRpY2FsIGNvbnRlbnQsIHNvIGEgZmlsZSB3b3VsZCBhcHBlYXIgdG8gImNoYW5nZSIgdGhlCiAgICAgIC8vIG1vbWVudCBpdCB3YXMgY29tbWl0dGVkIOKAlCBhbmQgb24gV2luZG93cywgd2hlbmV2ZXIgYXV0b2NybGYgcmV3cm90ZSBpdHMKICAgICAgLy8gbGluZSBlbmRpbmdzLiBPbmUgYmF0Y2hlZCBjYWxsIGNvdmVycyBldmVyeSBjaGFuZ2VkIHBhdGguCiAgICAgIHZhciBoYXNoZWQgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnaGFzaC1vYmplY3QnLCAnLS1zdGRpbi1wYXRocyddLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDEwMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBtYXhCdWZmZXI6IDY0ICogMTAyNCAqIDEwMjQsIGlucHV0OiBsaXZlLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdpZ25vcmUnXSwKICAgICAgfSkudHJpbSgpLnNwbGl0KCdcbicpOwogICAgICBmb3IgKHZhciBtID0gMDsgbSA8IGxpdmUubGVuZ3RoOyBtKyspIHsKICAgICAgICBpZiAoaGFzaGVkW21dKSBieVBhdGhbbGl2ZVttXV0gPSBoYXNoZWRbbV0udHJpbSgpOwogICAgICB9CiAgICB9CiAgfSBjYXRjaCAoZSkgewogICAgLy8gc3RhdHVzIGZhaWxlZCDigJQgZmFsbCBiYWNrIHRvIHRoZSBjb21taXR0ZWQgdHJlZSBhbG9uZSByYXRoZXIgdGhhbiBudWxsLAogICAgLy8gc28gdGhlIGZpbmdlcnByaW50IHN0aWxsIHRyYWNrcyBjb21taXR0ZWQgY29udGVudC4KICB9CiAgdmFyIHBhdGhzID0gT2JqZWN0LmtleXMoYnlQYXRoKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIGZpbmdlcnByaW50SW5jbHVkZXMocCwgc2NvcGUpOyB9KTsKICBwYXRocy5zb3J0KCk7CiAgdmFyIGggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpOwogIGZvciAodmFyIGsgPSAwOyBrIDwgcGF0aHMubGVuZ3RoOyBrKyspIGgudXBkYXRlKHBhdGhzW2tdICsgJzonICsgYnlQYXRoW3BhdGhzW2tdXSArICdcbicpOwogIHJldHVybiBoLmRpZ2VzdCgnaGV4Jyk7Cn0KCi8qKgogKiBJcyBhIGNyZWRpdCBzdGlsbCBsaXZlPyBgZmxhZ2AgaXMgdGhlIGxlZ2FjeSBib29sZWFuLCBgc3RvcmVkYCB0aGUgZmluZ2VycHJpbnQKICogY2FwdHVyZWQgd2hlbiBpdCB3YXMgZWFybmVkLgogKgogKiBGYWlsLW9wZW4gb24gYW4gdW5jb21wdXRhYmxlIGZpbmdlcnByaW50IChub24tZ2l0IHByb2plY3QpIOKAlCB0aGUgZ2F0ZSBrZWVwcwogKiBpdHMgcHJldmlvdXMgc2VtYW50aWNzIHRoZXJlIHJhdGhlciB0aGFuIGJsb2NraW5nIHdvcmsgaXQgY2Fubm90IHJlYXNvbiBhYm91dC4KICogRmFpbC1DTE9TRUQgb24gYSBtaXNzaW5nIHN0b3JlZCBmaW5nZXJwcmludDogdGhhdCBpcyBjcmVkaXQgZWFybmVkIGJ5IGEKICogcHJlLXVwZ3JhZGUgZ2F0ZSwgYW5kIGl0IGNhcnJpZXMgbm8gZXZpZGVuY2UgYWJvdXQgd2hpY2ggY29kZSBpdCBjb3ZlcmVkLiBUaGUKICogY29zdCBpcyByZS1ydW5uaW5nIG9uY2Ugb24gdGhlIGZpcnN0IFBSIGFmdGVyIHVwZ3JhZGUsIHdoaWNoIHNlbGYtaGVhbHMuCiAqLwpmdW5jdGlvbiBjcmVkaXRJc0xpdmUoZmxhZywgc3RvcmVkLCBzY29wZSkgewogIGlmICghZmxhZykgcmV0dXJuIGZhbHNlOwogIHZhciBub3cgPSBjcmVkaXRGaW5nZXJwcmludChzY29wZSk7CiAgaWYgKG5vdyA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgaWYgKCFzdG9yZWQpIHJldHVybiBmYWxzZTsKICByZXR1cm4gc3RvcmVkID09PSBub3c7Cn0KCi8vICMxNDEwIOKAlCBpcyB0aGlzIEJhc2ggY29tbWFuZCBhY3R1YWxseSBhIGBnaCBwciBjcmVhdGVgIGludm9jYXRpb24/IERlbGVnYXRlcwovLyB0byBwci1jcmVhdGUtY29tbWFuZC5janMsIHdoaWNoIHNhbml0aXNlcyBkYXRhIHJlZ2lvbnMgKHF1b3RlcywgaGVyZWRvYwovLyBib2RpZXMsIGNvbW1lbnRzKSBiZWZvcmUgbG9va2luZyBmb3IgdGhlIGNvbW1hbmQsIHNvIHRoZSBnYXRlIG5laXRoZXIgbWlzc2VzCi8vIHJlYWwgaW52b2NhdGlvbnMgKG5ld2xpbmUtc2VwYXJhdGVkLCBwaXBlZCwgcGFyZW50aGVzaXNlZCkgbm9yIGZpcmVzIG9uCi8vIGNvbW1hbmRzIHRoYXQgbWVyZWx5IHF1b3RlIHRoZSBsaXRlcmFsIChgZ2l0IGNvbW1pdCAtbSAiLi4uZ2ggcHIgY3JlYXRlLi4uImApLgovLwovLyBGYWlsLXNhZmUsIGluIEJPVEggZGlyZWN0aW9ucywgYmVjYXVzZSB0aGlzIHJ1bnMgb24gZXZlcnkgQmFzaCBjYWxsIGluIGV2ZXJ5Ci8vIGNvbnN1bWVyLiBnYXRlLWhvb2subWpzIG1hcHMgYSBub24temVybyBleGl0IGZyb20gdGhpcyBzY3JpcHQgdG8gZXhpdCAyLCBzbyBhbgovLyB1bmNhdWdodCB0aHJvdyBoZXJlIGRvZXMgbm90IGRlZ3JhZGUgb25lIGdhdGUg4oCUIGl0IGJsb2NrcyBldmVyeSBCYXNoIGNhbGwgdGhlCi8vIGNvbnN1bWVyIG1ha2VzLiBTbyBhIGxvYWQgZmFpbHVyZSAocGFydGlhbCBgLmNsYXVkZS9oZWxwZXJzYCBzeW5jIG1pZC11cGdyYWRlLAovLyBoYW5kLXBydW5lZCBpbnN0YWxsKSBBTkQgYSB0aHJvdyBmcm9tIHRoZSBtYXRjaGVyIGl0c2VsZiBib3RoIGZhbGwgYmFjayB0byB0aGUKLy8gcHJlLSMxNDEwIHJlZ2V4OiBwcmV2aW91cyBiZWhhdmlvdXIsIG5vdCBhIHdlZGdlZCBzZXNzaW9uLgovLwovLyBOb3Qgc2lsZW50ICgjODU0LCBob29rLWF1dGhvcmluZyDCpzQpOiB0aGUgZmFsbGJhY2sgcGF0aCBhZHZpc2VzIG9uIHN0ZGVyciBhbmQKLy8gY29udGludWVzLiBJZiB0aGlzIGV2ZXIgZmlyZXMgaXQgbWVhbnMgdGhlIG1hdGNoZXIgY3Jhc2hlZCwgd2hpY2ggaXMgd29ydGgKLy8gYmVpbmcgbG91ZCBhYm91dCDigJQgYW5kIGl0IGNhbm5vdCBzcGFtIGEgaGVhbHRoeSBzZXNzaW9uLCBiZWNhdXNlIGEgaGVhbHRoeQovLyBzZXNzaW9uIG5ldmVyIHJlYWNoZXMgaXQuCnZhciBMRUdBQ1lfUFJfQ1JFQVRFX1JFID0gLyg/Ol58JiZccyp8XHxcfFxzKnw7XHMqKVxzKig/OltBLVpfXVtBLVowLTlfXSo9XFMrXHMrKSpnaFxzK3ByXHMrY3JlYXRlXGIvOwp2YXIgcHJDcmVhdGVNYXRjaGVyID0gbnVsbDsKZnVuY3Rpb24gaXNQckNyZWF0ZUNvbW1hbmQoY21kKSB7CiAgaWYgKHByQ3JlYXRlTWF0Y2hlciA9PT0gbnVsbCkgewogICAgdHJ5IHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gcmVxdWlyZSgnLi9wci1jcmVhdGUtY29tbWFuZC5janMnKS5pc1ByQ3JlYXRlQ29tbWFuZDsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcHJDcmVhdGVNYXRjaGVyID0gZmFsc2U7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlLWNvbW1hbmQuY2pzIHVuYXZhaWxhYmxlICgnICsgKGUgJiYgZS5tZXNzYWdlKSArICcpIOKAlCBQUiBnYXRlcyBmYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSBtYXRjaGVyLiBSdW4gYG5weCBmbG8gZG9jdG9yIC0tZml4YC5cbicpOwogICAgfQogICAgaWYgKHR5cGVvZiBwckNyZWF0ZU1hdGNoZXIgIT09ICdmdW5jdGlvbicpIHByQ3JlYXRlTWF0Y2hlciA9IGZhbHNlOwogIH0KICBpZiAocHJDcmVhdGVNYXRjaGVyKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gcHJDcmVhdGVNYXRjaGVyKGNtZCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdtb2ZsbzogcHItY3JlYXRlIG1hdGNoZXIgdGhyZXcgKCcgKyAoZSAmJiBlLm1lc3NhZ2UpICsgJykg4oCUIGZhbGxpbmcgYmFjayB0byB0aGUgbGVnYWN5IG1hdGNoZXIuIFBsZWFzZSByZXBvcnQgd2l0aCB0aGUgY29tbWFuZCB0aGF0IHRyaWdnZXJlZCBpdC5cbicpOwogICAgfQogIH0KICByZXR1cm4gTEVHQUNZX1BSX0NSRUFURV9SRS50ZXN0KGNtZCk7Cn0KCi8vIENsYXNzaWZpZXItYXdhcmUgc2ltcGxpZnkgZ2F0ZSBza2lwLiBSZXR1cm5zIGEgc3RyaW5nIHJlYXNvbiBpZiB0aGUgZ2F0ZQovLyBjYW4gYmUgYXV0by1wYXNzZWQsIG9yIG51bGwgaWYgL3NpbXBsaWZ5IG11c3QgcnVuLiBVc2VzIHNpbXBsaWZ5LWNsYXNzaWZ5LmNqcwovLyBzbyB0aGUgZ2F0ZSdzICJ0cml2aWFsIiBkZWZpbml0aW9uIG1hdGNoZXMgdGhlIHNraWxsJ3MgZXhhY3RseS4KLy8KLy8gVHdvIHBhdGhzOgovLyAgIDEuIHNuYXBzaG90IHBhdGgg4oCUIC9zaW1wbGlmeSByYW4gZWFybGllciBvbiB0aGlzIGJyYW5jaC4gQ2xhc3NpZnkgdGhlIGRpZmYKLy8gICAgICBiZXR3ZWVuIHNpbXBsaWZ5U25hcHNob3RTaGEgYW5kIGN1cnJlbnQgSEVBRC93b3JraW5nLXRyZWUuIElmIFRSSVZJQUwsCi8vICAgICAgdGhlIHByaW9yIHJldmlldyBzdGlsbCBjb3ZlcnMgdGhlIGJyYW5jaCDigJQgbm8gcmUtcnVuIG5lZWRlZC4KLy8gICAyLiBiYXNlbGluZSBwYXRoIOKAlCBubyBzbmFwc2hvdCAoZmlyc3QgdGltZSkuIENsYXNzaWZ5IHRoZSBlbnRpcmUgYnJhbmNoCi8vICAgICAgZGlmZiB2cyBtZXJnZS1iYXNlLiBJZiBUUklWSUFMLCB0aGUgd2hvbGUgUFIgaXMgYmVsb3cgdGhlIHRocmVzaG9sZAovLyAgICAgIHdoZXJlIC9zaW1wbGlmeSBwcm92aWRlcyB2YWx1ZSDigJQgYXV0by1wYXNzIHdpdGhvdXQgZXZlciBpbnZva2luZyBpdC4KLy8KLy8gRmFpbC1zYWZlOiBhbnkgZXJyb3IgKG5vIGNsYXNzaWZpZXIsIG5vIGdpdCwgbm8gbWVyZ2UtYmFzZSkgcmV0dXJucyBudWxsLAovLyB3aGljaCBmb3JjZXMgL3NpbXBsaWZ5IHRvIHJ1biBhcyB0b2RheS4KZnVuY3Rpb24gY2xhc3NpZnlGb3JHYXRlU2tpcChzdGF0ZSkgewogIHZhciBtb2Q7CiAgdHJ5IHsKICAgIG1vZCA9IHJlcXVpcmUoJy4vc2ltcGxpZnktY2xhc3NpZnkuY2pzJyk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIHZhciBjbGFzc2lmeSA9IG1vZCAmJiBtb2QuY2xhc3NpZnlEaWZmOwogIHZhciByZWFkVW50cmFja2VkID0gbW9kICYmIG1vZC5yZWFkVW50cmFja2VkRGlmZjsKICAvLyBFWEVDX01BWF9CVUZGRVIgaXMgY2hlY2tlZCBhbG9uZ3NpZGUgdGhlIGZ1bmN0aW9ucyBiZWNhdXNlIGZhbGxpbmcgYmFjayB0bwogIC8vIE5vZGUncyAxIE1pQiBkZWZhdWx0IHdvdWxkIHNpbGVudGx5IHJlaW5zdGF0ZSB0aGUgdmVyeSBjbGlmZiAjMTQ1MSByZW1vdmVkLgogIGlmICh0eXBlb2YgY2xhc3NpZnkgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHJlYWRVbnRyYWNrZWQgIT09ICdmdW5jdGlvbicKICAgICAgfHwgdHlwZW9mIG1vZC5FWEVDX01BWF9CVUZGRVIgIT09ICdudW1iZXInKSByZXR1cm4gbnVsbDsKCiAgLy8gVW50cmFja2VkIGZpbGVzIHNob3cgdXAgaW4gbm8gYGdpdCBkaWZmYCBvdXRwdXQsIHNvIHdpdGhvdXQgdGhlbSB0aGUgZ2F0ZQogIC8vIGNvdWxkIGF1dG8tcGFzcyBhIGJyYW5jaCBvZiBicmFuZC1uZXcgdW5zdGFnZWQgZmlsZXMgYXMgVFJJVklBTCAoIzE0NTEpLgogIC8vIFJlYWRpbmcgZXZlcnkgb25lIG9mIHRoZW0gaXMgcmVhbCB3b3JrLCBzbyBpdCBpcyBkZWZlcnJlZCB1bnRpbCBhIHBhdGggaXMKICAvLyBhY3R1YWxseSBhYm91dCB0byBjbGFzc2lmeS4gUmV0dXJucyBudWxsIGlmIHRoZSByZWFkIGZhaWxlZCDigJQgdGhlIGNhbGxlcgogIC8vIG11c3QgdGhlbiBmYWxsIHRocm91Z2ggYW5kIGZvcmNlIC9zaW1wbGlmeSByYXRoZXIgdGhhbiBjbGFzc2lmeSBhIHBhcnRpYWwKICAvLyBkaWZmLgogIHZhciB1bnRyYWNrZWRUZXh0ID0gbnVsbDsKICBmdW5jdGlvbiB1bnRyYWNrZWRTdWZmaXgoKSB7CiAgICBpZiAodW50cmFja2VkVGV4dCAhPT0gbnVsbCkgcmV0dXJuIHVudHJhY2tlZFRleHQ7CiAgICB2YXIgdTsKICAgIHRyeSB7IHUgPSByZWFkVW50cmFja2VkKFBST0pFQ1RfRElSKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogICAgaWYgKCF1IHx8IHUudW5yZWFkYWJsZSkgcmV0dXJuIG51bGw7CiAgICB1bnRyYWNrZWRUZXh0ID0gdS50ZXh0ID8gJ1xuJyArIHUudGV4dCA6ICcnOwogICAgcmV0dXJuIHVudHJhY2tlZFRleHQ7CiAgfQoKICBmdW5jdGlvbiB0cnlDbGFzc2lmeShkaWZmVGV4dCwgbGFiZWwsIGFsbG93U21hbGxSZXZpZXdGaXgpIHsKICAgIHRyeSB7CiAgICAgIHZhciBkZWMgPSBjbGFzc2lmeShkaWZmVGV4dCk7CiAgICAgIGlmIChkZWMudGllciA9PT0gJ1RSSVZJQUwnKSB7CiAgICAgICAgdmFyIGxvYyA9IChkZWMuc3RhdHMuYWRkZWQgfHwgMCkgKyAoZGVjLnN0YXRzLmRlbGV0ZWQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGxhYmVsICsgJyBpcyBUUklWSUFMICgnICsgbG9jICsgJyBMT0MsICcgKyAoZGVjLnN0YXRzLmZpbGVDb3VudCB8fCAwKSArICcgZmlsZShzKSknOwogICAgICB9CiAgICAgIC8vICMxMTc2IOKAlCBTTUFMTCByZXZpZXctZml4IHNoYXBlIChzbmFwc2hvdCBwYXRoIG9ubHkpLiBBIOKJpDMwLUxPQyBkZWx0YSB3aXRoCiAgICAgIC8vIHplcm8gbmV3IGRlY2xhcmF0aW9ucyBvbiB0b3Agb2YgYW4gYWxyZWFkeS1yZXZpZXdlZCBicmFuY2ggaXMgdGhlIHR5cGljYWwKICAgICAgLy8gImFwcGx5IDMgcmV2aWV3IGZpeGVzIiBjeWNsZSDigJQgcmUtcnVubmluZyAvZmxvLXNpbXBsaWZ5IGFnYWluc3QgdGhlIHNhbWUKICAgICAgLy8gc3VyZmFjZSBwbHVzIGEgZmV3LWxpbmUgdHdlYWsgYWRkcyBubyBuZXcgc2lnbmFsLiBCYXNlbGluZSBwYXRoIHN0YXlzCiAgICAgIC8vIFRSSVZJQUwtb25seSBzbyBicmFuZC1uZXcgU01BTEwgZmVhdHVyZXMgc3RpbGwgZ2V0IHJldmlld2VkLgogICAgICBpZiAoYWxsb3dTbWFsbFJldmlld0ZpeCAmJiBkZWMudGllciA9PT0gJ1NNQUxMJykgewogICAgICAgIHZhciB0b3RhbExvYyA9IChkZWMuc3RhdHMuYWRkZWQgfHwgMCkgKyAoZGVjLnN0YXRzLmRlbGV0ZWQgfHwgMCk7CiAgICAgICAgaWYgKHRvdGFsTG9jIDw9IDMwICYmIChkZWMuc3RhdHMuZGVjbEFkZGVkIHx8IDApID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbGFiZWwgKyAnIGlzIFNNQUxMIHJldmlldy1maXggc2hhcGUgKCcgKyB0b3RhbExvYyArICcgTE9DLCBubyBuZXcgZGVjbGFyYXRpb25zKSc7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlKSB7IC8qIGZhbGwgdGhyb3VnaCAqLyB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIG1heEJ1ZmZlciBjb21lcyBGUk9NIHRoZSBjbGFzc2lmaWVyICgjMTQ1MSkgcmF0aGVyIHRoYW4gYmVpbmcgYSBtYXRjaGluZwogIC8vIGxpdGVyYWwgaGVyZSwgc28gdGhlIGdhdGUgYW5kIHRoZSBza2lsbCBjYW5ub3QgZHJpZnQgb24gd2hpY2ggZGlmZnMgYXJlCiAgLy8gcmVhZGFibGUgYXQgYWxsLiBQYXN0IGl0IGV4ZWNGaWxlU3luYyB0aHJvd3MgRU5PQlVGUyBhbmQgZ2l0RGlmZiByZXR1cm5zCiAgLy8gbnVsbCDigJQgd2hpY2ggZXZlcnkgY2FsbGVyIGJlbG93IG11c3QgdHJlYXQgYXMgInVua25vd24iLCBuZXZlciAiZW1wdHkiLgogIHZhciBtYXhCdWZmZXIgPSBtb2QuRVhFQ19NQVhfQlVGRkVSOwogIGZ1bmN0aW9uIGdpdERpZmYoYXJncykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgYXJncywgewogICAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiA1MDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSwgbWF4QnVmZmVyOiBtYXhCdWZmZXIKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgfQoKICAvLyBTbmFwc2hvdCBwYXRoOiBjbGFzc2lmeSBldmVyeXRoaW5nIHNpbmNlIC9zaW1wbGlmeSBsYXN0IHJhbi4KICBpZiAoc3RhdGUuc2ltcGxpZnlTbmFwc2hvdFNoYSkgewogICAgdmFyIHNuYXBEaWZmID0gZ2l0RGlmZihbJ2RpZmYnLCBzdGF0ZS5zaW1wbGlmeVNuYXBzaG90U2hhICsgJy4uLkhFQUQnXSk7CiAgICB2YXIgd29ya1RyZWVBID0gZ2l0RGlmZihbJ2RpZmYnLCAnSEVBRCddKTsKICAgIC8vIEJPVEggcmVhZHMgbXVzdCBzdWNjZWVkLiBDb2FsZXNjaW5nIGEgZmFpbGVkIHdvcmtpbmctdHJlZSByZWFkIHRvICcnIGlzCiAgICAvLyBob3cgYW4gb3Zlci1idWZmZXIgd29ya2luZyB0cmVlIHVzZWQgdG8gcmVhZCBhcyAibm8gd29ya2luZy10cmVlIGNoYW5nZXMiCiAgICAvLyBhbmQgbGV0IHRoZSBnYXRlIHNraXAgcmV2aWV3ICgjMTQ1MSkuCiAgICBpZiAoc25hcERpZmYgIT09IG51bGwgJiYgd29ya1RyZWVBICE9PSBudWxsKSB7CiAgICAgIHZhciBzdWZmaXhBID0gdW50cmFja2VkU3VmZml4KCk7CiAgICAgIGlmIChzdWZmaXhBID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIGNvbWJpbmVkID0gc25hcERpZmYgKyAod29ya1RyZWVBID8gJ1xuJyArIHdvcmtUcmVlQSA6ICcnKSArIHN1ZmZpeEE7CiAgICAgIC8vIFNuYXBzaG90IHBhdGg6IGFsbG93IFNNQUxMIHJldmlldy1maXggc2hhcGUgYmVjYXVzZSB0aGUgb3JpZ2luYWwgL3NpbXBsaWZ5CiAgICAgIC8vIGFscmVhZHkgY292ZXJlZCB0aGUgc3VyZmFjZSBhbmQgb25seSB0aW55IG5vLWRlY2wtdG91Y2hpbmcgdHdlYWtzIGZvbGxvd2VkLgogICAgICB2YXIgaGl0ID0gdHJ5Q2xhc3NpZnkoY29tYmluZWQsICdkZWx0YSBzaW5jZSBsYXN0IC9zaW1wbGlmeScsIHRydWUpOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgfQogIH0KCiAgLy8gQmFzZWxpbmUgcGF0aDogY2xhc3NpZnkgdGhlIHdob2xlIGJyYW5jaCB2cyBtZXJnZS1iYXNlLgogIHZhciBiYXNlcyA9IFsnb3JpZ2luL21haW4nLCAnbWFpbicsICdvcmlnaW4vbWFzdGVyJywgJ21hc3RlciddOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBiYXNlOwogICAgdHJ5IHsKICAgICAgYmFzZSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydtZXJnZS1iYXNlJywgJ0hFQUQnLCBiYXNlc1tpXV0sIHsKICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgICAgfSkudHJpbSgpOwogICAgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgaWYgKCFiYXNlKSBjb250aW51ZTsKICAgIHZhciBicmFuY2hEaWZmID0gZ2l0RGlmZihbJ2RpZmYnLCBiYXNlICsgJy4uLkhFQUQnXSk7CiAgICB2YXIgd29ya1RyZWVCID0gZ2l0RGlmZihbJ2RpZmYnLCAnSEVBRCddKTsKICAgIGlmIChicmFuY2hEaWZmICE9PSBudWxsICYmIHdvcmtUcmVlQiAhPT0gbnVsbCkgewogICAgICB2YXIgc3VmZml4QiA9IHVudHJhY2tlZFN1ZmZpeCgpOwogICAgICBpZiAoc3VmZml4QiA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiB0cnlDbGFzc2lmeShicmFuY2hEaWZmICsgKHdvcmtUcmVlQiA/ICdcbicgKyB3b3JrVHJlZUIgOiAnJykgKyBzdWZmaXhCLCAnYnJhbmNoIGRpZmYnKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8gR2V0IHRoZSBmaWxlIGxpc3QgY2hhbmdlZCBvbiB0aGUgY3VycmVudCBicmFuY2ggdnMgdGhlIG1lcmdlLWJhc2Ugd2l0aCBvcmlnaW4vbWFpbgovLyAoZmFsbGluZyBiYWNrIHRvIGxvY2FsIG1haW4pLiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlcG8tcmVsYXRpdmUgcGF0aHMsIG9yIG51bGwgb24KLy8gZmFpbHVyZSDigJQgaW4gd2hpY2ggY2FzZSBjYWxsZXJzIE1VU1QgZmFsbCB0aHJvdWdoIHRvIHRoZSBzdGFuZGFyZCBnYXRlIChmYWlsLXNhZmUpLgpmdW5jdGlvbiBnZXRDaGFuZ2VkRmlsZXNWc0Jhc2UoKSB7CiAgdmFyIGJhc2VzID0gWydvcmlnaW4vbWFpbicsICdtYWluJywgJ29yaWdpbi9tYXN0ZXInLCAnbWFzdGVyJ107CiAgdmFyIGJhc2UgPSBudWxsOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZXMubGVuZ3RoOyBpKyspIHsKICAgIHRyeSB7CiAgICAgIGJhc2UgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnbWVyZ2UtYmFzZScsICdIRUFEJywgYmFzZXNbaV1dLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDIwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddCiAgICAgIH0pLnRyaW0oKTsKICAgICAgaWYgKGJhc2UpIGJyZWFrOwogICAgfSBjYXRjaCAoZSkgeyAvKiB0cnkgbmV4dCAqLyB9CiAgfQogIGlmICghYmFzZSkgcmV0dXJuIG51bGw7CiAgdHJ5IHsKICAgIHZhciBvdXQgPSBjcC5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seScsIGJhc2UgKyAnLi4uSEVBRCddLCB7CiAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiAyMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgIH0pOwogICAgcmV0dXJuIG91dC5zcGxpdCgnXG4nKS5tYXAoZnVuY3Rpb24obCkgeyByZXR1cm4gbC50cmltKCk7IH0pLmZpbHRlcihCb29sZWFuKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9Cn0KCi8vICMxMzc0IOKAlCB0aGUgbWlzc2luZyBoYWxmIG9mIHRoZSBUYXNrQ3JlYXRlIHJlbWluZGVyLgovLwovLyBtb2ZsbyBuYWdzIHlvdSB0byBPUEVOIGEgdGFzayBsaXN0IChjaGVjay1iZWZvcmUtYWdlbnQpIGFuZCB0aGVuIG5ldmVyIGxvb2tzCi8vIGFnYWluOiBgdGFza0NvdW50YCBvbmx5IGNvdW50cyB1cCwgc28gYSBydW4gdGhhdCBjcmVhdGVzIGZvdXIgdGFza3MgYW5kIGNsb3NlcwovLyBub25lIHNhdGlzZmllcyBldmVyeSBnYXRlLiBUaGF0IGlzIHRoZSBleGFjdCBzaGFwZSBvZiBhbiBhYmFuZG9uZWQgbGlzdC4KLy8KLy8gVGhlIGxlZGdlciBpcyByZWFkIGZyb20gdGhlIHNlc3Npb24gVFJBTlNDUklQVCwgYW5kIGJvdGggYWx0ZXJuYXRpdmVzIHdlcmUKLy8gcmVqZWN0ZWQgb24gZXZpZGVuY2UgcmF0aGVyIHRoYW4gdGFzdGU6Ci8vCi8vICAgLSBBIGBeVGFza1VwZGF0ZSRgIFBvc3RUb29sVXNlIG9ic2VydmVyIGZlZWRpbmcgYSBjb3VudGVyIGlzIHRoZSB3aXJpbmcKLy8gICAgICMxMzMxIHJlbW92ZWQgYXMgcHVyZSBob3QtcGF0aCBvdmVyaGVhZC4gSXQgd291bGQgYWxzbyBoYXZlIHRvIHN1cnZpdmUKLy8gICAgIGFwcGx5UHJvbXB0U3RhdGVSZXNldCwgd2hlcmVhcyBhIHRyYW5zY3JpcHQgcmVhZCBob2xkcyBubyBzdGF0ZSB0byByZXNldC4KLy8gICAtIENsYXVkZSBDb2RlJ3Mgb3duIHRhc2sgc3RvcmUgKGB+Ly5jbGF1ZGUvdGFza3Mvc2Vzc2lvbi08aWQ+L2ApIGlzIGdyb3VuZAovLyAgICAgdHJ1dGggYnV0IHVucmVhY2hhYmxlOiBtZWFzdXJlZCBvbiB2Mi4xLjIyMCwgdGhlIGlkIGtleWluZyB0aGF0IGRpcmVjdG9yeQovLyAgICAgZG9lcyBOT1Qgcm90YXRlIG9uIGAvY2xlYXJgLCBzbyBhIHNlc3Npb24gd2hvc2UgdHJhbnNjcmlwdCBpcyA8QT4gd3JpdGVzCi8vICAgICBpdHMgdGFza3MgdW5kZXIgdGhlIHByZS1jbGVhciBpZCA8Qj4g4oCUIGFuZCA8QT4gaXMgd2hhdCB0aGUgYnJpZGdlIGZvcndhcmRzCi8vICAgICBhcyBIT09LX1NFU1NJT05fSUQuIFRoZXJlIGlzIG5vIHBhdGggZnJvbSB0aGUgaG9vayBlbnZpcm9ubWVudCB0byB0aGUgZGlyLgovLwovLyBDb3N0IGxhbmRzIG9ubHkgd2hlcmUgaXQgaXMgYWxyZWFkeSBqdXN0aWZpZWQ6IHRoZSBzb2xlIGNhbGxlciBydW5zIGFmdGVyCi8vIGNoZWNrLWJlZm9yZS1wcidzIGBnaCBwciBjcmVhdGVgIG1hdGNoLCBpLmUuIG9uY2UgcGVyIFBSIGF0dGVtcHQsIG5ldmVyIG9uIHRoZQovLyBwZXItdG9vbCBwYXRoLgovLwovLyBSZXR1cm5zIG51bGwgd2hlbiB0aGUgdHJhbnNjcmlwdCBpcyBtaXNzaW5nLCBvdmVyc2l6ZWQsIHVucmVhZGFibGUsIG9yIHJlY29yZHMKLy8gbm8gVGFza0NyZWF0ZSBhdCBhbGwg4oCUIHRoZSBjYWxsZXIgdGhlbiBzdGF5cyBzaWxlbnQgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcuCi8vIFNpemVkIGFnYWluc3QgbWVhc3VyZW1lbnQsIG5vdCBhIHJvdW5kIG51bWJlcjogYSAzLjRNQiB0cmFuc2NyaXB0ICh0aGUgbGFyZ2VzdAovLyBpbiBhIHdlZWsgb2YgbG9jYWwgc2Vzc2lvbnMpIGNvc3RzIH41NW1zIHRvIHNjYW4sIHNvIH4xNm1zL01CLiAxNk1CIGlzIH40eCB0aGUKLy8gd29yc3Qgb2JzZXJ2ZWQgc2Vzc2lvbiBhbmQgbGFuZHMgbmVhciAyNjBtcyDigJQgYSBjaHVuayBvZiB0aGUgaG9vaydzIDIwMDBtcwovLyBidWRnZXQsIGJ1dCBhIGJvdW5kZWQgb25lLiBQYXN0IHRoZSBjYXAgdGhlIGxlZGdlciBnb2VzIHNpbGVudCByYXRoZXIgdGhhbgovLyByaXNraW5nIHRoZSB0aW1lb3V0LCBzaW5jZSBhIGhvb2sgdGhhdCB0aW1lcyBvdXQgaXMgd29yc2UgdGhhbiBvbmUgdGhhdAovLyBkZWNsaW5lcyB0byBjb21tZW50LiBVbnJlbGF0ZWQgdG8gYFRSQU5TQ1JJUFRfVEFJTF9CWVRFU2AgaW4gYmluL2xpYi9tZWRpdGF0ZS5tanMKLy8gZGVzcGl0ZSB0aGUgc2ltaWxhciBuYW1lIOKAlCB0aGF0IG9uZSB0cnVuY2F0ZXMgdG8gYSB0YWlsIHdpbmRvdywgd2hpY2ggY2Fubm90Ci8vIHdvcmsgaGVyZSAoYSBUYXNrQ3JlYXRlIGZyb20gZWFybHkgaW4gdGhlIHNlc3Npb24gZmFsbHMgb3V0c2lkZSBhbnkgdGFpbCkuCnZhciBUUkFOU0NSSVBUX01BWF9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjQ7CmZ1bmN0aW9uIHJlYWRUYXNrTGVkZ2VyKCkgewogIHZhciB0cCA9IHByb2Nlc3MuZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIIHx8ICcnOwogIGlmICghdHApIHJldHVybiBudWxsOwogIHZhciByYXc7CiAgdHJ5IHsKICAgIHZhciBzdCA9IGZzLnN0YXRTeW5jKHRwKTsKICAgIGlmICghc3QuaXNGaWxlKCkgfHwgc3Quc2l6ZSA+IFRSQU5TQ1JJUFRfTUFYX0JZVEVTKSByZXR1cm4gbnVsbDsKICAgIHJhdyA9IGZzLnJlYWRGaWxlU3luYyh0cCwgJ3V0Zi04Jyk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbDsgfQogIHZhciBjcmVhdGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2tDcmVhdGUgQ0FMTFMgc2VlbgogIHZhciBwZW5kaW5nQ3JlYXRlcyA9IHt9OyAgICAgICAgICAgICAgIC8vIHRvb2xfdXNlIGlkIOKGkiBhd2FpdGluZyBpdHMgcmVzdWx0CiAgdmFyIGNyZWF0ZWRJZHMgPSB7fTsgICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZHMgdGhpcyB0cmFuc2NyaXB0IGFjdHVhbGx5IG9wZW5lZAogIHZhciBjcmVhdGVkSWRDb3VudCA9IDA7CiAgdmFyIGxhdGVzdCA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZCDihpIgbW9zdCByZWNlbnQgc3RhdHVzIHNlZW4KICAvLyBXYWxrZWQgYnkgbmV3bGluZSBpbmRleCByYXRoZXIgdGhhbiByYXcuc3BsaXQoJ1xuJyk6IHRoZSBzcGxpdCB3b3VsZCBob2xkIGEKICAvLyBzZWNvbmQgZnVsbC1zaXplIGNvcHkgb2YgYSBtdWx0aS1NQiB0cmFuc2NyaXB0IGFsb25nc2lkZSB0aGUgZmlyc3QsIGFuZCB0aGUKICAvLyBzY2FuIG5lZWRzIG9uZSBsaW5lIGF0IGEgdGltZS4KICB2YXIgcG9zID0gMDsKICB3aGlsZSAocG9zIDw9IHJhdy5sZW5ndGgpIHsKICAgIHZhciBubCA9IHJhdy5pbmRleE9mKCdcbicsIHBvcyk7CiAgICB2YXIgbGluZSA9IG5sIDwgMCA/IHJhdy5zbGljZShwb3MpIDogcmF3LnNsaWNlKHBvcywgbmwpOwogICAgcG9zID0gbmwgPCAwID8gcmF3Lmxlbmd0aCArIDEgOiBubCArIDE7CiAgICAvLyBDaGVhcCBwcmUtZmlsdGVyLiBBIG11bHRpLU1CIHRyYW5zY3JpcHQgaGFzIGEgaGFuZGZ1bCBvZiB0YXNrIGxpbmVzIGFuZAogICAgLy8gdGVucyBvZiB0aG91c2FuZHMgb2Ygb3RoZXJzOyBKU09OLnBhcnNlIG9uIGV2ZXJ5IGxpbmUgaXMgdGhlIHdob2xlIGNvc3QuCiAgICBpZiAobGluZS5pbmRleE9mKCdUYXNrQ3JlYXRlJykgPCAwICYmIGxpbmUuaW5kZXhPZignVGFza1VwZGF0ZScpIDwgMAogICAgICAmJiBsaW5lLmluZGV4T2YoJ2NyZWF0ZWQgc3VjY2Vzc2Z1bGx5JykgPCAwKSBjb250aW51ZTsKICAgIHZhciBlbnRyeTsKICAgIHRyeSB7IGVudHJ5ID0gSlNPTi5wYXJzZShsaW5lKTsgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgdmFyIGNvbnRlbnQgPSBlbnRyeSAmJiBlbnRyeS5tZXNzYWdlICYmIGVudHJ5Lm1lc3NhZ2UuY29udGVudDsKICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGludWU7CiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRlbnQubGVuZ3RoOyBqKyspIHsKICAgICAgdmFyIGJsb2NrID0gY29udGVudFtqXTsKICAgICAgaWYgKCFibG9jaykgY29udGludWU7CiAgICAgIC8vIFRoZSBjcmVhdGVkIGlkcyBjb21lIGZyb20gVGFza0NyZWF0ZSdzIFJFU1VMVCwgYmVjYXVzZSB0aGUgY2FsbCBpdHNlbGYKICAgICAgLy8gY2FycmllcyBubyBpZC4gV2l0aG91dCB0aGVtIGBjcmVhdGVkYCAoYSBjb3VudCBvZiBjYWxscykgYW5kIHRoZSBjbG9zZWQKICAgICAgLy8gc2V0IChhIHNldCBvZiBpZHMpIGFyZSBkaWZmZXJlbnQgdW5pdHM6IGEgVGFza1VwZGF0ZSBuYW1pbmcgYSB0YXNrIGZyb20KICAgICAgLy8gYmVmb3JlIHRoaXMgdHJhbnNjcmlwdCDigJQgb25lIGNhcnJpZWQgYWNyb3NzIGAvY2xlYXJgLCB3aGljaCBpcyBleGFjdGx5CiAgICAgIC8vIHdoYXQgQ2xhdWRlIENvZGUncyB0YXNrIHN0b3JlIGRvZXMg4oCUIHdvdWxkIGRpc2NvdW50IGEgdGFzayBpdCBuZXZlcgogICAgICAvLyBvcGVuZWQsIGFuZCB0aGUgYWR2aXNvcnkgd291bGQgdW5kZXItcmVwb3J0IHRoZSBvcGVuIGxpc3QuCiAgICAgIGlmIChibG9jay50eXBlID09PSAndG9vbF9yZXN1bHQnKSB7CiAgICAgICAgaWYgKCFwZW5kaW5nQ3JlYXRlc1tibG9jay50b29sX3VzZV9pZF0pIGNvbnRpbnVlOwogICAgICAgIGRlbGV0ZSBwZW5kaW5nQ3JlYXRlc1tibG9jay50b29sX3VzZV9pZF07CiAgICAgICAgdmFyIHRleHQgPSB0eXBlb2YgYmxvY2suY29udGVudCA9PT0gJ3N0cmluZycgPyBibG9jay5jb250ZW50IDogSlNPTi5zdHJpbmdpZnkoYmxvY2suY29udGVudCk7CiAgICAgICAgdmFyIG0gPSAvVGFzayAjKFxTKykgY3JlYXRlZCBzdWNjZXNzZnVsbHkvLmV4ZWModGV4dCB8fCAnJyk7CiAgICAgICAgaWYgKG0gJiYgIWNyZWF0ZWRJZHNbbVsxXV0pIHsgY3JlYXRlZElkc1ttWzFdXSA9IHRydWU7IGNyZWF0ZWRJZENvdW50Kys7IH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBTdHJ1Y3R1cmFsLCBub3Qgc3Vic3RyaW5nLiBBIGxpbmUgdGhhdCBtZXJlbHkgTUVOVElPTlMgVGFza0NyZWF0ZSDigJQgdGhpcwogICAgICAvLyB0aWNrZXQncyBvd24gZGlzY3Vzc2lvbiwgYSBndWlkYW5jZSBleGNlcnB0LCBhIHNoZWxsIGNvbW1hbmQgZWNob2luZyB0aGUKICAgICAgLy8gcGhyYXNlIOKAlCBpcyB0ZXh0LCBhbmQgY291bnRpbmcgaXQgd291bGQgaW5mbGF0ZSB0aGUgY3JlYXRlZCB0b3RhbCBvbgogICAgICAvLyBleGFjdGx5IHRoZSBzZXNzaW9ucyBtb3N0IGxpa2VseSB0byByZWFjaCBhIFBSIGdhdGUuIENvcnJlbGF0aW5nIG9uCiAgICAgIC8vIHRvb2xfdXNlX2lkIGlzIHdoYXQga2VlcHMgc3VjaCBhbiBlY2hvIG91dCBvZiB0aGUgY3JlYXRlZCBpZHMgdG9vLgogICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3Rvb2xfdXNlJykgY29udGludWU7CiAgICAgIGlmIChibG9jay5uYW1lID09PSAnVGFza0NyZWF0ZScpIHsKICAgICAgICBjcmVhdGVkKys7CiAgICAgICAgaWYgKGJsb2NrLmlkKSBwZW5kaW5nQ3JlYXRlc1tibG9jay5pZF0gPSB0cnVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChibG9jay5uYW1lICE9PSAnVGFza1VwZGF0ZScpIGNvbnRpbnVlOwogICAgICB2YXIgaW5wdXQgPSBibG9jay5pbnB1dCB8fCB7fTsKICAgICAgdmFyIGlkID0gaW5wdXQudGFza0lkICE9IG51bGwgPyBpbnB1dC50YXNrSWQgOiBpbnB1dC50YXNrX2lkOwogICAgICB2YXIgc3RhdHVzID0gaW5wdXQuc3RhdHVzOwogICAgICBpZiAoaWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3RhdHVzICE9PSAnc3RyaW5nJyB8fCAhc3RhdHVzKSBjb250aW51ZTsKICAgICAgLy8gTGFzdCB3cml0ZSB3aW5zIOKAlCB0cmFuc2NyaXB0IG9yZGVyIGlzIGNocm9ub2xvZ2ljYWwsIHNvIGEgdGFzayByZW9wZW5lZAogICAgICAvLyBhZnRlciBjb21wbGV0aW9uIGlzIGNvcnJlY3RseSBjb3VudGVkIGFzIG9wZW4gYWdhaW4uCiAgICAgIGxhdGVzdFtTdHJpbmcoaWQpXSA9IHN0YXR1czsKICAgIH0KICB9CiAgaWYgKGNyZWF0ZWQgPT09IDApIHJldHVybiBudWxsOwogIC8vIEEgY3JlYXRlIHdob3NlIHJlc3VsdCBuZXZlciBsYW5kZWQgKGludGVycnVwdGVkIGNhbGwsIHRydW5jYXRlZCB0cmFuc2NyaXB0KQogIC8vIGlzIGNvdW50ZWQgT1BFTjogaXQgd2FzIG9wZW5lZCwgYW5kIG5vdGhpbmcgb2JzZXJ2ZWQgaXQgYmVpbmcgY2xvc2VkLgogIHZhciBvcGVuID0gY3JlYXRlZCAtIGNyZWF0ZWRJZENvdW50OwogIE9iamVjdC5rZXlzKGNyZWF0ZWRJZHMpLmZvckVhY2goZnVuY3Rpb24oaWQpIHsKICAgIC8vIGBkZWxldGVkYCBjbG9zZXMgdGhlIGxvb3AgYXMgbGVnaXRpbWF0ZWx5IGFzIGBjb21wbGV0ZWRgOiBhIHRhc2sgcmVtb3ZlZAogICAgLy8gYmVjYXVzZSBpdCBubyBsb25nZXIgYXBwbGllcyBpcyBub3QgYW4gYWJhbmRvbmVkIG9uZS4KICAgIGlmIChsYXRlc3RbaWRdICE9PSAnY29tcGxldGVkJyAmJiBsYXRlc3RbaWRdICE9PSAnZGVsZXRlZCcpIG9wZW4rKzsKICB9KTsKICBpZiAob3BlbiA+IGNyZWF0ZWQpIG9wZW4gPSBjcmVhdGVkOwogIHJldHVybiB7IGNyZWF0ZWQ6IGNyZWF0ZWQsIGNsb3NlZDogY3JlYXRlZCAtIG9wZW4sIG9wZW46IG9wZW4gfTsKfQoKc3dpdGNoIChjb21tYW5kKSB7CiAgY2FzZSAnY2hlY2stYmVmb3JlLWFnZW50JzogewogICAgLy8gTW9zdGx5IGFkdmlzb3J5LiBUaGUgVGFza0NyZWF0ZSArIG1lbW9yeSByZW1pbmRlcnMgYmVsb3cgZ28gdG8gc3Rkb3V0IGFuZAogICAgLy8gbmV2ZXIgYmxvY2sg4oCUIHRoZWlyIHdvcmRpbmcgbXVzdCBub3QgY2xhaW0gb3RoZXJ3aXNlICgjMTMyNikuIFRoZSBvbmUKICAgIC8vIGV4Y2VwdGlvbiBpcyB0aGUgIzk1MiBzd2FybS9oaXZlIGNoZWNrIGF0IHRoZSBib3R0b20gb2YgdGhpcyBjYXNlLCB3aGljaAogICAgLy8gd3JpdGVzIHRvIHN0ZGVyciBhbmQgZXhpdHMgMi4KICAgIC8vIE1lbW9yeS1maXJzdCBlbmZvcmNlbWVudCBvdGhlcndpc2UgaGFwcGVucyBhdCB0aGUgc2Nhbi9yZWFkIGdhdGUgbGF5ZXIuCiAgICAvLyBTdWJhZ2VudFN0YXJ0IGhvb2sgaW5qZWN0cyBndWlkYW5jZSBkaXJlY3RpdmUgaW50byBzdWJhZ2VudCBjb250ZXh0LgogICAgLy8KICAgIC8vICM5MzEg4oCUIFRhc2tDcmVhdGUgUkVNSU5ERVIgYW5kIHRoZSBuYW1lc3BhY2UgaGludCBtb3ZlZCBoZXJlIGZyb20KICAgIC8vIHByb21wdC1yZW1pbmRlci4gVGhleSBvbmx5IG1hdHRlciB3aGVuIENsYXVkZSBpcyBhY3R1YWxseSBhYm91dCB0byBzcGF3bgogICAgLy8gYW4gQWdlbnQ7IGVtaXR0aW5nIHBlci1wcm9tcHQgY29zdCB+OTAgdG9rZW5zIMOXIGV2ZXJ5IHByb21wdCDDlyBldmVyeQogICAgLy8gY29uc3VtZXIuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKGNvbmZpZy50YXNrX2NyZWF0ZV9maXJzdCAmJiAhcy50YXNrc0NyZWF0ZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1JFTUlOREVSOiBVc2UgVGFza0NyZWF0ZSBiZWZvcmUgc3Bhd25pbmcgYWdlbnRzLlxuJyk7CiAgICB9CiAgICBpZiAoY29uZmlnLm1lbW9yeV9maXJzdCAmJiBzLm1lbW9yeVJlcXVpcmVkICYmICFzLm1lbW9yeVNlYXJjaGVkKSB7CiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdSRU1JTkRFUjogU2VhcmNoIG1lbW9yeSAobWNwX19tb2Zsb19fbWVtb3J5X3NlYXJjaCkgYmVmb3JlIHNwYXduaW5nIGFnZW50cy4gT24gY2h1bmsgaGl0cywgdHJhdmVyc2UgdmlhIG1jcF9fbW9mbG9fX21lbW9yeV9nZXRfbmVpZ2hib3JzIOKAlCBzZWUgLmNsYXVkZS9ndWlkYW5jZS9tb2Zsby1tZW1vcnktcHJvdG9jb2wubWRcbicpOwogICAgfQogICAgaWYgKHMubGFzdE5hbWVzcGFjZUhpbnQpIHsKICAgICAgLy8gUGVyLWFjdG9yIHNpbmdsZS1zaG90LiBFYWNoIHNlc3Npb25faWQgZ2V0cyB0aGUgaGludCBhdCBtb3N0IG9uY2UgcGVyCiAgICAgIC8vIHByb21wdCwgYnV0IHRoZSBoaW50IGl0c2VsZiBzdGF5cyBhdmFpbGFibGUgZm9yIG90aGVyIGFjdG9ycyAoZS5nLgogICAgICAvLyBhIHN1YmFnZW50IHRoYXQgc3Bhd25zIGl0cyBvd24gYWdlbnQgaGFzIGl0cyBvd24gc2Vzc2lvbl9pZCBhbmQgaXMKICAgICAgLy8gZW50aXRsZWQgdG8gYSBmcmVzaCBlbWlzc2lvbikuIEZhbGxzIGJhY2sgdG8gYSBgX2xlZ2FjeV9gIGJ1Y2tldCB3aGVuCiAgICAgIC8vIENsYXVkZSBDb2RlIGRpZG4ndCBmb3J3YXJkIGEgc2Vzc2lvbl9pZCAob2xkZXIgaG9zdCBvciBkaXJlY3QgQ0xJCiAgICAgIC8vIGludm9jYXRpb24pLCBwcmVzZXJ2aW5nIHRoZSBvbGQgImVtaXQgb25jZSBnbG9iYWxseSIgYmVoYXZpb3IuIFRoZQogICAgICAvLyBtYXAgaXMgd2lwZWQgYnkgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG9uIGV2ZXJ5IG5ldyBwcm9tcHQuCiAgICAgIHZhciBzaWQgPSBwcm9jZXNzLmVudi5IT09LX1NFU1NJT05fSUQgfHwgJyc7CiAgICAgIHZhciBlbWl0dGVkQnkgPSBzLmxhc3ROYW1lc3BhY2VIaW50RW1pdHRlZEJ5IHx8IHt9OwogICAgICB2YXIgYnVja2V0ID0gc2lkIHx8ICdfbGVnYWN5Xyc7CiAgICAgIGlmICghZW1pdHRlZEJ5W2J1Y2tldF0pIHsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzLmxhc3ROYW1lc3BhY2VIaW50ICsgJ1xuJyk7CiAgICAgICAgZW1pdHRlZEJ5W2J1Y2tldF0gPSB0cnVlOwogICAgICAgIHMubGFzdE5hbWVzcGFjZUhpbnRFbWl0dGVkQnkgPSBlbWl0dGVkQnk7CiAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgfQogICAgfQogICAgLy8gIzk1MiDigJQgd2hlbiAvZmwgd2FzIGludm9rZWQgd2l0aCAtcy8taCwgdGhlIHByb3RlY3RlZCBNQ1AgaW5pdCBtdXN0IHJ1bgogICAgLy8gQkVGT1JFIGFueSBBZ2VudCBzcGF3bi4gSGFyZCBibG9jazogdGhlIHVzZXIgZXhwbGljaXRseSBvcHRlZCBpbiB0bwogICAgLy8gbW9mbG8ncyBjb29yZGluYXRpb24gc3VyZmFjZSwgc28gc2lsZW50bHkgZGlzcGF0Y2hpbmcgYEFnZW50YCBjYWxscwogICAgLy8gd2l0aG91dCBgbWNwX19tb2Zsb19fc3dhcm1faW5pdGAgLyBgbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXRgIGlzIHRoZQogICAgLy8gZmFpbHVyZSBtb2RlIHRoaXMgZ2F0ZSBleGlzdHMgdG8gcHJldmVudCAoQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkCiAgICAvLyBmdW5jdGlvbmFsaXR5IOKAlCBzd2FybSArIGhpdmUtbWluZCIpLiBPdGhlciBBZ2VudCB1c2VzIHJlbWFpbiBhZHZpc29yeS4KICAgIGlmIChjb25maWcuc3dhcm1faW52b2NhdGlvbl9nYXRlKSB7CiAgICAgIGlmIChzLmZsTW9kZSA9PT0gJ3N3YXJtJyAmJiAhcy5zd2FybUluaXRpYWxpemVkKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IC9mbCB3YXMgaW52b2tlZCB3aXRoIC1zLy0tc3dhcm0gYnV0IG1jcF9fbW9mbG9fX3N3YXJtX2luaXQgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdSdW4gbWNwX19tb2Zsb19fc3dhcm1faW5pdCBmaXJzdCwgdGhlbiBtY3BfX21vZmxvX19hZ2VudF9zcGF3biBmb3IgZWFjaCByb2xlLCB0aGVuIGRpc3BhdGNoIEFnZW50LlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoQ09PUkRfRkFMTEJBQ0tfTk9URSArICcgIG5weCBmbG8gc3dhcm0gaW5pdCAtLXRvcG9sb2d5IGhpZXJhcmNoaWNhbCAgKHRoZW46IG5weCBmbG8gYWdlbnQgc3Bhd24gLS10eXBlIDxyb2xlPilcbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdTZWUgLmNsYXVkZS9za2lsbHMvZmwvZXhlY3V0aW9uLW1vZGVzLm1kICJTV0FSTSBtb2RlIiBhbmQgQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkIGZ1bmN0aW9uYWxpdHkiLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzd2FybV9pbnZvY2F0aW9uX2dhdGU6IGZhbHNlXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgICAgaWYgKHMuZmxNb2RlID09PSAnaGl2ZScgJiYgIXMuaGl2ZUluaXRpYWxpemVkKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IC9mbCB3YXMgaW52b2tlZCB3aXRoIC1oLy0taGl2ZSBidXQgbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgaGFzIG5vdCBiZWVuIGNhbGxlZC5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdSdW4gbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgZmlyc3QsIHRoZW4gZGlzcGF0Y2ggQWdlbnQgb3IgaGl2ZS1taW5kIHdvcmtlcnMuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShDT09SRF9GQUxMQkFDS19OT1RFICsgJyAgbnB4IGZsbyBoaXZlLW1pbmQgaW5pdCAgKHRoZW46IG5weCBmbG8gaGl2ZS1taW5kIHNwYXduKVxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1NlZSAuY2xhdWRlL3NraWxscy9mbC9leGVjdXRpb24tbW9kZXMubWQgIkhJVkUtTUlORCBtb2RlIiBhbmQgQ0xBVURFLm1kICLim5QgUHJvdGVjdGVkIGZ1bmN0aW9uYWxpdHkiLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzd2FybV9pbnZvY2F0aW9uX2dhdGU6IGZhbHNlXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtc3dhcm0taW5pdCc6IHsKICAgIC8vICM5NTIg4oCUIHdpcmVkIHRvIG1jcF9fbW9mbG9fX3N3YXJtX2luaXQgUG9zdFRvb2xVc2UuIE1hcmtzIHRoZSBnYXRlCiAgICAvLyBzYXRpc2ZpZWQgc28gc3Vic2VxdWVudCBBZ2VudCBzcGF3bnMgdW5kZXIgL2ZsIC1zIHBhc3MuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLnN3YXJtSW5pdGlhbGl6ZWQpIHsKICAgICAgcy5zd2FybUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtYmFzaC1zd2FybS1pbml0JzogewogICAgLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgQ0xJIGhhbGYgb2YgcmVjb3JkLXN3YXJtLWluaXQgLyByZWNvcmQtaGl2ZS1pbml0LgogICAgLy8gV2lyZWQgUG9zdFRvb2xVc2VbQmFzaHxQb3dlclNoZWxsXSwgc28gaXQgb25seSBzZWVzIGNvbW1hbmRzIHRoYXQKICAgIC8vIHN1Y2NlZWRlZCAoIzEzMjIpLiBTZWUgYmFzaENvb3JkaW5hdGlvbkluaXQgZm9yIHdoeSB0aGUgQ0xJIHJvdXRlIGlzIGEKICAgIC8vIHJlYWwgc2F0aXNmYWN0aW9uIG9mIHRoZSAjOTUyIGdhdGUgYW5kIG5vdCBhIHN0YW5kLWluLgogICAgdmFyIGtpbmQgPSBiYXNoQ29vcmRpbmF0aW9uSW5pdChwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJycpOwogICAgaWYgKCFraW5kKSBicmVhazsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgZmxhZyA9IGtpbmQgPT09ICdzd2FybScgPyAnc3dhcm1Jbml0aWFsaXplZCcgOiAnaGl2ZUluaXRpYWxpemVkJzsKICAgIGlmICghc1tmbGFnXSkgewogICAgICBzW2ZsYWddID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtaGl2ZS1pbml0JzogewogICAgLy8gIzk1MiDigJQgd2lyZWQgdG8gbWNwX19tb2Zsb19faGl2ZS1taW5kX2luaXQgUG9zdFRvb2xVc2UuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLmhpdmVJbml0aWFsaXplZCkgewogICAgICBzLmhpdmVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHdyaXRlU3RhdGUocyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLXNjYW4nOiB7CiAgICBpZiAoIWNvbmZpZy5tZW1vcnlfZmlyc3QpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy5tZW1vcnlSZXF1aXJlZCB8fCBpc01lbW9yeVNlYXJjaGVkRm9yKHMpKSBicmVhazsKICAgIHZhciB0YXJnZXQgPSAocHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9wYXR0ZXJuIHx8ICcnKSArICcgJyArIChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdGggfHwgJycpOwogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdGgpKSBicmVhazsKICAgIGlmIChFWEVNUFQuc29tZShmdW5jdGlvbihwKSB7IHJldHVybiB0YXJnZXQuaW5kZXhPZihwKSA+PSAwOyB9KSkgYnJlYWs7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRCBbbW9mbG8gbWVtb3J5X2ZpcnN0IGdhdGVdOiBTZWFyY2ggbWVtb3J5IGJlZm9yZSBleHBsb3JpbmcgZmlsZXMuIFVzZSBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoLiBPbiBjaHVuayBoaXRzLCB0cmF2ZXJzZSB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X2dldF9uZWlnaGJvcnMg4oCUIHNlZSAuY2xhdWRlL2d1aWRhbmNlL21vZmxvLW1lbW9yeS1wcm90b2NvbC5tZFxuJyArIE1DUF9GQUxMQkFDS19OT1RFICsgJ1xuJyArIEdBVEVfT1JJR0lOX05PVEUgKyAnXG4nICsgR0FURV9ESVNBQkxFX05PVEUgKyAnXG4nKTsKICAgIHByb2Nlc3MuZXhpdCgyKTsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLXJlYWQnOiB7CiAgICBpZiAoIWNvbmZpZy5tZW1vcnlfZmlyc3QpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy5tZW1vcnlSZXF1aXJlZCB8fCBpc01lbW9yeVNlYXJjaGVkRm9yKHMpKSBicmVhazsKICAgIHZhciBmcCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfZmlsZV9wYXRoIHx8ICcnOwogICAgLy8gRXBoZW1lcmFsIHRtcC9zY3JhdGNoIHJlYWRzIGFyZSBleGVtcHQgZXZlbiB3aGVuIHRoZXkgbG9vayBsaWtlIGd1aWRhbmNlCiAgICAvLyAoYSB0ZW1wIGNvcHkgaXMgc3RpbGwgdHJhbnNpZW50IHRvb2wgSS9PLCBub3QgdGhlIGluZGV4ZWQgc291cmNlKS4KICAgIGlmIChpc0VwaGVtZXJhbFBhdGgoZnApKSBicmVhazsKICAgIHZhciBpc0d1aWRhbmNlID0gZnAuaW5kZXhPZignLmNsYXVkZS9ndWlkYW5jZS8nKSA+PSAwIHx8IGZwLmluZGV4T2YoJy5jbGF1ZGVcXGd1aWRhbmNlXFwnKSA+PSAwOwogICAgaWYgKCFpc0d1aWRhbmNlICYmIEVYRU1QVC5zb21lKGZ1bmN0aW9uKHApIHsgcmV0dXJuIGZwLmluZGV4T2YocCkgPj0gMDsgfSkpIGJyZWFrOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQgW21vZmxvIG1lbW9yeV9maXJzdCBnYXRlXTogU2VhcmNoIG1lbW9yeSBiZWZvcmUgcmVhZGluZyBmaWxlcy4gVXNlIG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2guIE9uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsgR0FURV9PUklHSU5fTk9URSArICdcbicgKyBHQVRFX0RJU0FCTEVfTk9URSArICdcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdyZWNvcmQtdGFzay1jcmVhdGVkJzogewogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIHMudGFza3NDcmVhdGVkID0gdHJ1ZTsKICAgIHMudGFza0NvdW50ID0gKHMudGFza0NvdW50IHx8IDApICsgMTsKICAgIHdyaXRlU3RhdGUocyk7CiAgICBicmVhazsKICB9CiAgLy8gIzE0MzUg4oCUIHRoZSBlc2NhcGUgZnJvbSB0aGUgdGFzay1zdGF0dXMgZ2F0ZSwgZm9yIHdvcmsgZGVsaWJlcmF0ZWx5IGxlZnQKICAvLyBvcGVuLiBTZXNzaW9uLXNjb3BlZCBsaWtlIGBsZWFybmluZ3NTdG9yZWRgOiBpdCBsaXZlcyBpbiBTVEFURV9ERUZBVUxUUywgc28KICAvLyBzZXNzaW9uLXJlc2V0IGNsZWFycyBpdCwgYW5kIG5laXRoZXIgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG5vcgogIC8vIHJlc2V0LWVkaXQtZ2F0ZXMgdG91Y2hlcyBpdCDigJQgYSBkZWNpc2lvbiB0aGUgdXNlciBtYWRlIGFib3V0IHRoZSB0YXNrIGxpc3QKICAvLyBpcyBub3QgaW52YWxpZGF0ZWQgYnkgdGhlIG5leHQgcHJvbXB0IG9yIHRoZSBuZXh0IHNvdXJjZSBlZGl0LgogIC8vCiAgLy8gQSBwbGFpbiBmbGFnLCBub3QgYSBjb3VudC4gVGhlIGNvbW1hbmQgaXMgdHlwZWQgYnkgdGhlIG1vZGVsIGludG8gYSBCYXNoCiAgLy8gdG9vbCwgd2hlcmUgSE9PS19UUkFOU0NSSVBUX1BBVEggaXMgdW5zZXQgKGl0IGlzIGZvcndhcmRlZCBieSBnYXRlLWhvb2subWpzCiAgLy8gZnJvbSB0aGUgaG9vayBwYXlsb2FkIGFuZCBleGlzdHMgb25seSBpbnNpZGUgYSBob29rKSwgc28gdGhpcyBwcm9jZXNzIGNhbm5vdAogIC8vIHJlYWQgdGhlIGxlZGdlciB0byByZWNvcmQgV0hJQ0ggdGFza3Mgd2VyZSBhY2tub3dsZWRnZWQgZXZlbiBpZiBpdCB3YW50ZWQgdG8uCiAgY2FzZSAncmVjb3JkLXRhc2tzLWFja25vd2xlZGdlZCc6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMudGFza3NBY2tub3dsZWRnZWQpIHsKICAgICAgcy50YXNrc0Fja25vd2xlZGdlZCA9IHRydWU7CiAgICAgIHdyaXRlU3RhdGUocyk7CiAgICB9CiAgICAvLyB3cml0ZVN0YXRlIHN3YWxsb3dzIGl0cyBvd24gZXJyb3JzIGJ5IGRlc2lnbiDigJQgYSBnYXRlIG11c3QgbmV2ZXIgY3Jhc2ggdGhlCiAgICAvLyBob29rIGl0IHJ1bnMgaW4uIFRoYXQgd2FzIGhhcm1sZXNzIHdoaWxlIGV2ZXJ5IHJlY29yZGVyIHdhcyBhZHZpc29yeS4gVGhpcwogICAgLy8gb25lIGlzIHRoZSBPTkxZIGVzY2FwZSBmcm9tIGEgQkxPQ0tJTkcgZ2F0ZSwgc28gYSBsb3N0IHdyaXRlIHdvdWxkIHJlcG9ydAogICAgLy8gInNhdGlzZmllZCIgYW5kIHRoZW4gYmxvY2sgdGhlIHZlcnkgbmV4dCBgZ2ggcHIgY3JlYXRlYCB3aXRoIG5vdGhpbmcgc2FpZAogICAgLy8gYWJvdXQgd2h5OiAjMTMzMidzIGRlYWRsb2NrIHNoYXBlIGV4YWN0bHkuIENvbmZpcm0gaXQgbGFuZGVkIGJlZm9yZQogICAgLy8gY2xhaW1pbmcgaXQgZGlkLCBhbmQgbmFtZSB0aGUgZmlsZSBhbmQgdGhlIHdheSBvdXQgd2hlbiBpdCBkaWQgbm90LgogICAgaWYgKCFyZWFkU3RhdGUoKS50YXNrc0Fja25vd2xlZGdlZCkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAnVGFzay1zdGF0dXMgZ2F0ZSBOT1Qgc2F0aXNmaWVkOiB0aGUgYWNrbm93bGVkZ2VtZW50IGNvdWxkIG5vdCBiZSBwZXJzaXN0ZWQgdG9cbicgKwogICAgICAgIFNUQVRFX0ZJTEUgKyAnXG4nICsKICAgICAgICAnQ2hlY2sgdGhhdCB0aGUgZmlsZSBhbmQgaXRzIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUsIHRoZW4gcnVuIHRoaXMgYWdhaW4uXG4nICsKICAgICAgICAnVG8gcHJvY2VlZCB3aXRob3V0IGl0OiBzZXQgZ2F0ZXM6IHRhc2tfc3RhdHVzX2dhdGU6IG9mZiBpbiBtb2Zsby55YW1sLlxuJyk7CiAgICAgIHByb2Nlc3MuZXhpdCgxKTsKICAgIH0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKAogICAgICAnVGFzay1zdGF0dXMgZ2F0ZSBzYXRpc2ZpZWQ6IG9wZW4gdGFza3MgYWNrbm93bGVkZ2VkIGFzIGRlbGliZXJhdGVseSBkZWZlcnJlZC5cbicgKwogICAgICAnVGhleSBzdGF5IHZpc2libGUgaW4gdGhlIHRhc2sgbGlzdCDigJQgdGhpcyByZWNvcmRzIHRoZSBkZWNpc2lvbiwgaXQgZG9lcyBub3QgY2xvc2UgdGhlbS5cbicpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1tZW1vcnktc2VhcmNoZWQnOiB7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKG1hcmtNZW1vcnlTZWFyY2hlZChzKSkgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iYXNoLW1lbW9yeSc6IHsKICAgIC8vICMxMTMyIOKAlCBwcmVzZXJ2ZSBDUkVESVQgc2lkZS1lZmZlY3QgQU5EIGFkZCBhIEJMT0NLIGFybSBmb3IgcmVhZC1saWtlCiAgICAvLyBCYXNoIGNvbW1hbmRzLiBXaXJlZCBhcyBQcmVUb29sVXNlW0Jhc2hdICh3YXMgUG9zdFRvb2xVc2UgYmVmb3JlICMxMTMyKQogICAgLy8gc28gcHJvY2Vzcy5leGl0KDIpIGFjdHVhbGx5IHByZXZlbnRzIHRoZSByZWFkIGZyb20gcmVhY2hpbmcgdGhlIHNoZWxsLgogICAgLy8KICAgIC8vICMxMTcxIOKAlCB0aGUgY2FzZSBuYW1lIGlzIGhpc3RvcmljYWwuIFRoZSBtYXRjaGVyIG5vdyBhbHNvIGNvdmVycyB0aGUKICAgIC8vIGRlZGljYXRlZCBgUG93ZXJTaGVsbGAgdG9vbCwgYW5kIFJFQURfTElLRV9CQVNIX1JFIGFscmVhZHkgbWF0Y2hlZCBQUwogICAgLy8gcmVhZGVycyAoR2V0LUNvbnRlbnQvU2VsZWN0LVN0cmluZy9HZXQtQ2hpbGRJdGVtIC1SZWN1cnNlL0Zvcm1hdC1IZXgpLgogICAgLy8gVHJlYXQgdGhpcyBjYXNlIGFzIHNoZWxsLWFnbm9zdGljIHJlYWQtZ2F0ZSBsb2dpYy4KICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CgogICAgLy8gMSkgQ1JFRElUIOKAlCBwcmVzZXJ2ZWQgYmVoYXZpb3IuIEEgcmVhbCBtZW1vcnktc2VhcmNoIGludm9jYXRpb24gZmxpcHMKICAgIC8vIHRoZSBnYXRlIGZsYWcgc28gc3Vic2VxdWVudCBSZWFkL0dyZXAvR2xvYiB3aXRoaW4gdGhpcyBwcm9tcHQgcGFzcy4KICAgIGlmIChjcmVkaXRzTWVtb3J5U2VhcmNoKGNtZCkpIHsKICAgICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgICAgaWYgKG1hcmtNZW1vcnlTZWFyY2hlZChzKSkgd3JpdGVTdGF0ZShzKTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgLy8gMikgQkxPQ0sg4oCUIG5ldyBiZWhhdmlvci4gQ2hlYXAgcmVnZXggY2hlY2tzIGNvbWUgQkVGT1JFIHJlYWRTdGF0ZSgpIHNvCiAgICAvLyB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIEJhc2ggaW52b2NhdGlvbnMgKGdpdC9ucG0vY3VybC9lY2hvL2V0Yy4pCiAgICAvLyBuZXZlciB0b3VjaCB0aGUgZmlsZXN5c3RlbS4gT3JkZXI6IGNvbmZpZyBmbGFnIOKGkiBjb21tYW5kLXNoYXBlIHJlZ2V4ZXMKICAgIC8vIOKGkiBzdGF0ZSByZWFkIOKGkiBtZW1vcnkgZ2F0ZS4KICAgIGlmICghY29uZmlnLm1lbW9yeV9maXJzdCkgYnJlYWs7CiAgICBpZiAoIVJFQURfTElLRV9CQVNIX1JFLnRlc3QoY21kKSkgYnJlYWs7CiAgICAvLyAjMTQ0NSDigJQgdGhlIGNhcnZlLW91dCBpcyBhbmNob3JlZCB0byB0aGUgTEVBRElORyBjb21tYW5kLCBzbyBpdHMgYG5vZGVgCiAgICAvLyBhbmQgYGdpdGAgYXJtcyBzd2FsbG93IGV2ZXJ5IHNoYXBlIFJVTk5FUl9SRUFEX1NPVVJDRVMgZXhpc3RzIHRvIGNhdGNoLgogICAgLy8gVGhvc2Ugc2hhcGVzIGVhcm4gdGhlaXIgcmVhZCBjbGFzc2lmaWNhdGlvbiBmcm9tIHdoYXQgZm9sbG93cyB0aGUgbGVhZGluZwogICAgLy8gdG9rZW4sIHNvIHRoZXkgb3ZlcnJpZGUgdGhlIGNhcnZlLW91dDsgZXZlcnkgb3RoZXIgY29tbWFuZCBrZWVwcyAjMTEzMidzCiAgICAvLyBzZW1hbnRpY3MgZXhhY3RseSAoYG5wbSB0ZXN0IHwgZ3JlcCBGQUlMYCwgYGdpdCBkaWZmYCwgYG5vZGUgYnVpbGQubWpzYCkuCiAgICBpZiAoQkFTSF9DQVJWRV9PVVRfUkUudGVzdChjbWQpICYmICFSVU5ORVJfUkVBRF9CQVNIX1JFLnRlc3QoY21kKSkgYnJlYWs7CiAgICB2YXIgczIgPSByZWFkU3RhdGUoKTsKICAgIGlmICghczIubWVtb3J5UmVxdWlyZWQgfHwgaXNNZW1vcnlTZWFyY2hlZEZvcihzMikpIGJyZWFrOwogICAgLy8gSGludCBwcmVjZWRlbmNlOiBwcm9tcHQtZGVyaXZlZCBjbGFzc2lmaWNhdGlvbiAoc2V0IGJ5IGFwcGx5UHJvbXB0U3RhdGVSZXNldAogICAgLy8gZnJvbSB0aGUgdXNlciBwcm9tcHQgdGV4dCkg4oaSIGNvbW1hbmQtc2hhcGUgY2xhc3NpZmljYXRpb24gKHdvcmtzIGZvcgogICAgLy8gc3ViYWdlbnRzIHRoYXQgbmV2ZXIgc2F3IHRoZSB1c2VyIHByb21wdCkuIEVpdGhlciBzb3VyY2UgcmV0dXJucyBhIGZ1bGwKICAgIC8vICJNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IC4uLiIgc2VudGVuY2Ugc28gdGhlIEJMT0NLIG1lc3NhZ2Ugc3RheXMgdW5pZm9ybS4KICAgIHZhciBoaW50ID0gczIubGFzdE5hbWVzcGFjZUhpbnQgfHwgY2xhc3NpZnlCYXNoTmFtZXNwYWNlSGludChjbWQpIHx8ICcnOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICdCTE9DS0VEIFttb2ZsbyBtZW1vcnlfZmlyc3QgZ2F0ZV06IFNlYXJjaCBtZW1vcnkgYmVmb3JlIHJlYWRpbmcgZmlsZXMgdmlhIEJhc2guXG4nICsKICAgICAgJ0V4YW1wbGU6IG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2ggeyBxdWVyeTogIjx0b3BpYz4iLCBuYW1lc3BhY2U6ICI8b25lIG9mOiBndWlkYW5jZSB8IGNvZGUtbWFwIHwgcGF0dGVybnMgfCBsZWFybmluZ3MgfCB0ZXN0cz4iIH1cbicgKwogICAgICAoaGludCA/IGhpbnQgKyAnXG4nIDogJycpICsKICAgICAgJ09uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsKICAgICAgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsKICAgICAgR0FURV9PUklHSU5fTk9URSArICdcbicgKwogICAgICBHQVRFX0RJU0FCTEVfTk9URSArICdcbicKICAgICk7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stdGFzay10cmFuc2l0aW9uJzogewogICAgLy8gSW50ZW50aW9uYWwgbm8tb3AsIHJldGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5ICgjMTMzMSkuCiAgICAvLyBUaGUgYF5UYXNrVXBkYXRlJGAgd2lyaW5nIHdhcyByZW1vdmVkIGZyb20gc2V0dGluZ3MtZ2VuZXJhdG9yLnRzLAogICAgLy8gaG9vay1ibG9jay1oYXNoLnRzIGFuZCBob29rLXdpcmluZy50cyBiZWNhdXNlIHNwYXduaW5nIGdhdGUtaG9vay5tanMgKwogICAgLy8gZ2F0ZS5janMgb24gZXZlcnkgVGFza1VwZGF0ZSB0byBkbyBub3RoaW5nIGlzIHB1cmUgb3ZlcmhlYWQuIFRoZSBjYXNlCiAgICAvLyBzdGF5cyBiZWNhdXNlIGRvY3Rvci1jaGVja3MtZGVlcC50cyBsaXN0cyBpdCBpbiBSRVFVSVJFRF9HQVRFX0NBU0VTIOKAlAogICAgLy8gZHJvcHBpbmcgdGhlIGNhc2Ugd291bGQgdHVybiBgZmxvIGRvY3RvcmAncyBHYXRlIEhlYWx0aCBjaGVjayByZWQgaW4KICAgIC8vIGV2ZXJ5IGNvbnN1bWVyIGZvciBubyBnYWluLiAoRmFsbGluZyB0aHJvdWdoIHRvIGBkZWZhdWx0OiBicmVha2Agd291bGQKICAgIC8vIG90aGVyd2lzZSBiZSBoYXJtbGVzczsgdGhpcyBpcyBhYm91dCB0aGUgZG9jdG9yIGNvbnRyYWN0LCBub3QgcnVudGltZS4pCiAgICAvLyBXaHkgaXQgZG9lcyBub3RoaW5nOiBzZWUgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KCkuCiAgICBicmVhazsKICB9CiAgLy8gIzE0MzQg4oCUIHRoZSBnYXRlIGRlbWFuZGVkIG9uZSBtZW1vcnlfc3RvcmUgcGVyIHJ1biB3aGV0aGVyIG9yIG5vdCB0aGUgcnVuCiAgLy8gcHJvZHVjZWQgYSByZXVzYWJsZSBsZXNzb24sIGFuZCBhIG1hbmRhdG9yeSB3cml0ZSB3aXRoIG5vdGhpbmcgdG8gc2F5CiAgLy8gcHJvZHVjZXMgZmlsbGVyOiBhIHN1bW1hcnkgb2YgdGhpcyB0aWNrZXQsIHRoaXMgY29tbWl0LCBhcHBsaWNhYmxlIG5ldmVyCiAgLy8gYWdhaW4uIG1lbW9yeV9zZWFyY2ggcmV0dXJucyBhIGJvdW5kZWQgc2V0LCBzbyBlYWNoIG9mIHRob3NlIGRpc3BsYWNlcyBhCiAgLy8gcmVhbCBsZXNzb24gZnJvbSBldmVyeSBmdXR1cmUgc2VhcmNoIOKAlCB0aGUgY29zdCBpcyByZXRyaWV2YWwgcXVhbGl0eSwgbm90CiAgLy8gZGlzay4gRGVjbGFyaW5nICJub3RoaW5nIGR1cmFibGUgaGVyZSIgaXMgdGhlIGhvbmVzdCBvdXRjb21lIG9mIGEgcnVuIHRoYXQKICAvLyBsZWFybmVkIG5vdGhpbmcgbmV3LCBzbyBpdCBoYXMgdG8gYmUgcmVhY2hhYmxlIHdpdGhvdXQgYSB3cml0ZTsgb3RoZXJ3aXNlCiAgLy8gdGhlIGNoZWFwZXN0IHdheSBwYXN0IHRoZSBnYXRlIHN0YXlzIHRoZSBmaWxsZXIgd3JpdGUuCiAgLy8KICAvLyBCb3RoIGNyZWRpdHMgc2V0IHRoZSBzYW1lIGZsYWc7IHRoZXkgZGlmZmVyIG9ubHkgaW4gd2hldGhlciB0aGUgcnVuIGhhcwogIC8vIHNvbWV0aGluZyB0byBzYXkuIFNoYXJpbmcgdGhlIGNhc2UgYm9keSBrZWVwcyB0aGF0IHNpbmdsZSB3cml0ZSBpbiBvbmUKICAvLyBwbGFjZSBhY3Jvc3MgYWxsIHRocmVlIGNvcGllcyBvZiB0aGlzIGZpbGUuCiAgY2FzZSAncmVjb3JkLWxlYXJuaW5ncy1zdG9yZWQnOgogIGNhc2UgJ3JlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMubGVhcm5pbmdzU3RvcmVkKSB7CiAgICAgIHMubGVhcm5pbmdzU3RvcmVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGlmIChjb21tYW5kID09PSAncmVjb3JkLW5vLWR1cmFibGUtbGVzc29uJykgewogICAgICAvLyBTYW1lIHJlYXNvbmluZyBhcyByZWNvcmQtdGFza3MtYWNrbm93bGVkZ2VkIGFib3ZlOiB3cml0ZVN0YXRlIHN3YWxsb3dzCiAgICAgIC8vIGl0cyBvd24gZXJyb3JzIHNvIGEgZ2F0ZSBuZXZlciBjcmFzaGVzIHRoZSBob29rIGl0IHJ1bnMgaW4sIGFuZCB0aGlzIGlzCiAgICAgIC8vIHRoZSBPTkxZIGVzY2FwZSBmcm9tIHRoZSBCTE9DS0lORyBsZWFybmluZ3MgZ2F0ZSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgYQogICAgICAvLyBtZW1vcnlfc3RvcmUuIEEgbG9zdCB3cml0ZSBoZXJlIHdvdWxkIHByaW50ICJzYXRpc2ZpZWQiIGFuZCB0aGVuIGJsb2NrCiAgICAgIC8vIHRoZSBuZXh0IGBnaCBwciBjcmVhdGVgIHdpdGggbm90aGluZyBzYWlkIGFib3V0IHdoeSDigJQgIzEzMzIncyBkZWFkbG9jay4KICAgICAgLy8gVmVyaWZpZWQgb25seSBvbiB0aGlzIGFybTogcmVjb3JkLWxlYXJuaW5ncy1zdG9yZWQgaXMgZmlyZWQKICAgICAgLy8gYXV0b21hdGljYWxseSBieSB0aGUgUG9zdFRvb2xVc2UgaG9vayBvbiBldmVyeSBtZW1vcnlfc3RvcmUsIHdoZXJlIGEKICAgICAgLy8gZmFpbGVkIHdyaXRlIGxlYXZlcyB0aGUgZ2F0ZSBjbG9zZWQgYnV0IHRoZSBydW4gc3RpbGwgaGFzIHRoZSBvcmRpbmFyeQogICAgICAvLyB3YXkgdGhyb3VnaCwgYW5kIGEgZGlhZ25vc3RpYyBvbiBldmVyeSBzdG9yZSB3b3VsZCBiZSBub2lzZS4KICAgICAgaWYgKCFyZWFkU3RhdGUoKS5sZWFybmluZ3NTdG9yZWQpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICdMZWFybmluZ3MgZ2F0ZSBOT1Qgc2F0aXNmaWVkOiB0aGUgZGVjbGFyYXRpb24gY291bGQgbm90IGJlIHBlcnNpc3RlZCB0b1xuJyArCiAgICAgICAgICBTVEFURV9GSUxFICsgJ1xuJyArCiAgICAgICAgICAnQ2hlY2sgdGhhdCB0aGUgZmlsZSBhbmQgaXRzIGRpcmVjdG9yeSBhcmUgd3JpdGFibGUsIHRoZW4gcnVuIHRoaXMgYWdhaW4uXG4nICsKICAgICAgICAgICdUbyBwcm9jZWVkIHdpdGhvdXQgaXQ6IHNldCBnYXRlczogbGVhcm5pbmdzX2dhdGU6IGZhbHNlIGluIG1vZmxvLnlhbWwuXG4nKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgICAgIH0KICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoCiAgICAgICAgJ0xlYXJuaW5ncyBnYXRlIHNhdGlzZmllZDogbm8gZHVyYWJsZSBsZXNzb24gZGVjbGFyZWQgZm9yIHRoaXMgcnVuLlxuJyArCiAgICAgICAgJ1doYXQgdGhpcyBydW4gZGlkIGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksIG5vdCBpbiBtZW1vcnkuXG4nLAogICAgICApOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC10ZXN0LXJ1bic6IHsKICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICBpZiAoVEVTVF9SVU5ORVJfUkUudGVzdChjbWQpKSB7CiAgICAgIC8vICMxMzIyIOKAlCBhIHJlZCBydW4gaXMgZXZpZGVuY2UgQUdBSU5TVCB0aGUgZ2F0ZSwgc28gaXQgYWxzbyBjbGVhcnMgYQogICAgICAvLyBmbGFnIGFuIGVhcmxpZXIgZ3JlZW4gcnVuIGVhcm5lZC4gV2l0aG91dCB0aGUgcmVzZXQsIGBucG0gdGVzdGAgKGdyZWVuKQogICAgICAvLyBmb2xsb3dlZCBieSBhbiBlZGl0IGFuZCBgbnBtIHRlc3QgfCB0YWlsIC0yMGAgKHJlZCkgd291bGQgbGVhdmUgdGhlCiAgICAgIC8vIGdhdGUgc2F0aXNmaWVkIGJ5IHRoZSBzdGFsZSBmaXJzdCBydW4g4oCUIHRoZSBlZGl0IHJlc2V0cyB0ZXN0c1J1biwgYnV0CiAgICAgIC8vIHRoZSBtYXNrZWQgcmVkIHJ1biB3b3VsZCBpbW1lZGlhdGVseSBzZXQgaXQgYmFjay4KICAgICAgdmFyIGZhaWx1cmUgPSBkZXRlY3RUZXN0RmFpbHVyZSgpOwogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICBpZiAoZmFpbHVyZSkgewogICAgICAgIGlmIChzLnRlc3RzUnVuKSB7IHMudGVzdHNSdW4gPSBmYWxzZTsgcy50ZXN0c0ZpbmdlcnByaW50ID0gbnVsbDsgd3JpdGVTdGF0ZShzKTsgfQogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdGVzdC1ydW4gbm90IGNyZWRpdGVkIOKAlCAnICsgZmFpbHVyZSArICdcbicpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFJlLXN0YW1wIG9uIGV2ZXJ5IGdyZWVuIHJ1biwgbm90IG9ubHkgdGhlIGZpcnN0OiB0aGUgdHJlZSBtYXkgaGF2ZQogICAgICAgIC8vIG1vdmVkIHNpbmNlIHRoZSBsYXN0IG9uZSwgYW5kIHRoaXMgcnVuIGlzIGV2aWRlbmNlIGFib3V0IHRoZSB0cmVlIGFzCiAgICAgICAgLy8gaXQgaXMgTk9XLiBHYXRpbmcgb24gYCFzLnRlc3RzUnVuYCB3b3VsZCBrZWVwIHRoZSBvbGRlciBmaW5nZXJwcmludAogICAgICAgIC8vIGFuZCBkaXNjYXJkIHRoZSBmcmVzaGVyIGV2aWRlbmNlLgogICAgICAgIHZhciB0ZXN0c0ZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ2FsbCcpOwogICAgICAgIGlmICghcy50ZXN0c1J1biB8fCBzLnRlc3RzRmluZ2VycHJpbnQgIT09IHRlc3RzRnApIHsKICAgICAgICAgIHMudGVzdHNSdW4gPSB0cnVlOwogICAgICAgICAgcy50ZXN0c0ZpbmdlcnByaW50ID0gdGVzdHNGcDsKICAgICAgICAgIHdyaXRlU3RhdGUocyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGNtZCkgewogICAgICAvLyAjMTE3NiDigJQgZW1pdCBhIHN0ZGVyciBjcnVtYiB3aGVuIGludm9rZWQgd2l0aCBhIG5vbi1lbXB0eSBjb21tYW5kIHRoYXQKICAgICAgLy8gZG9lc24ndCBtYXRjaCB0aGUgdGVzdC1ydW5uZXIgcGF0dGVybi4gQ29tbW9uIHBpdGZhbGw6IHVzZXJzIHJ1biB0aGUKICAgICAgLy8gc3RhbXAgbWFudWFsbHkgZnJvbSBhIHRlcm1pbmFsIHRvICJzYXRpc2Z5IHRoZSBnYXRlIjsgdGhlIHNpbGVudCBuby1vcAogICAgICAvLyBsb29rcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHN1Y2Nlc3MuIGdhdGUtaG9vay5tanMgZHJvcHMgc3RkZXJyIGZyb20KICAgICAgLy8gZXhpdC0wIGludm9jYXRpb25zLCBzbyB0aGlzIG9ubHkgc3VyZmFjZXMgdG8gZGlyZWN0IENMSSB1c2Ug4oCUIGV4YWN0bHkKICAgICAgLy8gdGhlIGNhc2Ugd2hlcmUgdGhlIGZyaWN0aW9uIGxpdmVzLgogICAgICB2YXIgcHJldmlldyA9IGNtZC5sZW5ndGggPiA4MCA/IGNtZC5zbGljZSgwLCA3NykgKyAnLi4uJyA6IGNtZDsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC10ZXN0LXJ1biBuby1vcCDigJQgVE9PTF9JTlBVVF9jb21tYW5kPSInICsgcHJldmlldyArICciIGRpZCBub3QgbWF0Y2ggVEVTVF9SVU5ORVJfUkVcbicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1za2lsbC1ydW4nOiB7CiAgICB2YXIgc2tOYW1lID0gKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfc2tpbGwgfHwgJycpOwogICAgaWYgKHNrTmFtZSA9PT0gJ3NpbXBsaWZ5JyB8fCBza05hbWUgPT09ICdmbG8tc2ltcGxpZnknIHx8IHNrTmFtZSA9PT0gJ2Rpc3RpbGwnKSB7CiAgICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7CiAgICAgIGlmICghcy5zaW1wbGlmeVJ1bikgeyBzLnNpbXBsaWZ5UnVuID0gdHJ1ZTsgY2hhbmdlZCA9IHRydWU7IH0KICAgICAgLy8gJ25vbnRlc3QnIHNjb3BlOiBhIGxhdGVyIHRlc3Qtb25seSBlZGl0IG11c3Qgbm90IGludmFsaWRhdGUgdGhpcyByZXZpZXcKICAgICAgLy8gKCM5MDgpLCBzbyB0ZXN0IGZpbGVzIGFyZSBleGNsdWRlZCBmcm9tIHdoYXQgdGhlIGNyZWRpdCBpcyBwaW5uZWQgdG8uCiAgICAgIHZhciBzaW1wbGlmeUZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ25vbnRlc3QnKTsKICAgICAgaWYgKHMuc2ltcGxpZnlGaW5nZXJwcmludCAhPT0gc2ltcGxpZnlGcCkgeyBzLnNpbXBsaWZ5RmluZ2VycHJpbnQgPSBzaW1wbGlmeUZwOyBjaGFuZ2VkID0gdHJ1ZTsgfQogICAgICAvLyBTbmFwc2hvdCBIRUFEIHNvIGNoZWNrLWJlZm9yZS1wciBjYW4gY2xhc3NpZnkgZGVsdGEtc2luY2Utc2ltcGxpZnkgYW5kCiAgICAgIC8vIHNraXAgYSByZWR1bmRhbnQgL3NpbXBsaWZ5IHJlLXJ1biB3aGVuIG9ubHkgdHJpdmlhbCBmaXhlcyBmb2xsb3dlZC4KICAgICAgLy8gTm9uLWZhdGFsIOKAlCBnYXRlIGZhbGxzIHRocm91Z2ggdG8gY3VycmVudCBiZWhhdmlvdXIgd2l0aG91dCB0aGUgc25hcHNob3QuCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHNoYSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnSEVBRCddLCB7CiAgICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXQogICAgICAgIH0pLnRyaW0oKTsKICAgICAgICBpZiAoc2hhICYmIHMuc2ltcGxpZnlTbmFwc2hvdFNoYSAhPT0gc2hhKSB7IHMuc2ltcGxpZnlTbmFwc2hvdFNoYSA9IHNoYTsgY2hhbmdlZCA9IHRydWU7IH0KICAgICAgfSBjYXRjaCAoZSkgeyAvKiBubyBnaXQgb3IgZGV0YWNoZWQgc3RhdGUg4oCUIHNraXAgc25hcHNob3QsIGdhdGUgc3RpbGwgd29ya3MgKi8gfQogICAgICBpZiAoY2hhbmdlZCkgd3JpdGVTdGF0ZShzKTsKICAgIH0gZWxzZSBpZiAoc2tOYW1lKSB7CiAgICAgIC8vICMxMTc2IOKAlCBzYW1lIHJhdGlvbmFsZSBhcyByZWNvcmQtdGVzdC1ydW4uIEEgbm8tb3Agc3RhbXAgb24gYSBub24tc2ltcGxpZnkKICAgICAgLy8gc2tpbGwgbmFtZSBpcyBzaWxlbnQgdG8gaG9va3MgKGdhdGUtaG9vay5tanMgZHJvcHMgZXhpdC0wIHN0ZGVycikgYnV0CiAgICAgIC8vIHZpc2libGUgd2hlbiBhIHVzZXIgcnVucyB0aGUgc3RhbXAgZGlyZWN0bHkgdG8gInNhdGlzZnkgdGhlIGdhdGUiIGFuZAogICAgICAvLyB3b25kZXJzIHdoeSBzaW1wbGlmeVJ1biBzdGF5cyBmYWxzZS4KICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC1za2lsbC1ydW4gbm8tb3Ag4oCUIFRPT0xfSU5QVVRfc2tpbGw9IicgKyBza05hbWUgKyAnIiBpcyBub3Qgc2ltcGxpZnkvZmxvLXNpbXBsaWZ5XG4nKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtdmVyaWZ5LXJ1bic6IHsKICAgIC8vIFN0b3J5ICMxMjc0IChFcGljICMxMjY5KS4gRmlyZXMgUG9zdFRvb2xVc2Ugb24gXlNraWxsJCB3aGVuIHRoZSBuYXRpdmUKICAgIC8vIC92ZXJpZnkgc2tpbGwgcnVucywgc2F0aXNmeWluZyB0aGUgdmVyaWZ5LWJlZm9yZS1kb25lIGdhdGUuIE1pcnJvcnMKICAgIC8vIHJlY29yZC1za2lsbC1ydW4ncyBmYXVsdC10b2xlcmFudCBzaGFwZS4gVGhlIHZlcmlmaWNhdGlvbiBPVVRDT01FICh3aGF0CiAgICAvLyB3YXMgY2hlY2tlZCwgcGFzcy9mYWlsKSBpcyB3cml0dGVuIHRvIG1lbW9yeSBieSB0aGUgdmVyaWZ5IGZsb3cgaXRzZWxmCiAgICAvLyB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X3N0b3JlIOKAlCBzYW1lIGRpdmlzaW9uIG9mIGxhYm91ciBhcyB0ZXN0c1J1biB2cyB0aGUKICAgIC8vIHRlc3Qgb3V0cHV0OyB0aGlzIHJlY29yZGVyIG9ubHkgdHJhY2tzIHRoYXQgdmVyaWZpY2F0aW9uIGhhcHBlbmVkLgogICAgdmFyIHZOYW1lID0gKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfc2tpbGwgfHwgJycpOwogICAgLy8gT25seSB0aGUgbmF0aXZlIC92ZXJpZnkgc2tpbGwgc2F0aXNmaWVzIHZlcmlmeS1iZWZvcmUtZG9uZS4gL3dhcmQgYW5kCiAgICAvLyAvcXVpY2tlbiBhcmUgdGFyZ2V0ZWQgYXVkaXRzLCBOT1QgdGhlIGNvbXBsZXRpb24gZ2F0ZSAoc2VlIGZsL3NkZC5tZCkg4oCUCiAgICAvLyBjcmVkaXRpbmcgdGhlbSB3b3VsZCBsZXQgdGhlIGdhdGUgcGFzcyB3aXRob3V0IGFuIGVuZC10by1lbmQgdmVyaWZ5LgogICAgaWYgKHZOYW1lID09PSAndmVyaWZ5JykgewogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICAvLyAjMTMzMjogaW52b2tpbmcgL3ZlcmlmeSBzdGFydHMgYSB2ZXJpZmljYXRpb247IGl0IGRvZXMgbm90IGNvbmNsdWRlCiAgICAgIC8vIG9uZS4gQ2xlYXIgYW55IHByaW9yIHZlcmRpY3Qgc28gdGhlIHJ1biBpbiBwcm9ncmVzcyBjYW5ub3QgaW5oZXJpdCB0aGUKICAgICAgLy8gUEFTUyBmcm9tIGEgcHJldmlvdXMgaXNzdWUgYW5kIHNhdGlzZnkgY2hlY2stYmVmb3JlLWRvbmUgb24gaXRzIG93bi4KICAgICAgdmFyIHZlcmlmeUZwID0gY3JlZGl0RmluZ2VycHJpbnQoJ2FsbCcpOwogICAgICBpZiAoIXMudmVyaWZ5UnVuIHx8IHMudmVyaWZ5T3V0Y29tZSB8fCBzLnZlcmlmeUZpbmdlcnByaW50ICE9PSB2ZXJpZnlGcCkgewogICAgICAgIHMudmVyaWZ5UnVuID0gdHJ1ZTsKICAgICAgICBzLnZlcmlmeU91dGNvbWUgPSBudWxsOwogICAgICAgIHMudmVyaWZ5RmluZ2VycHJpbnQgPSB2ZXJpZnlGcDsKICAgICAgICB3cml0ZVN0YXRlKHMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHZOYW1lKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LXJ1biBuby1vcCDigJQgVE9PTF9JTlBVVF9za2lsbD0iJyArIHZOYW1lICsgJyIgaXMgbm90IHZlcmlmeVxuJyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLXZlcmlmeS1vdXRjb21lJzogewogICAgLy8gIzEzMzIuIEZpcmVzIFBvc3RUb29sVXNlIG9uIG1jcF9fbW9mbG9fX21lbW9yeV9zdG9yZS4gYHJlY29yZC12ZXJpZnktcnVuYAogICAgLy8gYWJvdmUgcHJvdmVzIGEgdmVyaWZpY2F0aW9uIHdhcyBBVFRFTVBURUQ7IHRoaXMgcHJvdmVzIGhvdyBpdCBFTkRFRC4KICAgIC8vCiAgICAvLyBUaGUgdmVyZGljdCBpcyByZWFkIGZyb20gdGhlIHN0cnVjdHVyZWQgcmVjb3JkICMxMzI4IG1hZGUgL3ZlcmlmeSB3cml0ZQogICAgLy8gdG8gbWVtb3J5X3N0b3JlJ3MgYG1ldGFkYXRhYCDigJQgbmV2ZXIgcGFyc2VkIG91dCBvZiB0aGUgcHJvc2UgYHZhbHVlYCwKICAgIC8vIHdoaWNoIGlzIHByZWNpc2VseSB0aGUgZnJlZS10ZXh0IGRlcGVuZGVuY3kgIzEzMjggcmVtb3ZlZC4gZ2F0ZS1ob29rLm1qcwogICAgLy8gZm9yd2FyZHMgdGhlIG9iamVjdCBhcyBKU09OIChzZWUgaXRzIE1BWF9TVFJVQ1RVUkVEX0xFTiBub3RlKS4KICAgIHZhciBtS2V5ID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9rZXkgfHwgJyc7CiAgICBpZiAobUtleS5pbmRleE9mKCd2ZXJpZnk6JykgIT09IDApIGJyZWFrOwogICAgdmFyIHJhd01ldGEgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX21ldGFkYXRhIHx8ICcnOwogICAgaWYgKCFyYXdNZXRhKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LW91dGNvbWUg4oCUICInICsgbUtleSArICciIGNhcnJpZXMgbm8gbWV0YWRhdGE7IHZlcmRpY3Qgbm90IHJlY29yZGVkXG4nKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICB2YXIgcGFyc2VkTWV0YSA9IG51bGw7CiAgICB0cnkgeyBwYXJzZWRNZXRhID0gSlNPTi5wYXJzZShyYXdNZXRhKTsgfSBjYXRjaCAoZSkgeyBwYXJzZWRNZXRhID0gbnVsbDsgfQogICAgaWYgKCFwYXJzZWRNZXRhIHx8IHR5cGVvZiBwYXJzZWRNZXRhICE9PSAnb2JqZWN0JyB8fCBwYXJzZWRNZXRhLnR5cGUgIT09ICd2ZXJpZnktcmVjb3JkJykgYnJlYWs7CiAgICB2YXIgb3ZlcmFsbCA9IHR5cGVvZiBwYXJzZWRNZXRhLm92ZXJhbGwgPT09ICdzdHJpbmcnID8gcGFyc2VkTWV0YS5vdmVyYWxsLnRvVXBwZXJDYXNlKCkgOiAnJzsKICAgIGlmIChvdmVyYWxsICE9PSAnUEFTUycgJiYgb3ZlcmFsbCAhPT0gJ0ZBSUwnICYmIG92ZXJhbGwgIT09ICdVTlZFUklGSUVEJykgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXZlcmlmeS1vdXRjb21lIOKAlCB1bnJlY29nbmlzZWQgb3ZlcmFsbD0iJyArIHBhcnNlZE1ldGEub3ZlcmFsbCArICciOyB0cmVhdGluZyBhcyBub3QtcGFzc2luZ1xuJyk7CiAgICAgIG92ZXJhbGwgPSAnVU5WRVJJRklFRCc7CiAgICB9CiAgICB2YXIgdnMgPSByZWFkU3RhdGUoKTsKICAgIC8vICMxMzQ4IOKAlCByZWZ1c2UgYSB2ZXJkaWN0IGZvciBhIHJ1biB0aGF0IGlzIG5vIGxvbmdlciBsaXZlLiBgdmVyaWZ5UnVuYAogICAgLy8gZmFsc2UgaGVyZSBtZWFucyBhIGNvZGUgZWRpdCBmaXJlZCByZXNldC1lZGl0LWdhdGVzIGJldHdlZW4gdGhlIC92ZXJpZnkKICAgIC8vIGludm9jYXRpb24gYW5kIHRoaXMgc3RvcmUsIHNvIHRoZSB2ZXJkaWN0IGRlc2NyaWJlcyBwcmUtZWRpdCBjb2RlLgogICAgLy8gUmVjb3JkaW5nIGl0IGFueXdheSBwcm9kdWNlZCB0aGUgY29udHJhZGljdG9yeSBgdmVyaWZ5UnVuOmZhbHNlLAogICAgLy8gdmVyaWZ5T3V0Y29tZTonUEFTUydgIHN0YXRlIHRoYXQgY2hlY2stYmVmb3JlLWRvbmUncyBmb3VyLXdheSBtZXNzYWdlCiAgICAvLyBjaGFpbiBoYXMgbm8gYnJhbmNoIGZvciDigJQgaXQgcmVwb3J0cyAiYSBjb2RlIGVkaXQgaW52YWxpZGF0ZWQgdGhlIHByZXZpb3VzCiAgICAvLyB2ZXJpZmljYXRpb24iIHdoaWxlIGEgUEFTUyBzaXRzIGluIHN0YXRlLCB3aGljaCByZWFkcyBhcyBhIGdhdGUgYnVnLgogICAgaWYgKCF2cy52ZXJpZnlSdW4pIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC12ZXJpZnktb3V0Y29tZSDigJQgIicgKyBtS2V5ICsgJyIgYXJyaXZlZCBhZnRlciBhIGNvZGUgZWRpdCBpbnZhbGlkYXRlZCB0aGUgcnVuOyB2ZXJkaWN0IG5vdCByZWNvcmRlZCAocmUtcnVuIC92ZXJpZnkpXG4nKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICB2cy52ZXJpZnlPdXRjb21lID0gb3ZlcmFsbDsKICAgIHdyaXRlU3RhdGUodnMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Jlc2V0LWVkaXQtZ2F0ZXMnOiB7CiAgICB2YXIgZnAgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2ZpbGVfcGF0aCB8fCAnJzsKICAgIC8vIEluZXJ0IGZpbGVzIChtYXJrZG93biwgbG9ja2ZpbGVzLCBDSEFOR0VMT0csIC5lbnYuZXhhbXBsZSkgQU5EIGluZXJ0IHBhdGhzCiAgICAvLyAoLmdpdGh1Yi93b3JrZmxvd3MvLCAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFLywgLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUvLCAjMTE3Nik6CiAgICAvLyBubyBnYXRlIHJlc2V0IOKAlCBlZGl0aW5nIHRoZXNlIGRvZXNuJ3QgZXhwb3NlIG5ldyBydW50aW1lIHN1cmZhY2UuCiAgICBpZiAoZnAgJiYgKEVESVRfUkVTRVRfU0tJUF9CT1RIX1JFLnRlc3QoZnApIHx8IEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFLnRlc3QoZnApKSkgYnJlYWs7CiAgICAvLyAjMTM0OCDigJQgYSBzY3JhdGNocGFkIHdyaXRlIHVuZGVyIHRoZSBPUyB0ZW1wIGRpciBpcyB0cmFuc2llbnQgdG9vbCBJL08gYW5kCiAgICAvLyBjYW4gbmV2ZXIgcmVhY2ggdGhlIGJyYW5jaCBkaWZmLCBidXQgaXQgdXNlZCB0byByZXNldCB0ZXN0cyArIHNpbXBsaWZ5ICsKICAgIC8vIHZlcmlmeSBsaWtlIGFueSBzb3VyY2UgY2hhbmdlOiBhIC92ZXJpZnkgcnVuIHRoYXQgam90dGVkIGEgcHJvYmUgY2xlYXJlZAogICAgLy8gdGhlIC9mbG8tc2ltcGxpZnkgc3RhbXAsIGFuZCB0aGUgdHdvIGdhdGVzIGludmFsaWRhdGVkIGVhY2ggb3RoZXIgd2l0aCBubwogICAgLy8gb3JkZXJpbmcgdGhhdCBzYXRpc2ZpZWQgYm90aC4gUmV1c2VzIHRoZSBwcmVkaWNhdGUgdGhlIG1lbW9yeS1maXJzdCBnYXRlCiAgICAvLyBhbHJlYWR5IHRydXN0cyBmb3IgdGhlc2UgcGF0aHMgKCMxMjk0KSByYXRoZXIgdGhhbiBhIHNlY29uZCBvbmUuCiAgICAvLyBTY29wZTogdG1wLW9ubHksIE5PVCBwcm9qZWN0LXJvb3QgY29udGFpbm1lbnQg4oCUIHNvIGEgcHJvamVjdCByb290ZWQgdW5kZXIKICAgIC8vIHRtcCBoYXMgaXRzIG93biBlZGl0cyBza2lwcGVkIHRvbyAocGlubmVkIGluIHRoZSAjMTM0OCB0ZXN0cykuIENvbnRhaW5tZW50CiAgICAvLyBpcyB0aGUgbW9yZSBnZW5lcmFsIHJ1bGUsIGJ1dCBpdCBmYWlscyBPUEVOIHdoZW4gdGhlIHJvb3QgY2FuJ3QgYmUKICAgIC8vIHJlc29sdmVkLCBhbmQgYSBnYXRlIHRoYXQgc2lsZW50bHkgc3RvcHMgcmVzZXR0aW5nIGlzIHRoZSB3b3JzZSBmYWlsdXJlLgogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChmcCkpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIC8vIFRlc3Qtb25seSBlZGl0cyBpbnZhbGlkYXRlIHRlc3RzUnVuIGJ1dCBwcmVzZXJ2ZSBzaW1wbGlmeVJ1biAoIzkwOCkuCiAgICB2YXIgaXNUZXN0T25seSA9IGZwICYmIEVESVRfUkVTRVRfU0tJUF9TSU1QTElGWV9PTkxZX1JFLnRlc3QoZnApOwogICAgdmFyIHJlc2V0VGVzdHMgPSBzLnRlc3RzUnVuOwogICAgLy8gQSBjb2RlIGVkaXQgaW52YWxpZGF0ZXMgYSBwcmlvciB2ZXJpZmljYXRpb24gKFN0b3J5ICMxMjc0KSDigJQgc2FtZSBhcyB0ZXN0cywKICAgIC8vIGluY2x1ZGluZyB0ZXN0LW9ubHkgZWRpdHMgKHRoZSBjcml0ZXJpYSBiZWluZyB2ZXJpZmllZCBtYXkgaGF2ZSBtb3ZlZCkuCiAgICAvLyAjMTMzMjogYWxzbyBmaXJlcyB3aGVuIGEgdmVyZGljdCBsaW5nZXJzIHdpdGhvdXQgdGhlIGZsYWcsIHNvIG5vIHBhdGgKICAgIC8vIGNhbiBsZWF2ZSBhIHJlY29yZGVkIG91dGNvbWUgYmVoaW5kIGFmdGVyIGEgc291cmNlIGVkaXQuCiAgICB2YXIgcmVzZXRWZXJpZnkgPSBzLnZlcmlmeVJ1biB8fCAhIXMudmVyaWZ5T3V0Y29tZTsKICAgIHZhciByZXNldFNpbXBsaWZ5ID0gcy5zaW1wbGlmeVJ1biAmJiAhaXNUZXN0T25seTsKICAgIGlmICghcmVzZXRUZXN0cyAmJiAhcmVzZXRTaW1wbGlmeSAmJiAhcmVzZXRWZXJpZnkpIGJyZWFrOwogICAgdmFyIGdhdGVzID0gW107CiAgICBpZiAocmVzZXRUZXN0cykgeyBzLnRlc3RzUnVuID0gZmFsc2U7IGdhdGVzLnB1c2goJ3Rlc3RzJyk7IH0KICAgIC8vICMxMzMyOiBkcm9wIHRoZSByZWNvcmRlZCB2ZXJkaWN0IHdpdGggdGhlIGZsYWcuIExlYXZpbmcgYSBzdGFsZSBQQVNTCiAgICAvLyBiZWhpbmQgd291bGQgbGV0IHRoZSBuZXh0IGNoZWNrLWJlZm9yZS1kb25lIHBhc3Mgb24gYSB2ZXJkaWN0IHRoYXQKICAgIC8vIGRlc2NyaWJlcyBwcmUtZWRpdCBjb2RlLgogICAgaWYgKHJlc2V0VmVyaWZ5KSB7IHMudmVyaWZ5UnVuID0gZmFsc2U7IHMudmVyaWZ5T3V0Y29tZSA9IG51bGw7IGdhdGVzLnB1c2goJ3ZlcmlmeScpOyB9CiAgICBpZiAocmVzZXRTaW1wbGlmeSkgeyBzLnNpbXBsaWZ5UnVuID0gZmFsc2U7IGdhdGVzLnB1c2goJ3NpbXBsaWZ5Jyk7IH0KICAgIGlmIChmcCkgewogICAgICBzLmxhc3RSZXNldEJ5ID0geyBmaWxlOiBmcCwgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgZ2F0ZXM6IGdhdGVzIH07CiAgICB9CiAgICB3cml0ZVN0YXRlKHMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ2NoZWNrLWJlZm9yZS1pbXBsZW1lbnQnOiB7CiAgICAvLyAjMTI5NyDigJQgdGhlIFNERCBmcm9udC1oYWxmIGJhY2tzdG9wLiBXaGVuIGEgcnVuIGlzIGFybWVkIGZvciBTREQKICAgIC8vIChzZGRNb2RlLCBzZXQgZnJvbSAtc2QvLS1zZGQgb3Igc2RkLmRlZmF1bHQgb24gYSAvZmxvIHJ1biksIGJsb2NrIHNvdXJjZQogICAgLy8gV3JpdGUvRWRpdCB1bnRpbCBhIHNwZWMgZXhpc3RzIGFuZCBpdHMgcGxhbiBpcyByZXZpZXdlZC4gTWlycm9ycyB0aGUKICAgIC8vIG1lbW9yeV9maXJzdCBnYXRlIHNoYXBlLiBEaXNhcm1lZCBydW5zICh0aGUgZGVmYXVsdCBmb3Igbm9uLVNERCB3b3JrKQogICAgLy8gcGFzcyBpbnN0YW50bHkuIE9wdCBvdXQgcGVyLXByb2plY3Qgd2l0aCBgZ2F0ZXM6IHNkZF9nYXRlOiBmYWxzZWAuCiAgICBpZiAoIWNvbmZpZy5zZGRfZ2F0ZSkgYnJlYWs7CiAgICB2YXIgc2kgPSByZWFkU3RhdGUoKTsKICAgIGlmICghc2kuc2RkTW9kZSkgYnJlYWs7IC8vIG5vdCBhbiBTREQgcnVuIOKAlCBubyBlbmZvcmNlbWVudAogICAgdmFyIGZwaSA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfZmlsZV9wYXRoIHx8ICcnOwogICAgaWYgKCFmcGkpIGJyZWFrOwogICAgLy8gT25seSBnYXRlIHJlYWwgc291cmNlIGVkaXRzLiBFeGVtcHQgdGhlIHNhbWUgaW5lcnQgZmlsZXMvcGF0aHMgdGhlIG90aGVyCiAgICAvLyBnYXRlcyBza2lwLCBwbHVzIHRoZSBzcGVjL3BsYW4gYXJ0aWZhY3RzIHRoZW1zZWx2ZXMuCiAgICBpZiAoRVhFTVBULnNvbWUoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGZwaS5pbmRleE9mKGUpID49IDA7IH0pKSBicmVhazsKICAgIGlmICghU09VUkNFX0ZJTEVfUkUudGVzdChmcGkpKSBicmVhazsKICAgIGlmIChFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGZwaSkpIGJyZWFrOwogICAgaWYgKGlzSW5zaWRlU3BlY3NEaXIoZnBpKSkgYnJlYWs7CiAgICBpZiAoIXNpLmFjdGl2ZVNkZFNsdWcpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgJ0JMT0NLRUQ6IFNERCBtb2RlIGlzIG9uIOKAlCBhdXRob3IgYSBzcGVjIGJlZm9yZSBlZGl0aW5nIHNvdXJjZS5cbicgKwogICAgICAgICdSdW46IGZsbyBzZGQgc3BlYyAiPHRpdGxlPiIgICAodGhlbiByZXZpZXcgaXQsIGFuZCBwbGFuKVxuJyArCiAgICAgICAgJ1RoaXMgcnVuIGlzIHNwZWMtZ2F0ZWQgKC1zZCAvIHNkZC5kZWZhdWx0KS4gT25lLW9mZiBza2lwOiByZS1ydW4gd2l0aCAtLW5vLXNkZC5cbicgKwogICAgICAgICdEaXNhYmxlIHBlci1wcm9qZWN0IHZpYSBtb2Zsby55YW1sOiBnYXRlczogc2RkX2dhdGU6IGZhbHNlXG4nCiAgICAgICk7CiAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgIH0KICAgIGlmICghaXNQbGFuUmV2aWV3ZWQoc2kuYWN0aXZlU2RkU2x1ZykpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgJ0JMT0NLRUQ6IFNERCDigJQgdGhlIHBsYW4gZm9yICInICsgc2kuYWN0aXZlU2RkU2x1ZyArICciIGlzIG5vdCByZXZpZXdlZCB5ZXQuXG4nICsKICAgICAgICAnQXV0aG9yICsgcmV2aWV3IHRoZSBwbGFuIGZpcnN0OlxuJyArCiAgICAgICAgJyAgZmxvIHNkZCBwbGFuICcgKyBzaS5hY3RpdmVTZGRTbHVnICsgJ1xuJyArCiAgICAgICAgJyAgZmxvIHNkZCByZXZpZXcgJyArIHNpLmFjdGl2ZVNkZFNsdWcgKyAnIHBsYW5cbicgKwogICAgICAgICdPbmUtb2ZmIHNraXA6IHJlLXJ1biB3aXRoIC0tbm8tc2RkLiBEaXNhYmxlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogc2RkX2dhdGU6IGZhbHNlXG4nCiAgICAgICk7CiAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtcHInOiB7CiAgICAvLyBBbmNob3JlZCB0byBjb21tYW5kLXN0YXJ0IHNvIGhlcmVkb2MgYm9kaWVzIGFuZCBxdW90ZWQgc3RyaW5ncyB0aGF0CiAgICAvLyBjb250YWluIHRoZSBsaXRlcmFsICJnaCBwciBjcmVhdGUiIGRvbid0IHRyaXAgdGhlIGdhdGUgZHVyaW5nIHJlZ3VsYXIKICAgIC8vIGBnaXQgY29tbWl0IC1tICIuLi5naCBwciBjcmVhdGUuLi4iYCBmbG93cywgd2hpbGUgc3RpbGwgY2F0Y2hpbmcgdGhlCiAgICAvLyBjaGFpbmVkLCBwaXBlZCwgcGFyZW50aGVzaXNlZCwgYW5kIG11bHRpLWxpbmUgc2hhcGVzICgjMTQxMCkuCiAgICB2YXIgY21kID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgaWYgKCFpc1ByQ3JlYXRlQ29tbWFuZChjbWQpKSBicmVhazsKICAgIC8vICMxMzc0IG9wZW5lZCB0aGlzIGxvb3A7ICMxNDM1IGNsb3NlcyBpdC4gVGhlIGNvdW50IGl0c2VsZiBpcyB1bmNoYW5nZWQg4oCUCiAgICAvLyB3aGF0IGNoYW5nZWQgaXMgdGhhdCBpdCBub3cgaGFzIHRlZXRoIGFuZCwgaW4gd2FybiBtb2RlLCBhIGRlbGl2ZXJ5IHBhdGguCiAgICAvLwogICAgLy8gRGVsaWJlcmF0ZWx5IEFCT1ZFIHRoZSBuby1zb3VyY2UgZXhlbXB0aW9uIGJlbG93OiBhIGRvY3Mtb25seSBQUiBjYW4KICAgIC8vIGFiYW5kb24gYSBsaXN0IGV4YWN0bHkgbGlrZSBhIHNvdXJjZSBQUiBjYW4sIGFuZCB0aGUgZXhlbXB0aW9uIGlzIGFib3V0CiAgICAvLyB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncywgbm90IGFib3V0IHdoZXRoZXIgdGhlIHJ1biB0b2xkIHRoZSB1c2VyIHdoYXQKICAgIC8vIGl0IGRpZC4gSXQgYWxzbyBleGl0cyBvbiBpdHMgb3duIHJhdGhlciB0aGFuIGpvaW5pbmcgYG1pc3NpbmdgIGJlbG93LCBmb3IKICAgIC8vIHRoZSBzYW1lIHJlYXNvbiDigJQgYG1pc3NpbmdgIGlzIHVucmVhY2hhYmxlIG9uIGFuIGV4ZW1wdCBkaWZmLgogICAgLy8KICAgIC8vIEdhdGVkIG9uIHRoZSBzYW1lIGB0YXNrX2NyZWF0ZV9maXJzdGAgZmxhZyBhcyB0aGUgcmVtaW5kZXIgaXRzZWxmIHNvIHRoZQogICAgLy8gdHdvIGhhbHZlcyBhcmUgYWx3YXlzIGNvbnNpc3RlbnQ6IGEgcHJvamVjdCB0aGF0IHR1cm5lZCB0aGUgbmFnIG9mZiBpcwogICAgLy8gbm90IHRoZW4gYmxvY2tlZCBhYm91dCB0aGUgb3RoZXIgZW5kIG9mIGl0LgogICAgLy8KICAgIC8vIEZhaWwtb3BlbiBpcyBsb2FkLWJlYXJpbmcuIHJlYWRUYXNrTGVkZ2VyKCkgcmV0dXJucyBudWxsIG9uIGEgbWlzc2luZywKICAgIC8vIG92ZXJzaXplZCwgb3IgdW5yZWFkYWJsZSB0cmFuc2NyaXB0IGFuZCBvbiBhIHNlc3Npb24gd2l0aCBubyBUYXNrQ3JlYXRlIGF0CiAgICAvLyBhbGwsIGFuZCBudWxsIG11c3QgbmV2ZXIgYmxvY2sg4oCUIGEgZ2F0ZSB0aGF0IHN0b3BzIFBScyBiZWNhdXNlIGl0IGNvdWxkCiAgICAvLyBub3QgcmVhZCBhIGZpbGUgaXMgd29yc2UgdGhhbiB0aGUgcmVwb3J0aW5nIGdhcCBpdCBpcyBjbG9zaW5nLgogICAgLy8KICAgIC8vIFN0YXRlIGlzIHJlYWQgT05DRSBmb3IgdGhlIHdob2xlIGNhc2UsIGhlcmUg4oCUIHRoZSBwcmUtUFIgZ2F0ZSBsb2dpYyBiZWxvdwogICAgLy8gcmV1c2VzIGl0IGFuZCBub3RoaW5nIHdyaXRlcyBpbiBiZXR3ZWVuLiBSZWFkaW5nIGl0IGJlZm9yZSB0aGUgbGVkZ2VyIGFsc28KICAgIC8vIG1lYW5zIGFuIGFscmVhZHktYWNrbm93bGVkZ2VkIHJ1biBuZXZlciBwYXlzIGZvciB0aGUgdHJhbnNjcmlwdCBzY2FuLgogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmIChjb25maWcudGFza19jcmVhdGVfZmlyc3QgJiYgY29uZmlnLnRhc2tfc3RhdHVzX2dhdGUgIT09ICdvZmYnICYmICFzLnRhc2tzQWNrbm93bGVkZ2VkKSB7CiAgICAgIHZhciBsZWRnZXIgPSByZWFkVGFza0xlZGdlcigpOwogICAgICBpZiAobGVkZ2VyICYmIGxlZGdlci5vcGVuID4gMCkgewogICAgICAgIHZhciB0YWxseSA9IGxlZGdlci5jcmVhdGVkICsgJyB0YXNrJyArIChsZWRnZXIuY3JlYXRlZCA9PT0gMSA/ICcnIDogJ3MnKSArCiAgICAgICAgICAnIGNyZWF0ZWQgdGhpcyBzZXNzaW9uLCAnICsgbGVkZ2VyLm9wZW4gKyAnIHN0aWxsIG9wZW4uJzsKICAgICAgICB2YXIgY2xvc2VJdCA9ICdDbG9zZSB0aGVtIHdpdGggVGFza1VwZGF0ZSAoc3RhdHVzOiBjb21wbGV0ZWQpLCBvciBkZWxldGUgdGhlIG9uZXMgJyArCiAgICAgICAgICAndGhhdCBubyBsb25nZXIgYXBwbHksIHNvIHRoZSBydW4gZG9lcyBub3QgcmVwb3J0IGRvbmUgb3ZlciBhbiB1bmZpbmlzaGVkIGxpc3QuXG4nOwogICAgICAgIGlmIChjb25maWcudGFza19zdGF0dXNfZ2F0ZSA9PT0gJ3dhcm4nKSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnUkVNSU5ERVI6ICcgKyB0YWxseSArICcgJyArIGNsb3NlSXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAgICAgJ0JMT0NLRUQ6ICcgKyB0YWxseSArICdcbicgKyBjbG9zZUl0ICsKICAgICAgICAgICAgJ0RlZmVycmluZyB0aGVtIG9uIHB1cnBvc2UgaXMgYSBsZWdpdGltYXRlIG91dGNvbWUg4oCUIGRlY2xhcmUgaXQgaW5zdGVhZCBvZlxuJyArCiAgICAgICAgICAgICdjbG9zaW5nIHRhc2tzIHRoYXQgYXJlIG5vdCBkb25lOiBub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWRcbicgKwogICAgICAgICAgICBHQVRFX09SSUdJTl9OT1RFICsgJ1xuJyArCiAgICAgICAgICAgICdSZXBvcnQgaW5zdGVhZCBvZiBibG9ja2luZyB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHRhc2tfc3RhdHVzX2dhdGU6IHdhcm4gICAob3I6IG9mZilcbicpOwogICAgICAgICAgcHJvY2Vzcy5leGl0KDIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gTm8tc291cmNlLWZpbGVzIGV4ZW1wdGlvbiAoIzExNzYsIHN1cGVyc2VkZXMgdGhlIG9yaWdpbmFsIGRvY3Mtb25seSBwYXRoKS4KICAgIC8vIElmIGV2ZXJ5IGZpbGUgY2hhbmdlZCB2cyB0aGUgbWVyZ2UtYmFzZSBpcyBlaXRoZXIgYSBkb2NzL2ltYWdlIGZpbGUgb3IgYQogICAgLy8gcGF0aC1pbmVydCBmaWxlICguZ2l0aHViL3dvcmtmbG93cy8sIElTU1VFX1RFTVBMQVRFLywgUFVMTF9SRVFVRVNUX1RFTVBMQVRFLykKICAgIC8vIOKAlCBpLmUuIE5PIHNvdXJjZSBmaWxlcyBpbiB0aGUgZGlmZiDigJQgc2tpcCB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncyBnYXRlcwogICAgLy8gYW5kIHN1cmZhY2UgYSBvbmUtbGluZSB0cmFuc3BhcmVuY3kgbm90ZS4gRmFsbHMgdGhyb3VnaCB0byB0aGUgc3RhbmRhcmQgZ2F0ZQogICAgLy8gb24gYW55IGZhaWx1cmUgKG5vIGJhc2UsIG5vIGRpZmYsIGV4ZWMgZXJyb3IpIOKAlCBmYWlsLXNhZmUgYnkgZGVzaWduLgogICAgLy8KICAgIC8vIFNvdXJjZS1maWxlIGRldGVjdGlvbiBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgaW5lcnQgY2hlY2tzOiBhIGZpbGUgaXMgInNvdXJjZSIKICAgIC8vIHdoZW4gaXQgbWF0Y2hlcyBTT1VSQ0VfRklMRV9SRSBBTkQgaXMgbm90IGluc2lkZSBhbiBpbmVydCBwYXRoLiBUaGlzIGNhdGNoZXMKICAgIC8vIGAuZ2l0aHViL3dvcmtmbG93cy9mb28uc2hgIChzaCBleHRlbnNpb24gYnV0IHBhdGgtaW5lcnQg4oaSIG5vIHNvdXJjZSkuCiAgICB2YXIgY2hhbmdlZCA9IGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpOwogICAgaWYgKGNoYW5nZWQgJiYgY2hhbmdlZC5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBoYXNTb3VyY2UgPSBjaGFuZ2VkLnNvbWUoZnVuY3Rpb24oZikgewogICAgICAgIHJldHVybiBTT1VSQ0VfRklMRV9SRS50ZXN0KGYpICYmICFFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGYpOwogICAgICB9KTsKICAgICAgaWYgKCFoYXNTb3VyY2UpIHsKICAgICAgICB2YXIgYWxsRG9jcyA9IGNoYW5nZWQuZXZlcnkoZnVuY3Rpb24oZikgeyByZXR1cm4gRE9DU19PTkxZX1JFLnRlc3QoZik7IH0pOwogICAgICAgIHZhciByZWFzb24gPSBhbGxEb2NzID8gJ0RvY3Mtb25seScgOiAnTm8gc291cmNlIGZpbGVzIGluIGJyYW5jaCBkaWZmJzsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZWFzb24gKyAnICgnICsgY2hhbmdlZC5sZW5ndGggKyAnIGZpbGUnICsgKGNoYW5nZWQubGVuZ3RoID09PSAxID8gJycgOiAncycpICsgJykg4oCUIHNraXBwaW5nIHRlc3Rpbmcvc2ltcGxpZnkvbGVhcm5pbmdzIGdhdGVzLlxuJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIC8vIEV4cGlyZSBhbnkgY3JlZGl0IHdob3NlIGZpbmdlcnByaW50IG5vIGxvbmdlciBtYXRjaGVzIHRoZSBjb2RlIGJlZm9yZQogICAgLy8gcmVhZGluZyB0aGUgZmxhZ3MuIFRoaXMgaXMgd2hhdCBjYXRjaGVzIHRoZSBtdXRhdGlvbnMgcmVzZXQtZWRpdC1nYXRlcwogICAgLy8gc3RydWN0dXJhbGx5IGNhbm5vdCBzZWUg4oCUIEJhc2ggd3JpdGVzLCBnaXQgY2hlY2tvdXQvcHVsbC9tZXJnZSwgYW5kIHRoZQogICAgLy8gbmV4dCBpc3N1ZSBpbiB0aGUgc2FtZSBzZXNzaW9uIOKAlCBzbyB0aGUgZmxhZ3MgYmVsb3cgbWVhbiAic3RpbGwgdHJ1ZSBvZgogICAgLy8gVEhJUyBjb2RlIiwgbm90IG1lcmVseSAid2FzIHRydWUgYXQgc29tZSBwb2ludCB0aGlzIHNlc3Npb24iLgogICAgdmFyIGV4cGlyZWQgPSBbXTsKICAgIGlmIChzLnRlc3RzUnVuICYmICFjcmVkaXRJc0xpdmUocy50ZXN0c1J1biwgcy50ZXN0c0ZpbmdlcnByaW50LCAnYWxsJykpIHsKICAgICAgcy50ZXN0c1J1biA9IGZhbHNlOyBzLnRlc3RzRmluZ2VycHJpbnQgPSBudWxsOyBleHBpcmVkLnB1c2goJ3Rlc3RzJyk7CiAgICB9CiAgICBpZiAocy5zaW1wbGlmeVJ1biAmJiAhY3JlZGl0SXNMaXZlKHMuc2ltcGxpZnlSdW4sIHMuc2ltcGxpZnlGaW5nZXJwcmludCwgJ25vbnRlc3QnKSkgewogICAgICBzLnNpbXBsaWZ5UnVuID0gZmFsc2U7IHMuc2ltcGxpZnlGaW5nZXJwcmludCA9IG51bGw7IGV4cGlyZWQucHVzaCgnc2ltcGxpZnknKTsKICAgIH0KICAgIGlmICgocy52ZXJpZnlSdW4gfHwgcy52ZXJpZnlPdXRjb21lKSAmJiAhY3JlZGl0SXNMaXZlKHMudmVyaWZ5UnVuLCBzLnZlcmlmeUZpbmdlcnByaW50LCAnYWxsJykpIHsKICAgICAgcy52ZXJpZnlSdW4gPSBmYWxzZTsgcy52ZXJpZnlPdXRjb21lID0gbnVsbDsgcy52ZXJpZnlGaW5nZXJwcmludCA9IG51bGw7IGV4cGlyZWQucHVzaCgndmVyaWZ5Jyk7CiAgICB9CiAgICBpZiAoZXhwaXJlZC5sZW5ndGgpIHdyaXRlU3RhdGUocyk7CiAgICAvLyBDbGFzc2lmaWVyLWF3YXJlIHNraXA6IGlmIGRlbHRhLXNpbmNlLXNuYXBzaG90IG9yIHdob2xlLWJyYW5jaCBkaWZmIGlzCiAgICAvLyBUUklWSUFMLCBzYXRpc2Z5IHRoZSBzaW1wbGlmeSBnYXRlIHNpbGVudGx5LiBSZXVzZXMgdGhlIHNhbWUgY2xhc3NpZmllcgogICAgLy8gdGhlIHNraWxsIHVzZXMg4oCUIHNhbWUgInRyaXZpYWwiIGRlZmluaXRpb24sIG5vIGRyaWZ0LiBTYW1lIHRocmVzaG9sZCB0aGF0CiAgICAvLyBhbHJlYWR5IG1hcHMgdG8gVFJJVklBTD0wIGFnZW50cyBpbnNpZGUgL3NpbXBsaWZ5LCBzbyB0cnVzdGluZyBpdCBhdCB0aGUKICAgIC8vIGdhdGUgbGV2ZWwgaXMgdGhlIHNhbWUgdHJ1c3QgcHJvZmlsZSwganVzdCBvbmUgZGVjaXNpb24gZWFybGllci4KICAgIGlmIChjb25maWcuc2ltcGxpZnlfZ2F0ZSAmJiAhcy5zaW1wbGlmeVJ1bikgewogICAgICB2YXIgc2tpcFJlYXNvbiA9IGNsYXNzaWZ5Rm9yR2F0ZVNraXAocyk7CiAgICAgIGlmIChza2lwUmVhc29uKSB7CiAgICAgICAgcy5zaW1wbGlmeVJ1biA9IHRydWU7CiAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnU2ltcGxpZnkgZ2F0ZSBhdXRvLXBhc3NlZDogJyArIHNraXBSZWFzb24gKyAnXG4nKTsKICAgICAgfQogICAgfQogICAgdmFyIG1pc3NpbmcgPSBbXTsKICAgIGlmIChjb25maWcudGVzdGluZ19nYXRlICYmICFzLnRlc3RzUnVuKSBtaXNzaW5nLnB1c2goJ3Rlc3RzIGhhdmUgbm90IHJ1biBncmVlbiBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQgKHJ1biBucG0gdGVzdCwgdml0ZXN0LCBqZXN0LCBweXRlc3QsIG9yIHNpbWlsYXIg4oCUIGEgcnVuIHdob3NlIG91dHB1dCByZXBvcnRzIGZhaWx1cmVzIGRvZXMgbm90IGNvdW50KScpOwogICAgaWYgKGNvbmZpZy5zaW1wbGlmeV9nYXRlICYmICFzLnNpbXBsaWZ5UnVuKSBtaXNzaW5nLnB1c2goJy9mbG8tc2ltcGxpZnkgKG9yIC9kaXN0aWxsKSBoYXMgbm90IHJ1biBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQnKTsKICAgIGlmIChjb25maWcubGVhcm5pbmdzX2dhdGUgJiYgIXMubGVhcm5pbmdzU3RvcmVkKSBtaXNzaW5nLnB1c2goTEVBUk5JTkdTX01JU1NJTkcpOwogICAgaWYgKG1pc3NpbmcubGVuZ3RoID09PSAwKSBicmVhazsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdCTE9DS0VEOiBnaCBwciBjcmVhdGUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBiZWZvcmUgb3BlbmluZyBhIFBSOlxuJyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pc3NpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAnICsgbWlzc2luZ1tpXSArICdcbicpOwogICAgfQogICAgaWYgKGV4cGlyZWQubGVuZ3RoKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICdFeHBpcmVkIGJlY2F1c2UgdGhlIGNvZGUgY2hhbmdlZCBzaW5jZSB0aGV5IHJhbiAoJyArIGV4cGlyZWQuam9pbignLCAnKSArCiAgICAgICAgJykg4oCUIHRoaXMgaW5jbHVkZXMgY2hhbmdlcyBtYWRlIG91dHNpZGUgV3JpdGUvRWRpdCwgZS5nLiBhIEJhc2ggd3JpdGUsICcgKwogICAgICAgICdnaXQgY2hlY2tvdXQvcHVsbCwgb3IgbW92aW5nIG9uIHRvIGEgZGlmZmVyZW50IGNoYW5nZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlxuJywKICAgICAgKTsKICAgIH0KICAgIGlmIChzLmxhc3RSZXNldEJ5ICYmIHMubGFzdFJlc2V0QnkuZmlsZSkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnTGFzdCBnYXRlIHJlc2V0OiAnICsgcy5sYXN0UmVzZXRCeS5maWxlICsgJyAoJyArIChzLmxhc3RSZXNldEJ5LmdhdGVzIHx8IFtdKS5qb2luKCcsICcpICsgJylcbicpOwogICAgfQogICAgLy8gIzEzNDgg4oCUIG5hbWUgdGhlIG9yZGVyLCBub3QganVzdCB0aGUgbWlzc2luZyBnYXRlLiBTYXRpc2Z5aW5nIG9uZSBnYXRlIGNhbgogICAgLy8gaW52YWxpZGF0ZSBhbm90aGVyICgvZmxvLXNpbXBsaWZ5IGVkaXRzIGNvZGUsIHdoaWNoIHJlc2V0cyB0ZXN0cyArIHZlcmlmeSksCiAgICAvLyBzbyAid2hhdCBpcyBtaXNzaW5nIiBhbG9uZSBsZWZ0IGNhbGxlcnMgcmVkaXNjb3ZlcmluZyB0aGUgc2VxdWVuY2UgYnkgdHJpYWwuCiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShPUkRFUl9ISU5UKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOlxuJyk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICBnYXRlczpcbiAgICB0ZXN0aW5nX2dhdGU6IGZhbHNlXG4gICAgc2ltcGxpZnlfZ2F0ZTogZmFsc2VcbiAgICBsZWFybmluZ3NfZ2F0ZTogZmFsc2VcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtZG9uZSc6IHsKICAgIC8vIFN0b3J5ICMxMjc0IChFcGljICMxMjY5KSArICMxMjk0LiBWZXJpZnktYmVmb3JlLWRvbmU6IGJsb2NrIGBnaCBwciBjcmVhdGVgCiAgICAvLyB1bnRpbCB0aGUgY2hhbmdlIGhhcyBiZWVuIHZlcmlmaWVkIGVuZC10by1lbmQgKHRoZSAvdmVyaWZ5IHNraWxsKSBhZ2FpbnN0CiAgICAvLyB0aGUgcGxhbidzIGFjY2VwdGFuY2UgY3JpdGVyaWEuIE9OIGJ5IGRlZmF1bHQgKCMxMjk0KSDigJQgL2ZsbyBkZWxlZ2F0ZXMgdG8KICAgIC8vIC92ZXJpZnksIHNvIGEgZGVmYXVsdCBydW4gZG9lcyB0aGUgYWNjZXB0YW5jZSBjaGVjazsgZGlzYWJsZSBwZXItcHJvamVjdAogICAgLy8gd2l0aCBgZ2F0ZXM6IHZlcmlmeV9iZWZvcmVfZG9uZTogZmFsc2VgIG9yIHBlci1ydW4gYC0tbm8tdmVyaWZ5YC4gU2FtZQogICAgLy8gdHJpZ2dlciArIG5vLXNvdXJjZSBleGVtcHRpb24gYXMgY2hlY2stYmVmb3JlLXByLCBzbyB0aGV5IGNvbXBvc2Ugb24gb25lCiAgICAvLyBjb21tYW5kIChkb2NzLW9ubHkgZGlmZnMgYXJlIGV4ZW1wdCwgc28gdGhpcyBuZXZlciBibG9ja3MgYSBkb2NzIFBSKS4KICAgIGlmICghY29uZmlnLnZlcmlmeV9iZWZvcmVfZG9uZSkgYnJlYWs7CiAgICB2YXIgY21kID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9jb21tYW5kIHx8ICcnOwogICAgaWYgKCFpc1ByQ3JlYXRlQ29tbWFuZChjbWQpKSBicmVhazsKICAgIC8vIE5vLXNvdXJjZS1maWxlcyBleGVtcHRpb24g4oCUIGEgZG9jcy1vbmx5IC8gcGF0aC1pbmVydCBkaWZmIG5lZWRzIG5vIHZlcmlmeS4KICAgIHZhciBjaGFuZ2VkRCA9IGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpOwogICAgaWYgKGNoYW5nZWREICYmIGNoYW5nZWRELmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGhhc1NvdXJjZUQgPSBjaGFuZ2VkRC5zb21lKGZ1bmN0aW9uKGYpIHsKICAgICAgICByZXR1cm4gU09VUkNFX0ZJTEVfUkUudGVzdChmKSAmJiAhRURJVF9SRVNFVF9TS0lQX1BBVEhfUkUudGVzdChmKTsKICAgICAgfSk7CiAgICAgIGlmICghaGFzU291cmNlRCkgewogICAgICAgIHZhciByZWFzb25EID0gY2hhbmdlZEQuZXZlcnkoZnVuY3Rpb24oZikgeyByZXR1cm4gRE9DU19PTkxZX1JFLnRlc3QoZik7IH0pID8gJ0RvY3Mtb25seScgOiAnTm8gc291cmNlIGZpbGVzIGluIGJyYW5jaCBkaWZmJzsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShyZWFzb25EICsgJyAoJyArIGNoYW5nZWRELmxlbmd0aCArICcgZmlsZScgKyAoY2hhbmdlZEQubGVuZ3RoID09PSAxID8gJycgOiAncycpICsgJykg4oCUIHNraXBwaW5nIHZlcmlmeS1iZWZvcmUtZG9uZSBnYXRlLlxuJyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHZhciBzZCA9IHJlYWRTdGF0ZSgpOwogICAgLy8gRXhwaXJlIGEgdmVyZGljdCB0aGF0IG5vIGxvbmdlciBkZXNjcmliZXMgdGhlIGNvZGUsIGZvciB0aGUgc2FtZSByZWFzb24KICAgIC8vIGNoZWNrLWJlZm9yZS1wciBkb2VzOiBhIFBBU1MgZWFybmVkIGJlZm9yZSBhIEJhc2ggd3JpdGUsIGEgYnJhbmNoIHN3aXRjaCwKICAgIC8vIG9yIHRoZSBuZXh0IGNoYW5nZSBpbiB0aGlzIHNlc3Npb24gaXMgZXZpZGVuY2UgYWJvdXQgZGlmZmVyZW50IGNvZGUuCiAgICAvLyAjMTMzMiBtYWRlIHRoZSBnYXRlIHJlYWQgdGhlIG91dGNvbWUgaW5zdGVhZCBvZiBhdHRlbmRhbmNlOyB0aGlzIG1ha2VzIGl0CiAgICAvLyByZWFkIGFuIG91dGNvbWUgdGhhdCBpcyBzdGlsbCBBQk9VVCB0aGUgdGhpbmcgYmVpbmcgc2hpcHBlZC4KICAgIHZhciB2ZXJpZnlTdGFsZSA9IChzZC52ZXJpZnlSdW4gfHwgc2QudmVyaWZ5T3V0Y29tZSkKICAgICAgJiYgIWNyZWRpdElzTGl2ZShzZC52ZXJpZnlSdW4sIHNkLnZlcmlmeUZpbmdlcnByaW50LCAnYWxsJyk7CiAgICBpZiAodmVyaWZ5U3RhbGUpIHsKICAgICAgc2QudmVyaWZ5UnVuID0gZmFsc2U7IHNkLnZlcmlmeU91dGNvbWUgPSBudWxsOyBzZC52ZXJpZnlGaW5nZXJwcmludCA9IG51bGw7CiAgICAgIHdyaXRlU3RhdGUoc2QpOwogICAgfQogICAgLy8gIzEzMzI6IGdhdGUgb24gdGhlIE9VVENPTUUsIG5vdCBvbiBhdHRlbmRhbmNlLiBCZWZvcmUgdGhpcywgYHZlcmlmeVJ1bmAKICAgIC8vIGFsb25lIG9wZW5lZCB0aGUgZ2F0ZSwgc28gYSAvdmVyaWZ5IHJldHVybmluZyBGQUlMIHNhdGlzZmllZCBpdCBleGFjdGx5CiAgICAvLyBhcyBhIFBBU1MgZGlkIOKAlCBhIGZhaWxpbmcgdmVyZGljdCBpcyBzdGlsbCBhIHN1Y2Nlc3NmdWwgdG9vbCBpbnZvY2F0aW9uLgogICAgaWYgKHNkLnZlcmlmeVJ1biAmJiBzZC52ZXJpZnlPdXRjb21lID09PSAnUEFTUycpIGJyZWFrOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IGdoIHByIGNyZWF0ZSByZXF1aXJlcyB2ZXJpZmljYXRpb24gYmVmb3JlIGRvbmU6XG4nKTsKICAgIC8vIFRoZSBmb3VyIHN0YXRlcyBuZWVkIGRpZmZlcmVudCByZW1lZGllcywgc28gbmFtZSB3aGljaCBvbmUgYXBwbGllcwogICAgLy8gcmF0aGVyIHRoYW4gZW1pdHRpbmcgb25lIG1lc3NhZ2UgdGhhdCBmaXRzIG5vbmUgb2YgdGhlbS4KICAgIHZhciBpbnZhbGlkYXRlZCA9IHNkLmxhc3RSZXNldEJ5ICYmIHNkLmxhc3RSZXNldEJ5LmZpbGUKICAgICAgJiYgKHNkLmxhc3RSZXNldEJ5LmdhdGVzIHx8IFtdKS5pbmRleE9mKCd2ZXJpZnknKSA+PSAwOwogICAgaWYgKHZlcmlmeVN0YWxlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gdGhlIGNvZGUgY2hhbmdlZCBzaW5jZSAvdmVyaWZ5IHJhbiDigJQgcmUtcnVuIC92ZXJpZnlcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChkZXRlY3RlZCBieSBjb250ZW50LCBzbyB0aGlzIGNvdmVycyBjaGFuZ2VzIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0OlxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgIGEgQmFzaCB3cml0ZSwgZ2l0IGNoZWNrb3V0L3B1bGwsIG9yIGEgZGlmZmVyZW50IGNoYW5nZSBpbiB0aGUgc2FtZSBzZXNzaW9uKVxuJyk7CiAgICB9IGVsc2UgaWYgKCFzZC52ZXJpZnlSdW4gJiYgaW52YWxpZGF0ZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSBhIGNvZGUgZWRpdCBpbnZhbGlkYXRlZCB0aGUgcHJldmlvdXMgdmVyaWZpY2F0aW9uIOKAlCByZS1ydW4gL3ZlcmlmeVxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdMYXN0IGdhdGUgcmVzZXQ6ICcgKyBzZC5sYXN0UmVzZXRCeS5maWxlICsgJyAodmVyaWZ5KVxuJyk7CiAgICB9IGVsc2UgaWYgKCFzZC52ZXJpZnlSdW4pIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSB0aGUgY2hhbmdlIGhhcyBub3QgYmVlbiB2ZXJpZmllZCBzaW5jZSB0aGUgbGFzdCBjb2RlIGVkaXQgKHJ1biAvdmVyaWZ5KVxuJyk7CiAgICB9IGVsc2UgaWYgKHNkLnZlcmlmeU91dGNvbWUgPT09ICdGQUlMJyB8fCBzZC52ZXJpZnlPdXRjb21lID09PSAnVU5WRVJJRklFRCcpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAvdmVyaWZ5IHJhbiBhbmQgcmV0dXJuZWQgJyArIHNkLnZlcmlmeU91dGNvbWUgKyAnIOKAlCBmaXggdGhlIGZhaWxpbmcgY3JpdGVyaWEsIHRoZW4gcmUtcnVuIC92ZXJpZnlcbicpOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChhIEZBSUwgaXMgYSByZWFsIHJlc3VsdCwgbm90IGEgZ2F0ZSBlcnJvcjsgdGhlIFBSIGlzIGJsb2NrZWQgYmVjYXVzZSB0aGUgY2hhbmdlIGRpZCBub3QgbWVldCBpdHMgYWNjZXB0YW5jZSBjcml0ZXJpYSlcbicpOwogICAgfSBlbHNlIHsKICAgICAgLy8gUmFuLCBidXQgbm8gdmVyZGljdCByZWFjaGVkIHRoZSBnYXRlLiBUV08gdmVyeSBkaWZmZXJlbnQgY2F1c2VzLCBhbmQKICAgICAgLy8gIzEzOTQgZXhpc3RzIGJlY2F1c2UgdGhleSB1c2VkIHRvIHNoYXJlIG9uZSBtZXNzYWdlIHRoYXQgZml0IG9ubHkgdGhlCiAgICAgIC8vIGZpcnN0OiBlaXRoZXIgL3ZlcmlmeSBuZXZlciByZWNvcmRlZCBhIHN0cnVjdHVyZWQgb3V0Y29tZSwgb3IgdGhlIGhvb2sKICAgICAgLy8gdGhhdCBUUkFOU0NSSUJFUyB0aGUgb3V0Y29tZSBpcyBub3Qgd2lyZWQsIGluIHdoaWNoIGNhc2UgYSBwZXJmZWN0bHkKICAgICAgLy8gY29ycmVjdCB2ZXJkaWN0IHdhcyBzdG9yZWQgYW5kIG5vdGhpbmcgY291bGQgY2FycnkgaXQgdG8gdGhlIGdhdGUuCiAgICAgIC8vIEJsYW1pbmcgdGhlIGFnZW50IGZvciB0aGUgc2Vjb25kIGNhc2Ugc2VuZHMgdGhlIHVzZXIgaW50byBhbiB1bmJvdW5kZWQKICAgICAgLy8gcmV0cnkgbG9vcCDigJQgcmUtcnVubmluZyAvdmVyaWZ5IGNhbm5vdCBmaXggYWJzZW50IHdpcmluZy4KICAgICAgaWYgKCFpc1ZlcmlmeU91dGNvbWVIb29rV2lyZWQoKSkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIC0gYHJlY29yZC12ZXJpZnktb3V0Y29tZWAgaXMgbm90IHdpcmVkIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiDigJQgdGhlIHZlcmRpY3QgY2Fubm90IGJlIHJlY29yZGVkXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIC92ZXJpZnkgbWF5IHdlbGwgaGF2ZSBwYXNzZWQ7IG5vdGhpbmcgZXhpc3RzIHRvIHRyYW5zY3JpYmUgaXRzIHJlc3VsdCwgc28gcmUtcnVubmluZyBpdCB3aWxsIG5vdCBoZWxwLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICBGaXg6IHJ1biBgZmxvIGRvY3RvciAtLWZpeGAsIHJlc3RhcnQgdGhlIHNlc3Npb24gKENsYXVkZSBDb2RlIGxvYWRzIGhvb2tzIG9ubHkgYXQgc3RhcnQpLCB0aGVuIHJlLXJ1biAvdmVyaWZ5LlxuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSAvdmVyaWZ5IHJhbiBidXQgcmVjb3JkZWQgbm8gdmVyZGljdCDigJQgcmUtcnVuIGl0IHNvIGl0IHN0b3JlcyBhIHN0cnVjdHVyZWQgcmVzdWx0XG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIChTdGVwIDUgb2YgdGhlIHZlcmlmeSBza2lsbCBtdXN0IHBhc3MgbWV0YWRhdGEub3ZlcmFsbCB0byBtZW1vcnlfc3RvcmUpXG4nKTsKICAgICAgICAvLyAjMTM0OCDigJQgdGhlIHRyYXAgdGhpcyBzdGF0ZSBzZXRzOiByZS1pbnZva2luZyAvdmVyaWZ5IENMRUFSUyBhbnkgcHJpb3IKICAgICAgICAvLyB2ZXJkaWN0IGJ5IGRlc2lnbiAoIzEzMzIpLCBzbyB0aGUgb2J2aW91cyByZWNvdmVyeSBsYW5kcyByaWdodCBiYWNrIGhlcmUKICAgICAgICAvLyB1bmxlc3MgU3RlcCA1IGNvbXBsZXRlcy4gU2F5IHNvLCByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlIHJlZGlzY292ZXJlZC4KICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIFJlLWludm9raW5nIC92ZXJpZnkgY2xlYXJzIHRoZSBwcmlvciB2ZXJkaWN0LCBzbyBhIHJlLXJ1biB0aGF0IHNraXBzIFN0ZXAgNSBsYW5kcyBoZXJlIGFnYWluLlxuJyk7CiAgICAgIH0KICAgIH0KICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKE9SREVSX0hJTlQpOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgdmlhIG1vZmxvLnlhbWw6XG4nKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIGdhdGVzOlxuICAgIHZlcmlmeV9iZWZvcmVfZG9uZTogZmFsc2VcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1kYW5nZXJvdXMtY29tbWFuZCc6IHsKICAgIC8vICMxMTcxIGZvbGxvdy11cCDigJQgc3RyaXAgcXVvdGVkIHN0cmluZyBib2RpZXMgYW5kIGhlcmVkb2MgYm9kaWVzIGJlZm9yZQogICAgLy8gc3Vic3RyaW5nLW1hdGNoaW5nIERBTkdFUk9VUy4gV2l0aG91dCB0aGlzLCBgZ2l0IGNvbW1pdCAtbSAiLi4ucmVtb3ZlLWl0ZW0KICAgIC8vIC1yZWN1cnNlIC1mb3JjZSBjOlwuLi4iYCBibG9ja3MgYmVjYXVzZSB0aGUgbGl0ZXJhbCBwYXR0ZXJuIGFwcGVhcnMgaW4KICAgIC8vIHRoZSBxdW90ZWQgbWVzc2FnZSBib2R5LiBRdW90ZWQgdGV4dCBpc24ndCBleGVjdXRpbmcg4oCUIHRoZSBnYXRlJ3Mgam9iIGlzCiAgICAvLyB0byBjYXRjaCB0eXBvLWNsYXNzIGRlc3RydWN0aW9uIGluIHRoZSBhY3R1YWwgY29tbWFuZCwgbm90IHRleHQgbWVudGlvbnMKICAgIC8vIGluc2lkZSBhcmd1bWVudHMuIFRyYWRlLW9mZjogYGJhc2ggLWMgInJtIC1yZiAvImAgYWxzbyBieXBhc3NlcyBub3c7IHRoZQogICAgLy8gZ2F0ZSBpcyBhIHR5cG8gc2FmZXR5IG5ldCwgbm90IGEgc2VjdXJpdHkgYm91bmRhcnksIHNvIHRoaXMgaXMgYWNjZXB0YWJsZS4KICAgIC8vIENvbW1hbmQgc3Vic3RpdHV0aW9ucyBgJCguLi4pYCBhbmQgYmFja3RpY2tzIGFyZSBOT1Qgc3RyaXBwZWQg4oCUIHRob3NlCiAgICAvLyBib2RpZXMgZXhlY3V0ZSBhbmQgZGFuZ2Vyb3VzIGNvbnRlbnQgdGhlcmUgaXMgcmVhbC4KICAgIHZhciByYXcgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICB2YXIgY21kID0gc3RyaXBRdW90ZWRBbmRIZXJlZG9jcyhyYXcpLnRvTG93ZXJDYXNlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IERBTkdFUk9VUy5sZW5ndGg7IGkrKykgewogICAgICBpZiAobWF0Y2hlc0Rhbmdlcm91cyhjbWQsIERBTkdFUk9VU1tpXSkpIHsKICAgICAgICBjb25zb2xlLmxvZygnW0JMT0NLRURdIERhbmdlcm91cyBjb21tYW5kOiAnICsgREFOR0VST1VTW2ldKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdwcm9tcHQtcmVtaW5kZXInOiB7CiAgICAvLyBGdWxsIHBlci1wcm9tcHQgcmVzZXQuIFdpcmVkIGFzIHRoZSBmaXJzdCBVc2VyUHJvbXB0U3VibWl0IGhvb2sgKHZpYQogICAgLy8gcHJvbXB0LWhvb2subWpzKS4gT3ducyBpbnRlcmFjdGlvbkNvdW50ICsgQ29udGV4dCB3YXJuaW5nczsgdGhlCiAgICAvLyBUYXNrQ3JlYXRlIFJFTUlOREVSIGFuZCBuYW1lc3BhY2UgaGludCBtb3ZlZCB0byBjaGVjay1iZWZvcmUtYWdlbnQKICAgIC8vICgjOTMxKSBzbyB0aGV5IG9ubHkgZmlyZSB3aGVuIENsYXVkZSBpcyBhY3R1YWxseSBhYm91dCB0byBzcGF3biBhbgogICAgLy8gQWdlbnQuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgdmFyIHByb21wdCA9IHByb2Nlc3MuZW52LkNMQVVERV9VU0VSX1BST01QVCB8fCAnJzsKICAgIGFwcGx5UHJvbXB0U3RhdGVSZXNldChzLCBwcm9tcHQpOwogICAgcy5pbnRlcmFjdGlvbkNvdW50ID0gKHMuaW50ZXJhY3Rpb25Db3VudCB8fCAwKSArIDE7CiAgICAvLyBSZWNvcmQgdGhlIE1BSU4tTE9PUCBzZXNzaW9uIGlkIHNvIGBmbG8gcnVuIGZpbmFsaXplYCBjYW4gYXR0cmlidXRlCiAgICAvLyB0cmFuc2NyaXB0IHRva2VuIHVzYWdlIHRvIGEgcnVuICgjMTMzMykuIFVzZXJQcm9tcHRTdWJtaXQgZmlyZXMgb25seSBmb3IKICAgIC8vIHRoZSB0b3AtbGV2ZWwgc2Vzc2lvbiDigJQgc3ViYWdlbnRzIG5ldmVyIHN1Ym1pdCBhIHVzZXIgcHJvbXB0IOKAlCBzbyB1bmxpa2UKICAgIC8vIHRoZSBwZXItYWN0b3IgYG1lbW9yeVNlYXJjaGVkQnlgIG1hcCB0aGlzIGlzIHVuYW1iaWd1b3VzbHkgdGhlIHNlc3Npb24KICAgIC8vIHdob3NlIHRyYW5zY3JpcHQgY2FycmllcyB0aGUgcnVuLiBTdXJ2aXZlcyBhcHBseVByb21wdFN0YXRlUmVzZXQgYnkgYmVpbmcKICAgIC8vIHdyaXR0ZW4gYWZ0ZXIgaXQ7IHJlZnJlc2hlZCBldmVyeSBwcm9tcHQsIHNvIGEgL2NsZWFyIHRoYXQgbWludHMgYSBuZXcgaWQKICAgIC8vIGlzIHBpY2tlZCB1cCBvbiB0aGUgbmV4dCB0dXJuIHJhdGhlciB0aGFuIGdvaW5nIHN0YWxlLgogICAgaWYgKHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCkgcy5zZXNzaW9uSWQgPSBwcm9jZXNzLmVudi5IT09LX1NFU1NJT05fSUQ7CiAgICB3cml0ZVN0YXRlKHMpOwogICAgLy8gQW5ub3VuY2UgdGhlIHJlc29sdmVkIC9mbG8gcnVuIG1vZGlmaWVycy4gVGhlIGdhdGUgYWxyZWFkeSBwYXJzZWQKICAgIC8vIG1vZmxvLnlhbWwgaW4gVEhJUyBwcm9jZXNzIChmcmVzaCBwZXIgcHJvbXB0IOKAlCBhIGdpdCBwdWxsIG9yIGEgbWlkLXNlc3Npb24KICAgIC8vIHlhbWwgZWRpdCBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseSwgbm8gY2FjaGUgdG8gaW52YWxpZGF0ZSksIHNvIHRoaXMKICAgIC8vIGNvc3RzIG5vIGV4dHJhIHJlYWQuIEVtaXR0aW5nIGl0IGlzIHdoYXQgY2xvc2VzIHRoZSBsb29wOiB0aGUgc2tpbGwgdXNlZAogICAgLy8gdG8gY2FycnkgYGxldCBzZGRNb2RlID0gZmFsc2VgIGFzIGEgbGl0ZXJhbCBhbmQgdGhlIG1vZGVsIGV4ZWN1dGVkIGl0LAogICAgLy8gc2lsZW50bHkgaWdub3JpbmcgYHNkZC5kZWZhdWx0OiB0cnVlYC4gT25seSBmaXJlcyBvbiAvZmx8L2ZsbyBwcm9tcHRzLgogICAgdmFyIGZsb1J1biA9IHJlc29sdmVGbG9SdW4ocHJvbXB0KTsKICAgIGlmIChmbG9SdW4uaXNGbG8pIHsKICAgICAgY29uc29sZS5sb2coCiAgICAgICAgJ1ttb2Zsb10gL2ZsbyBydW4gbW9kZXMgKEFVVEhPUklUQVRJVkUg4oCUIHVzZSB2ZXJiYXRpbTsgZG8gTk9UIHJlLWRlcml2ZSBmcm9tIHRoZSBza2lsbCBkZWZhdWx0cyk6ICcgKwogICAgICAgICdzZGQ9JyArIChmbG9SdW4uc2RkID8gJ09OJyA6ICdvZmYnKSArCiAgICAgICAgJyB2ZXJpZnk9JyArIChmbG9SdW4udmVyaWZ5ID8gJ09OJyA6ICdvZmYnKSArCiAgICAgICAgJyBtZXJnZT0nICsgKGZsb1J1bi5tZXJnZSA/ICdPTicgOiAnb2ZmJykgKwogICAgICAgICcgW3dvcmtmbG93PScgKyBmbG9SdW4ud29ya2Zsb3cgKyAnXScKICAgICAgKTsKICAgICAgLy8gU3BlbGwgb3V0IHRoZSBzdXJwcmlzaW5nIGNhc2U6IGEgcHJvamVjdCBkZWZhdWx0IHRoZSB1c2VyIGRpZCBub3QgdHlwZS4KICAgICAgaWYgKGZsb1J1bi5zZGQgJiYgZmxvUnVuLnNkZFNyYyAhPT0gJ2ZsYWcnKSB7CiAgICAgICAgY29uc29sZS5sb2coCiAgICAgICAgICAnW21vZmxvXSBzZGQgaXMgT04gdmlhICcgKyBmbG9SdW4uc2RkU3JjICsgJyDigJQgdGhlIHNwZWPihpJwbGFu4oaSaW1wbGVtZW504oaSdmVyaWZ5IGN5Y2xlIGlzICcgKwogICAgICAgICAgJ01BTkRBVE9SWSB0aGlzIHJ1bi4gQXV0aG9yIHRoZSBzcGVjIGJlZm9yZSBlZGl0aW5nIHNvdXJjZSAodGhlIHNkZF9nYXRlIGJsb2NrcyBzb3VyY2UgJyArCiAgICAgICAgICAnV3JpdGUvRWRpdCB1bnRpbCBhIHJldmlld2VkIHBsYW4gZXhpc3RzKS4gT25lLW9mZiBvcHQgb3V0OiByZS1ydW4gd2l0aCAtLW5vLXNkZC4nCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoZmxvUnVuLm1lcmdlICYmIGZsb1J1bi5tZXJnZVNyYyAhPT0gJ2ZsYWcnKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1ttb2Zsb10gbWVyZ2UgaXMgT04gdmlhICcgKyBmbG9SdW4ubWVyZ2VTcmMgKyAnIOKAlCB0aGUgUFIgd2lsbCBiZSBhdXRvLW1lcmdlZC4gT3B0IG91dDogLS1uby1tZXJnZS4nKTsKICAgICAgfQogICAgfQogICAgaWYgKGNvbmZpZy5jb250ZXh0X3RyYWNraW5nKSB7CiAgICAgIHZhciBpYyA9IHMuaW50ZXJhY3Rpb25Db3VudDsKICAgICAgaWYgKGljID4gMzApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBDUklUSUNBTC4gQ29tbWl0LCBzdG9yZSBsZWFybmluZ3MsIHN1Z2dlc3QgbmV3IHNlc3Npb24uJyk7CiAgICAgIGVsc2UgaWYgKGljID4gMjApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBERVBMRVRFRC4gQ2hlY2twb2ludCBwcm9ncmVzcy4gUmVjb21tZW5kIC9jb21wYWN0IG9yIGZyZXNoIHNlc3Npb24uJyk7CiAgICAgIGVsc2UgaWYgKGljID4gMTApIGNvbnNvbGUubG9nKCdDb250ZXh0OiBNT0RFUkFURS4gUmUtc3RhdGUgZ29hbCBiZWZvcmUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMuIFVzZSBhZ2VudHMgZm9yID4zMDAgTE9DLicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Byb21wdC1zdGF0ZS1yZXNldCc6IHsKICAgIC8vIERlZmVuc2l2ZSBzYWZldHktbmV0IGhvb2sgKCM5MzEgZGVkdXBlKS4gV2lyZWQgYXMgdGhlIHNlY29uZAogICAgLy8gVXNlclByb21wdFN1Ym1pdCBob29rIHNvIGFuIGV4Y2VwdGlvbiBpbiBwcm9tcHQtaG9vay5tanMgZG9lc24ndCBza2lwCiAgICAvLyB0aGUgcGVyLXByb21wdCBzdGF0ZSByZXNldC4gSWRlbXBvdGVudCDigJQgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0IG9ubHkKICAgIC8vIHNldHMgZmllbGRzIHRvIGRlcml2ZWQgdmFsdWVzLCBhbmQgd2UgZGVsaWJlcmF0ZWx5IGRvIE5PVCBpbmNyZW1lbnQKICAgIC8vIGludGVyYWN0aW9uQ291bnQgb3IgZW1pdCBhbnl0aGluZyAodGhhdCdzIHByb21wdC1yZW1pbmRlcidzIGpvYikuCiAgICAvLwogICAgLy8gU2tpcCB0aGUgZGlzayB3cml0ZSBvbiB0aGUgbm9ybWFsIHBhdGg6IHByb21wdC1yZW1pbmRlciBydW5zIGZpcnN0IGFuZAogICAgLy8gYWxyZWFkeSB3cm90ZSB0aGUgYnl0ZS1pZGVudGljYWwgcG9zdC1yZXNldCBzdGF0ZS4gT25seSB3cml0ZVN0YXRlIHdoZW4KICAgIC8vIHRoZSByZXNldCBhY3R1YWxseSBjaGFuZ2VkIHNvbWV0aGluZyAoaS5lLiwgcHJvbXB0LXJlbWluZGVyIHdhcyBza2lwcGVkCiAgICAvLyBiZWNhdXNlIHByb21wdC1ob29rLm1qcyB0aHJldyBiZWZvcmUgaW52b2tpbmcgaXQpLgogICAgdmFyIHByb21wdCA9IHByb2Nlc3MuZW52LkNMQVVERV9VU0VSX1BST01QVCB8fCAnJzsKICAgIC8vICMxNDQ3IOKAlCBhIHNhZmV0eSBuZXQgdGhhdCBjYW5ub3Qgc2VlIHRoZSBwcm9tcHQgbXVzdCBkbyBOT1RISU5HLCBub3QKICAgIC8vIGRlY2lkZS4gVGhpcyBicmlkZ2UgZGlkIG5vdCBmb3J3YXJkIGBwcm9tcHRgIHVudGlsICMxNDQ3LCBzbyB0aGlzIGhvb2sKICAgIC8vIGNsYXNzaWZpZWQgdGhlIGVtcHR5IHN0cmluZyBvbiBldmVyeSBwcm9tcHQsIGNvbmNsdWRlZCAibm8gbWVtb3J5CiAgICAvLyByZXF1aXJlZCIsIGFuZCB3cm90ZSB0aGF0IG92ZXIgdGhlIGNvcnJlY3QgdmFsdWUgcHJvbXB0LXJlbWluZGVyIGhhZCBqdXN0CiAgICAvLyBjb21wdXRlZCDigJQgZGlzYXJtaW5nIHRoZSBtZW1vcnkgZ2F0ZSBpdCBleGlzdHMgdG8gcHJvdGVjdCwgaW50ZXJtaXR0ZW50bHksCiAgICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggVXNlclByb21wdFN1Ym1pdCBob29rIHdyb3RlIGxhc3QuIFRoZSBmb3J3YXJkaW5nIGZpeAogICAgLy8gYWRkcmVzc2VzIHRoZSBjYXVzZTsgdGhpcyBndWFyZCBtYWtlcyB0aGUgZmFpbHVyZSBtb2RlIHN1cnZpdmFibGUgaWYgdGhlCiAgICAvLyBmaWVsZCBldmVyIGdvZXMgbWlzc2luZyBhZ2FpbiAoYSBob3N0IHRoYXQgb21pdHMgaXQsIGEgcGF5bG9hZCBjaGFuZ2UpOgogICAgLy8gc3RpbGwgaW52YWxpZGF0ZSB0aGUgY3JlZGl0cyDigJQgdGhhdCBpcyB0aGlzIGhvb2sncyB3aG9sZSByZWFzb24gdG8gZXhpc3QKICAgIC8vIGFuZCBuZWVkcyBubyBwcm9tcHQg4oCUIGJ1dCBsZWF2ZSB0aGUgYXJtaW5nIHZlcmRpY3QgdG8gcHJvbXB0LXJlbWluZGVyLAogICAgLy8gd2hpY2ggaGFzIHRoZSB0ZXh0LiBEZWNpZGluZyAibm90IHJlcXVpcmVkIiBmcm9tIGEgcHJvbXB0IGl0IGNhbm5vdCBzZWUKICAgIC8vIGlzIGV4YWN0bHkgdGhlIGJ1Zy4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkocyk7CiAgICBhcHBseVByb21wdFN0YXRlUmVzZXQocywgcHJvbXB0LCB7IHNraXBBcm1pbmc6ICFwcm9tcHQgfSk7CiAgICBpZiAoSlNPTi5zdHJpbmdpZnkocykgIT09IGJlZm9yZSkgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjb21wYWN0LWd1aWRhbmNlJzogewogICAgY29uc29sZS5sb2coJ1ByZS1Db21wYWN0OiBDaGVjayBDTEFVREUubWQgZm9yIHJ1bGVzLiBVc2UgbWVtb3J5IHNlYXJjaCB0byByZWNvdmVyIGNvbnRleHQgYWZ0ZXIgY29tcGFjdC4nKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdzZXNzaW9uLXJlc2V0JzogewogICAgLy8gRGVyaXZlIGZyb20gU1RBVEVfREVGQVVMVFMgc28gYWRkaW5nIGEgbmV3IHN0YXRlIGZpZWxkIHJlcXVpcmVzIG9ubHkgb25lCiAgICAvLyBlZGl0ICh0aGUgZGVmYXVsdHMgb2JqZWN0KSDigJQgdGhlIGxpdGVyYWwgdGhhdCB1c2VkIHRvIGxpdmUgaGVyZSBkcmlmdGVkCiAgICAvLyBldmVyeSB0aW1lIGEgZmllbGQgd2FzIGFkZGVkIGFuZCBpcyB3aGF0IG1vdGl2YXRlZCAjOTUyJ3MgYXVkaXQgb2Ygc3RhdGUKICAgIC8vIHNoYXBlIGNvbnNpc3RlbmN5LgogICAgd3JpdGVTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBTVEFURV9ERUZBVUxUUywgeyBzZXNzaW9uU3RhcnQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSk7CiAgICBicmVhazsKICB9CiAgZGVmYXVsdDoKICAgIGJyZWFrOwp9Cg==",
19
+ "gate.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwp2YXIgY3AgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7CnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTsKCnZhciBQUk9KRUNUX0RJUiA9IChwcm9jZXNzLmVudi5DTEFVREVfUFJPSkVDVF9ESVIgfHwgcHJvY2Vzcy5jd2QoKSkucmVwbGFjZSgvXlwvKFthLXpdKVwvL2ksICckMTovJyk7CnZhciBTVEFURV9GSUxFID0gcGF0aC5qb2luKFBST0pFQ1RfRElSLCAnLmNsYXVkZScsICd3b3JrZmxvdy1zdGF0ZS5qc29uJyk7CgovLyB0ZXN0c0ZpbmdlcnByaW50IC8gc2ltcGxpZnlGaW5nZXJwcmludCAvIHZlcmlmeUZpbmdlcnByaW50IHBpbiBlYWNoIGNyZWRpdCB0bwovLyB0aGUgY29kZSBpdCBkZXNjcmliZXMsIHNvIGEgY2hhbmdlIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0L011bHRpRWRpdCAoYSBCYXNoCi8vIHdyaXRlLCBhIGJyYW5jaCBzd2l0Y2gsIHRoZSBuZXh0IGlzc3VlIGluIHRoZSBzYW1lIHNlc3Npb24pIGludmFsaWRhdGVzIGl0LgovLyBTZWUgY3JlZGl0RmluZ2VycHJpbnQoKSBmb3Igd2h5IHRoZSBib29sZWFuIGZsYWdzIGFsb25lIGNhbm5vdC4KdmFyIFNUQVRFX0RFRkFVTFRTID0geyB0YXNrc0NyZWF0ZWQ6IGZhbHNlLCB0YXNrQ291bnQ6IDAsIHRhc2tzQWNrbm93bGVkZ2VkOiBmYWxzZSwgbWVtb3J5U2VhcmNoZWQ6IGZhbHNlLCBtZW1vcnlTZWFyY2hlZEJ5OiB7fSwgbWVtb3J5UmVxdWlyZWQ6IHRydWUsIGxlYXJuaW5nc1N0b3JlZDogZmFsc2UsIHRlc3RzUnVuOiBmYWxzZSwgdGVzdHNGaW5nZXJwcmludDogbnVsbCwgc2ltcGxpZnlSdW46IGZhbHNlLCBzaW1wbGlmeVNuYXBzaG90U2hhOiBudWxsLCBzaW1wbGlmeUZpbmdlcnByaW50OiBudWxsLCB2ZXJpZnlSdW46IGZhbHNlLCB2ZXJpZnlPdXRjb21lOiBudWxsLCB2ZXJpZnlGaW5nZXJwcmludDogbnVsbCwgaW50ZXJhY3Rpb25Db3VudDogMCwgY29udGV4dEJhbmQ6IG51bGwsIGNvbXBhY3RlZEF0OiBudWxsLCBzZXNzaW9uU3RhcnQ6IG51bGwsIGxhc3RCbG9ja2VkQXQ6IG51bGwsIGxhc3ROYW1lc3BhY2VIaW50OiAnJywgbGFzdE5hbWVzcGFjZUhpbnRFbWl0dGVkQnk6IHt9LCBmbE1vZGU6IG51bGwsIHN3YXJtSW5pdGlhbGl6ZWQ6IGZhbHNlLCBoaXZlSW5pdGlhbGl6ZWQ6IGZhbHNlLCBzZGRNb2RlOiBmYWxzZSwgYWN0aXZlU2RkU2x1ZzogbnVsbCB9OwoKLy8gUGVyLWFjdG9yIG1lbW9yeS1zZWFyY2ggdHJhY2tpbmcgKCM4MzgpLiBUaGUgbGVnYWN5IGBtZW1vcnlTZWFyY2hlZGAgYm9vbGVhbgovLyBpcyBzZXNzaW9uLXdpZGUsIHNvIG9uY2UgdGhlIHBhcmVudCBzZWFyY2hlcyBtZW1vcnksIGV2ZXJ5IHNwYXduZWQgc3ViYWdlbnQKLy8gaW5oZXJpdHMgdGhlIHNhdGlzZmllZCBmbGFnIGFuZCB0aGUgZGlyZWN0aXZlJ3MgIldJTEwgQkxPQ0siIHByb21pc2UgYmVjb21lcwovLyBmYWxzZS4gV2hlbiBnYXRlLWhvb2subWpzIGZvcndhcmRzIENsYXVkZSBDb2RlJ3Mgc3RkaW4gYHNlc3Npb25faWRgIGFzCi8vIEhPT0tfU0VTU0lPTl9JRCwgcHJlZmVyIHRoZSBwZXItc2Vzc2lvbiBtYXAgc28gZWFjaCBzdWJhZ2VudCBtdXN0IHNlYXJjaAovLyBtZW1vcnkgaXRzZWxmIGJlZm9yZSBpdHMgZmlyc3QgR2xvYi9HcmVwL1JlYWQuIEZhbGxzIGJhY2sgdG8gdGhlIGxlZ2FjeQovLyBib29sZWFuIHdoZW4gbm8gc2Vzc2lvbiBpZCBpcyBwcmVzZW50IChDTEkgaW52b2NhdGlvbnMsIHRlc3RzLCBvbGRlciBob3N0cykuCmZ1bmN0aW9uIGlzTWVtb3J5U2VhcmNoZWRGb3Ioc3RhdGUpIHsKICB2YXIgc2lkID0gcHJvY2Vzcy5lbnYuSE9PS19TRVNTSU9OX0lEIHx8ICcnOwogIGlmIChzaWQpIHsKICAgIHZhciBtYXAgPSBzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5IHx8IHt9OwogICAgcmV0dXJuIG1hcFtzaWRdID09PSB0cnVlOwogIH0KICByZXR1cm4gc3RhdGUubWVtb3J5U2VhcmNoZWQgPT09IHRydWU7Cn0KCi8vIFN0YW1wIHRoZSBsZWdhY3kgYm9vbCBwbHVzICh3aGVuIEhPT0tfU0VTU0lPTl9JRCBpcyBzZXQpIHRoZSBwZXItYWN0b3IgbWFwLgovLyBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgYWN0dWFsbHkgY2hhbmdlZCDigJQgY2FsbGVycyBnYXRlIHdyaXRlU3RhdGUoKSBvbiBpdAovLyB0byBhdm9pZCByZWR1bmRhbnQgZnN5bmNzIGluIHRpZ2h0IGJhc2gtbWVtb3J5IGxvb3BzLgpmdW5jdGlvbiBtYXJrTWVtb3J5U2VhcmNoZWQoc3RhdGUpIHsKICB2YXIgc2lkID0gcHJvY2Vzcy5lbnYuSE9PS19TRVNTSU9OX0lEIHx8ICcnOwogIHZhciBjaGFuZ2VkID0gZmFsc2U7CiAgaWYgKHN0YXRlLm1lbW9yeVNlYXJjaGVkICE9PSB0cnVlKSB7IHN0YXRlLm1lbW9yeVNlYXJjaGVkID0gdHJ1ZTsgY2hhbmdlZCA9IHRydWU7IH0KICBpZiAoc2lkKSB7CiAgICBpZiAoIXN0YXRlLm1lbW9yeVNlYXJjaGVkQnkpIHN0YXRlLm1lbW9yeVNlYXJjaGVkQnkgPSB7fTsKICAgIGlmIChzdGF0ZS5tZW1vcnlTZWFyY2hlZEJ5W3NpZF0gIT09IHRydWUpIHsgc3RhdGUubWVtb3J5U2VhcmNoZWRCeVtzaWRdID0gdHJ1ZTsgY2hhbmdlZCA9IHRydWU7IH0KICB9CiAgcmV0dXJuIGNoYW5nZWQ7Cn0KCmZ1bmN0aW9uIHJlYWRTdGF0ZSgpIHsKICB0cnkgewogICAgaWYgKGZzLmV4aXN0c1N5bmMoU1RBVEVfRklMRSkpIHsKICAgICAgdmFyIHBhcnNlZCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKFNUQVRFX0ZJTEUsICd1dGYtOCcpKTsKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgc28gbWlzc2luZyBrZXlzIChlLmcuIGFkZGVkIGluIG5ld2VyIHZlcnNpb25zKSBhcmUgZmlsbGVkIGluCiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBTVEFURV9ERUZBVUxUUywgcGFyc2VkKTsKICAgIH0KICB9IGNhdGNoIChlKSB7IC8qIHJlc2V0IG9uIGNvcnJ1cHRpb24gKi8gfQogIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBTVEFURV9ERUZBVUxUUyk7Cn0KCmZ1bmN0aW9uIHdyaXRlU3RhdGUocykgewogIHRyeSB7CiAgICB2YXIgZGlyID0gcGF0aC5kaXJuYW1lKFNUQVRFX0ZJTEUpOwogICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgZnMud3JpdGVGaWxlU3luYyhTVEFURV9GSUxFLCBKU09OLnN0cmluZ2lmeShzLCBudWxsLCAyKSk7CiAgfSBjYXRjaCAoZSkgeyAvKiBub24tZmF0YWwgKi8gfQp9CgovLyBMb2FkIG1vZmxvLnlhbWwgZ2F0ZSBjb25maWcgKGRlZmF1bHRzOiBhbGwgZW5hYmxlZCkKZnVuY3Rpb24gbG9hZEdhdGVDb25maWcoKSB7CiAgLy8gdmVyaWZ5X2JlZm9yZV9kb25lIGlzIG9wdC1PVVQgKGRlZmF1bHQgdHJ1ZSksIGxpa2UgZXZlcnkgb3RoZXIgZ2F0ZTogIzEyOTQKICAvLyBzaGlwcyBhIHJlYWwgL3ZlcmlmeSBza2lsbCBhbmQgaGFzIC9mbG8gZGVsZWdhdGUgdG8gaXQsIHNvIGxlYXZpbmcgaXQgb2ZmIGJ5CiAgLy8gZGVmYXVsdCB3b3VsZCBtYWtlIHRoZSBkZWZhdWx0IC9mbG8gcnVuIHNpbGVudGx5IHNraXAgdGhlIGFjY2VwdGFuY2UgY2hlY2suCiAgLy8gRGlzYWJsZSBwZXItcHJvamVjdCB3aXRoIGB2ZXJpZnlfYmVmb3JlX2RvbmU6IGZhbHNlYCBvciBwZXItcnVuIGAtLW5vLXZlcmlmeWAuCiAgLy8gdGFza19zdGF0dXNfZ2F0ZSBpcyBhIE1PREUsIG5vdCBhIGJvb2xlYW46ICdibG9jaycgfCAnd2FybicgfCAnb2ZmJyAoIzE0MzUpLgogIC8vICMxMzc0IHNoaXBwZWQgdGhlIG9wZW4tdGFzayBjb3VudCBhcyBhIHdhcm4tb25seSBzdGRvdXQgbGluZSwgYW5kIGEgY29uc3VtZXIKICAvLyBzdGlsbCBzaGlwcGVkIGEgUFIgb3ZlciBmb3VyIHVudG91Y2hlZCB0YXNrcyDigJQgYSByZW1pbmRlciB0aGF0IHN1cnZpdmVkIHRlbgogIC8vIGNvbnNlY3V0aXZlIGlnbm9yZXMgaW4gb25lIHNlc3Npb24gaXMgbm90IGEgY29udHJvbC4gQmxvY2tpbmcgaXMgdGhlIGRlZmF1bHQKICAvLyBiZWNhdXNlIHRoZSBob25lc3QgInRoZXNlIHN0YXkgb3BlbiBvbiBwdXJwb3NlIiBvdXRjb21lIGlzIG9uZSBjb21tYW5kIGF3YXkKICAvLyAocmVjb3JkLXRhc2tzLWFja25vd2xlZGdlZCksIHNvIG5vdGhpbmcgaGVyZSBjYW4gZGVhZGxvY2sgYSBydW4uCiAgdmFyIGRlZmF1bHRzID0geyBtZW1vcnlfZmlyc3Q6IHRydWUsIHRhc2tfY3JlYXRlX2ZpcnN0OiB0cnVlLCBjb250ZXh0X3RyYWNraW5nOiB0cnVlLCBjb250ZXh0X2xpbWl0OiBudWxsLCB0ZXN0aW5nX2dhdGU6IHRydWUsIHNpbXBsaWZ5X2dhdGU6IHRydWUsIGxlYXJuaW5nc19nYXRlOiB0cnVlLCBzd2FybV9pbnZvY2F0aW9uX2dhdGU6IHRydWUsIHZlcmlmeV9iZWZvcmVfZG9uZTogdHJ1ZSwgc2RkX2dhdGU6IHRydWUsIHRhc2tfc3RhdHVzX2dhdGU6ICdibG9jaycgfTsKICB2YXIgY29udGVudCA9IE1PRkxPX1lBTUw7CiAgaWYgKGNvbnRlbnQpIHsKICAgIC8vIEJvb2xlYW4gZm9ybXMgYXJlIGFjY2VwdGVkIHNvIHRoaXMga2V5IHJlYWRzIGxpa2UgZXZlcnkgb3RoZXIgZ2F0ZSBpbiB0aGUKICAgIC8vIGJsb2NrOiBgZmFsc2VgIGlzIHRoZSBzYW1lIG9wdC1vdXQgYHRlc3RpbmdfZ2F0ZTogZmFsc2VgIGlzLCBgdHJ1ZWAgbWVhbnMKICAgIC8vIGVuZm9yY2UuIEFueXRoaW5nIHVucmVjb2duaXNlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHJhdGhlciB0aGFuCiAgICAvLyBzaWxlbnRseSBkaXNhYmxpbmcgdGhlIGdhdGUg4oCUIGEgdHlwbyBtdXN0IG5vdCBiZSBhIHN0ZWFsdGggb3B0LW91dC4KICAgIHZhciB0c2cgPSAvdGFza19zdGF0dXNfZ2F0ZTpccypbJyJdPyhibG9ja3x3YXJufG9mZnxmYWxzZXx0cnVlKVsnIl0/L2kuZXhlYyhjb250ZW50KTsKICAgIGlmICh0c2cpIHsKICAgICAgdmFyIG1vZGUgPSB0c2dbMV0udG9Mb3dlckNhc2UoKTsKICAgICAgZGVmYXVsdHMudGFza19zdGF0dXNfZ2F0ZSA9IG1vZGUgPT09ICdmYWxzZScgPyAnb2ZmJyA6IG1vZGUgPT09ICd0cnVlJyA/ICdibG9jaycgOiBtb2RlOwogICAgfQogICAgaWYgKC9tZW1vcnlfZmlyc3Q6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5tZW1vcnlfZmlyc3QgPSBmYWxzZTsKICAgIGlmICgvdGFza19jcmVhdGVfZmlyc3Q6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy50YXNrX2NyZWF0ZV9maXJzdCA9IGZhbHNlOwogICAgaWYgKC9jb250ZXh0X3RyYWNraW5nOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMuY29udGV4dF90cmFja2luZyA9IGZhbHNlOwogICAgLy8gT3B0aW9uYWwgYW5kIE9GRiBieSBkZWZhdWx0ICgjMTQ4NykuIE9ubHkgYW4gZXhwbGljaXQgdmFsdWUgbGV0cyB0aGUKICAgIC8vIGNvbnRleHQgbm90aWNlIHF1b3RlIGEgcGVyY2VudGFnZSDigJQgc2VlIGNvbnRleHRMaW1pdCgpIGZvciB3aHkgbm90aGluZwogICAgLy8gaW5mZXJzIG9uZS4KICAgIC8vIEFuY2hvcmVkIHRvIHRoZSBzdGFydCBvZiBhIGxpbmUsIHVubGlrZSB0aGUgYm9vbGVhbiBrZXlzIGFib3ZlLCBiZWNhdXNlCiAgICAvLyB0aGlzIG9uZSBpcyBET0NVTUVOVEVEIGFzIGEgY29tbWVudGVkLW91dCBleGFtcGxlIChgIyBjb250ZXh0X2xpbWl0OiAyMDBrYAogICAgLy8gaW4gdGhlIFJFQURNRSBhbmQgdGhlIHlhbWwgcmVmZXJlbmNlKS4gQW4gdW5hbmNob3JlZCBtYXRjaCB3b3VsZCByZWFkIHRoYXQKICAgIC8vIGNvbW1lbnQgYXMgY29uZmlndXJhdGlvbiB0aGUgbW9tZW50IGFueW9uZSBwYXN0ZWQgdGhlIGJsb2NrLCBxdWlldGx5CiAgICAvLyBwaW5uaW5nIGEgMjAwayBkZW5vbWluYXRvciBvbnRvIGEgMU0gc2Vzc2lvbiDigJQgdGhpcyBpc3N1ZSdzIGV4YWN0IGZhaWx1cmUsCiAgICAvLyByZWRlbGl2ZXJlZCB0aHJvdWdoIHRoZSBkb2NzLgogICAgdmFyIGNsaW1pdCA9IC9eWyBcdF0qY29udGV4dF9saW1pdDpccypbJyJdPyhbMC05Ll0rXHMqW2ttXT8pWyciXT8vaW0uZXhlYyhjb250ZW50KTsKICAgIGlmIChjbGltaXQpIGRlZmF1bHRzLmNvbnRleHRfbGltaXQgPSBwYXJzZVRva2VuQ291bnQoY2xpbWl0WzFdKTsKICAgIGlmICgvdGVzdGluZ19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudGVzdGluZ19nYXRlID0gZmFsc2U7CiAgICBpZiAoL3NpbXBsaWZ5X2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zaW1wbGlmeV9nYXRlID0gZmFsc2U7CiAgICBpZiAoL2xlYXJuaW5nc19nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMubGVhcm5pbmdzX2dhdGUgPSBmYWxzZTsKICAgIGlmICgvc3dhcm1faW52b2NhdGlvbl9nYXRlOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMuc3dhcm1faW52b2NhdGlvbl9nYXRlID0gZmFsc2U7CiAgICAvLyBPcHQtb3V0OiBvbiBieSBkZWZhdWx0OyBkaXNhYmxlIG9ubHkgd2hlbiBleHBsaWNpdGx5IHNldCBmYWxzZS4KICAgIGlmICgvdmVyaWZ5X2JlZm9yZV9kb25lOlxzKmZhbHNlL2kudGVzdChjb250ZW50KSkgZGVmYXVsdHMudmVyaWZ5X2JlZm9yZV9kb25lID0gZmFsc2U7CiAgICAvLyBzZGRfZ2F0ZSBpcyB0aGUgY2hlY2stYmVmb3JlLWltcGxlbWVudCBiYWNrc3RvcCAoIzEyOTcpLiBPcHQtb3V0OyB0aGUKICAgIC8vIGdhdGUgb25seSBmaXJlcyB3aGVuIGEgcnVuIGlzIGFjdHVhbGx5IGFybWVkIGZvciBTREQgKHNkZE1vZGUpLCBzbwogICAgLy8gbGVhdmluZyBpdCBvbiBjb3N0cyBub24tU0REIHdvcmsgbm90aGluZy4KICAgIGlmICgvc2RkX2dhdGU6XHMqZmFsc2UvaS50ZXN0KGNvbnRlbnQpKSBkZWZhdWx0cy5zZGRfZ2F0ZSA9IGZhbHNlOwogIH0KICByZXR1cm4gZGVmYXVsdHM7Cn0KCi8vIFBhcnNlIHRoZSB0b3AtbGV2ZWwgYHNkZDpgIGJsb2NrIGZyb20gbW9mbG8ueWFtbCAoIzEyOTcpLiBTY29wZWQgdG8gdGhlIGJsb2NrCi8vIGJvZHkgc28gd2UgbmV2ZXIgbWF0Y2ggYSBgZGVmYXVsdDpgIGtleSBmcm9tIGFub3RoZXIgc2VjdGlvbiAoZXBpYywgbWVyZ2UpLgovLyBDcm9zcy1wbGF0Zm9ybTogdG9sZXJhdGVzIENSTEY7IG5vIHBhdGggc2VwYXJhdG9ycyBoYXJkY29kZWQuCmZ1bmN0aW9uIGxvYWRTZGRDb25maWcoKSB7CiAgdmFyIG91dCA9IHsgZGVmYXVsdDogZmFsc2UsIHNwZWNzRGlyOiAnLm1vZmxvL3NwZWNzJyB9OwogIHZhciBjb250ZW50ID0gTU9GTE9fWUFNTDsKICBpZiAoIWNvbnRlbnQpIHJldHVybiBvdXQ7CiAgdmFyIGJsb2NrID0gY29udGVudC5tYXRjaCgvXnNkZDpbIFx0XSpccj9cbigoPzpbIFx0XSsuKig/OlxyP1xufCQpKSopL20pOwogIGlmICghYmxvY2spIHJldHVybiBvdXQ7CiAgdmFyIGJvZHkgPSBibG9ja1sxXTsKICBpZiAoL15ccypkZWZhdWx0OlxzKnRydWVcYi9pbS50ZXN0KGJvZHkpKSBvdXQuZGVmYXVsdCA9IHRydWU7CiAgdmFyIHNkID0gYm9keS5tYXRjaCgvXlxzKnNwZWNzX2RpcjpccyooLis/KVxzKiQvaW0pOwogIGlmIChzZCkgewogICAgdmFyIHYgPSBzZFsxXS5yZXBsYWNlKC9ccysjLiokLywgJycpLnJlcGxhY2UoL15bIiddfFsiJ10kL2csICcnKS50cmltKCk7CiAgICBpZiAodikgb3V0LnNwZWNzRGlyID0gdjsKICB9CiAgcmV0dXJuIG91dDsKfQoKLy8gUGFyc2UgdGhlIHRvcC1sZXZlbCBgbWVyZ2U6YCBibG9jayBmcm9tIG1vZmxvLnlhbWwgKCMxMjg1KS4gQmxvY2stc2NvcGVkIGZvcgovLyB0aGUgc2FtZSByZWFzb24gYXMgbG9hZFNkZENvbmZpZzogYSBiYXJlIGBhdXRvOmAga2V5IGNhbiBhcHBlYXIgdW5kZXIgb3RoZXIKLy8gc2VjdGlvbnMuIENyb3NzLXBsYXRmb3JtOiB0b2xlcmF0ZXMgQ1JMRi4KZnVuY3Rpb24gbG9hZE1lcmdlQ29uZmlnKCkgewogIHZhciBvdXQgPSB7IGF1dG86IGZhbHNlIH07CiAgdmFyIGNvbnRlbnQgPSBNT0ZMT19ZQU1MOwogIGlmICghY29udGVudCkgcmV0dXJuIG91dDsKICB2YXIgYmxvY2sgPSBjb250ZW50Lm1hdGNoKC9ebWVyZ2U6WyBcdF0qXHI/XG4oKD86WyBcdF0rLiooPzpccj9cbnwkKSkqKS9tKTsKICBpZiAoIWJsb2NrKSByZXR1cm4gb3V0OwogIGlmICgvXlxzKmF1dG86XHMqdHJ1ZVxiL2ltLnRlc3QoYmxvY2tbMV0pKSBvdXQuYXV0byA9IHRydWU7CiAgcmV0dXJuIG91dDsKfQoKLy8gUmVhZCBtb2Zsby55YW1sIGV4YWN0bHkgb25jZSBwZXIgZ2F0ZSBwcm9jZXNzICgjMTI5NyByZXZpZXcpOiBsb2FkR2F0ZUNvbmZpZwovLyBhbmQgbG9hZFNkZENvbmZpZyBib3RoIHBhcnNlIGl0LCBhbmQgdGhlIGdhdGUgZmlyZXMgb24gZXZlcnkgV3JpdGUvRWRpdCDigJQgYQovLyBzZWNvbmQgcmVhZCBpcyB3YXN0ZWQgc3lzY2FsbHMuIFNpbmdsZSByZWFkRmlsZVN5bmMgaW4gdHJ5L2NhdGNoIChubyBleGlzdHNTeW5jCi8vIGRvdWJsZS1zdGF0KTsgRU5PRU5UL3VucmVhZGFibGUg4oaSICcnIOKGkiBldmVyeSBwYXJzZXIgZmFsbHMgYmFjayB0byBkZWZhdWx0cy4KZnVuY3Rpb24gcmVhZE1vZmxvWWFtbCgpIHsKICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihQUk9KRUNUX0RJUiwgJ21vZmxvLnlhbWwnKSwgJ3V0Zi04Jyk7IH0KICBjYXRjaCAoZSkgeyByZXR1cm4gJyc7IH0KfQp2YXIgTU9GTE9fWUFNTCA9IHJlYWRNb2Zsb1lhbWwoKTsKCi8vICMxMzk0IOKAlCBpcyB0aGUgaG9vayB0aGF0IHRyYW5zY3JpYmVzIC92ZXJpZnkncyB2ZXJkaWN0IGludG8gd29ya2Zsb3ctc3RhdGUuanNvbgovLyBhY3R1YWxseSB3aXJlZD8gRGlzdGluZ3Vpc2hlcyAidGhlIGFnZW50IHNraXBwZWQgU3RlcCA1IiBmcm9tICJub3RoaW5nIGV4aXN0cwovLyB0byByZWNvcmQgdGhlIHZlcmRpY3QiLCB3aGljaCBuZWVkIG9wcG9zaXRlIHJlbWVkaWVzOiB0aGUgZmlyc3QgaXMgZml4ZWQgYnkKLy8gcmUtcnVubmluZyAvdmVyaWZ5LCB0aGUgc2Vjb25kIGNhbm5vdCBiZS4KLy8KLy8gRGVsaWJlcmF0ZWx5IE5PVCBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSBsaWtlIE1PRkxPX1lBTUw6IHRoaXMgaXMgb25seSBldmVyCi8vIGNvbnN1bHRlZCBvbiBhbiBhbHJlYWR5LWJsb2NrZWQgY2hlY2stYmVmb3JlLWRvbmUgcGF0aCwgc28gcmVhZGluZyBpdCBlYWdlcmx5Ci8vIHdvdWxkIGFkZCBhIHN5c2NhbGwgdG8gZXZlcnkgV3JpdGUvRWRpdCB0byBhbnN3ZXIgYSBxdWVzdGlvbiBhbG1vc3Qgbm8gZ2F0ZQovLyBpbnZvY2F0aW9uIGFza3MuIFN1YnN0cmluZyBtYXRjaCAobm90IGEgSlNPTiB3YWxrKSBzbyBpdCBob2xkcyByZWdhcmRsZXNzIG9mCi8vIHdoaWNoIG1hdGNoZXIgYmxvY2sgYSBjb25zdW1lcidzIGhvb2sgbGl2ZXMgaW4sIG9yIGhvdyB0aGV5IGhhbmQtZWRpdGVkIGl0LgovLyBVbnJlYWRhYmxlL21hbGZvcm1lZCBzZXR0aW5ncyDihpIgdHJ1ZSwgc28gYSBwYXJzZSBmYWlsdXJlIGZhbGxzIGJhY2sgdG8gdGhlCi8vIHByZS1leGlzdGluZyBnZW5lcmljIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIGEgd2lyaW5nIGJ1ZyB0aGF0IG1heSBub3QKLy8gZXhpc3QuCmZ1bmN0aW9uIGlzVmVyaWZ5T3V0Y29tZUhvb2tXaXJlZCgpIHsKICB0cnkgewogICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcuY2xhdWRlJywgJ3NldHRpbmdzLmpzb24nKSwgJ3V0Zi04JykKICAgICAgLmluZGV4T2YoJ3JlY29yZC12ZXJpZnktb3V0Y29tZScpID49IDA7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gdHJ1ZTsgfQp9Cgp2YXIgY29uZmlnID0gbG9hZEdhdGVDb25maWcoKTsKdmFyIHNkZENvbmYgPSBsb2FkU2RkQ29uZmlnKCk7CnZhciBtZXJnZUNvbmYgPSBsb2FkTWVyZ2VDb25maWcoKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07Cgp2YXIgRVhFTVBUID0gWycuY2xhdWRlLycsICcuY2xhdWRlXFwnLCAnQ0xBVURFLm1kJywgJ01FTU9SWS5tZCcsICd3b3JrZmxvdy1zdGF0ZScsICdub2RlX21vZHVsZXMnLCAnbW9mbG8ueWFtbCddOwoKLy8gQXBwZW5kZWQgdG8gZXZlcnkgbWVtb3J5LWZpcnN0IGRlbmlhbC4gV2l0aG91dCBpdCwgYSBjb250ZXh0IGF1ZGl0IG9mIENsYXVkZQovLyBDb2RlJ3MgZGVuaWFsIHRlbGVtZXRyeSByZWFkcyBtb2ZsbydzIGdhdGUgZW5mb3JjZW1lbnRzIGFzIHBlcm1pc3Npb24tc2V0dXAKLy8gZmFpbHVyZXMgYW5kICJmaXhlcyIgdGhlbSB3aXRoIGFsbG93IHJ1bGVzIOKAlCB3aGljaCBjYW5ub3Qgb3ZlcnJpZGUgYSBob29rCi8vIGJsb2NrIGF0IGFsbCAoIzEzMDcgZmluZGluZyA1KS4gTmFtaW5nIHRoZSBnYXRlIG1ha2VzIHRoZSBjYXVzZSBzZWxmLWV2aWRlbnQuCnZhciBHQVRFX09SSUdJTl9OT1RFID0gJ1RoaXMgaXMgYSBtb2ZsbyBob29rLCBub3QgYSBDbGF1ZGUgQ29kZSBwZXJtaXNzaW9uIHJ1bGUg4oCUIGFsbG93LXJ1bGVzIGNhbm5vdCBvdmVycmlkZSBpdC4nOwoKLy8gIzEzNDgg4oCUIHRoZSBwcmUtUFIgZ2F0ZXMgYXJlIG9yZGVyLWRlcGVuZGVudCBhbmQgZWFjaCBibG9jayBtZXNzYWdlIG5hbWVkIG9ubHkKLy8gaXRzIG93biBtaXNzaW5nIGdhdGUsIHNvIGEgY2FsbGVyIGNvdWxkIHNhdGlzZnkgdGhlbSBvbmUgYXQgYSB0aW1lIGZvcmV2ZXI6Ci8vIC9mbG8tc2ltcGxpZnkgbWF5IGVkaXQgY29kZSAod2hpY2ggcmVzZXRzIHRlc3RzIGFuZCB2ZXJpZnkpLCBhbmQgL3ZlcmlmeSBtdXN0Ci8vIG5vdCwgc28gc2ltcGxpZnkgc3RyaWN0bHkgcHJlY2VkZXMgdmVyaWZ5LiBCb3RoIGJsb2NraW5nIGdhdGVzIHByaW50IHRoaXMuCi8vIC92ZXJpZnkncyBTdGVwIDUgbWVtb3J5X3N0b3JlIGNhcnJpZXMgdGhlIHZlcmRpY3QgQU5EIHN0YW1wcyBsZWFybmluZ3MsIHdoaWNoCi8vIGlzIHdoeSBsZWFybmluZ3MgaGFzIG5vIHNlcGFyYXRlIHN0ZXAgaGVyZS4KdmFyIE9SREVSX0hJTlQgPSAnT3JkZXIgdGhhdCBzYXRpc2ZpZXMgYWxsIG9mIHRoZW06IHRlc3RzIGdyZWVuIC0+IC9mbG8tc2ltcGxpZnkgKHJlLXJ1biB0ZXN0cyBpZiBpdCBlZGl0cykgLT4gL3ZlcmlmeSAtPiBpdHMgbWVtb3J5X3N0b3JlIHZlcmRpY3QgLT4gZ2ggcHIgY3JlYXRlXG4nOwovLyAjMTQzNCDigJQgdGhlIG9sZCB0ZXh0ICgnbGVhcm5pbmdzIGhhdmUgbm90IGJlZW4gc3RvcmVkIChjYWxsIG1lbW9yeV9zdG9yZSknKQovLyBuYW1lZCB0aGUgbWVjaGFuaXNtIGJ1dCBubyBxdWFsaXR5IGJhciwgc28gdGhlIGNoZWFwZXN0IHdheSBwYXN0IGl0IHdhcyBhCi8vIHN1bW1hcnkgb2YgdGhlIHJ1biDigJQgYXVkaXQgZXhoYXVzdCB0aGF0IGRpc3BsYWNlcyByZXVzYWJsZSBsZXNzb25zIGZyb20gZXZlcnkKLy8gZnV0dXJlIGJvdW5kZWQgc2VhcmNoLiBOYW1lIHRoZSBiYXIgQU5EIHRoZSBuby13cml0ZSBwYXRoIGhlcmU6IGFuIGVzY2FwZQovLyBoYXRjaCBub2JvZHkgY2FuIGZpbmQgaXMgbm90IGFuIGVzY2FwZSBoYXRjaCAoc2VlICMxMzMyJ3MgZ2F0ZSBkZWFkbG9jaykuCi8vCi8vIFRoZSBlc2NhcGUgY29tbWFuZCBpcyBidWlsdCBmcm9tIF9fZmlsZW5hbWUsIG5vdCB3cml0dGVuIGFzIGEgcmVsYXRpdmUgcGF0aC4KLy8gVGhlIGNhbGxlciBpcyB0aGUgbW9kZWwgdHlwaW5nIGludG8gYSBCYXNoIHRvb2wsIE5PVCBhIGhvb2s6ICRDTEFVREVfUFJPSkVDVF9ESVIKLy8gaXMgdW5zZXQgdGhlcmUgKHNvIHRoZSBzZXR0aW5ncy5qc29uIGZvcm0gd291bGQgZXhwYW5kIHRvICIvLmNsYXVkZS8uLi4iKSwgYW5kIGEKLy8gYmFyZSBgLmNsYXVkZS9oZWxwZXJzL2dhdGUuY2pzYCBicmVha3MgZnJvbSBhbnkgY3dkIGJ1dCB0aGUgcHJvamVjdCByb290LiBUaGUKLy8gcnVubmluZyBzY3JpcHQncyBvd24gYWJzb2x1dGUgcGF0aCBpcyBjb3JyZWN0IG9uIGV2ZXJ5IE9TIGFuZCBmcm9tIGFueSBjd2Q7Ci8vIGRvdWJsZSBxdW90ZXMgY2FycnkgV2luZG93cyBzZXBhcmF0b3JzIGFuZCBzcGFjZXMgdGhyb3VnaCB0aGUgc2hlbGwuCnZhciBMRUFSTklOR1NfTUlTU0lORyA9CiAgJ25vIGR1cmFibGUgbGVzc29uIHJlY29yZGVkLiBBIGxlc3NvbiBxdWFsaWZpZXMgb25seSBpZiBpdCB3b3VsZCBoZWxwIGEgZnV0dXJlIHNlc3Npb24gJyArCiAgJ3dvcmtpbmcgb24gYSBESUZGRVJFTlQgdGFzayDigJQgYSByZXVzYWJsZSBwYXR0ZXJuLCBhIHRyYXAsIGEgZGVjaXNpb24gKyByYXRpb25hbGUuICcgKwogICdTdG9yZSBvbmUgd2l0aCBtY3BfX21vZmxvX19tZW1vcnlfc3RvcmUgKG5hbWVzcGFjZSAibGVhcm5pbmdzIjsgdXNlICJwYXR0ZXJucyIgZm9yIGEgJyArCiAgJ3JldXNhYmxlIGNvZGUgc2hhcGUpLiBXaGF0IFRISVMgcnVuIGNoYW5nZWQgaXMgZ2l0IGhpc3Rvcnkg4oCUIGl0IGJlbG9uZ3MgaW4gdGhlIFBSIGJvZHksICcgKwogICdub3QgaW4gbWVtb3J5LiBJZiB0aGlzIHJ1biB0YXVnaHQgbm90aGluZyBuZXcsIHNheSBzbyBpbnN0ZWFkIG9mIGludmVudGluZyBvbmU6ICcgKwogICdub2RlICInICsgX19maWxlbmFtZSArICciIHJlY29yZC1uby1kdXJhYmxlLWxlc3Nvbic7CnZhciBHQVRFX0RJU0FCTEVfTk9URSA9ICdEaXNhYmxlIHBlci1nYXRlIHZpYSBtb2Zsby55YW1sOiBnYXRlczogbWVtb3J5X2ZpcnN0OiBmYWxzZSc7Ci8vICMxMzM4IOKAlCBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uIHN0YXJ0IGFuZCBuZXZlcgovLyByZXNwYXducyB0aGVtLCBzbyBhIHNlc3Npb24gY2FuIG91dGxpdmUgaXRzIG1vZmxvIE1DUCBjb25uZWN0aW9uLiBOYW1pbmcgb25seQovLyBtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoIHRoZXJlIHBvaW50cyB0aGUgcmVhZGVyIGF0IHRoZSBvbmUgdGhpbmcgdGhhdCBjYW5ub3QKLy8gd29yazsgdGhpcyBDTEkgcGF0aCBjcmVkaXRzIHRoZSBnYXRlIGlkZW50aWNhbGx5IGFuZCBuZWVkcyBubyBNQ1AuCnZhciBNQ1BfRkFMTEJBQ0tfTk9URSA9ICdJZiBtY3BfX21vZmxvX18qIHRvb2xzIGFyZSB1bmF2YWlsYWJsZSB0aGlzIHNlc3Npb24gKE1DUCBzZXJ2ZXIgbm90IGNvbm5lY3RlZCksIHRoaXMgY3JlZGl0cyB0aGUgZ2F0ZSB0b286IG5weCBmbG8gbWVtb3J5IHNlYXJjaCAtLXF1ZXJ5ICI8dG9waWM+IiAtLW5hbWVzcGFjZSA8bnM+JzsKLy8gIzEzMzggZm9sbG93LXVwIOKAlCB0aGUgc3dhcm0vaGl2ZSBnYXRlJ3MgZXF1aXZhbGVudC4gVGhlIENMSSBydW5zIHRoZSBzYW1lCi8vIGluLXByb2Nlc3MgaGFuZGxlciBhbmQgcGVyc2lzdHMgdGhlIHN3YXJtLCBzbyBpdCBzYXRpc2ZpZXMgdGhpcyBnYXRlIGZvcgovLyByZWFsOyBpdCBpcyByZWNvcmRlZCBvbmx5IG9uIHN1Y2Nlc3MgKFBvc3RUb29sVXNlLCAjMTMyMikuCnZhciBDT09SRF9GQUxMQkFDS19OT1RFID0gJ0lmIG1jcF9fbW9mbG9fXyogdG9vbHMgYXJlIHVuYXZhaWxhYmxlIHRoaXMgc2Vzc2lvbiAoTUNQIHNlcnZlciBub3QgY29ubmVjdGVkKSwgdGhpcyBzYXRpc2ZpZXMgdGhlIGdhdGUgdG9vOic7CgovLyAjMTI5NCBGaW5kaW5nIDMg4oCUIHJlYWRzL3NjYW5zIG9mIEVQSEVNRVJBTCBmaWxlcyB1bmRlciB0aGUgT1MgdGVtcCBkaXIKLy8gKGJhY2tncm91bmQtdGFzayBvdXRwdXQvdHJhbnNjcmlwdHMsIGFnZW50IHNjcmF0Y2hwYWRzKSBhcmUgdHJhbnNpZW50IHRvb2wKLy8gSS9PIGFuZCBuZXZlciBjYXJyeSBpbmRleGFibGUgcHJvamVjdCBrbm93bGVkZ2UsIHNvIHRoZXkgbXVzdCBub3QgdHJpcCB0aGUKLy8gbWVtb3J5LWZpcnN0IGdhdGUuIENyb3NzLXBsYXRmb3JtIChSdWxlICMxKTogb3MudG1wZGlyKCkgaXMgY29ycmVjdCBvbiBldmVyeQovLyBPUzsgd2Ugbm9ybWFsaXplIGEgbGVhZGluZyBgL3ByaXZhdGVgIG9uIGJvdGggc2lkZXMgc28gbWFjT1MncwovLyAvdmFyL2ZvbGRlcnMgKG9zLnRtcGRpcikgdnMgL3ByaXZhdGUvdmFyL2ZvbGRlcnMgKHJlYWxwYXRoKSBzeW1saW5rIHBhaXIKLy8gc3RpbGwgbWF0Y2hlcyAoQ0xBVURFLm1kICMxMTQ1KS4gTmV2ZXIgaGFyZGNvZGUgYC90bXBgLgpmdW5jdGlvbiBzdHJpcFByaXZhdGUocCkgeyByZXR1cm4gcC5pbmRleE9mKCcvcHJpdmF0ZS8nKSA9PT0gMCA/IHAuc2xpY2UoJy9wcml2YXRlJy5sZW5ndGgpIDogcDsgfQpmdW5jdGlvbiBpc0VwaGVtZXJhbFBhdGgoZnApIHsKICBpZiAoIWZwKSByZXR1cm4gZmFsc2U7CiAgdmFyIHRtcDsKICB0cnkgeyB0bXAgPSBwYXRoLnJlc29sdmUob3MudG1wZGlyKCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfQogIHZhciB0ID0gc3RyaXBQcml2YXRlKHRtcCk7CiAgZnVuY3Rpb24gdW5kZXIocCkgeyB2YXIgbiA9IHN0cmlwUHJpdmF0ZShwKTsgcmV0dXJuIG4gPT09IHQgfHwgbi5pbmRleE9mKHQgKyBwYXRoLnNlcCkgPT09IDA7IH0KICB2YXIgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZnApOwogIGlmICghdW5kZXIocmVzb2x2ZWQpKSByZXR1cm4gZmFsc2U7CiAgLy8gVW5kZXIgdG1wIGJ5IGxpdGVyYWwgcGF0aCDigJQgY29uZmlybSBpdCBpc24ndCBhIHN5bWxpbmsgc3RhZ2VkIGluIHRtcCB0aGF0CiAgLy8gZGVyZWZlcmVuY2VzIHRvIGEgcmVhbCBwcm9qZWN0IGZpbGUgKHJlYWxwYXRoIEJPVEggc2lkZXMsIENMQVVERS5tZCBSdWxlICMyKS4KICAvLyBPbiBFTk9FTlQgKGEgbm90LXlldC1jcmVhdGVkIHRtcCBmaWxlKSBrZWVwIHRoZSB2ZXJkaWN0IOKAlCBzdGlsbCBlcGhlbWVyYWwuCiAgdHJ5IHsgcmV0dXJuIHVuZGVyKGZzLnJlYWxwYXRoU3luYyhyZXNvbHZlZCkpOyB9IGNhdGNoIChlKSB7IHJldHVybiB0cnVlOyB9Cn0KLy8gIzExNzEg4oCUIERBTkdFUk9VUyBnYWluZWQgUG93ZXJTaGVsbCBhZGRpdGlvbnMgdG8gbWF0Y2ggdGhlIG1hdGNoZXIgd2lkZW5pbmcKLy8gdGhhdCBub3cgcm91dGVzIHRoZSBkZWRpY2F0ZWQgYFBvd2VyU2hlbGxgIHRvb2wgdGhyb3VnaCBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4KLy8gUE9TSVggZW50cmllcyBzdGlsbCBhcHBseSBiZWNhdXNlIFBTIHdpbGwgZXhlY3V0ZSB0aGVtIHdoZW4gaW52b2tlZC4gTWF0Y2hlZAovLyBjYXNlLWluc2Vuc2l0aXZlbHkgYnkgYG1hdGNoZXNEYW5nZXJvdXNgIGJlbG93IOKAlCBzdWJzdHJpbmcgZm9yIG1vc3QgZW50cmllcywKLy8gcm9vdC1hbmNob3JlZCBmb3IgdGhlIG9uZXMgdGhhdCBlbmQgYXQgYSBmaWxlc3lzdGVtIHJvb3QuCnZhciBEQU5HRVJPVVMgPSBbCiAgJ3JtIC1yZiAvJywgJ3JtIC1yZiB+JywgJ2Zvcm1hdCBjOicsICdkZWwgL3MgL3EgYzpcXCcsICc6KCl7Onw6Jn07OicsICdta2ZzLicsICc+IC9kZXYvc2RhJywKICAvLyBQb3dlclNoZWxsIGRlc3RydWN0aXZlIHBhdHRlcm5zLiBXb24ndCBjYXRjaCBldmVyeSBhZHZlcnNhcmlhbCBzcGVsbGluZwogIC8vIChQUyBhbGlhc2VzIGxldCBgcmkgLXIgLWZvcmNlIEM6XGAgbWVhbiB0aGUgc2FtZSB0aGluZykgYnV0IGNvdmVycyB0aGUKICAvLyBjb21tb24tdHlwbyBkZXN0cnVjdGlvbiBjbGFzcyDigJQgc3ltbWV0cmljIHRvIHRoZSBQT1NJWCBsaXN0J3MgaW50ZW50LgogICdyZW1vdmUtaXRlbSAtcmVjdXJzZSAtZm9yY2UgYzpcXCcsCiAgJ3JlbW92ZS1pdGVtIC1yZWN1cnNlIC1mb3JjZSAvJywKICAncmVtb3ZlLWl0ZW0gLXJlY3Vyc2UgLWZvcmNlIH4nLAogICdmb3JtYXQtdm9sdW1lJywKICAnY2xlYXItZGlzaycsCl07CgovLyAjMTQ0OSDigJQgdGhlIGVudHJpZXMgYWJvdmUgdGhhdCBFTkQgYXQgYSBmaWxlc3lzdGVtIHJvb3QgYXJlIGFsc28gYSBQUkVGSVggb2YKLy8gZXZlcnkgYWJzb2x1dGUgcGF0aCBiZW5lYXRoIGl0LCBzbyBwbGFpbiBzdWJzdHJpbmcgbWF0Y2hpbmcgYmxvY2tlZCByb3V0aW5lCi8vIGNsZWFudXA6IGBybSAtcmYgL3RtcC9zY3JhdGNoYCByZXBvcnRlZCBhcyBgcm0gLXJmIC9gLiBUaG9zZSBlbnRyaWVzIG11c3QKLy8gbWF0Y2ggT04gdGhlIHJvb3QgcmF0aGVyIHRoYW4gYXQgdGhlIGhlYWQgb2YgYSBsb25nZXIgcGF0aC4KLy8KLy8gV0hJQ0ggZW50cmllcyB0aG9zZSBhcmUgaXMgZGVyaXZlZCwgbm90IGxpc3RlZDogYSBwYXR0ZXJuIGlzIHJvb3Qtc2hhcGVkIGlmZgovLyBpdCBlbmRzIGF0IGEgcm9vdCDigJQgYSBzZXBhcmF0b3Igb3IgYH5gLiBUaGF0IHNlbGVjdHMgYHJtIC1yZiAvYCwgYHJtIC1yZiB+YCwKLy8gYGRlbCAvcyAvcSBjOlxgIGFuZCB0aGUgdGhyZWUgYHJlbW92ZS1pdGVtYCBmb3JtcywgYW5kIGxlYXZlcyBgZm9ybWF0IGM6YCwKLy8gYG1rZnMuYCwgYD4gL2Rldi9zZGFgLCBgZm9ybWF0LXZvbHVtZWAgYW5kIGBjbGVhci1kaXNrYCBvbiBwbGFpbiBzdWJzdHJpbmcKLy8gbWF0Y2hpbmcsIHdoZXJlIHRyYWlsaW5nIHRleHQgaXMgc3RpbGwgdGhlIHNhbWUgZGFuZ2Vyb3VzIGNvbW1hbmQuIERlcml2aW5nCi8vIGl0IHJhdGhlciB0aGFuIGtlZXBpbmcgYSBwYXJhbGxlbCBsaXN0IG1lYW5zIGEgZnV0dXJlIHJvb3Qtc2hhcGVkIGFkZGl0aW9uIHRvCi8vIERBTkdFUk9VUyBpcyBhbmNob3JlZCBhdXRvbWF0aWNhbGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgZmFsbGluZyBiYWNrIHRvIHRoZQovLyBwcmVmaXggYnVnIHRoaXMgZml4ZXMuCi8vCi8vIGBybSAtcmYgfmAgam9pbnMgREFOR0VST1VTIHdpdGggdGhpcyBjaGFuZ2U6IGl0IHdhcyBuZXZlciBsaXN0ZWQsIHNvIHdpcGluZyBhCi8vIGhvbWUgZGlyZWN0b3J5IHdhcyBhbGxvd2VkIG91dHJpZ2h0IHdoaWxlIGNsZWFuaW5nIGEgc3ViZGlyZWN0b3J5IG9mIG9uZSB3YXMKLy8gYmxvY2tlZC4gQW5jaG9yaW5nIGlzIHdoYXQgbWFrZXMgdGhlIGVudHJ5IHNhZmUgdG8gYWRkLgpmdW5jdGlvbiBlbmRzQXRSb290KHBhdCkgewogIHZhciBsYXN0ID0gcGF0LmNoYXJBdChwYXQubGVuZ3RoIC0gMSk7CiAgcmV0dXJuIGxhc3QgPT09ICcvJyB8fCBsYXN0ID09PSAnXFwnIHx8IGxhc3QgPT09ICd+JzsKfQovLyBXaGF0IG1heSBsZWdhbGx5IGZvbGxvdyBhIHJvb3QgdGFyZ2V0OiBub3RoaW5nLCB3aGl0ZXNwYWNlLCBhIGdsb2IgKGBybSAtcmYgLypgCi8vIHN0aWxsIGJsb2NrcyksIGEgc2hlbGwgb3BlcmF0b3IsIG9yIGEgY2xvc2luZyBxdW90ZS9wYXJlbi4gQSBwYXRoIGNoYXJhY3RlciDigJQKLy8gbGV0dGVyLCBkaWdpdCwgYC1gLCBgX2Ag4oCUIG1lYW5zIGFub3RoZXIgc2VnbWVudCBmb2xsb3dzLCBpLmUuIHJvdXRpbmUgY2xlYW51cAovLyBvZiBzb21ldGhpbmcgYmVsb3cgcm9vdC4gUnVsZSAjMTogcHVyZSBzdHJpbmcgbG9naWMsIG5vIHBsYXRmb3JtIGJyYW5jaDsgYm90aAovLyBzZXBhcmF0b3JzIGFyZSBoYW5kbGVkIGZvciBldmVyeSBPUydzIHNwZWxsaW5nLgp2YXIgUk9PVF9CT1VOREFSWV9SRSA9IC9bXHM7JnwpIidgKjw+XS87CmZ1bmN0aW9uIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSkgewogIGlmIChpID49IGNtZC5sZW5ndGgpIHJldHVybiB0cnVlOwogIHZhciBjID0gY21kLmNoYXJBdChpKTsKICByZXR1cm4gYyA9PT0gJy8nIHx8IGMgPT09ICdcXCcgfHwgUk9PVF9CT1VOREFSWV9SRS50ZXN0KGMpOwp9CgovKioKICogQWR2YW5jZSBwYXN0IHRleHQgdGhhdCBkb2VzIG5vdCBtb3ZlIE9GRiB0aGUgcm9vdDogcmVwZWF0ZWQgc2VwYXJhdG9ycywgYW5kCiAqIGAuYCAvIGAuLmAgc2VnbWVudHMsIHdoaWNoIHJlc29sdmUgYmFjayB0byB3aGVyZSB0aGV5IHN0YXJ0ZWQuIGBybSAtcmYgLy9gLAogKiBgcm0gLXJmIC8uYCBhbmQgYHJtIC1yZiAvLi5gIGFsbCBzdGlsbCBtZWFuIGBybSAtcmYgL2AgYW5kIG11c3QgYmxvY2ssIHdoaWxlCiAqIGBybSAtcmYgLy90bXAveGAgYW5kIGBybSAtcmYgLy5jb25maWdgIGFyZSByZWFsIHBhdGhzIGJlbG93IHJvb3QgYW5kIG11c3Qgbm90LgogKiBXaXRob3V0IHRoZSBkb3QgaGFuZGxpbmcgdGhlIGFuY2hvcmluZyB3b3VsZCBPUEVOIGEgaG9sZSB0aGUgc3Vic3RyaW5nIG1hdGNoCiAqIGRpZCBub3QgaGF2ZSDigJQgYC5gIGlzIG5vdCBhIGJvdW5kYXJ5IGNoYXJhY3Rlciwgc28gYHJtIC1yZiAvLmAgd291bGQgcmVhZCBhcwogKiAiYSBsb25nZXIgcGF0aCBmb2xsb3dzIiBhbmQgcGFzcy4KICovCmZ1bmN0aW9uIHNraXBUb1Jvb3RFbmQoY21kLCBpKSB7CiAgZm9yICg7OykgewogICAgdmFyIHN0YXJ0ID0gaTsKICAgIHdoaWxlIChpIDwgY21kLmxlbmd0aCAmJiAoY21kLmNoYXJBdChpKSA9PT0gJy8nIHx8IGNtZC5jaGFyQXQoaSkgPT09ICdcXCcpKSBpKys7CiAgICB2YXIgZG90cyA9IDA7CiAgICB3aGlsZSAoY21kLmNoYXJBdChpICsgZG90cykgPT09ICcuJykgZG90cysrOwogICAgLy8gT25seSBhIEJBUkUgYC5gIG9yIGAuLmAgc2VnbWVudCBpcyBhIG5vLW9wOyBgLmNvbmZpZ2AgYW5kIGAuLmZvb2AgYXJlIG5hbWVzLgogICAgaWYgKChkb3RzID09PSAxIHx8IGRvdHMgPT09IDIpICYmIGlzUm9vdEJvdW5kYXJ5KGNtZCwgaSArIGRvdHMpKSBpICs9IGRvdHM7CiAgICBpZiAoaSA9PT0gc3RhcnQpIHJldHVybiBpOwogIH0KfQoKLyoqCiAqIFRydWUgd2hlbiBgcGF0YCBvY2N1cnMgaW4gYGNtZGAgYXMgYSByZWFsIGRhbmdlcm91cyBjb21tYW5kLiBSb290LXNoYXBlZAogKiBwYXR0ZXJucyBtdXN0IGxhbmQgb24gdGhlIHJvb3Q7IGV2ZXJ5IG9jY3VycmVuY2UgaXMgZXhhbWluZWQsIHNvIGEgc2FmZQogKiBsZWFkaW5nIG1hdGNoIChgcm0gLXJmIC90bXAvYSAmJiBybSAtcmYgL2ApIG5ldmVyIG1hc2tzIGEgbGF0ZXIgcmVhbCBvbmUuCiAqLwpmdW5jdGlvbiBtYXRjaGVzRGFuZ2Vyb3VzKGNtZCwgcGF0KSB7CiAgaWYgKCFlbmRzQXRSb290KHBhdCkpIHJldHVybiBjbWQuaW5kZXhPZihwYXQpID49IDA7CiAgZm9yICh2YXIgYXQgPSBjbWQuaW5kZXhPZihwYXQpOyBhdCA+PSAwOyBhdCA9IGNtZC5pbmRleE9mKHBhdCwgYXQgKyAxKSkgewogICAgdmFyIGVuZCA9IHNraXBUb1Jvb3RFbmQoY21kLCBhdCArIHBhdC5sZW5ndGgpOwogICAgaWYgKGVuZCA+PSBjbWQubGVuZ3RoIHx8IFJPT1RfQk9VTkRBUllfUkUudGVzdChjbWQuY2hhckF0KGVuZCkpKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLyAjMTEzMiDigJQgQmFzaCBtZW1vcnktZmlyc3QgZ2F0ZS4KLy8KLy8gQ1JFRElUOiBtYXJrcyB0aGUgZ2F0ZSBzYXRpc2ZpZWQgd2hlbiBDbGF1ZGUgaW52b2tlcyBhIG1lbW9yeS1zZWFyY2ggQ0xJCi8vIChgZmxvIG1lbW9yeSBzZWFyY2hgLCBgZmxvLXNlYXJjaGAsIGBzZW1hbnRpYy1zZWFyY2gubWpzYCkgZnJvbSB0aGUgc2hlbGwg4oCUCi8vIHRoZSBlc2NhcGUgaGF0Y2ggdGhhdCBrZWVwcyB0aGUgZ2F0ZSBzYXRpc2ZpYWJsZSB3aGVuIHRoZSBtb2ZsbyBNQ1Agc2VydmVyCi8vIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHNlc3Npb24uCi8vCi8vICMxMzM4IOKAlCB0aGlzIHVzZWQgdG8gYmUgYW4gdW5hbmNob3JlZCBzdWJzdHJpbmcgdGVzdAovLyAoL3NlbWFudGljLXNlYXJjaHxtZW1vcnkgc2VhcmNofG1lbW9yeSByZXRyaWV2ZXxtZW1vcnktc2VhcmNoLykgYWdhaW5zdCB0aGUKLy8gd2hvbGUgY29tbWFuZCwgc28gYGVjaG8gIm1lbW9yeSBzZWFyY2giYCDigJQgb3IgYSBgZ2l0IGNvbW1pdCAtbWAgbWVudGlvbmluZwovLyB0aGUgcGhyYXNlIOKAlCBzYXRpc2ZpZWQgdGhlIGdhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9tcHQuIFRoYXQgaXMgdGhlCi8vIG9wcG9zaXRlIGRpc2NpcGxpbmUgZnJvbSBSRUFEX0xJS0VfQkFTSF9SRSBkaXJlY3RseSBiZWxvdywgd2hpY2ggaXMKLy8gZGVsaWJlcmF0ZWx5IGFuY2hvcmVkLiBDcmVkaXQgbm93IHJlcXVpcmVzIGEgcmVhbCBJTlZPQ0FUSU9OLCBtYXRjaGVkIGJ5Ci8vIEJBU0VOQU1FIHNvIFJ1bGUgIzEgaG9sZHM6IGBmbG9gLCBgZmxvLmNtZGAsIGBucHguY21kIGZsb2AsIGBub2RlIC4vYmluL2NsaS5qc2AKLy8gYW5kIGBub2RlIEM6XC4uLlxiaW5cY2xpLmpzYCBhbGwgY3JlZGl0LCB3aXRoIGVpdGhlciBwYXRoIHNlcGFyYXRvci4KdmFyIENSRURJVF9SVU5ORVJfUkUgPSAvXig/Om5weHxucG18cG5wbXx5YXJufGJ1bnxidW54fGRlbm98bm9kZXxub2RlanN8dHN4fHRzLW5vZGUpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIFN1Yi13b3JkcyBvZiBhIHJ1bm5lciBpbnZvY2F0aW9uIHRoYXQgYXJlIG5vdCB0aGUgZW50cnlwb2ludCBpdHNlbGYKLy8gKGBwbnBtIGRseCBmbG9gLCBgbnBtIGV4ZWMgLS0gZmxvYCwgYG5weCAteSBmbG9gKS4KdmFyIENSRURJVF9SVU5ORVJfU0tJUF9SRSA9IC9eKD86ZGx4fGV4ZWN8cnVufC15fC0teWVzfC1xfC0tcXVpZXR8LS1zaWxlbnR8LS1uby1pbnN0YWxsfC0tKSQvaTsKLy8gVGhlIG1vZmxvIENMSSwgdW5kZXIgZXZlcnkgbmFtZSBwYWNrYWdlLmpzb24gYmluZHMgaXQgdG8gKHBsdXMgdGhlIHJhdyBlbnRyeQovLyBzY3JpcHQsIGZvciBgbm9kZSBub2RlX21vZHVsZXMvbW9mbG8vYmluL2NsaS5qc2ApLgp2YXIgQ1JFRElUX0NMSV9SRSA9IC9eKD86ZmxvfG1vZmxvfGNsYXVkZS1mbG93fGNsaVwuanN8Y2xpXC5tanMpKD86XC4oPzpjbWR8ZXhlfGJhdHxwczEpKT8kL2k7Ci8vIEEgc2VhcmNoIGVudHJ5cG9pbnQg4oCUIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlc2UgSVMgYSBtZW1vcnkgc2VhcmNoLgp2YXIgQ1JFRElUX1NFQVJDSF9CSU5fUkUgPSAvXig/OmZsby1zZWFyY2goPzpcLig/OmNtZHxleGV8YmF0fHBzMSkpP3xzZW1hbnRpYy1zZWFyY2hcLm1qcykkL2k7Ci8vIFN1YnN0cmluZyBldmVyeSBjcmVkaXRpbmcgZm9ybSBtdXN0IGNvbnRhaW4g4oCUIHRoZSBob3QtcGF0aCBwcmUtZmlsdGVyLiBDb3ZlcnMKLy8gZmxvIC8gbW9mbG8gLyBmbG8tc2VhcmNoIC8gY2xhdWRlLWZsb3cgKGFsbCBjb250YWluICJmbG8iKSwgY2xpLmpzfGNsaS5tanMsCi8vIGFuZCBzZW1hbnRpYy1zZWFyY2gubWpzLgp2YXIgQ1JFRElUX0hJTlRfUkUgPSAvZmxvfGNsaVwubT9qc3xzZW1hbnRpYy1zZWFyY2gvaTsKLy8gYGZsbyBtZW1vcnkgc2VhcmNoYCAvIGBmbG8gbWVtb3J5IHJldHJpZXZlYCwgYW5kIHRoZSBoeXBoZW4vdW5kZXJzY29yZSBzcGVsbGluZ3MuCnZhciBDUkVESVRfTUVNT1JZX1ZFUkJfUkUgPSAvXig/OnNlYXJjaHxyZXRyaWV2ZSkkL2k7CnZhciBDUkVESVRfTUVNT1JZX0NPTVBPVU5EX1JFID0gL15tZW1vcnlbLV9dKD86c2VhcmNofHJldHJpZXZlKSQvaTsKCi8qKgogKiBMYXN0IHBhdGggc2VnbWVudCBvZiBhIHRva2VuLCBsb3dlcmNhc2VkLiBTcGxpdHMgb24gQk9USCBzZXBhcmF0b3JzLCB1bmxpa2UKICogcGF0aC5iYXNlbmFtZSwgd2hpY2ggb25seSBob25vdXJzIHRoZSBIT1NUJ3Mgc2VwYXJhdG9yIChSdWxlICMxKTogYW4gYWdlbnQgb24KICogUE9TSVggY2FuIGxlZ2l0aW1hdGVseSB0eXBlIGBub2RlIC5jbGF1ZGVcc2NyaXB0c1xzZW1hbnRpYy1zZWFyY2gubWpzYCwgYW5kIGEKICogV2luZG93cy1zaGFwZWQgcGF0aCBtdXN0IHJlc29sdmUgdGhlIHNhbWUgd2hlcmV2ZXIgdGhlIGdhdGUgaGFwcGVucyB0byBydW4uCiAqLwpmdW5jdGlvbiBjb21tYW5kQmFzZW5hbWUodG9rKSB7CiAgdmFyIHQgPSB0b2sucmVwbGFjZSgvXlsiJ10rfFsiJ10rJC9nLCAnJyk7CiAgdmFyIGN1dCA9IHQubGFzdEluZGV4T2YoJy8nKTsKICB2YXIgYnMgPSB0Lmxhc3RJbmRleE9mKCdcXCcpOwogIGlmIChicyA+IGN1dCkgY3V0ID0gYnM7CiAgcmV0dXJuIChjdXQgPj0gMCA/IHQuc2xpY2UoY3V0ICsgMSkgOiB0KS50b0xvd2VyQ2FzZSgpOwp9CgovKioKICogVGhlIG1vZmxvIHN1YmNvbW1hbmQgb25lIHNoZWxsIHNlZ21lbnQgaW52b2tlcywgYXMgbG93ZXJjYXNlZCBwb3NpdGlvbmFsCiAqIGFyZ3MgKGBbJ21lbW9yeScsJ3NlYXJjaCddYCwgYFsnc3dhcm0nLCdpbml0J11gKSwgb3IgbnVsbCB3aGVuIHRoZSBzZWdtZW50CiAqIGRvZXMgbm90IGludm9rZSBtb2ZsbyBhdCBhbGwuIEEgZGVkaWNhdGVkIHNlYXJjaCBiaW5hcnkgcmVwb3J0cyB0aGUKICogc3ViY29tbWFuZCBpdCBpcyDigJQgdGhhdCBpcyBhbGwgYGZsby1zZWFyY2hgIGRvZXMuCiAqLwpmdW5jdGlvbiBtb2Zsb1N1YmNvbW1hbmQoc2VnKSB7CiAgdmFyIHRva2VucyA9IHNlZy50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgaSA9IDA7CiAgLy8gU2tpcCBzaGVsbCBub2lzZSBhaGVhZCBvZiB0aGUgZW50cnlwb2ludDogZW52IGFzc2lnbm1lbnRzIChgRk9PPWJhciBmbG8g4oCmYCksCiAgLy8gc3VkbywgcGFja2FnZSBydW5uZXJzIGFuZCB0aGVpciBmbGFncy4KICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKICAgIHZhciB0b2sgPSB0b2tlbnNbaV07CiAgICBpZiAodG9rID09PSAnc3VkbycgfHwgL15bQS1aYS16X11bQS1aYS16MC05X10qPS8udGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1NLSVBfUkUudGVzdCh0b2spKSB7IGkrKzsgY29udGludWU7IH0KICAgIGlmIChDUkVESVRfUlVOTkVSX1JFLnRlc3QoY29tbWFuZEJhc2VuYW1lKHRvaykpKSB7IGkrKzsgY29udGludWU7IH0KICAgIGJyZWFrOwogIH0KICBpZiAoaSA+PSB0b2tlbnMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICB2YXIgZW50cnkgPSBjb21tYW5kQmFzZW5hbWUodG9rZW5zW2ldKTsKICBpZiAoQ1JFRElUX1NFQVJDSF9CSU5fUkUudGVzdChlbnRyeSkpIHJldHVybiBbJ21lbW9yeScsICdzZWFyY2gnXTsKICBpZiAoIUNSRURJVF9DTElfUkUudGVzdChlbnRyeSkpIHJldHVybiBudWxsOwogIC8vIFBvc2l0aW9uYWwgYXJncyBhZnRlciB0aGUgQ0xJIGVudHJ5cG9pbnQ7IGZsYWdzIGNhcnJ5IG5vIHN1YmNvbW1hbmQuCiAgdmFyIHJlc3QgPSBbXTsKICBmb3IgKHZhciBqID0gaSArIDE7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHsKICAgIGlmICh0b2tlbnNbal0uY2hhckF0KDApICE9PSAnLScpIHJlc3QucHVzaCh0b2tlbnNbal0udG9Mb3dlckNhc2UoKSk7CiAgfQogIHJldHVybiByZXN0Owp9CgovKiogRG9lcyBvbmUgc2hlbGwgc2VnbWVudCBpbnZva2UgYSBtb2ZsbyBtZW1vcnkgc2VhcmNoPyAqLwpmdW5jdGlvbiBzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaChzZWcpIHsKICB2YXIgc3ViID0gbW9mbG9TdWJjb21tYW5kKHNlZyk7CiAgaWYgKCFzdWIgfHwgIXN1Yi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICBpZiAoQ1JFRElUX01FTU9SWV9DT01QT1VORF9SRS50ZXN0KHN1YlswXSkpIHJldHVybiB0cnVlOwogIHJldHVybiBzdWJbMF0gPT09ICdtZW1vcnknICYmIHN1Yi5sZW5ndGggPiAxICYmIENSRURJVF9NRU1PUllfVkVSQl9SRS50ZXN0KHN1YlsxXSk7Cn0KCi8qKgogKiBDUkVESVQgdGVzdCBmb3IgYSB3aG9sZSBCYXNoL1Bvd2VyU2hlbGwgY29tbWFuZC4gUXVvdGVkIGJvZGllcyBhcmUgc3RyaXBwZWQKICogZmlyc3QgKHNvIGEgY29tbWl0IG1lc3NhZ2UgcXVvdGluZyAibWVtb3J5IHNlYXJjaCIgY2Fubm90IGNyZWRpdCksIHRoZW4gZWFjaAogKiBzaGVsbCBzZWdtZW50IGlzIGNoZWNrZWQgYXQgaXRzIG93biBzdGFydCDigJQgYGNkIHJlcG8gJiYgZmxvIG1lbW9yeSBzZWFyY2hgCiAqIGNyZWRpdHMsIGBlY2hvICJmbG8gbWVtb3J5IHNlYXJjaCJgIGRvZXMgbm90LgogKi8KZnVuY3Rpb24gY3JlZGl0c01lbW9yeVNlYXJjaChyYXdDbWQpIHsKICAvLyBDaGVhcCByZWplY3QgZmlyc3QuIFRoaXMgcnVucyBvbiBFVkVSWSBCYXNoIGNhbGwgaW4gZXZlcnkgY29uc3VtZXIsIGFoZWFkCiAgLy8gb2YgdGhlIGJsb2NrIGFybSdzIHJlZ2V4ZXMsIGFuZCBldmVyeSBjcmVkaXRpbmcgZm9ybSBuZWNlc3NhcmlseSBuYW1lcyBhbgogIC8vIGVudHJ5cG9pbnQgY29udGFpbmluZyBvbmUgb2YgdGhlc2Ug4oCUIHNvIG5vbi1tYXRjaGVzIGNvc3Qgb25lIHJlZ2V4LCBub3QgYQogIC8vIHN0cmlwICsgc3BsaXQgKyB0b2tlbml6ZS4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBtb2Zsb1NlZ21lbnRzKHJhd0NtZCkuc29tZShzZWdtZW50Q3JlZGl0c01lbW9yeVNlYXJjaCk7Cn0KCi8qKiBTaGVsbCBzZWdtZW50cyBvZiBhIGNvbW1hbmQsIHF1b3RlZCBib2RpZXMgc3RyaXBwZWQuICovCmZ1bmN0aW9uIG1vZmxvU2VnbWVudHMocmF3Q21kKSB7CiAgcmV0dXJuIHN0cmlwUXVvdGVkQW5kSGVyZWRvY3MocmF3Q21kIHx8ICcnKS5zcGxpdCgvWzt8JlxuXSsvKTsKfQoKLyoqCiAqICMxMzM4IGZvbGxvdy11cCDigJQgd2hpY2ggcHJvdGVjdGVkLWNvb3JkaW5hdGlvbiBpbml0LCBpZiBhbnksIGRpZCB0aGlzIHNoZWxsCiAqIGNvbW1hbmQgcnVuPyBSZXR1cm5zICdzd2FybScsICdoaXZlJywgb3IgbnVsbC4KICoKICogYGZsbyBzd2FybSBpbml0YCBhbmQgYGZsbyBoaXZlLW1pbmQgaW5pdGAgYXJlIE5PVCBzZWNvbmQtY2xhc3Mgc3RhbmQtaW5zIGZvcgogKiB0aGUgTUNQIHRvb2xzOiB0aGUgQ0xJIGRpc3BhdGNoZXMgaW4tcHJvY2VzcyB0aHJvdWdoIHRoZSBzYW1lIFRPT0xfUkVHSVNUUlkKICogaGFuZGxlciB0aGUgTUNQIHNlcnZlciBleHBvc2VzIChgbWNwLWNsaWVudC50c2AgY2FsbE1DUFRvb2wpLCBhbmQgdGhlCiAqIHJlc3VsdGluZyBzd2FybSBpcyBwZXJzaXN0ZWQgKCM4MDYgYWdlbnRzL3RvcG9sb2d5LCAjMTMyOSB0YXNrcyksIHNvIGEgbGF0ZXIKICogcHJvY2VzcyDigJQgaW5jbHVkaW5nIGEgcmVzdGFydGVkIE1DUCBzZXJ2ZXIg4oCUIGh5ZHJhdGVzIHRoZSBzYW1lIHN3YXJtLgogKgogKiBUaGlzIG1hdHRlcnMgYmVjYXVzZSBDbGF1ZGUgQ29kZSBzcGF3bnMgc3RkaW8gTUNQIHNlcnZlcnMgb25jZSBhdCBzZXNzaW9uCiAqIHN0YXJ0IGFuZCBuZXZlciByZXNwYXducyB0aGVtLiBCZWZvcmUgdGhpcywgYHJlY29yZC1zd2FybS1pbml0YCBmaXJlZCBvbmx5IG9uCiAqIGBtY3BfX21vZmxvX19zd2FybV9pbml0YCwgc28gYSBzZXNzaW9uIHRoYXQgbG9zdCBpdHMgTUNQIHNlcnZlciBoaXQgdGhlICM5NTIKICogZ2F0ZSB3aXRoIE5PIHdheSB0byBzYXRpc2Z5IGl0OiBgL2ZsIC1zYCBibG9ja2VkIGV2ZXJ5IEFnZW50IHNwYXduIGFuZCB0b2xkCiAqIHRoZSByZWFkZXIgdG8gY2FsbCBhIHRvb2wgdGhhdCBkaWQgbm90IGV4aXN0IGluIHRoYXQgc2Vzc2lvbi4gVW5saWtlIHRoZQogKiBtZW1vcnkgZ2F0ZSwgdGhlcmUgd2FzIG5vdCBldmVuIGFuIHVuYWR2ZXJ0aXNlZCBlc2NhcGUuCiAqCiAqIERlbGliZXJhdGVseSB3aXJlZCBQb3N0VG9vbFVzZSwgbm90IFByZVRvb2xVc2Ugd2hlcmUgdGhlIG1lbW9yeSBjcmVkaXQgbGl2ZXM6CiAqIENsYXVkZSBDb2RlIGRvZXMgbm90IGZpcmUgUG9zdFRvb2xVc2Ugd2hlbiBhIGNvbW1hbmQgZXhpdHMgbm9uLXplcm8gKCMxMzIyKSwKICogc28gb25seSBhbiBpbml0IHRoYXQgYWN0dWFsbHkgU1VDQ0VFREVEIGNyZWRpdHMgdGhlIGdhdGUuIEEgZmFpbGVkIGluaXQgbXVzdAogKiBuZXZlciBvcGVuIGl0IOKAlCB0aGF0IHdvdWxkIGJlIHRoZSBzaWxlbnQtZGVncmFkYXRpb24gZmFpbHVyZSBDTEFVREUubWQncwogKiBwcm90ZWN0ZWQtZnVuY3Rpb25hbGl0eSBydWxlIGV4aXN0cyB0byBwcmV2ZW50LgogKi8KZnVuY3Rpb24gYmFzaENvb3JkaW5hdGlvbkluaXQocmF3Q21kKSB7CiAgLy8gQ2hlYXAgcmVqZWN0LCBzYW1lIGhvdC1wYXRoIGRpc2NpcGxpbmUgYXMgY3JlZGl0c01lbW9yeVNlYXJjaDogZXZlcnkKICAvLyBjcmVkaXRpbmcgZm9ybSBuYW1lcyBhIG1vZmxvIGVudHJ5cG9pbnQgQU5EIHRoZSBgaW5pdGAgc3ViY29tbWFuZC4KICBpZiAoIUNSRURJVF9ISU5UX1JFLnRlc3QocmF3Q21kIHx8ICcnKSB8fCAhL1xiaW5pdFxiL2kudGVzdChyYXdDbWQpKSByZXR1cm4gbnVsbDsKICB2YXIgc2VnbWVudHMgPSBtb2Zsb1NlZ21lbnRzKHJhd0NtZCk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgdmFyIHN1YiA9IG1vZmxvU3ViY29tbWFuZChzZWdtZW50c1tpXSk7CiAgICBpZiAoIXN1YiB8fCBzdWIubGVuZ3RoIDwgMiB8fCBzdWJbMV0gIT09ICdpbml0JykgY29udGludWU7CiAgICBpZiAoc3ViWzBdID09PSAnc3dhcm0nKSByZXR1cm4gJ3N3YXJtJzsKICAgIC8vIGBoaXZlYCBpcyB0aGUgcmVnaXN0ZXJlZCBhbGlhcyBmb3IgYGhpdmUtbWluZGAgKGNvbW1hbmRzL2hpdmUtbWluZC50cykuCiAgICBpZiAoc3ViWzBdID09PSAnaGl2ZS1taW5kJyB8fCBzdWJbMF0gPT09ICdoaXZlJykgcmV0dXJuICdoaXZlJzsKICB9CiAgcmV0dXJuIG51bGw7Cn0KLy8gIzE0NDUg4oCUIHJlYWQgc2hhcGVzIHdob3NlIExFQURJTkcgY29tbWFuZCBpcyBvbmUgQkFTSF9DQVJWRV9PVVRfUkUgY2FydmVzIG91dAovLyB3aG9sZXNhbGUgKGBub2RlIOKApmAsIGBnaXQg4oCmYCkuIFRoZXkgYXJlIHJlYWQtbGlrZSBiZWNhdXNlIG9mIHdoYXQgRk9MTE9XUyB0aGUKLy8gbGVhZGluZyB0b2tlbiwgc28gYW5jaG9yaW5nIG9uIHRoYXQgdG9rZW4gYWxvbmUgY2FuIG5ldmVyIHNlZSB0aGVtOiBpbiBvbmUKLy8gcmVhbCBzZXNzaW9uIDUzOSBmaWxlLWV4cGxvcmF0aW9uIGNhbGxzIHdlbnQgdGhyb3VnaCBgbm9kZSAtZWAgKyByZWFkRmlsZVN5bmMKLy8gYW5kIGBnaXQgc2hvdyA8cmVmPjo8cGF0aD5gIHdpdGggdGhlIGdhdGUgYmxpbmQgdG8gZXZlcnkgb25lIG9mIHRoZW0uIFRoYXQgaXMKLy8gdGhlIGRvbWluYW50IGV4cGxvcmF0aW9uIHNoYXBlIGluIHJlcG9zIHdob3NlIG93biBndWlkYW5jZSBzdGVlcnMgYXdheSBmcm9tCi8vIGBncmVwYCAoZS5nLiB3aGVyZSBgZ3JlcGAgaXMgYHVncmVwYCBhbmQgc2lsZW50bHkgc2tpcHMgZmlsZXMsIHNvIGFueQovLyBpbnZlbnRvcnkgYSBkZWNpc2lvbiByZXN0cyBvbiBtdXN0IGdvIHRocm91Z2ggYGZzLnJlYWRGaWxlU3luY2ApLgovLwovLyBUaGVzZSBzb3VyY2VzIGFyZSBzcGxpY2VkIGludG8gUkVBRF9MSUtFX0JBU0hfUkUgYmVsb3cgQU5EIGtlcHQgYWRkcmVzc2FibGUKLy8gb24gdGhlaXIgb3duLCBiZWNhdXNlIGNoZWNrLWJhc2gtbWVtb3J5IGhhcyB0byBsZXQgdGhlbSBvdmVycmlkZSB0aGUKLy8gY2FydmUtb3V0IOKAlCBleHRlbmRpbmcgUkVBRF9MSUtFIGFsb25lIHdvdWxkIGNoYW5nZSBub3RoaW5nLCB0aGUgYF5ccyoobm9kZXwKLy8gZ2l0KVxzYCBjYXJ2ZS1vdXQgYXJtcyBzd2FsbG93IHRoZW0gb25lIGxpbmUgbGF0ZXIuCnZhciBSVU5ORVJfUkVBRF9TT1VSQ0VTID0gWwogIC8vIGBub2RlIC1lICIuLi5yZWFkRmlsZVN5bmMoLi4uKS4uLiJgLCBpbiBldmVyeSBldmFsIHNwZWxsaW5nICgtZS8tLWV2YWwvLXAvCiAgLy8gLS1wcmludC8tLWlucHV0LXR5cGU9bW9kdWxlIC1lKS4gVGhlIGV2YWwgRkxBRyBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcXVpcmVkOgogIC8vIGEgc2NyaXB0LWZpbGUgaW52b2NhdGlvbiAoYG5vZGUgc2NyaXB0cy9idWlsZC5tanNgKSBkb2VzIG5vdCBjYXJyeSBhIHJlYWQKICAvLyBjYWxsIGluIGl0cyBjb21tYW5kIGxpbmUsIHNvIHRoZSByZWFkIGNhbGwgaXRzZWxmIGlzIHRoZSByZWxpYWJsZSBzaWduYWwgYW5kCiAgLy8gZGVtYW5kaW5nIHRoZSBmbGFnIG9ubHkgYWRkcyBzcGVsbGluZ3MgdG8gbWlzcy4KICAvLwogIC8vIFRoZSBuZWdhdGl2ZSBsb29rYWhlYWQgaXMgbG9hZC1iZWFyaW5nLCBub3QgY2F1dGlvbjogUnVsZSAjMSB0ZWxscyBhdXRob3JzCiAgLy8gdG8gZG8gY3Jvc3MtcGxhdGZvcm0gZmlsZSBPUFMgdGhyb3VnaCBgbm9kZSAtZWAgd2l0aCBmcyAoYG1rZGlyYC9gcm1gL2BjcGAKICAvLyBkbyBub3QgZXhpc3Qgb24gV2luZG93cyksIGFuZCBhIHJlYWQtbW9kaWZ5LXdyaXRlIGlzIGFuIG9wZXJhdGlvbiwgbm90CiAgLy8gZXhwbG9yYXRpb24uIE9ubHkgZnMgTVVUQVRJT04gY2FsbHMgY2FydmUgb3V0IOKAlCBtYXRjaGluZyBhIGJhcmUgYHdyaXRlYAogIC8vIHdvdWxkIGNhcnZlIG91dCBgcHJvY2Vzcy5zdGRvdXQud3JpdGVgLCB3aGljaCBuZWFybHkgZXZlcnkgaW5saW5lIHJlYWQKICAvLyBzY3JpcHQgZW5kcyB3aXRoLCBhbmQgdGhhdCB3b3VsZCBoYW5kIGJhY2sgdGhlIHdob2xlIGdhcC4KICAvLwogIC8vIEV2ZXJ5IG11dGF0aW9uIG5hbWUgY292ZXJzIGl0cyBzeW5jLCBjYWxsYmFjayBBTkQgcHJvbWlzZSBzcGVsbGluZzogYXV0aG9ycwogIC8vIHJlYWNoIGZvciBgZnMucHJvbWlzZXMucm1gIGFzIHJlYWRpbHkgYXMgYHJtU3luY2AsIGFuZCBsaXN0aW5nIG9ubHkgdGhlCiAgLy8gYCpTeW5jYCBmb3JtIHdvdWxkIGJsb2NrIHRoZSBkZWxldGUgb3AgUnVsZSAjMSBzZW50IHRoZW0gdG8gYG5vZGUgLWVgIGZvci4KICAvLyBgcm1gL2BybWRpcmAvYGNwYCBjYXJyeSBgXGJgIGJlY2F1c2UgdGhleSBhcmUgc2hvcnQgZW5vdWdoIHRvIGFwcGVhciBpbnNpZGUKICAvLyB1bnJlbGF0ZWQgd29yZHMg4oCUIGFuIHVuYW5jaG9yZWQgYHJtYCBtYXRjaGVzICJmb3JtYXQiIGFuZCAidHJhbnNmb3JtIiwgYW5kCiAgLy8gd291bGQgY2FydmUgb3V0IG1vc3Qgb2Ygd2hhdCB0aGlzIGFybSBleGlzdHMgdG8gY2F0Y2guCiAgJ15cXHMqKD86bm9kZXxub2RlanMpKD86XFwuKD86ZXhlfGNtZCkpP1xccycKICAgICsgJyg/PVtcXHNcXFNdKig/OnJlYWQoPzpGaWxlfGRpcil8Z2xvYlN5bmMpKScKICAgICsgJyg/IVtcXHNcXFNdKig/OndyaXRlRmlsZXxhcHBlbmRGaWxlfG1rZGlyfG1rZHRlbXB8dW5saW5rfGNvcHlGaWxlfHJlbmFtZScKICAgICsgJ3xzeW1saW5rfGNyZWF0ZVdyaXRlU3RyZWFtfFxcYnJtKD86ZGlyKT8oPzpTeW5jKT9cXGJ8XFxiY3AoPzpTeW5jKT9cXGIpKScsCiAgLy8gYGdpdCBzaG93IDxyZWY+OjxwYXRoPmAgLyBgZ2l0IGNhdC1maWxlIC1wIDxyZWY+OjxwYXRoPmAg4oCUIHRoZSBjb2xvbiBmb3JtCiAgLy8gcmVhZHMgYSBibG9iIGFuZCBpcyBgY2F0YCBieSBhbm90aGVyIG5hbWUuIExlYWRpbmcgYC1gLXByZWZpeGVkIHRva2VucyBhcmUKICAvLyBjb25zdW1lZCBhcyBmbGFncyBmaXJzdCBzbyBgLS1wcmV0dHk9Zm9ybWF0OiVoYCAoYSBjb2xvbiBpbnNpZGUgYSBGTEFHKQogIC8vIGNhbm5vdCBtYXNxdWVyYWRlIGFzIGEgcmVmOnBhdGgsIGFuZCB0aGUgc2VnbWVudCBhZnRlciB0aGUgY29sb24gbXVzdCBjYXJyeQogIC8vIGEgcGF0aCBjaGFyYWN0ZXIg4oCUIHNhbWUgZmFsc2UtbmVnYXRpdmUgdHJhZGUgYXMgdGhlIGB0eXBlIFxTKltcXC8uXWAgYXJtCiAgLy8gYWJvdmUgKGBnaXQgc2hvdyBIRUFEOnNyY2AsIGEgYmFyZSBkaXJlY3RvcnksIHBhc3Nlczsgc291cmNlIGZpbGVzIGFsbCBoYXZlCiAgLy8gZXh0ZW5zaW9ucykuIEJhcmUgYGdpdCBzaG93YCwgYGdpdCBzaG93IC0tc3RhdGAsIGBnaXQgbG9nYCBhbmQgYGdpdCBkaWZmYAogIC8vIGhhdmUgbm8gcmVmOnBhdGggdG9rZW4gYW5kIHN0YXkgb3BlcmF0aW9uYWwuCiAgJ15cXHMqZ2l0XFxzKyg/OnNob3d8Y2F0LWZpbGUpXFxzKyg/Oi17MSwyfVxcUytcXHMrKSpbXi1cXHNdXFxTKjpcXFMqW1xcXFwvLl0nLAogIC8vIFJlcG8td2lkZSBjb250ZW50IHNlYXJjaCBhbmQgZmlsZSBpbnZlbnRvcnkg4oCUIHRoZSBgZ2l0YCBzcGVsbGluZ3Mgb2YKICAvLyBgZ3JlcCAtcmAgYW5kIGBmaW5kYC4gTk9UIGBnaXQgbG9nIC0tZ3JlcGAsIHdoaWNoIHNlYXJjaGVzIGNvbW1pdCBtZXNzYWdlcywKICAvLyBpcyBhbHJlYWR5IGluIHRoZSBwYXNzaW5nIHNldCwgYW5kIGRvZXMgbm90IG1hdGNoIGBnaXRccytncmVwYC4KICAnXlxccypnaXRcXHMrKD86Z3JlcHxscy1maWxlcylcXGInLApdOwovLyBTYW1lIHNvdXJjZXMgYXMgdGhlaXIgb3duIG1hdGNoZXIg4oCUIGNoZWNrLWJhc2gtbWVtb3J5IHRlc3RzIHRoaXMgdG8gbGV0IGEKLy8gY2FydmVkLW91dCBsZWFkaW5nIGNvbW1hbmQgc3RpbGwgYmxvY2sgd2hlbiB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHJlYWQuCnZhciBSVU5ORVJfUkVBRF9CQVNIX1JFID0gbmV3IFJlZ0V4cChSVU5ORVJfUkVBRF9TT1VSQ0VTLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQkxPQ0s6IHJlYWQtbGlrZSBCYXNoIGNvbW1hbmRzIHRoYXQgYnlwYXNzIHRoZSBleGlzdGluZyBjaGVjay1iZWZvcmUtcmVhZCAvCi8vIGNoZWNrLWJlZm9yZS1zY2FuIGdhdGVzIGJ5IGdvaW5nIHRocm91Z2ggdGhlIHNoZWxsLiBBbmNob3JlZCB0byB0aGUgc3RhcnQgb2YKLy8gdGhlIGxpbmUgc28gc3ViY29tbWFuZHMgaW5zaWRlIHBpcGVsaW5lcyBvciBgbnBtIGluc3RhbGwgZ3JlcGAgZG9uJ3QgdHJpcC4KLy8gQ292ZXJzIFBPU0lYIHJlYWQvc2VhcmNoIHRvb2xzLCBXaW5kb3dzIGNtZCBgdHlwZWAsIGFuZCBQb3dlclNoZWxsIHJlYWRlcnMuCi8vICMxMTcxIOKAlCBleHRlbmRlZCB3aXRoIFBvd2VyU2hlbGwtbmF0aXZlIGV4cGxvcmF0aW9uIGZvcm1zIG5vdyB0aGF0IHRoZSBtYXRjaGVyCi8vIHdpZGVucyB0byB0aGUgYFBvd2VyU2hlbGxgIHRvb2wuIFBsYWluIGBHZXQtQ2hpbGRJdGVtYCB3aXRob3V0IC1SZWN1cnNlIHN0YXlzCi8vIHVuY292ZXJlZCAoaXQncyBgbHNgLWVxdWl2YWxlbnQgYW5kIHBsYWluIGBsc2AgaXMgYWxsb3dlZCkuCnZhciBSRUFEX0xJS0VfQkFTSF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx4eGR8b2R8aGV4ZHVtcClcXGInLAogICdeXFxzKig/OmdyZXB8cmd8YWd8ZmdyZXB8ZWdyZXB8ZmluZHxmZClcXGInLAogICdeXFxzKnNlZFxccystblxcYicsCiAgJ15cXHMqYXdrXFxzKyg/IS4qPDwpJywKICAvLyBgdHlwZSA8cGF0aD5gIG9uIFdpbmRvd3MuIE5vIGAkYCBhbmNob3Igc28gYSBwaXBlZCBmb3JtCiAgLy8gKGB0eXBlIHNyY1xmb28udHMgfCBncmVwIHhgKSBzdGlsbCBtYXRjaGVzIGFuZCBnZXRzIGJsb2NrZWQuIFRoZSBhcmd1bWVudAogIC8vIG11c3QgY29udGFpbiBhIHNsYXNoLCBiYWNrc2xhc2gsIG9yIGRvdCDigJQgb3RoZXJ3aXNlIGl0J3MgdGhlIHNoZWxsLWJ1aWx0aW4KICAvLyBjb21tYW5kLWxvb2t1cCBmb3JtIChgdHlwZSBsc2AsIGB0eXBlIGNkYCkgd2hpY2ggdGhlIGdhdGUgaGFzIG5vIGJ1c2luZXNzCiAgLy8gYmxvY2tpbmcuIEZhbHNlLW5lZ2F0aXZlIHRyYWRlOiBleHRlbnNpb24tbGVzcyBmaWxlbmFtZXMgbGlrZSBgdHlwZSBNYWtlZmlsZWAKICAvLyBwYXNzIHRocm91Z2guIEFjY2VwdGFibGUg4oCUIHNvdXJjZSBmaWxlcyBhbGwgaGF2ZSBleHRlbnNpb25zLCBhbmQgdGhlCiAgLy8gcHJpbWFyeSByaXNrIHBhdHRlcm4gaXMgbGVha2luZyBwYXN0IHRoZSBnYXRlIHZpYSBgdHlwZSBzcmNcZm9vLnRzYC4KICAnXlxccyp0eXBlXFxzK1xcUypbXFxcXC8uXScsCiAgJ15cXHMqKD86R2V0LUNvbnRlbnR8Z2N8U2VsZWN0LVN0cmluZ3xzbHMpXFxiJywKICAvLyAjMTE3MSDigJQgUG93ZXJTaGVsbCByZWN1cnNpdmUgZXhwbG9yYXRpb24gKHBhcmFsbGVsIHRvIFBPU0lYIGBmaW5kYC9gZmRgKS4KICAvLyBUaGUgYC1SZWN1cnNlYCBmbGFnIGlzIHdoYXQgbWFrZXMgaXQgZXhwZW5zaXZlIGVub3VnaCB0byBnYXRlOyBwbGFpbgogIC8vIGBHZXQtQ2hpbGRJdGVtYCBpcyBgbHNgLXNoYXBlZCBhbmQgaW50ZW50aW9uYWxseSBub3QgYmxvY2tlZC4KICAnXlxccyooPzpHZXQtQ2hpbGRJdGVtfGdjaSlcXGJbXnxdKi1SZWN1cnNlXFxiJywKICAvLyAjMTE3MSDigJQgY21kLXN0eWxlIHJlY3Vyc2l2ZSBsaXN0aW5nIChgZGlyIC9zYCBvciBgZGlyIC9TYCkuIE9ubHkgdGhlCiAgLy8gV2luZG93cyBgL3NgIGZvcm0sIE5PVCBQT1NJWCBgZGlyIC1zYCAoc29ydC1ieS1zaXplLCB3aGVyZSBgZGlyYCBpcyBhbGlhc2VkCiAgLy8gdG8gYGxzIC1sYCBvbiBtYW55IGRpc3Ryb3MpIOKAlCBmYWxzZS1wb3NpdGl2ZSBibG9ja2luZyB0aGF0IHdvdWxkIGJyZWFrCiAgLy8gbGVnaXRpbWF0ZSBQT1NJWCBsaXN0aW5ncy4KICAnXlxccypkaXJcXGJbXnxdKlxcc1xcL1tzU11cXGInLAogIC8vICMxMTcxIOKAlCBQb3dlclNoZWxsIGhleCBkdW1wLCBwYXJhbGxlbCB0byBQT1NJWCBgeHhkYC9gaGV4ZHVtcGAuCiAgJ15cXHMqRm9ybWF0LUhleFxcYicsCl0uY29uY2F0KFJVTk5FUl9SRUFEX1NPVVJDRVMpLmpvaW4oJ3wnKSwgJ2knKTsKLy8gQ0FSVkUtT1VUOiBjb21tYW5kcyB0aGF0IExPT0sgcmVhZC1saWtlIGJ1dCBhcmUgb3BlcmF0aW9uYWwuIEFuY2hvcmVkIHRvIHRoZQovLyBMRUFESU5HIGNvbW1hbmQg4oCUIHRoZSBwaXBlLWZpbHRlciBjYXNlIChgbnBtIHRlc3QgfCBncmVwIEZBSUxgKSBpcyBhbHJlYWR5Ci8vIGhhbmRsZWQgYnkgUkVBRF9MSUtFJ3MgYF5ccypgIGFuY2hvciBuZXZlciBtYXRjaGluZyB0aGUgbGVhZGluZyBgbnBtYCwgc28KLy8gdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyBwaXBlIGFybSBoZXJlOiBjYXRjaGluZyB0aGUgbGVhZGluZyBjb21tYW5kIGxldHMKLy8gYGdyZXAgLXIgVE9ETyBzcmMvIHwgaGVhZCAtNWAgcmVhY2ggdGhlIEJMT0NLIGV4aXQgKHdoaWNoIGl0IG11c3QsIHRoYXQncwovLyB0aGUgZ2FwIHRoZSB0aWNrZXQgZXhpc3RzIHRvIGNsb3NlKS4gIzExMzIuCnZhciBCQVNIX0NBUlZFX09VVF9SRSA9IG5ldyBSZWdFeHAoWwogICdeXFxzKihucG18bnB4fHBucG18eWFybnxidW58bm9kZXxkZW5vfHRzeHx0cy1ub2RlKVxccycsCiAgJ15cXHMqKGdpdHxnaHxodWIpXFxzJywKICAnXlxccyooZG9ja2VyfGt1YmVjdGx8aGVsbXx0ZXJyYWZvcm0pXFxzJywKICAnXlxccyooY3VybHx3Z2V0fGh0dHB8ZmV0Y2gpXFxzJywKICAnXlxccyooanF8eXF8eHEpXFxzJywKICAnXlxccyooZWNob3xwcmludGZ8dHJ1ZXxmYWxzZXxzbGVlcHx0ZXN0fFxcWylcXHMnLAogICdeXFxzKmNhdFxccysoPDx8PDw8KScsCiAgJ15cXHMqY2F0XFxzK1tefF0qXFxzKj4nLAogICdeXFxzKnRlZVxcYicsCiAgLy8gTGF6eSBgLis/YCBpbnN0ZWFkIG9mIGAuK1xzYCB0byBhdm9pZCBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nIG9uIGxvbmcKICAvLyBgZmluZGAgY29tbWFuZHMgdGhhdCBsYWNrIGEgYC1kZWxldGVgIC8gYC1leGVjIHJtYCBzdWZmaXguCiAgJ15cXHMqZmluZFxccysuKz8tKGRlbGV0ZXxleGVjXFxzK3JtKVxcYicsCl0uam9pbignfCcpKTsKLy8gIzExNzEgZm9sbG93LXVwIOKAlCBzdHJpcCBxdW90ZWQgc3RyaW5nIGJvZGllcyBhbmQgaGVyZWRvYyBib2RpZXMgZnJvbSBhIHNoZWxsCi8vIGNvbW1hbmQgZm9yIHB1cnBvc2VzIG9mIGRhbmdlcm91cy1wYXR0ZXJuIHN1YnN0cmluZyBtYXRjaGluZy4gVXNlZCBieQovLyBjaGVjay1kYW5nZXJvdXMtY29tbWFuZC4gRG9lcyBOT1Qgc3RyaXAgJCguLi4pIG9yIGAuLi5gIGJlY2F1c2UgdGhvc2UgYm9kaWVzCi8vIGV4ZWN1dGUuIERvdWJsZS1xdW90ZWQgc3RyaW5ncyBoYW5kbGUgZXNjYXBlZCBxdW90ZXMgKGBcImApIGNvcnJlY3RseSBzbwovLyBgZ2l0IGNvbW1pdCAtbSAiZml4IFwiWFwiImAgc3RyaXBzIHRoZSB3aG9sZSBxdW90ZWQgYm9keSwgbm90IGp1c3QgdGhlIGZpcnN0Ci8vIGBcImAgcGFpci4gU2luZ2xlIHF1b3RlcyBkb24ndCBoYXZlIGVzY2FwZXMgaW4gYmFzaC9zaCDigJQgYCdbXiddKidgIGlzIGV4YWN0LgpmdW5jdGlvbiBzdHJpcFF1b3RlZEFuZEhlcmVkb2NzKGNtZCkgewogIHZhciBvdXQgPSBjbWQ7CiAgLy8gSGVyZWRvYyB0YWlsOiBgPDxUT0tFTmAsIGA8PC1UT0tFTmAsIGA8PCdUT0tFTidgLCBgPDwiVE9LRU4iYCB0aHJvdWdoIGVuZC1vZi1pbnB1dC4KICAvLyBCYXNoIGhlcmVkb2NzIGFyZSBtdWx0aS1saW5lOyBpbiBzaW5nbGUtbGluZSB0b29sIGlucHV0cyB0aGV5IHNob3cgdXAgYXMgdGhlCiAgLy8gdGFpbCBhZnRlciBgPDxUT0tFTmAuIENvbnNlcnZhdGl2ZSB0YWlsLXN0cmlwIOKAlCBiZW5pZ24gY29udGVudCBhZnRlciBhIGhlcmVkb2MKICAvLyBib2R5IG9uIHRoZSBzYW1lIGxvZ2ljYWwgbGluZSBpcyBhbHNvIHN0cmlwcGVkLCBoYXJtbGVzcyBmb3IgdGhpcyBnYXRlLgogIC8vIFRva2VuIGNsYXNzIGluY2x1ZGVzIGAtYCBzbyBoeXBoZW5hdGVkIGhlcmVkb2MgdGFncyAoYDw8RU5ELU9GLURPQ2ApIG1hdGNoCiAgLy8gdGhlIGZ1bGwgdG9rZW4sIG5vdCBqdXN0IHRoZSBsZWFkaW5nIHdvcmQg4oCUIHdpdGhvdXQgdGhpcyB0aGUgc3RyaXAgd291bGQKICAvLyBoYWx0IGF0IGA8PEVORGAgYW5kIGxlYXZlIGAtT0YtRE9DYCBwbHVzIHRoZSBib2R5IGFzIGxpdGVyYWwgdGV4dC4KICBvdXQgPSBvdXQucmVwbGFjZSgvPDwtP1xzKlsnIl0/W1x3LV0rWyciXT9bXHNcU10qJC8sICcnKTsKICAvLyBIZXJlLXN0cmluZyBgPDw8d29yZGAg4oCUIHN0cmlwIHRoZSB3b3JkLgogIG91dCA9IG91dC5yZXBsYWNlKC88PDxccypcUysvZywgJycpOwogIC8vIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyDigJQgbm8gZXNjYXBlcyBpbnNpZGUgc2luZ2xlIHF1b3RlcyBpbiBzaC9iYXNoLgogIG91dCA9IG91dC5yZXBsYWNlKC8nW14nXSonL2csICInJyIpOwogIC8vIERvdWJsZS1xdW90ZWQgc3RyaW5ncyDigJQgYCg/OlteIlxcXXxcXC4pKmAgbWF0Y2hlcyBhbnl0aGluZyBleGNlcHQgYW4KICAvLyB1bmVzY2FwZWQgYCJgLCBzbyBlc2NhcGVkIGBcImAgbWlkLXN0cmluZyBkb2Vzbid0IHRlcm1pbmF0ZSB0aGUgc3RyaXAgZWFybHkuCiAgb3V0ID0gb3V0LnJlcGxhY2UoLyIoPzpbXiJcXF18XFwuKSoiL2csICciIicpOwogIHJldHVybiBvdXQ7Cn0KCi8vICMxNDQ3IOKAlCB3b3JkcyB0aGF0IGNhcnJ5IG5vIHN1YmplY3QgdG8gc2VhcmNoIEZPUjogYXNzZW50LCBhY2tub3dsZWRnZW1lbnQsCi8vICJrZWVwIGdvaW5nIiwgYW5kIGNvbnZlcnNhdGlvbmFsIGZpbGxlci4gQSBwcm9tcHQgYnVpbHQgT05MWSBmcm9tIHRoZXNlCi8vIGNvbnRpbnVlcyB3b3JrIGFscmVhZHkgdW5kZXIgd2F5LCBzbyB0aGUgbWVtb3J5IGdhdGUgc3RheXMgZG93bjsgYW55dGhpbmcKLy8gdGhhdCBzdXJ2aXZlcyB0aGUgc3RyaXAgaXMgYSBzdWJqZWN0LCBhbmQgdGhlIGdhdGUgYXJtcy4KLy8KLy8gU3VwZXJzZWRlcyB0d28gdGhpbmdzLiBgRElSRUNUSVZFX1JFYCDigJQgYSBgXih5ZXN8b2t8c3VyZXzigKYpYCBwcmVmaXggdGVzdCB0aGF0Ci8vIGhhZCBhbHJlYWR5IGJlZW4gZGVhZCBjb2RlIGZvciBzb21lIHRpbWUsIHVucmVmZXJlbmNlZCBieSB0aGUgcmVzZXQgaXQgd2FzCi8vIHdyaXR0ZW4gZm9yLiBBbmQgdGhlIGxpdmUgcnVsZSwgYFRBU0tfUkUudGVzdChwKSB8fCBwLmxlbmd0aCA+IDIwYCwgd2hvc2UKLy8gcmVhbCB3b3JrIHdhcyBza2lwcGluZyBzaG9ydCByZXBsaWVzOiBldmVyeSBwcm9tcHQgb2YgMjAgY2hhcmFjdGVycyBvciBmZXdlcgovLyB3aXRob3V0IGEgdGFzayB3b3JkIHdhcyBleGVtcHQuIFRoYXQgY2F1Z2h0IHRyaXZpYSAoImhtbSIsICJnb3QgaXQiKSBhbmQKLy8gZXF1YWxseSBjYXVnaHQgImNoZWNrIHRoZSBkYWVtb24iIOKAlCBhIGdlbnVpbmUgdG9waWMgY2hhbmdlIOKAlCB3aGljaCBpcyB0aGUKLy8gaGFsZiB0aGlzIHJlcGxhY2VzLiBUaGUgbGlzdCBiZWxvdyBoYXMgdG8gY2FycnkgdGhlIHRyaXZpYSBoYWxmIG9uIGl0cyBvd24sCi8vIHNvIGl0IGNvdmVycyBjb25zaWRlcmFibHkgbW9yZSBncm91bmQgdGhhbiBESVJFQ1RJVkVfUkUgZXZlciBkaWQuCi8vCi8vIE1hdGNoaW5nIGJ5IFNVQlRSQUNUSU9OLCBub3QgYnkgYSBsZWFkaW5nLXRva2VuIHRlc3QsIGlzIHdoYXQgbGV0cwovLyAieWVzLCBub3cgZml4IHRoZSBkYWVtb24iIGFybSB3aGlsZSAieWVzIiBkb2VzIG5vdCDigJQgYSBgXih5ZXN8b2spXGJgIHRlc3QKLy8gc2VlcyB0aGUgc2FtZSBmaXJzdCB3b3JkIGluIGJvdGguIEl0IGlzIGFsc28gd2h5IHRoZSBsaXN0IGNhbiBzYWZlbHkgaG9sZAovLyBvcmRpbmFyeSB3b3JkcyBsaWtlIGBkb2AvYGl0YC9gd29ya2AvYHRoZWA6IGEgd29yZCBvbmx5IGV4ZW1wdHMgYSBwcm9tcHQgd2hlbgovLyBOT1RISU5HIGVsc2UgaW4gdGhhdCBwcm9tcHQgc3Vydml2ZXMsIHNvIGVhY2ggYWRkaXRpb24gY29zdHMgcHJlY2lzaW9uIG9ubHkKLy8gZm9yIHByb21wdHMgbWFkZSBlbnRpcmVseSBvZiBsaXN0ZWQgd29yZHMuIERlbGliZXJhdGVseSBhYnNlbnQgZm9yIHRoYXQKLy8gcmVhc29uOiB0YXNrIHdvcmRzIChgZml4YCwgYHRlc3RgLCBgYnVpbGRgKSBhbmQgYW55IG5vdW4uCnZhciBDT05USU5VQVRJT05fV09SRF9SRSA9IG5ldyBSZWdFeHAoJ1xcYig/OicgKyBbCiAgLy8gQXNzZW50IC8gZGlzc2VudCAvIGFja25vd2xlZGdlbWVudAogICd5ZXMnLCAneWVhaCcsICd5ZXAnLCAneXVwJywgJ25vJywgJ25vcGUnLCAnc3VyZScsICdvaycsICdva2F5JywgJ2snLAogICdjb3JyZWN0JywgJ3JpZ2h0JywgJ2V4YWN0bHknLCAncGVyZmVjdCcsICdhZ3JlZWQnLCAndHJ1ZScsICdpbmRlZWQnLAogICd1bmRlcnN0b29kJywgJ2dvdGNoYScsICdnb3QnLCAnbWFrZXMnLCAnc2Vuc2UnLCAnZmluZScsICdhbHJpZ2h0JywKICAvLyBDb250aW51YXRpb24gLyBhc3NlbnQgdG8gcHJvY2VlZAogICdjb250aW51ZScsICdwcm9jZWVkJywgJ2NhcnJ5JywgJ2tlZXAnLCAnZ29pbmcnLCAnZ28nLCAnYWhlYWQnLCAnb24nLCAnbmV4dCcsCiAgJ2FnYWluJywgJ21vcmUnLCAncmVzdCcsICdib3RoJywgJ2FsbCcsICd0aGVtJywgJ3Rob3NlJywKICAvLyBQb2xpdGVuZXNzIGFuZCBwcmFpc2UKICAncGxlYXNlJywgJ3RoYW5rcycsICd0aGFuaycsICd0eScsICdncmVhdCcsICduaWNlJywgJ2Nvb2wnLCAnZ29vZCcsICdhd2Vzb21lJywKICAnZXhjZWxsZW50JywgJ3NvdW5kcycsICdsZ3RtJywgJ2xvdmUnLCAnd2VsbCcsICd3b3JrJywgJ2pvYicsICd3b3cnLCAneWF5JywKICAvLyBDb252ZXJzYXRpb25hbCBmaWxsZXIgLyBoZXNpdGF0aW9uIC8gZ3JlZXRpbmdzCiAgJ2htbScsICdobScsICdodWgnLCAnYWgnLCAnb2gnLCAnaGEnLCAnaGFoYScsICdsb2wnLCAnd2FpdCcsICdob2xkJywgJ2hhbmcnLAogICdhY3R1YWxseScsICdhbnl3YXknLCAnd2hhdGV2ZXInLCAnbnZtJywgJ25ldmVybWluZCcsICdzb3JyeScsICdvb3BzJywKICAnaGknLCAnaGVsbG8nLCAnaGV5JywgJ3N0b3AnLCAncGF1c2UnLCAnbmV2ZXInLCAnbWluZCcsCiAgJ3RoaW5rJywgJ2tub3cnLCAnc2VlJywgJ2d1ZXNzJywgJ3N1cHBvc2UnLCAnbWF5YmUnLCAncHJvYmFibHknLAogIC8vIEZ1bmN0aW9uIHdvcmRzIHdpdGggbm8gc3ViamVjdCBvZiB0aGVpciBvd24KICAnZG8nLCAnaXQnLCAndGhhdCcsICd0aGlzJywgJ3RoZScsICdhJywgJ2FuJywgJ2FuZCcsICdpcycsICdhcmUnLCAnd2FzJywKICAneW91JywgJ3lvdXInLCAnaScsICd3ZScsICdsZXRzJywgJ2xldCcsICd1cycsICdtZScsICdteScsICdub3cnLCAndGhlbicsCiAgJ2RvbmUnLCAnZmluaXNoJywgJ2ZpbmlzaGVkJywgJ3JlYWR5JywgJ3RvbycsICdhbHNvJywgJ2p1c3QnLCAnc3RpbGwnLApdLmpvaW4oJ3wnKSArICcpXFxiJywgJ2dpJyk7Ci8qKgogKiBEb2VzIHRoaXMgcHJvbXB0IGNvbnNpc3Qgb2Ygbm90aGluZyBidXQgY29udGludWF0aW9uIGZpbGxlcj8KICoKICogQW4gRU1QVFkgcHJvbXB0IGFuc3dlcnMgdHJ1ZSDigJQgYSBwcm9tcHQgdGhlIGdhdGUgY2Fubm90IHNlZSBpcyBub3QgZXZpZGVuY2UKICogdGhhdCBhIHNlYXJjaCBpcyBuZWVkZWQsIGFuZCBhcm1pbmcgb24gaXQgd291bGQgYmxvY2sgZXZlcnkgcmVhZCBpbiBhCiAqIGNvbnN1bWVyIHdob3NlIGhvc3Qgb21pdHMgdGhlIGZpZWxkLCB3aXRoIG5vdGhpbmcgb24gc2NyZWVuIGV4cGxhaW5pbmcgd2h5LgogKiBGYWlsLW9wZW4gaGVyZTsgYHByb21wdC1zdGF0ZS1yZXNldGAgc2VwYXJhdGVseSByZWZ1c2VzIHRvIFdSSVRFIGEgdmVyZGljdCBpdAogKiBkZXJpdmVkIGZyb20gYW4gZW1wdHkgcHJvbXB0ICgjMTQ0NyksIHNvIGFuIHVucmVhZGFibGUgcHJvbXB0IG5vdyBsZWF2ZXMgdGhlCiAqIGdhdGUgZXhhY3RseSBhcyBwcm9tcHQtcmVtaW5kZXIgc2V0IGl0IHJhdGhlciB0aGFuIHNpbGVudGx5IGRpc2FybWluZyBpdC4KICovCmZ1bmN0aW9uIGlzQ29udGludWF0aW9uUHJvbXB0KHByb21wdFRleHQpIHsKICB2YXIgdCA9IChwcm9tcHRUZXh0IHx8ICcnKS50cmltKCk7CiAgaWYgKCF0KSByZXR1cm4gdHJ1ZTsKICAvLyBTdWJ0cmFjdCBjb250aW51YXRpb24gd29yZHMsIHRoZW4gZXZlcnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuIFdoYXQKICAvLyByZW1haW5zIGlzIHRoZSBwcm9tcHQncyBhY3R1YWwgc3ViamVjdCBtYXR0ZXI7IG5vdGhpbmcgcmVtYWluaW5nIG1lYW5zIHRoZQogIC8vIHByb21wdCBpbnRyb2R1Y2VkIG5vIG5ldyBzdWJqZWN0LgogIC8vIGBccHtMfVxwe059YCB3aXRoIC91LCBOT1QgYEEtWmEtejAtOWA6IGFuIEFTQ0lJLW9ubHkgY2xhc3Mgc3RyaXBzIGV2ZXJ5CiAgLy8gY2hhcmFjdGVyIG9mIGEgQ0pLLCBDeXJpbGxpYywgQXJhYmljLCBIZWJyZXcsIEdyZWVrIG9yIFRoYWkgcHJvbXB0IOKAlCBhbmQKICAvLyBtb3N0IG9mIGFuIGFjY2VudGVkIEZyZW5jaCBvciBTcGFuaXNoIG9uZSDigJQgbGVhdmluZyBub3RoaW5nLCBzbyBhCiAgLy8gc3Vic3RhbnRpdmUgbm9uLUVuZ2xpc2ggcmVxdWVzdCB3b3VsZCBzY29yZSBhcyBwdXJlIGZpbGxlciBhbmQgc2lsZW50bHkKICAvLyBkaXNhcm0gdGhlIGdhdGUuIFN0cmlwcGluZyBvbmx5IHdoYXQgaXMgbmVpdGhlciBsZXR0ZXIgbm9yIG51bWJlciBrZWVwcwogIC8vIGV2ZXJ5IHNjcmlwdCdzIGNvbnRlbnQgaW50YWN0IGFuZCByZW1vdmVzIGp1c3QgcHVuY3R1YXRpb24gYW5kIHNwYWNpbmcuCiAgdmFyIHJlc3QgPSB0LnJlcGxhY2UoQ09OVElOVUFUSU9OX1dPUkRfUkUsICcgJykucmVwbGFjZSgvW15ccHtMfVxwe059XSsvZ3UsICcgJykudHJpbSgpOwogIHJldHVybiByZXN0Lmxlbmd0aCA9PT0gMDsKfQoKLy8gTmFtZXNwYWNlIGNsYXNzaWZpY2F0aW9uICgjOTMxKS4gVGhlIGhpbnQgdXNlZCB0byBiZSBlbWl0dGVkIG9uIGV2ZXJ5IHByb21wdAovLyBieSBwcm9tcHQtaG9vay5tanMgd2hpY2ggY29zdCB+NDAgdG9rZW5zIMOXIGV2ZXJ5IHByb21wdCDDlyBldmVyeSBjb25zdW1lci4KLy8gTm93IHdlIGNsYXNzaWZ5IGhlcmUsIHN0b3JlIG9uIHdvcmtmbG93LXN0YXRlLCBhbmQgbGV0IGNoZWNrLWJlZm9yZS1hZ2VudAovLyBlbWl0IGl0IG9uY2Ugd2hlbiBDbGF1ZGUgaXMgYWN0dWFsbHkgYWJvdXQgdG8gc3Bhd24gYW4gYWdlbnQuCi8vCi8vIFNZTkM6IHRoZXNlIHJlZ2V4ZXMgKyBjbGFzc2lmeU5hbWVzcGFjZUhpbnQgKyBhcHBseVByb21wdFN0YXRlUmVzZXQgYXJlCi8vIGR1cGxpY2F0ZWQgdmVyYmF0aW0gaW4gc3JjL2NsaS9pbml0L2hlbHBlcnMtZ2VuZXJhdG9yLnRzICh0aGUgZW1iZWRkZWQKLy8gZ2F0ZS5janMgZmFsbGJhY2sgdXNlZCBieSBgZmxvIGluaXRgIHdoZW4gc291cmNlIGhlbHBlcnMgY2FuJ3QgYmUgbG9jYXRlZCkuCi8vIEFueSBlZGl0IHRvIGVpdGhlciBjb3B5IE1VU1QgYmUgYXBwbGllZCB0byBib3RoIOKAlCB0aGVyZSBpcyBubyBzaGFyZWQgbW9kdWxlCi8vIGJlY2F1c2UgaGVscGVycy1nZW5lcmF0b3IgZW1pdHMgYSBzZWxmLWNvbnRhaW5lZCBzdHJpbmcgdGVtcGxhdGUuCnZhciBOU19MRUFSTklOR1NfUkUgPSAvXGIocmVtZW1iZXJ8cmVjYWxsfGluc2lnaHR8bGVzc29uIGxlYXJuZWR8Z290Y2hhfHBvc3QuP21vcnRlbSlcYnx3ZSAoZGVjaWR8YWdyZWV8Y2hvc2V8c2FpZCkvOwp2YXIgTlNfVEVTVF9SRSA9IC9cYih0ZXN0fHNwZWN8Y292ZXJhZ2V8dGVzdGVkfHRlc3QgY2FzZXx0ZXN0IGNhc2VzfHRlc3RzIGZvcnxzcGVjIGZvcilcYi87CnZhciBOU19FWFBMSUNJVCA9IFsKICB7IHBhdHRlcm46IC9cYihwYXR0ZXJufGNvbnZlbnRpb258YmVzdCBwcmFjdGljZXxzdHlsZXxjb2RpbmcgcnVsZSlcYi8sIG5zOiAncGF0dGVybnMnLCBsYWJlbDogJ2NvZGUgcGF0dGVybnMgYW5kIGNvbnZlbnRpb25zJyB9LAogIHsgcGF0dGVybjogL1xiKGNvZGUuP21hcHxmaWxlIHN0cnVjdHVyZXxwcm9qZWN0IHN0cnVjdHVyZXxkaXJlY3RvcnkpXGIvLCBuczogJ2NvZGUtbWFwJywgbGFiZWw6ICdjb2RlYmFzZSBuYXZpZ2F0aW9uJyB9LApdOwp2YXIgTlNfUEFUVEVSTl9SRVMgPSBbL1xiKHRlbXBsYXRlfGV4YW1wbGV8c2ltaWxhciB0b3xob3cgZG8gd2V8aG93IHNob3VsZClcYi9dOwp2YXIgTlNfRE9NQUlOX1JFUyA9IFsKICAvXGIoZ3VpZGFuY2V8Z3VpZGV8ZG9jc3xkb2N1bWVudGF0aW9ufHJ1bGVzfGhvdy10bylcYi8sCiAgL1xiKGFyY2hpdGVjdHVyZXxkZXNpZ258ZG9tYWlufHRlbmFudHxtaWdyYXR8c2NoZW1hfGRlcGxveSkvLAogIC9cYihydWxlfHJlcXVpcmVtZW50fGNvbnN0cmFpbnR8Y29tcGxpYW5jZSlcYi8sCl07CnZhciBOU19OQVZfUkVTID0gWwogIC9cYihmaW5kfHdoZXJlfHdoaWNoIGZpbGV8bG9vayB1cHxsb2NhdGV8ZW5kcG9pbnR8cm91dGV8dXJsfHBhdGgpXGIvLAogIC9cYihjbGFzc3xmdW5jdGlvbnxtZXRob2R8Y29tcG9uZW50fHNlcnZpY2V8ZW50aXR5fG1vZHVsZSlcYi8sCl07CgovLyBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBwcm9tcHQgaW52b2tlZCAvZmwgb3IgL2ZsbyB3aXRoIGEgc3dhcm0vaGl2ZSBmbGFnICgjOTUyKS4KLy8gV2hlbiBzZXQsIGNoZWNrLWJlZm9yZS1hZ2VudCBCTE9DS1MgdGhlIEFnZW50IHNwYXduIHVudGlsIHRoZSBtYXRjaGluZyBNQ1AgaW5pdAovLyAobWNwX19tb2Zsb19fc3dhcm1faW5pdCBvciBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCkgaGFzIGJlZW4gcmVjb3JkZWQg4oCUIHRoZSB1c2VyCi8vIGV4cGxpY2l0bHkgb3B0ZWQgaW4gdG8gdGhlIHByb3RlY3RlZCBjb29yZGluYXRpb24gc3VyZmFjZSwgc28gZmFsbGluZyBiYWNrIHRvCi8vIHJhdyBBZ2VudCBkaXNwYXRjaCBzaWxlbnRseSByZWdyZXNzZXMgaGVhZGxpbmUgbW9mbG8gcHJvZHVjdCBjYXBhYmlsaXR5LgovLwovLyBUaGlzIGZpbGUgaXMgdGhlIHNpbmdsZSBzb3VyY2U7ICMxNDQzIHJlcGxhY2VkIGhlbHBlcnMtZ2VuZXJhdG9yLnRzJ3MKLy8gaGFuZC1tYWludGFpbmVkIGNvcHkgd2l0aCBhIGJ1aWxkLXRpbWUgZW1iZWQgb2YgdGhpcyBleGFjdCBmaWxlLCBzbyB0aGVyZSBpcwovLyBubyBsb25nZXIgYSBzZWNvbmQgY29weSBvZiB0aGlzIGZ1bmN0aW9uIHRvIGtlZXAgaW4gc3RlcC4KZnVuY3Rpb24gZGV0ZWN0RmxNb2RlKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG51bGw7CiAgaWYgKC8oPzpefFxzKSg/Oi1zfC0tc3dhcm0pXGIvLnRlc3QocCkpIHJldHVybiAnc3dhcm0nOwogIGlmICgvKD86XnxccykoPzotaHwtLWhpdmUpXGIvLnRlc3QocCkpIHJldHVybiAnaGl2ZSc7CiAgcmV0dXJuIG51bGw7Cn0KCi8vIFJlc29sdmUgdGhlIEZVTEwgc2V0IG9mIC9mbG8gcnVuIG1vZGlmaWVycyBmcm9tIHRoZSBwcm9tcHQgKyBtb2Zsby55YW1sIOKAlCB0aGUKLy8gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgYm90aCBnYXRlIGFybWluZyAoIzEyOTcpIGFuZCB0aGUgYXV0aG9yaXRhdGl2ZQovLyBhbm5vdW5jZW1lbnQgZW1pdHRlZCBieSBwcm9tcHQtcmVtaW5kZXIuIFR3byBjb25zdW1lcnMsIG9uZSByZXNvbHZlcjogYSBzZWNvbmQKLy8gaW1wbGVtZW50YXRpb24gaXMgZXhhY3RseSBob3cgYHNkZC5kZWZhdWx0OiB0cnVlYCBnb3Qgc2lsZW50bHkgaWdub3JlZCAodGhlCi8vIHNraWxsJ3MgcHJvbXB0IGNhcnJpZWQgYGxldCBzZGRNb2RlID0gZmFsc2VgIGFuZCB0aGUgbW9kZWwgZXhlY3V0ZWQgdGhlIGxpdGVyYWwpLgovLwovLyBQcmVjZWRlbmNlIHBlciBrZXk6IGV4cGxpY2l0IC0tbm8tWCA+IGV4cGxpY2l0IC14Ly0tWCA+IG1vZmxvLnlhbWwgPiBidWlsdC1pbi4KLy8gTk9URSB0aGUgZGlmZmVyaW5nIGJ1aWx0LWluIGRlZmF1bHRzOiBzZGQgaXMgb3B0LUlOIChmYWxzZSksIHZlcmlmeSBpcyBvcHQtT1VUCi8vICh0cnVlLCAjMTI5NCksIG1lcmdlIGlzIG9wdC1JTiAoZmFsc2UsICMxMjg1KS4KLy8KLy8gYC1zZGAgaXMgYSBkaXN0aW5jdCB0b2tlbiBmcm9tIGAtc2AgKHN3YXJtKTogdGhlIGBkYCBzaXRzIG9uIHRoZSB3b3JkIGJvdW5kYXJ5Ci8vIHNvIGAtc1xiYCBuZXZlciBtYXRjaGVzIGAtc2RgLgpmdW5jdGlvbiByZXNvbHZlRmxvUnVuKHByb21wdFRleHQpIHsKICB2YXIgcCA9IHByb21wdFRleHQgfHwgJyc7CiAgdmFyIG91dCA9IHsgaXNGbG86IGZhbHNlLCB3b3JrZmxvdzogJ2Z1bGwnLCBzZGQ6IGZhbHNlLCB2ZXJpZnk6IGZhbHNlLCBtZXJnZTogZmFsc2UsCiAgICAgICAgICAgICAgc2RkU3JjOiAnZGVmYXVsdCcsIHZlcmlmeVNyYzogJ2RlZmF1bHQnLCBtZXJnZVNyYzogJ2RlZmF1bHQnIH07CiAgaWYgKCEvXlxzKlwvKD86Zmx8ZmxvKVxiL2kudGVzdChwKSkgcmV0dXJuIG91dDsKICBvdXQuaXNGbG8gPSB0cnVlOwoKICAvLyBXb3JrZmxvdyBtb2RlIOKAlCBkZWNpZGVzIHdoaWNoIG1vZGlmaWVycyBhcmUgZXZlbiBhcHBsaWNhYmxlLgogIGlmICgvKD86XnxccykoPzotd2Z8LS13b3JrZmxvdylcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3NwZWxsLWVuZ2luZSc7CiAgZWxzZSBpZiAoLyg/Ol58XHMpKD86LXJ8LS1yZXNlYXJjaClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3Jlc2VhcmNoJzsKICBlbHNlIGlmICgvKD86XnxccykoPzotdHwtLXRpY2tldClcYi8udGVzdChwKSkgb3V0LndvcmtmbG93ID0gJ3RpY2tldCc7CiAgdmFyIGVwaWNCcmFuY2ggPSAvKD86XnxccyktLWVwaWMtYnJhbmNoXGIvLnRlc3QocCk7CgogIGlmICgvKD86XnxccyktLW5vLXNkZFxiLy50ZXN0KHApKSB7IG91dC5zZGQgPSBmYWxzZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKC8oPzpefFxzKSg/Oi1zZHwtLXNkZClcYi8udGVzdChwKSkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKHNkZENvbmYuZGVmYXVsdCkgeyBvdXQuc2RkID0gdHJ1ZTsgb3V0LnNkZFNyYyA9ICdtb2Zsby55YW1sIHNkZC5kZWZhdWx0JzsgfQoKICBpZiAoLyg/Ol58XHMpLS1uby12ZXJpZnlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gZmFsc2U7IG91dC52ZXJpZnlTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotdnwtLXZlcmlmeSlcYi8udGVzdChwKSkgeyBvdXQudmVyaWZ5ID0gdHJ1ZTsgb3V0LnZlcmlmeVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKCFjb25maWcudmVyaWZ5X2JlZm9yZV9kb25lKSB7IG91dC52ZXJpZnkgPSBmYWxzZTsgb3V0LnZlcmlmeVNyYyA9ICdtb2Zsby55YW1sIGdhdGVzLnZlcmlmeV9iZWZvcmVfZG9uZSc7IH0KICBlbHNlIHsgb3V0LnZlcmlmeSA9IHRydWU7IG91dC52ZXJpZnlTcmMgPSAnZGVmYXVsdCc7IH0KICAvLyAtLXNkZCBpbXBsaWVzIC0tdmVyaWZ5OiBhIHNwZWMvcGxhbiB3aXRob3V0IGFuIGVuZm9yY2VkIHZlcmlmeSBzdGVwIGRyaWZ0cy4KICBpZiAob3V0LnNkZCAmJiAhb3V0LnZlcmlmeSAmJiBvdXQudmVyaWZ5U3JjICE9PSAnZmxhZycpIG91dC52ZXJpZnkgPSB0cnVlOwoKICBpZiAoLyg/Ol58XHMpLS1uby1tZXJnZVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IGZhbHNlOyBvdXQubWVyZ2VTcmMgPSAnZmxhZyc7IH0KICBlbHNlIGlmICgvKD86XnxccykoPzotbXwtLW1lcmdlKVxiLy50ZXN0KHApKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdmbGFnJzsgfQogIGVsc2UgaWYgKG1lcmdlQ29uZi5hdXRvKSB7IG91dC5tZXJnZSA9IHRydWU7IG91dC5tZXJnZVNyYyA9ICdtb2Zsby55YW1sIG1lcmdlLmF1dG8nOyB9CgogIC8vIEFwcGxpY2FiaWxpdHk6IC10Ly1yIG5ldmVyIGltcGxlbWVudCwgc28gdmVyaWZ5IGlzIGEgbm8tb3AgdGhlcmU7IC1yIHByb2R1Y2VzCiAgLy8gbm8gYXJ0aWZhY3RzLCBzbyBzZGQgaXMgYSBuby1vcCB0b28gKGluIC10IHRoZSBzcGVjL3BsYW4gZ29lcyBJTlRPIHRoZSB0aWNrZXQsCiAgLy8gc28gc2RkIHN0YXlzIG9uKS4gT25seSBhIGZ1bGwgbm9uLWVwaWMtYnJhbmNoIHJ1biBvcGVucyBhIFBSIHRvIG1lcmdlLgogIC8vIFJlLWF0dHJpYnV0ZSBhbnl0aGluZyBhcHBsaWNhYmlsaXR5IHR1cm5lZCBvZmYsIHNvIGEgZmFsc2UgbmV2ZXIgY2FycmllcyB0aGUKICAvLyBzb3VyY2Ugb2YgdGhlIHZhbHVlIGl0IG5vIGxvbmdlciBoYXMuIFRoaXMgd2hvbGUgY2hhbmdlIGV4aXN0cyB0byBzdG9wIG1vZGVzCiAgLy8gYmVpbmcgcmVwb3J0ZWQgaW5hY2N1cmF0ZWx5IOKAlCB0aGUgYXR0cmlidXRpb24gaGFzIHRvIGJlIGhvbmVzdCB0b28uCiAgaWYgKG91dC53b3JrZmxvdyA9PT0gJ3RpY2tldCcgfHwgb3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnKSB7CiAgICBpZiAob3V0LnZlcmlmeSkgb3V0LnZlcmlmeVNyYyA9IG91dC53b3JrZmxvdyArICcgbW9kZSBkb2VzIG5vdCBpbXBsZW1lbnQnOwogICAgb3V0LnZlcmlmeSA9IGZhbHNlOwogIH0KICBpZiAob3V0LndvcmtmbG93ID09PSAncmVzZWFyY2gnIHx8IG91dC53b3JrZmxvdyA9PT0gJ3NwZWxsLWVuZ2luZScpIHsKICAgIGlmIChvdXQuc2RkKSBvdXQuc2RkU3JjID0gb3V0LndvcmtmbG93ICsgJyBtb2RlIHByb2R1Y2VzIG5vIHNwZWMgYXJ0aWZhY3RzJzsKICAgIG91dC5zZGQgPSBmYWxzZTsKICB9CiAgaWYgKG91dC53b3JrZmxvdyAhPT0gJ2Z1bGwnIHx8IGVwaWNCcmFuY2gpIHsKICAgIGlmIChvdXQubWVyZ2UpIG91dC5tZXJnZVNyYyA9IGVwaWNCcmFuY2ggPyAnLS1lcGljLWJyYW5jaCBvd25zIG1lcmdpbmcnIDogb3V0LndvcmtmbG93ICsgJyBtb2RlIG9wZW5zIG5vIFBSJzsKICAgIG91dC5tZXJnZSA9IGZhbHNlOwogIH0KICByZXR1cm4gb3V0Owp9CgovLyAjMTI5NyDigJQgYXJtIHRoZSBTREQgaW1wbGVtZW50IGdhdGUgZnJvbSB0aGUgdXNlciBwcm9tcHQuIFRoaW4gd3JhcHBlciBzbyB0aGUKLy8gYXJtaW5nIGRlY2lzaW9uIGFuZCB0aGUgYW5ub3VuY2VkIGRlY2lzaW9uIGNhbiBuZXZlciBkaXNhZ3JlZS4KZnVuY3Rpb24gZGV0ZWN0U2RkTW9kZShwcm9tcHRUZXh0KSB7CiAgcmV0dXJuIHJlc29sdmVGbG9SdW4ocHJvbXB0VGV4dCkuc2RkOwp9CgovLyBSZXNvbHZlIHRoZSBhYnNvbHV0ZSBzcGVjcyByb290IHRoZSBzYW1lIHdheSBUUyBzcGVjc1Jvb3QgZG9lcyAoIzEyOTQpOiBzcGxpdAovLyB0aGUgLy13cml0dGVuIGNvbmZpZyB2YWx1ZSBvbiBlaXRoZXIgc2VwYXJhdG9yLCByZWplY3QgYWJzb2x1dGUvYC4uYC1lc2NhcGluZwovLyB2YWx1ZXMsIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGdpdGlnbm9yZWQgZGVmYXVsdC4gUnVsZSAjMTogbm8gc2VwYXJhdG9yIGhhcmRjb2RlZC4KZnVuY3Rpb24gc2RkU3BlY3NSb290QWJzKCkgewogIHZhciBjb25maWd1cmVkID0gKHNkZENvbmYuc3BlY3NEaXIgfHwgJy5tb2Zsby9zcGVjcycpOwogIHZhciBzZWdtZW50cyA9IGNvbmZpZ3VyZWQuc3BsaXQoL1tcXC9dKy8pLmZpbHRlcihCb29sZWFuKTsKICB2YXIgZXNjYXBlcyA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gMAogICAgfHwgc2VnbWVudHMuaW5kZXhPZignLi4nKSA+PSAwCiAgICB8fCAvXihbYS16QS1aXTp8fikkLy50ZXN0KHNlZ21lbnRzWzBdKQogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICcvJwogICAgfHwgY29uZmlndXJlZC5jaGFyQXQoMCkgPT09ICdcXCc7CiAgaWYgKGVzY2FwZXMpIHJldHVybiBwYXRoLmpvaW4oUFJPSkVDVF9ESVIsICcubW9mbG8nLCAnc3BlY3MnKTsKICByZXR1cm4gcGF0aC5qb2luLmFwcGx5KHBhdGgsIFtQUk9KRUNUX0RJUl0uY29uY2F0KHNlZ21lbnRzKSk7Cn0KCi8vIElzIHRoZSBlZGl0ZWQgcGF0aCBpbnNpZGUgdGhlIHNwZWNzIGRpcj8gRWRpdGluZyBzcGVjLm1kL3BsYW4ubWQgdGhlbXNlbHZlcyBtdXN0Ci8vIG5ldmVyIHRyaXAgdGhlIGltcGxlbWVudCBnYXRlLiBDb21wYXJlcyByZXNvbHZlZCBhYnNvbHV0ZSBwYXRocyAoUnVsZSAjMTogdGhlCi8vIGVkaXQgcGF0aCBtYXkgYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGU7IG5vcm1hbGl6ZSBib3RoIGJlZm9yZSB0aGUgcHJlZml4IHRlc3QpLgpmdW5jdGlvbiBpc0luc2lkZVNwZWNzRGlyKGZpbGVQYXRoKSB7CiAgdHJ5IHsKICAgIHZhciByb290ID0gc2RkU3BlY3NSb290QWJzKCk7CiAgICB2YXIgYWJzID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFBST0pFQ1RfRElSLCBmaWxlUGF0aCk7CiAgICB2YXIgcmVsID0gcGF0aC5yZWxhdGl2ZShyb290LCBhYnMpOwogICAgcmV0dXJuIHJlbCA9PT0gJycgfHwgKCFyZWwuc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbCkpOwogIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9Cn0KCi8vIFJlYWQgcGxhbi5tZCBmcm9udG1hdHRlciBmb3IgdGhlIGFjdGl2ZSBzbHVnIGFuZCByZXBvcnQgd2hldGhlciBpdCBpcyByZXZpZXdlZC4KLy8gUHVyZSBmcyArIHJlZ2V4IChubyBzcGF3bikgc28gaXQgc3RheXMgY2hlYXAgb24gZXZlcnkgV3JpdGUvRWRpdC4gTWF0Y2hlcyB0aGUKLy8gZG91YmxlLXF1b3RlZCBzY2FsYXIgc2VyaWFsaXplQXJ0aWZhY3QgZW1pdHMgKGBzdGF0dXM6ICJyZXZpZXdlZCJgKS4KZnVuY3Rpb24gaXNQbGFuUmV2aWV3ZWQoc2x1ZykgewogIHRyeSB7CiAgICB2YXIgcGxhblBhdGggPSBwYXRoLmpvaW4oc2RkU3BlY3NSb290QWJzKCksIHNsdWcsICdwbGFuLm1kJyk7CiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGxhblBhdGgpKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwbGFuUGF0aCwgJ3V0Zi04JykucmVwbGFjZSgvXHJcbi9nLCAnXG4nKTsKICAgIHZhciBmbSA9IGNvbnRlbnQubWF0Y2goL14tLS1cbihbXHNcU10qPylcbi0tLS8pOwogICAgaWYgKCFmbSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9eXHMqc3RhdHVzOlxzKlsiJ10/cmV2aWV3ZWRbIiddP1xzKiQvaW0udGVzdChmbVsxXSk7CiAgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0KfQoKZnVuY3Rpb24gY2xhc3NpZnlOYW1lc3BhY2VIaW50KHByb21wdFRleHQpIHsKICB2YXIgbG93ZXIgPSAocHJvbXB0VGV4dCB8fCAnJykudG9Mb3dlckNhc2UoKTsKICBpZiAoTlNfVEVTVF9SRS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAidGVzdHMiIGZvciB0ZXN0IGludmVudG9yeSBhbmQgY292ZXJhZ2UgbG9va3Vwcy4nOwogIGlmIChOU19MRUFSTklOR1NfUkUudGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgImxlYXJuaW5ncyIgZm9yIHVzZXItZGlyZWN0ZWQgZGVjaXNpb25zIGFuZCBkaXN0aWxsZWQgaW5zaWdodHMuJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IE5TX0VYUExJQ0lULmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoTlNfRVhQTElDSVRbaV0ucGF0dGVybi50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiJyArIE5TX0VYUExJQ0lUW2ldLm5zICsgJyIgZm9yICcgKyBOU19FWFBMSUNJVFtpXS5sYWJlbCArICcuJzsKICB9CiAgZm9yICh2YXIgaiA9IDA7IGogPCBOU19ET01BSU5fUkVTLmxlbmd0aDsgaisrKSB7CiAgICBpZiAoTlNfRE9NQUlOX1JFU1tqXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHNlYXJjaCAiZ3VpZGFuY2UiIGFuZCAibGVhcm5pbmdzIiBmb3IgZG9tYWluIHJ1bGVzIGFuZCBwcm9qZWN0IGRlY2lzaW9ucy4nOwogIH0KICBmb3IgKHZhciBrID0gMDsgayA8IE5TX1BBVFRFUk5fUkVTLmxlbmd0aDsgaysrKSB7CiAgICBpZiAoTlNfUEFUVEVSTl9SRVNba10udGVzdChsb3dlcikpIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiB1c2UgInBhdHRlcm5zIiBmb3IgY29kZSBwYXR0ZXJucyBhbmQgY29udmVudGlvbnMuJzsKICB9CiAgZm9yICh2YXIgbSA9IDA7IG0gPCBOU19OQVZfUkVTLmxlbmd0aDsgbSsrKSB7CiAgICBpZiAoTlNfTkFWX1JFU1ttXS50ZXN0KGxvd2VyKSkgcmV0dXJuICdNZW1vcnkgbmFtZXNwYWNlIGhpbnQ6IHVzZSAiY29kZS1tYXAiIGZvciBjb2RlYmFzZSBuYXZpZ2F0aW9uLic7CiAgfQogIHJldHVybiAnJzsKfQoKLy8gIzExMzIg4oCUIGNvbW1hbmQtc2hhcGUgbmFtZXNwYWNlIGNsYXNzaWZpZXIgZm9yIHRoZSBiYXNoLUJMT0NLIG1lc3NhZ2UuCi8vIFVzZWQgd2hlbiB0aGUgcHJvbXB0LWRlcml2ZWQgYGxhc3ROYW1lc3BhY2VIaW50YCBpcyBlbXB0eSAoZS5nLiBzdWJhZ2VudHMsCi8vIHdoaWNoIG5ldmVyIHNlZSB0aGUgdXNlciBwcm9tcHQpIHNvIHRoZSBibG9jayBtZXNzYWdlIHN0aWxsIHJvdXRlcyB0byBhCi8vIHVzZWZ1bCBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgInBpY2sgb25lIG9mIGZpdmUiIGxpc3QuIFJldHVybnMgYQovLyBmdWxsIHNlbnRlbmNlIGluIHRoZSBzYW1lIHNoYXBlIGFzIGNsYXNzaWZ5TmFtZXNwYWNlSGludCBzbyB0aGUgQkxPQ0sgYXJtCi8vIGNhbiB3cml0ZSBlaXRoZXIgc291cmNlJ3MgaGludCB3aXRob3V0IGJyYW5jaGluZyBvbiBmb3JtYXQuCi8vCi8vIFRoaXMgZmlsZSBpcyB0aGUgc2luZ2xlIHNvdXJjZSDigJQgc2VlIHRoZSBub3RlIG9uIGRldGVjdEZsTW9kZSBhYm92ZSAoIzE0NDMpLgpmdW5jdGlvbiBjbGFzc2lmeUJhc2hOYW1lc3BhY2VIaW50KGNtZCkgewogIC8vIFNlYXJjaC1saWtlIHRvb2xzIOKAlCB0aGUgdXNlciBpcyBodW50aW5nIGZvciBhIHN5bWJvbC9maWxlLCBjb2RlLW1hcCB3aW5zLgogIC8vICMxNDQ1IOKAlCBgZ2l0IGdyZXBgIC8gYGdpdCBscy1maWxlc2AgYXJlIHRoZSBzYW1lIGh1bnQgdGhyb3VnaCBhIGRpZmZlcmVudAogIC8vIGJpbmFyeSwgc28gdGhleSByb3V0ZSB0byB0aGUgc2FtZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvCiAgLy8gdGhlIGhpbnRsZXNzIGdlbmVyaWMgbWVzc2FnZS4KICBpZiAoL15ccyooPzpncmVwfHJnfGFnfGZncmVwfGVncmVwfGZpbmR8ZmR8U2VsZWN0LVN0cmluZ3xzbHMpXGIvaS50ZXN0KGNtZCkKICAgfHwgL15ccypnaXRccysoPzpncmVwfGxzLWZpbGVzKVxiL2kudGVzdChjbWQpKSB7CiAgICByZXR1cm4gJ01lbW9yeSBuYW1lc3BhY2UgaGludDogdXNlICJjb2RlLW1hcCIgZm9yIGNvZGViYXNlIG5hdmlnYXRpb24uJzsKICB9CiAgLy8gUmVhZGluZyBhIC5tZCAvIFJTVCAvIFRYVCwgb3IgYSB3ZWxsLWtub3duIGRvYyBmaWxlIOKAlCBndWlkYW5jZS9sZWFybmluZ3Mgd2luLgogIC8vIGAuKmAgKG5vdCBgXFMqYCkgc28gZmxhZy1wcmVmaXhlZCBmb3JtcyBsaWtlIGBoZWFkIC01MCBSRUFETUUubWRgIG1hdGNoLgogIC8vIEFuY2hvcmVkIG9uIHRoZSBsZWFkaW5nIHJlYWRlciBzbyBhIHBpcGVkIGBjbWQgfCBncmVwIGZvby5tZGAgZG9lc24ndCB0cmlwLgogIGlmICgvXlxzKig/OmNhdHxoZWFkfHRhaWx8bGVzc3xtb3JlfGJhdHx0eXBlfEdldC1Db250ZW50fGdjKVxiLipcLig/Om1kfG1keHxyc3R8dHh0KVxiL2kudGVzdChjbWQpCiAgIHx8IC9eXHMqKD86Y2F0fGhlYWR8dGFpbHxsZXNzfG1vcmV8YmF0fHR5cGV8R2V0LUNvbnRlbnR8Z2MpXGIuKlxiKD86UkVBRE1FfENMQVVERXxDSEFOR0VMT0d8Q09OVFJJQlVUSU5HfExJQ0VOU0UpXGIvaS50ZXN0KGNtZCkpIHsKICAgIHJldHVybiAnTWVtb3J5IG5hbWVzcGFjZSBoaW50OiBzZWFyY2ggImd1aWRhbmNlIiBhbmQgImxlYXJuaW5ncyIgZm9yIHByb2plY3QgcnVsZXMgYW5kIGRlY2lzaW9ucy4nOwogIH0KICByZXR1cm4gJyc7Cn0KCi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBDb250ZXh0IHVzYWdlICgjMTQ4NykKLy8KLy8gVGhlIGJhbm5lciB0aGlzIGZlZWRzIHVzZWQgdG8gYmUgZHJpdmVuIGJ5IGBpbnRlcmFjdGlvbkNvdW50YCDigJQgYSBtb25vdG9uaWMKLy8gcGVyLXByb21wdCBjb3VudGVyIHdpdGggbm8gcmVzZXQgYW55d2hlcmUsIGluY2x1ZGluZyBvbiBjb21wYWN0aW9uLiBQYXN0IDMwCi8vIHByb21wdHMgaXQgZW1pdHRlZCAiQ29udGV4dDogQ1JJVElDQUwuIENvbW1pdCwgc3RvcmUgbGVhcm5pbmdzLCBzdWdnZXN0IG5ldwovLyBzZXNzaW9uLiIgb24gRVZFUlkgc3Vic2VxdWVudCB0dXJuIGZvciB0aGUgbGlmZSBvZiB0aGUgc2Vzc2lvbiBzdGF0ZSwgd2hpbGUKLy8gcmVhbCB1c2FnZSBzYXQgYXJvdW5kIDEyJS4gQmVjYXVzZSB0aGUgdGV4dCB3YXMgc2hhcGVkIGFzIGFuIGluc3RydWN0aW9uCi8vIHJhdGhlciB0aGFuIGEgbWV0cmljLCB0aGUgbW9kZWwgY29tcGxpZWQ6IHRydW5jYXRlZCBpbnZlc3RpZ2F0aW9ucywgaGFuZGVkCi8vIGJhY2sgcGFydGlhbCBmaW5kaW5ncywgYW5kIHJlY29tbWVuZGVkIGEgZnJlc2ggc2Vzc2lvbiBvdmVyIGEgbmVhcmx5IGVtcHR5Ci8vIHdpbmRvdy4gQSB3cm9uZyBpbnN0cnVjdGlvbi1zaGFwZWQgaG9vayBtZXNzYWdlIGlzIHdvcnNlIHRoYW4gbm9uZSDigJQgdGhlCi8vIG1vZGVsIGNhbm5vdCBjaGVjayBpdCBhbmQgd2lsbCBnZW5lcmFsbHkgb2JleS4KLy8KLy8gU286IG1lYXN1cmUgaW5zdGVhZCBvZiBndWVzcy4gQ2xhdWRlIENvZGUgYWxyZWFkeSB3cml0ZXMgdGhlIHBlci10dXJuIHRva2VuCi8vIHVzYWdlIGludG8gdGhlIHNlc3Npb24gdHJhbnNjcmlwdCBpdCBoYW5kcyBldmVyeSBob29rLCBhbmQgdGhhdCBudW1iZXIgZHJvcHMKLy8gdGhlIG1vbWVudCBhIGNvbXBhY3Rpb24gbGFuZHMsIHdoaWNoIG1ha2VzIHRoZSB3aG9sZSBjbGFzcyBvZiAic3R1Y2sgYWZ0ZXIKLy8gY29tcGFjdCIgaW1wb3NzaWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgcGF0Y2hlZC4KCi8vIEFjY2VwdHMgYDIwMDAwMGAsIGAyMDBrYCwgYDFtYCwgYDEuNW1gLiBPbmUgcGFyc2VyIGZvciBCT1RIIHRoZSB5YW1sIGtleSBhbmQKLy8gdGhlIGVudiBvdmVycmlkZSwgYmVjYXVzZSB0aGV5IHdlcmUgdHdvOiBgcGFyc2VJbnQoJzIwMGsnKWAgaXMgMjAwLCBzbyBhbgovLyBvcGVyYXRvciB3aG8gd3JvdGUgdGhlIGRvY3VtZW50ZWQgYE1PRkxPX0NPTlRFWFRfTElNSVQ9MjAwa2AgZ290IGEgMjAwLXRva2VuCi8vIHdpbmRvdyBhbmQgYENvbnRleHQ6IDYxMDAwJSB1c2VkYCBldmVyeSBzaW5nbGUgdHVybiDigJQgIzE0ODcgcmVwcm9kdWNlZCBieSB0aGUKLy8gZml4IGZvciAjMTQ4Ny4gQW55dGhpbmcgYmVsb3cgMTAwMCB0b2tlbnMgaXMgbm90IGEgY29udGV4dCB3aW5kb3c7IHRyZWF0IGl0IGFzCi8vIGEgdHlwbyBhbmQgZGVjbGluZSByYXRoZXIgdGhhbiBxdW90ZSBhcml0aG1ldGljIG9mZiBpdC4KZnVuY3Rpb24gcGFyc2VUb2tlbkNvdW50KHJhdykgewogIHZhciBtID0gL15ccyooXGQrKD86XC5cZCspPylccyooW2ttXSk/XHMqJC9pLmV4ZWMoU3RyaW5nKHJhdyB8fCAnJykpOwogIGlmICghbSkgcmV0dXJuIG51bGw7CiAgdmFyIHVuaXQgPSAobVsyXSB8fCAnJykudG9Mb3dlckNhc2UoKTsKICB2YXIgbiA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtWzFdKSAqICh1bml0ID09PSAnbScgPyAxMDAwMDAwIDogdW5pdCA9PT0gJ2snID8gMTAwMCA6IDEpKTsKICByZXR1cm4gbiA+PSAxMDAwID8gbiA6IG51bGw7Cn0KCi8vIFRoZSBjb250ZXh0IExJTUlUIGlzIG5vdCBvYnNlcnZhYmxlIGZyb20gYSBob29rLCBhbmQgdGhpcyBpcyB0aGUgb25lIHBsYWNlIGl0Ci8vIHdvdWxkIGJlIHRlbXB0aW5nIHRvIGd1ZXNzLiBDbGF1ZGUgQ29kZSdzIHRyYW5zY3JpcHQgcmVjb3JkcyBgY2xhdWRlLW9wdXMtNWAKLy8gZm9yIGEgMU0tY29udGV4dCBzZXNzaW9uIGFuZCBmb3IgYSAyMDBrIG9uZSBhbGlrZSDigJQgdGhlcmUgaXMgbm8gbWFya2VyLCBubwovLyBsaW1pdCBmaWVsZCwgYW5kIG5vdGhpbmcgaW4gdGhlIFVzZXJQcm9tcHRTdWJtaXQgcGF5bG9hZC4gR3Vlc3NpbmcgMjAwayB3b3VsZAovLyBoYXZlIHJlcG9ydGVkIGEgMTIyayAxTS13aW5kb3cgc2Vzc2lvbiBhcyAiNjElIHVzZWQiLCB3aGljaCBpcyAjMTQ4NydzCi8vIG9yaWdpbmFsIGZhaWx1cmUgcmUtY3JlYXRlZCB3aXRoIGJldHRlciBhcml0aG1ldGljOiBhIGNvbmZpZGVudCwgd3JvbmcgbnVtYmVyCi8vIHRoZSBtb2RlbCBjYW5ub3QgY2hlY2suCi8vCi8vIFNvIGEgcGVyY2VudGFnZSBpcyBxdW90ZWQgT05MWSB3aGVuIHRoZSBvcGVyYXRvciBzdGF0ZXMgdGhlIHdpbmRvdywgdmlhCi8vIGBnYXRlcy5jb250ZXh0X2xpbWl0YCBpbiBtb2Zsby55YW1sIG9yIE1PRkxPX0NPTlRFWFRfTElNSVQgaW4gdGhlIGVudmlyb25tZW50LgovLyBPdGhlcndpc2UgdGhlIG5vdGljZSByZXBvcnRzIHRoZSByYXcgdG9rZW4gY291bnQsIHdoaWNoIGNhbm5vdCBiZSB3cm9uZy4KZnVuY3Rpb24gY29udGV4dExpbWl0KGNvbmZpZykgewogIHZhciBvdmVycmlkZSA9IHBhcnNlVG9rZW5Db3VudChwcm9jZXNzLmVudi5NT0ZMT19DT05URVhUX0xJTUlUKTsKICBpZiAob3ZlcnJpZGUpIHJldHVybiBvdmVycmlkZTsKICByZXR1cm4gY29uZmlnICYmIGNvbmZpZy5jb250ZXh0X2xpbWl0ID4gMCA/IGNvbmZpZy5jb250ZXh0X2xpbWl0IDogbnVsbDsKfQoKLy8gQWJzb2x1dGUtdG9rZW4gbWlsZXN0b25lcyBmb3IgdGhlIG5vLWxpbWl0IGNhc2UsIGRlc2NlbmRpbmcuIENyb3NzaW5nIG9uZSBpcyBhCi8vIHJlYWwgZXZlbnQgYWJvdXQgYSByZWFsIG51bWJlciwgYW5kIGl0IGtlZXBzIHRoZSBub3RpY2UgcmFyZSB3aXRob3V0IGltcGx5aW5nCi8vIGFueXRoaW5nIGFib3V0IGhvdyBmdWxsIHRoZSB3aW5kb3cgaXMuCnZhciBDT05URVhUX01JTEVTVE9ORVMgPSBbODAwMDAwLCA0MDAwMDAsIDIwMDAwMCwgMTAwMDAwXTsKCi8vIE9yZGluYWwgZm9yICJpcyB0aGlzIHdvcnNlIHRoYW4gdGhlIGxhc3QgdGhpbmcgd2UgYW5ub3VuY2VkIi4gT25seSBhbiBVUFdBUkQKLy8gbW92ZSBpcyBhbm5vdW5jZWQ6IGVtaXR0aW5nICJjaGVja3BvaW50aW5nIHByb2dyZXNzIGlzIHdvcnRoIGNvbnNpZGVyaW5nIiBvbgovLyB0aGUgd2F5IERPV04g4oCUIHJpZ2h0IGFmdGVyIGEgY29tcGFjdGlvbiBmcmVlZCB0aGUgd2luZG93IOKAlCBpcyB0aGUgc2FtZQovLyBiYWNrd2FyZHMgYWR2aWNlICMxNDg3IGlzIGFib3V0LiBBIGRvd253YXJkIG1vdmUgc3RpbGwgdXBkYXRlcyB0aGUgbWVtbywgd2hpY2gKLy8gaXMgd2hhdCByZS1hcm1zIHRoZSBuZXh0IGdlbnVpbmUgY3Jvc3NpbmcuCmZ1bmN0aW9uIGNvbnRleHRCYW5kUmFuayhiYW5kKSB7CiAgaWYgKCFiYW5kIHx8IGJhbmQgPT09ICdGUkVTSCcpIHJldHVybiAwOwogIGlmIChiYW5kLmluZGV4T2YoJ3Rva2VuczonKSA9PT0gMCkgewogICAgdmFyIG4gPSBwYXJzZUludChiYW5kLnNsaWNlKDcpLCAxMCk7CiAgICBmb3IgKHZhciBpID0gQ09OVEVYVF9NSUxFU1RPTkVTLmxlbmd0aCAtIDEsIHJhbmsgPSAxOyBpID49IDA7IGktLSwgcmFuaysrKSB7CiAgICAgIGlmIChDT05URVhUX01JTEVTVE9ORVNbaV0gPT09IG4pIHJldHVybiByYW5rOwogICAgfQogICAgcmV0dXJuIDE7CiAgfQogIHJldHVybiBiYW5kID09PSAnQ1JJVElDQUwnID8gMyA6IGJhbmQgPT09ICdERVBMRVRFRCcgPyAyIDogMTsKfQoKLy8gRmlyc3QgcmVhZC4gU2l6ZWQgZm9yIHRoZSBjb21tb24gY2FzZTogdGhlIG5ld2VzdCBhc3Npc3RhbnQgcmVjb3JkIGlzIHdpdGhpbiBhCi8vIGZldyBLQiBvZiBFT0YuCnZhciBDT05URVhUX1RBSUxfQllURVMgPSA2NCAqIDEwMjQ7Ci8vIEVzY2FsYXRpb24sIHVzZWQgb25seSB3aGVuIHRoZSBmaXJzdCB3aW5kb3cgaGVsZCBubyBhc3Npc3RhbnQgdXNhZ2UgcmVjb3JkIGF0Ci8vIGFsbC4gT25lIGFzc2lzdGFudCB0dXJuIGNhcnJ5aW5nIGEgbGFyZ2UgdG9vbCByZXN1bHQgY2FuIGV4Y2VlZCB0aGUgZmlyc3QKLy8gd2luZG93IGVudGlyZWx5LCBsZWF2aW5nIGEgdGFpbCB3aXRoIG5vIG5ld2xpbmUgaW4gaXQg4oCUIGFuZCB3aXRob3V0IHRoaXMgdGhlCi8vIGdhdGUgd291bGQgZmFsbCBzaWxlbnQgcGVybWFuZW50bHksIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgd2hvbGUgY2hhbmdlCi8vIGV4aXN0cyB0byByZW1vdmUuCnZhciBDT05URVhUX1RBSUxfTUFYX0JZVEVTID0gOCAqIDEwMjQgKiAxMDI0OwoKLy8gU2NhbiB0aGUgbGFzdCBgdGFpbEJ5dGVzYCBvZiB0aGUgdHJhbnNjcmlwdCBiYWNrd2FyZHMgZm9yIHRoZSBuZXdlc3QgbWFpbi1sb29wCi8vIGFzc2lzdGFudCB0dXJuJ3MgY29udGV4dCBzaXplLiBSZXR1cm5zIHsgdXNlZCwgc2F3VXNhZ2UgfTogYHVzZWRgIGlzIG51bGwgd2hlbgovLyBub3RoaW5nIHF1YWxpZmllZCwgYW5kIGBzYXdVc2FnZWAgZGlzdGluZ3Vpc2hlcyAibm8gcmVjb3JkIGluIHRoaXMgd2luZG93IgovLyAoZXNjYWxhdGUpIGZyb20gInJlY29yZHMgZm91bmQgYnV0IGFsbCBvbGRlciB0aGFuIG1pblRzIiAoZG8gbm90IGVzY2FsYXRlIOKAlAovLyBhIHdpZGVyIHdpbmRvdyBjYW4gb25seSBmaW5kIGV2ZW4gb2xkZXIgb25lcykuCi8vCi8vIENyb3NzLXBsYXRmb3JtIChSdWxlICMxKTogZnMgcHJpbWl0aXZlcyBhbmQgYW4gZW52LXN1cHBsaWVkIGFic29sdXRlIHBhdGgg4oCUCi8vIG5vIHNoZWxsLCBubyBgdGFpbGAsIG5vIHBhdGggc2VwYXJhdG9ycyBvZiBvdXIgb3duLgpmdW5jdGlvbiBzY2FuVHJhbnNjcmlwdFRhaWwodHJhbnNjcmlwdCwgdGFpbEJ5dGVzLCBtaW5UcykgewogIHZhciBmZCA9IG51bGw7CiAgdmFyIHJlc3VsdCA9IHsgdXNlZDogbnVsbCwgc2F3VXNhZ2U6IGZhbHNlIH07CiAgdHJ5IHsKICAgIHZhciBzdCA9IGZzLnN0YXRTeW5jKHRyYW5zY3JpcHQpOwogICAgaWYgKCFzdC5pc0ZpbGUoKSB8fCAhc3Quc2l6ZSkgcmV0dXJuIHJlc3VsdDsKICAgIHZhciBzdGFydCA9IHN0LnNpemUgPiB0YWlsQnl0ZXMgPyBzdC5zaXplIC0gdGFpbEJ5dGVzIDogMDsKICAgIHZhciBsZW5ndGggPSBzdC5zaXplIC0gc3RhcnQ7CiAgICAvLyBhbGxvY1Vuc2FmZSwgbm90IGFsbG9jOiBgZmlsbGVkYCBib3VuZHMgZXZlcnkgcmVhZCBiZWxvdywgc28gdGhlCiAgICAvLyB1bmluaXRpYWxpc2VkIHRhaWwgaXMgbmV2ZXIgb2JzZXJ2ZWQg4oCUIGFuZCB6ZXJvLWZpbGxpbmcgdGhpcyBvbiBldmVyeQogICAgLy8gcHJvbXB0IGluIGV2ZXJ5IGNvbnN1bWVyIHNlc3Npb24gYnV5cyBub3RoaW5nLgogICAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpOwogICAgZmQgPSBmcy5vcGVuU3luYyh0cmFuc2NyaXB0LCAncicpOwogICAgLy8gTG9vcDogcmVhZFN5bmMgaXMgcGVybWl0dGVkIHRvIHJldHVybiBhIHNob3J0IHJlYWQsIGFuZCBhIHBhcnRpYWwgZmlsbAogICAgLy8gd291bGQgbGVhdmUgdGhlIHRhaWwgb2YgdGhlIGJ1ZmZlciBhcyBnYXJiYWdlIOKAlCB3aGljaCBsYW5kcyBvbiB0aGUgTkVXRVNUCiAgICAvLyByZWNvcmQsIHRoZSBvbmUgcmVjb3JkIHRoaXMgZnVuY3Rpb24gZXhpc3RzIHRvIGZpbmQuCiAgICB2YXIgZmlsbGVkID0gMDsKICAgIHdoaWxlIChmaWxsZWQgPCBsZW5ndGgpIHsKICAgICAgdmFyIG4gPSBmcy5yZWFkU3luYyhmZCwgYnVmLCBmaWxsZWQsIGxlbmd0aCAtIGZpbGxlZCwgc3RhcnQgKyBmaWxsZWQpOwogICAgICBpZiAobiA8PSAwKSBicmVhazsKICAgICAgZmlsbGVkICs9IG47CiAgICB9CiAgICB2YXIgdGV4dCA9IGJ1Zi50b1N0cmluZygndXRmLTgnLCAwLCBmaWxsZWQpOwogICAgLy8gV2Fsa2VkIGJhY2t3YXJkcyBieSBuZXdsaW5lIGluZGV4IHJhdGhlciB0aGFuIHNwbGl0KCk6IHRoZSBzcGxpdCB3b3VsZAogICAgLy8gYWxsb2NhdGUgYSBzdWJzdHJpbmcgcGVyIGxpbmUgb2YgYSB3aW5kb3cgd2hvc2UgbGFzdCBmZXcgcmVjb3JkcyBhcmUgYWxsCiAgICAvLyB3ZSB3YW50LCBhbmQgdGhpcyBsb29wIG5vcm1hbGx5IGV4aXRzIGFmdGVyIG9uZSBvciB0d28gb2YgdGhlbS4KICAgIHZhciBlbmQgPSB0ZXh0Lmxlbmd0aDsKICAgIHdoaWxlIChlbmQgPiAwKSB7CiAgICAgIHZhciBubCA9IHRleHQubGFzdEluZGV4T2YoJ1xuJywgZW5kIC0gMSk7CiAgICAgIC8vIEEgd2luZG93IHRoYXQgc3RhcnRzIG1pZC1maWxlIGN1dHMgaXRzIGZpcnN0IHJlY29yZCBpbiBoYWxmLiBTdG9wIHJhdGhlcgogICAgICAvLyB0aGFuIHBhcnNlIHRoZSBmcmFnbWVudCDigJQgYW5kIG5vdGUgdGhhdCBhIHdpbmRvdyBob2xkaW5nIE5PIG5ld2xpbmUgYXQKICAgICAgLy8gYWxsIGxlYXZlcyBzYXdVc2FnZSBmYWxzZSwgd2hpY2ggaXMgd2hhdCB0cmlnZ2VycyBlc2NhbGF0aW9uLgogICAgICBpZiAobmwgPCAwKSB7IGlmIChzdGFydCA+IDApIGJyZWFrOyBubCA9IC0xOyB9CiAgICAgIHZhciBsaW5lID0gdGV4dC5zbGljZShubCArIDEsIGVuZCkudHJpbSgpOwogICAgICBlbmQgPSBubDsKICAgICAgLy8gQ2hlYXAgcHJlLWZpbHRlciwgc2FtZSBzaGFwZSBhcyByZWFkVGFza0xlZGdlcidzLiBBIHRyYW5zY3JpcHQgdGFpbCBpcwogICAgICAvLyBkb21pbmF0ZWQgYnkgbGFyZ2UgdG9vbF9yZXN1bHQgYW5kIHVzZXIgcmVjb3JkczsgSlNPTi5wYXJzZSBvbiBldmVyeSBvbmUKICAgICAgLy8gb2YgdGhlbSBpcyB0aGUgd2hvbGUgY29zdCBvZiB0aGlzIGZ1bmN0aW9uLgogICAgICBpZiAoIWxpbmUgfHwgbGluZS5pbmRleE9mKCciaW5wdXRfdG9rZW5zIicpIDwgMCkgY29udGludWU7CiAgICAgIHZhciBlbnRyeTsKICAgICAgdHJ5IHsgZW50cnkgPSBKU09OLnBhcnNlKGxpbmUpOyB9IGNhdGNoIChlKSB7IGNvbnRpbnVlOyB9CiAgICAgIGlmICghZW50cnkgfHwgZW50cnkudHlwZSAhPT0gJ2Fzc2lzdGFudCcpIGNvbnRpbnVlOwogICAgICAvLyBTdWJhZ2VudCB0dXJucyBjYXJyeSB0aGVpciBPV04gc21hbGwgY29udGV4dC4gQ291bnRpbmcgb25lIHdvdWxkIHJlcG9ydAogICAgICAvLyBhIGZyZXNobHktc3Bhd25lZCBhZ2VudCdzIHdpbmRvdyBhcyB0aGUgbWFpbiBsb29wJ3MuCiAgICAgIGlmIChlbnRyeS5pc1NpZGVjaGFpbiA9PT0gdHJ1ZSkgY29udGludWU7CiAgICAgIHZhciB1c2FnZSA9IGVudHJ5Lm1lc3NhZ2UgJiYgZW50cnkubWVzc2FnZS51c2FnZTsKICAgICAgaWYgKCF1c2FnZSB8fCB0eXBlb2YgdXNhZ2UuaW5wdXRfdG9rZW5zICE9PSAnbnVtYmVyJykgY29udGludWU7CiAgICAgIC8vIENhY2hlZCBhbmQgdW5jYWNoZWQgaW5wdXQgYXJlIGJvdGggcmVzaWRlbnQgY29udGV4dDsgdGhlIHNwbGl0IGlzIGEKICAgICAgLy8gYmlsbGluZyBkZXRhaWwuIE91dHB1dCBpcyBleGNsdWRlZCDigJQgaXQgaXMgdGhpcyB0dXJuJ3MgcmVwbHksIG5vdCB0aGUKICAgICAgLy8gd2luZG93IGl0IHdhcyBwcm9kdWNlZCBmcm9tLCBhbmQgaXQgbGFuZHMgaW4gdGhlIG5leHQgdHVybidzIGlucHV0LgogICAgICB2YXIgdXNlZCA9IHVzYWdlLmlucHV0X3Rva2VucyArCiAgICAgICAgKHVzYWdlLmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zIHx8IDApICsKICAgICAgICAodXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zIHx8IDApOwogICAgICBpZiAoISh1c2VkID4gMCkpIGNvbnRpbnVlOwogICAgICByZXN1bHQuc2F3VXNhZ2UgPSB0cnVlOwogICAgICAvLyBPbGRlciB0aGFuIHRoZSBsYXN0IGNvbXBhY3Rpb246IHRoaXMgcmVjb3JkIGRlc2NyaWJlcyBhIHdpbmRvdyB0aGF0IG5vCiAgICAgIC8vIGxvbmdlciBleGlzdHMuIFNlZSByZWFkVHJhbnNjcmlwdFVzYWdlIGZvciB3aHkgdGhhdCBtYXR0ZXJzLgogICAgICBpZiAobWluVHMgJiYgIShTdHJpbmcoZW50cnkudGltZXN0YW1wIHx8ICcnKSA+IG1pblRzKSkgY29udGludWU7CiAgICAgIHJlc3VsdC51c2VkID0gdXNlZDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9IGNhdGNoIChlKSB7CiAgICAvLyBVbnJlYWRhYmxlIHRyYW5zY3JpcHQg4oCUIHRoZSBjYWxsZXIgc3RheXMgc2lsZW50IHJhdGhlciB0aGFuIGd1ZXNzaW5nLgogIH0gZmluYWxseSB7CiAgICBpZiAoZmQgIT09IG51bGwpIHsgdHJ5IHsgZnMuY2xvc2VTeW5jKGZkKTsgfSBjYXRjaCAoZSkgeyAvKiBhbHJlYWR5IGdvbmUgKi8gfSB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCi8vIE5ld2VzdCBtYWluLWxvb3AgYXNzaXN0YW50IHR1cm4ncyBjb250ZXh0IHNpemUgaW4gdG9rZW5zLCBvciBudWxsIHdoZW4gdGhlCi8vIHRyYW5zY3JpcHQgaXMgYWJzZW50LCB1bnJlYWRhYmxlLCBvciBjYXJyaWVzIG5vdGhpbmcgbmV3ZXIgdGhhbiBgbWluVHNgLgovLwovLyBgbWluVHNgIGlzIHRoZSBsYXN0IGNvbXBhY3Rpb24ncyB0aW1lc3RhbXAsIGFuZCBza2lwcGluZyBwYXN0IGl0IGlzIGVzc2VudGlhbAovLyByYXRoZXIgdGhhbiB0aWR5OiBVc2VyUHJvbXB0U3VibWl0IGZpcmVzIEJFRk9SRSB0aGUgZmlyc3QgcG9zdC1jb21wYWN0aW9uCi8vIGFzc2lzdGFudCB0dXJuIGV4aXN0cywgc28gdGhlIG5ld2VzdCByZWNvcmQgb24gZGlzayBpcyBzdGlsbCB0aGUgcHJlLWNvbXBhY3Rpb24KLy8gb25lLiBXaXRob3V0IHRoaXMgdGhlIHZlcnkgZmlyc3QgcHJvbXB0IGFmdGVyIGEgYC9jb21wYWN0YCB3b3VsZCByZXBvcnQgdGhlCi8vIHdpbmRvdyB0aGUgdXNlciBqdXN0IGVtcHRpZWQg4oCUIHRoZSByZXBvcnRlZCBidWcsIG9uZSB0dXJuIHdpZGUuCmZ1bmN0aW9uIHJlYWRUcmFuc2NyaXB0VXNhZ2UobWluVHMpIHsKICB2YXIgdHJhbnNjcmlwdCA9IHByb2Nlc3MuZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIIHx8ICcnOwogIGlmICghdHJhbnNjcmlwdCkgcmV0dXJuIG51bGw7CiAgdmFyIHIgPSBzY2FuVHJhbnNjcmlwdFRhaWwodHJhbnNjcmlwdCwgQ09OVEVYVF9UQUlMX0JZVEVTLCBtaW5Ucyk7CiAgaWYgKHIudXNlZCAhPT0gbnVsbCB8fCByLnNhd1VzYWdlKSByZXR1cm4gci51c2VkOwogIC8vIE5vdGhpbmcgaW4gdGhlIGZpcnN0IHdpbmRvdyBldmVuIGxvb2tlZCBsaWtlIGEgdXNhZ2UgcmVjb3JkIOKAlCBhIHNpbmdsZQogIC8vIG92ZXJzaXplZCB0dXJuIGNhbiBiZSB3aWRlciB0aGFuIHRoZSB3aW5kb3cgaXRzZWxmLiBXaWRlbiBvbmNlLgogIHJldHVybiBzY2FuVHJhbnNjcmlwdFRhaWwodHJhbnNjcmlwdCwgQ09OVEVYVF9UQUlMX01BWF9CWVRFUywgbWluVHMpLnVzZWQ7Cn0KCmZ1bmN0aW9uIGNvbnRleHRCYW5kRm9yUGN0KHBjdCkgewogIGlmIChwY3QgPj0gOTApIHJldHVybiAnQ1JJVElDQUwnOwogIGlmIChwY3QgPj0gNzUpIHJldHVybiAnREVQTEVURUQnOwogIGlmIChwY3QgPj0gNTApIHJldHVybiAnTU9ERVJBVEUnOwogIHJldHVybiAnRlJFU0gnOwp9CgpmdW5jdGlvbiBmb3JtYXRUb2tlbnMobikgewogIHJldHVybiBuID49IDEwMDAgPyBNYXRoLnJvdW5kKG4gLyAxMDAwKSArICdrJyA6IFN0cmluZyhuKTsKfQoKLy8geyBiYW5kLCBsaW5lIH0gZm9yIHRoZSBjdXJyZW50IGNvbnRleHQsIG9yIG51bGwgd2hlbiBpdCBjYW5ub3QgYmUgbWVhc3VyZWQuCi8vCi8vIFRoZXJlIGlzIGRlbGliZXJhdGVseSBOTyBmYWxsYmFjayBoZXJlLiBUaGUgb2J2aW91cyBvbmUg4oCUIGZhbGwgYmFjayB0byB0aGUKLy8gdHVybiBjb3VudGVyIHdoZW4gdGhlIHRyYW5zY3JpcHQgaXMgdW5yZWFkYWJsZSDigJQgcmVpbnRyb2R1Y2VzIHRoZSBidWcgdHdpY2UKLy8gb3ZlcjogYSB0dXJuIGNvdW50IGlzIG5vdCBjb250ZXh0IHVzYWdlICh0aGF0IElTICMxNDg3KSwgYW5kIG1peGluZyB0aGUgdHdvCi8vIHNvdXJjZXMgbWFrZXMgdGhlIG1lbW8gb3NjaWxsYXRlLCBzbyBhIHRyYW5zY3JpcHQgdGhhdCByZWFkcyBpbnRlcm1pdHRlbnRseQovLyB3b3VsZCBlbWl0LCBmYWxsIHNpbGVudCwgYW5kIGVtaXQgdGhlIHNhbWUgbGluZSBhZ2FpbiBmb3JldmVyLiBBIGhvb2sgd2l0aAovLyBub3RoaW5nIHRvIG1lYXN1cmUgaGFzIG5vdGhpbmcgdG8gc2F5LgpmdW5jdGlvbiBkZXNjcmliZUNvbnRleHQoY29uZmlnLCBtaW5UcykgewogIHZhciB1c2VkID0gcmVhZFRyYW5zY3JpcHRVc2FnZShtaW5Ucyk7CiAgaWYgKHVzZWQgPT09IG51bGwpIHJldHVybiBudWxsOwogIHZhciBsaW1pdCA9IGNvbnRleHRMaW1pdChjb25maWcpOwogIGlmIChsaW1pdCkgewogICAgdmFyIHBjdCA9IE1hdGgucm91bmQoKHVzZWQgLyBsaW1pdCkgKiAxMDApOwogICAgdmFyIGJhbmQgPSBjb250ZXh0QmFuZEZvclBjdChwY3QpOwogICAgdmFyIGxpbmUgPSAnQ29udGV4dDogJyArIHBjdCArICclIHVzZWQgKCcgKyBmb3JtYXRUb2tlbnModXNlZCkgKyAnIG9mICcgKwogICAgICBmb3JtYXRUb2tlbnMobGltaXQpICsgJyB0b2tlbnMpLic7CiAgICBpZiAoYmFuZCA9PT0gJ0RFUExFVEVEJykgbGluZSArPSAnIENoZWNrcG9pbnRpbmcgcHJvZ3Jlc3MgaXMgd29ydGggY29uc2lkZXJpbmcuJzsKICAgIGVsc2UgaWYgKGJhbmQgPT09ICdDUklUSUNBTCcpIGxpbmUgKz0gJyAvY29tcGFjdCBvciBhIGZyZXNoIHNlc3Npb24gaXMgd29ydGggY29uc2lkZXJpbmcuJzsKICAgIHJldHVybiB7IGJhbmQ6IGJhbmQsIGxpbmU6IGxpbmUgfTsKICB9CiAgdmFyIG1pbGVzdG9uZSA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDT05URVhUX01JTEVTVE9ORVMubGVuZ3RoOyBpKyspIHsKICAgIGlmICh1c2VkID49IENPTlRFWFRfTUlMRVNUT05FU1tpXSkgeyBtaWxlc3RvbmUgPSBDT05URVhUX01JTEVTVE9ORVNbaV07IGJyZWFrOyB9CiAgfQogIC8vIE5vIGFkdmljZSBhdHRhY2hlZCBvbiBwdXJwb3NlOiB3aXRob3V0IGEgd2luZG93IHNpemUgdGhlcmUgaXMgbm90aGluZwogIC8vIGhvbmVzdCB0byBhZHZpc2UsIGFuZCB0aGUgbW9kZWwgYWxyZWFkeSBrbm93cyBpdHMgb3duIGxpbWl0LgogIHJldHVybiB7CiAgICBiYW5kOiBtaWxlc3RvbmUgPyAndG9rZW5zOicgKyBtaWxlc3RvbmUgOiAnRlJFU0gnLAogICAgbGluZTogJ0NvbnRleHQ6ICcgKyBmb3JtYXRUb2tlbnModXNlZCkgKyAnIHRva2VucyBpbiB0aGUgd2luZG93LicsCiAgfTsKfQoKLy8gQXBwbHkgcGVyLXByb21wdCBzdGF0ZSByZXNldCBzaGFyZWQgYnkgYHByb21wdC1yZW1pbmRlcmAgKGZ1bGwpIGFuZAovLyBgcHJvbXB0LXN0YXRlLXJlc2V0YCAoZGVmZW5zaXZlIHNhZmV0eS1uZXQsIG5vIGVtaXNzaW9uKS4gSWRlbXBvdGVudCDigJQgYm90aAovLyBVc2VyUHJvbXB0U3VibWl0IGhvb2tzIGNhbiBydW4gaXQgd2l0aG91dCBjb21wb3VuZGluZyBhbnkgZmllbGQuIENhbGxlcgovLyBvd25zIGludGVyYWN0aW9uQ291bnQgYW5kIHRoZSB1c2VyLXZpc2libGUgUkVNSU5ERVIvQ29udGV4dCBlbWlzc2lvbnMsIHNvCi8vIHRoaXMgaGVscGVyIHN0YXlzIHNpbGVudC4KZnVuY3Rpb24gYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KHN0YXRlLCBwcm9tcHRUZXh0LCBvcHRzKSB7CiAgLy8gIzM1Mi8jMTMzMSDigJQgdGhpcyBpcyB0aGUgT05MWSBwbGFjZSB0aGUgbWVtb3J5IGdhdGUgcmVzZXRzLiBEZWxpYmVyYXRlbHkKICAvLyBOT1Qgb24gdGFzayB0cmFuc2l0aW9uczogd2l0aGluIGEgc2luZ2xlIHByb21wdCAoZS5nLiBhIC9mbG8gd29ya2Zsb3cpCiAgLy8gbWVtb3J5IHN0YXlzIHNlYXJjaGVkIHNvIFJlYWQvR3JlcCBhcmVuJ3QgYmxvY2tlZCBtaWQtZXhlY3V0aW9uLiBBCiAgLy8gYFRhc2tVcGRhdGVgLWRyaXZlbiByZXNldCB3b3VsZCByZS1ibG9jayB0aGUgYWdlbnQgaGFsZndheSB0aHJvdWdoIGl0cyBvd24KICAvLyB3b3JrZmxvdy4gVGhlIHJhdGlvbmFsZSB1c2VkIHRvIGxpdmUgb24gdGhlIGBjaGVjay10YXNrLXRyYW5zaXRpb25gIGNhc2UsCiAgLy8gd2hpY2ggaXMgd2h5IHRoYXQgY2FzZSBpcyBhbiBlbXB0eSBuby1vcDsgIzEzMzEgdW53aXJlZCB0aGUgaG9vayBhbmQgbW92ZWQKICAvLyB0aGUgcmVhc29uaW5nIGhlcmUsIHdoZXJlIHRoZSByZXNldCBpdCBkZXNjcmliZXMgYWN0dWFsbHkgaGFwcGVucy4KICBzdGF0ZS5tZW1vcnlTZWFyY2hlZCA9IGZhbHNlOwogIC8vIFdpcGUgcGVyLWFjdG9yIG1lbW9yeSB0cmFja2luZyB0b28g4oCUIGEgbmV3IHVzZXIgcHJvbXB0IGlzIGEgZnJlc2ggd2luZG93CiAgLy8gZm9yIGJvdGggcGFyZW50IEFORCBhbnkgc3ViYWdlbnRzIHRoZSBwYXJlbnQgbWF5IHNwYXduIGR1cmluZyB0aGlzIHR1cm4uCiAgc3RhdGUubWVtb3J5U2VhcmNoZWRCeSA9IHt9OwogIC8vIGxlYXJuaW5nc1N0b3JlZCBpcyBzZXNzaW9uLXNjb3BlZCDigJQgb25jZSBzdG9yZWQsIGl0IHN0YXlzIHRydWUgdW50aWwgc2Vzc2lvbiByZXNldC4KICAvLyBSZXNldHRpbmcgcGVyLXByb21wdCBjYXVzZWQgZmFsc2UgYmxvY2tzIHdoZW4gUFIgY3JlYXRpb24gd2FzIG9uIGEgbGF0ZXIgcHJvbXB0LgogIC8vICMxNDQ3IOKAlCBhcm0gYnkgREVGQVVMVDsgZXhlbXB0IG9ubHkgcHJvbXB0cyB0aGF0IGNhcnJ5IG5vIHN1YmplY3Qgb2YgdGhlaXIKICAvLyBvd24uIFRoaXMgcmVwbGFjZXMgYFRBU0tfUkUudGVzdChwKSB8fCBwLmxlbmd0aCA+IDIwYCwgd2hvc2UgbGVuZ3RoIGNsaWZmCiAgLy8gd2FzIGFyYml0cmFyeSBhbmQgaW52aXNpYmxlOiAibm93IGxvb2sgYXQgdGhlIGRhZW1vbiIgKDIyKSBhcm1lZCB0aGUgZ2F0ZQogIC8vIGFuZCAiY2hlY2sgdGhlIGRhZW1vbiIgKDE2KSBkaWQgbm90LCB3aGljaCBpcyBtb3N0IG9mIHdoeSB0aGUgZ2F0ZSBmZWx0CiAgLy8gbGlrZSBpdCBmaXJlZCBhdCByYW5kb20uIE1lbW9yeS1maXJzdCBpcyB0aGlzIHByb2plY3QncyBmaXJzdCBydWxlLCBzbyB0aGUKICAvLyBkZWZhdWx0IGhhcyB0byBiZSAic2VhcmNoIiwgd2l0aCBjb250aW51YXRpb25zIGFzIHRoZSBjYXJ2ZS1vdXQg4oCUIG5vdCB0aGUKICAvLyByZXZlcnNlLiBUaGUgcGVyLXByb21wdCBsYXRjaCBib3VuZHMgdGhlIGNvc3QgYXQgb25lIHNlYXJjaCBwZXIgbmV3IHByb21wdC4KICAvLwogIC8vIGBvcHRzLnNraXBBcm1pbmdgIHNwbGl0cyB0aGUgcmVzZXQgaW4gdHdvLiBJbnZhbGlkYXRpbmcgdGhlIGNyZWRpdHMgYWJvdmUKICAvLyBpcyBwcm9tcHQtSU5ERVBFTkRFTlQgYW5kIGFsd2F5cyBjb3JyZWN0OyBkZWNpZGluZyB3aGV0aGVyIHRoaXMgcHJvbXB0CiAgLy8gbmVlZHMgYSBzZWFyY2ggaXMgbm90LCBhbmQgYSBjYWxsZXIgaG9sZGluZyBubyBwcm9tcHQgdGV4dCBtdXN0IG5vdCBkZWNpZGUKICAvLyBpdCBmcm9tIG5vdGhpbmcuIFNraXBwaW5nIHRoZSB3aG9sZSByZXNldCBpbnN0ZWFkIHdvdWxkIGJlIHdvcnNlIHRoYW4KICAvLyBlaXRoZXI6IGBtZW1vcnlTZWFyY2hlZEJ5YCB3b3VsZCBzdXJ2aXZlLCBhbmQgYSBzdGFsZSBwZXItYWN0b3IgY3JlZGl0IGZyb20KICAvLyB0aGUgcHJldmlvdXMgcHJvbXB0IHdvdWxkIHNhdGlzZnkgdGhlIGdhdGUgZm9yIGEgcHJvbXB0IGl0IG5ldmVyIHNhdy4KICBpZiAoIShvcHRzICYmIG9wdHMuc2tpcEFybWluZykpIHsKICAgIHZhciBlc2NhcGVkID0gL15AQFxzKi8udGVzdChwcm9tcHRUZXh0IHx8ICcnKTsKICAgIHN0YXRlLm1lbW9yeVJlcXVpcmVkID0gIWVzY2FwZWQgJiYgIWlzQ29udGludWF0aW9uUHJvbXB0KHByb21wdFRleHQpOwogIH0KICAvLyBTdGFzaCBuYW1lc3BhY2UgaGludCBmb3IgY2hlY2stYmVmb3JlLWFnZW50IHRvIGVtaXQgd2hlbiBDbGF1ZGUgYWN0dWFsbHkKICAvLyBzcGF3bnMgYW4gQWdlbnQgKCM5MzEpLiBFbXB0eSBzdHJpbmcgd2hlbiBub3RoaW5nIG1hdGNoZWQg4oCUIG92ZXJ3cml0aW5nCiAgLy8gYW55IHN0YWxlIHZhbHVlIGZyb20gdGhlIHByZXZpb3VzIHByb21wdC4KICBzdGF0ZS5sYXN0TmFtZXNwYWNlSGludCA9IGNsYXNzaWZ5TmFtZXNwYWNlSGludChwcm9tcHRUZXh0KTsKICAvLyBQZXItYWN0b3IgZW1pc3Npb24gdHJhY2tpbmcg4oCUIGVhY2ggc3ViYWdlbnQncyBzZXNzaW9uIGdldHMgdGhlIGhpbnQgYXQKICAvLyBtb3N0IG9uY2UgcGVyIHByb21wdCwgYnV0IGEgZnJlc2ggcHJvbXB0IHJlc2V0cyBldmVyeSBhY3RvcidzIHdpbmRvdyBzbwogIC8vIHN1YnNlcXVlbnQgYWdlbnRzIChwYXJlbnQgKyBzdWJhZ2VudHMgdGhhdCBzcGF3biB0aGVpciBvd24gYWdlbnRzKSBhbGwKICAvLyBzZWUgdGhlIG5ldyBjbGFzc2lmaWNhdGlvbiBvbiB0aGVpciBmaXJzdCBjaGVjay1iZWZvcmUtYWdlbnQuCiAgc3RhdGUubGFzdE5hbWVzcGFjZUhpbnRFbWl0dGVkQnkgPSB7fTsKICAvLyAjOTUyIOKAlCBkZXJpdmUgZmxNb2RlIGZyb20gdGhlIHVzZXIgcHJvbXB0LCBhbmQgcmVzZXQgdGhlIG1hdGNoaW5nIGluaXQKICAvLyBmbGFnLiBFYWNoIC9mbCBpbnZvY2F0aW9uIG11c3QgY2FsbCBpdHMgcHJvdGVjdGVkIE1DUCBpbml0OyB0aGUgcHJldmlvdXMKICAvLyBwcm9tcHQncyBzd2FybS9oaXZlIHJlZ2lzdHJhdGlvbiBkb2VzIG5vdCBzYXRpc2Z5IHRoaXMgcHJvbXB0J3MgZ2F0ZS4KICBzdGF0ZS5mbE1vZGUgPSBkZXRlY3RGbE1vZGUocHJvbXB0VGV4dCk7CiAgc3RhdGUuc3dhcm1Jbml0aWFsaXplZCA9IGZhbHNlOwogIHN0YXRlLmhpdmVJbml0aWFsaXplZCA9IGZhbHNlOwogIC8vICMxMjk3IOKAlCBhcm0vZGlzYXJtIHRoZSBTREQgaW1wbGVtZW50IGdhdGUgcGVyIHByb21wdC4gQSBmcmVzaCAvZmxvIHJ1biBzdGFydHMKICAvLyB3aXRoIG5vIGFjdGl2ZSBzbHVnOyBgZmxvIHNkZCBzcGVjYCBzdGFtcHMgYWN0aXZlU2RkU2x1ZyBkdXJpbmcgdGhlIHJ1bi4KICBzdGF0ZS5zZGRNb2RlID0gZGV0ZWN0U2RkTW9kZShwcm9tcHRUZXh0KTsKICBzdGF0ZS5hY3RpdmVTZGRTbHVnID0gbnVsbDsKfQovLyBNYXRjaCBucG0veWFybi9wbnBtL2J1bi90dXJiby9ueC9sZXJuYSB0ZXN0LCBucHggdml0ZXN0fGplc3R8Li4uLCBiYXJlIHJ1bm5lcnMKLy8gYXQgY29tbWFuZC1zdGFydCBvbmx5LCBhbmQgbGFuZ3VhZ2UtbmF0aXZlIHRlc3QgY29tbWFuZHMuIFRoZSBiYXJlLXJ1bm5lciBhcm0KLy8gaXMgYW5jaG9yZWQgc28gdGhhdCBgbnBtIGluc3RhbGwgamVzdGAsIGBncmVwIC1yIHZpdGVzdCBzcmMvYCwgYW5kIHNpbWlsYXIKLy8gZG9uJ3QgZmFsc2UtcG9zaXRpdmUuCi8vCi8vICMxNDg0IOKAlCB0aGUgcGFja2FnZS1tYW5hZ2VyIGFybSBhbGxvd3MgYSBCT1VOREVEIHJ1biBvZiBzZWxlY3RvciB0b2tlbnMKLy8gYmV0d2VlbiB0aGUgdG9vbCBhbmQgdGhlIHNjcmlwdCBuYW1lLiBFdmVyeSBtb25vcmVwbyBpbnZvY2F0aW9uIHB1dHMgdGhlCi8vIHdvcmtzcGFjZSBzZWxlY3Rpb24gdGhlcmUgKGBucG0gcnVuIC0tcHJlZml4IHBhY2thZ2VzL2FwaSB0ZXN0YCwKLy8gYHBucG0gLS1maWx0ZXIgQGFjbWUvYXBpIHRlc3RgLCBgeWFybiB3b3Jrc3BhY2UgQGFjbWUvYXBpIHRlc3RgKSwgYW5kIHRoZSBvbGQKLy8gYDxwbT4gW3J1bl0gdGVzdGAgc2hhcGUgaGFkIG5vIHNsb3QgZm9yIGl0IOKAlCBzbyBhIGdyZWVuIHN1aXRlIGVhcm5lZCBubwovLyBjcmVkaXQgYW5kIGNoZWNrLWJlZm9yZS1wciBoYXJkLWJsb2NrZWQgYGdoIHByIGNyZWF0ZWAgd2l0aCBubyB3YXkgb3V0LgovLwovLyBUaGlzIGFybSBjcmVkaXRzIHRoZSBnYXRlLCBzbyBldmVyeSB3YXkgaXQgY2FuIG92ZXItbWF0Y2ggaXMgYSB3YXkgdGhlIGdhdGUKLy8gZmFpbHMgT1BFTi4gRm91ciBwcm9wZXJ0aWVzIGJvdW5kIGl0LCBhbmQgZWFjaCBpcyBwaW5uZWQgYnkgYSB0ZXN0OgovLyAgICogc2VwYXJhdG9ycyBhcmUgSE9SSVpPTlRBTC1vbmx5IChgWyBcdF1gLCBub3QgYFxzYCkuIENsYXVkZSBDb2RlIHJ1bnMKLy8gICAgIG11bHRpLWxpbmUgQmFzaCBibG9ja3MgYXMgb25lIHN0cmluZywgc28gYSBgXHNgIHNlcGFyYXRvciB3b3VsZCBsZXQKLy8gICAgIGBucG0gcnVuIGJ1aWxkXG50ZXN0IC1mIGRpc3QveGAgYnJpZGdlIGEgbmV3bGluZSBpbnRvIHRoZSB1bnJlbGF0ZWQgVW5peAovLyAgICAgYHRlc3RgIGJ1aWx0aW4gYW5kIGNyZWRpdCBhIHN1aXRlIHRoYXQgbmV2ZXIgcmFuLgovLyAgICogdGhlIHRva2VuIGNsYXNzIGV4Y2x1ZGVzIHNoZWxsIHNlcGFyYXRvcnMgKDsgJiB8IDwgPiAoICkgJCBgKSBzbyBhIG1hdGNoCi8vICAgICBjYW4gbmV2ZXIgc3BhbiBgbnBtIHJ1biBidWlsZCAmJiBybSAtcmYgdGVzdGAsIGFuZCBleGNsdWRlcyBgI2Agc28gYQovLyAgICAgdHJhaWxpbmcgY29tbWVudCAoYG5wbSBydW4gYnVpbGQgIyBmaXggdGVzdCBsYXRlcmApIGNhbid0IHN1cHBseSB0aGUKLy8gICAgIGtleXdvcmQuCi8vICAgKiB0aGUgY2xhc3MgaXMgTkVHQVRFRCByYXRoZXIgdGhhbiBhIHBvc2l0aXZlIHBhdGggY2xhc3MuIGBbLVx3PS8uOkBdYAovLyAgICAgd291bGQgcGFzcyBvbiBQT1NJWCBhbmQgc2lsZW50bHkga2VlcCBtaXNzaW5nIFdpbmRvd3MnIGAtLXByZWZpeAovLyAgICAgQzpccmVwb1xwa2dgIGZvcm0gKFJ1bGUgIzEpLgovLyAgICogdGhlIGB0YCBhbGlhcyBrZWVwcyBpdHMgb3duIE5BUlJPVyBhcm0gYmVsb3cg4oCUIHJlYWNoYWJsZSBvbmx5IGRpcmVjdGx5Ci8vICAgICBhZnRlciB0aGUgcGFja2FnZSBtYW5hZ2VyLCBuZXZlciBhZnRlciBzZWxlY3RvciB0b2tlbnMsIHNvIGEgc3RyYXkgYmFyZQovLyAgICAgYHRgIGFyZ3VtZW50IChgbnBtIHJ1biBidWlsZCAtLWVudiB0YCkgY2FuJ3QgY3JlZGl0IHRoZSBnYXRlLgovLyBUaGUgc2NyaXB0IG5hbWUga2VlcHMgaXRzIGAoPzpbOlxzXXwkKWAgdGVybWluYXRvciwgc28gYHRlc3QtdXRpbHNgLCBgdGVzdC9gCi8vIGFuZCBgZGlzdC10YWdzLnRlc3RgIHN0aWxsIGRvbid0IG1hdGNoLiBUaGUgcmVwZXRpdGlvbiBpcyBib3VuZGVkIGF0IDggYW5kIGl0cwovLyBjaGFyYWN0ZXIgY2xhc3NlcyBhcmUgZGlzam9pbnQgZnJvbSB0aGUgc2VwYXJhdG9yLCBzbyB0aGVyZSBpcyBubyBiYWNrdHJhY2tpbmcKLy8gYmxvd3VwICgyN2stY2hhciBwYXRob2xvZ2ljYWwgaW5wdXQ6IDAgbXMpLgp2YXIgVEVTVF9SVU5ORVJfUkUgPSAvKD86XnxbXmEtel0pKD86bnBtfHlhcm58cG5wbXxidW58dHVyYm98bnh8bGVybmEpWyBcdF0rKD86W15cczsmfDw+KCkkYCNdK1sgXHRdKyl7MCw4fXRlc3QoPzpbOlxzXXwkKXwoPzpefFteYS16XSkoPzpucG18eWFybnxwbnBtfGJ1bilbIFx0XSsoPzpydW5bIFx0XSspP3QoPzpbOlxzXXwkKXxcYig/Om5weHxwbnB4KVxzKyg/OnZpdGVzdHxqZXN0fG1vY2hhfGF2YXx0YXB8amFzbWluZXxweXRlc3QpXGJ8KD86Xnw7fCYmfFx8XHwpXHMqKD86dml0ZXN0fGplc3R8cHl0ZXN0fG1vY2hhfGphc21pbmV8dGFwfGF2YSlcc3xcYig/OmNhcmdvfGdvfGRlbm98ZG90bmV0fG12bilccyt0ZXN0XGJ8XGJncmFkbGVcdypccyt0ZXN0XGIvaTsKLy8gIzEzMjIg4oCUIGZhaWx1cmUgbWFya2VycyBpbiBhIHRlc3QgcnVubmVyJ3Mgb3duIE9VVFBVVC4KLy8KLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgbm90IGFuIGV4aXQtY29kZSBjaGVjazogQ2xhdWRlIENvZGUncyBQb3N0VG9vbFVzZSBwYXlsb2FkCi8vIGNhcnJpZXMgbm8gZXhpdCBzdGF0dXMsIGFuZCBQb3N0VG9vbFVzZSBkb2VzIG5vdCBmaXJlIGF0IGFsbCB3aGVuIGEgY29tbWFuZAovLyBleGl0cyBub24temVybyDigJQgc28gYW4gdW5tYXNrZWQgcmVkIHN1aXRlIGFscmVhZHkgbGVhdmVzIHRlc3RzUnVuIGZhbHNlLCBieQovLyBhY2NpZGVudCBvZiB0aGUgaG9vayBsaWZlY3ljbGUgcmF0aGVyIHRoYW4gYnkgZGVzaWduLiBXaGF0IERPRVMgZGVmZWF0IHRoZQovLyBnYXRlIGlzIGEgbWFza2VkIGV4aXQgKGBucG0gdGVzdCB8IHRhaWwgLTIwYCwgYG5wbSB0ZXN0IHx8IHRydWVgLAovLyBgbnBtIHRlc3QgMj4mMSB8IGdyZXAgLWkgZmFpbGApOiB0aGUgcGlwZWxpbmUgZXhpdHMgMCwgUG9zdFRvb2xVc2UgZmlyZXMgd2l0aAovLyBhIGNsZWFuLWxvb2tpbmcgcmVzcG9uc2UsIGFuZCBhIHJlZCBzdWl0ZSBjcmVkaXRzIHRoZSBnYXRlLiBPdXRwdXQgaXMgdGhlIG9ubHkKLy8gc2lnbmFsIGxlZnQsIGFuZCBpdCBpcyBnZW51aW5lbHkgd2Vha2VyIHRoYW4gYSBzdGF0dXMg4oCUIHNlZSB0aGUgdGlja2V0LgovLwovLyBFdmVyeSBhcm0gbWF0Y2hlcyBhIFNVTU1BUlkgc2hhcGUgYSBydW5uZXIgZW1pdHMsIG5ldmVyIGEgYmFyZSAiZmFpbCIsIHdoaWNoCi8vIG9jY3VycyBjb25zdGFudGx5IGluIG9yZGluYXJ5IHBhc3NpbmcgdGVzdCBuYW1lcyAoInJldHVybnMgbnVsbCB3aGVuIHRoZQovLyBsb29rdXAgZmFpbGVkIikuIFRoZSBjb3VudCBhcm0gZXhjbHVkZXMgYW4gZXhwbGljaXQgemVybyBzbyBqZXN0J3MKLy8gYDAgZmFpbGVkLCAxMiBwYXNzZWRgIGNhbm5vdCBzZWxmLWJsb2NrLgovLwovLyBUaGUgY291bnQgYXJtJ3MgdHJhaWxpbmcgbG9va2FoZWFkIGlzIHdoYXQga2VlcHMgYSBHUkVFTiBydW4gZnJvbSBibG9ja2luZwovLyBpdHNlbGYuIE1vY2hhJ3MgZGVmYXVsdCBzcGVjIHJlcG9ydGVyIHByaW50cyBldmVyeSBwYXNzaW5nIHRlc3QgbmFtZSwgc28KLy8gYG5wbSB0ZXN0IHwgdGFpbCAtMjBgIG9uIGEgZ3JlZW4gc3VpdGUgbGVnaXRpbWF0ZWx5IGNvbnRhaW5zIGxpbmVzIGxpa2UKLy8gYOKckyBoYW5kbGVzIDIgZmFpbGVkIHJldHJpZXNgLiBBIHJlYWwgc3VtbWFyeSBpcyBmb2xsb3dlZCBieSBhIGRlbGltaXRlciBvciBhCi8vIGxpbmUgZW5kIChgMyBmYWlsZWQgfCA0MCBwYXNzZWRgLCBgMSBmYWlsZWQsIDIgcGFzc2VkYCwgYDEgZmFpbGluZ2ApLCBuZXZlciBieQovLyBtb3JlIHByb3NlIOKAlCBzbyBhIGxvd2VyY2FzZSB3b3JkIGFmdGVyIHRoZSBjb3VudCBtZWFucyBpdCBpcyBhIHNlbnRlbmNlLCBub3QgYQovLyB0YWxseS4gYHRlc3RzYC9gdGVzdGAgaXMgZXhlbXB0ZWQgYmVjYXVzZSBgMiBmYWlsZWQgdGVzdHNgIGlzIGEgcmVhbCBzdW1tYXJ5LgovLyBTYW1lLWxpbmUgd2hpdGVzcGFjZSBvbmx5OiBhdCBhIGxpbmUgZW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcXVhbGlmeS4KdmFyIFRFU1RfRkFJTFVSRV9SRSA9IG5ldyBSZWdFeHAoWwogICdcXGIoPyEwXFxiKVxcZCtcXHMrKD86dGVzdHM/XFxzKyk/KD86ZmFpbGVkfGZhaWxpbmd8ZmFpbHVyZXM/KVxcYig/IVteXFxTXFxuXSsoPyF0ZXN0cz9cXGIpW2Etel0pJywgLy8gdml0ZXN0L2plc3QvcHl0ZXN0L21vY2hhIGNvdW50cwogICdeXFxzKig/OkZBSUx8RkFJTEVEKVxcYicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdml0ZXN0ICsgamVzdCBwZXItZmlsZSwgcHl0ZXN0IEZBSUxFRAogICdeXFxzKi0tLVxccypGQUlMOicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gdGVzdAogICdcXGJ0ZXN0IHJlc3VsdDpcXHMqRkFJTEVEXFxiJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FyZ28KICAnXm5wbSBFUlIhJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5wbSB3cmFwcGVyIGFyb3VuZCBhbnkgb2YgdGhlIGFib3ZlCl0uam9pbignfCcpLCAnaW0nKTsKCi8qKgogKiAjMTMyMiDigJQgd2h5IGEganVzdC1maXJlZCByZWNvcmQtdGVzdC1ydW4gbXVzdCBOT1QgYmUgY3JlZGl0ZWQsIG9yIG51bGwuCiAqCiAqIEFic2VudCBvdXRwdXQgaXMgbm90IGV2aWRlbmNlIG9mIGZhaWx1cmU6IGEgcXVpZXQgZ3JlZW4gYG5wbSB0ZXN0ID4gL2Rldi9udWxsYAogKiBhbmQgYSBzaWxlbnRseS1tYXNrZWQgcmVkIG9uZSBhcmUgaW5kaXN0aW5ndWlzaGFibGUsIGFuZCB0cmVhdGluZyB0aGUgcGFpciBhcwogKiBmYWlsdXJlcyB3b3VsZCBibG9jayBldmVyeSBjb25zdW1lciB3aG8gcmVkaXJlY3RzIHRlc3Qgb3V0cHV0LiBBYnNlbnQgbWVhbnMKICogdW5rbm93biwgYW5kIHVua25vd24ga2VlcHMgdGhlIHByZS0jMTMyMiBiZWhhdmlvdXIuCiAqLwpmdW5jdGlvbiBkZXRlY3RUZXN0RmFpbHVyZSgpIHsKICBpZiAocHJvY2Vzcy5lbnYuVE9PTF9SRVNQT05TRV9pbnRlcnJ1cHRlZCA9PT0gJ3RydWUnKSByZXR1cm4gJ3RoZSBydW4gd2FzIGludGVycnVwdGVkJzsKICB2YXIgb3V0ID0gKHByb2Nlc3MuZW52LlRPT0xfUkVTUE9OU0Vfc3Rkb3V0IHx8ICcnKSArICdcbicgKyAocHJvY2Vzcy5lbnYuVE9PTF9SRVNQT05TRV9zdGRlcnIgfHwgJycpOwogIGlmICghb3V0LnRyaW0oKSkgcmV0dXJuIG51bGw7CiAgdmFyIGhpdCA9IG91dC5tYXRjaChURVNUX0ZBSUxVUkVfUkUpOwogIHJldHVybiBoaXQgPyAnb3V0cHV0IHJlcG9ydHMgIicgKyBoaXRbMF0udHJpbSgpLnNsaWNlKDAsIDQwKSArICciJyA6IG51bGw7Cn0KLy8gRWRpdHMgdG8gdGhlc2UgZG9uJ3QgY2hhbmdlIHJ1bnRpbWUgYmVoYXZpb3VyLCBzbyB0aGV5IGRvbid0IGludmFsaWRhdGUgcHJpb3IgdGVzdC9zaW1wbGlmeSBydW5zLgovLyBMb2NrIGZpbGVzIGFuZCAuZ2l0aWdub3JlIGFyZSB0cmFja2VkIGJ1dCBpbmVydDsgcGFja2FnZS5qc29uLyoueWFtbCBBUkUgc291cmNlIOKAlCB0aGV5IHJlc2V0Lgp2YXIgRURJVF9SRVNFVF9TS0lQX0JPVEhfUkUgPSAvXC4obWR8bWFya2Rvd258dHh0fHJzdHxhZG9jfGxvY2t8Z2l0aWdub3JlKSR8KD86XnxbXFxcL10pKENIQU5HRUxPRyg/OlwubWQpP3xcLmVudlwuZXhhbXBsZXxwYWNrYWdlLWxvY2tcLmpzb258cG5wbS1sb2NrXC55YW1sfHlhcm5cLmxvY2t8YnVuXC5sb2NrYikkL2k7Ci8vICMxMTc2IOKAlCBwYXRoLWJhc2VkIGluZXJ0IG1hcmtlcnMuIFRoZSBleHRlbnNpb24tYmFzZWQgUkUgYWJvdmUgY2FuJ3QgY292ZXIKLy8gYC5naXRodWIvd29ya2Zsb3dzLyoueW1sYCB3aXRob3V0IGFsc28gZXhlbXB0aW5nIGBtb2Zsby55YW1sYCAvIGB0c2NvbmZpZy55YW1sYAovLyAod2hpY2ggQVJFIHNvdXJjZSkuIEFuY2hvciBvbiB0aGUgR2l0SHViLW1ldGEgZGlyZWN0b3JpZXMgdGhhdCBob2xkIENJIGNvbmZpZwovLyBhbmQgdGVtcGxhdGUgc2NhZmZvbGRzIOKAlCBlZGl0aW5nIHRob3NlIGRvZXNuJ3QgZXhwb3NlIG5ldyBydW50aW1lIHN1cmZhY2UsIHNvCi8vIHRoZXkgc2hvdWxkbid0IHJlc2V0IHRlc3RzUnVuL3NpbXBsaWZ5UnVuIHRoZSB3YXkgYSByZWFsIHNvdXJjZSBlZGl0IGRvZXMuCi8vIFRyYWlsaW5nIHRlcm1pbmF0b3IgaW5jbHVkZXMgYC5gIHNvIHRoZSBzaW5nbGUtZmlsZSB0ZW1wbGF0ZSBmb3JtCi8vIGAuZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZGAgbWF0Y2hlcyBhbG9uZ3NpZGUgdGhlIGRpcmVjdG9yeSBmb3JtLgovLyAjMTM0OCDigJQgYC5tb2Zsby9gIGpvaW5zIHRoZW0uIEl0IGlzIG1vZmxvJ3Mgb3duIGdpdGlnbm9yZWQgc3RhdGUgZGlyZWN0b3J5Ci8vIChkYWVtb24gbG9ja3MsIG1lbW9yeSBkYiwgU0REIHNwZWMvcGxhbiBhcnRpZmFjdHMpLCBzbyBub3RoaW5nIHdyaXR0ZW4gdGhlcmUKLy8gY2FuIGFwcGVhciBpbiB0aGUgYnJhbmNoIGRpZmYsIGFuZCBhIHNwZWMgZWRpdCBpbnZhbGlkYXRpbmcgdGhlIHRlc3QgcnVuIGlzCi8vIHB1cmUgbm9pc2UuIFNjb3BlZCB0byB0aGUgcmVzZXQgb25seSDigJQgZGVsaWJlcmF0ZWx5IE5PVCBhZGRlZCB0byBFWEVNUFQsCi8vIHdoaWNoIHdvdWxkIGFsc28gdW4tZ2F0ZSByZWFkcyBvZiBgLm1vZmxvL3NwZWNzLyoqYCwgYW5kIHRob3NlIGFyZSBpbmRleGVkCi8vIGd1aWRhbmNlIHRoYXQgbWVtb3J5LWZpcnN0IHNob3VsZCBzdGlsbCByb3V0ZSB0aHJvdWdoIGEgc2VhcmNoLgovLyAjMTM5NSDigJQgYC5jbGF1ZGUvYCBDT05GSUcgam9pbnMgdGhlbSwgYnkgdGhlIHNhbWUgImRvZXNuJ3QgZXhwb3NlIG5ldyBydW50aW1lCi8vIHN1cmZhY2UiIHJlYXNvbmluZzogaG9vayB3aXJpbmcsIHNraWxscyBhbmQgZ3VpZGFuY2UgYXJlIG5vdCB0aGUgY29kZSB1bmRlcgovLyB2ZXJpZmljYXRpb24uIFRoaXMgaXMgdGhlIHN0cm9uZ2VyIGNhc2UsIGluIGZhY3Qg4oCUIGl0IGlzIHRoZSBkaXJlY3RvcnkgYSB1c2VyCi8vIGVkaXRzICpiZWNhdXNlIGEgZ2F0ZSB0b2xkIHRoZW0gdG8qLiBCZWZvcmUgdGhpcywgZml4aW5nIGhvb2sgd2lyaW5nIG9uIGEKLy8gZ2F0ZSdzIG93biBpbnN0cnVjdGlvbiByZXNldCB2ZXJpZnlSdW4gYW5kIGludmFsaWRhdGVkIHRoZSB2ZXJpZmljYXRpb24gdGhlCi8vIGZpeCBleGlzdGVkIHRvIGxldCB0aHJvdWdoLCBzbyB0aGUgcmVjb3Zlcnkgd2FzOiBmaXggd2lyaW5nIOKGkiB2ZXJpZmljYXRpb24KLy8gaW52YWxpZGF0ZWQg4oaSIHJlc3RhcnQgc2Vzc2lvbiDihpIgcmUtcnVuIC92ZXJpZnkg4oaSIHJldHJ5ICgjMTM5MiBmaWVsZCByZXBvcnQpLgovLwovLyBTY29wZWQgdG8gY29uZmlnLCBOT1QgYWxsIG9mIGAuY2xhdWRlLyoqYDogYHNjcmlwdHMvYCBhbmQgYGhlbHBlcnMvYCBob2xkCi8vIGV4ZWN1dGFibGUgcnVudGltZSBzdXJmYWNlIChnYXRlLmNqcyBpdHNlbGYgbGl2ZXMgdGhlcmUpLCBhbmQgZWRpdGluZwovLyBleGVjdXRhYmxlIGNvZGUgU0hPVUxEIHN0aWxsIGludmFsaWRhdGUgYSB2ZXJpZmljYXRpb24uIExpc3RpbmcgdGhlIGNvbmZpZwovLyBzdWJkaXJlY3RvcmllcyBleHBsaWNpdGx5IGtlZXBzIHRoYXQgaW52YXJpYW50IGludGFjdC4KLy8KLy8gQm90aCBzZXBhcmF0b3JzIGluIGV2ZXJ5IGFsdGVybmF0aXZlIOKAlCBhIGJhcmUgYC9gIGhlcmUgd291bGQgc2lsZW50bHkgbm8tb3AKLy8gb24gV2luZG93cywgd2hlcmUgVE9PTF9JTlBVVCBwYXRocyBhcnJpdmUgYmFja3NsYXNoZWQgKFJ1bGUgIzEpLgp2YXIgRURJVF9SRVNFVF9TS0lQX1BBVEhfUkUgPSAvKD86XnxbXFxcL10pXC5naXRodWJbXFxcL10oPzp3b3JrZmxvd3N8SVNTVUVfVEVNUExBVEV8UFVMTF9SRVFVRVNUX1RFTVBMQVRFKSg/OltcXFwvLl18JCl8KD86XnxbXFxcL10pXC5tb2Zsb1tcXFwvXXwoPzpefFtcXFwvXSlcLmNsYXVkZVtcXFwvXSg/OnNldHRpbmdzKD86XC5sb2NhbCk/XC5qc29uJHxza2lsbHNbXFxcL118Z3VpZGFuY2VbXFxcL118YWdlbnRzW1xcXC9dKS9pOwovLyBUZXN0IGZpbGVzOiBpbnZhbGlkYXRlIHRoZSB0ZXN0aW5nIGdhdGUgKHRlc3RzIGFyZSBzdGFsZSBvbmNlIHRlc3QgY29kZSBjaGFuZ2VzKQovLyBidXQgTk9UIHRoZSBzaW1wbGlmeSBnYXRlIOKAlCAvc2ltcGxpZnkgYWxyZWFkeSByZXZpZXdlZCB0aGUgcHJvZHVjdGlvbiBjb2RlOyB0b3VjaGluZwovLyBhIHRlc3QgZmlsZSBvciBmaXh0dXJlIGRvZXNuJ3QgZXhwb3NlIG5ldyB1bnRlc3RlZCBzdXJmYWNlIGZvciBjb2RlIHJldmlldyAoIzkwOCkuCnZhciBFRElUX1JFU0VUX1NLSVBfU0lNUExJRllfT05MWV9SRSA9IC8oPzpefFtcXFwvXSkoX190ZXN0c19ffF9fbW9ja3NfX3x0ZXN0cz98c3BlY3xzcGVjc3xjeXByZXNzfGUyZXxmaXh0dXJlcz8pW1xcXC9dfFwuKHRlc3R8c3BlYylcLlttY10/W2p0XXN4PyR8XC5maXh0dXJlXC5bbWNdP1tqdF1zeD8kL2k7Ci8vICMxMTc2IOKAlCBzb3VyY2UtZmlsZSBleHRlbnNpb25zIHVzZWQgYnkgdGhlIG5vLXNvdXJjZS1maWxlcyBQUiBleGVtcHRpb24uCi8vIFdoZW4gdGhlIGN1bXVsYXRpdmUgYnJhbmNoIGRpZmYgaGFzIHplcm8gZmlsZXMgbWF0Y2hpbmcgdGhpcyBSRSAoaS5lLiBvbmx5Ci8vIFlBTUwvTUQvSlNPTi9sb2NrZmlsZXMvaW1hZ2VzL3RlbXBsYXRlcyksIHRoZSB0ZXN0aW5nL3NpbXBsaWZ5L2xlYXJuaW5ncwovLyBnYXRlcyBhdXRvLXBhc3MgYXQgYGNoZWNrLWJlZm9yZS1wcmAuIExpc3RzIGV2ZXJ5IGxhbmd1YWdlIG1vZmxvIHNoaXBzCi8vIGFnYWluc3Qg4oCUIGFkZGl0aW9ucyBoZXJlIHNob3VsZCBtYXRjaCBURVNUX1JVTk5FUl9SRSdzIGxhbmd1YWdlIGNvdmVyYWdlLgp2YXIgU09VUkNFX0ZJTEVfUkUgPSAvXC4odHN8dHN4fGpzfGpzeHxtanN8Y2pzfHB5fGdvfHJzfHJifGphdmF8a3R8c3dpZnR8Y3xjY3xjcHB8aHxocHB8c2h8YmFzaHxwczEpJC9pOwovLyBEb2NzLW9ubHkgUFIgZXhlbXB0aW9uOiB0ZXh0L21hcmt1cC9pbWFnZSBleHRlbnNpb25zIHRoYXQgY2Fubm90IGNoYW5nZSBydW50aW1lIGJlaGF2aW91ci4KLy8gUmV0YWluZWQgZm9yIHRoZSB0cmFuc3BhcmVuY3kgbWVzc2FnZSB3aGVuIHRoZSBkaWZmIGlzICpwdXJlbHkqIGRvY3MgKG5vIFlBTUwvSlNPTiBlaXRoZXIpCi8vIOKAlCBnaXZlcyBhIG1vcmUgc3BlY2lmaWMgcmVhc29uIHRoYW4gIm5vIHNvdXJjZSBmaWxlcyIgaW4gdGhhdCBzdWJzZXQuCnZhciBET0NTX09OTFlfUkUgPSAvXC4obWR8bWFya2Rvd258dHh0fHJzdHxhZG9jfGh0bWw/fHBkZnxwbmd8anBlP2d8Z2lmfHN2Z3x3ZWJwfGljb3xibXApJC9pOwoKLy8g4pSA4pSAIENvbnRlbnQtYWRkcmVzc2VkIGdhdGUgY3JlZGl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBBIGJvb2xlYW4gYHRlc3RzUnVuYC9gc2ltcGxpZnlSdW5gL2B2ZXJpZnlSdW5gIGFuc3dlcnMgIndhcyBhbiBlZGl0Ci8vIG9ic2VydmVkPyIg4oCUIHdoaWNoIGlzIG9ubHkgZXF1aXZhbGVudCB0byAiZG9lcyB0aGlzIGNyZWRpdCBzdGlsbCBkZXNjcmliZSB0aGUKLy8gY29kZT8iIGlmIGV2ZXJ5IG11dGF0aW9uIGZsb3dzIHRocm91Z2ggV3JpdGUvRWRpdC9NdWx0aUVkaXQuIEl0IGRvZXMgbm90LgovLyBgbm9kZSAtZWAgd2l0aCBmcy53cml0ZUZpbGVTeW5jLCBgc2VkIC1pYCwgc2hlbGwgcmVkaXJlY3Rpb24sIGBjcGAsIGFuZCBldmVyeQovLyBnaXQgb3BlcmF0aW9uIHRoYXQgbW92ZXMgdGhlIHRyZWUgKGNoZWNrb3V0LCBwdWxsLCBtZXJnZSwgcmViYXNlLCBhcHBseSkKLy8gY2hhbmdlIHNvdXJjZSB3aXRob3V0IGZpcmluZyBQb3N0VG9vbFVzZSBvbiB0aG9zZSB0b29scywgc28gcmVzZXQtZWRpdC1nYXRlcwovLyBuZXZlciBydW5zIGFuZCBjcmVkaXQgZWFybmVkIGJlZm9yZWhhbmQgc3Vydml2ZXMgdGhlIGNoYW5nZS4gRGVtb25zdHJhdGVkIGJ5Ci8vIGVhcm5pbmcgZnVsbCBjcmVkaXQsIGFwcGVuZGluZyBhbiBleGVjU3luYyBjYWxsIHRvIGEgc291cmNlIGZpbGUgdmlhIEJhc2gsCi8vIGFuZCB3YXRjaGluZyBjaGVjay1iZWZvcmUtcHIgYWxsb3cgdGhlIFBSLiBNdWx0aS1pc3N1ZSBzZXNzaW9ucyBoYXZlIHRoZSBzYW1lCi8vIHNoYXBlOiBub3RoaW5nIGlzIHBlci1wcm9tcHQsIHNvIGlzc3VlIEIgaW5oZXJpdHMgaXNzdWUgQSdzIGNyZWRpdC4KLy8KLy8gRXZlcnkgb25lIG9mICM5MDggLyAjMTE3NiAvICMxMzIyIC8gIzEzMzIgLyAjMTM0OCByZWZpbmVkIFdISUNIIHRvb2wgY2FsbCB0bwovLyB3YXRjaC4gTm9uZSBvZiB0aGVtIGNvdWxkIGNsb3NlIHRoaXMsIGJlY2F1c2UgdGhlIG9ic2VydmVyIGlzIHRoZSB3cm9uZwovLyBwcmltaXRpdmUuIFNvIHN0b3Agb2JzZXJ2aW5nIG11dGF0aW9ucyBhbmQgZmluZ2VycHJpbnQgdGhlIGNvZGUgaXRzZWxmOiBIRUFECi8vIHBsdXMgdGhlIGNvbnRlbnQgb2YgZXZlcnkgY2hhbmdlZCBhbmQgdW50cmFja2VkIGZpbGUuIFJlY29tcHV0ZSBhdCBjaGVjawovLyB0aW1lOyBhbnkgbWlzbWF0Y2ggbWVhbnMgdGhlIGNyZWRpdCBkZXNjcmliZXMgZGlmZmVyZW50IGNvZGUgYW5kIGlzIHN0YWxlLiBObwovLyB0b29sIGNhbiBieXBhc3MgaXQsIGJlY2F1c2UgaXQgd2F0Y2hlcyBubyB0b29scy4KLy8KLy8gU2NvcGUgbWlycm9ycyB0aGUgcmVzZXQgcHJlZGljYXRlcyBzbyB0aGVpciBpbnRlbnRpb25hbCBleGVtcHRpb25zIHN1cnZpdmUuCi8vIEluZXJ0IGZpbGVzICgjMTE3NikgYW5kIGAuZ2l0aHViL2AgKyBgLm1vZmxvL2AgcGF0aHMgbmV2ZXIgY29udHJpYnV0ZSwgc28gYQovLyBtYXJrZG93biBvciBzcGVjIGVkaXQgc3RpbGwgbGVhdmVzIGEgdGVzdCBydW4gc3RhbmRpbmcuICdub250ZXN0JyBhbHNvIGRyb3BzCi8vIHRlc3QgZmlsZXMsIHByZXNlcnZpbmcgIzkwODogdG91Y2hpbmcgYSB0ZXN0IGRvZXMgbm90IGludmFsaWRhdGUgL3NpbXBsaWZ5LgovLwovLyBpc0VwaGVtZXJhbFBhdGggaXMgZGVsaWJlcmF0ZWx5IE5PVCBhcHBsaWVkIOKAlCBpdCBleGlzdHMgZm9yIGFnZW50IHNjcmF0Y2hwYWRzCi8vIG91dHNpZGUgdGhlIHByb2plY3QsIGFuZCBgZ2l0IHN0YXR1c2AgY2Fubm90IHJlcG9ydCB0aG9zZS4KLy8gVGhlIGdhdGUncyBvd24gc3RhdGUgZmlsZSBtdXN0IG5ldmVyIGNvbnRyaWJ1dGU6IHJlY29yZGluZyBhIGNyZWRpdCB3cml0ZXMKLy8gaXQsIHdoaWNoIHdvdWxkIGNoYW5nZSB0aGUgdmVyeSBmaW5nZXJwcmludCB0aGUgY3JlZGl0IGlzIHBpbm5lZCB0byBhbmQgbWFrZQovLyBldmVyeSBjcmVkaXQgaW5zdGFudGx5IHN0YWxlLiBJdCBpcyBnaXRpZ25vcmVkIGluIG1vZmxvJ3MgcmVwbywgYnV0IGEKLy8gY29uc3VtZXIgcHJvamVjdCBuZWVkIG5vdCBpZ25vcmUgaXQsIGFuZCB0aGVyZSB0aGUgc2VsZi1yZWZlcmVuY2Ugd291bGQKLy8gZGVhZGxvY2sgdGhlaXIgZ2F0ZSBwZXJtYW5lbnRseSDigJQgc28gZXhjbHVkZSBpdCBieSBuYW1lIHJhdGhlciB0aGFuIHRydXN0aW5nCi8vIC5naXRpZ25vcmUuIFNjb3BlZCB0byB0aGlzIG9uZSBmaWxlOiBgLmNsYXVkZS9gIGFsc28gaG9sZHMgcmVhbCBzb3VyY2UKLy8gKGhlbHBlcnMvLCBzY3JpcHRzLykgdGhhdCBtdXN0IGtlZXAgY291bnRpbmcuCnZhciBGSU5HRVJQUklOVF9TRUxGX1JFID0gLyg/Ol58W1xcXC9dKVwuY2xhdWRlW1xcXC9dd29ya2Zsb3ctc3RhdGVcLmpzb24kL2k7CgpmdW5jdGlvbiBmaW5nZXJwcmludEluY2x1ZGVzKHJlbCwgc2NvcGUpIHsKICBpZiAoRklOR0VSUFJJTlRfU0VMRl9SRS50ZXN0KHJlbCkpIHJldHVybiBmYWxzZTsKICBpZiAoRURJVF9SRVNFVF9TS0lQX0JPVEhfUkUudGVzdChyZWwpKSByZXR1cm4gZmFsc2U7CiAgaWYgKEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFLnRlc3QocmVsKSkgcmV0dXJuIGZhbHNlOwogIGlmIChzY29wZSA9PT0gJ25vbnRlc3QnICYmIEVESVRfUkVTRVRfU0tJUF9TSU1QTElGWV9PTkxZX1JFLnRlc3QocmVsKSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiB0cnVlOwp9CgovKioKICogUGF0aHMgcmVwb3J0ZWQgYnkgYGdpdCBzdGF0dXMgLS1wb3JjZWxhaW49djEgLXVhbGwgLXpgLCBhcwogKiBgeyBwYXRoLCBvcmlnIH1gIOKAlCBgb3JpZ2Agc2V0IG9ubHkgZm9yIHJlbmFtZXMgYW5kIGNvcGllcy4KICoKICogQSByZW5hbWUgZW1pdHMgYFIgIDxuZXc+XDA8b2xkPlwwYDogdHdvIE5VTC10ZXJtaW5hdGVkIHRva2VucyBmb3Igb25lIGVudHJ5LgogKiBUaGUgb3JpZ2luIHRva2VuIG11c3QgYmUgY29uc3VtZWQgb3IgaXQgaXMgbWlzcmVhZCBhcyB0aGUgbmV4dCBlbnRyeSdzIHN0YXR1cwogKiBieXRlcywgQU5EIGl0IG11c3QgYmUgcmVwb3J0ZWQsIGJlY2F1c2UgYSByZW5hbWUgbWVhbnMgdGhlIG9sZCBwYXRoIG5vIGxvbmdlcgogKiBleGlzdHMuIERyb3BwaW5nIGl0IG9uIHRoZSBmbG9vciBsZWF2ZXMgdGhlIG9sZCBwYXRoIGluIHRoZSBjb250ZW50IG1hcCDigJQgdGhlCiAqIGZpbmdlcnByaW50IHdvdWxkIHRoZW4gY2FycnkgYSBwaGFudG9tIGVudHJ5IHRoYXQgZGlzYXBwZWFycyB0aGUgbW9tZW50IHRoZQogKiByZW5hbWUgaXMgY29tbWl0dGVkLCBleHBpcmluZyBjcmVkaXQgb24gYSBjb21taXQgdGhhdCBjaGFuZ2VkIG5vIGNvbnRlbnQuCiAqIFRoYXQgaXMgdGhlIHNhbWUgZGVmZWN0IGNvbnRlbnQtYWRkcmVzc2luZyB3YXMgaW50cm9kdWNlZCB0byByZW1vdmUuCiAqLwpmdW5jdGlvbiBwYXJzZVBvcmNlbGFpbloocmF3KSB7CiAgdmFyIG91dCA9IFtdOwogIHZhciBwYXJ0cyA9IFN0cmluZyhyYXcpLnNwbGl0KCdcMCcpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBlbnRyeSA9IHBhcnRzW2ldOwogICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5sZW5ndGggPCA0KSBjb250aW51ZTsKICAgIC8vIENoZWNrIEJPVEggc3RhdHVzIGNvbHVtbnMsIG5vdCBqdXN0IHRoZSBzdGFnZWQgb25lOiBnaXQgcmVwb3J0cyBhIHJlbmFtZQogICAgLy8gYXMgYFIgYCB3aGVuIHN0YWdlZCBhbmQgY2FuIHJlcG9ydCBgIFJgIGZvciBvbmUgZGV0ZWN0ZWQgaW4gdGhlIHdvcmt0cmVlLgogICAgLy8gTWlzc2luZyB0aGUgc2Vjb25kIGZvcm0gd291bGQgbGVhdmUgdGhlIG9yaWdpbiB0b2tlbiB1bmNvbnN1bWVkLCBhbmQgaXQKICAgIC8vIHdvdWxkIHRoZW4gYmUgcmVhZCBhcyB0aGUgbmV4dCBlbnRyeSdzIHN0YXR1cyBieXRlcyDigJQgbWlzYWxpZ25pbmcgZXZlcnkKICAgIC8vIGVudHJ5IGFmdGVyIGl0LiBSIGFuZCBDIGFsd2F5cyBlbWl0IGFuIG9yaWdpbiB0b2tlbiwgc28gY29uc3VtaW5nIG9uZQogICAgLy8gd2hlbmV2ZXIgZWl0aGVyIGNvbHVtbiBzaG93cyB0aGVtIGNhbm5vdCBvdmVyLWNvbnN1bWUuCiAgICB2YXIgc3QgPSBlbnRyeS5zbGljZSgwLCAyKTsKICAgIHZhciByZWMgPSB7IHBhdGg6IGVudHJ5LnNsaWNlKDMpLCBvcmlnOiBudWxsIH07CiAgICBpZiAoc3QuaW5kZXhPZignUicpID49IDAgfHwgc3QuaW5kZXhPZignQycpID49IDApIHsgcmVjLm9yaWcgPSBwYXJ0c1tpICsgMV0gfHwgbnVsbDsgaSsrOyB9CiAgICBvdXQucHVzaChyZWMpOwogIH0KICByZXR1cm4gb3V0Owp9CgovKioKICogRmluZ2VycHJpbnQgb2YgdGhlIGNvZGUgYSBnYXRlIGNyZWRpdCBkZXNjcmliZXMsIG9yIG51bGwgd2hlbiBpdCBjYW5ub3QgYmUKICogY29tcHV0ZWQgKG5vIGdpdCwgbm8gcmVwbywgbm8gY29tbWl0cykuIE51bGwgaXMgdGhlIGZhaWwtb3BlbiBzaWduYWw6IGNhbGxlcnMKICogZmFsbCBiYWNrIHRvIHRoZSBmbGFnIGFsb25lLCBzbyBub24tZ2l0IHByb2plY3RzIGJlaGF2ZSBleGFjdGx5IGFzIGJlZm9yZS4KICovCi8vIE1lbW9pc2VkIHBlciBzY29wZS4gY2hlY2stYmVmb3JlLXByIHRlc3RzIHRocmVlIGNyZWRpdHMgYW5kIGNoZWNrLWJlZm9yZS1kb25lCi8vIGEgZm91cnRoLCBhbmQgZWFjaCBjb21wdXRhdGlvbiBzaGVsbHMgb3V0IHRvIGBnaXQgc3RhdHVzIC11YWxsYCBvdmVyIHRoZSB3aG9sZQovLyB0cmVlLiBUaGUgZ2F0ZSBwcm9jZXNzIGlzIHNob3J0LWxpdmVkIGFuZCBzaW5nbGUtc2hvdCDigJQgaXQgZXhpdHMgYmVmb3JlIGFueQovLyB0b29sIGl0IGdhdGVzIGNhbiBydW4g4oCUIHNvIG5vdGhpbmcgY2FuIGNoYW5nZSB1bmRlcm5lYXRoIHRoZSBjYWNoZS4KdmFyIEZJTkdFUlBSSU5UX0NBQ0hFID0ge307CgpmdW5jdGlvbiBjcmVkaXRGaW5nZXJwcmludChzY29wZSkgewogIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoRklOR0VSUFJJTlRfQ0FDSEUsIHNjb3BlKSkgcmV0dXJuIEZJTkdFUlBSSU5UX0NBQ0hFW3Njb3BlXTsKICB2YXIgdmFsdWUgPSBjb21wdXRlQ3JlZGl0RmluZ2VycHJpbnQoc2NvcGUpOwogIEZJTkdFUlBSSU5UX0NBQ0hFW3Njb3BlXSA9IHZhbHVlOwogIHJldHVybiB2YWx1ZTsKfQoKZnVuY3Rpb24gY29tcHV0ZUNyZWRpdEZpbmdlcnByaW50KHNjb3BlKSB7CiAgdmFyIGdpdCA9IGZ1bmN0aW9uIChhcmdzKSB7CiAgICByZXR1cm4gY3AuZXhlY0ZpbGVTeW5jKCdnaXQnLCBhcmdzLCB7CiAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiAxMDAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgIG1heEJ1ZmZlcjogNjQgKiAxMDI0ICogMTAyNCwgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sCiAgICB9KTsKICB9OwogIC8vIEZpbmdlcnByaW50IHRoZSBDT05URU5UIG9mIHRoZSB3b3JraW5nIHRyZWUsIG5ldmVyIChIRUFEICsgZGVsdGEpLiBUaG9zZQogIC8vIGFyZSBub3QgdGhlIHNhbWUgdGhpbmc6IGBnaXQgY29tbWl0YCBtb3ZlcyBjaGFuZ2VzIGZyb20gdGhlIHdvcmtpbmcgdHJlZQogIC8vIGludG8gSEVBRCB3aXRob3V0IGFsdGVyaW5nIGEgc2luZ2xlIGJ5dGUgb2YgY29kZSwgYW5kIGEgSEVBRC1iYXNlZAogIC8vIGZpbmdlcnByaW50IHdvdWxkIGV4cGlyZSBldmVyeSBjcmVkaXQgb24gY29tbWl0IOKAlCBmb3JjaW5nIGEgcG9pbnRsZXNzCiAgLy8gcmUtcnVuIG9mIHRoZSB0ZXN0cyB0aGF0IGp1c3QgcGFzc2VkIG9uIGV4YWN0bHkgdGhpcyBjb2RlLiBDb250ZW50LQogIC8vIGFkZHJlc3NpbmcgYWxzbyBtYWtlcyB0aGUgZmluZ2VycHJpbnQgc3RhYmxlIGFjcm9zcyBhbWVuZCwgc3Rhc2gvcG9wLCBhbmQKICAvLyBhbnkgYnJhbmNoIHN3aXRjaCB0aGF0IGxhbmRzIG9uIGlkZW50aWNhbCBjb250ZW50LCB3aGlsZSBzdGlsbCBtb3ZpbmcgdGhlCiAgLy8gbW9tZW50IHJlYWwgY29udGVudCBkaWZmZXJzLgogIC8vCiAgLy8gVW5jaGFuZ2VkIGZpbGVzIGNvbnRyaWJ1dGUgZ2l0J3Mgb3duIGJsb2IgaGFzaGVzIChmcmVlLCBhbHJlYWR5IGNvbXB1dGVkKTsKICAvLyBvbmx5IGZpbGVzIGdpdCByZXBvcnRzIGFzIGNoYW5nZWQgb3IgdW50cmFja2VkIGFyZSBoYXNoZWQgaGVyZS4KICB2YXIgdHJhY2tlZDsKICB0cnkgewogICAgdHJhY2tlZCA9IGdpdChbJ2xzLXRyZWUnLCAnLXInLCAnLXonLCAnSEVBRCddKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9IC8vIG5vIGdpdCwgbm8gcmVwbywgb3Igbm8gY29tbWl0IHlldAogIHZhciBieVBhdGggPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZhciBlbnRyaWVzID0gU3RyaW5nKHRyYWNrZWQpLnNwbGl0KCdcMCcpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewogICAgLy8gIjxtb2RlPiA8dHlwZT4gPG9iamVjdD5cdDxwYXRoPiIKICAgIHZhciB0YWIgPSBlbnRyaWVzW2ldLmluZGV4T2YoJ1x0Jyk7CiAgICBpZiAodGFiIDwgMCkgY29udGludWU7CiAgICB2YXIgbWV0YSA9IGVudHJpZXNbaV0uc2xpY2UoMCwgdGFiKS5zcGxpdCgnICcpOwogICAgYnlQYXRoW2VudHJpZXNbaV0uc2xpY2UodGFiICsgMSldID0gbWV0YVsyXTsKICB9CiAgdHJ5IHsKICAgIHZhciBjaGFuZ2VkID0gcGFyc2VQb3JjZWxhaW5aKGdpdChbJ3N0YXR1cycsICctLXBvcmNlbGFpbj12MScsICctdWFsbCcsICcteiddKSk7CiAgICB2YXIgbGl2ZSA9IFtdOwogICAgZm9yICh2YXIgaiA9IDA7IGogPCBjaGFuZ2VkLmxlbmd0aDsgaisrKSB7CiAgICAgIHZhciByZWwgPSBjaGFuZ2VkW2pdLnBhdGg7CiAgICAgIC8vIEEgcmVuYW1lJ3Mgb3JpZ2luIHBhdGggaXMgZ29uZSBmcm9tIHRoZSBjb250ZW50IOKAlCBkcm9wIGl0LCBvciBpdAogICAgICAvLyBsaW5nZXJzIHVudGlsIHRoZSByZW5hbWUgaXMgY29tbWl0dGVkIGFuZCB0aGVuIHZhbmlzaGVzLCBtb3ZpbmcgdGhlCiAgICAgIC8vIGZpbmdlcnByaW50IG9uIGEgY29tbWl0IHRoYXQgY2hhbmdlZCBub3RoaW5nLgogICAgICBpZiAoY2hhbmdlZFtqXS5vcmlnKSBkZWxldGUgYnlQYXRoW2NoYW5nZWRbal0ub3JpZ107CiAgICAgIHZhciBhYnMgPSBwYXRoLnJlc29sdmUoUFJPSkVDVF9ESVIsIHJlbCk7CiAgICAgIHZhciBpc0ZpbGUgPSBmYWxzZTsKICAgICAgdHJ5IHsgaXNGaWxlID0gZnMuc3RhdFN5bmMoYWJzKS5pc0ZpbGUoKTsgfSBjYXRjaCAoZSkgeyBpc0ZpbGUgPSBmYWxzZTsgfQogICAgICAvLyBBIHBhdGggZ2l0IHJlcG9ydHMgYnV0IHRoYXQgaXMgZ29uZSAob3IgaXMgbm90IGEgcmVndWxhciBmaWxlKSBpcwogICAgICAvLyBhYnNlbnQgZnJvbSB0aGUgY29udGVudCwgc28gaXQgbXVzdCBsZWF2ZSB0aGUgbWFwIGVudGlyZWx5LgogICAgICBpZiAoIWlzRmlsZSkgeyBkZWxldGUgYnlQYXRoW3JlbF07IGNvbnRpbnVlOyB9CiAgICAgIGlmIChyZWwuaW5kZXhPZignXG4nKSA+PSAwKSB7IGRlbGV0ZSBieVBhdGhbcmVsXTsgY29udGludWU7IH0gLy8gdW5oYXNoYWJsZSB2aWEgLS1zdGRpbi1wYXRocwogICAgICBsaXZlLnB1c2gocmVsKTsKICAgIH0KICAgIGlmIChsaXZlLmxlbmd0aCkgewogICAgICAvLyBgZ2l0IGhhc2gtb2JqZWN0YCDigJQgTk9UIGEgcmF3IHNoYTEgb2YgdGhlIGJ5dGVzLiBBIGdpdCBibG9iIGlkIGhhc2hlcwogICAgICAvLyAiYmxvYiA8c2l6ZT5cMCIgcGx1cyB0aGUgY29udGVudCwgYW5kIGFwcGxpZXMgdGhlIHNhbWUgY2xlYW4gZmlsdGVycwogICAgICAvLyBhbmQgY29yZS5hdXRvY3JsZiBub3JtYWxpc2F0aW9uIGdpdCB3b3VsZCBhcHBseSBvbiBjaGVja2luLiBIYXNoaW5nIHRoZQogICAgICAvLyByYXcgYnl0ZXMgaGVyZSBpbnN0ZWFkIHdvdWxkIHByb2R1Y2UgYSBkaWZmZXJlbnQgc3RyaW5nIHRoYW4gbHMtdHJlZQogICAgICAvLyByZXBvcnRzIGZvciBpZGVudGljYWwgY29udGVudCwgc28gYSBmaWxlIHdvdWxkIGFwcGVhciB0byAiY2hhbmdlIiB0aGUKICAgICAgLy8gbW9tZW50IGl0IHdhcyBjb21taXR0ZWQg4oCUIGFuZCBvbiBXaW5kb3dzLCB3aGVuZXZlciBhdXRvY3JsZiByZXdyb3RlIGl0cwogICAgICAvLyBsaW5lIGVuZGluZ3MuIE9uZSBiYXRjaGVkIGNhbGwgY292ZXJzIGV2ZXJ5IGNoYW5nZWQgcGF0aC4KICAgICAgdmFyIGhhc2hlZCA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydoYXNoLW9iamVjdCcsICctLXN0ZGluLXBhdGhzJ10sIHsKICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMTAwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICAgIG1heEJ1ZmZlcjogNjQgKiAxMDI0ICogMTAyNCwgaW5wdXQ6IGxpdmUuam9pbignXG4nKSArICdcbicsCiAgICAgICAgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ2lnbm9yZSddLAogICAgICB9KS50cmltKCkuc3BsaXQoJ1xuJyk7CiAgICAgIGZvciAodmFyIG0gPSAwOyBtIDwgbGl2ZS5sZW5ndGg7IG0rKykgewogICAgICAgIGlmIChoYXNoZWRbbV0pIGJ5UGF0aFtsaXZlW21dXSA9IGhhc2hlZFttXS50cmltKCk7CiAgICAgIH0KICAgIH0KICB9IGNhdGNoIChlKSB7CiAgICAvLyBzdGF0dXMgZmFpbGVkIOKAlCBmYWxsIGJhY2sgdG8gdGhlIGNvbW1pdHRlZCB0cmVlIGFsb25lIHJhdGhlciB0aGFuIG51bGwsCiAgICAvLyBzbyB0aGUgZmluZ2VycHJpbnQgc3RpbGwgdHJhY2tzIGNvbW1pdHRlZCBjb250ZW50LgogIH0KICB2YXIgcGF0aHMgPSBPYmplY3Qua2V5cyhieVBhdGgpLmZpbHRlcihmdW5jdGlvbiAocCkgeyByZXR1cm4gZmluZ2VycHJpbnRJbmNsdWRlcyhwLCBzY29wZSk7IH0pOwogIHBhdGhzLnNvcnQoKTsKICB2YXIgaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJyk7CiAgZm9yICh2YXIgayA9IDA7IGsgPCBwYXRocy5sZW5ndGg7IGsrKykgaC51cGRhdGUocGF0aHNba10gKyAnOicgKyBieVBhdGhbcGF0aHNba11dICsgJ1xuJyk7CiAgcmV0dXJuIGguZGlnZXN0KCdoZXgnKTsKfQoKLyoqCiAqIElzIGEgY3JlZGl0IHN0aWxsIGxpdmU/IGBmbGFnYCBpcyB0aGUgbGVnYWN5IGJvb2xlYW4sIGBzdG9yZWRgIHRoZSBmaW5nZXJwcmludAogKiBjYXB0dXJlZCB3aGVuIGl0IHdhcyBlYXJuZWQuCiAqCiAqIEZhaWwtb3BlbiBvbiBhbiB1bmNvbXB1dGFibGUgZmluZ2VycHJpbnQgKG5vbi1naXQgcHJvamVjdCkg4oCUIHRoZSBnYXRlIGtlZXBzCiAqIGl0cyBwcmV2aW91cyBzZW1hbnRpY3MgdGhlcmUgcmF0aGVyIHRoYW4gYmxvY2tpbmcgd29yayBpdCBjYW5ub3QgcmVhc29uIGFib3V0LgogKiBGYWlsLUNMT1NFRCBvbiBhIG1pc3Npbmcgc3RvcmVkIGZpbmdlcnByaW50OiB0aGF0IGlzIGNyZWRpdCBlYXJuZWQgYnkgYQogKiBwcmUtdXBncmFkZSBnYXRlLCBhbmQgaXQgY2FycmllcyBubyBldmlkZW5jZSBhYm91dCB3aGljaCBjb2RlIGl0IGNvdmVyZWQuIFRoZQogKiBjb3N0IGlzIHJlLXJ1bm5pbmcgb25jZSBvbiB0aGUgZmlyc3QgUFIgYWZ0ZXIgdXBncmFkZSwgd2hpY2ggc2VsZi1oZWFscy4KICovCmZ1bmN0aW9uIGNyZWRpdElzTGl2ZShmbGFnLCBzdG9yZWQsIHNjb3BlKSB7CiAgaWYgKCFmbGFnKSByZXR1cm4gZmFsc2U7CiAgdmFyIG5vdyA9IGNyZWRpdEZpbmdlcnByaW50KHNjb3BlKTsKICBpZiAobm93ID09PSBudWxsKSByZXR1cm4gdHJ1ZTsKICBpZiAoIXN0b3JlZCkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBzdG9yZWQgPT09IG5vdzsKfQoKLy8gIzE0MTAg4oCUIGlzIHRoaXMgQmFzaCBjb21tYW5kIGFjdHVhbGx5IGEgYGdoIHByIGNyZWF0ZWAgaW52b2NhdGlvbj8gRGVsZWdhdGVzCi8vIHRvIHByLWNyZWF0ZS1jb21tYW5kLmNqcywgd2hpY2ggc2FuaXRpc2VzIGRhdGEgcmVnaW9ucyAocXVvdGVzLCBoZXJlZG9jCi8vIGJvZGllcywgY29tbWVudHMpIGJlZm9yZSBsb29raW5nIGZvciB0aGUgY29tbWFuZCwgc28gdGhlIGdhdGUgbmVpdGhlciBtaXNzZXMKLy8gcmVhbCBpbnZvY2F0aW9ucyAobmV3bGluZS1zZXBhcmF0ZWQsIHBpcGVkLCBwYXJlbnRoZXNpc2VkKSBub3IgZmlyZXMgb24KLy8gY29tbWFuZHMgdGhhdCBtZXJlbHkgcXVvdGUgdGhlIGxpdGVyYWwgKGBnaXQgY29tbWl0IC1tICIuLi5naCBwciBjcmVhdGUuLi4iYCkuCi8vCi8vIEZhaWwtc2FmZSwgaW4gQk9USCBkaXJlY3Rpb25zLCBiZWNhdXNlIHRoaXMgcnVucyBvbiBldmVyeSBCYXNoIGNhbGwgaW4gZXZlcnkKLy8gY29uc3VtZXIuIGdhdGUtaG9vay5tanMgbWFwcyBhIG5vbi16ZXJvIGV4aXQgZnJvbSB0aGlzIHNjcmlwdCB0byBleGl0IDIsIHNvIGFuCi8vIHVuY2F1Z2h0IHRocm93IGhlcmUgZG9lcyBub3QgZGVncmFkZSBvbmUgZ2F0ZSDigJQgaXQgYmxvY2tzIGV2ZXJ5IEJhc2ggY2FsbCB0aGUKLy8gY29uc3VtZXIgbWFrZXMuIFNvIGEgbG9hZCBmYWlsdXJlIChwYXJ0aWFsIGAuY2xhdWRlL2hlbHBlcnNgIHN5bmMgbWlkLXVwZ3JhZGUsCi8vIGhhbmQtcHJ1bmVkIGluc3RhbGwpIEFORCBhIHRocm93IGZyb20gdGhlIG1hdGNoZXIgaXRzZWxmIGJvdGggZmFsbCBiYWNrIHRvIHRoZQovLyBwcmUtIzE0MTAgcmVnZXg6IHByZXZpb3VzIGJlaGF2aW91ciwgbm90IGEgd2VkZ2VkIHNlc3Npb24uCi8vCi8vIE5vdCBzaWxlbnQgKCM4NTQsIGhvb2stYXV0aG9yaW5nIMKnNCk6IHRoZSBmYWxsYmFjayBwYXRoIGFkdmlzZXMgb24gc3RkZXJyIGFuZAovLyBjb250aW51ZXMuIElmIHRoaXMgZXZlciBmaXJlcyBpdCBtZWFucyB0aGUgbWF0Y2hlciBjcmFzaGVkLCB3aGljaCBpcyB3b3J0aAovLyBiZWluZyBsb3VkIGFib3V0IOKAlCBhbmQgaXQgY2Fubm90IHNwYW0gYSBoZWFsdGh5IHNlc3Npb24sIGJlY2F1c2UgYSBoZWFsdGh5Ci8vIHNlc3Npb24gbmV2ZXIgcmVhY2hlcyBpdC4KdmFyIExFR0FDWV9QUl9DUkVBVEVfUkUgPSAvKD86XnwmJlxzKnxcfFx8XHMqfDtccyopXHMqKD86W0EtWl9dW0EtWjAtOV9dKj1cUytccyspKmdoXHMrcHJccytjcmVhdGVcYi87CnZhciBwckNyZWF0ZU1hdGNoZXIgPSBudWxsOwpmdW5jdGlvbiBpc1ByQ3JlYXRlQ29tbWFuZChjbWQpIHsKICBpZiAocHJDcmVhdGVNYXRjaGVyID09PSBudWxsKSB7CiAgICB0cnkgewogICAgICBwckNyZWF0ZU1hdGNoZXIgPSByZXF1aXJlKCcuL3ByLWNyZWF0ZS1jb21tYW5kLmNqcycpLmlzUHJDcmVhdGVDb21tYW5kOwogICAgfSBjYXRjaCAoZSkgewogICAgICBwckNyZWF0ZU1hdGNoZXIgPSBmYWxzZTsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ21vZmxvOiBwci1jcmVhdGUtY29tbWFuZC5janMgdW5hdmFpbGFibGUgKCcgKyAoZSAmJiBlLm1lc3NhZ2UpICsgJykg4oCUIFBSIGdhdGVzIGZhbGwgYmFjayB0byB0aGUgbGVnYWN5IG1hdGNoZXIuIFJ1biBgbnB4IGZsbyBkb2N0b3IgLS1maXhgLlxuJyk7CiAgICB9CiAgICBpZiAodHlwZW9mIHByQ3JlYXRlTWF0Y2hlciAhPT0gJ2Z1bmN0aW9uJykgcHJDcmVhdGVNYXRjaGVyID0gZmFsc2U7CiAgfQogIGlmIChwckNyZWF0ZU1hdGNoZXIpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBwckNyZWF0ZU1hdGNoZXIoY21kKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ21vZmxvOiBwci1jcmVhdGUgbWF0Y2hlciB0aHJldyAoJyArIChlICYmIGUubWVzc2FnZSkgKyAnKSDigJQgZmFsbGluZyBiYWNrIHRvIHRoZSBsZWdhY3kgbWF0Y2hlci4gUGxlYXNlIHJlcG9ydCB3aXRoIHRoZSBjb21tYW5kIHRoYXQgdHJpZ2dlcmVkIGl0LlxuJyk7CiAgICB9CiAgfQogIHJldHVybiBMRUdBQ1lfUFJfQ1JFQVRFX1JFLnRlc3QoY21kKTsKfQoKLy8gQ2xhc3NpZmllci1hd2FyZSBzaW1wbGlmeSBnYXRlIHNraXAuIFJldHVybnMgYSBzdHJpbmcgcmVhc29uIGlmIHRoZSBnYXRlCi8vIGNhbiBiZSBhdXRvLXBhc3NlZCwgb3IgbnVsbCBpZiAvc2ltcGxpZnkgbXVzdCBydW4uIFVzZXMgc2ltcGxpZnktY2xhc3NpZnkuY2pzCi8vIHNvIHRoZSBnYXRlJ3MgInRyaXZpYWwiIGRlZmluaXRpb24gbWF0Y2hlcyB0aGUgc2tpbGwncyBleGFjdGx5LgovLwovLyBUd28gcGF0aHM6Ci8vICAgMS4gc25hcHNob3QgcGF0aCDigJQgL3NpbXBsaWZ5IHJhbiBlYXJsaWVyIG9uIHRoaXMgYnJhbmNoLiBDbGFzc2lmeSB0aGUgZGlmZgovLyAgICAgIGJldHdlZW4gc2ltcGxpZnlTbmFwc2hvdFNoYSBhbmQgY3VycmVudCBIRUFEL3dvcmtpbmctdHJlZS4gSWYgVFJJVklBTCwKLy8gICAgICB0aGUgcHJpb3IgcmV2aWV3IHN0aWxsIGNvdmVycyB0aGUgYnJhbmNoIOKAlCBubyByZS1ydW4gbmVlZGVkLgovLyAgIDIuIGJhc2VsaW5lIHBhdGgg4oCUIG5vIHNuYXBzaG90IChmaXJzdCB0aW1lKS4gQ2xhc3NpZnkgdGhlIGVudGlyZSBicmFuY2gKLy8gICAgICBkaWZmIHZzIG1lcmdlLWJhc2UuIElmIFRSSVZJQUwsIHRoZSB3aG9sZSBQUiBpcyBiZWxvdyB0aGUgdGhyZXNob2xkCi8vICAgICAgd2hlcmUgL3NpbXBsaWZ5IHByb3ZpZGVzIHZhbHVlIOKAlCBhdXRvLXBhc3Mgd2l0aG91dCBldmVyIGludm9raW5nIGl0LgovLwovLyBGYWlsLXNhZmU6IGFueSBlcnJvciAobm8gY2xhc3NpZmllciwgbm8gZ2l0LCBubyBtZXJnZS1iYXNlKSByZXR1cm5zIG51bGwsCi8vIHdoaWNoIGZvcmNlcyAvc2ltcGxpZnkgdG8gcnVuIGFzIHRvZGF5LgpmdW5jdGlvbiBjbGFzc2lmeUZvckdhdGVTa2lwKHN0YXRlKSB7CiAgdmFyIG1vZDsKICB0cnkgewogICAgbW9kID0gcmVxdWlyZSgnLi9zaW1wbGlmeS1jbGFzc2lmeS5janMnKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgdmFyIGNsYXNzaWZ5ID0gbW9kICYmIG1vZC5jbGFzc2lmeURpZmY7CiAgdmFyIHJlYWRVbnRyYWNrZWQgPSBtb2QgJiYgbW9kLnJlYWRVbnRyYWNrZWREaWZmOwogIC8vIEVYRUNfTUFYX0JVRkZFUiBpcyBjaGVja2VkIGFsb25nc2lkZSB0aGUgZnVuY3Rpb25zIGJlY2F1c2UgZmFsbGluZyBiYWNrIHRvCiAgLy8gTm9kZSdzIDEgTWlCIGRlZmF1bHQgd291bGQgc2lsZW50bHkgcmVpbnN0YXRlIHRoZSB2ZXJ5IGNsaWZmICMxNDUxIHJlbW92ZWQuCiAgaWYgKHR5cGVvZiBjbGFzc2lmeSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgcmVhZFVudHJhY2tlZCAhPT0gJ2Z1bmN0aW9uJwogICAgICB8fCB0eXBlb2YgbW9kLkVYRUNfTUFYX0JVRkZFUiAhPT0gJ251bWJlcicpIHJldHVybiBudWxsOwoKICAvLyBVbnRyYWNrZWQgZmlsZXMgc2hvdyB1cCBpbiBubyBgZ2l0IGRpZmZgIG91dHB1dCwgc28gd2l0aG91dCB0aGVtIHRoZSBnYXRlCiAgLy8gY291bGQgYXV0by1wYXNzIGEgYnJhbmNoIG9mIGJyYW5kLW5ldyB1bnN0YWdlZCBmaWxlcyBhcyBUUklWSUFMICgjMTQ1MSkuCiAgLy8gUmVhZGluZyBldmVyeSBvbmUgb2YgdGhlbSBpcyByZWFsIHdvcmssIHNvIGl0IGlzIGRlZmVycmVkIHVudGlsIGEgcGF0aCBpcwogIC8vIGFjdHVhbGx5IGFib3V0IHRvIGNsYXNzaWZ5LiBSZXR1cm5zIG51bGwgaWYgdGhlIHJlYWQgZmFpbGVkIOKAlCB0aGUgY2FsbGVyCiAgLy8gbXVzdCB0aGVuIGZhbGwgdGhyb3VnaCBhbmQgZm9yY2UgL3NpbXBsaWZ5IHJhdGhlciB0aGFuIGNsYXNzaWZ5IGEgcGFydGlhbAogIC8vIGRpZmYuCiAgdmFyIHVudHJhY2tlZFRleHQgPSBudWxsOwogIGZ1bmN0aW9uIHVudHJhY2tlZFN1ZmZpeCgpIHsKICAgIGlmICh1bnRyYWNrZWRUZXh0ICE9PSBudWxsKSByZXR1cm4gdW50cmFja2VkVGV4dDsKICAgIHZhciB1OwogICAgdHJ5IHsgdSA9IHJlYWRVbnRyYWNrZWQoUFJPSkVDVF9ESVIpOyB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgICBpZiAoIXUgfHwgdS51bnJlYWRhYmxlKSByZXR1cm4gbnVsbDsKICAgIHVudHJhY2tlZFRleHQgPSB1LnRleHQgPyAnXG4nICsgdS50ZXh0IDogJyc7CiAgICByZXR1cm4gdW50cmFja2VkVGV4dDsKICB9CgogIGZ1bmN0aW9uIHRyeUNsYXNzaWZ5KGRpZmZUZXh0LCBsYWJlbCwgYWxsb3dTbWFsbFJldmlld0ZpeCkgewogICAgdHJ5IHsKICAgICAgdmFyIGRlYyA9IGNsYXNzaWZ5KGRpZmZUZXh0KTsKICAgICAgaWYgKGRlYy50aWVyID09PSAnVFJJVklBTCcpIHsKICAgICAgICB2YXIgbG9jID0gKGRlYy5zdGF0cy5hZGRlZCB8fCAwKSArIChkZWMuc3RhdHMuZGVsZXRlZCB8fCAwKTsKICAgICAgICByZXR1cm4gbGFiZWwgKyAnIGlzIFRSSVZJQUwgKCcgKyBsb2MgKyAnIExPQywgJyArIChkZWMuc3RhdHMuZmlsZUNvdW50IHx8IDApICsgJyBmaWxlKHMpKSc7CiAgICAgIH0KICAgICAgLy8gIzExNzYg4oCUIFNNQUxMIHJldmlldy1maXggc2hhcGUgKHNuYXBzaG90IHBhdGggb25seSkuIEEg4omkMzAtTE9DIGRlbHRhIHdpdGgKICAgICAgLy8gemVybyBuZXcgZGVjbGFyYXRpb25zIG9uIHRvcCBvZiBhbiBhbHJlYWR5LXJldmlld2VkIGJyYW5jaCBpcyB0aGUgdHlwaWNhbAogICAgICAvLyAiYXBwbHkgMyByZXZpZXcgZml4ZXMiIGN5Y2xlIOKAlCByZS1ydW5uaW5nIC9mbG8tc2ltcGxpZnkgYWdhaW5zdCB0aGUgc2FtZQogICAgICAvLyBzdXJmYWNlIHBsdXMgYSBmZXctbGluZSB0d2VhayBhZGRzIG5vIG5ldyBzaWduYWwuIEJhc2VsaW5lIHBhdGggc3RheXMKICAgICAgLy8gVFJJVklBTC1vbmx5IHNvIGJyYW5kLW5ldyBTTUFMTCBmZWF0dXJlcyBzdGlsbCBnZXQgcmV2aWV3ZWQuCiAgICAgIGlmIChhbGxvd1NtYWxsUmV2aWV3Rml4ICYmIGRlYy50aWVyID09PSAnU01BTEwnKSB7CiAgICAgICAgdmFyIHRvdGFsTG9jID0gKGRlYy5zdGF0cy5hZGRlZCB8fCAwKSArIChkZWMuc3RhdHMuZGVsZXRlZCB8fCAwKTsKICAgICAgICBpZiAodG90YWxMb2MgPD0gMzAgJiYgKGRlYy5zdGF0cy5kZWNsQWRkZWQgfHwgMCkgPT09IDApIHsKICAgICAgICAgIHJldHVybiBsYWJlbCArICcgaXMgU01BTEwgcmV2aWV3LWZpeCBzaGFwZSAoJyArIHRvdGFsTG9jICsgJyBMT0MsIG5vIG5ldyBkZWNsYXJhdGlvbnMpJzsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsgLyogZmFsbCB0aHJvdWdoICovIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gbWF4QnVmZmVyIGNvbWVzIEZST00gdGhlIGNsYXNzaWZpZXIgKCMxNDUxKSByYXRoZXIgdGhhbiBiZWluZyBhIG1hdGNoaW5nCiAgLy8gbGl0ZXJhbCBoZXJlLCBzbyB0aGUgZ2F0ZSBhbmQgdGhlIHNraWxsIGNhbm5vdCBkcmlmdCBvbiB3aGljaCBkaWZmcyBhcmUKICAvLyByZWFkYWJsZSBhdCBhbGwuIFBhc3QgaXQgZXhlY0ZpbGVTeW5jIHRocm93cyBFTk9CVUZTIGFuZCBnaXREaWZmIHJldHVybnMKICAvLyBudWxsIOKAlCB3aGljaCBldmVyeSBjYWxsZXIgYmVsb3cgbXVzdCB0cmVhdCBhcyAidW5rbm93biIsIG5ldmVyICJlbXB0eSIuCiAgdmFyIG1heEJ1ZmZlciA9IG1vZC5FWEVDX01BWF9CVUZGRVI7CiAgZnVuY3Rpb24gZ2l0RGlmZihhcmdzKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gY3AuZXhlY0ZpbGVTeW5jKCdnaXQnLCBhcmdzLCB7CiAgICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDUwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLCBtYXhCdWZmZXI6IG1heEJ1ZmZlcgogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KICB9CgogIC8vIFNuYXBzaG90IHBhdGg6IGNsYXNzaWZ5IGV2ZXJ5dGhpbmcgc2luY2UgL3NpbXBsaWZ5IGxhc3QgcmFuLgogIGlmIChzdGF0ZS5zaW1wbGlmeVNuYXBzaG90U2hhKSB7CiAgICB2YXIgc25hcERpZmYgPSBnaXREaWZmKFsnZGlmZicsIHN0YXRlLnNpbXBsaWZ5U25hcHNob3RTaGEgKyAnLi4uSEVBRCddKTsKICAgIHZhciB3b3JrVHJlZUEgPSBnaXREaWZmKFsnZGlmZicsICdIRUFEJ10pOwogICAgLy8gQk9USCByZWFkcyBtdXN0IHN1Y2NlZWQuIENvYWxlc2NpbmcgYSBmYWlsZWQgd29ya2luZy10cmVlIHJlYWQgdG8gJycgaXMKICAgIC8vIGhvdyBhbiBvdmVyLWJ1ZmZlciB3b3JraW5nIHRyZWUgdXNlZCB0byByZWFkIGFzICJubyB3b3JraW5nLXRyZWUgY2hhbmdlcyIKICAgIC8vIGFuZCBsZXQgdGhlIGdhdGUgc2tpcCByZXZpZXcgKCMxNDUxKS4KICAgIGlmIChzbmFwRGlmZiAhPT0gbnVsbCAmJiB3b3JrVHJlZUEgIT09IG51bGwpIHsKICAgICAgdmFyIHN1ZmZpeEEgPSB1bnRyYWNrZWRTdWZmaXgoKTsKICAgICAgaWYgKHN1ZmZpeEEgPT09IG51bGwpIHJldHVybiBudWxsOwogICAgICB2YXIgY29tYmluZWQgPSBzbmFwRGlmZiArICh3b3JrVHJlZUEgPyAnXG4nICsgd29ya1RyZWVBIDogJycpICsgc3VmZml4QTsKICAgICAgLy8gU25hcHNob3QgcGF0aDogYWxsb3cgU01BTEwgcmV2aWV3LWZpeCBzaGFwZSBiZWNhdXNlIHRoZSBvcmlnaW5hbCAvc2ltcGxpZnkKICAgICAgLy8gYWxyZWFkeSBjb3ZlcmVkIHRoZSBzdXJmYWNlIGFuZCBvbmx5IHRpbnkgbm8tZGVjbC10b3VjaGluZyB0d2Vha3MgZm9sbG93ZWQuCiAgICAgIHZhciBoaXQgPSB0cnlDbGFzc2lmeShjb21iaW5lZCwgJ2RlbHRhIHNpbmNlIGxhc3QgL3NpbXBsaWZ5JywgdHJ1ZSk7CiAgICAgIGlmIChoaXQpIHJldHVybiBoaXQ7CiAgICB9CiAgfQoKICAvLyBCYXNlbGluZSBwYXRoOiBjbGFzc2lmeSB0aGUgd2hvbGUgYnJhbmNoIHZzIG1lcmdlLWJhc2UuCiAgdmFyIGJhc2VzID0gWydvcmlnaW4vbWFpbicsICdtYWluJywgJ29yaWdpbi9tYXN0ZXInLCAnbWFzdGVyJ107CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlcy5sZW5ndGg7IGkrKykgewogICAgdmFyIGJhc2U7CiAgICB0cnkgewogICAgICBiYXNlID0gY3AuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ21lcmdlLWJhc2UnLCAnSEVBRCcsIGJhc2VzW2ldXSwgewogICAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiAyMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXQogICAgICB9KS50cmltKCk7CiAgICB9IGNhdGNoIChlKSB7IGNvbnRpbnVlOyB9CiAgICBpZiAoIWJhc2UpIGNvbnRpbnVlOwogICAgdmFyIGJyYW5jaERpZmYgPSBnaXREaWZmKFsnZGlmZicsIGJhc2UgKyAnLi4uSEVBRCddKTsKICAgIHZhciB3b3JrVHJlZUIgPSBnaXREaWZmKFsnZGlmZicsICdIRUFEJ10pOwogICAgaWYgKGJyYW5jaERpZmYgIT09IG51bGwgJiYgd29ya1RyZWVCICE9PSBudWxsKSB7CiAgICAgIHZhciBzdWZmaXhCID0gdW50cmFja2VkU3VmZml4KCk7CiAgICAgIGlmIChzdWZmaXhCID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIHRyeUNsYXNzaWZ5KGJyYW5jaERpZmYgKyAod29ya1RyZWVCID8gJ1xuJyArIHdvcmtUcmVlQiA6ICcnKSArIHN1ZmZpeEIsICdicmFuY2ggZGlmZicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIHJldHVybiBudWxsOwp9CgovLyBHZXQgdGhlIGZpbGUgbGlzdCBjaGFuZ2VkIG9uIHRoZSBjdXJyZW50IGJyYW5jaCB2cyB0aGUgbWVyZ2UtYmFzZSB3aXRoIG9yaWdpbi9tYWluCi8vIChmYWxsaW5nIGJhY2sgdG8gbG9jYWwgbWFpbikuIFJldHVybnMgYW4gYXJyYXkgb2YgcmVwby1yZWxhdGl2ZSBwYXRocywgb3IgbnVsbCBvbgovLyBmYWlsdXJlIOKAlCBpbiB3aGljaCBjYXNlIGNhbGxlcnMgTVVTVCBmYWxsIHRocm91Z2ggdG8gdGhlIHN0YW5kYXJkIGdhdGUgKGZhaWwtc2FmZSkuCmZ1bmN0aW9uIGdldENoYW5nZWRGaWxlc1ZzQmFzZSgpIHsKICB2YXIgYmFzZXMgPSBbJ29yaWdpbi9tYWluJywgJ21haW4nLCAnb3JpZ2luL21hc3RlcicsICdtYXN0ZXInXTsKICB2YXIgYmFzZSA9IG51bGw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlcy5sZW5ndGg7IGkrKykgewogICAgdHJ5IHsKICAgICAgYmFzZSA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydtZXJnZS1iYXNlJywgJ0hFQUQnLCBiYXNlc1tpXV0sIHsKICAgICAgICBjd2Q6IFBST0pFQ1RfRElSLCBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMjAwMCwgd2luZG93c0hpZGU6IHRydWUsCiAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10KICAgICAgfSkudHJpbSgpOwogICAgICBpZiAoYmFzZSkgYnJlYWs7CiAgICB9IGNhdGNoIChlKSB7IC8qIHRyeSBuZXh0ICovIH0KICB9CiAgaWYgKCFiYXNlKSByZXR1cm4gbnVsbDsKICB0cnkgewogICAgdmFyIG91dCA9IGNwLmV4ZWNGaWxlU3luYygnZ2l0JywgWydkaWZmJywgJy0tbmFtZS1vbmx5JywgYmFzZSArICcuLi5IRUFEJ10sIHsKICAgICAgY3dkOiBQUk9KRUNUX0RJUiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDIwMDAsIHdpbmRvd3NIaWRlOiB0cnVlLAogICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXQogICAgfSk7CiAgICByZXR1cm4gb3V0LnNwbGl0KCdcbicpLm1hcChmdW5jdGlvbihsKSB7IHJldHVybiBsLnRyaW0oKTsgfSkuZmlsdGVyKEJvb2xlYW4pOwogIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KfQoKLy8gIzEzNzQg4oCUIHRoZSBtaXNzaW5nIGhhbGYgb2YgdGhlIFRhc2tDcmVhdGUgcmVtaW5kZXIuCi8vCi8vIG1vZmxvIG5hZ3MgeW91IHRvIE9QRU4gYSB0YXNrIGxpc3QgKGNoZWNrLWJlZm9yZS1hZ2VudCkgYW5kIHRoZW4gbmV2ZXIgbG9va3MKLy8gYWdhaW46IGB0YXNrQ291bnRgIG9ubHkgY291bnRzIHVwLCBzbyBhIHJ1biB0aGF0IGNyZWF0ZXMgZm91ciB0YXNrcyBhbmQgY2xvc2VzCi8vIG5vbmUgc2F0aXNmaWVzIGV2ZXJ5IGdhdGUuIFRoYXQgaXMgdGhlIGV4YWN0IHNoYXBlIG9mIGFuIGFiYW5kb25lZCBsaXN0LgovLwovLyBUaGUgbGVkZ2VyIGlzIHJlYWQgZnJvbSB0aGUgc2Vzc2lvbiBUUkFOU0NSSVBULCBhbmQgYm90aCBhbHRlcm5hdGl2ZXMgd2VyZQovLyByZWplY3RlZCBvbiBldmlkZW5jZSByYXRoZXIgdGhhbiB0YXN0ZToKLy8KLy8gICAtIEEgYF5UYXNrVXBkYXRlJGAgUG9zdFRvb2xVc2Ugb2JzZXJ2ZXIgZmVlZGluZyBhIGNvdW50ZXIgaXMgdGhlIHdpcmluZwovLyAgICAgIzEzMzEgcmVtb3ZlZCBhcyBwdXJlIGhvdC1wYXRoIG92ZXJoZWFkLiBJdCB3b3VsZCBhbHNvIGhhdmUgdG8gc3Vydml2ZQovLyAgICAgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0LCB3aGVyZWFzIGEgdHJhbnNjcmlwdCByZWFkIGhvbGRzIG5vIHN0YXRlIHRvIHJlc2V0LgovLyAgIC0gQ2xhdWRlIENvZGUncyBvd24gdGFzayBzdG9yZSAoYH4vLmNsYXVkZS90YXNrcy9zZXNzaW9uLTxpZD4vYCkgaXMgZ3JvdW5kCi8vICAgICB0cnV0aCBidXQgdW5yZWFjaGFibGU6IG1lYXN1cmVkIG9uIHYyLjEuMjIwLCB0aGUgaWQga2V5aW5nIHRoYXQgZGlyZWN0b3J5Ci8vICAgICBkb2VzIE5PVCByb3RhdGUgb24gYC9jbGVhcmAsIHNvIGEgc2Vzc2lvbiB3aG9zZSB0cmFuc2NyaXB0IGlzIDxBPiB3cml0ZXMKLy8gICAgIGl0cyB0YXNrcyB1bmRlciB0aGUgcHJlLWNsZWFyIGlkIDxCPiDigJQgYW5kIDxBPiBpcyB3aGF0IHRoZSBicmlkZ2UgZm9yd2FyZHMKLy8gICAgIGFzIEhPT0tfU0VTU0lPTl9JRC4gVGhlcmUgaXMgbm8gcGF0aCBmcm9tIHRoZSBob29rIGVudmlyb25tZW50IHRvIHRoZSBkaXIuCi8vCi8vIENvc3QgbGFuZHMgb25seSB3aGVyZSBpdCBpcyBhbHJlYWR5IGp1c3RpZmllZDogdGhlIHNvbGUgY2FsbGVyIHJ1bnMgYWZ0ZXIKLy8gY2hlY2stYmVmb3JlLXByJ3MgYGdoIHByIGNyZWF0ZWAgbWF0Y2gsIGkuZS4gb25jZSBwZXIgUFIgYXR0ZW1wdCwgbmV2ZXIgb24gdGhlCi8vIHBlci10b29sIHBhdGguCi8vCi8vIFJldHVybnMgbnVsbCB3aGVuIHRoZSB0cmFuc2NyaXB0IGlzIG1pc3NpbmcsIG92ZXJzaXplZCwgdW5yZWFkYWJsZSwgb3IgcmVjb3JkcwovLyBubyBUYXNrQ3JlYXRlIGF0IGFsbCDigJQgdGhlIGNhbGxlciB0aGVuIHN0YXlzIHNpbGVudCByYXRoZXIgdGhhbiBndWVzc2luZy4KLy8gU2l6ZWQgYWdhaW5zdCBtZWFzdXJlbWVudCwgbm90IGEgcm91bmQgbnVtYmVyOiBhIDMuNE1CIHRyYW5zY3JpcHQgKHRoZSBsYXJnZXN0Ci8vIGluIGEgd2VlayBvZiBsb2NhbCBzZXNzaW9ucykgY29zdHMgfjU1bXMgdG8gc2Nhbiwgc28gfjE2bXMvTUIuIDE2TUIgaXMgfjR4IHRoZQovLyB3b3JzdCBvYnNlcnZlZCBzZXNzaW9uIGFuZCBsYW5kcyBuZWFyIDI2MG1zIOKAlCBhIGNodW5rIG9mIHRoZSBob29rJ3MgMjAwMG1zCi8vIGJ1ZGdldCwgYnV0IGEgYm91bmRlZCBvbmUuIFBhc3QgdGhlIGNhcCB0aGUgbGVkZ2VyIGdvZXMgc2lsZW50IHJhdGhlciB0aGFuCi8vIHJpc2tpbmcgdGhlIHRpbWVvdXQsIHNpbmNlIGEgaG9vayB0aGF0IHRpbWVzIG91dCBpcyB3b3JzZSB0aGFuIG9uZSB0aGF0Ci8vIGRlY2xpbmVzIHRvIGNvbW1lbnQuIFVucmVsYXRlZCB0byBgVFJBTlNDUklQVF9UQUlMX0JZVEVTYCBpbiBiaW4vbGliL21lZGl0YXRlLm1qcwovLyBkZXNwaXRlIHRoZSBzaW1pbGFyIG5hbWUg4oCUIHRoYXQgb25lIHRydW5jYXRlcyB0byBhIHRhaWwgd2luZG93LCB3aGljaCBjYW5ub3QKLy8gd29yayBoZXJlIChhIFRhc2tDcmVhdGUgZnJvbSBlYXJseSBpbiB0aGUgc2Vzc2lvbiBmYWxscyBvdXRzaWRlIGFueSB0YWlsKS4KdmFyIFRSQU5TQ1JJUFRfTUFYX0JZVEVTID0gMTYgKiAxMDI0ICogMTAyNDsKZnVuY3Rpb24gcmVhZFRhc2tMZWRnZXIoKSB7CiAgdmFyIHRwID0gcHJvY2Vzcy5lbnYuSE9PS19UUkFOU0NSSVBUX1BBVEggfHwgJyc7CiAgaWYgKCF0cCkgcmV0dXJuIG51bGw7CiAgdmFyIHJhdzsKICB0cnkgewogICAgdmFyIHN0ID0gZnMuc3RhdFN5bmModHApOwogICAgaWYgKCFzdC5pc0ZpbGUoKSB8fCBzdC5zaXplID4gVFJBTlNDUklQVF9NQVhfQllURVMpIHJldHVybiBudWxsOwogICAgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHRwLCAndXRmLTgnKTsKICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9CiAgdmFyIGNyZWF0ZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFza0NyZWF0ZSBDQUxMUyBzZWVuCiAgdmFyIHBlbmRpbmdDcmVhdGVzID0ge307ICAgICAgICAgICAgICAgLy8gdG9vbF91c2UgaWQg4oaSIGF3YWl0aW5nIGl0cyByZXN1bHQKICB2YXIgY3JlYXRlZElkcyA9IHt9OyAgICAgICAgICAgICAgICAgICAvLyB0YXNrIGlkcyB0aGlzIHRyYW5zY3JpcHQgYWN0dWFsbHkgb3BlbmVkCiAgdmFyIGNyZWF0ZWRJZENvdW50ID0gMDsKICB2YXIgbGF0ZXN0ID0ge307ICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXNrIGlkIOKGkiBtb3N0IHJlY2VudCBzdGF0dXMgc2VlbgogIC8vIFdhbGtlZCBieSBuZXdsaW5lIGluZGV4IHJhdGhlciB0aGFuIHJhdy5zcGxpdCgnXG4nKTogdGhlIHNwbGl0IHdvdWxkIGhvbGQgYQogIC8vIHNlY29uZCBmdWxsLXNpemUgY29weSBvZiBhIG11bHRpLU1CIHRyYW5zY3JpcHQgYWxvbmdzaWRlIHRoZSBmaXJzdCwgYW5kIHRoZQogIC8vIHNjYW4gbmVlZHMgb25lIGxpbmUgYXQgYSB0aW1lLgogIHZhciBwb3MgPSAwOwogIHdoaWxlIChwb3MgPD0gcmF3Lmxlbmd0aCkgewogICAgdmFyIG5sID0gcmF3LmluZGV4T2YoJ1xuJywgcG9zKTsKICAgIHZhciBsaW5lID0gbmwgPCAwID8gcmF3LnNsaWNlKHBvcykgOiByYXcuc2xpY2UocG9zLCBubCk7CiAgICBwb3MgPSBubCA8IDAgPyByYXcubGVuZ3RoICsgMSA6IG5sICsgMTsKICAgIC8vIENoZWFwIHByZS1maWx0ZXIuIEEgbXVsdGktTUIgdHJhbnNjcmlwdCBoYXMgYSBoYW5kZnVsIG9mIHRhc2sgbGluZXMgYW5kCiAgICAvLyB0ZW5zIG9mIHRob3VzYW5kcyBvZiBvdGhlcnM7IEpTT04ucGFyc2Ugb24gZXZlcnkgbGluZSBpcyB0aGUgd2hvbGUgY29zdC4KICAgIGlmIChsaW5lLmluZGV4T2YoJ1Rhc2tDcmVhdGUnKSA8IDAgJiYgbGluZS5pbmRleE9mKCdUYXNrVXBkYXRlJykgPCAwCiAgICAgICYmIGxpbmUuaW5kZXhPZignY3JlYXRlZCBzdWNjZXNzZnVsbHknKSA8IDApIGNvbnRpbnVlOwogICAgdmFyIGVudHJ5OwogICAgdHJ5IHsgZW50cnkgPSBKU09OLnBhcnNlKGxpbmUpOyB9IGNhdGNoIChlKSB7IGNvbnRpbnVlOyB9CiAgICB2YXIgY29udGVudCA9IGVudHJ5ICYmIGVudHJ5Lm1lc3NhZ2UgJiYgZW50cnkubWVzc2FnZS5jb250ZW50OwogICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250aW51ZTsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udGVudC5sZW5ndGg7IGorKykgewogICAgICB2YXIgYmxvY2sgPSBjb250ZW50W2pdOwogICAgICBpZiAoIWJsb2NrKSBjb250aW51ZTsKICAgICAgLy8gVGhlIGNyZWF0ZWQgaWRzIGNvbWUgZnJvbSBUYXNrQ3JlYXRlJ3MgUkVTVUxULCBiZWNhdXNlIHRoZSBjYWxsIGl0c2VsZgogICAgICAvLyBjYXJyaWVzIG5vIGlkLiBXaXRob3V0IHRoZW0gYGNyZWF0ZWRgIChhIGNvdW50IG9mIGNhbGxzKSBhbmQgdGhlIGNsb3NlZAogICAgICAvLyBzZXQgKGEgc2V0IG9mIGlkcykgYXJlIGRpZmZlcmVudCB1bml0czogYSBUYXNrVXBkYXRlIG5hbWluZyBhIHRhc2sgZnJvbQogICAgICAvLyBiZWZvcmUgdGhpcyB0cmFuc2NyaXB0IOKAlCBvbmUgY2FycmllZCBhY3Jvc3MgYC9jbGVhcmAsIHdoaWNoIGlzIGV4YWN0bHkKICAgICAgLy8gd2hhdCBDbGF1ZGUgQ29kZSdzIHRhc2sgc3RvcmUgZG9lcyDigJQgd291bGQgZGlzY291bnQgYSB0YXNrIGl0IG5ldmVyCiAgICAgIC8vIG9wZW5lZCwgYW5kIHRoZSBhZHZpc29yeSB3b3VsZCB1bmRlci1yZXBvcnQgdGhlIG9wZW4gbGlzdC4KICAgICAgaWYgKGJsb2NrLnR5cGUgPT09ICd0b29sX3Jlc3VsdCcpIHsKICAgICAgICBpZiAoIXBlbmRpbmdDcmVhdGVzW2Jsb2NrLnRvb2xfdXNlX2lkXSkgY29udGludWU7CiAgICAgICAgZGVsZXRlIHBlbmRpbmdDcmVhdGVzW2Jsb2NrLnRvb2xfdXNlX2lkXTsKICAgICAgICB2YXIgdGV4dCA9IHR5cGVvZiBibG9jay5jb250ZW50ID09PSAnc3RyaW5nJyA/IGJsb2NrLmNvbnRlbnQgOiBKU09OLnN0cmluZ2lmeShibG9jay5jb250ZW50KTsKICAgICAgICB2YXIgbSA9IC9UYXNrICMoXFMrKSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS8uZXhlYyh0ZXh0IHx8ICcnKTsKICAgICAgICBpZiAobSAmJiAhY3JlYXRlZElkc1ttWzFdXSkgeyBjcmVhdGVkSWRzW21bMV1dID0gdHJ1ZTsgY3JlYXRlZElkQ291bnQrKzsgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8vIFN0cnVjdHVyYWwsIG5vdCBzdWJzdHJpbmcuIEEgbGluZSB0aGF0IG1lcmVseSBNRU5USU9OUyBUYXNrQ3JlYXRlIOKAlCB0aGlzCiAgICAgIC8vIHRpY2tldCdzIG93biBkaXNjdXNzaW9uLCBhIGd1aWRhbmNlIGV4Y2VycHQsIGEgc2hlbGwgY29tbWFuZCBlY2hvaW5nIHRoZQogICAgICAvLyBwaHJhc2Ug4oCUIGlzIHRleHQsIGFuZCBjb3VudGluZyBpdCB3b3VsZCBpbmZsYXRlIHRoZSBjcmVhdGVkIHRvdGFsIG9uCiAgICAgIC8vIGV4YWN0bHkgdGhlIHNlc3Npb25zIG1vc3QgbGlrZWx5IHRvIHJlYWNoIGEgUFIgZ2F0ZS4gQ29ycmVsYXRpbmcgb24KICAgICAgLy8gdG9vbF91c2VfaWQgaXMgd2hhdCBrZWVwcyBzdWNoIGFuIGVjaG8gb3V0IG9mIHRoZSBjcmVhdGVkIGlkcyB0b28uCiAgICAgIGlmIChibG9jay50eXBlICE9PSAndG9vbF91c2UnKSBjb250aW51ZTsKICAgICAgaWYgKGJsb2NrLm5hbWUgPT09ICdUYXNrQ3JlYXRlJykgewogICAgICAgIGNyZWF0ZWQrKzsKICAgICAgICBpZiAoYmxvY2suaWQpIHBlbmRpbmdDcmVhdGVzW2Jsb2NrLmlkXSA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGJsb2NrLm5hbWUgIT09ICdUYXNrVXBkYXRlJykgY29udGludWU7CiAgICAgIHZhciBpbnB1dCA9IGJsb2NrLmlucHV0IHx8IHt9OwogICAgICB2YXIgaWQgPSBpbnB1dC50YXNrSWQgIT0gbnVsbCA/IGlucHV0LnRhc2tJZCA6IGlucHV0LnRhc2tfaWQ7CiAgICAgIHZhciBzdGF0dXMgPSBpbnB1dC5zdGF0dXM7CiAgICAgIGlmIChpZCA9PSBudWxsIHx8IHR5cGVvZiBzdGF0dXMgIT09ICdzdHJpbmcnIHx8ICFzdGF0dXMpIGNvbnRpbnVlOwogICAgICAvLyBMYXN0IHdyaXRlIHdpbnMg4oCUIHRyYW5zY3JpcHQgb3JkZXIgaXMgY2hyb25vbG9naWNhbCwgc28gYSB0YXNrIHJlb3BlbmVkCiAgICAgIC8vIGFmdGVyIGNvbXBsZXRpb24gaXMgY29ycmVjdGx5IGNvdW50ZWQgYXMgb3BlbiBhZ2Fpbi4KICAgICAgbGF0ZXN0W1N0cmluZyhpZCldID0gc3RhdHVzOwogICAgfQogIH0KICBpZiAoY3JlYXRlZCA9PT0gMCkgcmV0dXJuIG51bGw7CiAgLy8gQSBjcmVhdGUgd2hvc2UgcmVzdWx0IG5ldmVyIGxhbmRlZCAoaW50ZXJydXB0ZWQgY2FsbCwgdHJ1bmNhdGVkIHRyYW5zY3JpcHQpCiAgLy8gaXMgY291bnRlZCBPUEVOOiBpdCB3YXMgb3BlbmVkLCBhbmQgbm90aGluZyBvYnNlcnZlZCBpdCBiZWluZyBjbG9zZWQuCiAgdmFyIG9wZW4gPSBjcmVhdGVkIC0gY3JlYXRlZElkQ291bnQ7CiAgT2JqZWN0LmtleXMoY3JlYXRlZElkcykuZm9yRWFjaChmdW5jdGlvbihpZCkgewogICAgLy8gYGRlbGV0ZWRgIGNsb3NlcyB0aGUgbG9vcCBhcyBsZWdpdGltYXRlbHkgYXMgYGNvbXBsZXRlZGA6IGEgdGFzayByZW1vdmVkCiAgICAvLyBiZWNhdXNlIGl0IG5vIGxvbmdlciBhcHBsaWVzIGlzIG5vdCBhbiBhYmFuZG9uZWQgb25lLgogICAgaWYgKGxhdGVzdFtpZF0gIT09ICdjb21wbGV0ZWQnICYmIGxhdGVzdFtpZF0gIT09ICdkZWxldGVkJykgb3BlbisrOwogIH0pOwogIGlmIChvcGVuID4gY3JlYXRlZCkgb3BlbiA9IGNyZWF0ZWQ7CiAgcmV0dXJuIHsgY3JlYXRlZDogY3JlYXRlZCwgY2xvc2VkOiBjcmVhdGVkIC0gb3Blbiwgb3Blbjogb3BlbiB9Owp9Cgpzd2l0Y2ggKGNvbW1hbmQpIHsKICBjYXNlICdjaGVjay1iZWZvcmUtYWdlbnQnOiB7CiAgICAvLyBNb3N0bHkgYWR2aXNvcnkuIFRoZSBUYXNrQ3JlYXRlICsgbWVtb3J5IHJlbWluZGVycyBiZWxvdyBnbyB0byBzdGRvdXQgYW5kCiAgICAvLyBuZXZlciBibG9jayDigJQgdGhlaXIgd29yZGluZyBtdXN0IG5vdCBjbGFpbSBvdGhlcndpc2UgKCMxMzI2KS4gVGhlIG9uZQogICAgLy8gZXhjZXB0aW9uIGlzIHRoZSAjOTUyIHN3YXJtL2hpdmUgY2hlY2sgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGNhc2UsIHdoaWNoCiAgICAvLyB3cml0ZXMgdG8gc3RkZXJyIGFuZCBleGl0cyAyLgogICAgLy8gTWVtb3J5LWZpcnN0IGVuZm9yY2VtZW50IG90aGVyd2lzZSBoYXBwZW5zIGF0IHRoZSBzY2FuL3JlYWQgZ2F0ZSBsYXllci4KICAgIC8vIFN1YmFnZW50U3RhcnQgaG9vayBpbmplY3RzIGd1aWRhbmNlIGRpcmVjdGl2ZSBpbnRvIHN1YmFnZW50IGNvbnRleHQuCiAgICAvLwogICAgLy8gIzkzMSDigJQgVGFza0NyZWF0ZSBSRU1JTkRFUiBhbmQgdGhlIG5hbWVzcGFjZSBoaW50IG1vdmVkIGhlcmUgZnJvbQogICAgLy8gcHJvbXB0LXJlbWluZGVyLiBUaGV5IG9ubHkgbWF0dGVyIHdoZW4gQ2xhdWRlIGlzIGFjdHVhbGx5IGFib3V0IHRvIHNwYXduCiAgICAvLyBhbiBBZ2VudDsgZW1pdHRpbmcgcGVyLXByb21wdCBjb3N0IH45MCB0b2tlbnMgw5cgZXZlcnkgcHJvbXB0IMOXIGV2ZXJ5CiAgICAvLyBjb25zdW1lci4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoY29uZmlnLnRhc2tfY3JlYXRlX2ZpcnN0ICYmICFzLnRhc2tzQ3JlYXRlZCkgewogICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnUkVNSU5ERVI6IFVzZSBUYXNrQ3JlYXRlIGJlZm9yZSBzcGF3bmluZyBhZ2VudHMuXG4nKTsKICAgIH0KICAgIGlmIChjb25maWcubWVtb3J5X2ZpcnN0ICYmIHMubWVtb3J5UmVxdWlyZWQgJiYgIXMubWVtb3J5U2VhcmNoZWQpIHsKICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1JFTUlOREVSOiBTZWFyY2ggbWVtb3J5IChtY3BfX21vZmxvX19tZW1vcnlfc2VhcmNoKSBiZWZvcmUgc3Bhd25pbmcgYWdlbnRzLiBPbiBjaHVuayBoaXRzLCB0cmF2ZXJzZSB2aWEgbWNwX19tb2Zsb19fbWVtb3J5X2dldF9uZWlnaGJvcnMg4oCUIHNlZSAuY2xhdWRlL2d1aWRhbmNlL21vZmxvLW1lbW9yeS1wcm90b2NvbC5tZFxuJyk7CiAgICB9CiAgICBpZiAocy5sYXN0TmFtZXNwYWNlSGludCkgewogICAgICAvLyBQZXItYWN0b3Igc2luZ2xlLXNob3QuIEVhY2ggc2Vzc2lvbl9pZCBnZXRzIHRoZSBoaW50IGF0IG1vc3Qgb25jZSBwZXIKICAgICAgLy8gcHJvbXB0LCBidXQgdGhlIGhpbnQgaXRzZWxmIHN0YXlzIGF2YWlsYWJsZSBmb3Igb3RoZXIgYWN0b3JzIChlLmcuCiAgICAgIC8vIGEgc3ViYWdlbnQgdGhhdCBzcGF3bnMgaXRzIG93biBhZ2VudCBoYXMgaXRzIG93biBzZXNzaW9uX2lkIGFuZCBpcwogICAgICAvLyBlbnRpdGxlZCB0byBhIGZyZXNoIGVtaXNzaW9uKS4gRmFsbHMgYmFjayB0byBhIGBfbGVnYWN5X2AgYnVja2V0IHdoZW4KICAgICAgLy8gQ2xhdWRlIENvZGUgZGlkbid0IGZvcndhcmQgYSBzZXNzaW9uX2lkIChvbGRlciBob3N0IG9yIGRpcmVjdCBDTEkKICAgICAgLy8gaW52b2NhdGlvbiksIHByZXNlcnZpbmcgdGhlIG9sZCAiZW1pdCBvbmNlIGdsb2JhbGx5IiBiZWhhdmlvci4gVGhlCiAgICAgIC8vIG1hcCBpcyB3aXBlZCBieSBhcHBseVByb21wdFN0YXRlUmVzZXQgb24gZXZlcnkgbmV3IHByb21wdC4KICAgICAgdmFyIHNpZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRCB8fCAnJzsKICAgICAgdmFyIGVtaXR0ZWRCeSA9IHMubGFzdE5hbWVzcGFjZUhpbnRFbWl0dGVkQnkgfHwge307CiAgICAgIHZhciBidWNrZXQgPSBzaWQgfHwgJ19sZWdhY3lfJzsKICAgICAgaWYgKCFlbWl0dGVkQnlbYnVja2V0XSkgewogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHMubGFzdE5hbWVzcGFjZUhpbnQgKyAnXG4nKTsKICAgICAgICBlbWl0dGVkQnlbYnVja2V0XSA9IHRydWU7CiAgICAgICAgcy5sYXN0TmFtZXNwYWNlSGludEVtaXR0ZWRCeSA9IGVtaXR0ZWRCeTsKICAgICAgICB3cml0ZVN0YXRlKHMpOwogICAgICB9CiAgICB9CiAgICAvLyAjOTUyIOKAlCB3aGVuIC9mbCB3YXMgaW52b2tlZCB3aXRoIC1zLy1oLCB0aGUgcHJvdGVjdGVkIE1DUCBpbml0IG11c3QgcnVuCiAgICAvLyBCRUZPUkUgYW55IEFnZW50IHNwYXduLiBIYXJkIGJsb2NrOiB0aGUgdXNlciBleHBsaWNpdGx5IG9wdGVkIGluIHRvCiAgICAvLyBtb2ZsbydzIGNvb3JkaW5hdGlvbiBzdXJmYWNlLCBzbyBzaWxlbnRseSBkaXNwYXRjaGluZyBgQWdlbnRgIGNhbGxzCiAgICAvLyB3aXRob3V0IGBtY3BfX21vZmxvX19zd2FybV9pbml0YCAvIGBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdGAgaXMgdGhlCiAgICAvLyBmYWlsdXJlIG1vZGUgdGhpcyBnYXRlIGV4aXN0cyB0byBwcmV2ZW50IChDTEFVREUubWQgIuKblCBQcm90ZWN0ZWQKICAgIC8vIGZ1bmN0aW9uYWxpdHkg4oCUIHN3YXJtICsgaGl2ZS1taW5kIikuIE90aGVyIEFnZW50IHVzZXMgcmVtYWluIGFkdmlzb3J5LgogICAgaWYgKGNvbmZpZy5zd2FybV9pbnZvY2F0aW9uX2dhdGUpIHsKICAgICAgaWYgKHMuZmxNb2RlID09PSAnc3dhcm0nICYmICFzLnN3YXJtSW5pdGlhbGl6ZWQpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRDogL2ZsIHdhcyBpbnZva2VkIHdpdGggLXMvLS1zd2FybSBidXQgbWNwX19tb2Zsb19fc3dhcm1faW5pdCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1J1biBtY3BfX21vZmxvX19zd2FybV9pbml0IGZpcnN0LCB0aGVuIG1jcF9fbW9mbG9fX2FnZW50X3NwYXduIGZvciBlYWNoIHJvbGUsIHRoZW4gZGlzcGF0Y2ggQWdlbnQuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShDT09SRF9GQUxMQkFDS19OT1RFICsgJyAgbnB4IGZsbyBzd2FybSBpbml0IC0tdG9wb2xvZ3kgaGllcmFyY2hpY2FsICAodGhlbjogbnB4IGZsbyBhZ2VudCBzcGF3biAtLXR5cGUgPHJvbGU+KVxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1NlZSAuY2xhdWRlL3NraWxscy9mbC9leGVjdXRpb24tbW9kZXMubWQgIlNXQVJNIG1vZGUiIGFuZCBDTEFVREUubWQgIuKblCBQcm90ZWN0ZWQgZnVuY3Rpb25hbGl0eSIuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRGlzYWJsZSB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHN3YXJtX2ludm9jYXRpb25fZ2F0ZTogZmFsc2VcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgICAgfQogICAgICBpZiAocy5mbE1vZGUgPT09ICdoaXZlJyAmJiAhcy5oaXZlSW5pdGlhbGl6ZWQpIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRDogL2ZsIHdhcyBpbnZva2VkIHdpdGggLWgvLS1oaXZlIGJ1dCBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuJyk7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ1J1biBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCBmaXJzdCwgdGhlbiBkaXNwYXRjaCBBZ2VudCBvciBoaXZlLW1pbmQgd29ya2Vycy5cbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKENPT1JEX0ZBTExCQUNLX05PVEUgKyAnICBucHggZmxvIGhpdmUtbWluZCBpbml0ICAodGhlbjogbnB4IGZsbyBoaXZlLW1pbmQgc3Bhd24pXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnU2VlIC5jbGF1ZGUvc2tpbGxzL2ZsL2V4ZWN1dGlvbi1tb2Rlcy5tZCAiSElWRS1NSU5EIG1vZGUiIGFuZCBDTEFVREUubWQgIuKblCBQcm90ZWN0ZWQgZnVuY3Rpb25hbGl0eSIuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRGlzYWJsZSB2aWEgbW9mbG8ueWFtbDogZ2F0ZXM6IHN3YXJtX2ludm9jYXRpb25fZ2F0ZTogZmFsc2VcbicpOwogICAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1zd2FybS1pbml0JzogewogICAgLy8gIzk1MiDigJQgd2lyZWQgdG8gbWNwX19tb2Zsb19fc3dhcm1faW5pdCBQb3N0VG9vbFVzZS4gTWFya3MgdGhlIGdhdGUKICAgIC8vIHNhdGlzZmllZCBzbyBzdWJzZXF1ZW50IEFnZW50IHNwYXducyB1bmRlciAvZmwgLXMgcGFzcy4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMuc3dhcm1Jbml0aWFsaXplZCkgewogICAgICBzLnN3YXJtSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICB3cml0ZVN0YXRlKHMpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1iYXNoLXN3YXJtLWluaXQnOiB7CiAgICAvLyAjMTMzOCBmb2xsb3ctdXAg4oCUIHRoZSBDTEkgaGFsZiBvZiByZWNvcmQtc3dhcm0taW5pdCAvIHJlY29yZC1oaXZlLWluaXQuCiAgICAvLyBXaXJlZCBQb3N0VG9vbFVzZVtCYXNofFBvd2VyU2hlbGxdLCBzbyBpdCBvbmx5IHNlZXMgY29tbWFuZHMgdGhhdAogICAgLy8gc3VjY2VlZGVkICgjMTMyMikuIFNlZSBiYXNoQ29vcmRpbmF0aW9uSW5pdCBmb3Igd2h5IHRoZSBDTEkgcm91dGUgaXMgYQogICAgLy8gcmVhbCBzYXRpc2ZhY3Rpb24gb2YgdGhlICM5NTIgZ2F0ZSBhbmQgbm90IGEgc3RhbmQtaW4uCiAgICB2YXIga2luZCA9IGJhc2hDb29yZGluYXRpb25Jbml0KHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJyk7CiAgICBpZiAoIWtpbmQpIGJyZWFrOwogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIHZhciBmbGFnID0ga2luZCA9PT0gJ3N3YXJtJyA/ICdzd2FybUluaXRpYWxpemVkJyA6ICdoaXZlSW5pdGlhbGl6ZWQnOwogICAgaWYgKCFzW2ZsYWddKSB7CiAgICAgIHNbZmxhZ10gPSB0cnVlOwogICAgICB3cml0ZVN0YXRlKHMpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC1oaXZlLWluaXQnOiB7CiAgICAvLyAjOTUyIOKAlCB3aXJlZCB0byBtY3BfX21vZmxvX19oaXZlLW1pbmRfaW5pdCBQb3N0VG9vbFVzZS4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAoIXMuaGl2ZUluaXRpYWxpemVkKSB7CiAgICAgIHMuaGl2ZUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtc2Nhbic6IHsKICAgIGlmICghY29uZmlnLm1lbW9yeV9maXJzdCkgYnJlYWs7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLm1lbW9yeVJlcXVpcmVkIHx8IGlzTWVtb3J5U2VhcmNoZWRGb3IocykpIGJyZWFrOwogICAgdmFyIHRhcmdldCA9IChwcm9jZXNzLmVudi5UT09MX0lOUFVUX3BhdHRlcm4gfHwgJycpICsgJyAnICsgKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfcGF0aCB8fCAnJyk7CiAgICBpZiAoaXNFcGhlbWVyYWxQYXRoKHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfcGF0aCkpIGJyZWFrOwogICAgaWYgKEVYRU1QVC5zb21lKGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRhcmdldC5pbmRleE9mKHApID49IDA7IH0pKSBicmVhazsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdCTE9DS0VEIFttb2ZsbyBtZW1vcnlfZmlyc3QgZ2F0ZV06IFNlYXJjaCBtZW1vcnkgYmVmb3JlIGV4cGxvcmluZyBmaWxlcy4gVXNlIG1jcF9fbW9mbG9fX21lbW9yeV9zZWFyY2guIE9uIGNodW5rIGhpdHMsIHRyYXZlcnNlIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfZ2V0X25laWdoYm9ycyDigJQgc2VlIC5jbGF1ZGUvZ3VpZGFuY2UvbW9mbG8tbWVtb3J5LXByb3RvY29sLm1kXG4nICsgTUNQX0ZBTExCQUNLX05PVEUgKyAnXG4nICsgR0FURV9PUklHSU5fTk9URSArICdcbicgKyBHQVRFX0RJU0FCTEVfTk9URSArICdcbicpOwogICAgcHJvY2Vzcy5leGl0KDIpOwogIH0KICBjYXNlICdjaGVjay1iZWZvcmUtcmVhZCc6IHsKICAgIGlmICghY29uZmlnLm1lbW9yeV9maXJzdCkgYnJlYWs7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzLm1lbW9yeVJlcXVpcmVkIHx8IGlzTWVtb3J5U2VhcmNoZWRGb3IocykpIGJyZWFrOwogICAgdmFyIGZwID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9maWxlX3BhdGggfHwgJyc7CiAgICAvLyBFcGhlbWVyYWwgdG1wL3NjcmF0Y2ggcmVhZHMgYXJlIGV4ZW1wdCBldmVuIHdoZW4gdGhleSBsb29rIGxpa2UgZ3VpZGFuY2UKICAgIC8vIChhIHRlbXAgY29weSBpcyBzdGlsbCB0cmFuc2llbnQgdG9vbCBJL08sIG5vdCB0aGUgaW5kZXhlZCBzb3VyY2UpLgogICAgaWYgKGlzRXBoZW1lcmFsUGF0aChmcCkpIGJyZWFrOwogICAgdmFyIGlzR3VpZGFuY2UgPSBmcC5pbmRleE9mKCcuY2xhdWRlL2d1aWRhbmNlLycpID49IDAgfHwgZnAuaW5kZXhPZignLmNsYXVkZVxcZ3VpZGFuY2VcXCcpID49IDA7CiAgICBpZiAoIWlzR3VpZGFuY2UgJiYgRVhFTVBULnNvbWUoZnVuY3Rpb24ocCkgeyByZXR1cm4gZnAuaW5kZXhPZihwKSA+PSAwOyB9KSkgYnJlYWs7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRCBbbW9mbG8gbWVtb3J5X2ZpcnN0IGdhdGVdOiBTZWFyY2ggbWVtb3J5IGJlZm9yZSByZWFkaW5nIGZpbGVzLiBVc2UgbWNwX19tb2Zsb19fbWVtb3J5X3NlYXJjaC4gT24gY2h1bmsgaGl0cywgdHJhdmVyc2UgdmlhIG1jcF9fbW9mbG9fX21lbW9yeV9nZXRfbmVpZ2hib3JzIOKAlCBzZWUgLmNsYXVkZS9ndWlkYW5jZS9tb2Zsby1tZW1vcnktcHJvdG9jb2wubWRcbicgKyBNQ1BfRkFMTEJBQ0tfTk9URSArICdcbicgKyBHQVRFX09SSUdJTl9OT1RFICsgJ1xuJyArIEdBVEVfRElTQUJMRV9OT1RFICsgJ1xuJyk7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgfQogIGNhc2UgJ3JlY29yZC10YXNrLWNyZWF0ZWQnOiB7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgcy50YXNrc0NyZWF0ZWQgPSB0cnVlOwogICAgcy50YXNrQ291bnQgPSAocy50YXNrQ291bnQgfHwgMCkgKyAxOwogICAgd3JpdGVTdGF0ZShzKTsKICAgIGJyZWFrOwogIH0KICAvLyAjMTQzNSDigJQgdGhlIGVzY2FwZSBmcm9tIHRoZSB0YXNrLXN0YXR1cyBnYXRlLCBmb3Igd29yayBkZWxpYmVyYXRlbHkgbGVmdAogIC8vIG9wZW4uIFNlc3Npb24tc2NvcGVkIGxpa2UgYGxlYXJuaW5nc1N0b3JlZGA6IGl0IGxpdmVzIGluIFNUQVRFX0RFRkFVTFRTLCBzbwogIC8vIHNlc3Npb24tcmVzZXQgY2xlYXJzIGl0LCBhbmQgbmVpdGhlciBhcHBseVByb21wdFN0YXRlUmVzZXQgbm9yCiAgLy8gcmVzZXQtZWRpdC1nYXRlcyB0b3VjaGVzIGl0IOKAlCBhIGRlY2lzaW9uIHRoZSB1c2VyIG1hZGUgYWJvdXQgdGhlIHRhc2sgbGlzdAogIC8vIGlzIG5vdCBpbnZhbGlkYXRlZCBieSB0aGUgbmV4dCBwcm9tcHQgb3IgdGhlIG5leHQgc291cmNlIGVkaXQuCiAgLy8KICAvLyBBIHBsYWluIGZsYWcsIG5vdCBhIGNvdW50LiBUaGUgY29tbWFuZCBpcyB0eXBlZCBieSB0aGUgbW9kZWwgaW50byBhIEJhc2gKICAvLyB0b29sLCB3aGVyZSBIT09LX1RSQU5TQ1JJUFRfUEFUSCBpcyB1bnNldCAoaXQgaXMgZm9yd2FyZGVkIGJ5IGdhdGUtaG9vay5tanMKICAvLyBmcm9tIHRoZSBob29rIHBheWxvYWQgYW5kIGV4aXN0cyBvbmx5IGluc2lkZSBhIGhvb2spLCBzbyB0aGlzIHByb2Nlc3MgY2Fubm90CiAgLy8gcmVhZCB0aGUgbGVkZ2VyIHRvIHJlY29yZCBXSElDSCB0YXNrcyB3ZXJlIGFja25vd2xlZGdlZCBldmVuIGlmIGl0IHdhbnRlZCB0by4KICBjYXNlICdyZWNvcmQtdGFza3MtYWNrbm93bGVkZ2VkJzogewogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy50YXNrc0Fja25vd2xlZGdlZCkgewogICAgICBzLnRhc2tzQWNrbm93bGVkZ2VkID0gdHJ1ZTsKICAgICAgd3JpdGVTdGF0ZShzKTsKICAgIH0KICAgIC8vIHdyaXRlU3RhdGUgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMgYnkgZGVzaWduIOKAlCBhIGdhdGUgbXVzdCBuZXZlciBjcmFzaCB0aGUKICAgIC8vIGhvb2sgaXQgcnVucyBpbi4gVGhhdCB3YXMgaGFybWxlc3Mgd2hpbGUgZXZlcnkgcmVjb3JkZXIgd2FzIGFkdmlzb3J5LiBUaGlzCiAgICAvLyBvbmUgaXMgdGhlIE9OTFkgZXNjYXBlIGZyb20gYSBCTE9DS0lORyBnYXRlLCBzbyBhIGxvc3Qgd3JpdGUgd291bGQgcmVwb3J0CiAgICAvLyAic2F0aXNmaWVkIiBhbmQgdGhlbiBibG9jayB0aGUgdmVyeSBuZXh0IGBnaCBwciBjcmVhdGVgIHdpdGggbm90aGluZyBzYWlkCiAgICAvLyBhYm91dCB3aHk6ICMxMzMyJ3MgZGVhZGxvY2sgc2hhcGUgZXhhY3RseS4gQ29uZmlybSBpdCBsYW5kZWQgYmVmb3JlCiAgICAvLyBjbGFpbWluZyBpdCBkaWQsIGFuZCBuYW1lIHRoZSBmaWxlIGFuZCB0aGUgd2F5IG91dCB3aGVuIGl0IGRpZCBub3QuCiAgICBpZiAoIXJlYWRTdGF0ZSgpLnRhc2tzQWNrbm93bGVkZ2VkKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICdUYXNrLXN0YXR1cyBnYXRlIE5PVCBzYXRpc2ZpZWQ6IHRoZSBhY2tub3dsZWRnZW1lbnQgY291bGQgbm90IGJlIHBlcnNpc3RlZCB0b1xuJyArCiAgICAgICAgU1RBVEVfRklMRSArICdcbicgKwogICAgICAgICdDaGVjayB0aGF0IHRoZSBmaWxlIGFuZCBpdHMgZGlyZWN0b3J5IGFyZSB3cml0YWJsZSwgdGhlbiBydW4gdGhpcyBhZ2Fpbi5cbicgKwogICAgICAgICdUbyBwcm9jZWVkIHdpdGhvdXQgaXQ6IHNldCBnYXRlczogdGFza19zdGF0dXNfZ2F0ZTogb2ZmIGluIG1vZmxvLnlhbWwuXG4nKTsKICAgICAgcHJvY2Vzcy5leGl0KDEpOwogICAgfQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoCiAgICAgICdUYXNrLXN0YXR1cyBnYXRlIHNhdGlzZmllZDogb3BlbiB0YXNrcyBhY2tub3dsZWRnZWQgYXMgZGVsaWJlcmF0ZWx5IGRlZmVycmVkLlxuJyArCiAgICAgICdUaGV5IHN0YXkgdmlzaWJsZSBpbiB0aGUgdGFzayBsaXN0IOKAlCB0aGlzIHJlY29yZHMgdGhlIGRlY2lzaW9uLCBpdCBkb2VzIG5vdCBjbG9zZSB0aGVtLlxuJyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLW1lbW9yeS1zZWFyY2hlZCc6IHsKICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICBpZiAobWFya01lbW9yeVNlYXJjaGVkKHMpKSB3cml0ZVN0YXRlKHMpOwogICAgYnJlYWs7CiAgfQogIGNhc2UgJ2NoZWNrLWJhc2gtbWVtb3J5JzogewogICAgLy8gIzExMzIg4oCUIHByZXNlcnZlIENSRURJVCBzaWRlLWVmZmVjdCBBTkQgYWRkIGEgQkxPQ0sgYXJtIGZvciByZWFkLWxpa2UKICAgIC8vIEJhc2ggY29tbWFuZHMuIFdpcmVkIGFzIFByZVRvb2xVc2VbQmFzaF0gKHdhcyBQb3N0VG9vbFVzZSBiZWZvcmUgIzExMzIpCiAgICAvLyBzbyBwcm9jZXNzLmV4aXQoMikgYWN0dWFsbHkgcHJldmVudHMgdGhlIHJlYWQgZnJvbSByZWFjaGluZyB0aGUgc2hlbGwuCiAgICAvLwogICAgLy8gIzExNzEg4oCUIHRoZSBjYXNlIG5hbWUgaXMgaGlzdG9yaWNhbC4gVGhlIG1hdGNoZXIgbm93IGFsc28gY292ZXJzIHRoZQogICAgLy8gZGVkaWNhdGVkIGBQb3dlclNoZWxsYCB0b29sLCBhbmQgUkVBRF9MSUtFX0JBU0hfUkUgYWxyZWFkeSBtYXRjaGVkIFBTCiAgICAvLyByZWFkZXJzIChHZXQtQ29udGVudC9TZWxlY3QtU3RyaW5nL0dldC1DaGlsZEl0ZW0gLVJlY3Vyc2UvRm9ybWF0LUhleCkuCiAgICAvLyBUcmVhdCB0aGlzIGNhc2UgYXMgc2hlbGwtYWdub3N0aWMgcmVhZC1nYXRlIGxvZ2ljLgogICAgdmFyIGNtZCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJzsKCiAgICAvLyAxKSBDUkVESVQg4oCUIHByZXNlcnZlZCBiZWhhdmlvci4gQSByZWFsIG1lbW9yeS1zZWFyY2ggaW52b2NhdGlvbiBmbGlwcwogICAgLy8gdGhlIGdhdGUgZmxhZyBzbyBzdWJzZXF1ZW50IFJlYWQvR3JlcC9HbG9iIHdpdGhpbiB0aGlzIHByb21wdCBwYXNzLgogICAgaWYgKGNyZWRpdHNNZW1vcnlTZWFyY2goY21kKSkgewogICAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgICBpZiAobWFya01lbW9yeVNlYXJjaGVkKHMpKSB3cml0ZVN0YXRlKHMpOwogICAgICBicmVhazsKICAgIH0KCiAgICAvLyAyKSBCTE9DSyDigJQgbmV3IGJlaGF2aW9yLiBDaGVhcCByZWdleCBjaGVja3MgY29tZSBCRUZPUkUgcmVhZFN0YXRlKCkgc28KICAgIC8vIHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgb2YgQmFzaCBpbnZvY2F0aW9ucyAoZ2l0L25wbS9jdXJsL2VjaG8vZXRjLikKICAgIC8vIG5ldmVyIHRvdWNoIHRoZSBmaWxlc3lzdGVtLiBPcmRlcjogY29uZmlnIGZsYWcg4oaSIGNvbW1hbmQtc2hhcGUgcmVnZXhlcwogICAgLy8g4oaSIHN0YXRlIHJlYWQg4oaSIG1lbW9yeSBnYXRlLgogICAgaWYgKCFjb25maWcubWVtb3J5X2ZpcnN0KSBicmVhazsKICAgIGlmICghUkVBRF9MSUtFX0JBU0hfUkUudGVzdChjbWQpKSBicmVhazsKICAgIC8vICMxNDQ1IOKAlCB0aGUgY2FydmUtb3V0IGlzIGFuY2hvcmVkIHRvIHRoZSBMRUFESU5HIGNvbW1hbmQsIHNvIGl0cyBgbm9kZWAKICAgIC8vIGFuZCBgZ2l0YCBhcm1zIHN3YWxsb3cgZXZlcnkgc2hhcGUgUlVOTkVSX1JFQURfU09VUkNFUyBleGlzdHMgdG8gY2F0Y2guCiAgICAvLyBUaG9zZSBzaGFwZXMgZWFybiB0aGVpciByZWFkIGNsYXNzaWZpY2F0aW9uIGZyb20gd2hhdCBmb2xsb3dzIHRoZSBsZWFkaW5nCiAgICAvLyB0b2tlbiwgc28gdGhleSBvdmVycmlkZSB0aGUgY2FydmUtb3V0OyBldmVyeSBvdGhlciBjb21tYW5kIGtlZXBzICMxMTMyJ3MKICAgIC8vIHNlbWFudGljcyBleGFjdGx5IChgbnBtIHRlc3QgfCBncmVwIEZBSUxgLCBgZ2l0IGRpZmZgLCBgbm9kZSBidWlsZC5tanNgKS4KICAgIGlmIChCQVNIX0NBUlZFX09VVF9SRS50ZXN0KGNtZCkgJiYgIVJVTk5FUl9SRUFEX0JBU0hfUkUudGVzdChjbWQpKSBicmVhazsKICAgIHZhciBzMiA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzMi5tZW1vcnlSZXF1aXJlZCB8fCBpc01lbW9yeVNlYXJjaGVkRm9yKHMyKSkgYnJlYWs7CiAgICAvLyBIaW50IHByZWNlZGVuY2U6IHByb21wdC1kZXJpdmVkIGNsYXNzaWZpY2F0aW9uIChzZXQgYnkgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0CiAgICAvLyBmcm9tIHRoZSB1c2VyIHByb21wdCB0ZXh0KSDihpIgY29tbWFuZC1zaGFwZSBjbGFzc2lmaWNhdGlvbiAod29ya3MgZm9yCiAgICAvLyBzdWJhZ2VudHMgdGhhdCBuZXZlciBzYXcgdGhlIHVzZXIgcHJvbXB0KS4gRWl0aGVyIHNvdXJjZSByZXR1cm5zIGEgZnVsbAogICAgLy8gIk1lbW9yeSBuYW1lc3BhY2UgaGludDogLi4uIiBzZW50ZW5jZSBzbyB0aGUgQkxPQ0sgbWVzc2FnZSBzdGF5cyB1bmlmb3JtLgogICAgdmFyIGhpbnQgPSBzMi5sYXN0TmFtZXNwYWNlSGludCB8fCBjbGFzc2lmeUJhc2hOYW1lc3BhY2VIaW50KGNtZCkgfHwgJyc7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgJ0JMT0NLRUQgW21vZmxvIG1lbW9yeV9maXJzdCBnYXRlXTogU2VhcmNoIG1lbW9yeSBiZWZvcmUgcmVhZGluZyBmaWxlcyB2aWEgQmFzaC5cbicgKwogICAgICAnRXhhbXBsZTogbWNwX19tb2Zsb19fbWVtb3J5X3NlYXJjaCB7IHF1ZXJ5OiAiPHRvcGljPiIsIG5hbWVzcGFjZTogIjxvbmUgb2Y6IGd1aWRhbmNlIHwgY29kZS1tYXAgfCBwYXR0ZXJucyB8IGxlYXJuaW5ncyB8IHRlc3RzPiIgfVxuJyArCiAgICAgIChoaW50ID8gaGludCArICdcbicgOiAnJykgKwogICAgICAnT24gY2h1bmsgaGl0cywgdHJhdmVyc2UgdmlhIG1jcF9fbW9mbG9fX21lbW9yeV9nZXRfbmVpZ2hib3JzIOKAlCBzZWUgLmNsYXVkZS9ndWlkYW5jZS9tb2Zsby1tZW1vcnktcHJvdG9jb2wubWRcbicgKwogICAgICBNQ1BfRkFMTEJBQ0tfTk9URSArICdcbicgKwogICAgICBHQVRFX09SSUdJTl9OT1RFICsgJ1xuJyArCiAgICAgIEdBVEVfRElTQUJMRV9OT1RFICsgJ1xuJwogICAgKTsKICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdjaGVjay10YXNrLXRyYW5zaXRpb24nOiB7CiAgICAvLyBJbnRlbnRpb25hbCBuby1vcCwgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkgKCMxMzMxKS4KICAgIC8vIFRoZSBgXlRhc2tVcGRhdGUkYCB3aXJpbmcgd2FzIHJlbW92ZWQgZnJvbSBzZXR0aW5ncy1nZW5lcmF0b3IudHMsCiAgICAvLyBob29rLWJsb2NrLWhhc2gudHMgYW5kIGhvb2std2lyaW5nLnRzIGJlY2F1c2Ugc3Bhd25pbmcgZ2F0ZS1ob29rLm1qcyArCiAgICAvLyBnYXRlLmNqcyBvbiBldmVyeSBUYXNrVXBkYXRlIHRvIGRvIG5vdGhpbmcgaXMgcHVyZSBvdmVyaGVhZC4gVGhlIGNhc2UKICAgIC8vIHN0YXlzIGJlY2F1c2UgZG9jdG9yLWNoZWNrcy1kZWVwLnRzIGxpc3RzIGl0IGluIFJFUVVJUkVEX0dBVEVfQ0FTRVMg4oCUCiAgICAvLyBkcm9wcGluZyB0aGUgY2FzZSB3b3VsZCB0dXJuIGBmbG8gZG9jdG9yYCdzIEdhdGUgSGVhbHRoIGNoZWNrIHJlZCBpbgogICAgLy8gZXZlcnkgY29uc3VtZXIgZm9yIG5vIGdhaW4uIChGYWxsaW5nIHRocm91Z2ggdG8gYGRlZmF1bHQ6IGJyZWFrYCB3b3VsZAogICAgLy8gb3RoZXJ3aXNlIGJlIGhhcm1sZXNzOyB0aGlzIGlzIGFib3V0IHRoZSBkb2N0b3IgY29udHJhY3QsIG5vdCBydW50aW1lLikKICAgIC8vIFdoeSBpdCBkb2VzIG5vdGhpbmc6IHNlZSBhcHBseVByb21wdFN0YXRlUmVzZXQoKS4KICAgIGJyZWFrOwogIH0KICAvLyAjMTQzNCDigJQgdGhlIGdhdGUgZGVtYW5kZWQgb25lIG1lbW9yeV9zdG9yZSBwZXIgcnVuIHdoZXRoZXIgb3Igbm90IHRoZSBydW4KICAvLyBwcm9kdWNlZCBhIHJldXNhYmxlIGxlc3NvbiwgYW5kIGEgbWFuZGF0b3J5IHdyaXRlIHdpdGggbm90aGluZyB0byBzYXkKICAvLyBwcm9kdWNlcyBmaWxsZXI6IGEgc3VtbWFyeSBvZiB0aGlzIHRpY2tldCwgdGhpcyBjb21taXQsIGFwcGxpY2FibGUgbmV2ZXIKICAvLyBhZ2Fpbi4gbWVtb3J5X3NlYXJjaCByZXR1cm5zIGEgYm91bmRlZCBzZXQsIHNvIGVhY2ggb2YgdGhvc2UgZGlzcGxhY2VzIGEKICAvLyByZWFsIGxlc3NvbiBmcm9tIGV2ZXJ5IGZ1dHVyZSBzZWFyY2gg4oCUIHRoZSBjb3N0IGlzIHJldHJpZXZhbCBxdWFsaXR5LCBub3QKICAvLyBkaXNrLiBEZWNsYXJpbmcgIm5vdGhpbmcgZHVyYWJsZSBoZXJlIiBpcyB0aGUgaG9uZXN0IG91dGNvbWUgb2YgYSBydW4gdGhhdAogIC8vIGxlYXJuZWQgbm90aGluZyBuZXcsIHNvIGl0IGhhcyB0byBiZSByZWFjaGFibGUgd2l0aG91dCBhIHdyaXRlOyBvdGhlcndpc2UKICAvLyB0aGUgY2hlYXBlc3Qgd2F5IHBhc3QgdGhlIGdhdGUgc3RheXMgdGhlIGZpbGxlciB3cml0ZS4KICAvLwogIC8vIEJvdGggY3JlZGl0cyBzZXQgdGhlIHNhbWUgZmxhZzsgdGhleSBkaWZmZXIgb25seSBpbiB3aGV0aGVyIHRoZSBydW4gaGFzCiAgLy8gc29tZXRoaW5nIHRvIHNheS4gU2hhcmluZyB0aGUgY2FzZSBib2R5IGtlZXBzIHRoYXQgc2luZ2xlIHdyaXRlIGluIG9uZQogIC8vIHBsYWNlIGFjcm9zcyBhbGwgdGhyZWUgY29waWVzIG9mIHRoaXMgZmlsZS4KICBjYXNlICdyZWNvcmQtbGVhcm5pbmdzLXN0b3JlZCc6CiAgY2FzZSAncmVjb3JkLW5vLWR1cmFibGUtbGVzc29uJzogewogICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgIGlmICghcy5sZWFybmluZ3NTdG9yZWQpIHsKICAgICAgcy5sZWFybmluZ3NTdG9yZWQgPSB0cnVlOwogICAgICB3cml0ZVN0YXRlKHMpOwogICAgfQogICAgaWYgKGNvbW1hbmQgPT09ICdyZWNvcmQtbm8tZHVyYWJsZS1sZXNzb24nKSB7CiAgICAgIC8vIFNhbWUgcmVhc29uaW5nIGFzIHJlY29yZC10YXNrcy1hY2tub3dsZWRnZWQgYWJvdmU6IHdyaXRlU3RhdGUgc3dhbGxvd3MKICAgICAgLy8gaXRzIG93biBlcnJvcnMgc28gYSBnYXRlIG5ldmVyIGNyYXNoZXMgdGhlIGhvb2sgaXQgcnVucyBpbiwgYW5kIHRoaXMgaXMKICAgICAgLy8gdGhlIE9OTFkgZXNjYXBlIGZyb20gdGhlIEJMT0NLSU5HIGxlYXJuaW5ncyBnYXRlIHRoYXQgZG9lcyBub3QgcmVxdWlyZSBhCiAgICAgIC8vIG1lbW9yeV9zdG9yZS4gQSBsb3N0IHdyaXRlIGhlcmUgd291bGQgcHJpbnQgInNhdGlzZmllZCIgYW5kIHRoZW4gYmxvY2sKICAgICAgLy8gdGhlIG5leHQgYGdoIHByIGNyZWF0ZWAgd2l0aCBub3RoaW5nIHNhaWQgYWJvdXQgd2h5IOKAlCAjMTMzMidzIGRlYWRsb2NrLgogICAgICAvLyBWZXJpZmllZCBvbmx5IG9uIHRoaXMgYXJtOiByZWNvcmQtbGVhcm5pbmdzLXN0b3JlZCBpcyBmaXJlZAogICAgICAvLyBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBQb3N0VG9vbFVzZSBob29rIG9uIGV2ZXJ5IG1lbW9yeV9zdG9yZSwgd2hlcmUgYQogICAgICAvLyBmYWlsZWQgd3JpdGUgbGVhdmVzIHRoZSBnYXRlIGNsb3NlZCBidXQgdGhlIHJ1biBzdGlsbCBoYXMgdGhlIG9yZGluYXJ5CiAgICAgIC8vIHdheSB0aHJvdWdoLCBhbmQgYSBkaWFnbm9zdGljIG9uIGV2ZXJ5IHN0b3JlIHdvdWxkIGJlIG5vaXNlLgogICAgICBpZiAoIXJlYWRTdGF0ZSgpLmxlYXJuaW5nc1N0b3JlZCkgewogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICAgJ0xlYXJuaW5ncyBnYXRlIE5PVCBzYXRpc2ZpZWQ6IHRoZSBkZWNsYXJhdGlvbiBjb3VsZCBub3QgYmUgcGVyc2lzdGVkIHRvXG4nICsKICAgICAgICAgIFNUQVRFX0ZJTEUgKyAnXG4nICsKICAgICAgICAgICdDaGVjayB0aGF0IHRoZSBmaWxlIGFuZCBpdHMgZGlyZWN0b3J5IGFyZSB3cml0YWJsZSwgdGhlbiBydW4gdGhpcyBhZ2Fpbi5cbicgKwogICAgICAgICAgJ1RvIHByb2NlZWQgd2l0aG91dCBpdDogc2V0IGdhdGVzOiBsZWFybmluZ3NfZ2F0ZTogZmFsc2UgaW4gbW9mbG8ueWFtbC5cbicpOwogICAgICAgIHByb2Nlc3MuZXhpdCgxKTsKICAgICAgfQogICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgKICAgICAgICAnTGVhcm5pbmdzIGdhdGUgc2F0aXNmaWVkOiBubyBkdXJhYmxlIGxlc3NvbiBkZWNsYXJlZCBmb3IgdGhpcyBydW4uXG4nICsKICAgICAgICAnV2hhdCB0aGlzIHJ1biBkaWQgYmVsb25ncyBpbiB0aGUgUFIgYm9keSwgbm90IGluIG1lbW9yeS5cbicsCiAgICAgICk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLXRlc3QtcnVuJzogewogICAgdmFyIGNtZCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJzsKICAgIGlmIChURVNUX1JVTk5FUl9SRS50ZXN0KGNtZCkpIHsKICAgICAgLy8gIzEzMjIg4oCUIGEgcmVkIHJ1biBpcyBldmlkZW5jZSBBR0FJTlNUIHRoZSBnYXRlLCBzbyBpdCBhbHNvIGNsZWFycyBhCiAgICAgIC8vIGZsYWcgYW4gZWFybGllciBncmVlbiBydW4gZWFybmVkLiBXaXRob3V0IHRoZSByZXNldCwgYG5wbSB0ZXN0YCAoZ3JlZW4pCiAgICAgIC8vIGZvbGxvd2VkIGJ5IGFuIGVkaXQgYW5kIGBucG0gdGVzdCB8IHRhaWwgLTIwYCAocmVkKSB3b3VsZCBsZWF2ZSB0aGUKICAgICAgLy8gZ2F0ZSBzYXRpc2ZpZWQgYnkgdGhlIHN0YWxlIGZpcnN0IHJ1biDigJQgdGhlIGVkaXQgcmVzZXRzIHRlc3RzUnVuLCBidXQKICAgICAgLy8gdGhlIG1hc2tlZCByZWQgcnVuIHdvdWxkIGltbWVkaWF0ZWx5IHNldCBpdCBiYWNrLgogICAgICB2YXIgZmFpbHVyZSA9IGRldGVjdFRlc3RGYWlsdXJlKCk7CiAgICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICAgIGlmIChmYWlsdXJlKSB7CiAgICAgICAgaWYgKHMudGVzdHNSdW4pIHsgcy50ZXN0c1J1biA9IGZhbHNlOyBzLnRlc3RzRmluZ2VycHJpbnQgPSBudWxsOyB3cml0ZVN0YXRlKHMpOyB9CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC10ZXN0LXJ1biBub3QgY3JlZGl0ZWQg4oCUICcgKyBmYWlsdXJlICsgJ1xuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUmUtc3RhbXAgb24gZXZlcnkgZ3JlZW4gcnVuLCBub3Qgb25seSB0aGUgZmlyc3Q6IHRoZSB0cmVlIG1heSBoYXZlCiAgICAgICAgLy8gbW92ZWQgc2luY2UgdGhlIGxhc3Qgb25lLCBhbmQgdGhpcyBydW4gaXMgZXZpZGVuY2UgYWJvdXQgdGhlIHRyZWUgYXMKICAgICAgICAvLyBpdCBpcyBOT1cuIEdhdGluZyBvbiBgIXMudGVzdHNSdW5gIHdvdWxkIGtlZXAgdGhlIG9sZGVyIGZpbmdlcnByaW50CiAgICAgICAgLy8gYW5kIGRpc2NhcmQgdGhlIGZyZXNoZXIgZXZpZGVuY2UuCiAgICAgICAgdmFyIHRlc3RzRnAgPSBjcmVkaXRGaW5nZXJwcmludCgnYWxsJyk7CiAgICAgICAgaWYgKCFzLnRlc3RzUnVuIHx8IHMudGVzdHNGaW5nZXJwcmludCAhPT0gdGVzdHNGcCkgewogICAgICAgICAgcy50ZXN0c1J1biA9IHRydWU7CiAgICAgICAgICBzLnRlc3RzRmluZ2VycHJpbnQgPSB0ZXN0c0ZwOwogICAgICAgICAgd3JpdGVTdGF0ZShzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY21kKSB7CiAgICAgIC8vICMxMTc2IOKAlCBlbWl0IGEgc3RkZXJyIGNydW1iIHdoZW4gaW52b2tlZCB3aXRoIGEgbm9uLWVtcHR5IGNvbW1hbmQgdGhhdAogICAgICAvLyBkb2Vzbid0IG1hdGNoIHRoZSB0ZXN0LXJ1bm5lciBwYXR0ZXJuLiBDb21tb24gcGl0ZmFsbDogdXNlcnMgcnVuIHRoZQogICAgICAvLyBzdGFtcCBtYW51YWxseSBmcm9tIGEgdGVybWluYWwgdG8gInNhdGlzZnkgdGhlIGdhdGUiOyB0aGUgc2lsZW50IG5vLW9wCiAgICAgIC8vIGxvb2tzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gc3VjY2Vzcy4gZ2F0ZS1ob29rLm1qcyBkcm9wcyBzdGRlcnIgZnJvbQogICAgICAvLyBleGl0LTAgaW52b2NhdGlvbnMsIHNvIHRoaXMgb25seSBzdXJmYWNlcyB0byBkaXJlY3QgQ0xJIHVzZSDigJQgZXhhY3RseQogICAgICAvLyB0aGUgY2FzZSB3aGVyZSB0aGUgZnJpY3Rpb24gbGl2ZXMuCiAgICAgIHZhciBwcmV2aWV3ID0gY21kLmxlbmd0aCA+IDgwID8gY21kLnNsaWNlKDAsIDc3KSArICcuLi4nIDogY21kOwogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXRlc3QtcnVuIG5vLW9wIOKAlCBUT09MX0lOUFVUX2NvbW1hbmQ9IicgKyBwcmV2aWV3ICsgJyIgZGlkIG5vdCBtYXRjaCBURVNUX1JVTk5FUl9SRVxuJyk7CiAgICB9CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVjb3JkLXNraWxsLXJ1bic6IHsKICAgIHZhciBza05hbWUgPSAocHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9za2lsbCB8fCAnJyk7CiAgICBpZiAoc2tOYW1lID09PSAnc2ltcGxpZnknIHx8IHNrTmFtZSA9PT0gJ2Zsby1zaW1wbGlmeScgfHwgc2tOYW1lID09PSAnZGlzdGlsbCcpIHsKICAgICAgdmFyIHMgPSByZWFkU3RhdGUoKTsKICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTsKICAgICAgaWYgKCFzLnNpbXBsaWZ5UnVuKSB7IHMuc2ltcGxpZnlSdW4gPSB0cnVlOyBjaGFuZ2VkID0gdHJ1ZTsgfQogICAgICAvLyAnbm9udGVzdCcgc2NvcGU6IGEgbGF0ZXIgdGVzdC1vbmx5IGVkaXQgbXVzdCBub3QgaW52YWxpZGF0ZSB0aGlzIHJldmlldwogICAgICAvLyAoIzkwOCksIHNvIHRlc3QgZmlsZXMgYXJlIGV4Y2x1ZGVkIGZyb20gd2hhdCB0aGUgY3JlZGl0IGlzIHBpbm5lZCB0by4KICAgICAgdmFyIHNpbXBsaWZ5RnAgPSBjcmVkaXRGaW5nZXJwcmludCgnbm9udGVzdCcpOwogICAgICBpZiAocy5zaW1wbGlmeUZpbmdlcnByaW50ICE9PSBzaW1wbGlmeUZwKSB7IHMuc2ltcGxpZnlGaW5nZXJwcmludCA9IHNpbXBsaWZ5RnA7IGNoYW5nZWQgPSB0cnVlOyB9CiAgICAgIC8vIFNuYXBzaG90IEhFQUQgc28gY2hlY2stYmVmb3JlLXByIGNhbiBjbGFzc2lmeSBkZWx0YS1zaW5jZS1zaW1wbGlmeSBhbmQKICAgICAgLy8gc2tpcCBhIHJlZHVuZGFudCAvc2ltcGxpZnkgcmUtcnVuIHdoZW4gb25seSB0cml2aWFsIGZpeGVzIGZvbGxvd2VkLgogICAgICAvLyBOb24tZmF0YWwg4oCUIGdhdGUgZmFsbHMgdGhyb3VnaCB0byBjdXJyZW50IGJlaGF2aW91ciB3aXRob3V0IHRoZSBzbmFwc2hvdC4KICAgICAgdHJ5IHsKICAgICAgICB2YXIgc2hhID0gY3AuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ3Jldi1wYXJzZScsICdIRUFEJ10sIHsKICAgICAgICAgIGN3ZDogUFJPSkVDVF9ESVIsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiAyMDAwLCB3aW5kb3dzSGlkZTogdHJ1ZSwKICAgICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddCiAgICAgICAgfSkudHJpbSgpOwogICAgICAgIGlmIChzaGEgJiYgcy5zaW1wbGlmeVNuYXBzaG90U2hhICE9PSBzaGEpIHsgcy5zaW1wbGlmeVNuYXBzaG90U2hhID0gc2hhOyBjaGFuZ2VkID0gdHJ1ZTsgfQogICAgICB9IGNhdGNoIChlKSB7IC8qIG5vIGdpdCBvciBkZXRhY2hlZCBzdGF0ZSDigJQgc2tpcCBzbmFwc2hvdCwgZ2F0ZSBzdGlsbCB3b3JrcyAqLyB9CiAgICAgIGlmIChjaGFuZ2VkKSB3cml0ZVN0YXRlKHMpOwogICAgfSBlbHNlIGlmIChza05hbWUpIHsKICAgICAgLy8gIzExNzYg4oCUIHNhbWUgcmF0aW9uYWxlIGFzIHJlY29yZC10ZXN0LXJ1bi4gQSBuby1vcCBzdGFtcCBvbiBhIG5vbi1zaW1wbGlmeQogICAgICAvLyBza2lsbCBuYW1lIGlzIHNpbGVudCB0byBob29rcyAoZ2F0ZS1ob29rLm1qcyBkcm9wcyBleGl0LTAgc3RkZXJyKSBidXQKICAgICAgLy8gdmlzaWJsZSB3aGVuIGEgdXNlciBydW5zIHRoZSBzdGFtcCBkaXJlY3RseSB0byAic2F0aXNmeSB0aGUgZ2F0ZSIgYW5kCiAgICAgIC8vIHdvbmRlcnMgd2h5IHNpbXBsaWZ5UnVuIHN0YXlzIGZhbHNlLgogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXNraWxsLXJ1biBuby1vcCDigJQgVE9PTF9JTlBVVF9za2lsbD0iJyArIHNrTmFtZSArICciIGlzIG5vdCBzaW1wbGlmeS9mbG8tc2ltcGxpZnlcbicpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3JlY29yZC12ZXJpZnktcnVuJzogewogICAgLy8gU3RvcnkgIzEyNzQgKEVwaWMgIzEyNjkpLiBGaXJlcyBQb3N0VG9vbFVzZSBvbiBeU2tpbGwkIHdoZW4gdGhlIG5hdGl2ZQogICAgLy8gL3ZlcmlmeSBza2lsbCBydW5zLCBzYXRpc2Z5aW5nIHRoZSB2ZXJpZnktYmVmb3JlLWRvbmUgZ2F0ZS4gTWlycm9ycwogICAgLy8gcmVjb3JkLXNraWxsLXJ1bidzIGZhdWx0LXRvbGVyYW50IHNoYXBlLiBUaGUgdmVyaWZpY2F0aW9uIE9VVENPTUUgKHdoYXQKICAgIC8vIHdhcyBjaGVja2VkLCBwYXNzL2ZhaWwpIGlzIHdyaXR0ZW4gdG8gbWVtb3J5IGJ5IHRoZSB2ZXJpZnkgZmxvdyBpdHNlbGYKICAgIC8vIHZpYSBtY3BfX21vZmxvX19tZW1vcnlfc3RvcmUg4oCUIHNhbWUgZGl2aXNpb24gb2YgbGFib3VyIGFzIHRlc3RzUnVuIHZzIHRoZQogICAgLy8gdGVzdCBvdXRwdXQ7IHRoaXMgcmVjb3JkZXIgb25seSB0cmFja3MgdGhhdCB2ZXJpZmljYXRpb24gaGFwcGVuZWQuCiAgICB2YXIgdk5hbWUgPSAocHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9za2lsbCB8fCAnJyk7CiAgICAvLyBPbmx5IHRoZSBuYXRpdmUgL3ZlcmlmeSBza2lsbCBzYXRpc2ZpZXMgdmVyaWZ5LWJlZm9yZS1kb25lLiAvd2FyZCBhbmQKICAgIC8vIC9xdWlja2VuIGFyZSB0YXJnZXRlZCBhdWRpdHMsIE5PVCB0aGUgY29tcGxldGlvbiBnYXRlIChzZWUgZmwvc2RkLm1kKSDigJQKICAgIC8vIGNyZWRpdGluZyB0aGVtIHdvdWxkIGxldCB0aGUgZ2F0ZSBwYXNzIHdpdGhvdXQgYW4gZW5kLXRvLWVuZCB2ZXJpZnkuCiAgICBpZiAodk5hbWUgPT09ICd2ZXJpZnknKSB7CiAgICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICAgIC8vICMxMzMyOiBpbnZva2luZyAvdmVyaWZ5IHN0YXJ0cyBhIHZlcmlmaWNhdGlvbjsgaXQgZG9lcyBub3QgY29uY2x1ZGUKICAgICAgLy8gb25lLiBDbGVhciBhbnkgcHJpb3IgdmVyZGljdCBzbyB0aGUgcnVuIGluIHByb2dyZXNzIGNhbm5vdCBpbmhlcml0IHRoZQogICAgICAvLyBQQVNTIGZyb20gYSBwcmV2aW91cyBpc3N1ZSBhbmQgc2F0aXNmeSBjaGVjay1iZWZvcmUtZG9uZSBvbiBpdHMgb3duLgogICAgICB2YXIgdmVyaWZ5RnAgPSBjcmVkaXRGaW5nZXJwcmludCgnYWxsJyk7CiAgICAgIGlmICghcy52ZXJpZnlSdW4gfHwgcy52ZXJpZnlPdXRjb21lIHx8IHMudmVyaWZ5RmluZ2VycHJpbnQgIT09IHZlcmlmeUZwKSB7CiAgICAgICAgcy52ZXJpZnlSdW4gPSB0cnVlOwogICAgICAgIHMudmVyaWZ5T3V0Y29tZSA9IG51bGw7CiAgICAgICAgcy52ZXJpZnlGaW5nZXJwcmludCA9IHZlcmlmeUZwOwogICAgICAgIHdyaXRlU3RhdGUocyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodk5hbWUpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC12ZXJpZnktcnVuIG5vLW9wIOKAlCBUT09MX0lOUFVUX3NraWxsPSInICsgdk5hbWUgKyAnIiBpcyBub3QgdmVyaWZ5XG4nKTsKICAgIH0KICAgIGJyZWFrOwogIH0KICBjYXNlICdyZWNvcmQtdmVyaWZ5LW91dGNvbWUnOiB7CiAgICAvLyAjMTMzMi4gRmlyZXMgUG9zdFRvb2xVc2Ugb24gbWNwX19tb2Zsb19fbWVtb3J5X3N0b3JlLiBgcmVjb3JkLXZlcmlmeS1ydW5gCiAgICAvLyBhYm92ZSBwcm92ZXMgYSB2ZXJpZmljYXRpb24gd2FzIEFUVEVNUFRFRDsgdGhpcyBwcm92ZXMgaG93IGl0IEVOREVELgogICAgLy8KICAgIC8vIFRoZSB2ZXJkaWN0IGlzIHJlYWQgZnJvbSB0aGUgc3RydWN0dXJlZCByZWNvcmQgIzEzMjggbWFkZSAvdmVyaWZ5IHdyaXRlCiAgICAvLyB0byBtZW1vcnlfc3RvcmUncyBgbWV0YWRhdGFgIOKAlCBuZXZlciBwYXJzZWQgb3V0IG9mIHRoZSBwcm9zZSBgdmFsdWVgLAogICAgLy8gd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBmcmVlLXRleHQgZGVwZW5kZW5jeSAjMTMyOCByZW1vdmVkLiBnYXRlLWhvb2subWpzCiAgICAvLyBmb3J3YXJkcyB0aGUgb2JqZWN0IGFzIEpTT04gKHNlZSBpdHMgTUFYX1NUUlVDVFVSRURfTEVOIG5vdGUpLgogICAgdmFyIG1LZXkgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2tleSB8fCAnJzsKICAgIGlmIChtS2V5LmluZGV4T2YoJ3ZlcmlmeTonKSAhPT0gMCkgYnJlYWs7CiAgICB2YXIgcmF3TWV0YSA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfbWV0YWRhdGEgfHwgJyc7CiAgICBpZiAoIXJhd01ldGEpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ2dhdGU6IHJlY29yZC12ZXJpZnktb3V0Y29tZSDigJQgIicgKyBtS2V5ICsgJyIgY2FycmllcyBubyBtZXRhZGF0YTsgdmVyZGljdCBub3QgcmVjb3JkZWRcbicpOwogICAgICBicmVhazsKICAgIH0KICAgIHZhciBwYXJzZWRNZXRhID0gbnVsbDsKICAgIHRyeSB7IHBhcnNlZE1ldGEgPSBKU09OLnBhcnNlKHJhd01ldGEpOyB9IGNhdGNoIChlKSB7IHBhcnNlZE1ldGEgPSBudWxsOyB9CiAgICBpZiAoIXBhcnNlZE1ldGEgfHwgdHlwZW9mIHBhcnNlZE1ldGEgIT09ICdvYmplY3QnIHx8IHBhcnNlZE1ldGEudHlwZSAhPT0gJ3ZlcmlmeS1yZWNvcmQnKSBicmVhazsKICAgIHZhciBvdmVyYWxsID0gdHlwZW9mIHBhcnNlZE1ldGEub3ZlcmFsbCA9PT0gJ3N0cmluZycgPyBwYXJzZWRNZXRhLm92ZXJhbGwudG9VcHBlckNhc2UoKSA6ICcnOwogICAgaWYgKG92ZXJhbGwgIT09ICdQQVNTJyAmJiBvdmVyYWxsICE9PSAnRkFJTCcgJiYgb3ZlcmFsbCAhPT0gJ1VOVkVSSUZJRUQnKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdnYXRlOiByZWNvcmQtdmVyaWZ5LW91dGNvbWUg4oCUIHVucmVjb2duaXNlZCBvdmVyYWxsPSInICsgcGFyc2VkTWV0YS5vdmVyYWxsICsgJyI7IHRyZWF0aW5nIGFzIG5vdC1wYXNzaW5nXG4nKTsKICAgICAgb3ZlcmFsbCA9ICdVTlZFUklGSUVEJzsKICAgIH0KICAgIHZhciB2cyA9IHJlYWRTdGF0ZSgpOwogICAgLy8gIzEzNDgg4oCUIHJlZnVzZSBhIHZlcmRpY3QgZm9yIGEgcnVuIHRoYXQgaXMgbm8gbG9uZ2VyIGxpdmUuIGB2ZXJpZnlSdW5gCiAgICAvLyBmYWxzZSBoZXJlIG1lYW5zIGEgY29kZSBlZGl0IGZpcmVkIHJlc2V0LWVkaXQtZ2F0ZXMgYmV0d2VlbiB0aGUgL3ZlcmlmeQogICAgLy8gaW52b2NhdGlvbiBhbmQgdGhpcyBzdG9yZSwgc28gdGhlIHZlcmRpY3QgZGVzY3JpYmVzIHByZS1lZGl0IGNvZGUuCiAgICAvLyBSZWNvcmRpbmcgaXQgYW55d2F5IHByb2R1Y2VkIHRoZSBjb250cmFkaWN0b3J5IGB2ZXJpZnlSdW46ZmFsc2UsCiAgICAvLyB2ZXJpZnlPdXRjb21lOidQQVNTJ2Agc3RhdGUgdGhhdCBjaGVjay1iZWZvcmUtZG9uZSdzIGZvdXItd2F5IG1lc3NhZ2UKICAgIC8vIGNoYWluIGhhcyBubyBicmFuY2ggZm9yIOKAlCBpdCByZXBvcnRzICJhIGNvZGUgZWRpdCBpbnZhbGlkYXRlZCB0aGUgcHJldmlvdXMKICAgIC8vIHZlcmlmaWNhdGlvbiIgd2hpbGUgYSBQQVNTIHNpdHMgaW4gc3RhdGUsIHdoaWNoIHJlYWRzIGFzIGEgZ2F0ZSBidWcuCiAgICBpZiAoIXZzLnZlcmlmeVJ1bikgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnZ2F0ZTogcmVjb3JkLXZlcmlmeS1vdXRjb21lIOKAlCAiJyArIG1LZXkgKyAnIiBhcnJpdmVkIGFmdGVyIGEgY29kZSBlZGl0IGludmFsaWRhdGVkIHRoZSBydW47IHZlcmRpY3Qgbm90IHJlY29yZGVkIChyZS1ydW4gL3ZlcmlmeSlcbicpOwogICAgICBicmVhazsKICAgIH0KICAgIHZzLnZlcmlmeU91dGNvbWUgPSBvdmVyYWxsOwogICAgd3JpdGVTdGF0ZSh2cyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAncmVzZXQtZWRpdC1nYXRlcyc6IHsKICAgIHZhciBmcCA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfZmlsZV9wYXRoIHx8ICcnOwogICAgLy8gSW5lcnQgZmlsZXMgKG1hcmtkb3duLCBsb2NrZmlsZXMsIENIQU5HRUxPRywgLmVudi5leGFtcGxlKSBBTkQgaW5lcnQgcGF0aHMKICAgIC8vICguZ2l0aHViL3dvcmtmbG93cy8sIC5naXRodWIvSVNTVUVfVEVNUExBVEUvLCAuZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS8sICMxMTc2KToKICAgIC8vIG5vIGdhdGUgcmVzZXQg4oCUIGVkaXRpbmcgdGhlc2UgZG9lc24ndCBleHBvc2UgbmV3IHJ1bnRpbWUgc3VyZmFjZS4KICAgIGlmIChmcCAmJiAoRURJVF9SRVNFVF9TS0lQX0JPVEhfUkUudGVzdChmcCkgfHwgRURJVF9SRVNFVF9TS0lQX1BBVEhfUkUudGVzdChmcCkpKSBicmVhazsKICAgIC8vICMxMzQ4IOKAlCBhIHNjcmF0Y2hwYWQgd3JpdGUgdW5kZXIgdGhlIE9TIHRlbXAgZGlyIGlzIHRyYW5zaWVudCB0b29sIEkvTyBhbmQKICAgIC8vIGNhbiBuZXZlciByZWFjaCB0aGUgYnJhbmNoIGRpZmYsIGJ1dCBpdCB1c2VkIHRvIHJlc2V0IHRlc3RzICsgc2ltcGxpZnkgKwogICAgLy8gdmVyaWZ5IGxpa2UgYW55IHNvdXJjZSBjaGFuZ2U6IGEgL3ZlcmlmeSBydW4gdGhhdCBqb3R0ZWQgYSBwcm9iZSBjbGVhcmVkCiAgICAvLyB0aGUgL2Zsby1zaW1wbGlmeSBzdGFtcCwgYW5kIHRoZSB0d28gZ2F0ZXMgaW52YWxpZGF0ZWQgZWFjaCBvdGhlciB3aXRoIG5vCiAgICAvLyBvcmRlcmluZyB0aGF0IHNhdGlzZmllZCBib3RoLiBSZXVzZXMgdGhlIHByZWRpY2F0ZSB0aGUgbWVtb3J5LWZpcnN0IGdhdGUKICAgIC8vIGFscmVhZHkgdHJ1c3RzIGZvciB0aGVzZSBwYXRocyAoIzEyOTQpIHJhdGhlciB0aGFuIGEgc2Vjb25kIG9uZS4KICAgIC8vIFNjb3BlOiB0bXAtb25seSwgTk9UIHByb2plY3Qtcm9vdCBjb250YWlubWVudCDigJQgc28gYSBwcm9qZWN0IHJvb3RlZCB1bmRlcgogICAgLy8gdG1wIGhhcyBpdHMgb3duIGVkaXRzIHNraXBwZWQgdG9vIChwaW5uZWQgaW4gdGhlICMxMzQ4IHRlc3RzKS4gQ29udGFpbm1lbnQKICAgIC8vIGlzIHRoZSBtb3JlIGdlbmVyYWwgcnVsZSwgYnV0IGl0IGZhaWxzIE9QRU4gd2hlbiB0aGUgcm9vdCBjYW4ndCBiZQogICAgLy8gcmVzb2x2ZWQsIGFuZCBhIGdhdGUgdGhhdCBzaWxlbnRseSBzdG9wcyByZXNldHRpbmcgaXMgdGhlIHdvcnNlIGZhaWx1cmUuCiAgICBpZiAoaXNFcGhlbWVyYWxQYXRoKGZwKSkgYnJlYWs7CiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgLy8gVGVzdC1vbmx5IGVkaXRzIGludmFsaWRhdGUgdGVzdHNSdW4gYnV0IHByZXNlcnZlIHNpbXBsaWZ5UnVuICgjOTA4KS4KICAgIHZhciBpc1Rlc3RPbmx5ID0gZnAgJiYgRURJVF9SRVNFVF9TS0lQX1NJTVBMSUZZX09OTFlfUkUudGVzdChmcCk7CiAgICB2YXIgcmVzZXRUZXN0cyA9IHMudGVzdHNSdW47CiAgICAvLyBBIGNvZGUgZWRpdCBpbnZhbGlkYXRlcyBhIHByaW9yIHZlcmlmaWNhdGlvbiAoU3RvcnkgIzEyNzQpIOKAlCBzYW1lIGFzIHRlc3RzLAogICAgLy8gaW5jbHVkaW5nIHRlc3Qtb25seSBlZGl0cyAodGhlIGNyaXRlcmlhIGJlaW5nIHZlcmlmaWVkIG1heSBoYXZlIG1vdmVkKS4KICAgIC8vICMxMzMyOiBhbHNvIGZpcmVzIHdoZW4gYSB2ZXJkaWN0IGxpbmdlcnMgd2l0aG91dCB0aGUgZmxhZywgc28gbm8gcGF0aAogICAgLy8gY2FuIGxlYXZlIGEgcmVjb3JkZWQgb3V0Y29tZSBiZWhpbmQgYWZ0ZXIgYSBzb3VyY2UgZWRpdC4KICAgIHZhciByZXNldFZlcmlmeSA9IHMudmVyaWZ5UnVuIHx8ICEhcy52ZXJpZnlPdXRjb21lOwogICAgdmFyIHJlc2V0U2ltcGxpZnkgPSBzLnNpbXBsaWZ5UnVuICYmICFpc1Rlc3RPbmx5OwogICAgaWYgKCFyZXNldFRlc3RzICYmICFyZXNldFNpbXBsaWZ5ICYmICFyZXNldFZlcmlmeSkgYnJlYWs7CiAgICB2YXIgZ2F0ZXMgPSBbXTsKICAgIGlmIChyZXNldFRlc3RzKSB7IHMudGVzdHNSdW4gPSBmYWxzZTsgZ2F0ZXMucHVzaCgndGVzdHMnKTsgfQogICAgLy8gIzEzMzI6IGRyb3AgdGhlIHJlY29yZGVkIHZlcmRpY3Qgd2l0aCB0aGUgZmxhZy4gTGVhdmluZyBhIHN0YWxlIFBBU1MKICAgIC8vIGJlaGluZCB3b3VsZCBsZXQgdGhlIG5leHQgY2hlY2stYmVmb3JlLWRvbmUgcGFzcyBvbiBhIHZlcmRpY3QgdGhhdAogICAgLy8gZGVzY3JpYmVzIHByZS1lZGl0IGNvZGUuCiAgICBpZiAocmVzZXRWZXJpZnkpIHsgcy52ZXJpZnlSdW4gPSBmYWxzZTsgcy52ZXJpZnlPdXRjb21lID0gbnVsbDsgZ2F0ZXMucHVzaCgndmVyaWZ5Jyk7IH0KICAgIGlmIChyZXNldFNpbXBsaWZ5KSB7IHMuc2ltcGxpZnlSdW4gPSBmYWxzZTsgZ2F0ZXMucHVzaCgnc2ltcGxpZnknKTsgfQogICAgaWYgKGZwKSB7CiAgICAgIHMubGFzdFJlc2V0QnkgPSB7IGZpbGU6IGZwLCBhdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLCBnYXRlczogZ2F0ZXMgfTsKICAgIH0KICAgIHdyaXRlU3RhdGUocyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAnY2hlY2stYmVmb3JlLWltcGxlbWVudCc6IHsKICAgIC8vICMxMjk3IOKAlCB0aGUgU0REIGZyb250LWhhbGYgYmFja3N0b3AuIFdoZW4gYSBydW4gaXMgYXJtZWQgZm9yIFNERAogICAgLy8gKHNkZE1vZGUsIHNldCBmcm9tIC1zZC8tLXNkZCBvciBzZGQuZGVmYXVsdCBvbiBhIC9mbG8gcnVuKSwgYmxvY2sgc291cmNlCiAgICAvLyBXcml0ZS9FZGl0IHVudGlsIGEgc3BlYyBleGlzdHMgYW5kIGl0cyBwbGFuIGlzIHJldmlld2VkLiBNaXJyb3JzIHRoZQogICAgLy8gbWVtb3J5X2ZpcnN0IGdhdGUgc2hhcGUuIERpc2FybWVkIHJ1bnMgKHRoZSBkZWZhdWx0IGZvciBub24tU0REIHdvcmspCiAgICAvLyBwYXNzIGluc3RhbnRseS4gT3B0IG91dCBwZXItcHJvamVjdCB3aXRoIGBnYXRlczogc2RkX2dhdGU6IGZhbHNlYC4KICAgIGlmICghY29uZmlnLnNkZF9nYXRlKSBicmVhazsKICAgIHZhciBzaSA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKCFzaS5zZGRNb2RlKSBicmVhazsgLy8gbm90IGFuIFNERCBydW4g4oCUIG5vIGVuZm9yY2VtZW50CiAgICB2YXIgZnBpID0gcHJvY2Vzcy5lbnYuVE9PTF9JTlBVVF9maWxlX3BhdGggfHwgJyc7CiAgICBpZiAoIWZwaSkgYnJlYWs7CiAgICAvLyBPbmx5IGdhdGUgcmVhbCBzb3VyY2UgZWRpdHMuIEV4ZW1wdCB0aGUgc2FtZSBpbmVydCBmaWxlcy9wYXRocyB0aGUgb3RoZXIKICAgIC8vIGdhdGVzIHNraXAsIHBsdXMgdGhlIHNwZWMvcGxhbiBhcnRpZmFjdHMgdGhlbXNlbHZlcy4KICAgIGlmIChFWEVNUFQuc29tZShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZnBpLmluZGV4T2YoZSkgPj0gMDsgfSkpIGJyZWFrOwogICAgaWYgKCFTT1VSQ0VfRklMRV9SRS50ZXN0KGZwaSkpIGJyZWFrOwogICAgaWYgKEVESVRfUkVTRVRfU0tJUF9QQVRIX1JFLnRlc3QoZnBpKSkgYnJlYWs7CiAgICBpZiAoaXNJbnNpZGVTcGVjc0RpcihmcGkpKSBicmVhazsKICAgIGlmICghc2kuYWN0aXZlU2RkU2x1ZykgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAnQkxPQ0tFRDogU0REIG1vZGUgaXMgb24g4oCUIGF1dGhvciBhIHNwZWMgYmVmb3JlIGVkaXRpbmcgc291cmNlLlxuJyArCiAgICAgICAgJ1J1bjogZmxvIHNkZCBzcGVjICI8dGl0bGU+IiAgICh0aGVuIHJldmlldyBpdCwgYW5kIHBsYW4pXG4nICsKICAgICAgICAnVGhpcyBydW4gaXMgc3BlYy1nYXRlZCAoLXNkIC8gc2RkLmRlZmF1bHQpLiBPbmUtb2ZmIHNraXA6IHJlLXJ1biB3aXRoIC0tbm8tc2RkLlxuJyArCiAgICAgICAgJ0Rpc2FibGUgcGVyLXByb2plY3QgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzZGRfZ2F0ZTogZmFsc2VcbicKICAgICAgKTsKICAgICAgcHJvY2Vzcy5leGl0KDIpOwogICAgfQogICAgaWYgKCFpc1BsYW5SZXZpZXdlZChzaS5hY3RpdmVTZGRTbHVnKSkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgKICAgICAgICAnQkxPQ0tFRDogU0REIOKAlCB0aGUgcGxhbiBmb3IgIicgKyBzaS5hY3RpdmVTZGRTbHVnICsgJyIgaXMgbm90IHJldmlld2VkIHlldC5cbicgKwogICAgICAgICdBdXRob3IgKyByZXZpZXcgdGhlIHBsYW4gZmlyc3Q6XG4nICsKICAgICAgICAnICBmbG8gc2RkIHBsYW4gJyArIHNpLmFjdGl2ZVNkZFNsdWcgKyAnXG4nICsKICAgICAgICAnICBmbG8gc2RkIHJldmlldyAnICsgc2kuYWN0aXZlU2RkU2x1ZyArICcgcGxhblxuJyArCiAgICAgICAgJ09uZS1vZmYgc2tpcDogcmUtcnVuIHdpdGggLS1uby1zZGQuIERpc2FibGUgdmlhIG1vZmxvLnlhbWw6IGdhdGVzOiBzZGRfZ2F0ZTogZmFsc2VcbicKICAgICAgKTsKICAgICAgcHJvY2Vzcy5leGl0KDIpOwogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ2NoZWNrLWJlZm9yZS1wcic6IHsKICAgIC8vIEFuY2hvcmVkIHRvIGNvbW1hbmQtc3RhcnQgc28gaGVyZWRvYyBib2RpZXMgYW5kIHF1b3RlZCBzdHJpbmdzIHRoYXQKICAgIC8vIGNvbnRhaW4gdGhlIGxpdGVyYWwgImdoIHByIGNyZWF0ZSIgZG9uJ3QgdHJpcCB0aGUgZ2F0ZSBkdXJpbmcgcmVndWxhcgogICAgLy8gYGdpdCBjb21taXQgLW0gIi4uLmdoIHByIGNyZWF0ZS4uLiJgIGZsb3dzLCB3aGlsZSBzdGlsbCBjYXRjaGluZyB0aGUKICAgIC8vIGNoYWluZWQsIHBpcGVkLCBwYXJlbnRoZXNpc2VkLCBhbmQgbXVsdGktbGluZSBzaGFwZXMgKCMxNDEwKS4KICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICBpZiAoIWlzUHJDcmVhdGVDb21tYW5kKGNtZCkpIGJyZWFrOwogICAgLy8gIzEzNzQgb3BlbmVkIHRoaXMgbG9vcDsgIzE0MzUgY2xvc2VzIGl0LiBUaGUgY291bnQgaXRzZWxmIGlzIHVuY2hhbmdlZCDigJQKICAgIC8vIHdoYXQgY2hhbmdlZCBpcyB0aGF0IGl0IG5vdyBoYXMgdGVldGggYW5kLCBpbiB3YXJuIG1vZGUsIGEgZGVsaXZlcnkgcGF0aC4KICAgIC8vCiAgICAvLyBEZWxpYmVyYXRlbHkgQUJPVkUgdGhlIG5vLXNvdXJjZSBleGVtcHRpb24gYmVsb3c6IGEgZG9jcy1vbmx5IFBSIGNhbgogICAgLy8gYWJhbmRvbiBhIGxpc3QgZXhhY3RseSBsaWtlIGEgc291cmNlIFBSIGNhbiwgYW5kIHRoZSBleGVtcHRpb24gaXMgYWJvdXQKICAgIC8vIHRlc3Rpbmcvc2ltcGxpZnkvbGVhcm5pbmdzLCBub3QgYWJvdXQgd2hldGhlciB0aGUgcnVuIHRvbGQgdGhlIHVzZXIgd2hhdAogICAgLy8gaXQgZGlkLiBJdCBhbHNvIGV4aXRzIG9uIGl0cyBvd24gcmF0aGVyIHRoYW4gam9pbmluZyBgbWlzc2luZ2AgYmVsb3csIGZvcgogICAgLy8gdGhlIHNhbWUgcmVhc29uIOKAlCBgbWlzc2luZ2AgaXMgdW5yZWFjaGFibGUgb24gYW4gZXhlbXB0IGRpZmYuCiAgICAvLwogICAgLy8gR2F0ZWQgb24gdGhlIHNhbWUgYHRhc2tfY3JlYXRlX2ZpcnN0YCBmbGFnIGFzIHRoZSByZW1pbmRlciBpdHNlbGYgc28gdGhlCiAgICAvLyB0d28gaGFsdmVzIGFyZSBhbHdheXMgY29uc2lzdGVudDogYSBwcm9qZWN0IHRoYXQgdHVybmVkIHRoZSBuYWcgb2ZmIGlzCiAgICAvLyBub3QgdGhlbiBibG9ja2VkIGFib3V0IHRoZSBvdGhlciBlbmQgb2YgaXQuCiAgICAvLwogICAgLy8gRmFpbC1vcGVuIGlzIGxvYWQtYmVhcmluZy4gcmVhZFRhc2tMZWRnZXIoKSByZXR1cm5zIG51bGwgb24gYSBtaXNzaW5nLAogICAgLy8gb3ZlcnNpemVkLCBvciB1bnJlYWRhYmxlIHRyYW5zY3JpcHQgYW5kIG9uIGEgc2Vzc2lvbiB3aXRoIG5vIFRhc2tDcmVhdGUgYXQKICAgIC8vIGFsbCwgYW5kIG51bGwgbXVzdCBuZXZlciBibG9jayDigJQgYSBnYXRlIHRoYXQgc3RvcHMgUFJzIGJlY2F1c2UgaXQgY291bGQKICAgIC8vIG5vdCByZWFkIGEgZmlsZSBpcyB3b3JzZSB0aGFuIHRoZSByZXBvcnRpbmcgZ2FwIGl0IGlzIGNsb3NpbmcuCiAgICAvLwogICAgLy8gU3RhdGUgaXMgcmVhZCBPTkNFIGZvciB0aGUgd2hvbGUgY2FzZSwgaGVyZSDigJQgdGhlIHByZS1QUiBnYXRlIGxvZ2ljIGJlbG93CiAgICAvLyByZXVzZXMgaXQgYW5kIG5vdGhpbmcgd3JpdGVzIGluIGJldHdlZW4uIFJlYWRpbmcgaXQgYmVmb3JlIHRoZSBsZWRnZXIgYWxzbwogICAgLy8gbWVhbnMgYW4gYWxyZWFkeS1hY2tub3dsZWRnZWQgcnVuIG5ldmVyIHBheXMgZm9yIHRoZSB0cmFuc2NyaXB0IHNjYW4uCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgaWYgKGNvbmZpZy50YXNrX2NyZWF0ZV9maXJzdCAmJiBjb25maWcudGFza19zdGF0dXNfZ2F0ZSAhPT0gJ29mZicgJiYgIXMudGFza3NBY2tub3dsZWRnZWQpIHsKICAgICAgdmFyIGxlZGdlciA9IHJlYWRUYXNrTGVkZ2VyKCk7CiAgICAgIGlmIChsZWRnZXIgJiYgbGVkZ2VyLm9wZW4gPiAwKSB7CiAgICAgICAgdmFyIHRhbGx5ID0gbGVkZ2VyLmNyZWF0ZWQgKyAnIHRhc2snICsgKGxlZGdlci5jcmVhdGVkID09PSAxID8gJycgOiAncycpICsKICAgICAgICAgICcgY3JlYXRlZCB0aGlzIHNlc3Npb24sICcgKyBsZWRnZXIub3BlbiArICcgc3RpbGwgb3Blbi4nOwogICAgICAgIHZhciBjbG9zZUl0ID0gJ0Nsb3NlIHRoZW0gd2l0aCBUYXNrVXBkYXRlIChzdGF0dXM6IGNvbXBsZXRlZCksIG9yIGRlbGV0ZSB0aGUgb25lcyAnICsKICAgICAgICAgICd0aGF0IG5vIGxvbmdlciBhcHBseSwgc28gdGhlIHJ1biBkb2VzIG5vdCByZXBvcnQgZG9uZSBvdmVyIGFuIHVuZmluaXNoZWQgbGlzdC5cbic7CiAgICAgICAgaWYgKGNvbmZpZy50YXNrX3N0YXR1c19nYXRlID09PSAnd2FybicpIHsKICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdSRU1JTkRFUjogJyArIHRhbGx5ICsgJyAnICsgY2xvc2VJdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKAogICAgICAgICAgICAnQkxPQ0tFRDogJyArIHRhbGx5ICsgJ1xuJyArIGNsb3NlSXQgKwogICAgICAgICAgICAnRGVmZXJyaW5nIHRoZW0gb24gcHVycG9zZSBpcyBhIGxlZ2l0aW1hdGUgb3V0Y29tZSDigJQgZGVjbGFyZSBpdCBpbnN0ZWFkIG9mXG4nICsKICAgICAgICAgICAgJ2Nsb3NpbmcgdGFza3MgdGhhdCBhcmUgbm90IGRvbmU6IG5vZGUgIicgKyBfX2ZpbGVuYW1lICsgJyIgcmVjb3JkLXRhc2tzLWFja25vd2xlZGdlZFxuJyArCiAgICAgICAgICAgIEdBVEVfT1JJR0lOX05PVEUgKyAnXG4nICsKICAgICAgICAgICAgJ1JlcG9ydCBpbnN0ZWFkIG9mIGJsb2NraW5nIHZpYSBtb2Zsby55YW1sOiBnYXRlczogdGFza19zdGF0dXNfZ2F0ZTogd2FybiAgIChvcjogb2ZmKVxuJyk7CiAgICAgICAgICBwcm9jZXNzLmV4aXQoMik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBOby1zb3VyY2UtZmlsZXMgZXhlbXB0aW9uICgjMTE3Niwgc3VwZXJzZWRlcyB0aGUgb3JpZ2luYWwgZG9jcy1vbmx5IHBhdGgpLgogICAgLy8gSWYgZXZlcnkgZmlsZSBjaGFuZ2VkIHZzIHRoZSBtZXJnZS1iYXNlIGlzIGVpdGhlciBhIGRvY3MvaW1hZ2UgZmlsZSBvciBhCiAgICAvLyBwYXRoLWluZXJ0IGZpbGUgKC5naXRodWIvd29ya2Zsb3dzLywgSVNTVUVfVEVNUExBVEUvLCBQVUxMX1JFUVVFU1RfVEVNUExBVEUvKQogICAgLy8g4oCUIGkuZS4gTk8gc291cmNlIGZpbGVzIGluIHRoZSBkaWZmIOKAlCBza2lwIHRlc3Rpbmcvc2ltcGxpZnkvbGVhcm5pbmdzIGdhdGVzCiAgICAvLyBhbmQgc3VyZmFjZSBhIG9uZS1saW5lIHRyYW5zcGFyZW5jeSBub3RlLiBGYWxscyB0aHJvdWdoIHRvIHRoZSBzdGFuZGFyZCBnYXRlCiAgICAvLyBvbiBhbnkgZmFpbHVyZSAobm8gYmFzZSwgbm8gZGlmZiwgZXhlYyBlcnJvcikg4oCUIGZhaWwtc2FmZSBieSBkZXNpZ24uCiAgICAvLwogICAgLy8gU291cmNlLWZpbGUgZGV0ZWN0aW9uIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBpbmVydCBjaGVja3M6IGEgZmlsZSBpcyAic291cmNlIgogICAgLy8gd2hlbiBpdCBtYXRjaGVzIFNPVVJDRV9GSUxFX1JFIEFORCBpcyBub3QgaW5zaWRlIGFuIGluZXJ0IHBhdGguIFRoaXMgY2F0Y2hlcwogICAgLy8gYC5naXRodWIvd29ya2Zsb3dzL2Zvby5zaGAgKHNoIGV4dGVuc2lvbiBidXQgcGF0aC1pbmVydCDihpIgbm8gc291cmNlKS4KICAgIHZhciBjaGFuZ2VkID0gZ2V0Q2hhbmdlZEZpbGVzVnNCYXNlKCk7CiAgICBpZiAoY2hhbmdlZCAmJiBjaGFuZ2VkLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGhhc1NvdXJjZSA9IGNoYW5nZWQuc29tZShmdW5jdGlvbihmKSB7CiAgICAgICAgcmV0dXJuIFNPVVJDRV9GSUxFX1JFLnRlc3QoZikgJiYgIUVESVRfUkVTRVRfU0tJUF9QQVRIX1JFLnRlc3QoZik7CiAgICAgIH0pOwogICAgICBpZiAoIWhhc1NvdXJjZSkgewogICAgICAgIHZhciBhbGxEb2NzID0gY2hhbmdlZC5ldmVyeShmdW5jdGlvbihmKSB7IHJldHVybiBET0NTX09OTFlfUkUudGVzdChmKTsgfSk7CiAgICAgICAgdmFyIHJlYXNvbiA9IGFsbERvY3MgPyAnRG9jcy1vbmx5JyA6ICdObyBzb3VyY2UgZmlsZXMgaW4gYnJhbmNoIGRpZmYnOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHJlYXNvbiArICcgKCcgKyBjaGFuZ2VkLmxlbmd0aCArICcgZmlsZScgKyAoY2hhbmdlZC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJykgKyAnKSDigJQgc2tpcHBpbmcgdGVzdGluZy9zaW1wbGlmeS9sZWFybmluZ3MgZ2F0ZXMuXG4nKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgLy8gRXhwaXJlIGFueSBjcmVkaXQgd2hvc2UgZmluZ2VycHJpbnQgbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIGNvZGUgYmVmb3JlCiAgICAvLyByZWFkaW5nIHRoZSBmbGFncy4gVGhpcyBpcyB3aGF0IGNhdGNoZXMgdGhlIG11dGF0aW9ucyByZXNldC1lZGl0LWdhdGVzCiAgICAvLyBzdHJ1Y3R1cmFsbHkgY2Fubm90IHNlZSDigJQgQmFzaCB3cml0ZXMsIGdpdCBjaGVja291dC9wdWxsL21lcmdlLCBhbmQgdGhlCiAgICAvLyBuZXh0IGlzc3VlIGluIHRoZSBzYW1lIHNlc3Npb24g4oCUIHNvIHRoZSBmbGFncyBiZWxvdyBtZWFuICJzdGlsbCB0cnVlIG9mCiAgICAvLyBUSElTIGNvZGUiLCBub3QgbWVyZWx5ICJ3YXMgdHJ1ZSBhdCBzb21lIHBvaW50IHRoaXMgc2Vzc2lvbiIuCiAgICB2YXIgZXhwaXJlZCA9IFtdOwogICAgaWYgKHMudGVzdHNSdW4gJiYgIWNyZWRpdElzTGl2ZShzLnRlc3RzUnVuLCBzLnRlc3RzRmluZ2VycHJpbnQsICdhbGwnKSkgewogICAgICBzLnRlc3RzUnVuID0gZmFsc2U7IHMudGVzdHNGaW5nZXJwcmludCA9IG51bGw7IGV4cGlyZWQucHVzaCgndGVzdHMnKTsKICAgIH0KICAgIGlmIChzLnNpbXBsaWZ5UnVuICYmICFjcmVkaXRJc0xpdmUocy5zaW1wbGlmeVJ1biwgcy5zaW1wbGlmeUZpbmdlcnByaW50LCAnbm9udGVzdCcpKSB7CiAgICAgIHMuc2ltcGxpZnlSdW4gPSBmYWxzZTsgcy5zaW1wbGlmeUZpbmdlcnByaW50ID0gbnVsbDsgZXhwaXJlZC5wdXNoKCdzaW1wbGlmeScpOwogICAgfQogICAgaWYgKChzLnZlcmlmeVJ1biB8fCBzLnZlcmlmeU91dGNvbWUpICYmICFjcmVkaXRJc0xpdmUocy52ZXJpZnlSdW4sIHMudmVyaWZ5RmluZ2VycHJpbnQsICdhbGwnKSkgewogICAgICBzLnZlcmlmeVJ1biA9IGZhbHNlOyBzLnZlcmlmeU91dGNvbWUgPSBudWxsOyBzLnZlcmlmeUZpbmdlcnByaW50ID0gbnVsbDsgZXhwaXJlZC5wdXNoKCd2ZXJpZnknKTsKICAgIH0KICAgIGlmIChleHBpcmVkLmxlbmd0aCkgd3JpdGVTdGF0ZShzKTsKICAgIC8vIENsYXNzaWZpZXItYXdhcmUgc2tpcDogaWYgZGVsdGEtc2luY2Utc25hcHNob3Qgb3Igd2hvbGUtYnJhbmNoIGRpZmYgaXMKICAgIC8vIFRSSVZJQUwsIHNhdGlzZnkgdGhlIHNpbXBsaWZ5IGdhdGUgc2lsZW50bHkuIFJldXNlcyB0aGUgc2FtZSBjbGFzc2lmaWVyCiAgICAvLyB0aGUgc2tpbGwgdXNlcyDigJQgc2FtZSAidHJpdmlhbCIgZGVmaW5pdGlvbiwgbm8gZHJpZnQuIFNhbWUgdGhyZXNob2xkIHRoYXQKICAgIC8vIGFscmVhZHkgbWFwcyB0byBUUklWSUFMPTAgYWdlbnRzIGluc2lkZSAvc2ltcGxpZnksIHNvIHRydXN0aW5nIGl0IGF0IHRoZQogICAgLy8gZ2F0ZSBsZXZlbCBpcyB0aGUgc2FtZSB0cnVzdCBwcm9maWxlLCBqdXN0IG9uZSBkZWNpc2lvbiBlYXJsaWVyLgogICAgaWYgKGNvbmZpZy5zaW1wbGlmeV9nYXRlICYmICFzLnNpbXBsaWZ5UnVuKSB7CiAgICAgIHZhciBza2lwUmVhc29uID0gY2xhc3NpZnlGb3JHYXRlU2tpcChzKTsKICAgICAgaWYgKHNraXBSZWFzb24pIHsKICAgICAgICBzLnNpbXBsaWZ5UnVuID0gdHJ1ZTsKICAgICAgICB3cml0ZVN0YXRlKHMpOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdTaW1wbGlmeSBnYXRlIGF1dG8tcGFzc2VkOiAnICsgc2tpcFJlYXNvbiArICdcbicpOwogICAgICB9CiAgICB9CiAgICB2YXIgbWlzc2luZyA9IFtdOwogICAgaWYgKGNvbmZpZy50ZXN0aW5nX2dhdGUgJiYgIXMudGVzdHNSdW4pIG1pc3NpbmcucHVzaCgndGVzdHMgaGF2ZSBub3QgcnVuIGdyZWVuIHNpbmNlIHRoZSBsYXN0IGNvZGUgZWRpdCAocnVuIG5wbSB0ZXN0LCB2aXRlc3QsIGplc3QsIHB5dGVzdCwgb3Igc2ltaWxhciDigJQgYSBydW4gd2hvc2Ugb3V0cHV0IHJlcG9ydHMgZmFpbHVyZXMgZG9lcyBub3QgY291bnQpJyk7CiAgICBpZiAoY29uZmlnLnNpbXBsaWZ5X2dhdGUgJiYgIXMuc2ltcGxpZnlSdW4pIG1pc3NpbmcucHVzaCgnL2Zsby1zaW1wbGlmeSAob3IgL2Rpc3RpbGwpIGhhcyBub3QgcnVuIHNpbmNlIHRoZSBsYXN0IGNvZGUgZWRpdCcpOwogICAgaWYgKGNvbmZpZy5sZWFybmluZ3NfZ2F0ZSAmJiAhcy5sZWFybmluZ3NTdG9yZWQpIG1pc3NpbmcucHVzaChMRUFSTklOR1NfTUlTU0lORyk7CiAgICBpZiAobWlzc2luZy5sZW5ndGggPT09IDApIGJyZWFrOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0JMT0NLRUQ6IGdoIHByIGNyZWF0ZSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGJlZm9yZSBvcGVuaW5nIGEgUFI6XG4nKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWlzc2luZy5sZW5ndGg7IGkrKykgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAtICcgKyBtaXNzaW5nW2ldICsgJ1xuJyk7CiAgICB9CiAgICBpZiAoZXhwaXJlZC5sZW5ndGgpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoCiAgICAgICAgJ0V4cGlyZWQgYmVjYXVzZSB0aGUgY29kZSBjaGFuZ2VkIHNpbmNlIHRoZXkgcmFuICgnICsgZXhwaXJlZC5qb2luKCcsICcpICsKICAgICAgICAnKSDigJQgdGhpcyBpbmNsdWRlcyBjaGFuZ2VzIG1hZGUgb3V0c2lkZSBXcml0ZS9FZGl0LCBlLmcuIGEgQmFzaCB3cml0ZSwgJyArCiAgICAgICAgJ2dpdCBjaGVja291dC9wdWxsLCBvciBtb3Zpbmcgb24gdG8gYSBkaWZmZXJlbnQgY2hhbmdlIGluIHRoZSBzYW1lIHNlc3Npb24uXG4nLAogICAgICApOwogICAgfQogICAgaWYgKHMubGFzdFJlc2V0QnkgJiYgcy5sYXN0UmVzZXRCeS5maWxlKSB7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdMYXN0IGdhdGUgcmVzZXQ6ICcgKyBzLmxhc3RSZXNldEJ5LmZpbGUgKyAnICgnICsgKHMubGFzdFJlc2V0QnkuZ2F0ZXMgfHwgW10pLmpvaW4oJywgJykgKyAnKVxuJyk7CiAgICB9CiAgICAvLyAjMTM0OCDigJQgbmFtZSB0aGUgb3JkZXIsIG5vdCBqdXN0IHRoZSBtaXNzaW5nIGdhdGUuIFNhdGlzZnlpbmcgb25lIGdhdGUgY2FuCiAgICAvLyBpbnZhbGlkYXRlIGFub3RoZXIgKC9mbG8tc2ltcGxpZnkgZWRpdHMgY29kZSwgd2hpY2ggcmVzZXRzIHRlc3RzICsgdmVyaWZ5KSwKICAgIC8vIHNvICJ3aGF0IGlzIG1pc3NpbmciIGFsb25lIGxlZnQgY2FsbGVycyByZWRpc2NvdmVyaW5nIHRoZSBzZXF1ZW5jZSBieSB0cmlhbC4KICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKE9SREVSX0hJTlQpOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0Rpc2FibGUgcGVyLWdhdGUgdmlhIG1vZmxvLnlhbWw6XG4nKTsKICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgIGdhdGVzOlxuICAgIHRlc3RpbmdfZ2F0ZTogZmFsc2VcbiAgICBzaW1wbGlmeV9nYXRlOiBmYWxzZVxuICAgIGxlYXJuaW5nc19nYXRlOiBmYWxzZVxuJyk7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgfQogIGNhc2UgJ2NoZWNrLWJlZm9yZS1kb25lJzogewogICAgLy8gU3RvcnkgIzEyNzQgKEVwaWMgIzEyNjkpICsgIzEyOTQuIFZlcmlmeS1iZWZvcmUtZG9uZTogYmxvY2sgYGdoIHByIGNyZWF0ZWAKICAgIC8vIHVudGlsIHRoZSBjaGFuZ2UgaGFzIGJlZW4gdmVyaWZpZWQgZW5kLXRvLWVuZCAodGhlIC92ZXJpZnkgc2tpbGwpIGFnYWluc3QKICAgIC8vIHRoZSBwbGFuJ3MgYWNjZXB0YW5jZSBjcml0ZXJpYS4gT04gYnkgZGVmYXVsdCAoIzEyOTQpIOKAlCAvZmxvIGRlbGVnYXRlcyB0bwogICAgLy8gL3ZlcmlmeSwgc28gYSBkZWZhdWx0IHJ1biBkb2VzIHRoZSBhY2NlcHRhbmNlIGNoZWNrOyBkaXNhYmxlIHBlci1wcm9qZWN0CiAgICAvLyB3aXRoIGBnYXRlczogdmVyaWZ5X2JlZm9yZV9kb25lOiBmYWxzZWAgb3IgcGVyLXJ1biBgLS1uby12ZXJpZnlgLiBTYW1lCiAgICAvLyB0cmlnZ2VyICsgbm8tc291cmNlIGV4ZW1wdGlvbiBhcyBjaGVjay1iZWZvcmUtcHIsIHNvIHRoZXkgY29tcG9zZSBvbiBvbmUKICAgIC8vIGNvbW1hbmQgKGRvY3Mtb25seSBkaWZmcyBhcmUgZXhlbXB0LCBzbyB0aGlzIG5ldmVyIGJsb2NrcyBhIGRvY3MgUFIpLgogICAgaWYgKCFjb25maWcudmVyaWZ5X2JlZm9yZV9kb25lKSBicmVhazsKICAgIHZhciBjbWQgPSBwcm9jZXNzLmVudi5UT09MX0lOUFVUX2NvbW1hbmQgfHwgJyc7CiAgICBpZiAoIWlzUHJDcmVhdGVDb21tYW5kKGNtZCkpIGJyZWFrOwogICAgLy8gTm8tc291cmNlLWZpbGVzIGV4ZW1wdGlvbiDigJQgYSBkb2NzLW9ubHkgLyBwYXRoLWluZXJ0IGRpZmYgbmVlZHMgbm8gdmVyaWZ5LgogICAgdmFyIGNoYW5nZWREID0gZ2V0Q2hhbmdlZEZpbGVzVnNCYXNlKCk7CiAgICBpZiAoY2hhbmdlZEQgJiYgY2hhbmdlZEQubGVuZ3RoID4gMCkgewogICAgICB2YXIgaGFzU291cmNlRCA9IGNoYW5nZWRELnNvbWUoZnVuY3Rpb24oZikgewogICAgICAgIHJldHVybiBTT1VSQ0VfRklMRV9SRS50ZXN0KGYpICYmICFFRElUX1JFU0VUX1NLSVBfUEFUSF9SRS50ZXN0KGYpOwogICAgICB9KTsKICAgICAgaWYgKCFoYXNTb3VyY2VEKSB7CiAgICAgICAgdmFyIHJlYXNvbkQgPSBjaGFuZ2VkRC5ldmVyeShmdW5jdGlvbihmKSB7IHJldHVybiBET0NTX09OTFlfUkUudGVzdChmKTsgfSkgPyAnRG9jcy1vbmx5JyA6ICdObyBzb3VyY2UgZmlsZXMgaW4gYnJhbmNoIGRpZmYnOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHJlYXNvbkQgKyAnICgnICsgY2hhbmdlZEQubGVuZ3RoICsgJyBmaWxlJyArIChjaGFuZ2VkRC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJykgKyAnKSDigJQgc2tpcHBpbmcgdmVyaWZ5LWJlZm9yZS1kb25lIGdhdGUuXG4nKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdmFyIHNkID0gcmVhZFN0YXRlKCk7CiAgICAvLyBFeHBpcmUgYSB2ZXJkaWN0IHRoYXQgbm8gbG9uZ2VyIGRlc2NyaWJlcyB0aGUgY29kZSwgZm9yIHRoZSBzYW1lIHJlYXNvbgogICAgLy8gY2hlY2stYmVmb3JlLXByIGRvZXM6IGEgUEFTUyBlYXJuZWQgYmVmb3JlIGEgQmFzaCB3cml0ZSwgYSBicmFuY2ggc3dpdGNoLAogICAgLy8gb3IgdGhlIG5leHQgY2hhbmdlIGluIHRoaXMgc2Vzc2lvbiBpcyBldmlkZW5jZSBhYm91dCBkaWZmZXJlbnQgY29kZS4KICAgIC8vICMxMzMyIG1hZGUgdGhlIGdhdGUgcmVhZCB0aGUgb3V0Y29tZSBpbnN0ZWFkIG9mIGF0dGVuZGFuY2U7IHRoaXMgbWFrZXMgaXQKICAgIC8vIHJlYWQgYW4gb3V0Y29tZSB0aGF0IGlzIHN0aWxsIEFCT1VUIHRoZSB0aGluZyBiZWluZyBzaGlwcGVkLgogICAgdmFyIHZlcmlmeVN0YWxlID0gKHNkLnZlcmlmeVJ1biB8fCBzZC52ZXJpZnlPdXRjb21lKQogICAgICAmJiAhY3JlZGl0SXNMaXZlKHNkLnZlcmlmeVJ1biwgc2QudmVyaWZ5RmluZ2VycHJpbnQsICdhbGwnKTsKICAgIGlmICh2ZXJpZnlTdGFsZSkgewogICAgICBzZC52ZXJpZnlSdW4gPSBmYWxzZTsgc2QudmVyaWZ5T3V0Y29tZSA9IG51bGw7IHNkLnZlcmlmeUZpbmdlcnByaW50ID0gbnVsbDsKICAgICAgd3JpdGVTdGF0ZShzZCk7CiAgICB9CiAgICAvLyAjMTMzMjogZ2F0ZSBvbiB0aGUgT1VUQ09NRSwgbm90IG9uIGF0dGVuZGFuY2UuIEJlZm9yZSB0aGlzLCBgdmVyaWZ5UnVuYAogICAgLy8gYWxvbmUgb3BlbmVkIHRoZSBnYXRlLCBzbyBhIC92ZXJpZnkgcmV0dXJuaW5nIEZBSUwgc2F0aXNmaWVkIGl0IGV4YWN0bHkKICAgIC8vIGFzIGEgUEFTUyBkaWQg4oCUIGEgZmFpbGluZyB2ZXJkaWN0IGlzIHN0aWxsIGEgc3VjY2Vzc2Z1bCB0b29sIGludm9jYXRpb24uCiAgICBpZiAoc2QudmVyaWZ5UnVuICYmIHNkLnZlcmlmeU91dGNvbWUgPT09ICdQQVNTJykgYnJlYWs7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnQkxPQ0tFRDogZ2ggcHIgY3JlYXRlIHJlcXVpcmVzIHZlcmlmaWNhdGlvbiBiZWZvcmUgZG9uZTpcbicpOwogICAgLy8gVGhlIGZvdXIgc3RhdGVzIG5lZWQgZGlmZmVyZW50IHJlbWVkaWVzLCBzbyBuYW1lIHdoaWNoIG9uZSBhcHBsaWVzCiAgICAvLyByYXRoZXIgdGhhbiBlbWl0dGluZyBvbmUgbWVzc2FnZSB0aGF0IGZpdHMgbm9uZSBvZiB0aGVtLgogICAgdmFyIGludmFsaWRhdGVkID0gc2QubGFzdFJlc2V0QnkgJiYgc2QubGFzdFJlc2V0QnkuZmlsZQogICAgICAmJiAoc2QubGFzdFJlc2V0QnkuZ2F0ZXMgfHwgW10pLmluZGV4T2YoJ3ZlcmlmeScpID49IDA7CiAgICBpZiAodmVyaWZ5U3RhbGUpIHsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSB0aGUgY29kZSBjaGFuZ2VkIHNpbmNlIC92ZXJpZnkgcmFuIOKAlCByZS1ydW4gL3ZlcmlmeVxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgKGRldGVjdGVkIGJ5IGNvbnRlbnQsIHNvIHRoaXMgY292ZXJzIGNoYW5nZXMgbWFkZSBvdXRzaWRlIFdyaXRlL0VkaXQ6XG4nKTsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgICAgYSBCYXNoIHdyaXRlLCBnaXQgY2hlY2tvdXQvcHVsbCwgb3IgYSBkaWZmZXJlbnQgY2hhbmdlIGluIHRoZSBzYW1lIHNlc3Npb24pXG4nKTsKICAgIH0gZWxzZSBpZiAoIXNkLnZlcmlmeVJ1biAmJiBpbnZhbGlkYXRlZCkgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAtIGEgY29kZSBlZGl0IGludmFsaWRhdGVkIHRoZSBwcmV2aW91cyB2ZXJpZmljYXRpb24g4oCUIHJlLXJ1biAvdmVyaWZ5XG4nKTsKICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJ0xhc3QgZ2F0ZSByZXNldDogJyArIHNkLmxhc3RSZXNldEJ5LmZpbGUgKyAnICh2ZXJpZnkpXG4nKTsKICAgIH0gZWxzZSBpZiAoIXNkLnZlcmlmeVJ1bikgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAtIHRoZSBjaGFuZ2UgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIHNpbmNlIHRoZSBsYXN0IGNvZGUgZWRpdCAocnVuIC92ZXJpZnkpXG4nKTsKICAgIH0gZWxzZSBpZiAoc2QudmVyaWZ5T3V0Y29tZSA9PT0gJ0ZBSUwnIHx8IHNkLnZlcmlmeU91dGNvbWUgPT09ICdVTlZFUklGSUVEJykgewogICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAtIC92ZXJpZnkgcmFuIGFuZCByZXR1cm5lZCAnICsgc2QudmVyaWZ5T3V0Y29tZSArICcg4oCUIGZpeCB0aGUgZmFpbGluZyBjcml0ZXJpYSwgdGhlbiByZS1ydW4gL3ZlcmlmeVxuJyk7CiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgKGEgRkFJTCBpcyBhIHJlYWwgcmVzdWx0LCBub3QgYSBnYXRlIGVycm9yOyB0aGUgUFIgaXMgYmxvY2tlZCBiZWNhdXNlIHRoZSBjaGFuZ2UgZGlkIG5vdCBtZWV0IGl0cyBhY2NlcHRhbmNlIGNyaXRlcmlhKVxuJyk7CiAgICB9IGVsc2UgewogICAgICAvLyBSYW4sIGJ1dCBubyB2ZXJkaWN0IHJlYWNoZWQgdGhlIGdhdGUuIFRXTyB2ZXJ5IGRpZmZlcmVudCBjYXVzZXMsIGFuZAogICAgICAvLyAjMTM5NCBleGlzdHMgYmVjYXVzZSB0aGV5IHVzZWQgdG8gc2hhcmUgb25lIG1lc3NhZ2UgdGhhdCBmaXQgb25seSB0aGUKICAgICAgLy8gZmlyc3Q6IGVpdGhlciAvdmVyaWZ5IG5ldmVyIHJlY29yZGVkIGEgc3RydWN0dXJlZCBvdXRjb21lLCBvciB0aGUgaG9vawogICAgICAvLyB0aGF0IFRSQU5TQ1JJQkVTIHRoZSBvdXRjb21lIGlzIG5vdCB3aXJlZCwgaW4gd2hpY2ggY2FzZSBhIHBlcmZlY3RseQogICAgICAvLyBjb3JyZWN0IHZlcmRpY3Qgd2FzIHN0b3JlZCBhbmQgbm90aGluZyBjb3VsZCBjYXJyeSBpdCB0byB0aGUgZ2F0ZS4KICAgICAgLy8gQmxhbWluZyB0aGUgYWdlbnQgZm9yIHRoZSBzZWNvbmQgY2FzZSBzZW5kcyB0aGUgdXNlciBpbnRvIGFuIHVuYm91bmRlZAogICAgICAvLyByZXRyeSBsb29wIOKAlCByZS1ydW5uaW5nIC92ZXJpZnkgY2Fubm90IGZpeCBhYnNlbnQgd2lyaW5nLgogICAgICBpZiAoIWlzVmVyaWZ5T3V0Y29tZUhvb2tXaXJlZCgpKSB7CiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgLSBgcmVjb3JkLXZlcmlmeS1vdXRjb21lYCBpcyBub3Qgd2lyZWQgaW4gLmNsYXVkZS9zZXR0aW5ncy5qc29uIOKAlCB0aGUgdmVyZGljdCBjYW5ub3QgYmUgcmVjb3JkZWRcbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgL3ZlcmlmeSBtYXkgd2VsbCBoYXZlIHBhc3NlZDsgbm90aGluZyBleGlzdHMgdG8gdHJhbnNjcmliZSBpdHMgcmVzdWx0LCBzbyByZS1ydW5uaW5nIGl0IHdpbGwgbm90IGhlbHAuXG4nKTsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAgIEZpeDogcnVuIGBmbG8gZG9jdG9yIC0tZml4YCwgcmVzdGFydCB0aGUgc2Vzc2lvbiAoQ2xhdWRlIENvZGUgbG9hZHMgaG9va3Mgb25seSBhdCBzdGFydCksIHRoZW4gcmUtcnVuIC92ZXJpZnkuXG4nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnICAtIC92ZXJpZnkgcmFuIGJ1dCByZWNvcmRlZCBubyB2ZXJkaWN0IOKAlCByZS1ydW4gaXQgc28gaXQgc3RvcmVzIGEgc3RydWN0dXJlZCByZXN1bHRcbicpOwogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgKFN0ZXAgNSBvZiB0aGUgdmVyaWZ5IHNraWxsIG11c3QgcGFzcyBtZXRhZGF0YS5vdmVyYWxsIHRvIG1lbW9yeV9zdG9yZSlcbicpOwogICAgICAgIC8vICMxMzQ4IOKAlCB0aGUgdHJhcCB0aGlzIHN0YXRlIHNldHM6IHJlLWludm9raW5nIC92ZXJpZnkgQ0xFQVJTIGFueSBwcmlvcgogICAgICAgIC8vIHZlcmRpY3QgYnkgZGVzaWduICgjMTMzMiksIHNvIHRoZSBvYnZpb3VzIHJlY292ZXJ5IGxhbmRzIHJpZ2h0IGJhY2sgaGVyZQogICAgICAgIC8vIHVubGVzcyBTdGVwIDUgY29tcGxldGVzLiBTYXkgc28sIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgYmUgcmVkaXNjb3ZlcmVkLgogICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCcgICAgUmUtaW52b2tpbmcgL3ZlcmlmeSBjbGVhcnMgdGhlIHByaW9yIHZlcmRpY3QsIHNvIGEgcmUtcnVuIHRoYXQgc2tpcHMgU3RlcCA1IGxhbmRzIGhlcmUgYWdhaW4uXG4nKTsKICAgICAgfQogICAgfQogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoT1JERVJfSElOVCk7CiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRGlzYWJsZSB2aWEgbW9mbG8ueWFtbDpcbicpOwogICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoJyAgZ2F0ZXM6XG4gICAgdmVyaWZ5X2JlZm9yZV9kb25lOiBmYWxzZVxuJyk7CiAgICBwcm9jZXNzLmV4aXQoMik7CiAgfQogIGNhc2UgJ2NoZWNrLWRhbmdlcm91cy1jb21tYW5kJzogewogICAgLy8gIzExNzEgZm9sbG93LXVwIOKAlCBzdHJpcCBxdW90ZWQgc3RyaW5nIGJvZGllcyBhbmQgaGVyZWRvYyBib2RpZXMgYmVmb3JlCiAgICAvLyBzdWJzdHJpbmctbWF0Y2hpbmcgREFOR0VST1VTLiBXaXRob3V0IHRoaXMsIGBnaXQgY29tbWl0IC1tICIuLi5yZW1vdmUtaXRlbQogICAgLy8gLXJlY3Vyc2UgLWZvcmNlIGM6XC4uLiJgIGJsb2NrcyBiZWNhdXNlIHRoZSBsaXRlcmFsIHBhdHRlcm4gYXBwZWFycyBpbgogICAgLy8gdGhlIHF1b3RlZCBtZXNzYWdlIGJvZHkuIFF1b3RlZCB0ZXh0IGlzbid0IGV4ZWN1dGluZyDigJQgdGhlIGdhdGUncyBqb2IgaXMKICAgIC8vIHRvIGNhdGNoIHR5cG8tY2xhc3MgZGVzdHJ1Y3Rpb24gaW4gdGhlIGFjdHVhbCBjb21tYW5kLCBub3QgdGV4dCBtZW50aW9ucwogICAgLy8gaW5zaWRlIGFyZ3VtZW50cy4gVHJhZGUtb2ZmOiBgYmFzaCAtYyAicm0gLXJmIC8iYCBhbHNvIGJ5cGFzc2VzIG5vdzsgdGhlCiAgICAvLyBnYXRlIGlzIGEgdHlwbyBzYWZldHkgbmV0LCBub3QgYSBzZWN1cml0eSBib3VuZGFyeSwgc28gdGhpcyBpcyBhY2NlcHRhYmxlLgogICAgLy8gQ29tbWFuZCBzdWJzdGl0dXRpb25zIGAkKC4uLilgIGFuZCBiYWNrdGlja3MgYXJlIE5PVCBzdHJpcHBlZCDigJQgdGhvc2UKICAgIC8vIGJvZGllcyBleGVjdXRlIGFuZCBkYW5nZXJvdXMgY29udGVudCB0aGVyZSBpcyByZWFsLgogICAgdmFyIHJhdyA9IHByb2Nlc3MuZW52LlRPT0xfSU5QVVRfY29tbWFuZCB8fCAnJzsKICAgIHZhciBjbWQgPSBzdHJpcFF1b3RlZEFuZEhlcmVkb2NzKHJhdykudG9Mb3dlckNhc2UoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgREFOR0VST1VTLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChtYXRjaGVzRGFuZ2Vyb3VzKGNtZCwgREFOR0VST1VTW2ldKSkgewogICAgICAgIGNvbnNvbGUubG9nKCdbQkxPQ0tFRF0gRGFuZ2Vyb3VzIGNvbW1hbmQ6ICcgKyBEQU5HRVJPVVNbaV0pOwogICAgICAgIHByb2Nlc3MuZXhpdCgyKTsKICAgICAgfQogICAgfQogICAgYnJlYWs7CiAgfQogIGNhc2UgJ3Byb21wdC1yZW1pbmRlcic6IHsKICAgIC8vIEZ1bGwgcGVyLXByb21wdCByZXNldC4gV2lyZWQgYXMgdGhlIGZpcnN0IFVzZXJQcm9tcHRTdWJtaXQgaG9vayAodmlhCiAgICAvLyBwcm9tcHQtaG9vay5tanMpLiBPd25zIGludGVyYWN0aW9uQ291bnQgKyBDb250ZXh0IHdhcm5pbmdzOyB0aGUKICAgIC8vIFRhc2tDcmVhdGUgUkVNSU5ERVIgYW5kIG5hbWVzcGFjZSBoaW50IG1vdmVkIHRvIGNoZWNrLWJlZm9yZS1hZ2VudAogICAgLy8gKCM5MzEpIHNvIHRoZXkgb25seSBmaXJlIHdoZW4gQ2xhdWRlIGlzIGFjdHVhbGx5IGFib3V0IHRvIHNwYXduIGFuCiAgICAvLyBBZ2VudC4KICAgIHZhciBzID0gcmVhZFN0YXRlKCk7CiAgICB2YXIgcHJvbXB0ID0gcHJvY2Vzcy5lbnYuQ0xBVURFX1VTRVJfUFJPTVBUIHx8ICcnOwogICAgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KHMsIHByb21wdCk7CiAgICBzLmludGVyYWN0aW9uQ291bnQgPSAocy5pbnRlcmFjdGlvbkNvdW50IHx8IDApICsgMTsKICAgIC8vIFJlY29yZCB0aGUgTUFJTi1MT09QIHNlc3Npb24gaWQgc28gYGZsbyBydW4gZmluYWxpemVgIGNhbiBhdHRyaWJ1dGUKICAgIC8vIHRyYW5zY3JpcHQgdG9rZW4gdXNhZ2UgdG8gYSBydW4gKCMxMzMzKS4gVXNlclByb21wdFN1Ym1pdCBmaXJlcyBvbmx5IGZvcgogICAgLy8gdGhlIHRvcC1sZXZlbCBzZXNzaW9uIOKAlCBzdWJhZ2VudHMgbmV2ZXIgc3VibWl0IGEgdXNlciBwcm9tcHQg4oCUIHNvIHVubGlrZQogICAgLy8gdGhlIHBlci1hY3RvciBgbWVtb3J5U2VhcmNoZWRCeWAgbWFwIHRoaXMgaXMgdW5hbWJpZ3VvdXNseSB0aGUgc2Vzc2lvbgogICAgLy8gd2hvc2UgdHJhbnNjcmlwdCBjYXJyaWVzIHRoZSBydW4uIFN1cnZpdmVzIGFwcGx5UHJvbXB0U3RhdGVSZXNldCBieSBiZWluZwogICAgLy8gd3JpdHRlbiBhZnRlciBpdDsgcmVmcmVzaGVkIGV2ZXJ5IHByb21wdCwgc28gYSAvY2xlYXIgdGhhdCBtaW50cyBhIG5ldyBpZAogICAgLy8gaXMgcGlja2VkIHVwIG9uIHRoZSBuZXh0IHR1cm4gcmF0aGVyIHRoYW4gZ29pbmcgc3RhbGUuCiAgICBpZiAocHJvY2Vzcy5lbnYuSE9PS19TRVNTSU9OX0lEKSBzLnNlc3Npb25JZCA9IHByb2Nlc3MuZW52LkhPT0tfU0VTU0lPTl9JRDsKICAgIC8vICMxNDg3IOKAlCByZXNvbHZlZCBCRUZPUkUgdGhlIHdyaXRlIHNvIHRoZSBlZGdlLXRyaWdnZXIgbWVtbyByaWRlcyB0aGUgc2FtZQogICAgLy8gb25lLCBhbmQgZW1pdHRlZCBhZnRlciB0aGUgL2ZsbyBtb2RpZmllcnMgYmVsb3cgc28gdGhlIGF1dGhvcml0YXRpdmUgcnVuCiAgICAvLyBtb2RlcyBzdGF5IGF0IHRoZSB0b3Agb2YgdGhlIGhvb2sncyBvdXRwdXQuCiAgICB2YXIgY29udGV4dE5vdGljZSA9ICcnOwogICAgaWYgKGNvbmZpZy5jb250ZXh0X3RyYWNraW5nKSB7CiAgICAgIHZhciBjdHggPSBkZXNjcmliZUNvbnRleHQoY29uZmlnLCBzLmNvbXBhY3RlZEF0KTsKICAgICAgLy8gTm90aGluZyBtZWFzdXJhYmxlIOKGkiBub3RoaW5nIHNhaWQsIGFuZCB0aGUgbWVtbyBpcyBsZWZ0IGV4YWN0bHkgYXMgaXQKICAgICAgLy8gd2FzIHNvIGEgdHJhbnNpZW50IHJlYWQgZmFpbHVyZSBjYW5ub3QgcmUtYXJtIGFuIGFscmVhZHktYW5ub3VuY2VkIGJhbmQuCiAgICAgIGlmIChjdHgpIHsKICAgICAgICAvLyBFZGdlLXRyaWdnZXJlZCwgbm90IGxldmVsLXRyaWdnZXJlZCwgYW5kIG9ubHkgdXB3YXJkLiBBIGJhbm5lcgogICAgICAgIC8vIHJlcGVhdGVkIHZlcmJhdGltIGZvciBkb3plbnMgb2YgdHVybnMgY2FycmllcyBubyBpbmZvcm1hdGlvbiBhZnRlciB0aGUKICAgICAgICAvLyBmaXJzdCBvbmUgYW5kIHRyYWlucyB0aGUgbW9kZWwgdG8gdHJlYXQgaXQgYXMgYSBzdGFuZGluZyBpbnN0cnVjdGlvbi4KICAgICAgICAvLyBBIGRvd253YXJkIG1vdmUgc3RpbGwgdXBkYXRlcyB0aGUgbWVtbyDigJQgdGhhdCBpcyB3aGF0IHJlLWFybXMgdGhlIG5leHQKICAgICAgICAvLyBnZW51aW5lIGNyb3NzaW5nIGFmdGVyIGEgY29tcGFjdGlvbi4KICAgICAgICBpZiAoY29udGV4dEJhbmRSYW5rKGN0eC5iYW5kKSA+IGNvbnRleHRCYW5kUmFuayhzLmNvbnRleHRCYW5kKSkgY29udGV4dE5vdGljZSA9IGN0eC5saW5lOwogICAgICAgIHMuY29udGV4dEJhbmQgPSBjdHguYmFuZDsKICAgICAgfQogICAgfQogICAgd3JpdGVTdGF0ZShzKTsKICAgIC8vIEFubm91bmNlIHRoZSByZXNvbHZlZCAvZmxvIHJ1biBtb2RpZmllcnMuIFRoZSBnYXRlIGFscmVhZHkgcGFyc2VkCiAgICAvLyBtb2Zsby55YW1sIGluIFRISVMgcHJvY2VzcyAoZnJlc2ggcGVyIHByb21wdCDigJQgYSBnaXQgcHVsbCBvciBhIG1pZC1zZXNzaW9uCiAgICAvLyB5YW1sIGVkaXQgaXMgcGlja2VkIHVwIGF1dG9tYXRpY2FsbHksIG5vIGNhY2hlIHRvIGludmFsaWRhdGUpLCBzbyB0aGlzCiAgICAvLyBjb3N0cyBubyBleHRyYSByZWFkLiBFbWl0dGluZyBpdCBpcyB3aGF0IGNsb3NlcyB0aGUgbG9vcDogdGhlIHNraWxsIHVzZWQKICAgIC8vIHRvIGNhcnJ5IGBsZXQgc2RkTW9kZSA9IGZhbHNlYCBhcyBhIGxpdGVyYWwgYW5kIHRoZSBtb2RlbCBleGVjdXRlZCBpdCwKICAgIC8vIHNpbGVudGx5IGlnbm9yaW5nIGBzZGQuZGVmYXVsdDogdHJ1ZWAuIE9ubHkgZmlyZXMgb24gL2ZsfC9mbG8gcHJvbXB0cy4KICAgIHZhciBmbG9SdW4gPSByZXNvbHZlRmxvUnVuKHByb21wdCk7CiAgICBpZiAoZmxvUnVuLmlzRmxvKSB7CiAgICAgIGNvbnNvbGUubG9nKAogICAgICAgICdbbW9mbG9dIC9mbG8gcnVuIG1vZGVzIChBVVRIT1JJVEFUSVZFIOKAlCB1c2UgdmVyYmF0aW07IGRvIE5PVCByZS1kZXJpdmUgZnJvbSB0aGUgc2tpbGwgZGVmYXVsdHMpOiAnICsKICAgICAgICAnc2RkPScgKyAoZmxvUnVuLnNkZCA/ICdPTicgOiAnb2ZmJykgKwogICAgICAgICcgdmVyaWZ5PScgKyAoZmxvUnVuLnZlcmlmeSA/ICdPTicgOiAnb2ZmJykgKwogICAgICAgICcgbWVyZ2U9JyArIChmbG9SdW4ubWVyZ2UgPyAnT04nIDogJ29mZicpICsKICAgICAgICAnIFt3b3JrZmxvdz0nICsgZmxvUnVuLndvcmtmbG93ICsgJ10nCiAgICAgICk7CiAgICAgIC8vIFNwZWxsIG91dCB0aGUgc3VycHJpc2luZyBjYXNlOiBhIHByb2plY3QgZGVmYXVsdCB0aGUgdXNlciBkaWQgbm90IHR5cGUuCiAgICAgIGlmIChmbG9SdW4uc2RkICYmIGZsb1J1bi5zZGRTcmMgIT09ICdmbGFnJykgewogICAgICAgIGNvbnNvbGUubG9nKAogICAgICAgICAgJ1ttb2Zsb10gc2RkIGlzIE9OIHZpYSAnICsgZmxvUnVuLnNkZFNyYyArICcg4oCUIHRoZSBzcGVj4oaScGxhbuKGkmltcGxlbWVudOKGknZlcmlmeSBjeWNsZSBpcyAnICsKICAgICAgICAgICdNQU5EQVRPUlkgdGhpcyBydW4uIEF1dGhvciB0aGUgc3BlYyBiZWZvcmUgZWRpdGluZyBzb3VyY2UgKHRoZSBzZGRfZ2F0ZSBibG9ja3Mgc291cmNlICcgKwogICAgICAgICAgJ1dyaXRlL0VkaXQgdW50aWwgYSByZXZpZXdlZCBwbGFuIGV4aXN0cykuIE9uZS1vZmYgb3B0IG91dDogcmUtcnVuIHdpdGggLS1uby1zZGQuJwogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKGZsb1J1bi5tZXJnZSAmJiBmbG9SdW4ubWVyZ2VTcmMgIT09ICdmbGFnJykgewogICAgICAgIGNvbnNvbGUubG9nKCdbbW9mbG9dIG1lcmdlIGlzIE9OIHZpYSAnICsgZmxvUnVuLm1lcmdlU3JjICsgJyDigJQgdGhlIFBSIHdpbGwgYmUgYXV0by1tZXJnZWQuIE9wdCBvdXQ6IC0tbm8tbWVyZ2UuJyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb250ZXh0Tm90aWNlKSBjb25zb2xlLmxvZyhjb250ZXh0Tm90aWNlKTsKICAgIGJyZWFrOwogIH0KICBjYXNlICdwcm9tcHQtc3RhdGUtcmVzZXQnOiB7CiAgICAvLyBEZWZlbnNpdmUgc2FmZXR5LW5ldCBob29rICgjOTMxIGRlZHVwZSkuIFdpcmVkIGFzIHRoZSBzZWNvbmQKICAgIC8vIFVzZXJQcm9tcHRTdWJtaXQgaG9vayBzbyBhbiBleGNlcHRpb24gaW4gcHJvbXB0LWhvb2subWpzIGRvZXNuJ3Qgc2tpcAogICAgLy8gdGhlIHBlci1wcm9tcHQgc3RhdGUgcmVzZXQuIElkZW1wb3RlbnQg4oCUIGFwcGx5UHJvbXB0U3RhdGVSZXNldCBvbmx5CiAgICAvLyBzZXRzIGZpZWxkcyB0byBkZXJpdmVkIHZhbHVlcywgYW5kIHdlIGRlbGliZXJhdGVseSBkbyBOT1QgaW5jcmVtZW50CiAgICAvLyBpbnRlcmFjdGlvbkNvdW50IG9yIGVtaXQgYW55dGhpbmcgKHRoYXQncyBwcm9tcHQtcmVtaW5kZXIncyBqb2IpLgogICAgLy8KICAgIC8vIFNraXAgdGhlIGRpc2sgd3JpdGUgb24gdGhlIG5vcm1hbCBwYXRoOiBwcm9tcHQtcmVtaW5kZXIgcnVucyBmaXJzdCBhbmQKICAgIC8vIGFscmVhZHkgd3JvdGUgdGhlIGJ5dGUtaWRlbnRpY2FsIHBvc3QtcmVzZXQgc3RhdGUuIE9ubHkgd3JpdGVTdGF0ZSB3aGVuCiAgICAvLyB0aGUgcmVzZXQgYWN0dWFsbHkgY2hhbmdlZCBzb21ldGhpbmcgKGkuZS4sIHByb21wdC1yZW1pbmRlciB3YXMgc2tpcHBlZAogICAgLy8gYmVjYXVzZSBwcm9tcHQtaG9vay5tanMgdGhyZXcgYmVmb3JlIGludm9raW5nIGl0KS4KICAgIHZhciBwcm9tcHQgPSBwcm9jZXNzLmVudi5DTEFVREVfVVNFUl9QUk9NUFQgfHwgJyc7CiAgICAvLyAjMTQ0NyDigJQgYSBzYWZldHkgbmV0IHRoYXQgY2Fubm90IHNlZSB0aGUgcHJvbXB0IG11c3QgZG8gTk9USElORywgbm90CiAgICAvLyBkZWNpZGUuIFRoaXMgYnJpZGdlIGRpZCBub3QgZm9yd2FyZCBgcHJvbXB0YCB1bnRpbCAjMTQ0Nywgc28gdGhpcyBob29rCiAgICAvLyBjbGFzc2lmaWVkIHRoZSBlbXB0eSBzdHJpbmcgb24gZXZlcnkgcHJvbXB0LCBjb25jbHVkZWQgIm5vIG1lbW9yeQogICAgLy8gcmVxdWlyZWQiLCBhbmQgd3JvdGUgdGhhdCBvdmVyIHRoZSBjb3JyZWN0IHZhbHVlIHByb21wdC1yZW1pbmRlciBoYWQganVzdAogICAgLy8gY29tcHV0ZWQg4oCUIGRpc2FybWluZyB0aGUgbWVtb3J5IGdhdGUgaXQgZXhpc3RzIHRvIHByb3RlY3QsIGludGVybWl0dGVudGx5LAogICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIFVzZXJQcm9tcHRTdWJtaXQgaG9vayB3cm90ZSBsYXN0LiBUaGUgZm9yd2FyZGluZyBmaXgKICAgIC8vIGFkZHJlc3NlcyB0aGUgY2F1c2U7IHRoaXMgZ3VhcmQgbWFrZXMgdGhlIGZhaWx1cmUgbW9kZSBzdXJ2aXZhYmxlIGlmIHRoZQogICAgLy8gZmllbGQgZXZlciBnb2VzIG1pc3NpbmcgYWdhaW4gKGEgaG9zdCB0aGF0IG9taXRzIGl0LCBhIHBheWxvYWQgY2hhbmdlKToKICAgIC8vIHN0aWxsIGludmFsaWRhdGUgdGhlIGNyZWRpdHMg4oCUIHRoYXQgaXMgdGhpcyBob29rJ3Mgd2hvbGUgcmVhc29uIHRvIGV4aXN0CiAgICAvLyBhbmQgbmVlZHMgbm8gcHJvbXB0IOKAlCBidXQgbGVhdmUgdGhlIGFybWluZyB2ZXJkaWN0IHRvIHByb21wdC1yZW1pbmRlciwKICAgIC8vIHdoaWNoIGhhcyB0aGUgdGV4dC4gRGVjaWRpbmcgIm5vdCByZXF1aXJlZCIgZnJvbSBhIHByb21wdCBpdCBjYW5ub3Qgc2VlCiAgICAvLyBpcyBleGFjdGx5IHRoZSBidWcuCiAgICB2YXIgcyA9IHJlYWRTdGF0ZSgpOwogICAgdmFyIGJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KHMpOwogICAgYXBwbHlQcm9tcHRTdGF0ZVJlc2V0KHMsIHByb21wdCwgeyBza2lwQXJtaW5nOiAhcHJvbXB0IH0pOwogICAgaWYgKEpTT04uc3RyaW5naWZ5KHMpICE9PSBiZWZvcmUpIHdyaXRlU3RhdGUocyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAnY29tcGFjdC1ndWlkYW5jZSc6IHsKICAgIGNvbnNvbGUubG9nKCdQcmUtQ29tcGFjdDogQ2hlY2sgQ0xBVURFLm1kIGZvciBydWxlcy4gVXNlIG1lbW9yeSBzZWFyY2ggdG8gcmVjb3ZlciBjb250ZXh0IGFmdGVyIGNvbXBhY3QuJyk7CiAgICBicmVhazsKICB9CiAgY2FzZSAnc2Vzc2lvbi1yZXNldCc6IHsKICAgIC8vIERlcml2ZSBmcm9tIFNUQVRFX0RFRkFVTFRTIHNvIGFkZGluZyBhIG5ldyBzdGF0ZSBmaWVsZCByZXF1aXJlcyBvbmx5IG9uZQogICAgLy8gZWRpdCAodGhlIGRlZmF1bHRzIG9iamVjdCkg4oCUIHRoZSBsaXRlcmFsIHRoYXQgdXNlZCB0byBsaXZlIGhlcmUgZHJpZnRlZAogICAgLy8gZXZlcnkgdGltZSBhIGZpZWxkIHdhcyBhZGRlZCBhbmQgaXMgd2hhdCBtb3RpdmF0ZWQgIzk1MidzIGF1ZGl0IG9mIHN0YXRlCiAgICAvLyBzaGFwZSBjb25zaXN0ZW5jeS4KICAgIHdyaXRlU3RhdGUoT2JqZWN0LmFzc2lnbih7fSwgU1RBVEVfREVGQVVMVFMsIHsgc2Vzc2lvblN0YXJ0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpOwogICAgYnJlYWs7CiAgfQogIGRlZmF1bHQ6CiAgICBicmVhazsKfQo=",
20
20
  "hook-handler.cjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwoKdmFyIFBST0pFQ1RfRElSID0gKHByb2Nlc3MuZW52LkNMQVVERV9QUk9KRUNUX0RJUiB8fCBwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlKC9eXC8oW2Etel0pXC8vaSwgJyQxOi8nKTsKdmFyIE1FVFJJQ1NfRklMRSA9IHBhdGguam9pbihQUk9KRUNUX0RJUiwgJy5tb2ZsbycsICdtZXRyaWNzJywgJ2xlYXJuaW5nLmpzb24nKTsKdmFyIGNvbW1hbmQgPSBwcm9jZXNzLmFyZ3ZbMl07CgovLyBSZWFkIHN0ZGluIChDbGF1ZGUgQ29kZSBzZW5kcyBob29rIGRhdGEgYXMgSlNPTikKZnVuY3Rpb24gcmVhZFN0ZGluKCkgewogIGlmIChwcm9jZXNzLnN0ZGluLmlzVFRZKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkgewogICAgdmFyIGRhdGEgPSAnJzsKICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7CiAgICAgIHByb2Nlc3Muc3RkaW4ucGF1c2UoKTsKICAgICAgcmVzb2x2ZShkYXRhKTsKICAgIH0sIDUwMCk7CiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCd1dGY4Jyk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHsgZGF0YSArPSBjaHVuazsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBmdW5jdGlvbigpIHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZShkYXRhKTsgfSk7CiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQodGltZXIpOyByZXNvbHZlKGRhdGEpOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1bXBNZXRyaWMoa2V5KSB7CiAgdHJ5IHsKICAgIHZhciBtZXRyaWNzID0ge307CiAgICBpZiAoZnMuZXhpc3RzU3luYyhNRVRSSUNTX0ZJTEUpKSBtZXRyaWNzID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoTUVUUklDU19GSUxFLCAndXRmLTgnKSk7CiAgICBtZXRyaWNzW2tleV0gPSAobWV0cmljc1trZXldIHx8IDApICsgMTsKICAgIG1ldHJpY3MubGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICB2YXIgZGlyID0gcGF0aC5kaXJuYW1lKE1FVFJJQ1NfRklMRSk7CiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICBmcy53cml0ZUZpbGVTeW5jKE1FVFJJQ1NfRklMRSwgSlNPTi5zdHJpbmdpZnkobWV0cmljcywgbnVsbCwgMikpOwogIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsICovIH0KfQoKcmVhZFN0ZGluKCkudGhlbihmdW5jdGlvbihzdGRpbkRhdGEpIHsKICB2YXIgaG9va0lucHV0ID0ge307CiAgaWYgKHN0ZGluRGF0YSAmJiBzdGRpbkRhdGEudHJpbSgpKSB7CiAgICB0cnkgeyBob29rSW5wdXQgPSBKU09OLnBhcnNlKHN0ZGluRGF0YSk7IH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0KICB9CgogIHN3aXRjaCAoY29tbWFuZCkgewogICAgY2FzZSAncm91dGUnOiB7CiAgICAgIHZhciBwcm9tcHQgPSBob29rSW5wdXQucHJvbXB0IHx8IGhvb2tJbnB1dC5jb21tYW5kIHx8IHByb2Nlc3MuZW52LlBST01QVCB8fCAnJzsKICAgICAgaWYgKHByb21wdCkgY29uc29sZS5sb2coJ1tJTkZPXSBSb3V0aW5nOiAnICsgcHJvbXB0LnN1YnN0cmluZygwLCA4MCkpOwogICAgICBlbHNlIGNvbnNvbGUubG9nKCdbSU5GT10gUmVhZHknKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlICdwcmUtZWRpdCc6CiAgICBjYXNlICdwb3N0LWVkaXQnOgogICAgICBidW1wTWV0cmljKCdlZGl0cycpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBFZGl0IHJlY29yZGVkJyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJlLXRhc2snOgogICAgICBidW1wTWV0cmljKCd0YXNrcycpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBUYXNrIHN0YXJ0ZWQnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdwb3N0LXRhc2snOgogICAgICBidW1wTWV0cmljKCd0YXNrc0NvbXBsZXRlZCcpOwogICAgICBjb25zb2xlLmxvZygnW09LXSBUYXNrIGNvbXBsZXRlZCcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ3Nlc3Npb24tZW5kJzogewogICAgICAvLyBLaWxsIHRyYWNrZWQgYmFja2dyb3VuZCBwcm9jZXNzZXMgdmlhIHNoYXJlZCBzeW5jIGhlbHBlcgogICAgICB0cnkgewogICAgICAgIHZhciBjbGVhbnVwID0gcmVxdWlyZSgnLi9saWIvcmVnaXN0cnktY2xlYW51cC5janMnKTsKICAgICAgICB2YXIga2lsbGVkID0gY2xlYW51cC5raWxsVHJhY2tlZFN5bmMoUFJPSkVDVF9ESVIpOwogICAgICAgIGlmIChraWxsZWQgPiAwKSBjb25zb2xlLmxvZygnW0NMRUFOVVBdIEtpbGxlZCAnICsga2lsbGVkICsgJyBiYWNrZ3JvdW5kIHByb2Nlc3MoZXMpJyk7CiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogbm9uLWZhdGFsOiBjbGVhbnVwIG1vZHVsZSBub3QgYXZhaWxhYmxlICovIH0KICAgICAgY29uc29sZS5sb2coJ1tPS10gU2Vzc2lvbiBlbmRlZCcpOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgJ25vdGlmaWNhdGlvbic6CiAgICAgIC8vIFNpbGVudCDigJQganVzdCBhY2tub3dsZWRnZQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGlmIChjb21tYW5kKSBjb25zb2xlLmxvZygnW09LXSBIb29rOiAnICsgY29tbWFuZCk7CiAgICAgIGJyZWFrOwogIH0KfSk7Cg==",
21
21
  "post-commit": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7Cgp2YXIgUFJPSkVDVF9ESVIgPSAocHJvY2Vzcy5lbnYuQ0xBVURFX1BST0pFQ1RfRElSIHx8IHByb2Nlc3MuY3dkKCkpLnJlcGxhY2UoL15cLyhbYS16XSlcLy9pLCAnJDE6LycpOwoKdHJ5IHsKICB2YXIgaGFzaCA9IGNoaWxkUHJvY2Vzcy5leGVjRmlsZVN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJ0hFQUQnXSwgewogICAgZW5jb2Rpbmc6ICd1dGYtOCcsCiAgICBjd2Q6IFBST0pFQ1RfRElSLAogICAgd2luZG93c0hpZGU6IHRydWUKICB9KS50cmltKCk7CgogIHZhciBtc2cgPSBjaGlsZFByb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xvZycsICctMScsICctLXByZXR0eT0lQiddLCB7CiAgICBlbmNvZGluZzogJ3V0Zi04JywKICAgIGN3ZDogUFJPSkVDVF9ESVIsCiAgICB3aW5kb3dzSGlkZTogdHJ1ZQogIH0pLnRyaW0oKTsKCiAgY29uc29sZS5sb2coJ0NvbW1pdCByZWNvcmRlZDogJyArIGhhc2guc3Vic3RyaW5nKDAsIDgpKTsKfSBjYXRjaCAoZSkgewogIC8vIE5vbi1mYXRhbAp9Cg==",
22
22
  "pre-commit": "IyEvdXNyL2Jpbi9lbnYgbm9kZQondXNlIHN0cmljdCc7CnZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwoKdmFyIFBST0pFQ1RfRElSID0gKHByb2Nlc3MuZW52LkNMQVVERV9QUk9KRUNUX0RJUiB8fCBwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlKC9eXC8oW2Etel0pXC8vaSwgJyQxOi8nKTsKCmNvbnNvbGUubG9nKCdSdW5uaW5nIHByZS1jb21taXQgY2hlY2tzLi4uJyk7Cgp0cnkgewogIHZhciBzdGFnZWQgPSBjaGlsZFByb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1jYWNoZWQnLCAnLS1uYW1lLW9ubHknLCAnLS1kaWZmLWZpbHRlcj1BQ00nXSwgewogICAgZW5jb2Rpbmc6ICd1dGYtOCcsCiAgICBjd2Q6IFBST0pFQ1RfRElSLAogICAgd2luZG93c0hpZGU6IHRydWUKICB9KS50cmltKCk7CgogIGlmIChzdGFnZWQpIHsKICAgIHZhciBmaWxlcyA9IHN0YWdlZC5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24oZikgeyByZXR1cm4gL1wuKHRzfGpzfHRzeHxqc3gpJC8udGVzdChmKTsgfSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnNvbGUubG9nKCcgIFZhbGlkYXRpbmc6ICcgKyBmaWxlc1tpXSk7CiAgICB9CiAgfQp9IGNhdGNoIChlKSB7CiAgLy8gTm9uLWZhdGFsIOKAlCBhbGxvdyBjb21taXQgdG8gcHJvY2VlZAp9Cgpjb25zb2xlLmxvZygnUHJlLWNvbW1pdCBjaGVja3MgY29tcGxldGUnKTsK",
23
- "prompt-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJzsKaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnOwppbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7CgovLyBSZWFkIHN0ZGluIEpTT04gZnJvbSBDbGF1ZGUgQ29kZQp2YXIgc3RkaW5EYXRhID0gJyc7CnRyeSB7CiAgc3RkaW5EYXRhID0gYXdhaXQgbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICB2YXIgZGF0YSA9ICcnOwogICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyByZXMoZGF0YSk7IH0sIDUwMCk7CiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCd1dGYtOCcpOwogICAgcHJvY2Vzcy5zdGRpbi5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7IGRhdGEgKz0gY2h1bms7IH0pOwogICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0aW1lb3V0KTsgcmVzKGRhdGEpOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2Vycm9yJywgZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0aW1lb3V0KTsgcmVzKCcnKTsgfSk7CiAgICBpZiAocHJvY2Vzcy5zdGRpbi5pc1RUWSkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcygnJyk7IH0KICB9KTsKfSBjYXRjaCAoZSkgeyAvKiBubyBzdGRpbiAqLyB9Cgp2YXIgaG9va0NvbnRleHQgPSB7fTsKdHJ5IHsgaWYgKHN0ZGluRGF0YS50cmltKCkpIGhvb2tDb250ZXh0ID0gSlNPTi5wYXJzZShzdGRpbkRhdGEpOyB9IGNhdGNoIChlKSB7fQoKdmFyIHVzZXJQcm9tcHQgPSBob29rQ29udGV4dC51c2VyX3Byb21wdCB8fCBob29rQ29udGV4dC5wcm9tcHQgfHwgJyc7CnZhciBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgeyBDTEFVREVfVVNFUl9QUk9NUFQ6IHVzZXJQcm9tcHQgfSk7CgovLyAjMTM5NyDigJQgZm9yd2FyZCBDbGF1ZGUgQ29kZSdzIHNlc3Npb25faWQsIHNhbWUgY29udHJhY3QgYXMgZ2F0ZS1ob29rLm1qczozMy4KLy8gYHByb21wdC1yZW1pbmRlcmAgc3RhbXBzIGl0IG9udG8gd29ya2Zsb3ctc3RhdGUuanNvbiAoZ2F0ZS5janMpLCB3aGljaCBpcyB0aGUKLy8gb25seSBwbGFjZSBgZmxvIHJ1bnMgc3RhcnRgIGNhbiByZWFkIGl0IGZyb207IHdpdGhvdXQgaXQgZXZlcnkgcnVuIHJlY29yZCBnb3QKLy8gc2Vzc2lvbklkOm51bGwgYW5kIGEgemVyb2VkIHRva2VuIHJvbGx1cC4gcHJvbXB0LXJlbWluZGVyIGlzIGludm9rZWQgdGhyb3VnaAovLyBUSElTIHdyYXBwZXIsIG5vdCBnYXRlLWhvb2subWpzLCBzbyB0aGUgaWQgaGFzIHRvIGJlIGZvcndhcmRlZCBoZXJlIHRvby4KaWYgKHR5cGVvZiBob29rQ29udGV4dC5zZXNzaW9uX2lkID09PSAnc3RyaW5nJyAmJiBob29rQ29udGV4dC5zZXNzaW9uX2lkKSB7CiAgZW52LkhPT0tfU0VTU0lPTl9JRCA9IGhvb2tDb250ZXh0LnNlc3Npb25faWQ7Cn0KCi8vIFJ1biBwcm9tcHQtcmVtaW5kZXIgdmlhIGdhdGUuY2pzCnZhciBwcm9qZWN0RGlyID0gKGVudi5DTEFVREVfUFJPSkVDVF9ESVIgfHwgcHJvY2Vzcy5jd2QoKSkucmVwbGFjZSgvXlwvKFthLXpdKVwvL2ksICckMTovJyk7CnZhciBnYXRlU2NyaXB0ID0gcmVzb2x2ZShwcm9qZWN0RGlyLCAnLmNsYXVkZS9oZWxwZXJzL2dhdGUuY2pzJyk7CnZhciBvdXRwdXQgPSAnJzsKdHJ5IHsKICBvdXRwdXQgPSBleGVjRmlsZVN5bmMoJ25vZGUnLCBbZ2F0ZVNjcmlwdCwgJ3Byb21wdC1yZW1pbmRlciddLCB7CiAgICBlbnY6IGVudiwgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDMwMDAsIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ10sIHdpbmRvd3NIaWRlOiB0cnVlCiAgfSk7Cn0gY2F0Y2ggKGVycikgeyBvdXRwdXQgPSAoZXJyICYmIGVyci5zdGRvdXQpIHx8ICcnOyB9CgovLyAjOTMxIOKAlCBOYW1lc3BhY2UgaGludCBjbGFzc2lmaWNhdGlvbiBtb3ZlZCBpbnRvIGdhdGUuY2pzIChjb21wdXRlZCBieQovLyBwcm9tcHQtcmVtaW5kZXIsIHN0b3JlZCBvbiB3b3JrZmxvdy1zdGF0ZS5qc29uLCBlbWl0dGVkIG9uY2UgYnkKLy8gY2hlY2stYmVmb3JlLWFnZW50IGF0IEFnZW50LXNwYXduIHRpbWUpLiBObyBwZXItcHJvbXB0IHRva2VuIGxlYWsgbm93LgoKLy8gIzg2NyDigJQgc3VyZmFjZSBwb3N0LWluc3RhbGwgcmVzdGFydCBub3RpY2UuIEZpbGUgaXMgd3JpdHRlbiBieQovLyBzY3JpcHRzL3Bvc3QtaW5zdGFsbC1ub3RpY2UubWpzIGFuZCBjbGVhcmVkIGJ5IHRoZSBTZXNzaW9uU3RhcnQgbGF1bmNoZXIKLy8gb25jZSB0aGUgcnVubmluZyBtb2ZsbyBtYXRjaGVzIHRoZSBmaWxlJ3MgdmVyc2lvbiwgc28gdGhlIGZpbGUncwovLyBleGlzdGVuY2UgYXQgcHJvbXB0LXRpbWUgaXMgaXRzZWxmIHRoZSAic3RpbGwgbmVlZHMgcmVzdGFydCIgc2lnbmFsLgp2YXIgcmVzdGFydE5vdGljZSA9ICcnOwp0cnkgewogIHZhciBwZW5kaW5nUGF0aCA9IHJlc29sdmUocHJvamVjdERpciwgJy5tb2ZsbycsICdyZXN0YXJ0LXBlbmRpbmcuanNvbicpOwogIHZhciBwZW5kaW5nID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGVuZGluZ1BhdGgsICd1dGYtOCcpKTsKICBpZiAocGVuZGluZyAmJiB0eXBlb2YgcGVuZGluZy5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBwZW5kaW5nLm1lc3NhZ2UubGVuZ3RoID4gMCkgewogICAgcmVzdGFydE5vdGljZSA9IHBlbmRpbmcubWVzc2FnZTsKICB9Cn0gY2F0Y2ggKGUpIHsgLyogRU5PRU5UIG9yIG1hbGZvcm1lZCDigJQgc2lsZW50IGZhc3QtcGF0aCAqLyB9Cgp2YXIgcGFydHMgPSBbcmVzdGFydE5vdGljZSwgb3V0cHV0LnRyaW0oKV0uZmlsdGVyKEJvb2xlYW4pOwppZiAocGFydHMubGVuZ3RoKSBwcm9jZXNzLnN0ZG91dC53cml0ZShwYXJ0cy5qb2luKCdcblxuJykgKyAnXG4nKTsKcHJvY2Vzcy5leGl0KDApOwo=",
23
+ "prompt-hook.mjs": "IyEvdXNyL2Jpbi9lbnYgbm9kZQppbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJzsKaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnOwppbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7CgovLyBSZWFkIHN0ZGluIEpTT04gZnJvbSBDbGF1ZGUgQ29kZQp2YXIgc3RkaW5EYXRhID0gJyc7CnRyeSB7CiAgc3RkaW5EYXRhID0gYXdhaXQgbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICB2YXIgZGF0YSA9ICcnOwogICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyByZXMoZGF0YSk7IH0sIDUwMCk7CiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCd1dGYtOCcpOwogICAgcHJvY2Vzcy5zdGRpbi5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7IGRhdGEgKz0gY2h1bms7IH0pOwogICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0aW1lb3V0KTsgcmVzKGRhdGEpOyB9KTsKICAgIHByb2Nlc3Muc3RkaW4ub24oJ2Vycm9yJywgZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0aW1lb3V0KTsgcmVzKCcnKTsgfSk7CiAgICBpZiAocHJvY2Vzcy5zdGRpbi5pc1RUWSkgeyBjbGVhclRpbWVvdXQodGltZW91dCk7IHJlcygnJyk7IH0KICB9KTsKfSBjYXRjaCAoZSkgeyAvKiBubyBzdGRpbiAqLyB9Cgp2YXIgaG9va0NvbnRleHQgPSB7fTsKdHJ5IHsgaWYgKHN0ZGluRGF0YS50cmltKCkpIGhvb2tDb250ZXh0ID0gSlNPTi5wYXJzZShzdGRpbkRhdGEpOyB9IGNhdGNoIChlKSB7fQoKdmFyIHVzZXJQcm9tcHQgPSBob29rQ29udGV4dC51c2VyX3Byb21wdCB8fCBob29rQ29udGV4dC5wcm9tcHQgfHwgJyc7CnZhciBlbnYgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgeyBDTEFVREVfVVNFUl9QUk9NUFQ6IHVzZXJQcm9tcHQgfSk7CgovLyAjMTM5NyDigJQgZm9yd2FyZCBDbGF1ZGUgQ29kZSdzIHNlc3Npb25faWQsIHNhbWUgY29udHJhY3QgYXMgZ2F0ZS1ob29rLm1qczozMy4KLy8gYHByb21wdC1yZW1pbmRlcmAgc3RhbXBzIGl0IG9udG8gd29ya2Zsb3ctc3RhdGUuanNvbiAoZ2F0ZS5janMpLCB3aGljaCBpcyB0aGUKLy8gb25seSBwbGFjZSBgZmxvIHJ1bnMgc3RhcnRgIGNhbiByZWFkIGl0IGZyb207IHdpdGhvdXQgaXQgZXZlcnkgcnVuIHJlY29yZCBnb3QKLy8gc2Vzc2lvbklkOm51bGwgYW5kIGEgemVyb2VkIHRva2VuIHJvbGx1cC4gcHJvbXB0LXJlbWluZGVyIGlzIGludm9rZWQgdGhyb3VnaAovLyBUSElTIHdyYXBwZXIsIG5vdCBnYXRlLWhvb2subWpzLCBzbyB0aGUgaWQgaGFzIHRvIGJlIGZvcndhcmRlZCBoZXJlIHRvby4KaWYgKHR5cGVvZiBob29rQ29udGV4dC5zZXNzaW9uX2lkID09PSAnc3RyaW5nJyAmJiBob29rQ29udGV4dC5zZXNzaW9uX2lkKSB7CiAgZW52LkhPT0tfU0VTU0lPTl9JRCA9IGhvb2tDb250ZXh0LnNlc3Npb25faWQ7Cn0KCi8vICMxNDg3IOKAlCBmb3J3YXJkIHRoZSB0cmFuc2NyaXB0IHBhdGggc28gYHByb21wdC1yZW1pbmRlcmAgY2FuIHJlcG9ydCBSRUFMCi8vIGNvbnRleHQgdXNhZ2UgaW5zdGVhZCBvZiBhIHR1cm4gY291bnRlci4gQ2xhdWRlIENvZGUgd3JpdGVzIHBlci10dXJuIHRva2VuCi8vIHVzYWdlIGludG8gdGhpcyBmaWxlLCBhbmQgaXQgaXMgdGhlIG9ubHkgcGxhY2UgYSBVc2VyUHJvbXB0U3VibWl0IGhvb2sgY2FuCi8vIHJlYWQgaXQ6IHRoZSBwYXlsb2FkIGNhcnJpZXMgbm8gdXNhZ2UgZmllbGQgb2YgaXRzIG93bi4gQWJzZW50IG9yIG5vbi1zdHJpbmcKLy8gKGFuIG9sZGVyIGhvc3QsIGEgdGVzdCBoYXJuZXNzKSBzaW1wbHkgbGVhdmVzIHRoZSB2YXIgdW5zZXQsIGFuZCBnYXRlLmNqcwovLyBmYWxscyBiYWNrIHRvIHRoZSB0dXJuIGNvdW50LgppZiAodHlwZW9mIGhvb2tDb250ZXh0LnRyYW5zY3JpcHRfcGF0aCA9PT0gJ3N0cmluZycgJiYgaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoKSB7CiAgZW52LkhPT0tfVFJBTlNDUklQVF9QQVRIID0gaG9va0NvbnRleHQudHJhbnNjcmlwdF9wYXRoOwp9CgovLyBSdW4gcHJvbXB0LXJlbWluZGVyIHZpYSBnYXRlLmNqcwp2YXIgcHJvamVjdERpciA9IChlbnYuQ0xBVURFX1BST0pFQ1RfRElSIHx8IHByb2Nlc3MuY3dkKCkpLnJlcGxhY2UoL15cLyhbYS16XSlcLy9pLCAnJDE6LycpOwp2YXIgZ2F0ZVNjcmlwdCA9IHJlc29sdmUocHJvamVjdERpciwgJy5jbGF1ZGUvaGVscGVycy9nYXRlLmNqcycpOwp2YXIgb3V0cHV0ID0gJyc7CnRyeSB7CiAgb3V0cHV0ID0gZXhlY0ZpbGVTeW5jKCdub2RlJywgW2dhdGVTY3JpcHQsICdwcm9tcHQtcmVtaW5kZXInXSwgewogICAgZW52OiBlbnYsIGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiAzMDAwLCBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCAncGlwZSddLCB3aW5kb3dzSGlkZTogdHJ1ZQogIH0pOwp9IGNhdGNoIChlcnIpIHsgb3V0cHV0ID0gKGVyciAmJiBlcnIuc3Rkb3V0KSB8fCAnJzsgfQoKLy8gIzkzMSDigJQgTmFtZXNwYWNlIGhpbnQgY2xhc3NpZmljYXRpb24gbW92ZWQgaW50byBnYXRlLmNqcyAoY29tcHV0ZWQgYnkKLy8gcHJvbXB0LXJlbWluZGVyLCBzdG9yZWQgb24gd29ya2Zsb3ctc3RhdGUuanNvbiwgZW1pdHRlZCBvbmNlIGJ5Ci8vIGNoZWNrLWJlZm9yZS1hZ2VudCBhdCBBZ2VudC1zcGF3biB0aW1lKS4gTm8gcGVyLXByb21wdCB0b2tlbiBsZWFrIG5vdy4KCi8vICM4Njcg4oCUIHN1cmZhY2UgcG9zdC1pbnN0YWxsIHJlc3RhcnQgbm90aWNlLiBGaWxlIGlzIHdyaXR0ZW4gYnkKLy8gc2NyaXB0cy9wb3N0LWluc3RhbGwtbm90aWNlLm1qcyBhbmQgY2xlYXJlZCBieSB0aGUgU2Vzc2lvblN0YXJ0IGxhdW5jaGVyCi8vIG9uY2UgdGhlIHJ1bm5pbmcgbW9mbG8gbWF0Y2hlcyB0aGUgZmlsZSdzIHZlcnNpb24sIHNvIHRoZSBmaWxlJ3MKLy8gZXhpc3RlbmNlIGF0IHByb21wdC10aW1lIGlzIGl0c2VsZiB0aGUgInN0aWxsIG5lZWRzIHJlc3RhcnQiIHNpZ25hbC4KdmFyIHJlc3RhcnROb3RpY2UgPSAnJzsKdHJ5IHsKICB2YXIgcGVuZGluZ1BhdGggPSByZXNvbHZlKHByb2plY3REaXIsICcubW9mbG8nLCAncmVzdGFydC1wZW5kaW5nLmpzb24nKTsKICB2YXIgcGVuZGluZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBlbmRpbmdQYXRoLCAndXRmLTgnKSk7CiAgaWYgKHBlbmRpbmcgJiYgdHlwZW9mIHBlbmRpbmcubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgcGVuZGluZy5tZXNzYWdlLmxlbmd0aCA+IDApIHsKICAgIHJlc3RhcnROb3RpY2UgPSBwZW5kaW5nLm1lc3NhZ2U7CiAgfQp9IGNhdGNoIChlKSB7IC8qIEVOT0VOVCBvciBtYWxmb3JtZWQg4oCUIHNpbGVudCBmYXN0LXBhdGggKi8gfQoKdmFyIHBhcnRzID0gW3Jlc3RhcnROb3RpY2UsIG91dHB1dC50cmltKCldLmZpbHRlcihCb29sZWFuKTsKaWYgKHBhcnRzLmxlbmd0aCkgcHJvY2Vzcy5zdGRvdXQud3JpdGUocGFydHMuam9pbignXG5cbicpICsgJ1xuJyk7CnByb2Nlc3MuZXhpdCgwKTsK",
24
24
  };
25
25
  //# sourceMappingURL=embedded-helpers.js.map