diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 35d4697..8b371b2 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2054,11 +2054,11 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgpmdW5jdGlvbiBkaXNwYXRjaChvcHRpb25zKQp7CiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubW9kdWxlcyB8fCAhb3B0aW9ucy5sYXVuY2ggfHwgIW9wdGlvbnMubGF1bmNoLm1vZHVsZSB8fCAhb3B0aW9ucy5sYXVuY2gubWV0aG9kIHx8ICFvcHRpb25zLmxhdW5jaC5hcmdzKSB7IHRocm93ICgnSW52YWxpZCBQYXJhbWV0ZXJzJyk7IH0KCiAgICB2YXIgaXBjSW50ZWdlcgogICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKS5jcmVhdGVFdmVudCgnY29ubmVjdGlvbicpOwoKICAgIHJldC5faXBjID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjLnBhcmVudCA9IHJldDsKICAgIHJldC5faXBjMiA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYzIucGFyZW50ID0gcmV0OwogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsKICAgIHJldC5faXBjMi5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IH0pOwoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAgIGlwY0ludGVnZXIgPSByZXF1aXJlKCd0bHMnKS5nZW5lcmF0ZVJhbmRvbUludGVnZXIoJzEwMDAnLCAnOTk5OScpOwogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOwogICAgICAgIAogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsKICAgICAgICAgICAgcmV0Ll9pcGMyLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCArICdDJywgd3JpdGFibGVBbGw6IHRydWUgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoeCkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgIHJldC5faXBjMi5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpCiAgICB7DQogICAgICAgIHRoaXMucGFyZW50Ll9jb250cm9sID0gczsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHRoaXMucGFyZW50Lmludm9rZSA9IGZ1bmN0aW9uIChtZXRob2QsIGFyZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOwogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnaW52b2tlJywgdmFsdWU6IHsgbWV0aG9kOiBtZXRob2QsIGFyZ3M6IGFyZ3MgfSB9KSk7CiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGgpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGQpOw0KICAgICAgICB9Ow0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgIH0pOwogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQogICAgewogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOwogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7CiAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7CgogICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQogICAgICAgIHsKICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsKICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7CiAgICAgICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgICAgIHMud3JpdGUoZCk7CiAgICAgICAgfQoKICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnbGF1bmNoJywgdmFsdWU6IHsgbW9kdWxlOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tb2R1bGUsIG1ldGhvZDogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubWV0aG9kLCBhcmdzOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5hcmdzIH0gfSkpOwogICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgcy53cml0ZShkKTsKICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOwogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsKICAgIH0pOwoKICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOwogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7CiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKCiAgICBpZiAob3B0aW9ucy51c2VyKQogICAgewogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSAnICsgb3B0aW9ucy51c2VyICsgJyAvVFIgIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJyAtYjY0ZXhlYyAnICsgc3RyICsgJyJcclxuJyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkID09IDApCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSBTWVNURU0gL1RSICInICsgcHJvY2Vzcy5leGVjUGF0aCArICcgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYXMgbG9nZ2VkIGluIHVzZXINCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9UUiAiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnIC1iNjRleGVjICcgKyBzdHIgKyAnIlxyXG4nKTsNCiAgICAgICAgfQogICAgfQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9SVU4gL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvREVMRVRFIC9GIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxyXG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAKCiAgICByZXR1cm4gKHJldCk7Cn0KCmZ1bmN0aW9uIGNvbm5lY3QoaXBjKQp7CiAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGM7CiAgICBnbG9iYWwuaXBjMkNsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoICsgJ0MnIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7CiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOwogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsKICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdpbnZva2UnOgogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7CiAgICBnbG9iYWwuaXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkKICAgIHsKICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY0xlbiA9IGMucmVhZFVJbnQzMkxFKDApOwogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnVuc2hpZnQoYyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2FkZE1vZHVsZSc6CiAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKGNtZC52YWx1ZS5uYW1lLCBjbWQudmFsdWUuanMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGF1bmNoJzoKICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gcmVxdWlyZShjbWQudmFsdWUubW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ucGlwZSh0aGlzLCB7IGVuZDogZmFsc2UgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlKGdsb2JhbC5fcHJveHlTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTsKCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7IGRpc3BhdGNoOiBkaXNwYXRjaCwgY29ubmVjdDogY29ubmVjdCB9OwoK', 'base64').toString());"); // win-firewall is a helper to Modify Windows Firewall Filters. Refer to modules/win-firewall.js - char *_winfirewall = ILibMemory_Allocate(31788, 0, NULL, NULL); - memcpy_s(_winfirewall + 0, 18164, "LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgd2lucmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7CgpmdW5jdGlvbiBwYXJzZUNtZGxldE91dHB1dChkYXRhKQp7CiAgICB2YXIgdG91Y2hlZDsKICAgIHZhciByZXQgPSBbXTsKICAgIHZhciBjaHVua3MgPSBkYXRhLnRyaW0oKS5zcGxpdCgnXHJcblxyXG4nKTsKICAgIHZhciBsaW5lcywgeCwgb2JqOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgICAgb2JqID0ge307IHRvdWNoZWQgPSBmYWxzZTsKICAgICAgICBsaW5lcyA9IGNodW5rc1tpXS5zcGxpdCgnXHJcbicpOwogICAgICAgIGZvciAoeCA9IDA7IHggPCBsaW5lcy5sZW5ndGg7ICsreCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkID0gbGluZXNbeF0uaW5kZXhPZignOicpOwogICAgICAgICAgICB2YXIga2V5ID0gbGluZXNbeF0uc3Vic3RyaW5nKDAsIGQpLnRyaW0oKTsKICAgICAgICAgICAgdmFyIHZhbHVlID0gbGluZXNbeF0uc3Vic3RyaW5nKGQgKyAxKS50cmltKCk7CiAgICAgICAgICAgIGlmIChrZXkgIT0gIiIpIHsgb2JqW2tleV0gPSB2YWx1ZTsgdG91Y2hlZCA9IHRydWU7IH0KICAgICAgICB9CiAgICAgICAgaWYgKHRvdWNoZWQpIHsgcmV0LnB1c2gob2JqKTsgfQogICAgfQogICAgcmV0dXJuIChyZXQpOwp9CmZ1bmN0aW9uIGZldGNoUG9ydEZpbHRlcnMocnVsZXMpCnsKICAgIHZhciBpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzKSkKICAgIHsKICAgICAgICBydWxlcyA9IFtydWxlc107CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgICAgZmlsdGVyID0gd2lucmVnLlF1ZXJ5S2V5KHdpbnJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxTaGFyZWRBY2Nlc3NcXFBhcmFtZXRlcnNcXEZpcmV3YWxsUG9saWN5XFxGaXJld2FsbFJ1bGVzJywgcnVsZXNbaV0uTmFtZSk7CiAgICAgICAgdG9rZW5zID0gZmlsdGVyLnNwbGl0KCd8Jyk7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRva2Vucy5sZW5ndGg7ICsraykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgodG9rZW5YID0gdG9rZW5zW2tdLmluZGV4T2YoJz0nKSkgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2Vuc1trXS5zdWJzdHJpbmcoMCwgdG9rZW5YKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdQcm90b2NvbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlByb3RvY29sID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTFBvcnQnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Mb2NhbFBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdSUG9ydCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlJlbW90ZVBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdBcHAnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Qcm9ncmFtID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGdldEZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHAsIHRydWUpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdmaXJld2FsbFJ1bGUnKTsKCiAgICB2YXIgcmV0VmFsID0gW10sIGZpbHRlciA9IFtdOwogICAgdmFyIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsQXBwbGljYXRpb25GaWx0ZXIgLVByb2dyYW0gXFwiJyArIG9wdGlvbnMucHJvZ3JhbSArICdcXCIgfCAnICsgY29tbWFuZDsgfQoKICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykKICAgIHsKICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHAuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7CiAgICB9CiAgICBwLm9wdGlvbnMgPSBvcHRpb25zOwogICAgcC5jaGlsZC5wYXJlbnQgPSBwOwogICAgcC5jaGlsZC5zdGRvdXQuc3RyID0gJyc7IHAuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpCiAgICB7CiAgICAgICAgdmFyIGNvbW1hbmQ7CiAgICAgICAgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOwogICAgICAgIGlmKHRoaXMucGFyZW50LnBhcmVudC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKT4wKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgIGlmKChpPXRoaXMuc3RyLmluZGV4T2YoJ1xyXG5cclxuJykpPj0wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyLCBrLCB0b2tlbnMsIHRva2VuWDsKICAgICAgICAgICAgICAgIHZhciBqID0gdGhpcy5zdHIuc3Vic3RyaW5nKDAsIGkpOwogICAgICAgICAgICAgICAgdGhpcy5zdHIgPSB0aGlzLnN0ci5zdWJzdHJpbmcoaSArIDQpOwoKICAgICAgICAgICAgICAgIGogPSBwYXJzZUNtZGxldE91dHB1dChqKTsKICAgICAgICAgICAgICAgIGZldGNoUG9ydEZpbHRlcnMoaik7CgogICAgICAgICAgICAgICAgZm9yKGk9MDtpPGoubGVuZ3RoOysraSkKICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnBhcmVudC5lbWl0KCdmaXJld2FsbFJ1bGUnLCBqW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgcC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7IHAuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKCiAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkKICAgIHsKICAgICAgICB2YXIgY29tbWFuZCwgaSwgaiwgY2hpbGQsIGZpbHRlcjsKICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSAhPSAiIikgeyB0aGlzLnBhcmVudC5fcmVqKHRoaXMuc3RkZXJyLnN0ci50cmltKCkpOyByZXR1cm47IH0KCiAgICAgICAgaWYgKHRoaXMucGFyZW50Lmxpc3RlbmVyQ291bnQoJ2ZpcmV3YWxsUnVsZScpID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMucGFyZW50Ll9yZXMoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9iakFyciA9IHBhcnNlQ21kbGV0T3V0cHV0KHRoaXMuc3Rkb3V0LnN0cik7CiAgICAgICAgZmV0Y2hQb3J0RmlsdGVycyhvYmpBcnIpOwogICAgICAgIHRoaXMucGFyZW50Ll9yZXMob2JqQXJyKTsKICAgIH0pOwoKICAgIHJldHVybiAocCk7Cn0KCgpmdW5jdGlvbiBkaXNhYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQp7CiAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7CiAgICB2YXIgY29tbWFuZCA9ICdEaXNhYmxlLU5ldEZpcmV3YWxsUnVsZSc7CgogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkNCiAgICB7DQogICAgICAgIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsQXBwbGljYXRpb25GaWx0ZXIgLVByb2dyYW0gXFwiJyArIG9wdGlvbnMucHJvZ3JhbSArICdcXCIgfCAnICsgY29tbWFuZDsNCiAgICB9CiAgICBlbHNlDQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yIChrZXkgaW4gb3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zW2tleV07DQogICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignICcpID49IDApIHsgdmFsdWUgPSAnXFwiJyArIG9wdGlvbnNba2V5XSArICdcXCInOyB9DQogICAgICAgICAgICBjb21tYW5kICs9ICgnLScgKyBrZXkgKyAnICcgKyB2YWx1ZSk7DQogICAgICAgIH0NCiAgICB9CgogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7CiAgICB9CgogICAgcmV0LmNoaWxkLnJldCA9IHJldDsKICAgIHJldC5jaGlsZC5zdGRvdXQuc3RyID0gJyc7IHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgcmV0LmNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgaWYgKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKZnVuY3Rpb24gZW5hYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQp7CiAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7CgogICAgdmFyIGNvbW1hbmQgPSAnRW5hYmxlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5wcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIHZlcmlmeVZhbHVlcyhvcHRpb25zSW5wdXQsIGtleU5hbWUsIGtleVZhbHVlcywgZGVmYXVsdFZhbHVlKQp7CiAgICB2YXIgaSwgaiwgdG1wLCBvazsKICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zSW5wdXQpCiAgICB7CiAgICAgICAgaWYoa2V5TmFtZS50b0xvd2VyQ2FzZSgpID09IGtleS50b0xvd2VyQ2FzZSgpKQogICAgICAgIHsKICAgICAgICAgICAgdG1wID0gb3B0aW9uc0lucHV0W2tleV07CiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zSW5wdXRba2V5XTsKCiAgICAgICAgICAgIGlmIChrZXlWYWx1ZXMgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gdG1wOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRtcCE9bnVsbCkgeyB0bXAgPSB0bXAudG9TdHJpbmcoKS5zcGxpdCgnLCcpOyB9CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG1wLmxlbmd0aDsgKytqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxrZXlWYWx1ZXMubGVuZ3RoOysraSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRtcFtqXS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zSW5wdXRba2V5TmFtZV0gPSAob3B0aW9uc0lucHV0W2tleU5hbWVdID09IG51bGwgPyBrZXlWYWx1ZXNbaV0gOiAob3B0aW9uc0lucHV0W2tleU5hbWVdICsgJywgJyArIGtleVZhbHVlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB2YWx1ZSBmb3IgWycgKyBrZXlOYW1lICsgJ106ICcgKyB0bXBbal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zSW5wdXRba2V5TmFtZV0gIT0gbnVsbCkgeyByZXR1cm47IH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuLi4gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcHV0IGluIGEgZGVmYXVsdCB2YWx1ZQogICAgaWYoZGVmYXVsdFZhbHVlICE9IG51bGwpCiAgICB7CiAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gZGVmYXVsdFZhbHVlOwogICAgfQp9CgpmdW5jdGlvbiBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKQp7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0FjdGlvbicsIFsnTm90Q29uZmlndXJlZCcsICdBbGxvdycsICdCbG9jayddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnQXV0aGVudGljYXRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ05vRW5jYXAnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0Rlc2NyaXB0aW9uJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0RpcmVjdGlvbicsIFsnSW5ib3VuZCcsICdPdXRib3VuZCddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRGlzcGxheU5hbWUnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRHluYW1pY1RhcmdldCcsIFsnQW55JywgJ1Byb3hpbWl0eUFwcHMnLCAnUHJveGltaXR5U2hhcmluZycsICdXaWZpRGlyZWN0UHJpbnRpbmcnLCAnV2lmaURpcmVjdERpc3BsYXknLCAnV2lmaURpcmVjdERldmljZXMnXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdFZGdlVHJhdmVyc2FsUG9saWN5JywgWydCbG9jaycsICdBbGxvdycsICdEZWZlclRvVXNlcicsICdEZWZlclRvQXBwJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdFbmFibGVkJywgWydUcnVlJywgJ0ZhbHNlJ10sICdUcnVlJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuY3J5cHRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ0R5bmFtaWMnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0ludGVyZmFjZVR5cGUnLCBbJ0FueScsICdXaXJlZCcsICdXaXJlbGVzcycsICdSZW1vdGVBY2Nlc3NdJ10sICdBbnknKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9jYWxBZGRyZXNzJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsT25seU1hcHBpbmcnLCBbJ1RydWUnLCAnRmFsc2UnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsUG9ydCcpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbFVzZXInKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9vc2VTb3VyY2VNYXBwaW5nJywgWydUcnVlJywgJ0ZhbHNlJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdOYW1lJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ092ZXJyaWRlQmxvY2tSdWxlcycsIFsnVHJ1ZScsICdGYWxzZSddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3duZXInKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUGFja2FnZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQbGF0Zm9ybScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQb2xpY3lTdG9yZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQcm9maWxlJywgWydBbnknLCAnRG9tYWluJywgJ1ByaXZhdGUnLCAnUHVibGljJywgJ05vdEFwcGxpY2FibGUnXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQcm9ncmFtJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb3RvY29sJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1JlbW90ZUFkZHJlc3MnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUmVtb3RlTWFjaGluZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVQb3J0Jyk7CiAgICAKICAgIHJldHVybiAob3B0aW9ucyk7Cn0KCmZ1bmN0aW9uIHJlbW92ZUZpcmV3YWxsUnVsZShvcHRpb25zKQ0Kew0KICAgIGlmICh0eXBlb2YgKG9wdGlvbnMpID09ICdzdHJpbmcnKSB7IG9wdGlvbnMgPSB7IE5hbWU6IG9wdGlvbnMgfTsgfQ0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKDQogICAgdmFyIGNvbW1hbmQgPSAnUmVtb3ZlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKQogICAgew0KICAgICAgICBjb21tYW5kID0gJ0dldC1OZXRGaXJld2FsbEFwcGxpY2F0aW9uRmlsdGVyIC1Qcm9ncmFtIFxcIicgKyBvcHRpb25zLnByb2dyYW0gKyAnXFwiIHwgJyArIGNvbW1hbmQ7DQogICAgfQogICAgZWxzZQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgew0KICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygp", 16000); - memcpy_s(_winfirewall + 16000, 2164, "OyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwogICAgcmV0dXJuIChyZXQpOw0KfQoKZnVuY3Rpb24gYWRkRmlyZXdhbGxSdWxlKG9wdGlvbnMpCnsKICAgIHZhciBjb21tYW5kID0gJ05ldy1OZXRGaXJld2FsbFJ1bGUnOwogICAgdmFyIHZhbCA9IGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpOwogICAgdmFyIGtleTsKCiAgICBmb3IgKGtleSBpbiB2YWwpCiAgICB7CiAgICAgICAgaWYgKHZhbFtrZXldLnRvU3RyaW5nKCkuaW5kZXhPZignICcpID49IDApCiAgICAgICAgewogICAgICAgICAgICBjb21tYW5kICs9ICgnIC0nICsga2V5ICsgJyBcXCInICsgdmFsW2tleV0gKyAnXFwiJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCcgLScgKyBrZXkgKyAnICcgKyB2YWxba2V5XSArICcnKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIGNoaWxkOwogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQogICAgewogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQoKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgaWYoY2hpbGQuc3RkZXJyLnN0ci50cmltKCkgIT0gJycpCiAgICB7CiAgICAgICAgdGhyb3cgKGNoaWxkLnN0ZGVyci5zdHIudHJpbSgpKTsKICAgIH0KfQoKCm1vZHVsZS5leHBvcnRzID0KICAgIHsKICAgICAgICBnZXRGaXJld2FsbFJ1bGVzOiBnZXRGaXJld2FsbFJ1bGVzLAogICAgICAgIGRpc2FibGVGaXJld2FsbFJ1bGVzOiBkaXNhYmxlRmlyZXdhbGxSdWxlcywKICAgICAgICBlbmFibGVGaXJld2FsbFJ1bGVzOiBlbmFibGVGaXJld2FsbFJ1bGVzLAogICAgICAgIGFkZEZpcmV3YWxsUnVsZTogYWRkRmlyZXdhbGxSdWxlLAogICAgICAgIHJlbW92ZUZpcmV3YWxsUnVsZTogcmVtb3ZlRmlyZXdhbGxSdWxlCiAgICB9Owo=", 2164); - ILibBase64DecodeEx((unsigned char*)_winfirewall, 18164, (unsigned char*)_winfirewall + 18164); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "win-firewall"); duk_push_string(ctx, _winfirewall + 18164); + char *_winfirewall = ILibMemory_Allocate(46481, 0, NULL, NULL); + memcpy_s(_winfirewall + 0, 26560, "LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgd2lucmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7CgovL2F0dGFjaERlYnVnZ2VyKHsgd2VicG9ydDogOTk5NSwgd2FpdDogdHJ1ZSB9KS50aGVuKGNvbnNvbGUubG9nLCBjb25zb2xlLmxvZyk7CgpmdW5jdGlvbiBuZXRzZWN1cml0eUV4aXN0cygpDQp7DQogICAgdmFyIGNoaWxkOw0KICAgIHZhciBjb21tYW5kID0gJ0dldC1Nb2R1bGUgLUxpc3RBdmFpbGFibGUgLU5hbWUgbmV0c2VjdXJpdHknOwogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIgIT0gJycpOw0KfQoKZnVuY3Rpb24gcGFyc2VDbWRsZXRPdXRwdXQoZGF0YSkKewogICAgdmFyIHRvdWNoZWQ7CiAgICB2YXIgcmV0ID0gW107CiAgICB2YXIgY2h1bmtzID0gZGF0YS50cmltKCkuc3BsaXQoJ1xyXG5cclxuJyk7CiAgICB2YXIgbGluZXMsIHgsIG9iajsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIG9iaiA9IHt9OyB0b3VjaGVkID0gZmFsc2U7CiAgICAgICAgbGluZXMgPSBjaHVua3NbaV0uc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGluZXMubGVuZ3RoOyArK3gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZCA9IGxpbmVzW3hdLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgdmFyIGtleSA9IGxpbmVzW3hdLnN1YnN0cmluZygwLCBkKS50cmltKCk7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxpbmVzW3hdLnN1YnN0cmluZyhkICsgMSkudHJpbSgpOwogICAgICAgICAgICBpZiAoa2V5ICE9ICIiKSB7IG9ialtrZXldID0gdmFsdWU7IHRvdWNoZWQgPSB0cnVlOyB9CiAgICAgICAgfQogICAgICAgIGlmICh0b3VjaGVkKSB7IHJldC5wdXNoKG9iaik7IH0KICAgIH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBmZXRjaFBvcnRGaWx0ZXJzKHJ1bGVzKQp7CiAgICB2YXIgaTsKICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpCiAgICB7CiAgICAgICAgcnVsZXMgPSBbcnVsZXNdOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgZmlsdGVyID0gd2lucmVnLlF1ZXJ5S2V5KHdpbnJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxTaGFyZWRBY2Nlc3NcXFBhcmFtZXRlcnNcXEZpcmV3YWxsUG9saWN5XFxGaXJld2FsbFJ1bGVzJywgcnVsZXNbaV0uTmFtZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGZlKQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9CiAgICAgICAgdG9rZW5zID0gZmlsdGVyLnNwbGl0KCd8Jyk7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRva2Vucy5sZW5ndGg7ICsraykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgodG9rZW5YID0gdG9rZW5zW2tdLmluZGV4T2YoJz0nKSkgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2Vuc1trXS5zdWJzdHJpbmcoMCwgdG9rZW5YKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdQcm90b2NvbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlByb3RvY29sID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTFBvcnQnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Mb2NhbFBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdSUG9ydCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlJlbW90ZVBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdBcHAnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Qcm9ncmFtID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGdldEZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHAsIHRydWUpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdmaXJld2FsbFJ1bGUnKTsKCiAgICB2YXIgcmV0VmFsID0gW10sIGZpbHRlciA9IFtdOwogICAgdmFyIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkgeyBjb21tYW5kID0gJ0dldC1OZXRGaXJld2FsbEFwcGxpY2F0aW9uRmlsdGVyIC1Qcm9ncmFtIFxcIicgKyBvcHRpb25zLlByb2dyYW0gKyAnXFwiIHwgJyArIGNvbW1hbmQ7IH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgcC5vcHRpb25zID0gb3B0aW9uczsKICAgIHAuY2hpbGQucGFyZW50ID0gcDsKICAgIHAuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKQogICAgewogICAgICAgIHZhciBjb21tYW5kOwogICAgICAgIHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsKICAgICAgICBpZih0aGlzLnBhcmVudC5wYXJlbnQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJyk+MCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBpZigoaT10aGlzLnN0ci5pbmRleE9mKCdcclxuXHJcbicpKT49MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpbHRlciwgaywgdG9rZW5zLCB0b2tlblg7CiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMuc3RyLnN1YnN0cmluZygwLCBpKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGkgKyA0KTsKCiAgICAgICAgICAgICAgICBqID0gcGFyc2VDbWRsZXRPdXRwdXQoaik7CiAgICAgICAgICAgICAgICBmZXRjaFBvcnRGaWx0ZXJzKGopOwoKICAgICAgICAgICAgICAgIGZvcihpPTA7aTxqLmxlbmd0aDsrK2kpCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5wYXJlbnQuZW1pdCgnZmlyZXdhbGxSdWxlJywgaltpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIHAuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBwLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CgogICAgcC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgICAgdmFyIGNvbW1hbmQsIGksIGosIGNoaWxkLCBmaWx0ZXI7CiAgICAgICAgaWYgKHRoaXMuc3RkZXJyLnN0ci50cmltKCkgIT0gIiIpIHsgdGhpcy5wYXJlbnQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsgcmV0dXJuOyB9CgogICAgICAgIGlmICh0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudC5fcmVzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBvYmpBcnIgPSBwYXJzZUNtZGxldE91dHB1dCh0aGlzLnN0ZG91dC5zdHIpOwogICAgICAgIGZldGNoUG9ydEZpbHRlcnMob2JqQXJyKTsKICAgICAgICB0aGlzLnBhcmVudC5fcmVzKG9iakFycik7CiAgICB9KTsKCiAgICByZXR1cm4gKHApOwp9CgoKZnVuY3Rpb24gZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgdmFyIGNvbW1hbmQgPSAnRGlzYWJsZS1OZXRGaXJld2FsbFJ1bGUnOwogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0KCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyICE9ICcnKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVqKHRoaXMuc3RkZXJyLnN0ci50cmltKCkpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgcmV0dXJuIChyZXQpOwp9CgpmdW5jdGlvbiBlbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpCnsKICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9CgogICAgdmFyIGNvbW1hbmQgPSAnRW5hYmxlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIHZlcmlmeVZhbHVlcyhvcHRpb25zSW5wdXQsIGtleU5hbWUsIGtleVZhbHVlcywgZGVmYXVsdFZhbHVlKQp7CiAgICB2YXIgaSwgaiwgdG1wLCBvazsKICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zSW5wdXQpCiAgICB7CiAgICAgICAgaWYoa2V5TmFtZS50b0xvd2VyQ2FzZSgpID09IGtleS50b0xvd2VyQ2FzZSgpKQogICAgICAgIHsKICAgICAgICAgICAgdG1wID0gb3B0aW9uc0lucHV0W2tleV07CiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zSW5wdXRba2V5XTsKCiAgICAgICAgICAgIGlmIChrZXlWYWx1ZXMgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gdG1wOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRtcCE9bnVsbCkgeyB0bXAgPSB0bXAudG9TdHJpbmcoKS5zcGxpdCgnLCcpOyB9CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG1wLmxlbmd0aDsgKytqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxrZXlWYWx1ZXMubGVuZ3RoOysraSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRtcFtqXS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zSW5wdXRba2V5TmFtZV0gPSAob3B0aW9uc0lucHV0W2tleU5hbWVdID09IG51bGwgPyBrZXlWYWx1ZXNbaV0gOiAob3B0aW9uc0lucHV0W2tleU5hbWVdICsgJywgJyArIGtleVZhbHVlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB2YWx1ZSBmb3IgWycgKyBrZXlOYW1lICsgJ106ICcgKyB0bXBbal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zSW5wdXRba2V5TmFtZV0gIT0gbnVsbCkgeyByZXR1cm47IH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuLi4gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcHV0IGluIGEgZGVmYXVsdCB2YWx1ZQogICAgaWYoZGVmYXVsdFZhbHVlICE9IG51bGwpCiAgICB7CiAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gZGVmYXVsdFZhbHVlOwogICAgfQp9CgpmdW5jdGlvbiByZW1hcFZhbHVlcyhvYmosIG9sZG5hbWUsIG5ld25hbWUsIHRhYmxlKQp7DQogICAgaWYob2JqW29sZG5hbWVdICE9IG51bGwpDQogICAgew0KICAgICAgICB2YXIgdmFsdWUgPSBvYmpbb2xkbmFtZV07DQogICAgICAgIGRlbGV0ZSBvYmpbb2xkbmFtZV0NCg0KICAgICAgICBpZighdGFibGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHZhbHVlOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJywnKSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdmFsdWVdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB2YWx1ZS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8dG9rZW5zLmxlbmd0aDsrK2kpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZihvYmpbbmV3bmFtZV0gPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdG9rZW5zW2ldLnRyaW0oKV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBvYmpbbmV3bmFtZV0gPSAob2JqW25ld25hbWVdICsgJywgJyArIHRhYmxlW3Rva2Vuc1tpXS50cmltKCldKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0KCmZ1bmN0aW9uIGNvbnZlcnROZXRzaFZhbHVlcyhvYmopCnsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSdWxlIE5hbWUnLCAnTmFtZScpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0VuYWJsZWQnLCAnRW5hYmxlZCcsIHsgTm86ICdGYWxzZScsIFllczogJ1RydWUnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGVzJywgJ1Byb2ZpbGUnLCB7IEFueTogJ0FueScsIERvbWFpbjogJ0RvbWFpbicsIFB1YmxpYzogJ1B1YmxpYycsIFByaXZhdGU6ICdQcml2YXRlJyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdFZGdlIHRyYXZlcnNhbCcsICdFZGdlVHJhdmVyc2FsUG9saWN5JywgeyBObzogJ0Jsb2NrJywgWWVzOiAnQWxsb3cnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0RpcmVjdGlvbicsICdEaXJlY3Rpb24nLCB7IEluOiAnSW5ib3VuZCcsIE91dDogJ091dGJvdW5kJyB9KTsNCn0KCmZ1bmN0aW9uIGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpCnsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnQWN0aW9uJywgWydOb3RDb25maWd1cmVkJywgJ0FsbG93JywgJ0Jsb2NrJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdBdXRoZW50aWNhdGlvbicsIFsnTm90UmVxdWlyZWQnLCAnUmVxdWlyZWQnLCAnTm9FbmNhcCddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRGVzY3JpcHRpb24nKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRGlyZWN0aW9uJywgWydJbmJvdW5kJywgJ091dGJvdW5kJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEaXNwbGF5TmFtZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEeW5hbWljVGFyZ2V0JywgWydBbnknLCAnUHJveGltaXR5QXBwcycsICdQcm94", 16000); + memcpy_s(_winfirewall + 16000, 10560, "aW1pdHlTaGFyaW5nJywgJ1dpZmlEaXJlY3RQcmludGluZycsICdXaWZpRGlyZWN0RGlzcGxheScsICdXaWZpRGlyZWN0RGV2aWNlcyddLCAnQW55Jyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VkZ2VUcmF2ZXJzYWxQb2xpY3knLCBbJ0Jsb2NrJywgJ0FsbG93JywgJ0RlZmVyVG9Vc2VyJywgJ0RlZmVyVG9BcHAnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuYWJsZWQnLCBbJ1RydWUnLCAnRmFsc2UnXSwgJ1RydWUnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRW5jcnlwdGlvbicsIFsnTm90UmVxdWlyZWQnLCAnUmVxdWlyZWQnLCAnRHluYW1pYyddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnSW50ZXJmYWNlVHlwZScsIFsnQW55JywgJ1dpcmVkJywgJ1dpcmVsZXNzJywgJ1JlbW90ZUFjY2Vzc10nXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbEFkZHJlc3MnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9jYWxPbmx5TWFwcGluZycsIFsnVHJ1ZScsICdGYWxzZSddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9jYWxQb3J0Jyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsVXNlcicpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb29zZVNvdXJjZU1hcHBpbmcnLCBbJ1RydWUnLCAnRmFsc2UnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ05hbWUnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3ZlcnJpZGVCbG9ja1J1bGVzJywgWydUcnVlJywgJ0ZhbHNlJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdPd25lcicpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQYWNrYWdlJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BsYXRmb3JtJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BvbGljeVN0b3JlJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb2ZpbGUnLCBbJ0FueScsICdEb21haW4nLCAnUHJpdmF0ZScsICdQdWJsaWMnLCAnTm90QXBwbGljYWJsZSddLCAnQW55Jyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb2dyYW0nKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUHJvdG9jb2wnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUmVtb3RlQWRkcmVzcycpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVNYWNoaW5lJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1JlbW90ZVBvcnQnKTsKICAgIAogICAgcmV0dXJuIChvcHRpb25zKTsKfQoKZnVuY3Rpb24gcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgaWYgKHR5cGVvZiAob3B0aW9ucykgPT0gJ3N0cmluZycpIHsgb3B0aW9ucyA9IHsgTmFtZTogb3B0aW9ucyB9OyB9DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0KDQogICAgdmFyIGNvbW1hbmQgPSAnUmVtb3ZlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQogICAgew0KICAgICAgICBjb21tYW5kID0gJ0dldC1OZXRGaXJld2FsbEFwcGxpY2F0aW9uRmlsdGVyIC1Qcm9ncmFtIFxcIicgKyBvcHRpb25zLlByb2dyYW0gKyAnXFwiIHwgJyArIGNvbW1hbmQ7DQogICAgfQogICAgZWxzZQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgew0KICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwogICAgcmV0dXJuIChyZXQpOw0KfQoKZnVuY3Rpb24gYWRkRmlyZXdhbGxSdWxlKG9wdGlvbnMpCnsKICAgIHZhciBjb21tYW5kID0gJ05ldy1OZXRGaXJld2FsbFJ1bGUnOwogICAgdmFyIHZhbCA9IGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpOwogICAgdmFyIGtleTsKCiAgICBmb3IgKGtleSBpbiB2YWwpCiAgICB7CiAgICAgICAgaWYgKHZhbFtrZXldLnRvU3RyaW5nKCkuaW5kZXhPZignICcpID49IDApCiAgICAgICAgewogICAgICAgICAgICBjb21tYW5kICs9ICgnIC0nICsga2V5ICsgJyBcXCInICsgdmFsW2tleV0gKyAnXFwiJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCcgLScgKyBrZXkgKyAnICcgKyB2YWxba2V5XSArICcnKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIGNoaWxkOwogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQogICAgewogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQoKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgaWYoY2hpbGQuc3RkZXJyLnN0ci50cmltKCkgIT0gJycpCiAgICB7CiAgICAgICAgdGhyb3cgKGNoaWxkLnN0ZGVyci5zdHIudHJpbSgpKTsKICAgIH0KfQoKZnVuY3Rpb24gbmV0c2hfcGFyc2VSZXN1bHRzKHN0cikKew0KICAgIHZhciByZXQgPSBbXTsNCiAgICB2YXIgaSwgaiwgaywgb2JqLCB0b2tlbnM7DQogICAgdmFyIGJsb2NrcyA9IHN0ci5zcGxpdCgnXHJcblxyXG4nKTsNCiAgICBmb3IoaT0wO2k8YmxvY2tzLmxlbmd0aDsrK2kpDQogICAgew0KICAgICAgICBvYmogPSB7fTsNCiAgICAgICAgdG9rZW5zID0gYmxvY2tzW2ldLnNwbGl0KCdcclxuJyk7DQogICAgICAgIGZvcihqPTA7ajx0b2tlbnMubGVuZ3RoOysraikNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKChrID0gdG9rZW5zW2pdLmluZGV4T2YoJzonKSkgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialt0b2tlbnNbal0uc3Vic3RyaW5nKDAsIGspLnRyaW0oKV0gPSB0b2tlbnNbal0uc3Vic3RyaW5nKGsgKyAxKS50cmltKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY29udmVydE5ldHNoVmFsdWVzKG9iaik7DQogICAgICAgIHJldC5wdXNoKG9iaik7DQogICAgfQ0KICAgIHJldHVybiAocmV0KTsNCn0KCmZ1bmN0aW9uIG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucykNCnsNCiAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocCwgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOwoNCiAgICB2YXIgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzaG93IHJ1bGUgbmFtZT1hbGwgdmVyYm9zZSc7CiAgICBwLm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHAuX3Jlc3VsdHMgPSBbXTsNCiAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICBwLmNoaWxkLnJldCA9IHA7DQogICAgcC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7IHAuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBwLmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChiKQ0KICAgIHsNCiAgICAgICAgdmFyIGtleSwgb2s7DQogICAgICAgIHRoaXMuc3RyICs9IGIudG9TdHJpbmcoKTsNCiAgICAgICAgdmFyIGVYID0gdGhpcy5zdHIubGFzdEluZGV4T2YoJ1xyXG5cclxuJyk7DQoNCiAgICAgICAgaWYgKGVYID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBydWxlcyA9IG5ldHNoX3BhcnNlUmVzdWx0cyh0aGlzLnN0ci5zdWJzdHJpbmcoMCwgZVgpKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcnVsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIHRoaXMucGFyZW50LnJldC5vcHRpb25zKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wYXJlbnQucmV0Lm9wdGlvbnNba2V5XSA9PSBudWxsIHx8IHRoaXMucGFyZW50LnJldC5vcHRpb25zW2tleV0gIT0gcnVsZXNbaV1ba2V5XSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChvaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5yZXQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJykgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZXQuZW1pdCgnZmlyZXdhbGxSdWxlJywgcnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucmV0Ll9yZXN1bHRzLnB1c2gocnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5zdHIubGVuZ3RoIC0gZVggPiA0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGVYICsgNCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIGlmICh0aGlzLnJldC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKHRoaXMucmV0Ll9yZXN1bHRzLmxlbmd0aD4wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZXModGhpcy5yZXQuX3Jlc3VsdHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZWooJ05vIG1hdGNoZXMnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgICByZXR1cm4gKHApOw0KfQ0KZnVuY3Rpb24gbmV0c2hfZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykNCnsNCg0KfQ0KZnVuY3Rpb24gbmV0c2hfZW5hYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KDQp9DQpmdW5jdGlvbiBuZXRzaF9hZGRGaXJld2FsbFJ1bGUob3B0aW9ucykNCnsNCg0KfQ0KZnVuY3Rpb24gbmV0c2hfcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQoNCn0NCmZ1bmN0aW9uIG5ldHNoX25ldHNlY3VyaXR5RXhpc3RzKG9wdGlvbnMpCnsNCg0KfQoKCmlmIChuZXRzZWN1cml0eUV4aXN0cygpKQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzID0KICAgICAgICB7DQogICAgICAgICAgICBnZXRGaXJld2FsbFJ1bGVzOiAgICAgICBnZXRGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBkaXNhYmxlRmlyZXdhbGxSdWxlczogICBkaXNhYmxlRmlyZXdhbGxSdWxlcywKICAgICAgICAgICAgZW5hYmxlRmlyZXdhbGxSdWxlczogICAgZW5hYmxlRmlyZXdhbGxSdWxlcywKICAgICAgICAgICAgYWRkRmlyZXdhbGxSdWxlOiAgICAgICAgYWRkRmlyZXdhbGxSdWxlLAogICAgICAgICAgICByZW1vdmVGaXJld2FsbFJ1bGU6ICAgICByZW1vdmVGaXJld2FsbFJ1bGUsCiAgICAgICAgICAgIG5ldHNlY3VyaXR5RXhpc3RzOiAgICAgIG5ldHNlY3VyaXR5RXhpc3RzDQogICAgICAgIH07DQp9DQplbHNlDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQogICAgICAgIHsNCiAgICAgICAgICAgIGdldEZpcmV3YWxsUnVsZXM6ICAgICAgIG5ldHNoX2dldEZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGRpc2FibGVGaXJld2FsbFJ1bGVzOiAgIG5ldHNoX2Rpc2FibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBlbmFibGVGaXJld2FsbFJ1bGVzOiAgICBuZXRzaF9lbmFibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBhZGRGaXJld2FsbFJ1bGU6ICAgICAgICBuZXRzaF9hZGRGaXJld2FsbFJ1bGUsCiAgICAgICAgICAgIHJlbW92ZUZpcmV3YWxsUnVsZTogICAgIG5ldHNoX3JlbW92ZUZpcmV3YWxsUnVsZSwKICAgICAgICAgICAgbmV0c2VjdXJpdHlFeGlzdHM6ICAgICAgbmV0c2hfbmV0c2VjdXJpdHlFeGlzdHMNCiAgICAgICAgfTsNCn0=", 10560); + ILibBase64DecodeEx((unsigned char*)_winfirewall, 26560, (unsigned char*)_winfirewall + 26560); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "win-firewall"); duk_push_string(ctx, _winfirewall + 26560); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_winfirewall); #endif diff --git a/modules/win-firewall.js b/modules/win-firewall.js index 6cd2f35..fba86f7 100644 --- a/modules/win-firewall.js +++ b/modules/win-firewall.js @@ -17,6 +17,27 @@ limitations under the License. var promise = require('promise'); var winreg = require('win-registry'); +//attachDebugger({ webport: 9995, wait: true }).then(console.log, console.log); + +function netsecurityExists() +{ + var child; + var command = 'Get-Module -ListAvailable -Name netsecurity'; + if (require('os').arch() == 'x64') + { + child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['/C "' + command + '"']); + } + else + { + child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['/C "' + command + '"']); + } + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); + child.waitExit(); + + return (child.stdout.str != ''); +} + function parseCmdletOutput(data) { var touched; @@ -47,7 +68,14 @@ function fetchPortFilters(rules) } for (i = 0; i < rules.length; ++i) { - filter = winreg.QueryKey(winreg.HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\FirewallRules', rules[i].Name); + try + { + filter = winreg.QueryKey(winreg.HKEY.LocalMachine, 'SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\FirewallRules', rules[i].Name); + } + catch(fe) + { + continue; + } tokens = filter.split('|'); for (k = 0; k < tokens.length; ++k) { @@ -81,7 +109,8 @@ function getFirewallRules(options) var retVal = [], filter = []; var command = 'Get-NetFirewallRule'; - if (options.program) { command = 'Get-NetFirewallApplicationFilter -Program \\"' + options.program + '\\" | ' + command; } + if (options.program) { options.Program = options.program; delete options.program; } + if (options.Program) { command = 'Get-NetFirewallApplicationFilter -Program \\"' + options.Program + '\\" | ' + command; } if (require('os').arch() == 'x64') { @@ -142,10 +171,11 @@ function disableFirewallRules(options) { var ret = new promise(function (a, r) { this._res = a; this._rej = r; }); var command = 'Disable-NetFirewallRule'; + if (options.program) { options.Program = options.program; delete options.program; } - if (options.program) + if (options.Program) { - command = 'Get-NetFirewallApplicationFilter -Program \\"' + options.program + '\\" | ' + command; + command = 'Get-NetFirewallApplicationFilter -Program \\"' + options.Program + '\\" | ' + command; } else { @@ -188,11 +218,12 @@ function disableFirewallRules(options) function enableFirewallRules(options) { var ret = new promise(function (a, r) { this._res = a; this._rej = r; }); + if (options.program) { options.Program = options.program; delete options.program; } var command = 'Enable-NetFirewallRule'; - if (options.program) + if (options.Program) { - command = 'Get-NetFirewallApplicationFilter -Program \\"' + options.program + '\\" | ' + command; + command = 'Get-NetFirewallApplicationFilter -Program \\"' + options.Program + '\\" | ' + command; } else { @@ -280,6 +311,51 @@ function verifyValues(optionsInput, keyName, keyValues, defaultValue) } } +function remapValues(obj, oldname, newname, table) +{ + if(obj[oldname] != null) + { + var value = obj[oldname]; + delete obj[oldname] + + if(!table) + { + obj[newname] = value; + } + else + { + if (value.indexOf(',') < 0) + { + obj[newname] = table[value]; + } + else + { + var tokens = value.split(','); + for(var i=0;i 0) + { + obj[tokens[j].substring(0, k).trim()] = tokens[j].substring(k + 1).trim(); + } + } + convertNetshValues(obj); + ret.push(obj); + } + return (ret); +} + +function netsh_getFirewallRules(options) +{ + var p = new promise(function (a, r) { this._res = a; this._rej = r; }); + require('events').EventEmitter.call(p, true) + .createEvent('firewallRule'); + + var command = 'netsh advfirewall firewall show rule name=all verbose'; + p.options = options; + p._results = []; + p.child = require('child_process').execFile(process.env['windir'] + '\\System32\\cmd.exe', ['/C "' + command + '"']); + p.child.ret = p; + p.child.stderr.str = ''; p.child.stderr.on('data', function (c) { this.str += c.toString(); }); + p.child.stdout.str = ''; + p.child.stdout.on('data', function (b) + { + var key, ok; + this.str += b.toString(); + var eX = this.str.lastIndexOf('\r\n\r\n'); + + if (eX >= 0) + { + var rules = netsh_parseResults(this.str.substring(0, eX)); + for (var i in rules) + { + ok = true; + for (key in this.parent.ret.options) + { + if(this.parent.ret.options[key] == null || this.parent.ret.options[key] != rules[i][key]) + { + ok = false; + break; + } + } + if (ok) + { + if (this.parent.ret.listenerCount('firewallRule') > 0) + { + this.parent.ret.emit('firewallRule', rules[i]); + } + else + { + this.parent.ret._results.push(rules[i]); + } + } + } + + if (this.str.length - eX > 4) + { + this.str = this.str.substring(eX + 4); + } + } + }); + p.child.on('exit', function () + { + if (this.ret.listenerCount('firewallRule') > 0) + { + this.ret._res(); + } + else + { + if(this.ret._results.length>0) + { + this.ret._res(this.ret._results); + } + else + { + this.ret._rej('No matches'); + } + } + }); + + + return (p); +} +function netsh_disableFirewallRules(options) +{ + +} +function netsh_enableFirewallRules(options) +{ + +} +function netsh_addFirewallRule(options) +{ + +} +function netsh_removeFirewallRule(options) +{ + +} +function netsh_netsecurityExists(options) +{ + +} + + +if (netsecurityExists()) +{ + module.exports = + { + getFirewallRules: getFirewallRules, + disableFirewallRules: disableFirewallRules, + enableFirewallRules: enableFirewallRules, + addFirewallRule: addFirewallRule, + removeFirewallRule: removeFirewallRule, + netsecurityExists: netsecurityExists + }; +} +else +{ + module.exports = + { + getFirewallRules: netsh_getFirewallRules, + disableFirewallRules: netsh_disableFirewallRules, + enableFirewallRules: netsh_enableFirewallRules, + addFirewallRule: netsh_addFirewallRule, + removeFirewallRule: netsh_removeFirewallRule, + netsecurityExists: netsh_netsecurityExists + }; +} \ No newline at end of file