Data: {"file1":"PD9waHANCg0KaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46IConKTsNCg0KLy8vLyBVUkxzIHRlc3RpbmcNCi8vLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5zdGcuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9BSUZTZXJ2aWNlcy9zZXJ2aWNlcy9JbnZvaWNlSGFuZGxpbmdTZXJ2aWNlcz93c2RsIik7DQovLy8vIGRlZmluZSgiV1NETDIiLCJodHRwOi8vd2xwb29sLnN0Zy5haWMuY2FycmFzY28uYWVybzo5MDgwL0FJRlNlcnZpY2VzL3NlcnZpY2VzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCi8vLy8gVVJMcyBwcm9kdWNjacOzbg0KLy8vLyBkZWZpbmUoIldTREwiLCJodHRwOi8vd2xwb29sLmZlLmFpYy5jYXJyYXNjby5hZXJvOjkwODAvQUlGU2VydmljZXMvc2VydmljZXMvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KLy8vLyBkZWZpbmUoIldTREwyIiwiaHR0cDovL3dscG9vbC5mZS5haWMuY2FycmFzY28uYWVybzo5MDgwL0FJRlNlcnZpY2VzL3NlcnZpY2VzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCi8vIFVSTHMgdGVzdGluZw0KLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5zdGcuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KLy8gZGVmaW5lKCJXU0RMMiIsImh0dHA6Ly93bHBvb2wuc3RnLmFpYy5jYXJyYXNjby5hZXJvOjkwODAvYWlmL3dzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCi8vIFVSTHMgcHJvZA0KLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5mZS5haWMuY2FycmFzY28uYWVybzo5MDgwL2FpZi93cy9JbnZvaWNlSGFuZGxpbmdTZXJ2aWNlcz93c2RsIik7DQpkZWZpbmUoIldTREwiLCJodHRwOi8vd2xwb29sMi5mZS5haWMuY2FycmFzY28uYWVyby9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KLy8gZGVmaW5lKCJXU0RMMiIsImh0dHA6Ly93bHBvb2wuZmUuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXMiKTsNCmRlZmluZSgiV1NETDIiLCJodHRwOi8vd2xwb29sMi5mZS5haWMuY2FycmFzY28uYWVyby9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXMiKTsNCg0KLy8gQVBJX1RJTFNPUi8NCg0KZnVuY3Rpb24gc2F2ZVRYVCgkZmlsZSwgJGRhdGEsICR1cmxGcm9tLCAkYWN0aW9uKXsNCgkkZmVjaGEgPSBuZXcgRGF0ZVRpbWUoKTsNCgkkZmVjaGEgPSAkZmVjaGEtPmZvcm1hdCgiWS1tLWQgSDppOnMiKTsNCglmaWxlX3B1dF9jb250ZW50cygkZmlsZS4iLnR4dCIsIlxuRGF0YTogIi4kZGF0YS4iXG5EZXNkZTogIi4kdXJsRnJvbS4iLCBBY3Rpb246ICIuJGFjdGlvbi4iLCBGZWNoYTogIi4kZmVjaGEuIi5cbiIsIEZJTEVfQVBQRU5EKTsNCn0NCg0KJGxvZ0Vycm9yID0gImxvZ3MvdGlsc29yL2Vycm9yZXMiOw0KJGxvZ1BldGljaW9uID0gImxvZ3MvdGlsc29yL2VudmlhZG8iOw0KJGxvZ1Jlc3B1ZXN0YSA9ICJsb2dzL3RpbHNvci9yZXNwdWVzdGEiOw0KJHVybExvZyA9ICIxMC40NC4yMDAuMTEvaXBhcmtpbmdzX3Byb2Qvb3JtX3Bjcy90ZXJtaW5hbF93ZWIvdGlsc29yLnBocCI7DQoNCiRyZXNwdWVzdGEgPSAob2JqZWN0KQ0KWw0KICAgICJjb2RpZ28iID0+IDAsDQogICAgImVycm9yIiA9PiAiT2siLA0KICAgICJtc2oiID0+ICJUb2RvIGNvcnJlY3RvLiINCl07DQoNCiR0aXBvRGF0b1JlY2liaWRvID0gJF9TRVJWRVJbJ0NPTlRFTlRfVFlQRSddOw0KDQppZigkdGlwb0RhdG9SZWNpYmlkbz09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpew0KDQogICAgaWYoaXNzZXQoJF9QT1NUWyJhY3Rpb24iXSkpew0KDQogICAgICAgICRhY3Rpb24gPSAkX1BPU1RbImFjdGlvbiJdOw0KDQogICAgICAgIGlmKCRhY3Rpb249PSJGRV9UaWxzb3IiKXsNCg0KICAgICAgICAgICAgLy8gJGNvbnRleHQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoWw0KICAgICAgICAgICAgICAgIC8vICdzc2wnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAvLyAnYWxsb3dfc2VsZl9zaWduZWQnID0+IHRydWUNCiAgICAgICAgICAgICAgICAvLyBdDQogICAgICAgICAgICAvLyBdKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gJHNvYXBfb3B0aW9ucyA9IFsNCiAgICAgICAgICAgICAgICAvLyAndXJpJyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nLA0KICAgICAgICAgICAgICAgIC8vICdzdHlsZScgPT4gU09BUF9SUEMsDQogICAgICAgICAgICAgICAgLy8gJ3VzZScgPT4gU09BUF9FTkNPREVELA0KICAgICAgICAgICAgICAgIC8vICdzb2FwX3ZlcnNpb24nID0+IFNPQVBfMV8xLA0KICAgICAgICAgICAgICAgIC8vICdjYWNoZV93c2RsJyA9PiBXU0RMX0NBQ0hFX05PTkUsDQogICAgICAgICAgICAgICAgLy8gJ2Nvbm5lY3Rpb25fdGltZW91dCcgPT4gMTUsDQogICAgICAgICAgICAgICAgLy8gJ3RyYWNlJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgIC8vICdlbmNvZGluZycgPT4gJ1VURi04JywNCiAgICAgICAgICAgICAgICAvLyAnZXhjZXB0aW9ucycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAvLyAnbG9naW4nID0+ICdpcGFya2luZ3MnLA0KICAgICAgICAgICAgICAgIC8vICdsb2dpbicgPT4gJ2ludGVyZmFjZScsDQogICAgICAgICAgICAgICAgLy8gLy8gJ3Bhc3N3b3JkJyA9PiAnYzEwN2ZjMTZmYycsDQogICAgICAgICAgICAgICAgLy8gJ3Bhc3N3b3JkJyA9PiAnZTkzOWFiOGQ4MjhlN2UwYWVhOTA5MmNiZWY0ODA1ODkwNTUyZWFiYzQwZjYyNjdjMTNhZDNiNjkzNGY0YmEzZCcsDQogICAgICAgICAgICAgICAgLy8gJ3N0cmVhbV9jb250ZXh0JyA9PiAkY29udGV4dA0KICAgICAgICAgICAgLy8gXTsNCg0KICAgICAgICAgICAgLy8gZGVmaW5lKCJzb2FwX29wdGlvbnMiLCRzb2FwX29wdGlvbnMpOw0KCQkJDQoJCQkkZXJyb3IgPSBmYWxzZTsNCiAgICAgICAgICAgICRtc2ogPSAiTm8gcmVjaWJvOiI7DQoNCiAgICAgICAgICAgIGlmKGlzc2V0KCRfUE9TVFsidGlwb0NGRSJdKSl7DQogICAgICAgICAgICAgICAgJHRpcG9DRkUgPSAoaW50ZWdlcikkX1BPU1RbInRpcG9DRkUiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgdGlwb0NGRTsiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoaXNzZXQoJF9QT1NUWyJNbnRUb3RhbCJdKSl7DQogICAgICAgICAgICAgICAgJE1udFRvdGFsID0gKGZsb2F0KSRfUE9TVFsiTW50VG90YWwiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgTW50VG90YWw7IjsNCiAgICAgICAgICAgIH0NCgkJCS8vIGlmKGlzc2V0KCRfUE9TVFsiZm9ybWFQYWdvIl0pKXsNCiAgICAgICAgICAgICAgICAvLyAkZm9ybWFQYWdvID0gJF9QT1NUWyJmb3JtYVBhZ28iXTsNCiAgICAgICAgICAgIC8vIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAvLyAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgIC8vICRtc2ogPSAkbXNqLiIgZm9ybWFQYWdvOyI7DQogICAgICAgICAgICAvLyB9DQoJCQkvLyBpZihpc3NldCgkX1BPU1RbIm1lZGlvUGFnbyJdKSl7DQogICAgICAgICAgICAgICAgLy8gJG1lZGlvUGFnbyA9ICRfUE9TVFsibWVkaW9QYWdvIl07DQogICAgICAgICAgICAvLyB9IGVsc2V7DQogICAgICAgICAgICAgICAgLy8gJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAvLyAkbXNqID0gJG1zai4iIG1lZGlvUGFnbzsiOw0KICAgICAgICAgICAgLy8gfQ0KCQkJaWYoaXNzZXQoJF9QT1NUWyJpZFN0YXkiXSkpew0KICAgICAgICAgICAgICAgICRpZFN0YXkgPSAkX1BPU1RbImlkU3RheSJdOw0KICAgICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgICAgICRlcnJvciA9IHRydWU7DQogICAgICAgICAgICAgICAgJG1zaiA9ICRtc2ouIiBpZFN0YXk7IjsNCiAgICAgICAgICAgIH0NCgkJCWlmKGlzc2V0KCRfUE9TVFsiYmFyY29kZSJdKSl7DQogICAgICAgICAgICAgICAgJGJhcmNvZGUgPSAkX1BPU1RbImJhcmNvZGUiXTsNCiAgICAgICAgICAgIH0NCgkJCWVsc2V7DQoJCQkJJGJhcmNvZGUgPSAiIjsNCgkJCX0NCgkJCWlmKGlzc2V0KCRfUE9TVFsiaG9yYXNFc3RhZGlhIl0pKXsNCiAgICAgICAgICAgICAgICAkaG9yYXNFc3RhZGlhID0gJF9QT1NUWyJob3Jhc0VzdGFkaWEiXTsNCiAgICAgICAgICAgIH0NCgkJCWVsc2V7DQoJCQkJJGhvcmFzRXN0YWRpYSA9ICIiOw0KCQkJfQ0KCQkJaWYoaXNzZXQoJF9QT1NUWyJhZGRBZGVuZGEiXSkpew0KICAgICAgICAgICAgICAgICRhZGRBZGVuZGEgPSAkX1BPU1RbImFkZEFkZW5kYSJdOw0KICAgICAgICAgICAgfQ0KCQkJZWxzZXsNCgkJCQkkYWRkQWRlbmRhID0gIiI7DQoJCQl9DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMTEgfHwgJHRpcG9DRkU9PTExMil7DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJydXQiXSkpew0KCQkJCQkkcnV0ID0gJF9QT1NUWyJydXQiXTsNCgkJCQkJaWYoJHJ1dD09IiIpew0KCQkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJCSRtc2ogPSAkbXNqLiIgcnV0OyI7DQoJCQkJCX0NCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgcnV0OyI7DQoJCQkJfQ0KCQkJCWlmKGlzc2V0KCRfUE9TVFsic29jaWFsIl0pKXsNCgkJCQkJJHNvY2lhbCA9ICRfUE9TVFsic29jaWFsIl07DQoJCQkJCWlmKCRzb2NpYWw9PSIiKXskc29jaWFsPSJTSU4gUkFaT04gU09DSUFMIjt9DQoJCQkJfSBlbHNlew0KCQkJCQkkZXJyb3IgPSB0cnVlOw0KCQkJCQkkbXNqID0gJG1zai4iIHNvY2lhbDsiOw0KCQkJCX0NCgkJCQlpZihpc3NldCgkX1BPU1RbImRpciJdKSl7DQoJCQkJCSRkaXIgPSAkX1BPU1RbImRpciJdOw0KCQkJCQlpZigkZGlyPT0iIil7JGRpcj0iU0lOIERJUkVDQ0lPTiI7fQ0KCQkJCX0gZWxzZXsNCgkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJJG1zaiA9ICRtc2ouIiBkaXI7IjsNCgkJCQl9DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJjaXVkYWQiXSkpew0KCQkJCQkkY2l1ZGFkID0gJF9QT1NUWyJjaXVkYWQiXTsNCgkJCQkJaWYoJGNpdWRhZD09IiIpeyRjaXVkYWQ9IlNJTiBDSVVEQUQiO30NCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgY2l1ZGFkOyI7DQoJCQkJfQ0KCQkJCQ0KCQkJfQ0KCQkJDQoJCQlpZigkdGlwb0NGRT09MTAyIHx8ICR0aXBvQ0ZFPT0xMTIpew0KCQkJCWlmKGlzc2V0KCRfUE9TVFsicmVmZXJlbmNlIl0pKXsNCgkJCQkJJHJlZmVyZW5jZSA9ICRfUE9TVFsicmVmZXJlbmNlIl07DQoJCQkJfSBlbHNlew0KCQkJCQkkZXJyb3IgPSB0cnVlOw0KCQkJCQkkbXNqID0gJG1zai4iIHJlZmVyZW5jZTsiOw0KCQkJCX0NCgkJCX0NCg0KICAgICAgICAgICAgaWYoJGVycm9yPT10cnVlKXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA0MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRtc2o7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRmZWNoYSA9IG5ldyBEYXRlVGltZSgpOw0KICAgICAgICAgICAgJGFubyA9ICRmZWNoYS0+Zm9ybWF0KCJZIik7DQogICAgICAgICAgICAkbWVzID0gJGZlY2hhLT5mb3JtYXQoIm0iKTsNCiAgICAgICAgICAgICRkaWEgPSAkZmVjaGEtPmZvcm1hdCgiZCIpOw0KICAgICAgICAgICAgJGZlY2hhYSA9ICRhbm8uIi0iLiRtZXMuIi0iLiRkaWE7DQoNCiAgICAgICAgICAgICRzaW5JVkEgPSAkTW50VG90YWwvMS4yMjsNCiAgICAgICAgICAgICRNbnROZXRvSVZBVGFzYUJhc2ljYSA9IG51bWJlcl9mb3JtYXQoKGZsb2F0KSRzaW5JVkEsIDIsICcuJywgJycpOw0KICAgICAgICAgICAgJElWQSA9ICRNbnRUb3RhbC0kc2luSVZBOw0KICAgICAgICAgICAgJE1udElWQVRhc2FCYXNpY2EgPSBudW1iZXJfZm9ybWF0KChmbG9hdCkkSVZBLCAyLCAnLicsICcnKTsNCgkJCQ0KCQkJLy8gJGludGVybmFsSWQgPSAiQ0FJLUlQLVdQMi0kaWRTdGF5IjsNCgkJCS8vIE9SSUdJTkFMLCBQUkVWSU8gTUlHUkFDSU9OIDIxLTEwLTIwMjUNCgkJCS8vICRpbnRlcm5hbElkID0gIkNBSS1JUC0kaWRTdGF5IjsNCgkJCWlmKCR0aXBvQ0ZFPT0xMTIgfHwgJHRpcG9DRkU9PTEwMil7DQoJCQkJJGludGVybmFsSWQgPSAiQ0FJLUlQLU5DLSRpZFN0YXkiOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkaW50ZXJuYWxJZCA9ICJDQUktSVAtJGlkU3RheSI7DQoJCQl9DQoJCQkvLyAkaW50ZXJuYWxJZCA9ICJDQUktSVAtVEVTVC0kaWRTdGF5IjsNCgkJCQ0KCQkJJGVtaXNvciA9ICc8RW1pc29yPjxSVUNFbWlzb3I+MjEyOTkxODEwMDExPC9SVUNFbWlzb3I+PFJ6blNvYz5Db25zb3JjaW8gQWVyb3B1ZXJ0b3MgSW50ZXJuYWNpb25hbGVzUy5BLjwvUnpuU29jPjxOb21Db21lcmNpYWw+PC9Ob21Db21lcmNpYWw+PEdpcm9FbWlzPjwvR2lyb0VtaXM+PFRlbGVmb25vPjwvVGVsZWZvbm8+PENvcnJlb0VtaXNvcj48L0NvcnJlb0VtaXNvcj48RW1pU3VjdXJzYWw+UERQIENvcnBvcmF0ZSAoRmMuQUU8L0VtaVN1Y3Vyc2FsPjxDZGdER0lTdWN1cj4xPC9DZGdER0lTdWN1cj48RG9tRmlzY2FsPlJ1dGEgOTMgS20uIDExMyBMYWd1bmEgZGVsIFNhdWNlIE1hbGRvbmFkbzwvRG9tRmlzY2FsPjxDaXVkYWQ+UHVudGEgZGVsIEVzdGU8L0NpdWRhZD48RGVwYXJ0YW1lbnRvPlB1bnRhIGRlbCBFc3RlPC9EZXBhcnRhbWVudG8+PC9FbWlzb3I+JzsNCgkJCS8vICRPTERlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxNDkwMjM0MDAxMDwvUlVDRW1pc29yPjxSem5Tb2M+VENVIFMuQS48L1J6blNvYz48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5Dbm8uIENhcnJhc2NvIDAgeSBBLiBkZSBsYXMgQW1lcmljYXM8L0RvbUZpc2NhbD48Q2l1ZGFkPkFlcm9wdWVydG8gZGUgQ2FycmFzY288L0NpdWRhZD48RGVwYXJ0YW1lbnRvPkNhbmVsb25lczwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMDEgfHwgJHRpcG9DRkU9PTEwMil7DQoJCQkJJHJlZmVyZW5jaWEgPSAiIjsNCgkJCQlpZigkdGlwb0NGRT09MTAyKXsNCgkJCQkJJHJlZmVyZW5jaWEgPSAnPFJlZmVyZW5jaWE+PFJlZmVyZW5jaWE+PE5yb0xpblJlZj4xPC9Ocm9MaW5SZWY+PEluZEdsb2JhbD4xPC9JbmRHbG9iYWw+PFRwb0RvY1JlZj4xMDE8L1Rwb0RvY1JlZj48U2VyaWU+QTwvU2VyaWU+PE5yb0NGRVJlZj4nLiRyZWZlcmVuY2UuJzwvTnJvQ0ZFUmVmPjxSYXpvblJlZj4nLiRyZWZlcmVuY2UuJzwvUmF6b25SZWY+PEZlY2hhQ0ZFcmVmPicuJGZlY2hhYS4nPC9GZWNoYUNGRXJlZj48L1JlZmVyZW5jaWE+PC9SZWZlcmVuY2lhPic7DQoJCQkJfQ0KCQkJCSRkYXRhID0gJzw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PENGRSB4bWxucz0iaHR0cDovL2NmZS5kZ2kuZ3ViLnV5Ij48ZVRjaz48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZVRjaz48L0NGRT4nOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkcmVmZXJlbmNpYSA9ICIiOw0KCQkJCWlmKCR0aXBvQ0ZFPT0xMTIpew0KCQkJCQkkcmVmZXJlbmNpYSA9ICc8UmVmZXJlbmNpYT48UmVmZXJlbmNpYT48TnJvTGluUmVmPjE8L05yb0xpblJlZj48SW5kR2xvYmFsPjE8L0luZEdsb2JhbD48VHBvRG9jUmVmPjExMTwvVHBvRG9jUmVmPjxTZXJpZT5BPC9TZXJpZT48TnJvQ0ZFUmVmPicuJHJlZmVyZW5jZS4nPC9Ocm9DRkVSZWY+PFJhem9uUmVmPicuJHJlZmVyZW5jZS4nPC9SYXpvblJlZj48RmVjaGFDRkVyZWY+Jy4kZmVjaGFhLic8L0ZlY2hhQ0ZFcmVmPjwvUmVmZXJlbmNpYT48L1JlZmVyZW5jaWE+JzsNCgkJCQl9DQoJCQkJJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlRmFjdD48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxSZWNlcHRvcj48VGlwb0RvY1JlY2VwPjI8L1RpcG9Eb2NSZWNlcD48Q29kUGFpc1JlY2VwPlVZPC9Db2RQYWlzUmVjZXA+PERvY1JlY2VwPicuJHJ1dC4nPC9Eb2NSZWNlcD48UnpuU29jUmVjZXA+Jy4kc29jaWFsLic8L1J6blNvY1JlY2VwPjxEaXJSZWNlcD4nLiRkaXIuJzwvRGlyUmVjZXA+PENpdWRhZFJlY2VwPicuJGNpdWRhZC4nPC9DaXVkYWRSZWNlcD48L1JlY2VwdG9yPjxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZUZhY3Q+PC9DRkU+JzsNCgkJCX0NCg0KICAgICAgICAgICAgJGRhdGE2NCA9IGJhc2U2NF9lbmNvZGUoJGRhdGEpOw0KCQkJDQoJCQkkYWRlbmRhID0gDQoJCQknPCFbQ0RBVEFbPHRjYTpkYXRvc0FkZW5kYSB4bWxuczp0Y2E9Imh0dHA6Ly90aWxzb3IuY29tLnV5LyNQRFNBZGVuZGEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3RpbHNvci5jb20udXkvI1BEU0FkZW5kYSBQRFNBZGVuZGEueHNkIj4NCgkJCQk8dGNhOmxleWVuZGFzPg0KCQkJCQk8dGNhOmNvbnN0YW5jaWFJVkE+SS5WLkEuIEFMIETDjUE8L3RjYTpjb25zdGFuY2lhSVZBPg0KCQkJCQk8dGNhOnJlc29sdWNpb24+UmVzLiAyNTIvMjAxNTwvdGNhOnJlc29sdWNpb24+DQoJCQkJCTx0Y2E6dmVyaWZpY2FyQ29tcHJvYmFudGU+UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHA6Ly93d3cuZGdpLmd1Yi51eS88L3RjYTp2ZXJpZmljYXJDb21wcm9iYW50ZT4NCgkJCQk8L3RjYTpsZXllbmRhcz4NCgkJCTwvdGNhOmRhdG9zQWRlbmRhPl1dPic7DQoJCQkNCgkJCSRPTERhZGVuZGEgPSANCgkJCSc8IVtDREFUQVs8dGNhOmRhdG9zQWRlbmRhIHhtbG5zOnRjYT0iaHR0cDovL3RpbHNvci5jb20udXkvI1BEU0FkZW5kYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vdGlsc29yLmNvbS51eS8jUERTQWRlbmRhIFBEU0FkZW5kYS54c2QiPg0KCQkJCTx0Y2E6bGV5ZW5kYXM+DQoJCQkJCTx0Y2E6Y29uc3RhbmNpYUlWQT5JLlYuQS4gQUwgRMONQTwvdGNhOmNvbnN0YW5jaWFJVkE+DQoJCQkJCTx0Y2E6cmVzb2x1Y2lvbj5SZXMuIDI1Mi8yMDE1PC90Y2E6cmVzb2x1Y2lvbj4NCgkJCQkJPHRjYTp2ZXJpZmljYXJDb21wcm9iYW50ZT5QdWVkZSB2ZXJpZmljYXIgY29tcHJvYmFudGUgZW4gaHR0cDovL3d3dy5kZ2kuZ3ViLnV5LzwvdGNhOnZlcmlmaWNhckNvbXByb2JhbnRlPg0KCQkJCTwvdGNhOmxleWVuZGFzPg0KCQkJCTx0Y2E6ZGF0b3NFeHRyYVRDVT4nLg0KCQkJCQkvLyA8dGNhOmZvcm1hUGFnbz5Ew4lCSVRPIEJBTkNBUklPPC90Y2E6Zm9ybWFQYWdvPg0KCQkJCQkvLyA8dGNhOm1lZGlvUGFnbz5TQ09USUFCQU5LPC90Y2E6bWVkaW9QYWdvPg0KCQkJCQknPHRjYTpmb3JtYVBhZ28+Jy4kZm9ybWFQYWdvLic8L3RjYTpmb3JtYVBhZ28+DQoJCQkJCTx0Y2E6bWVkaW9QYWdvPicuJG1lZGlvUGFnby4nPC90Y2E6bWVkaW9QYWdvPg0KCQkJCQk8dGNhOnVzdWFyaW8+MTEyOTA8L3RjYTp1c3VhcmlvPicuDQoJCQkJCS8vIDx0Y2E6ZG9jdW1lbnRvVENVPlBEUy1TRi0xMDI0Njg3PC90Y2E6ZG9jdW1lbnRvVENVPg0KCQkJCQknPHRjYTpkb2N1bWVudG9UQ1U+Jy4kaW50ZXJuYWxJZC4nPC90Y2E6ZG9jdW1lbnRvVENVPg0KCQkJCQk8dGNhOmxleWVuZGFDb21tZXJjaWFsPkxBQ0MgLSBDaXVkYWQgTG9nw61zdGljYSBJbnRlcm5hY2lvbmFsPC90Y2E6bGV5ZW5kYUNvbW1lcmNpYWw+DQoJCQkJPC90Y2E6ZGF0b3NFeHRyYVRDVT4NCgkJCTwvdGNhOmRhdG9zQWRlbmRhPl1dPic7DQoJCQkNCgkJCWlmKGlzc2V0KCRfUE9TVFsicG9zIl0pKXsNCiAgICAgICAgICAgICAgICAkcG9zID0gJF9QT1NUWyJwb3MiXTsNCiAgICAgICAgICAgIH0NCgkJCWVsc2V7DQoJCQkJJHBvcyA9ICIiOw0KCQkJfQ0KCQkJDQoJCQlpZigkcG9zIT0iIil7DQoJCQkJJHByaW50ID0gIkZPUkNFX1BSSU5UIjsNCgkJCQkkcHJpbnRlciA9ICRwb3M7DQoJCQl9DQoJCQllbHNlew0KCQkJCSRwcmludCA9ICJET05UX1BSSU5UIjsNCgkJCQkkcHJpbnRlciA9ICJUTEFTSTAwNSI7DQoJCQl9DQoNCiAgICAgICAgICAgICRzZW5kID0gDQogICAgICAgICAgICAnDQogICAgICAgICAgICA8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQogICAgICAgICAgICAgICAgPHNvYXA6Qm9keT4NCiAgICAgICAgICAgICAgICAgICAgPGludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnQgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRhdGE+Jy4kZGF0YTY0Lic8L2RhdGE+Jy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8bmFtZT5TRU1NPC9uYW1lPg0KICAgICAgICAgICAgICAgICAgICAgICAgJzwvZG9jdW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5hZGVuZGE8L2tleT4NCgkJCQkJCQkJCTx2YWx1ZT4nLiRhZGVuZGEuJzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48a2V5PmZhY3RvcnlDbGFzczwva2V5Pjx2YWx1ZT51eS5jb20udGlsc29yLmFpZi5wZHNTY2hlbWFzLmFkZW5kYS5BZGVuZGFGYWN0b3J5PC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhVHlwZT51eS5jb20udGlsc29yLmFpZi5wbHVnaW5zLmNmZS5tZXRhZGF0YS5BZGVuZGFNZXRhZGF0YTwvbWV0YWRhdGFUeXBlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YUxpc3Q+DQoJCQkJCQk8bWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5vcmlnaW48L2tleT4NCgkJCQkJCQkJCTx2YWx1ZT5JUGFya2luZzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQoJCQkJCQkJCTxlbnRyeT4NCgkJCQkJCQkJCTxrZXk+bm9tYnJlSW1wcmVzb3JhPC9rZXk+DQoJCQkJCQkJCQk8dmFsdWU+Jy4kcHJpbnRlci4nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCgkJCQkJCQkJPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5pbmRJbXByZXNpb248L2tleT4nLg0KCQkJCQkJCQkJLy8gPHZhbHVlPkZPUkNFX1BSSU5UPC92YWx1ZT4NCgkJCQkJCQkJCSc8dmFsdWU+Jy4kcHJpbnQuJzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQoJCQkJCQkJCTxlbnRyeT4NCgkJCQkJCQkJCTxrZXk+aW50ZXJuYWxJZDwva2V5Pg0KCQkJCQkJCQkJPHZhbHVlPicuJGludGVybmFsSWQuJzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFUeXBlPnV5LmNvbS50aWxzb3IuYWlmLnBsdWdpbnMucGRzLm1ldGFkYXRhLlBEU01ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxoYW5kbGVyIHhtbG5zPSIiPkVQX0VNSVNPUl9DRkVfRU5UUkFEQTwvaGFuZGxlcj4NCiAgICAgICAgICAgICAgICAgICAgPC9pbnZvaWNlUmVjZXB0aW9uPg0KICAgICAgICAgICAgICAgIDwvc29hcDpCb2R5Pg0KICAgICAgICAgICAgPC9zb2FwOkVudmVsb3BlPg0KICAgICAgICAgICAgJzsNCgkJCQ0KCQkJc2F2ZVRYVCgkbG9nUGV0aWNpb24sICRzZW5kLCAkdXJsTG9nLCAkYWN0aW9uKTsNCg0KICAgICAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgNCiAgICAgICAgICAgICAgICAvLyAiUE9TVCAvcGFja2FnZS9wYWNrYWdlXzEuMy9wYWNrYWdlc2VydmljZXMuYXNteCBIVFRQLzEuMSIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiLA0KICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogIi5zdHJsZW4oJHNlbmQpDQogICAgICAgICAgICApOyANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHVybCA9IFdTREwyOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkY2ggPSBjdXJsX2luaXQoKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIHRydWUpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRzZW5kKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZGVycyk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkcmVzcG9uc2VPcmlnID0gY3VybF9leGVjKCRjaCk7IA0KICAgICAgICAgICAgY3VybF9jbG9zZSgkY2gpOw0KDQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPicsJycsJHJlc3BvbnNlT3JpZyk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPHNvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnbnMyOicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPC9zb2FwOkVudmVsb3BlPicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgIC8vICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCcgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iJywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpuczI9Imh0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8iJywnJywkcmVzcG9uc2UpOw0KDQogICAgICAgICAgICAkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSwgIlNpbXBsZVhNTEVsZW1lbnQiLCBMSUJYTUxfTk9DREFUQSk7DQogICAgICAgICAgICAkanNvbiA9IGpzb25fZW5jb2RlKCR4bWwpOw0KICAgICAgICAgICAgJGFycmF5ID0ganNvbl9kZWNvZGUoJGpzb24sVFJVRSk7DQoNCiAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoInJldHVybiIsJGFycmF5KSl7DQogICAgICAgICAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygiZXJyb3JzIiwkYXJyYXlbInJldHVybiJdKSl7DQogICAgICAgICAgICAgICAgICAgICRlcnJvcnMgPSAkYXJyYXlbInJldHVybiJdWyJlcnJvcnMiXTsNCiAgICANCiAgICAgICAgICAgICAgICAgICAgaWYoJGVycm9ycz09ImZhbHNlIiB8fCAkZXJyb3JzID09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjcmVhdGVEYXRlID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjcmVhdGVEYXRlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRGb3JtYXQgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50Rm9ybWF0Il07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRJZCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRJZCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50TnJjID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudE5yYyJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXR1c05hbWUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50U3RhdHVzIl1bInN0YXR1c05hbWUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudFR5cGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50VHlwZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdFZlcnNpb24gPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImZvcm1hdFZlcnNpb24iXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRpbnRlcm5hbFBhdGggPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImludGVybmFsUGF0aCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmZU51bWJlciA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlTnVtYmVyIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkY2ZlUmFuZ2UgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNmZVJhbmdlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkaGFzaCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaGFzaCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHNpZ25hdHVyZVRpbWVzdGFtcCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsic2lnbmF0dXJlVGltZXN0YW1wIl07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJPayI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiVG9kbyBvay4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y3JlYXRlRGF0ZSA9ICRjcmVhdGVEYXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRGb3JtYXQgPSAkZG9jdW1lbnRGb3JtYXQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudElkID0gJGRvY3VtZW50SWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5pbnRlcm5hbElkID0gJGludGVybmFsSWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudE5yYyA9ICRkb2N1bWVudE5yYzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnN0YXR1c05hbWUgPSAkc3RhdHVzTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50VHlwZSA9ICRkb2N1bWVudFR5cGU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5mb3JtYXRWZXJzaW9uID0gJGZvcm1hdFZlcnNpb247DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5pbnRlcm5hbFBhdGggPSAkaW50ZXJuYWxQYXRoOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y2ZlTnVtYmVyID0gJGNmZU51bWJlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNmZVJhbmdlID0gJGNmZVJhbmdlOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+aGFzaCA9ICRoYXNoOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c2lnbmF0dXJlVGltZXN0YW1wID0gJHNpZ25hdHVyZVRpbWVzdGFtcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnNlbmRlZCA9ICRzZW5kOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigkZXJyb3JzPT0idHJ1ZSIgfHwgJGVycm9ycz09dHJ1ZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvckNvZGUiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JDb2RlID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JDb2RlIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvck1zZyIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvck1zZyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9yTXNnIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRlcnJvck1zZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nUmVzcHVlc3RhLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgDQogICAgICAgICAgICAgICAgICAgIGVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDEuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDIuIjsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gMy4iOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCgkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGVsc2UgaWYoJGFjdGlvbj09IkZFX1RpbHNvcl90ZXN0Iil7DQoJCQkNCgkJCS8vIFVSTHMgdGVzdGluZw0KCQkJLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5zdGcuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KCQkJLy8gZGVmaW5lKCJXU0RMMiIsImh0dHA6Ly93bHBvb2wuc3RnLmFpYy5jYXJyYXNjby5hZXJvOjkwODAvYWlmL3dzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCiAgICAgICAgICAgIC8vICRjb250ZXh0ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsNCiAgICAgICAgICAgICAgICAvLyAnc3NsJyA9PiBbDQogICAgICAgICAgICAgICAgICAgIC8vICd2ZXJpZnlfcGVlcicgPT4gZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIC8vICd2ZXJpZnlfcGVlcl9uYW1lJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ2FsbG93X3NlbGZfc2lnbmVkJyA9PiB0cnVlDQogICAgICAgICAgICAgICAgLy8gXQ0KICAgICAgICAgICAgLy8gXSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vICRzb2FwX29wdGlvbnMgPSBbDQogICAgICAgICAgICAgICAgLy8gJ3VyaScgPT4gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvJywNCiAgICAgICAgICAgICAgICAvLyAnc3R5bGUnID0+IFNPQVBfUlBDLA0KICAgICAgICAgICAgICAgIC8vICd1c2UnID0+IFNPQVBfRU5DT0RFRCwNCiAgICAgICAgICAgICAgICAvLyAnc29hcF92ZXJzaW9uJyA9PiBTT0FQXzFfMSwNCiAgICAgICAgICAgICAgICAvLyAnY2FjaGVfd3NkbCcgPT4gV1NETF9DQUNIRV9OT05FLA0KICAgICAgICAgICAgICAgIC8vICdjb25uZWN0aW9uX3RpbWVvdXQnID0+IDE1LA0KICAgICAgICAgICAgICAgIC8vICd0cmFjZScgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAnZW5jb2RpbmcnID0+ICdVVEYtOCcsDQogICAgICAgICAgICAgICAgLy8gJ2V4Y2VwdGlvbnMnID0+IHRydWUsDQogICAgICAgICAgICAgICAgLy8gLy8gJ2xvZ2luJyA9PiAnaXBhcmtpbmdzJywNCiAgICAgICAgICAgICAgICAvLyAnbG9naW4nID0+ICdpbnRlcmZhY2UnLA0KICAgICAgICAgICAgICAgIC8vIC8vICdwYXNzd29yZCcgPT4gJ2MxMDdmYzE2ZmMnLA0KICAgICAgICAgICAgICAgIC8vICdwYXNzd29yZCcgPT4gJ2U5MzlhYjhkODI4ZTdlMGFlYTkwOTJjYmVmNDgwNTg5MDU1MmVhYmM0MGY2MjY3YzEzYWQzYjY5MzRmNGJhM2QnLA0KICAgICAgICAgICAgICAgIC8vICdzdHJlYW1fY29udGV4dCcgPT4gJGNvbnRleHQNCiAgICAgICAgICAgIC8vIF07DQoNCiAgICAgICAgICAgIC8vIGRlZmluZSgic29hcF9vcHRpb25zIiwkc29hcF9vcHRpb25zKTsNCgkJCQ0KCQkJJGVycm9yID0gZmFsc2U7DQogICAgICAgICAgICAkbXNqID0gIk5vIHJlY2libzoiOw0KDQogICAgICAgICAgICBpZihpc3NldCgkX1BPU1RbInRpcG9DRkUiXSkpew0KICAgICAgICAgICAgICAgICR0aXBvQ0ZFID0gKGludGVnZXIpJF9QT1NUWyJ0aXBvQ0ZFIl07DQogICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAkbXNqID0gJG1zai4iIHRpcG9DRkU7IjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGlzc2V0KCRfUE9TVFsiTW50VG90YWwiXSkpew0KICAgICAgICAgICAgICAgICRNbnRUb3RhbCA9IChmbG9hdCkkX1BPU1RbIk1udFRvdGFsIl07DQogICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAkbXNqID0gJG1zai4iIE1udFRvdGFsOyI7DQogICAgICAgICAgICB9DQoJCQkvLyBpZihpc3NldCgkX1BPU1RbImZvcm1hUGFnbyJdKSl7DQogICAgICAgICAgICAgICAgLy8gJGZvcm1hUGFnbyA9ICRfUE9TVFsiZm9ybWFQYWdvIl07DQogICAgICAgICAgICAvLyB9IGVsc2V7DQogICAgICAgICAgICAgICAgLy8gJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAvLyAkbXNqID0gJG1zai4iIGZvcm1hUGFnbzsiOw0KICAgICAgICAgICAgLy8gfQ0KCQkJLy8gaWYoaXNzZXQoJF9QT1NUWyJtZWRpb1BhZ28iXSkpew0KICAgICAgICAgICAgICAgIC8vICRtZWRpb1BhZ28gPSAkX1BPU1RbIm1lZGlvUGFnbyJdOw0KICAgICAgICAgICAgLy8gfSBlbHNlew0KICAgICAgICAgICAgICAgIC8vICRlcnJvciA9IHRydWU7DQogICAgICAgICAgICAgICAgLy8gJG1zaiA9ICRtc2ouIiBtZWRpb1BhZ287IjsNCiAgICAgICAgICAgIC8vIH0NCgkJCWlmKGlzc2V0KCRfUE9TVFsiaWRTdGF5Il0pKXsNCiAgICAgICAgICAgICAgICAkaWRTdGF5ID0gJF9QT1NUWyJpZFN0YXkiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgaWRTdGF5OyI7DQogICAgICAgICAgICB9DQoJCQlpZihpc3NldCgkX1BPU1RbImJhcmNvZGUiXSkpew0KICAgICAgICAgICAgICAgICRiYXJjb2RlID0gJF9QT1NUWyJiYXJjb2RlIl07DQogICAgICAgICAgICB9DQoJCQllbHNlew0KCQkJCSRiYXJjb2RlID0gIiI7DQoJCQl9DQoJCQlpZihpc3NldCgkX1BPU1RbImhvcmFzRXN0YWRpYSJdKSl7DQogICAgICAgICAgICAgICAgJGhvcmFzRXN0YWRpYSA9ICRfUE9TVFsiaG9yYXNFc3RhZGlhIl07DQogICAgICAgICAgICB9DQoJCQllbHNlew0KCQkJCSRob3Jhc0VzdGFkaWEgPSAiIjsNCgkJCX0NCgkJCQ0KCQkJaWYoJHRpcG9DRkU9PTExMSB8fCAkdGlwb0NGRT09MTEyKXsNCgkJCQlpZihpc3NldCgkX1BPU1RbInJ1dCJdKSl7DQoJCQkJCSRydXQgPSAkX1BPU1RbInJ1dCJdOw0KCQkJCX0gZWxzZXsNCgkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJJG1zaiA9ICRtc2ouIiBydXQ7IjsNCgkJCQl9DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJzb2NpYWwiXSkpew0KCQkJCQkkc29jaWFsID0gJF9QT1NUWyJzb2NpYWwiXTsNCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgc29jaWFsOyI7DQoJCQkJfQ0KCQkJCWlmKGlzc2V0KCRfUE9TVFsiZGlyIl0pKXsNCgkJCQkJJGRpciA9ICRfUE9TVFsiZGlyIl07DQoJCQkJfSBlbHNlew0KCQkJCQkkZXJyb3IgPSB0cnVlOw0KCQkJCQkkbXNqID0gJG1zai4iIGRpcjsiOw0KCQkJCX0NCgkJCQlpZihpc3NldCgkX1BPU1RbImNpdWRhZCJdKSl7DQoJCQkJCSRjaXVkYWQgPSAkX1BPU1RbImNpdWRhZCJdOw0KCQkJCX0gZWxzZXsNCgkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJJG1zaiA9ICRtc2ouIiBjaXVkYWQ7IjsNCgkJCQl9DQoJCQkJDQoJCQl9DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMDIgfHwgJHRpcG9DRkU9PTExMil7DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJyZWZlcmVuY2UiXSkpew0KCQkJCQkkcmVmZXJlbmNlID0gJF9QT1NUWyJyZWZlcmVuY2UiXTsNCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgcmVmZXJlbmNlOyI7DQoJCQkJfQ0KCQkJfQ0KDQogICAgICAgICAgICBpZigkZXJyb3I9PXRydWUpew0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gJG1zajsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJGZlY2hhID0gbmV3IERhdGVUaW1lKCk7DQogICAgICAgICAgICAkYW5vID0gJGZlY2hhLT5mb3JtYXQoIlkiKTsNCiAgICAgICAgICAgICRtZXMgPSAkZmVjaGEtPmZvcm1hdCgibSIpOw0KICAgICAgICAgICAgJGRpYSA9ICRmZWNoYS0+Zm9ybWF0KCJkIik7DQogICAgICAgICAgICAkZmVjaGFhID0gJGFuby4iLSIuJG1lcy4iLSIuJGRpYTsNCg0KICAgICAgICAgICAgJHNpbklWQSA9ICRNbnRUb3RhbC8xLjIyOw0KICAgICAgICAgICAgJE1udE5ldG9JVkFUYXNhQmFzaWNhID0gbnVtYmVyX2Zvcm1hdCgoZmxvYXQpJHNpbklWQSwgMiwgJy4nLCAnJyk7DQogICAgICAgICAgICAkSVZBID0gJE1udFRvdGFsLSRzaW5JVkE7DQogICAgICAgICAgICAkTW50SVZBVGFzYUJhc2ljYSA9IG51bWJlcl9mb3JtYXQoKGZsb2F0KSRJVkEsIDIsICcuJywgJycpOw0KCQkJDQoJCQkvLyBPUklHSU5BTCAxOC0wNi0yMDI1DQoJCQkJJGludGVybmFsSWQgPSAiQ0FJLUlQLSRpZFN0YXkiOw0KCQkJCQ0KCQkJCSRlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxMjk5MTgxMDAxMTwvUlVDRW1pc29yPjxSem5Tb2M+Q29uc29yY2lvIEFlcm9wdWVydG9zIEludGVybmFjaW9uYWxlc1MuQS48L1J6blNvYz48Tm9tQ29tZXJjaWFsPjwvTm9tQ29tZXJjaWFsPjxHaXJvRW1pcz48L0dpcm9FbWlzPjxUZWxlZm9ubz48L1RlbGVmb25vPjxDb3JyZW9FbWlzb3I+PC9Db3JyZW9FbWlzb3I+PEVtaVN1Y3Vyc2FsPlBEUCBDb3Jwb3JhdGUgKEZjLkFFPC9FbWlTdWN1cnNhbD48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5SdXRhIDkzIEttLiAxMTMgTGFndW5hIGRlbCBTYXVjZSBNYWxkb25hZG88L0RvbUZpc2NhbD48Q2l1ZGFkPlB1bnRhIGRlbCBFc3RlPC9DaXVkYWQ+PERlcGFydGFtZW50bz5QdW50YSBkZWwgRXN0ZTwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkJLy8gLy8vLyRPTERlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxNDkwMjM0MDAxMDwvUlVDRW1pc29yPjxSem5Tb2M+VENVIFMuQS48L1J6blNvYz48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5Dbm8uIENhcnJhc2NvIDAgeSBBLiBkZSBsYXMgQW1lcmljYXM8L0RvbUZpc2NhbD48Q2l1ZGFkPkFlcm9wdWVydG8gZGUgQ2FycmFzY288L0NpdWRhZD48RGVwYXJ0YW1lbnRvPkNhbmVsb25lczwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkJDQoJCQkJaWYoJHRpcG9DRkU9PTEwMSB8fCAkdGlwb0NGRT09MTAyKXsNCgkJCQkJJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlVGNrPjxFbmNhYmV6YWRvPjxJZERvYz48VGlwb0NGRT4nLiR0aXBvQ0ZFLic8L1RpcG9DRkU+PEZjaEVtaXM+Jy4kZmVjaGFhLic8L0ZjaEVtaXM+PEZtYVBhZ28+MTwvRm1hUGFnbz48L0lkRG9jPicuJGVtaXNvci4nPFRvdGFsZXM+PFRwb01vbmVkYT5VWVU8L1Rwb01vbmVkYT48TW50Tm9HcnY+MC4wMDwvTW50Tm9HcnY+PE1udEV4cG95QXNpbT4wLjAwPC9NbnRFeHBveUFzaW0+PE1udEltcHVlc3RvUGVyYz4wLjAwPC9NbnRJbXB1ZXN0b1BlcmM+PE1udElWYWVuU3VzcD4wLjAwPC9NbnRJVmFlblN1c3A+PE1udE5ldG9JdmFUYXNhTWluPjAuMDA8L01udE5ldG9JdmFUYXNhTWluPjxNbnROZXRvSVZBVGFzYUJhc2ljYT4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9NbnROZXRvSVZBVGFzYUJhc2ljYT48TW50TmV0b0lWQU90cmE+MC4wMDwvTW50TmV0b0lWQU90cmE+PElWQVRhc2FNaW4+MTAuMDA8L0lWQVRhc2FNaW4+PElWQVRhc2FCYXNpY2E+MjIuMDA8L0lWQVRhc2FCYXNpY2E+PE1udElWQVRhc2FNaW4+MC4wMDwvTW50SVZBVGFzYU1pbj48TW50SVZBVGFzYUJhc2ljYT4nLiRNbnRJVkFUYXNhQmFzaWNhLic8L01udElWQVRhc2FCYXNpY2E+PE1udElWQU90cmE+MC4wMDwvTW50SVZBT3RyYT48TW50VG90YWw+Jy4kTW50VG90YWwuJzwvTW50VG90YWw+PE1udFRvdFJldGVuaWRvPjAuMDA8L01udFRvdFJldGVuaWRvPjxDYW50TGluRGV0PjE8L0NhbnRMaW5EZXQ+PE1vbnRvTkY+MC4wMDwvTW9udG9ORj48TW50UGFnYXI+Jy4kTW50VG90YWwuJzwvTW50UGFnYXI+PC9Ub3RhbGVzPjwvRW5jYWJlemFkbz48RGV0YWxsZT48SXRlbT48TnJvTGluRGV0PjE8L05yb0xpbkRldD48SW5kRmFjdD4zPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPjwvZVRjaz48L0NGRT4nOw0KCQkJCX0NCgkJCQllbHNlew0KCQkJCQkkZGF0YSA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI\/PjxDRkUgeG1sbnM9Imh0dHA6Ly9jZmUuZGdpLmd1Yi51eSI+PGVGYWN0PjxFbmNhYmV6YWRvPjxJZERvYz48VGlwb0NGRT4nLiR0aXBvQ0ZFLic8L1RpcG9DRkU+PEZjaEVtaXM+Jy4kZmVjaGFhLic8L0ZjaEVtaXM+PEZtYVBhZ28+MTwvRm1hUGFnbz48L0lkRG9jPicuJGVtaXNvci4nPFJlY2VwdG9yPjxUaXBvRG9jUmVjZXA+MjwvVGlwb0RvY1JlY2VwPjxDb2RQYWlzUmVjZXA+VVk8L0NvZFBhaXNSZWNlcD48RG9jUmVjZXA+Jy4kcnV0Lic8L0RvY1JlY2VwPjxSem5Tb2NSZWNlcD4nLiRzb2NpYWwuJzwvUnpuU29jUmVjZXA+PERpclJlY2VwPicuJGRpci4nPC9EaXJSZWNlcD48Q2l1ZGFkUmVjZXA+Jy4kY2l1ZGFkLic8L0NpdWRhZFJlY2VwPjwvUmVjZXB0b3I+PFRvdGFsZXM+PFRwb01vbmVkYT5VWVU8L1Rwb01vbmVkYT48TW50Tm9HcnY+MC4wMDwvTW50Tm9HcnY+PE1udEV4cG95QXNpbT4wLjAwPC9NbnRFeHBveUFzaW0+PE1udEltcHVlc3RvUGVyYz4wLjAwPC9NbnRJbXB1ZXN0b1BlcmM+PE1udElWYWVuU3VzcD4wLjAwPC9NbnRJVmFlblN1c3A+PE1udE5ldG9JdmFUYXNhTWluPjAuMDA8L01udE5ldG9JdmFUYXNhTWluPjxNbnROZXRvSVZBVGFzYUJhc2ljYT4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9NbnROZXRvSVZBVGFzYUJhc2ljYT48TW50TmV0b0lWQU90cmE+MC4wMDwvTW50TmV0b0lWQU90cmE+PElWQVRhc2FNaW4+MTAuMDA8L0lWQVRhc2FNaW4+PElWQVRhc2FCYXNpY2E+MjIuMDA8L0lWQVRhc2FCYXNpY2E+PE1udElWQVRhc2FNaW4+MC4wMDwvTW50SVZBVGFzYU1pbj48TW50SVZBVGFzYUJhc2ljYT4nLiRNbnRJVkFUYXNhQmFzaWNhLic8L01udElWQVRhc2FCYXNpY2E+PE1udElWQU90cmE+MC4wMDwvTW50SVZBT3RyYT48TW50VG90YWw+Jy4kTW50VG90YWwuJzwvTW50VG90YWw+PE1udFRvdFJldGVuaWRvPjAuMDA8L01udFRvdFJldGVuaWRvPjxDYW50TGluRGV0PjE8L0NhbnRMaW5EZXQ+PE1vbnRvTkY+MC4wMDwvTW9udG9ORj48TW50UGFnYXI+Jy4kTW50VG90YWwuJzwvTW50UGFnYXI+PC9Ub3RhbGVzPjwvRW5jYWJlemFkbz48RGV0YWxsZT48SXRlbT48TnJvTGluRGV0PjE8L05yb0xpbkRldD48SW5kRmFjdD4zPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPjwvZUZhY3Q+PC9DRkU+JzsNCgkJCQl9DQoJCQkvLyBPUklHSU5BTCAxOC0wNi0yMDI1DQoJCQkNCgkJCSRpbnRlcm5hbElkID0gIkNBSS1JUC0kaWRTdGF5IjsNCgkJCQ0KCQkJJGVtaXNvciA9ICc8RW1pc29yPjxSVUNFbWlzb3I+MjEyOTkxODEwMDExPC9SVUNFbWlzb3I+PFJ6blNvYz5Db25zb3JjaW8gQWVyb3B1ZXJ0b3MgSW50ZXJuYWNpb25hbGVzUy5BLjwvUnpuU29jPjxOb21Db21lcmNpYWw+PC9Ob21Db21lcmNpYWw+PEdpcm9FbWlzPjwvR2lyb0VtaXM+PFRlbGVmb25vPjwvVGVsZWZvbm8+PENvcnJlb0VtaXNvcj48L0NvcnJlb0VtaXNvcj48RW1pU3VjdXJzYWw+UERQIENvcnBvcmF0ZSAoRmMuQUU8L0VtaVN1Y3Vyc2FsPjxDZGdER0lTdWN1cj4xPC9DZGdER0lTdWN1cj48RG9tRmlzY2FsPlJ1dGEgOTMgS20uIDExMyBMYWd1bmEgZGVsIFNhdWNlIE1hbGRvbmFkbzwvRG9tRmlzY2FsPjxDaXVkYWQ+UHVudGEgZGVsIEVzdGU8L0NpdWRhZD48RGVwYXJ0YW1lbnRvPlB1bnRhIGRlbCBFc3RlPC9EZXBhcnRhbWVudG8+PC9FbWlzb3I+JzsNCgkJCS8vICRPTERlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxNDkwMjM0MDAxMDwvUlVDRW1pc29yPjxSem5Tb2M+VENVIFMuQS48L1J6blNvYz48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5Dbm8uIENhcnJhc2NvIDAgeSBBLiBkZSBsYXMgQW1lcmljYXM8L0RvbUZpc2NhbD48Q2l1ZGFkPkFlcm9wdWVydG8gZGUgQ2FycmFzY288L0NpdWRhZD48RGVwYXJ0YW1lbnRvPkNhbmVsb25lczwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMDEgfHwgJHRpcG9DRkU9PTEwMil7DQoJCQkJJHJlZmVyZW5jaWEgPSAiIjsNCgkJCQlpZigkdGlwb0NGRT09MTAyKXsNCgkJCQkJJHJlZmVyZW5jaWEgPSAnPFJlZmVyZW5jaWE+PFJlZmVyZW5jaWE+PE5yb0xpblJlZj4xPC9Ocm9MaW5SZWY+PEluZEdsb2JhbD4xPC9JbmRHbG9iYWw+PFRwb0RvY1JlZj4xMDE8L1Rwb0RvY1JlZj48U2VyaWU+QTwvU2VyaWU+PE5yb0NGRVJlZj4nLiRyZWZlcmVuY2UuJzwvTnJvQ0ZFUmVmPjxSYXpvblJlZj4nLiRyZWZlcmVuY2UuJzwvUmF6b25SZWY+PEZlY2hhQ0ZFcmVmPicuJGZlY2hhYS4nPC9GZWNoYUNGRXJlZj48L1JlZmVyZW5jaWE+PC9SZWZlcmVuY2lhPic7DQoJCQkJfQ0KCQkJCSRkYXRhID0gJzw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PENGRSB4bWxucz0iaHR0cDovL2NmZS5kZ2kuZ3ViLnV5Ij48ZVRjaz48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZVRjaz48L0NGRT4nOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkcmVmZXJlbmNpYSA9ICIiOw0KCQkJCWlmKCR0aXBvQ0ZFPT0xMTIpew0KCQkJCQkkcmVmZXJlbmNpYSA9ICc8UmVmZXJlbmNpYT48UmVmZXJlbmNpYT48TnJvTGluUmVmPjE8L05yb0xpblJlZj48SW5kR2xvYmFsPjE8L0luZEdsb2JhbD48VHBvRG9jUmVmPjExMTwvVHBvRG9jUmVmPjxTZXJpZT5BPC9TZXJpZT48TnJvQ0ZFUmVmPicuJHJlZmVyZW5jZS4nPC9Ocm9DRkVSZWY+PFJhem9uUmVmPicuJHJlZmVyZW5jZS4nPC9SYXpvblJlZj48RmVjaGFDRkVyZWY+Jy4kZmVjaGFhLic8L0ZlY2hhQ0ZFcmVmPjwvUmVmZXJlbmNpYT48L1JlZmVyZW5jaWE+JzsNCgkJCQl9DQoJCQkJJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlRmFjdD48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxSZWNlcHRvcj48VGlwb0RvY1JlY2VwPjI8L1RpcG9Eb2NSZWNlcD48Q29kUGFpc1JlY2VwPlVZPC9Db2RQYWlzUmVjZXA+PERvY1JlY2VwPicuJHJ1dC4nPC9Eb2NSZWNlcD48UnpuU29jUmVjZXA+Jy4kc29jaWFsLic8L1J6blNvY1JlY2VwPjxEaXJSZWNlcD4nLiRkaXIuJzwvRGlyUmVjZXA+PENpdWRhZFJlY2VwPicuJGNpdWRhZC4nPC9DaXVkYWRSZWNlcD48L1JlY2VwdG9yPjxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZUZhY3Q+PC9DRkU+JzsNCgkJCX0NCg0KICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICRkYXRhNjQgPSBiYXNlNjRfZW5jb2RlKCRkYXRhKTsNCgkJCQ0KCQkJJGFkZW5kYSA9IA0KCQkJJzwhW0NEQVRBWzx0Y2E6ZGF0b3NBZGVuZGEgeG1sbnM6dGNhPSJodHRwOi8vdGlsc29yLmNvbS51eS8jUERTQWRlbmRhIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly90aWxzb3IuY29tLnV5LyNQRFNBZGVuZGEgUERTQWRlbmRhLnhzZCI+DQoJCQkJPHRjYTpsZXllbmRhcz4NCgkJCQkJPHRjYTpjb25zdGFuY2lhSVZBPkkuVi5BLiBBTCBEw41BPC90Y2E6Y29uc3RhbmNpYUlWQT4NCgkJCQkJPHRjYTpyZXNvbHVjaW9uPlJlcy4gMjUyLzIwMTU8L3RjYTpyZXNvbHVjaW9uPg0KCQkJCQk8dGNhOnZlcmlmaWNhckNvbXByb2JhbnRlPlB1ZWRlIHZlcmlmaWNhciBjb21wcm9iYW50ZSBlbiBodHRwOi8vd3d3LmRnaS5ndWIudXkvPC90Y2E6dmVyaWZpY2FyQ29tcHJvYmFudGU+DQoJCQkJPC90Y2E6bGV5ZW5kYXM+DQoJCQk8L3RjYTpkYXRvc0FkZW5kYT5dXT4nOw0KCQkJDQoJCQkkT0xEYWRlbmRhID0gDQoJCQknPCFbQ0RBVEFbPHRjYTpkYXRvc0FkZW5kYSB4bWxuczp0Y2E9Imh0dHA6Ly90aWxzb3IuY29tLnV5LyNQRFNBZGVuZGEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3RpbHNvci5jb20udXkvI1BEU0FkZW5kYSBQRFNBZGVuZGEueHNkIj4NCgkJCQk8dGNhOmxleWVuZGFzPg0KCQkJCQk8dGNhOmNvbnN0YW5jaWFJVkE+SS5WLkEuIEFMIETDjUE8L3RjYTpjb25zdGFuY2lhSVZBPg0KCQkJCQk8dGNhOnJlc29sdWNpb24+UmVzLiAyNTIvMjAxNTwvdGNhOnJlc29sdWNpb24+DQoJCQkJCTx0Y2E6dmVyaWZpY2FyQ29tcHJvYmFudGU+UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHA6Ly93d3cuZGdpLmd1Yi51eS88L3RjYTp2ZXJpZmljYXJDb21wcm9iYW50ZT4NCgkJCQk8L3RjYTpsZXllbmRhcz4NCgkJCQk8dGNhOmRhdG9zRXh0cmFUQ1U+Jy4NCgkJCQkJLy8gPHRjYTpmb3JtYVBhZ28+RMOJQklUTyBCQU5DQVJJTzwvdGNhOmZvcm1hUGFnbz4NCgkJCQkJLy8gPHRjYTptZWRpb1BhZ28+U0NPVElBQkFOSzwvdGNhOm1lZGlvUGFnbz4NCgkJCQkJJzx0Y2E6Zm9ybWFQYWdvPicuJGZvcm1hUGFnby4nPC90Y2E6Zm9ybWFQYWdvPg0KCQkJCQk8dGNhOm1lZGlvUGFnbz4nLiRtZWRpb1BhZ28uJzwvdGNhOm1lZGlvUGFnbz4NCgkJCQkJPHRjYTp1c3VhcmlvPjExMjkwPC90Y2E6dXN1YXJpbz4nLg0KCQkJCQkvLyA8dGNhOmRvY3VtZW50b1RDVT5QRFMtU0YtMTAyNDY4NzwvdGNhOmRvY3VtZW50b1RDVT4NCgkJCQkJJzx0Y2E6ZG9jdW1lbnRvVENVPicuJGludGVybmFsSWQuJzwvdGNhOmRvY3VtZW50b1RDVT4NCgkJCQkJPHRjYTpsZXllbmRhQ29tbWVyY2lhbD5MQUNDIC0gQ2l1ZGFkIExvZ8Otc3RpY2EgSW50ZXJuYWNpb25hbDwvdGNhOmxleWVuZGFDb21tZXJjaWFsPg0KCQkJCTwvdGNhOmRhdG9zRXh0cmFUQ1U+DQoJCQk8L3RjYTpkYXRvc0FkZW5kYT5dXT4nOw0KCQkJDQoJCQlpZihpc3NldCgkX1BPU1RbInBvcyJdKSl7DQogICAgICAgICAgICAgICAgJHBvcyA9ICRfUE9TVFsicG9zIl07DQogICAgICAgICAgICB9DQoJCQllbHNlew0KCQkJCSRwb3MgPSAiIjsNCgkJCX0NCgkJCQ0KCQkJaWYoJHBvcyE9IiIpew0KCQkJCSRwcmludCA9ICJGT1JDRV9QUklOVCI7DQoJCQkJJHByaW50ZXIgPSAkcG9zOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkcHJpbnQgPSAiRE9OVF9QUklOVCI7DQoJCQkJJHByaW50ZXIgPSAiVExBU0kwMDUiOw0KCQkJfQ0KDQogICAgICAgICAgICAkc2VuZCA9IA0KICAgICAgICAgICAgJw0KICAgICAgICAgICAgPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KICAgICAgICAgICAgICAgIDxzb2FwOkJvZHk+DQogICAgICAgICAgICAgICAgICAgIDxpbnZvaWNlUmVjZXB0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50IHhtbG5zPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYXRhPicuJGRhdGE2NC4nPC9kYXRhPicuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPG5hbWU+U0VNTTwvbmFtZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2RvY3VtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4NCgkJCQkJCQkJCTxrZXk+YWRlbmRhPC9rZXk+DQoJCQkJCQkJCQk8dmFsdWU+Jy4kYWRlbmRhLic8L3ZhbHVlPg0KCQkJCQkJCQk8L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5mYWN0b3J5Q2xhc3M8L2tleT48dmFsdWU+dXkuY29tLnRpbHNvci5haWYuc2VtbVNjaGVtYXMuYWRlbmRhLkFkZW5kYUZhY3Rvcnk8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFUeXBlPnV5LmNvbS50aWxzb3IuYWlmLnBsdWdpbnMuY2ZlLm1ldGFkYXRhLkFkZW5kYU1ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCgkJCQkJCTxtZXRhZGF0YUxpc3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+DQoJCQkJCQkJCQk8a2V5Pm9yaWdpbjwva2V5Pg0KCQkJCQkJCQkJPHZhbHVlPklQYXJraW5nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCgkJCQkJCQkJPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5ub21icmVJbXByZXNvcmE8L2tleT4NCgkJCQkJCQkJCTx2YWx1ZT4nLiRwcmludGVyLic8L3ZhbHVlPg0KCQkJCQkJCQk8L2VudHJ5Pg0KCQkJCQkJCQk8ZW50cnk+DQoJCQkJCQkJCQk8a2V5PmluZEltcHJlc2lvbjwva2V5PicuDQoJCQkJCQkJCQkvLyA8dmFsdWU+Rk9SQ0VfUFJJTlQ8L3ZhbHVlPg0KCQkJCQkJCQkJJzx2YWx1ZT4nLiRwcmludC4nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCgkJCQkJCQkJPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5pbnRlcm5hbElkPC9rZXk+DQoJCQkJCQkJCQk8dmFsdWU+Jy4kaW50ZXJuYWxJZC4nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YVR5cGU+dXkuY29tLnRpbHNvci5haWYucGx1Z2lucy5wZHMubWV0YWRhdGEuUERTTWV0YWRhdGE8L21ldGFkYXRhVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXIgeG1sbnM9IiI+RVBfRU1JU09SX0NGRV9FTlRSQURBPC9oYW5kbGVyPg0KICAgICAgICAgICAgICAgICAgICA8L2ludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+DQogICAgICAgICAgICAnOw0KCQkJDQoJCQlzYXZlVFhUKCRsb2dQZXRpY2lvbiwgJHNlbmQsICR1cmxMb2csICRhY3Rpb24pOw0KDQogICAgICAgICAgICAkaGVhZGVycyA9IGFycmF5KA0KICAgICAgICAgICAgICAgIC8vICJQT1NUIC9wYWNrYWdlL3BhY2thZ2VfMS4zL3BhY2thZ2VzZXJ2aWNlcy5hc214IEhUVFAvMS4xIiwNCiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkc2VuZCkNCiAgICAgICAgICAgICk7IA0KCQkJDQoJCQkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHVybCA9ICJodHRwOi8vd2xwb29sLnN0Zy5haWMuY2FycmFzY28uYWVybzo5MDgwL2FpZi93cy9JbnZvaWNlSGFuZGxpbmdTZXJ2aWNlcyI7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHNlbmQpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZU9yaWcgPSBjdXJsX2V4ZWMoJGNoKTsgDQogICAgICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7DQoNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+JywnJywkcmVzcG9uc2VPcmlnKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCduczI6JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzwvc29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6RW52ZWxvcGU+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgLy8gJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyInLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZpY2VzLmNmZWhhbmRsZXJ3cy50aWxzb3IuY29tLnV5LyInLCcnLCRyZXNwb25zZSk7DQoNCiAgICAgICAgICAgICR4bWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHJlc3BvbnNlLCAiU2ltcGxlWE1MRWxlbWVudCIsIExJQlhNTF9OT0NEQVRBKTsNCiAgICAgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHhtbCk7DQogICAgICAgICAgICAkYXJyYXkgPSBqc29uX2RlY29kZSgkanNvbixUUlVFKTsNCg0KICAgICAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygicmV0dXJuIiwkYXJyYXkpKXsNCiAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvcnMiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgJGVycm9ycyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9ycyJdOw0KICAgIA0KICAgICAgICAgICAgICAgICAgICBpZigkZXJyb3JzPT0iZmFsc2UiIHx8ICRlcnJvcnMgPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZURhdGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNyZWF0ZURhdGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudEZvcm1hdCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRGb3JtYXQiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudElkID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudElkIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnROcmMgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50TnJjIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc3RhdHVzTmFtZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRTdGF0dXMiXVsic3RhdHVzTmFtZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50VHlwZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRUeXBlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0VmVyc2lvbiA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZm9ybWF0VmVyc2lvbiJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGludGVybmFsUGF0aCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaW50ZXJuYWxQYXRoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkY2ZlTnVtYmVyID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVOdW1iZXIiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZmVSYW5nZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlUmFuZ2UiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoYXNoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJoYXNoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmF0dXJlVGltZXN0YW1wID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJzaWduYXR1cmVUaW1lc3RhbXAiXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIk9rIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJUb2RvIG9rLiI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jcmVhdGVEYXRlID0gJGNyZWF0ZURhdGU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudEZvcm1hdCA9ICRkb2N1bWVudEZvcm1hdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50SWQgPSAkZG9jdW1lbnRJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsSWQgPSAkaW50ZXJuYWxJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50TnJjID0gJGRvY3VtZW50TnJjOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c3RhdHVzTmFtZSA9ICRzdGF0dXNOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRUeXBlID0gJGRvY3VtZW50VHlwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmZvcm1hdFZlcnNpb24gPSAkZm9ybWF0VmVyc2lvbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsUGF0aCA9ICRpbnRlcm5hbFBhdGg7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jZmVOdW1iZXIgPSAkY2ZlTnVtYmVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y2ZlUmFuZ2UgPSAkY2ZlUmFuZ2U7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5oYXNoID0gJGhhc2g7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5zaWduYXR1cmVUaW1lc3RhbXAgPSAkc2lnbmF0dXJlVGltZXN0YW1wOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c2VuZGVkID0gJHNlbmQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJCXNhdmVUWFQoJGxvZ1Jlc3B1ZXN0YSwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCRlcnJvcnM9PSJ0cnVlIiB8fCAkZXJyb3JzPT10cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yQ29kZSIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvckNvZGUgPSAkYXJyYXlbInJldHVybiJdWyJlcnJvckNvZGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yTXNnIiwkYXJyYXlbInJldHVybiJdKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yTXNnID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JNc2ciXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNDAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gJGVycm9yTXNnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICAgICAgZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gMS4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dFcnJvciwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNTAwOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gMi4iOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIkFsZ28gYW5kdXZvIG1hbCwgY2hlcXVlYXIgaW5mbyAzLiI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB9DQoJCQ0KCQllbHNlIGlmKCRhY3Rpb249PSJ0ZXN0WE1MIil7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZSA9ICc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Qm9keT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5zMjppbnZvaWNlUmVjZXB0aW9uUmVzcG9uc2UgeG1sbnM6bnMyPSJodHRwOi8vc2VydmljZXMuY2ZlaGFuZGxlcndzLnRpbHNvci5jb20udXkvIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXR1cm4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVycm9ycz5mYWxzZTwvZXJyb3JzPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjZmVJbmZvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y3JlYXRlRGF0ZT4yMDI0LTA5LTI0VDE3OjI0OjUzLjkzNi0wMzowMDwvY3JlYXRlRGF0ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50Rm9ybWF0PkNGRSBER0k8L2RvY3VtZW50Rm9ybWF0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnRJZD4zMzczNTY5PC9kb2N1bWVudElkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnROcmM+MDAwMDAwMDAwMDAwNjU0MzkwN3docndneXh3eWJweXNtc254cnNlbmdueWZrcHlya2V2YXYuYmprdnY8L2RvY3VtZW50TnJjPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnRTdGF0dXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0dXNOYW1lPkNGRV9TVE9SRUQ8L3N0YXR1c05hbWU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZG9jdW1lbnRTdGF0dXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkb2N1bWVudFR5cGU+SU5WT0lDRV9JU1NVRUQ8L2RvY3VtZW50VHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm1hdFZlcnNpb24+MS4wPC9mb3JtYXRWZXJzaW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW50ZXJuYWxQYXRoPkZhY3R1cmFzIEVtaXRpZGFzPC9pbnRlcm5hbFBhdGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjZmVOdW1iZXI+MjgxPC9jZmVOdW1iZXI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjZmVSYW5nZT5CPC9jZmVSYW5nZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhhc2g+STRYZVZGQVhvRjlOTUkrSEJPU05OcW91eHRzPTwvaGFzaD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZVRpbWVzdGFtcD4yMDI0LTA5LTI0VDE3OjI0OjUzLjY1Ny0wMzowMDwvc2lnbmF0dXJlVGltZXN0YW1wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2ZlSW5mbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmV0dXJuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25zMjppbnZvaWNlUmVjZXB0aW9uUmVzcG9uc2U+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+JzsNCg0KICAgICAgICAgICAgJHJlc3BvbnNlMiA9ICc8cmV0dXJuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlcnJvcnM+ZmFsc2U8L2Vycm9ycz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2ZlSW5mbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNyZWF0ZURhdGU+MjAyNC0wOS0yNFQxNzoyNDo1My45MzYtMDM6MDA8L2NyZWF0ZURhdGU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkb2N1bWVudEZvcm1hdD5DRkUgREdJPC9kb2N1bWVudEZvcm1hdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50SWQ+MzM3MzU2OTwvZG9jdW1lbnRJZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50TnJjPjAwMDAwMDAwMDAwMDY1NDM5MDd3aHJ3Z3l4d3licHlzbXNueHJzZW5nbnlma3B5cmtldmF2LmJqa3Z2PC9kb2N1bWVudE5yYz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50U3RhdHVzPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXR1c05hbWU+Q0ZFX1NUT1JFRDwvc3RhdHVzTmFtZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kb2N1bWVudFN0YXR1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50VHlwZT5JTlZPSUNFX0lTU1VFRDwvZG9jdW1lbnRUeXBlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0VmVyc2lvbj4xLjA8L2Zvcm1hdFZlcnNpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnRlcm5hbFBhdGg+RmFjdHVyYXMgRW1pdGlkYXM8L2ludGVybmFsUGF0aD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNmZU51bWJlcj4yODE8L2NmZU51bWJlcj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNmZVJhbmdlPkI8L2NmZVJhbmdlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aGFzaD5JNFhlVkZBWG9GOU5NSStIQk9TTk5xb3V4dHM9PC9oYXNoPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlVGltZXN0YW1wPjIwMjQtMDktMjRUMTc6MjQ6NTMuNjU3LTAzOjAwPC9zaWduYXR1cmVUaW1lc3RhbXA+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jZmVJbmZvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXR1cm4+JzsNCg0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPHNvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnbnMyOicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPC9zb2FwOkVudmVsb3BlPicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgIC8vICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCcgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iJywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpuczI9Imh0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8iJywnJywkcmVzcG9uc2UpOw0KDQogICAgICAgICAgICAvLyBlY2hvIHByaW50X3IoJHJlc3BvbnNlKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCg0KICAgICAgICAgICAgLy8gJGVudmVsb3BlID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkanNvbiA9IGpzb25fZW5jb2RlKCR4bWwpOw0KICAgICAgICAgICAgLy8gJGFycmF5ID0ganNvbl9kZWNvZGUoJGpzb24sVFJVRSk7DQogICAgICAgICAgICAkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSwgIlNpbXBsZVhNTEVsZW1lbnQiLCBMSUJYTUxfTk9DREFUQSk7DQogICAgICAgICAgICAkanNvbiA9IGpzb25fZW5jb2RlKCR4bWwpOw0KICAgICAgICAgICAgJGFycmF5ID0ganNvbl9kZWNvZGUoJGpzb24sVFJVRSk7DQoNCiAgICAgICAgICAgIC8vICRzb2FwID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkdGVzdCA9ICRzb2FwLT5jaGlsZHJlbignaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nKS0+Qm9keS0+Y2hpbGRyZW4oJ2h0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8nKS0+cmV0dXJuOw0KICAgICAgICAgICAgLy8gJGpzb24yID0ganNvbl9lbmNvZGUoJHRlc3QpOw0KICAgICAgICAgICAgLy8gJGFycmF5MiA9IGpzb25fZGVjb2RlKCRqc29uMixUUlVFKTsNCg0KICAgICAgICAgICAgJGVycm9ycyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9ycyJdOw0KICAgICAgICAgICAgJGNyZWF0ZURhdGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNyZWF0ZURhdGUiXTsNCiAgICAgICAgICAgICRkb2N1bWVudEZvcm1hdCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRGb3JtYXQiXTsNCiAgICAgICAgICAgICRkb2N1bWVudElkID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudElkIl07DQogICAgICAgICAgICAkZG9jdW1lbnROcmMgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50TnJjIl07DQogICAgICAgICAgICAkc3RhdHVzTmFtZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRTdGF0dXMiXVsic3RhdHVzTmFtZSJdOw0KICAgICAgICAgICAgJGRvY3VtZW50VHlwZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRUeXBlIl07DQogICAgICAgICAgICAkZm9ybWF0VmVyc2lvbiA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZm9ybWF0VmVyc2lvbiJdOw0KICAgICAgICAgICAgJGludGVybmFsUGF0aCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaW50ZXJuYWxQYXRoIl07DQogICAgICAgICAgICAkY2ZlTnVtYmVyID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVOdW1iZXIiXTsNCiAgICAgICAgICAgICRjZmVSYW5nZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlUmFuZ2UiXTsNCiAgICAgICAgICAgICRoYXNoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJoYXNoIl07DQogICAgICAgICAgICAkc2lnbmF0dXJlVGltZXN0YW1wID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJzaWduYXR1cmVUaW1lc3RhbXAiXTsNCg0KICAgICAgICAgICAgLy8gZWNobyAieG1sIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcigkeG1sKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gImpzb24iOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyBwcmludF9yKCRqc29uKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gImFycmF5IjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcigkYXJyYXkpOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAidGVzdCI7DQogICAgICAgICAgICAvLyBlY2hvICJcbiI7DQogICAgICAgICAgICAvLyBlY2hvIHByaW50X3IoJHRlc3QpOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAiYXJyYXkyIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcigkYXJyYXkyKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gImxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcihsaWJ4bWxfdXNlX2ludGVybmFsX2Vycm9ycygpKTsNCiAgICAgICAgICAgIC8vIGVjaG8ganNvbl9lbmNvZGUoJHRlc3QtPmVycm9ycyk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGVsc2V7DQogICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSAzMDA7DQogICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiTm8gcmVjaWJvIGFjdGlvbiB2YWxpZG8uIjsNCiAgICAgICAgDQogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICB9DQoNCiAgICB9DQogICAgDQp9DQoNCmVsc2UgaWYoJHRpcG9EYXRvUmVjaWJpZG89PSJhcHBsaWNhdGlvbi9qc29uIil7DQoNCiAgICAkanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpOw0KDQogICAgJGRhdGEgPSBqc29uX2RlY29kZSgkanNvbiwgdHJ1ZSk7DQoNCiAgICBpZihpc3NldCgkZGF0YVsiYWN0aW9uIl0pKXsNCiAgICAgICAgJGFjdGlvbiA9ICRkYXRhWyJhY3Rpb24iXTsNCgkJDQoJCWlmKCRhY3Rpb249PSJGRV9UaWxzb3IiKXsNCg0KICAgICAgICAgICAgLy8gJGNvbnRleHQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoWw0KICAgICAgICAgICAgICAgIC8vICdzc2wnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAvLyAnYWxsb3dfc2VsZl9zaWduZWQnID0+IHRydWUNCiAgICAgICAgICAgICAgICAvLyBdDQogICAgICAgICAgICAvLyBdKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gJHNvYXBfb3B0aW9ucyA9IFsNCiAgICAgICAgICAgICAgICAvLyAndXJpJyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nLA0KICAgICAgICAgICAgICAgIC8vICdzdHlsZScgPT4gU09BUF9SUEMsDQogICAgICAgICAgICAgICAgLy8gJ3VzZScgPT4gU09BUF9FTkNPREVELA0KICAgICAgICAgICAgICAgIC8vICdzb2FwX3ZlcnNpb24nID0+IFNPQVBfMV8xLA0KICAgICAgICAgICAgICAgIC8vICdjYWNoZV93c2RsJyA9PiBXU0RMX0NBQ0hFX05PTkUsDQogICAgICAgICAgICAgICAgLy8gJ2Nvbm5lY3Rpb25fdGltZW91dCcgPT4gMTUsDQogICAgICAgICAgICAgICAgLy8gJ3RyYWNlJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgIC8vICdlbmNvZGluZycgPT4gJ1VURi04JywNCiAgICAgICAgICAgICAgICAvLyAnZXhjZXB0aW9ucycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAvLyAnbG9naW4nID0+ICdpcGFya2luZ3MnLA0KICAgICAgICAgICAgICAgIC8vICdsb2dpbicgPT4gJ2ludGVyZmFjZScsDQogICAgICAgICAgICAgICAgLy8gLy8gJ3Bhc3N3b3JkJyA9PiAnYzEwN2ZjMTZmYycsDQogICAgICAgICAgICAgICAgLy8gJ3Bhc3N3b3JkJyA9PiAnZTkzOWFiOGQ4MjhlN2UwYWVhOTA5MmNiZWY0ODA1ODkwNTUyZWFiYzQwZjYyNjdjMTNhZDNiNjkzNGY0YmEzZCcsDQogICAgICAgICAgICAgICAgLy8gJ3N0cmVhbV9jb250ZXh0JyA9PiAkY29udGV4dA0KICAgICAgICAgICAgLy8gXTsNCg0KICAgICAgICAgICAgLy8gZGVmaW5lKCJzb2FwX29wdGlvbnMiLCRzb2FwX29wdGlvbnMpOw0KCQkJDQoJCQkkZXJyb3IgPSBmYWxzZTsNCiAgICAgICAgICAgICRtc2ogPSAiTm8gcmVjaWJvOiI7DQoNCiAgICAgICAgICAgIGlmKGlzc2V0KCRfUE9TVFsidGlwb0NGRSJdKSl7DQogICAgICAgICAgICAgICAgJHRpcG9DRkUgPSAoaW50ZWdlcikkX1BPU1RbInRpcG9DRkUiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgdGlwb0NGRTsiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoaXNzZXQoJF9QT1NUWyJNbnRUb3RhbCJdKSl7DQogICAgICAgICAgICAgICAgJE1udFRvdGFsID0gKGZsb2F0KSRfUE9TVFsiTW50VG90YWwiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgTW50VG90YWw7IjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoJGVycm9yPT10cnVlKXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA0MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRtc2o7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRmZWNoYSA9IG5ldyBEYXRlVGltZSgpOw0KICAgICAgICAgICAgJGFubyA9ICRmZWNoYS0+Zm9ybWF0KCJZIik7DQogICAgICAgICAgICAkbWVzID0gJGZlY2hhLT5mb3JtYXQoIm0iKTsNCiAgICAgICAgICAgICRkaWEgPSAkZmVjaGEtPmZvcm1hdCgiZCIpOw0KICAgICAgICAgICAgJGZlY2hhYSA9ICRhbm8uIi0iLiRtZXMuIi0iLiRkaWE7DQoNCiAgICAgICAgICAgICRzaW5JVkEgPSAkTW50VG90YWwvMS4yMjsNCiAgICAgICAgICAgICRNbnROZXRvSVZBVGFzYUJhc2ljYSA9IG51bWJlcl9mb3JtYXQoKGZsb2F0KSRzaW5JVkEsIDIsICcuJywgJycpOw0KICAgICAgICAgICAgJElWQSA9ICRNbnRUb3RhbC0kc2luSVZBOw0KICAgICAgICAgICAgJE1udElWQVRhc2FCYXNpY2EgPSBudW1iZXJfZm9ybWF0KChmbG9hdCkkSVZBLCAyLCAnLicsICcnKTsNCg0KICAgICAgICAgICAgJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlVGNrPjxFbmNhYmV6YWRvPjxJZERvYz48VGlwb0NGRT4nLiR0aXBvQ0ZFLic8L1RpcG9DRkU+PEZjaEVtaXM+Jy4kZmVjaGFhLic8L0ZjaEVtaXM+PEZtYVBhZ28+MTwvRm1hUGFnbz48L0lkRG9jPjxFbWlzb3I+PFJVQ0VtaXNvcj4yMTI2MzU5MjAwMTQ8L1JVQ0VtaXNvcj48UnpuU29jPkFMQklOQ08gUy5BPC9Sem5Tb2M+PE5vbUNvbWVyY2lhbD5BTEJJTkNPIFMuQTwvTm9tQ29tZXJjaWFsPjxHaXJvRW1pcz48L0dpcm9FbWlzPjxUZWxlZm9ubz4yNzExLjEwMDA8L1RlbGVmb25vPjxDb3JyZW9FbWlzb3I+PC9Db3JyZW9FbWlzb3I+PEVtaVN1Y3Vyc2FsPjwvRW1pU3VjdXJzYWw+PENkZ0RHSVN1Y3VyPjM8L0NkZ0RHSVN1Y3VyPjxEb21GaXNjYWw+QVYuIEFNRVJJQ08gUklDQUxET05JIDI0NzQ8L0RvbUZpc2NhbD48Q2l1ZGFkPk1PTlRFVklERU88L0NpdWRhZD48RGVwYXJ0YW1lbnRvPk1PTlRFVklERU88L0RlcGFydGFtZW50bz48L0VtaXNvcj48VG90YWxlcz48VHBvTW9uZWRhPlVZVTwvVHBvTW9uZWRhPjxNbnROb0dydj4wLjAwPC9NbnROb0dydj48TW50RXhwb3lBc2ltPjAuMDA8L01udEV4cG95QXNpbT48TW50SW1wdWVzdG9QZXJjPjAuMDA8L01udEltcHVlc3RvUGVyYz48TW50SVZhZW5TdXNwPjAuMDA8L01udElWYWVuU3VzcD48TW50TmV0b0l2YVRhc2FNaW4+MC4wMDwvTW50TmV0b0l2YVRhc2FNaW4+PE1udE5ldG9JVkFUYXNhQmFzaWNhPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01udE5ldG9JVkFUYXNhQmFzaWNhPjxNbnROZXRvSVZBT3RyYT4wLjAwPC9NbnROZXRvSVZBT3RyYT48SVZBVGFzYU1pbj4xMC4wMDwvSVZBVGFzYU1pbj48SVZBVGFzYUJhc2ljYT4yMi4wMDwvSVZBVGFzYUJhc2ljYT48TW50SVZBVGFzYU1pbj4wLjAwPC9NbnRJVkFUYXNhTWluPjxNbnRJVkFUYXNhQmFzaWNhPicuJE1udElWQVRhc2FCYXNpY2EuJzwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjM8L0luZEZhY3Q+PE5vbUl0ZW0+UGFya2luZzwvTm9tSXRlbT48RHNjSXRlbT4xMjQwODAyMDg2MDIzMSAwMCBEaWFzIDAwIEhvcmFzIDEzIE1pbnV0b3MgPC9Ec2NJdGVtPjxDYW50aWRhZD4xLjAwPC9DYW50aWRhZD48VW5pTWVkPk4vQTwvVW5pTWVkPjxQcmVjaW9Vbml0YXJpbz4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9QcmVjaW9Vbml0YXJpbz48RGVzY3VlbnRvUGN0PjAuMDA8L0Rlc2N1ZW50b1BjdD48RGVzY3VlbnRvTW9udG8+MC4wMDwvRGVzY3VlbnRvTW9udG8+PFJlY2FyZ29QY3Q+MC4wMDwvUmVjYXJnb1BjdD48UmVjYXJnb01udD4wLjAwPC9SZWNhcmdvTW50PjxNb250b0l0ZW0+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvTW9udG9JdGVtPjwvSXRlbT48L0RldGFsbGU+PC9lVGNrPjwvQ0ZFPic7DQoNCiAgICAgICAgICAgICRkYXRhNjQgPSBiYXNlNjRfZW5jb2RlKCRkYXRhKTsNCg0KICAgICAgICAgICAgJHNlbmQgPSANCiAgICAgICAgICAgICcNCiAgICAgICAgICAgIDxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCiAgICAgICAgICAgICAgICA8c29hcDpCb2R5Pg0KICAgICAgICAgICAgICAgICAgICA8aW52b2ljZVJlY2VwdGlvbiB4bWxucz0iaHR0cDovL3NlcnZpY2VzLmNmZWhhbmRsZXJ3cy50aWxzb3IuY29tLnV5LyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnQgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRhdGE+Jy4kZGF0YTY0Lic8L2RhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+U0VNTTwvbmFtZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZG9jdW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFMaXN0IHhtbG5zPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YT4nLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8ZW50cnk+PGtleT5pbXByZXNvcmFMb2NhbDwva2V5Pjx2YWx1ZT5US1RQQVJLMDE8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxlbnRyeT48a2V5PmluZEltcHJlc2lvbjwva2V5Pjx2YWx1ZT5GT1JDRV9QUklOVDwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGVudHJ5PjxrZXk+Y2FudENvcGlhczwva2V5Pjx2YWx1ZT4yPC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGVudHJ5PjxrZXk+aW5kSW1wcmVzaW9uPC9rZXk+PHZhbHVlPkRPTlRfUFJJTlQ8L3ZhbHVlPjwvZW50cnk+DQoJCQkJCQkJCTxlbnRyeT48a2V5PmludGVybmFsSWQ8L2tleT48dmFsdWU+cGFyazM1NjY1NjwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUlkPjE8L21ldGFkYXRhSWQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhVHlwZT51eS5jb20udGlsc29yLmFpZi5wbHVnaW5zLnNlbW0ubWV0YWRhdGEuU0VNTU1ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUxpc3QgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5hZGVuZGE8L2tleT48dmFsdWU+Jmx0OyFbQ0RBVEFbJmx0O2RhdG9zQWRlbmRhIHhtbG5zPSJodHRwOi8vdGlsc29yLmNvbS51eS8jU0VNTUFkZW5kYSImZ3Q7Jmx0O2xleWVuZGFzJmd0OyZsdDtjb25zdGFuY2lhSVZBJmd0O0lWQSBhbCBkaWEmbHQ7L2NvbnN0YW5jaWFJVkEmZ3Q7Jmx0O3Jlc29sdWNpb24mZ3Q7UmVzLiA4OTcvMjAxNCZsdDsvcmVzb2x1Y2lvbiZndDsmbHQ7dmVyaWZpY2FyQ29tcHJvYmFudGUmZ3Q7UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHBzOi8vd3d3LnNlbW0uY29tLnV5Jmx0Oy92ZXJpZmljYXJDb21wcm9iYW50ZSZndDsmbHQ7L2xleWVuZGFzJmd0OyZsdDtkYXRvc0V4dHJhU0VNTSZndDsmbHQ7bGV5ZW5kYTEmZ3Q7Jmx0Oy9sZXllbmRhMSZndDsmbHQ7L2RhdG9zRXh0cmFTRU1NJmd0OyZsdDsvZGF0b3NBZGVuZGEmZ3Q7XV0mZ3Q7PC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5mYWN0b3J5Q2xhc3M8L2tleT48dmFsdWU+dXkuY29tLnRpbHNvci5haWYuc2VtbVNjaGVtYXMuYWRlbmRhLkFkZW5kYUZhY3Rvcnk8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFJZD4xPC9tZXRhZGF0YUlkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YVR5cGU+dXkuY29tLnRpbHNvci5haWYucGx1Z2lucy5jZmUubWV0YWRhdGEuQWRlbmRhTWV0YWRhdGE8L21ldGFkYXRhVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXIgeG1sbnM9IiI+RVBfRU1JU09SX0NGRV9FTlRSQURBPC9oYW5kbGVyPg0KICAgICAgICAgICAgICAgICAgICA8L2ludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+DQogICAgICAgICAgICAnOw0KCQkJDQoJCQlzYXZlVFhUKCRsb2dQZXRpY2lvbiwgJHNlbmQsICR1cmxMb2csICRhY3Rpb24pOw0KDQogICAgICAgICAgICAkaGVhZGVycyA9IGFycmF5KA0KICAgICAgICAgICAgICAgIC8vICJQT1NUIC9wYWNrYWdlL3BhY2thZ2VfMS4zL3BhY2thZ2VzZXJ2aWNlcy5hc214IEhUVFAvMS4xIiwNCiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkc2VuZCkNCiAgICAgICAgICAgICk7IA0KICAgICAgICAgICAgDQogICAgICAgICAgICAkdXJsID0gV1NETDI7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHNlbmQpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZU9yaWcgPSBjdXJsX2V4ZWMoJGNoKTsgDQogICAgICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7DQoNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+JywnJywkcmVzcG9uc2VPcmlnKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCduczI6JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzwvc29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6RW52ZWxvcGU+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgLy8gJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyInLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZpY2VzLmNmZWhhbmRsZXJ3cy50aWxzb3IuY29tLnV5LyInLCcnLCRyZXNwb25zZSk7DQoNCiAgICAgICAgICAgICR4bWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHJlc3BvbnNlLCAiU2ltcGxlWE1MRWxlbWVudCIsIExJQlhNTF9OT0NEQVRBKTsNCiAgICAgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHhtbCk7DQogICAgICAgICAgICAkYXJyYXkgPSBqc29uX2RlY29kZSgkanNvbixUUlVFKTsNCg0KICAgICAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygicmV0dXJuIiwkYXJyYXkpKXsNCiAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvcnMiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgJGVycm9ycyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9ycyJdOw0KICAgIA0KICAgICAgICAgICAgICAgICAgICBpZigkZXJyb3JzPT0iZmFsc2UiIHx8ICRlcnJvcnMgPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZURhdGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNyZWF0ZURhdGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudEZvcm1hdCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRGb3JtYXQiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudElkID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudElkIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnROcmMgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50TnJjIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc3RhdHVzTmFtZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRTdGF0dXMiXVsic3RhdHVzTmFtZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50VHlwZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRUeXBlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0VmVyc2lvbiA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZm9ybWF0VmVyc2lvbiJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGludGVybmFsUGF0aCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaW50ZXJuYWxQYXRoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkY2ZlTnVtYmVyID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVOdW1iZXIiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZmVSYW5nZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlUmFuZ2UiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoYXNoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJoYXNoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmF0dXJlVGltZXN0YW1wID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJzaWduYXR1cmVUaW1lc3RhbXAiXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIk9rIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJUb2RvIG9rLiI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jcmVhdGVEYXRlID0gJGNyZWF0ZURhdGU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudEZvcm1hdCA9ICRkb2N1bWVudEZvcm1hdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50SWQgPSAkZG9jdW1lbnRJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsSWQgPSAkaW50ZXJuYWxJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50TnJjID0gJGRvY3VtZW50TnJjOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c3RhdHVzTmFtZSA9ICRzdGF0dXNOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRUeXBlID0gJGRvY3VtZW50VHlwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmZvcm1hdFZlcnNpb24gPSAkZm9ybWF0VmVyc2lvbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsUGF0aCA9ICRpbnRlcm5hbFBhdGg7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jZmVOdW1iZXIgPSAkY2ZlTnVtYmVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y2ZlUmFuZ2UgPSAkY2ZlUmFuZ2U7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5oYXNoID0gJGhhc2g7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5zaWduYXR1cmVUaW1lc3RhbXAgPSAkc2lnbmF0dXJlVGltZXN0YW1wOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigkZXJyb3JzPT0idHJ1ZSIgfHwgJGVycm9ycz09dHJ1ZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvckNvZGUiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JDb2RlID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JDb2RlIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvck1zZyIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvck1zZyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9yTXNnIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRlcnJvck1zZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nUmVzcHVlc3RhLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgDQogICAgICAgICAgICAgICAgICAgIGVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDQuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDUuIjsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gNi4iOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB9DQoJCQ0KCQllbHNlIGlmKCRhY3Rpb249PSJGRV9UaWxzb3JPTEQiKXsNCg0KICAgICAgICAgICAgLy8gJGNvbnRleHQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoWw0KICAgICAgICAgICAgICAgIC8vICdzc2wnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAvLyAnYWxsb3dfc2VsZl9zaWduZWQnID0+IHRydWUNCiAgICAgICAgICAgICAgICAvLyBdDQogICAgICAgICAgICAvLyBdKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gJHNvYXBfb3B0aW9ucyA9IFsNCiAgICAgICAgICAgICAgICAvLyAndXJpJyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nLA0KICAgICAgICAgICAgICAgIC8vICdzdHlsZScgPT4gU09BUF9SUEMsDQogICAgICAgICAgICAgICAgLy8gJ3VzZScgPT4gU09BUF9FTkNPREVELA0KICAgICAgICAgICAgICAgIC8vICdzb2FwX3ZlcnNpb24nID0+IFNPQVBfMV8xLA0KICAgICAgICAgICAgICAgIC8vICdjYWNoZV93c2RsJyA9PiBXU0RMX0NBQ0hFX05PTkUsDQogICAgICAgICAgICAgICAgLy8gJ2Nvbm5lY3Rpb25fdGltZW91dCcgPT4gMTUsDQogICAgICAgICAgICAgICAgLy8gJ3RyYWNlJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgIC8vICdlbmNvZGluZycgPT4gJ1VURi04JywNCiAgICAgICAgICAgICAgICAvLyAnZXhjZXB0aW9ucycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAvLyAnbG9naW4nID0+ICdpcGFya2luZ3MnLA0KICAgICAgICAgICAgICAgIC8vICdsb2dpbicgPT4gJ2ludGVyZmFjZScsDQogICAgICAgICAgICAgICAgLy8gLy8gJ3Bhc3N3b3JkJyA9PiAnYzEwN2ZjMTZmYycsDQogICAgICAgICAgICAgICAgLy8gJ3Bhc3N3b3JkJyA9PiAnZTkzOWFiOGQ4MjhlN2UwYWVhOTA5MmNiZWY0ODA1ODkwNTUyZWFiYzQwZjYyNjdjMTNhZDNiNjkzNGY0YmEzZCcsDQogICAgICAgICAgICAgICAgLy8gJ3N0cmVhbV9jb250ZXh0JyA9PiAkY29udGV4dA0KICAgICAgICAgICAgLy8gXTsNCg0KICAgICAgICAgICAgLy8gZGVmaW5lKCJzb2FwX29wdGlvbnMiLCRzb2FwX29wdGlvbnMpOw0KDQogICAgICAgICAgICAkZmVjaGEgPSBuZXcgRGF0ZVRpbWUoKTsNCiAgICAgICAgICAgICRhbm8gPSAkZmVjaGEtPmZvcm1hdCgiWSIpOw0KICAgICAgICAgICAgJG1lcyA9ICRmZWNoYS0+Zm9ybWF0KCJtIik7DQogICAgICAgICAgICAkZGlhID0gJGZlY2hhLT5mb3JtYXQoImQiKTsNCiAgICAgICAgICAgICRmZWNoYWEgPSAkYW5vLiItIi4kbWVzLiItIi4kZGlhOw0KDQogICAgICAgICAgICAkdGlwb0NGRSA9IDEwMTsNCg0KICAgICAgICAgICAgJE1udFRvdGFsID0gODA7DQogICAgICAgICAgICAkc2luSVZBID0gJE1udFRvdGFsLzEuMjI7DQogICAgICAgICAgICAkTW50TmV0b0lWQVRhc2FCYXNpY2EgPSBudW1iZXJfZm9ybWF0KChmbG9hdCkkc2luSVZBLCAyLCAnLicsICcnKTsNCiAgICAgICAgICAgICRJVkEgPSAkTW50VG90YWwtJHNpbklWQTsNCiAgICAgICAgICAgICRNbnRJVkFUYXNhQmFzaWNhID0gbnVtYmVyX2Zvcm1hdCgoZmxvYXQpJElWQSwgMiwgJy4nLCAnJyk7DQoNCiAgICAgICAgICAgICRkYXRhID0gJzw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PENGRSB4bWxucz0iaHR0cDovL2NmZS5kZ2kuZ3ViLnV5Ij48ZVRjaz48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz48RW1pc29yPjxSVUNFbWlzb3I+MjEyNjM1OTIwMDE0PC9SVUNFbWlzb3I+PFJ6blNvYz5BTEJJTkNPIFMuQTwvUnpuU29jPjxOb21Db21lcmNpYWw+QUxCSU5DTyBTLkE8L05vbUNvbWVyY2lhbD48R2lyb0VtaXM+PC9HaXJvRW1pcz48VGVsZWZvbm8+MjcxMS4xMDAwPC9UZWxlZm9ubz48Q29ycmVvRW1pc29yPjwvQ29ycmVvRW1pc29yPjxFbWlTdWN1cnNhbD48L0VtaVN1Y3Vyc2FsPjxDZGdER0lTdWN1cj4zPC9DZGdER0lTdWN1cj48RG9tRmlzY2FsPkFWLiBBTUVSSUNPIFJJQ0FMRE9OSSAyNDc0PC9Eb21GaXNjYWw+PENpdWRhZD5NT05URVZJREVPPC9DaXVkYWQ+PERlcGFydGFtZW50bz5NT05URVZJREVPPC9EZXBhcnRhbWVudG8+PC9FbWlzb3I+PFRvdGFsZXM+PFRwb01vbmVkYT5VWVU8L1Rwb01vbmVkYT48TW50Tm9HcnY+MC4wMDwvTW50Tm9HcnY+PE1udEV4cG95QXNpbT4wLjAwPC9NbnRFeHBveUFzaW0+PE1udEltcHVlc3RvUGVyYz4wLjAwPC9NbnRJbXB1ZXN0b1BlcmM+PE1udElWYWVuU3VzcD4wLjAwPC9NbnRJVmFlblN1c3A+PE1udE5ldG9JdmFUYXNhTWluPjAuMDA8L01udE5ldG9JdmFUYXNhTWluPjxNbnROZXRvSVZBVGFzYUJhc2ljYT4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9NbnROZXRvSVZBVGFzYUJhc2ljYT48TW50TmV0b0lWQU90cmE+MC4wMDwvTW50TmV0b0lWQU90cmE+PElWQVRhc2FNaW4+MTAuMDA8L0lWQVRhc2FNaW4+PElWQVRhc2FCYXNpY2E+MjIuMDA8L0lWQVRhc2FCYXNpY2E+PE1udElWQVRhc2FNaW4+MC4wMDwvTW50SVZBVGFzYU1pbj48TW50SVZBVGFzYUJhc2ljYT4nLiRNbnRJVkFUYXNhQmFzaWNhLic8L01udElWQVRhc2FCYXNpY2E+PE1udElWQU90cmE+MC4wMDwvTW50SVZBT3RyYT48TW50VG90YWw+Jy4kTW50VG90YWwuJzwvTW50VG90YWw+PE1udFRvdFJldGVuaWRvPjAuMDA8L01udFRvdFJldGVuaWRvPjxDYW50TGluRGV0PjE8L0NhbnRMaW5EZXQ+PE1vbnRvTkY+MC4wMDwvTW9udG9ORj48TW50UGFnYXI+Jy4kTW50VG90YWwuJzwvTW50UGFnYXI+PC9Ub3RhbGVzPjwvRW5jYWJlemFkbz48RGV0YWxsZT48SXRlbT48TnJvTGluRGV0PjE8L05yb0xpbkRldD48SW5kRmFjdD4zPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+MTI0MDgwMjA4NjAyMzEgMDAgRGlhcyAwMCBIb3JhcyAxMyBNaW51dG9zIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPjwvZVRjaz48L0NGRT4nOw0KDQogICAgICAgICAgICAkZGF0YTY0ID0gYmFzZTY0X2VuY29kZSgkZGF0YSk7DQoNCiAgICAgICAgICAgICRzZW5kID0gDQogICAgICAgICAgICAnDQogICAgICAgICAgICA8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQogICAgICAgICAgICAgICAgPHNvYXA6Qm9keT4NCiAgICAgICAgICAgICAgICAgICAgPGludm9pY2VSZWNlcHRpb24geG1sbnM9Imh0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50IHhtbG5zPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYXRhPicuJGRhdGE2NC4nPC9kYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPlNFTU08L25hbWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2RvY3VtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhTGlzdCB4bWxucz0iIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGE+Jy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGVudHJ5PjxrZXk+aW1wcmVzb3JhTG9jYWw8L2tleT48dmFsdWU+VEtUUEFSSzAxPC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8ZW50cnk+PGtleT5pbmRJbXByZXNpb248L2tleT48dmFsdWU+Rk9SQ0VfUFJJTlQ8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxlbnRyeT48a2V5PmNhbnRDb3BpYXM8L2tleT48dmFsdWU+MjwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxlbnRyeT48a2V5PmludGVybmFsSWQ8L2tleT48dmFsdWU+cGFyazM1NjY1NjwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUlkPjE8L21ldGFkYXRhSWQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhVHlwZT51eS5jb20udGlsc29yLmFpZi5wbHVnaW5zLnNlbW0ubWV0YWRhdGEuU0VNTU1ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUxpc3QgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5hZGVuZGE8L2tleT48dmFsdWU+Jmx0OyFbQ0RBVEFbJmx0O2RhdG9zQWRlbmRhIHhtbG5zPSJodHRwOi8vdGlsc29yLmNvbS51eS8jU0VNTUFkZW5kYSImZ3Q7Jmx0O2xleWVuZGFzJmd0OyZsdDtjb25zdGFuY2lhSVZBJmd0O0lWQSBhbCBkaWEmbHQ7L2NvbnN0YW5jaWFJVkEmZ3Q7Jmx0O3Jlc29sdWNpb24mZ3Q7UmVzLiA4OTcvMjAxNCZsdDsvcmVzb2x1Y2lvbiZndDsmbHQ7dmVyaWZpY2FyQ29tcHJvYmFudGUmZ3Q7UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHBzOi8vd3d3LnNlbW0uY29tLnV5Jmx0Oy92ZXJpZmljYXJDb21wcm9iYW50ZSZndDsmbHQ7L2xleWVuZGFzJmd0OyZsdDtkYXRvc0V4dHJhU0VNTSZndDsmbHQ7bGV5ZW5kYTEmZ3Q7Jmx0Oy9sZXllbmRhMSZndDsmbHQ7L2RhdG9zRXh0cmFTRU1NJmd0OyZsdDsvZGF0b3NBZGVuZGEmZ3Q7XV0mZ3Q7PC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5mYWN0b3J5Q2xhc3M8L2tleT48dmFsdWU+dXkuY29tLnRpbHNvci5haWYuc2VtbVNjaGVtYXMuYWRlbmRhLkFkZW5kYUZhY3Rvcnk8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFJZD4xPC9tZXRhZGF0YUlkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YVR5cGU+dXkuY29tLnRpbHNvci5haWYucGx1Z2lucy5jZmUubWV0YWRhdGEuQWRlbmRhTWV0YWRhdGE8L21ldGFkYXRhVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXIgeG1sbnM9IiI+RVBfRU1JU09SX0NGRV9FTlRSQURBPC9oYW5kbGVyPg0KICAgICAgICAgICAgICAgICAgICA8L2ludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+DQogICAgICAgICAgICAnOw0KDQogICAgICAgICAgICAkaGVhZGVycyA9IGFycmF5KA0KICAgICAgICAgICAgICAgIC8vICJQT1NUIC9wYWNrYWdlL3BhY2thZ2VfMS4zL3BhY2thZ2VzZXJ2aWNlcy5hc214IEhUVFAvMS4xIiwNCiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkc2VuZCkNCiAgICAgICAgICAgICk7IA0KICAgICAgICAgICAgDQogICAgICAgICAgICAkdXJsID0gV1NETDI7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHNlbmQpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZU9yaWcgPSBjdXJsX2V4ZWMoJGNoKTsgDQogICAgICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7DQoNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzxzb2FwOkJvZHk+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJ25zMjonLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPC9zb2FwOkJvZHk+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzwvc29hcDpFbnZlbG9wZT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCcgeG1sbnM6bnMyPSJodHRwOi8vc2VydmljZXMuY2ZlaGFuZGxlcndzLnRpbHNvci5jb20udXkvIicsJycsJHJlc3BvbnNlKTsNCg0KICAgICAgICAgICAgJHhtbCA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkcmVzcG9uc2UsICJTaW1wbGVYTUxFbGVtZW50IiwgTElCWE1MX05PQ0RBVEEpOw0KICAgICAgICAgICAgJGpzb24gPSBqc29uX2VuY29kZSgkeG1sKTsNCiAgICAgICAgICAgICRhcnJheSA9IGpzb25fZGVjb2RlKCRqc29uLFRSVUUpOw0KDQogICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJyZXR1cm4iLCRhcnJheSkpew0KICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9ycyIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAkZXJyb3JzID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JzIl07DQogICAgDQogICAgICAgICAgICAgICAgICAgIGlmKCRlcnJvcnM9PSJmYWxzZSIgfHwgJGVycm9ycyA9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICAkY3JlYXRlRGF0ZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY3JlYXRlRGF0ZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50Rm9ybWF0ID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudEZvcm1hdCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50SWQgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50SWQiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudE5yYyA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnROcmMiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0dXNOYW1lID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudFN0YXR1cyJdWyJzdGF0dXNOYW1lIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRUeXBlID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudFR5cGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXRWZXJzaW9uID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJmb3JtYXRWZXJzaW9uIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkaW50ZXJuYWxQYXRoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJpbnRlcm5hbFBhdGgiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZmVOdW1iZXIgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNmZU51bWJlciJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmZVJhbmdlID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVSYW5nZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGhhc2ggPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImhhc2giXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduYXR1cmVUaW1lc3RhbXAgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bInNpZ25hdHVyZVRpbWVzdGFtcCJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiT2siOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIlRvZG8gb2suIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNyZWF0ZURhdGUgPSAkY3JlYXRlRGF0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50Rm9ybWF0ID0gJGRvY3VtZW50Rm9ybWF0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRJZCA9ICRkb2N1bWVudElkOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnROcmMgPSAkZG9jdW1lbnROcmM7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5zdGF0dXNOYW1lID0gJHN0YXR1c05hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudFR5cGUgPSAkZG9jdW1lbnRUeXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Zm9ybWF0VmVyc2lvbiA9ICRmb3JtYXRWZXJzaW9uOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+aW50ZXJuYWxQYXRoID0gJGludGVybmFsUGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNmZU51bWJlciA9ICRjZmVOdW1iZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jZmVSYW5nZSA9ICRjZmVSYW5nZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmhhc2ggPSAkaGFzaDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnNpZ25hdHVyZVRpbWVzdGFtcCA9ICRzaWduYXR1cmVUaW1lc3RhbXA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJCXNhdmVUWFQoJGxvZ1Jlc3B1ZXN0YSwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCRlcnJvcnM9PSJ0cnVlIiB8fCAkZXJyb3JzPT10cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yQ29kZSIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvckNvZGUgPSAkYXJyYXlbInJldHVybiJdWyJlcnJvckNvZGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yTXNnIiwkYXJyYXlbInJldHVybiJdKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yTXNnID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JNc2ciXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNDAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gJGVycm9yTXNnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICAgICAgZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gNy4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dFcnJvciwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNTAwOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gOC4iOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIkFsZ28gYW5kdXZvIG1hbCwgY2hlcXVlYXIgaW5mbyA5LiI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIH0gDQoJCQ0KCQllbHNlew0KICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gMzAwOw0KICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIk5vIHJlY2libyBhY3Rpb24gdmFsaWRvLiI7DQogICAgICAgIA0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgfQ0KCQkNCiAgICB9IGVsc2V7DQogICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiTm8gcmVjaWJvIGFjdGlvbi4iOw0KICAgIA0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQlzYXZlVFhUKCRsb2dFcnJvciwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICB9DQoNCn0NCg0KZWxzZXsNCg0KICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgJHJlc3B1ZXN0YS0+bXNqID0gIk5vIHJlY2libyB0aXBvIGRlIGRhdG8gcmVjb25vY2libGUgZW4gbGEgc29saWNpdHVkLiI7DQoNCiAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgcmV0dXJuICRyZXNwdWVzdGE7DQoNCn0NCg0KPz4=","file2":"PD9waHANCg0KaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46IConKTsNCg0KLy8vLyBVUkxzIHRlc3RpbmcNCi8vLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5zdGcuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9BSUZTZXJ2aWNlcy9zZXJ2aWNlcy9JbnZvaWNlSGFuZGxpbmdTZXJ2aWNlcz93c2RsIik7DQovLy8vIGRlZmluZSgiV1NETDIiLCJodHRwOi8vd2xwb29sLnN0Zy5haWMuY2FycmFzY28uYWVybzo5MDgwL0FJRlNlcnZpY2VzL3NlcnZpY2VzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCi8vLy8gVVJMcyBwcm9kdWNjacOzbg0KLy8vLyBkZWZpbmUoIldTREwiLCJodHRwOi8vd2xwb29sLmZlLmFpYy5jYXJyYXNjby5hZXJvOjkwODAvQUlGU2VydmljZXMvc2VydmljZXMvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KLy8vLyBkZWZpbmUoIldTREwyIiwiaHR0cDovL3dscG9vbC5mZS5haWMuY2FycmFzY28uYWVybzo5MDgwL0FJRlNlcnZpY2VzL3NlcnZpY2VzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCi8vIFVSTHMgdGVzdGluZw0KLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5zdGcuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KLy8gZGVmaW5lKCJXU0RMMiIsImh0dHA6Ly93bHBvb2wuc3RnLmFpYy5jYXJyYXNjby5hZXJvOjkwODAvYWlmL3dzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCi8vIFVSTHMgcHJvZA0KLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5mZS5haWMuY2FycmFzY28uYWVybzo5MDgwL2FpZi93cy9JbnZvaWNlSGFuZGxpbmdTZXJ2aWNlcz93c2RsIik7DQpkZWZpbmUoIldTREwiLCJodHRwOi8vd2xwb29sMi5mZS5haWMuY2FycmFzY28uYWVyby9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KLy8gZGVmaW5lKCJXU0RMMiIsImh0dHA6Ly93bHBvb2wuZmUuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXMiKTsNCmRlZmluZSgiV1NETDIiLCJodHRwOi8vd2xwb29sMi5mZS5haWMuY2FycmFzY28uYWVyby9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXMiKTsNCg0KLy8gQVBJX1RJTFNPUi8NCg0KZnVuY3Rpb24gc2F2ZVRYVCgkZmlsZSwgJGRhdGEsICR1cmxGcm9tLCAkYWN0aW9uKXsNCgkkZmVjaGEgPSBuZXcgRGF0ZVRpbWUoKTsNCgkkZmVjaGEgPSAkZmVjaGEtPmZvcm1hdCgiWS1tLWQgSDppOnMiKTsNCglmaWxlX3B1dF9jb250ZW50cygkZmlsZS4iLnR4dCIsIlxuRGF0YTogIi4kZGF0YS4iXG5EZXNkZTogIi4kdXJsRnJvbS4iLCBBY3Rpb246ICIuJGFjdGlvbi4iLCBGZWNoYTogIi4kZmVjaGEuIi5cbiIsIEZJTEVfQVBQRU5EKTsNCn0NCg0KJGxvZ0Vycm9yID0gImxvZ3MvdGlsc29yL2Vycm9yZXMiOw0KJGxvZ1BldGljaW9uID0gImxvZ3MvdGlsc29yL2VudmlhZG8iOw0KJGxvZ1Jlc3B1ZXN0YSA9ICJsb2dzL3RpbHNvci9yZXNwdWVzdGEiOw0KJHVybExvZyA9ICIxMC40NC4yMDAuMTEvaXBhcmtpbmdzX3Byb2Qvb3JtX3Bjcy90ZXJtaW5hbF93ZWIvdGlsc29yLnBocCI7DQoNCiRyZXNwdWVzdGEgPSAob2JqZWN0KQ0KWw0KICAgICJjb2RpZ28iID0+IDAsDQogICAgImVycm9yIiA9PiAiT2siLA0KICAgICJtc2oiID0+ICJUb2RvIGNvcnJlY3RvLiINCl07DQoNCiR0aXBvRGF0b1JlY2liaWRvID0gJF9TRVJWRVJbJ0NPTlRFTlRfVFlQRSddOw0KDQppZigkdGlwb0RhdG9SZWNpYmlkbz09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpew0KDQogICAgaWYoaXNzZXQoJF9QT1NUWyJhY3Rpb24iXSkpew0KDQogICAgICAgICRhY3Rpb24gPSAkX1BPU1RbImFjdGlvbiJdOw0KDQogICAgICAgIGlmKCRhY3Rpb249PSJGRV9UaWxzb3IiKXsNCg0KICAgICAgICAgICAgLy8gJGNvbnRleHQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoWw0KICAgICAgICAgICAgICAgIC8vICdzc2wnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAvLyAnYWxsb3dfc2VsZl9zaWduZWQnID0+IHRydWUNCiAgICAgICAgICAgICAgICAvLyBdDQogICAgICAgICAgICAvLyBdKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gJHNvYXBfb3B0aW9ucyA9IFsNCiAgICAgICAgICAgICAgICAvLyAndXJpJyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nLA0KICAgICAgICAgICAgICAgIC8vICdzdHlsZScgPT4gU09BUF9SUEMsDQogICAgICAgICAgICAgICAgLy8gJ3VzZScgPT4gU09BUF9FTkNPREVELA0KICAgICAgICAgICAgICAgIC8vICdzb2FwX3ZlcnNpb24nID0+IFNPQVBfMV8xLA0KICAgICAgICAgICAgICAgIC8vICdjYWNoZV93c2RsJyA9PiBXU0RMX0NBQ0hFX05PTkUsDQogICAgICAgICAgICAgICAgLy8gJ2Nvbm5lY3Rpb25fdGltZW91dCcgPT4gMTUsDQogICAgICAgICAgICAgICAgLy8gJ3RyYWNlJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgIC8vICdlbmNvZGluZycgPT4gJ1VURi04JywNCiAgICAgICAgICAgICAgICAvLyAnZXhjZXB0aW9ucycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAvLyAnbG9naW4nID0+ICdpcGFya2luZ3MnLA0KICAgICAgICAgICAgICAgIC8vICdsb2dpbicgPT4gJ2ludGVyZmFjZScsDQogICAgICAgICAgICAgICAgLy8gLy8gJ3Bhc3N3b3JkJyA9PiAnYzEwN2ZjMTZmYycsDQogICAgICAgICAgICAgICAgLy8gJ3Bhc3N3b3JkJyA9PiAnZTkzOWFiOGQ4MjhlN2UwYWVhOTA5MmNiZWY0ODA1ODkwNTUyZWFiYzQwZjYyNjdjMTNhZDNiNjkzNGY0YmEzZCcsDQogICAgICAgICAgICAgICAgLy8gJ3N0cmVhbV9jb250ZXh0JyA9PiAkY29udGV4dA0KICAgICAgICAgICAgLy8gXTsNCg0KICAgICAgICAgICAgLy8gZGVmaW5lKCJzb2FwX29wdGlvbnMiLCRzb2FwX29wdGlvbnMpOw0KCQkJDQoJCQkkZXJyb3IgPSBmYWxzZTsNCiAgICAgICAgICAgICRtc2ogPSAiTm8gcmVjaWJvOiI7DQoNCiAgICAgICAgICAgIGlmKGlzc2V0KCRfUE9TVFsidGlwb0NGRSJdKSl7DQogICAgICAgICAgICAgICAgJHRpcG9DRkUgPSAoaW50ZWdlcikkX1BPU1RbInRpcG9DRkUiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgdGlwb0NGRTsiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoaXNzZXQoJF9QT1NUWyJNbnRUb3RhbCJdKSl7DQogICAgICAgICAgICAgICAgJE1udFRvdGFsID0gKGZsb2F0KSRfUE9TVFsiTW50VG90YWwiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgTW50VG90YWw7IjsNCiAgICAgICAgICAgIH0NCgkJCS8vIGlmKGlzc2V0KCRfUE9TVFsiZm9ybWFQYWdvIl0pKXsNCiAgICAgICAgICAgICAgICAvLyAkZm9ybWFQYWdvID0gJF9QT1NUWyJmb3JtYVBhZ28iXTsNCiAgICAgICAgICAgIC8vIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAvLyAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgIC8vICRtc2ogPSAkbXNqLiIgZm9ybWFQYWdvOyI7DQogICAgICAgICAgICAvLyB9DQoJCQkvLyBpZihpc3NldCgkX1BPU1RbIm1lZGlvUGFnbyJdKSl7DQogICAgICAgICAgICAgICAgLy8gJG1lZGlvUGFnbyA9ICRfUE9TVFsibWVkaW9QYWdvIl07DQogICAgICAgICAgICAvLyB9IGVsc2V7DQogICAgICAgICAgICAgICAgLy8gJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAvLyAkbXNqID0gJG1zai4iIG1lZGlvUGFnbzsiOw0KICAgICAgICAgICAgLy8gfQ0KCQkJaWYoaXNzZXQoJF9QT1NUWyJpZFN0YXkiXSkpew0KICAgICAgICAgICAgICAgICRpZFN0YXkgPSAkX1BPU1RbImlkU3RheSJdOw0KICAgICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgICAgICRlcnJvciA9IHRydWU7DQogICAgICAgICAgICAgICAgJG1zaiA9ICRtc2ouIiBpZFN0YXk7IjsNCiAgICAgICAgICAgIH0NCgkJCWlmKGlzc2V0KCRfUE9TVFsiYmFyY29kZSJdKSl7DQogICAgICAgICAgICAgICAgJGJhcmNvZGUgPSAkX1BPU1RbImJhcmNvZGUiXTsNCiAgICAgICAgICAgIH0NCgkJCWVsc2V7DQoJCQkJJGJhcmNvZGUgPSAiIjsNCgkJCX0NCgkJCWlmKGlzc2V0KCRfUE9TVFsiaG9yYXNFc3RhZGlhIl0pKXsNCiAgICAgICAgICAgICAgICAkaG9yYXNFc3RhZGlhID0gJF9QT1NUWyJob3Jhc0VzdGFkaWEiXTsNCiAgICAgICAgICAgIH0NCgkJCWVsc2V7DQoJCQkJJGhvcmFzRXN0YWRpYSA9ICIiOw0KCQkJfQ0KCQkJaWYoaXNzZXQoJF9QT1NUWyJhZGRBZGVuZGEiXSkpew0KICAgICAgICAgICAgICAgICRhZGRBZGVuZGEgPSAkX1BPU1RbImFkZEFkZW5kYSJdOw0KICAgICAgICAgICAgfQ0KCQkJZWxzZXsNCgkJCQkkYWRkQWRlbmRhID0gIiI7DQoJCQl9DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMTEgfHwgJHRpcG9DRkU9PTExMil7DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJydXQiXSkpew0KCQkJCQkkcnV0ID0gJF9QT1NUWyJydXQiXTsNCgkJCQkJaWYoJHJ1dD09IiIpew0KCQkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJCSRtc2ogPSAkbXNqLiIgcnV0OyI7DQoJCQkJCX0NCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgcnV0OyI7DQoJCQkJfQ0KCQkJCWlmKGlzc2V0KCRfUE9TVFsic29jaWFsIl0pKXsNCgkJCQkJJHNvY2lhbCA9ICRfUE9TVFsic29jaWFsIl07DQoJCQkJCWlmKCRzb2NpYWw9PSIiKXskc29jaWFsPSJTSU4gUkFaT04gU09DSUFMIjt9DQoJCQkJfSBlbHNlew0KCQkJCQkkZXJyb3IgPSB0cnVlOw0KCQkJCQkkbXNqID0gJG1zai4iIHNvY2lhbDsiOw0KCQkJCX0NCgkJCQlpZihpc3NldCgkX1BPU1RbImRpciJdKSl7DQoJCQkJCSRkaXIgPSAkX1BPU1RbImRpciJdOw0KCQkJCQlpZigkZGlyPT0iIil7JGRpcj0iU0lOIERJUkVDQ0lPTiI7fQ0KCQkJCX0gZWxzZXsNCgkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJJG1zaiA9ICRtc2ouIiBkaXI7IjsNCgkJCQl9DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJjaXVkYWQiXSkpew0KCQkJCQkkY2l1ZGFkID0gJF9QT1NUWyJjaXVkYWQiXTsNCgkJCQkJaWYoJGNpdWRhZD09IiIpeyRjaXVkYWQ9IlNJTiBDSVVEQUQiO30NCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgY2l1ZGFkOyI7DQoJCQkJfQ0KCQkJCQ0KCQkJfQ0KCQkJDQoJCQlpZigkdGlwb0NGRT09MTAyIHx8ICR0aXBvQ0ZFPT0xMTIpew0KCQkJCWlmKGlzc2V0KCRfUE9TVFsicmVmZXJlbmNlIl0pKXsNCgkJCQkJJHJlZmVyZW5jZSA9ICRfUE9TVFsicmVmZXJlbmNlIl07DQoJCQkJfSBlbHNlew0KCQkJCQkkZXJyb3IgPSB0cnVlOw0KCQkJCQkkbXNqID0gJG1zai4iIHJlZmVyZW5jZTsiOw0KCQkJCX0NCgkJCX0NCg0KICAgICAgICAgICAgaWYoJGVycm9yPT10cnVlKXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA0MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRtc2o7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRmZWNoYSA9IG5ldyBEYXRlVGltZSgpOw0KICAgICAgICAgICAgJGFubyA9ICRmZWNoYS0+Zm9ybWF0KCJZIik7DQogICAgICAgICAgICAkbWVzID0gJGZlY2hhLT5mb3JtYXQoIm0iKTsNCiAgICAgICAgICAgICRkaWEgPSAkZmVjaGEtPmZvcm1hdCgiZCIpOw0KICAgICAgICAgICAgJGZlY2hhYSA9ICRhbm8uIi0iLiRtZXMuIi0iLiRkaWE7DQoNCiAgICAgICAgICAgICRzaW5JVkEgPSAkTW50VG90YWwvMS4yMjsNCiAgICAgICAgICAgICRNbnROZXRvSVZBVGFzYUJhc2ljYSA9IG51bWJlcl9mb3JtYXQoKGZsb2F0KSRzaW5JVkEsIDIsICcuJywgJycpOw0KICAgICAgICAgICAgJElWQSA9ICRNbnRUb3RhbC0kc2luSVZBOw0KICAgICAgICAgICAgJE1udElWQVRhc2FCYXNpY2EgPSBudW1iZXJfZm9ybWF0KChmbG9hdCkkSVZBLCAyLCAnLicsICcnKTsNCgkJCQ0KCQkJLy8gJGludGVybmFsSWQgPSAiQ0FJLUlQLVdQMi0kaWRTdGF5IjsNCgkJCS8vIE9SSUdJTkFMLCBQUkVWSU8gTUlHUkFDSU9OIDIxLTEwLTIwMjUNCgkJCS8vICRpbnRlcm5hbElkID0gIkNBSS1JUC0kaWRTdGF5IjsNCgkJCWlmKCR0aXBvQ0ZFPT0xMTIgfHwgJHRpcG9DRkU9PTEwMil7DQoJCQkJJGludGVybmFsSWQgPSAiQ0FJLUlQLU5DLSRpZFN0YXkiOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkaW50ZXJuYWxJZCA9ICJDQUktSVAtJGlkU3RheSI7DQoJCQl9DQoJCQkvLyAkaW50ZXJuYWxJZCA9ICJDQUktSVAtVEVTVC0kaWRTdGF5IjsNCgkJCQ0KCQkJJGVtaXNvciA9ICc8RW1pc29yPjxSVUNFbWlzb3I+MjEyOTkxODEwMDExPC9SVUNFbWlzb3I+PFJ6blNvYz5Db25zb3JjaW8gQWVyb3B1ZXJ0b3MgSW50ZXJuYWNpb25hbGVzUy5BLjwvUnpuU29jPjxOb21Db21lcmNpYWw+PC9Ob21Db21lcmNpYWw+PEdpcm9FbWlzPjwvR2lyb0VtaXM+PFRlbGVmb25vPjwvVGVsZWZvbm8+PENvcnJlb0VtaXNvcj48L0NvcnJlb0VtaXNvcj48RW1pU3VjdXJzYWw+UERQIENvcnBvcmF0ZSAoRmMuQUU8L0VtaVN1Y3Vyc2FsPjxDZGdER0lTdWN1cj4xPC9DZGdER0lTdWN1cj48RG9tRmlzY2FsPlJ1dGEgOTMgS20uIDExMyBMYWd1bmEgZGVsIFNhdWNlIE1hbGRvbmFkbzwvRG9tRmlzY2FsPjxDaXVkYWQ+UHVudGEgZGVsIEVzdGU8L0NpdWRhZD48RGVwYXJ0YW1lbnRvPlB1bnRhIGRlbCBFc3RlPC9EZXBhcnRhbWVudG8+PC9FbWlzb3I+JzsNCgkJCS8vICRPTERlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxNDkwMjM0MDAxMDwvUlVDRW1pc29yPjxSem5Tb2M+VENVIFMuQS48L1J6blNvYz48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5Dbm8uIENhcnJhc2NvIDAgeSBBLiBkZSBsYXMgQW1lcmljYXM8L0RvbUZpc2NhbD48Q2l1ZGFkPkFlcm9wdWVydG8gZGUgQ2FycmFzY288L0NpdWRhZD48RGVwYXJ0YW1lbnRvPkNhbmVsb25lczwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMDEgfHwgJHRpcG9DRkU9PTEwMil7DQoJCQkJJHJlZmVyZW5jaWEgPSAiIjsNCgkJCQlpZigkdGlwb0NGRT09MTAyKXsNCgkJCQkJJHJlZmVyZW5jaWEgPSAnPFJlZmVyZW5jaWE+PFJlZmVyZW5jaWE+PE5yb0xpblJlZj4xPC9Ocm9MaW5SZWY+PEluZEdsb2JhbD4xPC9JbmRHbG9iYWw+PFRwb0RvY1JlZj4xMDE8L1Rwb0RvY1JlZj48U2VyaWU+QTwvU2VyaWU+PE5yb0NGRVJlZj4nLiRyZWZlcmVuY2UuJzwvTnJvQ0ZFUmVmPjxSYXpvblJlZj4nLiRyZWZlcmVuY2UuJzwvUmF6b25SZWY+PEZlY2hhQ0ZFcmVmPicuJGZlY2hhYS4nPC9GZWNoYUNGRXJlZj48L1JlZmVyZW5jaWE+PC9SZWZlcmVuY2lhPic7DQoJCQkJfQ0KCQkJCSRkYXRhID0gJzw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PENGRSB4bWxucz0iaHR0cDovL2NmZS5kZ2kuZ3ViLnV5Ij48ZVRjaz48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZVRjaz48L0NGRT4nOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkcmVmZXJlbmNpYSA9ICIiOw0KCQkJCWlmKCR0aXBvQ0ZFPT0xMTIpew0KCQkJCQkkcmVmZXJlbmNpYSA9ICc8UmVmZXJlbmNpYT48UmVmZXJlbmNpYT48TnJvTGluUmVmPjE8L05yb0xpblJlZj48SW5kR2xvYmFsPjE8L0luZEdsb2JhbD48VHBvRG9jUmVmPjExMTwvVHBvRG9jUmVmPjxTZXJpZT5BPC9TZXJpZT48TnJvQ0ZFUmVmPicuJHJlZmVyZW5jZS4nPC9Ocm9DRkVSZWY+PFJhem9uUmVmPicuJHJlZmVyZW5jZS4nPC9SYXpvblJlZj48RmVjaGFDRkVyZWY+Jy4kZmVjaGFhLic8L0ZlY2hhQ0ZFcmVmPjwvUmVmZXJlbmNpYT48L1JlZmVyZW5jaWE+JzsNCgkJCQl9DQoJCQkJJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlRmFjdD48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxSZWNlcHRvcj48VGlwb0RvY1JlY2VwPjI8L1RpcG9Eb2NSZWNlcD48Q29kUGFpc1JlY2VwPlVZPC9Db2RQYWlzUmVjZXA+PERvY1JlY2VwPicuJHJ1dC4nPC9Eb2NSZWNlcD48UnpuU29jUmVjZXA+Jy4kc29jaWFsLic8L1J6blNvY1JlY2VwPjxEaXJSZWNlcD4nLiRkaXIuJzwvRGlyUmVjZXA+PENpdWRhZFJlY2VwPicuJGNpdWRhZC4nPC9DaXVkYWRSZWNlcD48L1JlY2VwdG9yPjxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZUZhY3Q+PC9DRkU+JzsNCgkJCX0NCg0KICAgICAgICAgICAgJGRhdGE2NCA9IGJhc2U2NF9lbmNvZGUoJGRhdGEpOw0KCQkJDQoJCQkkYWRlbmRhID0gDQoJCQknPCFbQ0RBVEFbPHRjYTpkYXRvc0FkZW5kYSB4bWxuczp0Y2E9Imh0dHA6Ly90aWxzb3IuY29tLnV5LyNQRFNBZGVuZGEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3RpbHNvci5jb20udXkvI1BEU0FkZW5kYSBQRFNBZGVuZGEueHNkIj4NCgkJCQk8dGNhOmxleWVuZGFzPg0KCQkJCQk8dGNhOmNvbnN0YW5jaWFJVkE+SS5WLkEuIEFMIETDjUE8L3RjYTpjb25zdGFuY2lhSVZBPg0KCQkJCQk8dGNhOnJlc29sdWNpb24+UmVzLiAyNTIvMjAxNTwvdGNhOnJlc29sdWNpb24+DQoJCQkJCTx0Y2E6dmVyaWZpY2FyQ29tcHJvYmFudGU+UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHA6Ly93d3cuZGdpLmd1Yi51eS88L3RjYTp2ZXJpZmljYXJDb21wcm9iYW50ZT4NCgkJCQk8L3RjYTpsZXllbmRhcz4NCgkJCTwvdGNhOmRhdG9zQWRlbmRhPl1dPic7DQoJCQkNCgkJCSRPTERhZGVuZGEgPSANCgkJCSc8IVtDREFUQVs8dGNhOmRhdG9zQWRlbmRhIHhtbG5zOnRjYT0iaHR0cDovL3RpbHNvci5jb20udXkvI1BEU0FkZW5kYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vdGlsc29yLmNvbS51eS8jUERTQWRlbmRhIFBEU0FkZW5kYS54c2QiPg0KCQkJCTx0Y2E6bGV5ZW5kYXM+DQoJCQkJCTx0Y2E6Y29uc3RhbmNpYUlWQT5JLlYuQS4gQUwgRMONQTwvdGNhOmNvbnN0YW5jaWFJVkE+DQoJCQkJCTx0Y2E6cmVzb2x1Y2lvbj5SZXMuIDI1Mi8yMDE1PC90Y2E6cmVzb2x1Y2lvbj4NCgkJCQkJPHRjYTp2ZXJpZmljYXJDb21wcm9iYW50ZT5QdWVkZSB2ZXJpZmljYXIgY29tcHJvYmFudGUgZW4gaHR0cDovL3d3dy5kZ2kuZ3ViLnV5LzwvdGNhOnZlcmlmaWNhckNvbXByb2JhbnRlPg0KCQkJCTwvdGNhOmxleWVuZGFzPg0KCQkJCTx0Y2E6ZGF0b3NFeHRyYVRDVT4nLg0KCQkJCQkvLyA8dGNhOmZvcm1hUGFnbz5Ew4lCSVRPIEJBTkNBUklPPC90Y2E6Zm9ybWFQYWdvPg0KCQkJCQkvLyA8dGNhOm1lZGlvUGFnbz5TQ09USUFCQU5LPC90Y2E6bWVkaW9QYWdvPg0KCQkJCQknPHRjYTpmb3JtYVBhZ28+Jy4kZm9ybWFQYWdvLic8L3RjYTpmb3JtYVBhZ28+DQoJCQkJCTx0Y2E6bWVkaW9QYWdvPicuJG1lZGlvUGFnby4nPC90Y2E6bWVkaW9QYWdvPg0KCQkJCQk8dGNhOnVzdWFyaW8+MTEyOTA8L3RjYTp1c3VhcmlvPicuDQoJCQkJCS8vIDx0Y2E6ZG9jdW1lbnRvVENVPlBEUy1TRi0xMDI0Njg3PC90Y2E6ZG9jdW1lbnRvVENVPg0KCQkJCQknPHRjYTpkb2N1bWVudG9UQ1U+Jy4kaW50ZXJuYWxJZC4nPC90Y2E6ZG9jdW1lbnRvVENVPg0KCQkJCQk8dGNhOmxleWVuZGFDb21tZXJjaWFsPkxBQ0MgLSBDaXVkYWQgTG9nw61zdGljYSBJbnRlcm5hY2lvbmFsPC90Y2E6bGV5ZW5kYUNvbW1lcmNpYWw+DQoJCQkJPC90Y2E6ZGF0b3NFeHRyYVRDVT4NCgkJCTwvdGNhOmRhdG9zQWRlbmRhPl1dPic7DQoJCQkNCgkJCWlmKGlzc2V0KCRfUE9TVFsicG9zIl0pKXsNCiAgICAgICAgICAgICAgICAkcG9zID0gJF9QT1NUWyJwb3MiXTsNCiAgICAgICAgICAgIH0NCgkJCWVsc2V7DQoJCQkJJHBvcyA9ICIiOw0KCQkJfQ0KCQkJDQoJCQlpZigkcG9zIT0iIil7DQoJCQkJJHByaW50ID0gIkZPUkNFX1BSSU5UIjsNCgkJCQkkcHJpbnRlciA9ICRwb3M7DQoJCQl9DQoJCQllbHNlew0KCQkJCSRwcmludCA9ICJET05UX1BSSU5UIjsNCgkJCQkkcHJpbnRlciA9ICJUTEFTSTAwNSI7DQoJCQl9DQoNCiAgICAgICAgICAgICRzZW5kID0gDQogICAgICAgICAgICAnDQogICAgICAgICAgICA8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQogICAgICAgICAgICAgICAgPHNvYXA6Qm9keT4NCiAgICAgICAgICAgICAgICAgICAgPGludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnQgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRhdGE+Jy4kZGF0YTY0Lic8L2RhdGE+Jy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8bmFtZT5TRU1NPC9uYW1lPg0KICAgICAgICAgICAgICAgICAgICAgICAgJzwvZG9jdW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5hZGVuZGE8L2tleT4NCgkJCQkJCQkJCTx2YWx1ZT4nLiRhZGVuZGEuJzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48a2V5PmZhY3RvcnlDbGFzczwva2V5Pjx2YWx1ZT51eS5jb20udGlsc29yLmFpZi5wZHNTY2hlbWFzLmFkZW5kYS5BZGVuZGFGYWN0b3J5PC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhVHlwZT51eS5jb20udGlsc29yLmFpZi5wbHVnaW5zLmNmZS5tZXRhZGF0YS5BZGVuZGFNZXRhZGF0YTwvbWV0YWRhdGFUeXBlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YUxpc3Q+DQoJCQkJCQk8bWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5vcmlnaW48L2tleT4NCgkJCQkJCQkJCTx2YWx1ZT5JUGFya2luZzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQoJCQkJCQkJCTxlbnRyeT4NCgkJCQkJCQkJCTxrZXk+bm9tYnJlSW1wcmVzb3JhPC9rZXk+DQoJCQkJCQkJCQk8dmFsdWU+Jy4kcHJpbnRlci4nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCgkJCQkJCQkJPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5pbmRJbXByZXNpb248L2tleT4nLg0KCQkJCQkJCQkJLy8gPHZhbHVlPkZPUkNFX1BSSU5UPC92YWx1ZT4NCgkJCQkJCQkJCSc8dmFsdWU+Jy4kcHJpbnQuJzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQoJCQkJCQkJCTxlbnRyeT4NCgkJCQkJCQkJCTxrZXk+aW50ZXJuYWxJZDwva2V5Pg0KCQkJCQkJCQkJPHZhbHVlPicuJGludGVybmFsSWQuJzwvdmFsdWU+DQoJCQkJCQkJCTwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFUeXBlPnV5LmNvbS50aWxzb3IuYWlmLnBsdWdpbnMucGRzLm1ldGFkYXRhLlBEU01ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxoYW5kbGVyIHhtbG5zPSIiPkVQX0VNSVNPUl9DRkVfRU5UUkFEQTwvaGFuZGxlcj4NCiAgICAgICAgICAgICAgICAgICAgPC9pbnZvaWNlUmVjZXB0aW9uPg0KICAgICAgICAgICAgICAgIDwvc29hcDpCb2R5Pg0KICAgICAgICAgICAgPC9zb2FwOkVudmVsb3BlPg0KICAgICAgICAgICAgJzsNCgkJCQ0KCQkJc2F2ZVRYVCgkbG9nUGV0aWNpb24sICRzZW5kLCAkdXJsTG9nLCAkYWN0aW9uKTsNCg0KICAgICAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgNCiAgICAgICAgICAgICAgICAvLyAiUE9TVCAvcGFja2FnZS9wYWNrYWdlXzEuMy9wYWNrYWdlc2VydmljZXMuYXNteCBIVFRQLzEuMSIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiLA0KICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogIi5zdHJsZW4oJHNlbmQpDQogICAgICAgICAgICApOyANCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHVybCA9IFdTREwyOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkY2ggPSBjdXJsX2luaXQoKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIHRydWUpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRzZW5kKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZGVycyk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkcmVzcG9uc2VPcmlnID0gY3VybF9leGVjKCRjaCk7IA0KICAgICAgICAgICAgY3VybF9jbG9zZSgkY2gpOw0KDQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPicsJycsJHJlc3BvbnNlT3JpZyk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPHNvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnbnMyOicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPC9zb2FwOkVudmVsb3BlPicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgIC8vICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCcgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iJywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpuczI9Imh0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8iJywnJywkcmVzcG9uc2UpOw0KDQogICAgICAgICAgICAkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSwgIlNpbXBsZVhNTEVsZW1lbnQiLCBMSUJYTUxfTk9DREFUQSk7DQogICAgICAgICAgICAkanNvbiA9IGpzb25fZW5jb2RlKCR4bWwpOw0KICAgICAgICAgICAgJGFycmF5ID0ganNvbl9kZWNvZGUoJGpzb24sVFJVRSk7DQoNCiAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoInJldHVybiIsJGFycmF5KSl7DQogICAgICAgICAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygiZXJyb3JzIiwkYXJyYXlbInJldHVybiJdKSl7DQogICAgICAgICAgICAgICAgICAgICRlcnJvcnMgPSAkYXJyYXlbInJldHVybiJdWyJlcnJvcnMiXTsNCiAgICANCiAgICAgICAgICAgICAgICAgICAgaWYoJGVycm9ycz09ImZhbHNlIiB8fCAkZXJyb3JzID09IGZhbHNlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjcmVhdGVEYXRlID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjcmVhdGVEYXRlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRGb3JtYXQgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50Rm9ybWF0Il07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRJZCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRJZCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50TnJjID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudE5yYyJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXR1c05hbWUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50U3RhdHVzIl1bInN0YXR1c05hbWUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudFR5cGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50VHlwZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdFZlcnNpb24gPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImZvcm1hdFZlcnNpb24iXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRpbnRlcm5hbFBhdGggPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImludGVybmFsUGF0aCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmZU51bWJlciA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlTnVtYmVyIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkY2ZlUmFuZ2UgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNmZVJhbmdlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkaGFzaCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaGFzaCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHNpZ25hdHVyZVRpbWVzdGFtcCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsic2lnbmF0dXJlVGltZXN0YW1wIl07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJPayI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiVG9kbyBvay4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y3JlYXRlRGF0ZSA9ICRjcmVhdGVEYXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRGb3JtYXQgPSAkZG9jdW1lbnRGb3JtYXQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudElkID0gJGRvY3VtZW50SWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5pbnRlcm5hbElkID0gJGludGVybmFsSWQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudE5yYyA9ICRkb2N1bWVudE5yYzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnN0YXR1c05hbWUgPSAkc3RhdHVzTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50VHlwZSA9ICRkb2N1bWVudFR5cGU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5mb3JtYXRWZXJzaW9uID0gJGZvcm1hdFZlcnNpb247DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5pbnRlcm5hbFBhdGggPSAkaW50ZXJuYWxQYXRoOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y2ZlTnVtYmVyID0gJGNmZU51bWJlcjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNmZVJhbmdlID0gJGNmZVJhbmdlOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+aGFzaCA9ICRoYXNoOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c2lnbmF0dXJlVGltZXN0YW1wID0gJHNpZ25hdHVyZVRpbWVzdGFtcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnNlbmRlZCA9ICRzZW5kOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigkZXJyb3JzPT0idHJ1ZSIgfHwgJGVycm9ycz09dHJ1ZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvckNvZGUiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JDb2RlID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JDb2RlIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvck1zZyIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvck1zZyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9yTXNnIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRlcnJvck1zZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nUmVzcHVlc3RhLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgDQogICAgICAgICAgICAgICAgICAgIGVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDEuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDIuIjsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gMy4iOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCgkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGVsc2UgaWYoJGFjdGlvbj09IkZFX1RpbHNvcl90ZXN0Iil7DQoJCQkNCgkJCS8vIFVSTHMgdGVzdGluZw0KCQkJLy8gZGVmaW5lKCJXU0RMIiwiaHR0cDovL3dscG9vbC5zdGcuYWljLmNhcnJhc2NvLmFlcm86OTA4MC9haWYvd3MvSW52b2ljZUhhbmRsaW5nU2VydmljZXM\/d3NkbCIpOw0KCQkJLy8gZGVmaW5lKCJXU0RMMiIsImh0dHA6Ly93bHBvb2wuc3RnLmFpYy5jYXJyYXNjby5hZXJvOjkwODAvYWlmL3dzL0ludm9pY2VIYW5kbGluZ1NlcnZpY2VzIik7DQoNCiAgICAgICAgICAgIC8vICRjb250ZXh0ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsNCiAgICAgICAgICAgICAgICAvLyAnc3NsJyA9PiBbDQogICAgICAgICAgICAgICAgICAgIC8vICd2ZXJpZnlfcGVlcicgPT4gZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIC8vICd2ZXJpZnlfcGVlcl9uYW1lJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ2FsbG93X3NlbGZfc2lnbmVkJyA9PiB0cnVlDQogICAgICAgICAgICAgICAgLy8gXQ0KICAgICAgICAgICAgLy8gXSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vICRzb2FwX29wdGlvbnMgPSBbDQogICAgICAgICAgICAgICAgLy8gJ3VyaScgPT4gJ2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvJywNCiAgICAgICAgICAgICAgICAvLyAnc3R5bGUnID0+IFNPQVBfUlBDLA0KICAgICAgICAgICAgICAgIC8vICd1c2UnID0+IFNPQVBfRU5DT0RFRCwNCiAgICAgICAgICAgICAgICAvLyAnc29hcF92ZXJzaW9uJyA9PiBTT0FQXzFfMSwNCiAgICAgICAgICAgICAgICAvLyAnY2FjaGVfd3NkbCcgPT4gV1NETF9DQUNIRV9OT05FLA0KICAgICAgICAgICAgICAgIC8vICdjb25uZWN0aW9uX3RpbWVvdXQnID0+IDE1LA0KICAgICAgICAgICAgICAgIC8vICd0cmFjZScgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAnZW5jb2RpbmcnID0+ICdVVEYtOCcsDQogICAgICAgICAgICAgICAgLy8gJ2V4Y2VwdGlvbnMnID0+IHRydWUsDQogICAgICAgICAgICAgICAgLy8gLy8gJ2xvZ2luJyA9PiAnaXBhcmtpbmdzJywNCiAgICAgICAgICAgICAgICAvLyAnbG9naW4nID0+ICdpbnRlcmZhY2UnLA0KICAgICAgICAgICAgICAgIC8vIC8vICdwYXNzd29yZCcgPT4gJ2MxMDdmYzE2ZmMnLA0KICAgICAgICAgICAgICAgIC8vICdwYXNzd29yZCcgPT4gJ2U5MzlhYjhkODI4ZTdlMGFlYTkwOTJjYmVmNDgwNTg5MDU1MmVhYmM0MGY2MjY3YzEzYWQzYjY5MzRmNGJhM2QnLA0KICAgICAgICAgICAgICAgIC8vICdzdHJlYW1fY29udGV4dCcgPT4gJGNvbnRleHQNCiAgICAgICAgICAgIC8vIF07DQoNCiAgICAgICAgICAgIC8vIGRlZmluZSgic29hcF9vcHRpb25zIiwkc29hcF9vcHRpb25zKTsNCgkJCQ0KCQkJJGVycm9yID0gZmFsc2U7DQogICAgICAgICAgICAkbXNqID0gIk5vIHJlY2libzoiOw0KDQogICAgICAgICAgICBpZihpc3NldCgkX1BPU1RbInRpcG9DRkUiXSkpew0KICAgICAgICAgICAgICAgICR0aXBvQ0ZFID0gKGludGVnZXIpJF9QT1NUWyJ0aXBvQ0ZFIl07DQogICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAkbXNqID0gJG1zai4iIHRpcG9DRkU7IjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKGlzc2V0KCRfUE9TVFsiTW50VG90YWwiXSkpew0KICAgICAgICAgICAgICAgICRNbnRUb3RhbCA9IChmbG9hdCkkX1BPU1RbIk1udFRvdGFsIl07DQogICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAkbXNqID0gJG1zai4iIE1udFRvdGFsOyI7DQogICAgICAgICAgICB9DQoJCQkvLyBpZihpc3NldCgkX1BPU1RbImZvcm1hUGFnbyJdKSl7DQogICAgICAgICAgICAgICAgLy8gJGZvcm1hUGFnbyA9ICRfUE9TVFsiZm9ybWFQYWdvIl07DQogICAgICAgICAgICAvLyB9IGVsc2V7DQogICAgICAgICAgICAgICAgLy8gJGVycm9yID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAvLyAkbXNqID0gJG1zai4iIGZvcm1hUGFnbzsiOw0KICAgICAgICAgICAgLy8gfQ0KCQkJLy8gaWYoaXNzZXQoJF9QT1NUWyJtZWRpb1BhZ28iXSkpew0KICAgICAgICAgICAgICAgIC8vICRtZWRpb1BhZ28gPSAkX1BPU1RbIm1lZGlvUGFnbyJdOw0KICAgICAgICAgICAgLy8gfSBlbHNlew0KICAgICAgICAgICAgICAgIC8vICRlcnJvciA9IHRydWU7DQogICAgICAgICAgICAgICAgLy8gJG1zaiA9ICRtc2ouIiBtZWRpb1BhZ287IjsNCiAgICAgICAgICAgIC8vIH0NCgkJCWlmKGlzc2V0KCRfUE9TVFsiaWRTdGF5Il0pKXsNCiAgICAgICAgICAgICAgICAkaWRTdGF5ID0gJF9QT1NUWyJpZFN0YXkiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgaWRTdGF5OyI7DQogICAgICAgICAgICB9DQoJCQlpZihpc3NldCgkX1BPU1RbImJhcmNvZGUiXSkpew0KICAgICAgICAgICAgICAgICRiYXJjb2RlID0gJF9QT1NUWyJiYXJjb2RlIl07DQogICAgICAgICAgICB9DQoJCQllbHNlew0KCQkJCSRiYXJjb2RlID0gIiI7DQoJCQl9DQoJCQlpZihpc3NldCgkX1BPU1RbImhvcmFzRXN0YWRpYSJdKSl7DQogICAgICAgICAgICAgICAgJGhvcmFzRXN0YWRpYSA9ICRfUE9TVFsiaG9yYXNFc3RhZGlhIl07DQogICAgICAgICAgICB9DQoJCQllbHNlew0KCQkJCSRob3Jhc0VzdGFkaWEgPSAiIjsNCgkJCX0NCgkJCQ0KCQkJaWYoJHRpcG9DRkU9PTExMSB8fCAkdGlwb0NGRT09MTEyKXsNCgkJCQlpZihpc3NldCgkX1BPU1RbInJ1dCJdKSl7DQoJCQkJCSRydXQgPSAkX1BPU1RbInJ1dCJdOw0KCQkJCX0gZWxzZXsNCgkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJJG1zaiA9ICRtc2ouIiBydXQ7IjsNCgkJCQl9DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJzb2NpYWwiXSkpew0KCQkJCQkkc29jaWFsID0gJF9QT1NUWyJzb2NpYWwiXTsNCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgc29jaWFsOyI7DQoJCQkJfQ0KCQkJCWlmKGlzc2V0KCRfUE9TVFsiZGlyIl0pKXsNCgkJCQkJJGRpciA9ICRfUE9TVFsiZGlyIl07DQoJCQkJfSBlbHNlew0KCQkJCQkkZXJyb3IgPSB0cnVlOw0KCQkJCQkkbXNqID0gJG1zai4iIGRpcjsiOw0KCQkJCX0NCgkJCQlpZihpc3NldCgkX1BPU1RbImNpdWRhZCJdKSl7DQoJCQkJCSRjaXVkYWQgPSAkX1BPU1RbImNpdWRhZCJdOw0KCQkJCX0gZWxzZXsNCgkJCQkJJGVycm9yID0gdHJ1ZTsNCgkJCQkJJG1zaiA9ICRtc2ouIiBjaXVkYWQ7IjsNCgkJCQl9DQoJCQkJDQoJCQl9DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMDIgfHwgJHRpcG9DRkU9PTExMil7DQoJCQkJaWYoaXNzZXQoJF9QT1NUWyJyZWZlcmVuY2UiXSkpew0KCQkJCQkkcmVmZXJlbmNlID0gJF9QT1NUWyJyZWZlcmVuY2UiXTsNCgkJCQl9IGVsc2V7DQoJCQkJCSRlcnJvciA9IHRydWU7DQoJCQkJCSRtc2ogPSAkbXNqLiIgcmVmZXJlbmNlOyI7DQoJCQkJfQ0KCQkJfQ0KDQogICAgICAgICAgICBpZigkZXJyb3I9PXRydWUpew0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gJG1zajsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJGZlY2hhID0gbmV3IERhdGVUaW1lKCk7DQogICAgICAgICAgICAkYW5vID0gJGZlY2hhLT5mb3JtYXQoIlkiKTsNCiAgICAgICAgICAgICRtZXMgPSAkZmVjaGEtPmZvcm1hdCgibSIpOw0KICAgICAgICAgICAgJGRpYSA9ICRmZWNoYS0+Zm9ybWF0KCJkIik7DQogICAgICAgICAgICAkZmVjaGFhID0gJGFuby4iLSIuJG1lcy4iLSIuJGRpYTsNCg0KICAgICAgICAgICAgJHNpbklWQSA9ICRNbnRUb3RhbC8xLjIyOw0KICAgICAgICAgICAgJE1udE5ldG9JVkFUYXNhQmFzaWNhID0gbnVtYmVyX2Zvcm1hdCgoZmxvYXQpJHNpbklWQSwgMiwgJy4nLCAnJyk7DQogICAgICAgICAgICAkSVZBID0gJE1udFRvdGFsLSRzaW5JVkE7DQogICAgICAgICAgICAkTW50SVZBVGFzYUJhc2ljYSA9IG51bWJlcl9mb3JtYXQoKGZsb2F0KSRJVkEsIDIsICcuJywgJycpOw0KCQkJDQoJCQkvLyBPUklHSU5BTCAxOC0wNi0yMDI1DQoJCQkJJGludGVybmFsSWQgPSAiQ0FJLUlQLSRpZFN0YXkiOw0KCQkJCQ0KCQkJCSRlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxMjk5MTgxMDAxMTwvUlVDRW1pc29yPjxSem5Tb2M+Q29uc29yY2lvIEFlcm9wdWVydG9zIEludGVybmFjaW9uYWxlc1MuQS48L1J6blNvYz48Tm9tQ29tZXJjaWFsPjwvTm9tQ29tZXJjaWFsPjxHaXJvRW1pcz48L0dpcm9FbWlzPjxUZWxlZm9ubz48L1RlbGVmb25vPjxDb3JyZW9FbWlzb3I+PC9Db3JyZW9FbWlzb3I+PEVtaVN1Y3Vyc2FsPlBEUCBDb3Jwb3JhdGUgKEZjLkFFPC9FbWlTdWN1cnNhbD48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5SdXRhIDkzIEttLiAxMTMgTGFndW5hIGRlbCBTYXVjZSBNYWxkb25hZG88L0RvbUZpc2NhbD48Q2l1ZGFkPlB1bnRhIGRlbCBFc3RlPC9DaXVkYWQ+PERlcGFydGFtZW50bz5QdW50YSBkZWwgRXN0ZTwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkJLy8gLy8vLyRPTERlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxNDkwMjM0MDAxMDwvUlVDRW1pc29yPjxSem5Tb2M+VENVIFMuQS48L1J6blNvYz48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5Dbm8uIENhcnJhc2NvIDAgeSBBLiBkZSBsYXMgQW1lcmljYXM8L0RvbUZpc2NhbD48Q2l1ZGFkPkFlcm9wdWVydG8gZGUgQ2FycmFzY288L0NpdWRhZD48RGVwYXJ0YW1lbnRvPkNhbmVsb25lczwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkJDQoJCQkJaWYoJHRpcG9DRkU9PTEwMSB8fCAkdGlwb0NGRT09MTAyKXsNCgkJCQkJJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlVGNrPjxFbmNhYmV6YWRvPjxJZERvYz48VGlwb0NGRT4nLiR0aXBvQ0ZFLic8L1RpcG9DRkU+PEZjaEVtaXM+Jy4kZmVjaGFhLic8L0ZjaEVtaXM+PEZtYVBhZ28+MTwvRm1hUGFnbz48L0lkRG9jPicuJGVtaXNvci4nPFRvdGFsZXM+PFRwb01vbmVkYT5VWVU8L1Rwb01vbmVkYT48TW50Tm9HcnY+MC4wMDwvTW50Tm9HcnY+PE1udEV4cG95QXNpbT4wLjAwPC9NbnRFeHBveUFzaW0+PE1udEltcHVlc3RvUGVyYz4wLjAwPC9NbnRJbXB1ZXN0b1BlcmM+PE1udElWYWVuU3VzcD4wLjAwPC9NbnRJVmFlblN1c3A+PE1udE5ldG9JdmFUYXNhTWluPjAuMDA8L01udE5ldG9JdmFUYXNhTWluPjxNbnROZXRvSVZBVGFzYUJhc2ljYT4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9NbnROZXRvSVZBVGFzYUJhc2ljYT48TW50TmV0b0lWQU90cmE+MC4wMDwvTW50TmV0b0lWQU90cmE+PElWQVRhc2FNaW4+MTAuMDA8L0lWQVRhc2FNaW4+PElWQVRhc2FCYXNpY2E+MjIuMDA8L0lWQVRhc2FCYXNpY2E+PE1udElWQVRhc2FNaW4+MC4wMDwvTW50SVZBVGFzYU1pbj48TW50SVZBVGFzYUJhc2ljYT4nLiRNbnRJVkFUYXNhQmFzaWNhLic8L01udElWQVRhc2FCYXNpY2E+PE1udElWQU90cmE+MC4wMDwvTW50SVZBT3RyYT48TW50VG90YWw+Jy4kTW50VG90YWwuJzwvTW50VG90YWw+PE1udFRvdFJldGVuaWRvPjAuMDA8L01udFRvdFJldGVuaWRvPjxDYW50TGluRGV0PjE8L0NhbnRMaW5EZXQ+PE1vbnRvTkY+MC4wMDwvTW9udG9ORj48TW50UGFnYXI+Jy4kTW50VG90YWwuJzwvTW50UGFnYXI+PC9Ub3RhbGVzPjwvRW5jYWJlemFkbz48RGV0YWxsZT48SXRlbT48TnJvTGluRGV0PjE8L05yb0xpbkRldD48SW5kRmFjdD4zPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPjwvZVRjaz48L0NGRT4nOw0KCQkJCX0NCgkJCQllbHNlew0KCQkJCQkkZGF0YSA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI\/PjxDRkUgeG1sbnM9Imh0dHA6Ly9jZmUuZGdpLmd1Yi51eSI+PGVGYWN0PjxFbmNhYmV6YWRvPjxJZERvYz48VGlwb0NGRT4nLiR0aXBvQ0ZFLic8L1RpcG9DRkU+PEZjaEVtaXM+Jy4kZmVjaGFhLic8L0ZjaEVtaXM+PEZtYVBhZ28+MTwvRm1hUGFnbz48L0lkRG9jPicuJGVtaXNvci4nPFJlY2VwdG9yPjxUaXBvRG9jUmVjZXA+MjwvVGlwb0RvY1JlY2VwPjxDb2RQYWlzUmVjZXA+VVk8L0NvZFBhaXNSZWNlcD48RG9jUmVjZXA+Jy4kcnV0Lic8L0RvY1JlY2VwPjxSem5Tb2NSZWNlcD4nLiRzb2NpYWwuJzwvUnpuU29jUmVjZXA+PERpclJlY2VwPicuJGRpci4nPC9EaXJSZWNlcD48Q2l1ZGFkUmVjZXA+Jy4kY2l1ZGFkLic8L0NpdWRhZFJlY2VwPjwvUmVjZXB0b3I+PFRvdGFsZXM+PFRwb01vbmVkYT5VWVU8L1Rwb01vbmVkYT48TW50Tm9HcnY+MC4wMDwvTW50Tm9HcnY+PE1udEV4cG95QXNpbT4wLjAwPC9NbnRFeHBveUFzaW0+PE1udEltcHVlc3RvUGVyYz4wLjAwPC9NbnRJbXB1ZXN0b1BlcmM+PE1udElWYWVuU3VzcD4wLjAwPC9NbnRJVmFlblN1c3A+PE1udE5ldG9JdmFUYXNhTWluPjAuMDA8L01udE5ldG9JdmFUYXNhTWluPjxNbnROZXRvSVZBVGFzYUJhc2ljYT4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9NbnROZXRvSVZBVGFzYUJhc2ljYT48TW50TmV0b0lWQU90cmE+MC4wMDwvTW50TmV0b0lWQU90cmE+PElWQVRhc2FNaW4+MTAuMDA8L0lWQVRhc2FNaW4+PElWQVRhc2FCYXNpY2E+MjIuMDA8L0lWQVRhc2FCYXNpY2E+PE1udElWQVRhc2FNaW4+MC4wMDwvTW50SVZBVGFzYU1pbj48TW50SVZBVGFzYUJhc2ljYT4nLiRNbnRJVkFUYXNhQmFzaWNhLic8L01udElWQVRhc2FCYXNpY2E+PE1udElWQU90cmE+MC4wMDwvTW50SVZBT3RyYT48TW50VG90YWw+Jy4kTW50VG90YWwuJzwvTW50VG90YWw+PE1udFRvdFJldGVuaWRvPjAuMDA8L01udFRvdFJldGVuaWRvPjxDYW50TGluRGV0PjE8L0NhbnRMaW5EZXQ+PE1vbnRvTkY+MC4wMDwvTW9udG9ORj48TW50UGFnYXI+Jy4kTW50VG90YWwuJzwvTW50UGFnYXI+PC9Ub3RhbGVzPjwvRW5jYWJlemFkbz48RGV0YWxsZT48SXRlbT48TnJvTGluRGV0PjE8L05yb0xpbkRldD48SW5kRmFjdD4zPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPjwvZUZhY3Q+PC9DRkU+JzsNCgkJCQl9DQoJCQkvLyBPUklHSU5BTCAxOC0wNi0yMDI1DQoJCQkNCgkJCSRpbnRlcm5hbElkID0gIkNBSS1JUC0kaWRTdGF5IjsNCgkJCQ0KCQkJJGVtaXNvciA9ICc8RW1pc29yPjxSVUNFbWlzb3I+MjEyOTkxODEwMDExPC9SVUNFbWlzb3I+PFJ6blNvYz5Db25zb3JjaW8gQWVyb3B1ZXJ0b3MgSW50ZXJuYWNpb25hbGVzUy5BLjwvUnpuU29jPjxOb21Db21lcmNpYWw+PC9Ob21Db21lcmNpYWw+PEdpcm9FbWlzPjwvR2lyb0VtaXM+PFRlbGVmb25vPjwvVGVsZWZvbm8+PENvcnJlb0VtaXNvcj48L0NvcnJlb0VtaXNvcj48RW1pU3VjdXJzYWw+UERQIENvcnBvcmF0ZSAoRmMuQUU8L0VtaVN1Y3Vyc2FsPjxDZGdER0lTdWN1cj4xPC9DZGdER0lTdWN1cj48RG9tRmlzY2FsPlJ1dGEgOTMgS20uIDExMyBMYWd1bmEgZGVsIFNhdWNlIE1hbGRvbmFkbzwvRG9tRmlzY2FsPjxDaXVkYWQ+UHVudGEgZGVsIEVzdGU8L0NpdWRhZD48RGVwYXJ0YW1lbnRvPlB1bnRhIGRlbCBFc3RlPC9EZXBhcnRhbWVudG8+PC9FbWlzb3I+JzsNCgkJCS8vICRPTERlbWlzb3IgPSAnPEVtaXNvcj48UlVDRW1pc29yPjIxNDkwMjM0MDAxMDwvUlVDRW1pc29yPjxSem5Tb2M+VENVIFMuQS48L1J6blNvYz48Q2RnREdJU3VjdXI+MTwvQ2RnREdJU3VjdXI+PERvbUZpc2NhbD5Dbm8uIENhcnJhc2NvIDAgeSBBLiBkZSBsYXMgQW1lcmljYXM8L0RvbUZpc2NhbD48Q2l1ZGFkPkFlcm9wdWVydG8gZGUgQ2FycmFzY288L0NpdWRhZD48RGVwYXJ0YW1lbnRvPkNhbmVsb25lczwvRGVwYXJ0YW1lbnRvPjwvRW1pc29yPic7DQoJCQkNCgkJCWlmKCR0aXBvQ0ZFPT0xMDEgfHwgJHRpcG9DRkU9PTEwMil7DQoJCQkJJHJlZmVyZW5jaWEgPSAiIjsNCgkJCQlpZigkdGlwb0NGRT09MTAyKXsNCgkJCQkJJHJlZmVyZW5jaWEgPSAnPFJlZmVyZW5jaWE+PFJlZmVyZW5jaWE+PE5yb0xpblJlZj4xPC9Ocm9MaW5SZWY+PEluZEdsb2JhbD4xPC9JbmRHbG9iYWw+PFRwb0RvY1JlZj4xMDE8L1Rwb0RvY1JlZj48U2VyaWU+QTwvU2VyaWU+PE5yb0NGRVJlZj4nLiRyZWZlcmVuY2UuJzwvTnJvQ0ZFUmVmPjxSYXpvblJlZj4nLiRyZWZlcmVuY2UuJzwvUmF6b25SZWY+PEZlY2hhQ0ZFcmVmPicuJGZlY2hhYS4nPC9GZWNoYUNGRXJlZj48L1JlZmVyZW5jaWE+PC9SZWZlcmVuY2lhPic7DQoJCQkJfQ0KCQkJCSRkYXRhID0gJzw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PENGRSB4bWxucz0iaHR0cDovL2NmZS5kZ2kuZ3ViLnV5Ij48ZVRjaz48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZVRjaz48L0NGRT4nOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkcmVmZXJlbmNpYSA9ICIiOw0KCQkJCWlmKCR0aXBvQ0ZFPT0xMTIpew0KCQkJCQkkcmVmZXJlbmNpYSA9ICc8UmVmZXJlbmNpYT48UmVmZXJlbmNpYT48TnJvTGluUmVmPjE8L05yb0xpblJlZj48SW5kR2xvYmFsPjE8L0luZEdsb2JhbD48VHBvRG9jUmVmPjExMTwvVHBvRG9jUmVmPjxTZXJpZT5BPC9TZXJpZT48TnJvQ0ZFUmVmPicuJHJlZmVyZW5jZS4nPC9Ocm9DRkVSZWY+PFJhem9uUmVmPicuJHJlZmVyZW5jZS4nPC9SYXpvblJlZj48RmVjaGFDRkVyZWY+Jy4kZmVjaGFhLic8L0ZlY2hhQ0ZFcmVmPjwvUmVmZXJlbmNpYT48L1JlZmVyZW5jaWE+JzsNCgkJCQl9DQoJCQkJJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlRmFjdD48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz4nLiRlbWlzb3IuJzxSZWNlcHRvcj48VGlwb0RvY1JlY2VwPjI8L1RpcG9Eb2NSZWNlcD48Q29kUGFpc1JlY2VwPlVZPC9Db2RQYWlzUmVjZXA+PERvY1JlY2VwPicuJHJ1dC4nPC9Eb2NSZWNlcD48UnpuU29jUmVjZXA+Jy4kc29jaWFsLic8L1J6blNvY1JlY2VwPjxEaXJSZWNlcD4nLiRkaXIuJzwvRGlyUmVjZXA+PENpdWRhZFJlY2VwPicuJGNpdWRhZC4nPC9DaXVkYWRSZWNlcD48L1JlY2VwdG9yPjxUb3RhbGVzPjxUcG9Nb25lZGE+VVlVPC9UcG9Nb25lZGE+PE1udE5vR3J2PjAuMDA8L01udE5vR3J2PjxNbnRFeHBveUFzaW0+Jy4kTW50VG90YWwuJzwvTW50RXhwb3lBc2ltPjxNbnRJbXB1ZXN0b1BlcmM+MC4wMDwvTW50SW1wdWVzdG9QZXJjPjxNbnRJVmFlblN1c3A+MC4wMDwvTW50SVZhZW5TdXNwPjxNbnROZXRvSXZhVGFzYU1pbj4wLjAwPC9NbnROZXRvSXZhVGFzYU1pbj48TW50TmV0b0lWQVRhc2FCYXNpY2E+MC4wMDwvTW50TmV0b0lWQVRhc2FCYXNpY2E+PE1udE5ldG9JVkFPdHJhPjAuMDA8L01udE5ldG9JVkFPdHJhPjxJVkFUYXNhTWluPjEwLjAwPC9JVkFUYXNhTWluPjxJVkFUYXNhQmFzaWNhPjIyLjAwPC9JVkFUYXNhQmFzaWNhPjxNbnRJVkFUYXNhTWluPjAuMDA8L01udElWQVRhc2FNaW4+PE1udElWQVRhc2FCYXNpY2E+MC4wMDwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjEwPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+Jy4kYmFyY29kZS4nIEVzdGFkaWE6ICcuJGhvcmFzRXN0YWRpYS4nIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50VG90YWwuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udFRvdGFsLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPicuJHJlZmVyZW5jaWEuJzwvZUZhY3Q+PC9DRkU+JzsNCgkJCX0NCg0KICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICRkYXRhNjQgPSBiYXNlNjRfZW5jb2RlKCRkYXRhKTsNCgkJCQ0KCQkJJGFkZW5kYSA9IA0KCQkJJzwhW0NEQVRBWzx0Y2E6ZGF0b3NBZGVuZGEgeG1sbnM6dGNhPSJodHRwOi8vdGlsc29yLmNvbS51eS8jUERTQWRlbmRhIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly90aWxzb3IuY29tLnV5LyNQRFNBZGVuZGEgUERTQWRlbmRhLnhzZCI+DQoJCQkJPHRjYTpsZXllbmRhcz4NCgkJCQkJPHRjYTpjb25zdGFuY2lhSVZBPkkuVi5BLiBBTCBEw41BPC90Y2E6Y29uc3RhbmNpYUlWQT4NCgkJCQkJPHRjYTpyZXNvbHVjaW9uPlJlcy4gMjUyLzIwMTU8L3RjYTpyZXNvbHVjaW9uPg0KCQkJCQk8dGNhOnZlcmlmaWNhckNvbXByb2JhbnRlPlB1ZWRlIHZlcmlmaWNhciBjb21wcm9iYW50ZSBlbiBodHRwOi8vd3d3LmRnaS5ndWIudXkvPC90Y2E6dmVyaWZpY2FyQ29tcHJvYmFudGU+DQoJCQkJPC90Y2E6bGV5ZW5kYXM+DQoJCQk8L3RjYTpkYXRvc0FkZW5kYT5dXT4nOw0KCQkJDQoJCQkkT0xEYWRlbmRhID0gDQoJCQknPCFbQ0RBVEFbPHRjYTpkYXRvc0FkZW5kYSB4bWxuczp0Y2E9Imh0dHA6Ly90aWxzb3IuY29tLnV5LyNQRFNBZGVuZGEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3RpbHNvci5jb20udXkvI1BEU0FkZW5kYSBQRFNBZGVuZGEueHNkIj4NCgkJCQk8dGNhOmxleWVuZGFzPg0KCQkJCQk8dGNhOmNvbnN0YW5jaWFJVkE+SS5WLkEuIEFMIETDjUE8L3RjYTpjb25zdGFuY2lhSVZBPg0KCQkJCQk8dGNhOnJlc29sdWNpb24+UmVzLiAyNTIvMjAxNTwvdGNhOnJlc29sdWNpb24+DQoJCQkJCTx0Y2E6dmVyaWZpY2FyQ29tcHJvYmFudGU+UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHA6Ly93d3cuZGdpLmd1Yi51eS88L3RjYTp2ZXJpZmljYXJDb21wcm9iYW50ZT4NCgkJCQk8L3RjYTpsZXllbmRhcz4NCgkJCQk8dGNhOmRhdG9zRXh0cmFUQ1U+Jy4NCgkJCQkJLy8gPHRjYTpmb3JtYVBhZ28+RMOJQklUTyBCQU5DQVJJTzwvdGNhOmZvcm1hUGFnbz4NCgkJCQkJLy8gPHRjYTptZWRpb1BhZ28+U0NPVElBQkFOSzwvdGNhOm1lZGlvUGFnbz4NCgkJCQkJJzx0Y2E6Zm9ybWFQYWdvPicuJGZvcm1hUGFnby4nPC90Y2E6Zm9ybWFQYWdvPg0KCQkJCQk8dGNhOm1lZGlvUGFnbz4nLiRtZWRpb1BhZ28uJzwvdGNhOm1lZGlvUGFnbz4NCgkJCQkJPHRjYTp1c3VhcmlvPjExMjkwPC90Y2E6dXN1YXJpbz4nLg0KCQkJCQkvLyA8dGNhOmRvY3VtZW50b1RDVT5QRFMtU0YtMTAyNDY4NzwvdGNhOmRvY3VtZW50b1RDVT4NCgkJCQkJJzx0Y2E6ZG9jdW1lbnRvVENVPicuJGludGVybmFsSWQuJzwvdGNhOmRvY3VtZW50b1RDVT4NCgkJCQkJPHRjYTpsZXllbmRhQ29tbWVyY2lhbD5MQUNDIC0gQ2l1ZGFkIExvZ8Otc3RpY2EgSW50ZXJuYWNpb25hbDwvdGNhOmxleWVuZGFDb21tZXJjaWFsPg0KCQkJCTwvdGNhOmRhdG9zRXh0cmFUQ1U+DQoJCQk8L3RjYTpkYXRvc0FkZW5kYT5dXT4nOw0KCQkJDQoJCQlpZihpc3NldCgkX1BPU1RbInBvcyJdKSl7DQogICAgICAgICAgICAgICAgJHBvcyA9ICRfUE9TVFsicG9zIl07DQogICAgICAgICAgICB9DQoJCQllbHNlew0KCQkJCSRwb3MgPSAiIjsNCgkJCX0NCgkJCQ0KCQkJaWYoJHBvcyE9IiIpew0KCQkJCSRwcmludCA9ICJGT1JDRV9QUklOVCI7DQoJCQkJJHByaW50ZXIgPSAkcG9zOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQkkcHJpbnQgPSAiRE9OVF9QUklOVCI7DQoJCQkJJHByaW50ZXIgPSAiVExBU0kwMDUiOw0KCQkJfQ0KDQogICAgICAgICAgICAkc2VuZCA9IA0KICAgICAgICAgICAgJw0KICAgICAgICAgICAgPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KICAgICAgICAgICAgICAgIDxzb2FwOkJvZHk+DQogICAgICAgICAgICAgICAgICAgIDxpbnZvaWNlUmVjZXB0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50IHhtbG5zPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYXRhPicuJGRhdGE2NC4nPC9kYXRhPicuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPG5hbWU+U0VNTTwvbmFtZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2RvY3VtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4NCgkJCQkJCQkJCTxrZXk+YWRlbmRhPC9rZXk+DQoJCQkJCQkJCQk8dmFsdWU+Jy4kYWRlbmRhLic8L3ZhbHVlPg0KCQkJCQkJCQk8L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5mYWN0b3J5Q2xhc3M8L2tleT48dmFsdWU+dXkuY29tLnRpbHNvci5haWYuc2VtbVNjaGVtYXMuYWRlbmRhLkFkZW5kYUZhY3Rvcnk8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFUeXBlPnV5LmNvbS50aWxzb3IuYWlmLnBsdWdpbnMuY2ZlLm1ldGFkYXRhLkFkZW5kYU1ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCgkJCQkJCTxtZXRhZGF0YUxpc3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+DQoJCQkJCQkJCQk8a2V5Pm9yaWdpbjwva2V5Pg0KCQkJCQkJCQkJPHZhbHVlPklQYXJraW5nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCgkJCQkJCQkJPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5ub21icmVJbXByZXNvcmE8L2tleT4NCgkJCQkJCQkJCTx2YWx1ZT4nLiRwcmludGVyLic8L3ZhbHVlPg0KCQkJCQkJCQk8L2VudHJ5Pg0KCQkJCQkJCQk8ZW50cnk+DQoJCQkJCQkJCQk8a2V5PmluZEltcHJlc2lvbjwva2V5PicuDQoJCQkJCQkJCQkvLyA8dmFsdWU+Rk9SQ0VfUFJJTlQ8L3ZhbHVlPg0KCQkJCQkJCQkJJzx2YWx1ZT4nLiRwcmludC4nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCgkJCQkJCQkJPGVudHJ5Pg0KCQkJCQkJCQkJPGtleT5pbnRlcm5hbElkPC9rZXk+DQoJCQkJCQkJCQk8dmFsdWU+Jy4kaW50ZXJuYWxJZC4nPC92YWx1ZT4NCgkJCQkJCQkJPC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YVR5cGU+dXkuY29tLnRpbHNvci5haWYucGx1Z2lucy5wZHMubWV0YWRhdGEuUERTTWV0YWRhdGE8L21ldGFkYXRhVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXIgeG1sbnM9IiI+RVBfRU1JU09SX0NGRV9FTlRSQURBPC9oYW5kbGVyPg0KICAgICAgICAgICAgICAgICAgICA8L2ludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+DQogICAgICAgICAgICAnOw0KCQkJDQoJCQlzYXZlVFhUKCRsb2dQZXRpY2lvbiwgJHNlbmQsICR1cmxMb2csICRhY3Rpb24pOw0KDQogICAgICAgICAgICAkaGVhZGVycyA9IGFycmF5KA0KICAgICAgICAgICAgICAgIC8vICJQT1NUIC9wYWNrYWdlL3BhY2thZ2VfMS4zL3BhY2thZ2VzZXJ2aWNlcy5hc214IEhUVFAvMS4xIiwNCiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkc2VuZCkNCiAgICAgICAgICAgICk7IA0KCQkJDQoJCQkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHVybCA9ICJodHRwOi8vd2xwb29sLnN0Zy5haWMuY2FycmFzY28uYWVybzo5MDgwL2FpZi93cy9JbnZvaWNlSGFuZGxpbmdTZXJ2aWNlcyI7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHNlbmQpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZU9yaWcgPSBjdXJsX2V4ZWMoJGNoKTsgDQogICAgICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7DQoNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+JywnJywkcmVzcG9uc2VPcmlnKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCduczI6JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzwvc29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6RW52ZWxvcGU+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgLy8gJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyInLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZpY2VzLmNmZWhhbmRsZXJ3cy50aWxzb3IuY29tLnV5LyInLCcnLCRyZXNwb25zZSk7DQoNCiAgICAgICAgICAgICR4bWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHJlc3BvbnNlLCAiU2ltcGxlWE1MRWxlbWVudCIsIExJQlhNTF9OT0NEQVRBKTsNCiAgICAgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHhtbCk7DQogICAgICAgICAgICAkYXJyYXkgPSBqc29uX2RlY29kZSgkanNvbixUUlVFKTsNCg0KICAgICAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygicmV0dXJuIiwkYXJyYXkpKXsNCiAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvcnMiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgJGVycm9ycyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9ycyJdOw0KICAgIA0KICAgICAgICAgICAgICAgICAgICBpZigkZXJyb3JzPT0iZmFsc2UiIHx8ICRlcnJvcnMgPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZURhdGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNyZWF0ZURhdGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudEZvcm1hdCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRGb3JtYXQiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudElkID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudElkIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnROcmMgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50TnJjIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc3RhdHVzTmFtZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRTdGF0dXMiXVsic3RhdHVzTmFtZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50VHlwZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRUeXBlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0VmVyc2lvbiA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZm9ybWF0VmVyc2lvbiJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGludGVybmFsUGF0aCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaW50ZXJuYWxQYXRoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkY2ZlTnVtYmVyID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVOdW1iZXIiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZmVSYW5nZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlUmFuZ2UiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoYXNoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJoYXNoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmF0dXJlVGltZXN0YW1wID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJzaWduYXR1cmVUaW1lc3RhbXAiXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIk9rIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJUb2RvIG9rLiI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jcmVhdGVEYXRlID0gJGNyZWF0ZURhdGU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudEZvcm1hdCA9ICRkb2N1bWVudEZvcm1hdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50SWQgPSAkZG9jdW1lbnRJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsSWQgPSAkaW50ZXJuYWxJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50TnJjID0gJGRvY3VtZW50TnJjOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c3RhdHVzTmFtZSA9ICRzdGF0dXNOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRUeXBlID0gJGRvY3VtZW50VHlwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmZvcm1hdFZlcnNpb24gPSAkZm9ybWF0VmVyc2lvbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsUGF0aCA9ICRpbnRlcm5hbFBhdGg7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jZmVOdW1iZXIgPSAkY2ZlTnVtYmVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y2ZlUmFuZ2UgPSAkY2ZlUmFuZ2U7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5oYXNoID0gJGhhc2g7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5zaWduYXR1cmVUaW1lc3RhbXAgPSAkc2lnbmF0dXJlVGltZXN0YW1wOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c2VuZGVkID0gJHNlbmQ7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJCXNhdmVUWFQoJGxvZ1Jlc3B1ZXN0YSwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCRlcnJvcnM9PSJ0cnVlIiB8fCAkZXJyb3JzPT10cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yQ29kZSIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvckNvZGUgPSAkYXJyYXlbInJldHVybiJdWyJlcnJvckNvZGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yTXNnIiwkYXJyYXlbInJldHVybiJdKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yTXNnID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JNc2ciXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNDAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gJGVycm9yTXNnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICAgICAgZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gMS4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dFcnJvciwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNTAwOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gMi4iOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIkFsZ28gYW5kdXZvIG1hbCwgY2hlcXVlYXIgaW5mbyAzLiI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB9DQoJCQ0KCQllbHNlIGlmKCRhY3Rpb249PSJ0ZXN0WE1MIil7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZSA9ICc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Qm9keT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5zMjppbnZvaWNlUmVjZXB0aW9uUmVzcG9uc2UgeG1sbnM6bnMyPSJodHRwOi8vc2VydmljZXMuY2ZlaGFuZGxlcndzLnRpbHNvci5jb20udXkvIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXR1cm4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVycm9ycz5mYWxzZTwvZXJyb3JzPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjZmVJbmZvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y3JlYXRlRGF0ZT4yMDI0LTA5LTI0VDE3OjI0OjUzLjkzNi0wMzowMDwvY3JlYXRlRGF0ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50Rm9ybWF0PkNGRSBER0k8L2RvY3VtZW50Rm9ybWF0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnRJZD4zMzczNTY5PC9kb2N1bWVudElkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnROcmM+MDAwMDAwMDAwMDAwNjU0MzkwN3docndneXh3eWJweXNtc254cnNlbmdueWZrcHlya2V2YXYuYmprdnY8L2RvY3VtZW50TnJjPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnRTdGF0dXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdGF0dXNOYW1lPkNGRV9TVE9SRUQ8L3N0YXR1c05hbWU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZG9jdW1lbnRTdGF0dXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkb2N1bWVudFR5cGU+SU5WT0lDRV9JU1NVRUQ8L2RvY3VtZW50VHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm1hdFZlcnNpb24+MS4wPC9mb3JtYXRWZXJzaW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW50ZXJuYWxQYXRoPkZhY3R1cmFzIEVtaXRpZGFzPC9pbnRlcm5hbFBhdGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjZmVOdW1iZXI+MjgxPC9jZmVOdW1iZXI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjZmVSYW5nZT5CPC9jZmVSYW5nZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhhc2g+STRYZVZGQVhvRjlOTUkrSEJPU05OcW91eHRzPTwvaGFzaD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZVRpbWVzdGFtcD4yMDI0LTA5LTI0VDE3OjI0OjUzLjY1Ny0wMzowMDwvc2lnbmF0dXJlVGltZXN0YW1wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2ZlSW5mbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmV0dXJuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25zMjppbnZvaWNlUmVjZXB0aW9uUmVzcG9uc2U+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+JzsNCg0KICAgICAgICAgICAgJHJlc3BvbnNlMiA9ICc8cmV0dXJuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlcnJvcnM+ZmFsc2U8L2Vycm9ycz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2ZlSW5mbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNyZWF0ZURhdGU+MjAyNC0wOS0yNFQxNzoyNDo1My45MzYtMDM6MDA8L2NyZWF0ZURhdGU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkb2N1bWVudEZvcm1hdD5DRkUgREdJPC9kb2N1bWVudEZvcm1hdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50SWQ+MzM3MzU2OTwvZG9jdW1lbnRJZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50TnJjPjAwMDAwMDAwMDAwMDY1NDM5MDd3aHJ3Z3l4d3licHlzbXNueHJzZW5nbnlma3B5cmtldmF2LmJqa3Z2PC9kb2N1bWVudE5yYz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50U3RhdHVzPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0YXR1c05hbWU+Q0ZFX1NUT1JFRDwvc3RhdHVzTmFtZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kb2N1bWVudFN0YXR1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50VHlwZT5JTlZPSUNFX0lTU1VFRDwvZG9jdW1lbnRUeXBlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0VmVyc2lvbj4xLjA8L2Zvcm1hdFZlcnNpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnRlcm5hbFBhdGg+RmFjdHVyYXMgRW1pdGlkYXM8L2ludGVybmFsUGF0aD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNmZU51bWJlcj4yODE8L2NmZU51bWJlcj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNmZVJhbmdlPkI8L2NmZVJhbmdlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aGFzaD5JNFhlVkZBWG9GOU5NSStIQk9TTk5xb3V4dHM9PC9oYXNoPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlVGltZXN0YW1wPjIwMjQtMDktMjRUMTc6MjQ6NTMuNjU3LTAzOjAwPC9zaWduYXR1cmVUaW1lc3RhbXA+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jZmVJbmZvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXR1cm4+JzsNCg0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPHNvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnbnMyOicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6Qm9keT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPC9zb2FwOkVudmVsb3BlPicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgIC8vICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCcgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iJywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpuczI9Imh0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8iJywnJywkcmVzcG9uc2UpOw0KDQogICAgICAgICAgICAvLyBlY2hvIHByaW50X3IoJHJlc3BvbnNlKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCg0KICAgICAgICAgICAgLy8gJGVudmVsb3BlID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkanNvbiA9IGpzb25fZW5jb2RlKCR4bWwpOw0KICAgICAgICAgICAgLy8gJGFycmF5ID0ganNvbl9kZWNvZGUoJGpzb24sVFJVRSk7DQogICAgICAgICAgICAkeG1sID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSwgIlNpbXBsZVhNTEVsZW1lbnQiLCBMSUJYTUxfTk9DREFUQSk7DQogICAgICAgICAgICAkanNvbiA9IGpzb25fZW5jb2RlKCR4bWwpOw0KICAgICAgICAgICAgJGFycmF5ID0ganNvbl9kZWNvZGUoJGpzb24sVFJVRSk7DQoNCiAgICAgICAgICAgIC8vICRzb2FwID0gc2ltcGxleG1sX2xvYWRfc3RyaW5nKCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkdGVzdCA9ICRzb2FwLT5jaGlsZHJlbignaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nKS0+Qm9keS0+Y2hpbGRyZW4oJ2h0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8nKS0+cmV0dXJuOw0KICAgICAgICAgICAgLy8gJGpzb24yID0ganNvbl9lbmNvZGUoJHRlc3QpOw0KICAgICAgICAgICAgLy8gJGFycmF5MiA9IGpzb25fZGVjb2RlKCRqc29uMixUUlVFKTsNCg0KICAgICAgICAgICAgJGVycm9ycyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9ycyJdOw0KICAgICAgICAgICAgJGNyZWF0ZURhdGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNyZWF0ZURhdGUiXTsNCiAgICAgICAgICAgICRkb2N1bWVudEZvcm1hdCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRGb3JtYXQiXTsNCiAgICAgICAgICAgICRkb2N1bWVudElkID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudElkIl07DQogICAgICAgICAgICAkZG9jdW1lbnROcmMgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50TnJjIl07DQogICAgICAgICAgICAkc3RhdHVzTmFtZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRTdGF0dXMiXVsic3RhdHVzTmFtZSJdOw0KICAgICAgICAgICAgJGRvY3VtZW50VHlwZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRUeXBlIl07DQogICAgICAgICAgICAkZm9ybWF0VmVyc2lvbiA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZm9ybWF0VmVyc2lvbiJdOw0KICAgICAgICAgICAgJGludGVybmFsUGF0aCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaW50ZXJuYWxQYXRoIl07DQogICAgICAgICAgICAkY2ZlTnVtYmVyID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVOdW1iZXIiXTsNCiAgICAgICAgICAgICRjZmVSYW5nZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlUmFuZ2UiXTsNCiAgICAgICAgICAgICRoYXNoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJoYXNoIl07DQogICAgICAgICAgICAkc2lnbmF0dXJlVGltZXN0YW1wID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJzaWduYXR1cmVUaW1lc3RhbXAiXTsNCg0KICAgICAgICAgICAgLy8gZWNobyAieG1sIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcigkeG1sKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gImpzb24iOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyBwcmludF9yKCRqc29uKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gImFycmF5IjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcigkYXJyYXkpOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAidGVzdCI7DQogICAgICAgICAgICAvLyBlY2hvICJcbiI7DQogICAgICAgICAgICAvLyBlY2hvIHByaW50X3IoJHRlc3QpOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAiXG4iOw0KICAgICAgICAgICAgLy8gZWNobyAiYXJyYXkyIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcigkYXJyYXkyKTsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gImxpYnhtbF91c2VfaW50ZXJuYWxfZXJyb3JzIjsNCiAgICAgICAgICAgIC8vIGVjaG8gIlxuIjsNCiAgICAgICAgICAgIC8vIGVjaG8gcHJpbnRfcihsaWJ4bWxfdXNlX2ludGVybmFsX2Vycm9ycygpKTsNCiAgICAgICAgICAgIC8vIGVjaG8ganNvbl9lbmNvZGUoJHRlc3QtPmVycm9ycyk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIGVsc2V7DQogICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSAzMDA7DQogICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiTm8gcmVjaWJvIGFjdGlvbiB2YWxpZG8uIjsNCiAgICAgICAgDQogICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICB9DQoNCiAgICB9DQogICAgDQp9DQoNCmVsc2UgaWYoJHRpcG9EYXRvUmVjaWJpZG89PSJhcHBsaWNhdGlvbi9qc29uIil7DQoNCiAgICAkanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdwaHA6Ly9pbnB1dCcpOw0KDQogICAgJGRhdGEgPSBqc29uX2RlY29kZSgkanNvbiwgdHJ1ZSk7DQoNCiAgICBpZihpc3NldCgkZGF0YVsiYWN0aW9uIl0pKXsNCiAgICAgICAgJGFjdGlvbiA9ICRkYXRhWyJhY3Rpb24iXTsNCgkJDQoJCWlmKCRhY3Rpb249PSJGRV9UaWxzb3IiKXsNCg0KICAgICAgICAgICAgLy8gJGNvbnRleHQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoWw0KICAgICAgICAgICAgICAgIC8vICdzc2wnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAvLyAnYWxsb3dfc2VsZl9zaWduZWQnID0+IHRydWUNCiAgICAgICAgICAgICAgICAvLyBdDQogICAgICAgICAgICAvLyBdKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gJHNvYXBfb3B0aW9ucyA9IFsNCiAgICAgICAgICAgICAgICAvLyAndXJpJyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nLA0KICAgICAgICAgICAgICAgIC8vICdzdHlsZScgPT4gU09BUF9SUEMsDQogICAgICAgICAgICAgICAgLy8gJ3VzZScgPT4gU09BUF9FTkNPREVELA0KICAgICAgICAgICAgICAgIC8vICdzb2FwX3ZlcnNpb24nID0+IFNPQVBfMV8xLA0KICAgICAgICAgICAgICAgIC8vICdjYWNoZV93c2RsJyA9PiBXU0RMX0NBQ0hFX05PTkUsDQogICAgICAgICAgICAgICAgLy8gJ2Nvbm5lY3Rpb25fdGltZW91dCcgPT4gMTUsDQogICAgICAgICAgICAgICAgLy8gJ3RyYWNlJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgIC8vICdlbmNvZGluZycgPT4gJ1VURi04JywNCiAgICAgICAgICAgICAgICAvLyAnZXhjZXB0aW9ucycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAvLyAnbG9naW4nID0+ICdpcGFya2luZ3MnLA0KICAgICAgICAgICAgICAgIC8vICdsb2dpbicgPT4gJ2ludGVyZmFjZScsDQogICAgICAgICAgICAgICAgLy8gLy8gJ3Bhc3N3b3JkJyA9PiAnYzEwN2ZjMTZmYycsDQogICAgICAgICAgICAgICAgLy8gJ3Bhc3N3b3JkJyA9PiAnZTkzOWFiOGQ4MjhlN2UwYWVhOTA5MmNiZWY0ODA1ODkwNTUyZWFiYzQwZjYyNjdjMTNhZDNiNjkzNGY0YmEzZCcsDQogICAgICAgICAgICAgICAgLy8gJ3N0cmVhbV9jb250ZXh0JyA9PiAkY29udGV4dA0KICAgICAgICAgICAgLy8gXTsNCg0KICAgICAgICAgICAgLy8gZGVmaW5lKCJzb2FwX29wdGlvbnMiLCRzb2FwX29wdGlvbnMpOw0KCQkJDQoJCQkkZXJyb3IgPSBmYWxzZTsNCiAgICAgICAgICAgICRtc2ogPSAiTm8gcmVjaWJvOiI7DQoNCiAgICAgICAgICAgIGlmKGlzc2V0KCRfUE9TVFsidGlwb0NGRSJdKSl7DQogICAgICAgICAgICAgICAgJHRpcG9DRkUgPSAoaW50ZWdlcikkX1BPU1RbInRpcG9DRkUiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgdGlwb0NGRTsiOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoaXNzZXQoJF9QT1NUWyJNbnRUb3RhbCJdKSl7DQogICAgICAgICAgICAgICAgJE1udFRvdGFsID0gKGZsb2F0KSRfUE9TVFsiTW50VG90YWwiXTsNCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkZXJyb3IgPSB0cnVlOw0KICAgICAgICAgICAgICAgICRtc2ogPSAkbXNqLiIgTW50VG90YWw7IjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYoJGVycm9yPT10cnVlKXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA0MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRtc2o7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRmZWNoYSA9IG5ldyBEYXRlVGltZSgpOw0KICAgICAgICAgICAgJGFubyA9ICRmZWNoYS0+Zm9ybWF0KCJZIik7DQogICAgICAgICAgICAkbWVzID0gJGZlY2hhLT5mb3JtYXQoIm0iKTsNCiAgICAgICAgICAgICRkaWEgPSAkZmVjaGEtPmZvcm1hdCgiZCIpOw0KICAgICAgICAgICAgJGZlY2hhYSA9ICRhbm8uIi0iLiRtZXMuIi0iLiRkaWE7DQoNCiAgICAgICAgICAgICRzaW5JVkEgPSAkTW50VG90YWwvMS4yMjsNCiAgICAgICAgICAgICRNbnROZXRvSVZBVGFzYUJhc2ljYSA9IG51bWJlcl9mb3JtYXQoKGZsb2F0KSRzaW5JVkEsIDIsICcuJywgJycpOw0KICAgICAgICAgICAgJElWQSA9ICRNbnRUb3RhbC0kc2luSVZBOw0KICAgICAgICAgICAgJE1udElWQVRhc2FCYXNpY2EgPSBudW1iZXJfZm9ybWF0KChmbG9hdCkkSVZBLCAyLCAnLicsICcnKTsNCg0KICAgICAgICAgICAgJGRhdGEgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Q0ZFIHhtbG5zPSJodHRwOi8vY2ZlLmRnaS5ndWIudXkiPjxlVGNrPjxFbmNhYmV6YWRvPjxJZERvYz48VGlwb0NGRT4nLiR0aXBvQ0ZFLic8L1RpcG9DRkU+PEZjaEVtaXM+Jy4kZmVjaGFhLic8L0ZjaEVtaXM+PEZtYVBhZ28+MTwvRm1hUGFnbz48L0lkRG9jPjxFbWlzb3I+PFJVQ0VtaXNvcj4yMTI2MzU5MjAwMTQ8L1JVQ0VtaXNvcj48UnpuU29jPkFMQklOQ08gUy5BPC9Sem5Tb2M+PE5vbUNvbWVyY2lhbD5BTEJJTkNPIFMuQTwvTm9tQ29tZXJjaWFsPjxHaXJvRW1pcz48L0dpcm9FbWlzPjxUZWxlZm9ubz4yNzExLjEwMDA8L1RlbGVmb25vPjxDb3JyZW9FbWlzb3I+PC9Db3JyZW9FbWlzb3I+PEVtaVN1Y3Vyc2FsPjwvRW1pU3VjdXJzYWw+PENkZ0RHSVN1Y3VyPjM8L0NkZ0RHSVN1Y3VyPjxEb21GaXNjYWw+QVYuIEFNRVJJQ08gUklDQUxET05JIDI0NzQ8L0RvbUZpc2NhbD48Q2l1ZGFkPk1PTlRFVklERU88L0NpdWRhZD48RGVwYXJ0YW1lbnRvPk1PTlRFVklERU88L0RlcGFydGFtZW50bz48L0VtaXNvcj48VG90YWxlcz48VHBvTW9uZWRhPlVZVTwvVHBvTW9uZWRhPjxNbnROb0dydj4wLjAwPC9NbnROb0dydj48TW50RXhwb3lBc2ltPjAuMDA8L01udEV4cG95QXNpbT48TW50SW1wdWVzdG9QZXJjPjAuMDA8L01udEltcHVlc3RvUGVyYz48TW50SVZhZW5TdXNwPjAuMDA8L01udElWYWVuU3VzcD48TW50TmV0b0l2YVRhc2FNaW4+MC4wMDwvTW50TmV0b0l2YVRhc2FNaW4+PE1udE5ldG9JVkFUYXNhQmFzaWNhPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01udE5ldG9JVkFUYXNhQmFzaWNhPjxNbnROZXRvSVZBT3RyYT4wLjAwPC9NbnROZXRvSVZBT3RyYT48SVZBVGFzYU1pbj4xMC4wMDwvSVZBVGFzYU1pbj48SVZBVGFzYUJhc2ljYT4yMi4wMDwvSVZBVGFzYUJhc2ljYT48TW50SVZBVGFzYU1pbj4wLjAwPC9NbnRJVkFUYXNhTWluPjxNbnRJVkFUYXNhQmFzaWNhPicuJE1udElWQVRhc2FCYXNpY2EuJzwvTW50SVZBVGFzYUJhc2ljYT48TW50SVZBT3RyYT4wLjAwPC9NbnRJVkFPdHJhPjxNbnRUb3RhbD4nLiRNbnRUb3RhbC4nPC9NbnRUb3RhbD48TW50VG90UmV0ZW5pZG8+MC4wMDwvTW50VG90UmV0ZW5pZG8+PENhbnRMaW5EZXQ+MTwvQ2FudExpbkRldD48TW9udG9ORj4wLjAwPC9Nb250b05GPjxNbnRQYWdhcj4nLiRNbnRUb3RhbC4nPC9NbnRQYWdhcj48L1RvdGFsZXM+PC9FbmNhYmV6YWRvPjxEZXRhbGxlPjxJdGVtPjxOcm9MaW5EZXQ+MTwvTnJvTGluRGV0PjxJbmRGYWN0PjM8L0luZEZhY3Q+PE5vbUl0ZW0+UGFya2luZzwvTm9tSXRlbT48RHNjSXRlbT4xMjQwODAyMDg2MDIzMSAwMCBEaWFzIDAwIEhvcmFzIDEzIE1pbnV0b3MgPC9Ec2NJdGVtPjxDYW50aWRhZD4xLjAwPC9DYW50aWRhZD48VW5pTWVkPk4vQTwvVW5pTWVkPjxQcmVjaW9Vbml0YXJpbz4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9QcmVjaW9Vbml0YXJpbz48RGVzY3VlbnRvUGN0PjAuMDA8L0Rlc2N1ZW50b1BjdD48RGVzY3VlbnRvTW9udG8+MC4wMDwvRGVzY3VlbnRvTW9udG8+PFJlY2FyZ29QY3Q+MC4wMDwvUmVjYXJnb1BjdD48UmVjYXJnb01udD4wLjAwPC9SZWNhcmdvTW50PjxNb250b0l0ZW0+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvTW9udG9JdGVtPjwvSXRlbT48L0RldGFsbGU+PC9lVGNrPjwvQ0ZFPic7DQoNCiAgICAgICAgICAgICRkYXRhNjQgPSBiYXNlNjRfZW5jb2RlKCRkYXRhKTsNCg0KICAgICAgICAgICAgJHNlbmQgPSANCiAgICAgICAgICAgICcNCiAgICAgICAgICAgIDxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCiAgICAgICAgICAgICAgICA8c29hcDpCb2R5Pg0KICAgICAgICAgICAgICAgICAgICA8aW52b2ljZVJlY2VwdGlvbiB4bWxucz0iaHR0cDovL3NlcnZpY2VzLmNmZWhhbmRsZXJ3cy50aWxzb3IuY29tLnV5LyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdW1lbnQgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRhdGE+Jy4kZGF0YTY0Lic8L2RhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+U0VNTTwvbmFtZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZG9jdW1lbnQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFMaXN0IHhtbG5zPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YT4nLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8ZW50cnk+PGtleT5pbXByZXNvcmFMb2NhbDwva2V5Pjx2YWx1ZT5US1RQQVJLMDE8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxlbnRyeT48a2V5PmluZEltcHJlc2lvbjwva2V5Pjx2YWx1ZT5GT1JDRV9QUklOVDwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGVudHJ5PjxrZXk+Y2FudENvcGlhczwva2V5Pjx2YWx1ZT4yPC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGVudHJ5PjxrZXk+aW5kSW1wcmVzaW9uPC9rZXk+PHZhbHVlPkRPTlRfUFJJTlQ8L3ZhbHVlPjwvZW50cnk+DQoJCQkJCQkJCTxlbnRyeT48a2V5PmludGVybmFsSWQ8L2tleT48dmFsdWU+cGFyazM1NjY1NjwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUlkPjE8L21ldGFkYXRhSWQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhVHlwZT51eS5jb20udGlsc29yLmFpZi5wbHVnaW5zLnNlbW0ubWV0YWRhdGEuU0VNTU1ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUxpc3QgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5hZGVuZGE8L2tleT48dmFsdWU+Jmx0OyFbQ0RBVEFbJmx0O2RhdG9zQWRlbmRhIHhtbG5zPSJodHRwOi8vdGlsc29yLmNvbS51eS8jU0VNTUFkZW5kYSImZ3Q7Jmx0O2xleWVuZGFzJmd0OyZsdDtjb25zdGFuY2lhSVZBJmd0O0lWQSBhbCBkaWEmbHQ7L2NvbnN0YW5jaWFJVkEmZ3Q7Jmx0O3Jlc29sdWNpb24mZ3Q7UmVzLiA4OTcvMjAxNCZsdDsvcmVzb2x1Y2lvbiZndDsmbHQ7dmVyaWZpY2FyQ29tcHJvYmFudGUmZ3Q7UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHBzOi8vd3d3LnNlbW0uY29tLnV5Jmx0Oy92ZXJpZmljYXJDb21wcm9iYW50ZSZndDsmbHQ7L2xleWVuZGFzJmd0OyZsdDtkYXRvc0V4dHJhU0VNTSZndDsmbHQ7bGV5ZW5kYTEmZ3Q7Jmx0Oy9sZXllbmRhMSZndDsmbHQ7L2RhdG9zRXh0cmFTRU1NJmd0OyZsdDsvZGF0b3NBZGVuZGEmZ3Q7XV0mZ3Q7PC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5mYWN0b3J5Q2xhc3M8L2tleT48dmFsdWU+dXkuY29tLnRpbHNvci5haWYuc2VtbVNjaGVtYXMuYWRlbmRhLkFkZW5kYUZhY3Rvcnk8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFJZD4xPC9tZXRhZGF0YUlkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YVR5cGU+dXkuY29tLnRpbHNvci5haWYucGx1Z2lucy5jZmUubWV0YWRhdGEuQWRlbmRhTWV0YWRhdGE8L21ldGFkYXRhVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXIgeG1sbnM9IiI+RVBfRU1JU09SX0NGRV9FTlRSQURBPC9oYW5kbGVyPg0KICAgICAgICAgICAgICAgICAgICA8L2ludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+DQogICAgICAgICAgICAnOw0KCQkJDQoJCQlzYXZlVFhUKCRsb2dQZXRpY2lvbiwgJHNlbmQsICR1cmxMb2csICRhY3Rpb24pOw0KDQogICAgICAgICAgICAkaGVhZGVycyA9IGFycmF5KA0KICAgICAgICAgICAgICAgIC8vICJQT1NUIC9wYWNrYWdlL3BhY2thZ2VfMS4zL3BhY2thZ2VzZXJ2aWNlcy5hc214IEhUVFAvMS4xIiwNCiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkc2VuZCkNCiAgICAgICAgICAgICk7IA0KICAgICAgICAgICAgDQogICAgICAgICAgICAkdXJsID0gV1NETDI7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHNlbmQpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZU9yaWcgPSBjdXJsX2V4ZWMoJGNoKTsgDQogICAgICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7DQoNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+JywnJywkcmVzcG9uc2VPcmlnKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCduczI6JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzwvc29hcDpCb2R5PicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8L3NvYXA6RW52ZWxvcGU+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgLy8gJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyInLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZpY2VzLmNmZWhhbmRsZXJ3cy50aWxzb3IuY29tLnV5LyInLCcnLCRyZXNwb25zZSk7DQoNCiAgICAgICAgICAgICR4bWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHJlc3BvbnNlLCAiU2ltcGxlWE1MRWxlbWVudCIsIExJQlhNTF9OT0NEQVRBKTsNCiAgICAgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHhtbCk7DQogICAgICAgICAgICAkYXJyYXkgPSBqc29uX2RlY29kZSgkanNvbixUUlVFKTsNCg0KICAgICAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygicmV0dXJuIiwkYXJyYXkpKXsNCiAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvcnMiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgJGVycm9ycyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9ycyJdOw0KICAgIA0KICAgICAgICAgICAgICAgICAgICBpZigkZXJyb3JzPT0iZmFsc2UiIHx8ICRlcnJvcnMgPT0gZmFsc2Upew0KICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZURhdGUgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNyZWF0ZURhdGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudEZvcm1hdCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRGb3JtYXQiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudElkID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudElkIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnROcmMgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50TnJjIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc3RhdHVzTmFtZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRTdGF0dXMiXVsic3RhdHVzTmFtZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50VHlwZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnRUeXBlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0VmVyc2lvbiA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZm9ybWF0VmVyc2lvbiJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGludGVybmFsUGF0aCA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiaW50ZXJuYWxQYXRoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkY2ZlTnVtYmVyID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVOdW1iZXIiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZmVSYW5nZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY2ZlUmFuZ2UiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoYXNoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJoYXNoIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmF0dXJlVGltZXN0YW1wID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJzaWduYXR1cmVUaW1lc3RhbXAiXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIk9rIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJUb2RvIG9rLiI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jcmVhdGVEYXRlID0gJGNyZWF0ZURhdGU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudEZvcm1hdCA9ICRkb2N1bWVudEZvcm1hdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50SWQgPSAkZG9jdW1lbnRJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsSWQgPSAkaW50ZXJuYWxJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50TnJjID0gJGRvY3VtZW50TnJjOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+c3RhdHVzTmFtZSA9ICRzdGF0dXNOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRUeXBlID0gJGRvY3VtZW50VHlwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmZvcm1hdFZlcnNpb24gPSAkZm9ybWF0VmVyc2lvbjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmludGVybmFsUGF0aCA9ICRpbnRlcm5hbFBhdGg7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jZmVOdW1iZXIgPSAkY2ZlTnVtYmVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y2ZlUmFuZ2UgPSAkY2ZlUmFuZ2U7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5oYXNoID0gJGhhc2g7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5zaWduYXR1cmVUaW1lc3RhbXAgPSAkc2lnbmF0dXJlVGltZXN0YW1wOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigkZXJyb3JzPT0idHJ1ZSIgfHwgJGVycm9ycz09dHJ1ZSl7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvckNvZGUiLCRhcnJheVsicmV0dXJuIl0pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JDb2RlID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JDb2RlIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJlcnJvck1zZyIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvck1zZyA9ICRhcnJheVsicmV0dXJuIl1bImVycm9yTXNnIl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICRlcnJvck1zZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nUmVzcHVlc3RhLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgDQogICAgICAgICAgICAgICAgICAgIGVsc2V7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDQuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiQWxnbyBhbmR1dm8gbWFsLCBjaGVxdWVhciBpbmZvIDUuIjsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSA1MDA7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gNi4iOw0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnJlc3BvbnNlID0gJHJlc3BvbnNlOw0KCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIHJldHVybjsNCg0KICAgICAgICB9DQoJCQ0KCQllbHNlIGlmKCRhY3Rpb249PSJGRV9UaWxzb3JPTEQiKXsNCg0KICAgICAgICAgICAgLy8gJGNvbnRleHQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoWw0KICAgICAgICAgICAgICAgIC8vICdzc2wnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gJ3ZlcmlmeV9wZWVyX25hbWUnID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAvLyAnYWxsb3dfc2VsZl9zaWduZWQnID0+IHRydWUNCiAgICAgICAgICAgICAgICAvLyBdDQogICAgICAgICAgICAvLyBdKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gJHNvYXBfb3B0aW9ucyA9IFsNCiAgICAgICAgICAgICAgICAvLyAndXJpJyA9PiAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nLA0KICAgICAgICAgICAgICAgIC8vICdzdHlsZScgPT4gU09BUF9SUEMsDQogICAgICAgICAgICAgICAgLy8gJ3VzZScgPT4gU09BUF9FTkNPREVELA0KICAgICAgICAgICAgICAgIC8vICdzb2FwX3ZlcnNpb24nID0+IFNPQVBfMV8xLA0KICAgICAgICAgICAgICAgIC8vICdjYWNoZV93c2RsJyA9PiBXU0RMX0NBQ0hFX05PTkUsDQogICAgICAgICAgICAgICAgLy8gJ2Nvbm5lY3Rpb25fdGltZW91dCcgPT4gMTUsDQogICAgICAgICAgICAgICAgLy8gJ3RyYWNlJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgIC8vICdlbmNvZGluZycgPT4gJ1VURi04JywNCiAgICAgICAgICAgICAgICAvLyAnZXhjZXB0aW9ucycgPT4gdHJ1ZSwNCiAgICAgICAgICAgICAgICAvLyAvLyAnbG9naW4nID0+ICdpcGFya2luZ3MnLA0KICAgICAgICAgICAgICAgIC8vICdsb2dpbicgPT4gJ2ludGVyZmFjZScsDQogICAgICAgICAgICAgICAgLy8gLy8gJ3Bhc3N3b3JkJyA9PiAnYzEwN2ZjMTZmYycsDQogICAgICAgICAgICAgICAgLy8gJ3Bhc3N3b3JkJyA9PiAnZTkzOWFiOGQ4MjhlN2UwYWVhOTA5MmNiZWY0ODA1ODkwNTUyZWFiYzQwZjYyNjdjMTNhZDNiNjkzNGY0YmEzZCcsDQogICAgICAgICAgICAgICAgLy8gJ3N0cmVhbV9jb250ZXh0JyA9PiAkY29udGV4dA0KICAgICAgICAgICAgLy8gXTsNCg0KICAgICAgICAgICAgLy8gZGVmaW5lKCJzb2FwX29wdGlvbnMiLCRzb2FwX29wdGlvbnMpOw0KDQogICAgICAgICAgICAkZmVjaGEgPSBuZXcgRGF0ZVRpbWUoKTsNCiAgICAgICAgICAgICRhbm8gPSAkZmVjaGEtPmZvcm1hdCgiWSIpOw0KICAgICAgICAgICAgJG1lcyA9ICRmZWNoYS0+Zm9ybWF0KCJtIik7DQogICAgICAgICAgICAkZGlhID0gJGZlY2hhLT5mb3JtYXQoImQiKTsNCiAgICAgICAgICAgICRmZWNoYWEgPSAkYW5vLiItIi4kbWVzLiItIi4kZGlhOw0KDQogICAgICAgICAgICAkdGlwb0NGRSA9IDEwMTsNCg0KICAgICAgICAgICAgJE1udFRvdGFsID0gODA7DQogICAgICAgICAgICAkc2luSVZBID0gJE1udFRvdGFsLzEuMjI7DQogICAgICAgICAgICAkTW50TmV0b0lWQVRhc2FCYXNpY2EgPSBudW1iZXJfZm9ybWF0KChmbG9hdCkkc2luSVZBLCAyLCAnLicsICcnKTsNCiAgICAgICAgICAgICRJVkEgPSAkTW50VG90YWwtJHNpbklWQTsNCiAgICAgICAgICAgICRNbnRJVkFUYXNhQmFzaWNhID0gbnVtYmVyX2Zvcm1hdCgoZmxvYXQpJElWQSwgMiwgJy4nLCAnJyk7DQoNCiAgICAgICAgICAgICRkYXRhID0gJzw\/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PENGRSB4bWxucz0iaHR0cDovL2NmZS5kZ2kuZ3ViLnV5Ij48ZVRjaz48RW5jYWJlemFkbz48SWREb2M+PFRpcG9DRkU+Jy4kdGlwb0NGRS4nPC9UaXBvQ0ZFPjxGY2hFbWlzPicuJGZlY2hhYS4nPC9GY2hFbWlzPjxGbWFQYWdvPjE8L0ZtYVBhZ28+PC9JZERvYz48RW1pc29yPjxSVUNFbWlzb3I+MjEyNjM1OTIwMDE0PC9SVUNFbWlzb3I+PFJ6blNvYz5BTEJJTkNPIFMuQTwvUnpuU29jPjxOb21Db21lcmNpYWw+QUxCSU5DTyBTLkE8L05vbUNvbWVyY2lhbD48R2lyb0VtaXM+PC9HaXJvRW1pcz48VGVsZWZvbm8+MjcxMS4xMDAwPC9UZWxlZm9ubz48Q29ycmVvRW1pc29yPjwvQ29ycmVvRW1pc29yPjxFbWlTdWN1cnNhbD48L0VtaVN1Y3Vyc2FsPjxDZGdER0lTdWN1cj4zPC9DZGdER0lTdWN1cj48RG9tRmlzY2FsPkFWLiBBTUVSSUNPIFJJQ0FMRE9OSSAyNDc0PC9Eb21GaXNjYWw+PENpdWRhZD5NT05URVZJREVPPC9DaXVkYWQ+PERlcGFydGFtZW50bz5NT05URVZJREVPPC9EZXBhcnRhbWVudG8+PC9FbWlzb3I+PFRvdGFsZXM+PFRwb01vbmVkYT5VWVU8L1Rwb01vbmVkYT48TW50Tm9HcnY+MC4wMDwvTW50Tm9HcnY+PE1udEV4cG95QXNpbT4wLjAwPC9NbnRFeHBveUFzaW0+PE1udEltcHVlc3RvUGVyYz4wLjAwPC9NbnRJbXB1ZXN0b1BlcmM+PE1udElWYWVuU3VzcD4wLjAwPC9NbnRJVmFlblN1c3A+PE1udE5ldG9JdmFUYXNhTWluPjAuMDA8L01udE5ldG9JdmFUYXNhTWluPjxNbnROZXRvSVZBVGFzYUJhc2ljYT4nLiRNbnROZXRvSVZBVGFzYUJhc2ljYS4nPC9NbnROZXRvSVZBVGFzYUJhc2ljYT48TW50TmV0b0lWQU90cmE+MC4wMDwvTW50TmV0b0lWQU90cmE+PElWQVRhc2FNaW4+MTAuMDA8L0lWQVRhc2FNaW4+PElWQVRhc2FCYXNpY2E+MjIuMDA8L0lWQVRhc2FCYXNpY2E+PE1udElWQVRhc2FNaW4+MC4wMDwvTW50SVZBVGFzYU1pbj48TW50SVZBVGFzYUJhc2ljYT4nLiRNbnRJVkFUYXNhQmFzaWNhLic8L01udElWQVRhc2FCYXNpY2E+PE1udElWQU90cmE+MC4wMDwvTW50SVZBT3RyYT48TW50VG90YWw+Jy4kTW50VG90YWwuJzwvTW50VG90YWw+PE1udFRvdFJldGVuaWRvPjAuMDA8L01udFRvdFJldGVuaWRvPjxDYW50TGluRGV0PjE8L0NhbnRMaW5EZXQ+PE1vbnRvTkY+MC4wMDwvTW9udG9ORj48TW50UGFnYXI+Jy4kTW50VG90YWwuJzwvTW50UGFnYXI+PC9Ub3RhbGVzPjwvRW5jYWJlemFkbz48RGV0YWxsZT48SXRlbT48TnJvTGluRGV0PjE8L05yb0xpbkRldD48SW5kRmFjdD4zPC9JbmRGYWN0PjxOb21JdGVtPlBhcmtpbmc8L05vbUl0ZW0+PERzY0l0ZW0+MTI0MDgwMjA4NjAyMzEgMDAgRGlhcyAwMCBIb3JhcyAxMyBNaW51dG9zIDwvRHNjSXRlbT48Q2FudGlkYWQ+MS4wMDwvQ2FudGlkYWQ+PFVuaU1lZD5OL0E8L1VuaU1lZD48UHJlY2lvVW5pdGFyaW8+Jy4kTW50TmV0b0lWQVRhc2FCYXNpY2EuJzwvUHJlY2lvVW5pdGFyaW8+PERlc2N1ZW50b1BjdD4wLjAwPC9EZXNjdWVudG9QY3Q+PERlc2N1ZW50b01vbnRvPjAuMDA8L0Rlc2N1ZW50b01vbnRvPjxSZWNhcmdvUGN0PjAuMDA8L1JlY2FyZ29QY3Q+PFJlY2FyZ29NbnQ+MC4wMDwvUmVjYXJnb01udD48TW9udG9JdGVtPicuJE1udE5ldG9JVkFUYXNhQmFzaWNhLic8L01vbnRvSXRlbT48L0l0ZW0+PC9EZXRhbGxlPjwvZVRjaz48L0NGRT4nOw0KDQogICAgICAgICAgICAkZGF0YTY0ID0gYmFzZTY0X2VuY29kZSgkZGF0YSk7DQoNCiAgICAgICAgICAgICRzZW5kID0gDQogICAgICAgICAgICAnDQogICAgICAgICAgICA8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQogICAgICAgICAgICAgICAgPHNvYXA6Qm9keT4NCiAgICAgICAgICAgICAgICAgICAgPGludm9pY2VSZWNlcHRpb24geG1sbnM9Imh0dHA6Ly9zZXJ2aWNlcy5jZmVoYW5kbGVyd3MudGlsc29yLmNvbS51eS8iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRvY3VtZW50IHhtbG5zPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYXRhPicuJGRhdGE2NC4nPC9kYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPlNFTU08L25hbWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2RvY3VtZW50Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhTGlzdCB4bWxucz0iIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGE+Jy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGVudHJ5PjxrZXk+aW1wcmVzb3JhTG9jYWw8L2tleT48dmFsdWU+VEtUUEFSSzAxPC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8ZW50cnk+PGtleT5pbmRJbXByZXNpb248L2tleT48dmFsdWU+Rk9SQ0VfUFJJTlQ8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxlbnRyeT48a2V5PmNhbnRDb3BpYXM8L2tleT48dmFsdWU+MjwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxlbnRyeT48a2V5PmludGVybmFsSWQ8L2tleT48dmFsdWU+cGFyazM1NjY1NjwvdmFsdWU+PC9lbnRyeT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUlkPjE8L21ldGFkYXRhSWQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhVHlwZT51eS5jb20udGlsc29yLmFpZi5wbHVnaW5zLnNlbW0ubWV0YWRhdGEuU0VNTU1ldGFkYXRhPC9tZXRhZGF0YVR5cGU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L21ldGFkYXRhTGlzdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YUxpc3QgeG1sbnM9IiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGFkYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5hZGVuZGE8L2tleT48dmFsdWU+Jmx0OyFbQ0RBVEFbJmx0O2RhdG9zQWRlbmRhIHhtbG5zPSJodHRwOi8vdGlsc29yLmNvbS51eS8jU0VNTUFkZW5kYSImZ3Q7Jmx0O2xleWVuZGFzJmd0OyZsdDtjb25zdGFuY2lhSVZBJmd0O0lWQSBhbCBkaWEmbHQ7L2NvbnN0YW5jaWFJVkEmZ3Q7Jmx0O3Jlc29sdWNpb24mZ3Q7UmVzLiA4OTcvMjAxNCZsdDsvcmVzb2x1Y2lvbiZndDsmbHQ7dmVyaWZpY2FyQ29tcHJvYmFudGUmZ3Q7UHVlZGUgdmVyaWZpY2FyIGNvbXByb2JhbnRlIGVuIGh0dHBzOi8vd3d3LnNlbW0uY29tLnV5Jmx0Oy92ZXJpZmljYXJDb21wcm9iYW50ZSZndDsmbHQ7L2xleWVuZGFzJmd0OyZsdDtkYXRvc0V4dHJhU0VNTSZndDsmbHQ7bGV5ZW5kYTEmZ3Q7Jmx0Oy9sZXllbmRhMSZndDsmbHQ7L2RhdG9zRXh0cmFTRU1NJmd0OyZsdDsvZGF0b3NBZGVuZGEmZ3Q7XV0mZ3Q7PC92YWx1ZT48L2VudHJ5Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGtleT5mYWN0b3J5Q2xhc3M8L2tleT48dmFsdWU+dXkuY29tLnRpbHNvci5haWYuc2VtbVNjaGVtYXMuYWRlbmRhLkFkZW5kYUZhY3Rvcnk8L3ZhbHVlPjwvZW50cnk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZXRhZGF0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWV0YWRhdGFJZD4xPC9tZXRhZGF0YUlkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRhZGF0YVR5cGU+dXkuY29tLnRpbHNvci5haWYucGx1Z2lucy5jZmUubWV0YWRhdGEuQWRlbmRhTWV0YWRhdGE8L21ldGFkYXRhVHlwZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWV0YWRhdGFMaXN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXIgeG1sbnM9IiI+RVBfRU1JU09SX0NGRV9FTlRSQURBPC9oYW5kbGVyPg0KICAgICAgICAgICAgICAgICAgICA8L2ludm9pY2VSZWNlcHRpb24+DQogICAgICAgICAgICAgICAgPC9zb2FwOkJvZHk+DQogICAgICAgICAgICA8L3NvYXA6RW52ZWxvcGU+DQogICAgICAgICAgICAnOw0KDQogICAgICAgICAgICAkaGVhZGVycyA9IGFycmF5KA0KICAgICAgICAgICAgICAgIC8vICJQT1NUIC9wYWNrYWdlL3BhY2thZ2VfMS4zL3BhY2thZ2VzZXJ2aWNlcy5hc214IEhUVFAvMS4xIiwNCiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCIsDQogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiLnN0cmxlbigkc2VuZCkNCiAgICAgICAgICAgICk7IA0KICAgICAgICAgICAgDQogICAgICAgICAgICAkdXJsID0gV1NETDI7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHNlbmQpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsNCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRyZXNwb25zZU9yaWcgPSBjdXJsX2V4ZWMoJGNoKTsgDQogICAgICAgICAgICBjdXJsX2Nsb3NlKCRjaCk7DQoNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCc8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzxzb2FwOkJvZHk+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJ25zMjonLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnPC9zb2FwOkJvZHk+JywnJywkcmVzcG9uc2UpOw0KICAgICAgICAgICAgJHJlc3BvbnNlID0gc3RyX3JlcGxhY2UoJzwvc29hcDpFbnZlbG9wZT4nLCcnLCRyZXNwb25zZSk7DQogICAgICAgICAgICAvLyAkcmVzcG9uc2UgPSBzdHJfcmVwbGFjZSgnIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIicsJycsJHJlc3BvbnNlKTsNCiAgICAgICAgICAgICRyZXNwb25zZSA9IHN0cl9yZXBsYWNlKCcgeG1sbnM6bnMyPSJodHRwOi8vc2VydmljZXMuY2ZlaGFuZGxlcndzLnRpbHNvci5jb20udXkvIicsJycsJHJlc3BvbnNlKTsNCg0KICAgICAgICAgICAgJHhtbCA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkcmVzcG9uc2UsICJTaW1wbGVYTUxFbGVtZW50IiwgTElCWE1MX05PQ0RBVEEpOw0KICAgICAgICAgICAgJGpzb24gPSBqc29uX2VuY29kZSgkeG1sKTsNCiAgICAgICAgICAgICRhcnJheSA9IGpzb25fZGVjb2RlKCRqc29uLFRSVUUpOw0KDQogICAgICAgICAgICBpZihhcnJheV9rZXlfZXhpc3RzKCJyZXR1cm4iLCRhcnJheSkpew0KICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9ycyIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAkZXJyb3JzID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JzIl07DQogICAgDQogICAgICAgICAgICAgICAgICAgIGlmKCRlcnJvcnM9PSJmYWxzZSIgfHwgJGVycm9ycyA9PSBmYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICAkY3JlYXRlRGF0ZSA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiY3JlYXRlRGF0ZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50Rm9ybWF0ID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudEZvcm1hdCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50SWQgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImRvY3VtZW50SWQiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRkb2N1bWVudE5yYyA9ICRhcnJheVsicmV0dXJuIl1bImNmZUluZm8iXVsiZG9jdW1lbnROcmMiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0dXNOYW1lID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudFN0YXR1cyJdWyJzdGF0dXNOYW1lIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRUeXBlID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJkb2N1bWVudFR5cGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXRWZXJzaW9uID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJmb3JtYXRWZXJzaW9uIl07DQogICAgICAgICAgICAgICAgICAgICAgICAkaW50ZXJuYWxQYXRoID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJpbnRlcm5hbFBhdGgiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjZmVOdW1iZXIgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImNmZU51bWJlciJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGNmZVJhbmdlID0gJGFycmF5WyJyZXR1cm4iXVsiY2ZlSW5mbyJdWyJjZmVSYW5nZSJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGhhc2ggPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bImhhc2giXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRzaWduYXR1cmVUaW1lc3RhbXAgPSAkYXJyYXlbInJldHVybiJdWyJjZmVJbmZvIl1bInNpZ25hdHVyZVRpbWVzdGFtcCJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jb2RpZ28gPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiT2siOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIlRvZG8gb2suIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNyZWF0ZURhdGUgPSAkY3JlYXRlRGF0ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmRvY3VtZW50Rm9ybWF0ID0gJGRvY3VtZW50Rm9ybWF0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnRJZCA9ICRkb2N1bWVudElkOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZG9jdW1lbnROcmMgPSAkZG9jdW1lbnROcmM7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5zdGF0dXNOYW1lID0gJHN0YXR1c05hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5kb2N1bWVudFR5cGUgPSAkZG9jdW1lbnRUeXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Zm9ybWF0VmVyc2lvbiA9ICRmb3JtYXRWZXJzaW9uOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+aW50ZXJuYWxQYXRoID0gJGludGVybmFsUGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNmZU51bWJlciA9ICRjZmVOdW1iZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5jZmVSYW5nZSA9ICRjZmVSYW5nZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmhhc2ggPSAkaGFzaDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPnNpZ25hdHVyZVRpbWVzdGFtcCA9ICRzaWduYXR1cmVUaW1lc3RhbXA7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJCSRyZXNwdWVzdGEtPnJlc3BvbnNlT3JpZyA9ICRyZXNwb25zZU9yaWc7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJCXNhdmVUWFQoJGxvZ1Jlc3B1ZXN0YSwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCRlcnJvcnM9PSJ0cnVlIiB8fCAkZXJyb3JzPT10cnVlKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yQ29kZSIsJGFycmF5WyJyZXR1cm4iXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvckNvZGUgPSAkYXJyYXlbInJldHVybiJdWyJlcnJvckNvZGUiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5X2tleV9leGlzdHMoImVycm9yTXNnIiwkYXJyYXlbInJldHVybiJdKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yTXNnID0gJGFycmF5WyJyZXR1cm4iXVsiZXJyb3JNc2ciXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNDAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gJGVycm9yTXNnOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dSZXNwdWVzdGEsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzcHVlc3RhOw0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICAgICAgZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmVycm9yID0gIkVycm9yIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gNy4iOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJCQkkcmVzcHVlc3RhLT5yZXNwb25zZU9yaWcgPSAkcmVzcG9uc2VPcmlnOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJCQlzYXZlVFhUKCRsb2dFcnJvciwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gNTAwOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPm1zaiA9ICJBbGdvIGFuZHV2byBtYWwsIGNoZXF1ZWFyIGluZm8gOC4iOw0KICAgICAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5yZXNwb25zZSA9ICRyZXNwb25zZTsNCgkJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXNwdWVzdGE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAgICAgICAgICAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIkFsZ28gYW5kdXZvIG1hbCwgY2hlcXVlYXIgaW5mbyA5LiI7DQogICAgICAgICAgICAgICAgJHJlc3B1ZXN0YS0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7DQoJCQkJJHJlc3B1ZXN0YS0+cmVzcG9uc2VPcmlnID0gJHJlc3BvbnNlT3JpZzsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSk7DQoJCQkJc2F2ZVRYVCgkbG9nRXJyb3IsIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpLCAkdXJsTG9nLCAkYWN0aW9uKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIH0gDQoJCQ0KCQllbHNlew0KICAgICAgICAgICAgJHJlc3B1ZXN0YS0+Y29kaWdvID0gMzAwOw0KICAgICAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAgICAgJHJlc3B1ZXN0YS0+bXNqID0gIk5vIHJlY2libyBhY3Rpb24gdmFsaWRvLiI7DQogICAgICAgIA0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcHVlc3RhKTsNCgkJCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICAgICAgfQ0KCQkNCiAgICB9IGVsc2V7DQogICAgICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDQwMDsNCiAgICAgICAgJHJlc3B1ZXN0YS0+ZXJyb3IgPSAiRXJyb3IiOw0KICAgICAgICAkcmVzcHVlc3RhLT5tc2ogPSAiTm8gcmVjaWJvIGFjdGlvbi4iOw0KICAgIA0KICAgICAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCQlzYXZlVFhUKCRsb2dFcnJvciwganNvbl9lbmNvZGUoJHJlc3B1ZXN0YSksICR1cmxMb2csICRhY3Rpb24pOw0KICAgICAgICByZXR1cm4gJHJlc3B1ZXN0YTsNCiAgICB9DQoNCn0NCg0KZWxzZXsNCg0KICAgICRyZXNwdWVzdGEtPmNvZGlnbyA9IDUwMDsNCiAgICAkcmVzcHVlc3RhLT5lcnJvciA9ICJFcnJvciI7DQogICAgJHJlc3B1ZXN0YS0+bXNqID0gIk5vIHJlY2libyB0aXBvIGRlIGRhdG8gcmVjb25vY2libGUgZW4gbGEgc29saWNpdHVkLiI7DQoNCiAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXNwdWVzdGEpOw0KCXNhdmVUWFQoJGxvZ0Vycm9yLCBqc29uX2VuY29kZSgkcmVzcHVlc3RhKSwgJHVybExvZywgJGFjdGlvbik7DQogICAgcmV0dXJuICRyZXNwdWVzdGE7DQoNCn0NCg0KPz4="} Desde: APIs/Clientes/Aeropuertos/Aeroshop/save.php, Action: save, Fecha: 2025-10-29 17:09:22. Data: {"file1":"format(\"Y-m-d H:i:s\");\r\n\tfile_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n}\r\n\r\n$logError = \"logs\/tilsor\/errores\";\r\n$logPeticion = \"logs\/tilsor\/enviado\";\r\n$logRespuesta = \"logs\/tilsor\/respuesta\";\r\n$urlLog = \"10.44.200.11\/iparkings_prod\/orm_pcs\/terminal_web\/tilsor.php\";\r\n\r\n$respuesta = (object)\r\n[\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n];\r\n\r\n$tipoDatoRecibido = $_SERVER['CONTENT_TYPE'];\r\n\r\nif($tipoDatoRecibido==\"application\/x-www-form-urlencoded\"){\r\n\r\n if(isset($_POST[\"action\"])){\r\n\r\n $action = $_POST[\"action\"];\r\n\r\n if($action==\"FE_Tilsor\"){\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\t\t\t\r\n\t\t\t$error = false;\r\n $msj = \"No recibo:\";\r\n\r\n if(isset($_POST[\"tipoCFE\"])){\r\n $tipoCFE = (integer)$_POST[\"tipoCFE\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" tipoCFE;\";\r\n }\r\n if(isset($_POST[\"MntTotal\"])){\r\n $MntTotal = (float)$_POST[\"MntTotal\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" MntTotal;\";\r\n }\r\n\t\t\t\/\/ if(isset($_POST[\"formaPago\"])){\r\n \/\/ $formaPago = $_POST[\"formaPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" formaPago;\";\r\n \/\/ }\r\n\t\t\t\/\/ if(isset($_POST[\"medioPago\"])){\r\n \/\/ $medioPago = $_POST[\"medioPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" medioPago;\";\r\n \/\/ }\r\n\t\t\tif(isset($_POST[\"idStay\"])){\r\n $idStay = $_POST[\"idStay\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" idStay;\";\r\n }\r\n\t\t\tif(isset($_POST[\"barcode\"])){\r\n $barcode = $_POST[\"barcode\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$barcode = \"\";\r\n\t\t\t}\r\n\t\t\tif(isset($_POST[\"horasEstadia\"])){\r\n $horasEstadia = $_POST[\"horasEstadia\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$horasEstadia = \"\";\r\n\t\t\t}\r\n\t\t\tif(isset($_POST[\"addAdenda\"])){\r\n $addAdenda = $_POST[\"addAdenda\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$addAdenda = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==111 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"rut\"])){\r\n\t\t\t\t\t$rut = $_POST[\"rut\"];\r\n\t\t\t\t\tif($rut==\"\"){\r\n\t\t\t\t\t\t$error = true;\r\n\t\t\t\t\t\t$msj = $msj.\" rut;\";\r\n\t\t\t\t\t}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" rut;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"social\"])){\r\n\t\t\t\t\t$social = $_POST[\"social\"];\r\n\t\t\t\t\tif($social==\"\"){$social=\"SIN RAZON SOCIAL\";}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" social;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"dir\"])){\r\n\t\t\t\t\t$dir = $_POST[\"dir\"];\r\n\t\t\t\t\tif($dir==\"\"){$dir=\"SIN DIRECCION\";}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" dir;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"ciudad\"])){\r\n\t\t\t\t\t$ciudad = $_POST[\"ciudad\"];\r\n\t\t\t\t\tif($ciudad==\"\"){$ciudad=\"SIN CIUDAD\";}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" ciudad;\";\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==102 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"reference\"])){\r\n\t\t\t\t\t$reference = $_POST[\"reference\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" reference;\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n if($error==true){\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\t\t\t\r\n\t\t\t\/\/ $internalId = \"CAI-IP-WP2-$idStay\";\r\n\t\t\t\/\/ ORIGINAL, PREVIO MIGRACION 21-10-2025\r\n\t\t\t\/\/ $internalId = \"CAI-IP-$idStay\";\r\n\t\t\tif($tipoCFE==112 || $tipoCFE==102){\r\n\t\t\t\t$internalId = \"CAI-IP-NC-$idStay\";\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$internalId = \"CAI-IP-$idStay\";\r\n\t\t\t}\r\n\t\t\t\/\/ $internalId = \"CAI-IP-TEST-$idStay\";\r\n\t\t\t\r\n\t\t\t$emisor = '212991810011<\/RUCEmisor>Consorcio Aeropuertos InternacionalesS.A.<\/RznSoc><\/NomComercial><\/GiroEmis><\/Telefono><\/CorreoEmisor>PDP Corporate (Fc.AE<\/EmiSucursal>1<\/CdgDGISucur>Ruta 93 Km. 113 Laguna del Sauce Maldonado<\/DomFiscal>Punta del Este<\/Ciudad>Punta del Este<\/Departamento><\/Emisor>';\r\n\t\t\t\/\/ $OLDemisor = '214902340010<\/RUCEmisor>TCU S.A.<\/RznSoc>1<\/CdgDGISucur>Cno. Carrasco 0 y A. de las Americas<\/DomFiscal>Aeropuerto de Carrasco<\/Ciudad>Canelones<\/Departamento><\/Emisor>';\r\n\t\t\t\r\n\t\t\tif($tipoCFE==101 || $tipoCFE==102){\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==102){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>101<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eTck><\/CFE>';\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==112){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>111<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'2<\/TipoDocRecep>UY<\/CodPaisRecep>'.$rut.'<\/DocRecep>'.$social.'<\/RznSocRecep>'.$dir.'<\/DirRecep>'.$ciudad.'<\/CiudadRecep><\/Receptor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eFact><\/CFE>';\r\n\t\t\t}\r\n\r\n $data64 = base64_encode($data);\r\n\t\t\t\r\n\t\t\t$adenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\t$OLDadenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t\t'.\r\n\t\t\t\t\t\/\/ DÉBITO BANCARIO<\/tca:formaPago>\r\n\t\t\t\t\t\/\/ SCOTIABANK<\/tca:medioPago>\r\n\t\t\t\t\t''.$formaPago.'<\/tca:formaPago>\r\n\t\t\t\t\t'.$medioPago.'<\/tca:medioPago>\r\n\t\t\t\t\t11290<\/tca:usuario>'.\r\n\t\t\t\t\t\/\/ PDS-SF-1024687<\/tca:documentoTCU>\r\n\t\t\t\t\t''.$internalId.'<\/tca:documentoTCU>\r\n\t\t\t\t\tLACC - Ciudad Logística Internacional<\/tca:leyendaCommercial>\r\n\t\t\t\t<\/tca:datosExtraTCU>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\tif(isset($_POST[\"pos\"])){\r\n $pos = $_POST[\"pos\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$pos = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($pos!=\"\"){\r\n\t\t\t\t$print = \"FORCE_PRINT\";\r\n\t\t\t\t$printer = $pos;\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$print = \"DONT_PRINT\";\r\n\t\t\t\t$printer = \"TLASI005\";\r\n\t\t\t}\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>'.\r\n \/\/ SEMM<\/name>\r\n '<\/document>\r\n \r\n \r\n \r\n\t\t\t\t\t\t\t\t\tadenda<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$adenda.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.pdsSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n\t\t\t\t\t\t\r\n \r\n \r\n\t\t\t\t\t\t\t\t\torigin<\/key>\r\n\t\t\t\t\t\t\t\t\tIParking<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tnombreImpresora<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$printer.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tindImpresion<\/key>'.\r\n\t\t\t\t\t\t\t\t\t\/\/ FORCE_PRINT<\/value>\r\n\t\t\t\t\t\t\t\t\t''.$print.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tinternalId<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$internalId.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.pds.metadata.PDSMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\t\t\t\r\n\t\t\tsaveTXT($logPeticion, $send, $urlLog, $action);\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n \r\n $url = WSDL2;\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$responseOrig);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->internalId = $internalId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->sended = $send;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 1.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 2.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 3.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return;\r\n\r\n }\r\n\r\n else if($action==\"FE_Tilsor_test\"){\r\n\t\t\t\r\n\t\t\t\/\/ URLs testing\r\n\t\t\t\/\/ define(\"WSDL\",\"http:\/\/wlpool.stg.aic.carrasco.aero:9080\/aif\/ws\/InvoiceHandlingServices?wsdl\");\r\n\t\t\t\/\/ define(\"WSDL2\",\"http:\/\/wlpool.stg.aic.carrasco.aero:9080\/aif\/ws\/InvoiceHandlingServices\");\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\t\t\t\r\n\t\t\t$error = false;\r\n $msj = \"No recibo:\";\r\n\r\n if(isset($_POST[\"tipoCFE\"])){\r\n $tipoCFE = (integer)$_POST[\"tipoCFE\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" tipoCFE;\";\r\n }\r\n if(isset($_POST[\"MntTotal\"])){\r\n $MntTotal = (float)$_POST[\"MntTotal\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" MntTotal;\";\r\n }\r\n\t\t\t\/\/ if(isset($_POST[\"formaPago\"])){\r\n \/\/ $formaPago = $_POST[\"formaPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" formaPago;\";\r\n \/\/ }\r\n\t\t\t\/\/ if(isset($_POST[\"medioPago\"])){\r\n \/\/ $medioPago = $_POST[\"medioPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" medioPago;\";\r\n \/\/ }\r\n\t\t\tif(isset($_POST[\"idStay\"])){\r\n $idStay = $_POST[\"idStay\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" idStay;\";\r\n }\r\n\t\t\tif(isset($_POST[\"barcode\"])){\r\n $barcode = $_POST[\"barcode\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$barcode = \"\";\r\n\t\t\t}\r\n\t\t\tif(isset($_POST[\"horasEstadia\"])){\r\n $horasEstadia = $_POST[\"horasEstadia\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$horasEstadia = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==111 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"rut\"])){\r\n\t\t\t\t\t$rut = $_POST[\"rut\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" rut;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"social\"])){\r\n\t\t\t\t\t$social = $_POST[\"social\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" social;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"dir\"])){\r\n\t\t\t\t\t$dir = $_POST[\"dir\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" dir;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"ciudad\"])){\r\n\t\t\t\t\t$ciudad = $_POST[\"ciudad\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" ciudad;\";\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==102 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"reference\"])){\r\n\t\t\t\t\t$reference = $_POST[\"reference\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" reference;\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n if($error==true){\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\t\t\t\r\n\t\t\t\/\/ ORIGINAL 18-06-2025\r\n\t\t\t\t$internalId = \"CAI-IP-$idStay\";\r\n\t\t\t\t\r\n\t\t\t\t$emisor = '212991810011<\/RUCEmisor>Consorcio Aeropuertos InternacionalesS.A.<\/RznSoc><\/NomComercial><\/GiroEmis><\/Telefono><\/CorreoEmisor>PDP Corporate (Fc.AE<\/EmiSucursal>1<\/CdgDGISucur>Ruta 93 Km. 113 Laguna del Sauce Maldonado<\/DomFiscal>Punta del Este<\/Ciudad>Punta del Este<\/Departamento><\/Emisor>';\r\n\t\t\t\t\/\/ \/\/\/\/$OLDemisor = '214902340010<\/RUCEmisor>TCU S.A.<\/RznSoc>1<\/CdgDGISucur>Cno. Carrasco 0 y A. de las Americas<\/DomFiscal>Aeropuerto de Carrasco<\/Ciudad>Canelones<\/Departamento><\/Emisor>';\r\n\t\t\t\t\r\n\t\t\t\tif($tipoCFE==101 || $tipoCFE==102){\r\n\t\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eTck><\/CFE>';\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'2<\/TipoDocRecep>UY<\/CodPaisRecep>'.$rut.'<\/DocRecep>'.$social.'<\/RznSocRecep>'.$dir.'<\/DirRecep>'.$ciudad.'<\/CiudadRecep><\/Receptor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eFact><\/CFE>';\r\n\t\t\t\t}\r\n\t\t\t\/\/ ORIGINAL 18-06-2025\r\n\t\t\t\r\n\t\t\t$internalId = \"CAI-IP-$idStay\";\r\n\t\t\t\r\n\t\t\t$emisor = '212991810011<\/RUCEmisor>Consorcio Aeropuertos InternacionalesS.A.<\/RznSoc><\/NomComercial><\/GiroEmis><\/Telefono><\/CorreoEmisor>PDP Corporate (Fc.AE<\/EmiSucursal>1<\/CdgDGISucur>Ruta 93 Km. 113 Laguna del Sauce Maldonado<\/DomFiscal>Punta del Este<\/Ciudad>Punta del Este<\/Departamento><\/Emisor>';\r\n\t\t\t\/\/ $OLDemisor = '214902340010<\/RUCEmisor>TCU S.A.<\/RznSoc>1<\/CdgDGISucur>Cno. Carrasco 0 y A. de las Americas<\/DomFiscal>Aeropuerto de Carrasco<\/Ciudad>Canelones<\/Departamento><\/Emisor>';\r\n\t\t\t\r\n\t\t\tif($tipoCFE==101 || $tipoCFE==102){\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==102){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>101<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eTck><\/CFE>';\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==112){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>111<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'2<\/TipoDocRecep>UY<\/CodPaisRecep>'.$rut.'<\/DocRecep>'.$social.'<\/RznSocRecep>'.$dir.'<\/DirRecep>'.$ciudad.'<\/CiudadRecep><\/Receptor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eFact><\/CFE>';\r\n\t\t\t}\r\n\r\n \r\n\r\n $data64 = base64_encode($data);\r\n\t\t\t\r\n\t\t\t$adenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\t$OLDadenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t\t'.\r\n\t\t\t\t\t\/\/ DÉBITO BANCARIO<\/tca:formaPago>\r\n\t\t\t\t\t\/\/ SCOTIABANK<\/tca:medioPago>\r\n\t\t\t\t\t''.$formaPago.'<\/tca:formaPago>\r\n\t\t\t\t\t'.$medioPago.'<\/tca:medioPago>\r\n\t\t\t\t\t11290<\/tca:usuario>'.\r\n\t\t\t\t\t\/\/ PDS-SF-1024687<\/tca:documentoTCU>\r\n\t\t\t\t\t''.$internalId.'<\/tca:documentoTCU>\r\n\t\t\t\t\tLACC - Ciudad Logística Internacional<\/tca:leyendaCommercial>\r\n\t\t\t\t<\/tca:datosExtraTCU>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\tif(isset($_POST[\"pos\"])){\r\n $pos = $_POST[\"pos\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$pos = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($pos!=\"\"){\r\n\t\t\t\t$print = \"FORCE_PRINT\";\r\n\t\t\t\t$printer = $pos;\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$print = \"DONT_PRINT\";\r\n\t\t\t\t$printer = \"TLASI005\";\r\n\t\t\t}\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>'.\r\n \/\/ SEMM<\/name>\r\n '<\/document>\r\n \r\n \r\n \r\n\t\t\t\t\t\t\t\t\tadenda<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$adenda.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.semmSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n\t\t\t\t\t\t\r\n \r\n \r\n\t\t\t\t\t\t\t\t\torigin<\/key>\r\n\t\t\t\t\t\t\t\t\tIParking<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tnombreImpresora<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$printer.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tindImpresion<\/key>'.\r\n\t\t\t\t\t\t\t\t\t\/\/ FORCE_PRINT<\/value>\r\n\t\t\t\t\t\t\t\t\t''.$print.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tinternalId<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$internalId.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.pds.metadata.PDSMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\t\t\t\r\n\t\t\tsaveTXT($logPeticion, $send, $urlLog, $action);\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n\t\t\t\r\n\t\t\t\r\n \r\n $url = \"http:\/\/wlpool.stg.aic.carrasco.aero:9080\/aif\/ws\/InvoiceHandlingServices\";\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$responseOrig);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->internalId = $internalId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->sended = $send;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 1.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 2.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 3.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return;\r\n\r\n }\r\n\t\t\r\n\t\telse if($action==\"testXML\"){\r\n \r\n $response = '\r\n \r\n \r\n \r\n false<\/errors>\r\n \r\n 2024-09-24T17:24:53.936-03:00<\/createDate>\r\n CFE DGI<\/documentFormat>\r\n 3373569<\/documentId>\r\n 0000000000006543907whrwgyxwybpysmsnxrsengnyfkpyrkevav.bjkvv<\/documentNrc>\r\n \r\n CFE_STORED<\/statusName>\r\n <\/documentStatus>\r\n INVOICE_ISSUED<\/documentType>\r\n 1.0<\/formatVersion>\r\n Facturas Emitidas<\/internalPath>\r\n 281<\/cfeNumber>\r\n B<\/cfeRange>\r\n I4XeVFAXoF9NMI+HBOSNNqouxts=<\/hash>\r\n 2024-09-24T17:24:53.657-03:00<\/signatureTimestamp>\r\n <\/cfeInfo>\r\n <\/return>\r\n <\/ns2:invoiceReceptionResponse>\r\n <\/soap:Body>\r\n <\/soap:Envelope>';\r\n\r\n $response2 = '\r\n false<\/errors>\r\n \r\n 2024-09-24T17:24:53.936-03:00<\/createDate>\r\n CFE DGI<\/documentFormat>\r\n 3373569<\/documentId>\r\n 0000000000006543907whrwgyxwybpysmsnxrsengnyfkpyrkevav.bjkvv<\/documentNrc>\r\n \r\n CFE_STORED<\/statusName>\r\n <\/documentStatus>\r\n INVOICE_ISSUED<\/documentType>\r\n 1.0<\/formatVersion>\r\n Facturas Emitidas<\/internalPath>\r\n 281<\/cfeNumber>\r\n B<\/cfeRange>\r\n I4XeVFAXoF9NMI+HBOSNNqouxts=<\/hash>\r\n 2024-09-24T17:24:53.657-03:00<\/signatureTimestamp>\r\n <\/cfeInfo>\r\n <\/return>';\r\n\r\n $response = str_replace('','',$response);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n \/\/ echo print_r($response);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n\r\n \/\/ $envelope = simplexml_load_string($response);\r\n \/\/ $xml = simplexml_load_string($response);\r\n \/\/ $json = json_encode($xml);\r\n \/\/ $array = json_decode($json,TRUE);\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n \/\/ $soap = simplexml_load_string($response);\r\n \/\/ $test = $soap->children('http:\/\/schemas.xmlsoap.org\/soap\/envelope\/')->Body->children('http:\/\/services.cfehandlerws.tilsor.com.uy\/')->return;\r\n \/\/ $json2 = json_encode($test);\r\n \/\/ $array2 = json_decode($json2,TRUE);\r\n\r\n $errors = $array[\"return\"][\"errors\"];\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n \/\/ echo \"xml\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($xml);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"json\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($json);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"array\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($array);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"test\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($test);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"array2\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($array2);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"libxml_use_internal_errors\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r(libxml_use_internal_errors());\r\n \/\/ echo json_encode($test->errors);\r\n\r\n }\r\n\r\n else{\r\n $respuesta->codigo = 300;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo action valido.\";\r\n \r\n echo json_encode($respuesta);\r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n }\r\n \r\n}\r\n\r\nelse if($tipoDatoRecibido==\"application\/json\"){\r\n\r\n $json = file_get_contents('php:\/\/input');\r\n\r\n $data = json_decode($json, true);\r\n\r\n if(isset($data[\"action\"])){\r\n $action = $data[\"action\"];\r\n\t\t\r\n\t\tif($action==\"FE_Tilsor\"){\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\t\t\t\r\n\t\t\t$error = false;\r\n $msj = \"No recibo:\";\r\n\r\n if(isset($_POST[\"tipoCFE\"])){\r\n $tipoCFE = (integer)$_POST[\"tipoCFE\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" tipoCFE;\";\r\n }\r\n if(isset($_POST[\"MntTotal\"])){\r\n $MntTotal = (float)$_POST[\"MntTotal\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" MntTotal;\";\r\n }\r\n\r\n if($error==true){\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\r\n $data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>212635920014<\/RUCEmisor>ALBINCO S.A<\/RznSoc>ALBINCO S.A<\/NomComercial><\/GiroEmis>2711.1000<\/Telefono><\/CorreoEmisor><\/EmiSucursal>3<\/CdgDGISucur>AV. AMERICO RICALDONI 2474<\/DomFiscal>MONTEVIDEO<\/Ciudad>MONTEVIDEO<\/Departamento><\/Emisor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>12408020860231 00 Dias 00 Horas 13 Minutos <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eTck><\/CFE>';\r\n\r\n $data64 = base64_encode($data);\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>\r\n SEMM<\/name>\r\n <\/document>\r\n \r\n '.\r\n \/\/ impresoraLocal<\/key>TKTPARK01<\/value><\/entry>\r\n \/\/ indImpresion<\/key>FORCE_PRINT<\/value><\/entry>\r\n \/\/ cantCopias<\/key>2<\/value><\/entry>\r\n 'indImpresion<\/key>DONT_PRINT<\/value><\/entry>\r\n\t\t\t\t\t\t\t\tinternalId<\/key>park356656<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.semm.metadata.SEMMMetadata<\/metadataType>\r\n <\/metadataList>\r\n \r\n \r\n adenda<\/key><![CDATA[<datosAdenda xmlns=\"http:\/\/tilsor.com.uy\/#SEMMAdenda\"><leyendas><constanciaIVA>IVA al dia<\/constanciaIVA><resolucion>Res. 897\/2014<\/resolucion><verificarComprobante>Puede verificar comprobante en https:\/\/www.semm.com.uy<\/verificarComprobante><\/leyendas><datosExtraSEMM><leyenda1><\/leyenda1><\/datosExtraSEMM><\/datosAdenda>]]><\/value><\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.semmSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\t\t\t\r\n\t\t\tsaveTXT($logPeticion, $send, $urlLog, $action);\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n \r\n $url = WSDL2;\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$responseOrig);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->internalId = $internalId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 4.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 5.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 6.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n return;\r\n\r\n }\r\n\t\t\r\n\t\telse if($action==\"FE_TilsorOLD\"){\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $tipoCFE = 101;\r\n\r\n $MntTotal = 80;\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\r\n $data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>212635920014<\/RUCEmisor>ALBINCO S.A<\/RznSoc>ALBINCO S.A<\/NomComercial><\/GiroEmis>2711.1000<\/Telefono><\/CorreoEmisor><\/EmiSucursal>3<\/CdgDGISucur>AV. AMERICO RICALDONI 2474<\/DomFiscal>MONTEVIDEO<\/Ciudad>MONTEVIDEO<\/Departamento><\/Emisor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>12408020860231 00 Dias 00 Horas 13 Minutos <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eTck><\/CFE>';\r\n\r\n $data64 = base64_encode($data);\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>\r\n SEMM<\/name>\r\n <\/document>\r\n \r\n '.\r\n \/\/ impresoraLocal<\/key>TKTPARK01<\/value><\/entry>\r\n \/\/ indImpresion<\/key>FORCE_PRINT<\/value><\/entry>\r\n \/\/ cantCopias<\/key>2<\/value><\/entry>\r\n 'internalId<\/key>park356656<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.semm.metadata.SEMMMetadata<\/metadataType>\r\n <\/metadataList>\r\n \r\n \r\n adenda<\/key><![CDATA[<datosAdenda xmlns=\"http:\/\/tilsor.com.uy\/#SEMMAdenda\"><leyendas><constanciaIVA>IVA al dia<\/constanciaIVA><resolucion>Res. 897\/2014<\/resolucion><verificarComprobante>Puede verificar comprobante en https:\/\/www.semm.com.uy<\/verificarComprobante><\/leyendas><datosExtraSEMM><leyenda1><\/leyenda1><\/datosExtraSEMM><\/datosAdenda>]]><\/value><\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.semmSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n \r\n $url = WSDL2;\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$response);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 7.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 8.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 9.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n return;\r\n\r\n } \r\n\t\t\r\n\t\telse{\r\n $respuesta->codigo = 300;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo action valido.\";\r\n \r\n echo json_encode($respuesta);\r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\t\t\r\n } else{\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo action.\";\r\n \r\n echo json_encode($respuesta);\r\n\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n}\r\n\r\nelse{\r\n\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo tipo de dato reconocible en la solicitud.\";\r\n\r\n echo json_encode($respuesta);\r\n\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n}\r\n\r\n?>","file2":"format(\"Y-m-d H:i:s\");\r\n\tfile_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n}\r\n\r\n$logError = \"logs\/tilsor\/errores\";\r\n$logPeticion = \"logs\/tilsor\/enviado\";\r\n$logRespuesta = \"logs\/tilsor\/respuesta\";\r\n$urlLog = \"10.44.200.11\/iparkings_prod\/orm_pcs\/terminal_web\/tilsor.php\";\r\n\r\n$respuesta = (object)\r\n[\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n];\r\n\r\n$tipoDatoRecibido = $_SERVER['CONTENT_TYPE'];\r\n\r\nif($tipoDatoRecibido==\"application\/x-www-form-urlencoded\"){\r\n\r\n if(isset($_POST[\"action\"])){\r\n\r\n $action = $_POST[\"action\"];\r\n\r\n if($action==\"FE_Tilsor\"){\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\t\t\t\r\n\t\t\t$error = false;\r\n $msj = \"No recibo:\";\r\n\r\n if(isset($_POST[\"tipoCFE\"])){\r\n $tipoCFE = (integer)$_POST[\"tipoCFE\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" tipoCFE;\";\r\n }\r\n if(isset($_POST[\"MntTotal\"])){\r\n $MntTotal = (float)$_POST[\"MntTotal\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" MntTotal;\";\r\n }\r\n\t\t\t\/\/ if(isset($_POST[\"formaPago\"])){\r\n \/\/ $formaPago = $_POST[\"formaPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" formaPago;\";\r\n \/\/ }\r\n\t\t\t\/\/ if(isset($_POST[\"medioPago\"])){\r\n \/\/ $medioPago = $_POST[\"medioPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" medioPago;\";\r\n \/\/ }\r\n\t\t\tif(isset($_POST[\"idStay\"])){\r\n $idStay = $_POST[\"idStay\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" idStay;\";\r\n }\r\n\t\t\tif(isset($_POST[\"barcode\"])){\r\n $barcode = $_POST[\"barcode\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$barcode = \"\";\r\n\t\t\t}\r\n\t\t\tif(isset($_POST[\"horasEstadia\"])){\r\n $horasEstadia = $_POST[\"horasEstadia\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$horasEstadia = \"\";\r\n\t\t\t}\r\n\t\t\tif(isset($_POST[\"addAdenda\"])){\r\n $addAdenda = $_POST[\"addAdenda\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$addAdenda = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==111 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"rut\"])){\r\n\t\t\t\t\t$rut = $_POST[\"rut\"];\r\n\t\t\t\t\tif($rut==\"\"){\r\n\t\t\t\t\t\t$error = true;\r\n\t\t\t\t\t\t$msj = $msj.\" rut;\";\r\n\t\t\t\t\t}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" rut;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"social\"])){\r\n\t\t\t\t\t$social = $_POST[\"social\"];\r\n\t\t\t\t\tif($social==\"\"){$social=\"SIN RAZON SOCIAL\";}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" social;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"dir\"])){\r\n\t\t\t\t\t$dir = $_POST[\"dir\"];\r\n\t\t\t\t\tif($dir==\"\"){$dir=\"SIN DIRECCION\";}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" dir;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"ciudad\"])){\r\n\t\t\t\t\t$ciudad = $_POST[\"ciudad\"];\r\n\t\t\t\t\tif($ciudad==\"\"){$ciudad=\"SIN CIUDAD\";}\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" ciudad;\";\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==102 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"reference\"])){\r\n\t\t\t\t\t$reference = $_POST[\"reference\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" reference;\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n if($error==true){\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\t\t\t\r\n\t\t\t\/\/ $internalId = \"CAI-IP-WP2-$idStay\";\r\n\t\t\t\/\/ ORIGINAL, PREVIO MIGRACION 21-10-2025\r\n\t\t\t\/\/ $internalId = \"CAI-IP-$idStay\";\r\n\t\t\tif($tipoCFE==112 || $tipoCFE==102){\r\n\t\t\t\t$internalId = \"CAI-IP-NC-$idStay\";\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$internalId = \"CAI-IP-$idStay\";\r\n\t\t\t}\r\n\t\t\t\/\/ $internalId = \"CAI-IP-TEST-$idStay\";\r\n\t\t\t\r\n\t\t\t$emisor = '212991810011<\/RUCEmisor>Consorcio Aeropuertos InternacionalesS.A.<\/RznSoc><\/NomComercial><\/GiroEmis><\/Telefono><\/CorreoEmisor>PDP Corporate (Fc.AE<\/EmiSucursal>1<\/CdgDGISucur>Ruta 93 Km. 113 Laguna del Sauce Maldonado<\/DomFiscal>Punta del Este<\/Ciudad>Punta del Este<\/Departamento><\/Emisor>';\r\n\t\t\t\/\/ $OLDemisor = '214902340010<\/RUCEmisor>TCU S.A.<\/RznSoc>1<\/CdgDGISucur>Cno. Carrasco 0 y A. de las Americas<\/DomFiscal>Aeropuerto de Carrasco<\/Ciudad>Canelones<\/Departamento><\/Emisor>';\r\n\t\t\t\r\n\t\t\tif($tipoCFE==101 || $tipoCFE==102){\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==102){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>101<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eTck><\/CFE>';\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==112){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>111<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'2<\/TipoDocRecep>UY<\/CodPaisRecep>'.$rut.'<\/DocRecep>'.$social.'<\/RznSocRecep>'.$dir.'<\/DirRecep>'.$ciudad.'<\/CiudadRecep><\/Receptor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eFact><\/CFE>';\r\n\t\t\t}\r\n\r\n $data64 = base64_encode($data);\r\n\t\t\t\r\n\t\t\t$adenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\t$OLDadenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t\t'.\r\n\t\t\t\t\t\/\/ DÉBITO BANCARIO<\/tca:formaPago>\r\n\t\t\t\t\t\/\/ SCOTIABANK<\/tca:medioPago>\r\n\t\t\t\t\t''.$formaPago.'<\/tca:formaPago>\r\n\t\t\t\t\t'.$medioPago.'<\/tca:medioPago>\r\n\t\t\t\t\t11290<\/tca:usuario>'.\r\n\t\t\t\t\t\/\/ PDS-SF-1024687<\/tca:documentoTCU>\r\n\t\t\t\t\t''.$internalId.'<\/tca:documentoTCU>\r\n\t\t\t\t\tLACC - Ciudad Logística Internacional<\/tca:leyendaCommercial>\r\n\t\t\t\t<\/tca:datosExtraTCU>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\tif(isset($_POST[\"pos\"])){\r\n $pos = $_POST[\"pos\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$pos = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($pos!=\"\"){\r\n\t\t\t\t$print = \"FORCE_PRINT\";\r\n\t\t\t\t$printer = $pos;\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$print = \"DONT_PRINT\";\r\n\t\t\t\t$printer = \"TLASI005\";\r\n\t\t\t}\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>'.\r\n \/\/ SEMM<\/name>\r\n '<\/document>\r\n \r\n \r\n \r\n\t\t\t\t\t\t\t\t\tadenda<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$adenda.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.pdsSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n\t\t\t\t\t\t\r\n \r\n \r\n\t\t\t\t\t\t\t\t\torigin<\/key>\r\n\t\t\t\t\t\t\t\t\tIParking<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tnombreImpresora<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$printer.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tindImpresion<\/key>'.\r\n\t\t\t\t\t\t\t\t\t\/\/ FORCE_PRINT<\/value>\r\n\t\t\t\t\t\t\t\t\t''.$print.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tinternalId<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$internalId.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.pds.metadata.PDSMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\t\t\t\r\n\t\t\tsaveTXT($logPeticion, $send, $urlLog, $action);\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n \r\n $url = WSDL2;\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$responseOrig);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->internalId = $internalId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->sended = $send;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 1.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 2.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 3.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return;\r\n\r\n }\r\n\r\n else if($action==\"FE_Tilsor_test\"){\r\n\t\t\t\r\n\t\t\t\/\/ URLs testing\r\n\t\t\t\/\/ define(\"WSDL\",\"http:\/\/wlpool.stg.aic.carrasco.aero:9080\/aif\/ws\/InvoiceHandlingServices?wsdl\");\r\n\t\t\t\/\/ define(\"WSDL2\",\"http:\/\/wlpool.stg.aic.carrasco.aero:9080\/aif\/ws\/InvoiceHandlingServices\");\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\t\t\t\r\n\t\t\t$error = false;\r\n $msj = \"No recibo:\";\r\n\r\n if(isset($_POST[\"tipoCFE\"])){\r\n $tipoCFE = (integer)$_POST[\"tipoCFE\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" tipoCFE;\";\r\n }\r\n if(isset($_POST[\"MntTotal\"])){\r\n $MntTotal = (float)$_POST[\"MntTotal\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" MntTotal;\";\r\n }\r\n\t\t\t\/\/ if(isset($_POST[\"formaPago\"])){\r\n \/\/ $formaPago = $_POST[\"formaPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" formaPago;\";\r\n \/\/ }\r\n\t\t\t\/\/ if(isset($_POST[\"medioPago\"])){\r\n \/\/ $medioPago = $_POST[\"medioPago\"];\r\n \/\/ } else{\r\n \/\/ $error = true;\r\n \/\/ $msj = $msj.\" medioPago;\";\r\n \/\/ }\r\n\t\t\tif(isset($_POST[\"idStay\"])){\r\n $idStay = $_POST[\"idStay\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" idStay;\";\r\n }\r\n\t\t\tif(isset($_POST[\"barcode\"])){\r\n $barcode = $_POST[\"barcode\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$barcode = \"\";\r\n\t\t\t}\r\n\t\t\tif(isset($_POST[\"horasEstadia\"])){\r\n $horasEstadia = $_POST[\"horasEstadia\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$horasEstadia = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==111 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"rut\"])){\r\n\t\t\t\t\t$rut = $_POST[\"rut\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" rut;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"social\"])){\r\n\t\t\t\t\t$social = $_POST[\"social\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" social;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"dir\"])){\r\n\t\t\t\t\t$dir = $_POST[\"dir\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" dir;\";\r\n\t\t\t\t}\r\n\t\t\t\tif(isset($_POST[\"ciudad\"])){\r\n\t\t\t\t\t$ciudad = $_POST[\"ciudad\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" ciudad;\";\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($tipoCFE==102 || $tipoCFE==112){\r\n\t\t\t\tif(isset($_POST[\"reference\"])){\r\n\t\t\t\t\t$reference = $_POST[\"reference\"];\r\n\t\t\t\t} else{\r\n\t\t\t\t\t$error = true;\r\n\t\t\t\t\t$msj = $msj.\" reference;\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n if($error==true){\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\t\t\t\r\n\t\t\t\/\/ ORIGINAL 18-06-2025\r\n\t\t\t\t$internalId = \"CAI-IP-$idStay\";\r\n\t\t\t\t\r\n\t\t\t\t$emisor = '212991810011<\/RUCEmisor>Consorcio Aeropuertos InternacionalesS.A.<\/RznSoc><\/NomComercial><\/GiroEmis><\/Telefono><\/CorreoEmisor>PDP Corporate (Fc.AE<\/EmiSucursal>1<\/CdgDGISucur>Ruta 93 Km. 113 Laguna del Sauce Maldonado<\/DomFiscal>Punta del Este<\/Ciudad>Punta del Este<\/Departamento><\/Emisor>';\r\n\t\t\t\t\/\/ \/\/\/\/$OLDemisor = '214902340010<\/RUCEmisor>TCU S.A.<\/RznSoc>1<\/CdgDGISucur>Cno. Carrasco 0 y A. de las Americas<\/DomFiscal>Aeropuerto de Carrasco<\/Ciudad>Canelones<\/Departamento><\/Emisor>';\r\n\t\t\t\t\r\n\t\t\t\tif($tipoCFE==101 || $tipoCFE==102){\r\n\t\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eTck><\/CFE>';\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'2<\/TipoDocRecep>UY<\/CodPaisRecep>'.$rut.'<\/DocRecep>'.$social.'<\/RznSocRecep>'.$dir.'<\/DirRecep>'.$ciudad.'<\/CiudadRecep><\/Receptor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eFact><\/CFE>';\r\n\t\t\t\t}\r\n\t\t\t\/\/ ORIGINAL 18-06-2025\r\n\t\t\t\r\n\t\t\t$internalId = \"CAI-IP-$idStay\";\r\n\t\t\t\r\n\t\t\t$emisor = '212991810011<\/RUCEmisor>Consorcio Aeropuertos InternacionalesS.A.<\/RznSoc><\/NomComercial><\/GiroEmis><\/Telefono><\/CorreoEmisor>PDP Corporate (Fc.AE<\/EmiSucursal>1<\/CdgDGISucur>Ruta 93 Km. 113 Laguna del Sauce Maldonado<\/DomFiscal>Punta del Este<\/Ciudad>Punta del Este<\/Departamento><\/Emisor>';\r\n\t\t\t\/\/ $OLDemisor = '214902340010<\/RUCEmisor>TCU S.A.<\/RznSoc>1<\/CdgDGISucur>Cno. Carrasco 0 y A. de las Americas<\/DomFiscal>Aeropuerto de Carrasco<\/Ciudad>Canelones<\/Departamento><\/Emisor>';\r\n\t\t\t\r\n\t\t\tif($tipoCFE==101 || $tipoCFE==102){\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==102){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>101<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eTck><\/CFE>';\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$referencia = \"\";\r\n\t\t\t\tif($tipoCFE==112){\r\n\t\t\t\t\t$referencia = '1<\/NroLinRef>1<\/IndGlobal>111<\/TpoDocRef>A<\/Serie>'.$reference.'<\/NroCFERef>'.$reference.'<\/RazonRef>'.$fechaa.'<\/FechaCFEref><\/Referencia><\/Referencia>';\r\n\t\t\t\t}\r\n\t\t\t\t$data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>'.$emisor.'2<\/TipoDocRecep>UY<\/CodPaisRecep>'.$rut.'<\/DocRecep>'.$social.'<\/RznSocRecep>'.$dir.'<\/DirRecep>'.$ciudad.'<\/CiudadRecep><\/Receptor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>'.$MntTotal.'<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>0.00<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>0.00<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>10<\/IndFact>Parking<\/NomItem>'.$barcode.' Estadia: '.$horasEstadia.' <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntTotal.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntTotal.'<\/MontoItem><\/Item><\/Detalle>'.$referencia.'<\/eFact><\/CFE>';\r\n\t\t\t}\r\n\r\n \r\n\r\n $data64 = base64_encode($data);\r\n\t\t\t\r\n\t\t\t$adenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\t$OLDadenda = \r\n\t\t\t'\r\n\t\t\t\t\r\n\t\t\t\t\tI.V.A. AL DÍA<\/tca:constanciaIVA>\r\n\t\t\t\t\tRes. 252\/2015<\/tca:resolucion>\r\n\t\t\t\t\tPuede verificar comprobante en http:\/\/www.dgi.gub.uy\/<\/tca:verificarComprobante>\r\n\t\t\t\t<\/tca:leyendas>\r\n\t\t\t\t'.\r\n\t\t\t\t\t\/\/ DÉBITO BANCARIO<\/tca:formaPago>\r\n\t\t\t\t\t\/\/ SCOTIABANK<\/tca:medioPago>\r\n\t\t\t\t\t''.$formaPago.'<\/tca:formaPago>\r\n\t\t\t\t\t'.$medioPago.'<\/tca:medioPago>\r\n\t\t\t\t\t11290<\/tca:usuario>'.\r\n\t\t\t\t\t\/\/ PDS-SF-1024687<\/tca:documentoTCU>\r\n\t\t\t\t\t''.$internalId.'<\/tca:documentoTCU>\r\n\t\t\t\t\tLACC - Ciudad Logística Internacional<\/tca:leyendaCommercial>\r\n\t\t\t\t<\/tca:datosExtraTCU>\r\n\t\t\t<\/tca:datosAdenda>]]>';\r\n\t\t\t\r\n\t\t\tif(isset($_POST[\"pos\"])){\r\n $pos = $_POST[\"pos\"];\r\n }\r\n\t\t\telse{\r\n\t\t\t\t$pos = \"\";\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($pos!=\"\"){\r\n\t\t\t\t$print = \"FORCE_PRINT\";\r\n\t\t\t\t$printer = $pos;\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\t$print = \"DONT_PRINT\";\r\n\t\t\t\t$printer = \"TLASI005\";\r\n\t\t\t}\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>'.\r\n \/\/ SEMM<\/name>\r\n '<\/document>\r\n \r\n \r\n \r\n\t\t\t\t\t\t\t\t\tadenda<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$adenda.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.semmSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n\t\t\t\t\t\t\r\n \r\n \r\n\t\t\t\t\t\t\t\t\torigin<\/key>\r\n\t\t\t\t\t\t\t\t\tIParking<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tnombreImpresora<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$printer.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tindImpresion<\/key>'.\r\n\t\t\t\t\t\t\t\t\t\/\/ FORCE_PRINT<\/value>\r\n\t\t\t\t\t\t\t\t\t''.$print.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tinternalId<\/key>\r\n\t\t\t\t\t\t\t\t\t'.$internalId.'<\/value>\r\n\t\t\t\t\t\t\t\t<\/entry>\r\n <\/metadata>\r\n uy.com.tilsor.aif.plugins.pds.metadata.PDSMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\t\t\t\r\n\t\t\tsaveTXT($logPeticion, $send, $urlLog, $action);\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n\t\t\t\r\n\t\t\t\r\n \r\n $url = \"http:\/\/wlpool.stg.aic.carrasco.aero:9080\/aif\/ws\/InvoiceHandlingServices\";\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$responseOrig);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->internalId = $internalId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->sended = $send;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 1.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 2.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 3.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return;\r\n\r\n }\r\n\t\t\r\n\t\telse if($action==\"testXML\"){\r\n \r\n $response = '\r\n \r\n \r\n \r\n false<\/errors>\r\n \r\n 2024-09-24T17:24:53.936-03:00<\/createDate>\r\n CFE DGI<\/documentFormat>\r\n 3373569<\/documentId>\r\n 0000000000006543907whrwgyxwybpysmsnxrsengnyfkpyrkevav.bjkvv<\/documentNrc>\r\n \r\n CFE_STORED<\/statusName>\r\n <\/documentStatus>\r\n INVOICE_ISSUED<\/documentType>\r\n 1.0<\/formatVersion>\r\n Facturas Emitidas<\/internalPath>\r\n 281<\/cfeNumber>\r\n B<\/cfeRange>\r\n I4XeVFAXoF9NMI+HBOSNNqouxts=<\/hash>\r\n 2024-09-24T17:24:53.657-03:00<\/signatureTimestamp>\r\n <\/cfeInfo>\r\n <\/return>\r\n <\/ns2:invoiceReceptionResponse>\r\n <\/soap:Body>\r\n <\/soap:Envelope>';\r\n\r\n $response2 = '\r\n false<\/errors>\r\n \r\n 2024-09-24T17:24:53.936-03:00<\/createDate>\r\n CFE DGI<\/documentFormat>\r\n 3373569<\/documentId>\r\n 0000000000006543907whrwgyxwybpysmsnxrsengnyfkpyrkevav.bjkvv<\/documentNrc>\r\n \r\n CFE_STORED<\/statusName>\r\n <\/documentStatus>\r\n INVOICE_ISSUED<\/documentType>\r\n 1.0<\/formatVersion>\r\n Facturas Emitidas<\/internalPath>\r\n 281<\/cfeNumber>\r\n B<\/cfeRange>\r\n I4XeVFAXoF9NMI+HBOSNNqouxts=<\/hash>\r\n 2024-09-24T17:24:53.657-03:00<\/signatureTimestamp>\r\n <\/cfeInfo>\r\n <\/return>';\r\n\r\n $response = str_replace('','',$response);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n \/\/ echo print_r($response);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n\r\n \/\/ $envelope = simplexml_load_string($response);\r\n \/\/ $xml = simplexml_load_string($response);\r\n \/\/ $json = json_encode($xml);\r\n \/\/ $array = json_decode($json,TRUE);\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n \/\/ $soap = simplexml_load_string($response);\r\n \/\/ $test = $soap->children('http:\/\/schemas.xmlsoap.org\/soap\/envelope\/')->Body->children('http:\/\/services.cfehandlerws.tilsor.com.uy\/')->return;\r\n \/\/ $json2 = json_encode($test);\r\n \/\/ $array2 = json_decode($json2,TRUE);\r\n\r\n $errors = $array[\"return\"][\"errors\"];\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n \/\/ echo \"xml\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($xml);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"json\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($json);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"array\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($array);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"test\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($test);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"array2\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r($array2);\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo \"libxml_use_internal_errors\";\r\n \/\/ echo \"\\n\";\r\n \/\/ echo print_r(libxml_use_internal_errors());\r\n \/\/ echo json_encode($test->errors);\r\n\r\n }\r\n\r\n else{\r\n $respuesta->codigo = 300;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo action valido.\";\r\n \r\n echo json_encode($respuesta);\r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n }\r\n \r\n}\r\n\r\nelse if($tipoDatoRecibido==\"application\/json\"){\r\n\r\n $json = file_get_contents('php:\/\/input');\r\n\r\n $data = json_decode($json, true);\r\n\r\n if(isset($data[\"action\"])){\r\n $action = $data[\"action\"];\r\n\t\t\r\n\t\tif($action==\"FE_Tilsor\"){\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\t\t\t\r\n\t\t\t$error = false;\r\n $msj = \"No recibo:\";\r\n\r\n if(isset($_POST[\"tipoCFE\"])){\r\n $tipoCFE = (integer)$_POST[\"tipoCFE\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" tipoCFE;\";\r\n }\r\n if(isset($_POST[\"MntTotal\"])){\r\n $MntTotal = (float)$_POST[\"MntTotal\"];\r\n } else{\r\n $error = true;\r\n $msj = $msj.\" MntTotal;\";\r\n }\r\n\r\n if($error==true){\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\r\n $data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>212635920014<\/RUCEmisor>ALBINCO S.A<\/RznSoc>ALBINCO S.A<\/NomComercial><\/GiroEmis>2711.1000<\/Telefono><\/CorreoEmisor><\/EmiSucursal>3<\/CdgDGISucur>AV. AMERICO RICALDONI 2474<\/DomFiscal>MONTEVIDEO<\/Ciudad>MONTEVIDEO<\/Departamento><\/Emisor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>12408020860231 00 Dias 00 Horas 13 Minutos <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eTck><\/CFE>';\r\n\r\n $data64 = base64_encode($data);\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>\r\n SEMM<\/name>\r\n <\/document>\r\n \r\n '.\r\n \/\/ impresoraLocal<\/key>TKTPARK01<\/value><\/entry>\r\n \/\/ indImpresion<\/key>FORCE_PRINT<\/value><\/entry>\r\n \/\/ cantCopias<\/key>2<\/value><\/entry>\r\n 'indImpresion<\/key>DONT_PRINT<\/value><\/entry>\r\n\t\t\t\t\t\t\t\tinternalId<\/key>park356656<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.semm.metadata.SEMMMetadata<\/metadataType>\r\n <\/metadataList>\r\n \r\n \r\n adenda<\/key><![CDATA[<datosAdenda xmlns=\"http:\/\/tilsor.com.uy\/#SEMMAdenda\"><leyendas><constanciaIVA>IVA al dia<\/constanciaIVA><resolucion>Res. 897\/2014<\/resolucion><verificarComprobante>Puede verificar comprobante en https:\/\/www.semm.com.uy<\/verificarComprobante><\/leyendas><datosExtraSEMM><leyenda1><\/leyenda1><\/datosExtraSEMM><\/datosAdenda>]]><\/value><\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.semmSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\t\t\t\r\n\t\t\tsaveTXT($logPeticion, $send, $urlLog, $action);\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n \r\n $url = WSDL2;\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$responseOrig);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->internalId = $internalId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 4.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 5.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 6.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n return;\r\n\r\n }\r\n\t\t\r\n\t\telse if($action==\"FE_TilsorOLD\"){\r\n\r\n \/\/ $context = stream_context_create([\r\n \/\/ 'ssl' => [\r\n \/\/ 'verify_peer' => false,\r\n \/\/ 'verify_peer_name' => false,\r\n \/\/ 'allow_self_signed' => true\r\n \/\/ ]\r\n \/\/ ]);\r\n \r\n \/\/ $soap_options = [\r\n \/\/ 'uri' => 'http:\/\/schemas.xmlsoap.org\/soap\/envelope\/',\r\n \/\/ 'style' => SOAP_RPC,\r\n \/\/ 'use' => SOAP_ENCODED,\r\n \/\/ 'soap_version' => SOAP_1_1,\r\n \/\/ 'cache_wsdl' => WSDL_CACHE_NONE,\r\n \/\/ 'connection_timeout' => 15,\r\n \/\/ 'trace' => true,\r\n \/\/ 'encoding' => 'UTF-8',\r\n \/\/ 'exceptions' => true,\r\n \/\/ \/\/ 'login' => 'iparkings',\r\n \/\/ 'login' => 'interface',\r\n \/\/ \/\/ 'password' => 'c107fc16fc',\r\n \/\/ 'password' => 'e939ab8d828e7e0aea9092cbef4805890552eabc40f6267c13ad3b6934f4ba3d',\r\n \/\/ 'stream_context' => $context\r\n \/\/ ];\r\n\r\n \/\/ define(\"soap_options\",$soap_options);\r\n\r\n $fecha = new DateTime();\r\n $ano = $fecha->format(\"Y\");\r\n $mes = $fecha->format(\"m\");\r\n $dia = $fecha->format(\"d\");\r\n $fechaa = $ano.\"-\".$mes.\"-\".$dia;\r\n\r\n $tipoCFE = 101;\r\n\r\n $MntTotal = 80;\r\n $sinIVA = $MntTotal\/1.22;\r\n $MntNetoIVATasaBasica = number_format((float)$sinIVA, 2, '.', '');\r\n $IVA = $MntTotal-$sinIVA;\r\n $MntIVATasaBasica = number_format((float)$IVA, 2, '.', '');\r\n\r\n $data = ''.$tipoCFE.'<\/TipoCFE>'.$fechaa.'<\/FchEmis>1<\/FmaPago><\/IdDoc>212635920014<\/RUCEmisor>ALBINCO S.A<\/RznSoc>ALBINCO S.A<\/NomComercial><\/GiroEmis>2711.1000<\/Telefono><\/CorreoEmisor><\/EmiSucursal>3<\/CdgDGISucur>AV. AMERICO RICALDONI 2474<\/DomFiscal>MONTEVIDEO<\/Ciudad>MONTEVIDEO<\/Departamento><\/Emisor>UYU<\/TpoMoneda>0.00<\/MntNoGrv>0.00<\/MntExpoyAsim>0.00<\/MntImpuestoPerc>0.00<\/MntIVaenSusp>0.00<\/MntNetoIvaTasaMin>'.$MntNetoIVATasaBasica.'<\/MntNetoIVATasaBasica>0.00<\/MntNetoIVAOtra>10.00<\/IVATasaMin>22.00<\/IVATasaBasica>0.00<\/MntIVATasaMin>'.$MntIVATasaBasica.'<\/MntIVATasaBasica>0.00<\/MntIVAOtra>'.$MntTotal.'<\/MntTotal>0.00<\/MntTotRetenido>1<\/CantLinDet>0.00<\/MontoNF>'.$MntTotal.'<\/MntPagar><\/Totales><\/Encabezado>1<\/NroLinDet>3<\/IndFact>Parking<\/NomItem>12408020860231 00 Dias 00 Horas 13 Minutos <\/DscItem>1.00<\/Cantidad>N\/A<\/UniMed>'.$MntNetoIVATasaBasica.'<\/PrecioUnitario>0.00<\/DescuentoPct>0.00<\/DescuentoMonto>0.00<\/RecargoPct>0.00<\/RecargoMnt>'.$MntNetoIVATasaBasica.'<\/MontoItem><\/Item><\/Detalle><\/eTck><\/CFE>';\r\n\r\n $data64 = base64_encode($data);\r\n\r\n $send = \r\n '\r\n \r\n \r\n \r\n \r\n '.$data64.'<\/data>\r\n SEMM<\/name>\r\n <\/document>\r\n \r\n '.\r\n \/\/ impresoraLocal<\/key>TKTPARK01<\/value><\/entry>\r\n \/\/ indImpresion<\/key>FORCE_PRINT<\/value><\/entry>\r\n \/\/ cantCopias<\/key>2<\/value><\/entry>\r\n 'internalId<\/key>park356656<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.semm.metadata.SEMMMetadata<\/metadataType>\r\n <\/metadataList>\r\n \r\n \r\n adenda<\/key><![CDATA[<datosAdenda xmlns=\"http:\/\/tilsor.com.uy\/#SEMMAdenda\"><leyendas><constanciaIVA>IVA al dia<\/constanciaIVA><resolucion>Res. 897\/2014<\/resolucion><verificarComprobante>Puede verificar comprobante en https:\/\/www.semm.com.uy<\/verificarComprobante><\/leyendas><datosExtraSEMM><leyenda1><\/leyenda1><\/datosExtraSEMM><\/datosAdenda>]]><\/value><\/entry>\r\n factoryClass<\/key>uy.com.tilsor.aif.semmSchemas.adenda.AdendaFactory<\/value><\/entry>\r\n <\/metadata>\r\n 1<\/metadataId>\r\n uy.com.tilsor.aif.plugins.cfe.metadata.AdendaMetadata<\/metadataType>\r\n <\/metadataList>\r\n EP_EMISOR_CFE_ENTRADA<\/handler>\r\n <\/invoiceReception>\r\n <\/soap:Body>\r\n <\/soap:Envelope>\r\n ';\r\n\r\n $headers = array(\r\n \/\/ \"POST \/package\/package_1.3\/packageservices.asmx HTTP\/1.1\",\r\n \"Content-Type: application\/soap+xml; charset=utf-8\",\r\n \"Content-Length: \".strlen($send)\r\n ); \r\n \r\n $url = WSDL2;\r\n \r\n $ch = curl_init();\r\n curl_setopt($ch, CURLOPT_URL, $url);\r\n curl_setopt($ch, CURLOPT_POST, true);\r\n curl_setopt($ch, CURLOPT_POSTFIELDS, $send);\r\n curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\r\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n \r\n $responseOrig = curl_exec($ch); \r\n curl_close($ch);\r\n\r\n $response = str_replace('','',$response);\r\n $response = str_replace('','',$response);\r\n $response = str_replace('ns2:','',$response);\r\n $response = str_replace('<\/soap:Body>','',$response);\r\n $response = str_replace('<\/soap:Envelope>','',$response);\r\n \/\/ $response = str_replace(' xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"','',$response);\r\n $response = str_replace(' xmlns:ns2=\"http:\/\/services.cfehandlerws.tilsor.com.uy\/\"','',$response);\r\n\r\n $xml = simplexml_load_string($response, \"SimpleXMLElement\", LIBXML_NOCDATA);\r\n $json = json_encode($xml);\r\n $array = json_decode($json,TRUE);\r\n\r\n if(array_key_exists(\"return\",$array)){\r\n if(array_key_exists(\"errors\",$array[\"return\"])){\r\n $errors = $array[\"return\"][\"errors\"];\r\n \r\n if($errors==\"false\" || $errors == false){\r\n $createDate = $array[\"return\"][\"cfeInfo\"][\"createDate\"];\r\n $documentFormat = $array[\"return\"][\"cfeInfo\"][\"documentFormat\"];\r\n $documentId = $array[\"return\"][\"cfeInfo\"][\"documentId\"];\r\n $documentNrc = $array[\"return\"][\"cfeInfo\"][\"documentNrc\"];\r\n $statusName = $array[\"return\"][\"cfeInfo\"][\"documentStatus\"][\"statusName\"];\r\n $documentType = $array[\"return\"][\"cfeInfo\"][\"documentType\"];\r\n $formatVersion = $array[\"return\"][\"cfeInfo\"][\"formatVersion\"];\r\n $internalPath = $array[\"return\"][\"cfeInfo\"][\"internalPath\"];\r\n $cfeNumber = $array[\"return\"][\"cfeInfo\"][\"cfeNumber\"];\r\n $cfeRange = $array[\"return\"][\"cfeInfo\"][\"cfeRange\"];\r\n $hash = $array[\"return\"][\"cfeInfo\"][\"hash\"];\r\n $signatureTimestamp = $array[\"return\"][\"cfeInfo\"][\"signatureTimestamp\"];\r\n\r\n $respuesta->codigo = 0;\r\n $respuesta->error = \"Ok\";\r\n $respuesta->msj = \"Todo ok.\";\r\n $respuesta->createDate = $createDate;\r\n $respuesta->documentFormat = $documentFormat;\r\n $respuesta->documentId = $documentId;\r\n $respuesta->documentNrc = $documentNrc;\r\n $respuesta->statusName = $statusName;\r\n $respuesta->documentType = $documentType;\r\n $respuesta->formatVersion = $formatVersion;\r\n $respuesta->internalPath = $internalPath;\r\n $respuesta->cfeNumber = $cfeNumber;\r\n $respuesta->cfeRange = $cfeRange;\r\n $respuesta->hash = $hash;\r\n $respuesta->signatureTimestamp = $signatureTimestamp;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n else if($errors==\"true\" || $errors==true){\r\n if(array_key_exists(\"errorCode\",$array[\"return\"])){\r\n $errorCode = $array[\"return\"][\"errorCode\"];\r\n }\r\n if(array_key_exists(\"errorMsg\",$array[\"return\"])){\r\n $errorMsg = $array[\"return\"][\"errorMsg\"];\r\n }\r\n\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $errorMsg;\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logRespuesta, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n }\r\n \r\n else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 7.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 8.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n } else{\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Algo anduvo mal, chequear info 9.\";\r\n $respuesta->response = $response;\r\n\t\t\t\t$respuesta->responseOrig = $responseOrig;\r\n \r\n echo json_encode($respuesta);\r\n\t\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n \r\n return;\r\n\r\n } \r\n\t\t\r\n\t\telse{\r\n $respuesta->codigo = 300;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo action valido.\";\r\n \r\n echo json_encode($respuesta);\r\n\t\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\t\t\r\n } else{\r\n $respuesta->codigo = 400;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo action.\";\r\n \r\n echo json_encode($respuesta);\r\n\t\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n }\r\n\r\n}\r\n\r\nelse{\r\n\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No recibo tipo de dato reconocible en la solicitud.\";\r\n\r\n echo json_encode($respuesta);\r\n\tsaveTXT($logError, json_encode($respuesta), $urlLog, $action);\r\n return $respuesta;\r\n\r\n}\r\n\r\n?>"} Desde: APIs/Clientes/Aeropuertos/Aeroshop/save.php, Action: save, Fecha: 2025-10-29 17:13:35. Data: {"file1":"","file2":"pay()\";\r\n\t\t\r\n\t\t$respuesta = (object)\r\n\t\t[\r\n\t\t\t\"codigo\" => 0,\r\n\t\t\t\"error\" => \"Ok\",\r\n\t\t\t\"msj\" => \"Todo correcto.\"\r\n\t\t];\r\n\t\t\r\n\t\t$error = false;\r\n\t\t$msj = \"No recibo:\";\r\n\r\n\t\tif(!isset($tipoCFE)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" tipoCFE;\";\r\n\t\t}\r\n\t\tif(!isset($amount)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" amount;\";\r\n\t\t}\r\n\t\tif(!isset($idStay)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" idStay;\";\r\n\t\t}\r\n\r\n\t\tif($error==true){\r\n\t\t\t$respuesta->codigo = 400;\r\n\t\t\t$respuesta->error = \"Error\";\r\n\t\t\t$respuesta->msj = $msj;\r\n\r\n\t\t\techo json_encode($respuesta);\r\n\t\t\tsaveTXT($logTest, json_encode($respuesta), $urlLog, $action);\r\n\t\t\treturn $respuesta;\r\n\t\t}\r\n\t\t\r\n\t\tif($rut!=\"\"){\r\n\t\t\t\/\/ $social = strReplaceWith(\" \", \"%20\", $social);\r\n\t\t\t\/\/ $dir = strReplaceWith(\" \", \"%20\", $dir);\r\n\t\t\t\/\/ $ciudad = strReplaceWith(\" \", \"%20\", $ciudad);\r\n\t\t\t$send = \"action=FE_Tilsor&tipoCFE=$tipoCFE&MntTotal=$amount&idStay=$idStay&pos=$pos&rut=$rut&social=$social&dir=$dir&ciudad=$ciudad&reference=$reference&horasEstadia=$horasEstadia&addAdenda=$addAdenda\";\t\t\t\r\n\t\t}\r\n\t\telse{\r\n\t\t\t$send = \"action=FE_Tilsor&tipoCFE=$tipoCFE&MntTotal=$amount&idStay=$idStay&pos=$pos&reference=$reference&horasEstadia=$horasEstadia&addAdenda=$addAdenda\";\r\n\t\t}\r\n\t\t\r\n\t\t$curl = curl_init();\r\n\r\n\t\tcurl_setopt_array($curl, array(\r\n\t\t CURLOPT_URL => 'http:\/\/10.44.200.11\/iparkings_prod\/orm_pcs\/terminal_web\/tilsorTEST.php',\r\n\t\t CURLOPT_RETURNTRANSFER => true,\r\n\t\t CURLOPT_ENCODING => '',\r\n\t\t CURLOPT_MAXREDIRS => 10,\r\n\t\t CURLOPT_TIMEOUT => 0,\r\n\t\t CURLOPT_FOLLOWLOCATION => true,\r\n\t\t CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\r\n\t\t CURLOPT_CUSTOMREQUEST => 'POST',\r\n\t\t \/\/ CURLOPT_POSTFIELDS => 'action=FE_Tilsor&tipoCFE=111&MntTotal=1&formaPago=Contado&medioPago=Efectivo&idStay=2&rut=215293970018&social=COROB%20S.A.&dir=Cerrito%20532%20-%20Oficina%20101&ciudad=Montevideo',\r\n\t\t CURLOPT_POSTFIELDS => $send,\r\n\t\t CURLOPT_HTTPHEADER => array(\r\n\t\t\t'Content-Type: application\/x-www-form-urlencoded'\r\n\t\t ),\r\n\t\t));\r\n\r\n\t\t$response = curl_exec($curl);\r\n\r\n\t\tcurl_close($curl);\r\n\t\t$responseTilsor = (object)json_decode($response,true);\r\n\t\t\r\n\t\t\/\/ $responde->response = $response;\r\n\t\t\/\/ $responde->typeOf = gettype($response);\r\n\t\t$respuesta->response = $responseTilsor;\r\n\t\t$respuesta->typeOf = gettype($responseTilsor);\r\n\t\t\r\n\t\treturn $respuesta;\r\n\t\t\r\n\t}\r\n\t\r\n}\r\n\r\nif(isset($_GET[\"test\"])){\r\n\t$tilsor = new Tilsor();\r\n\t$pay = $tilsor->pay(101, 1, 4);\r\n\techo json_encode($pay);\r\n}\r\n\r\n?>"} Desde: APIs/Clientes/Aeropuertos/Aeroshop/save.php, Action: save, Fecha: 2025-10-29 17:23:57. Data: {"file1":" 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n $error = false;\r\n $msj = \"\";\r\n\t$fecha = new DateTime();\r\n\t$fecha = $fecha->format(\"Y-m-d H:i:s\");\r\n\r\n $dir = explode(\"\/\",$file)[0];\r\n if (!is_dir($dir)) {\r\n $error = true;\r\n $msj = $msj . \"El directorio no existe; \";\r\n }\r\n\t\r\n\tif(!file_exists($file.\".txt\")){\r\n\t\t$handle = fopen($file.\".txt\", 'w');\r\n\t\tif($handle === false){\r\n\t\t\t$error_data = error_get_last();\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj . \"No se pudo crear el archivo. \" . $error_data['message'];\r\n\t\t}\r\n\t\tfclose($handle);\r\n\t}\r\n\r\n if (is_writable($file.\".txt\")) {\r\n $escritura = file_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n } else {\r\n $error = true;\r\n $msj = $msj . \"El archivo no es escribible; \";\r\n }\r\n\t\/\/ $escritura = file_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n\r\n if ($escritura === false) {\r\n $error = true;\r\n $msj = $msj . \"Error al escribir en el archivo; \";\r\n }\r\n\r\n if($error==true){\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n }\r\n\r\n $respuesta->info = [$file, $data, $urlFrom, $action];\r\n\r\n return $respuesta;\r\n}\r\n\r\nfunction guardarArchivoPDF($base64_string, $nombre_archivo) {\r\n\r\n $respuesta = (object)\r\n [\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n \/\/ Decodificar el string base64\r\n $base64_decoded = base64_decode($base64_string, true); \/\/ true para validar base64 válido\r\n if ($base64_decoded === false) {\r\n \/\/ Error de decodificación base64\r\n $respuesta->codigo = 1;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Error al decodificar el string base64. El formato no es válido.\";\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Verificar si la ruta del archivo es válida\r\n $directorio = dirname($nombre_archivo);\r\n if (!is_dir($directorio)) {\r\n \/\/ Si el directorio no existe, intentamos crearlo\r\n if (!mkdir($directorio, 0777, true)) {\r\n $respuesta->codigo = 2;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No se puede crear el directorio: $directorio.\";\r\n return $respuesta;\r\n }\r\n }\r\n\r\n $disk_free = disk_free_space($directorio);\r\n $file_size = strlen($base64_decoded);\r\n\r\n if($disk_free < $file_size){\r\n $respuesta->codigo = 5;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No hay suficiente espacio en el disco para guardar el PDF.\";\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Intentar escribir el archivo\r\n $resultado = file_put_contents($nombre_archivo, $base64_decoded);\r\n\r\n if ($resultado === false) {\r\n \/\/ Error al escribir el archivo\r\n $error = error_get_last();\r\n $respuesta->codigo = 3;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No se pudo escribir el archivo: $nombre_archivo. Error: \" . $error['message'];\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Verificar si el archivo se escribió correctamente (verificando su tamaño)\r\n if (filesize($nombre_archivo) === 0) {\r\n $respuesta->codigo = 4;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"El archivo $nombre_archivo está vacío después de escribir.\";\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Si todo salió bien, devolver true\r\n return $respuesta;\r\n}\r\n\r\nfunction savePDF($file, $data){\r\n\r\n if(is_array($data)){\r\n $data = json_encode($data, JSON_UNESCAPED_UNICODE);\r\n }\r\n\r\n if(is_object($data)){\r\n $data = json_encode($data, JSON_UNESCAPED_UNICODE);\r\n }\r\n\r\n $respuesta = (object)\r\n [\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n $error = false;\r\n $msj = \"\";\r\n\t$fecha = new DateTime();\r\n\t$fecha = $fecha->format(\"Y-m-d H:i:s\");\r\n\r\n $dir = explode(\"\/\",$file)[0];\r\n if (!is_dir($dir)) {\r\n $error = true;\r\n $msj = $msj . \"El directorio no existe; \";\r\n }\r\n\r\n return guardarArchivoPDF($data, $file);\r\n \r\n $pdf = base64_decode($data);\r\n $escritura = file_put_contents($file.\".pdf\",$pdf);\r\n $respuesta->info = [$file, $data];\r\n return $respuesta;\r\n\r\n if (is_writable($file)) {\r\n $pdf = base64_decode($data);\r\n $escritura = file_put_contents($file.\".pdf\",$pdf);\r\n } else {\r\n $error = true;\r\n $msj = $msj . \"El archivo no es escribible; \";\r\n }\r\n\t\/\/ $escritura = file_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n\r\n if ($escritura === false) {\r\n $error = true;\r\n $msj = $msj . \"Error al escribir en el archivo; \";\r\n }\r\n\r\n if($error==true){\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n }\r\n\r\n $respuesta->info = [$file, $data];\r\n\r\n return $respuesta;\r\n}\r\n\r\nfunction saveQR($data, $invoice_number, $parking){\r\n\r\n $respuesta = (object)\r\n [\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n $fecha = new DateTime();\r\n $hoy = $fecha->format('Y-m-d_H:i:s');\r\n $nameFile = $invoice_number.\"-\".$hoy;\r\n include_once \"phpqrcode-master\/qrlib.php\";\r\n \r\n \/\/file path\r\n \/\/ require $_SERVER['DOCUMENT_ROOT'] . \"\/iparkings\/orm_pcs\/terminal_web\/fiserv\/pinpad.php\";\r\n \/\/ $file = \"..\/..\/terminal_autopago_fiserv_pdfs\/$nameFile.png\";\r\n $directorio = $_SERVER['DOCUMENT_ROOT'] . \"\/iparkings\/terminal_autopago_fiserv_pdfs\/idParking_$parking\"; \/\/ Define la ruta del directorio\r\n\r\n \/\/ Comprobar si el directorio ya existe\r\n if (!is_dir($directorio)) {\r\n \/\/ Si no existe, crear el directorio\r\n if (!mkdir($directorio, 0777, true)) {\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error.\";\r\n $respuesta->msj = \"No se pudo crear el directorio $directorio.\";\r\n return $respuesta;\r\n }\r\n }\r\n\r\n $file = $_SERVER['DOCUMENT_ROOT'] . \"\/iparkings\/terminal_autopago_fiserv_pdfs\/idParking_$parking\/$nameFile.png\";\r\n $urlQR = \"http:\/\/34.57.109.122\/iparkings\/terminal_autopago_fiserv_pdfs\/idParking_$parking\/$nameFile.png\";\r\n \/\/ QRcode::png($token, $file,'H',20,5);\r\n \/\/ sleep(2);\r\n $maxRetries = 20;\r\n $retryDelay = 1; \/\/ En segundos\r\n $isFileCreated = false;\r\n\r\n if (file_exists($file) && filesize($file) > 0) {\r\n $isFileCreated = true;\r\n }\r\n else{\r\n QRcode::png($data, $file,'H',20,5);\r\n \/\/ sleep(2);\r\n for ($i = 0; $i < $maxRetries; $i++) {\r\n if (file_exists($file) && filesize($file) > 0) {\r\n $isFileCreated = true;\r\n break;\r\n }\r\n sleep($retryDelay);\r\n }\r\n }\r\n\r\n if(!$isFileCreated==true){\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error.\";\r\n $respuesta->msj = \"No se pudo generar el QR.\";\r\n return $respuesta;\r\n }\r\n\r\n $respuesta->URL = $urlQR;\r\n return $respuesta;\r\n}\r\n\r\n?>","file2":"pay()\";\r\n\t\t\r\n\t\t$respuesta = (object)\r\n\t\t[\r\n\t\t\t\"codigo\" => 0,\r\n\t\t\t\"error\" => \"Ok\",\r\n\t\t\t\"msj\" => \"Todo correcto.\"\r\n\t\t];\r\n\t\t\r\n\t\t$error = false;\r\n\t\t$msj = \"No recibo:\";\r\n\r\n\t\tif(!isset($tipoCFE)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" tipoCFE;\";\r\n\t\t}\r\n\t\tif(!isset($amount)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" amount;\";\r\n\t\t}\r\n\t\tif(!isset($idStay)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" idStay;\";\r\n\t\t}\r\n\r\n\t\tif($error==true){\r\n\t\t\t$respuesta->codigo = 400;\r\n\t\t\t$respuesta->error = \"Error\";\r\n\t\t\t$respuesta->msj = $msj;\r\n\r\n\t\t\techo json_encode($respuesta);\r\n\t\t\tsaveTXT($logTest, json_encode($respuesta), $urlLog, $action);\r\n\t\t\treturn $respuesta;\r\n\t\t}\r\n\t\t\r\n\t\tif($rut!=\"\"){\r\n\t\t\t\/\/ $social = strReplaceWith(\" \", \"%20\", $social);\r\n\t\t\t\/\/ $dir = strReplaceWith(\" \", \"%20\", $dir);\r\n\t\t\t\/\/ $ciudad = strReplaceWith(\" \", \"%20\", $ciudad);\r\n\t\t\t$send = \"action=FE_Tilsor&tipoCFE=$tipoCFE&MntTotal=$amount&idStay=$idStay&pos=$pos&rut=$rut&social=$social&dir=$dir&ciudad=$ciudad&reference=$reference&horasEstadia=$horasEstadia&addAdenda=$addAdenda\";\t\t\t\r\n\t\t}\r\n\t\telse{\r\n\t\t\t$send = \"action=FE_Tilsor&tipoCFE=$tipoCFE&MntTotal=$amount&idStay=$idStay&pos=$pos&reference=$reference&horasEstadia=$horasEstadia&addAdenda=$addAdenda\";\r\n\t\t}\r\n\t\t\r\n\t\t$curl = curl_init();\r\n\r\n\t\tcurl_setopt_array($curl, array(\r\n\t\t CURLOPT_URL => 'http:\/\/10.44.200.11\/iparkings_prod\/orm_pcs\/terminal_web\/tilsorTEST.php',\r\n\t\t CURLOPT_RETURNTRANSFER => true,\r\n\t\t CURLOPT_ENCODING => '',\r\n\t\t CURLOPT_MAXREDIRS => 10,\r\n\t\t CURLOPT_TIMEOUT => 0,\r\n\t\t CURLOPT_FOLLOWLOCATION => true,\r\n\t\t CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\r\n\t\t CURLOPT_CUSTOMREQUEST => 'POST',\r\n\t\t \/\/ CURLOPT_POSTFIELDS => 'action=FE_Tilsor&tipoCFE=111&MntTotal=1&formaPago=Contado&medioPago=Efectivo&idStay=2&rut=215293970018&social=COROB%20S.A.&dir=Cerrito%20532%20-%20Oficina%20101&ciudad=Montevideo',\r\n\t\t CURLOPT_POSTFIELDS => $send,\r\n\t\t CURLOPT_HTTPHEADER => array(\r\n\t\t\t'Content-Type: application\/x-www-form-urlencoded'\r\n\t\t ),\r\n\t\t));\r\n\r\n\t\t$response = curl_exec($curl);\r\n\r\n\t\tcurl_close($curl);\r\n\t\t$responseTilsor = (object)json_decode($response,true);\r\n\t\t\r\n\t\t\/\/ $responde->response = $response;\r\n\t\t\/\/ $responde->typeOf = gettype($response);\r\n\t\t$respuesta->response = $responseTilsor;\r\n\t\t$respuesta->typeOf = gettype($responseTilsor);\r\n\t\t\r\n\t\treturn $respuesta;\r\n\t\t\r\n\t}\r\n\t\r\n}\r\n\r\nif(isset($_GET[\"test\"])){\r\n\t$tilsor = new Tilsor();\r\n\t$pay = $tilsor->pay(101, 1, 4);\r\n\techo json_encode($pay);\r\n}\r\n\r\n?>"} Desde: APIs/Clientes/Aeropuertos/Aeroshop/save.php, Action: save, Fecha: 2025-10-29 17:27:21. Data: {"file1":" 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n $error = false;\r\n $msj = \"\";\r\n\t$fecha = new DateTime();\r\n\t$fecha = $fecha->format(\"Y-m-d H:i:s\");\r\n\r\n $dir = explode(\"\/\",$file)[0];\r\n if (!is_dir($dir)) {\r\n $error = true;\r\n $msj = $msj . \"El directorio no existe; \";\r\n }\r\n\t\r\n\tif(!file_exists($file.\".txt\")){\r\n\t\t$handle = fopen($file.\".txt\", 'w');\r\n\t\tif($handle === false){\r\n\t\t\t$error_data = error_get_last();\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj . \"No se pudo crear el archivo. \" . $error_data['message'];\r\n\t\t}\r\n\t\tfclose($handle);\r\n\t}\r\n\r\n if (is_writable($file.\".txt\")) {\r\n $escritura = file_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n } else {\r\n $error = true;\r\n $msj = $msj . \"El archivo no es escribible; \";\r\n }\r\n\t\/\/ $escritura = file_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n\r\n if ($escritura === false) {\r\n $error = true;\r\n $msj = $msj . \"Error al escribir en el archivo; \";\r\n }\r\n\r\n if($error==true){\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n }\r\n\r\n $respuesta->info = [$file, $data, $urlFrom, $action];\r\n\r\n return $respuesta;\r\n}\r\n\r\nfunction guardarArchivoPDF($base64_string, $nombre_archivo) {\r\n\r\n $respuesta = (object)\r\n [\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n \/\/ Decodificar el string base64\r\n $base64_decoded = base64_decode($base64_string, true); \/\/ true para validar base64 válido\r\n if ($base64_decoded === false) {\r\n \/\/ Error de decodificación base64\r\n $respuesta->codigo = 1;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"Error al decodificar el string base64. El formato no es válido.\";\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Verificar si la ruta del archivo es válida\r\n $directorio = dirname($nombre_archivo);\r\n if (!is_dir($directorio)) {\r\n \/\/ Si el directorio no existe, intentamos crearlo\r\n if (!mkdir($directorio, 0777, true)) {\r\n $respuesta->codigo = 2;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No se puede crear el directorio: $directorio.\";\r\n return $respuesta;\r\n }\r\n }\r\n\r\n $disk_free = disk_free_space($directorio);\r\n $file_size = strlen($base64_decoded);\r\n\r\n if($disk_free < $file_size){\r\n $respuesta->codigo = 5;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No hay suficiente espacio en el disco para guardar el PDF.\";\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Intentar escribir el archivo\r\n $resultado = file_put_contents($nombre_archivo, $base64_decoded);\r\n\r\n if ($resultado === false) {\r\n \/\/ Error al escribir el archivo\r\n $error = error_get_last();\r\n $respuesta->codigo = 3;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"No se pudo escribir el archivo: $nombre_archivo. Error: \" . $error['message'];\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Verificar si el archivo se escribió correctamente (verificando su tamaño)\r\n if (filesize($nombre_archivo) === 0) {\r\n $respuesta->codigo = 4;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = \"El archivo $nombre_archivo está vacío después de escribir.\";\r\n return $respuesta;\r\n }\r\n\r\n \/\/ Si todo salió bien, devolver true\r\n return $respuesta;\r\n}\r\n\r\nfunction savePDF($file, $data){\r\n\r\n if(is_array($data)){\r\n $data = json_encode($data, JSON_UNESCAPED_UNICODE);\r\n }\r\n\r\n if(is_object($data)){\r\n $data = json_encode($data, JSON_UNESCAPED_UNICODE);\r\n }\r\n\r\n $respuesta = (object)\r\n [\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n $error = false;\r\n $msj = \"\";\r\n\t$fecha = new DateTime();\r\n\t$fecha = $fecha->format(\"Y-m-d H:i:s\");\r\n\r\n $dir = explode(\"\/\",$file)[0];\r\n if (!is_dir($dir)) {\r\n $error = true;\r\n $msj = $msj . \"El directorio no existe; \";\r\n }\r\n\r\n return guardarArchivoPDF($data, $file);\r\n \r\n $pdf = base64_decode($data);\r\n $escritura = file_put_contents($file.\".pdf\",$pdf);\r\n $respuesta->info = [$file, $data];\r\n return $respuesta;\r\n\r\n if (is_writable($file)) {\r\n $pdf = base64_decode($data);\r\n $escritura = file_put_contents($file.\".pdf\",$pdf);\r\n } else {\r\n $error = true;\r\n $msj = $msj . \"El archivo no es escribible; \";\r\n }\r\n\t\/\/ $escritura = file_put_contents($file.\".txt\",\"\\nData: \".$data.\"\\nDesde: \".$urlFrom.\", Action: \".$action.\", Fecha: \".$fecha.\".\\n\", FILE_APPEND);\r\n\r\n if ($escritura === false) {\r\n $error = true;\r\n $msj = $msj . \"Error al escribir en el archivo; \";\r\n }\r\n\r\n if($error==true){\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error\";\r\n $respuesta->msj = $msj;\r\n }\r\n\r\n $respuesta->info = [$file, $data];\r\n\r\n return $respuesta;\r\n}\r\n\r\nfunction saveQR($data, $invoice_number, $parking){\r\n\r\n $respuesta = (object)\r\n [\r\n \"codigo\" => 0,\r\n \"error\" => \"Ok\",\r\n \"msj\" => \"Todo correcto.\"\r\n ];\r\n\r\n $fecha = new DateTime();\r\n $hoy = $fecha->format('Y-m-d_H:i:s');\r\n $nameFile = $invoice_number.\"-\".$hoy;\r\n include_once \"phpqrcode-master\/qrlib.php\";\r\n \r\n \/\/file path\r\n \/\/ require $_SERVER['DOCUMENT_ROOT'] . \"\/iparkings\/orm_pcs\/terminal_web\/fiserv\/pinpad.php\";\r\n \/\/ $file = \"..\/..\/terminal_autopago_fiserv_pdfs\/$nameFile.png\";\r\n $directorio = $_SERVER['DOCUMENT_ROOT'] . \"\/iparkings\/terminal_autopago_fiserv_pdfs\/idParking_$parking\"; \/\/ Define la ruta del directorio\r\n\r\n \/\/ Comprobar si el directorio ya existe\r\n if (!is_dir($directorio)) {\r\n \/\/ Si no existe, crear el directorio\r\n if (!mkdir($directorio, 0777, true)) {\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error.\";\r\n $respuesta->msj = \"No se pudo crear el directorio $directorio.\";\r\n return $respuesta;\r\n }\r\n }\r\n\r\n $file = $_SERVER['DOCUMENT_ROOT'] . \"\/iparkings\/terminal_autopago_fiserv_pdfs\/idParking_$parking\/$nameFile.png\";\r\n $urlQR = \"http:\/\/34.57.109.122\/iparkings\/terminal_autopago_fiserv_pdfs\/idParking_$parking\/$nameFile.png\";\r\n \/\/ QRcode::png($token, $file,'H',20,5);\r\n \/\/ sleep(2);\r\n $maxRetries = 20;\r\n $retryDelay = 1; \/\/ En segundos\r\n $isFileCreated = false;\r\n\r\n if (file_exists($file) && filesize($file) > 0) {\r\n $isFileCreated = true;\r\n }\r\n else{\r\n QRcode::png($data, $file,'H',20,5);\r\n \/\/ sleep(2);\r\n for ($i = 0; $i < $maxRetries; $i++) {\r\n if (file_exists($file) && filesize($file) > 0) {\r\n $isFileCreated = true;\r\n break;\r\n }\r\n sleep($retryDelay);\r\n }\r\n }\r\n\r\n if(!$isFileCreated==true){\r\n $respuesta->codigo = 500;\r\n $respuesta->error = \"Error.\";\r\n $respuesta->msj = \"No se pudo generar el QR.\";\r\n return $respuesta;\r\n }\r\n\r\n $respuesta->URL = $urlQR;\r\n return $respuesta;\r\n}\r\n\r\n?>","file2":"pay()\";\r\n\t\t\r\n\t\t$respuesta = (object)\r\n\t\t[\r\n\t\t\t\"codigo\" => 0,\r\n\t\t\t\"error\" => \"Ok\",\r\n\t\t\t\"msj\" => \"Todo correcto.\"\r\n\t\t];\r\n\t\t\r\n\t\t$error = false;\r\n\t\t$msj = \"No recibo:\";\r\n\r\n\t\tif(!isset($tipoCFE)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" tipoCFE;\";\r\n\t\t}\r\n\t\tif(!isset($amount)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" amount;\";\r\n\t\t}\r\n\t\tif(!isset($idStay)){\r\n\t\t\t$error = true;\r\n\t\t\t$msj = $msj.\" idStay;\";\r\n\t\t}\r\n\r\n\t\tif($error==true){\r\n\t\t\t$respuesta->codigo = 400;\r\n\t\t\t$respuesta->error = \"Error\";\r\n\t\t\t$respuesta->msj = $msj;\r\n\r\n\t\t\techo json_encode($respuesta);\r\n\t\t\tsaveTXT($logTest, json_encode($respuesta), $urlLog, $action);\r\n\t\t\treturn $respuesta;\r\n\t\t}\r\n\t\t\r\n\t\tif($rut!=\"\"){\r\n\t\t\t\/\/ $social = strReplaceWith(\" \", \"%20\", $social);\r\n\t\t\t\/\/ $dir = strReplaceWith(\" \", \"%20\", $dir);\r\n\t\t\t\/\/ $ciudad = strReplaceWith(\" \", \"%20\", $ciudad);\r\n\t\t\t$send = \"action=FE_Tilsor&tipoCFE=$tipoCFE&MntTotal=$amount&idStay=$idStay&pos=$pos&rut=$rut&social=$social&dir=$dir&ciudad=$ciudad&reference=$reference&horasEstadia=$horasEstadia&addAdenda=$addAdenda\";\t\t\t\r\n\t\t}\r\n\t\telse{\r\n\t\t\t$send = \"action=FE_Tilsor&tipoCFE=$tipoCFE&MntTotal=$amount&idStay=$idStay&pos=$pos&reference=$reference&horasEstadia=$horasEstadia&addAdenda=$addAdenda\";\r\n\t\t}\r\n\t\t\r\n\t\t$curl = curl_init();\r\n\r\n\t\tcurl_setopt_array($curl, array(\r\n\t\t CURLOPT_URL => 'http:\/\/10.44.200.11\/iparkings_prod\/orm_pcs\/terminal_web\/tilsorTEST.php',\r\n\t\t CURLOPT_RETURNTRANSFER => true,\r\n\t\t CURLOPT_ENCODING => '',\r\n\t\t CURLOPT_MAXREDIRS => 10,\r\n\t\t CURLOPT_TIMEOUT => 0,\r\n\t\t CURLOPT_FOLLOWLOCATION => true,\r\n\t\t CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\r\n\t\t CURLOPT_CUSTOMREQUEST => 'POST',\r\n\t\t \/\/ CURLOPT_POSTFIELDS => 'action=FE_Tilsor&tipoCFE=111&MntTotal=1&formaPago=Contado&medioPago=Efectivo&idStay=2&rut=215293970018&social=COROB%20S.A.&dir=Cerrito%20532%20-%20Oficina%20101&ciudad=Montevideo',\r\n\t\t CURLOPT_POSTFIELDS => $send,\r\n\t\t CURLOPT_HTTPHEADER => array(\r\n\t\t\t'Content-Type: application\/x-www-form-urlencoded'\r\n\t\t ),\r\n\t\t));\r\n\r\n\t\t$response = curl_exec($curl);\r\n\r\n\t\tcurl_close($curl);\r\n\t\t$responseTilsor = (object)json_decode($response,true);\r\n\t\t\r\n\t\t\/\/ $responde->response = $response;\r\n\t\t\/\/ $responde->typeOf = gettype($response);\r\n\t\t$respuesta->response = $responseTilsor;\r\n\t\t$respuesta->typeOf = gettype($responseTilsor);\r\n\t\t\r\n\t\treturn $respuesta;\r\n\t\t\r\n\t}\r\n\t\r\n}\r\n\r\nif(isset($_GET[\"test\"])){\r\n\t$tilsor = new Tilsor();\r\n\t$pay = $tilsor->pay(101, 1, 4);\r\n\techo json_encode($pay);\r\n}\r\n\r\n?>"} Desde: APIs/Clientes/Aeropuertos/Aeroshop/save.php, Action: save, Fecha: 2025-11-02 14:31:19.