From 48590a7dff1d58e5eb8f33ba254d59fdd6e0b459 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Wed, 28 Aug 2019 00:44:14 -0700 Subject: [PATCH] Added update() to getService() on Windows --- microscript/ILibDuktape_Polyfills.c | 25 +++++++++--------- modules/service-manager.js | 41 ++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 2fb1df4..85bc5e0 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1961,18 +1961,19 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('linux-dbus', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnRyeSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICJwZWVrIiwgeyB2YWx1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMubGVuZ3RoID4gMCA/IHRoaXNbdGhpcy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZCk7IH0gfSk7IH0gY2F0Y2ggKGUpIHsgfQoKCgpmdW5jdGlvbiBkYnVzKGFkZHJlc3MsIHVpZCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnbGludXgtZGJ1cyc7CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnc2lnbmFsJyk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgInVpZCIsIHsgdmFsdWU6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCIvYmluL3NoIiwgWyJzaCJdLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0sIHVpZDogdWlkID09IG51bGwgPyAtMSA6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkLnN0ZGluLndyaXRlKCdkYnVzLW1vbml0b3IgLS1zZXNzaW9uICJ0eXBlPVwnc2lnbmFsXCcsIGludGVyZmFjZT1cJycgKyBhZGRyZXNzICsgJ1wnIiB8ICggd2hpbGUgcmVhZCBYOyBkbyBlY2hvICIkWCI7IGRvbmUgKVxuJyk7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQuZGJ1cyA9IHRoaXM7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspCiAgICB7CiAgICAgICAgLy8gUGFyc2UgREJVUyBEYXRhCiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KSB7IHRoaXMucmVhZHkgPSB0cnVlOyByZXR1cm47IH0KCiAgICAgICAgdmFyIGxpbmVzID0gW107CiAgICAgICAgdmFyIHRva2VucyA9IGNodW5rLnRvU3RyaW5nKCkuc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHZhciBpIGluIHRva2VucykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0b2tlbnNbaV0gPT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEVuZCBvZiByZWNvcmQKICAgICAgICAgICAgICAgIHRoaXMuZGJ1cy5wcmVQYXJzZVJlY29yZHMobGluZXMpOwogICAgICAgICAgICAgICAgbGluZXMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxpbmVzLnB1c2godG9rZW5zW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgdGhpcy5wcmVQYXJzZVJlY29yZHMgPSBmdW5jdGlvbiAobGluZXMpCiAgICB7CiAgICAgICAgdmFyIHJlY29yZCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgaW4gbGluZXMpCiAgICAgICAgewogICAgICAgICAgICBpZihsaW5lc1tpXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKHJlY29yZC5sZW5ndGg+MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVjb3JkID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVjb3JkLnB1c2gobGluZXNbaV0pOwogICAgICAgIH0KICAgICAgICBpZiAocmVjb3JkLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMucGFyc2VSZWNvcmRzID0gZnVuY3Rpb24gKGxpbmVzKQogICAgewogICAgICAgIGlmIChsaW5lc1swXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2lnbmFsID0ge307CiAgICAgICAgICAgIHZhciBzaWd0b2tlbnMgPSBsaW5lc1swXS5zcGxpdCgnICcpOwogICAgICAgICAgICBzaWd0b2tlbnMuc2hpZnQoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc2lndG9rZW5zKSB7CiAgICAgICAgICAgICAgICB2YXIgc2lnaXRlbXMgPSBzaWd0b2tlbnNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgIGlmIChzaWdpdGVtcy5sZW5ndGggPT0gMikgewogICAgICAgICAgICAgICAgICAgIHNpZ25hbFtzaWdpdGVtc1swXV0gPSBzaWdpdGVtc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGluZXMuc2hpZnQoKTsKICAgICAgICAgICAgc2lnbmFsLmRhdGEgPSBsaW5lczsKCiAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwoc2lnbmFsKTsKICAgICAgICB9CiAgICB9CiAgICB0aGlzLnBhcnNlU2lnbmFsID0gZnVuY3Rpb24oc2lnbmFsKQogICAgewogICAgICAgIHZhciBkYXRhID0gc2lnbmFsLmRhdGE7CiAgICAgICAgc2lnbmFsLmRhdGEgPSBbXTsKCiAgICAgICAgZm9yKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkYXRhW2ldLnN0YXJ0c1dpdGgoJ2FycmF5ICcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaWduYWwuZGF0YS5wdXNoKFtdKTsKICAgICAgICAgICAgICAgIGZvcihpPWkrMTsgaTxkYXRhLmxlbmd0aDsgKytpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwyKGRhdGFbaV0sIHNpZ25hbC5kYXRhLnBlZWsoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU2lnbmFsMihkYXRhW2ldLCBzaWduYWwuZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuZW1pdCgnc2lnbmFsJywgc2lnbmFsKTsKICAgIH0KICAgIHRoaXMucGFyc2VTaWduYWwyID0gZnVuY3Rpb24gKGlucHV0U3RyLCBvdXRBcnJheSkKICAgIHsKICAgICAgICBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdzdHJpbmcgJykpCiAgICAgICAgewogICAgICAgICAgICBvdXRBcnJheS5wdXNoKEpTT04ucGFyc2UoaW5wdXRTdHIuc2xpY2UoNykpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdib29sZWFuICcpKQogICAgICAgIHsKICAgICAgICAgICAgb3V0QXJyYXkucHVzaChKU09OLnBhcnNlKGlucHV0U3RyLnNsaWNlKDgpKSk7CiAgICAgICAgfQogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IGRidXM7Cm1vZHVsZS5leHBvcnRzLmhhc1NlcnZpY2UgPSBmdW5jdGlvbiBoYXNTZXJ2aWNlKG5hbWUpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9zaGFyZS9kYnVzLTEvc2VydmljZXMvKi5zZXJ2aWNlIHwgZ3JlcCAiJyArIG5hbWUgKyAnIiB8IGF3ayAtRj0gXCd7IGlmKCAkMj09IicgKyBuYW1lICsgJyIgKSB7IHByaW50ICQyOyB9IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKTsNCn07Cv==', 'base64').toString());"); duk_peval_string_noresult(ctx, "addModule('linux-gnome-helpers', Buffer.from('DQoNCmZ1bmN0aW9uIGdub21lX2dldFByb3h5U2V0dGluZ3ModWlkKQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgeyBlbnY6IHsgSE9NRTogcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIodWlkKSB9fSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIGxpc3QtcmVjdXJzaXZlbHkgb3JnLmdub21lLnN5c3RlbS5wcm94eSB8IHRyICJcXG4iICJcXHwiIHwgdHIgIlxcXCciICJcXGAiIHwgYXdrIFwneyBjb3VudD1zcGxpdCgkMCwgcmVzLCAifCIpOycpDQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2ZvcihhPTA7YTxjb3VudDsrK2EpJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3snKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3BsaXQocmVzW2FdLCBtb2RlY2hlY2ssICIgIik7Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lmKG1vZGVjaGVja1syXSA9PSAibW9kZSIpJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3snKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3BsaXQobW9kZWNoZWNrWzNdLCBwcngsICJgIik7IG1vZGUgPSBwcnhbMl07Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ30nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaWYobW9kZWNoZWNrWzFdPT0ib3JnLmdub21lLnN5c3RlbS5wcm94eS5odHRwIiAmJiBtb2RlY2hlY2tbMl09PSJob3N0IikgeyBzcGxpdChtb2RlY2hlY2tbM10sIGhzdCwgImAiKTsgaG9zdCA9IGhzdFsyXTsgfScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpZihtb2RlY2hlY2tbMV09PSJvcmcuZ25vbWUuc3lzdGVtLnByb3h5Lmh0dHAiICYmIG1vZGVjaGVja1syXT09InBvcnQiKSB7IHBvcnQgPSBtb2RlY2hlY2tbM107IH0nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnfScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdwcmludGYgIntcXCJtb2RlXFwiOiBcXCIlc1xcIiwgXFwiaG9zdFxcIjogXFwiJXNcXCIsIFxcInBvcnRcXCI6ICVzfSIsIG1vZGUsIGhvc3QsIHBvcnQ7IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICANCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgIH0NCiAgICBjYXRjaChlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICh7fSk7DQogICAgfQ0KfQ0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBnZXRQcm94eVNldHRpbmdzOiBnbm9tZV9nZXRQcm94eVNldHRpbmdzIH0NCiAgICAgICAgYnJlYWs7DQp9', 'base64').toString());"); #endif - char *_servicemanager = ILibMemory_Allocate(243735, 0, NULL, NULL); - memcpy_s(_servicemanager + 0, 139276, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7CgoKZnVuY3Rpb24gZXh0cmFjdEZpbGVOYW1lKGZpbGVQYXRoKQp7CiAgICBpZiAodHlwZW9mIChmaWxlUGF0aCkgPT0gJ3N0cmluZycpCiAgICB7CiAgICAgICAgdmFyIHRva2VucyA9IGZpbGVQYXRoLnNwbGl0KCdcXCcpLmpvaW4oJy8nKS5zcGxpdCgnLycpOwogICAgICAgIHZhciBuYW1lOwoKICAgICAgICB3aGlsZSAoKG5hbWUgPSB0b2tlbnMucG9wKCkpID09ICcnKTsKICAgICAgICByZXR1cm4gKG5hbWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldHVybihmaWxlUGF0aC5uZXdOYW1lKQogICAgfQp9CmZ1bmN0aW9uIGV4dHJhY3RGaWxlU291cmNlKGZpbGVQYXRoKQp7CiAgICByZXR1cm4gKHR5cGVvZiAoZmlsZVBhdGgpID09ICdzdHJpbmcnID8gZmlsZVBhdGggOiBmaWxlUGF0aC5zb3VyY2UpOwp9CgpmdW5jdGlvbiBwYXJzZVNlcnZpY2VTdGF0dXModG9rZW4pCnsKICAgIHZhciBqID0ge307CiAgICB2YXIgc2VydmljZVR5cGUgPSB0b2tlbi5EZXJlZigwLCA0KS5JbnRWYWw7CiAgICBqLmlzRmlsZVN5c3RlbURyaXZlciA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKTsKICAgIGouaXNLZXJuZWxEcml2ZXIgPSAoKHNlcnZpY2VUeXBlICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSk7CiAgICBqLmlzU2hhcmVkUHJvY2VzcyA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKTsKICAgIGouaXNPd25Qcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApOwogICAgai5pc0ludGVyYWN0aXZlID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApOwogICAgai53YWl0SGludCA9IHRva2VuLkRlcmVmKCg2ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBzd2l0Y2ggKHRva2VuLkRlcmVmKCgxICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpCiAgICB7CiAgICAgICAgY2FzZSAweDAwMDAwMDA1OgogICAgICAgICAgICBqLnN0YXRlID0gJ0NPTlRJTlVFX1BFTkRJTkcnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDY6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUEFVU0VfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwNzoKICAgICAgICAgICAgai5zdGF0ZSA9ICdQQVVTRUQnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDQ6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUlVOTklORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMjoKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVEFSVF9QRU5ESU5HJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAwMDAwMDAzOgogICAgICAgICAgICBqLnN0YXRlID0gJ1NUT1BfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMToKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVE9QUEVEJzsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICB2YXIgY29udHJvbHNBY2NlcHRlZCA9IHRva2VuLkRlcmVmKCgyICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBqLmNvbnRyb2xzQWNjZXB0ZWQgPSBbXTsKICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApCiAgICB7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EQUREJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EUkVNT1ZFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERU5BQkxFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERElTQUJMRScpOwogICAgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwOCkgPT0gMHgwMDAwMDAwOCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BBUkFNQ0hBTkdFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMDIpID09IDB4MDAwMDAwMDIpIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QQVVTRScpOyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0NPTlRJTlVFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QUkVTSFVURE9XTicpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDA0KSA9PSAweDAwMDAwMDA0KSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0hVVERPV04nKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1NUT1AnKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAyMCkgPT0gMHgwMDAwMDAyMCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0hBUkRXQVJFUFJPRklMRUNIQU5HRScpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDQwKSA9PSAweDAwMDAwMDQwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVCcpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDgwKSA9PSAweDAwMDAwMDgwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0VTU0lPTkNIQU5HRScpOyB9CiAgICBqLnBpZCA9IHRva2VuLkRlcmVmKCg3ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICByZXR1cm4gKGopOwp9CgppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKewogICAgZnVuY3Rpb24gZ2V0T1NWZXJzaW9uKCkKICAgIHsKICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN3X3ZlcnMgfCBncmVwIFByb2R1Y3RWZXJzaW9uIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAvL2NoaWxkLnN0ZG91dC5zdHIgPSAnMTAuOSc7CgogICAgICAgIHZhciByZXQgPSB7IHJhdzogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJy4nKSwgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLnJhdy5qb2luKCcuJykpOyB9IH07CiAgICAgICAgcmV0LmNvbXBhcmVUbyA9IGZ1bmN0aW9uIGNvbXBhcmVUbyh2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmF3ID0gKHR5cGVvZiAodmFsKSA9PSAnc3RyaW5nJykgPyB2YWwuc3BsaXQoJy4nKSA6IHZhbC5yYXc7IGlmICghcmF3KSB7IHRocm93ICgnSW52YWxpZCBwYXJhbWV0ZXInKTsgfQogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMucmF3LmpvaW4oJy4nKS5zcGxpdCgnLicpOwoKICAgICAgICAgICAgdmFyIHIgPSBudWxsLCBzID0gbnVsbDsKICAgICAgICAgICAgd2hpbGUgKHNlbGYubGVuZ3RoID4gMCAmJiByYXcubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcyA9IHBhcnNlSW50KHNlbGYuc2hpZnQoKSk7IHIgPSBwYXJzZUludChyYXcuc2hpZnQoKSk7CiAgICAgICAgICAgICAgICBpZiAocyA8IHIpIHsgcmV0dXJuICgtMSk7IH0KICAgICAgICAgICAgICAgIGlmIChzID4gcikgeyByZXR1cm4gKDEpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGYubGVuZ3RoID09IHJhdy5sZW5ndGgpIHsgcmV0dXJuICgwKTsgfQogICAgICAgICAgICBpZiAoc2VsZi5sZW5ndGggPCByYXcubGVuZ3RoKSB7IHJldHVybiAoLTEpOyB9IGVsc2UgeyByZXR1cm4gKDEpOyB9ICAgIAogICAgICAgIH0KICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9OwoKCiAgICBmdW5jdGlvbiBmZXRjaFBsaXN0KGZvbGRlciwgbmFtZSwgdXNlcmlkKQogICAgewogICAgICAgIGlmIChmb2xkZXIuZW5kc1dpdGgoJy8nKSkgeyBmb2xkZXIgPSBmb2xkZXIuc3Vic3RyaW5nKDAsIGZvbGRlci5sZW5ndGggLSAxKTsgfQogICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH0sIF91aWQ6IHVzZXJpZCB9OwogICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgewogICAgICAgICAgICAvLyBCZWZvcmUgd2UgdGhyb3cgaW4gdGhlIHRvd2VsLCBsZXQncyBlbnVtZXJhdGUgYWxsIHRoZSBwbGlzdCBmaWxlcywgYW5kIHNlZSBpZiBvbmUgaGFzIGEgbWF0Y2hpbmcgbGFiZWwKICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhmb2xkZXIpOwogICAgICAgICAgICBmb3IgKHZhciBmaWxlIGluIGZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgZm9sZGVyICsgJy8nICsgZmlsZXNbZmlsZV0gKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09IG5hbWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0Lm5hbWUgPSBmaWxlc1tmaWxlXS5lbmRzV2l0aCgnLnBsaXN0JykgPyBmaWxlc1tmaWxlXS5zdWJzdHJpbmcoMCwgZmlsZXNbZmlsZV0ubGVuZ3RoIC0gNikgOiBmaWxlc1tmaWxlXTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnYWxpYXMnLCB7IHZhbHVlOiBuYW1lIH0pOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIGZpbGVzW2ZpbGVdIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXQubmFtZSA9PSBuYW1lKSB7IHRocm93ICgnICcgKyAoZm9sZGVyLnNwbGl0KCdMYXVuY2hEYWVtb24nKS5sZW5ndGg+MSA/ICdMYXVuY2hEYWVtb24nIDogJ0xhdW5jaEFnZW50JykgKyAnICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOyB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JyB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2FsaWFzJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnZGFlbW9uJywgeyB2YWx1ZTogcmV0LnBsaXN0LnNwbGl0KCcvTGF1bmNoRGFlbW9ucy8nKS5sZW5ndGggPiAxID8gdHJ1ZSA6IGZhbHNlIH0pOwoKICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+V29ya2luZ0RpcmVjdG9yeTwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8L3N0cmluZz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPHN0cmluZz5cIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLmVuZHNXaXRoKCcvJykgPyBjaGlsZC5zdGRvdXQuc3RyLnN1YnN0cmluZygwLCBjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCAtIDEpIDogY2hpbGQuc3Rkb3V0LnN0cik7CiAgICAgICAgfTsKICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICB9OwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdfcnVuQXRMb2FkJywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2VlIGlmIHRoaXMgaXMgYW4gQXV0by1TdGFydGluZyBzZXJ2aWNlLCBpbiBvcmRlciB0byBmaWd1cmUgb3V0IGhvdyB0byBpbXBsZW1lbnQgJ3N0YXJ0JwogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+UnVuQXRMb2FkPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIi8+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxcIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkudG9VcHBlckNhc2UoKSA9PSAiVFJVRSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnc3RhcnRUeXBlJywKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYWVtb24pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5fcnVuQXRMb2FkID8gJ0FVVE9fU1RBUlQnIDogJ0RFTUFORF9TVEFSVCcpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnQVVUT19TVEFSVCcpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgIl9rZWVwQWxpdmUiLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7c3BsaXQoJDAsIGEsIFwiPGtleT5LZWVwQWxpdmU8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPFwiKTsgc3BsaXQoYlsyXSwgYywgXCI+XCIpOyAiKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiIGlmKGNbMV09PVwiZGljdFwiKXsgc3BsaXQoYVsyXSwgZCwgXCI8L2RpY3Q+XCIpOyBpZihzcGxpdChkWzFdLCB0cnV2YWwsIFwiPHRydWUvPlwiKT4xKSB7IHNwbGl0KHRydXZhbFsxXSwga24xLCBcIjxrZXk+XCIpOyBzcGxpdChrbjFbMl0sIGtuMiwgXCI8L2tleT5cIik7IHByaW50IGtuMlsxXTsgfSB9Iik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIiBlbHNlIHsgc3BsaXQoY1sxXSwga2EsIFwiL1wiKTsgaWYoa2FbMV09PVwidHJ1ZVwiKSB7cHJpbnQgXCJBTFdBWVNcIjt9IH0gfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIHJldC5nZXRQSUQgPSBmdW5jdGlvbiBnZXRQSUQodWlkLCBhc1N0cmluZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgY29tbWFuZDsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQoKICAgICAgICAgICAgaWYgKGdldE9TVmVyc2lvbigpLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAibGF1bmNoY3RsIGxpc3QgfCBncmVwICciICsgdGhpcy5hbGlhcyArICInIHwgYXdrICd7IGlmKCQzPT1cIiIgKyB0aGlzLmFsaWFzICsgIlwiKXtwcmludCAkMTt9fSdcbmV4aXRcbiI7CiAgICAgICAgICAgICAgICBvcHRpb25zID0geyB1aWQ6IHVpZCB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHVpZCA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHByaW50IHN5c3RlbSB8IGdyZXAgIicgKyB0aGlzLmFsaWFzICsgJyIgfCBhd2sgXCd7IGlmKHNwbGl0KCQwLCB0bXAsICIgIik9PTMpIHsgaWYoJDM9PSInICsgdGhpcy5hbGlhcyArICciKSB7IHByaW50ICQxOyB9IH19XCdcbmV4aXRcbic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdsYXVuY2hjdGwgcHJpbnQgZ3VpLycgKyB1aWQgKyAnIHwgZ3JlcCAiJyArIHRoaXMuYWxpYXMgKyAnIiB8IGF3ayBcJ3sgaWYoc3BsaXQoJDAsIHRtcCwgIiAiKT09MykgeyBpZigkMz09IicgKyB0aGlzLmFsaWFzICsgJyIpIHsgcHJpbnQgJDE7IH0gfX1cJ1xuZXhpdFxuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywg", 16000); - memcpy_s(_servicemanager + 16000, 123276, "WydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGNvbW1hbmQpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgaWYgKGFzU3RyaW5nID09IG51bGwgfHwgYXNTdHJpbmcgIT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldC5pc0xvYWRlZCA9IGZ1bmN0aW9uIGlzTG9hZGVkKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFBJRCh1aWQsIHRydWUpICE9ICcnKTsKICAgICAgICB9OwogICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcodWlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UElEKHVpZCkgPiAwKTsKICAgICAgICB9OwogICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSh1aWQpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRQSUQodWlkKSA9PSBwcm9jZXNzLnBpZCk7CiAgICAgICAgfTsKICAgICAgICByZXQubG9hZCA9IGZ1bmN0aW9uIGxvYWQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpOwogICAgICAgICAgICB2YXIgdmVyID0gZ2V0T1NWZXJzaW9uKCk7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgY29tbWFuZCA9ICdsb2FkJzsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGFlbW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZih1aWQhPW51bGwgfHwgdWlkIT0wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnTGF1bmNoRGFlbW9uIG11c3QgcnVuIGFzIHJvb3QnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1aWQgPT0gbnVsbCkgeyB1aWQgPSBzZWxmOyB9CiAgICAgICAgICAgICAgICBpZih2ZXIuY29tcGFyZVRvKCcxMC4xMCcpIDwgMCAmJiB1aWQgIT0gc2VsZiAmJiBzZWxmICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdPbiB0aGlzIHZlcnNpb24gb2YgTWFjT1MsIG11c3QgYmUgcm9vdCB0byBsb2FkIHRoaXMgc2VydmljZSBpbnRvIHRoZSBzcGVjaWZpZWQgdXNlciBzcGFjZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmVyLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2Jvb3RzdHJhcCBndWkvJyArIHVpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsICcgKyBjb21tYW5kICsgJyAnICsgdGhpcy5wbGlzdCArICdcblxleGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICB9OwogICAgICAgIHJldC51bmxvYWQgPSBmdW5jdGlvbiB1bmxvYWQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gbnVsbDsKICAgICAgICAgICAgdmFyIHYgPSBnZXRPU1ZlcnNpb24oKTsKICAgICAgICAgICAgdmFyIHNlbGYgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpOwogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIHVzZUJvb3RvdXQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQoKICAgICAgICAgICAgaWYodWlkIT1udWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodi5jb21wYXJlVG8oJzEwLjEwJykgPD0gMCAmJiBzZWxmID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBzd2l0Y2ggdG8gdXNlciBjb250ZXh0IHRvIHVubG9hZCB0aGUgc2VydmljZQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7IHVpZDogdWlkIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYodi5jb21wYXJlVG8oJzEwLjEwJykgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VsZiA9PSAwIHx8IHNlbGYgPT0gdWlkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYm9vdG91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN1ZmZpY2llbnQgYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmID09IHVpZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCB1bmxvYWQsIGJlY3Vhc2Ugd2UgYXJlIGFscmVhZHkgaW4gdGhlIHJpZ2h0IGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3VmZmljaWVudCBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnTmVlZHMgZWxldmF0ZWQgcHJpdmlsZWdlcycpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihzZWxmID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYodi5jb21wYXJlVG8oJzEwLjEwJykgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGJvb3RvdXQKICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgdW5sb2FkCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gSW5zdWZmaWNpZW50IGFjY2VzcwogICAgICAgICAgICAgICAgICAgIHRocm93ICgnTmVlZHMgZWxldmF0ZWQgcHJpdmlsZWdlcycpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBpZiAodXNlQm9vdG91dCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBib290b3V0IGd1aS8nICsgdWlkICsgJyAnICsgdGhpcy5wbGlzdCArICdcbmV4aXRcbicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCB1bmxvYWQgJyArIHRoaXMucGxpc3QgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgIH07CiAgICAgICAgcmV0LnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHNlbGY7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPiAwICYmIHNlbGYgPT0gMCkgeyBvcHRpb25zID0geyB1aWQ6IHVpZCB9OyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmICE9IDAgJiYgdWlkICE9IHNlbGYpIHsgdGhyb3cgKCdDYW5ub3Qgc3RhcnQgTGF1bmNoQWdlbnQgaW50byBhbm90aGVyIHVzZXIgZG9tYWluIHdoaWxlIG5vdCByb290Jyk7IH0KICAgICAgICAgICAgaWYgKHRoaXMuZGFlbW9uICYmIHNlbGYgIT0gMCkgeyB0aHJvdyAoJ0Nhbm5vdCBzdGFydCBMYXVuY2hEYWVtb24gd2hpbGUgbm90IHJvb3QnKTsgfQoKICAgICAgICAgICAgdGhpcy5sb2FkKHVpZCk7CgogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIG9wdGlvbnMpOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgc3RhcnQgJyArIHRoaXMuYWxpYXMgKyAnXG5cZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgfTsKICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHNlbGY7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPiAwICYmIHNlbGYgPT0gMCkgeyBvcHRpb25zID0geyB1aWQ6IHVpZCB9OyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmICE9IDAgJiYgdWlkICE9IHNlbGYpIHsgdGhyb3cgKCdDYW5ub3Qgc3RvcCBMYXVuY2hBZ2VudCBpbiBhbm90aGVyIHVzZXIgZG9tYWluIHdoaWxlIG5vdCByb290Jyk7IH0KICAgICAgICAgICAgaWYgKHRoaXMuZGFlbW9uICYmIHNlbGYgIT0gMCkgeyB0aHJvdyAoJ0Nhbm5vdCBzdG9wIExhdW5jaERhZW1vbiB3aGlsZSBub3Qgcm9vdCcpOyB9CgogICAgICAgICAgICBpZiAoISh0aGlzLl9rZWVwQWxpdmUgPT0gJ0NyYXNoZWQnIHx8IHRoaXMuX2tlZXBBbGl2ZSA9PSAnJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgdW5sb2FkIHRoZSBzZXJ2aWNlLCByYXRoZXIgdGhhbiBzdG9wcGluZyBpdCwgYmVjYXVzZSBvdGhlcndpc2UgaXQnbGwgbGlrZWx5IHJlc3RhcnQKICAgICAgICAgICAgICAgIHRoaXMudW5sb2FkKHVpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgc3RvcCAnICsgdGhpcy5hbGlhcyArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgaWYgKGdldE9TVmVyc2lvbigpLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID09IG51bGwpIHsgdWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsgfQogICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHVubG9hZCAnICsgdGhpcy5wbGlzdCArICdcbmxhdW5jaGN0bCBsb2FkICcgKyB0aGlzLnBsaXN0ICsgJ1xubGF1bmNoY3RsIHN0YXJ0ICcgKyB0aGlzLmFsaWFzICsgJ1xuZXhpdFxuJzsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgeyBkZXRhY2hlZDogdHJ1ZSwgdWlkOiB1aWQgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoY29tbWFuZCk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSB0aGlzLmRhZW1vbiA/ICgnc3lzdGVtLycgKyB0aGlzLmFsaWFzKSA6ICgnZ3VpLycgKyAodWlkICE9IG51bGwgPyB1aWQgOiByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpKSArICcvJyArIHRoaXMuYWxpYXMpOwogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIGtpY2tzdGFydCAtayAnICsgY29tbWFuZCArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfTsKfQoKCgpmdW5jdGlvbiBzZXJ2aWNlTWFuYWdlcigpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3NlcnZpY2UtbWFuYWdlcic7CiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKSAKICAgIHsKICAgICAgICB0aGlzLkdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICAgICAgdGhpcy5wcm94eSA9IHRoaXMuR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0FkdmFwaTMyLmRsbCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdPcGVuU0NNYW5hZ2VyQScpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdFbnVtU2VydmljZXNTdGF0dXNFeFcnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnT3BlblNlcnZpY2VXJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZVN0YXR1c0V4Jyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZUNvbmZpZ0EnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnUXVlcnlTZXJ2aWNlQ29uZmlnMkEnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ29udHJvbFNlcnZpY2UnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnU3RhcnRTZXJ2aWNlQScpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdDbG9zZVNlcnZpY2VIYW5kbGUnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ3JlYXRlU2VydmljZVcnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ2hhbmdlU2VydmljZUNvbmZpZzJXJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0RlbGV0ZVNlcnZpY2UnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NoZWNrVG9rZW5NZW1iZXJzaGlwJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0ZyZWVTaWQnKTsKCiAgICAgICAgdGhpcy5wcm94eTIgPSB0aGlzLkdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsKICAgICAgICB0aGlzLnByb3h5Mi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwoKICAgICAgICB0aGlzLmlzQWRtaW4gPSBmdW5jdGlvbiBpc0FkbWluKCkgewogICAgICAgICAgICB2YXIgTlRBdXRob3JpdHkgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDYpOwogICAgICAgICAgICBOVEF1dGhvcml0eS50b0J1ZmZlcigpLndyaXRlSW50OCg1LCA1KTsKICAgICAgICAgICAgdmFyIEFkbWluaXN0cmF0b3JzR3JvdXAgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGFkbWluID0gZmFsc2U7CgogICAgICAgICAgICBpZiAodGhpcy5wcm94eS5BbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoTlRBdXRob3JpdHksIDIsIDMyLCA1NDQsIDAsIDAsIDAsIDAsIDAsIDAsIEFkbWluaXN0cmF0b3JzR3JvdXApLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5HTS5DcmVhdGVJbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5DaGVja1Rva2VuTWVtYmVyc2hpcCgwLCBBZG1pbmlzdHJhdG9yc0dyb3VwLkRlcmVmKCksIG1lbWJlcikuVmFsICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlci50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpICE9IDApIHsgYWRtaW4gPSB0cnVlOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnByb3h5LkZyZWVTaWQoQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWRtaW47CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldFByb2dyYW1Gb2xkZXIgPSBmdW5jdGlvbiBnZXRQcm9ncmFtRm9sZGVyKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gNjQgYml0IFdpbmRvd3MKICAgICAgICAgICAgICAgIGlmICh0aGlzLkdNLlBvaW50ZXJTaXplID09IDQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMoeDg2KSddOyAgICAvLyAzMiBCaXQgQXBwCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMnXTsgICAgICAgICAgICAgLy8gNjQgYml0IEFwcAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAzMiBiaXQgV2luZG93cwogICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ1Byb2dyYW1GaWxlcyddOyAgICAgICAgICAgICAgICAgCiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldFNlcnZpY2VGb2xkZXIgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlRm9sZGVyKCkgeyByZXR1cm4gdGhpcy5nZXRQcm9ncmFtRm9sZGVyKCkgKyAnXFxtZXNoJzsgfTsKCiAgICAgICAgdGhpcy5lbnVtZXJhdGVTZXJ2aWNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbWFjaGluZU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGRiTmFtZSA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgaGFuZGxlID0gdGhpcy5wcm94eS5PcGVuU0NNYW5hZ2VyQSgweDAwLCAweDAwLCAweDAwMDEgfCAweDAwMDQpOwoKICAgICAgICAgICAgdmFyIGJ5dGVzTmVlZGVkID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBzZXJ2aWNlc1JldHVybmVkID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciByZXN1bWVIYW5kbGUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50", 16000); - memcpy_s(_servicemanager + 32000, 107276, "ZXIoKTsKICAgICAgICAgICAgLy92YXIgc2VydmljZXMgPSB0aGlzLnByb3h5LkNyZWF0ZVZhcmlhYmxlKDI2MjE0NCk7CiAgICAgICAgICAgIHZhciBzdWNjZXNzID0gdGhpcy5wcm94eS5FbnVtU2VydmljZXNTdGF0dXNFeFcoaGFuZGxlLCAwLCAweDAwMDAwMDMwLCAweDAwMDAwMDAzLCAweDAwLCAweDAwLCBieXRlc05lZWRlZCwgc2VydmljZXNSZXR1cm5lZCwgcmVzdW1lSGFuZGxlLCAweDAwKTsKCiAgICAgICAgICAgIHZhciBwdHJTaXplID0gZGJOYW1lLl9zaXplOwogICAgICAgICAgICB2YXIgc3ogPSBieXRlc05lZWRlZC5EZXJlZigwLCBkYk5hbWUuX3NpemUpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CgogICAgICAgICAgICBpZiAoc3ogPCAwKSB7IHRocm93ICgnZXJyb3IgZW51bWVyYXRpbmcgc2VydmljZXMnKTsgfQoKICAgICAgICAgICAgdmFyIHNlcnZpY2VzID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShzeik7CiAgICAgICAgICAgIHRoaXMucHJveHkuRW51bVNlcnZpY2VzU3RhdHVzRXhXKGhhbmRsZSwgMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAwMywgc2VydmljZXMsIHN6LCBieXRlc05lZWRlZCwgc2VydmljZXNSZXR1cm5lZCwgcmVzdW1lSGFuZGxlLCAweDAwKTsKCiAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSAzNiArICgyICogcHRyU2l6ZSk7CiAgICAgICAgICAgIGJsb2NrU2l6ZSArPSAoKHB0clNpemUgLSAoYmxvY2tTaXplICUgcHRyU2l6ZSkpICUgcHRyU2l6ZSk7CiAgICAgICAgICAgIHZhciByZXRWYWwgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlc1JldHVybmVkLkRlcmVmKDAsIGRiTmFtZS5fc2l6ZSkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsgKytpKQp7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBzZXJ2aWNlcy5EZXJlZihpICogYmxvY2tTaXplLCBibG9ja1NpemUpOwogICAgICAgICAgICAgICAgdmFyIGogPSB7fTsKICAgICAgICAgICAgICAgIGoubmFtZSA9IHRva2VuLkRlcmVmKDAsIHB0clNpemUpLkRlcmVmKCkuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgai5kaXNwbGF5TmFtZSA9IHRva2VuLkRlcmVmKHB0clNpemUsIHB0clNpemUpLkRlcmVmKCkuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgai5zdGF0dXMgPSBwYXJzZVNlcnZpY2VTdGF0dXModG9rZW4uRGVyZWYoMiAqIHB0clNpemUsIDM2KSk7CiAgICAgICAgICAgICAgICByZXRWYWwucHVzaChqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUobmFtZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICB2YXIgcHRyID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUocHRyLl9zaXplKTsKICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAxIHwgMHgwMDA0IHwgMHgwMDIwIHwgMHgwMDEwKTsKICAgICAgICAgICAgaWYgKGhhbmRsZS5WYWwgPT0gMCkgeyB0aHJvdyAoJ2NvdWxkIG5vdCBvcGVuIFNlcnZpY2VNYW5hZ2VyJyk7IH0KICAgICAgICAgICAgdmFyIGggPSB0aGlzLnByb3h5Lk9wZW5TZXJ2aWNlVyhoYW5kbGUsIHNlcnZpY2VOYW1lLCAweDAwMDEgfCAweDAwMDQgfCAweDAwMjAgfCAweDAwMTAgfCAweDAwMDEwMDAwKTsKICAgICAgICAgICAgaWYgKGguVmFsICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSB7IF9PYmplY3RJRDogJ3NlcnZpY2UtbWFuYWdlci5zZXJ2aWNlJyB9CiAgICAgICAgICAgICAgICByZXRWYWwuX3NjbSA9IGhhbmRsZTsKICAgICAgICAgICAgICAgIHJldFZhbC5fc2VydmljZSA9IGg7CiAgICAgICAgICAgICAgICByZXRWYWwuX0dNID0gdGhpcy5HTTsKICAgICAgICAgICAgICAgIHJldFZhbC5fcHJveHkgPSB0aGlzLnByb3h5OwogICAgICAgICAgICAgICAgcmV0VmFsLl9wcm94eTIgPSB0aGlzLnByb3h5MjsKICAgICAgICAgICAgICAgIHJldFZhbC5uYW1lID0gbmFtZTsKCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnc3RhdHVzJywgCiAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKHRoaXMuX0dNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5LlF1ZXJ5U2VydmljZVN0YXR1c0V4KHRoaXMuX3NlcnZpY2UsIDAsIDAsIDAsIGJ5dGVzTmVlZGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKGJ5dGVzTmVlZGVkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5LlF1ZXJ5U2VydmljZVN0YXR1c0V4KHRoaXMuX3NlcnZpY2UsIDAsIHN0LCBzdC5fc2l6ZSwgYnl0ZXNOZWVkZWQpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihwYXJzZVNlcnZpY2VTdGF0dXMoc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHsgc3RhdGU6ICdVTktOT1dOJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKHJldFZhbC5zdGF0dXMuc3RhdGUgIT0gJ1VOS05PV04nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldFZhbCk7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNsb3NlID0gZnVuY3Rpb24gKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuX3NlcnZpY2UgJiYgdGhpcy5fc2NtKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUodGhpcy5fc2VydmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUodGhpcy5fc2NtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlcnZpY2UgPSB0aGlzLl9zY20gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwub24oJ34nLCByZXRWYWwuY2xvc2UpOwogICAgICAgICAgICAgICAgICAgIHJldFZhbC5pc01lID0gZnVuY3Rpb24gaXNNZSgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KHRoaXMuc3RhdHVzLnBpZCkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXRoID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgdGhpcy5uYW1lLCAnSW1hZ2VQYXRoJykudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IGltYWdlUGF0aC5zcGxpdCgnLmV4ZScpWzBdICsgJy5leGUnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0LnN0YXJ0c1dpdGgoJyInKSkgeyByZXQgPSByZXQuc3Vic3RyaW5nKDEpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5hcHBMb2NhdGlvbigpLnNwbGl0KCdcXCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG9rZW5zLmpvaW4oJ1xcJykpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmlzUnVubmluZyA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuc3RhdHVzLnN0YXRlID09ICdSVU5OSU5HJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9zdG9wRXggPSBmdW5jdGlvbihzLCBwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBzLnN0YXR1cy5zdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTVE9QUEVEJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9yZXMoJ1NUT1BQRUQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NUT1BfUEVORElORyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5fZWxhcHNlZFRpbWUgPSBEYXRlLm5vdygpIC0gcC5fc3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLl9lbGFwc2VkVGltZSA8IDEwMDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50aW1lciA9IHNldFRpbWVvdXQocy5fc3RvcEV4LCBwLl93YWl0VGltZSwgcywgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlaigndGltZW91dCB3YWl0aW5nIGZvciBzZXJ2aWNlIHRvIHN0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlaignVW5leHBlY3RlZCBzdGF0ZTogJyArIGN1cnJlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RvcCA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLnN0YXRlID09ICdSVU5OSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3c3RhdGUgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSgzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVhc29uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fcHJveHkuQ29udHJvbFNlcnZpY2UodGhpcy5fc2VydmljZSwgMHgwMDAwMDAwMSwgbmV3c3RhdGUpLlZhbCA9PSAwICYmIChyZWFzb24gPSB0aGlzLl9wcm94eTIuR2V0TGFzdEVycm9yKCkuVmFsKSE9MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3Jlaih0aGlzLm5hbWUgKyAnLnN0b3AoKSBmYWlsZWQgd2l0aCBlcnJvcjogJyArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gc2V0dXAgYSB0aW1lZCBjYWxsYmFjayB0byBjaGVjayB0aGUgc3RhdHVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9zdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fZWxhcHNlZFRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fd2FpdFRpbWUgPSBzdGF0dXMud2FpdEhpbnQgLyAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0Ll93YWl0VGltZSA8IDUwMCkgeyByZXQuX3dhaXRUaW1lID0gNTAwOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5fd2FpdFRpbWUgPiA1MDAwKSB7IHJldC5fd2FpdFRpbWUgPSA1MDAwOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnRpbWVyID0gc2V0VGltZW91dCh0aGlzLl9zdG9wRXgsIHJldC5fd2FpdFRpbWUsIHRoaXMsIHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignY2Fubm90IGNhbGwgJyArIHRoaXMubmFtZSArICcuc3RvcCgpLCB3aGVuIGN1cnJlbnQgc3RhdGUgaXM6ICcgKyB0aGlzLnN0YXR1cy5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnQgPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnN0YXRlID09ICdTVE9QUEVEJykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSB0aGlzLl9wcm94eS5TdGFydFNlcnZpY2VBKHRoaXMuX3NlcnZpY2UsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAodGhpcy5uYW1lICsgJy5zdGFydCgpIGZhaWxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdjYW5ub3QgY2FsbCAnICsgdGhpcy5uYW1lICsgJy5zdGFydCgpLCB3aGVuIGN1cnJlbnQgc3RhdGUgaXM6ICcgKyB0aGlzLnN0YXR1cy5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJlc3RhcnQgPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byByZXN0YXJ0IG91cnNlbHZlcyBvbiBXaW5kb3dzLCB3ZSBtdXN0IHNwYXduIGEgZGV0YWNoZWQgY2hpbGQgcHJvY2VzcywgYmVjdWFzZSB3ZSBuZWVkIHRvIGNhbGwgc3RhcnQsIG9uY2Ugd2UgYXJlIHN0b3BwZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZXhlY1BhdGgsIFtwcm9jZXNzLmV4ZWNQYXRoLnNwbGl0KCdcXCcpLnBvcCgpLCAnLWV4ZWMgIicgKyAicmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKCciICsgdGhpcy5uYW1lICsgIicpLnJlc3RhcnQoKS5maW5hbGx5KGZ1bmN0aW9uKCl7cHJvY2Vzcy5leGl0KCk7fSk7IiArICciJ10sIHsgdHlwZTogNCwgZGV0YWNoZWQ6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zdGFydHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9hID0gYTsgdGhpcy5fciA9IHI7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXJ2aWNlID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydHAuX3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydHAuX2EoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7IGNvbnNvbGUucmF3TG9nKCdzdG9wKCkgZmFpbGVkID0+ICcgKyBlLnRvU3RyaW5nKCkpO30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwLnN0YXJ0cCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWdBKGgsIDAsIDAsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2EgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWdBKGgsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYSwgcXVlcnlfc2VydmljZV9jb25maWdhLl9zaXplLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gcXVlcnlfc2VydmljZV9jb25maWdhLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gNCA/IDI4IDogNDgsIHRoaXMuR00uUG9pbnRlclNpemUpLkRlcmVmKCkuU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ3VzZXInLCB7IHZhbHVlOiB2YWwgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocXVlcnlfc2VydmljZV9jb25maWdhLkRlcmVmKDQsNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0YXJ0VHlwZSA9ICdBVVRPX1NUQVJUJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnRUeXBlID0gJ0RFTUFORF9TVEFSVCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0YXJ0VHlwZSA9ICdESVNBQkxFRCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWx1cmVhY3Rpb25zID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg4MTkyKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYm5lZWRlZCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCk7ICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWcyQShoLCAyLCBmYWlsdXJlYWN0aW9ucywgODE5MiwgYm5lZWRlZCkuVmFsICE9IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY0FjdGlvbnMgPSBmYWlsdXJlYWN0aW9ucy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSh0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAyNCA6IDEyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5yZXNldFBlcmlvZCA9IGZhaWx1cmVhY3Rpb25zLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucyA9IFtdOwogICAgICAgICAg", 16000); - memcpy_s(_servicemanager + 48000, 91276, "ICAgICAgICAgICAgICBmb3IodmFyIGFjdCA9IDAgOyBhY3QgPCBjQWN0aW9uczsgKythY3QpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBmYWlsdXJlYWN0aW9ucy5EZXJlZih0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDE2LCB0aGlzLkdNLlBvaW50ZXJTaXplKS5EZXJlZigpLkRlcmVmKGFjdCo4LDgpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYWN0aW9uLnJlYWRVSW50MzJMRSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdOT05FJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ1NFUlZJQ0VfUkVTVEFSVCcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdSRUJPT1QnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ09USEVSJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wZWVrKCkuZGVsYXkgPSBhY3Rpb24ucmVhZFVJbnQzMkxFKDQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgdGhyb3cgKCdjb3VsZCBub3QgZmluZCBzZXJ2aWNlOiAnICsgbmFtZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vIExpbnV4LCBNYWNPUywgRnJlZUJTRAoKICAgICAgICB0aGlzLmlzQWRtaW4gPSBmdW5jdGlvbiBpc0FkbWluKCkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5pc1Jvb3QoKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlKG5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWV9OwogICAgICAgICAgICAgICAgaWYocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL3JjLmQvJyArIG5hbWUpKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncmMnLCB7IHZhbHVlOiAnL2V0Yy9yYy5kLycgKyBuYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZihyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG5hbWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdyYycsIHsgdmFsdWU6ICcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBuYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnU2VydmljZTogJyArIG5hbWUgKyAnIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgInN0YXJ0VHlwZSIsCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHJjdmFyIHwgZ3JlcCBfZW5hYmxlPSB8IGF3ayBcJ3sgYT1zcGxpdCgkMCwgYiwgIlxcIiIpOyBpZihiWzJdPT0iWUVTIikgeyBwcmludCAiWUVTIjsgfSB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/ICdERU1BTkRfU1RBUlQnIDogJ0FVVE9fU1RBUlQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uID0gZnVuY3Rpb24gZGVzY3JpcHRpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucmMgKyAiIHwgZ3JlcCBkZXNjPSB8IGF3ayAtRj0gJyIgKyAneyBpZigkMT09ImRlc2MiKSB7ICQxPSIiOyBhPXNwbGl0KCQwLCByZXMsICJcXCIiKTsgaWYoYT4xKSB7IHByaW50IHJlc1syXTsgfSBlbHNlIHsgcHJpbnQgJDA7IH0gfSB9XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0OwogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucmMgKyAiIHwgZ3JlcCAiICsgdGhpcy5uYW1lICsgIl9jaGRpcj0gfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nIHwgYXdrIC1GXFxcIiAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgaWYocmV0ID09ICcnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5yYy5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgICAgICAgICByZXQucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKCQkgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGNvbW1hbmQ9IHwgYXdrIC1GPSAneyBwcmludCAkMiB9JyB8IGF3ayAtRlxcXCIgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgkJICAgICAgICAgICAgdmFyIHRtcCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCcke25hbWV9Jykuam9pbih0aGlzLm5hbWUpOwoJCSAgICAgICAgICAgIGlmKHRtcD09Jy91c3Ivc2Jpbi9kYWVtb24nKQoJCSAgICAgICAgICAgIHsKCQkJICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwoJCQkgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CgkJCSAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgJyArIHRoaXMucmMgKyAnIHwgZ3JlcCBjb21tYW5kX2FyZ3M9IHwgYXdrIC1GIi1mICIgXCd7ICQxPSIiOyBzcGxpdCgkMCwgcmVzLCAiXFwiIik7IHNwbGl0KHJlc1sxXSwgdCwgIiAiKTsgcHJpbnQgdFsxXTsgfVwnXG5leGl0XG4nKTsKCQkJICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCQkJICAgICAgICAgICAgcmV0dXJuKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgIAkJICAgICAgICB9CgkJICAgICAgICAgICAgZWxzZQoJCSAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CgkJICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0YXR1cyB8IGF3ayAneyBwcmludCAkMyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICdydW5uaW5nJyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVzdGF0dXMgfCBhd2sgJ3sgc3BsaXQoJDYsIHJlcywgXCIuXCIpOyBwcmludCByZXNbMV07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID09IHByb2Nlc3MucGlkKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0b3BcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0YXJ0XG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lcmVzdGFydFxuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSkgeyByZXR1cm4gKGZldGNoUGxpc3QoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnLCBuYW1lKSk7IH07CiAgICAgICAgICAgIHRoaXMuZ2V0TGF1bmNoQWdlbnQgPSBmdW5jdGlvbiBnZXRMYXVuY2hBZ2VudChuYW1lLCB1c2VyaWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1c2VyaWQgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZldGNoUGxpc3QoJy9MaWJyYXJ5L0xhdW5jaEFnZW50cycsIG5hbWUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZldGNoUGxpc3QocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHVzZXJpZCkpICsgJy9MaWJyYXJ5L0xhdW5jaEFnZW50cycsIG5hbWUsIHVzZXJpZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlKG5hbWUsIHBsYXRmb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXBsYXRmb3JtKSB7IHBsYXRmb3JtID0gdGhpcy5nZXRTZXJ2aWNlVHlwZSgpOyB9CiAgICAgICAgICAgICAgICB2YXIgcmV0ID0geyBuYW1lOiBuYW1lLCBjbG9zZTogZnVuY3Rpb24gKCkgeyB9LCBzZXJ2aWNlVHlwZTogcGxhdGZvcm19OwogICAgICAgICAgICAgICAgc3dpdGNoKHBsYXRmb3JtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpIHsgcGxhdGZvcm0gPSAnaW5pdCc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJykpIHsgcGxhdGZvcm0gPSAndXBzdGFydCc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbGF0Zm9ybSA9PSAnaW5pdCcgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxhdGZvcm0gPT0gJ3Vwc3RhcnQnICYmIHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJykpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuY29uZiA9IChwbGF0Zm9ybSA9PSAndXBzdGFydCcgPyAoJy9ldGMvaW5pdCcgKyBuYW1lICsgJy5jb25mJykgOiAoJy9ldGMvaW5pdC5kLycgKyBuYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc2VydmljZVR5cGUgPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJzdGFydFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlVHlwZSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAnICsgdGhpcy5jb25mICsgJyB8IGdyZXAgInN0YXJ0IG9uIHJ1bmxldmVsIlxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2ZpbmQgL2V0Yy9yYyogLW1heGRlcHRoIDIgLXR5cGUgbCAtbHMgfCBncmVwICIgLi4vaW5pdC5kLycgKyB0aGlzLm5hbWUgKyAnIiB8IGF3ayAtRiItPiAiIFwneyBpZigkMj09Ii4uL2luaXQuZC8nICsgdGhpcy5uYW1lICsgJyIpIHsgcHJpbnQgInRydWUiOyB9IH1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/ICdERU1BTkRfU1RBUlQnIDogJ0FVVE9fU1RBUlQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVzY3JpcHRpb24ucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQvIiArIHRoaXMubmFtZSArICIuY29uZiB8IGdyZXAgZGVzY3JpcHRpb24gfCBhd2sgJyIgKyAneyBpZigkMT09ImRlc2NyaXB0aW9uIikgeyAkMT0iIjsgYT1zcGxpdCgkMCwgcmVzLCAiXFwiIik7IGlmKGE+MSkgeyBwcmludCByZXNbMl07IH0gZWxzZSB7IHByaW50ICQwOyB9fX1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwIFNob3J0LURlc2NyaXB0aW9uOiB8IGF3ayAnIiArICd7IGlmKCQyPT0iU2hvcnQtRGVzY3JpcHRpb246IikgeyAkMT0iIjsgJDI9IiI7IHByaW50ICQwOyB9fVwn", 16000); - memcpy_s(_servicemanager + 64000, 75276, "XG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwcFdvcmtpbmdEaXJlY3RvcnkucGxhdGZvcm0gPT0gJ2luaXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQuZC8iICsgdGhpcy5uYW1lICsgIiB8IGdyZXAgJ1NDUklQVD0nIHwgYXdrIC1GPSAneyBsZW49c3BsaXQoJDIsIGEsIFwiL1wiKTsgcHJpbnQgc3Vic3RyKCQyLDAsbGVuZ3RoKCQyKS1sZW5ndGgoYVtsZW5dKSk7IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQvIiArIHRoaXMubmFtZSArICIuY29uZiB8IGdyZXAgJ2NoZGlyICcgfCBhd2sgJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeS5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gYXBwTG9jYXRpb24oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhcHBMb2NhdGlvbi5wbGF0Zm9ybSA9PSAnaW5pdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC5kLyIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnU0NSSVBUPScgfCBhd2sgLUY9ICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LyIgKyB0aGlzLm5hbWUgKyAiLmNvbmYgfCBncmVwICdleGVjICcgfCBhd2sgJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24ucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01lLnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpbml0Y3RsIHN0YXR1cyAiICsgdGhpcy5uYW1lICsgIiB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDR9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIHN0YXR1cyB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDR9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnVubmluZy5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiaW5pdGN0bCBzdGF0dXMgIiArIHRoaXMubmFtZSArICIgfCBhd2sgJ3twcmludCAkMn0nIHwgYXdrIC1GLCAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBzdGF0dXMgfCBhd2sgJ3twcmludCAkMn0nIHwgYXdrIC1GLCAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ3N0YXJ0L3J1bm5pbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0LnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RhcnRcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydC5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcC5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW5pdGN0bCBzdG9wICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RvcFxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RhcnQucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2luaXRjdGwgcmVzdGFydCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHJlc3RhcnRcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0LnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzID0gZnVuY3Rpb24gc3RhdHVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5fc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuX3N0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXR1cyAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHN0YXR1c1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuX3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0YXR1cy5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHBsYXRmb3JtICsgJyBTZXJ2aWNlICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuY29uZiA9ICcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmNvbmYgPSAnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0LmNvbmYpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJzdGFydFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0YXR1cyAnICsgdGhpcy5uYW1lICsgJyB8IGdyZXAgTG9hZGVkOiB8IGF3ayBcJ3sgYT1zcGxpdCgkMCwgYiwgIjsiKTsgZm9yKGM9MTtjPD1hOysrYykgeyBpZihiW2NdPT0iZW5hYmxlZCIgfHwgYltjXT09IiBlbmFibGVkIikgeyBwcmludCAidHJ1ZSI7IH0gfSB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/ICdERU1BTkRfU1RBUlQnIDogJ0FVVE9fU1RBUlQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJyB8IGdyZXAgRGVzY3JpcHRpb249IHwgYXdrIC1GPSBcJ3sgaWYoJDE9PSJEZXNjcmlwdGlvbiIpIHsgJDE9IiI7IHByaW50ICQwOyB9fVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgdGhpcy5uYW1lICsgJy5zZXJ2aWNlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdXb3JraW5nRGlyZWN0b3J5PScgfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC91c3IvbGli", 16000); - memcpy_s(_servicemanager + 80000, 59276, "L3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdXb3JraW5nRGlyZWN0b3J5PScgfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgdGhpcy5uYW1lICsgJy5zZXJ2aWNlJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9saWIvc3lzdGVtZC9zeXN0ZW0vIiArIHRoaXMubmFtZSArICIuc2VydmljZSB8IGdyZXAgJ0V4ZWNTdGFydD0nIHwgYXdrIC1GPSAneyBzcGxpdCgkMiwgYSwgXCIgXCIpOyBwcmludCBhWzFdIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vIiArIHRoaXMubmFtZSArICIuc2VydmljZSB8IGdyZXAgJ0V4ZWNTdGFydD0nIHwgYXdrIC1GPSAneyBzcGxpdCgkMiwgYSwgXCIgXCIpOyBwcmludCBhWzFdIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN5c3RlbWN0bCBzdGF0dXMgIiArIHRoaXMubmFtZSArICIgfCBncmVwICdNYWluIFBJRDonIHwgYXdrICd7cHJpbnQgJDN9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA9PSBwcm9jZXNzLnBpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzUnVubmluZyA9IGZ1bmN0aW9uIGlzUnVubmluZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzeXN0ZW1jdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnQWN0aXZlOicgfCBhd2sgJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ2FjdGl2ZScpOyAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhcnQgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RvcCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCByZXN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuX3N0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLl9zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBzdGF0dXMgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuX3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHBsYXRmb3JtICsgJyBTZXJ2aWNlICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnVW5rbm93biBTZXJ2aWNlIFBsYXRmb3JtOiAnICsgcGxhdGZvcm0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgdGhpcy5lbnVtZXJhdGVTZXJ2aWNlID0gZnVuY3Rpb24gKG9wdGlvbnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICB2YXIgcGF0aHMgPSBbXTsKICAgICAgICAgICAgc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKG9wdGlvbnMgJiYgb3B0aW9ucy5wbGF0Zm9ybVR5cGUpP29wdGlvbnMucGxhdGZvcm1UeXBlIDogdGhpcy5nZXRTZXJ2aWNlVHlwZSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvZXRjL2luaXQuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2V0Yy9pbml0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvbGliL3N5c3RlbWQvc3lzdGVtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZnJlZWJzZCc6CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2V0Yy9yYy5kJyk7CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL3Vzci9sb2NhbC9ldGMvcmMuZCcpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zJyk7CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yKHZhciBpIGluIHBhdGhzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZXMgPSByZXF1aXJlKCdmcycpLnJlYWRkaXJTeW5jKHBhdGhzW2ldKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaiBpbiBmaWxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKG9wdGlvbnMgJiYgb3B0aW9ucy5wbGF0Zm9ybVR5cGUpID8gb3B0aW9ucy5wbGF0Zm9ybVR5cGUgOiB0aGlzLmdldFNlcnZpY2VUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLCAnaW5pdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5jb25mJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0uc3BsaXQoJy5jb25mJylbMF0sICd1cHN0YXJ0JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tqXS5lbmRzV2l0aCgnLnNlcnZpY2UnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXS5zcGxpdCgnLnNlcnZpY2UnKVswXSwgJ3N5c3RlbWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tqXS5lbmRzV2l0aCgnLnBsaXN0JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZmV0Y2hQbGlzdChwYXRoc1tpXSwgZmlsZXNbal0uc3BsaXQoJy5wbGlzdCcpWzBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgayBpbiByZXN1bHRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1trXS5kZXNjcmlwdGlvbikgeyByZXN1bHRzW2tdLmRlc2NyaXB0aW9uID0gcmVzdWx0c1trXS5kZXNjcmlwdGlvbigpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHRzKTsKICAgICAgICB9OwogICAgfQogICAgdGhpcy5pbnN0YWxsU2VydmljZSA9IGZ1bmN0aW9uIGluc3RhbGxTZXJ2aWNlKG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKCFvcHRpb25zLnRhcmdldCkgeyBvcHRpb25zLnRhcmdldCA9IG9wdGlvbnMubmFtZTsgfQogICAgICAgIGlmICghb3B0aW9ucy5kaXNwbGF5TmFtZSkgeyBvcHRpb25zLmRpc3BsYXlOYW1lID0gb3B0aW9ucy5uYW1lOyB9CgogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyBhZG1pbicpOyB9CgogICAgICAgICAgICAvLyBCZWZvcmUgd2Ugc3RhcnQsIHdlIG5lZWQgdG8gY29weSB0aGUgYmluYXJ5IHRvIHRoZSByaWdodCBwbGFjZQogICAgICAgICAgICB2YXIgZm9sZGVyID0gdGhpcy5nZXRTZXJ2aWNlRm9sZGVyKCk7CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlcikpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoZm9sZGVyKTsgfQogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYyhmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lKTsgfQoKICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBvcHRpb25zLnRhcmdldCArICcuZXhlJyk7CiAgICAgICAgICAgIG9wdGlvbnMuc2VydmljZVBhdGggPSBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUnOwoKICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXRoID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSgnIicgKyBvcHRpb25zLnNlcnZpY2VQYXRoICsgJyInLCB7IHdpZGU6IHRydWUgfSk7CiAgICAgICAgICAgIHZhciBoYW5kbGUgPSB0aGlzLnByb3h5Lk9wZW5TQ01hbmFnZXJBKDB4MDAsIDB4MDAsIDB4MDAwMik7CiAgICAgICAgICAgIGlmIChoYW5kbGUuVmFsID09IDApIHsgdGhyb3cgKCdlcnJvciBvcGVuaW5nIFNDTWFuYWdlcicpOyB9CiAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5uYW1lLCB7IHdpZGU6IHRydWUgfSk7CiAgICAgICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5kaXNwbGF5TmFtZSwgeyB3aWRlOiB0cnVlfSk7CiAgICAgICAgICAgIHZhciBhbGxBY2Nlc3MgPSAweDAwMEYwMUZGOwogICAgICAgICAgICB2YXIgc2VydmljZVR5cGU7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgc2VydmljZVR5cGUgPSAweDAyOyAvLyBBdXRvbWF0aWMKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ0RFTUFORF9TVEFSVCc6CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwMzsgLy8gTWFudWFsCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdESVNBQkxFRCc6CiAgICAgICAgICAgICAgICAgICAgc2VydmljZVR5cGUgPSAweDA0OyAvLyBEaXNhYmxlZAogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaCA9IHRoaXMucHJveHkuQ3JlYXRlU2VydmljZVcoaGFuZGxlLCBzZXJ2aWNlTmFtZSwgZGlzcGxheU5hbWUsIGFsbEFjY2VzcywgMHgxMCB8IDB4MTAwLCBzZXJ2aWNlVHlwZSwgMCwgc2VydmljZVBhdGgsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICBpZiAoaC5WYWwgPT0gMCkgeyB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOyB0aHJvdyAoJ0Vycm9yIENyZWF0aW5nIFNlcnZpY2U6ICcgKyB0aGlzLnByb3h5Mi5HZXRMYXN0RXJyb3IoKS5WYWwpOyB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZHNjID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShvcHRpb25zLmRlc2NyaXB0aW9uLCB7IHdpZGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICB2YXIgc2VydmljZURlc2NyaXB0aW9uID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSh0aGlzLkdNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgIGRzYy5wb2ludGVyQnVmZmVyKCkuY29weShzZXJ2aWNlRGVzY3JpcHRpb24uRGVyZWYoMCwgdGhpcy5HTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hhbmdlU2VydmljZUNvbmZpZzJXKGgsIDEsIHNlcnZpY2VEZXNjcmlwdGlvbikuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAg", 16000); - memcpy_s(_servicemanager + 96000, 43276, "ICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuYWJsZSB0byBzZXQgZGVzY3JpcHRpb24uLi4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgPyA1MDAwIDogb3B0aW9ucy5mYWlsdXJlUmVzdGFydDsgICAgICAgICAgICAgLy8gRGVsYXkgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoMyAqIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMypzaXplb2YoU0NfQUNUSU9OKQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlswXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShkZWxheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlswXS5kZWxheQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZig4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsxXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDEyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsxXS5kZWxheQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDIwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS5kZWxheQoKICAgICAgICAgICAgICAgIHZhciBmYWlsdXJlQWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplb2YoU0VSVklDRV9GQUlMVVJFX0FDVElPTlMpCiAgICAgICAgICAgICAgICBmYWlsdXJlQWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoNzIwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHdSZXNldFBlcmlvZDogMiBIb3VycwogICAgICAgICAgICAgICAgZmFpbHVyZUFjdGlvbnMuRGVyZWYodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMjQgOiAxMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMpOy8vIGNBY3Rpb25zOiAzCiAgICAgICAgICAgICAgICBhY3Rpb25zLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGZhaWx1cmVBY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuR00uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hhbmdlU2VydmljZUNvbmZpZzJXKGgsIDIsIGZhaWx1cmVBY3Rpb25zKS5WYWwgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIHNldCBGYWlsdXJlQWN0aW9ucy4uLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKGgpOwogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOwoKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiBvcHRpb25zLmZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd3JpdGluZyAnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7CiAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXRoID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgb3B0aW9ucy5uYW1lLCAnSW1hZ2VQYXRoJyk7CiAgICAgICAgICAgICAgICBpbWFnZVBhdGggKz0gKCcgJyArIG9wdGlvbnMucGFyYW1ldGVycy5qb2luKCcgJykpOwogICAgICAgICAgICAgICAgcmVnLldyaXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgb3B0aW9ucy5uYW1lLCAnSW1hZ2VQYXRoJywgaW1hZ2VQYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IGNvbnNvbGUubG9nKCdJbnN0YWxsaW5nIGEgU2VydmljZSByZXF1aXJlcyByb290Jyk7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0KICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvcHRpb25zLnBhcmFtZXRlcnMgPyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpIDogJyc7CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKCiAgICAgICAgICAgIHZhciByYyA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG9wdGlvbnMubmFtZSwgeyBmbGFnczogJ3diJyB9KTsKICAgICAgICAgICAgcmMud3JpdGUoJyMhL2Jpbi9zaFxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCcjIFBST1ZJREU6ICcgKyBvcHRpb25zLm5hbWUgKyAnXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJyMgUkVRVUlSRTogRklMRVNZU1RFTVMgTkVUV09SS0lOR1xuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCcjIEtFWVdPUkQ6IHNodXRkb3duXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJy4gL2V0Yy9yYy5zdWJyXG5cbicpOwogICAgICAgICAgICByYy53cml0ZSgnbmFtZT0iJyArIG9wdGlvbnMubmFtZSArICciXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ2Rlc2M9IicgKyAob3B0aW9ucy5kZXNjcmlwdGlvbiA/IG9wdGlvbnMuZGVzY3JpcHRpb24gOiAnTWVzaENlbnRyYWwgQWdlbnQnKSArICciXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ3JjdmFyPSR7bmFtZX1fZW5hYmxlXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ3BpZGZpbGU9Ii92YXIvcnVuLycgKyBvcHRpb25zLm5hbWUgKyAnLnBpZCJcbicpOwogICAgICAgICAgICByYy53cml0ZSgnY29tbWFuZD0iL3Vzci9zYmluL2RhZW1vbiJcbicpOwogICAgICAgICAgICByYy53cml0ZSgnY29tbWFuZF9hcmdzPSItUCAke3BpZGZpbGV9ICcgKyAoKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCk/Jy1yJzonJykgKyAnIC1mIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJyJcbicpOwogICAgICAgICAgICByYy53cml0ZSgnY29tbWFuZF9jaGRpcj0iL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnIlxuXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ2xvYWRfcmNfY29uZmlnICRuYW1lXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJzogJHsnICsgb3B0aW9ucy5uYW1lICsgJ19lbmFibGU9IicgKyAoKG9wdGlvbnMuc3RhcnRUeXBlID09ICdBVVRPX1NUQVJUJyB8fCBvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQk9PVF9TVEFSVCcpPydZRVMnOidOTycpICsgJyJ9XG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ3J1bl9yY19jb21tYW5kICIkMSJcbicpOwogICAgICAgICAgICByYy5lbmQoKTsKICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBvcHRpb25zLm5hbWUpLm1vZGU7CiAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBvcHRpb25zLm5hbWUsIG0pOwogICAgICAgIH0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IGNvbnNvbGUubG9nKCdJbnN0YWxsaW5nIGEgU2VydmljZSByZXF1aXJlcyByb290Jyk7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0KICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvcHRpb25zLnBhcmFtZXRlcnMgPyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpIDogJyc7CiAgICAgICAgICAgIHZhciBjb25mOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2VydmljZVBsYXRmb3JtKSB7IG9wdGlvbnMuc2VydmljZVBsYXRmb3JtID0gdGhpcy5nZXRTZXJ2aWNlVHlwZSgpOyB9CiAgICAgICAgICAgCiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9CgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsKICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyYXNoIFJlc3RhcnQgaXMgZW5hYmxlZCwgYnV0IGl0IGlzbid0IGluaGVyZW50bHkgc3VwcG9ydGVkIGJ5IElOSVQsIHNvIHdlIG11c3QgZmFrZSBpdCB3aXRoIEpTCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXBfcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuc3BsaXQoJyInKS5qb2luKCdcXCInKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9ICItZXhlYyBcXFwidmFyIGNoaWxkOyBwcm9jZXNzLm9uKCdTSUdURVJNJywgZnVuY3Rpb24gKCkgeyBjaGlsZC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2V4aXQnKTsgY2hpbGQua2lsbCgpOyBwcm9jZXNzLmV4aXQoKTsgfSk7IGZ1bmN0aW9uIHN0YXJ0KCkgeyBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5hcmd2MCwgXFxcIiIgKyB0bXBfcGFyYW1ldGVycyArICJcXFwiXSk7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsgY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoc3RhdHVzKSB7IHN0YXJ0KCk7IH0pOyB9IHN0YXJ0KCk7XFxcIiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIHRoZSBpbml0LmQgc2NyaXB0IEkgd3JvdGUuIFJhdGhlciB0aGFuIGhhdmluZyB0byBkZWFsIHdpdGggZXNjYXBpbmcgdGhlIHRoaW5nLCBJIGp1c3QgQmFzZTY0IGVuY29kZWQgaXQgdG8gcHJldmVudCBpc3N1ZXMuCiAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy9ldGMvaW5pdC5kLycgKyBvcHRpb25zLm5hbWUsIHsgZmxhZ3M6ICd3YicgfSk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZShCdWZmZXIuZnJvbSgnSXlFdlltbHVMM05vQ2dvS1UwTlNTVkJVUFM5MWMzSXZiRzlqWVd3dmJXVnphRjl6WlhKMmFXTmxjeTlZV0ZoWVdDOVpXVmxaV1FwU1ZVNUJVejF5YjI5MENncFFTVVJHU1V4RlBTOTJZWEl2Y25WdUwxaFlXRmhZTG5CcFpBcE1UMGRHU1V4RlBTOTJZWEl2Ykc5bkwxaFlXRmhZTG14dlp3b0tjM1JoY25Rb0tTQjdDaUFnYVdZZ1d5QXRaaUFpSkZCSlJFWkpURVVpSUYwZ0ppWWdhMmxzYkNBdE1DQWtLR05oZENBaUpGQkpSRVpKVEVVaUtTQXlQaTlrWlhZdmJuVnNiRHNnZEdobGJnb2dJQ0FnWldOb2J5QW5VMlZ5ZG1salpTQmhiSEpsWVdSNUlISjFibTVwYm1jbklENG1NZ29nSUNBZ2NtVjBkWEp1SURFS0lDQm1hUW9nSUdWamFHOGdKMU4wWVhKMGFXNW5JSE5sY25acFkyWGlnS1luSUQ0bU1nb2dJR3h2WTJGc0lFTk5SRDBpSkZORFVrbFFWQ0I3ZTFCQlVrMVRmWDBnSmo0Z1hDSWtURTlIUmtsTVJWd2lJQ1lnWldOb2J5QmNKQ0VpQ2lBZ2JHOWpZV3dnUTAxRVVFRlVTRDBrS0dWamFHOGdKRk5EVWtsUVZDQjhJR0YzYXlBbmV5QnNaVzQ5YzNCc2FYUW9KREFzSUdFc0lDSXZJaWs3SUhCeWFXNTBJSE4xWW5OMGNpZ2tNQ3dnTUN3Z2JHVnVaM1JvS0NRd0tTMXNaVzVuZEdnb1lWdHNaVzVkS1NrN0lIMG5LUW9nSUdOa0lDUkRUVVJRUVZSSUNpQWdjM1VnTFdNZ0lpUkRUVVFpSUNSU1ZVNUJVeUErSUNJa1VFbEVSa2xNUlNJS0lDQmxZMmh2SUNkVFpYSjJhV05sSUhOMFlYSjBaV1FuSUQ0bU1ncDlDZ3B6ZEc5d0tDa2dld29nSUdsbUlGc2dJU0F0WmlBaUpGQkpSRVpKVEVVaUlGMDdJSFJvWlc0S0lDQWdJR1ZqYUc4Z0oxTmxjblpwWTJVZ2JtOTBJSEoxYm01cGJtY25JRDRtTWdvZ0lDQWdjbVYwZFhKdUlERUtJQ0JsYkhObENnbHdhV1E5SkNnZ1kyRjBJQ0lrVUVsRVJrbE1SU0lnS1FvSmFXWWdhMmxzYkNBdE1DQWtjR2xrSURJK0wyUmxkaTl1ZFd4c095QjBhR1Z1Q2lBZ0lDQWdJR1ZqYUc4Z0oxTjBiM0J3YVc1bklITmxjblpwWTJYaWdLWW5JRDRtTWdvZ0lDQWdJQ0JyYVd4c0lDMHhOU0FrY0dsa0NpQWdJQ0FnSUdWamFHOGdKMU5sY25acFkyVWdjM1J2Y0hCbFpDY2dQaVl5Q2dsbGJITmxDZ2tnSUdWamFHOGdKMU5sY25acFkyVWdibTkwSUhKMWJtNXBibWNuQ2dsbWFRb0pjbTBnTFdZZ0pDSlFTVVJHU1V4Rklnb2dJR1pwQ24wS2NtVnpkR0Z5ZENncGV3b0pjM1J2Y0FvSmMzUmhjblFLZlFwemRHRjBkWE1vS1hzS0NXbG1JRnNnTFdZZ0lpUlFTVVJHU1V4RklpQmRDZ2wwYUdWdUNna0pjR2xrUFNRb0lHTmhkQ0FpSkZCSlJFWkpURVVpSUNrS0NRbHBaaUJyYVd4c0lDMHdJQ1J3YVdRZ01qNHZaR1YyTDI1MWJHdzdJSFJvWlc0S0NRa0paV05vYnlBaVdGaFlXRmdnYzNSaGNuUXZjblZ1Ym1sdVp5d2djSEp2WTJWemN5QWtjR2xrSWdvSkNXVnNjMlVLQ1FrSlpXTm9ieUFuV0ZoWVdGZ2djM1J2Y0M5M1lXbDBhVzVuSndvSkNXWnBDZ2xsYkhObENna0paV05vYnlBbldGaFlXRmdnYzNSdmNDOTNZV2wwYVc1bkp3b0pabWtLQ24wS0NncGpZWE5sSUNJa01TSWdhVzRLQ1hOMFlYSjBLUW9KQ1hOMFlYSjBDZ2tKT3pzS0NYTjBiM0FwQ2drSmMzUnZjQW9KQ1RzN0NnbHlaWE4wWVhKMEtRb0pDWE4wYjNBS0NRbHpkR0Z5ZEFvSkNUczdDZ2x6ZEdGMGRYTXBDZ2tKYzNSaGRIVnpDZ2tKT3pzS0NTb3BDZ2tKWldOb2J5QWlWWE5oWjJVNklITmxjblpwWTJVZ1dGaFlXRmdnZTNOMFlYSjBmSE4wYjNCOGNtVnpkR0Z5ZEh4emRHRjBkWE45SWdvSkNUczdDbVZ6WVdNS1pYaHBkQ0F3Q2dvPScsICdiYXNlNjQnKS50b1N0cmluZygpLnNwbGl0KCdYWFhYWCcpLmpvaW4ob3B0aW9ucy5uYW1lKS5zcGxpdCgnWVlZWVknKS5qb2luKG9wdGlvbnMudGFyZ2V0KS5yZXBsYWNlKCd7e1BBUk1TfX0nLCBwYXJhbWV0ZXJzKSk7CiAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsKCiAgICAgICAgICAgICAgICAgICAgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy9ldGMvaW5pdC5kLycgKyBvcHRpb25zLm5hbWUpLm1vZGU7CiAgICAgICAgICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL2V0Yy9pbml0LmQvJyArIG9wdGlvbnMubmFtZSwgbSk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JPT1RfU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgndXBkYXRlLXJjLmQgJyArIG9wdGlvbnMubmFtZSArICcgZGVmYXVsdHNcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0KCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBvcHRpb25zLnNlcnZpY2VQYXRoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOwogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOwoKICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2V0Yy9pbml0LycgKyBvcHRpb25zLm5hbWUgKyAnLmNvbmYnLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCT09UX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1lTVEVNX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRl", 16000); - memcpy_s(_servicemanager + 112000, 27276, "KCdzdGFydCBvbiBydW5sZXZlbCBbMjM0NV1cbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnc3RvcCBvbiBydW5sZXZlbCBbMDE2XVxuXG4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgncmVzcGF3blxuXG4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnY2hkaXIgL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdleGVjIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJ1xuXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLmVuZCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VEZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb24gPyBvcHRpb25zLmRlc2NyaXB0aW9uIDogJ01lc2hDZW50cmFsIEFnZW50JzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0KCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIG9wdGlvbnMuc2VydmljZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOwogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtJykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlJywgeyBmbGFnczogJ3diJyB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbScpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2UnLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ3Vua25vd24gbG9jYXRpb24gZm9yIHN5c3RlbWQgY29uZmlndXJhdGlvbiBmaWxlcycpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnW1VuaXRdXG5EZXNjcmlwdGlvbj0nICsgc2VydmljZURlc2NyaXB0aW9uICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnW1NlcnZpY2VdXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdXb3JraW5nRGlyZWN0b3J5PS91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnRXhlY1N0YXJ0PS91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnU3RhbmRhcmRPdXRwdXQ9bnVsbFxuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1Jlc3RhcnQ9b24tZmFpbHVyZVxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1Jlc3RhcnRTZWM9M1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdSZXN0YXJ0U2VjPScgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JPT1RfU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1tJbnN0YWxsXVxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdBbGlhcz0nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYuZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLl9tb2R1bGVOYW1lID0gb3B0aW9ucy5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIGVuYWJsZSAnICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYuZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyB1bmtub3duIHBsYXRmb3JtIHNlcnZpY2UgdHlwZQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmtub3duIFNlcnZpY2UgUGxhdGZvcm0gVHlwZTogJyArIG9wdGlvbnMuc2VydmljZVBsYXRmb3JtKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ1Vua25vd24gU2VydmljZSBQbGF0Zm9ybSBUeXBlOiAnICsgb3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0KCiAgICAgICAgICAgIC8vIE1hYyBPUwogICAgICAgICAgICB2YXIgc3Rkb3V0cGF0aCA9IChvcHRpb25zLnN0ZG91dCA/ICgnPGtleT5TdGFuZGFyZE91dFBhdGg8L2tleT5cbjxzdHJpbmc+JyArIG9wdGlvbnMuc3Rkb3V0ICsgJzwvc3RyaW5nPicpIDogJycpOwogICAgICAgICAgICB2YXIgYXV0b1N0YXJ0ID0gKG9wdGlvbnMuc3RhcnRUeXBlID09ICdBVVRPX1NUQVJUJyA/ICc8dHJ1ZS8+JyA6ICc8ZmFsc2UvPicpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gICcgICAgIDxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlxuJzsKICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDxhcnJheT5cbic7CiAgICAgICAgICAgIHBhcmFtcyArPSAoJyAgICAgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBpZihvcHRpb25zLnBhcmFtZXRlcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcih2YXIgaXRtIGluIG9wdGlvbnMucGFyYW1ldGVycykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMgKz0gKCcgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnBhcmFtZXRlcnNbaXRtXSArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAKICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDwvYXJyYXk+XG4nOwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBsaXN0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPHBsaXN0IHZlcnNpb249IjEuMCI+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnICA8ZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PkxhYmVsPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5uYW1lICsgJzwvc3RyaW5nPlxuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9IChwYXJhbXMgKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+V29ya2luZ0RpcmVjdG9yeTwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gKHN0ZG91dHBhdGggKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoYXV0b1N0YXJ0ICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PktlZXBBbGl2ZTwva2V5PlxuJzsKICAgICAgICAgICAgaWYob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGRpY3Q+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDxrZXk+Q3Jhc2hlZDwva2V5PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8dHJ1ZS8+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDwvZGljdD5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGZhbHNlLz5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5UaHJvdHRsZUludGVydmFsPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8L3BsaXN0Pic7CgogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmluYXJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5iaW5hcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy5wbGlzdCcsIHBsaXN0KTsKICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsKICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ1NlcnZpY2U6ICcgKyBvcHRpb25zLm5hbWUgKyAnIGFscmVhZHkgZXhpc3RzJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBvcHRpb25zLmZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3cml0aW5nICcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSksIG9wdGlvbnMuZmlsZXNbaV0uX2J1ZmZlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIGV4dHJhY3RGaWxlU291cmNlKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgewogICAgICAgIHRoaXMuaW5zdGFsbExhdW5jaEFnZW50ID0gZnVuY3Rpb24gaW5zdGFsbExhdW5jaEFnZW50KG9wdGlvbnMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIShvcHRpb25zLnVpZCB8fCBvcHRpb25zLnVzZXIpICYmICF0aGlzLmlzQWRtaW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdJbnN0YWxsaW5nIGEgR2xvYmFsIEFnZW50L0RhZW1vbiwgcmVxdWlyZXMgYWRtaW4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXRoVG9rZW5zID0gb3B0aW9ucy5zZXJ2aWNlUGF0aC5zcGxpdCgnLycpOwogICAgICAgICAgICBzZXJ2aWNlUGF0aFRva2Vucy5wb3AoKTsKICAgICAgICAgICAgaWYgKHNlcnZpY2VQYXRoVG9rZW5zLnBlZWsoKSA9PSAnLicpIHsgc2VydmljZVBhdGhUb2tlbnMucG9wKCk7IH0KICAgICAgICAgICAgb3B0aW9ucy53b3JraW5nRGlyZWN0b3J5ID0gc2VydmljZVBhdGhUb2tlbnMuam9pbignLycpOwoKICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9IChvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQVVUT19TVEFSVCcgPyAnPHRydWUvPicgOiAnPGZhbHNlLz4nKTsKICAgICAgICAgICAgdmFyIHN0ZG91dHBhdGggPSAob3B0aW9ucy5zdGRvdXQgPyAoJzxrZXk+U3RhbmRhcmRPdXRQYXRoPC9rZXk+XG48c3RyaW5nPicgKyBvcHRpb25zLnN0ZG91dCArICc8L3N0cmluZz4nKSA6ICcnKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICAgICAgICAgJyAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOwogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8YXJyYXk+XG4nOwogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpdG0gaW4gb3B0aW9ucy5wYXJhbWV0ZXJzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5wYXJhbWV0ZXJzW2l0bV0gKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8L2FycmF5PlxuJzsKCiAgICAgICAgICAgIHZhciBwbGlzdCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzxwbGlzdCB2ZXJzaW9uPSIxLjAiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgPGRpY3Q+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMubmFtZSArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBwbGlzdCArPSAocGFyYW1zICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPicgKyBvcHRpb25zLndvcmtpbmdEaXJlY3RvcnkgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gKHN0ZG91dHBhdGggKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoYXV0b1N0YXJ0ICsgJ1xuJyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnNlc3Npb25UeXBlcyAmJiBvcHRpb25zLnNlc3Npb25UeXBlcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MaW1pdExvYWRUb1Nlc3Npb25UeXBlPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxhcnJheT5cbic7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHlwZSBpbiBvcHRpb25zLnNlc3Npb25UeXBlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlc3Npb25UeXBlc1tzdHlwZV0gKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8L2FycmF5PlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5LZWVwQWxpdmU8L2tleT5cbic7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApIHsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZGljdD5cbic7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPGtleT5DcmFzaGVkPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDx0cnVlLz5cbic7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9kaWN0PlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAg", 16000); - memcpy_s(_servicemanager + 128000, 11276, "ICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZmFsc2UvPlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5UaHJvdHRsZUludGVydmFsPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8L3BsaXN0Pic7CgogICAgICAgICAgICBpZiAob3B0aW9ucy51aWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudXNlciA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRVc2VybmFtZShvcHRpb25zLnVpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBmb2xkZXIgPSBvcHRpb25zLnVzZXIgPyAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIob3B0aW9ucy51c2VyKSArICcvTGlicmFyeS9MYXVuY2hBZ2VudHMvJykgOiAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzLyc7CiAgICAgICAgICAgIG9wdGlvbnMuZ2lkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEdyb3VwSUQob3B0aW9ucy51aWQpOwogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLm1rZGlyU3luYyhmb2xkZXIpOwogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG93blN5bmMoZm9sZGVyLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhmb2xkZXIgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JywgcGxpc3QpOwogICAgICAgICAgICBpZihvcHRpb25zLnVzZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciArIG9wdGlvbnMubmFtZSArICcucGxpc3QnLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIHRoaXMudW5pbnN0YWxsU2VydmljZSA9IGZ1bmN0aW9uIHVuaW5zdGFsbFNlcnZpY2UobmFtZSkKICAgIHsKICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnVW5pbnN0YWxsaW5nIGEgc2VydmljZSwgcmVxdWlyZXMgYWRtaW4nKTsgfQoKICAgICAgICBpZiAodHlwZW9mIChuYW1lKSA9PSAnb2JqZWN0JykgeyBuYW1lID0gbmFtZS5uYW1lOyB9CiAgICAgICAgdmFyIHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UobmFtZSk7CiAgICAgICAgdmFyIHNlcnZpY2VQYXRoID0gc2VydmljZS5hcHBMb2NhdGlvbigpOwoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNlcnZpY2Uuc3RhdHVzLnN0YXRlID09IHVuZGVmaW5lZCB8fCBzZXJ2aWNlLnN0YXR1cy5zdGF0ZSA9PSAnU1RPUFBFRCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LkRlbGV0ZVNlcnZpY2Uoc2VydmljZS5fc2VydmljZSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ1VuaW5zdGFsbCBTZXJ2aWNlIGZvcjogJyArIG5hbWUgKyAnLCBmYWlsZWQgd2l0aCBlcnJvcjogJyArIHRoaXMucHJveHkyLkdldExhc3RFcnJvcigpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnQ2Fubm90IHVuaW5zdGFsbCBzZXJ2aWNlOiAnICsgbmFtZSArICcsIGJlY2F1c2UgaXQgaXM6ICcgKyBzZXJ2aWNlLnN0YXR1cy5zdGF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwogICAgICAgICAgICBzZXJ2aWNlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZ2V0U2VydmljZVR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0LmQgc2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIG5hbWUgKyAnIHN0b3BcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3VwZGF0ZS1yYy5kIC1mICcgKyBuYW1lICsgJyByZW1vdmVcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL2V0Yy9pbml0LmQvJyArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIGNvdWxkIG5vdCBiZSB1bmluc3RhbGxlZCcsIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1cHN0YXJ0IHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyBuYW1lICsgJyBzdG9wXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy9ldGMvaW5pdC8nICsgbmFtZSArICcuY29uZicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIGNvdWxkIG5vdCBiZSB1bmluc3RhbGxlZCcsIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgdHlwZTogcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuVEVSTSB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0b3AgJyArIG5hbWUgKyAnLnNlcnZpY2VcbicpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIGRpc2FibGUgJyArIG5hbWUgKyAnLnNlcnZpY2VcbicpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSkgeyByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgdW5pbnN0YWxsZWQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHVua25vd24gcGxhdGZvcm0gc2VydmljZSB0eXBlCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3QnKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgc3RvcCAnICsgbmFtZSArICdcbicpOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCB1bmxvYWQgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3RcbicpOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3QnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciB1bmluc3RhbGxpbmcgc2VydmljZTogJyArIG5hbWUgKyAnID0+ICcgKyBlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnJtZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdTZXJ2aWNlOiAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQogICAgICAgIHsKICAgICAgICAgICAgc2VydmljZS5zdG9wKCk7CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlLmFwcExvY2F0aW9uKCkpOwogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZS5yYyk7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnJtZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgeyB9CiAgICAgICAgfQogICAgfQogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgewogICAgICAgIHRoaXMuZ2V0U2VydmljZVR5cGUgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlVHlwZSgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcGxhdGZvcm0gPSByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5nZXRQcm9jZXNzSW5mbygxKS5OYW1lOwogICAgICAgICAgICBpZiAocGxhdGZvcm0gPT0gImJ1c3lib3giKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzIC1heCAtbyBwaWQgLW8gY29tbWFuZCB8IGF3ayAneyBpZigkMT09XCIxXCIpIHsgJDE9XCJcIjsgc3BsaXQoJDAsIHJlcywgXCIgXCIpOyBwcmludCByZXNbMl07IH19J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgcGxhdGZvcm0gPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGxhdGZvcm0gPT0gJ2luaXQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdCcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3Vwc3RhcnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAocGxhdGZvcm0pOwogICAgICAgIH07CiAgICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gc2VydmljZU1hbmFnZXI7Cm1vZHVsZS5leHBvcnRzLm1hbmFnZXIgPSBuZXcgc2VydmljZU1hbmFnZXIoKTsKCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQp7CiAgICBtb2R1bGUuZXhwb3J0cy5nZXRPU1ZlcnNpb24gPSBnZXRPU1ZlcnNpb247Cn0K", 11276); - ILibBase64DecodeEx((unsigned char*)_servicemanager, 139276, (unsigned char*)_servicemanager + 139276); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "service-manager"); duk_push_string(ctx, _servicemanager + 139276); + char *_servicemanager = ILibMemory_Allocate(253190, 0, NULL, NULL); + memcpy_s(_servicemanager + 0, 144680, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7DQoNCmZ1bmN0aW9uIGZhaWx1cmVBY3Rpb25Ub0ludGVnZXIoYWN0aW9uKQ0Kew0KICAgIHZhciByZXQ7DQogICAgc3dpdGNoKGFjdGlvbikNCiAgICB7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgIGNhc2UgJ05PTkUnOg0KICAgICAgICAgICAgcmV0PTA7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnU0VSVklDRV9SRVNUQVJUJzoNCiAgICAgICAgICAgIHJldD0xOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ1JFQk9PVCc6DQogICAgICAgICAgICByZXQ9MjsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICByZXR1cm4ocmV0KTsNCn0NCg0KZnVuY3Rpb24gZXh0cmFjdEZpbGVOYW1lKGZpbGVQYXRoKQ0Kew0KICAgIGlmICh0eXBlb2YgKGZpbGVQYXRoKSA9PSAnc3RyaW5nJykNCiAgICB7DQogICAgICAgIHZhciB0b2tlbnMgPSBmaWxlUGF0aC5zcGxpdCgnXFwnKS5qb2luKCcvJykuc3BsaXQoJy8nKTsNCiAgICAgICAgdmFyIG5hbWU7DQoNCiAgICAgICAgd2hpbGUgKChuYW1lID0gdG9rZW5zLnBvcCgpKSA9PSAnJyk7DQogICAgICAgIHJldHVybiAobmFtZSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldHVybihmaWxlUGF0aC5uZXdOYW1lKQ0KICAgIH0NCn0NCmZ1bmN0aW9uIGV4dHJhY3RGaWxlU291cmNlKGZpbGVQYXRoKQ0Kew0KICAgIHJldHVybiAodHlwZW9mIChmaWxlUGF0aCkgPT0gJ3N0cmluZycgPyBmaWxlUGF0aCA6IGZpbGVQYXRoLnNvdXJjZSk7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlU2VydmljZVN0YXR1cyh0b2tlbikNCnsNCiAgICB2YXIgaiA9IHt9Ow0KICAgIHZhciBzZXJ2aWNlVHlwZSA9IHRva2VuLkRlcmVmKDAsIDQpLkludFZhbDsNCiAgICBqLmlzRmlsZVN5c3RlbURyaXZlciA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKTsNCiAgICBqLmlzS2VybmVsRHJpdmVyID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMDEpID09IDB4MDAwMDAwMDEpOw0KICAgIGouaXNTaGFyZWRQcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMjApID09IDB4MDAwMDAwMjApOw0KICAgIGouaXNPd25Qcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApOw0KICAgIGouaXNJbnRlcmFjdGl2ZSA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMTAwKSA9PSAweDAwMDAwMTAwKTsNCiAgICBqLndhaXRIaW50ID0gdG9rZW4uRGVyZWYoKDYgKiA0KSwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICBzd2l0Y2ggKHRva2VuLkRlcmVmKCgxICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpDQogICAgew0KICAgICAgICBjYXNlIDB4MDAwMDAwMDU6DQogICAgICAgICAgICBqLnN0YXRlID0gJ0NPTlRJTlVFX1BFTkRJTkcnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMHgwMDAwMDAwNjoNCiAgICAgICAgICAgIGouc3RhdGUgPSAnUEFVU0VfUEVORElORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDA3Og0KICAgICAgICAgICAgai5zdGF0ZSA9ICdQQVVTRUQnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMHgwMDAwMDAwNDoNCiAgICAgICAgICAgIGouc3RhdGUgPSAnUlVOTklORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDAyOg0KICAgICAgICAgICAgai5zdGF0ZSA9ICdTVEFSVF9QRU5ESU5HJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDB4MDAwMDAwMDM6DQogICAgICAgICAgICBqLnN0YXRlID0gJ1NUT1BfUEVORElORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDAxOg0KICAgICAgICAgICAgai5zdGF0ZSA9ICdTVE9QUEVEJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICB2YXIgY29udHJvbHNBY2NlcHRlZCA9IHRva2VuLkRlcmVmKCgyICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7DQogICAgai5jb250cm9sc0FjY2VwdGVkID0gW107DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAxMCkgPT0gMHgwMDAwMDAxMCkNCiAgICB7DQogICAgICAgIGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfTkVUQklOREFERCcpOw0KICAgICAgICBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX05FVEJJTkRSRU1PVkUnKTsNCiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERU5BQkxFJyk7DQogICAgICAgIGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfTkVUQklORERJU0FCTEUnKTsNCiAgICB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwOCkgPT0gMHgwMDAwMDAwOCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BBUkFNQ0hBTkdFJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUEFVU0UnKTsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9DT05USU5VRScpOyB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDEwMCkgPT0gMHgwMDAwMDEwMCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BSRVNIVVRET1dOJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDA0KSA9PSAweDAwMDAwMDA0KSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0hVVERPV04nKTsgfQ0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMDEpID09IDB4MDAwMDAwMDEpIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9TVE9QJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfSEFSRFdBUkVQUk9GSUxFQ0hBTkdFJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDQwKSA9PSAweDAwMDAwMDQwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVCcpOyB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDA4MCkgPT0gMHgwMDAwMDA4MCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1NFU1NJT05DSEFOR0UnKTsgfQ0KICAgIGoucGlkID0gdG9rZW4uRGVyZWYoKDcgKiA0KSwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICByZXR1cm4gKGopOw0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCnsNCiAgICBmdW5jdGlvbiBnZXRPU1ZlcnNpb24oKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzd192ZXJzIHwgZ3JlcCBQcm9kdWN0VmVyc2lvbiB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgLy9jaGlsZC5zdGRvdXQuc3RyID0gJzEwLjknOw0KDQogICAgICAgIHZhciByZXQgPSB7IHJhdzogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJy4nKSwgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLnJhdy5qb2luKCcuJykpOyB9IH07DQogICAgICAgIHJldC5jb21wYXJlVG8gPSBmdW5jdGlvbiBjb21wYXJlVG8odmFsKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmF3ID0gKHR5cGVvZiAodmFsKSA9PSAnc3RyaW5nJykgPyB2YWwuc3BsaXQoJy4nKSA6IHZhbC5yYXc7IGlmICghcmF3KSB7IHRocm93ICgnSW52YWxpZCBwYXJhbWV0ZXInKTsgfQ0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLnJhdy5qb2luKCcuJykuc3BsaXQoJy4nKTsNCg0KICAgICAgICAgICAgdmFyIHIgPSBudWxsLCBzID0gbnVsbDsNCiAgICAgICAgICAgIHdoaWxlIChzZWxmLmxlbmd0aCA+IDAgJiYgcmF3Lmxlbmd0aCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcyA9IHBhcnNlSW50KHNlbGYuc2hpZnQoKSk7IHIgPSBwYXJzZUludChyYXcuc2hpZnQoKSk7DQogICAgICAgICAgICAgICAgaWYgKHMgPCByKSB7IHJldHVybiAoLTEpOyB9DQogICAgICAgICAgICAgICAgaWYgKHMgPiByKSB7IHJldHVybiAoMSk7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzZWxmLmxlbmd0aCA9PSByYXcubGVuZ3RoKSB7IHJldHVybiAoMCk7IH0NCiAgICAgICAgICAgIGlmIChzZWxmLmxlbmd0aCA8IHJhdy5sZW5ndGgpIHsgcmV0dXJuICgtMSk7IH0gZWxzZSB7IHJldHVybiAoMSk7IH0gICAgDQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH07DQoNCg0KICAgIGZ1bmN0aW9uIGZldGNoUGxpc3QoZm9sZGVyLCBuYW1lLCB1c2VyaWQpDQogICAgew0KICAgICAgICBpZiAoZm9sZGVyLmVuZHNXaXRoKCcvJykpIHsgZm9sZGVyID0gZm9sZGVyLnN1YnN0cmluZygwLCBmb2xkZXIubGVuZ3RoIC0gMSk7IH0NCiAgICAgICAgdmFyIHJldCA9IHsgbmFtZTogbmFtZSwgY2xvc2U6IGZ1bmN0aW9uICgpIHsgfSwgX3VpZDogdXNlcmlkIH07DQogICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JykpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSB0aHJvdyBpbiB0aGUgdG93ZWwsIGxldCdzIGVudW1lcmF0ZSBhbGwgdGhlIHBsaXN0IGZpbGVzLCBhbmQgc2VlIGlmIG9uZSBoYXMgYSBtYXRjaGluZyBsYWJlbA0KICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhmb2xkZXIpOw0KICAgICAgICAgICAgZm9yICh2YXIgZmlsZSBpbiBmaWxlcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgZm9sZGVyICsgJy8nICsgZmlsZXNbZmlsZV0gKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gbmFtZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldC5uYW1lID0gZmlsZXNbZmlsZV0uZW5kc1dpdGgoJy5wbGlzdCcpID8gZmlsZXNbZmlsZV0uc3Vic3RyaW5nKDAsIGZpbGVzW2ZpbGVdLmxlbmd0aCAtIDYpIDogZmlsZXNbZmlsZV07DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdhbGlhcycsIHsgdmFsdWU6IG5hbWUgfSk7DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIGZpbGVzW2ZpbGVdIH0pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmV0Lm5hbWUgPT0gbmFtZSkgeyB0aHJvdyAoJyAnICsgKGZvbGRlci5zcGxpdCgnTGF1bmNoRGFlbW9uJykubGVuZ3RoPjEgPyAnTGF1bmNoRGFlbW9uJyA6ICdMYXVuY2hBZ2VudCcpICsgJyAoJyArIG5hbWUgKyAnKSBOT1QgRk9VTkQnKTsgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ3BsaXN0JywgeyB2YWx1ZTogZm9sZGVyICsgJy8nICsgbmFtZSArICcucGxpc3QnIH0pOw0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2FsaWFzJywNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PkxhYmVsPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2RhZW1vbicsIHsgdmFsdWU6IHJldC5wbGlzdC5zcGxpdCgnL0xhdW5jaERhZW1vbnMvJykubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZSB9KTsNCg0KICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5Xb3JraW5nRGlyZWN0b3J5PC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLmVuZHNXaXRoKCcvJykgPyBjaGlsZC5zdGRvdXQuc3RyLnN1YnN0cmluZygwLCBjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCAtIDEpIDogY2hpbGQuc3Rkb3V0LnN0cik7DQogICAgICAgIH07DQogICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uIGFwcExvY2F0aW9uKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8L3N0cmluZz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPHN0cmluZz5cIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgfTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ19ydW5BdExvYWQnLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2VlIGlmIHRoaXMgaXMgYW4gQXV0by1TdGFydGluZyBzZXJ2aWNlLCBpbiBvcmRlciB0byBmaWd1cmUgb3V0IGhvdyB0byBpbXBsZW1lbnQgJ3N0YXJ0Jw0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PlJ1bkF0TG9hZDwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCIvPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkudG9VcHBlckNhc2UoKSA9PSAiVFJVRSIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnc3RhcnRUeXBlJywNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGFlbW9uKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuX3J1bkF0TG9hZCA/ICdBVVRPX1NUQVJUJyA6ICdERU1BTkRfU1RBUlQnKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJ0FVVE9fU1RBUlQnKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAiX2tlZXBBbGl2ZSIsDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSANCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7c3BsaXQoJDAsIGEsIFwiPGtleT5LZWVwQWxpdmU8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPFwiKTsgc3BsaXQoYlsyXSwgYywgXCI+XCIpOyAiKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIiBpZihjWzFdPT1cImRpY3RcIil7IHNwbGl0KGFbMl0sIGQsIFwiPC9kaWN0PlwiKTsgaWYoc3BsaXQoZFsxXSwgdHJ1dmFsLCBcIjx0cnVlLz5cIik+MSkgeyBzcGxpdCh0cnV2YWxbMV0sIGtuMSwgXCI8a2V5PlwiKTsgc3BsaXQoa24xWzJdLCBrbjIsIFwiPC9rZXk+XCIpOyBwcmludCBrbjJbMV07IH0gfSIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiIGVsc2UgeyBzcGxpdChjWzFdLCBrYSwgXCIvXCIpOyBpZihrYVsxXT09XCJ0cnVlXCIpIHtwcmludCBcIkFMV0FZU1wiO30gfSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICByZXQuZ2V0UElEID0gZnVuY3Rpb24gZ2V0UElEKHVpZCwgYXNTdHJpbmcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgdmFyIGNvbW1hbmQ7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQoNCiAgICAgICAgICAgIGlmIChnZXRPU1ZlcnNpb24oKS5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAibGF1bmNoY3RsIGxpc3QgfCBncmVwICciICsgdGhpcy5hbGlhcyArICInIHwgYXdrICd7IGlmKCQzPT1cIiIgKyB0aGlzLmFsaWFzICsgIlwiKXtwcmludCAkMTt9fSdcbmV4aXRcbiI7DQogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBp", 16000); + memcpy_s(_servicemanager + 16000, 128680, "ZiAodWlkID09IG51bGwpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2xhdW5jaGN0bCBwcmludCBzeXN0ZW0gfCBncmVwICInICsgdGhpcy5hbGlhcyArICciIHwgYXdrIFwneyBpZihzcGxpdCgkMCwgdG1wLCAiICIpPT0zKSB7IGlmKCQzPT0iJyArIHRoaXMuYWxpYXMgKyAnIikgeyBwcmludCAkMTsgfSB9fVwnXG5leGl0XG4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2xhdW5jaGN0bCBwcmludCBndWkvJyArIHVpZCArICcgfCBncmVwICInICsgdGhpcy5hbGlhcyArICciIHwgYXdrIFwneyBpZihzcGxpdCgkMCwgdG1wLCAiICIpPT0zKSB7IGlmKCQzPT0iJyArIHRoaXMuYWxpYXMgKyAnIikgeyBwcmludCAkMTsgfSB9fVwnXG5leGl0XG4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGNvbW1hbmQpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgaWYgKGFzU3RyaW5nID09IG51bGwgfHwgYXNTdHJpbmcgIT0gdHJ1ZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHJldC5pc0xvYWRlZCA9IGZ1bmN0aW9uIGlzTG9hZGVkKHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQ0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFBJRCh1aWQsIHRydWUpICE9ICcnKTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0LmlzUnVubmluZyA9IGZ1bmN0aW9uIGlzUnVubmluZyh1aWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0NCiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRQSUQodWlkKSA+IDApOw0KICAgICAgICB9Ow0KICAgICAgICByZXQuaXNNZSA9IGZ1bmN0aW9uIGlzTWUodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UElEKHVpZCkgPT0gcHJvY2Vzcy5waWQpOw0KICAgICAgICB9Ow0KICAgICAgICByZXQubG9hZCA9IGZ1bmN0aW9uIGxvYWQodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgc2VsZiA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7DQogICAgICAgICAgICB2YXIgdmVyID0gZ2V0T1NWZXJzaW9uKCk7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIHZhciBjb21tYW5kID0gJ2xvYWQnOw0KICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5kYWVtb24pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYodWlkIT1udWxsIHx8IHVpZCE9MCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRocm93ICgnTGF1bmNoRGFlbW9uIG11c3QgcnVuIGFzIHJvb3QnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHVpZCA9PSBudWxsKSB7IHVpZCA9IHNlbGY7IH0NCiAgICAgICAgICAgICAgICBpZih2ZXIuY29tcGFyZVRvKCcxMC4xMCcpIDwgMCAmJiB1aWQgIT0gc2VsZiAmJiBzZWxmICE9IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ09uIHRoaXMgdmVyc2lvbiBvZiBNYWNPUywgbXVzdCBiZSByb290IHRvIGxvYWQgdGhpcyBzZXJ2aWNlIGludG8gdGhlIHNwZWNpZmllZCB1c2VyIHNwYWNlJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZlci5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdib290c3RyYXAgZ3VpLycgKyB1aWQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIG9wdGlvbnMpOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgJyArIGNvbW1hbmQgKyAnICcgKyB0aGlzLnBsaXN0ICsgJ1xuXGV4aXRcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0LnVubG9hZCA9IGZ1bmN0aW9uIHVubG9hZCh1aWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7DQogICAgICAgICAgICB2YXIgdiA9IGdldE9TVmVyc2lvbigpOw0KICAgICAgICAgICAgdmFyIHNlbGYgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpOw0KICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7DQogICAgICAgICAgICB2YXIgdXNlQm9vdG91dCA9IGZhbHNlOw0KICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQ0KDQogICAgICAgICAgICBpZih1aWQhPW51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKCcxMC4xMCcpIDw9IDAgJiYgc2VsZiA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBzd2l0Y2ggdG8gdXNlciBjb250ZXh0IHRvIHVubG9hZCB0aGUgc2VydmljZQ0KICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0geyB1aWQ6IHVpZCB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZih2LmNvbXBhcmVUbygnMTAuMTAnKSA+IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlbGYgPT0gMCB8fCBzZWxmID09IHVpZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYm9vdG91dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3VmZmljaWVudCBhY2Nlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYgPT0gdWlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgdW5sb2FkLCBiZWN1YXNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCBjb250ZXh0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3VmZmljaWVudCBhY2Nlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKHNlbGYgPT0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmKHYuY29tcGFyZVRvKCcxMC4xMCcpID4gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGJvb3RvdXQNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCB1bmxvYWQNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyBJbnN1ZmZpY2llbnQgYWNjZXNzDQogICAgICAgICAgICAgICAgICAgIHRocm93ICgnTmVlZHMgZWxldmF0ZWQgcHJpdmlsZWdlcycpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBpZiAodXNlQm9vdG91dCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIGJvb3RvdXQgZ3VpLycgKyB1aWQgKyAnICcgKyB0aGlzLnBsaXN0ICsgJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCB1bmxvYWQgJyArIHRoaXMucGxpc3QgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH07DQogICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7DQogICAgICAgICAgICB2YXIgc2VsZiA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHNlbGY7IH0NCiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmID09IDApIHsgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsgfQ0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPiAwICYmIHNlbGYgIT0gMCAmJiB1aWQgIT0gc2VsZikgeyB0aHJvdyAoJ0Nhbm5vdCBzdGFydCBMYXVuY2hBZ2VudCBpbnRvIGFub3RoZXIgdXNlciBkb21haW4gd2hpbGUgbm90IHJvb3QnKTsgfQ0KICAgICAgICAgICAgaWYgKHRoaXMuZGFlbW9uICYmIHNlbGYgIT0gMCkgeyB0aHJvdyAoJ0Nhbm5vdCBzdGFydCBMYXVuY2hEYWVtb24gd2hpbGUgbm90IHJvb3QnKTsgfQ0KDQogICAgICAgICAgICB0aGlzLmxvYWQodWlkKTsNCg0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgc3RhcnQgJyArIHRoaXMuYWxpYXMgKyAnXG5cZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICB9Ow0KICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AodWlkKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsNCiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsNCiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0NCiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID09IG51bGwpIHsgdWlkID0gc2VsZjsgfQ0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPiAwICYmIHNlbGYgPT0gMCkgeyBvcHRpb25zID0geyB1aWQ6IHVpZCB9OyB9DQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA+IDAgJiYgc2VsZiAhPSAwICYmIHVpZCAhPSBzZWxmKSB7IHRocm93ICgnQ2Fubm90IHN0b3AgTGF1bmNoQWdlbnQgaW4gYW5vdGhlciB1c2VyIGRvbWFpbiB3aGlsZSBub3Qgcm9vdCcpOyB9DQogICAgICAgICAgICBpZiAodGhpcy5kYWVtb24gJiYgc2VsZiAhPSAwKSB7IHRocm93ICgnQ2Fubm90IHN0b3AgTGF1bmNoRGFlbW9uIHdoaWxlIG5vdCByb290Jyk7IH0NCg0KICAgICAgICAgICAgaWYgKCEodGhpcy5fa2VlcEFsaXZlID09ICdDcmFzaGVkJyB8fCB0aGlzLl9rZWVwQWxpdmUgPT0gJycpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgdW5sb2FkIHRoZSBzZXJ2aWNlLCByYXRoZXIgdGhhbiBzdG9wcGluZyBpdCwgYmVjYXVzZSBvdGhlcndpc2UgaXQnbGwgbGlrZWx5IHJlc3RhcnQNCiAgICAgICAgICAgICAgICB0aGlzLnVubG9hZCh1aWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBzdG9wICcgKyB0aGlzLmFsaWFzICsgJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KHVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQ0KICAgICAgICAgICAgaWYgKGdldE9TVmVyc2lvbigpLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPT0gbnVsbCkgeyB1aWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpOyB9DQogICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHVubG9hZCAnICsgdGhpcy5wbGlzdCArICdcbmxhdW5jaGN0bCBsb2FkICcgKyB0aGlzLnBsaXN0ICsgJ1xubGF1bmNoY3RsIHN0YXJ0ICcgKyB0aGlzLmFsaWFzICsgJ1xuZXhpdFxuJzsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgZGV0YWNoZWQ6IHRydWUsIHVpZDogdWlkIH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGNvbW1hbmQpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSB0aGlzLmRhZW1vbiA/ICgnc3lzdGVtLycgKyB0aGlzLmFsaWFzKSA6ICgnZ3VpLycgKyAodWlkICE9IG51bGwgPyB1aWQgOiByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpKSArICcvJyArIHRoaXMuYWxpYXMpOw0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBraWNrc3RhcnQgLWsgJyArIGNvbW1hbmQgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCn0NCg0KDQoNCmZ1bmN0aW9uIHNlcnZpY2VNYW5hZ2VyKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdzZXJ2aWNlLW1hbmFnZXInOw0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpIA0KICAgIHsNCiAgICAgICAgdGhpcy5HTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KICAgICAgICB0aGlzLnByb3h5ID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdPcGVuU0NNYW5hZ2VyQScpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnRW51bVNlcnZpY2VzU3RhdHVzRXhXJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdPcGVuU2VydmljZVcnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZVN0YXR1c0V4Jyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdRdWVyeVNlcnZpY2VDb25maWdBJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdRdWVyeVNlcnZpY2VDb25maWcyQScpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ29udHJvbFNlcnZpY2UnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1N0YXJ0U2VydmljZUEnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0Nsb3NlU2VydmljZUhhbmRsZScpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ3JlYXRlU2VydmljZVcnKTsNCiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NoYW5nZVNlcnZpY2VDb25maWcyVycpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnRGVsZXRlU2VydmljZScpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7DQogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdDaGVja1Rva2VuTWVtYmVyc2hpcCcpOw0KICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnRnJlZVNpZCcpOw0KDQogICAgICAgIHRoaXMucHJveHkyID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7DQogICAgICAgIHRoaXMucHJveHkyLkNyZWF0ZU1ldGhvZCgnR2V0TGFzdEVycm9yJyk7DQoNCiAgICAgICAgdGhpcy5pc0FkbWluID0gZnVuY3Rpb24gaXNBZG1pbigpIHsNCiAgICAgICAgICAgIHZhciBOVEF1dGhvcml0eSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNik7DQogICAgICAgICAgICBOVEF1dGhvcml0eS50b0J1ZmZlcigpLndyaXRlSW50OCg1LCA1KTsNCiAgICAgICAgICAgIHZhciBBZG1pbmlzdHJhdG9yc0dyb3VwID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7DQogICAgICAgICAgICB2YXIgYWRtaW4gPSBmYWxzZTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKE5UQXV0aG9yaXR5LCAyLCAzMiwgNTQ0LCAwLCAwLCAwLCAwLCAwLCAwLCBBZG1pbmlzdHJhdG9yc0dyb3VwKS5WYWwgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5HTS5DcmVhdGVJbnRlZ2VyKCk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hlY2tUb2tlbk1lbWJlcnNoaXAoMCwgQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpLCBtZW1iZXIpLlZhbCAhPSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlci50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpICE9IDApIHsgYWRtaW4gPSB0cnVlOyB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMucHJveHkuRnJlZVNpZChBZG1pbmlzdHJhdG9yc0dyb3VwLkRlcmVmKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGFkbWluOw0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldFByb2dyYW1Gb2xkZXIgPSBmdW5jdGlvbiBnZXRQcm9ncmFtRm9sZGVyKCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIDY0IGJpdCBXaW5kb3dzDQogICAgICAgICAgICAgICAgaWYgKHRoaXMuR00u", 16000); + memcpy_s(_servicemanager + 32000, 112680, "UG9pbnRlclNpemUgPT0gNCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnUHJvZ3JhbUZpbGVzKHg4NiknXTsgICAgLy8gMzIgQml0IEFwcA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMnXTsgICAgICAgICAgICAgLy8gNjQgYml0IEFwcA0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyAzMiBiaXQgV2luZG93cw0KICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMnXTsgICAgICAgICAgICAgICAgIA0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLmdldFNlcnZpY2VGb2xkZXIgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlRm9sZGVyKCkgeyByZXR1cm4gdGhpcy5nZXRQcm9ncmFtRm9sZGVyKCkgKyAnXFxtZXNoJzsgfTsNCg0KICAgICAgICB0aGlzLmVudW1lcmF0ZVNlcnZpY2UgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgbWFjaGluZU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciBkYk5hbWUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciBoYW5kbGUgPSB0aGlzLnByb3h5Lk9wZW5TQ01hbmFnZXJBKDB4MDAsIDB4MDAsIDB4MDAwMSB8IDB4MDAwNCk7DQoNCiAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgdmFyIHNlcnZpY2VzUmV0dXJuZWQgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIHZhciByZXN1bWVIYW5kbGUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsNCiAgICAgICAgICAgIC8vdmFyIHNlcnZpY2VzID0gdGhpcy5wcm94eS5DcmVhdGVWYXJpYWJsZSgyNjIxNDQpOw0KICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSB0aGlzLnByb3h5LkVudW1TZXJ2aWNlc1N0YXR1c0V4VyhoYW5kbGUsIDAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMDMsIDB4MDAsIDB4MDAsIGJ5dGVzTmVlZGVkLCBzZXJ2aWNlc1JldHVybmVkLCByZXN1bWVIYW5kbGUsIDB4MDApOw0KDQogICAgICAgICAgICB2YXIgcHRyU2l6ZSA9IGRiTmFtZS5fc2l6ZTsNCiAgICAgICAgICAgIHZhciBzeiA9IGJ5dGVzTmVlZGVkLkRlcmVmKDAsIGRiTmFtZS5fc2l6ZSkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCg0KICAgICAgICAgICAgaWYgKHN6IDwgMCkgeyB0aHJvdyAoJ2Vycm9yIGVudW1lcmF0aW5nIHNlcnZpY2VzJyk7IH0NCg0KICAgICAgICAgICAgdmFyIHNlcnZpY2VzID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShzeik7DQogICAgICAgICAgICB0aGlzLnByb3h5LkVudW1TZXJ2aWNlc1N0YXR1c0V4VyhoYW5kbGUsIDAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMDMsIHNlcnZpY2VzLCBzeiwgYnl0ZXNOZWVkZWQsIHNlcnZpY2VzUmV0dXJuZWQsIHJlc3VtZUhhbmRsZSwgMHgwMCk7DQoNCiAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSAzNiArICgyICogcHRyU2l6ZSk7DQogICAgICAgICAgICBibG9ja1NpemUgKz0gKChwdHJTaXplIC0gKGJsb2NrU2l6ZSAlIHB0clNpemUpKSAlIHB0clNpemUpOw0KICAgICAgICAgICAgdmFyIHJldFZhbCA9IFtdOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlc1JldHVybmVkLkRlcmVmKDAsIGRiTmFtZS5fc2l6ZSkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsgKytpKQ0Kew0KICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHNlcnZpY2VzLkRlcmVmKGkgKiBibG9ja1NpemUsIGJsb2NrU2l6ZSk7DQogICAgICAgICAgICAgICAgdmFyIGogPSB7fTsNCiAgICAgICAgICAgICAgICBqLm5hbWUgPSB0b2tlbi5EZXJlZigwLCBwdHJTaXplKS5EZXJlZigpLldpZGUyVVRGODsNCiAgICAgICAgICAgICAgICBqLmRpc3BsYXlOYW1lID0gdG9rZW4uRGVyZWYocHRyU2l6ZSwgcHRyU2l6ZSkuRGVyZWYoKS5XaWRlMlVURjg7DQogICAgICAgICAgICAgICAgai5zdGF0dXMgPSBwYXJzZVNlcnZpY2VTdGF0dXModG9rZW4uRGVyZWYoMiAqIHB0clNpemUsIDM2KSk7DQogICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goaik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShuYW1lLCB7IHdpZGU6IHRydWUgfSk7DQogICAgICAgICAgICB2YXIgcHRyID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7DQogICAgICAgICAgICB2YXIgYnl0ZXNOZWVkZWQgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKHB0ci5fc2l6ZSk7DQogICAgICAgICAgICB2YXIgaGFuZGxlID0gdGhpcy5wcm94eS5PcGVuU0NNYW5hZ2VyQSgweDAwLCAweDAwLCAweDAwMDEgfCAweDAwMDQgfCAweDAwMjAgfCAweDAwMTApOw0KICAgICAgICAgICAgaWYgKGhhbmRsZS5WYWwgPT0gMCkgeyB0aHJvdyAoJ2NvdWxkIG5vdCBvcGVuIFNlcnZpY2VNYW5hZ2VyJyk7IH0NCiAgICAgICAgICAgIHZhciBoID0gdGhpcy5wcm94eS5PcGVuU2VydmljZVcoaGFuZGxlLCBzZXJ2aWNlTmFtZSwgMHgwMDAxIHwgMHgwMDAyIHwgMHgwMDA0IHwgMHgwMDIwIHwgMHgwMDEwIHwgMHgwMDAxMDAwMCk7DQogICAgICAgICAgICBpZiAoaC5WYWwgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgcmV0VmFsID0geyBfT2JqZWN0SUQ6ICdzZXJ2aWNlLW1hbmFnZXIuc2VydmljZScgfQ0KICAgICAgICAgICAgICAgIHJldFZhbC5fc2NtID0gaGFuZGxlOw0KICAgICAgICAgICAgICAgIHJldFZhbC5fc2VydmljZSA9IGg7DQogICAgICAgICAgICAgICAgcmV0VmFsLl9HTSA9IHRoaXMuR007DQogICAgICAgICAgICAgICAgcmV0VmFsLl9wcm94eSA9IHRoaXMucHJveHk7DQogICAgICAgICAgICAgICAgcmV0VmFsLl9wcm94eTIgPSB0aGlzLnByb3h5MjsNCiAgICAgICAgICAgICAgICByZXRWYWwubmFtZSA9IG5hbWU7DQoNCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnc3RhdHVzJywgDQogICAgICAgICAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZXNOZWVkZWQgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSh0aGlzLl9HTS5Qb2ludGVyU2l6ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJveHkuUXVlcnlTZXJ2aWNlU3RhdHVzRXgodGhpcy5fc2VydmljZSwgMCwgMCwgMCwgYnl0ZXNOZWVkZWQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKGJ5dGVzTmVlZGVkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm94eS5RdWVyeVNlcnZpY2VTdGF0dXNFeCh0aGlzLl9zZXJ2aWNlLCAwLCBzdCwgc3QuX3NpemUsIGJ5dGVzTmVlZGVkKS5WYWwgIT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihwYXJzZVNlcnZpY2VTdGF0dXMoc3QpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh7IHN0YXRlOiAnVU5LTk9XTicgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBpZiAocmV0VmFsLnN0YXR1cy5zdGF0ZSAhPSAnVU5LTk9XTicpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXRWYWwpOw0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2xvc2UgPSBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9zZXJ2aWNlICYmIHRoaXMuX3NjbSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUodGhpcy5fc2VydmljZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKHRoaXMuX3NjbSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZSA9IHRoaXMuX3NjbSA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5vbignficsIHJldFZhbC5jbG9zZSk7DQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5pc01lID0gZnVuY3Rpb24gaXNNZSgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQodGhpcy5zdGF0dXMucGlkKSA9PSBwcm9jZXNzLnBpZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZhaWx1cmVBY3Rpb25zKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5fR00uQ3JlYXRlVmFyaWFibGUodGhpcy5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLmxlbmd0aCAqIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVuKnNpemVvZihTQ19BQ1RJT04pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMubGVuZ3RoICYmIGkgPCAzOyArK2kpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKGkqOCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZhaWx1cmVBY3Rpb25Ub0ludGVnZXIodGhpcy5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zW2ldLnR5cGUpKTsgICAvLyBTQ19BQ1RJT05baV0udHlwZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDQrKGkqOCksIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh0aGlzLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnNbaV0uZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05baV0uZGVsYXkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXBkYXRlZEZhaWx1cmVBY3Rpb25zID0gdGhpcy5fR00uQ3JlYXRlVmFyaWFibGUoNDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZW9mKFNFUlZJQ0VfRkFJTFVSRV9BQ1RJT05TKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGYWlsdXJlQWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodGhpcy5mYWlsdXJlQWN0aW9ucy5yZXNldFBlcmlvZCk7ICAgIC8vIGR3UmVzZXRQZXJpb2QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRmFpbHVyZUFjdGlvbnMuRGVyZWYodGhpcy5fR00uUG9pbnRlclNpemUgPT0gOCA/IDI0IDogMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh0aGlzLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMubGVuZ3RoKTsgLy8gY0FjdGlvbnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHVwZGF0ZWRGYWlsdXJlQWN0aW9ucy5EZXJlZih0aGlzLl9HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMzIgOiAxNiwgdGhpcy5fR00uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm94eS5DaGFuZ2VTZXJ2aWNlQ29uZmlnMlcodGhpcy5fc2VydmljZSwgMiwgdXBkYXRlZEZhaWx1cmVBY3Rpb25zKS5WYWwgPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCdVbmFibGUgdG8gc2V0IEZhaWx1cmVBY3Rpb25zLi4uJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXRoID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgdGhpcy5uYW1lLCAnSW1hZ2VQYXRoJykudG9TdHJpbmcoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBpbWFnZVBhdGguc3BsaXQoJy5leGUnKVswXSArICcuZXhlJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuc3RhcnRzV2l0aCgnIicpKSB7IHJldCA9IHJldC5zdWJzdHJpbmcoMSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLmFwcExvY2F0aW9uKCkuc3BsaXQoJ1xcJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRva2Vucy5qb2luKCdcXCcpKTsNCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmlzUnVubmluZyA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5zdGF0dXMuc3RhdGUgPT0gJ1JVTk5JTkcnKTsNCiAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3N0b3BFeCA9IGZ1bmN0aW9uKHMsIHApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gcy5zdGF0dXMuc3RhdGU7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1RPUFBFRCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlcygnU1RPUFBFRCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTVE9QX1BFTkRJTkcnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9lbGFwc2VkVGltZSA9IERhdGUubm93KCkgLSBwLl9zdGFydFRpbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLl9lbGFwc2VkVGltZSA8IDEwMDAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnRpbWVyID0gc2V0VGltZW91dChzLl9zdG9wRXgsIHAuX3dhaXRUaW1lLCBzLCBwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlaigndGltZW91dCB3YWl0aW5nIGZvciBzZXJ2aWNlIHRvIHN0b3AnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9yZWooJ1VuZXhwZWN0ZWQgc3RhdGU6ICcgKyBjdXJyZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RvcCA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXR1czsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5zdGF0ZSA9PSAnUlVOTklORycpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBTZXJ2aWNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld3N0YXRlID0gdGhpcy5fR00uQ3JlYXRlVmFyaWFibGUoMzYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWFzb247DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fcHJveHkuQ29udHJvbFNlcnZpY2UodGhpcy5fc2VydmljZSwgMHgwMDAwMDAwMSwgbmV3c3RhdGUpLlZhbCA9PSAwICYmIChyZWFzb24gPSB0aGlzLl9wcm94eTIuR2V0TGFzdEVycm9yKCkuVmFsKSE9MCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKHRoaXMubmFtZSArICcuc3RvcCgpIGZhaWxlZCB3aXRoIGVycm9yOiAnICsgcmVhc29uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gc2V0dXAgYSB0aW1lZCBjYWxsYmFjayB0byBjaGVjayB0aGUgc3RhdHVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9lbGFwc2VkVGltZSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fd2FpdFRpbWUgPSBzdGF0dXMud2FpdEhpbnQgLyAxMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5fd2FpdFRpbWUgPCA1MDApIHsgcmV0Ll93YWl0VGltZSA9IDUwMDsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0Ll93YWl0VGltZSA+IDUwMDApIHsgcmV0Ll93YWl0VGltZSA9IDUwMDA7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnRpbWVyID0gc2V0VGltZW91dCh0aGlzLl9zdG9wRXgsIHJldC5fd2FpdFRpbWUsIHRoaXMsIHJldCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKCdjYW5ub3QgY2FsbCAnICsgdGhpcy5uYW1lICsgJy5zdG9wKCksIHdoZW4gY3VycmVudCBzdGF0ZSBpczogJyArIHRoaXMuc3RhdHVzLnN0YXRlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnQgPSBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMuc3RhdGUgPT0gJ1NUT1BQRUQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWNjZXNzID0gdGhpcy5fcHJveHkuU3RhcnRTZXJ2aWNlQSh0aGlzLl9zZXJ2aWNlLCAwLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcyA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHRoaXMubmFtZSArICcuc3RhcnQoKSBmYWlsZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdjYW5ub3QgY2FsbCAnICsgdGhpcy5uYW1lICsgJy5zdGFydCgpLCB3aGVuIGN1cnJlbnQgc3RhdGUgaXM6ICcgKyB0aGlzLnN0YXR1cy5zdGF0ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJlc3RhcnQgPSBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01lKCkpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gcmVzdGFydCBvdXJzZWx2ZXMgb24gV2luZG93cywgd2UgbXVzdCBzcGF3biBhIGRldGFjaGVkIGNoaWxkIHByb2Nlc3MsIGJlY3Vhc2Ugd2UgbmVlZCB0byBjYWxsIHN0YXJ0LCBvbmNlIHdlIGFyZSBzdG9wcGVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQoJ1xcJykucG9wKCksICctZXhlYyAiJyArICJyZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UoJyIgKyB0aGlzLm5hbWUgKyAiJykucmVzdGFydCgpLmZpbmFsbHkoZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTsiICsgJyInXSwgeyB0eXBlOiA0LCBkZXRhY2hlZDogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMuc3RvcCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RhcnRwID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fYSA9IGE7IHRoaXMuX3IgPSByOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnNlcnZpY2UgPSB0aGlzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAg", 16000); + memcpy_s(_servicemanager + 48000, 96680, "IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5zdGFydCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0cC5fcihlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0cC5fYSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7IGNvbnNvbGUucmF3TG9nKCdzdG9wKCkgZmFpbGVkID0+ICcgKyBlLnRvU3RyaW5nKCkpO30pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocC5zdGFydHApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5LlF1ZXJ5U2VydmljZUNvbmZpZ0EoaCwgMCwgMCwgcXVlcnlfc2VydmljZV9jb25maWdhX0RXT1JEKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID4gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUocXVlcnlfc2VydmljZV9jb25maWdhX0RXT1JELnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWdBKGgsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYSwgcXVlcnlfc2VydmljZV9jb25maWdhLl9zaXplLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQpLlZhbCAhPSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2EuRGVyZWYodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA0ID8gMjggOiA0OCwgdGhpcy5HTS5Qb2ludGVyU2l6ZSkuRGVyZWYoKS5TdHJpbmc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ3VzZXInLCB7IHZhbHVlOiB2YWwgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYS5EZXJlZig0LDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0YXJ0VHlwZSA9ICdBVVRPX1NUQVJUJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDM6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnRUeXBlID0gJ0RFTUFORF9TVEFSVCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0YXJ0VHlwZSA9ICdESVNBQkxFRCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgIHZhciBmYWlsdXJlYWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoODE5Mik7DQogICAgICAgICAgICAgICAgICAgIHZhciBibmVlZGVkID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg0KTsgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWcyQShoLCAyLCBmYWlsdXJlYWN0aW9ucywgODE5MiwgYm5lZWRlZCkuVmFsICE9IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjQWN0aW9ucyA9IGZhaWx1cmVhY3Rpb25zLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDI0IDogMTIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zID0ge307DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMucmVzZXRQZXJpb2QgPSBmYWlsdXJlYWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGFjdCA9IDAgOyBhY3QgPCBjQWN0aW9uczsgKythY3QpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IGZhaWx1cmVhY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuR00uUG9pbnRlclNpemUpLkRlcmVmKCkuRGVyZWYoYWN0KjgsOCkudG9CdWZmZXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYWN0aW9uLnJlYWRVSW50MzJMRSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdOT05FJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ1NFUlZJQ0VfUkVTVEFSVCcgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdSRUJPT1QnIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ09USEVSJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wZWVrKCkuZGVsYXkgPSBhY3Rpb24ucmVhZFVJbnQzMkxFKDQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRoaXMucHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKGhhbmRsZSk7DQogICAgICAgICAgICB0aHJvdyAoJ2NvdWxkIG5vdCBmaW5kIHNlcnZpY2U6ICcgKyBuYW1lKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICAvLyBMaW51eCwgTWFjT1MsIEZyZWVCU0QNCg0KICAgICAgICB0aGlzLmlzQWRtaW4gPSBmdW5jdGlvbiBpc0FkbWluKCkgDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmlzUm9vdCgpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gZ2V0U2VydmljZShuYW1lKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWV9Ow0KICAgICAgICAgICAgICAgIGlmKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9yYy5kLycgKyBuYW1lKSkgDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncmMnLCB7IHZhbHVlOiAnL2V0Yy9yYy5kLycgKyBuYW1lIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgbmFtZSkpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncmMnLCB7IHZhbHVlOiAnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgbmFtZSB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdTZXJ2aWNlOiAnICsgbmFtZSArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJzdGFydFR5cGUiLA0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgcmN2YXIgfCBncmVwIF9lbmFibGU9IHwgYXdrIFwneyBhPXNwbGl0KCQwLCBiLCAiXFwiIik7IGlmKGJbMl09PSJZRVMiKSB7IHByaW50ICJZRVMiOyB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gJ0RFTUFORF9TVEFSVCcgOiAnQVVUT19TVEFSVCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGRlc2M9IHwgYXdrIC1GPSAnIiArICd7IGlmKCQxPT0iZGVzYyIpIHsgJDE9IiI7IGE9c3BsaXQoJDAsIHJlcywgIlxcIiIpOyBpZihhPjEpIHsgcHJpbnQgcmVzWzJdOyB9IGVsc2UgeyBwcmludCAkMDsgfSB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwICIgKyB0aGlzLm5hbWUgKyAiX2NoZGlyPSB8IGF3ayAtRj0gJ3sgcHJpbnQgJDIgfScgfCBhd2sgLUZcXFwiICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCiAgICAgICAgICAgICAgICAgICAgaWYocmV0ID09ICcnKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJjLnNwbGl0KCcvJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQuam9pbignLycpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uIGFwcExvY2F0aW9uKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQoJCSAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGNvbW1hbmQ9IHwgYXdrIC1GPSAneyBwcmludCAkMiB9JyB8IGF3ayAtRlxcXCIgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KCQkgICAgICAgICAgICB2YXIgdG1wID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJyR7bmFtZX0nKS5qb2luKHRoaXMubmFtZSk7DQoJCSAgICAgICAgICAgIGlmKHRtcD09Jy91c3Ivc2Jpbi9kYWVtb24nKQ0KCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQoJCQkgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoJCQkgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0ICcgKyB0aGlzLnJjICsgJyB8IGdyZXAgY29tbWFuZF9hcmdzPSB8IGF3ayAtRiItZiAiIFwneyAkMT0iIjsgc3BsaXQoJDAsIHJlcywgIlxcIiIpOyBzcGxpdChyZXNbMV0sIHQsICIgIik7IHByaW50IHRbMV07IH1cJ1xuZXhpdFxuJyk7DQoJCQkgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KCQkJICAgICAgICAgICAgcmV0dXJuKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAJCSAgICAgICAgfQ0KCQkgICAgICAgICAgICBlbHNlDQoJCSAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOw0KCQkgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhdHVzIHwgYXdrICd7IHByaW50ICQzIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAncnVubmluZycpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhdHVzIHwgYXdrICd7IHNwbGl0KCQ2LCByZXMsIFwiLlwiKTsgcHJpbnQgcmVzWzFdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID09IHByb2Nlc3MucGlkKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0b3BcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0LnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVzdGFydFxuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICByZXQucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVyZXN0YXJ0XG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gZ2V0U2VydmljZShuYW1lKSB7IHJldHVybiAoZmV0Y2hQbGlzdCgnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucycsIG5hbWUpKTsgfTsNCiAgICAgICAgICAgIHRoaXMuZ2V0TGF1bmNoQWdlbnQgPSBmdW5jdGlvbiBnZXRMYXVuY2hBZ2VudChuYW1lLCB1c2VyaWQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHVzZXJpZCA9PSBudWxsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmZXRjaFBsaXN0KCcvTGlicmFyeS9MYXVuY2hBZ2VudHMnLCBuYW1lKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmV0Y2hQbGlzdChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcihyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VXNlcm5hbWUodXNlcmlkKSkgKyAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzJywgbmFtZSwgdXNlcmlkKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSwgcGxhdGZvcm0pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCFwbGF0Zm9ybSkgeyBwbGF0Zm9ybSA9IHRoaXMuZ2V0U2VydmljZVR5cGUoKTsgfQ0KICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH0sIHNlcnZpY2VUeXBlOiBwbGF0Zm9ybX07DQogICAgICAgICAgICAgICAgc3dpdGNoKHBsYXRmb3JtKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAg", 16000); + memcpy_s(_servicemanager + 64000, 80680, "ICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LmQvJyArIG5hbWUpKSB7IHBsYXRmb3JtID0gJ2luaXQnOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKSkgeyBwbGF0Zm9ybSA9ICd1cHN0YXJ0JzsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbGF0Zm9ybSA9PSAnaW5pdCcgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsYXRmb3JtID09ICd1cHN0YXJ0JyAmJiByZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC8nICsgbmFtZSArICcuY29uZicpKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuY29uZiA9IChwbGF0Zm9ybSA9PSAndXBzdGFydCcgPyAoJy9ldGMvaW5pdCcgKyBuYW1lICsgJy5jb25mJykgOiAoJy9ldGMvaW5pdC5kLycgKyBuYW1lKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnNlcnZpY2VUeXBlID0gcGxhdGZvcm07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgInN0YXJ0VHlwZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlVHlwZSA9PSAndXBzdGFydCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0ICcgKyB0aGlzLmNvbmYgKyAnIHwgZ3JlcCAic3RhcnQgb24gcnVubGV2ZWwiXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2ZpbmQgL2V0Yy9yYyogLW1heGRlcHRoIDIgLXR5cGUgbCAtbHMgfCBncmVwICIgLi4vaW5pdC5kLycgKyB0aGlzLm5hbWUgKyAnIiB8IGF3ayAtRiItPiAiIFwneyBpZigkMj09Ii4uL2luaXQuZC8nICsgdGhpcy5uYW1lICsgJyIpIHsgcHJpbnQgInRydWUiOyB9IH1cJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/ICdERU1BTkRfU1RBUlQnIDogJ0FVVE9fU1RBUlQnKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVzY3JpcHRpb24ucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCBkZXNjcmlwdGlvbiB8IGF3ayAnIiArICd7IGlmKCQxPT0iZGVzY3JpcHRpb24iKSB7ICQxPSIiOyBhPXNwbGl0KCQwLCByZXMsICJcXCIiKTsgaWYoYT4xKSB7IHByaW50IHJlc1syXTsgfSBlbHNlIHsgcHJpbnQgJDA7IH19fVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwIFNob3J0LURlc2NyaXB0aW9uOiB8IGF3ayAnIiArICd7IGlmKCQyPT0iU2hvcnQtRGVzY3JpcHRpb246IikgeyAkMT0iIjsgJDI9IiI7IHByaW50ICQwOyB9fVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBwV29ya2luZ0RpcmVjdG9yeS5wbGF0Zm9ybSA9PSAnaW5pdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwICdTQ1JJUFQ9JyB8IGF3ayAtRj0gJ3sgbGVuPXNwbGl0KCQyLCBhLCBcIi9cIik7IHByaW50IHN1YnN0cigkMiwwLGxlbmd0aCgkMiktbGVuZ3RoKGFbbGVuXSkpOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCAnY2hkaXIgJyB8IGF3ayAne3ByaW50ICQyfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXBwTG9jYXRpb24ucGxhdGZvcm0gPT0gJ2luaXQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC5kLyIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnU0NSSVBUPScgfCBhd2sgLUY9ICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCAnZXhlYyAnIHwgYXdrICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24ucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNNZSA9IGZ1bmN0aW9uIGlzTWUoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01lLnBsYXRmb3JtID09ICd1cHN0YXJ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImluaXRjdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgYXdrICd7cHJpbnQgJDJ9JyB8IGF3ayAtRiwgJ3twcmludCAkNH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIHN0YXR1cyB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDR9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSdW5uaW5nLnBsYXRmb3JtID09ICd1cHN0YXJ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImluaXRjdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgYXdrICd7cHJpbnQgJDJ9JyB8IGF3ayAtRiwgJ3twcmludCAkMX0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIHN0YXR1cyB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnc3RhcnQvcnVubmluZycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzUnVubmluZy5wbGF0Zm9ybSA9IHBsYXRmb3JtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0LnBsYXRmb3JtID09ICd1cHN0YXJ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2luaXRjdGwgc3RhcnQgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RhcnRcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQucGxhdGZvcm0gPSBwbGF0Zm9ybTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcC5wbGF0Zm9ybSA9PSAndXBzdGFydCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0b3AgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RvcFxuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdG9wLnBsYXRmb3JtID0gcGxhdGZvcm07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RhcnQucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW5pdGN0bCByZXN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHJlc3RhcnRcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucmVzdGFydC5wbGF0Zm9ybSA9IHBsYXRmb3JtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Ll9zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuX3N0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5wbGF0Zm9ybSA9PSAndXBzdGFydCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXR1cyAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgdGhpcy5uYW1lICsgJyBzdGF0dXNcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0Ll9zdHIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0YXR1cy5wbGF0Zm9ybSA9IHBsYXRmb3JtOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAocGxhdGZvcm0gKyAnIFNlcnZpY2UgKCcgKyBuYW1lICsgJykgTk9UIEZPVU5EJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmNvbmYgPSAnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZSc7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAg", 16000); + memcpy_s(_servicemanager + 80000, 64680, "ICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmNvbmYgPSAnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5jb25mKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJzdGFydFR5cGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBzdGF0dXMgJyArIHRoaXMubmFtZSArICcgfCBncmVwIExvYWRlZDogfCBhd2sgXCd7IGE9c3BsaXQoJDAsIGIsICI7Iik7IGZvcihjPTE7Yzw9YTsrK2MpIHsgaWYoYltjXT09ImVuYWJsZWQiIHx8IGJbY109PSIgZW5hYmxlZCIpIHsgcHJpbnQgInRydWUiOyB9IH0gfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyAnREVNQU5EX1NUQVJUJyA6ICdBVVRPX1NUQVJUJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnIHwgZ3JlcCBEZXNjcmlwdGlvbj0gfCBhd2sgLUY9IFwneyBpZigkMT09IkRlc2NyaXB0aW9uIikgeyAkMT0iIjsgcHJpbnQgJDA7IH19XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyB0aGlzLm5hbWUgKyAnLnNlcnZpY2UnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdXb3JraW5nRGlyZWN0b3J5PScgfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nXG5cZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdXb3JraW5nRGlyZWN0b3J5PScgfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nXG5cZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIHRoaXMubmFtZSArICcuc2VydmljZScpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9saWIvc3lzdGVtZC9zeXN0ZW0vIiArIHRoaXMubmFtZSArICIuc2VydmljZSB8IGdyZXAgJ0V4ZWNTdGFydD0nIHwgYXdrIC1GPSAneyBzcGxpdCgkMiwgYSwgXCIgXCIpOyBwcmludCBhWzFdIH0nXG5cZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdFeGVjU3RhcnQ9JyB8IGF3ayAtRj0gJ3sgc3BsaXQoJDIsIGEsIFwiIFwiKTsgcHJpbnQgYVsxXSB9J1xuXGV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic3lzdGVtY3RsIHN0YXR1cyAiICsgdGhpcy5uYW1lICsgIiB8IGdyZXAgJ01haW4gUElEOicgfCBhd2sgJ3twcmludCAkM30nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzUnVubmluZyA9IGZ1bmN0aW9uIGlzUnVubmluZygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN5c3RlbWN0bCBzdGF0dXMgIiArIHRoaXMubmFtZSArICIgfCBncmVwICdBY3RpdmU6JyB8IGF3ayAne3ByaW50ICQyfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICdhY3RpdmUnKTsgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhcnQgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RvcCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCByZXN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5fc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLl9zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhdHVzICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuX3N0cik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHBsYXRmb3JtICsgJyBTZXJ2aWNlICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ1Vua25vd24gU2VydmljZSBQbGF0Zm9ybTogJyArIHBsYXRmb3JtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5lbnVtZXJhdGVTZXJ2aWNlID0gZnVuY3Rpb24gKG9wdGlvbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107DQogICAgICAgICAgICB2YXIgcGF0aHMgPSBbXTsNCiAgICAgICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKChvcHRpb25zICYmIG9wdGlvbnMucGxhdGZvcm1UeXBlKT9vcHRpb25zLnBsYXRmb3JtVHlwZSA6IHRoaXMuZ2V0U2VydmljZVR5cGUoKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2V0Yy9pbml0LmQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9ldGMvaW5pdCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2xpYi9zeXN0ZW1kL3N5c3RlbScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnZnJlZWJzZCc6DQogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9ldGMvcmMuZCcpOw0KICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvdXNyL2xvY2FsL2V0Yy9yYy5kJyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6DQogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTsNCiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBwYXRocykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgZmlsZXMgPSByZXF1aXJlKCdmcycpLnJlYWRkaXJTeW5jKHBhdGhzW2ldKTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGogaW4gZmlsZXMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGludXgnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKG9wdGlvbnMgJiYgb3B0aW9ucy5wbGF0Zm9ybVR5cGUpID8gb3B0aW9ucy5wbGF0Zm9ybVR5cGUgOiB0aGlzLmdldFNlcnZpY2VUeXBlKCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbml0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0sICdpbml0JykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5jb25mJykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLnNwbGl0KCcuY29uZicpWzBdLCAndXBzdGFydCcpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tqXS5lbmRzV2l0aCgnLnNlcnZpY2UnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0uc3BsaXQoJy5zZXJ2aWNlJylbMF0sICdzeXN0ZW1kJykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmcmVlYnNkJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAg", 16000); + memcpy_s(_servicemanager + 96000, 48680, "ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2pdLmVuZHNXaXRoKCcucGxpc3QnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZmV0Y2hQbGlzdChwYXRoc1tpXSwgZmlsZXNbal0uc3BsaXQoJy5wbGlzdCcpWzBdKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gcmVzdWx0cykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1trXS5kZXNjcmlwdGlvbikgeyByZXN1bHRzW2tdLmRlc2NyaXB0aW9uID0gcmVzdWx0c1trXS5kZXNjcmlwdGlvbigpOyB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMpOw0KICAgICAgICB9Ow0KICAgIH0NCiAgICB0aGlzLmluc3RhbGxTZXJ2aWNlID0gZnVuY3Rpb24gaW5zdGFsbFNlcnZpY2Uob3B0aW9ucykNCiAgICB7DQogICAgICAgIGlmICghb3B0aW9ucy50YXJnZXQpIHsgb3B0aW9ucy50YXJnZXQgPSBvcHRpb25zLm5hbWU7IH0NCiAgICAgICAgaWYgKCFvcHRpb25zLmRpc3BsYXlOYW1lKSB7IG9wdGlvbnMuZGlzcGxheU5hbWUgPSBvcHRpb25zLm5hbWU7IH0NCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyBhZG1pbicpOyB9DQoNCiAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSBzdGFydCwgd2UgbmVlZCB0byBjb3B5IHRoZSBiaW5hcnkgdG8gdGhlIHJpZ2h0IHBsYWNlDQogICAgICAgICAgICB2YXIgZm9sZGVyID0gdGhpcy5nZXRTZXJ2aWNlRm9sZGVyKCk7DQogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKGZvbGRlcik7IH0NCiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUpOyB9DQoNCiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsIGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgb3B0aW9ucy50YXJnZXQgKyAnLmV4ZScpOw0KICAgICAgICAgICAgb3B0aW9ucy5zZXJ2aWNlUGF0aCA9IGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgb3B0aW9ucy50YXJnZXQgKyAnLmV4ZSc7DQoNCiAgICAgICAgICAgIHZhciBzZXJ2aWNlUGF0aCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoJyInICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCArICciJywgeyB3aWRlOiB0cnVlIH0pOw0KICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAyKTsNCiAgICAgICAgICAgIGlmIChoYW5kbGUuVmFsID09IDApIHsgdGhyb3cgKCdlcnJvciBvcGVuaW5nIFNDTWFuYWdlcicpOyB9DQogICAgICAgICAgICB2YXIgc2VydmljZU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKG9wdGlvbnMubmFtZSwgeyB3aWRlOiB0cnVlIH0pOw0KICAgICAgICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShvcHRpb25zLmRpc3BsYXlOYW1lLCB7IHdpZGU6IHRydWV9KTsNCiAgICAgICAgICAgIHZhciBhbGxBY2Nlc3MgPSAweDAwMEYwMUZGOw0KICAgICAgICAgICAgdmFyIHNlcnZpY2VUeXBlOw0KICAgICAgICAgICAgDQoNCiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpIHsNCiAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoNCiAgICAgICAgICAgICAgICAgICAgc2VydmljZVR5cGUgPSAweDAyOyAvLyBBdXRvbWF0aWMNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnREVNQU5EX1NUQVJUJzoNCiAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSA9IDB4MDM7IC8vIE1hbnVhbA0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdESVNBQkxFRCc6DQogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwNDsgLy8gRGlzYWJsZWQNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBoID0gdGhpcy5wcm94eS5DcmVhdGVTZXJ2aWNlVyhoYW5kbGUsIHNlcnZpY2VOYW1lLCBkaXNwbGF5TmFtZSwgYWxsQWNjZXNzLCAweDEwIHwgMHgxMDAsIHNlcnZpY2VUeXBlLCAwLCBzZXJ2aWNlUGF0aCwgMCwgMCwgMCwgMCwgMCk7DQogICAgICAgICAgICBpZiAoaC5WYWwgPT0gMCkgeyB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOyB0aHJvdyAoJ0Vycm9yIENyZWF0aW5nIFNlcnZpY2U6ICcgKyB0aGlzLnByb3h5Mi5HZXRMYXN0RXJyb3IoKS5WYWwpOyB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5kZXNjcmlwdGlvbikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgZHNjID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShvcHRpb25zLmRlc2NyaXB0aW9uLCB7IHdpZGU6IHRydWUgfSk7DQogICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VEZXNjcmlwdGlvbiA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUodGhpcy5HTS5Qb2ludGVyU2l6ZSk7DQogICAgICAgICAgICAgICAgZHNjLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHNlcnZpY2VEZXNjcmlwdGlvbi5EZXJlZigwLCB0aGlzLkdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsNCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LkNoYW5nZVNlcnZpY2VDb25maWcyVyhoLCAxLCBzZXJ2aWNlRGVzY3JpcHRpb24pLlZhbCA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuYWJsZSB0byBzZXQgZGVzY3JpcHRpb24uLi4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCA/IDUwMDAgOiBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0OyAgICAgICAgICAgICAvLyBEZWxheSBpbiBtaWxsaXNlY29uZHMNCiAgICAgICAgICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoMyAqIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMypzaXplb2YoU0NfQUNUSU9OKQ0KICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMF0udHlwZQ0KICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoNCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRlbGF5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NfQUNUSU9OWzBdLmRlbGF5DQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZig4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsxXS50eXBlDQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigxMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRlbGF5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMV0uZGVsYXkNCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDE2LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NfQUNUSU9OWzJdLnR5cGUNCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDIwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS5kZWxheQ0KDQogICAgICAgICAgICAgICAgdmFyIGZhaWx1cmVBY3Rpb25zID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemVvZihTRVJWSUNFX0ZBSUxVUkVfQUNUSU9OUykNCiAgICAgICAgICAgICAgICBmYWlsdXJlQWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoNzIwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHdSZXNldFBlcmlvZDogMiBIb3Vycw0KICAgICAgICAgICAgICAgIGZhaWx1cmVBY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDI0IDogMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzKTsvLyBjQWN0aW9uczogMw0KICAgICAgICAgICAgICAgIGFjdGlvbnMucG9pbnRlckJ1ZmZlcigpLmNvcHkoZmFpbHVyZUFjdGlvbnMuRGVyZWYodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMzIgOiAxNiwgdGhpcy5HTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hhbmdlU2VydmljZUNvbmZpZzJXKGgsIDIsIGZhaWx1cmVBY3Rpb25zKS5WYWwgPT0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmFibGUgdG8gc2V0IEZhaWx1cmVBY3Rpb25zLi4uJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaCk7DQogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOw0KDQogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgaW4gb3B0aW9ucy5maWxlcykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3cml0aW5nICcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIGV4dHJhY3RGaWxlU291cmNlKG9wdGlvbnMuZmlsZXNbaV0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKGV4dHJhY3RGaWxlU291cmNlKG9wdGlvbnMuZmlsZXNbaV0pLCBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCiAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXRoID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgb3B0aW9ucy5uYW1lLCAnSW1hZ2VQYXRoJyk7DQogICAgICAgICAgICAgICAgaW1hZ2VQYXRoICs9ICgnICcgKyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpKTsNCiAgICAgICAgICAgICAgICByZWcuV3JpdGVLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXCcgKyBvcHRpb25zLm5hbWUsICdJbWFnZVBhdGgnLCBpbWFnZVBhdGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWRtaW4oKSkgeyBjb25zb2xlLmxvZygnSW5zdGFsbGluZyBhIFNlcnZpY2UgcmVxdWlyZXMgcm9vdCcpOyB0aHJvdyAoJ0luc3RhbGxpbmcgYXMgU2VydmljZSwgcmVxdWlyZXMgcm9vdCcpOyB9DQogICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycyA/IG9wdGlvbnMucGFyYW1ldGVycy5qb2luKCcgJykgOiAnJzsNCiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0NCiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQ0KICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOw0KDQogICAgICAgICAgICB2YXIgcmMgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBvcHRpb25zLm5hbWUsIHsgZmxhZ3M6ICd3YicgfSk7DQogICAgICAgICAgICByYy53cml0ZSgnIyEvYmluL3NoXG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCcjIFBST1ZJREU6ICcgKyBvcHRpb25zLm5hbWUgKyAnXG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCcjIFJFUVVJUkU6IEZJTEVTWVNURU1TIE5FVFdPUktJTkdcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJyMgS0VZV09SRDogc2h1dGRvd25cbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJy4gL2V0Yy9yYy5zdWJyXG5cbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJ25hbWU9IicgKyBvcHRpb25zLm5hbWUgKyAnIlxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnZGVzYz0iJyArIChvcHRpb25zLmRlc2NyaXB0aW9uID8gb3B0aW9ucy5kZXNjcmlwdGlvbiA6ICdNZXNoQ2VudHJhbCBBZ2VudCcpICsgJyJcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJ3JjdmFyPSR7bmFtZX1fZW5hYmxlXG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCdwaWRmaWxlPSIvdmFyL3J1bi8nICsgb3B0aW9ucy5uYW1lICsgJy5waWQiXG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCdjb21tYW5kPSIvdXNyL3NiaW4vZGFlbW9uIlxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnY29tbWFuZF9hcmdzPSItUCAke3BpZGZpbGV9ICcgKyAoKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCk/Jy1yJzonJykgKyAnIC1mIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJyJcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJ2NvbW1hbmRfY2hkaXI9Ii91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJyJcblxuJyk7DQogICAgICAgICAgICByYy53cml0ZSgnbG9hZF9yY19jb25maWcgJG5hbWVcbicpOw0KICAgICAgICAgICAgcmMud3JpdGUoJzogJHsnICsgb3B0aW9ucy5uYW1lICsgJ19lbmFibGU9IicgKyAoKG9wdGlvbnMuc3RhcnRUeXBlID09ICdBVVRPX1NUQVJUJyB8fCBvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQk9PVF9TVEFSVCcpPydZRVMnOidOTycpICsgJyJ9XG4nKTsNCiAgICAgICAgICAgIHJjLndyaXRlKCdydW5fcmNfY29tbWFuZCAiJDEiXG4nKTsNCiAgICAgICAgICAgIHJjLmVuZCgpOw0KICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBvcHRpb25zLm5hbWUpLm1vZGU7DQogICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOw0KICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG9wdGlvbnMubmFtZSwgbSk7DQogICAgICAgIH0NCiAgICAgICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IGNvbnNvbGUubG9nKCdJbnN0YWxsaW5nIGEgU2VydmljZSByZXF1aXJlcyByb290Jyk7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0NCiAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gb3B0aW9ucy5wYXJhbWV0ZXJzID8gb3B0aW9ucy5wYXJhbWV0ZXJzLmpvaW4oJyAnKSA6ICcnOw0KICAgICAgICAgICAgdmFyIGNvbmY7DQogICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2VydmljZVBsYXRmb3JtKSB7IG9wdGlvbnMuc2VydmljZVBsYXRmb3JtID0gdGhpcy5nZXRTZXJ2aWNlVHlwZSgpOyB9DQogICAgICAgICAgIA0KICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnNlcnZpY2VQbGF0Zm9ybSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdpbml0JzoNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9DQoNCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOw0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOw0KICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOw0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3Jhc2ggUmVzdGFydCBpcyBlbmFibGVkLCBidXQgaXQgaXNuJ3QgaW5oZXJlbnRseSBzdXBwb3J0ZWQgYnkgSU5JVCwgc28gd2UgbXVzdCBmYWtlIGl0IHdpdGggSlMNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXBfcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuc3BsaXQoJyInKS5qb2luKCdcXCInKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAiLWV4ZWMgXFxcInZhciBjaGlsZDsgcHJvY2Vzcy5vbignU0lHVEVSTScsIGZ1bmN0aW9uICgpIHsgY2hpbGQucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7IGNoaWxkLmtpbGwoKTsgcHJvY2Vzcy5leGl0KCk7IH0pOyBmdW5jdGlvbiBzdGFydCgpIHsgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuYXJndjAsIFxcXCIiICsgdG1wX3BhcmFtZXRlcnMgKyAiXFxcIl0pOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7IGNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKHN0YXR1cykgeyBzdGFydCgpOyB9KTsgfSBzdGFydCgpO1xcXCIiOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgaW5pdC5kIHNjcmlwdCBJIHdyb3RlLiBSYXRoZXIgdGhhbiBoYXZpbmcgdG8gZGVhbCB3aXRoIGVzY2FwaW5nIHRoZSB0aGluZywgSSBqdXN0IEJhc2U2NCBlbmNvZGVkIGl0IHRvIHByZXZlbnQgaXNzdWVzLg0KICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2V0Yy9pbml0LmQvJyArIG9wdGlvbnMubmFtZSwgeyBmbGFnczogJ3diJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZShCdWZmZXIuZnJvbSgnSXlFdlltbHVMM05vQ2dvS1UwTlNTVkJVUFM5MWMzSXZiRzlqWVd3dmJXVnphRjl6WlhKMmFXTmxjeTlZV0ZoWVdDOVpXVmxaV1FwU1ZVNUJVejF5YjI5MENncFFTVVJHU1V4RlBTOTJZWEl2Y25WdUwxaFlXRmhZTG5CcFpBcE1UMGRHU1V4RlBTOTJZWEl2Ykc5bkwxaFlXRmhZTG14dlp3b0tjM1JoY25Rb0tTQjdDaUFnYVdZZ1d5QXRaaUFpSkZCSlJFWkpURVVpSUYwZ0ppWWdhMmxzYkNBdE1DQWtLR05oZENBaUpGQkpSRVpKVEVVaUtTQXlQaTlrWlhZdmJuVnNiRHNnZEdobGJnb2dJQ0FnWldOb2J5QW5VMlZ5ZG1salpTQmhiSEpsWVdSNUlISjFibTVwYm1jbklENG1NZ29nSUNBZ2NtVjBkWEp1SURFS0lDQm1hUW9nSUdWamFHOGdKMU4wWVhKMGFXNW5JSE5sY25acFkyWGlnS1luSUQ0bU1nb2dJR3h2WTJGc0lFTk5SRDBpSkZORFVrbFFWQ0I3ZTFCQlVrMVRmWDBnSmo0Z1hDSWtURTlIUmtsTVJWd2lJQ1lnWldOb2J5QmNKQ0VpQ2lBZ2JHOWpZ", 16000); + memcpy_s(_servicemanager + 112000, 32680, "V3dnUTAxRVVFRlVTRDBrS0dWamFHOGdKRk5EVWtsUVZDQjhJR0YzYXlBbmV5QnNaVzQ5YzNCc2FYUW9KREFzSUdFc0lDSXZJaWs3SUhCeWFXNTBJSE4xWW5OMGNpZ2tNQ3dnTUN3Z2JHVnVaM1JvS0NRd0tTMXNaVzVuZEdnb1lWdHNaVzVkS1NrN0lIMG5LUW9nSUdOa0lDUkRUVVJRUVZSSUNpQWdjM1VnTFdNZ0lpUkRUVVFpSUNSU1ZVNUJVeUErSUNJa1VFbEVSa2xNUlNJS0lDQmxZMmh2SUNkVFpYSjJhV05sSUhOMFlYSjBaV1FuSUQ0bU1ncDlDZ3B6ZEc5d0tDa2dld29nSUdsbUlGc2dJU0F0WmlBaUpGQkpSRVpKVEVVaUlGMDdJSFJvWlc0S0lDQWdJR1ZqYUc4Z0oxTmxjblpwWTJVZ2JtOTBJSEoxYm01cGJtY25JRDRtTWdvZ0lDQWdjbVYwZFhKdUlERUtJQ0JsYkhObENnbHdhV1E5SkNnZ1kyRjBJQ0lrVUVsRVJrbE1SU0lnS1FvSmFXWWdhMmxzYkNBdE1DQWtjR2xrSURJK0wyUmxkaTl1ZFd4c095QjBhR1Z1Q2lBZ0lDQWdJR1ZqYUc4Z0oxTjBiM0J3YVc1bklITmxjblpwWTJYaWdLWW5JRDRtTWdvZ0lDQWdJQ0JyYVd4c0lDMHhOU0FrY0dsa0NpQWdJQ0FnSUdWamFHOGdKMU5sY25acFkyVWdjM1J2Y0hCbFpDY2dQaVl5Q2dsbGJITmxDZ2tnSUdWamFHOGdKMU5sY25acFkyVWdibTkwSUhKMWJtNXBibWNuQ2dsbWFRb0pjbTBnTFdZZ0pDSlFTVVJHU1V4Rklnb2dJR1pwQ24wS2NtVnpkR0Z5ZENncGV3b0pjM1J2Y0FvSmMzUmhjblFLZlFwemRHRjBkWE1vS1hzS0NXbG1JRnNnTFdZZ0lpUlFTVVJHU1V4RklpQmRDZ2wwYUdWdUNna0pjR2xrUFNRb0lHTmhkQ0FpSkZCSlJFWkpURVVpSUNrS0NRbHBaaUJyYVd4c0lDMHdJQ1J3YVdRZ01qNHZaR1YyTDI1MWJHdzdJSFJvWlc0S0NRa0paV05vYnlBaVdGaFlXRmdnYzNSaGNuUXZjblZ1Ym1sdVp5d2djSEp2WTJWemN5QWtjR2xrSWdvSkNXVnNjMlVLQ1FrSlpXTm9ieUFuV0ZoWVdGZ2djM1J2Y0M5M1lXbDBhVzVuSndvSkNXWnBDZ2xsYkhObENna0paV05vYnlBbldGaFlXRmdnYzNSdmNDOTNZV2wwYVc1bkp3b0pabWtLQ24wS0NncGpZWE5sSUNJa01TSWdhVzRLQ1hOMFlYSjBLUW9KQ1hOMFlYSjBDZ2tKT3pzS0NYTjBiM0FwQ2drSmMzUnZjQW9KQ1RzN0NnbHlaWE4wWVhKMEtRb0pDWE4wYjNBS0NRbHpkR0Z5ZEFvSkNUczdDZ2x6ZEdGMGRYTXBDZ2tKYzNSaGRIVnpDZ2tKT3pzS0NTb3BDZ2tKWldOb2J5QWlWWE5oWjJVNklITmxjblpwWTJVZ1dGaFlXRmdnZTNOMFlYSjBmSE4wYjNCOGNtVnpkR0Z5ZEh4emRHRjBkWE45SWdvSkNUczdDbVZ6WVdNS1pYaHBkQ0F3Q2dvPScsICdiYXNlNjQnKS50b1N0cmluZygpLnNwbGl0KCdYWFhYWCcpLmpvaW4ob3B0aW9ucy5uYW1lKS5zcGxpdCgnWVlZWVknKS5qb2luKG9wdGlvbnMudGFyZ2V0KS5yZXBsYWNlKCd7e1BBUk1TfX0nLCBwYXJhbWV0ZXJzKSk7DQogICAgICAgICAgICAgICAgICAgIGNvbmYuZW5kKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy9ldGMvaW5pdC5kLycgKyBvcHRpb25zLm5hbWUpLm1vZGU7DQogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvZXRjL2luaXQuZC8nICsgb3B0aW9ucy5uYW1lLCBtKTsNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQk9PVF9TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3VwZGF0ZS1yYy5kICcgKyBvcHRpb25zLm5hbWUgKyAnIGRlZmF1bHRzXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9DQoNCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOw0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOw0KICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOw0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7DQoNCiAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy9ldGMvaW5pdC8nICsgb3B0aW9ucy5uYW1lICsgJy5jb25mJywgeyBmbGFnczogJ3diJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQk9PVF9TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnc3RhcnQgb24gcnVubGV2ZWwgWzIzNDVdXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnc3RvcCBvbiBydW5sZXZlbCBbMDE2XVxuXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgncmVzcGF3blxuXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdjaGRpciAvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICdcbicpOw0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdleGVjIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJ1xuXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6DQogICAgICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlRGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uID8gb3B0aW9ucy5kZXNjcmlwdGlvbiA6ICdNZXNoQ2VudHJhbCBBZ2VudCc7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9DQoNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIG9wdGlvbnMuc2VydmljZVBhdGgpOw0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOw0KICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOw0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbScpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlJywgeyBmbGFnczogJ3diJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtJykpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlJywgeyBmbGFnczogJ3diJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgndW5rbm93biBsb2NhdGlvbiBmb3Igc3lzdGVtZCBjb25maWd1cmF0aW9uIGZpbGVzJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdbVW5pdF1cbkRlc2NyaXB0aW9uPScgKyBzZXJ2aWNlRGVzY3JpcHRpb24gKyAnXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnW1NlcnZpY2VdXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnV29ya2luZ0RpcmVjdG9yeT0vdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICdcbicpOw0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdFeGVjU3RhcnQ9L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICcgJyArIHBhcmFtZXRlcnMgKyAnXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnU3RhbmRhcmRPdXRwdXQ9bnVsbFxuJyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1Jlc3RhcnQ9b24tZmFpbHVyZVxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1Jlc3RhcnRTZWM9M1xuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnUmVzdGFydFNlYz0nICsgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgLyAxMDAwKSArICdcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JPT1RfU1RBUlQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1lTVEVNX1NUQVJUJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FVVE9fU1RBUlQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1tJbnN0YWxsXVxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ0FsaWFzPScgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2VcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYuZW5kKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuX21vZHVsZU5hbWUgPSBvcHRpb25zLm5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBlbmFibGUgJyArIG9wdGlvbnMubmFtZSArICcuc2VydmljZVxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyB1bmtub3duIHBsYXRmb3JtIHNlcnZpY2UgdHlwZQ0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5rbm93biBTZXJ2aWNlIFBsYXRmb3JtIFR5cGU6ICcgKyBvcHRpb25zLnNlcnZpY2VQbGF0Zm9ybSk7DQogICAgICAgICAgICAgICAgICAgIHRocm93ICgnVW5rbm93biBTZXJ2aWNlIFBsYXRmb3JtIFR5cGU6ICcgKyBvcHRpb25zLnNlcnZpY2VQbGF0Zm9ybSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5pc0FkbWluKCkpIHsgdGhyb3cgKCdJbnN0YWxsaW5nIGFzIFNlcnZpY2UsIHJlcXVpcmVzIHJvb3QnKTsgfQ0KDQogICAgICAgICAgICAvLyBNYWMgT1MNCiAgICAgICAgICAgIHZhciBzdGRvdXRwYXRoID0gKG9wdGlvbnMuc3Rkb3V0ID8gKCc8a2V5PlN0YW5kYXJkT3V0UGF0aDwva2V5PlxuPHN0cmluZz4nICsgb3B0aW9ucy5zdGRvdXQgKyAnPC9zdHJpbmc+JykgOiAnJyk7DQogICAgICAgICAgICB2YXIgYXV0b1N0YXJ0ID0gKG9wdGlvbnMuc3RhcnRUeXBlID09ICdBVVRPX1NUQVJUJyA/ICc8dHJ1ZS8+JyA6ICc8ZmFsc2UvPicpOw0KICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICAnICAgICA8a2V5PlByb2dyYW1Bcmd1bWVudHM8L2tleT5cbic7DQogICAgICAgICAgICBwYXJhbXMgKz0gJyAgICAgPGFycmF5PlxuJzsNCiAgICAgICAgICAgIHBhcmFtcyArPSAoJyAgICAgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICc8L3N0cmluZz5cbicpOw0KICAgICAgICAgICAgaWYob3B0aW9ucy5wYXJhbWV0ZXJzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZvcih2YXIgaXRtIGluIG9wdGlvbnMucGFyYW1ldGVycykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAoJyAgICAgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMucGFyYW1ldGVyc1tpdG1dICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSAgICAgICAgDQogICAgICAgICAgICBwYXJhbXMgKz0gJyAgICAgPC9hcnJheT5cbic7DQogICAgICAgICAgICANCiAgICAgICAgICAgIHZhciBwbGlzdCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICc8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnPHBsaXN0IHZlcnNpb249IjEuMCI+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgPGRpY3Q+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+TGFiZWw8L2tleT5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5uYW1lICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICBwbGlzdCArPSAocGFyYW1zICsgJ1xuJyk7DQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5Xb3JraW5nRGlyZWN0b3J5PC9rZXk+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnPC9zdHJpbmc+XG4nKTsNCiAgICAgICAgICAgIHBsaXN0ICs9IChzdGRvdXRwYXRoICsgJ1xuJyk7DQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5SdW5BdExvYWQ8L2tleT5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAoYXV0b1N0YXJ0ICsgJ1xuJyk7DQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5LZWVwQWxpdmU8L2tleT5cbic7DQogICAgICAgICAgICBpZihvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxkaWN0PlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPGtleT5DcmFzaGVkPC9rZXk+XG4nOw0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8dHJ1ZS8+XG4nOw0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8L2RpY3Q+XG4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZmFsc2UvPlxuJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgIT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5UaHJvdHRsZUludGVydmFsPC9rZXk+XG4nOw0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8aW50ZWdlcj4nICsgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgLyAxMDAwKSArICc8L2ludGVnZXI+XG4nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBwbGlzdCArPSAnICA8L2RpY3Q+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gJzwvcGxpc3Q+JzsNCg0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQ0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG9wdGlvbnMubmFtZSArICcucGxpc3QnKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0NCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iaW5hcnkpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG9wdGlvbnMuYmluYXJ5KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG9wdGlvbnMubmFtZSArICcucGxpc3QnLCBwbGlzdCk7DQogICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOw0KICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7DQogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9z", 16000); + memcpy_s(_servicemanager + 128000, 16680, "ZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnU2VydmljZTogJyArIG9wdGlvbnMubmFtZSArICcgYWxyZWFkeSBleGlzdHMnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvcHRpb25zLmZpbGVzKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3IgKHZhciBpIGluIG9wdGlvbnMuZmlsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXNbaV0uX2J1ZmZlcikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3cml0aW5nICcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOw0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSkpOw0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpDQogICAgew0KICAgICAgICB0aGlzLmluc3RhbGxMYXVuY2hBZ2VudCA9IGZ1bmN0aW9uIGluc3RhbGxMYXVuY2hBZ2VudChvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIShvcHRpb25zLnVpZCB8fCBvcHRpb25zLnVzZXIpICYmICF0aGlzLmlzQWRtaW4oKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0luc3RhbGxpbmcgYSBHbG9iYWwgQWdlbnQvRGFlbW9uLCByZXF1aXJlcyBhZG1pbicpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgc2VydmljZVBhdGhUb2tlbnMgPSBvcHRpb25zLnNlcnZpY2VQYXRoLnNwbGl0KCcvJyk7DQogICAgICAgICAgICBzZXJ2aWNlUGF0aFRva2Vucy5wb3AoKTsNCiAgICAgICAgICAgIGlmIChzZXJ2aWNlUGF0aFRva2Vucy5wZWVrKCkgPT0gJy4nKSB7IHNlcnZpY2VQYXRoVG9rZW5zLnBvcCgpOyB9DQogICAgICAgICAgICBvcHRpb25zLndvcmtpbmdEaXJlY3RvcnkgPSBzZXJ2aWNlUGF0aFRva2Vucy5qb2luKCcvJyk7DQoNCiAgICAgICAgICAgIHZhciBhdXRvU3RhcnQgPSAob3B0aW9ucy5zdGFydFR5cGUgPT0gJ0FVVE9fU1RBUlQnID8gJzx0cnVlLz4nIDogJzxmYWxzZS8+Jyk7DQogICAgICAgICAgICB2YXIgc3Rkb3V0cGF0aCA9IChvcHRpb25zLnN0ZG91dCA/ICgnPGtleT5TdGFuZGFyZE91dFBhdGg8L2tleT5cbjxzdHJpbmc+JyArIG9wdGlvbnMuc3Rkb3V0ICsgJzwvc3RyaW5nPicpIDogJycpOw0KICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICAgICAgICAgJyAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOw0KICAgICAgICAgICAgcGFyYW1zICs9ICAgICAgICAgICAgJyAgICAgPGFycmF5PlxuJzsNCiAgICAgICAgICAgIHBhcmFtcyArPSAgICAgICAgICAgKCcgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlcnZpY2VQYXRoICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaXRtIGluIG9wdGlvbnMucGFyYW1ldGVycykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5wYXJhbWV0ZXJzW2l0bV0gKyAnPC9zdHJpbmc+XG4nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8L2FycmF5PlxuJzsNCg0KICAgICAgICAgICAgdmFyIHBsaXN0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICc8cGxpc3QgdmVyc2lvbj0iMS4wIj5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnICA8ZGljdD5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsNCiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPicgKyBvcHRpb25zLm5hbWUgKyAnPC9zdHJpbmc+XG4nKTsNCiAgICAgICAgICAgIHBsaXN0ICs9IChwYXJhbXMgKyAnXG4nKTsNCiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgb3B0aW9ucy53b3JraW5nRGlyZWN0b3J5ICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICBwbGlzdCArPSAoc3Rkb3V0cGF0aCArICdcbicpOw0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOw0KICAgICAgICAgICAgcGxpc3QgKz0gKGF1dG9TdGFydCArICdcbicpOw0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2Vzc2lvblR5cGVzICYmIG9wdGlvbnMuc2Vzc2lvblR5cGVzLmxlbmd0aCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+TGltaXRMb2FkVG9TZXNzaW9uVHlwZTwva2V5PlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGFycmF5PlxuJzsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHlwZSBpbiBvcHRpb25zLnNlc3Npb25UeXBlcykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICAgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMuc2Vzc2lvblR5cGVzW3N0eXBlXSArICc8L3N0cmluZz5cbicpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9hcnJheT5cbic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5LZWVwQWxpdmU8L2tleT5cbic7DQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKSB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxkaWN0PlxuJzsNCiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPGtleT5DcmFzaGVkPC9rZXk+XG4nOw0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8dHJ1ZS8+XG4nOw0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8L2RpY3Q+XG4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxmYWxzZS8+XG4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PlRocm90dGxlSW50ZXJ2YWw8L2tleT5cbic7DQogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7DQogICAgICAgICAgICBwbGlzdCArPSAnPC9wbGlzdD4nOw0KDQogICAgICAgICAgICBpZiAob3B0aW9ucy51aWQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3B0aW9ucy51c2VyID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKG9wdGlvbnMudWlkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIGZvbGRlciA9IG9wdGlvbnMudXNlciA/IChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcihvcHRpb25zLnVzZXIpICsgJy9MaWJyYXJ5L0xhdW5jaEFnZW50cy8nKSA6ICcvTGlicmFyeS9MYXVuY2hBZ2VudHMvJzsNCiAgICAgICAgICAgIG9wdGlvbnMuZ2lkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEdyb3VwSUQob3B0aW9ucy51aWQpOw0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoZm9sZGVyKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLm1rZGlyU3luYyhmb2xkZXIpOw0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciwgb3B0aW9ucy51aWQsIG9wdGlvbnMuZ2lkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhmb2xkZXIgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JywgcGxpc3QpOw0KICAgICAgICAgICAgaWYob3B0aW9ucy51c2VyKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciArIG9wdGlvbnMubmFtZSArICcucGxpc3QnLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgIH0NCiAgICB0aGlzLnVuaW5zdGFsbFNlcnZpY2UgPSBmdW5jdGlvbiB1bmluc3RhbGxTZXJ2aWNlKG5hbWUpDQogICAgew0KICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnVW5pbnN0YWxsaW5nIGEgc2VydmljZSwgcmVxdWlyZXMgYWRtaW4nKTsgfQ0KDQogICAgICAgIGlmICh0eXBlb2YgKG5hbWUpID09ICdvYmplY3QnKSB7IG5hbWUgPSBuYW1lLm5hbWU7IH0NCiAgICAgICAgdmFyIHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UobmFtZSk7DQogICAgICAgIHZhciBzZXJ2aWNlUGF0aCA9IHNlcnZpY2UuYXBwTG9jYXRpb24oKTsNCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoc2VydmljZS5zdGF0dXMuc3RhdGUgPT0gdW5kZWZpbmVkIHx8IHNlcnZpY2Uuc3RhdHVzLnN0YXRlID09ICdTVE9QUEVEJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuRGVsZXRlU2VydmljZShzZXJ2aWNlLl9zZXJ2aWNlKSA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdVbmluc3RhbGwgU2VydmljZSBmb3I6ICcgKyBuYW1lICsgJywgZmFpbGVkIHdpdGggZXJyb3I6ICcgKyB0aGlzLnByb3h5Mi5HZXRMYXN0RXJyb3IoKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnQ2Fubm90IHVuaW5zdGFsbCBzZXJ2aWNlOiAnICsgbmFtZSArICcsIGJlY2F1c2UgaXQgaXM6ICcgKyBzZXJ2aWNlLnN0YXR1cy5zdGF0ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7DQogICAgICAgICAgICBzZXJ2aWNlID0gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCiAgICAgICAgew0KICAgICAgICAgICAgc3dpdGNoICh0aGlzLmdldFNlcnZpY2VUeXBlKCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC5kLycgKyBuYW1lKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdC5kIHNlcnZpY2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyBuYW1lICsgJyBzdG9wXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgndXBkYXRlLXJjLmQgLWYgJyArIG5hbWUgKyAnIHJlbW92ZVxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL2V0Yy9pbml0LmQvJyArIG5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgdW5pbnN0YWxsZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgY291bGQgbm90IGJlIHVuaW5zdGFsbGVkJywgZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBzdGFydCBzZXJ2aWNlDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgbmFtZSArICcgc3RvcFxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyB1bmluc3RhbGxlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOg0KICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgdHlwZTogcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuVEVSTSB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RvcCAnICsgbmFtZSArICcuc2VydmljZVxuJyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIGRpc2FibGUgJyArIG5hbWUgKyAnLnNlcnZpY2VcbicpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyB1bmluc3RhbGxlZCcpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHVua25vd24gcGxhdGZvcm0gc2VydmljZSB0eXBlDQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3QnKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0b3AgJyArIG5hbWUgKyAnXG4nKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHVubG9hZCAvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyBuYW1lICsgJy5wbGlzdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3QnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgdW5pbnN0YWxsaW5nIHNlcnZpY2U6ICcgKyBuYW1lICsgJyA9PiAnICsgZSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnJtZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBuYW1lKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgICAgICB7fQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnU2VydmljZTogJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykNCiAgICAgICAgew0KICAgICAgICAgICAgc2VydmljZS5zdG9wKCk7DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZS5hcHBMb2NhdGlvbigpKTsNCiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlLnJjKTsNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykucm1kaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG5hbWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICB7IH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgew0KICAgICAgICB0aGlzLmdldFNlcnZpY2VUeXBlID0gZnVuY3Rpb24gZ2V0U2VydmljZVR5cGUoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcGxhdGZvcm0gPSByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5nZXRQcm9jZXNzSW5mbygxKS5OYW1lOw0KICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09ICJidXN5Ym94IikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgLWF4IC1vIHBpZCAtbyBjb21tYW5kIHwgYXdrICd7IGlmKCQxPT1cIjFcIikgeyAkMT1cIlwiOyBzcGxpdCgkMCwgcmVzLCBcIiBcIik7IHByaW50IHJlc1syXTsgfX0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgp", 16000); + memcpy_s(_servicemanager + 144000, 680, "Ow0KICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocGxhdGZvcm0gPT0gJ2luaXQnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0JykpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICd1cHN0YXJ0JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gKHBsYXRmb3JtKTsNCiAgICAgICAgfTsNCiAgICB9DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gc2VydmljZU1hbmFnZXI7DQptb2R1bGUuZXhwb3J0cy5tYW5hZ2VyID0gbmV3IHNlcnZpY2VNYW5hZ2VyKCk7DQoNCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzLmdldE9TVmVyc2lvbiA9IGdldE9TVmVyc2lvbjsNCn0NCv==", 680); + ILibBase64DecodeEx((unsigned char*)_servicemanager, 144680, (unsigned char*)_servicemanager + 144680); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "service-manager"); duk_push_string(ctx, _servicemanager + 144680); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_servicemanager); diff --git a/modules/service-manager.js b/modules/service-manager.js index cc6acdb..9de3a95 100644 --- a/modules/service-manager.js +++ b/modules/service-manager.js @@ -15,6 +15,24 @@ limitations under the License. */ var promise = require('promise'); +function failureActionToInteger(action) +{ + var ret; + switch(action) + { + default: + case 'NONE': + ret=0; + break; + case 'SERVICE_RESTART': + ret=1; + break; + case 'REBOOT': + ret=2; + break; + } + return(ret); +} function extractFileName(filePath) { @@ -572,7 +590,7 @@ function serviceManager() var bytesNeeded = this.GM.CreateVariable(ptr._size); var handle = this.proxy.OpenSCManagerA(0x00, 0x00, 0x0001 | 0x0004 | 0x0020 | 0x0010); if (handle.Val == 0) { throw ('could not open ServiceManager'); } - var h = this.proxy.OpenServiceW(handle, serviceName, 0x0001 | 0x0004 | 0x0020 | 0x0010 | 0x00010000); + var h = this.proxy.OpenServiceW(handle, serviceName, 0x0001 | 0x0002 | 0x0004 | 0x0020 | 0x0010 | 0x00010000); if (h.Val != 0) { var retVal = { _ObjectID: 'service-manager.service' } @@ -617,6 +635,27 @@ function serviceManager() { return (parseInt(this.status.pid) == process.pid); } + retVal.update = function update() + { + if (this.failureActions) + { + var actions = this._GM.CreateVariable(this.failureActions.actions.length * 8); // len*sizeof(SC_ACTION) + for (var i = 0; i < this.failureActions.actions.length && i < 3; ++i) + { + actions.Deref(i*8, 4).toBuffer().writeUInt32LE(failureActionToInteger(this.failureActions.actions[i].type)); // SC_ACTION[i].type + actions.Deref(4+(i*8), 4).toBuffer().writeUInt32LE(this.failureActions.actions[i].delay); // SC_ACTION[i].delay + } + + var updatedFailureActions = this._GM.CreateVariable(40); // sizeof(SERVICE_FAILURE_ACTIONS) + updatedFailureActions.Deref(0, 4).toBuffer().writeUInt32LE(this.failureActions.resetPeriod); // dwResetPeriod + updatedFailureActions.Deref(this._GM.PointerSize == 8 ? 24 : 12, 4).toBuffer().writeUInt32LE(this.failureActions.actions.length); // cActions + actions.pointerBuffer().copy(updatedFailureActions.Deref(this._GM.PointerSize == 8 ? 32 : 16, this._GM.PointerSize).toBuffer()); + if (this._proxy.ChangeServiceConfig2W(this._service, 2, updatedFailureActions).Val == 0) + { + throw('Unable to set FailureActions...'); + } + } + }; retVal.appLocation = function () { var reg = require('win-registry');