diff --git a/microscript/ILibDuktape_ChildProcess.c b/microscript/ILibDuktape_ChildProcess.c index 2d1e6a7..7073b87 100644 --- a/microscript/ILibDuktape_ChildProcess.c +++ b/microscript/ILibDuktape_ChildProcess.c @@ -221,6 +221,23 @@ duk_ret_t ILibDuktape_ChildProcess_tcsetsize(duk_context *ctx) } #endif +duk_ret_t ILibDuktape_SpawnedProcess_descriptorSetter(duk_context *ctx) +{ + duk_push_this(ctx); + ILibDuktape_ChildProcess_SubProcess *retVal = (ILibDuktape_ChildProcess_SubProcess*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_ChildProcess_MemBuf); + duk_push_string(ctx, ILibProcessPipe_Process_GetMetadata(retVal->childProcess)); // [string] + duk_get_prop_string(ctx, -1, "split"); // [string][split] + duk_swap_top(ctx, -2); // [split][this] + duk_push_string(ctx, " [EXIT]"); // [split][this][delim] + duk_call_method(ctx, 1); // [array] + duk_get_prop_string(ctx, -1, "shift"); // [array][shift] + duk_swap_top(ctx, -2); // [shift][this] + duk_call_method(ctx, 0); // [string] + duk_push_sprintf(ctx, "%s, %s", duk_get_string(ctx, -1), duk_require_string(ctx, 0)); // [string][newVal] + + ILibProcessPipe_Process_ResetMetadata(retVal->childProcess, (char*)duk_get_string(ctx, -1)); + return(0); +} ILibDuktape_ChildProcess_SubProcess* ILibDuktape_ChildProcess_SpawnedProcess_PUSH(duk_context *ctx, ILibProcessPipe_Process mProcess, void *callback) { duk_push_object(ctx); // [ChildProcess] @@ -278,7 +295,8 @@ ILibDuktape_ChildProcess_SubProcess* ILibDuktape_ChildProcess_SpawnedProcess_PUS #endif if (callback != NULL) { ILibDuktape_EventEmitter_AddOnce(emitter, "exit", callback); } - + + ILibProcessPipe_Process_ResetMetadata(mProcess, "childProcess"); ILibProcessPipe_Process_AddHandlers(mProcess, 4096, ILibDuktape_ChildProcess_SubProcess_ExitHandler, ILibDuktape_ChildProcess_SubProcess_StdOutHandler, ILibDuktape_ChildProcess_SubProcess_StdErrHandler, @@ -288,6 +306,8 @@ ILibDuktape_ChildProcess_SubProcess* ILibDuktape_ChildProcess_SpawnedProcess_PUS { if (callback != NULL) { ILibDuktape_EventEmitter_AddOnce(emitter, "exit", callback); } } + + ILibDuktape_CreateEventWithSetterEx(ctx, "descriptorMetadata", ILibDuktape_SpawnedProcess_descriptorSetter); return(retVal); } diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index f887d3f..485f108 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2094,7 +2094,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('win-bcd', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQpmdW5jdGlvbiBnZXRLZXlzKCkNCnsNCiAgICB2YXIgcmV0ID0ge307DQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgIlxcU3lzdGVtMzJcXGJjZGVkaXQuZXhlIiwgWydiY2RlZGl0JywgJy9lbnVtJywgJ3tjdXJyZW50fSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJ1xyXG4nKTsNCiAgICBsaW5lcy5zaGlmdCgpOyBsaW5lcy5zaGlmdCgpOw0KDQogICAgZm9yICh2YXIgaSBpbiBsaW5lcykNCiAgICB7DQogICAgICAgIHZhciB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOw0KICAgICAgICB2YXIga2V5ID0gdG9rZW5zLnNoaWZ0KCk7DQogICAgICAgIHZhciB2YWx1ZSA9IHRva2Vucy5qb2luKCcgJykudHJpbSgpOw0KICAgICAgICByZXRba2V5XSA9IHZhbHVlOw0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBnZXRLZXkoa2V5KQ0Kew0KICAgIHJldHVybiAodGhpcy5nZXRLZXlzKClba2V5XSk7DQp9DQpmdW5jdGlvbiBzZXRLZXkoa2V5LCB2YWx1ZSkNCnsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgIlxcU3lzdGVtMzJcXGJjZGVkaXQuZXhlIiwgWydiY2RlZGl0JywgJy9zZXQnLCAne2N1cnJlbnR9Jywga2V5LCB2YWx1ZV0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQpmdW5jdGlvbiBkZWxldGVLZXkoa2V5KQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAiXFxTeXN0ZW0zMlxcYmNkZWRpdC5leGUiLCBbJ2JjZGVkaXQnLCAnL2RlbGV0ZXZhbHVlJywgJ3tjdXJyZW50fScsIGtleV0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQoNCmZ1bmN0aW9uIGVuYWJsZVNhZmVNb2RlU2VydmljZShzZXJ2aWNlTmFtZSkNCnsNCiAgICByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5Xcml0ZUtleShyZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFNhZmVib290XFxOZXR3b3JrXFwnICsgc2VydmljZU5hbWUsIG51bGwsICdTZXJ2aWNlJyk7DQp9DQpmdW5jdGlvbiBpc1NhZmVNb2RlU2VydmljZShzZXJ2aWNlTmFtZSkNCnsNCiAgICB2YXIgcmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7DQogICAgdmFyIGtleSA9IHsgZGVmYXVsdDogJ25vbmUnIH07DQogICAgdHJ5IHsga2V5ID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFNhZmVib290XFxOZXR3b3JrXFwnICsgc2VydmljZU5hbWUpOyB9IGNhdGNoIChxa2UpIHsgfQ0KICAgIHJldHVybiAoa2V5LmRlZmF1bHQgPT0gJ1NlcnZpY2UnKTsNCn0NCmZ1bmN0aW9uIGRpc2FibGVTYWZlTW9kZVNlcnZpY2Uoc2VydmljZU5hbWUpDQp7DQogICAgdHJ5DQogICAgew0KICAgICAgICByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5EZWxldGVLZXkocmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxTYWZlYm9vdFxcTmV0d29ya1xcJyArIHNlcnZpY2VOYW1lKTsNCiAgICB9DQogICAgY2F0Y2goeCkNCiAgICB7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZXN0YXJ0KGRlbGF5KQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAiXFxTeXN0ZW0zMlxcc2h1dGRvd24uZXhlIiwgWydzaHV0ZG93bicsICcvcicsICcvdCcsIGRlbGF5IT1udWxsP2RlbGF5LnRvU3RyaW5nKCk6JzAnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7fSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCn0NCg0KaWYgKHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLlBvaW50ZXJTaXplID09IDQgJiYgcmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQ0KICAgIHsNCiAgICAgICAgZW5hYmxlU2FmZU1vZGVTZXJ2aWNlOiBlbmFibGVTYWZlTW9kZVNlcnZpY2UsDQogICAgICAgIGRpc2FibGVTYWZlTW9kZVNlcnZpY2U6IGRpc2FibGVTYWZlTW9kZVNlcnZpY2UsIHJlc3RhcnQ6IHJlc3RhcnQsIGlzU2FmZU1vZGVTZXJ2aWNlOiBpc1NhZmVNb2RlU2VydmljZQ0KICAgIH07DQp9DQplbHNlDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQ0KICAgICAgICB7DQogICAgICAgICAgICBnZXRLZXlzOiBnZXRLZXlzLCBzZXRLZXk6IHNldEtleSwgZGVsZXRlS2V5OiBkZWxldGVLZXksIGVuYWJsZVNhZmVNb2RlU2VydmljZTogZW5hYmxlU2FmZU1vZGVTZXJ2aWNlLA0KICAgICAgICAgICAgZGlzYWJsZVNhZmVNb2RlU2VydmljZTogZGlzYWJsZVNhZmVNb2RlU2VydmljZSwgZ2V0S2V5OiBnZXRLZXksIHJlc3RhcnQ6IHJlc3RhcnQsIGlzU2FmZU1vZGVTZXJ2aWNlOiBpc1NhZmVNb2RlU2VydmljZQ0KICAgICAgICB9Ow0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAiYm9vdE1vZGUiLA0KICAgICAgICB7DQogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLlF1ZXJ5S2V5KHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcU2FmZWJvb3RcXE9wdGlvbicsICdPcHRpb25WYWx1ZScpOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHYpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdTQUZFX01PREVfTkVUV09SSycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdTQUZFX01PREUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaCAoeCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoJ05PUk1BTCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQp9', 'base64').toString());"); // win-dispatcher a helper to run JavaScript as a particular user. Refer to modules/win-dispatcher.js - duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGRpc3BhdGNoKG9wdGlvbnMpDQp7DQogICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm1vZHVsZXMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICB2YXIgaXBjSW50ZWdlcg0KICAgIHZhciByZXQgPSB7IG9wdGlvbnM6IG9wdGlvbnMgfTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpLmNyZWF0ZUV2ZW50KCdjb25uZWN0aW9uJyk7DQoNCiAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMyID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjMi5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICByZXQuX2lwYzIub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCg0KICAgIHdoaWxlICh0cnVlKQ0KICAgIHsNCiAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOw0KICAgICAgICANCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5faXBjLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCwgd3JpdGFibGVBbGw6IHRydWUgfSk7DQogICAgICAgICAgICByZXQuX2lwYzIubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoICsgJ0MnLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoICh4KQ0KICAgICAgICB7DQogICAgICAgIH0NCiAgICB9DQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsNCiAgICByZXQuX2lwYzIub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wgPSBzOw0KICAgICAgICB0aGlzLnBhcmVudC5fY29udHJvbC5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgdGhpcy5jbG9zZSgpOw0KICAgICAgICB0aGlzLnBhcmVudC5pbnZva2UgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmdzKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCiAgICAgICAgICAgIGQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmQ6ICdpbnZva2UnLCB2YWx1ZTogeyBtZXRob2Q6IG1ldGhvZCwgYXJnczogYXJncyB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgdGhpcy5fY29udHJvbC53cml0ZShoKTsNCiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wud3JpdGUoZCk7DQogICAgICAgIH07DQogICAgfSk7DQogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NsaWVudCA9IHM7DQogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHRoaXMuY2xvc2UoKTsNCiAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQogICAgICAgIHMuZGVzY3JpcHRvck1ldGFkYXRhID0gJ3dpbi1kaXNwYXRjaGVyJzsNCg0KICAgICAgICBmb3IgKHZhciBtIGluIHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgcy53cml0ZShoKTsNCiAgICAgICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIH0NCiAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2xhdW5jaCcsIHZhbHVlOiB7IG1vZHVsZTogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlLCBtZXRob2Q6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1ldGhvZCwgYXJnczogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2guYXJncyB9IH0pKTsNCiAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgIHMud3JpdGUoaCk7DQogICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsNCiAgICB9KTsNCg0KICAgIHZhciBwYXJtcyA9ICcvQyBTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwICc7DQogICAgaWYgKG9wdGlvbnMudXNlcikNCiAgICB7DQogICAgICAgIC8vIFNwZWNpZmllZCBVc2VyDQogICAgICAgIHBhcm1zICs9ICgnL1JVICcgKyBvcHRpb25zLnVzZXIgKyAnICcpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpLnRzaWQgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1JVIFNZU1RFTSAnKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBwYXJtcyArPSAoJy9UUiAiXFwiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnXFwiIC1iNjRleGVjICcgKyBzdHIgKyAnIicpOw0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgW3Bhcm1zXSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvUlVOIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG5leGl0XHJcbicpOw0KDQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gY29ubmVjdChpcGMpDQp7DQogICAgdmFyIGlwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjOw0KICAgIGdsb2JhbC5pcGMyQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggKyAnQycgfSwgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7DQogICAgICAgICAgICBzd2l0Y2ggKGNtZC5jb21tYW5kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZSc6DQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7DQogICAgZ2xvYmFsLmlwY0NsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7DQogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMudW5zaGlmdChjKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdhZGRNb2R1bGUnOg0KICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGUoY21kLnZhbHVlLm5hbWUsIGNtZC52YWx1ZS5qcyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xhdW5jaCc6DQogICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXF1aXJlKGNtZC52YWx1ZS5tb2R1bGUpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtLnBpcGUodGhpcywgeyBlbmQ6IGZhbHNlIH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBpcGUoZ2xvYmFsLl9wcm94eVN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KICAgIGdsb2JhbC5pcGNDbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQogICAgZ2xvYmFsLmlwYzJDbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0geyBkaXNwYXRjaDogZGlzcGF0Y2gsIGNvbm5lY3Q6IGNvbm5lY3QgfTsNCg0K', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGRpc3BhdGNoKG9wdGlvbnMpDQp7DQogICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLm1vZHVsZXMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICB2YXIgaXBjSW50ZWdlcg0KICAgIHZhciByZXQgPSB7IG9wdGlvbnM6IG9wdGlvbnMgfTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpLmNyZWF0ZUV2ZW50KCdjb25uZWN0aW9uJyk7DQoNCiAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMyID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjMi5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICByZXQuX2lwYzIub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsNCg0KICAgIHdoaWxlICh0cnVlKQ0KICAgIHsNCiAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOw0KICAgICAgICANCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5faXBjLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCwgd3JpdGFibGVBbGw6IHRydWUgfSk7DQogICAgICAgICAgICByZXQuX2lwYzIubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoICsgJ0MnLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoICh4KQ0KICAgICAgICB7DQogICAgICAgIH0NCiAgICB9DQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsNCiAgICByZXQuX2lwYzIub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wgPSBzOw0KICAgICAgICB0aGlzLnBhcmVudC5fY29udHJvbC5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgdGhpcy5jbG9zZSgpOw0KICAgICAgICB0aGlzLnBhcmVudC5pbnZva2UgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmdzKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCiAgICAgICAgICAgIGQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmQ6ICdpbnZva2UnLCB2YWx1ZTogeyBtZXRob2Q6IG1ldGhvZCwgYXJnczogYXJncyB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgdGhpcy5fY29udHJvbC53cml0ZShoKTsNCiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wud3JpdGUoZCk7DQogICAgICAgIH07DQogICAgfSk7DQogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NsaWVudCA9IHM7DQogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHRoaXMuY2xvc2UoKTsNCiAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQogICAgICAgIHMuZGVzY3JpcHRvck1ldGFkYXRhID0gJ3dpbi1kaXNwYXRjaGVyLCAnICsgdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlICsgJy4nICsgdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubWV0aG9kICsgJygpJzsNCg0KICAgICAgICBmb3IgKHZhciBtIGluIHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgcy53cml0ZShoKTsNCiAgICAgICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIH0NCiAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2xhdW5jaCcsIHZhbHVlOiB7IG1vZHVsZTogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlLCBtZXRob2Q6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1ldGhvZCwgYXJnczogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2guYXJncyB9IH0pKTsNCiAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgIHMud3JpdGUoaCk7DQogICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsNCiAgICB9KTsNCg0KICAgIHZhciBwYXJtcyA9ICcvQyBTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwICc7DQogICAgaWYgKG9wdGlvbnMudXNlcikNCiAgICB7DQogICAgICAgIC8vIFNwZWNpZmllZCBVc2VyDQogICAgICAgIHBhcm1zICs9ICgnL1JVICcgKyBvcHRpb25zLnVzZXIgKyAnICcpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpLnRzaWQgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1JVIFNZU1RFTSAnKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBwYXJtcyArPSAoJy9UUiAiXFwiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnXFwiIC1iNjRleGVjICcgKyBzdHIgKyAnIicpOw0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgW3Bhcm1zXSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvUlVOIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG5leGl0XHJcbicpOw0KDQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gY29ubmVjdChpcGMpDQp7DQogICAgdmFyIGlwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjOw0KICAgIGdsb2JhbC5pcGMyQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggKyAnQycgfSwgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7DQogICAgICAgICAgICBzd2l0Y2ggKGNtZC5jb21tYW5kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZSc6DQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7DQogICAgZ2xvYmFsLmlwY0NsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7DQogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMudW5zaGlmdChjKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdhZGRNb2R1bGUnOg0KICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGUoY21kLnZhbHVlLm5hbWUsIGNtZC52YWx1ZS5qcyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2xhdW5jaCc6DQogICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXF1aXJlKGNtZC52YWx1ZS5tb2R1bGUpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtLnBpcGUodGhpcywgeyBlbmQ6IGZhbHNlIH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBpcGUoZ2xvYmFsLl9wcm94eVN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pOw0KDQogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgIH0pOw0KICAgIH0pOw0KICAgIGdsb2JhbC5pcGNDbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQogICAgZ2xvYmFsLmlwYzJDbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0geyBkaXNwYXRjaDogZGlzcGF0Y2gsIGNvbm5lY3Q6IGNvbm5lY3QgfTsNCg0K', 'base64').toString());"); // win-firewall is a helper to Modify Windows Firewall Filters. Refer to modules/win-firewall.js char *_winfirewall = ILibMemory_Allocate(60573, 0, NULL, NULL); @@ -2181,7 +2181,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) free(_taskscheduler); // Child-Container, refer to modules/child-container.js - duk_peval_string_noresult(ctx, "addModule('child-container', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGNoaWxkQ29udGFpbmVyKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdjaGlsZC1jb250YWluZXInOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICAgICAgdmFyIGlwY0ludGVnZXI7DQoNCiAgICAgICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9Ow0KICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3JlYWR5JykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnZGlzY29ubmVjdCcsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3QgY2hpbGQgPT4nKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9jbGllbnQuZW5kKCk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnZXhpdCcsIHZhbHVlOiBjb2RlIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAob2JqKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xpZW50KSB7IHRocm93ICgnTm90IENvbm5lY3RlZCcpOyB9DQogICAgICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQoNCiAgICAgICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkob2JqKSk7DQogICAgICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50LndyaXRlKGgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudC53cml0ZShkKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAiZGVzY3JpcHRvck1ldGFkYXRhIiwgew0KICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2xpZW50KSB7IHRoaXMuX2NsaWVudC5kZXNjcmlwdG9yTWV0YWRhdGEgPSB2OyB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7ICAgICAgIA0KICAgICAgICByZXQuX2lwYy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IGNvbnNvbGUubG9nKCdDaGlsZCBDb250YWluZXIgUHJvY2VzcyBDbG9zZWQnKTsgfSk7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLl9kZWJ1Z0lQQyAmJiBvcHRpb25zLl9pcGNJbnRlZ2VyICE9IG51bGwpDQogICAgICAgICAgICB7IGlwY0ludGVnZXIgPSBvcHRpb25zLl9pcGNJbnRlZ2VyOyB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX2lwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjSW50ZWdlcjsNCg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoICh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuX2lwY0ludGVnZXIgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWJ1Z0Vycm9yOiBVbmFibGUgdG8gYmluZCB0byBJUEMgY2hhbm5lbDogJyArIGlwY0ludGVnZXIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgiY29uc29sZS5sb2coJ0NISUxEL1NUQVJUJyk7cmVxdWlyZSgnY2hpbGQtY29udGFpbmVyJykuY29ubmVjdCgnIiArIGlwY0ludGVnZXIgKyAiJyk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KICAgICAgICByZXQuX2lwYy5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHMuZGVzY3JpcHRvck1ldGFkYXRhID0gJ2NoaWxkLWNvbnRhaW5lcic7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5fY2xpZW50ID0gczsNCiAgICAgICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7DQogICAgICAgICAgICB2YXIgZGF0YTsNCiAgICAgICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGRhdGEgPSB7IGNvbW1hbmQ6ICdhZGRNb2R1bGUnLCB2YWx1ZTogeyBuYW1lOiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXNbbV0ubmFtZSwganM6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5zY3JpcHQgfSB9Ow0KICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnNlbmQoZGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGRhdGEgPSB7IGNvbW1hbmQ6ICdsYXVuY2gnLCB2YWx1ZTogeyBtb2R1bGU6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1vZHVsZSwgbWV0aG9kOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tZXRob2QsIGFyZ3M6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLmFyZ3MgfSB9Ow0KICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChkYXRhKTsNCiAgICAgICAgICAgIHMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY0xlbjsNCiAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPCA0IHx8IChjTGVuID0gYy5yZWFkVUludDMyTEUoMCkpID4gYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMpOyByZXR1cm47IH0NCiAgICAgICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5wYXJlbnQuZW1pdCgnbWVzc2FnZScsIGNtZC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdyZWFkeScpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAob3B0aW9ucy5fZGVidWdJUEMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctYjY0ZXhlYyAnICsgc2NyaXB0KTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFNwYXduIHRoZSBjaGlsZA0KICAgICAgICBpZihvcHRpb25zLnVzZXIgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBVc2UgVGFzayBTY2hlZHVsZXINCiAgICAgICAgICAgIHZhciBwYXJtcyA9ICcvQyBTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwICc7DQogICAgICAgICAgICBwYXJtcyArPSAoJy9SVSAnICsgb3B0aW9ucy51c2VyICsgJyAnKTsNCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1RSICJcXCInICsgcHJvY2Vzcy5leGVjUGF0aCArICdcXCIgLWI2NGV4ZWMgJyArIHNjcmlwdCArICciJyk7DQoNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFtwYXJtc10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgWydjbWQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9SVU4gL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvREVMRVRFIC9GIC9UTiBNZXNoVXNlclRhc2tcclxuZXhpdFxyXG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGRfb3B0aW9ucyA9IHt9Ow0KICAgICAgICAgICAgaWYob3B0aW9ucy51aWQgIT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgdHNpZDsNCiAgICAgICAgICAgICAgICBpZiAoKHRzaWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0UHJvY2Vzc093bmVyTmFtZShwcm9jZXNzLnBpZCkudHNpZCkgPT0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBydW5uaW5nIGFzIExvY2FsU3lzdGVtDQogICAgICAgICAgICAgICAgICAgIGNoaWxkX29wdGlvbnMudWlkID0gb3B0aW9ucy51aWQ7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkX29wdGlvbnMudHlwZSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlVTRVI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IGJlIGFibGUgdG8gc3dpdGNoIHNlc3Npb24gSURzLCBzbyBjaGVjayB0byBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgYXMgdGhpcyBzaWQNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lkICE9IHRzaWQpIHsgdGhyb3cgKCdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byBydW4gYXMgdGhpcyB1c2VyJyk7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX3Byb2MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ1xcJyA6ICcvJykucG9wKCksICctYjY0ZXhlYycsIHNjcmlwdF0sIGNoaWxkX29wdGlvbnMpOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLnBhcmVudCA9IHJldDsNCiAgICAgICAgICAgIHJldC5fcHJvYy5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIHJldC5fcHJvYy5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIHJldC5fcHJvYy5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2V4aXQnLCBjb2RlKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9DQogICAgdGhpcy5jb25uZWN0ID0gZnVuY3Rpb24gKGlwY051bWJlcikNCiAgICB7DQogICAgICAgIHZhciBpcGNQYXRoID0gJ1xcXFwuXFxwaXBlXFx0YXNrUmVkaXJlY3Rpb24tJyArIGlwY051bWJlcjsNCiAgICAgICAgdGhpcy5faXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuX2V4aXQoMCk7IH0pOw0KICAgICAgICAgICAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjTGVuOw0KICAgICAgICAgICAgICAgIGlmIChjLmxlbmd0aCA8IDQgfHwgKGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKSkgPiBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYyk7IHJldHVybjsgfQ0KDQogICAgICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNtZC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWRkTW9kdWxlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vZHVsZShjbWQudmFsdWUubmFtZSwgY21kLnZhbHVlLmpzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXVuY2gnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHJlcXVpcmUoY21kLnZhbHVlLm1vZHVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bHQgPSBvYmpbY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkob2JqLCBjbWQudmFsdWUuYXJncyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0KCdtZXNzYWdlJywgY21kLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdfZGlzY29ubmVjdCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY29ubmVjdGluZy4uLicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdleGl0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0KCdleGl0Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZWUpDQogICAgICAgICAgICAgICAgICAgICAgICB7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuX2V4aXQoMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLl9pcGNDbGllbnQuX3BhcmVudCA9IHRoaXM7DQoNCiAgICAgICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAoZGF0YSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lwY0NsaWVudCkgeyB0aHJvdyAoJ05vdCBDb25uZWN0ZWQnKTsgfQ0KICAgICAgICAgICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOw0KDQogICAgICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRhdGEpKTsNCiAgICAgICAgICAgICAgICBoLndyaXRlVUludDMyTEUoZC5sZW5ndGggKyA0KTsNCiAgICAgICAgICAgICAgICB0aGlzLl9pcGNDbGllbnQud3JpdGUoaCk7DQogICAgICAgICAgICAgICAgdGhpcy5faXBjQ2xpZW50LndyaXRlKGQpOw0KICAgICAgICAgICAgfSk7DQogICAgfTsNCn0NCg0KDQptb2R1bGUuZXhwb3J0cyA9IG5ldyBjaGlsZENvbnRhaW5lcigpOw==', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('child-container', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGNoaWxkQ29udGFpbmVyKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdjaGlsZC1jb250YWluZXInOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICAgICAgdmFyIGlwY0ludGVnZXI7DQoNCiAgICAgICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9Ow0KICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3JlYWR5JykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnZGlzY29ubmVjdCcsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3QgY2hpbGQgPT4nKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9jbGllbnQuZW5kKCk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnZXhpdCcsIHZhbHVlOiBjb2RlIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAob2JqKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xpZW50KSB7IHRocm93ICgnTm90IENvbm5lY3RlZCcpOyB9DQogICAgICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQoNCiAgICAgICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkob2JqKSk7DQogICAgICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50LndyaXRlKGgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudC53cml0ZShkKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAiZGVzY3JpcHRvck1ldGFkYXRhIiwgew0KICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2xpZW50KSB7IHRoaXMuX2NsaWVudC5kZXNjcmlwdG9yTWV0YWRhdGEgPSB2OyB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2MpIHsgdGhpcy5fcHJvYy5kZXNjcmlwdG9yTWV0YWRhdGEgPSB2OyB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7ICAgICAgIA0KICAgICAgICByZXQuX2lwYy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IGNvbnNvbGUubG9nKCdDaGlsZCBDb250YWluZXIgUHJvY2VzcyBDbG9zZWQnKTsgfSk7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLl9kZWJ1Z0lQQyAmJiBvcHRpb25zLl9pcGNJbnRlZ2VyICE9IG51bGwpDQogICAgICAgICAgICB7IGlwY0ludGVnZXIgPSBvcHRpb25zLl9pcGNJbnRlZ2VyOyB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX2lwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjSW50ZWdlcjsNCg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoICh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuX2lwY0ludGVnZXIgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWJ1Z0Vycm9yOiBVbmFibGUgdG8gYmluZCB0byBJUEMgY2hhbm5lbDogJyArIGlwY0ludGVnZXIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgiY29uc29sZS5sb2coJ0NISUxEL1NUQVJUJyk7cmVxdWlyZSgnY2hpbGQtY29udGFpbmVyJykuY29ubmVjdCgnIiArIGlwY0ludGVnZXIgKyAiJyk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KICAgICAgICByZXQuX2lwYy5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHMuZGVzY3JpcHRvck1ldGFkYXRhID0gJ2NoaWxkLWNvbnRhaW5lcic7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5fY2xpZW50ID0gczsNCiAgICAgICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7DQogICAgICAgICAgICB2YXIgZGF0YTsNCiAgICAgICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGRhdGEgPSB7IGNvbW1hbmQ6ICdhZGRNb2R1bGUnLCB2YWx1ZTogeyBuYW1lOiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXNbbV0ubmFtZSwganM6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5zY3JpcHQgfSB9Ow0KICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnNlbmQoZGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGRhdGEgPSB7IGNvbW1hbmQ6ICdsYXVuY2gnLCB2YWx1ZTogeyBtb2R1bGU6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1vZHVsZSwgbWV0aG9kOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tZXRob2QsIGFyZ3M6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLmFyZ3MgfSB9Ow0KICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChkYXRhKTsNCiAgICAgICAgICAgIHMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY0xlbjsNCiAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPCA0IHx8IChjTGVuID0gYy5yZWFkVUludDMyTEUoMCkpID4gYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMpOyByZXR1cm47IH0NCiAgICAgICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5wYXJlbnQuZW1pdCgnbWVzc2FnZScsIGNtZC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdyZWFkeScpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAob3B0aW9ucy5fZGVidWdJUEMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctYjY0ZXhlYyAnICsgc2NyaXB0KTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFNwYXduIHRoZSBjaGlsZA0KICAgICAgICBpZihvcHRpb25zLnVzZXIgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBVc2UgVGFzayBTY2hlZHVsZXINCiAgICAgICAgICAgIHZhciBwYXJtcyA9ICcvQyBTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwICc7DQogICAgICAgICAgICBwYXJtcyArPSAoJy9SVSAnICsgb3B0aW9ucy51c2VyICsgJyAnKTsNCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1RSICJcXCInICsgcHJvY2Vzcy5leGVjUGF0aCArICdcXCIgLWI2NGV4ZWMgJyArIHNjcmlwdCArICciJyk7DQoNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFtwYXJtc10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgWydjbWQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9SVU4gL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvREVMRVRFIC9GIC9UTiBNZXNoVXNlclRhc2tcclxuZXhpdFxyXG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGRfb3B0aW9ucyA9IHt9Ow0KICAgICAgICAgICAgaWYob3B0aW9ucy51aWQgIT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgdHNpZDsNCiAgICAgICAgICAgICAgICBpZiAoKHRzaWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0UHJvY2Vzc093bmVyTmFtZShwcm9jZXNzLnBpZCkudHNpZCkgPT0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBydW5uaW5nIGFzIExvY2FsU3lzdGVtDQogICAgICAgICAgICAgICAgICAgIGNoaWxkX29wdGlvbnMudWlkID0gb3B0aW9ucy51aWQ7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkX29wdGlvbnMudHlwZSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlVTRVI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IGJlIGFibGUgdG8gc3dpdGNoIHNlc3Npb24gSURzLCBzbyBjaGVjayB0byBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgYXMgdGhpcyBzaWQNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lkICE9IHRzaWQpIHsgdGhyb3cgKCdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byBydW4gYXMgdGhpcyB1c2VyJyk7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX3Byb2MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ1xcJyA6ICcvJykucG9wKCksICctYjY0ZXhlYycsIHNjcmlwdF0sIGNoaWxkX29wdGlvbnMpOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLmRlc2NyaXB0b3JNZXRhZGF0YSA9ICJjaGlsZC1jb250YWluZXIiOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLnBhcmVudCA9IHJldDsNCiAgICAgICAgICAgIHJldC5fcHJvYy5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIHJldC5fcHJvYy5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIHJldC5fcHJvYy5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2V4aXQnLCBjb2RlKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9DQogICAgdGhpcy5jb25uZWN0ID0gZnVuY3Rpb24gKGlwY051bWJlcikNCiAgICB7DQogICAgICAgIHZhciBpcGNQYXRoID0gJ1xcXFwuXFxwaXBlXFx0YXNrUmVkaXJlY3Rpb24tJyArIGlwY051bWJlcjsNCiAgICAgICAgdGhpcy5faXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuX2V4aXQoMCk7IH0pOw0KICAgICAgICAgICAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjTGVuOw0KICAgICAgICAgICAgICAgIGlmIChjLmxlbmd0aCA8IDQgfHwgKGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKSkgPiBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYyk7IHJldHVybjsgfQ0KDQogICAgICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNtZC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWRkTW9kdWxlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vZHVsZShjbWQudmFsdWUubmFtZSwgY21kLnZhbHVlLmpzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXVuY2gnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHJlcXVpcmUoY21kLnZhbHVlLm1vZHVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bHQgPSBvYmpbY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkob2JqLCBjbWQudmFsdWUuYXJncyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0KCdtZXNzYWdlJywgY21kLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdfZGlzY29ubmVjdCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY29ubmVjdGluZy4uLicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdleGl0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0KCdleGl0Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZWUpDQogICAgICAgICAgICAgICAgICAgICAgICB7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuX2V4aXQoMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLl9pcGNDbGllbnQuX3BhcmVudCA9IHRoaXM7DQoNCiAgICAgICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAoZGF0YSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lwY0NsaWVudCkgeyB0aHJvdyAoJ05vdCBDb25uZWN0ZWQnKTsgfQ0KICAgICAgICAgICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOw0KDQogICAgICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRhdGEpKTsNCiAgICAgICAgICAgICAgICBoLndyaXRlVUludDMyTEUoZC5sZW5ndGggKyA0KTsNCiAgICAgICAgICAgICAgICB0aGlzLl9pcGNDbGllbnQud3JpdGUoaCk7DQogICAgICAgICAgICAgICAgdGhpcy5faXBjQ2xpZW50LndyaXRlKGQpOw0KICAgICAgICAgICAgfSk7DQogICAgfTsNCn0NCg0KDQptb2R1bGUuZXhwb3J0cyA9IG5ldyBjaGlsZENvbnRhaW5lcigpOw==', 'base64').toString());"); // message-box, refer to modules/message-box.js char *_messagebox = ILibMemory_Allocate(75201, 0, NULL, NULL); diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 1e8908e..6608b5f 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -1028,6 +1028,21 @@ void* ILibMemory_SmartReAllocate(void *ptr, size_t len) return(NULL); } } +void* ILibMemory_SmartAllocateEx_ResizeExtra(void *ptr, size_t newExtraSize) +{ + if (ILibMemory_ExtraSize(ptr) == 0 || newExtraSize == 0) { return(NULL); } + size_t rawSize = ILibMemory_RawSize(ptr); + size_t size = ILibMemory_Size(ptr); + size_t extraSize = ILibMemory_ExtraSize(ptr); + + void *newPtr = ILibMemory_SmartReAllocate(ptr, newExtraSize > extraSize ? size + (newExtraSize - extraSize) : size - (extraSize - newExtraSize)); + void *rawExtra = (char*)ILibMemory_Extra(newPtr) - sizeof(ILibMemory_Header); + memmove_s((char*)newPtr + size, extraSize + sizeof(ILibMemory_Header), rawExtra, extraSize + sizeof(ILibMemory_Header)); + ILibMemory_Size(newPtr) = size; + ILibMemory_ExtraSize(newPtr) = newExtraSize; + ILibMemory_Size(ILibMemory_Extra(newPtr)) = newExtraSize; + return(newPtr); +} void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType) { if (ptr == NULL) { ILIBCRITICALEXIT(254); } @@ -3347,6 +3362,19 @@ void ILibChain_WaitHandle_RestoreState(void *chain, void *state) ILibChain_AddWaitHandleEx(chain, info->node, msTIMEOUT, info->handler, info->user, info->metaData); ILibMemory_Free(info); } +void ILibChain_WaitHandle_UpdateMetadata(void *chain, HANDLE h, char *metadata) +{ + size_t metadataLen = strnlen_s(metadata, 1024); + void *node = ILibLinkedList_GetNode_Search(((ILibBaseChain*)chain)->auxSelectHandles, NULL, h); + if (node != NULL) + { + void *newNode = ILibLinkedList_Node_ResizeAdditional(node, metadataLen + 1); + ILibChain_WaitHandleInfo *info = ILibMemory_Extra(newNode); + info->node = newNode; + memcpy_s(info->metaData, metadataLen + 1, metadata, metadataLen); + } +} + void __stdcall ILibChain_AddWaitHandle_apc(ULONG_PTR u) { void *chain = ((void**)u)[0]; @@ -7737,6 +7765,32 @@ void* ILibLinkedList_AddTailEx(void *LinkedList, void *data, size_t additionalSi ++r->count; return(newNode); } +void* ILibLinkedList_Node_ResizeAdditional(void *node, size_t additionalSize) +{ + size_t baseSize = ILibMemory_GetExtraMemorySize(((ILibLinkedListNode*)node)->Root->ExtraMemory); + ILibLinkedListNode* newNode = ILibMemory_SmartAllocateEx_ResizeExtra(node, baseSize + additionalSize); + if (newNode != node) + { + if (newNode->Previous == NULL) + { + newNode->Root->Head = newNode; + } + else + { + newNode->Previous->Next = newNode; + } + if (newNode->Next == NULL) + { + newNode->Root->Tail = newNode; + } + else + { + newNode->Next->Previous = newNode; + } + } + return(newNode); +} + /*! \fn ILibLinkedList_Lock(void *LinkedList) \brief Locks the linked list with a non-recursive lock diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index 559ff9b..a124292 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -411,6 +411,7 @@ int ILibIsRunningOnChainThread(void* chain); #define ILibMemory_SmartAllocate(len) ILibMemory_Init(malloc(len+sizeof(ILibMemory_Header)), (int)len, 0, ILibMemory_Types_HEAP) #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_Init(malloc(primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header):0)), (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) void* ILibMemory_SmartReAllocate(void *ptr, size_t len); + void* ILibMemory_SmartAllocateEx_ResizeExtra(void *ptr, size_t extraSize); void ILibMemory_Free(void *ptr); void* ILibMemory_AllocateTemp(void* chain, size_t sz); @@ -1005,6 +1006,8 @@ int ILibIsRunningOnChainThread(void* chain); void ILibChain_WaitHandle_RestoreState(void *chain, void *state); void ILibChain_WaitHandle_DestroySavedState(void *chain, void *state); BOOL ILibChain_WaitHandleAdded(void *chain, HANDLE h); + + void ILibChain_WaitHandle_UpdateMetadata(void *chain, HANDLE h, char *metadata); void ILibChain_AddWaitHandleEx(void *chain, HANDLE h, int msTIMEOUT, ILibChain_WaitHandleHandler handler, void *user, char *metadata); #define ILibChain_AddWaitHandle(chain, h, msTIMEOUT, handler, user) ILibChain_AddWaitHandleEx(chain, h, msTIMEOUT, handler, user, ILibChain_MetaData(__FILE__, __LINE__)) void ILibChain_RemoveWaitHandle(void *chain, HANDLE h); @@ -1231,6 +1234,7 @@ int ILibIsRunningOnChainThread(void* chain); void* ILibLinkedList_AddHead(void *LinkedList, void *data); void* ILibLinkedList_AddTailEx(void *LinkedList, void *data, size_t additionalSize); #define ILibLinkedList_AddTail(LinkedList, data) ILibLinkedList_AddTailEx(LinkedList, data, 0) + void* ILibLinkedList_Node_ResizeAdditional(void *node, size_t additionalSize); #define ILibLinkedList_Clear(LinkedList) while(ILibLinkedList_GetNode_Head(LinkedList)!=NULL){ILibLinkedList_Remove(ILibLinkedList_GetNode_Head(LinkedList));} diff --git a/microstack/ILibProcessPipe.c b/microstack/ILibProcessPipe.c index 66991b1..151fad1 100644 --- a/microstack/ILibProcessPipe.c +++ b/microstack/ILibProcessPipe.c @@ -121,6 +121,8 @@ typedef struct ILibProcessPipe_Process_Object ILibProcessPipe_PipeObject *stdOut; ILibProcessPipe_PipeObject *stdErr; ILibProcessPipe_Process_ExitHandler exitHandler; + char *metadata; + #ifdef WIN32 HANDLE hProcess; int hProcess_needAdd; @@ -256,6 +258,7 @@ ILibProcessPipe_Manager ILibProcessPipe_Manager_Create(void *chain) void ILibProcessPipe_FreePipe(ILibProcessPipe_PipeObject *pipeObject) { if (!ILibMemory_CanaryOK(pipeObject)) { return; } + ILibMemory_Free(pipeObject->metadata); #ifdef WIN32 if (pipeObject->mPipe_ReadEnd != NULL) { @@ -409,6 +412,7 @@ void ILibProcessPipe_Process_Destroy(ILibProcessPipe_Process_Object *p) if (p->stdIn != NULL) { ILibProcessPipe_FreePipe(p->stdIn); } if (p->stdOut != NULL) { ILibProcessPipe_FreePipe(p->stdOut); } if (p->stdErr != NULL) { ILibProcessPipe_FreePipe(p->stdErr); } + if (p->metadata != NULL) { ILibMemory_Free(p->metadata); } ILibMemory_Free(p); } #ifndef WIN32 @@ -1200,6 +1204,36 @@ BOOL ILibProcessPipe_Process_Pipe_ReadExHandler(void *chain, HANDLE h, ILibWaitH } } #endif +void ILibProcessPipe_Pipe_ResetMetadata(ILibProcessPipe_Pipe p, char *metadata) +{ + ILibProcessPipe_PipeObject *pipeObject = (ILibProcessPipe_PipeObject*)p; + ILibMemory_Free(pipeObject->metadata); + pipeObject->metadata = (char*)ILibMemory_SmartAllocate(strnlen_s(metadata, 1024) + 1); + memcpy_s(pipeObject->metadata, ILibMemory_Size(pipeObject->metadata), metadata, ILibMemory_Size(pipeObject->metadata) - 1); + + ILibChain_WaitHandle_UpdateMetadata(pipeObject->mProcess->chain, pipeObject->mOverlapped->hEvent, pipeObject->metadata); +} +void ILibProcessPipe_Process_ResetMetadata(ILibProcessPipe_Process p, char *metadata) +{ + char tmp[1024]; + ILibProcessPipe_Process_Object *j = (ILibProcessPipe_Process_Object*)p; + + sprintf_s(tmp, sizeof(tmp), "(stdout) %s", metadata); + ILibProcessPipe_Pipe_ResetMetadata(j->stdOut, tmp); + + sprintf_s(tmp, sizeof(tmp), "(stderr) %s", metadata); + ILibProcessPipe_Pipe_ResetMetadata(j->stdErr, tmp); + + ILibMemory_Free(j->metadata); + j->metadata = (char*)ILibMemory_SmartAllocate(8 + strnlen_s(metadata, 1024)); + sprintf_s(j->metadata, ILibMemory_Size(j->metadata), "%s [EXIT]", metadata); + + ILibChain_WaitHandle_UpdateMetadata(j->chain, j->hProcess, j->metadata); +} +char *ILibProcessPipe_Process_GetMetadata(ILibProcessPipe_Process p) +{ + return(((ILibProcessPipe_Process_Object*)p)->metadata); +} void ILibProcessPipe_Process_StartPipeReaderEx(ILibProcessPipe_PipeObject *pipeObject, int bufferSize, ILibProcessPipe_GenericReadHandler handler, void* user1, void* user2, char *metadata) { if ((pipeObject->buffer = (char*)malloc(bufferSize)) == NULL) { ILIBCRITICALEXIT(254); } @@ -1207,13 +1241,13 @@ void ILibProcessPipe_Process_StartPipeReaderEx(ILibProcessPipe_PipeObject *pipeO pipeObject->handler = (void*)handler; pipeObject->user1 = user1; pipeObject->user2 = user2; - pipeObject->metadata = metadata; + if (metadata != NULL) { pipeObject->metadata = metadata; } #ifdef WIN32 if (pipeObject->mOverlapped != NULL) { // This PIPE supports Overlapped I/O - ILibChain_ReadEx2(pipeObject->manager->ChainLink.ParentChain, pipeObject->mPipe_ReadEnd, pipeObject->mOverlapped, pipeObject->buffer, pipeObject->bufferSize, ILibProcessPipe_Process_Pipe_ReadExHandler, pipeObject, metadata); + ILibChain_ReadEx2(pipeObject->manager->ChainLink.ParentChain, pipeObject->mPipe_ReadEnd, pipeObject->mOverlapped, pipeObject->buffer, pipeObject->bufferSize, ILibProcessPipe_Process_Pipe_ReadExHandler, pipeObject, pipeObject->metadata); } else { @@ -1312,12 +1346,15 @@ void ILibProcessPipe_Process_AddHandlers(ILibProcessPipe_Process module, int buf j->userObject = user; j->exitHandler = exitHandler; - ILibProcessPipe_Process_StartPipeReaderEx(j->stdOut, bufferSize, &ILibProcessPipe_Process_PipeHandler_StdOut, j, stdOut, "process_handle_stdout"); - ILibProcessPipe_Process_StartPipeReaderEx(j->stdErr, bufferSize, &ILibProcessPipe_Process_PipeHandler_StdOut, j, stdErr, "process_handle_stderr"); - ILibProcessPipe_Process_SetWriteHandler(j->stdIn, &ILibProcessPipe_Process_PipeHandler_StdIn, j, sendOk); + if (j->stdOut->metadata == NULL) { j->stdOut->metadata = "process_handle_stdout"; } + if (j->stdErr->metadata == NULL) { j->stdOut->metadata = "process_handle_stderr"; } + if (j->metadata == NULL) { j->metadata = "process_handle_exit"; } + ILibProcessPipe_Process_StartPipeReaderEx(j->stdOut, bufferSize, &ILibProcessPipe_Process_PipeHandler_StdOut, j, stdOut, NULL); + ILibProcessPipe_Process_StartPipeReaderEx(j->stdErr, bufferSize, &ILibProcessPipe_Process_PipeHandler_StdOut, j, stdErr, NULL); + ILibProcessPipe_Process_SetWriteHandler(j->stdIn, &ILibProcessPipe_Process_PipeHandler_StdIn, j, sendOk); #ifdef WIN32 - ILibChain_AddWaitHandleEx(j->parent->ChainLink.ParentChain, j->hProcess, -1, ILibProcessPipe_Process_OnExit, j, "process_handle_exit"); + ILibChain_AddWaitHandleEx(j->parent->ChainLink.ParentChain, j->hProcess, -1, ILibProcessPipe_Process_OnExit, j, j->metadata); #endif } } diff --git a/microstack/ILibProcessPipe.h b/microstack/ILibProcessPipe.h index 58d85a1..cef08ce 100644 --- a/microstack/ILibProcessPipe.h +++ b/microstack/ILibProcessPipe.h @@ -92,6 +92,9 @@ void ILibProcessPipe_Process_GetWaitHandles(ILibProcessPipe_Process p, HANDLE *h #define ILibProcessPipe_Process_StartPipeReader(pipeObject, bufferSize, handler, user1, user2) ILibProcessPipe_Process_StartPipeReaderEx(pipeObject, bufferSize, handler, user1, user2, ILibChain_MetaData(__FILE__, __LINE__)) +char *ILibProcessPipe_Process_GetMetadata(ILibProcessPipe_Process p); +void ILibProcessPipe_Process_ResetMetadata(ILibProcessPipe_Process p, char *metadata); +void ILibProcessPipe_Pipe_ResetMetadata(ILibProcessPipe_Pipe p, char *metadata); void ILibProcessPipe_Pipe_Close(ILibProcessPipe_Pipe po); void ILibProcessPipe_Pipe_Pause(ILibProcessPipe_Pipe pipeObject); void ILibProcessPipe_Pipe_Resume(ILibProcessPipe_Pipe pipeObject); diff --git a/modules/child-container.js b/modules/child-container.js index 4c3e67b..b1af59f 100644 --- a/modules/child-container.js +++ b/modules/child-container.js @@ -56,6 +56,7 @@ function childContainer() set: function (v) { if (this._client) { this._client.descriptorMetadata = v; } + if (this._proc) { this._proc.descriptorMetadata = v; } } }); ret._ipc = require('net').createServer(); ret._ipc.parent = ret; @@ -164,6 +165,7 @@ function childContainer() } } ret._proc = require('child_process').execFile(process.execPath, [process.execPath.split(process.platform == 'win32' ? '\\' : '/').pop(), '-b64exec', script], child_options); + ret._proc.descriptorMetadata = "child-container"; ret._proc.parent = ret; ret._proc.stdout.on('data', function (c) { }); ret._proc.stderr.on('data', function (c) { }); diff --git a/modules/win-dispatcher.js b/modules/win-dispatcher.js index 5af3b73..45c934c 100644 --- a/modules/win-dispatcher.js +++ b/modules/win-dispatcher.js @@ -64,7 +64,7 @@ function dispatch(options) this.parent._client._parent = this; this.close(); var d, h = Buffer.alloc(4); - s.descriptorMetadata = 'win-dispatcher'; + s.descriptorMetadata = 'win-dispatcher, ' + this.parent.options.launch.module + '.' + this.parent.options.launch.method + '()'; for (var m in this.parent.options.modules) {