diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index dc5dbb4..64d6529 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2179,7 +2179,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('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGNoaWxkQ29udGFpbmVyKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdjaGlsZC1jb250YWluZXInOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICAgICAgdmFyIGlwY0ludGVnZXI7DQoNCiAgICAgICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9Ow0KICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3JlYWR5JykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnZGlzY29ubmVjdCcsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3QgY2hpbGQgPT4nKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9jbGllbnQuZW5kKCk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnZXhpdCcsIHZhbHVlOiBjb2RlIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAob2JqKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xpZW50KSB7IHRocm93ICgnTm90IENvbm5lY3RlZCcpOyB9DQogICAgICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQoNCiAgICAgICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkob2JqKSk7DQogICAgICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50LndyaXRlKGgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudC53cml0ZShkKTsNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgIHJldC5faXBjID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjLnBhcmVudCA9IHJldDsgICAgICAgDQogICAgICAgIHJldC5faXBjLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgfSk7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLl9kZWJ1Z0lQQyAmJiBvcHRpb25zLl9pcGNJbnRlZ2VyICE9IG51bGwpDQogICAgICAgICAgICB7IGlwY0ludGVnZXIgPSBvcHRpb25zLl9pcGNJbnRlZ2VyOyB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX2lwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjSW50ZWdlcjsNCg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoICh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuX2lwY0ludGVnZXIgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWJ1Z0Vycm9yOiBVbmFibGUgdG8gYmluZCB0byBJUEMgY2hhbm5lbDogJyArIGlwY0ludGVnZXIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgiY29uc29sZS5sb2coJ0NISUxEL1NUQVJUJyk7cmVxdWlyZSgnY2hpbGQtY29udGFpbmVyJykuY29ubmVjdCgnIiArIGlwY0ludGVnZXIgKyAiJyk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KICAgICAgICByZXQuX2lwYy5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDSElMRCBjb25uZWN0ZWQnKTsNCiAgICAgICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOw0KICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2NsaWVudC5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgICAgIHZhciBkYXRhOw0KICAgICAgICAgICAgZm9yICh2YXIgbSBpbiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZGF0YSA9IHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH07DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChkYXRhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZGF0YSA9IHsgY29tbWFuZDogJ2xhdW5jaCcsIHZhbHVlOiB7IG1vZHVsZTogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlLCBtZXRob2Q6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1ldGhvZCwgYXJnczogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2guYXJncyB9IH07DQogICAgICAgICAgICB0aGlzLnBhcmVudC5zZW5kKGRhdGEpOw0KICAgICAgICAgICAgcy5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudC5fcHJvYykgeyB0aGlzLl9wYXJlbnQuX3Byb2Mua2lsbCgpOyB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY0xlbjsNCiAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPCA0IHx8IChjTGVuID0gYy5yZWFkVUludDMyTEUoMCkpID4gYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMpOyByZXR1cm47IH0NCiAgICAgICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5wYXJlbnQuZW1pdCgnbWVzc2FnZScsIGNtZC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdyZWFkeScpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAob3B0aW9ucy5fZGVidWdJUEMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctYjY0ZXhlYyAnICsgc2NyaXB0KTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFNwYXduIHRoZSBjaGlsZA0KICAgICAgICBpZihvcHRpb25zLnVzZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFVzZSBUYXNrIFNjaGVkdWxlcg0KICAgICAgICAgICAgdmFyIHBhcm1zID0gJy9DIFNDSFRBU0tTIC9DUkVBVEUgL0YgL1ROIE1lc2hVc2VyVGFzayAvU0MgT05DRSAvU1QgMDA6MDAgJzsNCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1JVICcgKyBvcHRpb25zLnVzZXIgKyAnICcpOw0KICAgICAgICAgICAgcGFybXMgKz0gKCcvVFIgIlxcIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJ1xcIiAtYjY0ZXhlYyAnICsgc2NyaXB0ICsgJyInKTsNCg0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgW3Bhcm1zXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXGNtZC5leGUnLCBbJ2NtZCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnU0NIVEFTS1MgL1JVTiAvVE4gTWVzaFVzZXJUYXNrXHJcbicpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG5leGl0XHJcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZF9vcHRpb25zID0ge307DQogICAgICAgICAgICBpZihvcHRpb25zLnVpZCAhPSBudWxsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB0c2lkOw0KICAgICAgICAgICAgICAgIGlmICgodHNpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkKSA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHJ1bm5pbmcgYXMgTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgICAgICAgICAgY2hpbGRfb3B0aW9ucy51aWQgPSBvcHRpb25zLnVpZDsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGRfb3B0aW9ucy50eXBlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuVVNFUjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd29uJ3QgYmUgYWJsZSB0byBzd2l0Y2ggc2Vzc2lvbiBJRHMsIHNvIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBhcyB0aGlzIHNpZA0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWQgIT0gdHNpZCkgeyB0aHJvdyAoJ0luc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIHJ1biBhcyB0aGlzIHVzZXInKTsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldC5fcHJvYyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnXFwnIDogJy8nKS5wb3AoKSwgJy1iNjRleGVjJywgc2NyaXB0XSwgY2hpbGRfb3B0aW9ucyk7DQogICAgICAgICAgICByZXQuX3Byb2MucGFyZW50ID0gcmV0Ow0KICAgICAgICAgICAgcmV0Ll9wcm9jLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IGNvbnNvbGUubG9nKCdjaGlsZCA9PiAnICsgYy50b1N0cmluZygpKTsgfSk7DQogICAgICAgICAgICByZXQuX3Byb2Muc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICByZXQuX3Byb2Mub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdleGl0JywgY29kZSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfQ0KICAgIHRoaXMuY29ubmVjdCA9IGZ1bmN0aW9uIChpcGNOdW1iZXIpDQogICAgew0KICAgICAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNOdW1iZXI7DQogICAgICAgIHRoaXMuX2lwY0NsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLl9leGl0KDApOyB9KTsNCiAgICAgICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY0xlbjsNCiAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPCA0IHx8IChjTGVuID0gYy5yZWFkVUludDMyTEUoMCkpID4gYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMpOyByZXR1cm47IH0NCg0KICAgICAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FkZE1vZHVsZSc6DQogICAgICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGUoY21kLnZhbHVlLm5hbWUsIGNtZC52YWx1ZS5qcyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGF1bmNoJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXF1aXJlKGNtZC52YWx1ZS5tb2R1bGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdWx0ID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWVzc2FnZSc6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdCgnbWVzc2FnZScsIGNtZC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnX2Rpc2Nvbm5lY3QnOg0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3RpbmcuLi4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXhpdCc6DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdCgnZXhpdCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgeyB9DQogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLl9leGl0KDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5faXBjQ2xpZW50Ll9wYXJlbnQgPSB0aGlzOw0KDQogICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHRoaXMsIHRydWUpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ21lc3NhZ2UnKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdleGl0JykNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ21lc3NhZ2UnLCBmdW5jdGlvbiAobXNnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuc2VuZCh7IGNvbW1hbmQ6ICdtZXNzYWdlJywgdmFsdWU6IG1zZyB9KTsNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAuYWRkTWV0aG9kKCdzZW5kJywgZnVuY3Rpb24gKGRhdGEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pcGNDbGllbnQpIHsgdGhyb3cgKCdOb3QgQ29ubmVjdGVkJyk7IH0NCiAgICAgICAgICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCg0KICAgICAgICAgICAgICAgIGQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShkYXRhKSk7DQogICAgICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICAgICAgdGhpcy5faXBjQ2xpZW50LndyaXRlKGgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2lwY0NsaWVudC53cml0ZShkKTsNCiAgICAgICAgICAgIH0pOw0KICAgIH07DQp9DQoNCg0KbW9kdWxlLmV4cG9ydHMgPSBuZXcgY2hpbGRDb250YWluZXIoKTs=', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('child-container', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGNoaWxkQ29udGFpbmVyKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdjaGlsZC1jb250YWluZXInOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICAgICAgdmFyIGlwY0ludGVnZXI7DQoNCiAgICAgICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9Ow0KICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3JlYWR5JykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnZGlzY29ubmVjdCcsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3QgY2hpbGQgPT4nKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9jbGllbnQuZW5kKCk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnZXhpdCcsIHZhbHVlOiBjb2RlIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAob2JqKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xpZW50KSB7IHRocm93ICgnTm90IENvbm5lY3RlZCcpOyB9DQogICAgICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQoNCiAgICAgICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkob2JqKSk7DQogICAgICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50LndyaXRlKGgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudC53cml0ZShkKTsNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgIHJldC5faXBjID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjLnBhcmVudCA9IHJldDsgICAgICAgDQogICAgICAgIHJldC5faXBjLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgfSk7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLl9kZWJ1Z0lQQyAmJiBvcHRpb25zLl9pcGNJbnRlZ2VyICE9IG51bGwpDQogICAgICAgICAgICB7IGlwY0ludGVnZXIgPSBvcHRpb25zLl9pcGNJbnRlZ2VyOyB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX2lwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjSW50ZWdlcjsNCg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoICh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuX2lwY0ludGVnZXIgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWJ1Z0Vycm9yOiBVbmFibGUgdG8gYmluZCB0byBJUEMgY2hhbm5lbDogJyArIGlwY0ludGVnZXIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgiY29uc29sZS5sb2coJ0NISUxEL1NUQVJUJyk7cmVxdWlyZSgnY2hpbGQtY29udGFpbmVyJykuY29ubmVjdCgnIiArIGlwY0ludGVnZXIgKyAiJyk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KICAgICAgICByZXQuX2lwYy5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOw0KICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2NsaWVudC5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgICAgIHZhciBkYXRhOw0KICAgICAgICAgICAgZm9yICh2YXIgbSBpbiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZGF0YSA9IHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH07DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChkYXRhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZGF0YSA9IHsgY29tbWFuZDogJ2xhdW5jaCcsIHZhbHVlOiB7IG1vZHVsZTogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlLCBtZXRob2Q6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1ldGhvZCwgYXJnczogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2guYXJncyB9IH07DQogICAgICAgICAgICB0aGlzLnBhcmVudC5zZW5kKGRhdGEpOw0KICAgICAgICAgICAgcy5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudC5fcHJvYykgeyB0aGlzLl9wYXJlbnQuX3Byb2Mua2lsbCgpOyB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY0xlbjsNCiAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPCA0IHx8IChjTGVuID0gYy5yZWFkVUludDMyTEUoMCkpID4gYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMpOyByZXR1cm47IH0NCiAgICAgICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5wYXJlbnQuZW1pdCgnbWVzc2FnZScsIGNtZC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdyZWFkeScpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAob3B0aW9ucy5fZGVidWdJUEMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctYjY0ZXhlYyAnICsgc2NyaXB0KTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFNwYXduIHRoZSBjaGlsZA0KICAgICAgICBpZihvcHRpb25zLnVzZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFVzZSBUYXNrIFNjaGVkdWxlcg0KICAgICAgICAgICAgdmFyIHBhcm1zID0gJy9DIFNDSFRBU0tTIC9DUkVBVEUgL0YgL1ROIE1lc2hVc2VyVGFzayAvU0MgT05DRSAvU1QgMDA6MDAgJzsNCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1JVICcgKyBvcHRpb25zLnVzZXIgKyAnICcpOw0KICAgICAgICAgICAgcGFybXMgKz0gKCcvVFIgIlxcIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJ1xcIiAtYjY0ZXhlYyAnICsgc2NyaXB0ICsgJyInKTsNCg0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgW3Bhcm1zXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXGNtZC5leGUnLCBbJ2NtZCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnU0NIVEFTS1MgL1JVTiAvVE4gTWVzaFVzZXJUYXNrXHJcbicpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG5leGl0XHJcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZF9vcHRpb25zID0ge307DQogICAgICAgICAgICBpZihvcHRpb25zLnVpZCAhPSBudWxsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB0c2lkOw0KICAgICAgICAgICAgICAgIGlmICgodHNpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkKSA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHJ1bm5pbmcgYXMgTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgICAgICAgICAgY2hpbGRfb3B0aW9ucy51aWQgPSBvcHRpb25zLnVpZDsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGRfb3B0aW9ucy50eXBlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuVVNFUjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd29uJ3QgYmUgYWJsZSB0byBzd2l0Y2ggc2Vzc2lvbiBJRHMsIHNvIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBhcyB0aGlzIHNpZA0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWQgIT0gdHNpZCkgeyB0aHJvdyAoJ0luc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIHJ1biBhcyB0aGlzIHVzZXInKTsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldC5fcHJvYyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnXFwnIDogJy8nKS5wb3AoKSwgJy1iNjRleGVjJywgc2NyaXB0XSwgY2hpbGRfb3B0aW9ucyk7DQogICAgICAgICAgICByZXQuX3Byb2MucGFyZW50ID0gcmV0Ow0KICAgICAgICAgICAgcmV0Ll9wcm9jLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnZXhpdCcsIGNvZGUpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH0NCiAgICB0aGlzLmNvbm5lY3QgPSBmdW5jdGlvbiAoaXBjTnVtYmVyKQ0KICAgIHsNCiAgICAgICAgdmFyIGlwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjTnVtYmVyOw0KICAgICAgICB0aGlzLl9pcGNDbGllbnQgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVDb25uZWN0aW9uKHsgcGF0aDogaXBjUGF0aCB9LCBmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5fZXhpdCgwKTsgfSk7DQogICAgICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNMZW47DQogICAgICAgICAgICAgICAgaWYgKGMubGVuZ3RoIDwgNCB8fCAoY0xlbiA9IGMucmVhZFVJbnQzMkxFKDApKSA+IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjKTsgcmV0dXJuOyB9DQoNCiAgICAgICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdhZGRNb2R1bGUnOg0KICAgICAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKGNtZC52YWx1ZS5uYW1lLCBjbWQudmFsdWUuanMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhdW5jaCc6DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gcmVxdWlyZShjbWQudmFsdWUubW9kdWxlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3VsdCA9IG9ialtjbWQudmFsdWUubWV0aG9kXS5hcHBseShvYmosIGNtZC52YWx1ZS5hcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5leGl0KCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2UnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXQoJ21lc3NhZ2UnLCBjbWQudmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ19kaXNjb25uZWN0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaXNjb25uZWN0aW5nLi4uJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2V4aXQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXQoJ2V4aXQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5fZXhpdCgwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMuX2lwY0NsaWVudC5fcGFyZW50ID0gdGhpczsNCg0KICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdtZXNzYWdlJykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnZXhpdCcpDQogICAgICAgICAgICAuYWRkTWV0aG9kKCdtZXNzYWdlJywgZnVuY3Rpb24gKG1zZykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnbWVzc2FnZScsIHZhbHVlOiBtc2cgfSk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnc2VuZCcsIGZ1bmN0aW9uIChkYXRhKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXBjQ2xpZW50KSB7IHRocm93ICgnTm90IENvbm5lY3RlZCcpOyB9DQogICAgICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQoNCiAgICAgICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoZGF0YSkpOw0KICAgICAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2lwY0NsaWVudC53cml0ZShoKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9pcGNDbGllbnQud3JpdGUoZCk7DQogICAgICAgICAgICB9KTsNCiAgICB9Ow0KfQ0KDQoNCm1vZHVsZS5leHBvcnRzID0gbmV3IGNoaWxkQ29udGFpbmVyKCk7', 'base64').toString());"); // message-box, refer to modules/message-box.js char *_messagebox = ILibMemory_Allocate(74719, 0, NULL, NULL); diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index 72bdaa8..85ab52f 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -1015,7 +1015,7 @@ ILibTransport_DoneState ILibDuktape_net_server_IPC_WriteSink(ILibDuktape_DuplexS if (len == 0) { // No Pending Writes - ILibProcessPipe_Pipe_WriteEx(winIPC->mPipe, q, bufferLen, winIPC, ILibDuktape_net_server_IPC_WriteCompletionEvent); + return(ILibProcessPipe_Pipe_WriteEx(winIPC->mPipe, q, bufferLen, winIPC, ILibDuktape_net_server_IPC_WriteCompletionEvent)); } return(ILibTransport_DoneState_INCOMPLETE); @@ -1025,8 +1025,8 @@ void ILibDuktape_net_server_IPC_EndSink(ILibDuktape_DuplexStream *stream, void * if (!ILibMemory_CanaryOK(user)) { return; } ILibDuktape_net_WindowsIPC *winIPC = (ILibDuktape_net_WindowsIPC*)user; - if (ILibProcessPipe_Pipe_CancelEx(winIPC->mPipe) == 0) - { + //if (ILibProcessPipe_Pipe_CancelEx(winIPC->mPipe) == 0) + //{ ILibProcessPipe_FreePipe(winIPC->mPipe); winIPC->mPipe = NULL; winIPC->mPipeHandle = NULL; if (winIPC->mServer != NULL) @@ -1041,7 +1041,7 @@ void ILibDuktape_net_server_IPC_EndSink(ILibDuktape_DuplexStream *stream, void * duk_get_prop_string(ctx, -1, ILibDuktape_SERVER2LISTENOPTIONS); // [listen][this][options] duk_pcall_method(ctx, 1); duk_pop(ctx); // ... } - } + //} } duk_ret_t ILibDuktape_net_server_IPC_ConnectSink_Finalizer(duk_context *ctx) { @@ -1051,7 +1051,7 @@ duk_ret_t ILibDuktape_net_server_IPC_ConnectSink_Finalizer(duk_context *ctx) if (winIPC->mPipe != NULL && winIPC->mPipeHandle != NULL) { // It's ok to do this, becuase the CancelEx happens on the same thread, and the completion routine will use an APC Queue, so the Canary will fail before it tries to deref - ILibProcessPipe_Pipe_CancelEx(winIPC->mPipe); + //ILibProcessPipe_Pipe_CancelEx(winIPC->mPipe); ILibProcessPipe_FreePipe(winIPC->mPipe); winIPC->mPipe = NULL; winIPC->mPipeHandle = NULL; } diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 6937b3f..3de66d7 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -2803,8 +2803,33 @@ void *ILibChain_GetObjectForDescriptor(void *chain, int fd) } #ifdef WIN32 +void __stdcall ILibChain_AddWaitHandle_apc(ULONG_PTR u) +{ + void *chain = ((void**)u)[0]; + HANDLE h = (HANDLE)((void**)u)[1]; + int msTIMEOUT = (int)(uintptr_t)((void**)u)[2]; + ILibChain_WaitHandleHandler handler = (ILibChain_WaitHandleHandler)((void**)u)[3]; + void *user = ((void**)u)[4]; + + ILibChain_AddWaitHandle(chain, h, msTIMEOUT, handler, user); + + ILibMemory_Free((void*)u); +} void ILibChain_AddWaitHandle(void *chain, HANDLE h, int msTIMEOUT, ILibChain_WaitHandleHandler handler, void *user) { + if (!ILibIsRunningOnChainThread(chain)) + { + void **tmp = ILibMemory_SmartAllocate(5 * sizeof(void*)); + tmp[0] = chain; + tmp[1] = h; + tmp[2] = (void*)(uintptr_t)msTIMEOUT; + tmp[3] = handler; + tmp[4] = user; + QueueUserAPC((PAPCFUNC)ILibChain_AddWaitHandle_apc, ILibChain_GetMicrostackThreadHandle(chain), (ULONG_PTR)tmp); + return; + } + + void *node = ILibLinkedList_AddTail(((ILibBaseChain*)chain)->auxSelectHandles, h); ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)ILibMemory_Extra(node); info->handler = handler; diff --git a/microstack/ILibProcessPipe.c b/microstack/ILibProcessPipe.c index 12baaa7..e507c00 100644 --- a/microstack/ILibProcessPipe.c +++ b/microstack/ILibProcessPipe.c @@ -550,8 +550,14 @@ void ILibProcessPipe_FreePipe(ILibProcessPipe_PipeObject *pipeObject) { if (!ILibMemory_CanaryOK(pipeObject)) { return; } #ifdef WIN32 - if (pipeObject->mPipe_ReadEnd != NULL) { CloseHandle(pipeObject->mPipe_ReadEnd); } - if (pipeObject->mPipe_WriteEnd != NULL && pipeObject->mPipe_WriteEnd != pipeObject->mPipe_ReadEnd) { CloseHandle(pipeObject->mPipe_WriteEnd); } + if (pipeObject->mPipe_ReadEnd != NULL) + { + CloseHandle(pipeObject->mPipe_ReadEnd); + } + if (pipeObject->mPipe_WriteEnd != NULL && pipeObject->mPipe_WriteEnd != pipeObject->mPipe_ReadEnd) + { + CloseHandle(pipeObject->mPipe_WriteEnd); + } if (pipeObject->mOverlapped != NULL && pipeObject->usingCompletionRoutine == 0) { CloseHandle(pipeObject->mOverlapped->hEvent); free(pipeObject->mOverlapped); } if (pipeObject->mwOverlapped != NULL) { free(pipeObject->mwOverlapped); } if (pipeObject->mPipe_Reader_ResumeEvent != NULL) { CloseHandle(pipeObject->mPipe_Reader_ResumeEvent); } @@ -1844,13 +1850,13 @@ void __stdcall ILibProcessPipe_Pipe_Write_CompletionRoutine(DWORD dwErrorCode, D ((ILibProcessPipe_Pipe_WriteExHandler)j->user4)(j, j->user3, dwErrorCode, dwNumberOfBytesTransfered); } } -int ILibProcessPipe_Pipe_CancelEx(ILibProcessPipe_Pipe targetPipe) -{ - ILibProcessPipe_PipeObject *j = (ILibProcessPipe_PipeObject*)targetPipe; - if (!ILibMemory_CanaryOK(j) || j->mPipe_ReadEnd == NULL) { return(2); } - j->cancelInProgress = 1; - return(CancelIoEx(j->mPipe_ReadEnd, NULL)); -} +//int ILibProcessPipe_Pipe_CancelEx(ILibProcessPipe_Pipe targetPipe) +//{ +// ILibProcessPipe_PipeObject *j = (ILibProcessPipe_PipeObject*)targetPipe; +// if (!ILibMemory_CanaryOK(j) || j->mPipe_ReadEnd == NULL) { return(2); } +// j->cancelInProgress = 1; +// return(CancelIoEx(j->mPipe_ReadEnd, NULL)); +//} BOOL ILibProcessPipe_Pipe_ReadEx_sink(void *chain, HANDLE h, ILibWaitHandle_ErrorStatus status, void* user) { ILibProcessPipe_PipeObject *j = (ILibProcessPipe_PipeObject*)user; @@ -1931,7 +1937,7 @@ BOOL ILibProcessPipe_Pipe_WriteEx_sink(void *chain, HANDLE h, ILibWaitHandle_Err } return(FALSE); } -int ILibProcessPipe_Pipe_WriteEx(ILibProcessPipe_Pipe targetPipe, char *buffer, int bufferLength, void *user, ILibProcessPipe_Pipe_WriteExHandler OnWriteHandler) +ILibTransport_DoneState ILibProcessPipe_Pipe_WriteEx(ILibProcessPipe_Pipe targetPipe, char *buffer, int bufferLength, void *user, ILibProcessPipe_Pipe_WriteExHandler OnWriteHandler) { ILibProcessPipe_PipeObject *j = (ILibProcessPipe_PipeObject*)targetPipe; if (j->mwOverlapped == NULL) @@ -1949,17 +1955,17 @@ int ILibProcessPipe_Pipe_WriteEx(ILibProcessPipe_Pipe targetPipe, char *buffer, if (GetLastError() == ERROR_IO_PENDING) { ILibChain_AddWaitHandle(j->manager->ChainLink.ParentChain, j->mwOverlapped->hEvent, -1, ILibProcessPipe_Pipe_WriteEx_sink, j); - return(0); + return(ILibTransport_DoneState_INCOMPLETE); } // Error if (OnWriteHandler != NULL) { OnWriteHandler(j, user, 1, 0); } - return(1); + return(ILibTransport_DoneState_ERROR); } else { // Write completed if (OnWriteHandler != NULL) { OnWriteHandler(j, user, 0, bufferLength); } - return(0); + return(ILibTransport_DoneState_COMPLETE); } diff --git a/microstack/ILibProcessPipe.h b/microstack/ILibProcessPipe.h index c06494b..8d4f3a8 100644 --- a/microstack/ILibProcessPipe.h +++ b/microstack/ILibProcessPipe.h @@ -60,7 +60,7 @@ void ILibProcessPipe_Pipe_AddPipeReadHandler(ILibProcessPipe_Pipe targetPipe, in #ifdef WIN32 int ILibProcessPipe_Pipe_CancelEx(ILibProcessPipe_Pipe targetPipe); int ILibProcessPipe_Pipe_ReadEx(ILibProcessPipe_Pipe targetPipe, char *buffer, int bufferLength, void *user, ILibProcessPipe_Pipe_ReadExHandler OnReadHandler); - int ILibProcessPipe_Pipe_WriteEx(ILibProcessPipe_Pipe targetPipe, char *buffer, int bufferLength, void *user, ILibProcessPipe_Pipe_WriteExHandler OnWriteHandler); + ILibTransport_DoneState ILibProcessPipe_Pipe_WriteEx(ILibProcessPipe_Pipe targetPipe, char *buffer, int bufferLength, void *user, ILibProcessPipe_Pipe_WriteExHandler OnWriteHandler); ILibProcessPipe_Pipe ILibProcessPipe_Pipe_CreateFromExistingWithExtraMemory(ILibProcessPipe_Manager manager, HANDLE existingPipe, ILibProcessPipe_Pipe_ReaderHandleType handleType, int extraMemorySize); #define ILibProcessPipe_Pipe_CreateFromExisting(PipeManager, ExistingPipe, HandleType) ILibProcessPipe_Pipe_CreateFromExistingWithExtraMemory(PipeManager, ExistingPipe, HandleType, 0) #else