diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index f772b77..edbd0b8 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1917,7 +1917,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) #ifdef WIN32 // Adding win-registry, since it is very useful for windows... Refer to /modules/win-registry.js to see a human readable version - duk_peval_string_noresult(ctx, "addModule('win-registry', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBLRVlfUVVFUllfVkFMVUUgPSAweDAwMDE7CnZhciBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTID0gMHgwMDA4Owp2YXIgS0VZX1dSSVRFID0gMHgyMDAwNjsKCnZhciBLRVlfREFUQV9UWVBFUyA9CiAgICB7CiAgICAgICAgUkVHX05PTkU6IDAsCiAgICAgICAgUkVHX1NaOiAxLAogICAgICAgIFJFR19FWFBBTkRfU1o6IDIsCiAgICAgICAgUkVHX0JJTkFSWTogMywKICAgICAgICBSRUdfRFdPUkQ6IDQsCiAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU46IDUsCiAgICAgICAgUkVHX0xJTks6IDYsCiAgICAgICAgUkVHX01VTFRJX1NaOiA3LAogICAgICAgIFJFR19SRVNPVVJDRV9MSVNUOiA4LAogICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1I6IDksCiAgICAgICAgUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUOiAxMCwKICAgICAgICBSRUdfUVdPUkQ6IDExCiAgICB9OwoKZnVuY3Rpb24gd2luZG93c19yZWdpc3RyeSgpCnsKICAgIHRoaXMuX09iamVjdElkID0gJ3dpbi1yZWdpc3RyeSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9BZHZBcGkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0NyZWF0ZUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnT3BlbktleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlJbmZvS2V5VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlWYWx1ZUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnQ2xvc2VLZXknKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZUtleVcnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnU2V0VmFsdWVFeFcnKTsKICAgIHRoaXMuSEtFWSA9IHsgUm9vdDogQnVmZmVyLmZyb20oJzgwMDAwMDAwJywgJ2hleCcpLnN3YXAzMigpLCBDdXJyZW50VXNlcjogQnVmZmVyLmZyb20oJzgwMDAwMDAxJywgJ2hleCcpLnN3YXAzMigpLCBMb2NhbE1hY2hpbmU6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMicsICdoZXgnKS5zd2FwMzIoKSwgVXNlcnM6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMycsICdoZXgnKS5zd2FwMzIoKSB9OwoKICAgIHRoaXMuUXVlcnlLZXkgPSBmdW5jdGlvbiBRdWVyeUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgdmFyIGVycjsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIHZhciBsZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgIHZhciB2YWxUeXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICB2YXIgSEsgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSk7CiAgICAgICAgdmFyIHJldFZhbCA9IG51bGw7CiAgICAgICAgaWYgKGtleSkgeyBrZXkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSwgeyB3aWRlOiB0cnVlIH0pOyB9CiAgICAgICAgaWYgKCFwYXRoKSB7IHBhdGggPSAnJzsgfQoKCiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4VyhISywgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShwYXRoLCB7IHdpZGU6IHRydWUgfSksIDAsIEtFWV9RVUVSWV9WQUxVRSB8IEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMsIGgpLlZhbCkgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoICsgJyA9PiBSZXR1cm5lZCBFcnJvcjogJyArIGVycik7CiAgICAgICAgfQogIAogICAgICAgIGlmICgocGF0aCA9PSAnJyAmJiAha2V5KSB8fCAha2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHsgc3Via2V5czogW10sIHZhbHVlczogW10gfTsKCiAgICAgICAgICAgIC8vIEVudW1lcmF0ZSAga2V5cwogICAgICAgICAgICB2YXIgYWNoQ2xhc3MgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgICAgICAgICB2YXIgYWNoS2V5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgdmFyIGFjaFZhbHVlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgzMjc2OCk7CiAgICAgICAgICAgIHZhciBhY2hWYWx1ZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbmFtZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyAKICAgICAgICAgICAgdmFyIGFjaENsYXNzU2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7IGFjaENsYXNzU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7CiAgICAgICAgICAgIHZhciBudW1TdWJLZXlzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIG51bVZhbHVlcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0U3Via2V5U2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0Q2xhc3NTdHJpbmcgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlTmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0VmFsdWVEYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIHNlY3VyaXR5RGVzY3JpcHRvciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsYXN0V3JpdGVUaW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg4KTsKCiAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdRdWVyeUluZm9LZXlXKGguRGVyZWYoKSwgYWNoQ2xhc3MsIGFjaENsYXNzU2l6ZSwgMCwKICAgICAgICAgICAgICAgIG51bVN1YktleXMsIGxvbmdlc3RTdWJrZXlTaXplLCBsb25nZXN0Q2xhc3NTdHJpbmcsIG51bVZhbHVlcywKICAgICAgICAgICAgICAgIGxvbmdlc3RWYWx1ZU5hbWUsIGxvbmdlc3RWYWx1ZURhdGEsIHNlY3VyaXR5RGVzY3JpcHRvciwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsICE9IDApIHsgdGhyb3cgKCdSZWdRdWVyeUluZm9LZXlXKCkgcmV0dXJuZWQgZXJyb3I6ICcgKyByZXRWYWwuVmFsKTsgfQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtU3ViS2V5cy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWVTaXplLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsKICAgICAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdFbnVtS2V5RXhXKGguRGVyZWYoKSwgaSwgYWNoS2V5LCBuYW1lU2l6ZSwgMCwgMCwgMCwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZihyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1YmtleXMucHVzaChhY2hLZXkuV2lkZTJVVEY4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlcy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhY2hWYWx1ZVNpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMyNzY4KTsKICAgICAgICAgICAgICAgIGlmKHRoaXMuX0FkdkFwaS5SZWdFbnVtVmFsdWVXKGguRGVyZWYoKSwgaSwgYWNoVmFsdWUsIGFjaFZhbHVlU2l6ZSwgMCwgMCwgMCwgMCkuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlcy5wdXNoKGFjaFZhbHVlLldpZGUyVVRGOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXksIDAsIDAsIDAsIGxlbikuVmFsID09IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUobGVuLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXksIDAsIHZhbFR5cGUsIGRhdGEsIGxlbikuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCh2YWxUeXBlLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkRfQklHX0VORElBTjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19TWjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS5XaWRlMlVURjg7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZX0RBVEFfVFlQRVMuUkVHX0JJTkFSWToKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBkYXRhLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX0FkdkFwaS5SZWdDbG9zZUtleShoLkRlcmVmKCkpOwogICAgICAgICAgICB0aHJvdyAoJ05vdCBGb3VuZCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICB9OwogICAgdGhpcy5Xcml0ZUtleSA9IGZ1bmN0aW9uIFdyaXRlS2V5KGhrZXksIHBhdGgsIGtleSwgdmFsdWUpCiAgICB7CiAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ0NyZWF0ZUtleUV4Vyh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCwgeyB3aWRlOiB0cnVlIH0pLCAwLCAwLCAwLCBLRVlfV1JJVEUsIDAsIGgsIDApLlZhbCAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBPcGVuaW5nIFJlZ2lzdHJ5IEtleTogJyArIHBhdGgpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgdmFyIGRhdGFUeXBlOwoKICAgICAgICBzd2l0Y2godHlwZW9mKHZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHZhbHVlID8gMSA6IDApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19EV09SRDsKICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICAgICAgZGF0YS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodmFsdWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19TWjsKICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHZhbHVlLCB7IHdpZGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX0JJTkFSWTsKICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHZhbHVlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB2YWx1ZS5jb3B5KGRhdGEudG9CdWZmZXIoKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnU2V0VmFsdWVFeFcoaC5EZXJlZigpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSwgeyB3aWRlOiB0cnVlIH0pLCAwLCBkYXRhVHlwZSwgZGF0YSwgZGF0YS5fc2l6ZSkuVmFsICE9IDApCiAgICAgICAgeyAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuX0FkdkFwaS5SZWdDbG9zZUtleShoLkRlcmVmKCkpOwogICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIHdyaXRpbmcgcmVnIGtleTogJyArIGtleSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX0FkdkFwaS5SZWdDbG9zZUtleShoLkRlcmVmKCkpOwogICAgfTsKICAgIHRoaXMuRGVsZXRlS2V5ID0gZnVuY3Rpb24gRGVsZXRlS2V5KGhrZXksIHBhdGgsIGtleSkKICAgIHsKICAgICAgICBpZigha2V5KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuX0FkdkFwaS5SZWdEZWxldGVLZXlXKHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcihoa2V5KSwgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShwYXRoLCB7IHdpZGU6IHRydWUgfSkpLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIERlbGV0aW5nIEtleTogJyArIHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4Vyh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCwgeyB3aWRlOiB0cnVlIH0pLCAwLCBLRVlfUVVFUllfVkFMVUUgfCBLRVlfV1JJVEUsIGgpLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIE9wZW5pbmcgUmVnaXN0cnkgS2V5OiAnICsgcGF0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChyZXN1bHQgPSB0aGlzLl9BZHZBcGkuUmVnRGVsZXRlVmFsdWVXKGguRGVyZWYoKSwgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShrZXksIHsgd2lkZTogdHJ1ZSB9KSkuVmFsKSAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3JbJyArIHJlc3VsdCArICddIERlbGV0aW5nIEtleTogJyArIHBhdGggKyAnLicgKyBrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX0FkdkFwaS5SZWdDbG9zZUtleShoLkRlcmVmKCkpOwogICAgICAgIH0KICAgIH07Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IHdpbmRvd3NfcmVnaXN0cnkoKTsKCv==', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('win-registry', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBLRVlfUVVFUllfVkFMVUUgPSAweDAwMDE7CnZhciBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTID0gMHgwMDA4Owp2YXIgS0VZX1dSSVRFID0gMHgyMDAwNjsKCnZhciBLRVlfREFUQV9UWVBFUyA9CiAgICB7CiAgICAgICAgUkVHX05PTkU6IDAsCiAgICAgICAgUkVHX1NaOiAxLAogICAgICAgIFJFR19FWFBBTkRfU1o6IDIsCiAgICAgICAgUkVHX0JJTkFSWTogMywKICAgICAgICBSRUdfRFdPUkQ6IDQsCiAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU46IDUsCiAgICAgICAgUkVHX0xJTks6IDYsCiAgICAgICAgUkVHX01VTFRJX1NaOiA3LAogICAgICAgIFJFR19SRVNPVVJDRV9MSVNUOiA4LAogICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1I6IDksCiAgICAgICAgUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUOiAxMCwKICAgICAgICBSRUdfUVdPUkQ6IDExCiAgICB9OwoKZnVuY3Rpb24gd2luZG93c19yZWdpc3RyeSgpCnsKICAgIHRoaXMuX09iamVjdElkID0gJ3dpbi1yZWdpc3RyeSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9BZHZBcGkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0NyZWF0ZUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnT3BlbktleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlJbmZvS2V5VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlWYWx1ZUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnQ2xvc2VLZXknKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZUtleVcnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnU2V0VmFsdWVFeFcnKTsKICAgIHRoaXMuSEtFWSA9IHsgUm9vdDogQnVmZmVyLmZyb20oJzgwMDAwMDAwJywgJ2hleCcpLnN3YXAzMigpLCBDdXJyZW50VXNlcjogQnVmZmVyLmZyb20oJzgwMDAwMDAxJywgJ2hleCcpLnN3YXAzMigpLCBMb2NhbE1hY2hpbmU6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMicsICdoZXgnKS5zd2FwMzIoKSwgVXNlcnM6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMycsICdoZXgnKS5zd2FwMzIoKSB9OwoKICAgIHRoaXMuUXVlcnlLZXkgPSBmdW5jdGlvbiBRdWVyeUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgdmFyIGVycjsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIHZhciBsZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgIHZhciB2YWxUeXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICB2YXIgSEsgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSk7CiAgICAgICAgdmFyIHJldFZhbCA9IG51bGw7CiAgICAgICAgaWYgKGtleSkgeyBrZXkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSwgeyB3aWRlOiB0cnVlIH0pOyB9CiAgICAgICAgaWYgKCFwYXRoKSB7IHBhdGggPSAnJzsgfQoKCiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4VyhISywgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShwYXRoLCB7IHdpZGU6IHRydWUgfSksIDAsIEtFWV9RVUVSWV9WQUxVRSB8IEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMsIGgpLlZhbCkgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoICsgJyA9PiBSZXR1cm5lZCBFcnJvcjogJyArIGVycik7CiAgICAgICAgfQogIAogICAgICAgIGlmICgocGF0aCA9PSAnJyAmJiAha2V5KSB8fCAha2V5KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHsgc3Via2V5czogW10sIHZhbHVlczogW10gfTsKCiAgICAgICAgICAgIC8vIEVudW1lcmF0ZSAga2V5cwogICAgICAgICAgICB2YXIgYWNoQ2xhc3MgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgICAgICAgICB2YXIgYWNoS2V5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgdmFyIGFjaFZhbHVlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgzMjc2OCk7CiAgICAgICAgICAgIHZhciBhY2hWYWx1ZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbmFtZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyAKICAgICAgICAgICAgdmFyIGFjaENsYXNzU2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7IGFjaENsYXNzU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7CiAgICAgICAgICAgIHZhciBudW1TdWJLZXlzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIG51bVZhbHVlcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0U3Via2V5U2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0Q2xhc3NTdHJpbmcgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlTmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0VmFsdWVEYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIHNlY3VyaXR5RGVzY3JpcHRvciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsYXN0V3JpdGVUaW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg4KTsKCiAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdRdWVyeUluZm9LZXlXKGguRGVyZWYoKSwgYWNoQ2xhc3MsIGFjaENsYXNzU2l6ZSwgMCwKICAgICAgICAgICAgICAgIG51bVN1YktleXMsIGxvbmdlc3RTdWJrZXlTaXplLCBsb25nZXN0Q2xhc3NTdHJpbmcsIG51bVZhbHVlcywKICAgICAgICAgICAgICAgIGxvbmdlc3RWYWx1ZU5hbWUsIGxvbmdlc3RWYWx1ZURhdGEsIHNlY3VyaXR5RGVzY3JpcHRvciwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsICE9IDApIHsgdGhyb3cgKCdSZWdRdWVyeUluZm9LZXlXKCkgcmV0dXJuZWQgZXJyb3I6ICcgKyByZXRWYWwuVmFsKTsgfQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtU3ViS2V5cy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWVTaXplLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsKICAgICAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdFbnVtS2V5RXhXKGguRGVyZWYoKSwgaSwgYWNoS2V5LCBuYW1lU2l6ZSwgMCwgMCwgMCwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZihyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1YmtleXMucHVzaChhY2hLZXkuV2lkZTJVVEY4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlcy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhY2hWYWx1ZVNpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMyNzY4KTsKICAgICAgICAgICAgICAgIGlmKHRoaXMuX0FkdkFwaS5SZWdFbnVtVmFsdWVXKGguRGVyZWYoKSwgaSwgYWNoVmFsdWUsIGFjaFZhbHVlU2l6ZSwgMCwgMCwgMCwgMCkuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlcy5wdXNoKGFjaFZhbHVlLldpZGUyVVRGOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXksIDAsIDAsIDAsIGxlbikuVmFsID09IDApCiAgICAgICAgewogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUobGVuLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXksIDAsIHZhbFR5cGUsIGRhdGEsIGxlbikuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCh2YWxUeXBlLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkRfQklHX0VORElBTjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19TWjoKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19FWFBBTkRfU1o6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk6CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgdGhyb3cgKCdOb3QgRm91bmQnKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgfTsKICAgIHRoaXMuV3JpdGVLZXkgPSBmdW5jdGlvbiBXcml0ZUtleShoa2V5LCBwYXRoLCBrZXksIHZhbHVlKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgdmFyIGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKCiAgICAgICAgaWYgKHRoaXMuX0FkdkFwaS5SZWdDcmVhdGVLZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgMCwgMCwgS0VZX1dSSVRFLCAwLCBoLCAwKS5WYWwgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnRXJyb3IgT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoKTsKICAgICAgICB9CgogICAgICAgIHZhciBkYXRhOwogICAgICAgIHZhciBkYXRhVHlwZTsKCiAgICAgICAgc3dpdGNoKHR5cGVvZih2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX0RXT1JEOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICBkYXRhLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdudW1iZXInOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHZhbHVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfU1o7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdmFsdWUuY29weShkYXRhLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1NldFZhbHVlRXhXKGguRGVyZWYoKSwgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShrZXksIHsgd2lkZTogdHJ1ZSB9KSwgMCwgZGF0YVR5cGUsIGRhdGEsIGRhdGEuX3NpemUpLlZhbCAhPSAwKQogICAgICAgIHsgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgdGhyb3cgKCdFcnJvciB3cml0aW5nIHJlZyBrZXk6ICcgKyBrZXkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgIH07CiAgICB0aGlzLkRlbGV0ZUtleSA9IGZ1bmN0aW9uIERlbGV0ZUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgaWYoIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnRGVsZXRlS2V5Vyh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCwgeyB3aWRlOiB0cnVlIH0pKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBEZWxldGluZyBLZXk6ICcgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ09wZW5LZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgS0VZX1FVRVJZX1ZBTFVFIHwgS0VZX1dSSVRFLCBoKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBPcGVuaW5nIFJlZ2lzdHJ5IEtleTogJyArIHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fQWR2QXBpLlJlZ0RlbGV0ZVZhbHVlVyhoLkRlcmVmKCksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSkpLlZhbCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yWycgKyByZXN1bHQgKyAnXSBEZWxldGluZyBLZXk6ICcgKyBwYXRoICsgJy4nICsga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICB9CiAgICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IG5ldyB3aW5kb3dzX3JlZ2lzdHJ5KCk7Cgo=', 'base64').toString());"); // Adding PE_Parser, since it is very userful for windows.. Refer to /modules/PE_Parser.js to see a human readable version duk_peval_string_noresult(ctx, "addModule('PE_Parser', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCi8vIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4ZWN1dGFibGUKZnVuY3Rpb24gcGFyc2UoZXhlUGF0aCkKewogICAgdmFyIHJldFZhbCA9IHt9OwogICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKGV4ZVBhdGgsICdyYicpOwogICAgdmFyIGJ5dGVzUmVhZDsKICAgIHZhciBkb3NIZWFkZXIgPSBCdWZmZXIuYWxsb2MoNjQpOwogICAgdmFyIG50SGVhZGVyID0gQnVmZmVyLmFsbG9jKDI0KTsKICAgIHZhciBvcHRIZWFkZXI7CgogICAgLy8gUmVhZCB0aGUgRE9TIGhlYWRlcgogICAgYnl0ZXNSZWFkID0gZnMucmVhZFN5bmMoZmQsIGRvc0hlYWRlciwgMCwgNjQsIDApOwogICAgaWYgKGRvc0hlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgIT0gJzVBNEQnKQogICAgewogICAgICAgIHRocm93ICgndW5yZWNvZ25pemVkIGJpbmFyeSBmb3JtYXQnKTsKICAgIH0KCiAgICAvLyBSZWFkIHRoZSBOVCBoZWFkZXIKICAgIGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBudEhlYWRlciwgMCwgbnRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSk7CiAgICBpZiAobnRIZWFkZXIuc2xpY2UoMCwgNCkudG9TdHJpbmcoJ2hleCcpICE9ICc1MDQ1MDAwMCcpCiAgICB7CiAgICAgICAgdGhyb3cgKCdub3QgYSBQRSBmaWxlJyk7CiAgICB9CiAgICBzd2l0Y2ggKG50SGVhZGVyLnJlYWRVSW50MTZMRSg0KS50b1N0cmluZygxNikpCiAgICB7CiAgICAgICAgY2FzZSAnMTRjJzogLy8gMzIgYml0CiAgICAgICAgICAgIHJldFZhbC5mb3JtYXQgPSAneDg2JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnODY2NCc6IC8vIDY0IGJpdAogICAgICAgICAgICByZXRWYWwuZm9ybWF0ID0gJ3g2NCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IC8vIFVua25vd24KICAgICAgICAgICAgcmV0VmFsLmZvcm1hdCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0VmFsLm9wdGlvbmFsSGVhZGVyU2l6ZSA9IG50SGVhZGVyLnJlYWRVSW50MTZMRSgyMCk7CiAgICByZXRWYWwub3B0aW9uYWxIZWFkZXJTaXplQWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjA7CgogICAgLy8gUmVhZCB0aGUgb3B0aW9uYWwgaGVhZGVyCiAgICBvcHRIZWFkZXIgPSBCdWZmZXIuYWxsb2MobnRIZWFkZXIucmVhZFVJbnQxNkxFKDIwKSk7CiAgICBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmZCwgb3B0SGVhZGVyLCAwLCBvcHRIZWFkZXIubGVuZ3RoLCBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0KTsKICAgIHZhciBudW1SVkEgPSB1bmRlZmluZWQ7CgogICAgcmV0VmFsLkNoZWNrU3VtUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDY0OwogICAgcmV0VmFsLlNpemVPZkNvZGUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDQpOwogICAgcmV0VmFsLlNpemVPZkluaXRpYWxpemVkRGF0YSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoOCk7CiAgICByZXRWYWwuU2l6ZU9mVW5Jbml0aWFsaXplZERhdGEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEyKTsKCiAgICBzd2l0Y2ggKG9wdEhlYWRlci5yZWFkVUludDE2TEUoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpCiAgICB7CiAgICAgICAgY2FzZSAnMTBCJzogLy8gMzIgYml0IGJpbmFyeQogICAgICAgICAgICBudW1SVkEgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDkyKTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMjgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZVNpemUgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDEzMik7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZVBvcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMzI7CiAgICAgICAgICAgIHJldFZhbC5ydmFTdGFydEFkZHJlc3MgPSBkb3NIZWFkZXIucmVhZFVJbnQzMkxFKDYwKSArIDI0ICsgOTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzIwQic6IC8vIDY0IGJpdCBiaW5hcnkKICAgICAgICAgICAgbnVtUlZBID0gb3B0SGVhZGVyLnJlYWRVSW50MzJMRSgxMDgpOwogICAgICAgICAgICByZXRWYWwuQ2VydGlmaWNhdGVUYWJsZUFkZHJlc3MgPSBvcHRIZWFkZXIucmVhZFVJbnQzMkxFKDE0NCk7CiAgICAgICAgICAgIHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlU2l6ZSA9IG9wdEhlYWRlci5yZWFkVUludDMyTEUoMTQ4KTsKICAgICAgICAgICAgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVTaXplUG9zID0gZG9zSGVhZGVyLnJlYWRVSW50MzJMRSg2MCkgKyAyNCArIDE0ODsKICAgICAgICAgICAgcmV0VmFsLnJ2YVN0YXJ0QWRkcmVzcyA9IGRvc0hlYWRlci5yZWFkVUludDMyTEUoNjApICsgMjQgKyAxMTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93ICgnVW5rbm93biBWYWx1ZSBmb3VuZCBmb3IgT3B0aW9uYWwgTWFnaWM6ICcgKyBudEhlYWRlci5yZWFkVUludDE2TEUoMjQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXRWYWwucnZhQ291bnQgPSBudW1SVkE7CgogICAgaWYgKHJldFZhbC5DZXJ0aWZpY2F0ZVRhYmxlQWRkcmVzcykKICAgIHsKICAgICAgICAvLyBSZWFkIHRoZSBhdXRoZW50aWNvZGUgY2VydGlmaWNhdGUsIG9ubHkgb25lIGNlcnQgKG9ubHkgdGhlIGZpcnN0IGVudHJ5KQogICAgICAgIHZhciBoZHIgPSBCdWZmZXIuYWxsb2MoOCk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIGhkciwgMCwgaGRyLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGUgPSBCdWZmZXIuYWxsb2MoaGRyLnJlYWRVSW50MzJMRSgwKSk7CiAgICAgICAgZnMucmVhZFN5bmMoZmQsIHJldFZhbC5jZXJ0aWZpY2F0ZSwgMCwgcmV0VmFsLmNlcnRpZmljYXRlLmxlbmd0aCwgcmV0VmFsLkNlcnRpZmljYXRlVGFibGVBZGRyZXNzICsgaGRyLmxlbmd0aCk7CiAgICAgICAgcmV0VmFsLmNlcnRpZmljYXRlID0gcmV0VmFsLmNlcnRpZmljYXRlLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgICAgICByZXRWYWwuY2VydGlmaWNhdGVEd0xlbmd0aCA9IGhkci5yZWFkVUludDMyTEUoMCk7CiAgICB9CiAgICBmcy5jbG9zZVN5bmMoZmQpOwogICAgcmV0dXJuIChyZXRWYWwpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHBhcnNlOwoKCv==', 'base64').toString());"); @@ -1960,18 +1960,18 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) #if defined(_POSIX) && !defined(__APPLE__) && !defined(_FREEBSD) duk_peval_string_noresult(ctx, "addModule('linux-dbus', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnRyeSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICJwZWVrIiwgeyB2YWx1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMubGVuZ3RoID4gMCA/IHRoaXNbdGhpcy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZCk7IH0gfSk7IH0gY2F0Y2ggKGUpIHsgfQoKCgpmdW5jdGlvbiBkYnVzKGFkZHJlc3MsIHVpZCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnbGludXgtZGJ1cyc7CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnc2lnbmFsJyk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgInVpZCIsIHsgdmFsdWU6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCIvYmluL3NoIiwgWyJzaCJdLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0sIHVpZDogdWlkID09IG51bGwgPyAtMSA6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkLnN0ZGluLndyaXRlKCdkYnVzLW1vbml0b3IgLS1zZXNzaW9uICJ0eXBlPVwnc2lnbmFsXCcsIGludGVyZmFjZT1cJycgKyBhZGRyZXNzICsgJ1wnIiB8ICggd2hpbGUgcmVhZCBYOyBkbyBlY2hvICIkWCI7IGRvbmUgKVxuJyk7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQuZGJ1cyA9IHRoaXM7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspCiAgICB7CiAgICAgICAgLy8gUGFyc2UgREJVUyBEYXRhCiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KSB7IHRoaXMucmVhZHkgPSB0cnVlOyByZXR1cm47IH0KCiAgICAgICAgdmFyIGxpbmVzID0gW107CiAgICAgICAgdmFyIHRva2VucyA9IGNodW5rLnRvU3RyaW5nKCkuc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHZhciBpIGluIHRva2VucykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0b2tlbnNbaV0gPT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEVuZCBvZiByZWNvcmQKICAgICAgICAgICAgICAgIHRoaXMuZGJ1cy5wcmVQYXJzZVJlY29yZHMobGluZXMpOwogICAgICAgICAgICAgICAgbGluZXMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxpbmVzLnB1c2godG9rZW5zW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgdGhpcy5wcmVQYXJzZVJlY29yZHMgPSBmdW5jdGlvbiAobGluZXMpCiAgICB7CiAgICAgICAgdmFyIHJlY29yZCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgaW4gbGluZXMpCiAgICAgICAgewogICAgICAgICAgICBpZihsaW5lc1tpXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKHJlY29yZC5sZW5ndGg+MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVjb3JkID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVjb3JkLnB1c2gobGluZXNbaV0pOwogICAgICAgIH0KICAgICAgICBpZiAocmVjb3JkLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMucGFyc2VSZWNvcmRzID0gZnVuY3Rpb24gKGxpbmVzKQogICAgewogICAgICAgIGlmIChsaW5lc1swXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2lnbmFsID0ge307CiAgICAgICAgICAgIHZhciBzaWd0b2tlbnMgPSBsaW5lc1swXS5zcGxpdCgnICcpOwogICAgICAgICAgICBzaWd0b2tlbnMuc2hpZnQoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc2lndG9rZW5zKSB7CiAgICAgICAgICAgICAgICB2YXIgc2lnaXRlbXMgPSBzaWd0b2tlbnNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgIGlmIChzaWdpdGVtcy5sZW5ndGggPT0gMikgewogICAgICAgICAgICAgICAgICAgIHNpZ25hbFtzaWdpdGVtc1swXV0gPSBzaWdpdGVtc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGluZXMuc2hpZnQoKTsKICAgICAgICAgICAgc2lnbmFsLmRhdGEgPSBsaW5lczsKCiAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwoc2lnbmFsKTsKICAgICAgICB9CiAgICB9CiAgICB0aGlzLnBhcnNlU2lnbmFsID0gZnVuY3Rpb24oc2lnbmFsKQogICAgewogICAgICAgIHZhciBkYXRhID0gc2lnbmFsLmRhdGE7CiAgICAgICAgc2lnbmFsLmRhdGEgPSBbXTsKCiAgICAgICAgZm9yKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkYXRhW2ldLnN0YXJ0c1dpdGgoJ2FycmF5ICcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaWduYWwuZGF0YS5wdXNoKFtdKTsKICAgICAgICAgICAgICAgIGZvcihpPWkrMTsgaTxkYXRhLmxlbmd0aDsgKytpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwyKGRhdGFbaV0sIHNpZ25hbC5kYXRhLnBlZWsoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU2lnbmFsMihkYXRhW2ldLCBzaWduYWwuZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuZW1pdCgnc2lnbmFsJywgc2lnbmFsKTsKICAgIH0KICAgIHRoaXMucGFyc2VTaWduYWwyID0gZnVuY3Rpb24gKGlucHV0U3RyLCBvdXRBcnJheSkKICAgIHsKICAgICAgICBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdzdHJpbmcgJykpCiAgICAgICAgewogICAgICAgICAgICBvdXRBcnJheS5wdXNoKEpTT04ucGFyc2UoaW5wdXRTdHIuc2xpY2UoNykpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdib29sZWFuICcpKQogICAgICAgIHsKICAgICAgICAgICAgb3V0QXJyYXkucHVzaChKU09OLnBhcnNlKGlucHV0U3RyLnNsaWNlKDgpKSk7CiAgICAgICAgfQogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IGRidXM7Cv==', 'base64').toString());"); #endif - char *_servicemanager = ILibMemory_Allocate(232353, 0, NULL, NULL); - memcpy_s(_servicemanager + 0, 132772, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7CgoKZnVuY3Rpb24gZXh0cmFjdEZpbGVOYW1lKGZpbGVQYXRoKQp7CiAgICBpZiAodHlwZW9mIChmaWxlUGF0aCkgPT0gJ3N0cmluZycpCiAgICB7CiAgICAgICAgdmFyIHRva2VucyA9IGZpbGVQYXRoLnNwbGl0KCdcXCcpLmpvaW4oJy8nKS5zcGxpdCgnLycpOwogICAgICAgIHZhciBuYW1lOwoKICAgICAgICB3aGlsZSAoKG5hbWUgPSB0b2tlbnMucG9wKCkpID09ICcnKTsKICAgICAgICByZXR1cm4gKG5hbWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldHVybihmaWxlUGF0aC5uZXdOYW1lKQogICAgfQp9CmZ1bmN0aW9uIGV4dHJhY3RGaWxlU291cmNlKGZpbGVQYXRoKQp7CiAgICByZXR1cm4gKHR5cGVvZiAoZmlsZVBhdGgpID09ICdzdHJpbmcnID8gZmlsZVBhdGggOiBmaWxlUGF0aC5zb3VyY2UpOwp9CgpmdW5jdGlvbiBwYXJzZVNlcnZpY2VTdGF0dXModG9rZW4pCnsKICAgIHZhciBqID0ge307CiAgICB2YXIgc2VydmljZVR5cGUgPSB0b2tlbi5EZXJlZigwLCA0KS5JbnRWYWw7CiAgICBqLmlzRmlsZVN5c3RlbURyaXZlciA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKTsKICAgIGouaXNLZXJuZWxEcml2ZXIgPSAoKHNlcnZpY2VUeXBlICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSk7CiAgICBqLmlzU2hhcmVkUHJvY2VzcyA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKTsKICAgIGouaXNPd25Qcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApOwogICAgai5pc0ludGVyYWN0aXZlID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApOwogICAgai53YWl0SGludCA9IHRva2VuLkRlcmVmKCg2ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBzd2l0Y2ggKHRva2VuLkRlcmVmKCgxICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpCiAgICB7CiAgICAgICAgY2FzZSAweDAwMDAwMDA1OgogICAgICAgICAgICBqLnN0YXRlID0gJ0NPTlRJTlVFX1BFTkRJTkcnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDY6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUEFVU0VfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwNzoKICAgICAgICAgICAgai5zdGF0ZSA9ICdQQVVTRUQnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDQ6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUlVOTklORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMjoKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVEFSVF9QRU5ESU5HJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAwMDAwMDAzOgogICAgICAgICAgICBqLnN0YXRlID0gJ1NUT1BfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMToKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVE9QUEVEJzsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICB2YXIgY29udHJvbHNBY2NlcHRlZCA9IHRva2VuLkRlcmVmKCgyICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBqLmNvbnRyb2xzQWNjZXB0ZWQgPSBbXTsKICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApCiAgICB7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EQUREJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EUkVNT1ZFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERU5BQkxFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERElTQUJMRScpOwogICAgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwOCkgPT0gMHgwMDAwMDAwOCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BBUkFNQ0hBTkdFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMDIpID09IDB4MDAwMDAwMDIpIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QQVVTRScpOyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0NPTlRJTlVFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QUkVTSFVURE9XTicpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDA0KSA9PSAweDAwMDAwMDA0KSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0hVVERPV04nKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1NUT1AnKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAyMCkgPT0gMHgwMDAwMDAyMCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0hBUkRXQVJFUFJPRklMRUNIQU5HRScpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDQwKSA9PSAweDAwMDAwMDQwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVCcpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDgwKSA9PSAweDAwMDAwMDgwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0VTU0lPTkNIQU5HRScpOyB9CiAgICBqLnBpZCA9IHRva2VuLkRlcmVmKCg3ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICByZXR1cm4gKGopOwp9CgppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKewogICAgZnVuY3Rpb24gZ2V0T1NWZXJzaW9uKCkKICAgIHsKICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN3X3ZlcnMgfCBncmVwIFByb2R1Y3RWZXJzaW9uIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAvL2NoaWxkLnN0ZG91dC5zdHIgPSAnMTAuOSc7CgogICAgICAgIHZhciByZXQgPSB7IHJhdzogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJy4nKSwgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLnJhdy5qb2luKCcuJykpOyB9IH07CiAgICAgICAgcmV0LmNvbXBhcmVUbyA9IGZ1bmN0aW9uIGNvbXBhcmVUbyh2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmF3ID0gKHR5cGVvZiAodmFsKSA9PSAnc3RyaW5nJykgPyB2YWwuc3BsaXQoJy4nKSA6IHZhbC5yYXc7IGlmICghcmF3KSB7IHRocm93ICgnSW52YWxpZCBwYXJhbWV0ZXInKTsgfQogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMucmF3LmpvaW4oJy4nKS5zcGxpdCgnLicpOwoKICAgICAgICAgICAgdmFyIHIgPSBudWxsLCBzID0gbnVsbDsKICAgICAgICAgICAgd2hpbGUgKHNlbGYubGVuZ3RoID4gMCAmJiByYXcubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcyA9IHBhcnNlSW50KHNlbGYuc2hpZnQoKSk7IHIgPSBwYXJzZUludChyYXcuc2hpZnQoKSk7CiAgICAgICAgICAgICAgICBpZiAocyA8IHIpIHsgcmV0dXJuICgtMSk7IH0KICAgICAgICAgICAgICAgIGlmIChzID4gcikgeyByZXR1cm4gKDEpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGYubGVuZ3RoID09IHJhdy5sZW5ndGgpIHsgcmV0dXJuICgwKTsgfQogICAgICAgICAgICBpZiAoc2VsZi5sZW5ndGggPCByYXcubGVuZ3RoKSB7IHJldHVybiAoLTEpOyB9IGVsc2UgeyByZXR1cm4gKDEpOyB9ICAgIAogICAgICAgIH0KICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9OwoKCiAgICBmdW5jdGlvbiBmZXRjaFBsaXN0KGZvbGRlciwgbmFtZSwgdXNlcmlkKQogICAgewogICAgICAgIGlmIChmb2xkZXIuZW5kc1dpdGgoJy8nKSkgeyBmb2xkZXIgPSBmb2xkZXIuc3Vic3RyaW5nKDAsIGZvbGRlci5sZW5ndGggLSAxKTsgfQogICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH0sIF91aWQ6IHVzZXJpZCB9OwogICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgewogICAgICAgICAgICAvLyBCZWZvcmUgd2UgdGhyb3cgaW4gdGhlIHRvd2VsLCBsZXQncyBlbnVtZXJhdGUgYWxsIHRoZSBwbGlzdCBmaWxlcywgYW5kIHNlZSBpZiBvbmUgaGFzIGEgbWF0Y2hpbmcgbGFiZWwKICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhmb2xkZXIpOwogICAgICAgICAgICBmb3IgKHZhciBmaWxlIGluIGZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgZm9sZGVyICsgJy8nICsgZmlsZXNbZmlsZV0gKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09IG5hbWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0Lm5hbWUgPSBmaWxlc1tmaWxlXS5lbmRzV2l0aCgnLnBsaXN0JykgPyBmaWxlc1tmaWxlXS5zdWJzdHJpbmcoMCwgZmlsZXNbZmlsZV0ubGVuZ3RoIC0gNikgOiBmaWxlc1tmaWxlXTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnYWxpYXMnLCB7IHZhbHVlOiBuYW1lIH0pOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIGZpbGVzW2ZpbGVdIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXQubmFtZSA9PSBuYW1lKSB7IHRocm93ICgnICcgKyAoZm9sZGVyLnNwbGl0KCdMYXVuY2hEYWVtb24nKS5sZW5ndGg+MSA/ICdMYXVuY2hEYWVtb24nIDogJ0xhdW5jaEFnZW50JykgKyAnICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOyB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JyB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2FsaWFzJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PkxhYmVsPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2RhZW1vbicsIHsgdmFsdWU6IHJldC5wbGlzdC5zcGxpdCgnL0xhdW5jaERhZW1vbnMvJykubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZSB9KTsKCiAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyB0aGlzLnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKCiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci5lbmRzV2l0aCgnLycpID8gY2hpbGQuc3Rkb3V0LnN0ci5zdWJzdHJpbmcoMCwgY2hpbGQuc3Rkb3V0LnN0ci5sZW5ndGggLSAxKSA6IGNoaWxkLnN0ZG91dC5zdHIpOwogICAgICAgIH07CiAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gYXBwTG9jYXRpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8L3N0cmluZz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPHN0cmluZz5cIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgfTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnX3J1bkF0TG9hZCcsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzZWUgaWYgdGhpcyBpcyBhbiBBdXRvLVN0YXJ0aW5nIHNlcnZpY2UsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGltcGxlbWVudCAnc3RhcnQnCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHJldC5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5SdW5BdExvYWQ8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiLz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPFwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09ICJUUlVFIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJfa2VlcEFsaXZlIiwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAne3NwbGl0KCQwLCBhLCBcIjxrZXk+S2VlcEFsaXZlPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjxcIik7IHNwbGl0KGJbMl0sIGMsIFwiPlwiKTsgIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIiBpZihjWzFdPT1cImRpY3RcIil7IHNwbGl0KGFbMl0sIGQsIFwiPC9kaWN0PlwiKTsgaWYoc3BsaXQoZFsxXSwgdHJ1dmFsLCBcIjx0cnVlLz5cIik+MSkgeyBzcGxpdCh0cnV2YWxbMV0sIGtuMSwgXCI8a2V5PlwiKTsgc3BsaXQoa24xWzJdLCBrbjIsIFwiPC9rZXk+XCIpOyBwcmludCBrbjJbMV07IH0gfSIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCIgZWxzZSB7IHNwbGl0KGNbMV0sIGthLCBcIi9cIik7IGlmKGthWzFdPT1cInRydWVcIikge3ByaW50IFwiQUxXQVlTXCI7fSB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICByZXQuZ2V0UElEID0gZnVuY3Rpb24gZ2V0UElEKHVpZCwgYXNTdHJpbmcpCiAgICAgICAgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIGNvbW1hbmQ7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KCiAgICAgICAgICAgIGlmIChnZXRPU1ZlcnNpb24oKS5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb21tYW5kID0gImxhdW5jaGN0bCBsaXN0IHwgZ3JlcCAnIiArIHRoaXMuYWxpYXMgKyAiJyB8IGF3ayAneyBpZigkMz09XCIiICsgdGhpcy5hbGlhcyArICJcIil7cHJpbnQgJDE7fX0nXG5leGl0XG4iOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1aWQgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2xhdW5jaGN0bCBwcmludCBzeXN0ZW0gfCBncmVwICInICsgdGhpcy5hbGlhcyArICciIHwgYXdrIFwneyBpZihzcGxpdCgkMCwgdG1wLCAiICIpPT0zKSB7IGlmKCQzPT0iJyArIHRoaXMuYWxpYXMgKyAnIikgeyBwcmludCAkMTsgfSB9fVwnXG5leGl0XG4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHByaW50IGd1aS8nICsgdWlkICsgJyB8IGdyZXAgIicgKyB0aGlzLmFsaWFzICsgJyIgfCBhd2sgXCd7IGlmKHNwbGl0KCQwLCB0bXAsICIgIik9PTMpIHsgaWYoJDM9PSInICsgdGhpcy5hbGlhcyArICciKSB7IHByaW50ICQxOyB9IH19XCdcbmV4aXRcbic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZShjb21tYW5kKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIGlmIChhc1N0cmluZyA9PSBudWxsIHx8IGFzU3RyaW5nICE9IHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkp", 16000); - memcpy_s(_servicemanager + 16000, 116772, "OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXQuaXNMb2FkZWQgPSBmdW5jdGlvbiBpc0xvYWRlZCh1aWQpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRQSUQodWlkLCB0cnVlKSAhPSAnJyk7CiAgICAgICAgfTsKICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFBJRCh1aWQpID4gMCk7CiAgICAgICAgfTsKICAgICAgICByZXQuaXNNZSA9IGZ1bmN0aW9uIGlzTWUodWlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UElEKHVpZCkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgIH07CiAgICAgICAgcmV0LmxvYWQgPSBmdW5jdGlvbiBsb2FkKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgdmFyIHZlciA9IGdldE9TVmVyc2lvbigpOwogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSAnbG9hZCc7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KCiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYodWlkIT1udWxsIHx8IHVpZCE9MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ0xhdW5jaERhZW1vbiBtdXN0IHJ1biBhcyByb290Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodWlkID09IG51bGwpIHsgdWlkID0gc2VsZjsgfQogICAgICAgICAgICAgICAgaWYodmVyLmNvbXBhcmVUbygnMTAuMTAnKSA8IDAgJiYgdWlkICE9IHNlbGYgJiYgc2VsZiAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnT24gdGhpcyB2ZXJzaW9uIG9mIE1hY09TLCBtdXN0IGJlIHJvb3QgdG8gbG9hZCB0aGlzIHNlcnZpY2UgaW50byB0aGUgc3BlY2lmaWVkIHVzZXIgc3BhY2UnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZlci5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7IHVpZDogdWlkIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdib290c3RyYXAgZ3VpLycgKyB1aWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCAnICsgY29tbWFuZCArICcgJyArIHRoaXMucGxpc3QgKyAnXG5cZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgfTsKICAgICAgICByZXQudW5sb2FkID0gZnVuY3Rpb24gdW5sb2FkKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CiAgICAgICAgICAgIHZhciB2ID0gZ2V0T1NWZXJzaW9uKCk7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHZhciB1c2VCb290b3V0ID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KCiAgICAgICAgICAgIGlmKHVpZCE9bnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKCcxMC4xMCcpIDw9IDAgJiYgc2VsZiA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG11c3Qgc3dpdGNoIHRvIHVzZXIgY29udGV4dCB0byB1bmxvYWQgdGhlIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0geyB1aWQ6IHVpZCB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKHYuY29tcGFyZVRvKCcxMC4xMCcpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlbGYgPT0gMCB8fCBzZWxmID09IHVpZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGJvb3RvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdWZmaWNpZW50IGFjY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdOZWVkcyBlbGV2YXRlZCBwcml2aWxlZ2VzJykKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiA9PSB1aWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgdW5sb2FkLCBiZWN1YXNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCBjb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VCb290b3V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN1ZmZpY2llbnQgYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoc2VsZiA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKHYuY29tcGFyZVRvKCcxMC4xMCcpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBib290b3V0CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHVubG9hZAogICAgICAgICAgICAgICAgICAgICAgICB1c2VCb290b3V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEluc3VmZmljaWVudCBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgaWYgKHVzZUJvb3RvdXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgYm9vdG91dCBndWkvJyArIHVpZCArICcgJyArIHRoaXMucGxpc3QgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgdW5sb2FkICcgKyB0aGlzLnBsaXN0ICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICB9OwogICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgc2VsZiA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPT0gbnVsbCkgeyB1aWQgPSBzZWxmOyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmID09IDApIHsgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA+IDAgJiYgc2VsZiAhPSAwICYmIHVpZCAhPSBzZWxmKSB7IHRocm93ICgnQ2Fubm90IHN0YXJ0IExhdW5jaEFnZW50IGludG8gYW5vdGhlciB1c2VyIGRvbWFpbiB3aGlsZSBub3Qgcm9vdCcpOyB9CiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbiAmJiBzZWxmICE9IDApIHsgdGhyb3cgKCdDYW5ub3Qgc3RhcnQgTGF1bmNoRGFlbW9uIHdoaWxlIG5vdCByb290Jyk7IH0KCiAgICAgICAgICAgIHRoaXMubG9hZCh1aWQpOwoKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0YXJ0ICcgKyB0aGlzLmFsaWFzICsgJ1xuXGV4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgIH07CiAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgc2VsZiA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPT0gbnVsbCkgeyB1aWQgPSBzZWxmOyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmID09IDApIHsgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA+IDAgJiYgc2VsZiAhPSAwICYmIHVpZCAhPSBzZWxmKSB7IHRocm93ICgnQ2Fubm90IHN0b3AgTGF1bmNoQWdlbnQgaW4gYW5vdGhlciB1c2VyIGRvbWFpbiB3aGlsZSBub3Qgcm9vdCcpOyB9CiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbiAmJiBzZWxmICE9IDApIHsgdGhyb3cgKCdDYW5ub3Qgc3RvcCBMYXVuY2hEYWVtb24gd2hpbGUgbm90IHJvb3QnKTsgfQoKICAgICAgICAgICAgaWYgKCEodGhpcy5fa2VlcEFsaXZlID09ICdDcmFzaGVkJyB8fCB0aGlzLl9rZWVwQWxpdmUgPT0gJycpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHVubG9hZCB0aGUgc2VydmljZSwgcmF0aGVyIHRoYW4gc3RvcHBpbmcgaXQsIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0J2xsIGxpa2VseSByZXN0YXJ0CiAgICAgICAgICAgICAgICB0aGlzLnVubG9hZCh1aWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0b3AgJyArIHRoaXMuYWxpYXMgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCh1aWQpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9CiAgICAgICAgICAgIGlmIChnZXRPU1ZlcnNpb24oKS5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7IH0KICAgICAgICAgICAgICAgIHZhciBjb21tYW5kID0gJ2xhdW5jaGN0bCB1bmxvYWQgJyArIHRoaXMucGxpc3QgKyAnXG5sYXVuY2hjdGwgbG9hZCAnICsgdGhpcy5wbGlzdCArICdcbmxhdW5jaGN0bCBzdGFydCAnICsgdGhpcy5hbGlhcyArICdcbmV4aXRcbic7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgZGV0YWNoZWQ6IHRydWUsIHVpZDogdWlkIH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGNvbW1hbmQpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb21tYW5kID0gdGhpcy5kYWVtb24gPyAoJ3N5c3RlbS8nICsgdGhpcy5hbGlhcykgOiAoJ2d1aS8nICsgKHVpZCAhPSBudWxsID8gdWlkIDogcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKSkgKyAnLycgKyB0aGlzLmFsaWFzKTsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBraWNrc3RhcnQgLWsgJyArIGNvbW1hbmQgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07Cn0KCgoKZnVuY3Rpb24gc2VydmljZU1hbmFnZXIoKQp7CiAgICB0aGlzLl9PYmplY3RJRCA9ICdzZXJ2aWNlLW1hbmFnZXInOwogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykgCiAgICB7CiAgICAgICAgdGhpcy5HTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgIHRoaXMucHJveHkgPSB0aGlzLkdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnT3BlblNDTWFuYWdlckEnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnRW51bVNlcnZpY2VzU3RhdHVzRXhBJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ09wZW5TZXJ2aWNlQScpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdRdWVyeVNlcnZpY2VTdGF0dXNFeCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdRdWVyeVNlcnZpY2VDb25maWdBJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZUNvbmZpZzJBJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NvbnRyb2xTZXJ2aWNlJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1N0YXJ0U2VydmljZUEnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ2xvc2VTZXJ2aWNlSGFuZGxlJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NyZWF0ZVNlcnZpY2VBJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NoYW5nZVNlcnZpY2VDb25maWcyQScpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdEZWxldGVTZXJ2aWNlJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0FsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdDaGVja1Rva2VuTWVtYmVyc2hpcCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7CgogICAgICAgIHRoaXMucHJveHkyID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7CiAgICAgICAgdGhpcy5wcm94eTIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKCiAgICAgICAgdGhpcy5pc0FkbWluID0gZnVuY3Rpb24gaXNBZG1pbigpIHsKICAgICAgICAgICAgdmFyIE5UQXV0aG9yaXR5ID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg2KTsKICAgICAgICAgICAgTlRBdXRob3JpdHkudG9CdWZmZXIoKS53cml0ZUludDgoNSwgNSk7CiAgICAgICAgICAgIHZhciBBZG1pbmlzdHJhdG9yc0dyb3VwID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBhZG1pbiA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKE5UQXV0aG9yaXR5LCAyLCAzMiwgNTQ0LCAwLCAwLCAwLCAwLCAwLCAwLCBBZG1pbmlzdHJhdG9yc0dyb3VwKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1lbWJlciA9IHRoaXMuR00uQ3JlYXRlSW50ZWdlcigpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hlY2tUb2tlbk1lbWJlcnNoaXAoMCwgQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpLCBtZW1iZXIpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSAhPSAwKSB7IGFkbWluID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wcm94eS5GcmVlU2lkKEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFkbWluOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRQcm9ncmFtRm9sZGVyID0gZnVuY3Rpb24gZ2V0UHJvZ3JhbUZvbGRlcigpCiAgICAgICAgewogICAgICAgICAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIDY0IGJpdCBXaW5kb3dzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnUHJvZ3JhbUZpbGVzKHg4NiknXTsgICAgLy8gMzIgQml0IEFwcAogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnUHJvZ3JhbUZpbGVzJ107ICAgICAgICAgICAgIC8vIDY0IGJpdCBBcHAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gMzIgYml0IFdpbmRvd3MKICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMnXTsgICAgICAgICAgICAgICAgIAogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRTZXJ2aWNlRm9sZGVyID0gZnVuY3Rpb24gZ2V0U2VydmljZUZvbGRlcigpIHsgcmV0dXJuIHRoaXMuZ2V0UHJvZ3JhbUZvbGRlcigpICsgJ1xcbWVzaCc7IH07CgogICAgICAgIHRoaXMuZW51bWVyYXRlU2VydmljZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG1hY2hpbmVOYW1lID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBkYk5hbWUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAxIHwgMHgwMDA0KTsKCiAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgc2VydmljZXNSZXR1cm5lZCA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgcmVzdW1lSGFuZGxlID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIC8vdmFyIHNlcnZpY2VzID0gdGhpcy5wcm94eS5DcmVhdGVWYXJpYWJsZSgyNjIxNDQpOwogICAgICAgICAgICB2YXIgc3VjY2VzcyA9IHRoaXMucHJveHkuRW51bVNlcnZpY2VzU3RhdHVzRXhBKGhhbmRsZSwgMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAwMywgMHgwMCwgMHgwMCwgYnl0ZXNOZWVkZWQsIHNlcnZpY2VzUmV0dXJuZWQsIHJlc3VtZUhhbmRsZSwgMHgwMCk7CgogICAgICAgICAgICB2YXIgcHRyU2l6ZSA9IGRiTmFtZS5fc2l6ZTsKICAgICAgICAgICAgdmFyIHN6ID0gYnl0ZXNOZWVkZWQuRGVyZWYoMCwgZGJOYW1lLl9zaXplKS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOwoKICAgICAgICAgICAgaWYgKHN6IDwgMCkgeyB0aHJvdyAoJ2Vycm9yIGVudW1lcmF0aW5nIHNlcnZpY2VzJyk7IH0KCiAgICAgICAgICAgIHZh", 16000); - memcpy_s(_servicemanager + 32000, 100772, "ciBzZXJ2aWNlcyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoc3opOwogICAgICAgICAgICB0aGlzLnByb3h5LkVudW1TZXJ2aWNlc1N0YXR1c0V4QShoYW5kbGUsIDAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMDMsIHNlcnZpY2VzLCBzeiwgYnl0ZXNOZWVkZWQsIHNlcnZpY2VzUmV0dXJuZWQsIHJlc3VtZUhhbmRsZSwgMHgwMCk7CgogICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gMzYgKyAoMiAqIHB0clNpemUpOwogICAgICAgICAgICBibG9ja1NpemUgKz0gKChwdHJTaXplIC0gKGJsb2NrU2l6ZSAlIHB0clNpemUpKSAlIHB0clNpemUpOwogICAgICAgICAgICB2YXIgcmV0VmFsID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZXNSZXR1cm5lZC5EZXJlZigwLCBkYk5hbWUuX3NpemUpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7ICsraSkKewogICAgICAgICAgICAgICAgdmFyIHRva2VuID0gc2VydmljZXMuRGVyZWYoaSAqIGJsb2NrU2l6ZSwgYmxvY2tTaXplKTsKICAgICAgICAgICAgICAgIHZhciBqID0ge307CiAgICAgICAgICAgICAgICBqLm5hbWUgPSB0b2tlbi5EZXJlZigwLCBwdHJTaXplKS5EZXJlZigpLlN0cmluZzsKICAgICAgICAgICAgICAgIGouZGlzcGxheU5hbWUgPSB0b2tlbi5EZXJlZihwdHJTaXplLCBwdHJTaXplKS5EZXJlZigpLlN0cmluZzsKICAgICAgICAgICAgICAgIGouc3RhdHVzID0gcGFyc2VTZXJ2aWNlU3RhdHVzKHRva2VuLkRlcmVmKDIgKiBwdHJTaXplLCAzNikpOwogICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goaik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiAobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUobmFtZSk7CiAgICAgICAgICAgIHZhciBwdHIgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGJ5dGVzTmVlZGVkID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShwdHIuX3NpemUpOwogICAgICAgICAgICB2YXIgaGFuZGxlID0gdGhpcy5wcm94eS5PcGVuU0NNYW5hZ2VyQSgweDAwLCAweDAwLCAweDAwMDEgfCAweDAwMDQgfCAweDAwMjAgfCAweDAwMTApOwogICAgICAgICAgICBpZiAoaGFuZGxlLlZhbCA9PSAwKSB7IHRocm93ICgnY291bGQgbm90IG9wZW4gU2VydmljZU1hbmFnZXInKTsgfQogICAgICAgICAgICB2YXIgaCA9IHRoaXMucHJveHkuT3BlblNlcnZpY2VBKGhhbmRsZSwgc2VydmljZU5hbWUsIDB4MDAwMSB8IDB4MDAwNCB8IDB4MDAyMCB8IDB4MDAxMCB8IDB4MDAwMTAwMDApOwogICAgICAgICAgICBpZiAoaC5WYWwgIT0gMCkNCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSB7IF9PYmplY3RJRDogJ3NlcnZpY2UtbWFuYWdlci5zZXJ2aWNlJyB9CiAgICAgICAgICAgICAgICByZXRWYWwuX3NjbSA9IGhhbmRsZTsKICAgICAgICAgICAgICAgIHJldFZhbC5fc2VydmljZSA9IGg7CiAgICAgICAgICAgICAgICByZXRWYWwuX0dNID0gdGhpcy5HTTsKICAgICAgICAgICAgICAgIHJldFZhbC5fcHJveHkgPSB0aGlzLnByb3h5OwogICAgICAgICAgICAgICAgcmV0VmFsLl9wcm94eTIgPSB0aGlzLnByb3h5MjsKICAgICAgICAgICAgICAgIHJldFZhbC5uYW1lID0gbmFtZTsKCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnc3RhdHVzJywgCiAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKHRoaXMuX0dNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5LlF1ZXJ5U2VydmljZVN0YXR1c0V4KHRoaXMuX3NlcnZpY2UsIDAsIDAsIDAsIGJ5dGVzTmVlZGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKGJ5dGVzTmVlZGVkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5LlF1ZXJ5U2VydmljZVN0YXR1c0V4KHRoaXMuX3NlcnZpY2UsIDAsIHN0LCBzdC5fc2l6ZSwgYnl0ZXNOZWVkZWQpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ocGFyc2VTZXJ2aWNlU3RhdHVzKHN0KSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoeyBzdGF0ZTogJ1VOS05PV04nIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuc3RhdHVzLnN0YXRlICE9ICdVTktOT1dOJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXRWYWwpOwogICAgICAgICAgICAgICAgICAgIHJldFZhbC5jbG9zZSA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9zZXJ2aWNlICYmIHRoaXMuX3NjbSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKHRoaXMuX3NlcnZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKHRoaXMuX3NjbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlID0gdGhpcy5fc2NtID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLm9uKCd+JywgcmV0VmFsLmNsb3NlKTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuaXNNZSA9IGZ1bmN0aW9uIGlzTWUoKQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQodGhpcy5zdGF0dXMucGlkKSA9PSBwcm9jZXNzLnBpZCk7DQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXRoID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgdGhpcy5uYW1lLCAnSW1hZ2VQYXRoJykudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IGltYWdlUGF0aC5zcGxpdCgnLmV4ZScpWzBdICsgJy5leGUnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0LnN0YXJ0c1dpdGgoJyInKSkgeyByZXQgPSByZXQuc3Vic3RyaW5nKDEpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5hcHBMb2NhdGlvbigpLnNwbGl0KCdcXCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG9rZW5zLmpvaW4oJ1xcJykpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmlzUnVubmluZyA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuc3RhdHVzLnN0YXRlID09ICdSVU5OSU5HJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9zdG9wRXggPSBmdW5jdGlvbihzLCBwKQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gcy5zdGF0dXMuc3RhdGU7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1RPUFBFRCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlcygnU1RPUFBFRCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTVE9QX1BFTkRJTkcnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9lbGFwc2VkVGltZSA9IERhdGUubm93KCkgLSBwLl9zdGFydFRpbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLl9lbGFwc2VkVGltZSA8IDEwMDAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnRpbWVyID0gc2V0VGltZW91dChzLl9zdG9wRXgsIHAuX3dhaXRUaW1lLCBzLCBwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlaigndGltZW91dCB3YWl0aW5nIGZvciBzZXJ2aWNlIHRvIHN0b3AnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9yZWooJ1VuZXhwZWN0ZWQgc3RhdGU6ICcgKyBjdXJyZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0b3AgPSBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMuc3RhdGUgPT0gJ1JVTk5JTkcnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgU2VydmljZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdzdGF0ZSA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKDM2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWFzb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9wcm94eS5Db250cm9sU2VydmljZSh0aGlzLl9zZXJ2aWNlLCAweDAwMDAwMDAxLCBuZXdzdGF0ZSkuVmFsID09IDAgJiYgKHJlYXNvbiA9IHRoaXMuX3Byb3h5Mi5HZXRMYXN0RXJyb3IoKS5WYWwpIT0wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3Jlaih0aGlzLm5hbWUgKyAnLnN0b3AoKSBmYWlsZWQgd2l0aCBlcnJvcjogJyArIHJlYXNvbik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHNldHVwIGEgdGltZWQgY2FsbGJhY2sgdG8gY2hlY2sgdGhlIHN0YXR1cw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fZWxhcHNlZFRpbWUgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3dhaXRUaW1lID0gc3RhdHVzLndhaXRIaW50IC8gMTA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuX3dhaXRUaW1lIDwgNTAwKSB7IHJldC5fd2FpdFRpbWUgPSA1MDA7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5fd2FpdFRpbWUgPiA1MDAwKSB7IHJldC5fd2FpdFRpbWUgPSA1MDAwOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC50aW1lciA9IHNldFRpbWVvdXQodGhpcy5fc3RvcEV4LCByZXQuX3dhaXRUaW1lLCB0aGlzLCByZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignY2Fubm90IGNhbGwgJyArIHRoaXMubmFtZSArICcuc3RvcCgpLCB3aGVuIGN1cnJlbnQgc3RhdGUgaXM6ICcgKyB0aGlzLnN0YXR1cy5zdGF0ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0YXJ0ID0gZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnN0YXRlID09ICdTVE9QUEVEJykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VjY2VzcyA9IHRoaXMuX3Byb3h5LlN0YXJ0U2VydmljZUEodGhpcy5fc2VydmljZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcyA9PSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHRoaXMubmFtZSArICcuc3RhcnQoKSBmYWlsZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ2Nhbm5vdCBjYWxsICcgKyB0aGlzLm5hbWUgKyAnLnN0YXJ0KCksIHdoZW4gY3VycmVudCBzdGF0ZSBpczogJyArIHRoaXMuc3RhdHVzLnN0YXRlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5yZXN0YXJ0ID0gZnVuY3Rpb24gKCkKICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01lKCkpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gcmVzdGFydCBvdXJzZWx2ZXMgb24gV2luZG93cywgd2UgbXVzdCBzcGF3biBhIGRldGFjaGVkIGNoaWxkIHByb2Nlc3MsIGJlY3Vhc2Ugd2UgbmVlZCB0byBjYWxsIHN0YXJ0LCBvbmNlIHdlIGFyZSBzdG9wcGVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQoJ1xcJykucG9wKCksICctZXhlYyAiJyArICJyZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UoJyIgKyB0aGlzLm5hbWUgKyAiJykucmVzdGFydCgpLmZpbmFsbHkoZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTsiICsgJyInXSwgeyB0eXBlOiA0LCBkZXRhY2hlZDogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMuc3RvcCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RhcnRwID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fYSA9IGE7IHRoaXMuX3IgPSByOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnNlcnZpY2UgPSB0aGlzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5zdGFydCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0cC5fcihlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0cC5fYSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7IGNvbnNvbGUucmF3TG9nKCdzdG9wKCkgZmFpbGVkID0+ICcgKyBlLnRvU3RyaW5nKCkpO30pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocC5zdGFydHApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWdBKGgsIDAsIDAsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2EgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWdBKGgsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYSwgcXVlcnlfc2VydmljZV9jb25maWdhLl9zaXplLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gcXVlcnlfc2VydmljZV9jb25maWdhLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gNCA/IDI4IDogNDgsIHRoaXMuR00uUG9pbnRlclNpemUpLkRlcmVmKCkuU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ3VzZXInLCB7IHZhbHVlOiB2YWwgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICB2YXIgZmFpbHVyZWFjdGlvbnMgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDgxOTIpOwogICAgICAgICAgICAgICAgICAgIHZhciBibmVlZGVkID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg0KTsgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LlF1ZXJ5U2VydmljZUNvbmZpZzJBKGgsIDIsIGZhaWx1cmVhY3Rpb25zLCA4MTkyLCBibmVlZGVkKS5WYWwgIT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjQWN0aW9ucyA9IGZhaWx1cmVhY3Rpb25zLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDI0IDogMTIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLnJlc2V0UGVyaW9kID0gZmFpbHVyZWFjdGlvbnMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgYWN0ID0gMCA7IGFjdCA8IGNBY3Rpb25zOyArK2FjdCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IGZhaWx1cmVhY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuR00uUG9pbnRlclNpemUpLkRlcmVmKCkuRGVyZWYoYWN0KjgsOCkudG9CdWZmZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChhY3Rpb24ucmVhZFVJbnQzMkxFKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ05PTkUnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLnB1c2goeyB0eXBlOiAnU0VSVklDRV9SRVNUQVJUJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ1JFQk9PVCcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLnB1c2goeyB0eXBlOiAnT1RIRVInIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAg", 16000); - memcpy_s(_servicemanager + 48000, 84772, "ICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLnBlZWsoKS5kZWxheSA9IGFjdGlvbi5yZWFkVUludDMyTEUoNCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICB0aHJvdyAoJ2NvdWxkIG5vdCBmaW5kIHNlcnZpY2U6ICcgKyBuYW1lKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gTGludXgsIE1hY09TLCBGcmVlQlNECgogICAgICAgIHRoaXMuaXNBZG1pbiA9IGZ1bmN0aW9uIGlzQWRtaW4oKSAKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmlzUm9vdCgpKTsKICAgICAgICB9CgogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHJldCA9IHsgbmFtZTogbmFtZX07CiAgICAgICAgICAgICAgICBpZihyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvcmMuZC8nICsgbmFtZSkpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdyYycsIHsgdmFsdWU6ICcvZXRjL3JjLmQvJyArIG5hbWUgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgbmFtZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ3JjJywgeyB2YWx1ZTogJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG5hbWUgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdTZXJ2aWNlOiAnICsgbmFtZSArICcgbm90IGZvdW5kJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGRlc2M9IHwgYXdrIC1GPSAnIiArICd7IGlmKCQxPT0iZGVzYyIpIHsgJDE9IiI7IGE9c3BsaXQoJDAsIHJlcywgIlxcIiIpOyBpZihhPjEpIHsgcHJpbnQgcmVzWzJdOyB9IGVsc2UgeyBwcmludCAkMDsgfSB9IH1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwICIgKyB0aGlzLm5hbWUgKyAiX2NoZGlyPSB8IGF3ayAtRj0gJ3sgcHJpbnQgJDIgfScgfCBhd2sgLUZcXFwiICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgICAgICByZXQgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZihyZXQgPT0gJycpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJjLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LmpvaW4oJy8nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uIGFwcExvY2F0aW9uKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwoJCSAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyB0aGlzLnJjICsgIiB8IGdyZXAgY29tbWFuZD0gfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nIHwgYXdrIC1GXFxcIiAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCQkgICAgICAgICAgICB2YXIgdG1wID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJyR7bmFtZX0nKS5qb2luKHRoaXMubmFtZSk7CgkJICAgICAgICAgICAgaWYodG1wPT0nL3Vzci9zYmluL2RhZW1vbicpCgkJICAgICAgICAgICAgewoJCQkgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CgkJCSAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKCQkJICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAnICsgdGhpcy5yYyArICcgfCBncmVwIGNvbW1hbmRfYXJncz0gfCBhd2sgLUYiLWYgIiBcJ3sgJDE9IiI7IHNwbGl0KCQwLCByZXMsICJcXCIiKTsgc3BsaXQocmVzWzFdLCB0LCAiICIpOyBwcmludCB0WzFdOyB9XCdcbmV4aXRcbicpOwoJCQkgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoJCQkgICAgICAgICAgICByZXR1cm4oY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgCQkgICAgICAgIH0KCQkgICAgICAgICAgICBlbHNlCgkJICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKCQkgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LmlzUnVubmluZyA9IGZ1bmN0aW9uIGlzUnVubmluZygpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhdHVzIHwgYXdrICd7IHByaW50ICQzIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ3J1bm5pbmcnKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuaXNNZSA9IGZ1bmN0aW9uIGlzTWUoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0YXR1cyB8IGF3ayAneyBzcGxpdCgkNiwgcmVzLCBcIi5cIik7IHByaW50IHJlc1sxXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RvcFxuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhcnRcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVyZXN0YXJ0XG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gZ2V0U2VydmljZShuYW1lKSB7IHJldHVybiAoZmV0Y2hQbGlzdCgnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucycsIG5hbWUpKTsgfTsKICAgICAgICAgICAgdGhpcy5nZXRMYXVuY2hBZ2VudCA9IGZ1bmN0aW9uIGdldExhdW5jaEFnZW50KG5hbWUsIHVzZXJpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHVzZXJpZCA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmV0Y2hQbGlzdCgnL0xpYnJhcnkvTGF1bmNoQWdlbnRzJywgbmFtZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmV0Y2hQbGlzdChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcihyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VXNlcm5hbWUodXNlcmlkKSkgKyAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzJywgbmFtZSwgdXNlcmlkKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIChuYW1lLCBwbGF0Zm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCFwbGF0Zm9ybSkgeyBwbGF0Zm9ybSA9IHRoaXMuZ2V0U2VydmljZVR5cGUoKTsgfQogICAgICAgICAgICAgICAgdmFyIHJldCA9IHsgbmFtZTogbmFtZSwgY2xvc2U6IGZ1bmN0aW9uICgpIHsgfX07CiAgICAgICAgICAgICAgICBzd2l0Y2gocGxhdGZvcm0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC5kLycgKyBuYW1lKSkgeyBwbGF0Zm9ybSA9ICdpbml0JzsgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKSkgeyBwbGF0Zm9ybSA9ICd1cHN0YXJ0JzsgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBsYXRmb3JtID09ICdpbml0JyAmJiByZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC5kLycgKyBuYW1lKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbGF0Zm9ybSA9PSAndXBzdGFydCcgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZXNjcmlwdGlvbi5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCBkZXNjcmlwdGlvbiB8IGF3ayAnIiArICd7IGlmKCQxPT0iZGVzY3JpcHRpb24iKSB7ICQxPSIiOyBhPXNwbGl0KCQwLCByZXMsICJcXCIiKTsgaWYoYT4xKSB7IHByaW50IHJlc1syXTsgfSBlbHNlIHsgcHJpbnQgJDA7IH19fVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQuZC8iICsgdGhpcy5uYW1lICsgIiB8IGdyZXAgU2hvcnQtRGVzY3JpcHRpb246IHwgYXdrICciICsgJ3sgaWYoJDI9PSJTaG9ydC1EZXNjcmlwdGlvbjoiKSB7ICQxPSIiOyAkMj0iIjsgcHJpbnQgJDA7IH19XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBwV29ya2luZ0RpcmVjdG9yeS5wbGF0Zm9ybSA9PSAnaW5pdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC5kLyIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnU0NSSVBUPScgfCBhd2sgLUY9ICd7IGxlbj1zcGxpdCgkMiwgYSwgXCIvXCIpOyBwcmludCBzdWJzdHIoJDIsMCxsZW5ndGgoJDIpLWxlbmd0aChhW2xlbl0pKTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCAnY2hkaXIgJyB8IGF3ayAne3ByaW50ICQyfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBXb3JraW5nRGlyZWN0b3J5LnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFwcExvY2F0aW9uLnBsYXRmb3JtID09ICdpbml0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwICdTQ1JJUFQ9JyB8IGF3ayAtRj0gJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQvIiArIHRoaXMubmFtZSArICIuY29uZiB8IGdyZXAgJ2V4ZWMgJyB8IGF3ayAne3ByaW50ICQyfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWUucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImluaXRjdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgYXdrICd7cHJpbnQgJDJ9JyB8IGF3ayAtRiwgJ3twcmludCAkNH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgc3RhdHVzIHwgYXdrICd7cHJpbnQgJDJ9JyB8IGF3ayAtRiwgJ3twcmludCAkNH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxk", 16000); - memcpy_s(_servicemanager + 64000, 68772, "LnN0ZG91dC5zdHIudHJpbSgpKSA9PSBwcm9jZXNzLnBpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSdW5uaW5nLnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpbml0Y3RsIHN0YXR1cyAiICsgdGhpcy5uYW1lICsgIiB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIHN0YXR1cyB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDF9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnc3RhcnQvcnVubmluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2luaXRjdGwgc3RhcnQgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgdGhpcy5uYW1lICsgJyBzdGFydFxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0YXJ0LnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wLnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0b3AgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgdGhpcy5uYW1lICsgJyBzdG9wXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RvcC5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdGFydC5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW5pdGN0bCByZXN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgcmVzdGFydFxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Ll9zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5fc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2luaXRjdGwgc3RhdHVzICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RhdHVzXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5fc3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAocGxhdGZvcm0gKyAnIFNlcnZpY2UgKCcgKyBuYW1lICsgJykgTk9UIEZPVU5EJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJyB8IGdyZXAgRGVzY3JpcHRpb249IHwgYXdrIC1GPSBcJ3sgaWYoJDE9PSJEZXNjcmlwdGlvbiIpIHsgJDE9IiI7IHByaW50ICQwOyB9fVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgdGhpcy5uYW1lICsgJy5zZXJ2aWNlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdXb3JraW5nRGlyZWN0b3J5PScgfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdXb3JraW5nRGlyZWN0b3J5PScgfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgdGhpcy5uYW1lICsgJy5zZXJ2aWNlJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9saWIvc3lzdGVtZC9zeXN0ZW0vIiArIHRoaXMubmFtZSArICIuc2VydmljZSB8IGdyZXAgJ0V4ZWNTdGFydD0nIHwgYXdrIC1GPSAneyBzcGxpdCgkMiwgYSwgXCIgXCIpOyBwcmludCBhWzFdIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vIiArIHRoaXMubmFtZSArICIuc2VydmljZSB8IGdyZXAgJ0V4ZWNTdGFydD0nIHwgYXdrIC1GPSAneyBzcGxpdCgkMiwgYSwgXCIgXCIpOyBwcmludCBhWzFdIH0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN5c3RlbWN0bCBzdGF0dXMgIiArIHRoaXMubmFtZSArICIgfCBncmVwICdNYWluIFBJRDonIHwgYXdrICd7cHJpbnQgJDN9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA9PSBwcm9jZXNzLnBpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzUnVubmluZyA9IGZ1bmN0aW9uIGlzUnVubmluZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzeXN0ZW1jdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnQWN0aXZlOicgfCBhd2sgJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ2FjdGl2ZScpOyAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhcnQgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RvcCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCByZXN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuX3N0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLl9zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBzdGF0dXMgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuX3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHBsYXRmb3JtICsgJyBTZXJ2aWNlICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAg", 16000); - memcpy_s(_servicemanager + 80000, 52772, "ICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnVW5rbm93biBTZXJ2aWNlIFBsYXRmb3JtOiAnICsgcGxhdGZvcm0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgdGhpcy5lbnVtZXJhdGVTZXJ2aWNlID0gZnVuY3Rpb24gKG9wdGlvbnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICB2YXIgcGF0aHMgPSBbXTsKICAgICAgICAgICAgc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKG9wdGlvbnMgJiYgb3B0aW9ucy5wbGF0Zm9ybVR5cGUpP29wdGlvbnMucGxhdGZvcm1UeXBlIDogdGhpcy5nZXRTZXJ2aWNlVHlwZSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvZXRjL2luaXQuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2V0Yy9pbml0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvbGliL3N5c3RlbWQvc3lzdGVtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZnJlZWJzZCc6CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2V0Yy9yYy5kJyk7CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL3Vzci9sb2NhbC9ldGMvcmMuZCcpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zJyk7CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL1N5c3RlbS9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yKHZhciBpIGluIHBhdGhzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZXMgPSByZXF1aXJlKCdmcycpLnJlYWRkaXJTeW5jKHBhdGhzW2ldKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaiBpbiBmaWxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKG9wdGlvbnMgJiYgb3B0aW9ucy5wbGF0Zm9ybVR5cGUpID8gb3B0aW9ucy5wbGF0Zm9ybVR5cGUgOiB0aGlzLmdldFNlcnZpY2VUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLCAnaW5pdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5jb25mJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0uc3BsaXQoJy5jb25mJylbMF0sICd1cHN0YXJ0JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tqXS5lbmRzV2l0aCgnLnNlcnZpY2UnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXS5zcGxpdCgnLnNlcnZpY2UnKVswXSwgJ3N5c3RlbWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tqXS5lbmRzV2l0aCgnLnBsaXN0JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZmV0Y2hQbGlzdChwYXRoc1tpXSwgZmlsZXNbal0uc3BsaXQoJy5wbGlzdCcpWzBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgayBpbiByZXN1bHRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1trXS5kZXNjcmlwdGlvbikgeyByZXN1bHRzW2tdLmRlc2NyaXB0aW9uID0gcmVzdWx0c1trXS5kZXNjcmlwdGlvbigpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHRzKTsKICAgICAgICB9OwogICAgfQogICAgdGhpcy5pbnN0YWxsU2VydmljZSA9IGZ1bmN0aW9uIGluc3RhbGxTZXJ2aWNlKG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKCFvcHRpb25zLnRhcmdldCkgeyBvcHRpb25zLnRhcmdldCA9IG9wdGlvbnMubmFtZTsgfQogICAgICAgIGlmICghb3B0aW9ucy5kaXNwbGF5TmFtZSkgeyBvcHRpb25zLmRpc3BsYXlOYW1lID0gb3B0aW9ucy5uYW1lOyB9CgogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyBhZG1pbicpOyB9CgogICAgICAgICAgICAvLyBCZWZvcmUgd2Ugc3RhcnQsIHdlIG5lZWQgdG8gY29weSB0aGUgYmluYXJ5IHRvIHRoZSByaWdodCBwbGFjZQogICAgICAgICAgICB2YXIgZm9sZGVyID0gdGhpcy5nZXRTZXJ2aWNlRm9sZGVyKCk7CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlcikpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoZm9sZGVyKTsgfQogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYyhmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lKTsgfQoKICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBvcHRpb25zLnRhcmdldCArICcuZXhlJyk7CiAgICAgICAgICAgIG9wdGlvbnMuc2VydmljZVBhdGggPSBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUnOwoKICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXRoID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSgnIicgKyBvcHRpb25zLnNlcnZpY2VQYXRoICsgJyInKTsKICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAyKTsKICAgICAgICAgICAgaWYgKGhhbmRsZS5WYWwgPT0gMCkgeyB0aHJvdyAoJ2Vycm9yIG9wZW5pbmcgU0NNYW5hZ2VyJyk7IH0KICAgICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShvcHRpb25zLm5hbWUpOwogICAgICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKG9wdGlvbnMuZGlzcGxheU5hbWUpOwogICAgICAgICAgICB2YXIgYWxsQWNjZXNzID0gMHgwMDBGMDFGRjsKICAgICAgICAgICAgdmFyIHNlcnZpY2VUeXBlOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ0FVVE9fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwMjsgLy8gQXV0b21hdGljCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdERU1BTkRfU1RBUlQnOgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSA9IDB4MDM7IC8vIE1hbnVhbAogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnRElTQUJMRUQnOgogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwNDsgLy8gRGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGggPSB0aGlzLnByb3h5LkNyZWF0ZVNlcnZpY2VBKGhhbmRsZSwgc2VydmljZU5hbWUsIGRpc3BsYXlOYW1lLCBhbGxBY2Nlc3MsIDB4MTAgfCAweDEwMCwgc2VydmljZVR5cGUsIDAsIHNlcnZpY2VQYXRoLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgaWYgKGguVmFsID09IDApIHsgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsgdGhyb3cgKCdFcnJvciBDcmVhdGluZyBTZXJ2aWNlOiAnICsgdGhpcy5wcm94eTIuR2V0TGFzdEVycm9yKCkuVmFsKTsgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5kZXNjcmlwdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRzYyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5kZXNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICB2YXIgc2VydmljZURlc2NyaXB0aW9uID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSh0aGlzLkdNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgIGRzYy5wb2ludGVyQnVmZmVyKCkuY29weShzZXJ2aWNlRGVzY3JpcHRpb24uRGVyZWYoMCwgdGhpcy5HTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hhbmdlU2VydmljZUNvbmZpZzJBKGgsIDEsIHNlcnZpY2VEZXNjcmlwdGlvbikuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuYWJsZSB0byBzZXQgZGVzY3JpcHRpb24uLi4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgPyA1MDAwIDogb3B0aW9ucy5mYWlsdXJlUmVzdGFydDsgICAgICAgICAgICAgLy8gRGVsYXkgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoMyAqIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMypzaXplb2YoU0NfQUNUSU9OKQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlswXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShkZWxheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlswXS5kZWxheQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZig4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsxXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDEyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsxXS5kZWxheQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDIwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS5kZWxheQoKICAgICAgICAgICAgICAgIHZhciBmYWlsdXJlQWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplb2YoU0VSVklDRV9GQUlMVVJFX0FDVElPTlMpCiAgICAgICAgICAgICAgICBmYWlsdXJlQWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoNzIwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHdSZXNldFBlcmlvZDogMiBIb3VycwogICAgICAgICAgICAgICAgZmFpbHVyZUFjdGlvbnMuRGVyZWYodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMjQgOiAxMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMpOy8vIGNBY3Rpb25zOiAzCiAgICAgICAgICAgICAgICBhY3Rpb25zLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGZhaWx1cmVBY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuR00uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hhbmdlU2VydmljZUNvbmZpZzJBKGgsIDIsIGZhaWx1cmVBY3Rpb25zKS5WYWwgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIHNldCBGYWlsdXJlQWN0aW9ucy4uLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKGgpOwogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOwoKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiBvcHRpb25zLmZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd3JpdGluZyAnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7CiAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXRoID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgb3B0aW9ucy5uYW1lLCAnSW1hZ2VQYXRoJyk7CiAgICAgICAgICAgICAgICBpbWFnZVBhdGggKz0gKCcgJyArIG9wdGlvbnMucGFyYW1ldGVycy5qb2luKCcgJykpOwogICAgICAgICAgICAgICAgcmVnLldyaXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgb3B0aW9ucy5uYW1lLCAnSW1hZ2VQYXRoJywgaW1hZ2VQYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IGNvbnNvbGUubG9nKCdJbnN0YWxsaW5nIGEgU2VydmljZSByZXF1aXJlcyByb290Jyk7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0KICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvcHRpb25zLnBhcmFtZXRlcnMgPyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpIDogJyc7CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKCiAgICAgICAgICAgIHZhciByYyA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG9wdGlvbnMubmFtZSwgeyBmbGFnczogJ3diJyB9KTsKICAgICAgICAgICAgcmMud3JpdGUoJyMhL2Jpbi9zaFxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCcjIFBST1ZJREU6ICcgKyBvcHRpb25zLm5hbWUgKyAnXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJyMgUkVRVUlSRTogRklMRVNZU1RFTVMgTkVUV09SS0lOR1xuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCcjIEtFWVdPUkQ6IHNodXRkb3duXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJy4gL2V0Yy9yYy5zdWJyXG5cbicpOwogICAgICAgICAgICByYy53cml0ZSgnbmFtZT0iJyArIG9wdGlvbnMubmFtZSArICciXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ2Rlc2M9IicgKyAob3B0aW9ucy5kZXNjcmlwdGlvbiA/IG9wdGlvbnMuZGVzY3JpcHRpb24gOiAnTWVzaENlbnRyYWwgQWdlbnQnKSArICciXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ3JjdmFyPSR7bmFtZX1fZW5hYmxlXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ3BpZGZpbGU9Ii92YXIvcnVuLycgKyBvcHRpb25zLm5hbWUgKyAnLnBpZCJcbicpOwogICAgICAgICAgICByYy53cml0ZSgnY29tbWFuZD0iL3Vzci9zYmluL2RhZW1vbiJcbicpOwogICAgICAgICAgICByYy53cml0ZSgnY29tbWFuZF9hcmdzPSItUCAke3BpZGZpbGV9ICcgKyAoKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCk/Jy1yJzonJykgKyAnIC1mIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJyJcbicpOwogICAgICAg", 16000); - memcpy_s(_servicemanager + 96000, 36772, "ICAgICByYy53cml0ZSgnY29tbWFuZF9jaGRpcj0iL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnIlxuXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ2xvYWRfcmNfY29uZmlnICRuYW1lXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJzogJHsnICsgb3B0aW9ucy5uYW1lICsgJ19lbmFibGU9IicgKyAoKG9wdGlvbnMuc3RhcnRUeXBlID09ICdBVVRPX1NUQVJUJyB8fCBvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQk9PVF9TVEFSVCcpPydZRVMnOidOTycpICsgJyJ9XG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ3J1bl9yY19jb21tYW5kICIkMSJcbicpOwogICAgICAgICAgICByYy5lbmQoKTsKICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBvcHRpb25zLm5hbWUpLm1vZGU7CiAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBvcHRpb25zLm5hbWUsIG0pOwogICAgICAgIH0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IGNvbnNvbGUubG9nKCdJbnN0YWxsaW5nIGEgU2VydmljZSByZXF1aXJlcyByb290Jyk7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0KICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvcHRpb25zLnBhcmFtZXRlcnMgPyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpIDogJyc7CiAgICAgICAgICAgIHZhciBjb25mOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2VydmljZVBsYXRmb3JtKSB7IG9wdGlvbnMuc2VydmljZVBsYXRmb3JtID0gdGhpcy5nZXRTZXJ2aWNlVHlwZSgpOyB9CiAgICAgICAgICAgCiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9CgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsKICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyYXNoIFJlc3RhcnQgaXMgZW5hYmxlZCwgYnV0IGl0IGlzbid0IGluaGVyZW50bHkgc3VwcG9ydGVkIGJ5IElOSVQsIHNvIHdlIG11c3QgZmFrZSBpdCB3aXRoIEpTCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXBfcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuc3BsaXQoJyInKS5qb2luKCdcXCInKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9ICItZXhlYyBcXFwidmFyIGNoaWxkOyBwcm9jZXNzLm9uKCdTSUdURVJNJywgZnVuY3Rpb24gKCkgeyBjaGlsZC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2V4aXQnKTsgY2hpbGQua2lsbCgpOyBwcm9jZXNzLmV4aXQoKTsgfSk7IGZ1bmN0aW9uIHN0YXJ0KCkgeyBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5hcmd2MCwgXFxcIiIgKyB0bXBfcGFyYW1ldGVycyArICJcXFwiXSk7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsgY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoc3RhdHVzKSB7IHN0YXJ0KCk7IH0pOyB9IHN0YXJ0KCk7XFxcIiI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIHRoZSBpbml0LmQgc2NyaXB0IEkgd3JvdGUuIFJhdGhlciB0aGFuIGhhdmluZyB0byBkZWFsIHdpdGggZXNjYXBpbmcgdGhlIHRoaW5nLCBJIGp1c3QgQmFzZTY0IGVuY29kZWQgaXQgdG8gcHJldmVudCBpc3N1ZXMuCiAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy9ldGMvaW5pdC5kLycgKyBvcHRpb25zLm5hbWUsIHsgZmxhZ3M6ICd3YicgfSk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZShCdWZmZXIuZnJvbSgnSXlFdlltbHVMM05vQ2dvS1UwTlNTVkJVUFM5MWMzSXZiRzlqWVd3dmJXVnphRjl6WlhKMmFXTmxjeTlZV0ZoWVdDOVpXVmxaV1FwU1ZVNUJVejF5YjI5MENncFFTVVJHU1V4RlBTOTJZWEl2Y25WdUwxaFlXRmhZTG5CcFpBcE1UMGRHU1V4RlBTOTJZWEl2Ykc5bkwxaFlXRmhZTG14dlp3b0tjM1JoY25Rb0tTQjdDaUFnYVdZZ1d5QXRaaUFpSkZCSlJFWkpURVVpSUYwZ0ppWWdhMmxzYkNBdE1DQWtLR05oZENBaUpGQkpSRVpKVEVVaUtTQXlQaTlrWlhZdmJuVnNiRHNnZEdobGJnb2dJQ0FnWldOb2J5QW5VMlZ5ZG1salpTQmhiSEpsWVdSNUlISjFibTVwYm1jbklENG1NZ29nSUNBZ2NtVjBkWEp1SURFS0lDQm1hUW9nSUdWamFHOGdKMU4wWVhKMGFXNW5JSE5sY25acFkyWGlnS1luSUQ0bU1nb2dJR3h2WTJGc0lFTk5SRDBpSkZORFVrbFFWQ0I3ZTFCQlVrMVRmWDBnSmo0Z1hDSWtURTlIUmtsTVJWd2lJQ1lnWldOb2J5QmNKQ0VpQ2lBZ2JHOWpZV3dnUTAxRVVFRlVTRDBrS0dWamFHOGdKRk5EVWtsUVZDQjhJR0YzYXlBbmV5QnNaVzQ5YzNCc2FYUW9KREFzSUdFc0lDSXZJaWs3SUhCeWFXNTBJSE4xWW5OMGNpZ2tNQ3dnTUN3Z2JHVnVaM1JvS0NRd0tTMXNaVzVuZEdnb1lWdHNaVzVkS1NrN0lIMG5LUW9nSUdOa0lDUkRUVVJRUVZSSUNpQWdjM1VnTFdNZ0lpUkRUVVFpSUNSU1ZVNUJVeUErSUNJa1VFbEVSa2xNUlNJS0lDQmxZMmh2SUNkVFpYSjJhV05sSUhOMFlYSjBaV1FuSUQ0bU1ncDlDZ3B6ZEc5d0tDa2dld29nSUdsbUlGc2dJU0F0WmlBaUpGQkpSRVpKVEVVaUlGMDdJSFJvWlc0S0lDQWdJR1ZqYUc4Z0oxTmxjblpwWTJVZ2JtOTBJSEoxYm01cGJtY25JRDRtTWdvZ0lDQWdjbVYwZFhKdUlERUtJQ0JsYkhObENnbHdhV1E5SkNnZ1kyRjBJQ0lrVUVsRVJrbE1SU0lnS1FvSmFXWWdhMmxzYkNBdE1DQWtjR2xrSURJK0wyUmxkaTl1ZFd4c095QjBhR1Z1Q2lBZ0lDQWdJR1ZqYUc4Z0oxTjBiM0J3YVc1bklITmxjblpwWTJYaWdLWW5JRDRtTWdvZ0lDQWdJQ0JyYVd4c0lDMHhOU0FrY0dsa0NpQWdJQ0FnSUdWamFHOGdKMU5sY25acFkyVWdjM1J2Y0hCbFpDY2dQaVl5Q2dsbGJITmxDZ2tnSUdWamFHOGdKMU5sY25acFkyVWdibTkwSUhKMWJtNXBibWNuQ2dsbWFRb0pjbTBnTFdZZ0pDSlFTVVJHU1V4Rklnb2dJR1pwQ24wS2NtVnpkR0Z5ZENncGV3b0pjM1J2Y0FvSmMzUmhjblFLZlFwemRHRjBkWE1vS1hzS0NXbG1JRnNnTFdZZ0lpUlFTVVJHU1V4RklpQmRDZ2wwYUdWdUNna0pjR2xrUFNRb0lHTmhkQ0FpSkZCSlJFWkpURVVpSUNrS0NRbHBaaUJyYVd4c0lDMHdJQ1J3YVdRZ01qNHZaR1YyTDI1MWJHdzdJSFJvWlc0S0NRa0paV05vYnlBaVdGaFlXRmdnYzNSaGNuUXZjblZ1Ym1sdVp5d2djSEp2WTJWemN5QWtjR2xrSWdvSkNXVnNjMlVLQ1FrSlpXTm9ieUFuV0ZoWVdGZ2djM1J2Y0M5M1lXbDBhVzVuSndvSkNXWnBDZ2xsYkhObENna0paV05vYnlBbldGaFlXRmdnYzNSdmNDOTNZV2wwYVc1bkp3b0pabWtLQ24wS0NncGpZWE5sSUNJa01TSWdhVzRLQ1hOMFlYSjBLUW9KQ1hOMFlYSjBDZ2tKT3pzS0NYTjBiM0FwQ2drSmMzUnZjQW9KQ1RzN0NnbHlaWE4wWVhKMEtRb0pDWE4wYjNBS0NRbHpkR0Z5ZEFvSkNUczdDZ2x6ZEdGMGRYTXBDZ2tKYzNSaGRIVnpDZ2tKT3pzS0NTb3BDZ2tKWldOb2J5QWlWWE5oWjJVNklITmxjblpwWTJVZ1dGaFlXRmdnZTNOMFlYSjBmSE4wYjNCOGNtVnpkR0Z5ZEh4emRHRjBkWE45SWdvSkNUczdDbVZ6WVdNS1pYaHBkQ0F3Q2dvPScsICdiYXNlNjQnKS50b1N0cmluZygpLnNwbGl0KCdYWFhYWCcpLmpvaW4ob3B0aW9ucy5uYW1lKS5zcGxpdCgnWVlZWVknKS5qb2luKG9wdGlvbnMudGFyZ2V0KS5yZXBsYWNlKCd7e1BBUk1TfX0nLCBwYXJhbWV0ZXJzKSk7CiAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsKCiAgICAgICAgICAgICAgICAgICAgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy9ldGMvaW5pdC5kLycgKyBvcHRpb25zLm5hbWUpLm1vZGU7CiAgICAgICAgICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL2V0Yy9pbml0LmQvJyArIG9wdGlvbnMubmFtZSwgbSk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JPT1RfU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgndXBkYXRlLXJjLmQgJyArIG9wdGlvbnMubmFtZSArICcgZGVmYXVsdHNcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0KCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBvcHRpb25zLnNlcnZpY2VQYXRoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOwogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOwoKICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2V0Yy9pbml0LycgKyBvcHRpb25zLm5hbWUgKyAnLmNvbmYnLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCT09UX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1lTVEVNX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdzdGFydCBvbiBydW5sZXZlbCBbMjM0NV1cbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnc3RvcCBvbiBydW5sZXZlbCBbMDE2XVxuXG4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgncmVzcGF3blxuXG4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnY2hkaXIgL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdleGVjIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJ1xuXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLmVuZCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VEZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb24gPyBvcHRpb25zLmRlc2NyaXB0aW9uIDogJ01lc2hDZW50cmFsIEFnZW50JzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0KCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIG9wdGlvbnMuc2VydmljZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOwogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtJykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlJywgeyBmbGFnczogJ3diJyB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbScpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2UnLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ3Vua25vd24gbG9jYXRpb24gZm9yIHN5c3RlbWQgY29uZmlndXJhdGlvbiBmaWxlcycpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnW1VuaXRdXG5EZXNjcmlwdGlvbj0nICsgc2VydmljZURlc2NyaXB0aW9uICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnW1NlcnZpY2VdXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdXb3JraW5nRGlyZWN0b3J5PS91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnRXhlY1N0YXJ0PS91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnICcgKyBwYXJhbWV0ZXJzICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnU3RhbmRhcmRPdXRwdXQ9bnVsbFxuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1Jlc3RhcnQ9b24tZmFpbHVyZVxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1Jlc3RhcnRTZWM9M1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdSZXN0YXJ0U2VjPScgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JPT1RfU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1tJbnN0YWxsXVxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdBbGlhcz0nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlXG4nKTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgdHlwZTogcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuVEVSTSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5fbW9kdWxlTmFtZSA9IG9wdGlvbnMubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBlbmFibGUgJyArIG9wdGlvbnMubmFtZSArICcuc2VydmljZVxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsKCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyB1bmtub3duIHBsYXRmb3JtIHNlcnZpY2UgdHlwZQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmtub3duIFNlcnZpY2UgUGxhdGZvcm0gVHlwZTogJyArIG9wdGlvbnMuc2VydmljZVBsYXRmb3JtKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ1Vua25vd24gU2VydmljZSBQbGF0Zm9ybSBUeXBlOiAnICsgb3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0KCiAgICAgICAgICAgIC8vIE1hYyBPUwogICAgICAgICAgICB2YXIgc3Rkb3V0cGF0aCA9IChvcHRpb25zLnN0ZG91dCA/ICgnPGtleT5T", 16000); - memcpy_s(_servicemanager + 112000, 20772, "dGFuZGFyZE91dFBhdGg8L2tleT5cbjxzdHJpbmc+JyArIG9wdGlvbnMuc3Rkb3V0ICsgJzwvc3RyaW5nPicpIDogJycpOwogICAgICAgICAgICB2YXIgYXV0b1N0YXJ0ID0gKG9wdGlvbnMuc3RhcnRUeXBlID09ICdBVVRPX1NUQVJUJyA/ICc8dHJ1ZS8+JyA6ICc8ZmFsc2UvPicpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gICcgICAgIDxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlxuJzsKICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDxhcnJheT5cbic7CiAgICAgICAgICAgIHBhcmFtcyArPSAoJyAgICAgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBpZihvcHRpb25zLnBhcmFtZXRlcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcih2YXIgaXRtIGluIG9wdGlvbnMucGFyYW1ldGVycykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMgKz0gKCcgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnBhcmFtZXRlcnNbaXRtXSArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAKICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDwvYXJyYXk+XG4nOwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBsaXN0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPHBsaXN0IHZlcnNpb249IjEuMCI+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnICA8ZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PkxhYmVsPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5uYW1lICsgJzwvc3RyaW5nPlxuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9IChwYXJhbXMgKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+V29ya2luZ0RpcmVjdG9yeTwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gKHN0ZG91dHBhdGggKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoYXV0b1N0YXJ0ICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PktlZXBBbGl2ZTwva2V5PlxuJzsKICAgICAgICAgICAgaWYob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGRpY3Q+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDxrZXk+Q3Jhc2hlZDwva2V5PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8dHJ1ZS8+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDwvZGljdD5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGZhbHNlLz5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5UaHJvdHRsZUludGVydmFsPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8L3BsaXN0Pic7CgogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmluYXJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5iaW5hcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy5wbGlzdCcsIHBsaXN0KTsKICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsKICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ1NlcnZpY2U6ICcgKyBvcHRpb25zLm5hbWUgKyAnIGFscmVhZHkgZXhpc3RzJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBvcHRpb25zLmZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3cml0aW5nICcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSksIG9wdGlvbnMuZmlsZXNbaV0uX2J1ZmZlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIGV4dHJhY3RGaWxlU291cmNlKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgewogICAgICAgIHRoaXMuaW5zdGFsbExhdW5jaEFnZW50ID0gZnVuY3Rpb24gaW5zdGFsbExhdW5jaEFnZW50KG9wdGlvbnMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIShvcHRpb25zLnVpZCB8fCBvcHRpb25zLnVzZXIpICYmICF0aGlzLmlzQWRtaW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdJbnN0YWxsaW5nIGEgR2xvYmFsIEFnZW50L0RhZW1vbiwgcmVxdWlyZXMgYWRtaW4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXRoVG9rZW5zID0gb3B0aW9ucy5zZXJ2aWNlUGF0aC5zcGxpdCgnLycpOwogICAgICAgICAgICBzZXJ2aWNlUGF0aFRva2Vucy5wb3AoKTsKICAgICAgICAgICAgaWYgKHNlcnZpY2VQYXRoVG9rZW5zLnBlZWsoKSA9PSAnLicpIHsgc2VydmljZVBhdGhUb2tlbnMucG9wKCk7IH0KICAgICAgICAgICAgb3B0aW9ucy53b3JraW5nRGlyZWN0b3J5ID0gc2VydmljZVBhdGhUb2tlbnMuam9pbignLycpOwoKICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9IChvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQVVUT19TVEFSVCcgPyAnPHRydWUvPicgOiAnPGZhbHNlLz4nKTsKICAgICAgICAgICAgdmFyIHN0ZG91dHBhdGggPSAob3B0aW9ucy5zdGRvdXQgPyAoJzxrZXk+U3RhbmRhcmRPdXRQYXRoPC9rZXk+XG48c3RyaW5nPicgKyBvcHRpb25zLnN0ZG91dCArICc8L3N0cmluZz4nKSA6ICcnKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICAgICAgICAgJyAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOwogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8YXJyYXk+XG4nOwogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpdG0gaW4gb3B0aW9ucy5wYXJhbWV0ZXJzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5wYXJhbWV0ZXJzW2l0bV0gKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8L2FycmF5PlxuJzsKCiAgICAgICAgICAgIHZhciBwbGlzdCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzxwbGlzdCB2ZXJzaW9uPSIxLjAiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgPGRpY3Q+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMubmFtZSArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBwbGlzdCArPSAocGFyYW1zICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPicgKyBvcHRpb25zLndvcmtpbmdEaXJlY3RvcnkgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gKHN0ZG91dHBhdGggKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoYXV0b1N0YXJ0ICsgJ1xuJyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnNlc3Npb25UeXBlcyAmJiBvcHRpb25zLnNlc3Npb25UeXBlcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MaW1pdExvYWRUb1Nlc3Npb25UeXBlPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxhcnJheT5cbic7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHlwZSBpbiBvcHRpb25zLnNlc3Npb25UeXBlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlc3Npb25UeXBlc1tzdHlwZV0gKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8L2FycmF5PlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5LZWVwQWxpdmU8L2tleT5cbic7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApIHsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZGljdD5cbic7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPGtleT5DcmFzaGVkPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDx0cnVlLz5cbic7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9kaWN0PlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZmFsc2UvPlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5UaHJvdHRsZUludGVydmFsPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8L3BsaXN0Pic7CgogICAgICAgICAgICBpZiAob3B0aW9ucy51aWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudXNlciA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRVc2VybmFtZShvcHRpb25zLnVpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBmb2xkZXIgPSBvcHRpb25zLnVzZXIgPyAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIob3B0aW9ucy51c2VyKSArICcvTGlicmFyeS9MYXVuY2hBZ2VudHMvJykgOiAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzLyc7CiAgICAgICAgICAgIG9wdGlvbnMuZ2lkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEdyb3VwSUQob3B0aW9ucy51aWQpOwogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLm1rZGlyU3luYyhmb2xkZXIpOwogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG93blN5bmMoZm9sZGVyLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhmb2xkZXIgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JywgcGxpc3QpOwogICAgICAgICAgICBpZihvcHRpb25zLnVzZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciArIG9wdGlvbnMubmFtZSArICcucGxpc3QnLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIHRoaXMudW5pbnN0YWxsU2VydmljZSA9IGZ1bmN0aW9uIHVuaW5zdGFsbFNlcnZpY2UobmFtZSkKICAgIHsKICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnVW5pbnN0YWxsaW5nIGEgc2VydmljZSwgcmVxdWlyZXMgYWRtaW4nKTsgfQoKICAgICAgICBpZiAodHlwZW9mIChuYW1lKSA9PSAnb2JqZWN0JykgeyBuYW1lID0gbmFtZS5uYW1lOyB9CiAgICAgICAgdmFyIHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UobmFtZSk7CiAgICAgICAgdmFyIHNlcnZpY2VQYXRoID0gc2VydmljZS5hcHBMb2NhdGlvbigpOwoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNlcnZpY2Uuc3RhdHVzLnN0YXRlID09IHVuZGVmaW5lZCB8fCBzZXJ2aWNlLnN0YXR1cy5zdGF0ZSA9PSAnU1RPUFBFRCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LkRlbGV0ZVNlcnZpY2Uoc2VydmljZS5fc2VydmljZSkgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ1VuaW5zdGFsbCBTZXJ2aWNlIGZvcjogJyArIG5hbWUgKyAnLCBmYWlsZWQgd2l0aCBlcnJvcjogJyArIHRoaXMucHJveHkyLkdldExhc3RFcnJvcigpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnQ2Fubm90IHVuaW5zdGFsbCBzZXJ2aWNlOiAnICsgbmFtZSArICcsIGJlY2F1c2UgaXQgaXM6ICcgKyBzZXJ2aWNlLnN0YXR1cy5zdGF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwogICAgICAgICAgICBzZXJ2aWNlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZ2V0U2VydmljZVR5cGUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0LmQgc2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIG5hbWUgKyAnIHN0b3BcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3VwZGF0ZS1yYy5kIC1mICcgKyBuYW1lICsgJyByZW1vdmVcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL2V0Yy9pbml0LmQvJyArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIGNvdWxkIG5vdCBiZSB1bmluc3RhbGxlZCcsIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1cHN0YXJ0IHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyBuYW1lICsgJyBzdG9wXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy9ldGMvaW5pdC8nICsgbmFtZSArICcuY29uZicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIGNvdWxkIG5vdCBiZSB1bmluc3RhbGxlZCcsIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgdHlwZTogcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuVEVSTSB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0b3AgJyArIG5hbWUgKyAnLnNlcnZpY2VcbicpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIGRpc2FibGUgJyArIG5hbWUgKyAnLnNlcnZpY2VcbicpOwogICAgICAgICAgICAgICAgICAgIHRoaXMu", 16000); - memcpy_s(_servicemanager + 128000, 4772, "X3VwZGF0ZS5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSkgeyByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgdW5pbnN0YWxsZWQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHVua25vd24gcGxhdGZvcm0gc2VydmljZSB0eXBlCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3QnKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgc3RvcCAnICsgbmFtZSArICdcbicpOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCB1bmxvYWQgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3RcbicpOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgbmFtZSArICcucGxpc3QnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciB1bmluc3RhbGxpbmcgc2VydmljZTogJyArIG5hbWUgKyAnID0+ICcgKyBlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnJtZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdTZXJ2aWNlOiAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQogICAgICAgIHsKICAgICAgICAgICAgc2VydmljZS5zdG9wKCk7CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlLmFwcExvY2F0aW9uKCkpOwogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZS5yYyk7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnJtZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgeyB9CiAgICAgICAgfQogICAgfQogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgewogICAgICAgIHRoaXMuZ2V0U2VydmljZVR5cGUgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlVHlwZSgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcGxhdGZvcm0gPSByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5nZXRQcm9jZXNzSW5mbygxKS5OYW1lOwogICAgICAgICAgICBpZiAocGxhdGZvcm0gPT0gImJ1c3lib3giKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzIC1heCAtbyBwaWQgLW8gY29tbWFuZCB8IGF3ayAneyBpZigkMT09XCIxXCIpIHsgJDE9XCJcIjsgc3BsaXQoJDAsIHJlcywgXCIgXCIpOyBwcmludCByZXNbMl07IH19J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgcGxhdGZvcm0gPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGxhdGZvcm0gPT0gJ2luaXQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdCcpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3Vwc3RhcnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAocGxhdGZvcm0pOwogICAgICAgIH07CiAgICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gc2VydmljZU1hbmFnZXI7Cm1vZHVsZS5leHBvcnRzLm1hbmFnZXIgPSBuZXcgc2VydmljZU1hbmFnZXIoKTsKCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQp7CiAgICBtb2R1bGUuZXhwb3J0cy5nZXRPU1ZlcnNpb24gPSBnZXRPU1ZlcnNpb247Cn0K", 4772); - ILibBase64DecodeEx((unsigned char*)_servicemanager, 132772, (unsigned char*)_servicemanager + 132772); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "service-manager"); duk_push_string(ctx, _servicemanager + 132772); + char *_servicemanager = ILibMemory_Allocate(232554, 0, NULL, NULL); + memcpy_s(_servicemanager + 0, 132888, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7CgoKZnVuY3Rpb24gZXh0cmFjdEZpbGVOYW1lKGZpbGVQYXRoKQp7CiAgICBpZiAodHlwZW9mIChmaWxlUGF0aCkgPT0gJ3N0cmluZycpCiAgICB7CiAgICAgICAgdmFyIHRva2VucyA9IGZpbGVQYXRoLnNwbGl0KCdcXCcpLmpvaW4oJy8nKS5zcGxpdCgnLycpOwogICAgICAgIHZhciBuYW1lOwoKICAgICAgICB3aGlsZSAoKG5hbWUgPSB0b2tlbnMucG9wKCkpID09ICcnKTsKICAgICAgICByZXR1cm4gKG5hbWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldHVybihmaWxlUGF0aC5uZXdOYW1lKQogICAgfQp9CmZ1bmN0aW9uIGV4dHJhY3RGaWxlU291cmNlKGZpbGVQYXRoKQp7CiAgICByZXR1cm4gKHR5cGVvZiAoZmlsZVBhdGgpID09ICdzdHJpbmcnID8gZmlsZVBhdGggOiBmaWxlUGF0aC5zb3VyY2UpOwp9CgpmdW5jdGlvbiBwYXJzZVNlcnZpY2VTdGF0dXModG9rZW4pCnsKICAgIHZhciBqID0ge307CiAgICB2YXIgc2VydmljZVR5cGUgPSB0b2tlbi5EZXJlZigwLCA0KS5JbnRWYWw7CiAgICBqLmlzRmlsZVN5c3RlbURyaXZlciA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKTsKICAgIGouaXNLZXJuZWxEcml2ZXIgPSAoKHNlcnZpY2VUeXBlICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSk7CiAgICBqLmlzU2hhcmVkUHJvY2VzcyA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKTsKICAgIGouaXNPd25Qcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApOwogICAgai5pc0ludGVyYWN0aXZlID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApOwogICAgai53YWl0SGludCA9IHRva2VuLkRlcmVmKCg2ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBzd2l0Y2ggKHRva2VuLkRlcmVmKCgxICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpCiAgICB7CiAgICAgICAgY2FzZSAweDAwMDAwMDA1OgogICAgICAgICAgICBqLnN0YXRlID0gJ0NPTlRJTlVFX1BFTkRJTkcnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDY6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUEFVU0VfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwNzoKICAgICAgICAgICAgai5zdGF0ZSA9ICdQQVVTRUQnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDQ6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUlVOTklORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMjoKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVEFSVF9QRU5ESU5HJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAwMDAwMDAzOgogICAgICAgICAgICBqLnN0YXRlID0gJ1NUT1BfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMToKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVE9QUEVEJzsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICB2YXIgY29udHJvbHNBY2NlcHRlZCA9IHRva2VuLkRlcmVmKCgyICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBqLmNvbnRyb2xzQWNjZXB0ZWQgPSBbXTsKICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApCiAgICB7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EQUREJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EUkVNT1ZFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERU5BQkxFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERElTQUJMRScpOwogICAgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwOCkgPT0gMHgwMDAwMDAwOCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BBUkFNQ0hBTkdFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMDIpID09IDB4MDAwMDAwMDIpIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QQVVTRScpOyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0NPTlRJTlVFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QUkVTSFVURE9XTicpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDA0KSA9PSAweDAwMDAwMDA0KSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0hVVERPV04nKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1NUT1AnKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAyMCkgPT0gMHgwMDAwMDAyMCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0hBUkRXQVJFUFJPRklMRUNIQU5HRScpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDQwKSA9PSAweDAwMDAwMDQwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVCcpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDgwKSA9PSAweDAwMDAwMDgwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0VTU0lPTkNIQU5HRScpOyB9CiAgICBqLnBpZCA9IHRva2VuLkRlcmVmKCg3ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICByZXR1cm4gKGopOwp9CgppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKewogICAgZnVuY3Rpb24gZ2V0T1NWZXJzaW9uKCkKICAgIHsKICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN3X3ZlcnMgfCBncmVwIFByb2R1Y3RWZXJzaW9uIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAvL2NoaWxkLnN0ZG91dC5zdHIgPSAnMTAuOSc7CgogICAgICAgIHZhciByZXQgPSB7IHJhdzogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJy4nKSwgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLnJhdy5qb2luKCcuJykpOyB9IH07CiAgICAgICAgcmV0LmNvbXBhcmVUbyA9IGZ1bmN0aW9uIGNvbXBhcmVUbyh2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmF3ID0gKHR5cGVvZiAodmFsKSA9PSAnc3RyaW5nJykgPyB2YWwuc3BsaXQoJy4nKSA6IHZhbC5yYXc7IGlmICghcmF3KSB7IHRocm93ICgnSW52YWxpZCBwYXJhbWV0ZXInKTsgfQogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMucmF3LmpvaW4oJy4nKS5zcGxpdCgnLicpOwoKICAgICAgICAgICAgdmFyIHIgPSBudWxsLCBzID0gbnVsbDsKICAgICAgICAgICAgd2hpbGUgKHNlbGYubGVuZ3RoID4gMCAmJiByYXcubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcyA9IHBhcnNlSW50KHNlbGYuc2hpZnQoKSk7IHIgPSBwYXJzZUludChyYXcuc2hpZnQoKSk7CiAgICAgICAgICAgICAgICBpZiAocyA8IHIpIHsgcmV0dXJuICgtMSk7IH0KICAgICAgICAgICAgICAgIGlmIChzID4gcikgeyByZXR1cm4gKDEpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGYubGVuZ3RoID09IHJhdy5sZW5ndGgpIHsgcmV0dXJuICgwKTsgfQogICAgICAgICAgICBpZiAoc2VsZi5sZW5ndGggPCByYXcubGVuZ3RoKSB7IHJldHVybiAoLTEpOyB9IGVsc2UgeyByZXR1cm4gKDEpOyB9ICAgIAogICAgICAgIH0KICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9OwoKCiAgICBmdW5jdGlvbiBmZXRjaFBsaXN0KGZvbGRlciwgbmFtZSwgdXNlcmlkKQogICAgewogICAgICAgIGlmIChmb2xkZXIuZW5kc1dpdGgoJy8nKSkgeyBmb2xkZXIgPSBmb2xkZXIuc3Vic3RyaW5nKDAsIGZvbGRlci5sZW5ndGggLSAxKTsgfQogICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH0sIF91aWQ6IHVzZXJpZCB9OwogICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgewogICAgICAgICAgICAvLyBCZWZvcmUgd2UgdGhyb3cgaW4gdGhlIHRvd2VsLCBsZXQncyBlbnVtZXJhdGUgYWxsIHRoZSBwbGlzdCBmaWxlcywgYW5kIHNlZSBpZiBvbmUgaGFzIGEgbWF0Y2hpbmcgbGFiZWwKICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhmb2xkZXIpOwogICAgICAgICAgICBmb3IgKHZhciBmaWxlIGluIGZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgZm9sZGVyICsgJy8nICsgZmlsZXNbZmlsZV0gKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09IG5hbWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0Lm5hbWUgPSBmaWxlc1tmaWxlXS5lbmRzV2l0aCgnLnBsaXN0JykgPyBmaWxlc1tmaWxlXS5zdWJzdHJpbmcoMCwgZmlsZXNbZmlsZV0ubGVuZ3RoIC0gNikgOiBmaWxlc1tmaWxlXTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnYWxpYXMnLCB7IHZhbHVlOiBuYW1lIH0pOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIGZpbGVzW2ZpbGVdIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXQubmFtZSA9PSBuYW1lKSB7IHRocm93ICgnICcgKyAoZm9sZGVyLnNwbGl0KCdMYXVuY2hEYWVtb24nKS5sZW5ndGg+MSA/ICdMYXVuY2hEYWVtb24nIDogJ0xhdW5jaEFnZW50JykgKyAnICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOyB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JyB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2FsaWFzJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PkxhYmVsPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2RhZW1vbicsIHsgdmFsdWU6IHJldC5wbGlzdC5zcGxpdCgnL0xhdW5jaERhZW1vbnMvJykubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZSB9KTsKCiAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyB0aGlzLnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKCiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci5lbmRzV2l0aCgnLycpID8gY2hpbGQuc3Rkb3V0LnN0ci5zdWJzdHJpbmcoMCwgY2hpbGQuc3Rkb3V0LnN0ci5sZW5ndGggLSAxKSA6IGNoaWxkLnN0ZG91dC5zdHIpOwogICAgICAgIH07CiAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gYXBwTG9jYXRpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8L3N0cmluZz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPHN0cmluZz5cIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgfTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnX3J1bkF0TG9hZCcsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzZWUgaWYgdGhpcyBpcyBhbiBBdXRvLVN0YXJ0aW5nIHNlcnZpY2UsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGltcGxlbWVudCAnc3RhcnQnCiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHJldC5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5SdW5BdExvYWQ8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiLz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPFwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09ICJUUlVFIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJfa2VlcEFsaXZlIiwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAne3NwbGl0KCQwLCBhLCBcIjxrZXk+S2VlcEFsaXZlPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjxcIik7IHNwbGl0KGJbMl0sIGMsIFwiPlwiKTsgIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIiBpZihjWzFdPT1cImRpY3RcIil7IHNwbGl0KGFbMl0sIGQsIFwiPC9kaWN0PlwiKTsgaWYoc3BsaXQoZFsxXSwgdHJ1dmFsLCBcIjx0cnVlLz5cIik+MSkgeyBzcGxpdCh0cnV2YWxbMV0sIGtuMSwgXCI8a2V5PlwiKTsgc3BsaXQoa24xWzJdLCBrbjIsIFwiPC9rZXk+XCIpOyBwcmludCBrbjJbMV07IH0gfSIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCIgZWxzZSB7IHNwbGl0KGNbMV0sIGthLCBcIi9cIik7IGlmKGthWzFdPT1cInRydWVcIikge3ByaW50IFwiQUxXQVlTXCI7fSB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICByZXQuZ2V0UElEID0gZnVuY3Rpb24gZ2V0UElEKHVpZCwgYXNTdHJpbmcpCiAgICAgICAgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIGNvbW1hbmQ7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KCiAgICAgICAgICAgIGlmIChnZXRPU1ZlcnNpb24oKS5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb21tYW5kID0gImxhdW5jaGN0bCBsaXN0IHwgZ3JlcCAnIiArIHRoaXMuYWxpYXMgKyAiJyB8IGF3ayAneyBpZigkMz09XCIiICsgdGhpcy5hbGlhcyArICJcIil7cHJpbnQgJDE7fX0nXG5leGl0XG4iOwogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1aWQgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2xhdW5jaGN0bCBwcmludCBzeXN0ZW0gfCBncmVwICInICsgdGhpcy5hbGlhcyArICciIHwgYXdrIFwneyBpZihzcGxpdCgkMCwgdG1wLCAiICIpPT0zKSB7IGlmKCQzPT0iJyArIHRoaXMuYWxpYXMgKyAnIikgeyBwcmludCAkMTsgfSB9fVwnXG5leGl0XG4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHByaW50IGd1aS8nICsgdWlkICsgJyB8IGdyZXAgIicgKyB0aGlzLmFsaWFzICsgJyIgfCBhd2sgXCd7IGlmKHNwbGl0KCQwLCB0bXAsICIgIik9PTMpIHsgaWYoJDM9PSInICsgdGhpcy5hbGlhcyArICciKSB7IHByaW50ICQxOyB9IH19XCdcbmV4aXRcbic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZShjb21tYW5kKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIGlmIChhc1N0cmluZyA9PSBudWxsIHx8IGFzU3RyaW5nICE9IHRydWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkp", 16000); + memcpy_s(_servicemanager + 16000, 116888, "OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXQuaXNMb2FkZWQgPSBmdW5jdGlvbiBpc0xvYWRlZCh1aWQpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRQSUQodWlkLCB0cnVlKSAhPSAnJyk7CiAgICAgICAgfTsKICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFBJRCh1aWQpID4gMCk7CiAgICAgICAgfTsKICAgICAgICByZXQuaXNNZSA9IGZ1bmN0aW9uIGlzTWUodWlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UElEKHVpZCkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgIH07CiAgICAgICAgcmV0LmxvYWQgPSBmdW5jdGlvbiBsb2FkKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgdmFyIHZlciA9IGdldE9TVmVyc2lvbigpOwogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSAnbG9hZCc7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KCiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYodWlkIT1udWxsIHx8IHVpZCE9MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ0xhdW5jaERhZW1vbiBtdXN0IHJ1biBhcyByb290Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodWlkID09IG51bGwpIHsgdWlkID0gc2VsZjsgfQogICAgICAgICAgICAgICAgaWYodmVyLmNvbXBhcmVUbygnMTAuMTAnKSA8IDAgJiYgdWlkICE9IHNlbGYgJiYgc2VsZiAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnT24gdGhpcyB2ZXJzaW9uIG9mIE1hY09TLCBtdXN0IGJlIHJvb3QgdG8gbG9hZCB0aGlzIHNlcnZpY2UgaW50byB0aGUgc3BlY2lmaWVkIHVzZXIgc3BhY2UnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZlci5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7IHVpZDogdWlkIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdib290c3RyYXAgZ3VpLycgKyB1aWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCAnICsgY29tbWFuZCArICcgJyArIHRoaXMucGxpc3QgKyAnXG5cZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgfTsKICAgICAgICByZXQudW5sb2FkID0gZnVuY3Rpb24gdW5sb2FkKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IG51bGw7CiAgICAgICAgICAgIHZhciB2ID0gZ2V0T1NWZXJzaW9uKCk7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHZhciB1c2VCb290b3V0ID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KCiAgICAgICAgICAgIGlmKHVpZCE9bnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKCcxMC4xMCcpIDw9IDAgJiYgc2VsZiA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG11c3Qgc3dpdGNoIHRvIHVzZXIgY29udGV4dCB0byB1bmxvYWQgdGhlIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0geyB1aWQ6IHVpZCB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKHYuY29tcGFyZVRvKCcxMC4xMCcpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlbGYgPT0gMCB8fCBzZWxmID09IHVpZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGJvb3RvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdWZmaWNpZW50IGFjY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdOZWVkcyBlbGV2YXRlZCBwcml2aWxlZ2VzJykKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiA9PSB1aWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgdW5sb2FkLCBiZWN1YXNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCBjb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VCb290b3V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN1ZmZpY2llbnQgYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoc2VsZiA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKHYuY29tcGFyZVRvKCcxMC4xMCcpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBib290b3V0CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHVubG9hZAogICAgICAgICAgICAgICAgICAgICAgICB1c2VCb290b3V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIEluc3VmZmljaWVudCBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgb3B0aW9ucyk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgaWYgKHVzZUJvb3RvdXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgYm9vdG91dCBndWkvJyArIHVpZCArICcgJyArIHRoaXMucGxpc3QgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgdW5sb2FkICcgKyB0aGlzLnBsaXN0ICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICB9OwogICAgICAgIHJldC5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgc2VsZiA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPT0gbnVsbCkgeyB1aWQgPSBzZWxmOyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmID09IDApIHsgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA+IDAgJiYgc2VsZiAhPSAwICYmIHVpZCAhPSBzZWxmKSB7IHRocm93ICgnQ2Fubm90IHN0YXJ0IExhdW5jaEFnZW50IGludG8gYW5vdGhlciB1c2VyIGRvbWFpbiB3aGlsZSBub3Qgcm9vdCcpOyB9CiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbiAmJiBzZWxmICE9IDApIHsgdGhyb3cgKCdDYW5ub3Qgc3RhcnQgTGF1bmNoRGFlbW9uIHdoaWxlIG5vdCByb290Jyk7IH0KCiAgICAgICAgICAgIHRoaXMubG9hZCh1aWQpOwoKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0YXJ0ICcgKyB0aGlzLmFsaWFzICsgJ1xuXGV4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgIH07CiAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgc2VsZiA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPT0gbnVsbCkgeyB1aWQgPSBzZWxmOyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmID09IDApIHsgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA+IDAgJiYgc2VsZiAhPSAwICYmIHVpZCAhPSBzZWxmKSB7IHRocm93ICgnQ2Fubm90IHN0b3AgTGF1bmNoQWdlbnQgaW4gYW5vdGhlciB1c2VyIGRvbWFpbiB3aGlsZSBub3Qgcm9vdCcpOyB9CiAgICAgICAgICAgIGlmICh0aGlzLmRhZW1vbiAmJiBzZWxmICE9IDApIHsgdGhyb3cgKCdDYW5ub3Qgc3RvcCBMYXVuY2hEYWVtb24gd2hpbGUgbm90IHJvb3QnKTsgfQoKICAgICAgICAgICAgaWYgKCEodGhpcy5fa2VlcEFsaXZlID09ICdDcmFzaGVkJyB8fCB0aGlzLl9rZWVwQWxpdmUgPT0gJycpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHVubG9hZCB0aGUgc2VydmljZSwgcmF0aGVyIHRoYW4gc3RvcHBpbmcgaXQsIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0J2xsIGxpa2VseSByZXN0YXJ0CiAgICAgICAgICAgICAgICB0aGlzLnVubG9hZCh1aWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0b3AgJyArIHRoaXMuYWxpYXMgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCh1aWQpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9CiAgICAgICAgICAgIGlmIChnZXRPU1ZlcnNpb24oKS5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCk7IH0KICAgICAgICAgICAgICAgIHZhciBjb21tYW5kID0gJ2xhdW5jaGN0bCB1bmxvYWQgJyArIHRoaXMucGxpc3QgKyAnXG5sYXVuY2hjdGwgbG9hZCAnICsgdGhpcy5wbGlzdCArICdcbmxhdW5jaGN0bCBzdGFydCAnICsgdGhpcy5hbGlhcyArICdcbmV4aXRcbic7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgZGV0YWNoZWQ6IHRydWUsIHVpZDogdWlkIH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGNvbW1hbmQpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjb21tYW5kID0gdGhpcy5kYWVtb24gPyAoJ3N5c3RlbS8nICsgdGhpcy5hbGlhcykgOiAoJ2d1aS8nICsgKHVpZCAhPSBudWxsID8gdWlkIDogcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKSkgKyAnLycgKyB0aGlzLmFsaWFzKTsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBraWNrc3RhcnQgLWsgJyArIGNvbW1hbmQgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07Cn0KCgoKZnVuY3Rpb24gc2VydmljZU1hbmFnZXIoKQp7CiAgICB0aGlzLl9PYmplY3RJRCA9ICdzZXJ2aWNlLW1hbmFnZXInOwogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykgCiAgICB7CiAgICAgICAgdGhpcy5HTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgIHRoaXMucHJveHkgPSB0aGlzLkdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnT3BlblNDTWFuYWdlckEnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnRW51bVNlcnZpY2VzU3RhdHVzRXhXJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ09wZW5TZXJ2aWNlVycpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdRdWVyeVNlcnZpY2VTdGF0dXNFeCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdRdWVyeVNlcnZpY2VDb25maWdBJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZUNvbmZpZzJBJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NvbnRyb2xTZXJ2aWNlJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1N0YXJ0U2VydmljZUEnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ2xvc2VTZXJ2aWNlSGFuZGxlJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NyZWF0ZVNlcnZpY2VXJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NoYW5nZVNlcnZpY2VDb25maWcyVycpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdEZWxldGVTZXJ2aWNlJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0FsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdDaGVja1Rva2VuTWVtYmVyc2hpcCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7CgogICAgICAgIHRoaXMucHJveHkyID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7CiAgICAgICAgdGhpcy5wcm94eTIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKCiAgICAgICAgdGhpcy5pc0FkbWluID0gZnVuY3Rpb24gaXNBZG1pbigpIHsKICAgICAgICAgICAgdmFyIE5UQXV0aG9yaXR5ID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg2KTsKICAgICAgICAgICAgTlRBdXRob3JpdHkudG9CdWZmZXIoKS53cml0ZUludDgoNSwgNSk7CiAgICAgICAgICAgIHZhciBBZG1pbmlzdHJhdG9yc0dyb3VwID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBhZG1pbiA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKE5UQXV0aG9yaXR5LCAyLCAzMiwgNTQ0LCAwLCAwLCAwLCAwLCAwLCAwLCBBZG1pbmlzdHJhdG9yc0dyb3VwKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIG1lbWJlciA9IHRoaXMuR00uQ3JlYXRlSW50ZWdlcigpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hlY2tUb2tlbk1lbWJlcnNoaXAoMCwgQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpLCBtZW1iZXIpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSAhPSAwKSB7IGFkbWluID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wcm94eS5GcmVlU2lkKEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFkbWluOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRQcm9ncmFtRm9sZGVyID0gZnVuY3Rpb24gZ2V0UHJvZ3JhbUZvbGRlcigpCiAgICAgICAgewogICAgICAgICAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIDY0IGJpdCBXaW5kb3dzCiAgICAgICAgICAgICAgICBpZiAodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnUHJvZ3JhbUZpbGVzKHg4NiknXTsgICAgLy8gMzIgQml0IEFwcAogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlsnUHJvZ3JhbUZpbGVzJ107ICAgICAgICAgICAgIC8vIDY0IGJpdCBBcHAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gMzIgYml0IFdpbmRvd3MKICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMnXTsgICAgICAgICAgICAgICAgIAogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRTZXJ2aWNlRm9sZGVyID0gZnVuY3Rpb24gZ2V0U2VydmljZUZvbGRlcigpIHsgcmV0dXJuIHRoaXMuZ2V0UHJvZ3JhbUZvbGRlcigpICsgJ1xcbWVzaCc7IH07CgogICAgICAgIHRoaXMuZW51bWVyYXRlU2VydmljZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG1hY2hpbmVOYW1lID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBkYk5hbWUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAxIHwgMHgwMDA0KTsKCiAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgc2VydmljZXNSZXR1cm5lZCA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgcmVzdW1lSGFuZGxlID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIC8vdmFyIHNlcnZpY2VzID0gdGhpcy5wcm94eS5DcmVhdGVWYXJpYWJsZSgyNjIxNDQpOwogICAgICAgICAgICB2YXIgc3VjY2VzcyA9IHRoaXMucHJveHkuRW51bVNlcnZpY2VzU3RhdHVzRXhXKGhhbmRsZSwgMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAwMywgMHgwMCwgMHgwMCwgYnl0ZXNOZWVkZWQsIHNlcnZpY2VzUmV0dXJuZWQsIHJlc3VtZUhhbmRsZSwgMHgwMCk7CgogICAgICAgICAgICB2YXIgcHRyU2l6ZSA9IGRiTmFtZS5fc2l6ZTsKICAgICAgICAgICAgdmFyIHN6ID0gYnl0ZXNOZWVkZWQuRGVyZWYoMCwgZGJOYW1lLl9zaXplKS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOwoKICAgICAgICAgICAgaWYgKHN6IDwgMCkgeyB0aHJvdyAoJ2Vycm9yIGVudW1lcmF0aW5nIHNlcnZpY2VzJyk7IH0KCiAgICAgICAgICAgIHZh", 16000); + memcpy_s(_servicemanager + 32000, 100888, "ciBzZXJ2aWNlcyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoc3opOwogICAgICAgICAgICB0aGlzLnByb3h5LkVudW1TZXJ2aWNlc1N0YXR1c0V4VyhoYW5kbGUsIDAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMDMsIHNlcnZpY2VzLCBzeiwgYnl0ZXNOZWVkZWQsIHNlcnZpY2VzUmV0dXJuZWQsIHJlc3VtZUhhbmRsZSwgMHgwMCk7CgogICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gMzYgKyAoMiAqIHB0clNpemUpOwogICAgICAgICAgICBibG9ja1NpemUgKz0gKChwdHJTaXplIC0gKGJsb2NrU2l6ZSAlIHB0clNpemUpKSAlIHB0clNpemUpOwogICAgICAgICAgICB2YXIgcmV0VmFsID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZXNSZXR1cm5lZC5EZXJlZigwLCBkYk5hbWUuX3NpemUpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7ICsraSkKewogICAgICAgICAgICAgICAgdmFyIHRva2VuID0gc2VydmljZXMuRGVyZWYoaSAqIGJsb2NrU2l6ZSwgYmxvY2tTaXplKTsKICAgICAgICAgICAgICAgIHZhciBqID0ge307CiAgICAgICAgICAgICAgICBqLm5hbWUgPSB0b2tlbi5EZXJlZigwLCBwdHJTaXplKS5EZXJlZigpLldpZGUyVVRGODsKICAgICAgICAgICAgICAgIGouZGlzcGxheU5hbWUgPSB0b2tlbi5EZXJlZihwdHJTaXplLCBwdHJTaXplKS5EZXJlZigpLldpZGUyVVRGODsKICAgICAgICAgICAgICAgIGouc3RhdHVzID0gcGFyc2VTZXJ2aWNlU3RhdHVzKHRva2VuLkRlcmVmKDIgKiBwdHJTaXplLCAzNikpOwogICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goaik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiAobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUobmFtZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICB2YXIgcHRyID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUocHRyLl9zaXplKTsKICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAxIHwgMHgwMDA0IHwgMHgwMDIwIHwgMHgwMDEwKTsKICAgICAgICAgICAgaWYgKGhhbmRsZS5WYWwgPT0gMCkgeyB0aHJvdyAoJ2NvdWxkIG5vdCBvcGVuIFNlcnZpY2VNYW5hZ2VyJyk7IH0KICAgICAgICAgICAgdmFyIGggPSB0aGlzLnByb3h5Lk9wZW5TZXJ2aWNlVyhoYW5kbGUsIHNlcnZpY2VOYW1lLCAweDAwMDEgfCAweDAwMDQgfCAweDAwMjAgfCAweDAwMTAgfCAweDAwMDEwMDAwKTsKICAgICAgICAgICAgaWYgKGguVmFsICE9IDApDQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgcmV0VmFsID0geyBfT2JqZWN0SUQ6ICdzZXJ2aWNlLW1hbmFnZXIuc2VydmljZScgfQogICAgICAgICAgICAgICAgcmV0VmFsLl9zY20gPSBoYW5kbGU7CiAgICAgICAgICAgICAgICByZXRWYWwuX3NlcnZpY2UgPSBoOwogICAgICAgICAgICAgICAgcmV0VmFsLl9HTSA9IHRoaXMuR007CiAgICAgICAgICAgICAgICByZXRWYWwuX3Byb3h5ID0gdGhpcy5wcm94eTsKICAgICAgICAgICAgICAgIHJldFZhbC5fcHJveHkyID0gdGhpcy5wcm94eTI7CiAgICAgICAgICAgICAgICByZXRWYWwubmFtZSA9IG5hbWU7CgogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ3N0YXR1cycsIAogICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZXNOZWVkZWQgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSh0aGlzLl9HTS5Qb2ludGVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm94eS5RdWVyeVNlcnZpY2VTdGF0dXNFeCh0aGlzLl9zZXJ2aWNlLCAwLCAwLCAwLCBieXRlc05lZWRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3QgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZShieXRlc05lZWRlZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm94eS5RdWVyeVNlcnZpY2VTdGF0dXNFeCh0aGlzLl9zZXJ2aWNlLCAwLCBzdCwgc3QuX3NpemUsIGJ5dGVzTmVlZGVkKS5WYWwgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHBhcnNlU2VydmljZVN0YXR1cyhzdCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHsgc3RhdGU6ICdVTktOT1dOJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAocmV0VmFsLnN0YXR1cy5zdGF0ZSAhPSAnVU5LTk9XTicpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0VmFsKTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2xvc2UgPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fc2VydmljZSAmJiB0aGlzLl9zY20pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5LkNsb3NlU2VydmljZUhhbmRsZSh0aGlzLl9zZXJ2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5LkNsb3NlU2VydmljZUhhbmRsZSh0aGlzLl9zY20pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZSA9IHRoaXMuX3NjbSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldFZhbC5vbignficsIHJldFZhbC5jbG9zZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KHRoaXMuc3RhdHVzLnBpZCkgPT0gcHJvY2Vzcy5waWQpOw0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFwcExvY2F0aW9uID0gZnVuY3Rpb24gKCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlUGF0aCA9IHJlZy5RdWVyeUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIHRoaXMubmFtZSwgJ0ltYWdlUGF0aCcpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBpbWFnZVBhdGguc3BsaXQoJy5leGUnKVswXSArICcuZXhlJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5zdGFydHNXaXRoKCciJykpIHsgcmV0ID0gcmV0LnN1YnN0cmluZygxKTsgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuYXBwTG9jYXRpb24oKS5zcGxpdCgnXFwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRva2Vucy5qb2luKCdcXCcpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldFZhbC5pc1J1bm5pbmcgPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnN0YXR1cy5zdGF0ZSA9PSAnUlVOTklORycpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHJldFZhbC5fc3RvcEV4ID0gZnVuY3Rpb24ocywgcCkKICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHMuc3RhdHVzLnN0YXRlOw0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50KQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NUT1BQRUQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9yZXMoJ1NUT1BQRUQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1RPUF9QRU5ESU5HJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5fZWxhcHNlZFRpbWUgPSBEYXRlLm5vdygpIC0gcC5fc3RhcnRUaW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5fZWxhcHNlZFRpbWUgPCAxMDAwMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50aW1lciA9IHNldFRpbWVvdXQocy5fc3RvcEV4LCBwLl93YWl0VGltZSwgcywgcCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9yZWooJ3RpbWVvdXQgd2FpdGluZyBmb3Igc2VydmljZSB0byBzdG9wJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5fcmVqKCdVbmV4cGVjdGVkIHN0YXRlOiAnICsgY3VycmVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldFZhbC5zdG9wID0gZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLnN0YXRlID09ICdSVU5OSU5HJykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIFNlcnZpY2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3c3RhdGUgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSgzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVhc29uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fcHJveHkuQ29udHJvbFNlcnZpY2UodGhpcy5fc2VydmljZSwgMHgwMDAwMDAwMSwgbmV3c3RhdGUpLlZhbCA9PSAwICYmIChyZWFzb24gPSB0aGlzLl9wcm94eTIuR2V0TGFzdEVycm9yKCkuVmFsKSE9MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWoodGhpcy5uYW1lICsgJy5zdG9wKCkgZmFpbGVkIHdpdGggZXJyb3I6ICcgKyByZWFzb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byBzZXR1cCBhIHRpbWVkIGNhbGxiYWNrIHRvIGNoZWNrIHRoZSBzdGF0dXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9zdGFydFRpbWUgPSBEYXRlLm5vdygpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX2VsYXBzZWRUaW1lID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll93YWl0VGltZSA9IHN0YXR1cy53YWl0SGludCAvIDEwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0Ll93YWl0VGltZSA8IDUwMCkgeyByZXQuX3dhaXRUaW1lID0gNTAwOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuX3dhaXRUaW1lID4gNTAwMCkgeyByZXQuX3dhaXRUaW1lID0gNTAwMDsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQudGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX3N0b3BFeCwgcmV0Ll93YWl0VGltZSwgdGhpcywgcmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ2Nhbm5vdCBjYWxsICcgKyB0aGlzLm5hbWUgKyAnLnN0b3AoKSwgd2hlbiBjdXJyZW50IHN0YXRlIGlzOiAnICsgdGhpcy5zdGF0dXMuc3RhdGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldFZhbC5zdGFydCA9IGZ1bmN0aW9uICgpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cy5zdGF0ZSA9PSAnU1RPUFBFRCcpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSB0aGlzLl9wcm94eS5TdGFydFNlcnZpY2VBKHRoaXMuX3NlcnZpY2UsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICh0aGlzLm5hbWUgKyAnLnN0YXJ0KCkgZmFpbGVkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdjYW5ub3QgY2FsbCAnICsgdGhpcy5uYW1lICsgJy5zdGFydCgpLCB3aGVuIGN1cnJlbnQgc3RhdGUgaXM6ICcgKyB0aGlzLnN0YXR1cy5zdGF0ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdGFydCA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHJlc3RhcnQgb3Vyc2VsdmVzIG9uIFdpbmRvd3MsIHdlIG11c3Qgc3Bhd24gYSBkZXRhY2hlZCBjaGlsZCBwcm9jZXNzLCBiZWN1YXNlIHdlIG5lZWQgdG8gY2FsbCBzdGFydCwgb25jZSB3ZSBhcmUgc3RvcHBlZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZXhlY1BhdGgsIFtwcm9jZXNzLmV4ZWNQYXRoLnNwbGl0KCdcXCcpLnBvcCgpLCAnLWV4ZWMgIicgKyAicmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKCciICsgdGhpcy5uYW1lICsgIicpLnJlc3RhcnQoKS5maW5hbGx5KGZ1bmN0aW9uKCl7cHJvY2Vzcy5leGl0KCk7fSk7IiArICciJ10sIHsgdHlwZTogNCwgZGV0YWNoZWQ6IHRydWUgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLnN0b3AoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0YXJ0cCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX2EgPSBhOyB0aGlzLl9yID0gcjsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXJ2aWNlID0gdGhpczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnRoZW4oZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc3RhcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydHAuX3IoZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydHAuX2EoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgeyBjb25zb2xlLnJhd0xvZygnc3RvcCgpIGZhaWxlZCA9PiAnICsgZS50b1N0cmluZygpKTt9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHAuc3RhcnRwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHkuUXVlcnlTZXJ2aWNlQ29uZmlnQShoLCAwLCAwLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQpOwogICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlfc2VydmljZV9jb25maWdhID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMucHJveHkuUXVlcnlTZXJ2aWNlQ29uZmlnQShoLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2EsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYS5fc2l6ZSwgcXVlcnlfc2VydmljZV9jb25maWdhX0RXT1JEKS5WYWwgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHF1ZXJ5X3NlcnZpY2VfY29uZmlnYS5EZXJlZih0aGlzLkdNLlBvaW50ZXJTaXplID09IDQgPyAyOCA6IDQ4LCB0aGlzLkdNLlBvaW50ZXJTaXplKS5EZXJlZigpLlN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICd1c2VyJywgeyB2YWx1ZTogdmFsIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWx1cmVhY3Rpb25zID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg4MTkyKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYm5lZWRlZCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCk7ICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWcyQShoLCAyLCBmYWlsdXJlYWN0aW9ucywgODE5MiwgYm5lZWRlZCkuVmFsICE9IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY0FjdGlvbnMgPSBmYWlsdXJlYWN0aW9ucy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSh0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAyNCA6IDEyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5yZXNldFBlcmlvZCA9IGZhaWx1cmVhY3Rpb25zLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGFjdCA9IDAgOyBhY3QgPCBjQWN0aW9uczsgKythY3QpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBmYWlsdXJlYWN0aW9ucy5EZXJlZih0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDE2LCB0aGlzLkdNLlBvaW50ZXJTaXplKS5EZXJlZigpLkRlcmVmKGFjdCo4LDgpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYWN0aW9uLnJlYWRVSW50MzJMRSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdOT05FJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ1NFUlZJQ0VfUkVTVEFSVCcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdSRUJPT1QnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ09USEVSJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9", 16000); + memcpy_s(_servicemanager + 48000, 84888, "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wZWVrKCkuZGVsYXkgPSBhY3Rpb24ucmVhZFVJbnQzMkxFKDQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgdGhyb3cgKCdjb3VsZCBub3QgZmluZCBzZXJ2aWNlOiAnICsgbmFtZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vIExpbnV4LCBNYWNPUywgRnJlZUJTRAoKICAgICAgICB0aGlzLmlzQWRtaW4gPSBmdW5jdGlvbiBpc0FkbWluKCkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5pc1Jvb3QoKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlKG5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWV9OwogICAgICAgICAgICAgICAgaWYocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL3JjLmQvJyArIG5hbWUpKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncmMnLCB7IHZhbHVlOiAnL2V0Yy9yYy5kLycgKyBuYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZihyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG5hbWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdyYycsIHsgdmFsdWU6ICcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBuYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnU2VydmljZTogJyArIG5hbWUgKyAnIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uID0gZnVuY3Rpb24gZGVzY3JpcHRpb24oKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucmMgKyAiIHwgZ3JlcCBkZXNjPSB8IGF3ayAtRj0gJyIgKyAneyBpZigkMT09ImRlc2MiKSB7ICQxPSIiOyBhPXNwbGl0KCQwLCByZXMsICJcXCIiKTsgaWYoYT4xKSB7IHByaW50IHJlc1syXTsgfSBlbHNlIHsgcHJpbnQgJDA7IH0gfSB9XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0OwogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucmMgKyAiIHwgZ3JlcCAiICsgdGhpcy5uYW1lICsgIl9jaGRpcj0gfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nIHwgYXdrIC1GXFxcIiAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgaWYocmV0ID09ICcnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5yYy5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgICAgICAgICByZXQucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKCQkgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGNvbW1hbmQ9IHwgYXdrIC1GPSAneyBwcmludCAkMiB9JyB8IGF3ayAtRlxcXCIgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgkJICAgICAgICAgICAgdmFyIHRtcCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCcke25hbWV9Jykuam9pbih0aGlzLm5hbWUpOwoJCSAgICAgICAgICAgIGlmKHRtcD09Jy91c3Ivc2Jpbi9kYWVtb24nKQoJCSAgICAgICAgICAgIHsKCQkJICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwoJCQkgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CgkJCSAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgJyArIHRoaXMucmMgKyAnIHwgZ3JlcCBjb21tYW5kX2FyZ3M9IHwgYXdrIC1GIi1mICIgXCd7ICQxPSIiOyBzcGxpdCgkMCwgcmVzLCAiXFwiIik7IHNwbGl0KHJlc1sxXSwgdCwgIiAiKTsgcHJpbnQgdFsxXTsgfVwnXG5leGl0XG4nKTsKCQkJICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCQkJICAgICAgICAgICAgcmV0dXJuKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgIAkJICAgICAgICB9CgkJICAgICAgICAgICAgZWxzZQoJCSAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CgkJICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0YXR1cyB8IGF3ayAneyBwcmludCAkMyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICdydW5uaW5nJyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVzdGF0dXMgfCBhd2sgJ3sgc3BsaXQoJDYsIHJlcywgXCIuXCIpOyBwcmludCByZXNbMV07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID09IHByb2Nlc3MucGlkKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0b3BcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0YXJ0XG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lcmVzdGFydFxuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSkgeyByZXR1cm4gKGZldGNoUGxpc3QoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMnLCBuYW1lKSk7IH07CiAgICAgICAgICAgIHRoaXMuZ2V0TGF1bmNoQWdlbnQgPSBmdW5jdGlvbiBnZXRMYXVuY2hBZ2VudChuYW1lLCB1c2VyaWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1c2VyaWQgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZldGNoUGxpc3QoJy9MaWJyYXJ5L0xhdW5jaEFnZW50cycsIG5hbWUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZldGNoUGxpc3QocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHVzZXJpZCkpICsgJy9MaWJyYXJ5L0xhdW5jaEFnZW50cycsIG5hbWUsIHVzZXJpZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiAobmFtZSwgcGxhdGZvcm0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghcGxhdGZvcm0pIHsgcGxhdGZvcm0gPSB0aGlzLmdldFNlcnZpY2VUeXBlKCk7IH0KICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH19OwogICAgICAgICAgICAgICAgc3dpdGNoKHBsYXRmb3JtKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpIHsgcGxhdGZvcm0gPSAnaW5pdCc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJykpIHsgcGxhdGZvcm0gPSAndXBzdGFydCc7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwbGF0Zm9ybSA9PSAnaW5pdCcgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQuZC8nICsgbmFtZSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxhdGZvcm0gPT0gJ3Vwc3RhcnQnICYmIHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LycgKyBuYW1lICsgJy5jb25mJykpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVzY3JpcHRpb24ucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQvIiArIHRoaXMubmFtZSArICIuY29uZiB8IGdyZXAgZGVzY3JpcHRpb24gfCBhd2sgJyIgKyAneyBpZigkMT09ImRlc2NyaXB0aW9uIikgeyAkMT0iIjsgYT1zcGxpdCgkMCwgcmVzLCAiXFwiIik7IGlmKGE+MSkgeyBwcmludCByZXNbMl07IH0gZWxzZSB7IHByaW50ICQwOyB9fX1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwIFNob3J0LURlc2NyaXB0aW9uOiB8IGF3ayAnIiArICd7IGlmKCQyPT0iU2hvcnQtRGVzY3JpcHRpb246IikgeyAkMT0iIjsgJDI9IiI7IHByaW50ICQwOyB9fVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcFdvcmtpbmdEaXJlY3RvcnkgPSBmdW5jdGlvbiBhcHBXb3JraW5nRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwcFdvcmtpbmdEaXJlY3RvcnkucGxhdGZvcm0gPT0gJ2luaXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQuZC8iICsgdGhpcy5uYW1lICsgIiB8IGdyZXAgJ1NDUklQVD0nIHwgYXdrIC1GPSAneyBsZW49c3BsaXQoJDIsIGEsIFwiL1wiKTsgcHJpbnQgc3Vic3RyKCQyLDAsbGVuZ3RoKCQyKS1sZW5ndGgoYVtsZW5dKSk7IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQvIiArIHRoaXMubmFtZSArICIuY29uZiB8IGdyZXAgJ2NoZGlyICcgfCBhd2sgJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeS5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcExvY2F0aW9uID0gZnVuY3Rpb24gYXBwTG9jYXRpb24oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhcHBMb2NhdGlvbi5wbGF0Zm9ybSA9PSAnaW5pdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC5kLyIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnU0NSSVBUPScgfCBhd2sgLUY9ICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LyIgKyB0aGlzLm5hbWUgKyAiLmNvbmYgfCBncmVwICdleGVjICcgfCBhd2sgJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24ucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01lLnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpbml0Y3RsIHN0YXR1cyAiICsgdGhpcy5uYW1lICsgIiB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDR9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIHN0YXR1cyB8IGF3ayAne3ByaW50ICQyfScgfCBhd2sgLUYsICd7cHJpbnQgJDR9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg", 16000); + memcpy_s(_servicemanager + 64000, 68888, "cmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnVubmluZy5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiaW5pdGN0bCBzdGF0dXMgIiArIHRoaXMubmFtZSArICIgfCBhd2sgJ3twcmludCAkMn0nIHwgYXdrIC1GLCAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBzdGF0dXMgfCBhd2sgJ3twcmludCAkMn0nIHwgYXdrIC1GLCAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ3N0YXJ0L3J1bm5pbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0LnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RhcnRcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydC5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcC5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW5pdGN0bCBzdG9wICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RvcFxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RhcnQucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2luaXRjdGwgcmVzdGFydCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHJlc3RhcnRcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0LnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzID0gZnVuY3Rpb24gc3RhdHVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5fc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuX3N0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXR1cyAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHN0YXR1c1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuX3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0YXR1cy5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHBsYXRmb3JtICsgJyBTZXJ2aWNlICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uID0gZnVuY3Rpb24gZGVzY3JpcHRpb24oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCcgfCBncmVwIERlc2NyaXB0aW9uPSB8IGF3ayAtRj0gXCd7IGlmKCQxPT0iRGVzY3JpcHRpb24iKSB7ICQxPSIiOyBwcmludCAkMDsgfX1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBXb3JraW5nRGlyZWN0b3J5ID0gZnVuY3Rpb24gYXBwV29ya2luZ0RpcmVjdG9yeSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIHRoaXMubmFtZSArICcuc2VydmljZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2xpYi9zeXN0ZW1kL3N5c3RlbS8iICsgdGhpcy5uYW1lICsgIi5zZXJ2aWNlIHwgZ3JlcCAnV29ya2luZ0RpcmVjdG9yeT0nIHwgYXdrIC1GPSAneyBwcmludCAkMiB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8iICsgdGhpcy5uYW1lICsgIi5zZXJ2aWNlIHwgZ3JlcCAnV29ya2luZ0RpcmVjdG9yeT0nIHwgYXdrIC1GPSAneyBwcmludCAkMiB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIHRoaXMubmFtZSArICcuc2VydmljZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdFeGVjU3RhcnQ9JyB8IGF3ayAtRj0gJ3sgc3BsaXQoJDIsIGEsIFwiIFwiKTsgcHJpbnQgYVsxXSB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdFeGVjU3RhcnQ9JyB8IGF3ayAtRj0gJ3sgc3BsaXQoJDIsIGEsIFwiIFwiKTsgcHJpbnQgYVsxXSB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzeXN0ZW1jdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnTWFpbiBQSUQ6JyB8IGF3ayAne3ByaW50ICQzfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic3lzdGVtY3RsIHN0YXR1cyAiICsgdGhpcy5uYW1lICsgIiB8IGdyZXAgJ0FjdGl2ZTonIHwgYXdrICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICdhY3RpdmUnKTsgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0b3AgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgcmVzdGFydCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzID0gZnVuY3Rpb24gc3RhdHVzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Ll9zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5fc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhdHVzICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0Ll9zdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChwbGF0Zm9ybSArICcgU2VydmljZSAoJyArIG5hbWUgKyAnKSBOT1QgRk9VTkQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg", 16000); + memcpy_s(_servicemanager + 80000, 52888, "ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ1Vua25vd24gU2VydmljZSBQbGF0Zm9ybTogJyArIHBsYXRmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHRoaXMuZW51bWVyYXRlU2VydmljZSA9IGZ1bmN0aW9uIChvcHRpb25zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHBhdGhzID0gW107CiAgICAgICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdsaW51eCc6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKChvcHRpb25zICYmIG9wdGlvbnMucGxhdGZvcm1UeXBlKT9vcHRpb25zLnBsYXRmb3JtVHlwZSA6IHRoaXMuZ2V0U2VydmljZVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2V0Yy9pbml0LmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9ldGMvaW5pdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2xpYi9zeXN0ZW1kL3N5c3RlbScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9ldGMvcmMuZCcpOwogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy91c3IvbG9jYWwvZXRjL3JjLmQnKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucycpOwogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9TeXN0ZW0vTGlicmFyeS9MYXVuY2hEYWVtb25zJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBwYXRocykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhwYXRoc1tpXSk7CiAgICAgICAgICAgICAgICBmb3IodmFyIGogaW4gZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsaW51eCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChvcHRpb25zICYmIG9wdGlvbnMucGxhdGZvcm1UeXBlKSA/IG9wdGlvbnMucGxhdGZvcm1UeXBlIDogdGhpcy5nZXRTZXJ2aWNlVHlwZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXSwgJ2luaXQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2pdLmVuZHNXaXRoKCcuY29uZicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLnNwbGl0KCcuY29uZicpWzBdLCAndXBzdGFydCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5zZXJ2aWNlJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0uc3BsaXQoJy5zZXJ2aWNlJylbMF0sICdzeXN0ZW1kJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmcmVlYnNkJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5wbGlzdCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGZldGNoUGxpc3QocGF0aHNbaV0sIGZpbGVzW2pdLnNwbGl0KCcucGxpc3QnKVswXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gcmVzdWx0cykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNba10uZGVzY3JpcHRpb24pIHsgcmVzdWx0c1trXS5kZXNjcmlwdGlvbiA9IHJlc3VsdHNba10uZGVzY3JpcHRpb24oKTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAocmVzdWx0cyk7CiAgICAgICAgfTsKICAgIH0KICAgIHRoaXMuaW5zdGFsbFNlcnZpY2UgPSBmdW5jdGlvbiBpbnN0YWxsU2VydmljZShvcHRpb25zKQogICAgewogICAgICAgIGlmICghb3B0aW9ucy50YXJnZXQpIHsgb3B0aW9ucy50YXJnZXQgPSBvcHRpb25zLm5hbWU7IH0KICAgICAgICBpZiAoIW9wdGlvbnMuZGlzcGxheU5hbWUpIHsgb3B0aW9ucy5kaXNwbGF5TmFtZSA9IG9wdGlvbnMubmFtZTsgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWRtaW4oKSkgeyB0aHJvdyAoJ0luc3RhbGxpbmcgYXMgU2VydmljZSwgcmVxdWlyZXMgYWRtaW4nKTsgfQoKICAgICAgICAgICAgLy8gQmVmb3JlIHdlIHN0YXJ0LCB3ZSBuZWVkIHRvIGNvcHkgdGhlIGJpbmFyeSB0byB0aGUgcmlnaHQgcGxhY2UKICAgICAgICAgICAgdmFyIGZvbGRlciA9IHRoaXMuZ2V0U2VydmljZUZvbGRlcigpOwogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKGZvbGRlcik7IH0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSk7IH0KCiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsIGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgb3B0aW9ucy50YXJnZXQgKyAnLmV4ZScpOwogICAgICAgICAgICBvcHRpb25zLnNlcnZpY2VQYXRoID0gZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBvcHRpb25zLnRhcmdldCArICcuZXhlJzsKCiAgICAgICAgICAgIHZhciBzZXJ2aWNlUGF0aCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoJyInICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCArICciJywgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICB2YXIgaGFuZGxlID0gdGhpcy5wcm94eS5PcGVuU0NNYW5hZ2VyQSgweDAwLCAweDAwLCAweDAwMDIpOwogICAgICAgICAgICBpZiAoaGFuZGxlLlZhbCA9PSAwKSB7IHRocm93ICgnZXJyb3Igb3BlbmluZyBTQ01hbmFnZXInKTsgfQogICAgICAgICAgICB2YXIgc2VydmljZU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKG9wdGlvbnMubmFtZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKG9wdGlvbnMuZGlzcGxheU5hbWUsIHsgd2lkZTogdHJ1ZX0pOwogICAgICAgICAgICB2YXIgYWxsQWNjZXNzID0gMHgwMDBGMDFGRjsKICAgICAgICAgICAgdmFyIHNlcnZpY2VUeXBlOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ0FVVE9fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwMjsgLy8gQXV0b21hdGljCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdERU1BTkRfU1RBUlQnOgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSA9IDB4MDM7IC8vIE1hbnVhbAogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnRElTQUJMRUQnOgogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwNDsgLy8gRGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGggPSB0aGlzLnByb3h5LkNyZWF0ZVNlcnZpY2VXKGhhbmRsZSwgc2VydmljZU5hbWUsIGRpc3BsYXlOYW1lLCBhbGxBY2Nlc3MsIDB4MTAgfCAweDEwMCwgc2VydmljZVR5cGUsIDAsIHNlcnZpY2VQYXRoLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgaWYgKGguVmFsID09IDApIHsgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsgdGhyb3cgKCdFcnJvciBDcmVhdGluZyBTZXJ2aWNlOiAnICsgdGhpcy5wcm94eTIuR2V0TGFzdEVycm9yKCkuVmFsKTsgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5kZXNjcmlwdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRzYyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5kZXNjcmlwdGlvbiwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VEZXNjcmlwdGlvbiA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUodGhpcy5HTS5Qb2ludGVyU2l6ZSk7CiAgICAgICAgICAgICAgICBkc2MucG9pbnRlckJ1ZmZlcigpLmNvcHkoc2VydmljZURlc2NyaXB0aW9uLkRlcmVmKDAsIHRoaXMuR00uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LkNoYW5nZVNlcnZpY2VDb25maWcyVyhoLCAxLCBzZXJ2aWNlRGVzY3JpcHRpb24pLlZhbCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bmFibGUgdG8gc2V0IGRlc2NyaXB0aW9uLi4uJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRlbGF5ID0gb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsID8gNTAwMCA6IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQ7ICAgICAgICAgICAgIC8vIERlbGF5IGluIG1pbGxpc2Vjb25kcwogICAgICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDMgKiA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMqc2l6ZW9mKFNDX0FDVElPTikKICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMF0udHlwZQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZig0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMF0uZGVsYXkKICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoOCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMV0udHlwZQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigxMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRlbGF5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMV0uZGVsYXkKICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMl0udHlwZQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigyMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRlbGF5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ19BQ1RJT05bMl0uZGVsYXkKCiAgICAgICAgICAgICAgICB2YXIgZmFpbHVyZUFjdGlvbnMgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZW9mKFNFUlZJQ0VfRkFJTFVSRV9BQ1RJT05TKQogICAgICAgICAgICAgICAgZmFpbHVyZUFjdGlvbnMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDcyMDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR3UmVzZXRQZXJpb2Q6IDIgSG91cnMKICAgICAgICAgICAgICAgIGZhaWx1cmVBY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDI0IDogMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzKTsvLyBjQWN0aW9uczogMwogICAgICAgICAgICAgICAgYWN0aW9ucy5wb2ludGVyQnVmZmVyKCkuY29weShmYWlsdXJlQWN0aW9ucy5EZXJlZih0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDE2LCB0aGlzLkdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3h5LkNoYW5nZVNlcnZpY2VDb25maWcyVyhoLCAyLCBmYWlsdXJlQWN0aW9ucykuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBzZXQgRmFpbHVyZUFjdGlvbnMuLi4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoKTsKICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsKCiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IodmFyIGkgaW4gb3B0aW9ucy5maWxlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3dyaXRpbmcgJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSwgb3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIGV4dHJhY3RGaWxlU291cmNlKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMoZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSksIGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1ldGVycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOwogICAgICAgICAgICAgICAgdmFyIGltYWdlUGF0aCA9IHJlZy5RdWVyeUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIG9wdGlvbnMubmFtZSwgJ0ltYWdlUGF0aCcpOwogICAgICAgICAgICAgICAgaW1hZ2VQYXRoICs9ICgnICcgKyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpKTsKICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIG9wdGlvbnMubmFtZSwgJ0ltYWdlUGF0aCcsIGltYWdlUGF0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWRtaW4oKSkgeyBjb25zb2xlLmxvZygnSW5zdGFsbGluZyBhIFNlcnZpY2UgcmVxdWlyZXMgcm9vdCcpOyB0aHJvdyAoJ0luc3RhbGxpbmcgYXMgU2VydmljZSwgcmVxdWlyZXMgcm9vdCcpOyB9CiAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gb3B0aW9ucy5wYXJhbWV0ZXJzID8gb3B0aW9ucy5wYXJhbWV0ZXJzLmpvaW4oJyAnKSA6ICcnOwogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQogICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7CgogICAgICAgICAgICB2YXIgcmMgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBvcHRpb25zLm5hbWUsIHsgZmxhZ3M6ICd3YicgfSk7CiAgICAgICAgICAgIHJjLndyaXRlKCcjIS9iaW4vc2hcbicpOwogICAgICAgICAgICByYy53cml0ZSgnIyBQUk9WSURFOiAnICsgb3B0aW9ucy5uYW1lICsgJ1xuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCcjIFJFUVVJUkU6IEZJTEVTWVNURU1TIE5FVFdPUktJTkdcbicpOwogICAgICAgICAgICByYy53cml0ZSgnIyBLRVlXT1JEOiBzaHV0ZG93blxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCcuIC9ldGMvcmMuc3ViclxuXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ25hbWU9IicgKyBvcHRpb25zLm5hbWUgKyAnIlxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdkZXNjPSInICsgKG9wdGlvbnMuZGVzY3JpcHRpb24gPyBvcHRpb25zLmRlc2NyaXB0aW9uIDogJ01lc2hDZW50cmFsIEFnZW50JykgKyAnIlxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdyY3Zhcj0ke25hbWV9X2VuYWJsZVxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdwaWRmaWxlPSIvdmFyL3J1bi8nICsgb3B0aW9ucy5uYW1lICsgJy5waWQiXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ2NvbW1hbmQ9Ii91c3Ivc2Jpbi9kYWVtb24iXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ2NvbW1hbmRfYXJncz0iLVAgJHtwaWRmaWxlfSAnICsgKChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApPyctcic6JycpICsgJyAtZiAvdXNyL2xvY2FsL21lc2hf", 16000); + memcpy_s(_servicemanager + 96000, 36888, "c2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0ICsgJyAnICsgcGFyYW1ldGVycyArICciXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJ2NvbW1hbmRfY2hkaXI9Ii91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJyJcblxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdsb2FkX3JjX2NvbmZpZyAkbmFtZVxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCc6ICR7JyArIG9wdGlvbnMubmFtZSArICdfZW5hYmxlPSInICsgKChvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQVVUT19TVEFSVCcgfHwgb3B0aW9ucy5zdGFydFR5cGUgPT0gJ0JPT1RfU1RBUlQnKT8nWUVTJzonTk8nKSArICcifVxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdydW5fcmNfY29tbWFuZCAiJDEiXG4nKTsKICAgICAgICAgICAgcmMuZW5kKCk7CiAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgb3B0aW9ucy5uYW1lKS5tb2RlOwogICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgb3B0aW9ucy5uYW1lLCBtKTsKICAgICAgICB9CiAgICAgICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWRtaW4oKSkgeyBjb25zb2xlLmxvZygnSW5zdGFsbGluZyBhIFNlcnZpY2UgcmVxdWlyZXMgcm9vdCcpOyB0aHJvdyAoJ0luc3RhbGxpbmcgYXMgU2VydmljZSwgcmVxdWlyZXMgcm9vdCcpOyB9CiAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gb3B0aW9ucy5wYXJhbWV0ZXJzID8gb3B0aW9ucy5wYXJhbWV0ZXJzLmpvaW4oJyAnKSA6ICcnOwogICAgICAgICAgICB2YXIgY29uZjsKICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNlcnZpY2VQbGF0Zm9ybSkgeyBvcHRpb25zLnNlcnZpY2VQbGF0Zm9ybSA9IHRoaXMuZ2V0U2VydmljZVR5cGUoKTsgfQogICAgICAgICAgIAogICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc2VydmljZVBsYXRmb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdpbml0JzoKICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQoKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIG9wdGlvbnMuc2VydmljZVBhdGgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7CiAgICAgICAgICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmFzaCBSZXN0YXJ0IGlzIGVuYWJsZWQsIGJ1dCBpdCBpc24ndCBpbmhlcmVudGx5IHN1cHBvcnRlZCBieSBJTklULCBzbyB3ZSBtdXN0IGZha2UgaXQgd2l0aCBKUwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLnNwbGl0KCciJykuam9pbignXFwiJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAiLWV4ZWMgXFxcInZhciBjaGlsZDsgcHJvY2Vzcy5vbignU0lHVEVSTScsIGZ1bmN0aW9uICgpIHsgY2hpbGQucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7IGNoaWxkLmtpbGwoKTsgcHJvY2Vzcy5leGl0KCk7IH0pOyBmdW5jdGlvbiBzdGFydCgpIHsgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuYXJndjAsIFxcXCIiICsgdG1wX3BhcmFtZXRlcnMgKyAiXFxcIl0pOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7IGNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKHN0YXR1cykgeyBzdGFydCgpOyB9KTsgfSBzdGFydCgpO1xcXCIiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgaW5pdC5kIHNjcmlwdCBJIHdyb3RlLiBSYXRoZXIgdGhhbiBoYXZpbmcgdG8gZGVhbCB3aXRoIGVzY2FwaW5nIHRoZSB0aGluZywgSSBqdXN0IEJhc2U2NCBlbmNvZGVkIGl0IHRvIHByZXZlbnQgaXNzdWVzLgogICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvZXRjL2luaXQuZC8nICsgb3B0aW9ucy5uYW1lLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoQnVmZmVyLmZyb20oJ0l5RXZZbWx1TDNOb0Nnb0tVME5TU1ZCVVBTOTFjM0l2Ykc5allXd3ZiV1Z6YUY5elpYSjJhV05sY3k5WVdGaFlXQzlaV1ZsWldRcFNWVTVCVXoxeWIyOTBDZ3BRU1VSR1NVeEZQUzkyWVhJdmNuVnVMMWhZV0ZoWUxuQnBaQXBNVDBkR1NVeEZQUzkyWVhJdmJHOW5MMWhZV0ZoWUxteHZad29LYzNSaGNuUW9LU0I3Q2lBZ2FXWWdXeUF0WmlBaUpGQkpSRVpKVEVVaUlGMGdKaVlnYTJsc2JDQXRNQ0FrS0dOaGRDQWlKRkJKUkVaSlRFVWlLU0F5UGk5a1pYWXZiblZzYkRzZ2RHaGxiZ29nSUNBZ1pXTm9ieUFuVTJWeWRtbGpaU0JoYkhKbFlXUjVJSEoxYm01cGJtY25JRDRtTWdvZ0lDQWdjbVYwZFhKdUlERUtJQ0JtYVFvZ0lHVmphRzhnSjFOMFlYSjBhVzVuSUhObGNuWnBZMlhpZ0tZbklENG1NZ29nSUd4dlkyRnNJRU5OUkQwaUpGTkRVa2xRVkNCN2UxQkJVazFUZlgwZ0pqNGdYQ0lrVEU5SFJrbE1SVndpSUNZZ1pXTm9ieUJjSkNFaUNpQWdiRzlqWVd3Z1EwMUVVRUZVU0Qwa0tHVmphRzhnSkZORFVrbFFWQ0I4SUdGM2F5QW5leUJzWlc0OWMzQnNhWFFvSkRBc0lHRXNJQ0l2SWlrN0lIQnlhVzUwSUhOMVluTjBjaWdrTUN3Z01Dd2diR1Z1WjNSb0tDUXdLUzFzWlc1bmRHZ29ZVnRzWlc1ZEtTazdJSDBuS1FvZ0lHTmtJQ1JEVFVSUVFWUklDaUFnYzNVZ0xXTWdJaVJEVFVRaUlDUlNWVTVCVXlBK0lDSWtVRWxFUmtsTVJTSUtJQ0JsWTJodklDZFRaWEoyYVdObElITjBZWEowWldRbklENG1NZ3A5Q2dwemRHOXdLQ2tnZXdvZ0lHbG1JRnNnSVNBdFppQWlKRkJKUkVaSlRFVWlJRjA3SUhSb1pXNEtJQ0FnSUdWamFHOGdKMU5sY25acFkyVWdibTkwSUhKMWJtNXBibWNuSUQ0bU1nb2dJQ0FnY21WMGRYSnVJREVLSUNCbGJITmxDZ2x3YVdROUpDZ2dZMkYwSUNJa1VFbEVSa2xNUlNJZ0tRb0phV1lnYTJsc2JDQXRNQ0FrY0dsa0lESStMMlJsZGk5dWRXeHNPeUIwYUdWdUNpQWdJQ0FnSUdWamFHOGdKMU4wYjNCd2FXNW5JSE5sY25acFkyWGlnS1luSUQ0bU1nb2dJQ0FnSUNCcmFXeHNJQzB4TlNBa2NHbGtDaUFnSUNBZ0lHVmphRzhnSjFObGNuWnBZMlVnYzNSdmNIQmxaQ2NnUGlZeUNnbGxiSE5sQ2drZ0lHVmphRzhnSjFObGNuWnBZMlVnYm05MElISjFibTVwYm1jbkNnbG1hUW9KY20wZ0xXWWdKQ0pRU1VSR1NVeEZJZ29nSUdacENuMEtjbVZ6ZEdGeWRDZ3Bld29KYzNSdmNBb0pjM1JoY25RS2ZRcHpkR0YwZFhNb0tYc0tDV2xtSUZzZ0xXWWdJaVJRU1VSR1NVeEZJaUJkQ2dsMGFHVnVDZ2tKY0dsa1BTUW9JR05oZENBaUpGQkpSRVpKVEVVaUlDa0tDUWxwWmlCcmFXeHNJQzB3SUNSd2FXUWdNajR2WkdWMkwyNTFiR3c3SUhSb1pXNEtDUWtKWldOb2J5QWlXRmhZV0ZnZ2MzUmhjblF2Y25WdWJtbHVaeXdnY0hKdlkyVnpjeUFrY0dsa0lnb0pDV1ZzYzJVS0NRa0paV05vYnlBbldGaFlXRmdnYzNSdmNDOTNZV2wwYVc1bkp3b0pDV1pwQ2dsbGJITmxDZ2tKWldOb2J5QW5XRmhZV0ZnZ2MzUnZjQzkzWVdsMGFXNW5Kd29KWm1rS0NuMEtDZ3BqWVhObElDSWtNU0lnYVc0S0NYTjBZWEowS1FvSkNYTjBZWEowQ2drSk96c0tDWE4wYjNBcENna0pjM1J2Y0FvSkNUczdDZ2x5WlhOMFlYSjBLUW9KQ1hOMGIzQUtDUWx6ZEdGeWRBb0pDVHM3Q2dsemRHRjBkWE1wQ2drSmMzUmhkSFZ6Q2drSk96c0tDU29wQ2drSlpXTm9ieUFpVlhOaFoyVTZJSE5sY25acFkyVWdXRmhZV0ZnZ2UzTjBZWEowZkhOMGIzQjhjbVZ6ZEdGeWRIeHpkR0YwZFhOOUlnb0pDVHM3Q21WellXTUtaWGhwZENBd0Nnbz0nLCAnYmFzZTY0JykudG9TdHJpbmcoKS5zcGxpdCgnWFhYWFgnKS5qb2luKG9wdGlvbnMubmFtZSkuc3BsaXQoJ1lZWVlZJykuam9pbihvcHRpb25zLnRhcmdldCkucmVwbGFjZSgne3tQQVJNU319JywgcGFyYW1ldGVycykpOwogICAgICAgICAgICAgICAgICAgIGNvbmYuZW5kKCk7CgogICAgICAgICAgICAgICAgICAgIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvZXRjL2luaXQuZC8nICsgb3B0aW9ucy5uYW1lKS5tb2RlOwogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy9ldGMvaW5pdC5kLycgKyBvcHRpb25zLm5hbWUsIG0pOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCT09UX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1lTVEVNX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3VwZGF0ZS1yYy5kICcgKyBvcHRpb25zLm5hbWUgKyAnIGRlZmF1bHRzXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9CgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsKICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsKCiAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy9ldGMvaW5pdC8nICsgb3B0aW9ucy5uYW1lICsgJy5jb25mJywgeyBmbGFnczogJ3diJyB9KTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3RhcnRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQk9PVF9TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NZU1RFTV9TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FVVE9fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnc3RhcnQgb24gcnVubGV2ZWwgWzIzNDVdXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ3N0b3Agb24gcnVubGV2ZWwgWzAxNl1cblxuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ3Jlc3Bhd25cblxuJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ2NoZGlyIC91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnZXhlYyAvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0ICsgJyAnICsgcGFyYW1ldGVycyArICdcblxuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlRGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uID8gb3B0aW9ucy5kZXNjcmlwdGlvbiA6ICdNZXNoQ2VudHJhbCBBZ2VudCc7CgogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpOyB9CgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBvcHRpb25zLnNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsKICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbScpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG9wdGlvbnMubmFtZSArICcuc2VydmljZScsIHsgZmxhZ3M6ICd3YicgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0nKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgb3B0aW9ucy5uYW1lICsgJy5zZXJ2aWNlJywgeyBmbGFnczogJ3diJyB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCd1bmtub3duIGxvY2F0aW9uIGZvciBzeXN0ZW1kIGNvbmZpZ3VyYXRpb24gZmlsZXMnKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1tVbml0XVxuRGVzY3JpcHRpb249JyArIHNlcnZpY2VEZXNjcmlwdGlvbiArICdcbicpOwogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1tTZXJ2aWNlXVxuJyk7CiAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnV29ya2luZ0RpcmVjdG9yeT0vdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICdcbicpOwogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ0V4ZWNTdGFydD0vdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0ICsgJyAnICsgcGFyYW1ldGVycyArICdcbicpOwogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1N0YW5kYXJkT3V0cHV0PW51bGxcbicpOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdSZXN0YXJ0PW9uLWZhaWx1cmVcbicpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdSZXN0YXJ0U2VjPTNcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnUmVzdGFydFNlYz0nICsgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgLyAxMDAwKSArICdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5zdGFydFR5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCT09UX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1lTVEVNX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdbSW5zdGFsbF1cbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnQWxpYXM9JyArIG9wdGlvbnMubmFtZSArICcuc2VydmljZVxuJyk7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuX21vZHVsZU5hbWUgPSBvcHRpb25zLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgZW5hYmxlICcgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2VcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbmYuZW5kKCk7CgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gdW5rbm93biBwbGF0Zm9ybSBzZXJ2aWNlIHR5cGUKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5rbm93biBTZXJ2aWNlIFBsYXRmb3JtIFR5cGU6ICcgKyBvcHRpb25zLnNlcnZpY2VQbGF0Zm9ybSk7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdVbmtub3duIFNlcnZpY2UgUGxhdGZvcm0gVHlwZTogJyArIG9wdGlvbnMuc2VydmljZVBsYXRmb3JtKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWRtaW4oKSkgeyB0aHJvdyAoJ0luc3RhbGxpbmcgYXMgU2VydmljZSwgcmVxdWlyZXMgcm9v", 16000); + memcpy_s(_servicemanager + 112000, 20888, "dCcpOyB9CgogICAgICAgICAgICAvLyBNYWMgT1MKICAgICAgICAgICAgdmFyIHN0ZG91dHBhdGggPSAob3B0aW9ucy5zdGRvdXQgPyAoJzxrZXk+U3RhbmRhcmRPdXRQYXRoPC9rZXk+XG48c3RyaW5nPicgKyBvcHRpb25zLnN0ZG91dCArICc8L3N0cmluZz4nKSA6ICcnKTsKICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9IChvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQVVUT19TVEFSVCcgPyAnPHRydWUvPicgOiAnPGZhbHNlLz4nKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICAnICAgICA8a2V5PlByb2dyYW1Bcmd1bWVudHM8L2tleT5cbic7CiAgICAgICAgICAgIHBhcmFtcyArPSAnICAgICA8YXJyYXk+XG4nOwogICAgICAgICAgICBwYXJhbXMgKz0gKCcgICAgICAgICA8c3RyaW5nPi91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgaWYob3B0aW9ucy5wYXJhbWV0ZXJzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IodmFyIGl0bSBpbiBvcHRpb25zLnBhcmFtZXRlcnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zICs9ICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5wYXJhbWV0ZXJzW2l0bV0gKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgICAgICAgCiAgICAgICAgICAgIHBhcmFtcyArPSAnICAgICA8L2FycmF5PlxuJzsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwbGlzdCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzxwbGlzdCB2ZXJzaW9uPSIxLjAiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgPGRpY3Q+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMubmFtZSArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBwbGlzdCArPSAocGFyYW1zICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPi91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJzwvc3RyaW5nPlxuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9IChzdGRvdXRwYXRoICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PlJ1bkF0TG9hZDwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKGF1dG9TdGFydCArICdcbicpOwogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5LZWVwQWxpdmU8L2tleT5cbic7CiAgICAgICAgICAgIGlmKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxkaWN0PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8a2V5PkNyYXNoZWQ8L2tleT5cbic7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPHRydWUvPlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8L2RpY3Q+XG4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxmYWxzZS8+XG4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+VGhyb3R0bGVJbnRlcnZhbDwva2V5PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8aW50ZWdlcj4nICsgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgLyAxMDAwKSArICc8L2ludGVnZXI+XG4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwbGlzdCArPSAnICA8L2RpY3Q+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPC9wbGlzdD4nOwoKICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy5wbGlzdCcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJpbmFyeSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG9wdGlvbnMuYmluYXJ5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG9wdGlvbnMubmFtZSArICcucGxpc3QnLCBwbGlzdCk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7CiAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdTZXJ2aWNlOiAnICsgb3B0aW9ucy5uYW1lICsgJyBhbHJlYWR5IGV4aXN0cycpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5maWxlcykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gb3B0aW9ucy5maWxlcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXNbaV0uX2J1ZmZlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd3JpdGluZyAnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMoZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSksICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKICAgIHsKICAgICAgICB0aGlzLmluc3RhbGxMYXVuY2hBZ2VudCA9IGZ1bmN0aW9uIGluc3RhbGxMYXVuY2hBZ2VudChvcHRpb25zKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEob3B0aW9ucy51aWQgfHwgb3B0aW9ucy51c2VyKSAmJiAhdGhpcy5pc0FkbWluKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnSW5zdGFsbGluZyBhIEdsb2JhbCBBZ2VudC9EYWVtb24sIHJlcXVpcmVzIGFkbWluJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzZXJ2aWNlUGF0aFRva2VucyA9IG9wdGlvbnMuc2VydmljZVBhdGguc3BsaXQoJy8nKTsKICAgICAgICAgICAgc2VydmljZVBhdGhUb2tlbnMucG9wKCk7CiAgICAgICAgICAgIGlmIChzZXJ2aWNlUGF0aFRva2Vucy5wZWVrKCkgPT0gJy4nKSB7IHNlcnZpY2VQYXRoVG9rZW5zLnBvcCgpOyB9CiAgICAgICAgICAgIG9wdGlvbnMud29ya2luZ0RpcmVjdG9yeSA9IHNlcnZpY2VQYXRoVG9rZW5zLmpvaW4oJy8nKTsKCiAgICAgICAgICAgIHZhciBhdXRvU3RhcnQgPSAob3B0aW9ucy5zdGFydFR5cGUgPT0gJ0FVVE9fU1RBUlQnID8gJzx0cnVlLz4nIDogJzxmYWxzZS8+Jyk7CiAgICAgICAgICAgIHZhciBzdGRvdXRwYXRoID0gKG9wdGlvbnMuc3Rkb3V0ID8gKCc8a2V5PlN0YW5kYXJkT3V0UGF0aDwva2V5PlxuPHN0cmluZz4nICsgb3B0aW9ucy5zdGRvdXQgKyAnPC9zdHJpbmc+JykgOiAnJyk7CiAgICAgICAgICAgIHZhciBwYXJhbXMgPSAgICAgICAgICcgICAgIDxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlxuJzsKICAgICAgICAgICAgcGFyYW1zICs9ICAgICAgICAgICAgJyAgICAgPGFycmF5PlxuJzsKICAgICAgICAgICAgcGFyYW1zICs9ICAgICAgICAgICAoJyAgICAgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMuc2VydmljZVBhdGggKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1ldGVycykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaXRtIGluIG9wdGlvbnMucGFyYW1ldGVycykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMgKz0gICAoJyAgICAgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMucGFyYW1ldGVyc1tpdG1dICsgJzwvc3RyaW5nPlxuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyYW1zICs9ICAgICAgICAgICAgJyAgICAgPC9hcnJheT5cbic7CgogICAgICAgICAgICB2YXIgcGxpc3QgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8cGxpc3QgdmVyc2lvbj0iMS4wIj5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDxkaWN0PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+TGFiZWw8L2tleT5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPicgKyBvcHRpb25zLm5hbWUgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gKHBhcmFtcyArICdcbicpOwogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5Xb3JraW5nRGlyZWN0b3J5PC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgb3B0aW9ucy53b3JraW5nRGlyZWN0b3J5ICsgJzwvc3RyaW5nPlxuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9IChzdGRvdXRwYXRoICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PlJ1bkF0TG9hZDwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKGF1dG9TdGFydCArICdcbicpOwogICAgICAgICAgICBpZiAob3B0aW9ucy5zZXNzaW9uVHlwZXMgJiYgb3B0aW9ucy5zZXNzaW9uVHlwZXMubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+TGltaXRMb2FkVG9TZXNzaW9uVHlwZTwva2V5PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8YXJyYXk+XG4nOwogICAgICAgICAgICAgICAgZm9yICh2YXIgc3R5cGUgaW4gb3B0aW9ucy5zZXNzaW9uVHlwZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5zZXNzaW9uVHlwZXNbc3R5cGVdICsgJzwvc3RyaW5nPlxuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9hcnJheT5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+S2VlcEFsaXZlPC9rZXk+XG4nOwogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKSB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGRpY3Q+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDxrZXk+Q3Jhc2hlZDwva2V5PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8dHJ1ZS8+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDwvZGljdD5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGZhbHNlLz5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+VGhyb3R0bGVJbnRlcnZhbDwva2V5PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8aW50ZWdlcj4nICsgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgLyAxMDAwKSArICc8L2ludGVnZXI+XG4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwbGlzdCArPSAnICA8L2RpY3Q+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPC9wbGlzdD4nOwoKICAgICAgICAgICAgaWYgKG9wdGlvbnMudWlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnVzZXIgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VXNlcm5hbWUob3B0aW9ucy51aWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZm9sZGVyID0gb3B0aW9ucy51c2VyID8gKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRIb21lRm9sZGVyKG9wdGlvbnMudXNlcikgKyAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzLycpIDogJy9MaWJyYXJ5L0xhdW5jaEFnZW50cy8nOwogICAgICAgICAgICBvcHRpb25zLmdpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRHcm91cElEKG9wdGlvbnMudWlkKTsKICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoZm9sZGVyKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoZm9sZGVyKTsKICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciwgb3B0aW9ucy51aWQsIG9wdGlvbnMuZ2lkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoZm9sZGVyICsgb3B0aW9ucy5uYW1lICsgJy5wbGlzdCcsIHBsaXN0KTsKICAgICAgICAgICAgaWYob3B0aW9ucy51c2VyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNob3duU3luYyhmb2xkZXIgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0Jywgb3B0aW9ucy51aWQsIG9wdGlvbnMuZ2lkKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICB0aGlzLnVuaW5zdGFsbFNlcnZpY2UgPSBmdW5jdGlvbiB1bmluc3RhbGxTZXJ2aWNlKG5hbWUpCiAgICB7CiAgICAgICAgaWYgKCF0aGlzLmlzQWRtaW4oKSkgeyB0aHJvdyAoJ1VuaW5zdGFsbGluZyBhIHNlcnZpY2UsIHJlcXVpcmVzIGFkbWluJyk7IH0KCiAgICAgICAgaWYgKHR5cGVvZiAobmFtZSkgPT0gJ29iamVjdCcpIHsgbmFtZSA9IG5hbWUubmFtZTsgfQogICAgICAgIHZhciBzZXJ2aWNlID0gdGhpcy5nZXRTZXJ2aWNlKG5hbWUpOwogICAgICAgIHZhciBzZXJ2aWNlUGF0aCA9IHNlcnZpY2UuYXBwTG9jYXRpb24oKTsKCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzZXJ2aWNlLnN0YXR1cy5zdGF0ZSA9PSB1bmRlZmluZWQgfHwgc2VydmljZS5zdGF0dXMuc3RhdGUgPT0gJ1NUT1BQRUQnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZVBhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5EZWxldGVTZXJ2aWNlKHNlcnZpY2UuX3NlcnZpY2UpID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdVbmluc3RhbGwgU2VydmljZSBmb3I6ICcgKyBuYW1lICsgJywgZmFpbGVkIHdpdGggZXJyb3I6ICcgKyB0aGlzLnByb3h5Mi5HZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Nhbm5vdCB1bmluc3RhbGwgc2VydmljZTogJyArIG5hbWUgKyAnLCBiZWNhdXNlIGl0IGlzOiAnICsgc2VydmljZS5zdGF0dXMuc3RhdGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKICAgICAgICAgICAgc2VydmljZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoICh0aGlzLmdldFNlcnZpY2VUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LmQvJyArIG5hbWUpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdC5kIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyBuYW1lICsgJyBzdG9wXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCd1cGRhdGUtcmMuZCAtZiAnICsgbmFtZSArICcgcmVtb3ZlXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy9ldGMvaW5pdC5kLycgKyBuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyB1bmluc3RhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC8nICsgbmFtZSArICcuY29uZicpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBzdGFydCBzZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgbmFtZSArICcgc3RvcFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyB1bmluc3RhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0gfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBzdG9wICcgKyBuYW1lICsgJy5zZXJ2aWNlXG4nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRh", 16000); + memcpy_s(_servicemanager + 128000, 4888, "dGUuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBkaXNhYmxlICcgKyBuYW1lICsgJy5zZXJ2aWNlXG4nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKSB7IHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgY291bGQgbm90IGJlIHVuaW5zdGFsbGVkJywgZSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyB1bmtub3duIHBsYXRmb3JtIHNlcnZpY2UgdHlwZQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0b3AgJyArIG5hbWUgKyAnXG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgdW5sb2FkIC9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG5hbWUgKyAnLnBsaXN0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG5hbWUgKyAnLnBsaXN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgdW5pbnN0YWxsaW5nIHNlcnZpY2U6ICcgKyBuYW1lICsgJyA9PiAnICsgZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5ybWRpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnU2VydmljZTogJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgICAgICB7CiAgICAgICAgICAgIHNlcnZpY2Uuc3RvcCgpOwogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZS5hcHBMb2NhdGlvbigpKTsKICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2UucmMpOwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5ybWRpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsgfQogICAgICAgIH0KICAgIH0KICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgIHsKICAgICAgICB0aGlzLmdldFNlcnZpY2VUeXBlID0gZnVuY3Rpb24gZ2V0U2VydmljZVR5cGUoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHBsYXRmb3JtID0gcmVxdWlyZSgncHJvY2Vzcy1tYW5hZ2VyJykuZ2V0UHJvY2Vzc0luZm8oMSkuTmFtZTsKICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09ICJidXN5Ym94IikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcyAtYXggLW8gcGlkIC1vIGNvbW1hbmQgfCBhd2sgJ3sgaWYoJDE9PVwiMVwiKSB7ICQxPVwiXCI7IHNwbGl0KCQwLCByZXMsIFwiIFwiKTsgcHJpbnQgcmVzWzJdOyB9fSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09ICdpbml0JykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQnKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICd1cHN0YXJ0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHBsYXRmb3JtKTsKICAgICAgICB9OwogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IHNlcnZpY2VNYW5hZ2VyOwptb2R1bGUuZXhwb3J0cy5tYW5hZ2VyID0gbmV3IHNlcnZpY2VNYW5hZ2VyKCk7CgppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKewogICAgbW9kdWxlLmV4cG9ydHMuZ2V0T1NWZXJzaW9uID0gZ2V0T1NWZXJzaW9uOwp9Cv==", 4888); + ILibBase64DecodeEx((unsigned char*)_servicemanager, 132888, (unsigned char*)_servicemanager + 132888); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "service-manager"); duk_push_string(ctx, _servicemanager + 132888); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_servicemanager); diff --git a/modules/service-manager.js b/modules/service-manager.js index 081fd54..d36c685 100644 --- a/modules/service-manager.js +++ b/modules/service-manager.js @@ -465,16 +465,16 @@ function serviceManager() this.GM = require('_GenericMarshal'); this.proxy = this.GM.CreateNativeProxy('Advapi32.dll'); this.proxy.CreateMethod('OpenSCManagerA'); - this.proxy.CreateMethod('EnumServicesStatusExA'); - this.proxy.CreateMethod('OpenServiceA'); + this.proxy.CreateMethod('EnumServicesStatusExW'); + this.proxy.CreateMethod('OpenServiceW'); this.proxy.CreateMethod('QueryServiceStatusEx'); this.proxy.CreateMethod('QueryServiceConfigA'); this.proxy.CreateMethod('QueryServiceConfig2A'); this.proxy.CreateMethod('ControlService'); this.proxy.CreateMethod('StartServiceA'); this.proxy.CreateMethod('CloseServiceHandle'); - this.proxy.CreateMethod('CreateServiceA'); - this.proxy.CreateMethod('ChangeServiceConfig2A'); + this.proxy.CreateMethod('CreateServiceW'); + this.proxy.CreateMethod('ChangeServiceConfig2W'); this.proxy.CreateMethod('DeleteService'); this.proxy.CreateMethod('AllocateAndInitializeSid'); this.proxy.CreateMethod('CheckTokenMembership'); @@ -526,7 +526,7 @@ function serviceManager() var servicesReturned = this.GM.CreatePointer(); var resumeHandle = this.GM.CreatePointer(); //var services = this.proxy.CreateVariable(262144); - var success = this.proxy.EnumServicesStatusExA(handle, 0, 0x00000030, 0x00000003, 0x00, 0x00, bytesNeeded, servicesReturned, resumeHandle, 0x00); + var success = this.proxy.EnumServicesStatusExW(handle, 0, 0x00000030, 0x00000003, 0x00, 0x00, bytesNeeded, servicesReturned, resumeHandle, 0x00); var ptrSize = dbName._size; var sz = bytesNeeded.Deref(0, dbName._size).toBuffer().readUInt32LE(); @@ -534,7 +534,7 @@ function serviceManager() if (sz < 0) { throw ('error enumerating services'); } var services = this.GM.CreateVariable(sz); - this.proxy.EnumServicesStatusExA(handle, 0, 0x00000030, 0x00000003, services, sz, bytesNeeded, servicesReturned, resumeHandle, 0x00); + this.proxy.EnumServicesStatusExW(handle, 0, 0x00000030, 0x00000003, services, sz, bytesNeeded, servicesReturned, resumeHandle, 0x00); var blockSize = 36 + (2 * ptrSize); blockSize += ((ptrSize - (blockSize % ptrSize)) % ptrSize); @@ -543,8 +543,8 @@ function serviceManager() { var token = services.Deref(i * blockSize, blockSize); var j = {}; - j.name = token.Deref(0, ptrSize).Deref().String; - j.displayName = token.Deref(ptrSize, ptrSize).Deref().String; + j.name = token.Deref(0, ptrSize).Deref().Wide2UTF8; + j.displayName = token.Deref(ptrSize, ptrSize).Deref().Wide2UTF8; j.status = parseServiceStatus(token.Deref(2 * ptrSize, 36)); retVal.push(j); } @@ -553,12 +553,12 @@ function serviceManager() } this.getService = function (name) { - var serviceName = this.GM.CreateVariable(name); + var serviceName = this.GM.CreateVariable(name, { wide: true }); var ptr = this.GM.CreatePointer(); var bytesNeeded = this.GM.CreateVariable(ptr._size); var handle = this.proxy.OpenSCManagerA(0x00, 0x00, 0x0001 | 0x0004 | 0x0020 | 0x0010); if (handle.Val == 0) { throw ('could not open ServiceManager'); } - var h = this.proxy.OpenServiceA(handle, serviceName, 0x0001 | 0x0004 | 0x0020 | 0x0010 | 0x00010000); + var h = this.proxy.OpenServiceW(handle, serviceName, 0x0001 | 0x0004 | 0x0020 | 0x0010 | 0x00010000); if (h.Val != 0) { var retVal = { _ObjectID: 'service-manager.service' } @@ -1300,11 +1300,11 @@ function serviceManager() require('fs').copyFileSync(options.servicePath, folder + '\\' + options.name + '\\' + options.target + '.exe'); options.servicePath = folder + '\\' + options.name + '\\' + options.target + '.exe'; - var servicePath = this.GM.CreateVariable('"' + options.servicePath + '"'); + var servicePath = this.GM.CreateVariable('"' + options.servicePath + '"', { wide: true }); var handle = this.proxy.OpenSCManagerA(0x00, 0x00, 0x0002); if (handle.Val == 0) { throw ('error opening SCManager'); } - var serviceName = this.GM.CreateVariable(options.name); - var displayName = this.GM.CreateVariable(options.displayName); + var serviceName = this.GM.CreateVariable(options.name, { wide: true }); + var displayName = this.GM.CreateVariable(options.displayName, { wide: true}); var allAccess = 0x000F01FF; var serviceType; @@ -1322,15 +1322,15 @@ function serviceManager() break; } - var h = this.proxy.CreateServiceA(handle, serviceName, displayName, allAccess, 0x10 | 0x100, serviceType, 0, servicePath, 0, 0, 0, 0, 0); + var h = this.proxy.CreateServiceW(handle, serviceName, displayName, allAccess, 0x10 | 0x100, serviceType, 0, servicePath, 0, 0, 0, 0, 0); if (h.Val == 0) { this.proxy.CloseServiceHandle(handle); throw ('Error Creating Service: ' + this.proxy2.GetLastError().Val); } if (options.description) { - var dsc = this.GM.CreateVariable(options.description); + var dsc = this.GM.CreateVariable(options.description, { wide: true }); var serviceDescription = this.GM.CreateVariable(this.GM.PointerSize); dsc.pointerBuffer().copy(serviceDescription.Deref(0, this.GM.PointerSize).toBuffer()); - if (this.proxy.ChangeServiceConfig2A(h, 1, serviceDescription).Val == 0) + if (this.proxy.ChangeServiceConfig2W(h, 1, serviceDescription).Val == 0) { console.log('unable to set description...'); } @@ -1350,7 +1350,7 @@ function serviceManager() failureActions.Deref(0, 4).toBuffer().writeUInt32LE(7200); // dwResetPeriod: 2 Hours failureActions.Deref(this.GM.PointerSize == 8 ? 24 : 12, 4).toBuffer().writeUInt32LE(3);// cActions: 3 actions.pointerBuffer().copy(failureActions.Deref(this.GM.PointerSize == 8 ? 32 : 16, this.GM.PointerSize).toBuffer()); - if (this.proxy.ChangeServiceConfig2A(h, 2, failureActions).Val == 0) + if (this.proxy.ChangeServiceConfig2W(h, 2, failureActions).Val == 0) { console.log('Unable to set FailureActions...'); } diff --git a/modules/win-registry.js b/modules/win-registry.js index ad1d740..e6e878d 100644 --- a/modules/win-registry.js +++ b/modules/win-registry.js @@ -126,6 +126,7 @@ function windows_registry() retVal = data.toBuffer().readUInt32BE(); break; case KEY_DATA_TYPES.REG_SZ: + case KEY_DATA_TYPES.REG_EXPAND_SZ: retVal = data.Wide2UTF8; break; case KEY_DATA_TYPES.REG_BINARY: