mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-15 15:53:55 +00:00
2731 lines
619 KiB
C
2731 lines
619 KiB
C
/*
|
|
Copyright 2006 - 2018 Intel Corporation
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
#include "duktape.h"
|
|
#include "ILibDuktape_Helpers.h"
|
|
#include "ILibDuktapeModSearch.h"
|
|
#include "ILibDuktape_DuplexStream.h"
|
|
#include "ILibDuktape_EventEmitter.h"
|
|
#include "ILibDuktape_Debugger.h"
|
|
#include "../microstack/ILibParsers.h"
|
|
#include "../microstack/ILibCrypto.h"
|
|
#include "../microstack/ILibRemoteLogging.h"
|
|
|
|
|
|
#define ILibDuktape_Timer_Ptrs "\xFF_DuktapeTimer_PTRS"
|
|
#define ILibDuktape_Queue_Ptr "\xFF_Queue"
|
|
#define ILibDuktape_Stream_Buffer "\xFF_BUFFER"
|
|
#define ILibDuktape_Stream_ReadablePtr "\xFF_ReadablePtr"
|
|
#define ILibDuktape_Stream_WritablePtr "\xFF_WritablePtr"
|
|
#define ILibDuktape_Console_Destination "\xFF_Console_Destination"
|
|
#define ILibDuktape_Console_LOG_Destination "\xFF_Console_Destination"
|
|
#define ILibDuktape_Console_WARN_Destination "\xFF_Console_WARN_Destination"
|
|
#define ILibDuktape_Console_ERROR_Destination "\xFF_Console_ERROR_Destination"
|
|
#define ILibDuktape_Console_INFO_Level "\xFF_Console_INFO_Level"
|
|
#define ILibDuktape_Console_SessionID "\xFF_Console_SessionID"
|
|
|
|
#define ILibDuktape_DescriptorEvents_ChainLink "\xFF_DescriptorEvents_ChainLink"
|
|
#define ILibDuktape_DescriptorEvents_Table "\xFF_DescriptorEvents_Table"
|
|
#define ILibDuktape_DescriptorEvents_FD "\xFF_DescriptorEvents_FD"
|
|
#define ILibDuktape_DescriptorEvents_Options "\xFF_DescriptorEvents_Options"
|
|
#define ILibDuktape_DescriptorEvents_WaitHandle "\xFF_DescriptorEvents_WindowsWaitHandle"
|
|
|
|
#define CP_ISO8859_1 28591
|
|
typedef enum ILibDuktape_Console_DestinationFlags
|
|
{
|
|
ILibDuktape_Console_DestinationFlags_DISABLED = 0,
|
|
ILibDuktape_Console_DestinationFlags_StdOut = 1,
|
|
ILibDuktape_Console_DestinationFlags_ServerConsole = 2,
|
|
ILibDuktape_Console_DestinationFlags_WebLog = 4,
|
|
ILibDuktape_Console_DestinationFlags_LogFile = 8
|
|
}ILibDuktape_Console_DestinationFlags;
|
|
|
|
#ifdef WIN32
|
|
typedef struct ILibDuktape_DescriptorEvents_WindowsWaitHandle
|
|
{
|
|
HANDLE waitHandle;
|
|
HANDLE eventThread;
|
|
void *chain;
|
|
duk_context *ctx;
|
|
void *object;
|
|
}ILibDuktape_DescriptorEvents_WindowsWaitHandle;
|
|
#endif
|
|
|
|
int g_displayStreamPipeMessages = 0;
|
|
int g_displayFinalizerMessages = 0;
|
|
extern int GenerateSHA384FileHash(char *filePath, char *fileHash);
|
|
|
|
duk_ret_t ILibDuktape_Pollyfills_Buffer_slice(duk_context *ctx)
|
|
{
|
|
int nargs = duk_get_top(ctx);
|
|
char *buffer;
|
|
char *out;
|
|
duk_size_t bufferLen;
|
|
int offset = 0;
|
|
duk_push_this(ctx);
|
|
|
|
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
|
|
if (nargs >= 1)
|
|
{
|
|
offset = duk_require_int(ctx, 0);
|
|
bufferLen -= offset;
|
|
}
|
|
if (nargs == 2)
|
|
{
|
|
bufferLen = (duk_size_t)duk_require_int(ctx, 1) - offset;
|
|
}
|
|
duk_push_fixed_buffer(ctx, bufferLen);
|
|
out = Duktape_GetBuffer(ctx, -1, NULL);
|
|
memcpy_s(out, bufferLen, buffer + offset, bufferLen);
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Buffer_randomFill(duk_context *ctx)
|
|
{
|
|
int start, length;
|
|
char *buffer;
|
|
duk_size_t bufferLen;
|
|
|
|
start = (int)(duk_get_top(ctx) == 0 ? 0 : duk_require_int(ctx, 0));
|
|
length = (int)(duk_get_top(ctx) == 2 ? duk_require_int(ctx, 1) : -1);
|
|
|
|
duk_push_this(ctx);
|
|
buffer = (char*)Duktape_GetBuffer(ctx, -1, &bufferLen);
|
|
if ((duk_size_t)length > bufferLen || length < 0)
|
|
{
|
|
length = (int)(bufferLen - start);
|
|
}
|
|
|
|
util_random(length, buffer + start);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Buffer_toString(duk_context *ctx)
|
|
{
|
|
int nargs = duk_get_top(ctx);
|
|
char *buffer, *tmpBuffer;
|
|
duk_size_t bufferLen = 0;
|
|
char *cType;
|
|
|
|
duk_push_this(ctx); // [buffer]
|
|
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
|
|
|
|
if (nargs == 0)
|
|
{
|
|
if (bufferLen == 0 || buffer == NULL)
|
|
{
|
|
duk_push_null(ctx);
|
|
}
|
|
else
|
|
{
|
|
// Just convert to a string
|
|
duk_push_lstring(ctx, buffer, strnlen_s(buffer, bufferLen)); // [buffer][string]
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cType = (char*)duk_require_string(ctx, 0);
|
|
if (strcmp(cType, "base64") == 0)
|
|
{
|
|
duk_push_fixed_buffer(ctx, ILibBase64EncodeLength((int)bufferLen));
|
|
tmpBuffer = Duktape_GetBuffer(ctx, -1, NULL);
|
|
ILibBase64Encode((unsigned char*)buffer, (int)bufferLen, (unsigned char**)&tmpBuffer);
|
|
duk_push_string(ctx, tmpBuffer);
|
|
}
|
|
else if (strcmp(cType, "hex") == 0)
|
|
{
|
|
duk_push_fixed_buffer(ctx, 1 + (bufferLen * 2));
|
|
tmpBuffer = Duktape_GetBuffer(ctx, -1, NULL);
|
|
util_tohex(buffer, (int)bufferLen, tmpBuffer);
|
|
duk_push_string(ctx, tmpBuffer);
|
|
}
|
|
else if (strcmp(cType, "hex:") == 0)
|
|
{
|
|
duk_push_fixed_buffer(ctx, 1 + (bufferLen * 3));
|
|
tmpBuffer = Duktape_GetBuffer(ctx, -1, NULL);
|
|
util_tohex2(buffer, (int)bufferLen, tmpBuffer);
|
|
duk_push_string(ctx, tmpBuffer);
|
|
}
|
|
else
|
|
{
|
|
return(ILibDuktape_Error(ctx, "Unrecognized parameter"));
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Buffer_from(duk_context *ctx)
|
|
{
|
|
int nargs = duk_get_top(ctx);
|
|
char *str;
|
|
duk_size_t strlength;
|
|
char *encoding;
|
|
char *buffer;
|
|
int bufferLen;
|
|
|
|
if (nargs == 1)
|
|
{
|
|
str = (char*)duk_get_lstring(ctx, 0, &strlength);
|
|
buffer = duk_push_fixed_buffer(ctx, strlength);
|
|
memcpy_s(buffer, strlength, str, strlength);
|
|
duk_push_buffer_object(ctx, -1, 0, strlength, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
return(1);
|
|
}
|
|
else if(!(nargs == 2 && duk_is_string(ctx, 0) && duk_is_string(ctx, 1)))
|
|
{
|
|
return(ILibDuktape_Error(ctx, "usage not supported yet"));
|
|
}
|
|
|
|
str = (char*)duk_get_lstring(ctx, 0, &strlength);
|
|
encoding = (char*)duk_require_string(ctx, 1);
|
|
|
|
if (strcmp(encoding, "base64") == 0)
|
|
{
|
|
// Base64
|
|
buffer = duk_push_fixed_buffer(ctx, ILibBase64DecodeLength((int)strlength));
|
|
bufferLen = ILibBase64Decode((unsigned char*)str, (int)strlength, (unsigned char**)&buffer);
|
|
duk_push_buffer_object(ctx, -1, 0, bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
}
|
|
else if (strcmp(encoding, "hex") == 0)
|
|
{
|
|
if (ILibString_StartsWith(str, (int)strlength, "0x", 2) != 0)
|
|
{
|
|
str += 2;
|
|
strlength -= 2;
|
|
}
|
|
buffer = duk_push_fixed_buffer(ctx, strlength / 2);
|
|
bufferLen = util_hexToBuf(str, (int)strlength, buffer);
|
|
duk_push_buffer_object(ctx, -1, 0, bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
}
|
|
else if (strcmp(encoding, "utf8") == 0)
|
|
{
|
|
str = (char*)duk_get_lstring(ctx, 0, &strlength);
|
|
buffer = duk_push_fixed_buffer(ctx, strlength);
|
|
memcpy_s(buffer, strlength, str, strlength);
|
|
duk_push_buffer_object(ctx, -1, 0, strlength, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
return(1);
|
|
}
|
|
else if (strcmp(encoding, "binary") == 0)
|
|
{
|
|
str = (char*)duk_get_lstring(ctx, 0, &strlength);
|
|
|
|
#ifdef WIN32
|
|
int r = MultiByteToWideChar(CP_UTF8, 0, (LPCCH)str, (int)strlength, NULL, 0);
|
|
buffer = duk_push_fixed_buffer(ctx, 2 + (2 * r));
|
|
strlength = (duk_size_t)MultiByteToWideChar(CP_UTF8, 0, (LPCCH)str, (int)strlength, (LPWSTR)buffer, r + 1);
|
|
r = (int)WideCharToMultiByte(CP_ISO8859_1, 0, (LPCWCH)buffer, (int)strlength, NULL, 0, NULL, FALSE);
|
|
duk_push_fixed_buffer(ctx, r);
|
|
WideCharToMultiByte(CP_ISO8859_1, 0, (LPCWCH)buffer, (int)strlength, (LPSTR)Duktape_GetBuffer(ctx, -1, NULL), r, NULL, FALSE);
|
|
duk_push_buffer_object(ctx, -1, 0, r, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
#else
|
|
duk_eval_string(ctx, "Buffer.fromBinary"); // [func]
|
|
duk_dup(ctx, 0);
|
|
duk_call(ctx, 1);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
return(ILibDuktape_Error(ctx, "unsupported encoding"));
|
|
}
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Buffer_readInt32BE(duk_context *ctx)
|
|
{
|
|
int offset = duk_require_int(ctx, 0);
|
|
char *buffer;
|
|
duk_size_t bufferLen;
|
|
|
|
duk_push_this(ctx);
|
|
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
|
|
|
|
duk_push_int(ctx, ntohl(((int*)(buffer + offset))[0]));
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Buffer_alloc(duk_context *ctx)
|
|
{
|
|
int sz = duk_require_int(ctx, 0);
|
|
int fill = 0;
|
|
|
|
if (duk_is_number(ctx, 1)) { fill = duk_require_int(ctx, 1); }
|
|
|
|
duk_push_fixed_buffer(ctx, sz);
|
|
char *buffer = Duktape_GetBuffer(ctx, -1, NULL);
|
|
memset(buffer, fill, sz);
|
|
duk_push_buffer_object(ctx, -1, 0, sz, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
return(1);
|
|
}
|
|
|
|
void ILibDuktape_Polyfills_Buffer(duk_context *ctx)
|
|
{
|
|
char extras[] =
|
|
"Object.defineProperty(Buffer.prototype, \"swap32\",\
|
|
{\
|
|
value: function swap32()\
|
|
{\
|
|
var a = this.readUInt16BE(0);\
|
|
var b = this.readUInt16BE(2);\
|
|
this.writeUInt16LE(a, 2);\
|
|
this.writeUInt16LE(b, 0);\
|
|
return(this);\
|
|
}\
|
|
});";
|
|
duk_eval_string(ctx, extras); duk_pop(ctx);
|
|
|
|
#ifdef _POSIX
|
|
char fromBinary[] =
|
|
"Object.defineProperty(Buffer, \"fromBinary\",\
|
|
{\
|
|
get: function()\
|
|
{\
|
|
return((function fromBinary(str)\
|
|
{\
|
|
var child = require('child_process').execFile('/usr/bin/iconv', ['iconv', '-c','-f', 'UTF-8', '-t', 'CP819']);\
|
|
child.stdout.buf = Buffer.alloc(0);\
|
|
child.stdout.on('data', function(c) { this.buf = Buffer.concat([this.buf, c]); });\
|
|
child.stdin.write(str);\
|
|
child.stderr.on('data', function(c) { });\
|
|
child.stdin.end();\
|
|
child.waitExit();\
|
|
return(child.stdout.buf);\
|
|
}));\
|
|
}\
|
|
});";
|
|
duk_eval_string_noresult(ctx, fromBinary);
|
|
|
|
#endif
|
|
|
|
// Polyfill Buffer.from()
|
|
duk_get_prop_string(ctx, -1, "Buffer"); // [g][Buffer]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_from, DUK_VARARGS); // [g][Buffer][func]
|
|
duk_put_prop_string(ctx, -2, "from"); // [g][Buffer]
|
|
duk_pop(ctx); // [g]
|
|
|
|
// Polyfill Buffer.alloc() for Node Buffers)
|
|
duk_get_prop_string(ctx, -1, "Buffer"); // [g][Buffer]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_alloc, DUK_VARARGS); // [g][Buffer][func]
|
|
duk_put_prop_string(ctx, -2, "alloc"); // [g][Buffer]
|
|
duk_pop(ctx); // [g]
|
|
|
|
|
|
// Polyfill Buffer.toString() for Node Buffers
|
|
duk_get_prop_string(ctx, -1, "Buffer"); // [g][Buffer]
|
|
duk_get_prop_string(ctx, -1, "prototype"); // [g][Buffer][prototype]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_toString, DUK_VARARGS); // [g][Buffer][prototype][func]
|
|
duk_put_prop_string(ctx, -2, "toString"); // [g][Buffer][prototype]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_Buffer_randomFill, DUK_VARARGS); // [g][Buffer][prototype][func]
|
|
duk_put_prop_string(ctx, -2, "randomFill"); // [g][Buffer][prototype]
|
|
duk_pop_2(ctx); // [g]
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_String_startsWith(duk_context *ctx)
|
|
{
|
|
duk_size_t tokenLen;
|
|
char *token = Duktape_GetBuffer(ctx, 0, &tokenLen);
|
|
char *buffer;
|
|
duk_size_t bufferLen;
|
|
|
|
duk_push_this(ctx);
|
|
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
|
|
|
|
if (ILibString_StartsWith(buffer, (int)bufferLen, token, (int)tokenLen) != 0)
|
|
{
|
|
duk_push_true(ctx);
|
|
}
|
|
else
|
|
{
|
|
duk_push_false(ctx);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_String_endsWith(duk_context *ctx)
|
|
{
|
|
duk_size_t tokenLen;
|
|
char *token = Duktape_GetBuffer(ctx, 0, &tokenLen);
|
|
char *buffer;
|
|
duk_size_t bufferLen;
|
|
|
|
duk_push_this(ctx);
|
|
buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
|
|
|
|
if (ILibString_EndsWith(buffer, (int)bufferLen, token, (int)tokenLen) != 0)
|
|
{
|
|
duk_push_true(ctx);
|
|
}
|
|
else
|
|
{
|
|
duk_push_false(ctx);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_String_padStart(duk_context *ctx)
|
|
{
|
|
int totalLen = (int)duk_require_int(ctx, 0);
|
|
|
|
duk_size_t padcharLen;
|
|
duk_size_t bufferLen;
|
|
|
|
char *padchars;
|
|
if (duk_get_top(ctx) > 1)
|
|
{
|
|
padchars = (char*)duk_get_lstring(ctx, 1, &padcharLen);
|
|
}
|
|
else
|
|
{
|
|
padchars = " ";
|
|
padcharLen = 1;
|
|
}
|
|
|
|
duk_push_this(ctx);
|
|
char *buffer = Duktape_GetBuffer(ctx, -1, &bufferLen);
|
|
|
|
if ((int)bufferLen > totalLen)
|
|
{
|
|
duk_push_lstring(ctx, buffer, bufferLen);
|
|
return(1);
|
|
}
|
|
else
|
|
{
|
|
duk_size_t needs = totalLen - bufferLen;
|
|
|
|
duk_push_array(ctx); // [array]
|
|
while(needs > 0)
|
|
{
|
|
if (needs > padcharLen)
|
|
{
|
|
duk_push_string(ctx, padchars); // [array][pad]
|
|
duk_put_prop_index(ctx, -2, (duk_uarridx_t)duk_get_length(ctx, -2)); // [array]
|
|
needs -= padcharLen;
|
|
}
|
|
else
|
|
{
|
|
duk_push_lstring(ctx, padchars, needs); // [array][pad]
|
|
duk_put_prop_index(ctx, -2, (duk_uarridx_t)duk_get_length(ctx, -2)); // [array]
|
|
needs = 0;
|
|
}
|
|
}
|
|
duk_push_lstring(ctx, buffer, bufferLen); // [array][pad]
|
|
duk_put_prop_index(ctx, -2, (duk_uarridx_t)duk_get_length(ctx, -2)); // [array]
|
|
duk_get_prop_string(ctx, -1, "join"); // [array][join]
|
|
duk_swap_top(ctx, -2); // [join][this]
|
|
duk_push_string(ctx, ""); // [join][this]['']
|
|
duk_call_method(ctx, 1); // [result]
|
|
return(1);
|
|
}
|
|
}
|
|
void ILibDuktape_Polyfills_String(duk_context *ctx)
|
|
{
|
|
// Polyfill 'String.startsWith'
|
|
duk_get_prop_string(ctx, -1, "String"); // [string]
|
|
duk_get_prop_string(ctx, -1, "prototype"); // [string][proto]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_String_startsWith, DUK_VARARGS); // [string][proto][func]
|
|
duk_put_prop_string(ctx, -2, "startsWith"); // [string][proto]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_String_endsWith, DUK_VARARGS); // [string][proto][func]
|
|
duk_put_prop_string(ctx, -2, "endsWith"); // [string][proto]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_String_padStart, DUK_VARARGS); // [string][proto][func]
|
|
duk_put_prop_string(ctx, -2, "padStart");
|
|
duk_pop_2(ctx);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_log(duk_context *ctx)
|
|
{
|
|
int numargs = duk_get_top(ctx);
|
|
int i, x;
|
|
int len = 0;
|
|
duk_size_t strLen;
|
|
char *str;
|
|
char *PREFIX = NULL;
|
|
char *DESTINATION = NULL;
|
|
duk_push_current_function(ctx);
|
|
ILibDuktape_LogTypes logType = (ILibDuktape_LogTypes)Duktape_GetIntPropertyValue(ctx, -1, "logType", ILibDuktape_LogType_Normal);
|
|
switch (logType)
|
|
{
|
|
case ILibDuktape_LogType_Warn:
|
|
PREFIX = (char*)"WARNING: "; // LENGTH MUST BE <= 9
|
|
DESTINATION = ILibDuktape_Console_WARN_Destination;
|
|
break;
|
|
case ILibDuktape_LogType_Error:
|
|
PREFIX = (char*)"ERROR: "; // LENGTH MUST BE <= 9
|
|
DESTINATION = ILibDuktape_Console_ERROR_Destination;
|
|
break;
|
|
case ILibDuktape_LogType_Info1:
|
|
case ILibDuktape_LogType_Info2:
|
|
case ILibDuktape_LogType_Info3:
|
|
duk_push_this(ctx);
|
|
i = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_Console_INFO_Level, 0);
|
|
duk_pop(ctx);
|
|
PREFIX = NULL;
|
|
if (i >= (((int)logType + 1) - (int)ILibDuktape_LogType_Info1))
|
|
{
|
|
DESTINATION = ILibDuktape_Console_LOG_Destination;
|
|
}
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
break;
|
|
default:
|
|
PREFIX = NULL;
|
|
DESTINATION = ILibDuktape_Console_LOG_Destination;
|
|
break;
|
|
}
|
|
duk_pop(ctx);
|
|
|
|
// Calculate total length of string
|
|
for (i = 0; i < numargs; ++i)
|
|
{
|
|
if (duk_is_string(ctx, i))
|
|
{
|
|
len += (i == 0 ? 0 : 2);
|
|
duk_get_lstring(ctx, i, &strLen);
|
|
len += (int)strLen;
|
|
}
|
|
else
|
|
{
|
|
duk_dup(ctx, i);
|
|
if (strcmp("[object Object]", duk_to_string(ctx, -1)) == 0)
|
|
{
|
|
duk_pop(ctx);
|
|
duk_dup(ctx, i);
|
|
len += (i == 0 ? 1 : 3);
|
|
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY);
|
|
int propNum = 0;
|
|
while (duk_next(ctx, -1, 1))
|
|
{
|
|
len += 2;
|
|
len += (propNum++ == 0 ? 1 : 2);
|
|
duk_to_lstring(ctx, -2, &strLen); len += (int)strLen;
|
|
duk_to_lstring(ctx, -1, &strLen); len += (int)strLen;
|
|
duk_pop_2(ctx);
|
|
}
|
|
duk_pop(ctx);
|
|
len += 2;
|
|
}
|
|
else
|
|
{
|
|
len += (i == 0 ? 0 : 2);
|
|
duk_get_lstring(ctx, -1, &strLen); len += (int)strLen;
|
|
}
|
|
}
|
|
}
|
|
len += 2; // NULL Terminator and final carriage return
|
|
strLen = len;
|
|
|
|
str = ILibMemory_AllocateA(strLen + ((PREFIX != NULL) ? strnlen_s(PREFIX, 9) : 0));
|
|
x = (int)(ILibMemory_AllocateA_Size(str) - strLen);
|
|
if (x != 0)
|
|
{
|
|
strLen += sprintf_s(str, strLen, PREFIX);
|
|
}
|
|
for (i = 0; i < numargs; ++i)
|
|
{
|
|
if (duk_is_string(ctx, i))
|
|
{
|
|
x += sprintf_s(str + x, strLen - x, "%s%s", (i == 0 ? "" : ", "), duk_require_string(ctx, i));
|
|
}
|
|
else
|
|
{
|
|
duk_dup(ctx, i);
|
|
if (strcmp("[object Object]", duk_to_string(ctx, -1)) == 0)
|
|
{
|
|
duk_pop(ctx);
|
|
duk_dup(ctx, i);
|
|
x += sprintf_s(str+x, strLen - x, "%s", (i == 0 ? "{" : ", {"));
|
|
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY);
|
|
int propNum = 0;
|
|
while (duk_next(ctx, -1, 1))
|
|
{
|
|
x += sprintf_s(str + x, strLen - x, "%s%s: %s", ((propNum++ == 0) ? " " : ", "), (char*)duk_to_string(ctx, -2), (char*)duk_to_string(ctx, -1));
|
|
duk_pop_2(ctx);
|
|
}
|
|
duk_pop(ctx);
|
|
x += sprintf_s(str + x, strLen - x, " }");
|
|
}
|
|
else
|
|
{
|
|
x += sprintf_s(str + x, strLen - x, "%s%s", (i == 0 ? "" : ", "), duk_to_string(ctx, -1));
|
|
}
|
|
}
|
|
}
|
|
x += sprintf_s(str + x, strLen - x, "\n");
|
|
|
|
duk_push_this(ctx); // [console]
|
|
int dest = Duktape_GetIntPropertyValue(ctx, -1, DESTINATION, ILibDuktape_Console_DestinationFlags_StdOut);
|
|
|
|
if ((dest & ILibDuktape_Console_DestinationFlags_StdOut) == ILibDuktape_Console_DestinationFlags_StdOut)
|
|
{
|
|
#ifdef WIN32
|
|
DWORD writeLen;
|
|
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), (void*)str, x, &writeLen, NULL);
|
|
#else
|
|
ignore_result(write(STDOUT_FILENO, str, x));
|
|
#endif
|
|
}
|
|
if ((dest & ILibDuktape_Console_DestinationFlags_WebLog) == ILibDuktape_Console_DestinationFlags_WebLog)
|
|
{
|
|
ILibRemoteLogging_printf(ILibChainGetLogger(Duktape_GetChain(ctx)), ILibRemoteLogging_Modules_Microstack_Generic, ILibRemoteLogging_Flags_VerbosityLevel_1, "%s", str);
|
|
}
|
|
if ((dest & ILibDuktape_Console_DestinationFlags_ServerConsole) == ILibDuktape_Console_DestinationFlags_ServerConsole)
|
|
{
|
|
if (duk_peval_string(ctx, "require('MeshAgent');") == 0)
|
|
{
|
|
duk_get_prop_string(ctx, -1, "SendCommand"); // [console][agent][SendCommand]
|
|
duk_swap_top(ctx, -2); // [console][SendCommand][this]
|
|
duk_push_object(ctx); // [console][SendCommand][this][options]
|
|
duk_push_string(ctx, "msg"); duk_put_prop_string(ctx, -2, "action");
|
|
duk_push_string(ctx, "console"); duk_put_prop_string(ctx, -2, "type");
|
|
duk_push_string(ctx, str); duk_put_prop_string(ctx, -2, "value");
|
|
if (duk_has_prop_string(ctx, -4, ILibDuktape_Console_SessionID))
|
|
{
|
|
duk_get_prop_string(ctx, -4, ILibDuktape_Console_SessionID);
|
|
duk_put_prop_string(ctx, -2, "sessionid");
|
|
}
|
|
duk_call_method(ctx, 1);
|
|
}
|
|
}
|
|
if ((dest & ILibDuktape_Console_DestinationFlags_LogFile) == ILibDuktape_Console_DestinationFlags_LogFile)
|
|
{
|
|
duk_size_t pathLen;
|
|
char *path;
|
|
char *tmp = ILibMemory_AllocateA(x + 32);
|
|
int tmpx = ILibGetLocalTime(tmp + 1, (int)ILibMemory_AllocateA_Size(tmp) - 1) + 1;
|
|
tmp[0] = '[';
|
|
tmp[tmpx] = ']';
|
|
tmp[tmpx + 1] = ':';
|
|
tmp[tmpx + 2] = ' ';
|
|
memcpy_s(tmp + tmpx + 3, ILibMemory_AllocateA_Size(tmp) - tmpx - 3, str, x);
|
|
duk_eval_string(ctx, "require('fs');");
|
|
duk_get_prop_string(ctx, -1, "writeFileSync"); // [fs][writeFileSync]
|
|
duk_swap_top(ctx, -2); // [writeFileSync][this]
|
|
duk_push_heapptr(ctx, ILibDuktape_GetProcessObject(ctx)); // [writeFileSync][this][process]
|
|
duk_get_prop_string(ctx, -1, "execPath"); // [writeFileSync][this][process][execPath]
|
|
path = (char*)duk_get_lstring(ctx, -1, &pathLen);
|
|
if (path != NULL)
|
|
{
|
|
if (ILibString_EndsWithEx(path, (int)pathLen, ".exe", 4, 0))
|
|
{
|
|
duk_get_prop_string(ctx, -1, "substring"); // [writeFileSync][this][process][execPath][substring]
|
|
duk_swap_top(ctx, -2); // [writeFileSync][this][process][substring][this]
|
|
duk_push_int(ctx, 0); // [writeFileSync][this][process][substring][this][0]
|
|
duk_push_int(ctx, (int)(pathLen - 4)); // [writeFileSync][this][process][substring][this][0][len]
|
|
duk_call_method(ctx, 2); // [writeFileSync][this][process][path]
|
|
}
|
|
duk_get_prop_string(ctx, -1, "concat"); // [writeFileSync][this][process][path][concat]
|
|
duk_swap_top(ctx, -2); // [writeFileSync][this][process][concat][this]
|
|
duk_push_string(ctx, ".jlog"); // [writeFileSync][this][process][concat][this][.jlog]
|
|
duk_call_method(ctx, 1); // [writeFileSync][this][process][logPath]
|
|
duk_remove(ctx, -2); // [writeFileSync][this][logPath]
|
|
duk_push_string(ctx, tmp); // [writeFileSync][this][logPath][log]
|
|
duk_push_object(ctx); // [writeFileSync][this][logPath][log][options]
|
|
duk_push_string(ctx, "a"); duk_put_prop_string(ctx, -2, "flags");
|
|
duk_call_method(ctx, 3);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_enableWebLog(duk_context *ctx)
|
|
{
|
|
#ifdef _REMOTELOGGING
|
|
void *chain = Duktape_GetChain(ctx);
|
|
int port = duk_require_int(ctx, 0);
|
|
duk_size_t pLen;
|
|
if (duk_peval_string(ctx, "process.argv0") != 0) { return(ILibDuktape_Error(ctx, "console.enableWebLog(): Couldn't fetch argv0")); }
|
|
char *p = (char*)duk_get_lstring(ctx, -1, &pLen);
|
|
if (ILibString_EndsWith(p, (int)pLen, ".js", 3) != 0)
|
|
{
|
|
memcpy_s(ILibScratchPad2, sizeof(ILibScratchPad2), p, pLen - 3);
|
|
sprintf_s(ILibScratchPad2 + (pLen - 3), sizeof(ILibScratchPad2) - 3, ".wlg");
|
|
}
|
|
else if (ILibString_EndsWith(p, (int)pLen, ".exe", 3) != 0)
|
|
{
|
|
memcpy_s(ILibScratchPad2, sizeof(ILibScratchPad2), p, pLen - 4);
|
|
sprintf_s(ILibScratchPad2 + (pLen - 3), sizeof(ILibScratchPad2) - 4, ".wlg");
|
|
}
|
|
else
|
|
{
|
|
sprintf_s(ILibScratchPad2, sizeof(ILibScratchPad2), "%s.wlg", p);
|
|
}
|
|
ILibStartDefaultLoggerEx(chain, (unsigned short)port, ILibScratchPad2);
|
|
#endif
|
|
return (0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_displayStreamPipe_getter(duk_context *ctx)
|
|
{
|
|
duk_push_int(ctx, g_displayStreamPipeMessages);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_displayStreamPipe_setter(duk_context *ctx)
|
|
{
|
|
g_displayStreamPipeMessages = duk_require_int(ctx, 0);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_displayFinalizer_getter(duk_context *ctx)
|
|
{
|
|
duk_push_int(ctx, g_displayFinalizerMessages);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_displayFinalizer_setter(duk_context *ctx)
|
|
{
|
|
g_displayFinalizerMessages = duk_require_int(ctx, 0);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_logRefCount(duk_context *ctx)
|
|
{
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "console"); // [g][console]
|
|
duk_get_prop_string(ctx, -1, "log"); // [g][console][log]
|
|
duk_swap_top(ctx, -2); // [g][log][this]
|
|
duk_push_sprintf(ctx, "Reference Count => %s[%p]:%d\n", Duktape_GetStringPropertyValue(ctx, 0, ILibDuktape_OBJID, "UNKNOWN"), duk_require_heapptr(ctx, 0), ILibDuktape_GetReferenceCount(ctx, 0) - 1);
|
|
duk_call_method(ctx, 1);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_setDestination(duk_context *ctx)
|
|
{
|
|
int nargs = duk_get_top(ctx);
|
|
int dest = duk_require_int(ctx, 0);
|
|
|
|
duk_push_this(ctx); // console
|
|
if ((dest & ILibDuktape_Console_DestinationFlags_ServerConsole) == ILibDuktape_Console_DestinationFlags_ServerConsole)
|
|
{
|
|
// Mesh Server Console
|
|
if (duk_peval_string(ctx, "require('MeshAgent');") != 0) { return(ILibDuktape_Error(ctx, "Unable to set destination to Mesh Console ")); }
|
|
duk_pop(ctx);
|
|
if (nargs > 1)
|
|
{
|
|
duk_dup(ctx, 1);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Console_SessionID);
|
|
}
|
|
else
|
|
{
|
|
duk_del_prop_string(ctx, -1, ILibDuktape_Console_SessionID);
|
|
}
|
|
}
|
|
duk_dup(ctx, 0);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Console_Destination);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_setInfoLevel(duk_context *ctx)
|
|
{
|
|
int val = duk_require_int(ctx, 0);
|
|
if (val < 0) { return(ILibDuktape_Error(ctx, "Invalid Info Level: %d", val)); }
|
|
|
|
duk_push_this(ctx);
|
|
duk_push_int(ctx, val);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Console_INFO_Level);
|
|
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Console_rawLog(duk_context *ctx)
|
|
{
|
|
char *val = (char*)duk_require_string(ctx, 0);
|
|
ILIBLOGMESSAGEX("%s", val);
|
|
return(0);
|
|
}
|
|
void ILibDuktape_Polyfills_Console(duk_context *ctx)
|
|
{
|
|
// Polyfill console.log()
|
|
#ifdef WIN32
|
|
SetConsoleOutputCP(CP_UTF8);
|
|
#endif
|
|
|
|
if (duk_has_prop_string(ctx, -1, "console"))
|
|
{
|
|
duk_get_prop_string(ctx, -1, "console"); // [g][console]
|
|
}
|
|
else
|
|
{
|
|
duk_push_object(ctx); // [g][console]
|
|
duk_dup(ctx, -1); // [g][console][console]
|
|
duk_put_prop_string(ctx, -3, "console"); // [g][console]
|
|
}
|
|
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Normal, "log", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Warn, "warn", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Error, "error", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Info1, "info1", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Info2, "info2", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "logType", (int)ILibDuktape_LogType_Info3, "info3", ILibDuktape_Polyfills_Console_log, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "rawLog", ILibDuktape_Polyfills_Console_rawLog, 1);
|
|
|
|
ILibDuktape_CreateInstanceMethod(ctx, "enableWebLog", ILibDuktape_Polyfills_Console_enableWebLog, 1);
|
|
ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "displayStreamPipeMessages", ILibDuktape_Polyfills_Console_displayStreamPipe_getter, ILibDuktape_Polyfills_Console_displayStreamPipe_setter);
|
|
ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "displayFinalizerMessages", ILibDuktape_Polyfills_Console_displayFinalizer_getter, ILibDuktape_Polyfills_Console_displayFinalizer_setter);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "logReferenceCount", ILibDuktape_Polyfills_Console_logRefCount, 1);
|
|
|
|
ILibDuktape_CreateInstanceMethod(ctx, "setDestination", ILibDuktape_Polyfills_Console_setDestination, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "setInfoLevel", ILibDuktape_Polyfills_Console_setInfoLevel, 1);
|
|
|
|
duk_push_object(ctx);
|
|
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_DISABLED); duk_put_prop_string(ctx, -2, "DISABLED");
|
|
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_StdOut); duk_put_prop_string(ctx, -2, "STDOUT");
|
|
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_ServerConsole); duk_put_prop_string(ctx, -2, "SERVERCONSOLE");
|
|
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_WebLog); duk_put_prop_string(ctx, -2, "WEBLOG");
|
|
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_LogFile); duk_put_prop_string(ctx, -2, "LOGFILE");
|
|
ILibDuktape_CreateReadonlyProperty(ctx, "Destinations");
|
|
|
|
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_StdOut | ILibDuktape_Console_DestinationFlags_LogFile);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Console_ERROR_Destination);
|
|
|
|
duk_push_int(ctx, ILibDuktape_Console_DestinationFlags_StdOut | ILibDuktape_Console_DestinationFlags_LogFile);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Console_WARN_Destination);
|
|
|
|
duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, ILibDuktape_Console_INFO_Level);
|
|
|
|
duk_pop(ctx); // [g]
|
|
}
|
|
duk_ret_t ILibDuktape_ntohl(duk_context *ctx)
|
|
{
|
|
duk_size_t bufferLen;
|
|
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
int offset = duk_require_int(ctx, 1);
|
|
|
|
if ((int)bufferLen < (4 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); }
|
|
duk_push_int(ctx, ntohl(((unsigned int*)(buffer + offset))[0]));
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_ntohs(duk_context *ctx)
|
|
{
|
|
duk_size_t bufferLen;
|
|
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
int offset = duk_require_int(ctx, 1);
|
|
|
|
if ((int)bufferLen < 2 + offset) { return(ILibDuktape_Error(ctx, "buffer too small")); }
|
|
duk_push_int(ctx, ntohs(((unsigned short*)(buffer + offset))[0]));
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_htonl(duk_context *ctx)
|
|
{
|
|
duk_size_t bufferLen;
|
|
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
int offset = duk_require_int(ctx, 1);
|
|
unsigned int val = (unsigned int)duk_require_int(ctx, 2);
|
|
|
|
if ((int)bufferLen < (4 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); }
|
|
((unsigned int*)(buffer + offset))[0] = htonl(val);
|
|
return 0;
|
|
}
|
|
duk_ret_t ILibDuktape_htons(duk_context *ctx)
|
|
{
|
|
duk_size_t bufferLen;
|
|
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
int offset = duk_require_int(ctx, 1);
|
|
unsigned int val = (unsigned int)duk_require_int(ctx, 2);
|
|
|
|
if ((int)bufferLen < (2 + offset)) { return(ILibDuktape_Error(ctx, "buffer too small")); }
|
|
((unsigned short*)(buffer + offset))[0] = htons(val);
|
|
return 0;
|
|
}
|
|
void ILibDuktape_Polyfills_byte_ordering(duk_context *ctx)
|
|
{
|
|
ILibDuktape_CreateInstanceMethod(ctx, "ntohl", ILibDuktape_ntohl, 2);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "ntohs", ILibDuktape_ntohs, 2);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "htonl", ILibDuktape_htonl, 3);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "htons", ILibDuktape_htons, 3);
|
|
}
|
|
|
|
typedef enum ILibDuktape_Timer_Type
|
|
{
|
|
ILibDuktape_Timer_Type_TIMEOUT = 0,
|
|
ILibDuktape_Timer_Type_INTERVAL = 1,
|
|
ILibDuktape_Timer_Type_IMMEDIATE = 2
|
|
}ILibDuktape_Timer_Type;
|
|
typedef struct ILibDuktape_Timer
|
|
{
|
|
duk_context *ctx;
|
|
void *object;
|
|
void *callback;
|
|
void *args;
|
|
int timeout;
|
|
ILibDuktape_Timer_Type timerType;
|
|
}ILibDuktape_Timer;
|
|
|
|
duk_ret_t ILibDuktape_Polyfills_timer_finalizer(duk_context *ctx)
|
|
{
|
|
// Make sure we remove any timers just in case, so we don't leak resources
|
|
ILibDuktape_Timer *ptrs;
|
|
if (duk_has_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs))
|
|
{
|
|
duk_get_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs);
|
|
if (duk_has_prop_string(ctx, 0, "\xFF_callback"))
|
|
{
|
|
duk_del_prop_string(ctx, 0, "\xFF_callback");
|
|
}
|
|
if (duk_has_prop_string(ctx, 0, "\xFF_argArray"))
|
|
{
|
|
duk_del_prop_string(ctx, 0, "\xFF_argArray");
|
|
}
|
|
ptrs = (ILibDuktape_Timer*)Duktape_GetBuffer(ctx, -1, NULL);
|
|
|
|
ILibLifeTime_Remove(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs);
|
|
}
|
|
return 0;
|
|
}
|
|
void ILibDuktape_Polyfills_timer_elapsed(void *obj)
|
|
{
|
|
ILibDuktape_Timer *ptrs = (ILibDuktape_Timer*)obj;
|
|
int argCount, i;
|
|
duk_context *ctx = ptrs->ctx;
|
|
char *funcName;
|
|
|
|
if (!ILibMemory_CanaryOK(ptrs)) { return; }
|
|
if (duk_check_stack(ctx, 3) == 0) { return; }
|
|
|
|
duk_push_heapptr(ctx, ptrs->callback); // [func]
|
|
funcName = Duktape_GetStringPropertyValue(ctx, -1, "name", "unknown_method");
|
|
duk_push_heapptr(ctx, ptrs->object); // [func][this]
|
|
duk_push_heapptr(ctx, ptrs->args); // [func][this][argArray]
|
|
|
|
if (ptrs->timerType == ILibDuktape_Timer_Type_INTERVAL)
|
|
{
|
|
ILibLifeTime_AddEx(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs, ptrs->timeout, ILibDuktape_Polyfills_timer_elapsed, NULL);
|
|
}
|
|
else
|
|
{
|
|
if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE)
|
|
{
|
|
duk_push_heap_stash(ctx);
|
|
duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object));
|
|
duk_pop(ctx);
|
|
}
|
|
|
|
duk_del_prop_string(ctx, -2, "\xFF_callback");
|
|
duk_del_prop_string(ctx, -2, "\xFF_argArray");
|
|
duk_del_prop_string(ctx, -2, ILibDuktape_Timer_Ptrs);
|
|
}
|
|
|
|
argCount = (int)duk_get_length(ctx, -1);
|
|
for (i = 0; i < argCount; ++i)
|
|
{
|
|
duk_get_prop_index(ctx, -1, i); // [func][this][argArray][arg]
|
|
duk_swap_top(ctx, -2); // [func][this][arg][argArray]
|
|
}
|
|
duk_pop(ctx); // [func][this][...arg...]
|
|
if (duk_pcall_method(ctx, argCount) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "timers.onElapsed() callback handler on '%s()' ", funcName); }
|
|
duk_pop(ctx); // ...
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx)
|
|
{
|
|
int nargs = duk_get_top(ctx);
|
|
ILibDuktape_Timer *ptrs;
|
|
ILibDuktape_Timer_Type timerType;
|
|
void *chain = Duktape_GetChain(ctx);
|
|
int argx;
|
|
|
|
duk_push_current_function(ctx);
|
|
duk_get_prop_string(ctx, -1, "type");
|
|
timerType = (ILibDuktape_Timer_Type)duk_get_int(ctx, -1);
|
|
|
|
duk_push_object(ctx); //[retVal]
|
|
switch (timerType)
|
|
{
|
|
case ILibDuktape_Timer_Type_IMMEDIATE:
|
|
ILibDuktape_WriteID(ctx, "Timers.immediate");
|
|
// We're only saving a reference for immediates
|
|
duk_push_heap_stash(ctx); //[retVal][stash]
|
|
duk_dup(ctx, -2); //[retVal][stash][immediate]
|
|
duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); //[retVal][stash]
|
|
duk_pop(ctx); //[retVal]
|
|
break;
|
|
case ILibDuktape_Timer_Type_INTERVAL:
|
|
ILibDuktape_WriteID(ctx, "Timers.interval");
|
|
break;
|
|
case ILibDuktape_Timer_Type_TIMEOUT:
|
|
ILibDuktape_WriteID(ctx, "Timers.timeout");
|
|
break;
|
|
}
|
|
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_Polyfills_timer_finalizer);
|
|
|
|
ptrs = (ILibDuktape_Timer*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_Timer)); //[retVal][ptrs]
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Timer_Ptrs); //[retVal]
|
|
|
|
ptrs->ctx = ctx;
|
|
ptrs->object = duk_get_heapptr(ctx, -1);
|
|
ptrs->timerType = timerType;
|
|
ptrs->timeout = timerType == ILibDuktape_Timer_Type_IMMEDIATE ? 0 : (int)duk_require_int(ctx, 1);
|
|
ptrs->callback = duk_require_heapptr(ctx, 0);
|
|
|
|
duk_push_array(ctx); //[retVal][argArray]
|
|
for (argx = ILibDuktape_Timer_Type_IMMEDIATE == timerType ? 1 : 2; argx < nargs; ++argx)
|
|
{
|
|
duk_dup(ctx, argx); //[retVal][argArray][arg]
|
|
duk_put_prop_index(ctx, -2, argx - (ILibDuktape_Timer_Type_IMMEDIATE == timerType ? 1 : 2));//[retVal][argArray]
|
|
}
|
|
ptrs->args = duk_get_heapptr(ctx, -1); //[retVal]
|
|
duk_put_prop_string(ctx, -2, "\xFF_argArray");
|
|
|
|
duk_dup(ctx, 0); //[retVal][callback]
|
|
duk_put_prop_string(ctx, -2, "\xFF_callback"); //[retVal]
|
|
|
|
ILibLifeTime_AddEx(ILibGetBaseTimer(chain), ptrs, ptrs->timeout, ILibDuktape_Polyfills_timer_elapsed, NULL);
|
|
return 1;
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_timer_clear(duk_context *ctx)
|
|
{
|
|
ILibDuktape_Timer *ptrs;
|
|
ILibDuktape_Timer_Type timerType;
|
|
|
|
duk_push_current_function(ctx);
|
|
duk_get_prop_string(ctx, -1, "type");
|
|
timerType = (ILibDuktape_Timer_Type)duk_get_int(ctx, -1);
|
|
|
|
if(!duk_has_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs))
|
|
{
|
|
switch (timerType)
|
|
{
|
|
case ILibDuktape_Timer_Type_TIMEOUT:
|
|
return(ILibDuktape_Error(ctx, "timers.clearTimeout(): Invalid Parameter"));
|
|
case ILibDuktape_Timer_Type_INTERVAL:
|
|
return(ILibDuktape_Error(ctx, "timers.clearInterval(): Invalid Parameter"));
|
|
case ILibDuktape_Timer_Type_IMMEDIATE:
|
|
return(ILibDuktape_Error(ctx, "timers.clearImmediate(): Invalid Parameter"));
|
|
}
|
|
}
|
|
|
|
duk_get_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs);
|
|
ptrs = (ILibDuktape_Timer*)Duktape_GetBuffer(ctx, -1, NULL);
|
|
|
|
if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE)
|
|
{
|
|
duk_push_heap_stash(ctx);
|
|
duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object));
|
|
duk_pop(ctx);
|
|
}
|
|
|
|
ILibLifeTime_Remove(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs);
|
|
return 0;
|
|
}
|
|
void ILibDuktape_Polyfills_timer(duk_context *ctx)
|
|
{
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_TIMEOUT, "setTimeout", ILibDuktape_Polyfills_timer_set, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_INTERVAL, "setInterval", ILibDuktape_Polyfills_timer_set, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_IMMEDIATE, "setImmediate", ILibDuktape_Polyfills_timer_set, DUK_VARARGS);
|
|
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_TIMEOUT, "clearTimeout", ILibDuktape_Polyfills_timer_clear, 1);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_INTERVAL, "clearInterval", ILibDuktape_Polyfills_timer_clear, 1);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "type", ILibDuktape_Timer_Type_IMMEDIATE, "clearImmediate", ILibDuktape_Polyfills_timer_clear, 1);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_getJSModule(duk_context *ctx)
|
|
{
|
|
if (ILibDuktape_ModSearch_GetJSModule(ctx, (char*)duk_require_string(ctx, 0)) == 0)
|
|
{
|
|
return(ILibDuktape_Error(ctx, "getJSModule(): (%s) not found", (char*)duk_require_string(ctx, 0)));
|
|
}
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_addModule(duk_context *ctx)
|
|
{
|
|
duk_size_t moduleLen;
|
|
char *module = (char*)Duktape_GetBuffer(ctx, 1, &moduleLen);
|
|
char *moduleName = (char*)duk_require_string(ctx, 0);
|
|
|
|
if (ILibDuktape_ModSearch_AddModule(ctx, moduleName, module, (int)moduleLen) != 0)
|
|
{
|
|
return(ILibDuktape_Error(ctx, "Cannot add module: %s", moduleName));
|
|
}
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_addModuleObject(duk_context *ctx)
|
|
{
|
|
void *module = duk_require_heapptr(ctx, 1);
|
|
char *moduleName = (char*)duk_require_string(ctx, 0);
|
|
|
|
ILibDuktape_ModSearch_AddModuleObject(ctx, moduleName, module);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Queue_Finalizer(duk_context *ctx)
|
|
{
|
|
duk_get_prop_string(ctx, 0, ILibDuktape_Queue_Ptr);
|
|
ILibQueue_Destroy((ILibQueue)duk_get_pointer(ctx, -1));
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Queue_EnQueue(duk_context *ctx)
|
|
{
|
|
ILibQueue Q;
|
|
int i;
|
|
int nargs = duk_get_top(ctx);
|
|
duk_push_this(ctx); // [queue]
|
|
duk_get_prop_string(ctx, -1, ILibDuktape_Queue_Ptr); // [queue][ptr]
|
|
Q = (ILibQueue)duk_get_pointer(ctx, -1);
|
|
duk_pop(ctx); // [queue]
|
|
|
|
ILibDuktape_Push_ObjectStash(ctx); // [queue][stash]
|
|
duk_push_array(ctx); // [queue][stash][array]
|
|
for (i = 0; i < nargs; ++i)
|
|
{
|
|
duk_dup(ctx, i); // [queue][stash][array][arg]
|
|
duk_put_prop_index(ctx, -2, i); // [queue][stash][array]
|
|
}
|
|
ILibQueue_EnQueue(Q, duk_get_heapptr(ctx, -1));
|
|
duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); // [queue][stash]
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Queue_DeQueue(duk_context *ctx)
|
|
{
|
|
duk_push_current_function(ctx);
|
|
duk_get_prop_string(ctx, -1, "peek");
|
|
int peek = duk_get_int(ctx, -1);
|
|
|
|
duk_push_this(ctx); // [Q]
|
|
duk_get_prop_string(ctx, -1, ILibDuktape_Queue_Ptr); // [Q][ptr]
|
|
ILibQueue Q = (ILibQueue)duk_get_pointer(ctx, -1);
|
|
void *h = peek == 0 ? ILibQueue_DeQueue(Q) : ILibQueue_PeekQueue(Q);
|
|
if (h == NULL) { return(ILibDuktape_Error(ctx, "Queue is empty")); }
|
|
duk_pop(ctx); // [Q]
|
|
ILibDuktape_Push_ObjectStash(ctx); // [Q][stash]
|
|
duk_push_heapptr(ctx, h); // [Q][stash][array]
|
|
int length = (int)duk_get_length(ctx, -1);
|
|
int i;
|
|
for (i = 0; i < length; ++i)
|
|
{
|
|
duk_get_prop_index(ctx, -i - 1, i); // [Q][stash][array][args]
|
|
}
|
|
if (peek == 0) { duk_del_prop_string(ctx, -length - 2, Duktape_GetStashKey(h)); }
|
|
return(length);
|
|
}
|
|
duk_ret_t ILibDuktape_Queue_isEmpty(duk_context *ctx)
|
|
{
|
|
duk_push_this(ctx);
|
|
duk_push_boolean(ctx, ILibQueue_IsEmpty((ILibQueue)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Queue_Ptr)));
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Queue_new(duk_context *ctx)
|
|
{
|
|
duk_push_object(ctx); // [queue]
|
|
duk_push_pointer(ctx, ILibQueue_Create()); // [queue][ptr]
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Queue_Ptr); // [queue]
|
|
|
|
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_Queue_Finalizer);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "enQueue", ILibDuktape_Queue_EnQueue, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "peek", 0, "deQueue", ILibDuktape_Queue_DeQueue, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "peek", 1, "peekQueue", ILibDuktape_Queue_DeQueue, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "isEmpty", ILibDuktape_Queue_isEmpty, 0);
|
|
|
|
return(1);
|
|
}
|
|
void ILibDuktape_Queue_Push(duk_context *ctx, void* chain)
|
|
{
|
|
duk_push_c_function(ctx, ILibDuktape_Queue_new, 0);
|
|
}
|
|
|
|
typedef struct ILibDuktape_DynamicBuffer_data
|
|
{
|
|
int start;
|
|
int end;
|
|
int unshiftBytes;
|
|
char *buffer;
|
|
int bufferLen;
|
|
}ILibDuktape_DynamicBuffer_data;
|
|
|
|
typedef struct ILibDuktape_DynamicBuffer_ContextSwitchData
|
|
{
|
|
void *chain;
|
|
void *heapptr;
|
|
ILibDuktape_DuplexStream *stream;
|
|
ILibDuktape_DynamicBuffer_data *data;
|
|
int bufferLen;
|
|
char buffer[];
|
|
}ILibDuktape_DynamicBuffer_ContextSwitchData;
|
|
|
|
ILibTransport_DoneState ILibDuktape_DynamicBuffer_WriteSink(ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user);
|
|
void ILibDuktape_DynamicBuffer_WriteSink_ChainThread(void *chain, void *user)
|
|
{
|
|
ILibDuktape_DynamicBuffer_ContextSwitchData *data = (ILibDuktape_DynamicBuffer_ContextSwitchData*)user;
|
|
if(ILibMemory_CanaryOK(data->stream))
|
|
{
|
|
ILibDuktape_DynamicBuffer_WriteSink(data->stream, data->buffer, data->bufferLen, data->data);
|
|
ILibDuktape_DuplexStream_Ready(data->stream);
|
|
}
|
|
free(user);
|
|
}
|
|
ILibTransport_DoneState ILibDuktape_DynamicBuffer_WriteSink(ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user)
|
|
{
|
|
ILibDuktape_DynamicBuffer_data *data = (ILibDuktape_DynamicBuffer_data*)user;
|
|
if (ILibIsRunningOnChainThread(stream->readableStream->chain) == 0)
|
|
{
|
|
ILibDuktape_DynamicBuffer_ContextSwitchData *tmp = (ILibDuktape_DynamicBuffer_ContextSwitchData*)ILibMemory_Allocate(sizeof(ILibDuktape_DynamicBuffer_ContextSwitchData) + bufferLen, 0, NULL, NULL);
|
|
tmp->chain = stream->readableStream->chain;
|
|
tmp->heapptr = stream->ParentObject;
|
|
tmp->stream = stream;
|
|
tmp->data = data;
|
|
tmp->bufferLen = bufferLen;
|
|
memcpy_s(tmp->buffer, bufferLen, buffer, bufferLen);
|
|
ILibChain_RunOnMicrostackThread(tmp->chain, ILibDuktape_DynamicBuffer_WriteSink_ChainThread, tmp);
|
|
return(ILibTransport_DoneState_INCOMPLETE);
|
|
}
|
|
|
|
|
|
if ((data->bufferLen - data->start - data->end) < bufferLen)
|
|
{
|
|
if (data->end > 0)
|
|
{
|
|
// Move the buffer first
|
|
memmove_s(data->buffer, data->bufferLen, data->buffer + data->start, data->end);
|
|
data->start = 0;
|
|
}
|
|
if ((data->bufferLen - data->end) < bufferLen)
|
|
{
|
|
// Need to resize buffer first
|
|
int tmpSize = data->bufferLen;
|
|
while ((tmpSize - data->end) < bufferLen)
|
|
{
|
|
tmpSize += 4096;
|
|
}
|
|
if ((data->buffer = (char*)realloc(data->buffer, tmpSize)) == NULL) { ILIBCRITICALEXIT(254); }
|
|
data->bufferLen = tmpSize;
|
|
}
|
|
}
|
|
|
|
|
|
memcpy_s(data->buffer + data->start + data->end, data->bufferLen - data->start - data->end, buffer, bufferLen);
|
|
data->end += bufferLen;
|
|
|
|
int unshifted = 0;
|
|
do
|
|
{
|
|
duk_push_heapptr(stream->readableStream->ctx, stream->ParentObject); // [ds]
|
|
duk_get_prop_string(stream->readableStream->ctx, -1, "emit"); // [ds][emit]
|
|
duk_swap_top(stream->readableStream->ctx, -2); // [emit][this]
|
|
duk_push_string(stream->readableStream->ctx, "readable"); // [emit][this][readable]
|
|
if (duk_pcall_method(stream->readableStream->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(stream->readableStream->ctx, "DynamicBuffer.WriteSink => readable(): "); }
|
|
duk_pop(stream->readableStream->ctx); // ...
|
|
|
|
ILibDuktape_DuplexStream_WriteData(stream, data->buffer + data->start, data->end);
|
|
if (data->unshiftBytes == 0)
|
|
{
|
|
// All the data was consumed
|
|
data->start = data->end = 0;
|
|
}
|
|
else
|
|
{
|
|
unshifted = (data->end - data->unshiftBytes);
|
|
if (unshifted > 0)
|
|
{
|
|
data->start += unshifted;
|
|
data->end = data->unshiftBytes;
|
|
data->unshiftBytes = 0;
|
|
}
|
|
}
|
|
} while (unshifted != 0);
|
|
|
|
return(ILibTransport_DoneState_COMPLETE);
|
|
}
|
|
void ILibDuktape_DynamicBuffer_EndSink(ILibDuktape_DuplexStream *stream, void *user)
|
|
{
|
|
ILibDuktape_DuplexStream_WriteEnd(stream);
|
|
}
|
|
duk_ret_t ILibDuktape_DynamicBuffer_Finalizer(duk_context *ctx)
|
|
{
|
|
duk_get_prop_string(ctx, 0, "\xFF_buffer");
|
|
ILibDuktape_DynamicBuffer_data *data = (ILibDuktape_DynamicBuffer_data*)Duktape_GetBuffer(ctx, -1, NULL);
|
|
free(data->buffer);
|
|
return(0);
|
|
}
|
|
|
|
int ILibDuktape_DynamicBuffer_unshift(ILibDuktape_DuplexStream *sender, int unshiftBytes, void *user)
|
|
{
|
|
ILibDuktape_DynamicBuffer_data *data = (ILibDuktape_DynamicBuffer_data*)user;
|
|
data->unshiftBytes = unshiftBytes;
|
|
return(unshiftBytes);
|
|
}
|
|
duk_ret_t ILibDuktape_DynamicBuffer_read(duk_context *ctx)
|
|
{
|
|
ILibDuktape_DynamicBuffer_data *data;
|
|
duk_push_this(ctx); // [DynamicBuffer]
|
|
duk_get_prop_string(ctx, -1, "\xFF_buffer"); // [DynamicBuffer][buffer]
|
|
data = (ILibDuktape_DynamicBuffer_data*)Duktape_GetBuffer(ctx, -1, NULL);
|
|
duk_push_external_buffer(ctx); // [DynamicBuffer][buffer][extBuffer]
|
|
duk_config_buffer(ctx, -1, data->buffer + data->start, data->bufferLen - (data->start + data->end));
|
|
duk_push_buffer_object(ctx, -1, 0, data->bufferLen - (data->start + data->end), DUK_BUFOBJ_NODEJS_BUFFER);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_DynamicBuffer_new(duk_context *ctx)
|
|
{
|
|
ILibDuktape_DynamicBuffer_data *data;
|
|
int initSize = 4096;
|
|
if (duk_get_top(ctx) != 0)
|
|
{
|
|
initSize = duk_require_int(ctx, 0);
|
|
}
|
|
|
|
duk_push_object(ctx); // [stream]
|
|
duk_push_fixed_buffer(ctx, sizeof(ILibDuktape_DynamicBuffer_data));
|
|
data = (ILibDuktape_DynamicBuffer_data*)Duktape_GetBuffer(ctx, -1, NULL);
|
|
memset(data, 0, sizeof(ILibDuktape_DynamicBuffer_data));
|
|
duk_put_prop_string(ctx, -2, "\xFF_buffer");
|
|
|
|
data->bufferLen = initSize;
|
|
data->buffer = (char*)malloc(initSize);
|
|
|
|
ILibDuktape_DuplexStream_InitEx(ctx, ILibDuktape_DynamicBuffer_WriteSink, ILibDuktape_DynamicBuffer_EndSink, NULL, NULL, ILibDuktape_DynamicBuffer_unshift, data);
|
|
ILibDuktape_EventEmitter_CreateEventEx(ILibDuktape_EventEmitter_GetEmitter(ctx, -1), "readable");
|
|
ILibDuktape_CreateInstanceMethod(ctx, "read", ILibDuktape_DynamicBuffer_read, DUK_VARARGS);
|
|
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_DynamicBuffer_Finalizer);
|
|
|
|
return(1);
|
|
}
|
|
|
|
void ILibDuktape_DynamicBuffer_Push(duk_context *ctx, void *chain)
|
|
{
|
|
duk_push_c_function(ctx, ILibDuktape_DynamicBuffer_new, DUK_VARARGS);
|
|
}
|
|
|
|
duk_ret_t ILibDuktape_Polyfills_debugCrash(duk_context *ctx)
|
|
{
|
|
void *p = NULL;
|
|
((int*)p)[0] = 55;
|
|
return(0);
|
|
}
|
|
|
|
|
|
void ILibDuktape_Stream_PauseSink(struct ILibDuktape_readableStream *sender, void *user)
|
|
{
|
|
}
|
|
void ILibDuktape_Stream_ResumeSink(struct ILibDuktape_readableStream *sender, void *user)
|
|
{
|
|
int skip = 0;
|
|
duk_size_t bufferLen;
|
|
|
|
duk_push_heapptr(sender->ctx, sender->object); // [stream]
|
|
void *func = Duktape_GetHeapptrProperty(sender->ctx, -1, "_read");
|
|
duk_pop(sender->ctx); // ...
|
|
|
|
while (func != NULL && sender->paused == 0)
|
|
{
|
|
duk_push_heapptr(sender->ctx, sender->object); // [this]
|
|
if (!skip && duk_has_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer))
|
|
{
|
|
duk_get_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer); // [this][buffer]
|
|
if ((bufferLen = duk_get_length(sender->ctx, -1)) > 0)
|
|
{
|
|
// Buffer is not empty, so we need to 'PUSH' it
|
|
duk_get_prop_string(sender->ctx, -2, "push"); // [this][buffer][push]
|
|
duk_dup(sender->ctx, -3); // [this][buffer][push][this]
|
|
duk_dup(sender->ctx, -3); // [this][buffer][push][this][buffer]
|
|
duk_remove(sender->ctx, -4); // [this][push][this][buffer]
|
|
duk_call_method(sender->ctx, 1); // [this][boolean]
|
|
sender->paused = !duk_get_boolean(sender->ctx, -1);
|
|
duk_pop(sender->ctx); // [this]
|
|
|
|
if (duk_has_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer))
|
|
{
|
|
duk_get_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer); // [this][buffer]
|
|
if (duk_get_length(sender->ctx, -1) == bufferLen)
|
|
{
|
|
// All the data was unshifted
|
|
skip = !sender->paused;
|
|
}
|
|
duk_pop(sender->ctx); // [this]
|
|
}
|
|
duk_pop(sender->ctx); // ...
|
|
}
|
|
else
|
|
{
|
|
// Buffer is empty
|
|
duk_pop(sender->ctx); // [this]
|
|
duk_del_prop_string(sender->ctx, -1, ILibDuktape_Stream_Buffer);
|
|
duk_pop(sender->ctx); // ...
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// We need to 'read' more data
|
|
duk_push_heapptr(sender->ctx, func); // [this][read]
|
|
duk_swap_top(sender->ctx, -2); // [read][this]
|
|
if (duk_pcall_method(sender->ctx, 0) != 0) { ILibDuktape_Process_UncaughtException(sender->ctx); duk_pop(sender->ctx); break; }
|
|
// // [buffer]
|
|
duk_push_heapptr(sender->ctx, sender->object); // [buffer][this]
|
|
duk_swap_top(sender->ctx, -2); // [this][buffer]
|
|
if (duk_has_prop_string(sender->ctx, -2, ILibDuktape_Stream_Buffer))
|
|
{
|
|
duk_push_global_object(sender->ctx); // [this][buffer][g]
|
|
duk_get_prop_string(sender->ctx, -1, "Buffer"); // [this][buffer][g][Buffer]
|
|
duk_remove(sender->ctx, -2); // [this][buffer][Buffer]
|
|
duk_get_prop_string(sender->ctx, -1, "concat"); // [this][buffer][Buffer][concat]
|
|
duk_swap_top(sender->ctx, -2); // [this][buffer][concat][this]
|
|
duk_push_array(sender->ctx); // [this][buffer][concat][this][Array]
|
|
duk_get_prop_string(sender->ctx, -1, "push"); // [this][buffer][concat][this][Array][push]
|
|
duk_dup(sender->ctx, -2); // [this][buffer][concat][this][Array][push][this]
|
|
duk_get_prop_string(sender->ctx, -7, ILibDuktape_Stream_Buffer); // [this][buffer][concat][this][Array][push][this][buffer]
|
|
duk_call_method(sender->ctx, 1); duk_pop(sender->ctx); // [this][buffer][concat][this][Array]
|
|
duk_get_prop_string(sender->ctx, -1, "push"); // [this][buffer][concat][this][Array][push]
|
|
duk_dup(sender->ctx, -2); // [this][buffer][concat][this][Array][push][this]
|
|
duk_dup(sender->ctx, -6); // [this][buffer][concat][this][Array][push][this][buffer]
|
|
duk_remove(sender->ctx, -7); // [this][concat][this][Array][push][this][buffer]
|
|
duk_call_method(sender->ctx, 1); duk_pop(sender->ctx); // [this][concat][this][Array]
|
|
duk_call_method(sender->ctx, 1); // [this][buffer]
|
|
}
|
|
duk_put_prop_string(sender->ctx, -2, ILibDuktape_Stream_Buffer); // [this]
|
|
duk_pop(sender->ctx); // ...
|
|
skip = 0;
|
|
}
|
|
}
|
|
}
|
|
int ILibDuktape_Stream_UnshiftSink(struct ILibDuktape_readableStream *sender, int unshiftBytes, void *user)
|
|
{
|
|
duk_push_fixed_buffer(sender->ctx, unshiftBytes); // [buffer]
|
|
memcpy_s(Duktape_GetBuffer(sender->ctx, -1, NULL), unshiftBytes, sender->unshiftReserved, unshiftBytes);
|
|
duk_push_heapptr(sender->ctx, sender->object); // [buffer][stream]
|
|
duk_push_buffer_object(sender->ctx, -2, 0, unshiftBytes, DUK_BUFOBJ_NODEJS_BUFFER); // [buffer][stream][buffer]
|
|
duk_put_prop_string(sender->ctx, -2, ILibDuktape_Stream_Buffer); // [buffer][stream]
|
|
duk_pop_2(sender->ctx); // ...
|
|
|
|
return(unshiftBytes);
|
|
}
|
|
duk_ret_t ILibDuktape_Stream_Push(duk_context *ctx)
|
|
{
|
|
duk_push_this(ctx); // [stream]
|
|
ILibDuktape_readableStream *RS = (ILibDuktape_readableStream*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Stream_ReadablePtr);
|
|
|
|
duk_size_t bufferLen;
|
|
char *buffer = (char*)Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
if (buffer != NULL)
|
|
{
|
|
duk_push_boolean(ctx, !ILibDuktape_readableStream_WriteDataEx(RS, 0, buffer, (int)bufferLen)); // [stream][buffer][retVal]
|
|
}
|
|
else
|
|
{
|
|
ILibDuktape_readableStream_WriteEnd(RS);
|
|
duk_push_false(ctx);
|
|
}
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Stream_EndSink(duk_context *ctx)
|
|
{
|
|
duk_push_this(ctx); // [stream]
|
|
ILibDuktape_readableStream *RS = (ILibDuktape_readableStream*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Stream_ReadablePtr);
|
|
ILibDuktape_readableStream_WriteEnd(RS);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Stream_readonlyError(duk_context *ctx)
|
|
{
|
|
duk_push_current_function(ctx);
|
|
duk_size_t len;
|
|
char *propName = Duktape_GetStringPropertyValueEx(ctx, -1, "propName", "<unknown>", &len);
|
|
duk_push_lstring(ctx, propName, len);
|
|
duk_get_prop_string(ctx, -1, "concat"); // [string][concat]
|
|
duk_swap_top(ctx, -2); // [concat][this]
|
|
duk_push_string(ctx, " is readonly"); // [concat][this][str]
|
|
duk_call_method(ctx, 1); // [str]
|
|
duk_throw(ctx);
|
|
return(0);
|
|
}
|
|
duk_idx_t ILibDuktape_Stream_newReadable(duk_context *ctx)
|
|
{
|
|
ILibDuktape_readableStream *RS;
|
|
duk_push_object(ctx); // [Readable]
|
|
ILibDuktape_WriteID(ctx, "stream.readable");
|
|
RS = ILibDuktape_ReadableStream_InitEx(ctx, ILibDuktape_Stream_PauseSink, ILibDuktape_Stream_ResumeSink, ILibDuktape_Stream_UnshiftSink, NULL);
|
|
RS->paused = 1;
|
|
|
|
duk_push_pointer(ctx, RS);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_ReadablePtr);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "push", ILibDuktape_Stream_Push, DUK_VARARGS);
|
|
ILibDuktape_EventEmitter_AddOnceEx3(ctx, -1, "end", ILibDuktape_Stream_EndSink);
|
|
|
|
if (duk_is_object(ctx, 0))
|
|
{
|
|
void *h = Duktape_GetHeapptrProperty(ctx, 0, "read");
|
|
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_read"); }
|
|
else
|
|
{
|
|
ILibDuktape_CreateEventWithSetterEx(ctx, "_read", ILibDuktape_Stream_readonlyError);
|
|
}
|
|
}
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Stream_Writable_WriteSink_Flush(duk_context *ctx)
|
|
{
|
|
duk_push_current_function(ctx);
|
|
ILibTransport_DoneState *retVal = (ILibTransport_DoneState*)Duktape_GetPointerProperty(ctx, -1, "retval");
|
|
if (retVal != NULL)
|
|
{
|
|
*retVal = ILibTransport_DoneState_COMPLETE;
|
|
}
|
|
else
|
|
{
|
|
ILibDuktape_WritableStream *WS = (ILibDuktape_WritableStream*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Stream_WritablePtr);
|
|
ILibDuktape_WritableStream_Ready(WS);
|
|
}
|
|
return(0);
|
|
}
|
|
ILibTransport_DoneState ILibDuktape_Stream_Writable_WriteSink(struct ILibDuktape_WritableStream *stream, char *buffer, int bufferLen, void *user)
|
|
{
|
|
void *h;
|
|
ILibTransport_DoneState retVal = ILibTransport_DoneState_INCOMPLETE;
|
|
|
|
duk_push_this(stream->ctx); // [writable]
|
|
duk_get_prop_string(stream->ctx, -1, "_write"); // [writable][_write]
|
|
duk_swap_top(stream->ctx, -2); // [_write][this]
|
|
if (stream->Reserved == 0)
|
|
{
|
|
duk_push_external_buffer(stream->ctx); // [_write][this][extBuffer]
|
|
duk_insert(stream->ctx, -3); // [extBuffer][_write][this]
|
|
duk_config_buffer(stream->ctx, -3, buffer, (duk_size_t)bufferLen);
|
|
duk_push_buffer_object(stream->ctx, -3, 0, (duk_size_t)bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);// [extBuffer][_write][this][buffer]
|
|
}
|
|
else
|
|
{
|
|
duk_push_lstring(stream->ctx, buffer, (duk_size_t)bufferLen); // [_write][this][string]
|
|
}
|
|
duk_push_c_function(stream->ctx, ILibDuktape_Stream_Writable_WriteSink_Flush, DUK_VARARGS); // [_write][this][string/buffer][callback]
|
|
h = duk_get_heapptr(stream->ctx, -1);
|
|
duk_push_heap_stash(stream->ctx); // [_write][this][string/buffer][callback][stash]
|
|
duk_dup(stream->ctx, -2); // [_write][this][string/buffer][callback][stash][callback]
|
|
duk_put_prop_string(stream->ctx, -2, Duktape_GetStashKey(h)); // [_write][this][string/buffer][callback][stash]
|
|
duk_pop(stream->ctx); // [_write][this][string/buffer][callback]
|
|
duk_push_pointer(stream->ctx, stream); duk_put_prop_string(stream->ctx, -2, ILibDuktape_Stream_WritablePtr);
|
|
|
|
duk_push_pointer(stream->ctx, &retVal); // [_write][this][string/buffer][callback][retval]
|
|
duk_put_prop_string(stream->ctx, -2, "retval"); // [_write][this][string/buffer][callback]
|
|
if (duk_pcall_method(stream->ctx, 2) != 0)
|
|
{
|
|
ILibDuktape_Process_UncaughtExceptionEx(stream->ctx, "stream.writable.write(): "); retVal = ILibTransport_DoneState_ERROR;
|
|
}
|
|
else
|
|
{
|
|
retVal = duk_to_boolean(stream->ctx, -1) ? ILibTransport_DoneState_COMPLETE : ILibTransport_DoneState_INCOMPLETE;
|
|
}
|
|
duk_pop(stream->ctx); // ...
|
|
|
|
duk_push_heapptr(stream->ctx, h); // [callback]
|
|
duk_del_prop_string(stream->ctx, -1, "retval");
|
|
duk_pop(stream->ctx); // ...
|
|
|
|
duk_push_heap_stash(stream->ctx);
|
|
duk_del_prop_string(stream->ctx, -1, Duktape_GetStashKey(h));
|
|
duk_pop(stream->ctx);
|
|
|
|
return(retVal);
|
|
}
|
|
duk_ret_t ILibDuktape_Stream_Writable_EndSink_finish(duk_context *ctx)
|
|
{
|
|
duk_push_current_function(ctx);
|
|
ILibDuktape_WritableStream *ws = (ILibDuktape_WritableStream*)Duktape_GetPointerProperty(ctx, -1, "ptr");
|
|
if (ILibMemory_CanaryOK(ws))
|
|
{
|
|
ILibDuktape_WritableStream_Finish(ws);
|
|
}
|
|
return(0);
|
|
}
|
|
void ILibDuktape_Stream_Writable_EndSink(struct ILibDuktape_WritableStream *stream, void *user)
|
|
{
|
|
duk_push_this(stream->ctx); // [writable]
|
|
duk_get_prop_string(stream->ctx, -1, "_final"); // [writable][_final]
|
|
duk_swap_top(stream->ctx, -2); // [_final][this]
|
|
duk_push_c_function(stream->ctx, ILibDuktape_Stream_Writable_EndSink_finish, 0); // [_final][this][callback]
|
|
duk_push_pointer(stream->ctx, stream); duk_put_prop_string(stream->ctx, -2, "ptr");
|
|
if (duk_pcall_method(stream->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(stream->ctx, "stream.writable._final(): "); }
|
|
duk_pop(stream->ctx); // ...
|
|
}
|
|
duk_ret_t ILibDuktape_Stream_newWritable(duk_context *ctx)
|
|
{
|
|
ILibDuktape_WritableStream *WS;
|
|
duk_push_object(ctx); // [Writable]
|
|
ILibDuktape_WriteID(ctx, "stream.writable");
|
|
WS = ILibDuktape_WritableStream_Init(ctx, ILibDuktape_Stream_Writable_WriteSink, ILibDuktape_Stream_Writable_EndSink, NULL);
|
|
WS->JSCreated = 1;
|
|
|
|
duk_push_pointer(ctx, WS);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_WritablePtr);
|
|
|
|
if (duk_is_object(ctx, 0))
|
|
{
|
|
void *h = Duktape_GetHeapptrProperty(ctx, 0, "write");
|
|
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_write"); }
|
|
h = Duktape_GetHeapptrProperty(ctx, 0, "final");
|
|
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_final"); }
|
|
}
|
|
return(1);
|
|
}
|
|
void ILibDuktape_Stream_Duplex_PauseSink(ILibDuktape_DuplexStream *stream, void *user)
|
|
{
|
|
ILibDuktape_Stream_PauseSink(stream->readableStream, user);
|
|
}
|
|
void ILibDuktape_Stream_Duplex_ResumeSink(ILibDuktape_DuplexStream *stream, void *user)
|
|
{
|
|
ILibDuktape_Stream_ResumeSink(stream->readableStream, user);
|
|
}
|
|
int ILibDuktape_Stream_Duplex_UnshiftSink(ILibDuktape_DuplexStream *stream, int unshiftBytes, void *user)
|
|
{
|
|
return(ILibDuktape_Stream_UnshiftSink(stream->readableStream, unshiftBytes, user));
|
|
}
|
|
ILibTransport_DoneState ILibDuktape_Stream_Duplex_WriteSink(ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user)
|
|
{
|
|
return(ILibDuktape_Stream_Writable_WriteSink(stream->writableStream, buffer, bufferLen, user));
|
|
}
|
|
void ILibDuktape_Stream_Duplex_EndSink(ILibDuktape_DuplexStream *stream, void *user)
|
|
{
|
|
ILibDuktape_Stream_Writable_EndSink(stream->writableStream, user);
|
|
}
|
|
|
|
duk_ret_t ILibDuktape_Stream_newDuplex(duk_context *ctx)
|
|
{
|
|
ILibDuktape_DuplexStream *DS;
|
|
duk_push_object(ctx); // [Duplex]
|
|
ILibDuktape_WriteID(ctx, "stream.Duplex");
|
|
DS = ILibDuktape_DuplexStream_InitEx(ctx, ILibDuktape_Stream_Duplex_WriteSink, ILibDuktape_Stream_Duplex_EndSink, ILibDuktape_Stream_Duplex_PauseSink, ILibDuktape_Stream_Duplex_ResumeSink, ILibDuktape_Stream_Duplex_UnshiftSink, NULL);
|
|
DS->writableStream->JSCreated = 1;
|
|
|
|
duk_push_pointer(ctx, DS->writableStream);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_WritablePtr);
|
|
|
|
duk_push_pointer(ctx, DS->readableStream);
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_Stream_ReadablePtr);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "push", ILibDuktape_Stream_Push, DUK_VARARGS);
|
|
ILibDuktape_EventEmitter_AddOnceEx3(ctx, -1, "end", ILibDuktape_Stream_EndSink);
|
|
|
|
if (duk_is_object(ctx, 0))
|
|
{
|
|
void *h = Duktape_GetHeapptrProperty(ctx, 0, "write");
|
|
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_write"); }
|
|
else
|
|
{
|
|
ILibDuktape_CreateEventWithSetterEx(ctx, "_write", ILibDuktape_Stream_readonlyError);
|
|
}
|
|
h = Duktape_GetHeapptrProperty(ctx, 0, "final");
|
|
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_final"); }
|
|
else
|
|
{
|
|
ILibDuktape_CreateEventWithSetterEx(ctx, "_final", ILibDuktape_Stream_readonlyError);
|
|
}
|
|
h = Duktape_GetHeapptrProperty(ctx, 0, "read");
|
|
if (h != NULL) { duk_push_heapptr(ctx, h); duk_put_prop_string(ctx, -2, "_read"); }
|
|
else
|
|
{
|
|
ILibDuktape_CreateEventWithSetterEx(ctx, "_read", ILibDuktape_Stream_readonlyError);
|
|
}
|
|
}
|
|
return(1);
|
|
}
|
|
void ILibDuktape_Stream_Init(duk_context *ctx, void *chain)
|
|
{
|
|
duk_push_object(ctx); // [stream
|
|
ILibDuktape_WriteID(ctx, "stream");
|
|
ILibDuktape_CreateInstanceMethod(ctx, "Readable", ILibDuktape_Stream_newReadable, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "Writable", ILibDuktape_Stream_newWritable, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "Duplex", ILibDuktape_Stream_newDuplex, DUK_VARARGS);
|
|
}
|
|
void ILibDuktape_Polyfills_debugGC2(duk_context *ctx, void ** args, int argsLen)
|
|
{
|
|
if (g_displayFinalizerMessages) { printf("=> GC();\n"); }
|
|
duk_gc(ctx, 0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_debugGC(duk_context *ctx)
|
|
{
|
|
ILibDuktape_Immediate(ctx, (void*[]) { NULL }, 0, ILibDuktape_Polyfills_debugGC2);
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_debug(duk_context *ctx)
|
|
{
|
|
#ifdef WIN32
|
|
if (IsDebuggerPresent()) { __debugbreak(); }
|
|
#elif defined(_POSIX)
|
|
raise(SIGTRAP);
|
|
#endif
|
|
return(0);
|
|
}
|
|
#ifndef MICROSTACK_NOTLS
|
|
duk_ret_t ILibDuktape_PKCS7_getSignedDataBlock(duk_context *ctx)
|
|
{
|
|
char *hash = ILibMemory_AllocateA(UTIL_SHA256_HASHSIZE);
|
|
char *pkeyHash = ILibMemory_AllocateA(UTIL_SHA256_HASHSIZE);
|
|
unsigned int size, r;
|
|
BIO *out = NULL;
|
|
PKCS7 *message = NULL;
|
|
char* data2 = NULL;
|
|
STACK_OF(X509) *st = NULL;
|
|
|
|
duk_size_t bufferLen;
|
|
char *buffer = Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
|
|
message = d2i_PKCS7(NULL, (const unsigned char**)&buffer, (long)bufferLen);
|
|
if (message == NULL) { return(ILibDuktape_Error(ctx, "PKCS7 Error")); }
|
|
|
|
// Lets rebuild the original message and check the size
|
|
size = i2d_PKCS7(message, NULL);
|
|
if (size < (unsigned int)bufferLen) { PKCS7_free(message); return(ILibDuktape_Error(ctx, "PKCS7 Error")); }
|
|
|
|
out = BIO_new(BIO_s_mem());
|
|
|
|
// Check the PKCS7 signature, but not the certificate chain.
|
|
r = PKCS7_verify(message, NULL, NULL, NULL, out, PKCS7_NOVERIFY);
|
|
if (r == 0) { PKCS7_free(message); BIO_free(out); return(ILibDuktape_Error(ctx, "PKCS7 Verify Error")); }
|
|
|
|
// If data block contains less than 32 bytes, fail.
|
|
size = (unsigned int)BIO_get_mem_data(out, &data2);
|
|
if (size <= ILibMemory_AllocateA_Size(hash)) { PKCS7_free(message); BIO_free(out); return(ILibDuktape_Error(ctx, "PKCS7 Size Mismatch Error")); }
|
|
|
|
|
|
duk_push_object(ctx); // [val]
|
|
duk_push_fixed_buffer(ctx, size); // [val][fbuffer]
|
|
duk_dup(ctx, -1); // [val][fbuffer][dup]
|
|
duk_put_prop_string(ctx, -3, "\xFF_fixedbuffer"); // [val][fbuffer]
|
|
duk_swap_top(ctx, -2); // [fbuffer][val]
|
|
duk_push_buffer_object(ctx, -2, 0, size, DUK_BUFOBJ_NODEJS_BUFFER); // [fbuffer][val][buffer]
|
|
ILibDuktape_CreateReadonlyProperty(ctx, "data"); // [fbuffer][val]
|
|
memcpy_s(Duktape_GetBuffer(ctx, -2, NULL), size, data2, size);
|
|
|
|
|
|
// Get the certificate signer
|
|
st = PKCS7_get0_signers(message, NULL, PKCS7_NOVERIFY);
|
|
|
|
// Get a full certificate hash of the signer
|
|
X509_digest(sk_X509_value(st, 0), EVP_sha256(), (unsigned char*)hash, NULL);
|
|
X509_pubkey_digest(sk_X509_value(st, 0), EVP_sha256(), (unsigned char*)pkeyHash, NULL);
|
|
|
|
sk_X509_free(st);
|
|
|
|
// Check certificate hash with first 32 bytes of data.
|
|
if (memcmp(hash, Duktape_GetBuffer(ctx, -2, NULL), ILibMemory_AllocateA_Size(hash)) != 0) { PKCS7_free(message); BIO_free(out); return(ILibDuktape_Error(ctx, "PKCS7 Certificate Hash Mismatch Error")); }
|
|
char *tmp = ILibMemory_AllocateA(1 + (ILibMemory_AllocateA_Size(hash) * 2));
|
|
util_tohex(hash, (int)ILibMemory_AllocateA_Size(hash), tmp);
|
|
duk_push_object(ctx); // [fbuffer][val][cert]
|
|
ILibDuktape_WriteID(ctx, "certificate");
|
|
duk_push_string(ctx, tmp); // [fbuffer][val][cert][fingerprint]
|
|
ILibDuktape_CreateReadonlyProperty(ctx, "fingerprint"); // [fbuffer][val][cert]
|
|
util_tohex(pkeyHash, (int)ILibMemory_AllocateA_Size(pkeyHash), tmp);
|
|
duk_push_string(ctx, tmp); // [fbuffer][val][cert][publickeyhash]
|
|
ILibDuktape_CreateReadonlyProperty(ctx, "publicKeyHash"); // [fbuffer][val][cert]
|
|
|
|
ILibDuktape_CreateReadonlyProperty(ctx, "signingCertificate"); // [fbuffer][val]
|
|
|
|
// Approved, cleanup and return.
|
|
BIO_free(out);
|
|
PKCS7_free(message);
|
|
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_PKCS7_signDataBlockFinalizer(duk_context *ctx)
|
|
{
|
|
char *buffer = Duktape_GetPointerProperty(ctx, 0, "\xFF_signature");
|
|
if (buffer != NULL) { free(buffer); }
|
|
return(0);
|
|
}
|
|
duk_ret_t ILibDuktape_PKCS7_signDataBlock(duk_context *ctx)
|
|
{
|
|
duk_get_prop_string(ctx, 1, "secureContext");
|
|
duk_get_prop_string(ctx, -1, "\xFF_SecureContext2CertBuffer");
|
|
struct util_cert *cert = (struct util_cert*)Duktape_GetBuffer(ctx, -1, NULL);
|
|
duk_size_t bufferLen;
|
|
char *buffer = (char*)Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
|
|
BIO *in = NULL;
|
|
PKCS7 *message = NULL;
|
|
char *signature = NULL;
|
|
int signatureLength = 0;
|
|
|
|
// Sign the block
|
|
in = BIO_new_mem_buf(buffer, (int)bufferLen);
|
|
message = PKCS7_sign(cert->x509, cert->pkey, NULL, in, PKCS7_BINARY);
|
|
if (message != NULL)
|
|
{
|
|
signatureLength = i2d_PKCS7(message, (unsigned char**)&signature);
|
|
PKCS7_free(message);
|
|
}
|
|
if (in != NULL) BIO_free(in);
|
|
if (signatureLength <= 0) { return(ILibDuktape_Error(ctx, "PKCS7_signDataBlockError: ")); }
|
|
|
|
duk_push_external_buffer(ctx);
|
|
duk_config_buffer(ctx, -1, signature, signatureLength);
|
|
duk_push_buffer_object(ctx, -1, 0, signatureLength, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
duk_push_pointer(ctx, signature);
|
|
duk_put_prop_string(ctx, -2, "\xFF_signature");
|
|
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_PKCS7_signDataBlockFinalizer);
|
|
|
|
return(1);
|
|
}
|
|
void ILibDuktape_PKCS7_Push(duk_context *ctx, void *chain)
|
|
{
|
|
duk_push_object(ctx);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "getSignedDataBlock", ILibDuktape_PKCS7_getSignedDataBlock, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "signDataBlock", ILibDuktape_PKCS7_signDataBlock, DUK_VARARGS);
|
|
}
|
|
|
|
extern uint32_t crc32c(uint32_t crc, const unsigned char* buf, uint32_t len);
|
|
duk_ret_t ILibDuktape_Polyfills_crc32c(duk_context *ctx)
|
|
{
|
|
duk_size_t len;
|
|
char *buffer = Duktape_GetBuffer(ctx, 0, &len);
|
|
duk_push_int(ctx, crc32c(0, (unsigned char*)buffer, (uint32_t)len));
|
|
return(1);
|
|
}
|
|
#endif
|
|
duk_ret_t ILibDuktape_Polyfills_Object_hashCode(duk_context *ctx)
|
|
{
|
|
duk_push_this(ctx);
|
|
duk_push_string(ctx, Duktape_GetStashKey(duk_get_heapptr(ctx, -1)));
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_Array_peek(duk_context *ctx)
|
|
{
|
|
duk_push_this(ctx); // [Array]
|
|
duk_get_prop_index(ctx, -1, (duk_uarridx_t)duk_get_length(ctx, -1) - 1);
|
|
return(1);
|
|
}
|
|
void ILibDuktape_Polyfills_object(duk_context *ctx)
|
|
{
|
|
// Polyfill Object._hashCode()
|
|
duk_get_prop_string(ctx, -1, "Object"); // [g][Object]
|
|
duk_get_prop_string(ctx, -1, "prototype"); // [g][Object][prototype]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_Object_hashCode, 0); // [g][Object][prototype][func]
|
|
ILibDuktape_CreateReadonlyProperty(ctx, "_hashCode"); // [g][Object][prototype]
|
|
duk_pop_2(ctx); // [g]
|
|
|
|
duk_get_prop_string(ctx, -1, "Array"); // [g][Array]
|
|
duk_get_prop_string(ctx, -1, "prototype"); // [g][Array][prototype]
|
|
duk_push_c_function(ctx, ILibDuktape_Polyfills_Array_peek, 0); // [g][Array][prototype][peek]
|
|
ILibDuktape_CreateReadonlyProperty(ctx, "peek"); // [g][Array][prototype]
|
|
duk_pop_2(ctx); // [g]
|
|
}
|
|
|
|
|
|
#ifndef MICROSTACK_NOTLS
|
|
void ILibDuktape_bignum_addBigNumMethods(duk_context *ctx, BIGNUM *b);
|
|
duk_ret_t ILibDuktape_bignum_toString(duk_context *ctx)
|
|
{
|
|
duk_push_this(ctx);
|
|
BIGNUM *b = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
|
|
if (b != NULL)
|
|
{
|
|
char *numstr = BN_bn2dec(b);
|
|
duk_push_string(ctx, numstr);
|
|
OPENSSL_free(numstr);
|
|
return(1);
|
|
}
|
|
else
|
|
{
|
|
return(ILibDuktape_Error(ctx, "Invalid BIGNUM"));
|
|
}
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_add(duk_context* ctx)
|
|
{
|
|
BIGNUM *ret = BN_new();
|
|
BIGNUM *r1, *r2;
|
|
|
|
duk_push_this(ctx);
|
|
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
|
|
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
|
|
BN_add(ret, r1, r2);
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_sub(duk_context* ctx)
|
|
{
|
|
BIGNUM *ret = BN_new();
|
|
BIGNUM *r1, *r2;
|
|
|
|
duk_push_this(ctx);
|
|
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
|
|
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
|
|
BN_sub(ret, r1, r2);
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_mul(duk_context* ctx)
|
|
{
|
|
BN_CTX *bx = BN_CTX_new();
|
|
BIGNUM *ret = BN_new();
|
|
BIGNUM *r1, *r2;
|
|
|
|
duk_push_this(ctx);
|
|
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
|
|
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
BN_mul(ret, r1, r2, bx);
|
|
BN_CTX_free(bx);
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_div(duk_context* ctx)
|
|
{
|
|
BN_CTX *bx = BN_CTX_new();
|
|
BIGNUM *ret = BN_new();
|
|
BIGNUM *r1, *r2;
|
|
|
|
duk_push_this(ctx);
|
|
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
|
|
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
BN_div(ret, NULL, r1, r2, bx);
|
|
|
|
BN_CTX_free(bx);
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_mod(duk_context* ctx)
|
|
{
|
|
BN_CTX *bx = BN_CTX_new();
|
|
BIGNUM *ret = BN_new();
|
|
BIGNUM *r1, *r2;
|
|
|
|
duk_push_this(ctx);
|
|
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
|
|
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
BN_div(NULL, ret, r1, r2, bx);
|
|
|
|
BN_CTX_free(bx);
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, ret);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_cmp(duk_context *ctx)
|
|
{
|
|
BIGNUM *r1, *r2;
|
|
duk_push_this(ctx);
|
|
r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM");
|
|
r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
duk_push_int(ctx, BN_cmp(r2, r1));
|
|
return(1);
|
|
}
|
|
|
|
duk_ret_t ILibDuktape_bignum_finalizer(duk_context *ctx)
|
|
{
|
|
BIGNUM *b = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
if (b != NULL)
|
|
{
|
|
BN_free(b);
|
|
}
|
|
return(0);
|
|
}
|
|
void ILibDuktape_bignum_addBigNumMethods(duk_context *ctx, BIGNUM *b)
|
|
{
|
|
duk_push_object(ctx);
|
|
duk_push_pointer(ctx, b); duk_put_prop_string(ctx, -2, "\xFF_BIGNUM");
|
|
ILibDuktape_CreateProperty_InstanceMethod(ctx, "toString", ILibDuktape_bignum_toString, DUK_VARARGS);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "add", ILibDuktape_bignum_add, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "sub", ILibDuktape_bignum_sub, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "mul", ILibDuktape_bignum_mul, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "div", ILibDuktape_bignum_div, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "mod", ILibDuktape_bignum_mod, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "cmp", ILibDuktape_bignum_cmp, 1);
|
|
|
|
duk_push_c_function(ctx, ILibDuktape_bignum_finalizer, 1); duk_set_finalizer(ctx, -2);
|
|
duk_eval_string(ctx, "(function toNumber(){return(parseInt(this.toString()));})"); duk_put_prop_string(ctx, -2, "toNumber");
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_random(duk_context *ctx)
|
|
{
|
|
BIGNUM *r = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM");
|
|
BIGNUM *rnd = BN_new();
|
|
|
|
if (BN_rand_range(rnd, r) == 0) { return(ILibDuktape_Error(ctx, "Error Generating Random Number")); }
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, rnd);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_bignum_fromBuffer(duk_context *ctx)
|
|
{
|
|
char *endian = duk_get_top(ctx) > 1 ? Duktape_GetStringPropertyValue(ctx, 1, "endian", "big") : "big";
|
|
duk_size_t len;
|
|
char *buffer = Duktape_GetBuffer(ctx, 0, &len);
|
|
BIGNUM *b;
|
|
|
|
if (strcmp(endian, "big") == 0)
|
|
{
|
|
b = BN_bin2bn((unsigned char*)buffer, (int)len, NULL);
|
|
}
|
|
else if (strcmp(endian, "little") == 0)
|
|
{
|
|
b = BN_lebin2bn((unsigned char*)buffer, (int)len, NULL);
|
|
}
|
|
else
|
|
{
|
|
return(ILibDuktape_Error(ctx, "Invalid endian specified"));
|
|
}
|
|
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, b);
|
|
return(1);
|
|
}
|
|
|
|
duk_ret_t ILibDuktape_bignum_func(duk_context *ctx)
|
|
{
|
|
BIGNUM *b = NULL;
|
|
BN_dec2bn(&b, duk_require_string(ctx, 0));
|
|
ILibDuktape_bignum_addBigNumMethods(ctx, b);
|
|
return(1);
|
|
}
|
|
void ILibDuktape_bignum_Push(duk_context *ctx, void *chain)
|
|
{
|
|
duk_push_c_function(ctx, ILibDuktape_bignum_func, DUK_VARARGS);
|
|
duk_push_c_function(ctx, ILibDuktape_bignum_fromBuffer, DUK_VARARGS); duk_put_prop_string(ctx, -2, "fromBuffer");
|
|
duk_push_c_function(ctx, ILibDuktape_bignum_random, DUK_VARARGS); duk_put_prop_string(ctx, -2, "random");
|
|
|
|
char randRange[] = "exports.randomRange = function randomRange(low, high)\
|
|
{\
|
|
var result = exports.random(high.sub(low)).add(low);\
|
|
return(result);\
|
|
};";
|
|
ILibDuktape_ModSearch_AddHandler_AlsoIncludeJS(ctx, randRange, sizeof(randRange) - 1);
|
|
}
|
|
void ILibDuktape_dataGenerator_onPause(struct ILibDuktape_readableStream *sender, void *user)
|
|
{
|
|
|
|
}
|
|
void ILibDuktape_dataGenerator_onResume(struct ILibDuktape_readableStream *sender, void *user)
|
|
{
|
|
SHA256_CTX shctx;
|
|
|
|
char *buffer = (char*)user;
|
|
size_t bufferLen = ILibMemory_Size(buffer);
|
|
int val;
|
|
|
|
while (sender->paused == 0)
|
|
{
|
|
duk_push_heapptr(sender->ctx, sender->object);
|
|
val = Duktape_GetIntPropertyValue(sender->ctx, -1, "\xFF_counter", 0);
|
|
duk_push_int(sender->ctx, (val + 1) < 255 ? (val+1) : 0); duk_put_prop_string(sender->ctx, -2, "\xFF_counter");
|
|
duk_pop(sender->ctx);
|
|
|
|
//util_random((int)(bufferLen - UTIL_SHA256_HASHSIZE), buffer + UTIL_SHA256_HASHSIZE);
|
|
memset(buffer + UTIL_SHA256_HASHSIZE, val, bufferLen - UTIL_SHA256_HASHSIZE);
|
|
|
|
|
|
SHA256_Init(&shctx);
|
|
SHA256_Update(&shctx, buffer + UTIL_SHA256_HASHSIZE, bufferLen - UTIL_SHA256_HASHSIZE);
|
|
SHA256_Final((unsigned char*)buffer, &shctx);
|
|
ILibDuktape_readableStream_WriteData(sender, buffer, (int)bufferLen);
|
|
}
|
|
}
|
|
duk_ret_t ILibDuktape_dataGenerator_const(duk_context *ctx)
|
|
{
|
|
int bufSize = (int)duk_require_int(ctx, 0);
|
|
void *buffer;
|
|
|
|
if (bufSize <= UTIL_SHA256_HASHSIZE)
|
|
{
|
|
return(ILibDuktape_Error(ctx, "Value too small. Must be > %d", UTIL_SHA256_HASHSIZE));
|
|
}
|
|
|
|
duk_push_object(ctx);
|
|
duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, "\xFF_counter");
|
|
buffer = Duktape_PushBuffer(ctx, bufSize);
|
|
duk_put_prop_string(ctx, -2, "\xFF_buffer");
|
|
ILibDuktape_ReadableStream_Init(ctx, ILibDuktape_dataGenerator_onPause, ILibDuktape_dataGenerator_onResume, buffer)->paused = 1;
|
|
return(1);
|
|
}
|
|
void ILibDuktape_dataGenerator_Push(duk_context *ctx, void *chain)
|
|
{
|
|
duk_push_c_function(ctx, ILibDuktape_dataGenerator_const, DUK_VARARGS);
|
|
}
|
|
#endif
|
|
|
|
void ILibDuktape_Polyfills_JS_Init(duk_context *ctx)
|
|
{
|
|
// The following can be overriden by calling addModule() or by having a .js file in the module path
|
|
|
|
// http-digest. Refer to /modules/http-digest.js for a human readable version
|
|
duk_peval_string_noresult(ctx, "addModule('http-digest', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciB3cml0YWJsZSA9IHJlcXVpcmUoJ3N0cmVhbScpLldyaXRhYmxlOw0KdmFyIG1kNSA9IHJlcXVpcmUoJ01ENVN0cmVhbScpLmNyZWF0ZSgpOw0KDQpmdW5jdGlvbiBjaGVja0V2ZW50Rm9yd2FyZGluZyhkaWdlc3RSZXF1ZXN0LCBldmVudE5hbWUpDQp7DQogICAgaWYgKGRpZ2VzdFJlcXVlc3QubGlzdGVuZXJDb3VudChldmVudE5hbWUpID4gMCkNCiAgICB7DQogICAgICAgIHZhciBlRm9yd2FyZCA9IGZ1bmN0aW9uIF9lRm9yd2FyZCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBwID0gW2VGb3J3YXJkLl9ldmVudE5hbWVdOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsgcC5wdXNoKGFyZ3VtZW50c1tpXSk7IH0NCiAgICAgICAgICAgIF9lRm9yd2FyZC5fZGlnZXN0UmVxdWVzdC5lbWl0LmFwcGx5KF9lRm9yd2FyZC5fZGlnZXN0UmVxdWVzdCwgcCk7DQogICAgICAgIH07DQogICAgICAgIGVGb3J3YXJkLl9ldmVudE5hbWUgPSBldmVudE5hbWU7DQogICAgICAgIGVGb3J3YXJkLl9kaWdlc3RSZXF1ZXN0ID0gZGlnZXN0UmVxdWVzdDsNCiAgICAgICAgZGlnZXN0UmVxdWVzdC5fcmVxdWVzdC5vbihldmVudE5hbWUsIGVGb3J3YXJkKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGdlbmVyYXRlQXV0aEhlYWRlcnMoaW1zZywgb3B0aW9ucywgZGlnZXN0KQ0Kew0KICAgIHZhciBhdXRoOw0KDQogICAgaWYgKGltc2cgIT0gbnVsbCkNCiAgICB7DQogICAgICAgIGF1dGggPSB7IHJlYWxtOiBudWxsLCBub25jZTogbnVsbCwgb3BhcXVlOiBudWxsLCBxb3A6IG51bGwgfTsNCiAgICAgICAgdmFyIHd3dyA9IGltc2cuaGVhZGVyc1snV1dXLUF1dGhlbnRpY2F0ZSddOw0KICAgICAgICB2YXIgdG9rZW5zID0gd3d3LnNwbGl0KCcsJyk7DQoNCiAgICAgICAgdmFyIHBhaXJzOw0KICAgICAgICBmb3IgKHZhciBpIGluIHRva2VucykNCiAgICAgICAgew0KICAgICAgICAgICAgcGFpcnMgPSB0b2tlbnNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgICAgIGlmIChwYWlycy5sZW5ndGggPT0gMikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhaXJzWzBdLnRvTG93ZXJDYXNlKCkudHJpbSgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGlnZXN0IHJlYWxtJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgucmVhbG0gPSBwYWlyc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoLnJlYWxtWzBdID09ICciJykgeyBhdXRoLnJlYWxtID0gYXV0aC5yZWFsbS5zdWJzdHJpbmcoMSwgYXV0aC5yZWFsbS5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vbmNlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgubm9uY2UgPSBwYWlyc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoLm5vbmNlWzBdID09ICciJykgeyBhdXRoLm5vbmNlID0gYXV0aC5ub25jZS5zdWJzdHJpbmcoMSwgYXV0aC5ub25jZS5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ29wYXF1ZSc6DQogICAgICAgICAgICAgICAgICAgICAgICBhdXRoLm9wYXF1ZSA9IHBhaXJzWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGgub3BhcXVlWzBdID09ICciJykgeyBhdXRoLm9wYXF1ZSA9IGF1dGgub3BhcXVlLnN1YnN0cmluZygxLCBhdXRoLm9wYXF1ZS5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3FvcCc6DQogICAgICAgICAgICAgICAgICAgICAgICBhdXRoLnFvcCA9IHBhaXJzWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGgucW9wWzBdID09ICciJykgeyBhdXRoLnFvcCA9IGF1dGgucW9wLnN1YnN0cmluZygxLCBhdXRoLnFvcC5sZW5ndGggLSAxKTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRpZ2VzdC5fYXV0aCA9IGF1dGg7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGlmICghKGF1dGggPSBkaWdlc3QuX2F1dGgpKSB7IHJldHVybjsgfQ0KICAgIH0NCg0KICAgIHZhciBzdGVwMSA9IGRpZ2VzdC5fb3B0aW9ucy51c2VybmFtZSArICc6JyArIGF1dGgucmVhbG0gKyAnOicgKyBkaWdlc3QuX29wdGlvbnMucGFzc3dvcmQ7DQogICAgYXV0aC5zdGVwMSA9IG1kNS5zeW5jSGFzaChzdGVwMSkudG9TdHJpbmcoJ2hleCcpLnRvTG93ZXJDYXNlKCk7DQoNCiAgICB2YXIgc3RlcDIgPSBvcHRpb25zLm1ldGhvZCArICc6JyArIG9wdGlvbnMucGF0aDsNCiAgICBhdXRoLnN0ZXAyID0gbWQ1LnN5bmNIYXNoKHN0ZXAyKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTsNCg0KDQogICAgaWYgKGF1dGgucW9wID09IG51bGwpDQogICAgew0KICAgICAgICB2YXIgc3RlcDMgPSBhdXRoLnN0ZXAxICsgJzonICsgYXV0aC5ub25jZSArICc6JyArIGF1dGguc3RlcDI7DQogICAgICAgIGF1dGguc3RlcDMgPSBtZDUuc3luY0hhc2goc3RlcDMpLnRvU3RyaW5nKCdoZXgnKS50b0xvd2VyQ2FzZSgpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBkaWdlc3QuX05DICs9IDE7DQogICAgICAgIHZhciBzdGVwMyA9IGF1dGguc3RlcDEgKyAnOicgKyBhdXRoLm5vbmNlICsgJzonICsgZGlnZXN0Ll9OQy50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg4LCAnMCcpICsgJzonICsgZGlnZXN0Ll9DTk9OQ0UgKyAnOicgKyBhdXRoLnFvcCArICc6JyArIGF1dGguc3RlcDI7DQogICAgICAgIGF1dGguc3RlcDMgPSBtZDUuc3luY0hhc2goc3RlcDMpLnRvU3RyaW5nKCdoZXgnKS50b0xvd2VyQ2FzZSgpOw0KICAgIH0NCg0KICAgIHZhciByZXQgPSAnRGlnZXN0IHVzZXJuYW1lPSInICsgZGlnZXN0Ll9vcHRpb25zLnVzZXJuYW1lICsgJyIscmVhbG09IicgKyBhdXRoLnJlYWxtICsgJyIsbm9uY2U9IicgKyBhdXRoLm5vbmNlICsgJyIsdXJpPSInICsgb3B0aW9ucy5wYXRoICsgJyInOw0KICAgIGlmIChhdXRoLm9wYXF1ZSAhPSBudWxsKSB7IHJldCArPSAoJyxvcGFxdWU9IicgKyBhdXRoLm9wYXF1ZSArICciJyk7IH0NCiAgICByZXQgKz0gKCcscmVzcG9uc2U9IicgKyBhdXRoLnN0ZXAzICsgJyInKTsNCg0KICAgIGlmIChhdXRoLnFvcCAhPSBudWxsKQ0KICAgIHsNCiAgICAgICAgcmV0ICs9ICgnLHFvcD0iJyArIGF1dGgucW9wICsgJyIsbmM9IicgKyBkaWdlc3QuX05DLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpLnBhZFN0YXJ0KDgsICcwJykgKyAnIixjbm9uY2U9IicgKyBkaWdlc3QuX0NOT05DRSArICciJyk7DQogICAgfQ0KDQoNCiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykgeyBvcHRpb25zLmhlYWRlcnMgPSB7fTsgfQ0KICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gcmV0Ow0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gaHR0cF9kaWdlc3QoKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gImh0dHAtZGlnZXN0IjsNCiAgICB0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uKCkNCiAgICB7DQogICAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPT0gMSAmJiB0eXBlb2YoYXJndW1lbnRzWzBdID09ICdvYmplY3QnKSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIChuZXcgaHR0cF9kaWdlc3RfaW5zdGFuY2UoYXJndW1lbnRzWzBdKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAyICYmIHR5cGVvZihhcmd1bWVudHNbMF0pID09ICdzdHJpbmcnICYmIHR5cGVvZihhcmd1bWVudHNbMV0pID09ICdzdHJpbmcnKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKG5ldyBodHRwX2RpZ2VzdF9pbnN0YW5jZSh7dXNlcm5hbWU6IGFyZ3VtZW50c1swXSwgcGFzc3dvcmQ6IGFyZ3VtZW50c1sxXX0pKTsNCiAgICAgICAgfQ0KICAgICAgICB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gaHR0cF9kaWdlc3RfaW5zdGFuY2Uob3B0aW9ucykNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdodHRwLWRpZ2VzdC5pbnN0YW5jZSc7DQogICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7DQogICAgdGhpcy5odHRwID0gbnVsbDsNCiAgICB0aGlzLl9OQyA9IDA7DQogICAgdGhpcy5fQ05PTkNFID0gcmVxdWlyZSgnaHR0cCcpLmdlbmVyYXRlTm9uY2UoMTYpOw0KDQogICAgdGhpcy5nZXQgPSBmdW5jdGlvbih1cmkpDQogICAgew0KICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdCh1cmkpKTsNCiAgICB9DQogICAgdGhpcy5yZXF1ZXN0ID0gZnVuY3Rpb24gKHBhcjEpDQogICAgew0KICAgICAgICB2YXIgY2FsbGVuZCA9IGZhbHNlOw0KICAgICAgICB2YXIgcmV0ID0gbmV3IHdyaXRhYmxlKA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbiAoY2h1bmssIGZsdXNoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuZGVkKSB7IHRocm93ICgnU3RyZWFtIGFscmVhZHkgZW5kZWQnKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5fYnVmZmVyZWQpIA0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXJlZCA9IEJ1ZmZlci5hbGxvYyhjaHVuay5sZW5ndGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsuY29weSh0aGlzLl9idWZmZXJlZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXJlZCA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZmZlcmVkLCBjaHVua10sIHRoaXMuX2J1ZmZlcmVkLmxlbmd0aCArIGNodW5rLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVxdWVzdCkgeyB0aGlzLl9yZXF1ZXN0LndyaXRlKGNodW5rKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2ggIT0gbnVsbCkgeyBmbHVzaCgpOyB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBmaW5hbDogZnVuY3Rpb24gKGZsdXNoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuZGVkKSB7IHRocm93ICgnU3RyZWFtIGFscmVhZHkgZW5kZWQnKTsgfQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0KSB7IHRoaXMuX3JlcXVlc3QuZW5kKCk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZsdXNoICE9IG51bGwpIHsgZmx1c2goKTsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICByZXQuX2J1ZmZlcmVkID0gbnVsbDsNCiAgICAgICAgcmV0Ll9lbmRlZCA9IGZhbHNlOw0KICAgICAgICBzd2l0Y2ggKHR5cGVvZiAocGFyMSkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgdGhyb3cgKCdJbnZhbGlkIFBhcmFtZXRlcicpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoNCiAgICAgICAgICAgICAgICByZXQub3B0aW9ucyA9IHRoaXMuaHR0cC5wYXJzZVVyaShwYXIxKTsNCiAgICAgICAgICAgICAgICBjYWxsZW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6DQogICAgICAgICAgICAgICAgcmV0Lm9wdGlvbnMgPSBwYXIxOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldCwgdHJ1ZSkNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgncmVzcG9uc2UnKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdlcnJvcicpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3VwZ3JhZGUnKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdjb250aW51ZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3RpbWVvdXQnKTsNCiAgICAgICAgcmV0Ll9kaWdlc3QgPSB0aGlzOw0KDQogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgKGFyZ3VtZW50c1sxXSkgPT0gJ2Z1bmN0aW9uJykNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Lm9uY2UoJ3Jlc3BvbnNlJywgYXJndW1lbnRzWzFdKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vDQogICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBhZGQgQXV0aEhlYWRlcnMgbm93DQogICAgICAgIC8vDQogICAgICAgIGdlbmVyYXRlQXV0aEhlYWRlcnMobnVsbCwgcmV0Lm9wdGlvbnMsIHRoaXMpOw0KDQogICAgICAgIC8vIFdoZW4gc29tZWJvZHkgaG9va3MgdXAgZXZlbnRzIHRvIGRpZ2VzdC5jbGllbnRSZXF1ZXN0LCB3ZSBuZWVkIHRvIGhvb2sgdGhlIHJlYWwgZXZlbnQgb24gaHR0cC5jbGllbnRSZXF1ZXN0DQogICAgICAgIHJldC5fcmVxdWVzdCA9IHRoaXMuaHR0cC5yZXF1ZXN0KHJldC5vcHRpb25zKTsNCiAgICAgICAgcmV0Ll9yZXF1ZXN0LmRpZ1JlcXVlc3QgPSByZXQ7DQogICAgICAgIHJldC5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAoZXZOYW1lLCBjYWxsYmFjaykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGV2TmFtZSAhPSAndXBncmFkZScgJiYgZXZOYW1lICE9ICdlcnJvcicgJiYgZXZOYW1lICE9ICdjb250aW51ZScgJiYgZXZOYW1lICE9ICd0aW1lb3V0JyAmJiBldk5hbWUgIT0gJ2RyYWluJykgeyByZXR1cm47IH0NCiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0Lmxpc3RlbmVyQ291bnQoZXZOYW1lKSA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBldlNpbmsgPSBmdW5jdGlvbiBfZXZTaW5rKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYXJtcyA9IFtfZXZTaW5rLmV2ZW50TmFtZV07DQogICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDsrK2kpIHtwYXJtcy5wdXNoKGFyZ3VtZW50c1tpXSk7fQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuZW1pdC5hcHBseSh0aGlzLmRpZ1JlcXVlc3QsIHBhcm1zKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIGV2U2luay5ldmVudE5hbWUgPSBldk5hbWU7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihldk5hbWUsIGV2U2luayk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIHJldC5fcmVxdWVzdC5vbmNlKCdyZXNwb25zZScsIGZ1bmN0aW9uIChpbXNnKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoaW1zZy5zdGF0dXNDb2RlID09IDQwMSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2FsbGVuZCA9IHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdC5fY2FsbGVuZDsNCiAgICAgICAgICAgICAgICB2YXIgYXV0aCA9IGdlbmVyYXRlQXV0aEhlYWRlcnMoaW1zZywgdGhpcy5kaWdSZXF1ZXN0Lm9wdGlvbnMsIHRoaXMuZGlnUmVxdWVzdC5fZGlnZXN0KTsNCg0KICAgICAgICAgICAgICAgIHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdCA9IHRoaXMuZGlnUmVxdWVzdC5fZGlnZXN0Lmh0dHAucmVxdWVzdCh0aGlzLmRpZ1JlcXVlc3Qub3B0aW9ucyk7DQogICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0Ll9yZXF1ZXN0LmRpZ1JlcXVlc3QgPSB0aGlzLmRpZ1JlcXVlc3Q7DQogICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0Ll9yZXF1ZXN0Lm9uY2UoJ3Jlc3BvbnNlJywgZnVuY3Rpb24gKGltc2cpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2goaW1zZy5zdGF0dXNDb2RlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuZW1pdCgnZXJyb3InLCAnRGlnZXN0IGZhaWxlZCB0b28gbWFueSB0aW1lcycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuZW1pdCgncmVzcG9uc2UnLCBpbXNnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIGNoZWNrRXZlbnRGb3J3YXJkaW5nKHRoaXMuZGlnUmVxdWVzdCwgJ3VwZ3JhZGUnKTsNCiAgICAgICAgICAgICAgICBjaGVja0V2ZW50Rm9yd2FyZGluZyh0aGlzLmRpZ1JlcXVlc3QsICdlcnJvcicpOw0KICAgICAgICAgICAgICAgIGNoZWNrRXZlbnRGb3J3YXJkaW5nKHRoaXMuZGlnUmVxdWVzdCwgJ2NvbnRpbnVlJyk7DQogICAgICAgICAgICAgICAgY2hlY2tFdmVudEZvcndhcmRpbmcodGhpcy5kaWdSZXF1ZXN0LCAndGltZW91dCcpOw0KICAgICAgICAgICAgICAgIGNoZWNrRXZlbnRGb3J3YXJkaW5nKHRoaXMuZGlnUmVxdWVzdCwgJ2RyYWluJyk7DQogICAgICAgICAgICAgICAgaWYgKGNhbGxlbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuX3JlcXVlc3QuZW5kKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpZ1JlcXVlc3QuX2J1ZmZlcmVkKSB7IHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdC53cml0ZSh0aGlzLmRpZ1JlcXVlc3QuX2J1ZmZlcmVkKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaWdSZXF1ZXN0Ll9lbmRlZCkgeyB0aGlzLmRpZ1JlcXVlc3QuX3JlcXVlc3QuZW5kKCk7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0LmVtaXQoJ3Jlc3BvbnNlJywgaW1zZyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBpZiAoY2FsbGVuZCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9yZXF1ZXN0Ll9jYWxsZW5kID0gdHJ1ZTsgcmV0Ll9yZXF1ZXN0LmVuZCgpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHJldC5fYnVmZmVyZWQpIHsgcmV0Ll9yZXF1ZXN0LndyaXRlKHJldC5fYnVmZmVyZWQpOyB9DQogICAgICAgICAgICBpZiAocmV0Ll9lbmRlZCkgeyByZXQuX3JlcXVlc3QuZW5kKCk7IH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfTsNCn0NCg0KDQptb2R1bGUuZXhwb3J0cyA9IG5ldyBodHRwX2RpZ2VzdCgpOw0KDQo=', 'base64').toString());");
|
|
|
|
// Clipboard. Refer to /modules/clipboard.js for a human readable version
|
|
char *_clipboard = ILibMemory_Allocate(41147, 0, NULL, NULL);
|
|
memcpy_s(_clipboard + 0, 23512, "LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwoKdmFyIEFueVByb3BlcnR5VHlwZSA9IDA7CnZhciBDdXJyZW50VGltZSA9IDA7CnZhciBOb25lID0gMDsKdmFyIFByb3BNb2RlUmVwbGFjZSA9IDA7CnZhciBTZWxlY3Rpb25DbGVhciA9IDI5Owp2YXIgU2VsZWN0aW9uTm90aWZ5ID0gMzE7CnZhciBTZWxlY3Rpb25SZXF1ZXN0ID0gMzA7CnZhciBYQV9QUklNQVJZID0gMTsKdmFyIENGX1RFWFQgPSAxOwp2YXIgQ0ZfVU5JQ09ERVRFWFQgPSAxMzsKCmZ1bmN0aW9uIG5hdGl2ZUFkZE1vZHVsZShuYW1lKQp7CiAgICB2YXIgdmFsdWUgPSBnZXRKU01vZHVsZShuYW1lKTsKICAgIHZhciByZXQgPSAiZHVrX3BldmFsX3N0cmluZ19ub3Jlc3VsdChjdHgsIFwiYWRkTW9kdWxlKCciICsgbmFtZSArICInLCBCdWZmZXIuZnJvbSgnIiArIEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygnYmFzZTY0JykgKyAiJywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCkpO1wiKTsiOwogICAgaWYgKHJldC5sZW5ndGggPiAxNjMwMCkKICAgIHsKICAgICAgICAvLyBNUyBWaXN1YWwgU3R1ZGlvIGhhcyBhIG1heHNpemUgbGltaXRhdGlvbgogICAgICAgIHZhciB0bXAgPSBCdWZmZXIuZnJvbSh2YWx1ZSkudG9TdHJpbmcoJ2Jhc2U2NCcpOwogICAgICAgIHJldCA9ICdjaGFyICpfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcgPSBJTGliTWVtb3J5X0FsbG9jYXRlKCcgKyAodG1wLmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIDIpICsgJywgMCwgTlVMTCwgTlVMTCk7XG4nOwogICAgICAgIHZhciBpID0gMDsKICAgICAgICB3aGlsZSAoaSA8IHRtcC5sZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2h1bmsgPSB0bXAuc3Vic3RyaW5nKGksIGkrMTYwMDApOwogICAgICAgICAgICByZXQgKz0gKCdtZW1jcHlfcyhfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcgKyAnICsgaSArICcsICcgKyAodG1wLmxlbmd0aCAtIGkpICsgJywgIicgKyBjaHVuayArICciLCAnICsgY2h1bmsubGVuZ3RoICsgJyk7XG4nKTsKICAgICAgICAgICAgaSArPSBjaHVuay5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldCArPSAoJ0lMaWJCYXNlNjREZWNvZGVFeCgodW5zaWduZWQgY2hhciopXycgKyBuYW1lLnNwbGl0KCctJykuam9pbignJykgKyAnLCAnICsgdG1wLmxlbmd0aCArICcsICh1bnNpZ25lZCBjaGFyKilfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcgKyAnICsgdG1wLmxlbmd0aCArICcpO1xuJyk7CiAgICAgICAgcmV0ICs9ICgnZHVrX3B1c2hfZ2xvYmFsX29iamVjdChjdHgpO2R1a19nZXRfcHJvcF9zdHJpbmcoY3R4LCAtMSwgImFkZE1vZHVsZSIpO2R1a19zd2FwX3RvcChjdHgsIC0yKTtkdWtfcHVzaF9zdHJpbmcoY3R4LCAiJyArIG5hbWUgKyAnIik7ZHVrX3B1c2hfc3RyaW5nKGN0eCwgXycgKyBuYW1lLnNwbGl0KCctJykuam9pbignJykgKyAnICsgJyArIHRtcC5sZW5ndGggKyAnKTtcbicpOwogICAgICAgIHJldCArPSAoJ2R1a19wY2FsbF9tZXRob2QoY3R4LCAyKTsgZHVrX3BvcChjdHgpO1xuJyk7CiAgICAgICAgcmV0ICs9ICgnZnJlZShfJyArIG5hbWUuc3BsaXQoJy0nKS5qb2luKCcnKSArICcpO1xuJyk7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyhyZXQpOwp9CmZ1bmN0aW9uIGRpc3BhdGNoUmVhZChzaWQpCnsKICAgIHZhciBpZCA9IDA7CgogICAgaWYoc2lkPT1udWxsKQogICAgewogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpCiAgICAgICAgewogICAgICAgICAgICB2YXIgYWN0aXZlID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLkN1cnJlbnQoKS5BY3RpdmU7CiAgICAgICAgICAgIGlmIChhY3RpdmUubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWQgPSBwYXJzZUludChhY3RpdmVbMF0uU2Vzc2lvbklkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlkID0gc2lkOwogICAgfQoKICAgIGlmKGlkID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cy5yZWFkKCkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBjaGlsZFByb3BlcnRpZXMgPSB7IHNlc3Npb25JZDogaWQgfTsKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgeGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbyhpZCk7CiAgICAgICAgICAgIGNoaWxkUHJvcGVydGllcy5lbnYgPSB7IFhBVVRIT1JJVFk6IHhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHhpbmZvLmRpc3BsYXkgfTsKICAgICAgICB9CgogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgIHJldC5zdWNjZXNzID0gZmFsc2U7CiAgICAgICAgcmV0Lm1hc3RlciA9IHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLkNyZWF0ZShjaGlsZFByb3BlcnRpZXMpOwogICAgICAgIHJldC5tYXN0ZXIucHJvbWlzZSA9IHJldDsKICAgICAgICByZXQubWFzdGVyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnByb21pc2Uuc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKGQpOwogICAgICAgICAgICB0aGlzLmV4aXQoKTsKICAgICAgICB9KTsKICAgICAgICByZXQubWFzdGVyLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMucHJvbWlzZS5zdWNjZXNzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignRXJyb3IgcmVhZGluZyBjbGlwYm9hcmQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgdGhpcy5wcm9taXNlLm1hc3RlcjsKICAgICAgICB9KTsKICAgICAgICByZXQubWFzdGVyLkV4ZWN1dGVTdHJpbmcoInZhciBwYXJlbnQgPSByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKTsgcmVxdWlyZSgnY2xpcGJvYXJkJykucmVhZCgpLnRoZW4oZnVuY3Rpb24odil7cGFyZW50LnNlbmQodik7fSwgZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKTtwcm9jZXNzLmV4aXQoKTt9KTsiKTsKICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGRpc3BhdGNoV3JpdGUoZGF0YSwgc2lkKQp7CiAgICB2YXIgaWQgPSAwOwoKICAgIGlmKHNpZCA9PSBudWxsKQogICAgewogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhY3RpdmUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuQ3VycmVudCgpLkFjdGl2ZTsKICAgICAgICAgICAgaWYoYWN0aXZlLmxlbmd0aD4wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZCA9IHBhcnNlSW50KGFjdGl2ZVswXS5TZXNzaW9uSWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWQgPSBzaWQ7CiAgICB9CgogICAgaWYoaWQgPT0gMCkKICAgIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyhkYXRhKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgY2hpbGRQcm9wZXJ0aWVzID0geyBzZXNzaW9uSWQ6IGlkIH07CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIHhpbmZvID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0WEluZm8oaWQpOwogICAgICAgICAgICBjaGlsZFByb3BlcnRpZXMuZW52ID0geyBYQVVUSE9SSVRZOiB4aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiB4aW5mby5kaXNwbGF5IH07CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInIHx8ICF0aGlzLm1hc3RlcikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMubWFzdGVyID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKGNoaWxkUHJvcGVydGllcyk7CiAgICAgICAgICAgIHRoaXMubWFzdGVyLnBhcmVudCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMubWFzdGVyLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgaWYgKHRoaXMucGFyZW50Lm1hc3RlcikgeyBkZWxldGUgdGhpcy5wYXJlbnQubWFzdGVyOyB9IH0pOwogICAgICAgICAgICB0aGlzLm1hc3Rlci5vbignZGF0YScsIGZ1bmN0aW9uIChkKSB7IGNvbnNvbGUubG9nKGQpOyB9KTsKICAgICAgICAgICAgdGhpcy5tYXN0ZXIuRXhlY3V0ZVN0cmluZygidmFyIHBhcmVudCA9IHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpOyBwYXJlbnQub24oJ2RhdGEnLCBmdW5jdGlvbihkKXt0cnl7cmVxdWlyZSgnY2xpcGJvYXJkJykoZCk7fWNhdGNoKGUpe3JlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoZSk7fWlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyl7cHJvY2Vzcy5leGl0KCk7fX0pOyIpOwogICAgICAgIH0KICAgICAgICB0aGlzLm1hc3Rlci5zZW5kKGRhdGEpOwoKICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgJiYgdGhpcy5tYXN0ZXIpCiAgICAgICAgewogICAgICAgICAgICBpZih0aGlzLm1hc3Rlci50aW1lb3V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tYXN0ZXIudGltZW91dCk7CiAgICAgICAgICAgICAgICB0aGlzLm1hc3Rlci50aW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1hc3Rlci50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoc2VsZikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2VsZi5tYXN0ZXIuZXhpdCgpOwogICAgICAgICAgICAgICAgc2VsZi5tYXN0ZXIgPSBudWxsOwogICAgICAgICAgICB9LCA2MDAwMCwgdGhpcyk7CiAgICAgICAgfQoKICAgIH0KfQoKZnVuY3Rpb24gbGluX3JlYWR0ZXh0KCkKewogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICB0cnkKICAgIHsKICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKQogICAgfQogICAgY2F0Y2goZXhjKQogICAgewogICAgICAgIHJldC5fcmVqKGV4Yyk7CiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfQoKICAgIHZhciBYMTEgPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExOwogICAgaWYgKCFYMTEpCiAgICB7CiAgICAgICAgcmV0Ll9yZWooJ1gxMSByZXF1aXJlZCBmb3IgQ2xpcGJvYXJkIE1hbmlwdWxhdGlvbicpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9nbTsKCgogICAgICAgIHJldC5fZ2V0SW5mb1Byb21pc2UgPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRJbmZvKCk7CiAgICAgICAgcmV0Ll9nZXRJbmZvUHJvbWlzZS5fbWFzdGVyUHJvbWlzZSA9IHJldDsKICAgICAgICByZXQuX2dldEluZm9Qcm9taXNlLnRoZW4oZnVuY3Rpb24gKG1vbikKICAgICAgICB7CiAgICAgICAgICAgIGlmIChtb24ubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHdoaXRlID0gWDExLlhXaGl0ZVBpeGVsKG1vblswXS5kaXNwbGF5LCBtb25bMF0uc2NyZWVuSWQpLlZhbDsKCiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkNMSVBJRCA9IFgxMS5YSW50ZXJuQXRvbShtb25bMF0uZGlzcGxheSwgR00uQ3JlYXRlVmFyaWFibGUoJ0NMSVBCT0FSRCcpLCAwKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRk1USUQgPSBYMTEuWEludGVybkF0b20obW9uWzBdLmRpc3BsYXksIEdNLkNyZWF0ZVZhcmlhYmxlKCdVVEY4X1NUUklORycpLCAwKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuUFJPUElEID0gWDExLlhJbnRlcm5BdG9tKG1vblswXS5kaXNwbGF5LCBHTS5DcmVhdGVWYXJpYWJsZSgnWFNFTF9EQVRBJyksIDApOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5JTkNSSUQgPSBYMTEuWEludGVybkF0b20obW9uWzBdLmRpc3BsYXksIEdNLkNyZWF0ZVZhcmlhYmxlKCdJTkNSJyksIDApOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5ST09UV0lOID0gWDExLlhSb290V2luZG93KG1vblswXS5kaXNwbGF5LCBtb25bMF0uc2NyZWVuSWQpOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOID0gWDExLlhDcmVhdGVTaW1wbGVXaW5kb3cobW9uWzBdLmRpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuUk9PVFdJTiwgMCwgMCwgbW9uWzBdLnJpZ2h0LCA1LCAwLCB3aGl0ZSwgd2hpdGUpOwoKICAgICAgICAgICAgICAgIFgxMS5YU3luYyhtb25bMF0uZGlzcGxheSwgMCk7CiAgICAgICAgICAgICAgICBYMTEuWENvbnZlcnRTZWxlY3Rpb24obW9uWzBdLmRpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuQ0xJUElELCB0aGlzLl9tYXN0ZXJQcm9taXNlLkZNVElELCB0aGlzLl9tYXN0ZXJQcm9taXNlLlBST1BJRCwgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOLCBDdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICBYMTEuWFN5bmMobW9uWzBdLmRpc3BsYXksIDApOwoKCiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudCA9IHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5hZGREZXNjcmlwdG9yKFgxMS5YQ29ubmVjdGlvbk51bWJlcihtb25bMF0uZGlzcGxheSkuVmFsLCB7IHJlYWRzZXQ6IHRydWUgfSk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudC5fbWFzdGVyUHJvbWlzZSA9IHRoaXMuX21hc3RlclByb21pc2U7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudC5fZGlzcGxheSA9IG1vblswXS5kaXNwbGF5OwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5EZXNjcmlwdG9yRXZlbnQub24oJ3JlYWRzZXQnLCBmdW5jdGlvbiAoZmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFhFID0gR00uQ3JlYXRlVmFyaWFibGUoMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFgxMS5YUGVuZGluZyh0aGlzLl9kaXNwbGF5KS5WYWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBYMTEuWE5leHRFdmVudFN5bmModGhpcy5fZGlzcGxheSwgWEUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihYRS5EZXJlZigwLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID09IFNlbGVjdGlvbk5vdGlmeSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJpdHMgPSBHTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ogPSBHTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFpbCA9IEdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBHTS5DcmVhdGVQb2ludGVyKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhHZXRXaW5kb3dQcm9wZXJ0eSh0aGlzLl9kaXNwbGF5LCB0aGlzLl9tYXN0ZXJQcm9taXNlLkZBS0VXSU4sIHRoaXMuX21hc3RlclByb21pc2UuUFJPUElELCAwLCA2NTUzNSwgMCwgQW55UHJvcGVydHlUeXBlLCBpZCwgYml0cywgc3osIHRhaWwsIHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5fcmVzKHJlc3VsdC5EZXJlZigpLlN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMTEuWEZyZWUocmVzdWx0LkRlcmVmKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhEZXN0cm95V2luZG93KHRoaXMuX2Rpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuRkFLRVdJTik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEZXNjcmlwdG9yKGZkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBjb25zb2xlLmVycm9yKTsKICAgIH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBsaW5fY29weXRleHQodHh0KQp7CiAgICB2YXIgWDExID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMTsKICAgIGlmICghWDExKQogICAgewogICAgICAgIHRocm93KCdYMTEgcmVxdWlyZWQgZm9yIENsaXBib2FyZCBNYW5pcHVsYXRpb24nKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB2YXIgR00gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fZ207CiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgcmV0Ll90eHQgPSB0eHQ7CiAgICAgICAgcmV0Ll9nZXRJbmZvUHJvbWlzZSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldEluZm8oKTsKICAgICAgICByZXQuX2dldEluZm9Qcm9taXNlLl9tYXN0ZXJQcm9taXNlID0gcmV0OwogICAgICAgIHJldC5fZ2V0SW5mb1Byb21pc2UudGhlbihmdW5jdGlvbiAobW9uKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKG1vbi5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgd2hpdGUgPSBYMTEuWFdoaXRlUGl4ZWwobW9uWzBdLmRpc3BsYXksIG1vblswXS5zY3JlZW5JZCkuVmFsOwogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5DTElQSUQgPSBYMTEuWEludGVybkF0b20obW9uWzBdLmRpc3BsYXksIEdNLkNyZWF0ZVZhcmlhYmxlKCdDTElQQk9BUkQnKSwgMCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkZNVElEID0gWDExLlhJbnRlcm5BdG9tKG1vblswXS5kaXNwbGF5LCBHTS5DcmVhdGVWYXJpYWJsZSgnVVRGOF9TVFJJTkcnKSwgMCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLlJPT1RXSU4gPSBYMTEuWFJvb3RXaW5kb3cobW9uWzBdLmRpc3BsYXksIG1vblswXS5zY3JlZW5JZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkZBS0VXSU4gPSBYMTEuWENyZWF0ZVNpbXBsZVdpbmRvdyhtb25bMF0uZGlzcGxheSwgdGhpcy5fbWFzdGVyUHJvbWlzZS5ST09UV0lOLCAwLCAwLCBtb25bMF0ucmlnaHQsIDUsIDAsIHdoaXRlLCB3aGl0ZSk7CgogICAgICAgICAgICAgICAgWDExLlhTZXRTZWxlY3Rpb25Pd25lcihtb25bMF0uZGlzcGxheSwgWEFfUFJJTUFSWSwgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOLCBDdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICBYMTEuWFNldFNlbGVjdGlvbk93bmVyKG1vblswXS5kaXNwbGF5LCB0aGlzLl9tYXN0ZXJQcm9taXNlLkNMSVBJRCwgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOLCBDdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICBYMTEuWFN5bmMobW9uWzBdLmRpc3BsYXksIDApOwoKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50ID0gcmVxdWlyZSgnRGVzY3JpcHRvckV2ZW50cycpLmFkZERlc2NyaXB0b3IoWDExLlhDb25uZWN0aW9uTnVtYmVyKG1vblswXS5kaXNwbGF5KS5WYWwsIHsgcmVhZHNldDogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50Ll9tYXN0ZXJQcm9taXNlID0gdGhpcy5fbWFzdGVyUHJvbWlzZTsKICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50Ll9kaXNwbGF5ID0gbW9uWzBdLmRpc3BsYXk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudC5vbigncmVhZHNldCcsIGZ1bmN0aW9uIChmZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgWEUgPSBHTS5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoWDExLlhQZW5kaW5nKHRoaXMuX2Rpc3BsYXkpLlZhbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFgxMS5YTmV4dEV2ZW50U3luYyh0aGlzLl9kaXNwbGF5LCBYRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoWEUuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTZWxlY3Rpb25DbGVhcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCdTb21lYm9keSBlbHNlIG93bnMgY2xpcGJvYXJkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNlbGVjdGlvblJlcXVlc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnU29tZWJvZHkgd2FudHMgdXMgdG8gc2VuZCB0aGVtIGRhdGEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ID0gR00uQ3JlYXRlVmFyaWFibGUoR00uUG9pbnRlclNpemUgPT0gOCA/IDcyIDogMzYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9yZXF1ZXN0b3IgPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gWEUuRGVyZWYoNDAsIDgpIDogWEUuRGVyZWYoMjAsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9zZWxlY3Rpb24gPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gWEUuRGVyZWYoNDgsIDgpIDogWEUuRGVyZWYoMjQsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9wcm9wZXJ0eSA9IEdNLlBvaW50ZXJTaXplID09IDggPyBYRS5EZXJlZig2NCwgOCkgOiBYRS5EZXJlZigzMiwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyX3RhcmdldCA9IEdNLlBvaW50ZXJTaXplID09IDggPyBYRS5EZXJl", 16000);
|
|
memcpy_s(_clipboard + 16000, 7512, "Zig1NiwgOCkgOiBYRS5EZXJlZigyOCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyX3RpbWUgPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gWEUuRGVyZWYoNzIsIDgpIDogWEUuRGVyZWYoMzYsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcl9kaXNwbGF5ID0gR00uUG9pbnRlclNpemUgPT0gOCA/IFhFLkRlcmVmKDI0LCA4KSA6IFhFLkRlcmVmKDEyLCA0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKFNlbGVjdGlvbk5vdGlmeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3JlcXVlc3RvciA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZigzMiwgOCkgOiBldi5EZXJlZigxNiwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3NlbGVjdGlvbiA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZig0MCwgOCkgOiBldi5EZXJlZigyMCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3RhcmdldCA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZig0OCwgOCkgOiBldi5EZXJlZigyNCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2X3RpbWUgPSBHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gZXYuRGVyZWYoNjQsIDgpIDogZXYuRGVyZWYoMzIsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldl9wcm9wZXJ0eSA9IEdNLlBvaW50ZXJTaXplID09IDggPyBldi5EZXJlZig1NiwgOCkgOiBldi5EZXJlZigyOCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXB0ZXh0ID0gR00uQ3JlYXRlVmFyaWFibGUodGhpcy5fbWFzdGVyUHJvbWlzZS5fdHh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JfcmVxdWVzdG9yLkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLmNvcHkoZXZfcmVxdWVzdG9yLnRvQnVmZmVyKCkpOyBjb25zb2xlLmluZm8xKCdSRVFVRVNUT1I6ICcgKyBzcl9yZXF1ZXN0b3IuRGVyZWYoKS5wb2ludGVyQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcl9zZWxlY3Rpb24uRGVyZWYoKS5wb2ludGVyQnVmZmVyKCkuY29weShldl9zZWxlY3Rpb24udG9CdWZmZXIoKSk7IGNvbnNvbGUuaW5mbzEoJ1NFTEVDVElPTjogJyArIHNyX3NlbGVjdGlvbi5EZXJlZigpLnBvaW50ZXJCdWZmZXIoKS50b1N0cmluZygnaGV4JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyX3RhcmdldC5EZXJlZigpLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGV2X3RhcmdldC50b0J1ZmZlcigpKTsgY29uc29sZS5pbmZvMSgnVEFSR0VUOiAnICsgc3JfdGFyZ2V0LkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JfdGltZS5EZXJlZigpLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGV2X3RpbWUudG9CdWZmZXIoKSk7IGNvbnNvbGUuaW5mbzEoJ1RJTUU6ICcgKyBzcl90aW1lLkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcl90YXJnZXQuRGVyZWYoKS5WYWwgPT0gdGhpcy5fbWFzdGVyUHJvbWlzZS5GTVRJRC5WYWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCdVVEY4IFJlcXVlc3QgZm9yOiAnICsgY2xpcHRleHQuU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMShzcl9kaXNwbGF5LlZhbCwgc3JfcmVxdWVzdG9yLkRlcmVmKCkuVmFsLCBzcl9wcm9wZXJ0eS5EZXJlZigpLlZhbCwgc3JfdGFyZ2V0LkRlcmVmKCkuVmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhDaGFuZ2VQcm9wZXJ0eShzcl9kaXNwbGF5LkRlcmVmKCksIHNyX3JlcXVlc3Rvci5EZXJlZigpLCBzcl9wcm9wZXJ0eS5EZXJlZigpLCBzcl90YXJnZXQuRGVyZWYoKSwgOCwgUHJvcE1vZGVSZXBsYWNlLCBjbGlwdGV4dCwgY2xpcHRleHQuX3NpemUgLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhTeW5jKHNyX2Rpc3BsYXkuRGVyZWYoKSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyX3Byb3BlcnR5LkRlcmVmKCkucG9pbnRlckJ1ZmZlcigpLmNvcHkoZXZfcHJvcGVydHkudG9CdWZmZXIoKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCdVbmtub3duIEZvcm1hdCBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2X3Byb3BlcnR5LnBvaW50ZXJCdWZmZXIoKS53cml0ZVVJbnQzMkxFKE5vbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDExLlhTZW5kRXZlbnQoc3JfZGlzcGxheS5EZXJlZigpLCBzcl9yZXF1ZXN0b3IuRGVyZWYoKSwgMSwgMCwgZXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBjb25zb2xlLmxvZyk7CiAgICB9Cn0KCmZ1bmN0aW9uIHdpbl9yZWFkdGV4dCgpCnsKICAgIHZhciBoOwogICAgdmFyIHJldCA9ICcnOwogICAgdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsQWxsb2MnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsTG9jaycpOwogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHbG9iYWxVbmxvY2snKTsKCiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdDbG9zZUNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ0dldENsaXBib2FyZERhdGEnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ09wZW5DbGlwYm9hcmQnKTsKCiAgICB1c2VyMzIuT3BlbkNsaXBib2FyZCgwKTsKCiAgICBpZiAodXNlcjMyLklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1VOSUNPREVURVhUKS5WYWwgIT0gMCkKICAgIHsNCiAgICAgICAgaCA9IHVzZXIzMi5HZXRDbGlwYm9hcmREYXRhKENGX1VOSUNPREVURVhUKTsNCiAgICAgICAgaWYgKGguVmFsICE9IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBoYnVmZmVyID0ga2VybmVsMzIuR2xvYmFsTG9jayhoKTsKICAgICAgICAgICAgaGJ1ZmZlci5fc2l6ZSA9IC0xOwogICAgICAgICAgICByZXQgPSBoYnVmZmVyLldpZGUyVVRGODsKICAgICAgICAgICAga2VybmVsMzIuR2xvYmFsVW5sb2NrKGgpOw0KICAgICAgICB9DQogICAgfQogICAgZWxzZQogICAgew0KICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgcC5fcmVqKCdVbmtub3duIENsaXBib2FyZCBEYXRhJyk7CiAgICAgICAgcmV0dXJuIChwKTsNCiAgICB9CgoKICAgIHVzZXIzMi5DbG9zZUNsaXBib2FyZCgpOwoKICAgIHZhciBwID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgIHAuX3JlcyhyZXQpOwogICAgcmV0dXJuIChwKTsKfQoKZnVuY3Rpb24gd2luX2NvcHl0ZXh0KHR4dCkKewogICAgdmFyIEdNRU1fTU9WRUFCTEUgPSAweDAwMDI7CiAgICB2YXIgQ0ZfVEVYVCA9IDE7CgogICAgdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsQWxsb2MnKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsTG9jaycpOwogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHbG9iYWxVbmxvY2snKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ0Nsb3NlQ2xpcGJvYXJkJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdFbXB0eUNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ09wZW5DbGlwYm9hcmQnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ1NldENsaXBib2FyZERhdGEnKTsKCiAgICB2YXIgbXR4dCA9IEdNLkNyZWF0ZVZhcmlhYmxlKHR4dCwgeyB3aWRlOiB0cnVlIH0pOyAKICAgIHZhciBoID0ga2VybmVsMzIuR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgbXR4dC5fc2l6ZSk7CiAgICBoLmF1dG9GcmVlKGZhbHNlKTsKICAgIHZhciBoYnVmZmVyID0ga2VybmVsMzIuR2xvYmFsTG9jayhoKTsKICAgIGhidWZmZXIuYXV0b0ZyZWUoZmFsc2UpOwoKICAgIG10eHQudG9CdWZmZXIoKS5jb3B5KGhidWZmZXIuRGVyZWYoMCwgKDIgKiB0eHQubGVuZ3RoKSArIDIpLnRvQnVmZmVyKCkpOwogICAga2VybmVsMzIuR2xvYmFsVW5sb2NrKGgpOwoKICAgIHVzZXIzMi5PcGVuQ2xpcGJvYXJkKDApOwogICAgdXNlcjMyLkVtcHR5Q2xpcGJvYXJkKCk7CiAgICB1c2VyMzIuU2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgaCk7CiAgICB1c2VyMzIuQ2xvc2VDbGlwYm9hcmQoKTsKfQoKc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCnsKICAgIGNhc2UgJ3dpbjMyJzoKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbl9jb3B5dGV4dDsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5yZWFkID0gd2luX3JlYWR0ZXh0OwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnbGludXgnOgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGluX2NvcHl0ZXh0OwogICAgICAgIG1vZHVsZS5leHBvcnRzLnJlYWQgPSBsaW5fcmVhZHRleHQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgIGJyZWFrOwp9Cm1vZHVsZS5leHBvcnRzLm5hdGl2ZUFkZE1vZHVsZSA9IG5hdGl2ZUFkZE1vZHVsZTsKbW9kdWxlLmV4cG9ydHMuZGlzcGF0Y2hXcml0ZSA9IGRpc3BhdGNoV3JpdGU7Cm1vZHVsZS5leHBvcnRzLmRpc3BhdGNoUmVhZCA9IGRpc3BhdGNoUmVhZDs=", 7512);
|
|
ILibBase64DecodeEx((unsigned char*)_clipboard, 23512, (unsigned char*)_clipboard + 23512);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "clipboard"); duk_push_string(ctx, _clipboard + 23512);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_clipboard);
|
|
|
|
// Promise: This is very important, as it is used everywhere. Refer to /modules/promise.js to see a human readable version of promise.js
|
|
duk_peval_string_noresult(ctx, "addModule('promise', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciByZWZUYWJsZSA9IHt9OwoKZnVuY3Rpb24gZXZlbnRfc3dpdGNoZXJfaGVscGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQsIGZvcndhcmQpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ2V2ZW50X3N3aXRjaGVyJzsKICAgIHRoaXMuZnVuYyA9IGZ1bmN0aW9uIGZ1bmMoKQogICAgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgaWYgKGZ1bmMuZm9yd2FyZCAhPSBudWxsKSB7IGFyZ3MucHVzaChmdW5jLmZvcndhcmQpOyB9CiAgICAgICAgZm9yKHZhciBpIGluIGFyZ3VtZW50cykKICAgICAgICB7CiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKGZ1bmMudGFyZ2V0LmFwcGx5KGZ1bmMuZGVzaXJlZCwgYXJncykpOwogICAgfTsKICAgIHRoaXMuZnVuYy5kZXNpcmVkID0gZGVzaXJlZF9jYWxsZWU7CiAgICB0aGlzLmZ1bmMudGFyZ2V0ID0gdGFyZ2V0OwogICAgdGhpcy5mdW5jLmZvcndhcmQgPSBmb3J3YXJkOwogICAgdGhpcy5mdW5jLnNlbGYgPSB0aGlzOwp9CmZ1bmN0aW9uIGV2ZW50X3N3aXRjaGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpCnsKICAgIHJldHVybiAobmV3IGV2ZW50X3N3aXRjaGVyX2hlbHBlcihkZXNpcmVkX2NhbGxlZSwgdGFyZ2V0KSk7Cn0KCmZ1bmN0aW9uIGV2ZW50X2ZvcndhcmRlcihzb3VyY2VPYmosIHNvdXJjZU5hbWUsIHRhcmdldE9iaiwgdGFyZ2V0TmFtZSkKew0KICAgIHNvdXJjZU9iai5vbihzb3VyY2VOYW1lLCAgIChuZXcgZXZlbnRfc3dpdGNoZXJfaGVscGVyKHRhcmdldE9iaiwgdGFyZ2V0T2JqLmVtaXQsIHRhcmdldE5hbWUpKS5mdW5jKTsgICAgICANCn0KCmZ1bmN0aW9uIFByb21pc2UocHJvbWlzZUZ1bmMpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3Byb21pc2UnOwogICAgdGhpcy5wcm9taXNlID0gdGhpczsKICAgIHRoaXMuX2ludGVybmFsID0geyBfT2JqZWN0SUQ6ICdwcm9taXNlLmludGVybmFsJywgcHJvbWlzZTogdGhpcywgZnVuYzogcHJvbWlzZUZ1bmMsIGNvbXBsZXRlZDogZmFsc2UsIGVycm9yczogZmFsc2UsIGNvbXBsZXRlZEFyZ3M6IFtdIH07CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLl9pbnRlcm5hbCk7CiAgICB0aGlzLl9pbnRlcm5hbC5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAoZXZlbnROYW1lLCBldmVudENhbGxiYWNrKQogICAgewogICAgICAgIC8vY29uc29sZS5sb2coJ25ld0xpc3RlbmVyJywgZXZlbnROYW1lLCAnZXJyb3JzLycgKyB0aGlzLmVycm9ycyArICcgY29tcGxldGVkLycgKyB0aGlzLmNvbXBsZXRlZCk7CiAgICAgICAgdmFyIHIgPSBudWxsOwoKICAgICAgICBpZiAoZXZlbnROYW1lID09ICdyZXNvbHZlZCcgJiYgIXRoaXMuZXJyb3JzICYmIHRoaXMuY29tcGxldGVkKQogICAgICAgIHsKICAgICAgICAgICAgciA9IGV2ZW50Q2FsbGJhY2suYXBwbHkodGhpcywgdGhpcy5jb21wbGV0ZWRBcmdzKTsKICAgICAgICAgICAgaWYociE9bnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lbWl0X3JldHVyblZhbHVlKCdyZXNvbHZlZCcsIHIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChldmVudE5hbWUgPT0gJ3JlamVjdGVkJyAmJiB0aGlzLmVycm9ycyAmJiB0aGlzLmNvbXBsZXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIGV2ZW50Q2FsbGJhY2suYXBwbHkodGhpcywgdGhpcy5jb21wbGV0ZWRBcmdzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PSAnc2V0dGxlZCcgJiYgdGhpcy5jb21wbGV0ZWQpCiAgICAgICAgewogICAgICAgICAgICBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIFtdKTsKICAgICAgICB9CiAgICB9KTsKICAgIHRoaXMuX2ludGVybmFsLnJlc29sdmVyID0gZnVuY3Rpb24gX3Jlc29sdmVyKCkKICAgIHsKICAgICAgICBpZiAoX3Jlc29sdmVyLl9zZWxmLmNvbXBsZXRlZCkgeyByZXR1cm47IH0KICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuZXJyb3JzID0gZmFsc2U7CiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmNvbXBsZXRlZEFyZ3MgPSBbXTsKICAgICAgICB2YXIgYXJncyA9IFsncmVzb2x2ZWQnXTsKICAgICAgICBpZiAodGhpcy5lbWl0X3JldHVyblZhbHVlICYmIHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnKSAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmNvbXBsZXRlZEFyZ3MucHVzaCh0aGlzLmVtaXRfcmV0dXJuVmFsdWUoJ3Jlc29sdmVkJykpOwogICAgICAgICAgICBhcmdzLnB1c2godGhpcy5lbWl0X3JldHVyblZhbHVlKCdyZXNvbHZlZCcpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBhcmd1bWVudHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWRBcmdzLnB1c2goYXJndW1lbnRzW2FdKTsKICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbYV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9yZXNvbHZlci5fc2VsZi5lbWl0LmFwcGx5KF9yZXNvbHZlci5fc2VsZiwgYXJncyk7CiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmVtaXQoJ3NldHRsZWQnKTsKICAgIH07CiAgICB0aGlzLl9pbnRlcm5hbC5yZWplY3RvciA9IGZ1bmN0aW9uIF9yZWplY3RvcigpCiAgICB7CiAgICAgICAgaWYgKF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWQpIHsgcmV0dXJuOyB9CiAgICAgICAgX3JlamVjdG9yLl9zZWxmLmVycm9ycyA9IHRydWU7CiAgICAgICAgX3JlamVjdG9yLl9zZWxmLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgX3JlamVjdG9yLl9zZWxmLmNvbXBsZXRlZEFyZ3MgPSBbXTsKICAgICAgICB2YXIgYXJncyA9IFsncmVqZWN0ZWQnXTsKICAgICAgICBmb3IgKHZhciBhIGluIGFyZ3VtZW50cykKICAgICAgICB7CiAgICAgICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWRBcmdzLnB1c2goYXJndW1lbnRzW2FdKTsKICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1thXSk7CiAgICAgICAgfQoKICAgICAgICBfcmVqZWN0b3IuX3NlbGYuZW1pdC5hcHBseShfcmVqZWN0b3IuX3NlbGYsIGFyZ3MpOwogICAgICAgIF9yZWplY3Rvci5fc2VsZi5lbWl0KCdzZXR0bGVkJyk7CiAgICB9OwogICAgdGhpcy5jYXRjaCA9IGZ1bmN0aW9uKGZ1bmMpCiAgICB7CiAgICAgICAgdGhpcy5faW50ZXJuYWwub25jZSgncmVqZWN0ZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCBmdW5jKS5mdW5jKTsKICAgIH0KICAgIHRoaXMuZmluYWxseSA9IGZ1bmN0aW9uIChmdW5jKQogICAgewogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3NldHRsZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCBmdW5jKS5mdW5jKTsKICAgIH07CiAgICB0aGlzLnRoZW4gPSBmdW5jdGlvbiAocmVzb2x2ZWQsIHJlamVjdGVkKQogICAgewogICAgICAgIGlmIChyZXNvbHZlZCkgeyB0aGlzLl9pbnRlcm5hbC5vbmNlKCdyZXNvbHZlZCcsIGV2ZW50X3N3aXRjaGVyKHRoaXMsIHJlc29sdmVkKS5mdW5jKTsgfQogICAgICAgIGlmIChyZWplY3RlZCkgeyB0aGlzLl9pbnRlcm5hbC5vbmNlKCdyZWplY3RlZCcsIGV2ZW50X3N3aXRjaGVyKHRoaXMsIHJlamVjdGVkKS5mdW5jKTsgfQoKICAgICAgICB2YXIgcmV0VmFsID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIGopIHsgfSk7CiAgICAgICAgdGhpcy5faW50ZXJuYWwub25jZSgncmVzb2x2ZWQnLCByZXRWYWwuX2ludGVybmFsLnJlc29sdmVyKTsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdyZWplY3RlZCcsIHJldFZhbC5faW50ZXJuYWwucmVqZWN0b3IpOwogICAgICAgIHJldFZhbC5wYXJlbnRQcm9taXNlID0gdGhpczsKICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICB9OwoKICAgIHRoaXMuX2ludGVybmFsLnJlc29sdmVyLl9zZWxmID0gdGhpcy5faW50ZXJuYWw7CiAgICB0aGlzLl9pbnRlcm5hbC5yZWplY3Rvci5fc2VsZiA9IHRoaXMuX2ludGVybmFsOzsKCiAgICB0cnkKICAgIHsKICAgICAgICBwcm9taXNlRnVuYy5jYWxsKHRoaXMsIHRoaXMuX2ludGVybmFsLnJlc29sdmVyLCB0aGlzLl9pbnRlcm5hbC5yZWplY3Rvcik7CiAgICB9CiAgICBjYXRjaChlKQogICAgewogICAgICAgIHRoaXMuX2ludGVybmFsLmVycm9ycyA9IHRydWU7CiAgICAgICAgdGhpcy5faW50ZXJuYWwuY29tcGxldGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5jb21wbGV0ZWRBcmdzID0gW2VdOwogICAgICAgIHRoaXMuX2ludGVybmFsLmVtaXQoJ3JlamVjdGVkJywgZSk7CiAgICAgICAgdGhpcy5faW50ZXJuYWwuZW1pdCgnc2V0dGxlZCcpOwogICAgfQoKICAgIGlmKCF0aGlzLl9pbnRlcm5hbC5jb21wbGV0ZWQpCiAgICB7CiAgICAgICAgLy8gU2F2ZSByZWZlcmVuY2Ugb2YgdGhpcyBvYmplY3QKICAgICAgICByZWZUYWJsZVt0aGlzLl9pbnRlcm5hbC5faGFzaENvZGUoKV0gPSB0aGlzLl9pbnRlcm5hbDsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdzZXR0bGVkJywgZnVuY3Rpb24gKCkgeyByZWZUYWJsZVt0aGlzLl9oYXNoQ29kZSgpXSA9IG51bGw7IH0pOwogICAgfQp9CgpQcm9taXNlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKCkKewogICAgdmFyIHJldFZhbCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBqKSB7IH0pOwogICAgdmFyIGFyZ3MgPSBbXTsKICAgIGZvciAodmFyIGkgaW4gYXJndW1lbnRzKQogICAgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgfQogICAgcmV0VmFsLl9pbnRlcm5hbC5yZXNvbHZlci5hcHBseShyZXRWYWwuX2ludGVybmFsLCBhcmdzKTsKICAgIHJldHVybiAocmV0VmFsKTsKfTsKUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbiByZWplY3QoKSB7CiAgICB2YXIgcmV0VmFsID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIGopIHsgfSk7CiAgICB2YXIgYXJncyA9IFtdOwogICAgZm9yICh2YXIgaSBpbiBhcmd1bWVudHMpIHsKICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKICAgIH0KICAgIHJldFZhbC5faW50ZXJuYWwucmVqZWN0b3IuYXBwbHkocmV0VmFsLl9pbnRlcm5hbCwgYXJncyk7CiAgICByZXR1cm4gKHJldFZhbCk7Cn07ClByb21pc2UuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VMaXN0KQp7CiAgICB2YXIgcmV0ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKQogICAgewogICAgICAgIHRoaXMuX19yZWplY3RvciA9IHJlajsKICAgICAgICB0aGlzLl9fcmVzb2x2ZXIgPSByZXM7CiAgICAgICAgdGhpcy5fX3Byb21pc2VMaXN0ID0gcHJvbWlzZUxpc3Q7CiAgICAgICAgdGhpcy5fX2RvbmUgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fY291bnQgPSAwOwogICAgfSk7CgogICAgZm9yICh2YXIgaSBpbiBwcm9taXNlTGlzdCkKICAgIHsKICAgICAgICBwcm9taXNlTGlzdFtpXS50aGVuKGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICAvLyBTdWNjZXNzCiAgICAgICAgICAgIGlmKCsrcmV0Ll9fY291bnQgPT0gcmV0Ll9fcHJvbWlzZUxpc3QubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXQuX19kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldC5fX3Jlc29sdmVyKHJldC5fX3Byb21pc2VMaXN0KTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uIChhcmcpCiAgICAgICAgewogICAgICAgICAgICAvLyBGYWlsdXJlCiAgICAgICAgICAgIGlmKCFyZXQuX19kb25lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXQuX19kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldC5fX3JlamVjdG9yKGFyZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIGlmIChwcm9taXNlTGlzdC5sZW5ndGggPT0gMCkKICAgIHsKICAgICAgICByZXQuX19yZXNvbHZlcihwcm9taXNlTGlzdCk7CiAgICB9CiAgICByZXR1cm4gKHJldCk7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7Cm1vZHVsZS5leHBvcnRzLmV2ZW50X3N3aXRjaGVyID0gZXZlbnRfc3dpdGNoZXI7Cm1vZHVsZS5leHBvcnRzLmV2ZW50X2ZvcndhcmRlciA9IGV2ZW50X2ZvcndhcmRlcjs=', 'base64').toString());");
|
|
|
|
#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('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBLRVlfUVVFUllfVkFMVUUgPSAweDAwMDE7CnZhciBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTID0gMHgwMDA4Owp2YXIgS0VZX1dSSVRFID0gMHgyMDAwNjsKCnZhciBLRVlfREFUQV9UWVBFUyA9CiAgICB7CiAgICAgICAgUkVHX05PTkU6IDAsCiAgICAgICAgUkVHX1NaOiAxLAogICAgICAgIFJFR19FWFBBTkRfU1o6IDIsCiAgICAgICAgUkVHX0JJTkFSWTogMywKICAgICAgICBSRUdfRFdPUkQ6IDQsCiAgICAgICAgUkVHX0RXT1JEX0JJR19FTkRJQU46IDUsCiAgICAgICAgUkVHX0xJTks6IDYsCiAgICAgICAgUkVHX01VTFRJX1NaOiA3LAogICAgICAgIFJFR19SRVNPVVJDRV9MSVNUOiA4LAogICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1I6IDksCiAgICAgICAgUkVHX1JFU09VUkNFX1JFUVVJUkVNRU5UU19MSVNUOiAxMCwKICAgICAgICBSRUdfUVdPUkQ6IDExCiAgICB9OwoKZnVuY3Rpb24gd2luZG93c19yZWdpc3RyeSgpCnsKICAgIHRoaXMuX09iamVjdElkID0gJ3dpbi1yZWdpc3RyeSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9BZHZBcGkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0NyZWF0ZUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bUtleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnRW51bVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnT3BlbktleUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlJbmZvS2V5VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnUXVlcnlWYWx1ZUV4VycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnQ2xvc2VLZXknKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZUtleVcnKTsKICAgIHRoaXMuX0FkdkFwaS5DcmVhdGVNZXRob2QoJ1JlZ0RlbGV0ZVZhbHVlVycpOwogICAgdGhpcy5fQWR2QXBpLkNyZWF0ZU1ldGhvZCgnUmVnU2V0VmFsdWVFeFcnKTsKICAgIHRoaXMuSEtFWSA9IHsgUm9vdDogQnVmZmVyLmZyb20oJzgwMDAwMDAwJywgJ2hleCcpLnN3YXAzMigpLCBDdXJyZW50VXNlcjogQnVmZmVyLmZyb20oJzgwMDAwMDAxJywgJ2hleCcpLnN3YXAzMigpLCBMb2NhbE1hY2hpbmU6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMicsICdoZXgnKS5zd2FwMzIoKSwgVXNlcnM6IEJ1ZmZlci5mcm9tKCc4MDAwMDAwMycsICdoZXgnKS5zd2FwMzIoKSB9OwoKICAgIHRoaXMuUXVlcnlLZXkgPSBmdW5jdGlvbiBRdWVyeUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgdmFyIGVycjsKICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIHZhciBsZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgIHZhciB2YWxUeXBlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICB2YXIgSEsgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSk7CiAgICAgICAgdmFyIHJldFZhbCA9IG51bGw7CiAgICAgICAgaWYgKGtleSkgeyBrZXkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGtleSwgeyB3aWRlOiB0cnVlIH0pOyB9CiAgICAgICAgaWYgKCFwYXRoKSB7IHBhdGggPSAnJzsgfQoKCiAgICAgICAgaWYgKChlcnIgPSB0aGlzLl9BZHZBcGkuUmVnT3BlbktleUV4VyhISywgdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShwYXRoLCB7IHdpZGU6IHRydWUgfSksIDAsIEtFWV9RVUVSWV9WQUxVRSB8IEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMsIGgpLlZhbCkgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoICsgJyA9PiBSZXR1cm5lZCBFcnJvcjogJyArIGVycik7CiAgICAgICAgfQogIAoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCAwLCAwLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUobGVuLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1F1ZXJ5VmFsdWVFeFcoaC5EZXJlZigpLCBrZXkgPyBrZXkgOiAwLCAwLCB2YWxUeXBlLCBkYXRhLCBsZW4pLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsVHlwZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkRfQklHX0VORElBTjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpLnJlYWRVSW50MzJCRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19TWjoKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19FWFBBTkRfU1o6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGEuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk6CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YS50b0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2RhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3R5cGUgPSB2YWxUeXBlLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGtleSkgICAgLy8gT25seSB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXhwbGljaXQga2V5IHdhcyBzcGVjaWZpZWQsIGJlY3Vhc2UgaXQgd2Fzbid0IGZvdW5kLiBPdGhlcndpc2UsIGFsbCB3ZSBrbm93IGlzIHRoYXQgYSBkZWZhdWx0IHZhbHVlIHdhc24ndCBzZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgICAgIHRocm93ICgnTm90IEZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0KCgoKICAgICAgICBpZiAoKHBhdGggPT0gJycgJiYgIWtleSkgfHwgIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7IHN1YmtleXM6IFtdLCB2YWx1ZXM6IFtdLCBkZWZhdWx0OiByZXRWYWwgfTsKICAgICAgICAgICAgaWYgKCFrZXkgJiYgIXJldFZhbCkgeyBkZWxldGUgcmVzdWx0LmRlZmF1bHQ7IH0KCiAgICAgICAgICAgIC8vIEVudW1lcmF0ZSAga2V5cwogICAgICAgICAgICB2YXIgYWNoQ2xhc3MgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgICAgICAgICB2YXIgYWNoS2V5ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsKICAgICAgICAgICAgdmFyIGFjaFZhbHVlID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgzMjc2OCk7CiAgICAgICAgICAgIHZhciBhY2hWYWx1ZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbmFtZVNpemUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyAKICAgICAgICAgICAgdmFyIGFjaENsYXNzU2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7IGFjaENsYXNzU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMTAyNCk7CiAgICAgICAgICAgIHZhciBudW1TdWJLZXlzID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIG51bVZhbHVlcyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0U3Via2V5U2l6ZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0Q2xhc3NTdHJpbmcgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICB2YXIgbG9uZ2VzdFZhbHVlTmFtZSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsb25nZXN0VmFsdWVEYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgdmFyIHNlY3VyaXR5RGVzY3JpcHRvciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIHZhciBsYXN0V3JpdGVUaW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg4KTsKCiAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdRdWVyeUluZm9LZXlXKGguRGVyZWYoKSwgYWNoQ2xhc3MsIGFjaENsYXNzU2l6ZSwgMCwKICAgICAgICAgICAgICAgIG51bVN1YktleXMsIGxvbmdlc3RTdWJrZXlTaXplLCBsb25nZXN0Q2xhc3NTdHJpbmcsIG51bVZhbHVlcywKICAgICAgICAgICAgICAgIGxvbmdlc3RWYWx1ZU5hbWUsIGxvbmdlc3RWYWx1ZURhdGEsIHNlY3VyaXR5RGVzY3JpcHRvciwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsICE9IDApIHsgdGhyb3cgKCdSZWdRdWVyeUluZm9LZXlXKCkgcmV0dXJuZWQgZXJyb3I6ICcgKyByZXRWYWwuVmFsKTsgfQogICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtU3ViS2V5cy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWVTaXplLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsKICAgICAgICAgICAgICAgIHJldFZhbCA9IHRoaXMuX0FkdkFwaS5SZWdFbnVtS2V5RXhXKGguRGVyZWYoKSwgaSwgYWNoS2V5LCBuYW1lU2l6ZSwgMCwgMCwgMCwgbGFzdFdyaXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZihyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN1YmtleXMucHVzaChhY2hLZXkuV2lkZTJVVEY4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVZhbHVlcy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhY2hWYWx1ZVNpemUudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMyNzY4KTsKICAgICAgICAgICAgICAgIGlmKHRoaXMuX0FkdkFwaS5SZWdFbnVtVmFsdWVXKGguRGVyZWYoKSwgaSwgYWNoVmFsdWUsIGFjaFZhbHVlU2l6ZSwgMCwgMCwgMCwgMCkuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlcy5wdXNoKGFjaFZhbHVlLldpZGUyVVRGOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgfTsKICAgIHRoaXMuV3JpdGVLZXkgPSBmdW5jdGlvbiBXcml0ZUtleShoa2V5LCBwYXRoLCBrZXksIHZhbHVlKQogICAgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgdmFyIGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKCiAgICAgICAgaWYgKHRoaXMuX0FkdkFwaS5SZWdDcmVhdGVLZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgMCwgMCwgS0VZX1dSSVRFLCAwLCBoLCAwKS5WYWwgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnRXJyb3IgT3BlbmluZyBSZWdpc3RyeSBLZXk6ICcgKyBwYXRoKTsKICAgICAgICB9CgogICAgICAgIHZhciBkYXRhOwogICAgICAgIHZhciBkYXRhVHlwZTsKCiAgICAgICAgc3dpdGNoKHR5cGVvZih2YWx1ZSkpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gS0VZX0RBVEFfVFlQRVMuUkVHX0RXT1JEOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICBkYXRhLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdudW1iZXInOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfRFdPUkQ7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHZhbHVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgICAgICAgZGF0YVR5cGUgPSBLRVlfREFUQV9UWVBFUy5SRUdfU1o7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IEtFWV9EQVRBX1RZUEVTLlJFR19CSU5BUlk7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSh2YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdmFsdWUuY29weShkYXRhLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ1NldFZhbHVlRXhXKGguRGVyZWYoKSwga2V5P3RoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSk6MCwgMCwgZGF0YVR5cGUsIGRhdGEsIGRhdGEuX3NpemUpLlZhbCAhPSAwKQogICAgICAgIHsgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICAgICAgdGhyb3cgKCdFcnJvciB3cml0aW5nIHJlZyBrZXk6ICcgKyBrZXkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgIH07CiAgICB0aGlzLkRlbGV0ZUtleSA9IGZ1bmN0aW9uIERlbGV0ZUtleShoa2V5LCBwYXRoLCBrZXkpCiAgICB7CiAgICAgICAgaWYoIWtleSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl9BZHZBcGkuUmVnRGVsZXRlS2V5Vyh0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoaGtleSksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUocGF0aCwgeyB3aWRlOiB0cnVlIH0pKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBEZWxldGluZyBLZXk6ICcgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB2YXIgaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICBpZiAodGhpcy5fQWR2QXBpLlJlZ09wZW5LZXlFeFcodGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKGhrZXkpLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHBhdGgsIHsgd2lkZTogdHJ1ZSB9KSwgMCwgS0VZX1FVRVJZX1ZBTFVFIHwgS0VZX1dSSVRFLCBoKS5WYWwgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdFcnJvciBPcGVuaW5nIFJlZ2lzdHJ5IEtleTogJyArIHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fQWR2QXBpLlJlZ0RlbGV0ZVZhbHVlVyhoLkRlcmVmKCksIHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoa2V5LCB7IHdpZGU6IHRydWUgfSkpLlZhbCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5fQWR2QXBpLlJlZ0Nsb3NlS2V5KGguRGVyZWYoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yWycgKyByZXN1bHQgKyAnXSBEZWxldGluZyBLZXk6ICcgKyBwYXRoICsgJy4nICsga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9BZHZBcGkuUmVnQ2xvc2VLZXkoaC5EZXJlZigpKTsKICAgICAgICB9CiAgICB9OwogICAgdGhpcy51c2VybmFtZVRvVXNlcktleSA9IGZ1bmN0aW9uIHVzZXJuYW1lVG9Vc2VyS2V5KHVzZXIpDQogICAgew0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHNpZCA9IHVzZXI7DQogICAgICAgICAgICBpZiAodHlwZW9mICh1c2VyKSA9PSAnc3RyaW5nJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuUXVlcnlLZXkodGhpcy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NBTVxcU0FNXFxEb21haW5zXFxBY2NvdW50XFxVc2Vyc1xcTmFtZXNcXCcgKyB1c2VyKTsNCiAgICAgICAgICAgICAgICBzaWQgPSByLmRlZmF1bHQuX3R5cGU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgdSA9IHRoaXMuUXVlcnlLZXkodGhpcy5IS0VZLlVzZXJzKTsNCiAgICAgICAgICAgIGZvcihpIGluIHUuc3Via2V5cykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZih1LnN1YmtleXNbaV0uZW5kc1dpdGgoJy0nICsgc2lkKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAodS5zdWJrZXlzW2ldKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgew0KICAgICAgICB9DQoNCiAgICAgICAgLy8gTm90IEZvdW5kIHlldCwgc28gbGV0J3MgdHJ5IHRvIGJydXRlLWZvcmNlIGl0DQogICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5RdWVyeUtleSh0aGlzLkhLRVkuVXNlcnMpOw0KICAgICAgICBmb3IoaSBpbiBlbnRyaWVzLnN1YmtleXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKGVudHJpZXMuc3Via2V5c1tpXS5zcGxpdCgnLScpLmxlbmd0aD41ICYmICFlbnRyaWVzLnN1YmtleXNbaV0uZW5kc1dpdGgoJ19DbGFzc2VzJykpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5RdWVyeUtleSh0aGlzLkhLRVkuVXNlcnMsIGVudHJpZXMuc3Via2V5c1tpXSArICdcXFZvbGF0aWxlIEVudmlyb25tZW50JywgJ1VTRVJOQU1FJykgPT0gdXNlcikNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRyaWVzLnN1YmtleXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNhdGNoKGVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhyb3cgKCdVbmFibGUgdG8gZGV0ZXJtaW5lIEhLRVlfVVNFUlMga2V5IGZvcjogJyArIHVzZXIpOw0KICAgIH07Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IHdpbmRvd3NfcmVnaXN0cnkoKTsKCv==', '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());");
|
|
|
|
// Windows Message Pump, refer to modules/win-message-pump.js
|
|
duk_peval_string_noresult(ctx, "addModule('win-message-pump', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBXSF9DQUxMV05EUFJPQyA9IDQ7CnZhciBXTV9RVUlUID0gIDB4MDAxMjsKdmFyIFdNX0NMT1NFID0gMHgwMDEwOwp2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKCmZ1bmN0aW9uIFdpbmRvd3NNZXNzYWdlUHVtcChvcHRpb25zKQp7CiAgICB0aGlzLl9PYmplY3RJRCA9ICd3aW4tbWVzc2FnZS1wdW1wJzsKICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zOwogICAgdmFyIGVtaXR0ZXJVdGlscyA9IHJlcXVpcmUoJ2V2ZW50cycpLmluaGVyaXRzKHRoaXMpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdod25kJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ2Vycm9yJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ21lc3NhZ2UnKTsKICAgIGVtaXR0ZXJVdGlscy5jcmVhdGVFdmVudCgnZXhpdCcpOwoKICAgIHRoaXMuX21zZyA9IEdNLkNyZWF0ZVZhcmlhYmxlKEdNLlBvaW50ZXJTaXplID09IDQgPyAyOCA6IDQ4KTsKICAgIHRoaXMuX2tlcm5lbDMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0tlcm5lbDMyLmRsbCcpOwogICAgdGhpcy5fa2VybmVsMzIubXAgPSB0aGlzOwogICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TW9kdWxlSGFuZGxlQScpOwoKICAgIHRoaXMuX3VzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdVc2VyMzIuZGxsJyk7CiAgICB0aGlzLl91c2VyMzIubXAgPSB0aGlzOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnQ3JlYXRlV2luZG93RXhBJyk7CiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdEZWZXaW5kb3dQcm9jQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGVzdHJveVdpbmRvdycpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnRGlzcGF0Y2hNZXNzYWdlQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnR2V0TWVzc2FnZUEnKTsKICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1Bvc3RNZXNzYWdlQScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnUmVnaXN0ZXJDbGFzc0V4QScpOwogICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU2V0V2luZG93UG9zJyk7CiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdTaG93V2luZG93Jyk7CiAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCdUcmFuc2xhdGVNZXNzYWdlJyk7CgoKICAgIHRoaXMud25kY2xhc3MgPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZSA9PSA0ID8gNDggOiA4MCk7CiAgICB0aGlzLnduZGNsYXNzLm1wID0gdGhpczsKICAgIHRoaXMud25kY2xhc3MuaGluc3RhbmNlID0gdGhpcy5fa2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgwKTsKICAgIHRoaXMud25kY2xhc3MuY25hbWUgPSBHTS5DcmVhdGVWYXJpYWJsZSgnTWFpbldXV0NsYXNzJyk7CiAgICB0aGlzLnduZGNsYXNzLnduZHByb2MgPSBHTS5HZXRHZW5lcmljR2xvYmFsQ2FsbGJhY2soNCk7CiAgICB0aGlzLnduZGNsYXNzLnduZHByb2MubXAgPSB0aGlzOwogICAgdGhpcy53bmRjbGFzcy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodGhpcy53bmRjbGFzcy5fc2l6ZSk7CiAgICB0aGlzLnduZGNsYXNzLmNuYW1lLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDQwIDogNjQsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3Mud25kcHJvYy5wb2ludGVyQnVmZmVyKCkuY29weSh0aGlzLnduZGNsYXNzLkRlcmVmKDgsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3MuaGluc3RhbmNlLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHRoaXMud25kY2xhc3MuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDIwIDogMjQsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgIHRoaXMud25kY2xhc3Mud25kcHJvYy5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBvblduZFByb2MoeGh3bmQsIHhtc2csIHdwYXJhbSwgbHBhcmFtKQogICAgewogICAgICAgIGlmICh0aGlzLm1wLl9od25kICE9IG51bGwgJiYgdGhpcy5tcC5faHduZC5WYWwgPT0geGh3bmQuVmFsKQogICAgICAgIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgdXMKICAgICAgICAgICAgdmFyIGQgPSB0aGlzLlN0YXJ0RGlzcGF0Y2hlcigpOwogICAgICAgICAgICB0aGlzLm1wLmVtaXQoJ21lc3NhZ2UnLCB7IG1lc3NhZ2U6IHhtc2cuVmFsLCB3cGFyYW06IHdwYXJhbS5WYWwsIGxwYXJhbTogbHBhcmFtLlZhbCwgbHBhcmFtX2hleDogbHBhcmFtLnBvaW50ZXJCdWZmZXIoKS50b1N0cmluZygnaGV4JyksIGxwYXJhbV9yYXc6IGxwYXJhbSwgaHduZDogeGh3bmQsIGRpc3BhdGNoZXI6IGQgfSk7CgogICAgICAgICAgICB2YXIgbXNnUmV0ID0gdGhpcy5tcC5lbWl0X3JldHVyblZhbHVlKCdtZXNzYWdlJyk7CiAgICAgICAgICAgIGlmIChtc2dSZXQgPT0gbnVsbCkKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsbCBEZWZXaW5kb3dQcm9jQSwgYmVjdWFzZSB0aGlzIG1lc3NhZ2Ugd2FzIG5vdCBoYW5kbGVkDQogICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLm1wLl91c2VyMzIuRGVmV2luZG93UHJvY0EuYXN5bmMoZCwgeGh3bmQsIHhtc2csIHdwYXJhbSwgbHBhcmFtKTsKICAgICAgICAgICAgICAgIHAuZGlzcGF0Y2hlciA9IHRoaXM7CiAgICAgICAgICAgICAgICBwLnRoZW4oZnVuY3Rpb24gKHJldCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5FbmREaXNwYXRjaGVyKHJldCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByID0gR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgICAgIHIuVmFsID0gbXNnUmV0Ow0KICAgICAgICAgICAgICAgIHRoaXMuRW5kRGlzcGF0Y2hlcihyKTsNCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZih0aGlzLm1wLl9od25kID09IG51bGwgJiYgdGhpcy5DYWxsaW5nVGhyZWFkKCkgPT0gdGhpcy5tcC5fdXNlcjMyLlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMudGhyZWFkSWQoKSkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFRoaXMgbWVzc2FnZSB3YXMgZ2VuZXJhdGVkIGZyb20gb3VyIENyZWF0ZVdpbmRvd0V4QSBtZXRob2QKICAgICAgICAgICAgdmFyIGQgPSB0aGlzLlN0YXJ0RGlzcGF0Y2hlcigpOwoKICAgICAgICAgICAgdGhpcy5tcC5lbWl0KCdtZXNzYWdlJywgeyBtZXNzYWdlOiB4bXNnLlZhbCwgd3BhcmFtOiB3cGFyYW0uVmFsLCBscGFyYW06IGxwYXJhbS5WYWwsIGxwYXJhbV9oZXg6IGxwYXJhbS5wb2ludGVyQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLCBod25kOiB4aHduZCwgZGlzcGF0Y2hlcjogZCB9KTsKCiAgICAgICAgICAgIHZhciBtc2dSZXQgPSB0aGlzLm1wLmVtaXRfcmV0dXJuVmFsdWUoJ21lc3NhZ2UnKTsKICAgICAgICAgICAgaWYgKG1zZ1JldCA9PSBudWxsKQ0Kew0KICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsbCBEZWZXaW5kb3dQcm9jQSwgYmVjdWFzZSB0aGlzIG1lc3NhZ2Ugd2FzIG5vdCBoYW5kbGVkDQogICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLm1wLl91c2VyMzIuRGVmV2luZG93UHJvY0EuYXN5bmMoZCwgeGh3bmQsIHhtc2csIHdwYXJhbSwgbHBhcmFtKTsKICAgICAgICAgICAgICAgIHAuZGlzcGF0Y2hlciA9IHRoaXM7CiAgICAgICAgICAgICAgICBwLnRoZW4oZnVuY3Rpb24gKHJldCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5FbmREaXNwYXRjaGVyKHJldCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciByID0gR00uQ3JlYXRlUG9pbnRlcigpOw0KICAgICAgICAgICAgICAgIHIuVmFsID0gbXNnUmV0Ow0KICAgICAgICAgICAgICAgIHRoaXMuRW5kRGlzcGF0Y2hlcihyKTsNCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9kZWJ1Z0dDKCk7CiAgICB9KTsKCiAgICB0aGlzLl91c2VyMzIuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYyh0aGlzLnduZGNsYXNzKS50aGVuKGZ1bmN0aW9uICgpCiAgICB7CiAgICAgICAgaWYgKCF0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zKSAgeyAgIHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMgPSB7fTsgIH0KICAgICAgICBpZiAoIXRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93KSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93ID0ge307IH0KICAgICAgICBpZiAodGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cuZXhzdHlsZXMgPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy5leHN0eWxlcyA9IDB4MDAwMDAwODg7IH0gICAgLy8gVG9wTW9zdCBUb29sIFdpbmRvdwogICAgICAgIGlmICh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy53aW5zdHlsZXMgPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy53aW5zdHlsZXMgPSAweDAwODAwMDAwOyB9ICAvLyBXU19CT1JERVIKICAgICAgICBpZiAodGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cueCA9PSBudWxsKSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LnggPSAwOyB9CiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LnkgPT0gbnVsbCkgeyB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy55ID0gMDsgfQogICAgICAgIGlmICh0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy53aWR0aCA9PSBudWxsKSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LndpZHRoID0gMTAwOyB9CiAgICAgICAgaWYgKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmhlaWdodCA9PSBudWxsKSB7IHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmhlaWdodCA9IDEwMDsgfQoKICAgICAgICB0aGlzLm5hdGl2ZVByb3h5LkNyZWF0ZVdpbmRvd0V4QS5hc3luYyh0aGlzLm5hdGl2ZVByb3h5LlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMsIHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LmV4c3R5bGVzLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLnduZGNsYXNzLmNuYW1lLAogICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy50aXRsZSA9PSBudWxsID8gMCA6IEdNLkNyZWF0ZVZhcmlhYmxlKHRoaXMubmF0aXZlUHJveHkubXAuX29wdGlvbnMud2luZG93LnRpdGxlKSwgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cud2luc3R5bGVzLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy54LCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy55LAogICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9vcHRpb25zLndpbmRvdy53aWR0aCwgdGhpcy5uYXRpdmVQcm94eS5tcC5fb3B0aW9ucy53aW5kb3cuaGVpZ2h0LCAwLCAwLCAwLCAwKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbihoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaC5WYWwgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvLyBFcnJvciBjcmVhdGluZyBoaWRkZW4gd2luZG93CiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5lbWl0KCdlcnJvcicsICdFcnJvciBjcmVhdGluZyBoaWRkZW4gd2luZG93Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5faHduZCA9IGg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5lbWl0KCdod25kJywgaCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5tcC5fc3RhcnRQdW1wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgfSk7CiAgICB0aGlzLl9zdGFydFB1bXAgPSBmdW5jdGlvbiBfc3RhcnRQdW1wKCkKICAgIHsKICAgICAgICB0aGlzLl91c2VyMzIuR2V0TWVzc2FnZUEuYXN5bmModGhpcy5fdXNlcjMyLlJlZ2lzdGVyQ2xhc3NFeEEuYXN5bmMsIHRoaXMuX21zZywgdGhpcy5faHduZCwgMCwgMCkudGhlbihmdW5jdGlvbiAocikKICAgICAgICB7CiAgICAgICAgICAgIGlmKHIuVmFsID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5UcmFuc2xhdGVNZXNzYWdlLmFzeW5jKHRoaXMubmF0aXZlUHJveHkuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYywgdGhpcy5uYXRpdmVQcm94eS5tcC5fbXNnKS50aGVuKGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVQcm94eS5EaXNwYXRjaE1lc3NhZ2VBLmFzeW5jKHRoaXMubmF0aXZlUHJveHkuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYywgdGhpcy5uYXRpdmVQcm94eS5tcC5fbXNnKS50aGVuKGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9zdGFydFB1bXAoKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFdlIGdvdCBhICdRVUlUJyBtZXNzYWdlCiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZVByb3h5LkRlc3Ryb3lXaW5kb3cuYXN5bmModGhpcy5uYXRpdmVQcm94eS5SZWdpc3RlckNsYXNzRXhBLmFzeW5jLCB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9od25kKS50aGVuKGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkuUmVnaXN0ZXJDbGFzc0V4QS5hc3luYy5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm5hdGl2ZVByb3h5Lm1wLl9od25kOwogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAuZW1pdCgnZXhpdCcsIDApOw0KDQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAud25kY2xhc3Mud25kcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ0dsb2JhbENhbGxiYWNrJyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlUHJveHkubXAud25kY2xhc3Mud25kcHJvYyA9IG51bGw7DQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7IHRoaXMubmF0aXZlUHJveHkubXAuc3RvcCgpOyB9KTsKICAgIH0KCiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkKICAgIHsKICAgICAgICBpZiAodGhpcy5faHduZCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX3VzZXIzMi5Qb3N0TWVzc2FnZUEodGhpcy5faHduZCwgV01fUVVJVCwgMCwgMCk7CiAgICAgICAgICAgIHRoaXMub25jZSgnZXhpdCcsIGZ1bmN0aW9uICgpIHsgdGhpcy53bmRjbGFzcy53bmRwcm9jLmNsb3NlKCkgfSk7CiAgICAgICAgfQogICAgfTsKICAgIHRoaXMuY2xvc2UgPSBmdW5jdGlvbiBjbG9zZSgpCiAgICB7CiAgICAgICAgaWYgKHRoaXMuX2h3bmQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl91c2VyMzIuUG9zdE1lc3NhZ2VBKHRoaXMuX2h3bmQsIFdNX0NMT1NFLCAwLCAwKTsKICAgICAgICAgICAgdGhpcy5vbmNlKCdleGl0JywgZnVuY3Rpb24gKCkgeyB0aGlzLnduZGNsYXNzLnduZHByb2MuY2xvc2UoKTsgfSk7CiAgICAgICAgfQogICAgfTsKICAgIHRoaXMub25jZSgnficsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIHRoaXMuc3RvcCgpOw0KICAgIH0pOwp9Cgptb2R1bGUuZXhwb3J0cyA9IFdpbmRvd3NNZXNzYWdlUHVtcDsKbW9kdWxlLmV4cG9ydHMuV2luZG93U3R5bGVzID0KICAgIHsNCiAgICAgICAgV1NfQk9SREVSOiAweDAwODAwMDAwLCBXU19DQVBUSU9OOiAweDAwQzAwMDAwLCBXU19DSElMRDogMHg0MDAwMDAwMCwgV1NfQ0hJTERXSU5ET1c6IDB4NDAwMDAwMDAsIFdTX0NMSVBDSElMRFJFTjogMHgwMjAwMDAwMCwKICAgICAgICBXU19DTElQU0lCTElOR1M6IDB4MDQwMDAwMDAsIFdTX0RJU0FCTEVEOiAweDA4MDAwMDAwLCBXU19ETEdGUkFNRTogMHgwMDQwMDAwMCwgV1NfR1JPVVA6IDB4MDAwMjAwMDAsIFdTX0hTQ1JPTEw6IDB4MDAxMDAwMDAsCiAgICAgICAgV1NfSUNPTklDOiAweDIwMDAwMDAwLCBXU19NQVhJTUlaRTogMHgwMTAwMDAwMCwgV1NfTUFYSU1JWkVCT1g6IDB4MDAwMTAwMDAsIFdTX01JTklNSVpFOiAweDIwMDAwMDAwLCBXU19NSU5JTUlaRUJPWDogMHgwMDAyMDAwMCwKICAgICAgICBXU19PVkVSTEFQUEVEOiAweDAwMDAwMDAwLCBXU19QT1BVUDogMHg4MDAwMDAwMCwgV1NfU0laRUJPWDogMHgwMDA0MDAwMCwgV1NfU1lTTUVOVTogMHgwMDA4MDAwMCwgV1NfVEFCU1RPUDogMHgwMDAxMDAwMCwKICAgICAgICBXU19USElDS0ZSQU1FOiAweDAwMDQwMDAwLCBXU19USUxFRDogMHgwMDAwMDAwMCwgV1NfVklTSUJMRTogMHgxMDAwMDAwMCwgV1NfVlNDUk9MTDogMHgwMDIwMDAwMA0KICAgIH07Cm1vZHVsZS5leHBvcnRzLldpbmRvd1N0eWxlc0V4ID0KICAgIHsNCiAgICAgICAgV1NfRVhfQUNDRVBURklMRVM6IDB4MDAwMDAwMTAsIFdTX0VYX0FQUFdJTkRPVzogMHgwMDA0MDAwMCwgV1NfRVhfQ0xJRU5URURHRTogMHgwMDAwMDIwMCwgV1NfRVhfQ09NUE9TSVRFRDogMHgwMjAwMDAwMCwNCiAgICAgICAgV1NfRVhfQ09OVEVYVEhFTFA6IDB4MDAwMDA0MDAsIFdTX0VYX0NPTlRST0xQQVJFTlQ6IDB4MDAwMTAwMDAsIFdTX0VYX0RMR01PREFMRlJBTUU6IDB4MDAwMDAwMDEsIFdTX0VYX0xBWUVSRUQ6IDB4MDAwODAwMCwNCiAgICAgICAgV1NfRVhfTEFZT1VUUlRMOiAweDAwNDAwMDAwLCBXU19FWF9MRUZUOiAweDAwMDAwMDAwLCBXU19FWF9MRUZUU0NST0xMQkFSOiAweDAwMDA0MDAwLCBXU19FWF9MVFJSRUFESU5HOiAweDAwMDAwMDAwLA0KICAgICAgICBXU19FWF9NRElDSElMRDogMHgwMDAwMDA0MCwgV1NfRVhfTk9BQ1RJVkFURTogMHgwODAwMDAwMCwgV1NfRVhfTk9JTkhFUklUTEFZT1VUOiAweDAwMTAwMDAwLCBXU19FWF9OT1BBUkVOVE5PVElGWTogMHgwMDAwMDAwNCwNCiAgICAgICAgV1NfRVhfTk9SRURJUkVDVElPTkJJVE1BUDogMHgwMDIwMDAwMCwgV1NfRVhfUklHSFQ6IDB4MDAwMDEwMDAsIFdTX0VYX1JJR0hUU0NST0xMQkFSOiAweDAwMDAwMDAwLCBXU19FWF9SVExSRUFESU5HOiAweDAwMDAyMDAwLA0KICAgICAgICBXU19FWF9TVEFUSUNFREdFOiAweDAwMDIwMDAwLCBXU19FWF9UT09MV0lORE9XOiAweDAwMDAwMDgwLCBXU19FWF9UT1BNT1NUOiAweDAwMDAwMDA4LCBXU19FWF9UUkFOU1BBUkVOVDogMHgwMDAwMDAyMCwgV1NfRVhfV0lORE9XRURHRTogMHgwMDAwMDEwMA0KICAgIH07Cv==', 'base64').toString());");
|
|
duk_peval_string_noresult(ctx, "addModule('win-console', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBUcmF5SWNvbkZsYWdzID0KICAgIHsKICAgICAgICBOSUZfTUVTU0FHRTogMHgwMDAwMDAwMSwKICAgICAgICBOSUZfSUNPTjogMHgwMDAwMDAwMiwKICAgICAgICBOSUZfVElQOiAweDAwMDAwMDA0LAogICAgICAgIE5JRl9TVEFURTogMHgwMDAwMDAwOCwKICAgICAgICBOSUZfSU5GTzogMHgwMDAwMDAxMCwKICAgICAgICBOSUZfR1VJRDogMHgwMDAwMDAyMCwKICAgICAgICBOSUZfUkVBTFRJTUU6IDB4MDAwMDAwNDAsCiAgICAgICAgTklGX1NIT1dUSVA6IDB4MDAwMDAwODAsCgogICAgICAgIE5JTV9BREQ6IDB4MDAwMDAwMDAsCiAgICAgICAgTklNX01PRElGWTogMHgwMDAwMDAwMSwKICAgICAgICBOSU1fREVMRVRFOiAweDAwMDAwMDAyLAogICAgICAgIE5JTV9TRVRGT0NVUzogMHgwMDAwMDAwMywKICAgICAgICBOSU1fU0VUVkVSU0lPTjogMHgwMDAwMDAwNAogICAgfTsKdmFyIE5PVElGWUlDT05fVkVSU0lPTl80ID0gNDsKdmFyIE1lc3NhZ2VUeXBlcyA9IHsgV01fQVBQOiAweDgwMDAsIFdNX1VTRVI6IDB4MDQwMCB9OwpmdW5jdGlvbiBXaW5kb3dzQ29uc29sZSgpCnsKICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpCiAgICB7CiAgICAgICAgdGhpcy5fT2JqZWN0SUQgPSAnd2luLWNvbnNvbGUnOwogICAgICAgIHRoaXMuX01hcnNoYWwgPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMiA9IHRoaXMuX01hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoImtlcm5lbDMyLmRsbCIpOwogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX01hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoInVzZXIzMi5kbGwiKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoIkdldENvbnNvbGVXaW5kb3ciKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldEN1cnJlbnRUaHJlYWQnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKCJTaG93V2luZG93Iik7CiAgICAgICAgdGhpcy5fdXNlcjMyLkNyZWF0ZU1ldGhvZCgiTG9hZEltYWdlQSIpOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoeyBtZXRob2Q6ICdHZXRNZXNzYWdlQScsIHRocmVhZERpc3BhdGNoOiAxIH0pOwogICAgICAgIHRoaXMuX3NoZWxsMzIgPSB0aGlzLl9NYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdTaGVsbDMyLmRsbCcpOwogICAgICAgIHRoaXMuX3NoZWxsMzIuQ3JlYXRlTWV0aG9kKCdTaGVsbF9Ob3RpZnlJY29uQScpOwoKICAgICAgICB0aGlzLl9oYW5kbGUgPSB0aGlzLl9rZXJuZWwzMi5HZXRDb25zb2xlV2luZG93KCk7CiAgICAgICAgdGhpcy5taW5pbWl6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA2KTsKICAgICAgICB9OwogICAgICAgIHRoaXMucmVzdG9yZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA5KTsKICAgICAgICB9OwogICAgICAgIHRoaXMuaGlkZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCAwKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuc2hvdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXNlcjMyLlNob3dXaW5kb3codGhpcy5faGFuZGxlLCA1KTsKICAgICAgICB9OwoKCiAgICAgICAgdGhpcy5fbG9hZGljb24gPSBmdW5jdGlvbiAoaW1hZ2VQYXRoKSB7CiAgICAgICAgICAgIHZhciBoID0gdGhpcy5fdXNlcjMyLkxvYWRJbWFnZUEoMCwgdGhpcy5fTWFyc2hhbC5DcmVhdGVWYXJpYWJsZShpbWFnZVBhdGgpLCAxLCAwLCAwLCAweDAwMDAwMDEwIHwgMHgwMDAwODAwMCB8IDB4MDAwMDAwNDApOyAvLyBMUl9MT0FERlJPTUZJTEUgfCBMUl9TSEFSRUQgfCBMUl9ERUZBVUxUU0laRQogICAgICAgICAgICByZXR1cm4gKGgpOwogICAgICAgIH07CgogICAgICAgIHRoaXMuU2V0VHJheUljb24gPSBmdW5jdGlvbiBTZXRUcmF5SWNvbihvcHRpb25zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9NYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDUwOCA6IDUyOCk7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3N0cnVjdCBzaXplID0gJyArIGRhdGEuX3NpemUpOwogICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdUcnlJY29uLCBXTV9NRVNTQUdFIGZpbHRlciA9ICcgKyBvcHRpb25zLmZpbHRlcik7CiAgICAgICAgICAgIGRhdGEudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGRhdGEuX3NpemUsIDApOwoKICAgICAgICAgICAgdmFyIHRyYXlUeXBlID0gVHJheUljb25GbGFncy5OSUZfVElQIHwgVHJheUljb25GbGFncy5OSUZfTUVTU0FHRQogICAgICAgICAgICBvcHRpb25zLmZpbHRlciA9IE1lc3NhZ2VUeXBlcy5XTV9BUFAgKyAxOwogICAgICAgICAgICBkYXRhLkRlcmVmKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDE2IDogMjQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShvcHRpb25zLmZpbHRlcik7CgogICAgICAgICAgICBpZiAoIW9wdGlvbnMubm9CYWxsb29uKSB7IHRyYXlUeXBlIHw9IFRyYXlJY29uRmxhZ3MuTklGX0lORk87IH0KCiAgICAgICAgICAgIGlmIChvcHRpb25zLmljb24pCiAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0cmF5VHlwZSB8PSBUcmF5SWNvbkZsYWdzLk5JRl9JQ09OOwogICAgICAgICAgICAgICAgdmFyIGhJY29uID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAyMCA6IDMyLCB0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgIG9wdGlvbnMuaWNvbi5wb2ludGVyQnVmZmVyKCkuY29weShoSWNvbi50b0J1ZmZlcigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplICogMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOwogICAgICAgICAgICBkYXRhLkRlcmVmKHRoaXMuX01hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh0cmF5VHlwZSk7CiAgICAgICAgICAgIGRhdGEuRGVyZWYodGhpcy5fTWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNDE2IDogNDMyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoTk9USUZZSUNPTl9WRVJTSU9OXzQpOwoKICAgICAgICAgICAgdmFyIHN6VGlwID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAyNCA6IDQwLCAxMjgpOwogICAgICAgICAgICB2YXIgc3pJbmZvID0gZGF0YS5EZXJlZih0aGlzLl9NYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxNjAgOiAxNzYsIDI1Nik7CiAgICAgICAgICAgIHZhciBzekluZm9UaXRsZSA9IGRhdGEuRGVyZWYodGhpcy5fTWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNDIwIDogNDM2LCA2NCk7CgogICAgICAgICAgICBpZiAob3B0aW9ucy5zelRpcCkgeyBCdWZmZXIuZnJvbShvcHRpb25zLnN6VGlwKS5jb3B5KHN6VGlwLnRvQnVmZmVyKCkpOyB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLnN6SW5mbykgeyBCdWZmZXIuZnJvbShvcHRpb25zLnN6SW5mbykuY29weShzekluZm8udG9CdWZmZXIoKSk7IH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3pJbmZvVGl0bGUpIHsgQnVmZmVyLmZyb20ob3B0aW9ucy5zekluZm9UaXRsZSkuY29weShzekluZm9UaXRsZS50b0J1ZmZlcigpKTsgfQoKCiAgICAgICAgICAgIHZhciBNZXNzYWdlUHVtcCA9IHJlcXVpcmUoJ3dpbi1tZXNzYWdlLXB1bXAnKTsKICAgICAgICAgICAgcmV0VmFsID0geyBfT2JqZWN0SUQ6ICdXaW5kb3dzQ29uc29sZS5UcmF5SWNvbicsIE1lc3NhZ2VQdW1wOiBuZXcgTWVzc2FnZVB1bXAob3B0aW9ucykgfTsKICAgICAgICAgICAgdmFyIHJldFZhbEV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpLmluaGVyaXRzKHJldFZhbCk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnVG9hc3RDbGlja2VkJyk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnSWNvbkhvdmVyJyk7CiAgICAgICAgICAgIHJldFZhbEV2ZW50cy5jcmVhdGVFdmVudCgnVG9hc3REaXNtaXNzZWQnKTsKICAgICAgICAgICAgcmV0VmFsLk9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICByZXRWYWwuTWVzc2FnZVB1bXAuVHJheUljb24gPSByZXRWYWw7CiAgICAgICAgICAgIHJldFZhbC5NZXNzYWdlUHVtcC5Ob3RpZnlEYXRhID0gZGF0YTsKICAgICAgICAgICAgcmV0VmFsLk1lc3NhZ2VQdW1wLldpbmRvd3NDb25zb2xlID0gdGhpczsKICAgICAgICAgICAgcmV0VmFsLk1lc3NhZ2VQdW1wLm9uKCdleGl0JywgZnVuY3Rpb24gb25FeGl0KGNvZGUpIHsgY29uc29sZS5sb2coJ1B1bXAgRXhpdGVkJyk7IGlmICh0aGlzLlRyYXlJY29uKSB7IHRoaXMuVHJheUljb24ucmVtb3ZlKCk7IH0gfSk7CiAgICAgICAgICAgIHJldFZhbC5NZXNzYWdlUHVtcC5vbignaHduZCcsIGZ1bmN0aW9uIG9uSHduZChoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdHb3QgSFdORCcpOwogICAgICAgICAgICAgICAgb3B0aW9ucy5od25kID0gaDsKICAgICAgICAgICAgICAgIGgucG9pbnRlckJ1ZmZlcigpLmNvcHkodGhpcy5Ob3RpZnlEYXRhLkRlcmVmKHRoaXMuV2luZG93c0NvbnNvbGUuX01hcnNoYWwuUG9pbnRlclNpemUsIHRoaXMuV2luZG93c0NvbnNvbGUuX01hcnNoYWwuUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOwoKICAgICAgICAgICAgICAgIGlmKHRoaXMuV2luZG93c0NvbnNvbGUuX3NoZWxsMzIuU2hlbGxfTm90aWZ5SWNvbkEoVHJheUljb25GbGFncy5OSU1fQURELCB0aGlzLk5vdGlmeURhdGEpLlZhbCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXRWYWwuTWVzc2FnZVB1bXAub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBvbldpbmRvd3NNZXNzYWdlKG1zZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobXNnLm1lc3NhZ2UgPT0gdGhpcy5UcmF5SWNvbi5PcHRpb25zLmZpbHRlcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChtc2cud3BhcmFtID09IDEgJiYgbXNnLmxwYXJhbSA9PSAxMDI5KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UcmF5SWNvbi5lbWl0KCdUb2FzdENsaWNrZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChtc2cud3BhcmFtID09IDEgJiYgbXNnLmxwYXJhbSA9PSA1MTIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRyYXlJY29uLmVtaXQoJ0ljb25Ib3ZlcicpOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVHJheUljb24uT3B0aW9ucy5iYWxsb29uT25seSAmJiBtc2cud3BhcmFtID09IDEgJiYgKG1zZy5scGFyYW0gPT0gMTAyOCB8fCBtc2cubHBhcmFtID09IDEwMjkpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UcmF5SWNvbi5lbWl0KCdUb2FzdERpc21pc3NlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRyYXlJY29uLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXRWYWwucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5NZXNzYWdlUHVtcC5XaW5kb3dzQ29uc29sZS5fc2hlbGwzMi5TaGVsbF9Ob3RpZnlJY29uQShUcmF5SWNvbkZsYWdzLk5JTV9ERUxFVEUsIHRoaXMuTWVzc2FnZVB1bXAuTm90aWZ5RGF0YSk7CiAgICAgICAgICAgICAgICB0aGlzLk1lc3NhZ2VQdW1wLnN0b3AoKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLk1lc3NhZ2VQdW1wLlRyYXlJY29uOwogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuTWVzc2FnZVB1bXA7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgCiAgICAgICAgfTsKICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgV2luZG93c0NvbnNvbGUoKTs=', 'base64').toString());");
|
|
|
|
// Windows Cert Store, refer to modules/win-certstore.js
|
|
duk_peval_string_noresult(ctx, "addModule('win-certstore', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KY29uc3QgQ0VSVF9GSU5EX1NVQkpFQ1RfTkFNRSA9ICgyIDw8IDE2IHwgNyk7CmNvbnN0IENFUlRfU1RPUkVfT1BFTl9FWElTVElOR19GTEFHID0gMHgwMDAwNDAwMDsKY29uc3QgQ0VSVF9TVE9SRV9QUk9WX1NZU1RFTSA9IDEwOwpjb25zdCBDRVJUX1g1MDBfTkFNRV9TVFIgPSAzOwpjb25zdCBQS0NTXzdfQVNOX0VOQ09ESU5HID0gMHgwMDAxMDAwMDsKY29uc3QgWDUwOV9BU05fRU5DT0RJTkcgPSAweDAwMDAwMDAxOwpjb25zdCBDRVJUX0NMT1NFX1NUT1JFX0ZPUkNFX0ZMQUcgPSAweDAwMDAwMDAxOwpjb25zdCBDRVJUX0NMT1NFX1NUT1JFX0NIRUNLX0ZMQUcgPSAweDAwMDAwMDAyOwoKZnVuY3Rpb24gY2VydHN0b3JlKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnd2luLWNlcnRzdG9yZSc7CiAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICB0aGlzLl9DcnlwdDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQ3J5cHQzMi5kbGwnKTsKICAgIHRoaXMuX0NyeXB0MzIuQ3JlYXRlTWV0aG9kKCdDZXJ0Q2xvc2VTdG9yZScpOwogICAgdGhpcy5fQ3J5cHQzMi5DcmVhdGVNZXRob2QoJ0NlcnREZWxldGVDZXJ0aWZpY2F0ZUZyb21TdG9yZScpOwogICAgdGhpcy5fQ3J5cHQzMi5DcmVhdGVNZXRob2QoJ0NlcnRGaW5kQ2VydGlmaWNhdGVJblN0b3JlJyk7CiAgICB0aGlzLl9DcnlwdDMyLkNyZWF0ZU1ldGhvZCgnQ2VydE9wZW5TdG9yZScpOwogICAgdGhpcy5fQ3J5cHQzMi5DcmVhdGVNZXRob2QoJ0NlcnRTdHJUb05hbWVBJyk7CgogICAgdGhpcy5fTmNycHl0ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnTmNyeXB0LmRsbCcpOwogICAgdGhpcy5fTmNycHl0LkNyZWF0ZU1ldGhvZCgnTkNyeXB0RnJlZU9iamVjdCcpOwogICAgdGhpcy5fTmNycHl0LkNyZWF0ZU1ldGhvZCgnTkNyeXB0T3BlblN0b3JhZ2VQcm92aWRlcicpOwogICAgdGhpcy5TVE9SRV9MT0NBVElPTiA9IHsgTE9DQUxfTUFDSElORTogMiA8PCAxNiwgQ1VSUkVOVF9VU0VSOiAxIDw8IDE2IH07CiAgICB0aGlzLlBST1ZJREVSUyA9IFt0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKCdNaWNyb3NvZnQgUGxhdGZvcm0gQ3J5cHRvIFByb3ZpZGVyJywgeyB3aWRlOiB0cnVlIH0pLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKCdNaWNyb3NvZnQgU29mdHdhcmUgS2V5IFN0b3JhZ2UgUHJvdmlkZXInLCB7IHdpZGU6IHRydWUgfSldOwoKICAgIHRoaXMuT3BlbkNyeXB0b1Byb3ZpZGVyID0gZnVuY3Rpb24gT3BlbkNyeXB0b1Byb3ZpZGVyKCkKICAgIHsKICAgICAgICB2YXIgcmV0ID0gbnVsbDsKICAgICAgICB2YXIgcCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgIGZvcih2YXIgcHJvdmlkZXIgaW4gdGhpcy5QUk9WSURFUlMpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9OY3JweXQuTkNyeXB0T3BlblN0b3JhZ2VQcm92aWRlcihwLCB0aGlzLlBST1ZJREVSU1twcm92aWRlcl0sIDApOwogICAgICAgICAgICBpZiAocC5EZXJlZigpLlZhbCAhPSAwKSB7IHJldCA9IHAuRGVyZWYoKTsgcmV0Ll9iID0gcDsgYnJlYWs7fQogICAgICAgIH0KICAgICAgICBpZiAocmV0ID09IG51bGwpIHsgdGhyb3cgKCdVbmFibGUgdG8gb3BlbiBDcnlwdG9Qcm92aWRlcicpOyB9CiAgICAgICAgcmV0Ll9jcnlwdCA9IHRoaXM7CiAgICAgICAgcmV0Ll9maW5hbGl6ZWQgPSBmYWxzZTsKICAgICAgICByZXQuY2xvc2UgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9maW5hbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9jcnlwdC5fTmNycHl0Lk5DcnlwdEZyZWVPYmplY3QodGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldC5wcmVwZW5kT25jZUxpc3RlbmVyKCd+JywgZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCF0aGlzLl9maW5hbGl6ZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLk9wZW5TdG9yZSA9IGZ1bmN0aW9uIE9wZW5TdG9yZShwcm92aWRlciwgbG9jYXRpb24pCiAgICB7CiAgICAgICAgdmFyIGhzdG9yZSA9IHRoaXMuX0NyeXB0MzIuQ2VydE9wZW5TdG9yZShDRVJUX1NUT1JFX1BST1ZfU1lTVEVNLCBYNTA5X0FTTl9FTkNPRElORyB8IFBLQ1NfN19BU05fRU5DT0RJTkcsIHByb3ZpZGVyLCBsb2NhdGlvbiB8IENFUlRfU1RPUkVfT1BFTl9FWElTVElOR19GTEFHLCB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKCdNWScsIHt3aWRlOiB0cnVlfSkpOwogICAgICAgIGlmIChoc3RvcmUuVmFsID09IDApIHsgdGhyb3cgKCdFcnJvciBvcGVuaW5nIENlcnRTdG9yZScpOyB9CiAgICAgICAgaHN0b3JlLl9jcnlwdCA9IHRoaXM7CiAgICAgICAgaHN0b3JlLl9maW5hbGl6ZWQgPSBmYWxzZTsKICAgICAgICBoc3RvcmUuY2xvc2UgPSBmdW5jdGlvbiBjbG9zZSgpIHsgdGhpcy5fZmluYWxpemVkID0gdHJ1ZTsgdGhpcy5fY3J5cHQuX0NyeXB0MzIuQ2VydENsb3NlU3RvcmUodGhpcywgQ0VSVF9DTE9TRV9TVE9SRV9DSEVDS19GTEFHKTsgfTsKICAgICAgICBoc3RvcmUucHJlcGVuZE9uY2VMaXN0ZW5lcignficsIGZ1bmN0aW9uICgpIHsgaWYgKCF0aGlzLl9maW5hbGl6ZWQpIHsgdGhpcy5jbG9zZSgpOyB9IH0pOwogICAgICAgIHJldHVybiAoaHN0b3JlKTsKICAgIH07CiAgICB0aGlzLkdldENlcnRpZmljYXRlID0gZnVuY3Rpb24gR2V0Q2VydGlmaWNhdGUoQ04sIGxvY2F0aW9uKQogICAgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShDTik7CiAgICAgICAgdmFyIGVuY29kZWRTaXplID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSg0KTsgLy8gRFdPUkQKICAgICAgICBpZih0aGlzLl9DcnlwdDMyLkNlcnRTdHJUb05hbWVBKFg1MDlfQVNOX0VOQ09ESU5HLCBzdWJqZWN0LCBDRVJUX1g1MDBfTkFNRV9TVFIsIDAsIDAsIGVuY29kZWRTaXplLCAwKS5WYWwgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93KCdFcnJvciBjYWxjdWxhdGluZyBDRVJUX1g1MDBfTkFNRV9TVFIgZm9yICgnICsgQ04gKyAnKScpOwogICAgICAgIH0KICAgICAgICB2YXIgc3ViamVjdEVuY29kZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKGVuY29kZWRTaXplLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgIGlmKHRoaXMuX0NyeXB0MzIuQ2VydFN0clRvTmFtZUEoWDUwOV9BU05fRU5DT0RJTkcsIHN1YmplY3QsIENFUlRfWDUwMF9OQU1FX1NUUiwgMCwgc3ViamVjdEVuY29kZWQsIGVuY29kZWRTaXplLCAwKS5WYWwgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93KCdFcnJvciBlbmNvZGluZyBDRVJUX1g1MDBfTkFNRV9TVFIgZm9yICgnICsgQ04gKyAnKScpOwogICAgICAgIH0KICAgICAgICB2YXIgcHJvdmlkZXIgPSB0aGlzLk9wZW5DcnlwdG9Qcm92aWRlcigpOwogICAgICAgIHZhciBzdG9yZSA9IHRoaXMuT3BlblN0b3JlKHByb3ZpZGVyLCBsb2NhdGlvbik7CiAgICAgICAgdmFyIHNlYXJjaCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUodGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSAqIDIpOwogICAgICAgIHNlYXJjaC5EZXJlZigwLDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShlbmNvZGVkU2l6ZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsKICAgICAgICBzdWJqZWN0RW5jb2RlZC5wb2ludGVyQnVmZmVyKCkuY29weShzZWFyY2gudG9CdWZmZXIoKSwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSk7CgogICAgICAgIC8vIExvb2sgZm9yIGNlcnQKICAgICAgICB2YXIgY2VydGN0eCA9IHRoaXMuX0NyeXB0MzIuQ2VydEZpbmRDZXJ0aWZpY2F0ZUluU3RvcmUoc3RvcmUsIFg1MDlfQVNOX0VOQ09ESU5HIHwgUEtDU183X0FTTl9FTkNPRElORywgMCwgQ0VSVF9GSU5EX1NVQkpFQ1RfTkFNRSwgc2VhcmNoLCAwKTsKICAgICAgICBpZihjZXJ0Y3R4LlZhbCAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgLy8gRm91bmQgQ2VydGlmaWNhdGUKICAgICAgICAgICAgdmFyIGNlciA9IGNlcnRjdHguRGVyZWYodGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSkuRGVyZWYoY2VydGN0eC5EZXJlZih0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplICogMiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkudG9CdWZmZXIoKTsKICAgICAgICAgICAgdmFyIGZvdW5kY2VydCA9IHJlcXVpcmUoJ3RscycpLmxvYWRDZXJ0aWZpY2F0ZSh7IGNlcjogY2VyIH0pOwogICAgICAgICAgICByZXR1cm4gKGZvdW5kY2VydCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHRocm93ICgnTm90IEZvdW5kJyk7CiAgICAgICAgfQoKICAgIH07Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IGNlcnRzdG9yZSgpOwoK', 'base64').toString());");
|
|
|
|
// win-bcd is used to configure booting in Safe-Mode. refer to modules/win-bcd.js
|
|
duk_peval_string_noresult(ctx, "addModule('win-bcd', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQpmdW5jdGlvbiBnZXRLZXlzKCkNCnsNCiAgICB2YXIgcmV0ID0ge307DQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgIlxcU3lzdGVtMzJcXGJjZGVkaXQuZXhlIiwgWydiY2RlZGl0JywgJy9lbnVtJywgJ3tjdXJyZW50fSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJ1xyXG4nKTsNCiAgICBsaW5lcy5zaGlmdCgpOyBsaW5lcy5zaGlmdCgpOw0KDQogICAgZm9yICh2YXIgaSBpbiBsaW5lcykNCiAgICB7DQogICAgICAgIHZhciB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOw0KICAgICAgICB2YXIga2V5ID0gdG9rZW5zLnNoaWZ0KCk7DQogICAgICAgIHZhciB2YWx1ZSA9IHRva2Vucy5qb2luKCcgJykudHJpbSgpOw0KICAgICAgICByZXRba2V5XSA9IHZhbHVlOw0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBnZXRLZXkoa2V5KQ0Kew0KICAgIHJldHVybiAodGhpcy5nZXRLZXlzKClba2V5XSk7DQp9DQpmdW5jdGlvbiBzZXRLZXkoa2V5LCB2YWx1ZSkNCnsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgIlxcU3lzdGVtMzJcXGJjZGVkaXQuZXhlIiwgWydiY2RlZGl0JywgJy9zZXQnLCAne2N1cnJlbnR9Jywga2V5LCB2YWx1ZV0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQpmdW5jdGlvbiBkZWxldGVLZXkoa2V5KQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAiXFxTeXN0ZW0zMlxcYmNkZWRpdC5leGUiLCBbJ2JjZGVkaXQnLCAnL2RlbGV0ZXZhbHVlJywgJ3tjdXJyZW50fScsIGtleV0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQp9DQoNCmZ1bmN0aW9uIGVuYWJsZVNhZmVNb2RlU2VydmljZShzZXJ2aWNlTmFtZSkNCnsNCiAgICByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5Xcml0ZUtleShyZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFNhZmVib290XFxOZXR3b3JrXFwnICsgc2VydmljZU5hbWUsIG51bGwsICdTZXJ2aWNlJyk7DQp9DQpmdW5jdGlvbiBpc1NhZmVNb2RlU2VydmljZShzZXJ2aWNlTmFtZSkNCnsNCiAgICB2YXIgcmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7DQogICAgdmFyIGtleSA9IHsgZGVmYXVsdDogJ25vbmUnIH07DQogICAgdHJ5IHsga2V5ID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFNhZmVib290XFxOZXR3b3JrXFwnICsgc2VydmljZU5hbWUpOyB9IGNhdGNoIChxa2UpIHsgfQ0KICAgIHJldHVybiAoa2V5LmRlZmF1bHQgPT0gJ1NlcnZpY2UnKTsNCn0NCmZ1bmN0aW9uIGRpc2FibGVTYWZlTW9kZVNlcnZpY2Uoc2VydmljZU5hbWUpDQp7DQogICAgdHJ5DQogICAgew0KICAgICAgICByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5EZWxldGVLZXkocmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxTYWZlYm9vdFxcTmV0d29ya1xcJyArIHNlcnZpY2VOYW1lKTsNCiAgICB9DQogICAgY2F0Y2goeCkNCiAgICB7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiByZXN0YXJ0KGRlbGF5KQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAiXFxTeXN0ZW0zMlxcc2h1dGRvd24uZXhlIiwgWydzaHV0ZG93bicsICcvcicsICcvdCcsIGRlbGF5IT1udWxsP2RlbGF5LnRvU3RyaW5nKCk6JzAnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7fSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCn0NCg0KaWYgKHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLlBvaW50ZXJTaXplID09IDQgJiYgcmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQ0KICAgIHsNCiAgICAgICAgZW5hYmxlU2FmZU1vZGVTZXJ2aWNlOiBlbmFibGVTYWZlTW9kZVNlcnZpY2UsDQogICAgICAgIGRpc2FibGVTYWZlTW9kZVNlcnZpY2U6IGRpc2FibGVTYWZlTW9kZVNlcnZpY2UsIHJlc3RhcnQ6IHJlc3RhcnQsIGlzU2FmZU1vZGVTZXJ2aWNlOiBpc1NhZmVNb2RlU2VydmljZQ0KICAgIH07DQp9DQplbHNlDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQ0KICAgICAgICB7DQogICAgICAgICAgICBnZXRLZXlzOiBnZXRLZXlzLCBzZXRLZXk6IHNldEtleSwgZGVsZXRlS2V5OiBkZWxldGVLZXksIGVuYWJsZVNhZmVNb2RlU2VydmljZTogZW5hYmxlU2FmZU1vZGVTZXJ2aWNlLA0KICAgICAgICAgICAgZGlzYWJsZVNhZmVNb2RlU2VydmljZTogZGlzYWJsZVNhZmVNb2RlU2VydmljZSwgZ2V0S2V5OiBnZXRLZXksIHJlc3RhcnQ6IHJlc3RhcnQsIGlzU2FmZU1vZGVTZXJ2aWNlOiBpc1NhZmVNb2RlU2VydmljZQ0KICAgICAgICB9Ow0KDQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAiYm9vdE1vZGUiLA0KICAgICAgICB7DQogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLlF1ZXJ5S2V5KHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcU2FmZWJvb3RcXE9wdGlvbicsICdPcHRpb25WYWx1ZScpOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHYpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdTQUZFX01PREVfTkVUV09SSycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdTQUZFX01PREUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaCAoeCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoJ05PUk1BTCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQp9', 'base64').toString());");
|
|
|
|
// win-dispatcher a helper to run JavaScript as a particular user. Refer to modules/win-dispatcher.js
|
|
duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgpmdW5jdGlvbiBkaXNwYXRjaChvcHRpb25zKQp7CiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubW9kdWxlcyB8fCAhb3B0aW9ucy5sYXVuY2ggfHwgIW9wdGlvbnMubGF1bmNoLm1vZHVsZSB8fCAhb3B0aW9ucy5sYXVuY2gubWV0aG9kIHx8ICFvcHRpb25zLmxhdW5jaC5hcmdzKSB7IHRocm93ICgnSW52YWxpZCBQYXJhbWV0ZXJzJyk7IH0KCiAgICB2YXIgaXBjSW50ZWdlcgogICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKS5jcmVhdGVFdmVudCgnY29ubmVjdGlvbicpOwoKICAgIHJldC5faXBjID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjLnBhcmVudCA9IHJldDsKICAgIHJldC5faXBjMiA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYzIucGFyZW50ID0gcmV0OwogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsKICAgIHJldC5faXBjMi5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IH0pOwoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAgIGlwY0ludGVnZXIgPSByZXF1aXJlKCd0bHMnKS5nZW5lcmF0ZVJhbmRvbUludGVnZXIoJzEwMDAnLCAnOTk5OScpOwogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOwogICAgICAgIAogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsKICAgICAgICAgICAgcmV0Ll9pcGMyLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCArICdDJywgd3JpdGFibGVBbGw6IHRydWUgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoeCkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgIHJldC5faXBjMi5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpCiAgICB7DQogICAgICAgIHRoaXMucGFyZW50Ll9jb250cm9sID0gczsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHRoaXMucGFyZW50Lmludm9rZSA9IGZ1bmN0aW9uIChtZXRob2QsIGFyZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOwogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnaW52b2tlJywgdmFsdWU6IHsgbWV0aG9kOiBtZXRob2QsIGFyZ3M6IGFyZ3MgfSB9KSk7CiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGgpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGQpOw0KICAgICAgICB9Ow0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgIH0pOwogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQogICAgewogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOwogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7CiAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7CgogICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQogICAgICAgIHsKICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsKICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7CiAgICAgICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgICAgIHMud3JpdGUoZCk7CiAgICAgICAgfQoKICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnbGF1bmNoJywgdmFsdWU6IHsgbW9kdWxlOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tb2R1bGUsIG1ldGhvZDogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubWV0aG9kLCBhcmdzOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5hcmdzIH0gfSkpOwogICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgcy53cml0ZShkKTsKICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOwogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsKICAgIH0pOwoKICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOwogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7CiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKCiAgICBpZiAob3B0aW9ucy51c2VyKQogICAgewogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSAnICsgb3B0aW9ucy51c2VyICsgJyAvVFIgIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJyAtYjY0ZXhlYyAnICsgc3RyICsgJyJcclxuJyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkID09IDApCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSBTWVNURU0gL1RSICInICsgcHJvY2Vzcy5leGVjUGF0aCArICcgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYXMgbG9nZ2VkIGluIHVzZXINCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9UUiAiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnIC1iNjRleGVjICcgKyBzdHIgKyAnIlxyXG4nKTsNCiAgICAgICAgfQogICAgfQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9SVU4gL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvREVMRVRFIC9GIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxyXG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAKCiAgICByZXR1cm4gKHJldCk7Cn0KCmZ1bmN0aW9uIGNvbm5lY3QoaXBjKQp7CiAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGM7CiAgICBnbG9iYWwuaXBjMkNsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoICsgJ0MnIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7CiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOwogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsKICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdpbnZva2UnOgogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7CiAgICBnbG9iYWwuaXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkKICAgIHsKICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY0xlbiA9IGMucmVhZFVJbnQzMkxFKDApOwogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnVuc2hpZnQoYyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2FkZE1vZHVsZSc6CiAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKGNtZC52YWx1ZS5uYW1lLCBjbWQudmFsdWUuanMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGF1bmNoJzoKICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gcmVxdWlyZShjbWQudmFsdWUubW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ucGlwZSh0aGlzLCB7IGVuZDogZmFsc2UgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlKGdsb2JhbC5fcHJveHlTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTsKCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7IGRpc3BhdGNoOiBkaXNwYXRjaCwgY29ubmVjdDogY29ubmVjdCB9OwoK', 'base64').toString());");
|
|
#endif
|
|
|
|
#ifdef _FREEBSD
|
|
// Helper to locate installed libraries. Currently only supports FreeBSD
|
|
duk_peval_string_noresult(ctx, "addModule('lib-finder', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQpmdW5jdGlvbiBmaW5kKG5hbWUpDQp7DQoJc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQoJew0KCQljYXNlICdmcmVlYnNkJzoNCgkJCXZhciByZXQgPSBbXTsNCgkJCXZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQoJCQljaGlsZC5zdGRvdXQuc3RyID0gJyc7DQoJCQljaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KCQkJY2hpbGQuc3RkaW4ud3JpdGUoInBrZyBpbmZvICIgKyBuYW1lICsgIiB8IHRyICdcXG4nICdcXHwnIHwgYXdrICcgeyBhPXNwbGl0KCQwLCB0LCBcIlNoYXJlZCBMaWJzIHByb3ZpZGVkOlwiKTsgaWYoYT09MikgeyBzcGxpdCh0WzJdLCBsaWIsIFwiOlwiKTsgcHJpbnQgbGliWzFdOyB9IH0nIHwgdHIgJ1xcfCcgJ1xcbicgfCBhd2sgJ3sgaWYoc3BsaXQoJDEsIHJlcywgXCIuc29cIik+MSkgeyBwcmludCAkMTsgfSB9J1xuZXhpdFxuIik7DQoJCQljaGlsZC53YWl0RXhpdCgpOw0KCQkJdmFyIHJlcyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCdcbicpOw0KCQkJZm9yKHZhciBpIGluIHJlcykNCgkJCXsNCgkJCQlpZighcmVzW2ldLnN0YXJ0c1dpdGgobmFtZSArICcuc28nKSkgeyBjb250aW51ZTsgfQ0KCQkJCXZhciB2ID0ge25hbWU6IHJlc1tpXX07DQoJCQkJY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KCQkJCWNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCgkJCQljaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KCQkJCWNoaWxkLnN0ZGluLndyaXRlKCdwa2cgaW5mbyAtbCAnICsgbmFtZSArICcgfCBncmVwICcgKyB2Lm5hbWUgKyAnIHwgYXdrIFwneyBhPXNwbGl0KCQxLCB0b2ssICIvIik7IGlmKHRva1thXT09IicgKyB2Lm5hbWUgKyAnIikgeyBwcmludCAkMTsgfSB9XCdcbmV4aXRcbicpOw0KCQkJCWNoaWxkLndhaXRFeGl0KCk7DQoJCQkJdi5sb2NhdGlvbiA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KCQkJCXJldC5wdXNoKHYpOw0KCQkJfQ0KCQkJcmV0dXJuKHJldCk7DQoJCWJyZWFrOw0KCX0NCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSBmaW5kOw0K', 'base64').toString());");
|
|
#endif
|
|
|
|
// monitor-info: Refer to modules/monitor-info.js
|
|
char *_monitorinfo = ILibMemory_Allocate(54866, 0, NULL, NULL);
|
|
memcpy_s(_monitorinfo + 0, 31352, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgUFBvc2l0aW9uID0gNDsKdmFyIFBTaXplID0gODsKdmFyIFBNaW5TaXplID0gMSA8PCA0Owp2YXIgUE1heFNpemUgPSAxIDw8IDU7CnZhciBfTkVUX1dNX1NUQVRFX1JFTU9WRSA9IDA7ICAgIC8vIHJlbW92ZS91bnNldCBwcm9wZXJ0eQp2YXIgX05FVF9XTV9TVEFURV9BREQgPSAxOyAgICAvLyBhZGQvc2V0IHByb3BlcnR5CnZhciBfTkVUX1dNX1NUQVRFX1RPR0dMRSA9IDI7ICAgIC8vIHRvZ2dsZSBwcm9wZXJ0eQp2YXIgU3Vic3RydWN0dXJlUmVkaXJlY3RNYXNrID0gKDEgPDwgMjApOwp2YXIgU3Vic3RydWN0dXJlTm90aWZ5TWFzayA9ICgxIDw8IDE5KTsKdmFyIFByb3BNb2RlUmVwbGFjZSA9IDA7CnZhciBYQV9BVE9NID0gNDsKdmFyIE1XTV9ISU5UU19GVU5DVElPTlMgPSAoMSA8PCAwKTsKdmFyIE1XTV9ISU5UU19ERUNPUkFUSU9OUyA9ICgxIDw8IDEpOwp2YXIgQ2xpZW50TWVzc2FnZSA9IDMzOwoKZnVuY3Rpb24gZ2V0TGliSW5mbyhsaWJuYW1lKQp7CiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnbGludXgnKSB7IHRocm93ICgnT25seSBzdXBwb3J0ZWQgb24gbGludXgnKTsgfQoKICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBsZGNvbmZpZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgIHZhciBsZGNvbmZpZyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKGxkY29uZmlnICsgIiAtcCB8IGdyZXAgJyIgKyBsaWJuYW1lICsgIi5zby4nIHwgdHIgJ1xcbicgJ14nIHwgYXdrIC1GXiAneyBwcmludGYgXCJbXCI7IGZvcihpPTE7aTw9TkY7KytpKSB7IiArICcgc3BsaXQoJGksIHBsYXQsICIpIik7IHNwbGl0KHBsYXRbMV0sIHBsYXQyLCAiKCIpOyBpZm94PXNwbGl0KHBsYXQyWzJdLCBpZm8sICIsIik7IGxpYmM9IiI7IGh3Y2FwPSIwIjsgZm9yKGlmb2k9MTtpZm9pPD1pZm94OysraWZvaSkgeyBpZihzcGxpdChpZm9baWZvaV0sIGpuaywgImxpYmMiKT09MikgeyBsaWJjPWlmb1tpZm9pXTsgfSBpZihzcGxpdChpZm9baWZvaV0sIGpuaywgImh3Y2FwOiIpPT0yKSB7IHNwbGl0KGlmb1tpZm9pXSwgam5rLCAiMHgiKTsgaHdjYXA9am5rWzJdOyB9ICAgfSAgICAgIHg9c3BsaXQoJGksIHRvaywgIiAiKTsgaWYodG9rWzFdIT0iIikgeyBwcmludGYgIiVze1xcImxpYlxcIjogXFwiJXNcXCIsIFxcInBhdGhcXCI6IFxcIiVzXFwiLCBcXCJod2NhcFxcIjogXFwiJXNcXCIsIFxcImxpYmNcXCI6IFxcIiVzXFwifSIsIChpIT0xPyIsIjoiIiksIHRva1sxXSwgdG9rW3hdLCBod2NhcCwgbGliYzsgfX0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsKCiAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgdmFyIHYgPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgIHJldHVybiAodik7Cn0KCmZ1bmN0aW9uIG1vbml0b3JpbmZvKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnbW9uaXRvci1pbmZvJzsKICAgIHRoaXMuX2dtID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CgogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgIHsKICAgICAgICB0aGlzLl91c2VyMzIgPSB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ0VudW1EaXNwbGF5TW9uaXRvcnMnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMiA9IHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwoKICAgICAgICB0aGlzLmdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbmZvID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIChuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZXIsIHJlamVjdG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mbyA9IHsgcmVzb2x2ZXI6IHJlc29sdmVyLCByZWplY3RvcjogcmVqZWN0b3IsIHNlbGY6IGluZm8sIGNhbGxiYWNrOiBpbmZvLl9nbS5HZXRHZW5lcmljR2xvYmFsQ2FsbGJhY2soNCkgfTsKICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmNhbGxiYWNrLmluZm8gPSB0aGlzLl9tb25pdG9yaW5mbzsKICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmZvLmR3RGF0YSA9IGluZm8uX2dtLk9iamVjdFRvUHRyKHRoaXMuX21vbml0b3JpbmZvKTsKCiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5yZXN1bHRzID0gW107CiAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5mby5jYWxsYmFjay5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBPbk1vbml0b3JJbmZvKGhtb24sIGhkYywgciwgdXNlcikgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLk9iamVjdFRvUHRyX1ZlcmlmeSh0aGlzLmluZm8sIHVzZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYiA9IHIuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgbGVmdDogcmIucmVhZEludDMyTEUoMCksIHRvcDogcmIucmVhZEludDMyTEUoNCksIHJpZ2h0OiByYi5yZWFkSW50MzJMRSg4KSwgYm90dG9tOiByYi5yZWFkSW50MzJMRSgxMikgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuaW5mby5zZWxmLl9nbS5DcmVhdGVJbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuVmFsID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoaW5mby5fdXNlcjMyLkVudW1EaXNwbGF5TW9uaXRvcnMoMCwgMCwgdGhpcy5fbW9uaXRvcmluZm8uY2FsbGJhY2ssIHRoaXMuX21vbml0b3JpbmZvLmR3RGF0YSkuVmFsID09IDApIHsKICAgICAgICAgICAgICAgICAgICByZWplY3RvcignTGFzdEVycm9yPScgKyBpbmZvLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKS5WYWwpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVyKHRoaXMuX21vbml0b3JpbmZvLmNhbGxiYWNrLnJlc3VsdHMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgIHsKICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvLCBpcyBkZXRlcm1pbmUgd2hlcmUgdGhlIFgxMSBsaWJyYXJpZXMgYXJlCgogICAgICAgIC8vIFN1ZmZpY2llbnQgYWNjZXNzIHJpZ2h0cyB0byB1c2UgbGRjb25maWcKICAgICAgICB2YXIgeDExaW5mbyA9IGdldExpYkluZm8oJ2xpYlgxMScpOwogICAgICAgIHZhciB4dHN0aW5mbyA9IGdldExpYkluZm8oJ2xpYlh0c3QnKTsKICAgICAgICB2YXIgeGV4dGluZm8gPSBnZXRMaWJJbmZvKCdsaWJYZXh0Jyk7CiAgICAgICAgdmFyIHhmaXhlc2luZm8gPSBnZXRMaWJJbmZvKCdsaWJYZml4ZXMnKTsKICAgICAgICB2YXIgaXg7CgogICAgICAgIGZvciAoaXggaW4geDExaW5mbykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4MTFpbmZvLmxlbmd0aCA9PSAxIHx8IHgxMWluZm9baXhdLmh3Y2FwID09ICIwIikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KHgxMWluZm9baXhdLnBhdGgpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExTElCJywgeyB2YWx1ZTogeDExaW5mb1tpeF0ucGF0aCB9KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChpeCBpbiB4dHN0aW5mbykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4dHN0aW5mby5sZW5ndGggPT0gMSB8fCB4dHN0aW5mb1tpeF0uaHdjYXAgPT0gIjAiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ20uQ3JlYXRlTmF0aXZlUHJveHkoeHRzdGluZm9baXhdLnBhdGgpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExVFNUJywgeyB2YWx1ZTogeHRzdGluZm9baXhdLnBhdGggfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGV4KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaXggaW4geGV4dGluZm8pCiAgICAgICAgewogICAgICAgICAgICBpZiAoeGV4dGluZm8ubGVuZ3RoID09IDEgfHwgeGV4dGluZm9baXhdLmh3Y2FwID09ICIwIikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dtLkNyZWF0ZU5hdGl2ZVByb3h5KHhleHRpbmZvW2l4XS5wYXRoKTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUVYVCcsIHsgdmFsdWU6IHhleHRpbmZvW2l4XS5wYXRoIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGl4IGluIHhmaXhlc2luZm8pCiAgICAgICAgewogICAgICAgICAgICBpZiAoeGZpeGVzaW5mby5sZW5ndGggPT0gMSB8fCB4Zml4ZXNpbmZvW2l4XS5od2NhcCA9PSAiMCIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh4Zml4ZXNpbmZvW2l4XS5wYXRoKTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUZJWEVTJywgeyB2YWx1ZTogeGZpeGVzaW5mb1tpeF0ucGF0aCB9KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXgpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0KICAgICAgICB9ICAgCgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52WydMb2NhdGlvbl9YMTFMSUInXSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUxJQicsIHsgdmFsdWU6IHByb2Nlc3MuZW52WydMb2NhdGlvbl9YMTFMSUInXSB9KTsgfQogICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnZbJ0xvY2F0aW9uX1gxMVRTVCddKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExVFNUJywgeyB2YWx1ZTogcHJvY2Vzcy5lbnZbJ0xvY2F0aW9uX1gxMVRTVCddIH0pOyB9CiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFFWFQnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRVhUJ10gfSk7IH0KICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52WydMb2NhdGlvbl9YMTFGSVhFUyddKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTG9jYXRpb25fWDExRklYRVMnLCB7IHZhbHVlOiBwcm9jZXNzLmVudlsnTG9jYXRpb25fWDExRklYRVMnXSB9KTsgfQogICAgICAgIH0KICAgICAgICBjYXRjaChleCkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICB7CgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFMSUInLCB7IHZhbHVlOiByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlgxMScpWzBdP3JlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWDExJylbMF0ubG9jYXRpb246IHVuZGVmaW5lZCB9KTsKCSAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMVRTVCcsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWHRzdCcpWzBdP3JlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWHRzdCcpWzBdLmxvY2F0aW9uOnVuZGVmaW5lZCB9KTsKCSAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0xvY2F0aW9uX1gxMUVYVCcsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWGV4dCcpWzBdID8gcmVxdWlyZSgnbGliLWZpbmRlcicpKCdsaWJYZXh0JylbMF0ubG9jYXRpb24gOiB1bmRlZmluZWQgfSk7CgkgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdMb2NhdGlvbl9YMTFGSVhFUycsIHsgdmFsdWU6IHJlcXVpcmUoJ2xpYi1maW5kZXInKSgnbGliWGZpeGVzJylbMF0gPyByZXF1aXJlKCdsaWItZmluZGVyJykoJ2xpYlhmaXhlcycpWzBdLmxvY2F0aW9uIDogdW5kZWZpbmVkIH0pOwogICAgfQoKICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgIHsKICAgICAgICB0aGlzLk1PVElGX0ZMQUdTID0gCiAgICAgICAgewogICAgICAgICAgICBNV01fRlVOQ19BTEwgICAgICAgIDogKDEgPDwgMCkgLAogICAgICAgICAgICBNV01fRlVOQ19SRVNJWkUgICAgIDogKDEgPDwgMSkgLAogICAgICAgICAgICBNV01fRlVOQ19NT1ZFICAgICAgIDogKDEgPDwgMikgLAogICAgICAgICAgICBNV01fRlVOQ19NSU5JTUlaRSAgIDogKDEgPDwgMykgLAogICAgICAgICAgICBNV01fRlVOQ19NQVhJTUlaRSAgIDogKDEgPDwgNCkgLAogICAgICAgICAgICBNV01fRlVOQ19DTE9TRSAgICAgIDogKDEgPDwgNSkgCiAgICAgICAgfTsKCgogICAgICAgIGlmICh0aGlzLkxvY2F0aW9uX1gxMUxJQiAmJiB0aGlzLkxvY2F0aW9uX1gxMVRTVCAmJiB0aGlzLkxvY2F0aW9uX1gxMUVYVCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uICgpIHsgfSk7CiAgICAgICAgICAgIGNoLnN0ZG91dC5zdHIgPSAnJzsgY2guc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2guc3RkaW4ud3JpdGUoJ3BzIC1lIHwgZ3JlcCBYXG5leGl0XG4nKTsKICAgICAgICAgICAgY2gud2FpdEV4aXQoKTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrdm1feDExX3N1cHBvcnQnLCB7IHZhbHVlOiBjaC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IGZhbHNlIDogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrdm1feDExX3N1cHBvcnQnLCB7IHZhbHVlOiBmYWxzZSB9KTsKICAgICAgICB9CgoKICAgICAgICBpZiAodGhpcy5Mb2NhdGlvbl9YMTFMSUIpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9YMTEgPSB0aGlzLl9nbS5DcmVhdGVOYXRpdmVQcm94eSh0aGlzLkxvY2F0aW9uX1gxMUxJQik7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDaGFuZ2VQcm9wZXJ0eScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ2xvc2VEaXNwbGF5Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDb25uZWN0aW9uTnVtYmVyJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDb252ZXJ0U2VsZWN0aW9uJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDcmVhdGVHQycpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlV2luZG93Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hDcmVhdGVTaW1wbGVXaW5kb3cnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERlZmF1bHRDb2xvcm1hcCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVmYXVsdFNjcmVlbicpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRGVzdHJveVdpbmRvdycpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRHJhd0xpbmUnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERpc3BsYXlIZWlnaHQnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWERpc3BsYXlXaWR0aCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRmV0Y2hOYW1lJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hGbHVzaCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYRnJlZScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYQ3JlYXRlR0MnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEdldEF0b21OYW1lJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hHZXRXaW5kb3dQcm9wZXJ0eScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYSW50ZXJuQXRvbScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYTWFwV2luZG93Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoeyBtZXRob2Q6ICdYTmV4dEV2ZW50JywgdGhyZWFkRGlzcGF0Y2g6IHRydWUgfSk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoeyBtZXRob2Q6ICdYTmV4dEV2ZW50JywgbmV3TmFtZTogJ1hOZXh0RXZlbnRTeW5jJyB9KTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWE9wZW5EaXNwbGF5Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hQZW5kaW5nJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hSb290V2luZG93Jyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZWxlY3RJbnB1dCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2NyZWVuQ291bnQnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNjcmVlbk9mRGlzcGxheScpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2VsZWN0SW5wdXQnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNlbmRFdmVudCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0Rm9yZWdyb3VuZCcpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0RnVuY3Rpb24nKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldExpbmVBdHRyaWJ1dGVzJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTZXROb3JtYWxIaW50cycpOwogICAgICAgICAgICB0aGlzLl9YMTEuQ3JlYXRlTWV0aG9kKCdYU2V0U2VsZWN0aW9uT3duZXInKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldFN1YndpbmRvd01vZGUnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFNldFdNUHJvdG9jb2xzJyk7CiAgICAgICAgICAgIHRoaXMuX1gxMS5DcmVhdGVNZXRob2QoJ1hTdG9yZU5hbWUnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFN5bmMnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWEJsYWNrUGl4ZWwnKTsKICAgICAgICAgICAgdGhpcy5fWDExLkNyZWF0ZU1ldGhvZCgnWFdoaXRlUGl4ZWwnKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuaXNVbml0eSA9IGZ1bmN0aW9uIGlzVW5pdHkoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChwcm9jZXNzLmVudlsnWERHX0NVUlJFTlRfREVTS1RPUCddID09ICdVbml0eScpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy51bkRlY29yYXRlV2luZG93ID0gZnVuY3Rpb24gdW5EZWNvcmF0ZVdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpCiAgICAgICAgewogICAgICAgICAgICB2YXIgTXdtSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg0MCk7CiAgICAgICAgICAgIHZhciBtd21IaW50c1Byb3BlcnR5ID0gdGhpcy5fWDExLlhJbnRlcm5BdG9tKGRpc3BsYXksIHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKCdfTU9USUZfV01fSElOVFMnKSwgMCk7CiAgICAgICAgICAgIE13bUhpbnRzLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxIDw8IDEpOwogICAgICAgICAgICB0aGlzLl9YMTEuWENoYW5nZVByb3BlcnR5KGRpc3BsYXksIHdpbmRvdywgbXdtSGludHNQcm9wZXJ0eSwgbXdtSGludHNQcm9wZXJ0eSwgMzIsIDAsIE13bUhpbnRzLCA1KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRBbGxvd2VkQWN0aW9ucyA9IGZ1bmN0aW9uIHNldEFsbG93ZWRBY3Rpb25zKGRpc3BsYXksIHdpbmRvdywgZmxhZ3MpCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgTVdNX0hJTlRTX0ZVTkNUSU9OUyA9ICgxTCA8PCAwKSwKICAg", 16000);
|
|
memcpy_s(_monitorinfo + 16000, 15352, "ICAgICAgICAgICAgIE1XTV9ISU5UU19ERUNPUkFUSU9OUyA9ICAoMUwgPDwgMSksCgogICAgICAgICAgICAgICAgTVdNX0ZVTkNfQUxMID0gKDFMIDw8IDApLAogICAgICAgICAgICAgICAgTVdNX0ZVTkNfUkVTSVpFID0gKDFMIDw8IDEpLAogICAgICAgICAgICAgICAgTVdNX0ZVTkNfTU9WRSA9ICgxTCA8PCAyKSwKICAgICAgICAgICAgICAgIE1XTV9GVU5DX01JTklNSVpFID0gKDFMIDw8IDMpLAogICAgICAgICAgICAgICAgTVdNX0ZVTkNfTUFYSU1JWkUgPSAoMUwgPDwgNCksCiAgICAgICAgICAgICAgICBNV01fRlVOQ19DTE9TRSA9ICgxTCA8PCA1KQogICAgICAgICAgICAqLwoKICAgICAgICAgICAgdmFyIE13bUhpbnRzID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoNDApOwogICAgICAgICAgICB2YXIgbXdtSGludHNQcm9wZXJ0eSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX01PVElGX1dNX0hJTlRTJyksIDApOwoKICAgICAgICAgICAgTXdtSGludHMuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKE1XTV9ISU5UU19GVU5DVElPTlMpOwogICAgICAgICAgICBNd21IaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsKCiAgICAgICAgICAgIHRoaXMuX1gxMS5YQ2hhbmdlUHJvcGVydHkoZGlzcGxheSwgd2luZG93LCBtd21IaW50c1Byb3BlcnR5LCBtd21IaW50c1Byb3BlcnR5LCAzMiwgUHJvcE1vZGVSZXBsYWNlLCBNd21IaW50cywgNSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2V0V2luZG93U2l6ZUhpbnRzID0gZnVuY3Rpb24gc2V0V2luZG93U2l6ZUhpbnRzKGRpc3BsYXksIHdpbmRvdywgeCwgeSwgd2lkdGgsIGhlaWdodCwgbWluV2lkdGgsIG1pbkhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzaXplSGludHMgPSB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSg4MCk7CiAgICAgICAgICAgIHZhciBzcGVjID0gUFBvc2l0aW9uIHwgUFNpemU7CiAgICAgICAgICAgIGlmIChtaW5XaWR0aCAhPSBudWxsICYmIG1pbkhlaWdodCAhPSBudWxsKSB7IHNwZWMgfD0gUE1pblNpemU7IH0KICAgICAgICAgICAgaWYgKG1heFdpZHRoICE9IG51bGwgJiYgbWF4SGVpZ2h0ICE9IG51bGwpIHsgc3BlYyB8PSBQTWF4U2l6ZTsgfQoKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShzcGVjKTsKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoeCk7CiAgICAgICAgICAgIHNpemVIaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSArIDQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh5KTsKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgOCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHdpZHRoKTsKICAgICAgICAgICAgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMTIsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShoZWlnaHQpOwogICAgICAgICAgICBpZiAobWluV2lkdGggIT0gbnVsbCkgeyBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyAxNiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKG1pbldpZHRoKTsgfQogICAgICAgICAgICBpZiAobWluSGVpZ2h0ICE9IG51bGwpIHsgc2l6ZUhpbnRzLkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplICsgMjAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShtaW5IZWlnaHQpOyB9CiAgICAgICAgICAgIGlmIChtYXhXaWR0aCAhPSBudWxsKSB7IHNpemVIaW50cy5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSArIDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUobWF4V2lkdGgpOyB9CiAgICAgICAgICAgIGlmIChtYXhIZWlnaHQgIT0gbnVsbCkgeyBzaXplSGludHMuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgKyAyOCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKG1heEhlaWdodCk7IH0KCiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2V0Tm9ybWFsSGludHMoZGlzcGxheSwgd2luZG93LCBzaXplSGludHMpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldEFsd2F5c09uVG9wID0gZnVuY3Rpb24gc2V0QWx3YXlzT25Ub3AoZGlzcGxheSwgcm9vdFdpbmRvdywgd2luZG93KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdtTmV0V21TdGF0ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURScpLCAxKTsKICAgICAgICAgICAgdmFyIHdtU3RhdGVBYm92ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURV9BQk9WRScpLCAxKTsKCiAgICAgICAgICAgIHZhciB4Y2xpZW50ID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoOTYpOwogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzMyk7ICAgICAgICAgICAgICAgICAgIC8vIENsaWVudE1lc3NhZ2UgdHlwZQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA0OCA6IDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzIpOyAgIC8vIEZvcm1hdCAzMgogICAgICAgICAgICB3bU5ldFdtU3RhdGUucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSA9PSA4ID8gNDAgOiAyMCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAvLyBtZXNzYWdlX3R5cGUKICAgICAgICAgICAgeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZSA9PSA4ID8gNTYgOiAyOCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShfTkVUX1dNX1NUQVRFX0FERCk7ICAgLy8gZGF0YS5sWzBdCiAgICAgICAgICAgIHdtU3RhdGVBYm92ZS5wb2ludGVyQnVmZmVyKCkuY29weSh4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplID09IDggPyA2NCA6IDMyLCB0aGlzLl9nbS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7ICAvLyBkYXRhLmxbMV0KICAgICAgICAgICAgd2luZG93LnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgICAgICAgLy8gd2luZG93CiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2VuZEV2ZW50KGRpc3BsYXksIHJvb3RXaW5kb3csIDAsIFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFzayB8IFN1YnN0cnVjdHVyZU5vdGlmeU1hc2ssIHhjbGllbnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLmhpZGVXaW5kb3dJY29uID0gZnVuY3Rpb24gaGlkZVdpbmRvd0ljb24oZGlzcGxheSwgcm9vdFdpbmRvdywgd2luZG93KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHdtTmV0V21TdGF0ZSA9IHRoaXMuX1gxMS5YSW50ZXJuQXRvbShkaXNwbGF5LCB0aGlzLl9nbS5DcmVhdGVWYXJpYWJsZSgnX05FVF9XTV9TVEFURScpLCAxKTsKICAgICAgICAgICAgdmFyIHdtU3RhdGVTa2lwID0gdGhpcy5fWDExLlhJbnRlcm5BdG9tKGRpc3BsYXksIHRoaXMuX2dtLkNyZWF0ZVZhcmlhYmxlKCdfTkVUX1dNX1NUQVRFX1NLSVBfVEFTS0JBUicpLCAxKTsKCiAgICAgICAgICAgIHZhciB4Y2xpZW50ID0gdGhpcy5fZ20uQ3JlYXRlVmFyaWFibGUoOTYpOwogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgzMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsaWVudE1lc3NhZ2UgdHlwZQogICAgICAgICAgICB4Y2xpZW50LkRlcmVmKHRoaXMuX2dtLlBvaW50ZXJTaXplPT04PzQ4OjI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMzIpOyAgIC8vIEZvcm1hdCAzMgogICAgICAgICAgICB3bU5ldFdtU3RhdGUucG9pbnRlckJ1ZmZlcigpLmNvcHkoeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD80MDoyMCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOyAvLyBtZXNzYWdlX3R5cGUKICAgICAgICAgICAgeGNsaWVudC5EZXJlZih0aGlzLl9nbS5Qb2ludGVyU2l6ZT09OD81NjoyOCwgdGhpcy5fZ20uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShfTkVUX1dNX1NUQVRFX0FERCk7ICAgLy8gZGF0YS5sWzBdCiAgICAgICAgICAgIHdtU3RhdGVTa2lwLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/NjQ6MzIsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgIC8vIGRhdGEubFsxXQoKICAgICAgICAgICAgd2luZG93LnBvaW50ZXJCdWZmZXIoKS5jb3B5KHhjbGllbnQuRGVyZWYodGhpcy5fZ20uUG9pbnRlclNpemU9PTg/MzI6MTYsIHRoaXMuX2dtLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsgICAgICAgLy8gd2luZG93CiAgICAgICAgICAgIHRoaXMuX1gxMS5YU2VuZEV2ZW50KGRpc3BsYXksIHJvb3RXaW5kb3csIDAsIFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFzayB8IFN1YnN0cnVjdHVyZU5vdGlmeU1hc2ssIHhjbGllbnQpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5nZXRJbmZvID0gZnVuY3Rpb24gZ2V0SW5mbygpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaW5mbyA9IHRoaXM7CiAgICAgICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgICAgICByZXQucGFyZW50ID0gdGhpczsKCiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuWEFVVEhPUklUWSB8fCAhcHJvY2Vzcy5lbnYuRElTUExBWSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHhpbmZvID0gdGhpcy5nZXRYSW5mbyhyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VWlkKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS53aG9hbWkoKSkpOwogICAgICAgICAgICAgICAgcHJvY2Vzcy5zZXRlbnYoJ1hBVVRIT1JJVFknLCB4aW5mby54YXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgIHByb2Nlc3Muc2V0ZW52KCdESVNQTEFZJywgeGluZm8uZGlzcGxheSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gaW5mby5fWDExLlhPcGVuRGlzcGxheShpbmZvLl9nbS5DcmVhdGVWYXJpYWJsZShwcm9jZXNzLmVudi5ESVNQTEFZKSk7CiAgICAgICAgICAgIGlmIChkaXNwbGF5LlZhbCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy92YXIvdG1wL2FnZW50U2xhdmUnLCAnWE9wZW5EaXNwbGF5IEZhaWxlZCcsIHsgZmxhZ3M6ICdhJyB9KTsKICAgICAgICAgICAgICAgIHJldC5fcmVqKCdYT3BlbkRpc3BsYXkgRmFpbGVkJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzY3JlZW5Db3VudCA9IGluZm8uX1gxMS5YU2NyZWVuQ291bnQoZGlzcGxheSkuVmFsOwogICAgICAgICAgICB2YXIgaWZvID0gW107CiAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8c2NyZWVuQ291bnQ7KytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgc2NyZWVuID0gaW5mby5fWDExLlhTY3JlZW5PZkRpc3BsYXkoZGlzcGxheSwgaSk7CiAgICAgICAgICAgICAgICBpZm8ucHVzaCh7IGxlZnQ6IDAsIHRvcDogMCwgcmlnaHQ6IGluZm8uX1gxMS5YRGlzcGxheVdpZHRoKGRpc3BsYXksIGkpLlZhbCwgYm90dG9tOiBpbmZvLl9YMTEuWERpc3BsYXlIZWlnaHQoZGlzcGxheSwgaSkuVmFsLCBzY3JlZW46IHNjcmVlbiwgc2NyZWVuSWQ6IGksIGRpc3BsYXk6IGRpc3BsYXkgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0Ll9yZXMoaWZvKTsKCiAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nZXRYSW5mbyA9IGZ1bmN0aW9uIGdldFhJbmZvKGNvbnNvbGV1aWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmV0ID0gbnVsbDsKICAgICAgICAgICAgdmFyIHVuYW1lID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKGNvbnNvbGV1aWQpOwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzICIgKyAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCc/Ii1heCAiOiIiKSArICItZSAtbyB1c2VyIiArIChwcm9jZXNzLnBsYXRmb3JtPT0nbGludXgnPyI6OTk5IjoiIikgKyAiIC1vIHR0eSAtbyBjb21tYW5kIHwgZ3JlcCBYIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIi1hdXRoXCIpOyBzcGxpdChhWzJdLCBiLCBcIiBcIik7IGlmKCQxPT1cIiIgKyB1bmFtZSArICJcIiAmJiBiWzFdIT1cIlwiKSB7IHByaW50ZiBcIiVzLCVzLCVzXCIsJDEsJDIsYlsxXSB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgdmFyIHRva2VucyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiB0b2tlbnNbMV0sIHhhdXRob3JpdHk6IHRva2Vuc1syXSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHJldCA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIExpbnV4IERpc3RybyBkb2VzIG5vdCBzcGF3biBhbiBYU2VydmVyIGluc3RhbmNlIGluIHRoZSB1c2VyIHNlc3Npb24sIHRoYXQgc3BlY2lmaWVzIHRoZSBYQVVUSE9SSVRZLgogICAgICAgICAgICAgICAgLy8gU28gd2UncmUgZ29pbmcgdG8gYnJ1dGUgZm9yY2UgaXQsIGJ5IGVudW1lcmF0aW5nIGFsbCBwcm9jZXNzZXMgb3duZWQgYnkgdGhpcyB1c2VyLCBhbmQgaW5zcGVjdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzICIgKyAocHJvY2Vzcy5wbGF0Zm9ybT09J2ZyZWVic2QnPyItYXggIjoiIikgKyAiLWUgLW8gcGlkIC1vIHVzZXIgfCBncmVwICIgKyB1bmFtZSArICIgfCBhd2sgJ3sgcHJpbnQgJDEgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgZm9yKHZhciBuIGluIGxpbmVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsbiA9IGxpbmVzW25dLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZihsbi5sZW5ndGg+MCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEVudkZyb21QaWQobG4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZihlLlhBVVRIT1JJVFkgJiYgZS5ESVNQTEFZKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB7IHR0eTogJz8nLCB4YXV0aG9yaXR5OiBlLlhBVVRIT1JJVFksIGRpc3BsYXk6IGUuRElTUExBWSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHJldCA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgWEFVVEhPUklUWSBhbmQgRElTUExBWSwgc28gYXMgYSBsYXN0IGRpdGNoIGVmZm9ydCwgbGV0cyBqdXN0IGxvb2sgZm9yIERJU1BMQVkKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGxpbmVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbGluZXNbbl0udHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChsbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ESVNQTEFZKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgdHR5OiAnPycsIGRpc3BsYXk6IGUuRElTUExBWSwgZXhwb3J0RW52OiBleHBvcnRFbnYgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgJERJU1BMQVkgYnkgbG9va2luZyBhdCBhbGwgdGhlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBzYW1lIHR0eSBhcyB0aGUgWFNlcnZlciBpbnN0YW5jZSBmb3IgdGhpcyB1c2VyIHNlc3Npb24KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcyAtZSAtbyB0dHkgLW8gcGlkIC1vIHVzZXI6OTk5OSB8IGdyZXAgIiArIHJldC50dHkgKyAiIHwgZ3JlcCAiICsgdW5hbWUgKyAiIHwgYXdrICd7IHByaW50ICQyIH0nIFxuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICB2YXIgcHMsIHBzeCwgdiwgdnMgPSAwOwogICAgICAgICAgICAgICAgZm9yKHZhciB4IGluIGxpbmVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKGxpbmVzW3hdLnRyaW0oKS5sZW5ndGg+MCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgbGluZXNbeF0udHJpbSgpICsgJy9lbnZpcm9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gocHNlKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihwc3g9MDtwc3g8cHMubGVuZ3RoOysrcHN4KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNbcHN4XSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwcy5zbGljZSh2cywgcHN4KS50b1N0cmluZygpLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZbMF0gPT0gJ0RJU1BMQVknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRpc3BsYXkgPSB2WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzID0gcHN4ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfTsKICAgIH0KfQoKZnVuY3Rpb24gZXhwb3J0RW52KCkKewogICAgdmFyIHIgPQogICAgICAgIHsKICAgICAgICAgICAgWEFVVEhPUklUWTogdGhpcy54YXV0aG9yaXR5P3RoaXMueGF1dGhvcml0eToiIiwgRElTUExBWTogdGhpcy5kaXNwbGF5LAogICAgICAgICAgICBMb2NhdGlvbl9YMTFMSUI6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLkxvY2F0aW9uX1gxMUxJQiwKICAgICAgICAgICAgTG9jYXRpb25fWDExVFNUOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5Mb2NhdGlvbl9YMTFUU1QsCiAgICAgICAgICAgIExvY2F0aW9uX1gxMUVYVDogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExRVhULAogICAgICAgICAgICBMb2NhdGlvbl9YMTFGSVhFUzogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuTG9jYXRpb25fWDExRklYRVMKICAgICAgICB9OwogICAgcmV0dXJuIChyKTsKfQoKaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ2RhcndpbicpCnsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IG1vbml0b3JpbmZvKCk7Cn0KCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCnsKICAgIG1vZHVsZS5leHBvcnRzLmdldExpYkluZm8gPSBnZXRMaWJJbmZvOwp9Cv==", 15352);
|
|
ILibBase64DecodeEx((unsigned char*)_monitorinfo, 31352, (unsigned char*)_monitorinfo + 31352);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "monitor-info"); duk_push_string(ctx, _monitorinfo + 31352);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_monitorinfo);
|
|
|
|
// service-host. Refer to modules/service-host.js
|
|
char *_servicehost = ILibMemory_Allocate(30948, 0, NULL, NULL);
|
|
memcpy_s(_servicehost + 0, 17684, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgp2YXIgU0VSVklDRV9XSU4zMiA9IDB4MDAwMDAwMTAgfCAweDAwMDAwMDIwOwp2YXIgU0VSVklDRV9TVEFURSA9IHsgU1RPUFBFRDogMHgwMDAwMDAwMSwgU0VSVklDRV9TVEFSVF9QRU5ESU5HOiAweDAwMDAwMDAyLCBTRVJWSUNFX1NUT1BfUEVORElORzogMHgwMDAwMDAwMywgUlVOTklORzogMHgwMDAwMDAwNCB9Owp2YXIgU0VSVklDRV9BQ0NFUFQgPSB7IFNFUlZJQ0VfQUNDRVBUX1NUT1A6IDB4MDAwMDAwMDEsIFNFUlZJQ0VfQUNDRVBUX1NIVVRET1dOOiAweDAwMDAwMDA0LCBTRVJWSUNFX0FDQ0VQVF9QT1dFUkVWRU5UOiAweDAwMDAwMDQwLCBTRVJWSUNFX0FDQ0VQVF9TRVNTSU9OQ0hBTkdFOiAweDAwMDAwMDgwIH07Cgp2YXIgU0VSVklDRV9DT05UUk9MID0geyBTRVJWSUNFX0NPTlRST0xfU0hVVERPV046IDB4MDAwMDAwMDUsIFNFUlZJQ0VfQ09OVFJPTF9TVE9QOiAweDAwMDAwMDAxLCBTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVDogMHgwMDAwMDAwRCwgU0VSVklDRV9DT05UUk9MX1NFU1NJT05DSEFOR0U6IDB4MDAwMDAwMEV9Owp2YXIgU0VTU0lPTl9DSEFOR0VfVFlQRSA9CnsKICAgIFdUU19DT05TT0xFX0NPTk5FQ1Q6IDB4MSwKICAgIFdUU19DT05TT0xFX0RJU0NPTk5FQ1Q6IDB4MiwKICAgIFdUU19SRU1PVEVfQ09OTkVDVDogMHgzLAogICAgV1RTX1JFTU9URV9ESVNDT05ORUNUOiAweDQsCiAgICBXVFNfU0VTU0lPTl9MT0dPTjogMHg1LAogICAgV1RTX1NFU1NJT05fTE9HT0ZGOiAweDYsCiAgICBXVFNfU0VTU0lPTl9MT0NLOiAweDcsCiAgICBXVFNfU0VTU0lPTl9VTkxPQ0s6IDB4OCwKICAgIFdUU19TRVNTSU9OX1JFTU9URV9DT05UUk9MOiAweDksCiAgICBXVFNfU0VTU0lPTl9DUkVBVEU6IDB4YSwKICAgIFdUU19TRVNTSU9OX1RFUk1JTkFURTogMHhiCn07CgoKdmFyIE5PX0VSUk9SID0gMDsKCnZhciBzZXJ2aWNlTWFuYWdlciA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpOwoKZnVuY3Rpb24gc2VydmljZUhvc3Qoc2VydmljZU5hbWUpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3NlcnZpY2UtaG9zdCc7CiAgICB2YXIgZW1pdHRlclV0aWxzID0gcmVxdWlyZSgnZXZlbnRzJykuaW5oZXJpdHModGhpcyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ3NlcnZpY2VTdGFydCcpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdzZXJ2aWNlU3RvcCcpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdub3JtYWxTdGFydCcpOwogICAgZW1pdHRlclV0aWxzLmNyZWF0ZUV2ZW50KCdzZXNzaW9uJyk7CiAgICBlbWl0dGVyVXRpbHMuY3JlYXRlRXZlbnQoJ3Bvd2VyU3RhdGVDaGFuZ2UnKTsKCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgewogICAgICAgIHRoaXMuR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKICAgICAgICB0aGlzLkFkdmFwaSA9IHRoaXMuR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0FkdmFwaTMyLmRsbCcpOwogICAgICAgIHRoaXMuQWR2YXBpLkNyZWF0ZU1ldGhvZCh7IG1ldGhvZDogJ1N0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQScsIHRocmVhZERpc3BhdGNoOiAxIH0pOwogICAgICAgIHRoaXMuQWR2YXBpLkNyZWF0ZU1ldGhvZCgnUmVnaXN0ZXJTZXJ2aWNlQ3RybEhhbmRsZXJFeEEnKTsKICAgICAgICB0aGlzLkFkdmFwaS5DcmVhdGVNZXRob2QoJ1NldFNlcnZpY2VTdGF0dXMnKTsKICAgICAgICB0aGlzLktlcm5lbDMyID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7CiAgICAgICAgdGhpcy5LZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwoKICAgICAgICB0aGlzLk9sZTMyID0gdGhpcy5HTS5DcmVhdGVOYXRpdmVQcm94eSgnT2xlMzIuZGxsJyk7CiAgICAgICAgdGhpcy5PbGUzMi5DcmVhdGVNZXRob2QoJ0NvSW5pdGlhbGl6ZUV4Jyk7CiAgICAgICAgdGhpcy5PbGUzMi5DcmVhdGVNZXRob2QoJ0NvVW5pbml0aWFsaXplJyk7CgogICAgICAgIHRoaXMuX1NlcnZpY2VOYW1lID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSh0eXBlb2YgKHNlcnZpY2VOYW1lKSA9PSAnc3RyaW5nJyA/IHNlcnZpY2VOYW1lIDogc2VydmljZU5hbWUubmFtZSk7CiAgICAgICAgdGhpcy5fU2VydmljZU1haW4gPSB0aGlzLkdNLkdldEdlbmVyaWNHbG9iYWxDYWxsYmFjaygyKTsKICAgICAgICB0aGlzLl9TZXJ2aWNlTWFpbi5QYXJlbnQgPSB0aGlzOwogICAgICAgIHRoaXMuX1NlcnZpY2VNYWluLkdNID0gdGhpcy5HTTsKICAgICAgICB0aGlzLl9TZXJ2aWNlTWFpbi5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBvbkdsb2JhbENhbGxiYWNrKGFyZ2MsIGFyZ3YpCiAgICAgICAgewogICAgICAgICAgICAvL1RvRG86IENoZWNrIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGZvciB1cwoKICAgICAgICAgICAgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDI4KTsKICAgICAgICAgICAgLy90eXBlZGVmIHN0cnVjdCBfU0VSVklDRV9TVEFUVVMgewogICAgICAgICAgICAvLyAgICBEV09SRCAgIGR3U2VydmljZVR5cGU7CiAgICAgICAgICAgIC8vICAgIERXT1JEICAgZHdDdXJyZW50U3RhdGU7CiAgICAgICAgICAgIC8vICAgIERXT1JEICAgZHdDb250cm9sc0FjY2VwdGVkOwogICAgICAgICAgICAvLyAgICBEV09SRCAgIGR3V2luMzJFeGl0Q29kZTsKICAgICAgICAgICAgLy8gICAgRFdPUkQgICBkd1NlcnZpY2VTcGVjaWZpY0V4aXRDb2RlOwogICAgICAgICAgICAvLyAgICBEV09SRCAgIGR3Q2hlY2tQb2ludDsKICAgICAgICAgICAgLy8gICAgRFdPUkQgICBkd1dhaXRIaW50OwogICAgICAgICAgICAvL30gU0VSVklDRV9TVEFUVVMsICpMUFNFUlZJQ0VfU1RBVFVTOwoKICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSBzZXJ2aWNlIHN0YXR1cwogICAgICAgICAgICB0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1cy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoU0VSVklDRV9XSU4zMik7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShTRVJWSUNFX1NUQVRFLlNFUlZJQ0VfU1RPUFBFRCwgNCk7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzSGFuZGxlID0gdGhpcy5QYXJlbnQuQWR2YXBpLlJlZ2lzdGVyU2VydmljZUN0cmxIYW5kbGVyRXhBKHRoaXMuUGFyZW50Ll9TZXJ2aWNlTmFtZSwgdGhpcy5QYXJlbnQuX1NlcnZpY2VDb250cm9sSGFuZGxlciwgdGhpcy5QYXJlbnQuR00uU3Rhc2hPYmplY3QodGhpcy5QYXJlbnQuX1NlcnZpY2VDb250cm9sSGFuZGxlcikpOwogICAgICAgICAgICBpZih0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1c0hhbmRsZS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZXJ2aWNlIGlzIHN0YXJ0aW5nCiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShTRVJWSUNFX1NUQVRFLlNFUlZJQ0VfU1RBUlRfUEVORElORywgNCk7CiAgICAgICAgICAgIHRoaXMuUGFyZW50LkFkdmFwaS5TZXRTZXJ2aWNlU3RhdHVzKHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzSGFuZGxlLCB0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1cyk7CgogICAgICAgICAgICAvLyBTZXJ2aWNlIHJ1bm5pbmcKICAgICAgICAgICAgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKFNFUlZJQ0VfU1RBVEUuUlVOTklORywgNCk7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Ll9TZXJ2aWNlU3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShTRVJWSUNFX0FDQ0VQVC5TRVJWSUNFX0FDQ0VQVF9TVE9QIHwgU0VSVklDRV9BQ0NFUFQuU0VSVklDRV9BQ0NFUFRfUE9XRVJFVkVOVCB8IFNFUlZJQ0VfQUNDRVBULlNFUlZJQ0VfQUNDRVBUX1NFU1NJT05DSEFOR0UsIDgpOwogICAgICAgICAgICB0aGlzLlBhcmVudC5BZHZhcGkuU2V0U2VydmljZVN0YXR1cyh0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1c0hhbmRsZSwgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMpOwoKICAgICAgICAgICAgdGhpcy5QYXJlbnQuT2xlMzIuQ29Jbml0aWFsaXplRXgoMCwgMik7CiAgICAgICAgICAgIHRoaXMuUGFyZW50Lm9uKCd+JywgZnVuY3Rpb24gT25TZXJ2aWNlSG9zdEZpbmFsaXplcigpCiAgICAgICAgICAgIHsgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgICAgICAgICAgdmFyIEFkdmFwaSA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdBZHZhcGkzMi5kbGwnKTsKICAgICAgICAgICAgICAgIEFkdmFwaS5DcmVhdGVNZXRob2QoJ1NldFNlcnZpY2VTdGF0dXMnKTsKCiAgICAgICAgICAgICAgICBLZXJuZWwzMiA9IHRoaXMuR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0tlcm5lbDMyLmRsbCcpOwogICAgICAgICAgICAgICAgS2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKCiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gR00uQ3JlYXRlVmFyaWFibGUoMjgpOwoKICAgICAgICAgICAgICAgIC8vIFNlcnZpY2Ugd2FzIHN0b3BwZWQKICAgICAgICAgICAgICAgIHN0YXR1cy50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoU0VSVklDRV9XSU4zMik7CiAgICAgICAgICAgICAgICBzdGF0dXMudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDB4MDAwMDAwMDEsIDQpOwogICAgICAgICAgICAgICAgc3RhdHVzLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgwLCA4KTsKCiAgICAgICAgICAgICAgICBBZHZhcGkuU2V0U2VydmljZVN0YXR1cyh0aGlzLl9TZXJ2aWNlU3RhdHVzSGFuZGxlLCBzdGF0dXMpOwoKICAgICAgICAgICAgICAgIHRoaXMuT2xlMzIuQ29VbmluaXRpYWxpemUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLlBhcmVudC5lbWl0KCdzZXJ2aWNlU3RhcnQnKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9TZXJ2aWNlQ29udHJvbEhhbmRsZXIgPSB0aGlzLkdNLkdldEdlbmVyaWNHbG9iYWxDYWxsYmFjayg0KTsKICAgICAgICB0aGlzLl9TZXJ2aWNlQ29udHJvbEhhbmRsZXIuUGFyZW50ID0gdGhpczsKICAgICAgICB0aGlzLl9TZXJ2aWNlQ29udHJvbEhhbmRsZXIuR00gPSB0aGlzLkdNOwogICAgICAgIHRoaXMuX1NlcnZpY2VDb250cm9sSGFuZGxlci5vbignR2xvYmFsQ2FsbGJhY2snLCBmdW5jdGlvbiBvblNlcnZpY2VDb250cm9sSGFuZGxlcihjb2RlLCBldmVudFR5cGUsIGV2ZW50RGF0YSwgY29udGV4dCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBqID0gdGhpcy5QYXJlbnQuR00uVW5zdGFzaE9iamVjdChjb250ZXh0KTsKICAgICAgICAgICAgaWYgKGogIT0gbnVsbCAmJiBqID09IHRoaXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5WYWwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX0NPTlRST0wuU0VSVklDRV9DT05UUk9MX1NIVVRET1dOOgogICAgICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9DT05UUk9MLlNFUlZJQ0VfQ09OVFJPTF9TVE9QOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBhcmVudC5lbWl0KCdzZXJ2aWNlU3RvcCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX0NPTlRST0wuU0VSVklDRV9DT05UUk9MX1NFU1NJT05DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXNzaW9uSWQgPSBldmVudERhdGEuRGVyZWYoNCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGV2ZW50VHlwZS5WYWwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9DSEFOR0VfVFlQRS5XVFNfU0VTU0lPTl9MT0dPTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9DSEFOR0VfVFlQRS5XVFNfU0VTU0lPTl9MT0dPRkY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmVtaXQoJ2NoYW5nZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLlBhcmVudC5BZHZhcGkuU2V0U2VydmljZVN0YXR1cyh0aGlzLlBhcmVudC5fU2VydmljZVN0YXR1c0hhbmRsZSwgdGhpcy5QYXJlbnQuX1NlcnZpY2VTdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHNlcnZpY2VOYW1lKSB7IHRoaXMuX1NlcnZpY2VPcHRpb25zID0gdHlwZW9mIChzZXJ2aWNlTmFtZSkgPT0gJ29iamVjdCcgPyBzZXJ2aWNlTmFtZSA6IHsgbmFtZTogc2VydmljZU5hbWUgfTsgfQogICAgZWxzZQogICAgewogICAgICAgIHRocm93ICgnTXVzdCBzcGVjaWZ5IGVpdGhlciBTZXJ2aWNlTmFtZSBvciBPcHRpb25zJyk7CiAgICB9CiAgICBpZiAoIXRoaXMuX1NlcnZpY2VPcHRpb25zLnNlcnZpY2VQYXRoKQogICAgewogICAgICAgIHRoaXMuX1NlcnZpY2VPcHRpb25zLnNlcnZpY2VQYXRoID0gcHJvY2Vzcy5leGVjUGF0aDsKICAgIH0KICAgIAogICAgdGhpcy5ydW4gPSBmdW5jdGlvbiBydW4oKQogICAgewogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9ICd3aW4zMicpCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIFNJR1RFUk1fSGFuZGxlciA9IGZ1bmN0aW9uIF9TSUdURVJNX0hhbmRsZXIoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIF9TSUdURVJNX0hhbmRsZXIucGFyZW50LmVtaXQoJ3NlcnZpY2VTdG9wJyk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgU0lHVEVSTV9IYW5kbGVyLnBhcmVudCA9IHRoaXM7DQogICAgICAgICAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgU0lHVEVSTV9IYW5kbGVyKTsNCiAgICAgICAgfQoKICAgICAgICBmb3IodmFyIGkgPSAwOyBpPHByb2Nlc3MuYXJndi5sZW5ndGg7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChwcm9jZXNzLmFyZ3ZbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJy1pbnN0YWxsJzoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3N2Y01hbmFnZXIpIHsgdGhpcy5fc3ZjTWFuYWdlciA9IG5ldyBzZXJ2aWNlTWFuYWdlcigpOyB9CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdmNNYW5hZ2VyLmluc3RhbGxTZXJ2aWNlKHRoaXMuX1NlcnZpY2VPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgKyAnIGluc3RhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnLXVuaW5zdGFsbCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdmNNYW5hZ2VyKSB7IHRoaXMuX3N2Y01hbmFnZXIgPSBuZXcgc2VydmljZU1hbmFnZXIoKTsgfQogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3ZjTWFuYWdlci51bmluc3RhbGxTZXJ2aWNlKHRoaXMuX1NlcnZpY2VPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICBjYXNlICctZCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgeyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc3ZjTWFuYWdlcikgeyB0aGlzLl9zdmNNYW5hZ2VyID0gbmV3IHNlcnZpY2VNYW5hZ2VyKCk7IH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdmNNYW5hZ2VyLmdldFNlcnZpY2UodGhpcy5fU2VydmljZU9wdGlvbnMubmFtZSkuc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLl9TZXJ2aWNlT3B0aW9ucy5uYW1lICsgJyBzdGFydGluZy4uLicpOwogICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3RvcCc6CiAgICAgICAgICAgICAgICBjYXNlICctcyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgeyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc3ZjTWFuYWdlcikgeyB0aGlzLl9zdmNNYW5hZ2VyID0gbmV3IHNlcnZpY2VNYW5hZ2VyKCk7IH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdmNNYW5hZ2VyLmdldFNlcnZpY2UodGhpcy5fU2VydmljZU9wdGlvbnMubmFtZSkuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgKyAnIHN0b3BwaW5nLi4uJyk7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlcnZpY2VUYWJsZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCAqIHRoaXMuR00uUG9pbnRlclNpemUpOwogICAgICAgICAgICB0aGlzLl9TZXJ2aWNlTmFtZS5wb2ludGVyQnVmZmVyKCkuY29weShzZXJ2aWNlVGFibGUudG9CdWZmZXIoKSk7CiAgICAgICAgICAgIHRoaXMuX1NlcnZpY2VNYWluLnBvaW50ZXJCdWZmZXIoKS5jb3B5KHNlcnZpY2VUYWJsZS50b0J1ZmZlcigpLCB0aGlzLkdNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgdGhpcy5fc3NjZCA9IHRoaXMuQWR2YXBpLlN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQShzZXJ2aWNlVGFibGUpOwogICAgICAgICAgICB0aGlzLl9zc2NkLnBhcmVudCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX3NzY2Qub24oJ2RvbmUnLCBmdW5jdGlvbiBPblN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQShyZXRWYWwpIHsKICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnbm9ybWFsU3RhcnQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSB0aGlzLl9TZXJ2aWNlT3B0aW9ucyA/IHRoaXMuX1NlcnZpY2VPcHRpb25zLm5hbWUgOiBwcm9jZXNzLmV4ZWNQYXRoLnN1YnN0cmluZygxICsgcHJvY2Vzcy5leGVjUGF0aC5sYXN0SW5kZXhPZignLycpKTsKICAgICAgICAgICAgdmFyIHBsYXRmb3JtVHlwZSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbWFuYWdlcicpLmdldFByb2Nlc3NJbmZvKDEpLk5hbWU7CgogICAgICAgICAgICBpZiAocGxhdGZvcm1UeXBlICE9ICdzeXN0ZW1kJyAmJiBwbGF0Zm9ybVR5cGUgIT0gJ2luaXQnKQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdub3JtYWxTdGFydCcpOyAvLyBVbmtub3duIFBsYXRmb3JtIFR5cGUsIHNvIHdlJ3JlIHByb2JhYmx5IG5vdCBhIHNlcnZpY2UNCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2twaWQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2twaWQuc3Rkb3V0LnJlc3VsdCA9ICcnOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrcGlkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnJlc3VsdCArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBzd2l0Y2gocGxhdGZvcm1UeXBlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja3BpZC5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgbW9kdWxlTmFtZSArICIgc3RhdHVzIHwgYXdrICd7cHJpbnQgJDR9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja3BpZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0YXR1cyAnICsgbW9kdWxlTmFtZSArICIgfCBncmVwICdNYWluIFBJRDonIHwgYXdrICd7cHJpbnQgJDN9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2twaWQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIGlmKHRoaXMuX2NoZWNrcGlkLnN0ZG91dC5yZXN1bHQgIT0gJycgJiYgcGFyc2VJbnQodGhpcy5fY2hlY2twaWQuc3Rkb3V0LnJlc3VsdCkgPT0gcHJvY2Vzcy5waWQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NlcnZpY2VT", 16000);
|
|
memcpy_s(_servicehost + 16000, 1684, "dGFydCcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ25vcm1hbFN0YXJ0Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCiAgICAgICAgewogICAgICAgICAgICAvLyBGaXJzdCBsZXQncyBmZXRjaCBhbGwgdGhlIFBJRHMgb2YgcnVubmluZyBzZXJ2aWNlcwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBsaXN0XG5leGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciB0b2tlbnMsIGk7CiAgICAgICAgICAgIHZhciBwID0ge307CiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJ1x0Jyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdICYmIHRva2Vuc1swXSAhPSAnLScpIHsgcFt0b2tlbnNbMF1dID0gdG9rZW5zWzBdOyB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHBbcHJvY2Vzcy5waWQudG9TdHJpbmcoKV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhIHNlcnZpY2UhCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NlcnZpY2VTdGFydCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdub3JtYWxTdGFydCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzZXJ2aWNlSG9zdDsKbW9kdWxlLmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQp7DQogICAgcmV0dXJuIChuZXcgc2VydmljZUhvc3Qob3B0aW9ucykpOw0KfTs=", 1684);
|
|
ILibBase64DecodeEx((unsigned char*)_servicehost, 17684, (unsigned char*)_servicehost + 17684);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "service-host"); duk_push_string(ctx, _servicehost + 17684);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_servicehost);
|
|
|
|
|
|
// service-manager, which on linux has a dependency on user-sessions and process-manager. Refer to /modules folder for human readable versions.
|
|
duk_peval_string_noresult(ctx, "addModule('process-manager', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgp2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKCi8vIFVzZWQgb24gV2luZG93cyBhbmQgTGludXggdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHJ1bm5pbmcgcHJvY2Vzc2VzCmZ1bmN0aW9uIHByb2Nlc3NNYW5hZ2VyKCkgewogICAgdGhpcy5fT2JqZWN0SUQgPSAncHJvY2Vzcy1tYW5hZ2VyJzsgLy8gVXNlZCBmb3IgZGVidWdnaW5nLCBhbGxvd3MgeW91IHRvIGdldCB0aGUgb2JqZWN0IHR5cGUgYXQgcnVudGltZS4KICAgIAogICAgLy8gU2V0dXAgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGNhbGxzLgogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgewogICAgICAgIGNhc2UgJ3dpbjMyJzoKICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TGFzdEVycm9yJyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90Jyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2VzczMyRmlyc3RXJyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2VzczMyTmV4dFcnKTsKICAgICAgICAgICAgYnJlYWs7CgljYXNlICdmcmVlYnNkJzoKICAgICAgICBjYXNlICdsaW51eCc6CiAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgdGhpcy5fY2hpbGRQcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyAocHJvY2Vzcy5wbGF0Zm9ybSArICcgbm90IHN1cHBvcnRlZCcpOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHRoaXMuZW51bWVyYXRlUHJvY2Vzc2VzID0gZnVuY3Rpb24gZW51bWVyYXRlUHJvY2Vzc2VzKCkKICAgIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgICAgICByZXQuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhwcykKICAgICAgICB7CiAgICAgICAgICAgIGNhbGxiYWNrLnByb20uX3Jlcyhwcyk7CiAgICAgICAgfQogICAgICAgIHJldC5jYWxsYmFjay5wcm9tID0gcmV0OwogICAgICAgIHRoaXMuZ2V0UHJvY2Vzc2VzKHJldC5jYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfQogICAgLy8gUmV0dXJuIGEgb2JqZWN0IG9mOiBwaWQgLT4gcHJvY2VzcyBpbmZvcm1hdGlvbi4KICAgIHRoaXMuZ2V0UHJvY2Vzc2VzID0gZnVuY3Rpb24gZ2V0UHJvY2Vzc2VzKGNhbGxiYWNrKQogICAgewogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93ICgnRW51bWVyYXRpbmcgcHJvY2Vzc2VzIG9uICcgKyBwcm9jZXNzLnBsYXRmb3JtICsgJyBub3Qgc3VwcG9ydGVkJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnd2luMzInOiAvLyBXaW5kb3dzIHByb2Nlc3NlcwogICAgICAgICAgICAgICAgdmFyIHBpZDsKICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5fa2VybmVsMzIuQ3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90KDIsIDApOwogICAgICAgICAgICAgICAgdmFyIGluZm8gPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZT09OCA/IDU2OCA6IDU1Nik7CiAgICAgICAgICAgICAgICBpbmZvLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShpbmZvLl9zaXplLCAwKTsKICAgICAgICAgICAgICAgIHZhciBuZXh0UHJvY2VzcyA9IHRoaXMuX2tlcm5lbDMyLlByb2Nlc3MzMkZpcnN0VyhoLCBpbmZvKTsKICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0UHJvY2Vzcy5WYWwpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBpZCA9IGluZm8uRGVyZWYoOCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW3BpZF0gPSB7IHBpZDogcGlkLCBjbWQ6IGluZm8uRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDM2IDogNDQsIDI2MCkuV2lkZTJVVEY4IH07CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWxbcGlkXS51c2VyID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocGlkKS5uYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlZSkKICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBuZXh0UHJvY2VzcyA9IHRoaXMuX2tlcm5lbDMyLlByb2Nlc3MzMk5leHRXKGgsIGluZm8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrLmFwcGx5KHRoaXMsIFtyZXRWYWxdKTsgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzogLy8gTGludXggcHJvY2Vzc2VzCiAgICAgICAgICAgICAgICB2YXIgcCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBwLnN0ZG91dC5zdHIgPSAnJzsgcC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgcC5zdGRlcnIuc3RyID0gJyc7IHAuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIHAuc3RkaW4ud3JpdGUoJ3BzIC1heCAtbyBwaWQgLW8gdXNlcjo5OSAtbyBjb21tYW5kIHwgdHIgJyArICInXFxuJyAnXFx0JyB8IGF3ayAtRiIgKyAnIlxcdCIgXCd7IHByaW50ZiAieyI7IGZvcihpPTI7aTxORjsrK2kpIHsgc3BsaXQoJGksdG9rLCIgIik7IHBpZD10b2tbMV07IHVzZXI9dG9rWzJdOyBjbWQ9c3Vic3RyKCRpLGxlbmd0aCh0b2tbMV0pKzEwMik7IGdzdWIoL1xcXFwvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoLyIvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoL15bIF0rLywiIixjbWQpOyBwcmludGYgIiVzXFwiJXNcXCI6e1xcInBpZFxcIjpcXCIlc1xcIixcXCJ1c2VyXFwiOlxcIiVzXFwiLFxcImNtZFxcIjpcXCIlc1xcIn0iLChpIT0yPyIsIjoiIikscGlkLHBpZCx1c2VyLGNtZDsgfSBwcmludGYgIn0iOyB9XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgcC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHAuYXJncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7IHAuYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH0KDQogICAgICAgICAgICAgICAgICAgIHAuYXJncy51bnNoaWZ0KEpTT04ucGFyc2UocC5zdGRvdXQuc3RyKSk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgcC5hcmdzKTsNCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6CiAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgICAgICAgICAgdmFyIHAgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgcC5zdGRvdXQuc3RyID0gJyc7IHAuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIHAuc3RkZXJyLnN0ciA9ICcnOyBwLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdwcyAtYXhvIHBpZCAtbyB1c2VyIC1vIGNvbW1hbmQgfCB0ciAnICsgIidcXG4nICdcXHQnIHwgYXdrIC1GIiArICciXFx0IiBcJ3sgcHJpbnRmICJ7IjsgZm9yKGk9MjtpPE5GOysraSkgeyBnc3ViKC9eWyBdKy8sIiIsJGkpOyBzcGxpdCgkaSx0b2ssIiAiKTsgcGlkPXRva1sxXTsgdXNlcj10b2tbMl07IGNtZD1zdWJzdHIoJGksbGVuZ3RoKHRva1sxXSkrbGVuZ3RoKHRva1syXSkrMik7IGdzdWIoL1xcXFwvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoLyIvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoL15bIF0rLywiIixjbWQpOyBwcmludGYgIiVzXFwiJXNcXCI6e1xcInBpZFxcIjpcXCIlc1xcIixcXCJ1c2VyXFwiOlxcIiVzXFwiLFxcImNtZFxcIjpcXCIlc1xcIn0iLChpIT0yPyIsIjoiIikscGlkLHBpZCx1c2VyLGNtZDsgfSBwcmludGYgIn0iOyB9XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgcC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHAuYXJncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7IHAuYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH0KDQogICAgICAgICAgICAgICAgICAgIHAuYXJncy51bnNoaWZ0KEpTT04ucGFyc2UocC5zdGRvdXQuc3RyKSk7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgcC5hcmdzKTsNCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIG9uIExpbnV4CiAgICB0aGlzLmdldFByb2Nlc3NJbmZvID0gZnVuY3Rpb24gZ2V0UHJvY2Vzc0luZm8ocGlkKQogICAgewogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93ICgnZ2V0UHJvY2Vzc0luZm8oKSBub3Qgc3VwcG9ydGVkIGZvciAnICsgcHJvY2Vzcy5wbGF0Zm9ybSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbGludXgnOgogICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgcGlkICsgJy9zdGF0dXMnKTsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0ge307CiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBzdGF0dXMudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiBsaW5lcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHsgdG9rZW5zWzFdID0gdG9rZW5zWzFdLnRyaW0oKTsgfQogICAgICAgICAgICAgICAgICAgIGluZm9bdG9rZW5zWzBdXSA9IHRva2Vuc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAoaW5mbyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9OwoKICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykKICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfcGdyZXAnLCB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzIHBncmVwIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgIH0pKCkNCiAgICAgICAgfSk7CgogICAgICAgIGlmICh0aGlzLl9wZ3JlcCAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5nZXRQcm9jZXNzID0gZnVuY3Rpb24gZ2V0UHJvY2VzcyhjbWQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBncmVwIGdub21lLXNlc3Npb24gfCB0ciAnXFxuJyAnXFx0JyB8IiArICcgYXdrIC1GIlxcdCIgXCd7IHByaW50ZiAiWyI7IGZvcihpPTE7aTxORjsrK2kpIHsgaWYoaT4xKSB7IHByaW50ZiAiLCI7IH0gcHJpbnRmICIlZCIsICRpOyB9IHByaW50ZiAiXSI7IH1cJycpOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZGVyci5zdHIgIT0gJycpIHsgdGhyb3cgKGNoaWxkLnN0ZGVyci5zdHIudHJpbSgpKTsgfQ0KICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJykgeyB0aHJvdyAoY21kICsgJyBub3QgZm91bmQnKTsgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIChKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy5nZXRQcm9jZXNzRXggPSBmdW5jdGlvbiBnZXRQcm9jZXNzRXgoY21kKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgncHMgLWF4IC1vIHBpZCAtbyBjb21tYW5kIHwgZ3JlcCAnICsgY21kICsgIiB8IHRyICdcXG4nICdcXHQnIHwgYXdrIC1GIiArICciXFx0IiBcJ3sgcHJpbnRmICJbIjsgZm9yKGk9MTtpPE5GOysraSkgeyBzcGxpdCgkaSxyLCIgIik7IGlmKHJbMl0hPSJncmVwIikgeyBpZihpPjEpIHsgcHJpbnRmICIsIjsgfSBwcmludGYgIiVzIiwgclsxXTsgfSB9IHByaW50ZiAiXSI7IH1cJycpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKGNtZCArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IHByb2Nlc3NNYW5hZ2VyKCk7Cv==', 'base64').toString());");
|
|
#if defined(_POSIX) && !defined(__APPLE__) && !defined(_FREEBSD)
|
|
duk_peval_string_noresult(ctx, "addModule('linux-dbus', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnRyeSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICJwZWVrIiwgeyB2YWx1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMubGVuZ3RoID4gMCA/IHRoaXNbdGhpcy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZCk7IH0gfSk7IH0gY2F0Y2ggKGUpIHsgfQoKCgpmdW5jdGlvbiBkYnVzKGFkZHJlc3MsIHVpZCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnbGludXgtZGJ1cyc7CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnc2lnbmFsJyk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgInVpZCIsIHsgdmFsdWU6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCIvYmluL3NoIiwgWyJzaCJdLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0sIHVpZDogdWlkID09IG51bGwgPyAtMSA6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkLnN0ZGluLndyaXRlKCdkYnVzLW1vbml0b3IgLS1zZXNzaW9uICJ0eXBlPVwnc2lnbmFsXCcsIGludGVyZmFjZT1cJycgKyBhZGRyZXNzICsgJ1wnIiB8ICggd2hpbGUgcmVhZCBYOyBkbyBlY2hvICIkWCI7IGRvbmUgKVxuJyk7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQuZGJ1cyA9IHRoaXM7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspCiAgICB7CiAgICAgICAgLy8gUGFyc2UgREJVUyBEYXRhCiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KSB7IHRoaXMucmVhZHkgPSB0cnVlOyByZXR1cm47IH0KCiAgICAgICAgdmFyIGxpbmVzID0gW107CiAgICAgICAgdmFyIHRva2VucyA9IGNodW5rLnRvU3RyaW5nKCkuc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHZhciBpIGluIHRva2VucykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0b2tlbnNbaV0gPT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEVuZCBvZiByZWNvcmQKICAgICAgICAgICAgICAgIHRoaXMuZGJ1cy5wcmVQYXJzZVJlY29yZHMobGluZXMpOwogICAgICAgICAgICAgICAgbGluZXMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxpbmVzLnB1c2godG9rZW5zW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgdGhpcy5wcmVQYXJzZVJlY29yZHMgPSBmdW5jdGlvbiAobGluZXMpCiAgICB7CiAgICAgICAgdmFyIHJlY29yZCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgaW4gbGluZXMpCiAgICAgICAgewogICAgICAgICAgICBpZihsaW5lc1tpXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKHJlY29yZC5sZW5ndGg+MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVjb3JkID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVjb3JkLnB1c2gobGluZXNbaV0pOwogICAgICAgIH0KICAgICAgICBpZiAocmVjb3JkLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMucGFyc2VSZWNvcmRzID0gZnVuY3Rpb24gKGxpbmVzKQogICAgewogICAgICAgIGlmIChsaW5lc1swXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2lnbmFsID0ge307CiAgICAgICAgICAgIHZhciBzaWd0b2tlbnMgPSBsaW5lc1swXS5zcGxpdCgnICcpOwogICAgICAgICAgICBzaWd0b2tlbnMuc2hpZnQoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc2lndG9rZW5zKSB7CiAgICAgICAgICAgICAgICB2YXIgc2lnaXRlbXMgPSBzaWd0b2tlbnNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgIGlmIChzaWdpdGVtcy5sZW5ndGggPT0gMikgewogICAgICAgICAgICAgICAgICAgIHNpZ25hbFtzaWdpdGVtc1swXV0gPSBzaWdpdGVtc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGluZXMuc2hpZnQoKTsKICAgICAgICAgICAgc2lnbmFsLmRhdGEgPSBsaW5lczsKCiAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwoc2lnbmFsKTsKICAgICAgICB9CiAgICB9CiAgICB0aGlzLnBhcnNlU2lnbmFsID0gZnVuY3Rpb24oc2lnbmFsKQogICAgewogICAgICAgIHZhciBkYXRhID0gc2lnbmFsLmRhdGE7CiAgICAgICAgc2lnbmFsLmRhdGEgPSBbXTsKCiAgICAgICAgZm9yKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkYXRhW2ldLnN0YXJ0c1dpdGgoJ2FycmF5ICcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaWduYWwuZGF0YS5wdXNoKFtdKTsKICAgICAgICAgICAgICAgIGZvcihpPWkrMTsgaTxkYXRhLmxlbmd0aDsgKytpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwyKGRhdGFbaV0sIHNpZ25hbC5kYXRhLnBlZWsoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU2lnbmFsMihkYXRhW2ldLCBzaWduYWwuZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuZW1pdCgnc2lnbmFsJywgc2lnbmFsKTsKICAgIH0KICAgIHRoaXMucGFyc2VTaWduYWwyID0gZnVuY3Rpb24gKGlucHV0U3RyLCBvdXRBcnJheSkKICAgIHsKICAgICAgICBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdzdHJpbmcgJykpCiAgICAgICAgewogICAgICAgICAgICBvdXRBcnJheS5wdXNoKEpTT04ucGFyc2UoaW5wdXRTdHIuc2xpY2UoNykpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdib29sZWFuICcpKQogICAgICAgIHsKICAgICAgICAgICAgb3V0QXJyYXkucHVzaChKU09OLnBhcnNlKGlucHV0U3RyLnNsaWNlKDgpKSk7CiAgICAgICAgfQogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IGRidXM7Cm1vZHVsZS5leHBvcnRzLmhhc1NlcnZpY2UgPSBmdW5jdGlvbiBoYXNTZXJ2aWNlKG5hbWUpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9zaGFyZS9kYnVzLTEvc2VydmljZXMvKi5zZXJ2aWNlIHwgZ3JlcCAiJyArIG5hbWUgKyAnIiB8IGF3ayAtRj0gXCd7IGlmKCAkMj09IicgKyBuYW1lICsgJyIgKSB7IHByaW50ICQyOyB9IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpICE9ICcnKTsNCn07Cv==', 'base64').toString());");
|
|
duk_peval_string_noresult(ctx, "addModule('linux-gnome-helpers', Buffer.from('DQoNCmZ1bmN0aW9uIGdub21lX2dldFByb3h5U2V0dGluZ3ModWlkKQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgeyBlbnY6IHsgSE9NRTogcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIodWlkKSB9fSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIGxpc3QtcmVjdXJzaXZlbHkgb3JnLmdub21lLnN5c3RlbS5wcm94eSB8IHRyICJcXG4iICJcXHwiIHwgdHIgIlxcXCciICJcXGAiIHwgYXdrIFwneyBjb3VudD1zcGxpdCgkMCwgcmVzLCAifCIpOycpDQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4Yz0iW10iOycpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdmb3IoYT0wO2E8Y291bnQ7KythKScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCd7Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NwbGl0KHJlc1thXSwgbW9kZWNoZWNrLCAiICIpOycpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpZihtb2RlY2hlY2tbMl0gPT0gIm1vZGUiKScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCd7Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NwbGl0KG1vZGVjaGVja1szXSwgcHJ4LCAiYCIpOyBtb2RlID0gcHJ4WzJdOycpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCd9Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lmKG1vZGVjaGVja1sxXT09Im9yZy5nbm9tZS5zeXN0ZW0ucHJveHkuaHR0cCIgJiYgbW9kZWNoZWNrWzJdPT0iaG9zdCIpIHsgc3BsaXQobW9kZWNoZWNrWzNdLCBoc3QsICJgIik7IGhvc3QgPSBoc3RbMl07IH0nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaWYobW9kZWNoZWNrWzFdPT0ib3JnLmdub21lLnN5c3RlbS5wcm94eS5odHRwIiAmJiBtb2RlY2hlY2tbMl09PSJwb3J0IikgeyBwb3J0ID0gbW9kZWNoZWNrWzNdOyB9Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lmKG1vZGVjaGVja1sxXT09Im9yZy5nbm9tZS5zeXN0ZW0ucHJveHkiICYmIG1vZGVjaGVja1syXT09Imlnbm9yZS1ob3N0cyIpIHsgZXhjID0gc3Vic3RyKHJlc1thXSwgMzYpOyBnc3ViKCJgIiwgIlxcIiIsIGV4Yyk7IH0nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnfScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdwcmludGYgIntcXCJtb2RlXFwiOiBcXCIlc1xcIiwgXFwiaG9zdFxcIjogXFwiJXNcXCIsIFxcInBvcnRcXCI6ICVzLCBcXCJleGNlcHRpb25zXFwiOiAlc30iLCBtb2RlLCBob3N0LCBwb3J0LCBleGM7IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgIH0NCiAgICBjYXRjaChlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICh7fSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBnbm9tZV9nZXREZXNrdG9wV2FsbHBhcGVyKHVpZCkNCnsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIHsgZW52OiB7IEhPTUU6IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRIb21lRm9sZGVyKHVpZCkgfSB9KTsNCiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIGdldCBvcmcuZ25vbWUuZGVza3RvcC5iYWNrZ3JvdW5kIHBpY3R1cmUtdXJpXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnZmlsZTovLycpLnBvcCgpOw0KICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLmVuZHNXaXRoKCciJykgfHwgY2hpbGQuc3Rkb3V0LnN0ci5lbmRzV2l0aCgiJyIpKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnN1YnN0cmluZygwLCBjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCAtIDEpKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGdub21lX3NldERlc2t0b3BXYWxscGFwZXIodWlkLCBmaWxlUGF0aCkNCnsNCiAgICBpZiAoIWZpbGVQYXRoKSB7IGZpbGVQYXRoID0gJy9kZXYvbnVsbCc7IH0NCg0KICAgIHZhciB2ID0geyBIT01FOiByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcih1aWQpIH07DQogICAgdmFyIHBpZHMgPSByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5nZXRQcm9jZXNzKCdnbm9tZS1zZXNzaW9uJyk7DQogICAgZm9yICh2YXIgaSBpbiBwaWRzKQ0KICAgIHsNCiAgICAgICAgdmFyIGUgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0RW52RnJvbVBpZChwaWRzW2ldKTsNCiAgICAgICAgaWYgKGUuVVNFUiAmJiByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VWlkKGUuVVNFUikhPXVpZCkNCiAgICAgICAgew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgdi5EQlVTX1NFU1NJT05fQlVTX0FERFJFU1MgPSBlLkRCVVNfU0VTU0lPTl9CVVNfQUREUkVTUzsNCiAgICAgICAgaWYgKHYuREJVU19TRVNTSU9OX0JVU19BRERSRVNTKSB7IGJyZWFrOyB9DQogICAgfQ0KDQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCB7IHVpZDogdWlkLCBlbnY6IHYgfSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIHNldCBvcmcuZ25vbWUuZGVza3RvcC5iYWNrZ3JvdW5kIHBpY3R1cmUtdXJpIGZpbGU6Ly8nICsgZmlsZVBhdGggKyAnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KfQ0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnZXRQcm94eVNldHRpbmdzOiBnbm9tZV9nZXRQcm94eVNldHRpbmdzLA0KICAgICAgICAgICAgICAgIGdldERlc2t0b3BXYWxscGFwZXI6IGdub21lX2dldERlc2t0b3BXYWxscGFwZXIsDQogICAgICAgICAgICAgICAgc2V0RGVza3RvcFdhbGxwYXBlcjogZ25vbWVfc2V0RGVza3RvcFdhbGxwYXBlcg0KICAgICAgICAgICAgfTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnX2xvY2F0aW9uJywgew0KICAgICAgICAgICAgdmFsdWU6IChmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBnc2V0dGluZ3MgfCBhd2sgJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICB9KSgpDQogICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdhdmFpbGFibGUnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX2xvY2F0aW9uICE9ICcnID8gdHJ1ZSA6IGZhbHNlKTsgfSB9KTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnc2NyaXB0VmVyc2lvbicsDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFsdWU6IChmdW5jdGlvbigpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0geyBtYWpvcjogMCwgbWlub3I6IDAgfTsNCiAgICAgICAgICAgICAgICAgICAgaWYocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2Jpbi9zY3JpcHQnKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uICgpIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2NyaXB0IC1WIHwgYXdrIFwneyBzcGxpdCgkTkYsIFQsICIuIik7IHByaW50ZiAie1xcIm1ham9yXFwiOiVzLCBcXCJtaW5vclxcIjolc30iLFRbMV0sVFsyXTsgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICh4KQ0KICAgICAgICAgICAgICAgICAgICAgICAgeyB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgIH0pKCkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBicmVhazsNCn0=', 'base64').toString());");
|
|
duk_peval_string_noresult(ctx, "addModule('linux-cpuflags', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCmNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Byb2MvY3B1aW5mbyB8IGdyZXAgZmxhZ3MgfCB0ciAnXFxuJyAnficgfCBhd2sgLUZ+ICd7IHByaW50ZiAiICsgJyJbIjsgZm9yKGk9MTtpPD1ORi0xOysraSkgeyBzcGxpdCgkaSwgbGluZSwgIjoiKTsgeD1zcGxpdChsaW5lWzJdLCB2YWxzLCAiICIpOyBwcmludGYgIiVzeyIsIChpIT0xPyIsIjoiIik7IGZvcihqPTE7ajw9eDsrK2opIHsgcHJpbnRmICIlc1xcIiVzXFwiOiAxIiwgKGohPTE/IiwiOiIiKSwgdmFsc1tqXTsgIH0gcHJpbnRmICJ9IjsgIH0gcHJpbnRmICJdIjsgfVwnXG5leGl0XG4nKTsNCmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KY2hpbGQud2FpdEV4aXQoKTsNCg0KaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCnsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgfQ0KICAgIGNhdGNoICh4KQ0KICAgIHsNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBudWxsOw0KICAgIH0NCn0NCmVsc2UNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9IG51bGw7DQp9DQoNCv==', 'base64').toString());");
|
|
#endif
|
|
char *_servicemanager = ILibMemory_Allocate(295205, 0, NULL, NULL);
|
|
memcpy_s(_servicemanager + 0, 168688, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7CgpmdW5jdGlvbiBmYWlsdXJlQWN0aW9uVG9JbnRlZ2VyKGFjdGlvbikKewogICAgdmFyIHJldDsKICAgIHN3aXRjaChhY3Rpb24pCiAgICB7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBjYXNlICdOT05FJzoKICAgICAgICAgICAgcmV0PTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1NFUlZJQ0VfUkVTVEFSVCc6CiAgICAgICAgICAgIHJldD0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdSRUJPT1QnOgogICAgICAgICAgICByZXQ9MjsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQoKZnVuY3Rpb24gZXh0cmFjdEZpbGVOYW1lKGZpbGVQYXRoKQp7CiAgICBpZiAodHlwZW9mIChmaWxlUGF0aCkgPT0gJ3N0cmluZycpCiAgICB7CiAgICAgICAgdmFyIHRva2VucyA9IGZpbGVQYXRoLnNwbGl0KCdcXCcpLmpvaW4oJy8nKS5zcGxpdCgnLycpOwogICAgICAgIHZhciBuYW1lOwoKICAgICAgICB3aGlsZSAoKG5hbWUgPSB0b2tlbnMucG9wKCkpID09ICcnKTsKICAgICAgICByZXR1cm4gKG5hbWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldHVybihmaWxlUGF0aC5uZXdOYW1lKQogICAgfQp9CmZ1bmN0aW9uIGV4dHJhY3RGaWxlU291cmNlKGZpbGVQYXRoKQp7CiAgICByZXR1cm4gKHR5cGVvZiAoZmlsZVBhdGgpID09ICdzdHJpbmcnID8gZmlsZVBhdGggOiBmaWxlUGF0aC5zb3VyY2UpOwp9CgpmdW5jdGlvbiBwYXJzZVNlcnZpY2VTdGF0dXModG9rZW4pCnsKICAgIHZhciBqID0ge307CiAgICB2YXIgc2VydmljZVR5cGUgPSB0b2tlbi5EZXJlZigwLCA0KS5JbnRWYWw7CiAgICBqLmlzRmlsZVN5c3RlbURyaXZlciA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKTsKICAgIGouaXNLZXJuZWxEcml2ZXIgPSAoKHNlcnZpY2VUeXBlICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSk7CiAgICBqLmlzU2hhcmVkUHJvY2VzcyA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKTsKICAgIGouaXNPd25Qcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApOwogICAgai5pc0ludGVyYWN0aXZlID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApOwogICAgai53YWl0SGludCA9IHRva2VuLkRlcmVmKCg2ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBzd2l0Y2ggKHRva2VuLkRlcmVmKCgxICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpCiAgICB7CiAgICAgICAgY2FzZSAweDAwMDAwMDA1OgogICAgICAgICAgICBqLnN0YXRlID0gJ0NPTlRJTlVFX1BFTkRJTkcnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDY6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUEFVU0VfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwNzoKICAgICAgICAgICAgai5zdGF0ZSA9ICdQQVVTRUQnOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMDAwMDQ6CiAgICAgICAgICAgIGouc3RhdGUgPSAnUlVOTklORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMjoKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVEFSVF9QRU5ESU5HJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAwMDAwMDAzOgogICAgICAgICAgICBqLnN0YXRlID0gJ1NUT1BfUEVORElORyc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAwMDAwMToKICAgICAgICAgICAgai5zdGF0ZSA9ICdTVE9QUEVEJzsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICB2YXIgY29udHJvbHNBY2NlcHRlZCA9IHRva2VuLkRlcmVmKCgyICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICBqLmNvbnRyb2xzQWNjZXB0ZWQgPSBbXTsKICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApCiAgICB7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EQUREJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5EUkVNT1ZFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERU5BQkxFJyk7CiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERElTQUJMRScpOwogICAgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwOCkgPT0gMHgwMDAwMDAwOCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BBUkFNQ0hBTkdFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMDIpID09IDB4MDAwMDAwMDIpIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QQVVTRScpOyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0NPTlRJTlVFJyk7IH0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAxMDApID09IDB4MDAwMDAxMDApIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9QUkVTSFVURE9XTicpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDA0KSA9PSAweDAwMDAwMDA0KSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0hVVERPV04nKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwMSkgPT0gMHgwMDAwMDAwMSkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1NUT1AnKTsgfQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAyMCkgPT0gMHgwMDAwMDAyMCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX0hBUkRXQVJFUFJPRklMRUNIQU5HRScpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDQwKSA9PSAweDAwMDAwMDQwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVCcpOyB9CiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDgwKSA9PSAweDAwMDAwMDgwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0VTU0lPTkNIQU5HRScpOyB9CiAgICBqLnBpZCA9IHRva2VuLkRlcmVmKCg3ICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CiAgICByZXR1cm4gKGopOwp9CgppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKewogICAgZnVuY3Rpb24gZ2V0T1NWZXJzaW9uKCkKICAgIHsKICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInN3X3ZlcnMgfCBncmVwIFByb2R1Y3RWZXJzaW9uIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAvL2NoaWxkLnN0ZG91dC5zdHIgPSAnMTAuOSc7CgogICAgICAgIHZhciByZXQgPSB7IHJhdzogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJy4nKSwgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLnJhdy5qb2luKCcuJykpOyB9IH07CiAgICAgICAgcmV0LmNvbXBhcmVUbyA9IGZ1bmN0aW9uIGNvbXBhcmVUbyh2YWwpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmF3ID0gKHR5cGVvZiAodmFsKSA9PSAnc3RyaW5nJykgPyB2YWwuc3BsaXQoJy4nKSA6IHZhbC5yYXc7IGlmICghcmF3KSB7IHRocm93ICgnSW52YWxpZCBwYXJhbWV0ZXInKTsgfQogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMucmF3LmpvaW4oJy4nKS5zcGxpdCgnLicpOwoKICAgICAgICAgICAgdmFyIHIgPSBudWxsLCBzID0gbnVsbDsKICAgICAgICAgICAgd2hpbGUgKHNlbGYubGVuZ3RoID4gMCAmJiByYXcubGVuZ3RoID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcyA9IHBhcnNlSW50KHNlbGYuc2hpZnQoKSk7IHIgPSBwYXJzZUludChyYXcuc2hpZnQoKSk7CiAgICAgICAgICAgICAgICBpZiAocyA8IHIpIHsgcmV0dXJuICgtMSk7IH0KICAgICAgICAgICAgICAgIGlmIChzID4gcikgeyByZXR1cm4gKDEpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGYubGVuZ3RoID09IHJhdy5sZW5ndGgpIHsgcmV0dXJuICgwKTsgfQogICAgICAgICAgICBpZiAoc2VsZi5sZW5ndGggPCByYXcubGVuZ3RoKSB7IHJldHVybiAoLTEpOyB9IGVsc2UgeyByZXR1cm4gKDEpOyB9ICAgIAogICAgICAgIH0KICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9OwoKCiAgICBmdW5jdGlvbiBmZXRjaFBsaXN0KGZvbGRlciwgbmFtZSwgdXNlcmlkKQogICAgewogICAgICAgIGlmIChmb2xkZXIuZW5kc1dpdGgoJy8nKSkgeyBmb2xkZXIgPSBmb2xkZXIuc3Vic3RyaW5nKDAsIGZvbGRlci5sZW5ndGggLSAxKTsgfQogICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH0sIF91aWQ6IHVzZXJpZCB9OwogICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgewogICAgICAgICAgICAvLyBCZWZvcmUgd2UgdGhyb3cgaW4gdGhlIHRvd2VsLCBsZXQncyBlbnVtZXJhdGUgYWxsIHRoZSBwbGlzdCBmaWxlcywgYW5kIHNlZSBpZiBvbmUgaGFzIGEgbWF0Y2hpbmcgbGFiZWwKICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhmb2xkZXIpOwogICAgICAgICAgICBmb3IgKHZhciBmaWxlIGluIGZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgZm9sZGVyICsgJy8nICsgZmlsZXNbZmlsZV0gKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09IG5hbWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0Lm5hbWUgPSBmaWxlc1tmaWxlXS5lbmRzV2l0aCgnLnBsaXN0JykgPyBmaWxlc1tmaWxlXS5zdWJzdHJpbmcoMCwgZmlsZXNbZmlsZV0ubGVuZ3RoIC0gNikgOiBmaWxlc1tmaWxlXTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnYWxpYXMnLCB7IHZhbHVlOiBuYW1lIH0pOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIGZpbGVzW2ZpbGVdIH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXQubmFtZSA9PSBuYW1lKSB7IHRocm93ICgnICcgKyAoZm9sZGVyLnNwbGl0KCdMYXVuY2hEYWVtb24nKS5sZW5ndGg+MSA/ICdMYXVuY2hEYWVtb24nIDogJ0xhdW5jaEFnZW50JykgKyAnICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOyB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JyB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2FsaWFzJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnZGFlbW9uJywgeyB2YWx1ZTogcmV0LnBsaXN0LnNwbGl0KCcvTGF1bmNoRGFlbW9ucy8nKS5sZW5ndGggPiAxID8gdHJ1ZSA6IGZhbHNlIH0pOwoKICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+V29ya2luZ0RpcmVjdG9yeTwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8L3N0cmluZz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPHN0cmluZz5cIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLmVuZHNXaXRoKCcvJykgPyBjaGlsZC5zdGRvdXQuc3RyLnN1YnN0cmluZygwLCBjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCAtIDEpIDogY2hpbGQuc3Rkb3V0LnN0cik7CiAgICAgICAgfTsKICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICB9OwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdfcnVuQXRMb2FkJywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2VlIGlmIHRoaXMgaXMgYW4gQXV0by1TdGFydGluZyBzZXJ2aWNlLCBpbiBvcmRlciB0byBmaWd1cmUgb3V0IGhvdyB0byBpbXBsZW1lbnQgJ3N0YXJ0JwogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+UnVuQXRMb2FkPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIi8+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxcIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkudG9VcHBlckNhc2UoKSA9PSAiVFJVRSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAnc3RhcnRUeXBlJywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYWVtb24pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuX3J1bkF0TG9hZCA/ICdBVVRPX1NUQVJUJyA6ICdERU1BTkRfU1RBUlQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnQVVUT19TVEFSVCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgIl9rZWVwQWxpdmUiLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7c3BsaXQoJDAsIGEsIFwiPGtleT5LZWVwQWxpdmU8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPFwiKTsgc3BsaXQoYlsyXSwgYywgXCI+XCIpOyAiKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiIGlmKGNbMV09PVwiZGljdFwiKXsgc3BsaXQoYVsyXSwgZCwgXCI8L2RpY3Q+XCIpOyBpZihzcGxpdChkWzFdLCB0cnV2YWwsIFwiPHRydWUvPlwiKT4xKSB7IHNwbGl0KHRydXZhbFsxXSwga24xLCBcIjxrZXk+XCIpOyBzcGxpdChrbjFbMl0sIGtuMiwgXCI8L2tleT5cIik7IHByaW50IGtuMlsxXTsgfSB9Iik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIiBlbHNlIHsgc3BsaXQoY1sxXSwga2EsIFwiL1wiKTsgaWYoa2FbMV09PVwidHJ1ZVwiKSB7cHJpbnQgXCJBTFdBWVNcIjt9IH0gfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIHJldC5nZXRQSUQgPSBmdW5jdGlvbiBnZXRQSUQodWlkLCBhc1N0cmluZykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgY29tbWFuZDsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQoKICAgICAgICAgICAgaWYgKGdldE9TVmVyc2lvbigpLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAibGF1bmNoY3RsIGxpc3QgfCBncmVwICciICsgdGhpcy5hbGlhcyArICInIHwgYXdrICd7IGlmKCQzPT1cIiIgKyB0aGlzLmFsaWFzICsgIlwiKXtwcmludCAkMTt9fSdcbmV4aXRcbiI7CiAgICAgICAgICAgICAgICBvcHRpb25zID0geyB1aWQ6IHVpZCB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHVpZCA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHByaW50IHN5c3RlbSB8IGdyZXAgIicgKyB0aGlzLmFsaWFzICsgJyIgfCBhd2sgXCd7IGlmKHNwbGl0KCQwLCB0bXAsICIgIik9PTMpIHsgaWYoJDM9PSInICsgdGhpcy5hbGlhcyArICciKSB7IHByaW50ICQxOyB9IH19XCdcbmV4aXRcbic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAg", 16000);
|
|
memcpy_s(_servicemanager + 16000, 152688, "ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9ICdsYXVuY2hjdGwgcHJpbnQgZ3VpLycgKyB1aWQgKyAnIHwgZ3JlcCAiJyArIHRoaXMuYWxpYXMgKyAnIiB8IGF3ayBcJ3sgaWYoc3BsaXQoJDAsIHRtcCwgIiAiKT09MykgeyBpZigkMz09IicgKyB0aGlzLmFsaWFzICsgJyIpIHsgcHJpbnQgJDE7IH0gfX1cJ1xuZXhpdFxuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGNvbW1hbmQpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgaWYgKGFzU3RyaW5nID09IG51bGwgfHwgYXNTdHJpbmcgIT0gdHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldC5pc0xvYWRlZCA9IGZ1bmN0aW9uIGlzTG9hZGVkKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFBJRCh1aWQsIHRydWUpICE9ICcnKTsKICAgICAgICB9OwogICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcodWlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UElEKHVpZCkgPiAwKTsKICAgICAgICB9OwogICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSh1aWQpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5nZXRQSUQodWlkKSA9PSBwcm9jZXNzLnBpZCk7CiAgICAgICAgfTsKICAgICAgICByZXQubG9hZCA9IGZ1bmN0aW9uIGxvYWQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpOwogICAgICAgICAgICB2YXIgdmVyID0gZ2V0T1NWZXJzaW9uKCk7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOwogICAgICAgICAgICB2YXIgY29tbWFuZCA9ICdsb2FkJzsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZGFlbW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZih1aWQhPW51bGwgfHwgdWlkIT0wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnTGF1bmNoRGFlbW9uIG11c3QgcnVuIGFzIHJvb3QnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1aWQgPT0gbnVsbCkgeyB1aWQgPSBzZWxmOyB9CiAgICAgICAgICAgICAgICBpZih2ZXIuY29tcGFyZVRvKCcxMC4xMCcpIDwgMCAmJiB1aWQgIT0gc2VsZiAmJiBzZWxmICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdPbiB0aGlzIHZlcnNpb24gb2YgTWFjT1MsIG11c3QgYmUgcm9vdCB0byBsb2FkIHRoaXMgc2VydmljZSBpbnRvIHRoZSBzcGVjaWZpZWQgdXNlciBzcGFjZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmVyLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2Jvb3RzdHJhcCBndWkvJyArIHVpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsICcgKyBjb21tYW5kICsgJyAnICsgdGhpcy5wbGlzdCArICdcblxleGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICB9OwogICAgICAgIHJldC51bmxvYWQgPSBmdW5jdGlvbiB1bmxvYWQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gbnVsbDsKICAgICAgICAgICAgdmFyIHYgPSBnZXRPU1ZlcnNpb24oKTsKICAgICAgICAgICAgdmFyIHNlbGYgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpOwogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIHVzZUJvb3RvdXQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQoKICAgICAgICAgICAgaWYodWlkIT1udWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodi5jb21wYXJlVG8oJzEwLjEwJykgPD0gMCAmJiBzZWxmID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBzd2l0Y2ggdG8gdXNlciBjb250ZXh0IHRvIHVubG9hZCB0aGUgc2VydmljZQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7IHVpZDogdWlkIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYodi5jb21wYXJlVG8oJzEwLjEwJykgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VsZiA9PSAwIHx8IHNlbGYgPT0gdWlkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgYm9vdG91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN1ZmZpY2llbnQgYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ05lZWRzIGVsZXZhdGVkIHByaXZpbGVnZXMnKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmID09IHVpZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCB1bmxvYWQsIGJlY3Vhc2Ugd2UgYXJlIGFscmVhZHkgaW4gdGhlIHJpZ2h0IGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3VmZmljaWVudCBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnTmVlZHMgZWxldmF0ZWQgcHJpdmlsZWdlcycpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihzZWxmID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYodi5jb21wYXJlVG8oJzEwLjEwJykgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGJvb3RvdXQKICAgICAgICAgICAgICAgICAgICAgICAgdXNlQm9vdG91dCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgdW5sb2FkCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJvb3RvdXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gSW5zdWZmaWNpZW50IGFjY2VzcwogICAgICAgICAgICAgICAgICAgIHRocm93ICgnTmVlZHMgZWxldmF0ZWQgcHJpdmlsZWdlcycpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBpZiAodXNlQm9vdG91dCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCBib290b3V0IGd1aS8nICsgdWlkICsgJyAnICsgdGhpcy5wbGlzdCArICdcbmV4aXRcbicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCB1bmxvYWQgJyArIHRoaXMucGxpc3QgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgIH07CiAgICAgICAgcmV0LnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHNlbGY7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPiAwICYmIHNlbGYgPT0gMCkgeyBvcHRpb25zID0geyB1aWQ6IHVpZCB9OyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmICE9IDAgJiYgdWlkICE9IHNlbGYpIHsgdGhyb3cgKCdDYW5ub3Qgc3RhcnQgTGF1bmNoQWdlbnQgaW50byBhbm90aGVyIHVzZXIgZG9tYWluIHdoaWxlIG5vdCByb290Jyk7IH0KICAgICAgICAgICAgaWYgKHRoaXMuZGFlbW9uICYmIHNlbGYgIT0gMCkgeyB0aHJvdyAoJ0Nhbm5vdCBzdGFydCBMYXVuY2hEYWVtb24gd2hpbGUgbm90IHJvb3QnKTsgfQoKICAgICAgICAgICAgdGhpcy5sb2FkKHVpZCk7CgogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIG9wdGlvbnMpOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgc3RhcnQgJyArIHRoaXMuYWxpYXMgKyAnXG5cZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgfTsKICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHZhciBzZWxmID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3VpZCAhPSBudWxsKSB7IHVpZCA9IHRoaXMuX3VpZDsgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGFlbW9uICYmIHVpZCA9PSBudWxsKSB7IHVpZCA9IHNlbGY7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhZW1vbiAmJiB1aWQgPiAwICYmIHNlbGYgPT0gMCkgeyBvcHRpb25zID0geyB1aWQ6IHVpZCB9OyB9CiAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID4gMCAmJiBzZWxmICE9IDAgJiYgdWlkICE9IHNlbGYpIHsgdGhyb3cgKCdDYW5ub3Qgc3RvcCBMYXVuY2hBZ2VudCBpbiBhbm90aGVyIHVzZXIgZG9tYWluIHdoaWxlIG5vdCByb290Jyk7IH0KICAgICAgICAgICAgaWYgKHRoaXMuZGFlbW9uICYmIHNlbGYgIT0gMCkgeyB0aHJvdyAoJ0Nhbm5vdCBzdG9wIExhdW5jaERhZW1vbiB3aGlsZSBub3Qgcm9vdCcpOyB9CgogICAgICAgICAgICBpZiAoISh0aGlzLl9rZWVwQWxpdmUgPT0gJ0NyYXNoZWQnIHx8IHRoaXMuX2tlZXBBbGl2ZSA9PSAnJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgdW5sb2FkIHRoZSBzZXJ2aWNlLCByYXRoZXIgdGhhbiBzdG9wcGluZyBpdCwgYmVjYXVzZSBvdGhlcndpc2UgaXQnbGwgbGlrZWx5IHJlc3RhcnQKICAgICAgICAgICAgICAgIHRoaXMudW5sb2FkKHVpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10sIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgc3RvcCAnICsgdGhpcy5hbGlhcyArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0aGlzLl91aWQgIT0gbnVsbCkgeyB1aWQgPSB0aGlzLl91aWQ7IH0KICAgICAgICAgICAgaWYgKGdldE9TVmVyc2lvbigpLmNvbXBhcmVUbygnMTAuMTAnKSA8IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYWVtb24gJiYgdWlkID09IG51bGwpIHsgdWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKTsgfQogICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSAnbGF1bmNoY3RsIHVubG9hZCAnICsgdGhpcy5wbGlzdCArICdcbmxhdW5jaGN0bCBsb2FkICcgKyB0aGlzLnBsaXN0ICsgJ1xubGF1bmNoY3RsIHN0YXJ0ICcgKyB0aGlzLmFsaWFzICsgJ1xuZXhpdFxuJzsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgeyBkZXRhY2hlZDogdHJ1ZSwgdWlkOiB1aWQgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoY29tbWFuZCk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSB0aGlzLmRhZW1vbiA/ICgnc3lzdGVtLycgKyB0aGlzLmFsaWFzKSA6ICgnZ3VpLycgKyAodWlkICE9IG51bGwgPyB1aWQgOiByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuU2VsZigpKSArICcvJyArIHRoaXMuYWxpYXMpOwogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIGtpY2tzdGFydCAtayAnICsgY29tbWFuZCArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfTsKfQoKCgpmdW5jdGlvbiBzZXJ2aWNlTWFuYWdlcigpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3NlcnZpY2UtbWFuYWdlcic7CiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKSAKICAgIHsKICAgICAgICB0aGlzLkdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICAgICAgdGhpcy5wcm94eSA9IHRoaXMuR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0FkdmFwaTMyLmRsbCcpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdPcGVuU0NNYW5hZ2VyQScpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdFbnVtU2VydmljZXNTdGF0dXNFeFcnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnT3BlblNlcnZpY2VXJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZVN0YXR1c0V4Jyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ1F1ZXJ5U2VydmljZUNvbmZpZ0EnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnUXVlcnlTZXJ2aWNlQ29uZmlnMkEnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ29udHJvbFNlcnZpY2UnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnU3RhcnRTZXJ2aWNlQScpOwogICAgICAgIHRoaXMucHJveHkuQ3JlYXRlTWV0aG9kKCdDbG9zZVNlcnZpY2VIYW5kbGUnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ3JlYXRlU2VydmljZVcnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQ2hhbmdlU2VydmljZUNvbmZpZzJXJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0RlbGV0ZVNlcnZpY2UnKTsKICAgICAgICB0aGlzLnByb3h5LkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0NoZWNrVG9rZW5NZW1iZXJzaGlwJyk7CiAgICAgICAgdGhpcy5wcm94eS5DcmVhdGVNZXRob2QoJ0ZyZWVTaWQnKTsKCiAgICAgICAgdGhpcy5wcm94eTIgPSB0aGlzLkdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsKICAgICAgICB0aGlzLnByb3h5Mi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwoKICAgICAgICB0aGlzLmlzQWRtaW4gPSBmdW5jdGlvbiBpc0FkbWluKCkgewogICAgICAgICAgICB2YXIgTlRBdXRob3JpdHkgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKDYpOwogICAgICAgICAgICBOVEF1dGhvcml0eS50b0J1ZmZlcigpLndyaXRlSW50OCg1LCA1KTsKICAgICAgICAgICAgdmFyIEFkbWluaXN0cmF0b3JzR3JvdXAgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGFkbWluID0gZmFsc2U7CgogICAgICAgICAgICBpZiAodGhpcy5wcm94eS5BbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoTlRBdXRob3JpdHksIDIsIDMyLCA1NDQsIDAsIDAsIDAsIDAsIDAsIDAsIEFkbWluaXN0cmF0b3JzR3JvdXApLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5HTS5DcmVhdGVJbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5DaGVja1Rva2VuTWVtYmVyc2hpcCgwLCBBZG1pbmlzdHJhdG9yc0dyb3VwLkRlcmVmKCksIG1lbWJlcikuVmFsICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlci50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpICE9IDApIHsgYWRtaW4gPSB0cnVlOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnByb3h5LkZyZWVTaWQoQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWRtaW47CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldFByb2dyYW1Gb2xkZXIgPSBmdW5jdGlvbiBnZXRQcm9ncmFtRm9sZGVyKCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gNjQgYml0IFdpbmRvd3MKICAgICAgICAgICAgICAgIGlmICh0aGlzLkdNLlBvaW50ZXJTaXplID09IDQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMoeDg2KSddOyAgICAvLyAzMiBCaXQgQXBwCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydQcm9ncmFtRmlsZXMnXTsgICAgICAgICAgICAgLy8gNjQgYml0IEFwcAogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAzMiBiaXQgV2luZG93cwogICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ1Byb2dyYW1GaWxlcyddOyAgICAgICAgICAgICAgICAgCiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldFNlcnZpY2VGb2xkZXIgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlRm9sZGVyKCkgeyByZXR1cm4gdGhpcy5nZXRQcm9ncmFtRm9sZGVyKCkgKyAnXFxtZXNoJzsgfTsKCiAgICAgICAgdGhpcy5lbnVtZXJhdGVTZXJ2aWNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbWFjaGluZU5hbWUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIo", 16000);
|
|
memcpy_s(_servicemanager + 32000, 136688, "KTsKICAgICAgICAgICAgdmFyIGRiTmFtZSA9IHRoaXMuR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgaGFuZGxlID0gdGhpcy5wcm94eS5PcGVuU0NNYW5hZ2VyQSgweDAwLCAweDAwLCAweDAwMDEgfCAweDAwMDQpOwoKICAgICAgICAgICAgdmFyIGJ5dGVzTmVlZGVkID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBzZXJ2aWNlc1JldHVybmVkID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciByZXN1bWVIYW5kbGUgPSB0aGlzLkdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgLy92YXIgc2VydmljZXMgPSB0aGlzLnByb3h5LkNyZWF0ZVZhcmlhYmxlKDI2MjE0NCk7CiAgICAgICAgICAgIHZhciBzdWNjZXNzID0gdGhpcy5wcm94eS5FbnVtU2VydmljZXNTdGF0dXNFeFcoaGFuZGxlLCAwLCAweDAwMDAwMDMwLCAweDAwMDAwMDAzLCAweDAwLCAweDAwLCBieXRlc05lZWRlZCwgc2VydmljZXNSZXR1cm5lZCwgcmVzdW1lSGFuZGxlLCAweDAwKTsKCiAgICAgICAgICAgIHZhciBwdHJTaXplID0gZGJOYW1lLl9zaXplOwogICAgICAgICAgICB2YXIgc3ogPSBieXRlc05lZWRlZC5EZXJlZigwLCBkYk5hbWUuX3NpemUpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7CgogICAgICAgICAgICBpZiAoc3ogPCAwKSB7IHRocm93ICgnZXJyb3IgZW51bWVyYXRpbmcgc2VydmljZXMnKTsgfQoKICAgICAgICAgICAgdmFyIHNlcnZpY2VzID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShzeik7CiAgICAgICAgICAgIHRoaXMucHJveHkuRW51bVNlcnZpY2VzU3RhdHVzRXhXKGhhbmRsZSwgMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAwMywgc2VydmljZXMsIHN6LCBieXRlc05lZWRlZCwgc2VydmljZXNSZXR1cm5lZCwgcmVzdW1lSGFuZGxlLCAweDAwKTsKCiAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSAzNiArICgyICogcHRyU2l6ZSk7CiAgICAgICAgICAgIGJsb2NrU2l6ZSArPSAoKHB0clNpemUgLSAoYmxvY2tTaXplICUgcHRyU2l6ZSkpICUgcHRyU2l6ZSk7CiAgICAgICAgICAgIHZhciByZXRWYWwgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlc1JldHVybmVkLkRlcmVmKDAsIGRiTmFtZS5fc2l6ZSkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsgKytpKQp7CiAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBzZXJ2aWNlcy5EZXJlZihpICogYmxvY2tTaXplLCBibG9ja1NpemUpOwogICAgICAgICAgICAgICAgdmFyIGogPSB7fTsKICAgICAgICAgICAgICAgIGoubmFtZSA9IHRva2VuLkRlcmVmKDAsIHB0clNpemUpLkRlcmVmKCkuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgai5kaXNwbGF5TmFtZSA9IHRva2VuLkRlcmVmKHB0clNpemUsIHB0clNpemUpLkRlcmVmKCkuV2lkZTJVVEY4OwogICAgICAgICAgICAgICAgai5zdGF0dXMgPSBwYXJzZVNlcnZpY2VTdGF0dXModG9rZW4uRGVyZWYoMiAqIHB0clNpemUsIDM2KSk7CiAgICAgICAgICAgICAgICByZXRWYWwucHVzaChqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUobmFtZSwgeyB3aWRlOiB0cnVlIH0pOwogICAgICAgICAgICB2YXIgcHRyID0gdGhpcy5HTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUocHRyLl9zaXplKTsKICAgICAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMucHJveHkuT3BlblNDTWFuYWdlckEoMHgwMCwgMHgwMCwgMHgwMDAxIHwgMHgwMDA0IHwgMHgwMDIwIHwgMHgwMDEwKTsKICAgICAgICAgICAgaWYgKGhhbmRsZS5WYWwgPT0gMCkgeyB0aHJvdyAoJ2NvdWxkIG5vdCBvcGVuIFNlcnZpY2VNYW5hZ2VyJyk7IH0KICAgICAgICAgICAgdmFyIGggPSB0aGlzLnByb3h5Lk9wZW5TZXJ2aWNlVyhoYW5kbGUsIHNlcnZpY2VOYW1lLCAweDAwMDEgfCAweDAwMDIgfCAweDAwMDQgfCAweDAwMjAgfCAweDAwMTAgfCAweDAwMDEwMDAwKTsKICAgICAgICAgICAgaWYgKGguVmFsICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSB7IF9PYmplY3RJRDogJ3NlcnZpY2UtbWFuYWdlci5zZXJ2aWNlJyB9CiAgICAgICAgICAgICAgICByZXRWYWwuX3NjbSA9IGhhbmRsZTsKICAgICAgICAgICAgICAgIHJldFZhbC5fc2VydmljZSA9IGg7CiAgICAgICAgICAgICAgICByZXRWYWwuX0dNID0gdGhpcy5HTTsKICAgICAgICAgICAgICAgIHJldFZhbC5fcHJveHkgPSB0aGlzLnByb3h5OwogICAgICAgICAgICAgICAgcmV0VmFsLl9wcm94eTIgPSB0aGlzLnByb3h5MjsKICAgICAgICAgICAgICAgIHJldFZhbC5uYW1lID0gbmFtZTsKCiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnc3RhdHVzJywgCiAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlc05lZWRlZCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKHRoaXMuX0dNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5LlF1ZXJ5U2VydmljZVN0YXR1c0V4KHRoaXMuX3NlcnZpY2UsIDAsIDAsIDAsIGJ5dGVzTmVlZGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdCA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKGJ5dGVzTmVlZGVkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5LlF1ZXJ5U2VydmljZVN0YXR1c0V4KHRoaXMuX3NlcnZpY2UsIDAsIHN0LCBzdC5fc2l6ZSwgYnl0ZXNOZWVkZWQpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihwYXJzZVNlcnZpY2VTdGF0dXMoc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHsgc3RhdGU6ICdVTktOT1dOJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ2luc3RhbGxlZEJ5JywKICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ocmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgdGhpcy5uYW1lLCAnX0luc3RhbGxlZEJ5JykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCh4eCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuc3RhdHVzLnN0YXRlICE9ICdVTktOT1dOJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXRWYWwpOwogICAgICAgICAgICAgICAgICAgIHJldFZhbC5jbG9zZSA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9zZXJ2aWNlICYmIHRoaXMuX3NjbSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKHRoaXMuX3NlcnZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKHRoaXMuX3NjbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlID0gdGhpcy5fc2NtID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLm9uKCd+JywgcmV0VmFsLmNsb3NlKTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuaXNNZSA9IGZ1bmN0aW9uIGlzTWUoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludCh0aGlzLnN0YXR1cy5waWQpID09IHByb2Nlc3MucGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mYWlsdXJlQWN0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSh0aGlzLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMubGVuZ3RoICogOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZW4qc2l6ZW9mKFNDX0FDVElPTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zLmxlbmd0aCAmJiBpIDwgMzsgKytpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuRGVyZWYoaSo4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZmFpbHVyZUFjdGlvblRvSW50ZWdlcih0aGlzLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnNbaV0udHlwZSkpOyAgIC8vIFNDX0FDVElPTltpXS50eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZig0KyhpKjgpLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodGhpcy5mYWlsdXJlQWN0aW9ucy5hY3Rpb25zW2ldLmRlbGF5KTsgICAgICAgICAgICAgICAgICAgICAgLy8gU0NfQUNUSU9OW2ldLmRlbGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWRGYWlsdXJlQWN0aW9ucyA9IHRoaXMuX0dNLkNyZWF0ZVZhcmlhYmxlKDQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemVvZihTRVJWSUNFX0ZBSUxVUkVfQUNUSU9OUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGYWlsdXJlQWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUodGhpcy5mYWlsdXJlQWN0aW9ucy5yZXNldFBlcmlvZCk7ICAgIC8vIGR3UmVzZXRQZXJpb2QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGYWlsdXJlQWN0aW9ucy5EZXJlZih0aGlzLl9HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMjQgOiAxMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHRoaXMuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5sZW5ndGgpOyAvLyBjQWN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5wb2ludGVyQnVmZmVyKCkuY29weSh1cGRhdGVkRmFpbHVyZUFjdGlvbnMuRGVyZWYodGhpcy5fR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuX0dNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm94eS5DaGFuZ2VTZXJ2aWNlQ29uZmlnMlcodGhpcy5fc2VydmljZSwgMiwgdXBkYXRlZEZhaWx1cmVBY3Rpb25zKS5WYWwgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdygnVW5hYmxlIHRvIHNldCBGYWlsdXJlQWN0aW9ucy4uLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXRoID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFwnICsgdGhpcy5uYW1lLCAnSW1hZ2VQYXRoJykudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IGltYWdlUGF0aC5zcGxpdCgnLmV4ZScpWzBdICsgJy5leGUnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0LnN0YXJ0c1dpdGgoJyInKSkgeyByZXQgPSByZXQuc3Vic3RyaW5nKDEpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICByZXRWYWwuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5hcHBMb2NhdGlvbigpLnNwbGl0KCdcXCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodG9rZW5zLmpvaW4oJ1xcJykpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmlzUnVubmluZyA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuc3RhdHVzLnN0YXRlID09ICdSVU5OSU5HJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9zdG9wRXggPSBmdW5jdGlvbihzLCBwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBzLnN0YXR1cy5zdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTVE9QUEVEJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLl9yZXMoJ1NUT1BQRUQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NUT1BfUEVORElORyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5fZWxhcHNlZFRpbWUgPSBEYXRlLm5vdygpIC0gcC5fc3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLl9lbGFwc2VkVGltZSA8IDEwMDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50aW1lciA9IHNldFRpbWVvdXQocy5fc3RvcEV4LCBwLl93YWl0VGltZSwgcywgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlaigndGltZW91dCB3YWl0aW5nIGZvciBzZXJ2aWNlIHRvIHN0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuX3JlaignVW5leHBlY3RlZCBzdGF0ZTogJyArIGN1cnJlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RvcCA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLnN0YXRlID09ICdSVU5OSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3c3RhdGUgPSB0aGlzLl9HTS5DcmVhdGVWYXJpYWJsZSgzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVhc29uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fcHJveHkuQ29udHJvbFNlcnZpY2UodGhpcy5fc2VydmljZSwgMHgwMDAwMDAwMSwgbmV3c3RhdGUpLlZhbCA9PSAwICYmIChyZWFzb24gPSB0aGlzLl9wcm94eTIuR2V0TGFzdEVycm9yKCkuVmFsKSE9MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3Jlaih0aGlzLm5hbWUgKyAnLnN0b3AoKSBmYWlsZWQgd2l0aCBlcnJvcjogJyArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gc2V0dXAgYSB0aW1lZCBjYWxsYmFjayB0byBjaGVjayB0aGUgc3RhdHVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9zdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fZWxhcHNlZFRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fd2FpdFRpbWUgPSBzdGF0dXMud2FpdEhpbnQgLyAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0Ll93YWl0VGltZSA8IDUwMCkgeyByZXQuX3dhaXRUaW1lID0gNTAwOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5fd2FpdFRpbWUgPiA1MDAwKSB7IHJldC5fd2FpdFRpbWUgPSA1MDAwOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnRpbWVyID0gc2V0VGltZW91dCh0aGlzLl9zdG9wRXgsIHJldC5fd2FpdFRpbWUsIHRoaXMsIHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignY2Fubm90IGNhbGwgJyArIHRoaXMubmFtZSArICcuc3RvcCgpLCB3aGVuIGN1cnJlbnQgc3RhdGUgaXM6ICcgKyB0aGlzLnN0YXR1cy5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnQgPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzLnN0YXRlID09ICdTVE9QUEVEJykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSB0aGlzLl9wcm94eS5TdGFydFNlcnZpY2VBKHRoaXMuX3NlcnZpY2UsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAodGhpcy5uYW1lICsgJy5zdGFydCgpIGZhaWxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKCdjYW5ub3QgY2FsbCAnICsgdGhpcy5uYW1lICsgJy5zdGFydCgpLCB3aGVuIGN1cnJlbnQgc3RhdGUgaXM6ICcgKyB0aGlzLnN0YXR1cy5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJlc3RhcnQgPSBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byByZXN0YXJ0IG91cnNlbHZlcyBvbiBXaW5kb3dzLCB3ZSBtdXN0IHNwYXduIGEgZGV0YWNoZWQgY2hpbGQgcHJvY2VzcywgYmVjdWFzZSB3ZSBuZWVkIHRvIGNhbGwgc3RhcnQsIG9uY2Ugd2UgYXJlIHN0b3BwZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZXhlY1BhdGgsIFtwcm9jZXNzLmV4ZWNQYXRoLnNwbGl0KCdcXCcpLnBvcCgpLCAnLWV4ZWMgIicgKyAicmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKCciICsgdGhpcy5uYW1lICsgIicpLnJlc3RhcnQoKS5maW5hbGx5KGZ1bmN0aW9uKCl7cHJvY2Vzcy5leGl0KCk7fSk7IiArICciJ10sIHsgdHlwZTogNCwgZGV0YWNoZWQ6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zdGFydHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9hID0gYTsgdGhpcy5fciA9IHI7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXJ2aWNlID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg", 16000);
|
|
memcpy_s(_servicemanager + 48000, 120688, "ICAgICAgdGhpcy5zZXJ2aWNlLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydHAuX3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydHAuX2EoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7IGNvbnNvbGUucmF3TG9nKCdzdG9wKCkgZmFpbGVkID0+ICcgKyBlLnRvU3RyaW5nKCkpO30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwLnN0YXJ0cCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWdBKGgsIDAsIDAsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2EgPSB0aGlzLkdNLkNyZWF0ZVZhcmlhYmxlKHF1ZXJ5X3NlcnZpY2VfY29uZmlnYV9EV09SRC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWdBKGgsIHF1ZXJ5X3NlcnZpY2VfY29uZmlnYSwgcXVlcnlfc2VydmljZV9jb25maWdhLl9zaXplLCBxdWVyeV9zZXJ2aWNlX2NvbmZpZ2FfRFdPUkQpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gcXVlcnlfc2VydmljZV9jb25maWdhLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gNCA/IDI4IDogNDgsIHRoaXMuR00uUG9pbnRlclNpemUpLkRlcmVmKCkuU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ3VzZXInLCB7IHZhbHVlOiB2YWwgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocXVlcnlfc2VydmljZV9jb25maWdhLkRlcmVmKDQsNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0YXJ0VHlwZSA9ICdBVVRPX1NUQVJUJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuc3RhcnRUeXBlID0gJ0RFTUFORF9TVEFSVCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnN0YXJ0VHlwZSA9ICdESVNBQkxFRCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWx1cmVhY3Rpb25zID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSg4MTkyKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYm5lZWRlZCA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNCk7ICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm94eS5RdWVyeVNlcnZpY2VDb25maWcyQShoLCAyLCBmYWlsdXJlYWN0aW9ucywgODE5MiwgYm5lZWRlZCkuVmFsICE9IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY0FjdGlvbnMgPSBmYWlsdXJlYWN0aW9ucy50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSh0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAyNCA6IDEyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5mYWlsdXJlQWN0aW9ucy5yZXNldFBlcmlvZCA9IGZhaWx1cmVhY3Rpb25zLkRlcmVmKDAsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGFjdCA9IDAgOyBhY3QgPCBjQWN0aW9uczsgKythY3QpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBmYWlsdXJlYWN0aW9ucy5EZXJlZih0aGlzLkdNLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDE2LCB0aGlzLkdNLlBvaW50ZXJTaXplKS5EZXJlZigpLkRlcmVmKGFjdCo4LDgpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYWN0aW9uLnJlYWRVSW50MzJMRSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdOT05FJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ1NFUlZJQ0VfUkVTVEFSVCcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmZhaWx1cmVBY3Rpb25zLmFjdGlvbnMucHVzaCh7IHR5cGU6ICdSRUJPT1QnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wdXNoKHsgdHlwZTogJ09USEVSJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuZmFpbHVyZUFjdGlvbnMuYWN0aW9ucy5wZWVrKCkuZGVsYXkgPSBhY3Rpb24ucmVhZFVJbnQzMkxFKDQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5wcm94eS5DbG9zZVNlcnZpY2VIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgdGhyb3cgKCdjb3VsZCBub3QgZmluZCBzZXJ2aWNlOiAnICsgbmFtZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vIExpbnV4LCBNYWNPUywgRnJlZUJTRAoKICAgICAgICB0aGlzLmlzQWRtaW4gPSBmdW5jdGlvbiBpc0FkbWluKCkgCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5pc1Jvb3QoKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmdldFNlcnZpY2UgPSBmdW5jdGlvbiBnZXRTZXJ2aWNlKG5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWV9OwogICAgICAgICAgICAgICAgaWYocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL3JjLmQvJyArIG5hbWUpKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAncmMnLCB7IHZhbHVlOiAnL2V0Yy9yYy5kLycgKyBuYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZihyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG5hbWUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdyYycsIHsgdmFsdWU6ICcvdXNyL2xvY2FsL2V0Yy9yYy5kLycgKyBuYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnU2VydmljZTogJyArIG5hbWUgKyAnIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgInN0YXJ0VHlwZSIsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHJjdmFyIHwgZ3JlcCBfZW5hYmxlPSB8IGF3ayBcJ3sgYT1zcGxpdCgkMCwgYiwgIlxcIiIpOyBpZihiWzJdPT0iWUVTIikgeyBwcmludCAiWUVTIjsgfSB9XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyAnREVNQU5EX1NUQVJUJyA6ICdBVVRPX1NUQVJUJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwIGRlc2M9IHwgYXdrIC1GPSAnIiArICd7IGlmKCQxPT0iZGVzYyIpIHsgJDE9IiI7IGE9c3BsaXQoJDAsIHJlcywgIlxcIiIpOyBpZihhPjEpIHsgcHJpbnQgcmVzWzJdOyB9IGVsc2UgeyBwcmludCAkMDsgfSB9IH1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5yYyArICIgfCBncmVwICIgKyB0aGlzLm5hbWUgKyAiX2NoZGlyPSB8IGF3ayAtRj0gJ3sgcHJpbnQgJDIgfScgfCBhd2sgLUZcXFwiICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgICAgICByZXQgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZihyZXQgPT0gJycpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJjLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LmpvaW4oJy8nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uIGFwcExvY2F0aW9uKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwoJCSAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyB0aGlzLnJjICsgIiB8IGdyZXAgY29tbWFuZD0gfCBhd2sgLUY9ICd7IHByaW50ICQyIH0nIHwgYXdrIC1GXFxcIiAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCQkgICAgICAgICAgICB2YXIgdG1wID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJyR7bmFtZX0nKS5qb2luKHRoaXMubmFtZSk7CgkJICAgICAgICAgICAgaWYodG1wPT0nL3Vzci9zYmluL2RhZW1vbicpCgkJICAgICAgICAgICAgewoJCQkgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CgkJCSAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKCQkJICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAnICsgdGhpcy5yYyArICcgfCBncmVwIGNvbW1hbmRfYXJncz0gfCBhd2sgLUYiLWYgIiBcJ3sgJDE9IiI7IHNwbGl0KCQwLCByZXMsICJcXCIiKTsgc3BsaXQocmVzWzFdLCB0LCAiICIpOyBwcmludCB0WzFdOyB9XCdcbmV4aXRcbicpOwoJCQkgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoJCQkgICAgICAgICAgICByZXR1cm4oY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgCQkgICAgICAgIH0KCQkgICAgICAgICAgICBlbHNlCgkJICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKCQkgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LmlzUnVubmluZyA9IGZ1bmN0aW9uIGlzUnVubmluZygpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhdHVzIHwgYXdrICd7IHByaW50ICQzIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ3J1bm5pbmcnKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuaXNNZSA9IGZ1bmN0aW9uIGlzTWUoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzZXJ2aWNlICIgKyB0aGlzLm5hbWUgKyAiIG9uZXN0YXR1cyB8IGF3ayAneyBzcGxpdCgkNiwgcmVzLCBcIi5cIik7IHByaW50IHJlc1sxXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RvcFxuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInNlcnZpY2UgIiArIHRoaXMubmFtZSArICIgb25lc3RhcnRcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBvbmVyZXN0YXJ0XG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gZ2V0U2VydmljZShuYW1lKSB7IHJldHVybiAoZmV0Y2hQbGlzdCgnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucycsIG5hbWUpKTsgfTsKICAgICAgICAgICAgdGhpcy5nZXRMYXVuY2hBZ2VudCA9IGZ1bmN0aW9uIGdldExhdW5jaEFnZW50KG5hbWUsIHVzZXJpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHVzZXJpZCA9PSBudWxsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmV0Y2hQbGlzdCgnL0xpYnJhcnkvTGF1bmNoQWdlbnRzJywgbmFtZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmV0Y2hQbGlzdChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0SG9tZUZvbGRlcihyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0VXNlcm5hbWUodXNlcmlkKSkgKyAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzJywgbmFtZSwgdXNlcmlkKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSwgcGxhdGZvcm0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghcGxhdGZvcm0pIHsgcGxhdGZvcm0gPSB0aGlzLmdldFNlcnZpY2VUeXBlKCk7IH0KICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IG5hbWU6IG5hbWUsIGNsb3NlOiBmdW5jdGlvbiAoKSB7IH0sIHNlcnZpY2VUeXBlOiBwbGF0Zm9ybX07CiAgICAgICAgICAgICAgICBzd2l0Y2gocGxhdGZvcm0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC5kLycgKyBuYW1lKSkgeyBwbGF0Zm9ybSA9ICdpbml0JzsgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKSkgeyBwbGF0Zm9ybSA9ICd1cHN0YXJ0JzsgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBsYXRmb3JtID09ICdpbml0JyAmJiByZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC5kLycg", 16000);
|
|
memcpy_s(_servicemanager + 64000, 104688, "KyBuYW1lKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbGF0Zm9ybSA9PSAndXBzdGFydCcgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb25mID0gKHBsYXRmb3JtID09ICd1cHN0YXJ0JyA/ICgnL2V0Yy9pbml0JyArIG5hbWUgKyAnLmNvbmYnKSA6ICgnL2V0Yy9pbml0LmQvJyArIG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zZXJ2aWNlVHlwZSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgInN0YXJ0VHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2VUeXBlID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0ICcgKyB0aGlzLmNvbmYgKyAnIHwgZ3JlcCAic3RhcnQgb24gcnVubGV2ZWwiXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZmluZCAvZXRjL3JjKiAtbWF4ZGVwdGggMiAtdHlwZSBsIC1scyB8IGdyZXAgIiAuLi9pbml0LmQvJyArIHRoaXMubmFtZSArICciIHwgYXdrIC1GIi0+ICIgXCd7IGlmKCQyPT0iLi4vaW5pdC5kLycgKyB0aGlzLm5hbWUgKyAnIikgeyBwcmludCAidHJ1ZSI7IH0gfVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gJ0RFTUFORF9TVEFSVCcgOiAnQVVUT19TVEFSVCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZXNjcmlwdGlvbi5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCBkZXNjcmlwdGlvbiB8IGF3ayAnIiArICd7IGlmKCQxPT0iZGVzY3JpcHRpb24iKSB7ICQxPSIiOyBhPXNwbGl0KCQwLCByZXMsICJcXCIiKTsgaWYoYT4xKSB7IHByaW50IHJlc1syXTsgfSBlbHNlIHsgcHJpbnQgJDA7IH19fVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQuZC8iICsgdGhpcy5uYW1lICsgIiB8IGdyZXAgU2hvcnQtRGVzY3JpcHRpb246IHwgYXdrICciICsgJ3sgaWYoJDI9PSJTaG9ydC1EZXNjcmlwdGlvbjoiKSB7ICQxPSIiOyAkMj0iIjsgcHJpbnQgJDA7IH19XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBwV29ya2luZ0RpcmVjdG9yeS5wbGF0Zm9ybSA9PSAnaW5pdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC5kLyIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnU0NSSVBUPScgfCBhd2sgLUY9ICd7IGxlbj1zcGxpdCgkMiwgYSwgXCIvXCIpOyBwcmludCBzdWJzdHIoJDIsMCxsZW5ndGgoJDIpLWxlbmd0aChhW2xlbl0pKTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvaW5pdC8iICsgdGhpcy5uYW1lICsgIi5jb25mIHwgZ3JlcCAnY2hkaXIgJyB8IGF3ayAne3ByaW50ICQyfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBXb3JraW5nRGlyZWN0b3J5LnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFwcExvY2F0aW9uLnBsYXRmb3JtID09ICdpbml0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9pbml0LmQvIiArIHRoaXMubmFtZSArICIgfCBncmVwICdTQ1JJUFQ9JyB8IGF3ayAtRj0gJ3twcmludCAkMn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL2luaXQvIiArIHRoaXMubmFtZSArICIuY29uZiB8IGdyZXAgJ2V4ZWMgJyB8IGF3ayAne3ByaW50ICQyfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWUucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImluaXRjdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgYXdrICd7cHJpbnQgJE5GfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBzdGF0dXMgfCBhd2sgJ3twcmludCAkTkZ9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nID0gZnVuY3Rpb24gaXNSdW5uaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUnVubmluZy5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiaW5pdGN0bCBzdGF0dXMgIiArIHRoaXMubmFtZSArICIgfCBhd2sgJ3twcmludCAkMn0nIHwgYXdrIC1GLCAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic2VydmljZSAiICsgdGhpcy5uYW1lICsgIiBzdGF0dXMgfCBhd2sgJ3twcmludCAkMn0nIHwgYXdrIC1GLCAne3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJ3N0YXJ0L3J1bm5pbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuaXNSdW5uaW5nLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0LnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RhcnRcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdGFydC5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcC5wbGF0Zm9ybSA9PSAndXBzdGFydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW5pdGN0bCBzdG9wICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NlcnZpY2UgJyArIHRoaXMubmFtZSArICcgc3RvcFxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0b3AucGxhdGZvcm0gPSBwbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RhcnQucGxhdGZvcm0gPT0gJ3Vwc3RhcnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2luaXRjdGwgcmVzdGFydCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHJlc3RhcnRcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yZXN0YXJ0LnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzID0gZnVuY3Rpb24gc3RhdHVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5fc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuX3N0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnBsYXRmb3JtID09ICd1cHN0YXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpbml0Y3RsIHN0YXR1cyAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyB0aGlzLm5hbWUgKyAnIHN0YXR1c1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuX3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnN0YXR1cy5wbGF0Zm9ybSA9IHBsYXRmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKHBsYXRmb3JtICsgJyBTZXJ2aWNlICgnICsgbmFtZSArICcpIE5PVCBGT1VORCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5jb25mID0gJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmNvbmYgPSAnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuY29uZikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgInN0YXJ0VHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3By", 16000);
|
|
memcpy_s(_servicemanager + 80000, 88688, "b2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhdHVzICcgKyB0aGlzLm5hbWUgKyAnIHwgZ3JlcCBMb2FkZWQ6IHwgYXdrIFwneyBhPXNwbGl0KCQwLCBiLCAiOyIpOyBmb3IoYz0xO2M8PWE7KytjKSB7IGlmKGJbY109PSJlbmFibGVkIiB8fCBiW2NdPT0iIGVuYWJsZWQiKSB7IHByaW50ICJ0cnVlIjsgfSB9IH1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/ICdERU1BTkRfU1RBUlQnIDogJ0FVVE9fU1RBUlQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uID0gZnVuY3Rpb24gZGVzY3JpcHRpb24oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG5hbWUgKyAnLnNlcnZpY2UnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCcgfCBncmVwIERlc2NyaXB0aW9uPSB8IGF3ayAtRj0gXCd7IGlmKCQxPT0iRGVzY3JpcHRpb24iKSB7ICQxPSIiOyBwcmludCAkMDsgfX1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBXb3JraW5nRGlyZWN0b3J5ID0gZnVuY3Rpb24gYXBwV29ya2luZ0RpcmVjdG9yeSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIHRoaXMubmFtZSArICcuc2VydmljZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2xpYi9zeXN0ZW1kL3N5c3RlbS8iICsgdGhpcy5uYW1lICsgIi5zZXJ2aWNlIHwgZ3JlcCAnV29ya2luZ0RpcmVjdG9yeT0nIHwgYXdrIC1GPSAneyBwcmludCAkMiB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8iICsgdGhpcy5uYW1lICsgIi5zZXJ2aWNlIHwgZ3JlcCAnV29ya2luZ0RpcmVjdG9yeT0nIHwgYXdrIC1GPSAneyBwcmludCAkMiB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uICgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIHRoaXMubmFtZSArICcuc2VydmljZScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdFeGVjU3RhcnQ9JyB8IGF3ayAtRj0gJ3sgc3BsaXQoJDIsIGEsIFwiIFwiKTsgcHJpbnQgYVsxXSB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC91c3IvbGliL3N5c3RlbWQvc3lzdGVtLyIgKyB0aGlzLm5hbWUgKyAiLnNlcnZpY2UgfCBncmVwICdFeGVjU3RhcnQ9JyB8IGF3ayAtRj0gJ3sgc3BsaXQoJDIsIGEsIFwiIFwiKTsgcHJpbnQgYVsxXSB9J1xuXGV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc01lID0gZnVuY3Rpb24gaXNNZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzeXN0ZW1jdGwgc3RhdHVzICIgKyB0aGlzLm5hbWUgKyAiIHwgZ3JlcCAnTWFpbiBQSUQ6JyB8IGF3ayAne3ByaW50ICQzfSdcbmV4aXRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gcHJvY2Vzcy5waWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgic3lzdGVtY3RsIHN0YXR1cyAiICsgdGhpcy5uYW1lICsgIiB8IGdyZXAgJ0FjdGl2ZTonIHwgYXdrICd7cHJpbnQgJDJ9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICdhY3RpdmUnKTsgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0YXJ0ICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5zdG9wID0gZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3lzdGVtY3RsIHN0b3AgJyArIHRoaXMubmFtZSArICdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgcmVzdGFydCAnICsgdGhpcy5uYW1lICsgJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhdHVzID0gZnVuY3Rpb24gc3RhdHVzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Ll9zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5fc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgc3RhdHVzICcgKyB0aGlzLm5hbWUgKyAnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0Ll9zdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChwbGF0Zm9ybSArICcgU2VydmljZSAoJyArIG5hbWUgKyAnKSBOT1QgRk9VTkQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXVkbyBTZXJ2aWNlIChtZXNoRGFlbW9uKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgbmFtZSArICcuc2VydmljZScpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuY29uZiA9ICcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgbmFtZSArICcuc2VydmljZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgJyArIHRoaXMuY29uZiArICIgfCB0ciAnXG4nICd+JyB8IGF3ayAtRn4gJ3sgd2Q9IiArICciIjsgcGFybXM9IiI7IHJlc3Bhd249IjAiOyBmb3IoaT0xO2k8PU5GOysraSkgeyBzcGxpdCgkaSwgdG9rMSwgIj0iKTsgaWYodG9rMVsxXT09IndvcmtpbmdEaXJlY3RvcnkiKSB7IHdkPXRvazFbMl07fSBpZih0b2sxWzFdPT0icGFyYW1ldGVycyIpIHsgcGFybXM9dG9rMVsyXTt9IGlmKHRvazFbMV09PSJyZXNwYXduIikgeyByZXNwYXduPSIxIjsgfSB9IHByaW50ZiAieyBcXFwid2RcXFwiOiBcXFwiJXNcXFwiLCBcXFwicGFybXNcXFwiOiAlcywgXFxcInJlc3Bhd25cXFwiOiAlcyB9Iiwgd2QsIHBhcm1zLCByZXNwYXduIH1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZm8gPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmV4ZVBhdGggPSBpbmZvLndkICsgJy8nICsgaW5mby5wYXJtcy5zaGlmdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHsgcGlkUGF0aDogaW5mby53ZCArICcvcGlkJywgbG9nT3V0cHV0czogZmFsc2UsIGNyYXNoUmVzdGFydDogaW5mby5yZXNwYXduID8gdHJ1ZSA6IGZhbHNlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5kYWVtb24oaW5mby5leGVQYXRoLCBpbmZvLnBhcm1zLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuc3RvcCA9IGZ1bmN0aW9uIHN0b3AoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG5hbWUgKyAnL3BpZCBcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpLCAnU0lHVEVSTScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCh4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmlzTWUgPSBmdW5jdGlvbiBpc01lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBuYW1lICsgJy9waWQgXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID09IHByb2Nlc3MucGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgJyArIHRoaXMuY29uZiArICIgfCB0ciAnXG4nICd+JyB8IGF3ayAtRn4gJ3sgd2Q9IiArICciIjsgcGFybXM9IiI7IGZvcihpPTE7aTw9TkY7KytpKSB7IHNwbGl0KCRpLCB0b2sxLCAiPSIpOyBpZih0b2sxWzFdPT0id29ya2luZ0RpcmVjdG9yeSIpIHsgd2Q9dG9rMVsyXTt9IGlmKHRvazFbMV09PSJwYXJhbWV0ZXJzIikgeyBwYXJtcz10b2sxWzJdO30gfSBwcmludGYgInsgXFxcIndkXFxcIjogXFxcIiVzXFxcIiwgXFxcInBhcm1zXFxcIjogJXMgfSIsIHdkLCBwYXJtcyB9XCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmZvID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbmZvLndkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwTG9jYXRpb24gPSBmdW5jdGlvbiBhcHBMb2NhdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2NhdCAnICsgdGhpcy5jb25mICsgIiB8IHRyICdc", 16000);
|
|
memcpy_s(_servicemanager + 96000, 72688, "bicgJ34nIHwgYXdrIC1GfiAneyB3ZD0iICsgJyIiOyBwYXJtcz0iIjsgZm9yKGk9MTtpPD1ORjsrK2kpIHsgc3BsaXQoJGksIHRvazEsICI9Iik7IGlmKHRvazFbMV09PSJ3b3JraW5nRGlyZWN0b3J5IikgeyB3ZD10b2sxWzJdO30gaWYodG9rMVsxXT09InBhcmFtZXRlcnMiKSB7IHBhcm1zPXRvazFbMl07fSB9IHByaW50ZiAieyBcXFwid2RcXFwiOiBcXFwiJXNcXFwiLCBcXFwicGFybXNcXFwiOiAlcyB9Iiwgd2QsIHBhcm1zIH1cJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZm8gPSBKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGluZm8ud2QgKyAnLycgKyBpbmZvLnBhcm1zLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pc1J1bm5pbmcgPSBmdW5jdGlvbiBpc1J1bm5pbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG5hbWUgKyAnL3BpZCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBuYW1lICsgJy9waWQgXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBpZCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdwcyAtcCAnICsgcGlkICsgJyAtbyBwaWQgaFxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09IHBpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG5hbWUgKyAnL3BpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoJ01lc2hEYWVtb24gKCcgKyBuYW1lICsgJykgTk9UIEZPVU5EJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHRoaXMuZW51bWVyYXRlU2VydmljZSA9IGZ1bmN0aW9uIChvcHRpb25zKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHBhdGhzID0gW107CiAgICAgICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdsaW51eCc6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKChvcHRpb25zICYmIG9wdGlvbnMucGxhdGZvcm1UeXBlKT9vcHRpb25zLnBsYXRmb3JtVHlwZSA6IHRoaXMuZ2V0U2VydmljZVR5cGUoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2V0Yy9pbml0LmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9ldGMvaW5pdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL2xpYi9zeXN0ZW1kL3N5c3RlbScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9ldGMvcmMuZCcpOwogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy91c3IvbG9jYWwvZXRjL3JjLmQnKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaCgnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucycpOwogICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goJy9TeXN0ZW0vTGlicmFyeS9MYXVuY2hEYWVtb25zJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBwYXRocykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhwYXRoc1tpXSk7CiAgICAgICAgICAgICAgICBmb3IodmFyIGogaW4gZmlsZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsaW51eCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChvcHRpb25zICYmIG9wdGlvbnMucGxhdGZvcm1UeXBlKSA/IG9wdGlvbnMucGxhdGZvcm1UeXBlIDogdGhpcy5nZXRTZXJ2aWNlVHlwZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZ2V0U2VydmljZShmaWxlc1tqXSwgJ2luaXQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2pdLmVuZHNXaXRoKCcuY29uZicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdLnNwbGl0KCcuY29uZicpWzBdLCAndXBzdGFydCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5zZXJ2aWNlJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0uc3BsaXQoJy5zZXJ2aWNlJylbMF0sICdzeXN0ZW1kJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZW5kc1dpdGgoJy5zZXJ2aWNlJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmdldFNlcnZpY2UoZmlsZXNbal0uc3BsaXQoJy5zZXJ2aWNlJylbMF0sICd1bmtub3duJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnJlZWJzZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5nZXRTZXJ2aWNlKGZpbGVzW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2pdLmVuZHNXaXRoKCcucGxpc3QnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChmZXRjaFBsaXN0KHBhdGhzW2ldLCBmaWxlc1tqXS5zcGxpdCgnLnBsaXN0JylbMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBrIGluIHJlc3VsdHMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW2tdLmRlc2NyaXB0aW9uKSB7IHJlc3VsdHNba10uZGVzY3JpcHRpb24gPSByZXN1bHRzW2tdLmRlc2NyaXB0aW9uKCk7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMpOwogICAgICAgIH07CiAgICB9CiAgICB0aGlzLmluc3RhbGxTZXJ2aWNlID0gZnVuY3Rpb24gaW5zdGFsbFNlcnZpY2Uob3B0aW9ucykKICAgIHsKICAgICAgICBpZiAoIW9wdGlvbnMudGFyZ2V0KSB7IG9wdGlvbnMudGFyZ2V0ID0gb3B0aW9ucy5uYW1lOyB9CiAgICAgICAgaWYgKCFvcHRpb25zLmRpc3BsYXlOYW1lKSB7IG9wdGlvbnMuZGlzcGxheU5hbWUgPSBvcHRpb25zLm5hbWU7IH0KCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWRtaW4oKSkgeyB0aHJvdyAoJ0luc3RhbGxpbmcgYXMgU2VydmljZSwgcmVxdWlyZXMgYWRtaW4nKTsgfQoKICAgICAgICAgICAgLy8gQmVmb3JlIHdlIHN0YXJ0LCB3ZSBuZWVkIHRvIGNvcHkgdGhlIGJpbmFyeSB0byB0aGUgcmlnaHQgcGxhY2UKICAgICAgICAgICAgdmFyIGZvbGRlciA9IHRoaXMuZ2V0U2VydmljZUZvbGRlcigpOwogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKGZvbGRlcik7IH0KICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSk7IH0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2VydmljZVBhdGggPT0gcHJvY2Vzcy5leGVjUGF0aCkgeyBvcHRpb25zLl9pc01lc2hBZ2VudCA9IHRydWU7IH0KICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBvcHRpb25zLnRhcmdldCArICcuZXhlJyk7CiAgICAgICAgICAgIG9wdGlvbnMuc2VydmljZVBhdGggPSBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUnOwoKICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXRoID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSgnIicgKyBvcHRpb25zLnNlcnZpY2VQYXRoICsgJyInLCB7IHdpZGU6IHRydWUgfSk7CiAgICAgICAgICAgIHZhciBoYW5kbGUgPSB0aGlzLnByb3h5Lk9wZW5TQ01hbmFnZXJBKDB4MDAsIDB4MDAsIDB4MDAwMik7CiAgICAgICAgICAgIGlmIChoYW5kbGUuVmFsID09IDApIHsgdGhyb3cgKCdlcnJvciBvcGVuaW5nIFNDTWFuYWdlcicpOyB9CiAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5uYW1lLCB7IHdpZGU6IHRydWUgfSk7CiAgICAgICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUob3B0aW9ucy5kaXNwbGF5TmFtZSwgeyB3aWRlOiB0cnVlfSk7CiAgICAgICAgICAgIHZhciBhbGxBY2Nlc3MgPSAweDAwMEYwMUZGOwogICAgICAgICAgICB2YXIgc2VydmljZVR5cGU7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAnQVVUT19TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgc2VydmljZVR5cGUgPSAweDAyOyAvLyBBdXRvbWF0aWMKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ0RFTUFORF9TVEFSVCc6CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gMHgwMzsgLy8gTWFudWFsCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdESVNBQkxFRCc6CiAgICAgICAgICAgICAgICAgICAgc2VydmljZVR5cGUgPSAweDA0OyAvLyBEaXNhYmxlZAogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaCA9IHRoaXMucHJveHkuQ3JlYXRlU2VydmljZVcoaGFuZGxlLCBzZXJ2aWNlTmFtZSwgZGlzcGxheU5hbWUsIGFsbEFjY2VzcywgMHgxMCB8IDB4MTAwLCBzZXJ2aWNlVHlwZSwgMCwgc2VydmljZVBhdGgsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICBpZiAoaC5WYWwgPT0gMCkgeyB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOyB0aHJvdyAoJ0Vycm9yIENyZWF0aW5nIFNlcnZpY2U6ICcgKyB0aGlzLnByb3h5Mi5HZXRMYXN0RXJyb3IoKS5WYWwpOyB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZHNjID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZShvcHRpb25zLmRlc2NyaXB0aW9uLCB7IHdpZGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICB2YXIgc2VydmljZURlc2NyaXB0aW9uID0gdGhpcy5HTS5DcmVhdGVWYXJpYWJsZSh0aGlzLkdNLlBvaW50ZXJTaXplKTsKICAgICAgICAgICAgICAgIGRzYy5wb2ludGVyQnVmZmVyKCkuY29weShzZXJ2aWNlRGVzY3JpcHRpb24uRGVyZWYoMCwgdGhpcy5HTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKSk7CgogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hhbmdlU2VydmljZUNvbmZpZzJXKGgsIDEsIHNlcnZpY2VEZXNjcmlwdGlvbikuVmFsID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuYWJsZSB0byBzZXQgZGVzY3JpcHRpb24uLi4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgPyA1MDAwIDogb3B0aW9ucy5mYWlsdXJlUmVzdGFydDsgICAgICAgICAgICAgLy8gRGVsYXkgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoMyAqIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMypzaXplb2YoU0NfQUNUSU9OKQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlswXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDQsIDQpLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShkZWxheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlswXS5kZWxheQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZig4LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsxXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDEyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsxXS5kZWxheQogICAgICAgICAgICAgICAgYWN0aW9ucy5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS50eXBlCiAgICAgICAgICAgICAgICBhY3Rpb25zLkRlcmVmKDIwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDX0FDVElPTlsyXS5kZWxheQoKICAgICAgICAgICAgICAgIHZhciBmYWlsdXJlQWN0aW9ucyA9IHRoaXMuR00uQ3JlYXRlVmFyaWFibGUoNDApOyAgICAgICAgICAgICAgICAg", 16000);
|
|
memcpy_s(_servicemanager + 112000, 56688, "ICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplb2YoU0VSVklDRV9GQUlMVVJFX0FDVElPTlMpCiAgICAgICAgICAgICAgICBmYWlsdXJlQWN0aW9ucy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoNzIwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHdSZXNldFBlcmlvZDogMiBIb3VycwogICAgICAgICAgICAgICAgZmFpbHVyZUFjdGlvbnMuRGVyZWYodGhpcy5HTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMjQgOiAxMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKDMpOy8vIGNBY3Rpb25zOiAzCiAgICAgICAgICAgICAgICBhY3Rpb25zLnBvaW50ZXJCdWZmZXIoKS5jb3B5KGZhaWx1cmVBY3Rpb25zLkRlcmVmKHRoaXMuR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMTYsIHRoaXMuR00uUG9pbnRlclNpemUpLnRvQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMucHJveHkuQ2hhbmdlU2VydmljZUNvbmZpZzJXKGgsIDIsIGZhaWx1cmVBY3Rpb25zKS5WYWwgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIHNldCBGYWlsdXJlQWN0aW9ucy4uLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucHJveHkuQ2xvc2VTZXJ2aWNlSGFuZGxlKGgpOwogICAgICAgICAgICB0aGlzLnByb3h5LkNsb3NlU2VydmljZUhhbmRsZShoYW5kbGUpOwoKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiBvcHRpb25zLmZpbGVzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd3JpdGluZyAnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKGZvbGRlciArICdcXCcgKyBvcHRpb25zLm5hbWUgKyAnXFwnICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgZXh0cmFjdEZpbGVTb3VyY2Uob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSArICdcXCcgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCgoKICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1ldGVycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGltYWdlUGF0aCA9IHJlZy5RdWVyeUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIG9wdGlvbnMubmFtZSwgJ0ltYWdlUGF0aCcpOwogICAgICAgICAgICAgICAgaW1hZ2VQYXRoICs9ICgnICcgKyBvcHRpb25zLnBhcmFtZXRlcnMuam9pbignICcpKTsKICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIG9wdGlvbnMubmFtZSwgJ0ltYWdlUGF0aCcsIGltYWdlUGF0aCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcJyArIG9wdGlvbnMubmFtZSwgJ19JbnN0YWxsZWRCeScsIHJlZy51c2VybmFtZVRvVXNlcktleShyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0UHJvY2Vzc093bmVyTmFtZShwcm9jZXNzLnBpZCkubmFtZSkpOw0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoeHgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgaWYgKG9wdGlvbnMuX2lzTWVzaEFnZW50KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgd2UnbGwgb25seSBwcm92aWRlIGFuIHVuaW5zdGFsbGVyIGlmIHRoZSBiaW5hcnkgaXMgdGhlIG1lc2ggYWdlbnQgYmluYXJ5LCBzbyB3ZQ0KICAgICAgICAgICAgICAgIC8vIHdvbid0IG5lZWQgdG8gY29weSB0aGUgYmluYXJ5IHRvIHJ1biB0aGUgdW5pbnN0YWxsIHNjcmlwdA0KICAgICAgICAgICAgICAgIC8vDQogICAgICAgICAgICAgICAgdmFyIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKCJ0cnl7cmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci51bmluc3RhbGxTZXJ2aWNlKCciICsgb3B0aW9ucy5uYW1lICsgIicpO31jYXRjaCh4KXt9cHJvY2Vzcy5leGl0KCk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOwogICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZWcuV3JpdGVLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcJyArIG9wdGlvbnMubmFtZSwgJ0Rpc3BsYXlOYW1lJywgb3B0aW9ucy5kaXNwbGF5TmFtZSk7DQogICAgICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnRGlzcGxheUljb24nLCBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucHVibGlzaGVyKSB7IHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnUHVibGlzaGVyJywgb3B0aW9ucy5wdWJsaXNoZXIpOyB9DQogICAgICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnSW5zdGFsbExvY2F0aW9uJywgZm9sZGVyICsgJ1xcJyArIG9wdGlvbnMubmFtZSk7DQogICAgICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnRXN0aW1hdGVkU2l6ZScsIE1hdGguZmxvb3IocmVxdWlyZSgnZnMnKS5zdGF0U3luYyhmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUnKS5zaXplIC8gMTAyNCkpOwogICAgICAgICAgICAgICAgICAgIHJlZy5Xcml0ZUtleShyZWcuSEtFWS5Mb2NhbE1hY2hpbmUsICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFwnICsgb3B0aW9ucy5uYW1lLCAnTm9Nb2RpZnknLCAweDEpOw0KICAgICAgICAgICAgICAgICAgICByZWcuV3JpdGVLZXkocmVnLkhLRVkuTG9jYWxNYWNoaW5lLCAnU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcJyArIG9wdGlvbnMubmFtZSwgJ05vUmVwYWlyJywgMHgxKTsNCiAgICAgICAgICAgICAgICAgICAgcmVnLldyaXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXCcgKyBvcHRpb25zLm5hbWUsICdVbmluc3RhbGxTdHJpbmcnLCBmb2xkZXIgKyAnXFwnICsgb3B0aW9ucy5uYW1lICsgJ1xcJyArIG9wdGlvbnMudGFyZ2V0ICsgJy5leGUgLWI2NGV4ZWMgJyArIHNjcmlwdCk7DQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKHh4KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc0FkbWluKCkpIHsgY29uc29sZS5sb2coJ0luc3RhbGxpbmcgYSBTZXJ2aWNlIHJlcXVpcmVzIHJvb3QnKTsgdGhyb3cgKCdJbnN0YWxsaW5nIGFzIFNlcnZpY2UsIHJlcXVpcmVzIHJvb3QnKTsgfQogICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycyA/IG9wdGlvbnMucGFyYW1ldGVycy5qb2luKCcgJykgOiAnJzsKICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0KICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOwoKICAgICAgICAgICAgdmFyIHJjID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL3Vzci9sb2NhbC9ldGMvcmMuZC8nICsgb3B0aW9ucy5uYW1lLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICByYy53cml0ZSgnIyEvYmluL3NoXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJyMgUFJPVklERTogJyArIG9wdGlvbnMubmFtZSArICdcbicpOwogICAgICAgICAgICByYy53cml0ZSgnIyBSRVFVSVJFOiBGSUxFU1lTVEVNUyBORVRXT1JLSU5HXG4nKTsKICAgICAgICAgICAgcmMud3JpdGUoJyMgS0VZV09SRDogc2h1dGRvd25cbicpOwogICAgICAgICAgICByYy53cml0ZSgnLiAvZXRjL3JjLnN1YnJcblxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCduYW1lPSInICsgb3B0aW9ucy5uYW1lICsgJyJcbicpOwogICAgICAgICAgICByYy53cml0ZSgnZGVzYz0iJyArIChvcHRpb25zLmRlc2NyaXB0aW9uID8gb3B0aW9ucy5kZXNjcmlwdGlvbiA6ICdNZXNoQ2VudHJhbCBBZ2VudCcpICsgJyJcbicpOwogICAgICAgICAgICByYy53cml0ZSgncmN2YXI9JHtuYW1lfV9lbmFibGVcbicpOwogICAgICAgICAgICByYy53cml0ZSgncGlkZmlsZT0iL3Zhci9ydW4vJyArIG9wdGlvbnMubmFtZSArICcucGlkIlxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdjb21tYW5kPSIvdXNyL3NiaW4vZGFlbW9uIlxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdjb21tYW5kX2FyZ3M9Ii1QICR7cGlkZmlsZX0gJyArICgob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKT8nLXInOicnKSArICcgLWYgL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICcgJyArIHBhcmFtZXRlcnMgKyAnIlxuJyk7CiAgICAgICAgICAgIHJjLndyaXRlKCdjb21tYW5kX2NoZGlyPSIvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICciXG5cbicpOwogICAgICAgICAgICByYy53cml0ZSgnbG9hZF9yY19jb25maWcgJG5hbWVcbicpOwogICAgICAgICAgICByYy53cml0ZSgnOiAkeycgKyBvcHRpb25zLm5hbWUgKyAnX2VuYWJsZT0iJyArICgob3B0aW9ucy5zdGFydFR5cGUgPT0gJ0FVVE9fU1RBUlQnIHx8IG9wdGlvbnMuc3RhcnRUeXBlID09ICdCT09UX1NUQVJUJyk/J1lFUyc6J05PJykgKyAnIn1cbicpOwogICAgICAgICAgICByYy53cml0ZSgncnVuX3JjX2NvbW1hbmQgIiQxIlxuJyk7CiAgICAgICAgICAgIHJjLmVuZCgpOwogICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG9wdGlvbnMubmFtZSkubW9kZTsKICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsKICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvZXRjL3JjLmQvJyArIG9wdGlvbnMubmFtZSwgbSk7CiAgICAgICAgfQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc0FkbWluKCkpIHsgY29uc29sZS5sb2coJ0luc3RhbGxpbmcgYSBTZXJ2aWNlIHJlcXVpcmVzIHJvb3QnKTsgdGhyb3cgKCdJbnN0YWxsaW5nIGFzIFNlcnZpY2UsIHJlcXVpcmVzIHJvb3QnKTsgfQogICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycyA/IG9wdGlvbnMucGFyYW1ldGVycy5qb2luKCcgJykgOiAnJzsKICAgICAgICAgICAgdmFyIGNvbmY7CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0pIHsgb3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0gPSB0aGlzLmdldFNlcnZpY2VUeXBlKCk7IH0KICAgICAgICAgICAKICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnNlcnZpY2VQbGF0Zm9ybSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nKSkgeyByZXF1aXJlKCdmcycpLm1rZGlyU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJyk7IH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSk7IH0KCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5aW5nICcgKyBvcHRpb25zLnNlcnZpY2VQYXRoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KS5tb2RlOwogICAgICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQsIG0pOwoKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3Jhc2ggUmVzdGFydCBpcyBlbmFibGVkLCBidXQgaXQgaXNuJ3QgaW5oZXJlbnRseSBzdXBwb3J0ZWQgYnkgSU5JVCwgc28gd2UgbXVzdCBmYWtlIGl0IHdpdGggSlMKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcF9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5zcGxpdCgnIicpLmpvaW4oJ1xcIicpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gIi1leGVjIFxcXCJ2YXIgY2hpbGQ7IHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBmdW5jdGlvbiAoKSB7IGNoaWxkLnJlbW92ZUFsbExpc3RlbmVycygnZXhpdCcpOyBjaGlsZC5raWxsKCk7IHByb2Nlc3MuZXhpdCgpOyB9KTsgZnVuY3Rpb24gc3RhcnQoKSB7IGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZXhlY1BhdGgsIFtwcm9jZXNzLmFyZ3YwLCBcXFwiIiArIHRtcF9wYXJhbWV0ZXJzICsgIlxcXCJdKTsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOyBjaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChzdGF0dXMpIHsgc3RhcnQoKTsgfSk7IH0gc3RhcnQoKTtcXFwiIjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGluaXQuZCBzY3JpcHQgSSB3cm90ZS4gUmF0aGVyIHRoYW4gaGF2aW5nIHRvIGRlYWwgd2l0aCBlc2NhcGluZyB0aGUgdGhpbmcsIEkganVzdCBCYXNlNjQgZW5jb2RlZCBpdCB0byBwcmV2ZW50IGlzc3Vlcy4KICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL2V0Yy9pbml0LmQvJyArIG9wdGlvbnMubmFtZSwgeyBmbGFnczogJ3diJyB9KTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKEJ1ZmZlci5mcm9tKCdJeUV2WW1sdUwzTm9DZ29LVTBOU1NWQlVQUzkxYzNJdmJHOWpZV3d2YldWemFGOXpaWEoyYVdObGN5OVlXRmhZV0M5WldWbFpXUXBTVlU1QlV6MXliMjkwQ2dwUVNVUkdTVXhGUFM5MllYSXZjblZ1TDFoWVdGaFlMbkJwWkFwTVQwZEdTVXhGUFM5MllYSXZiRzluTDFoWVdGaFlMbXh2WndvS2MzUmhjblFvS1NCN0NpQWdhV1lnV3lBdFppQWlKRkJKUkVaSlRFVWlJRjBnSmlZZ2EybHNiQ0F0TUNBa0tHTmhkQ0FpSkZCSlJFWkpURVVpS1NBeVBpOWtaWFl2Ym5Wc2JEc2dkR2hsYmdvZ0lDQWdaV05vYnlBblUyVnlkbWxqWlNCaGJISmxZV1I1SUhKMWJtNXBibWNuSUQ0bU1nb2dJQ0FnY21WMGRYSnVJREVLSUNCbWFRb2dJR1ZqYUc4Z0oxTjBZWEowYVc1bklITmxjblpwWTJYaWdLWW5JRDRtTWdvZ0lHeHZZMkZzSUVOTlJEMGlKRk5EVWtsUVZDQjdlMUJCVWsxVGZYMGdKajRnWENJa1RFOUhSa2xNUlZ3aUlDWWdaV05vYnlCY0pDRWlDaUFnYkc5allXd2dRMDFFVUVGVVNEMGtLR1ZqYUc4Z0pGTkRVa2xRVkNCOElHRjNheUFuZXlCc1pXNDljM0JzYVhRb0pEQXNJR0VzSUNJdklpazdJSEJ5YVc1MElITjFZbk4wY2lna01Dd2dNQ3dnYkdWdVozUm9LQ1F3S1Mxc1pXNW5kR2dvWVZ0c1pXNWRLU2s3SUgwbktRb2dJR05rSUNSRFRVUlFRVlJJQ2lBZ2MzVWdMV01nSWlSRFRVUWlJQ1JTVlU1QlV5QStJQ0lrVUVsRVJrbE1SU0lLSUNCbFkyaHZJQ2RUWlhKMmFXTmxJSE4wWVhKMFpXUW5JRDRtTWdwOUNncHpkRzl3S0NrZ2V3b2dJR2xtSUZzZ0lTQXRaaUFpSkZCSlJFWkpURVVpSUYwN0lIUm9aVzRLSUNBZ0lHVmphRzhnSjFObGNuWnBZMlVnYm05MElISjFibTVwYm1jbklENG1NZ29nSUNBZ2NtVjBkWEp1SURFS0lDQmxiSE5sQ2dsd2FXUTlKQ2dnWTJGMElDSWtVRWxFUmtsTVJTSWdLUW9KYVdZZ2EybHNiQ0F0TUNBa2NHbGtJREkrTDJSbGRpOXVkV3hzT3lCMGFHVnVDaUFnSUNBZ0lHVmphRzhnSjFOMGIzQndhVzVuSUhObGNuWnBZMlhpZ0tZbklENG1NZ29nSUNBZ0lDQnJhV3hzSUMweE5TQWtjR2xrQ2lBZ0lDQWdJR1ZqYUc4Z0oxTmxjblpwWTJVZ2MzUnZjSEJsWkNjZ1BpWXlDZ2xsYkhObENna2dJR1ZqYUc4Z0oxTmxjblpwWTJVZ2JtOTBJSEoxYm01cGJtY25DZ2xtYVFvSmNtMGdMV1lnSkNKUVNVUkdTVXhGSWdvZ0lHWnBDbjBLY21WemRHRnlkQ2dwZXdvSmMzUnZjQW9KYzNSaGNuUUtmUXB6ZEdGMGRYTW9LWHNLQ1dsbUlGc2dMV1lnSWlSUVNVUkdTVXhGSWlCZENnbDBhR1Z1Q2drSmNHbGtQU1FvSUdOaGRDQWlKRkJKUkVaSlRFVWlJQ2tLQ1FscFppQnJhV3hzSUMwd0lDUndhV1FnTWo0dlpHVjJMMjUxYkd3N0lIUm9aVzRLQ1FrSlpXTm9ieUFpV0ZoWVdGZ2djM1JoY25RdmNuVnVibWx1Wnl3Z2NISnZZMlZ6Y3lBa2NHbGtJZ29KQ1dWc2MyVUtDUWtKWldOb2J5QW5XRmhZV0ZnZ2MzUnZjQzkzWVdsMGFXNW5Kd29KQ1dacENnbGxiSE5sQ2drSlpXTm9ieUFuV0ZoWVdGZ2djM1J2Y0M5M1lXbDBhVzVuSndvSlpta0tDbjBLQ2dwallYTmxJQ0lrTVNJZ2FXNEtDWE4wWVhKMEtRb0pDWE4wWVhKMENna0pPenNLQ1hOMGIzQXBDZ2tKYzNSdmNBb0pDVHM3Q2dseVpYTjBZWEowS1FvSkNYTjBiM0FLQ1FsemRHRnlkQW9KQ1RzN0NnbHpkR0YwZFhNcENna0pjM1JoZEhWekNna0pPenNLQ1NvcENna0paV05vYnlBaVZYTmhaMlU2SUhObGNuWnBZMlVnV0ZoWVdGZ2dlM04wWVhKMGZITjBiM0I4Y21WemRHRnlkSHh6ZEdGMGRYTjlJZ29KQ1RzN0NtVnpZV01LWlhocGRDQXdDZ289JywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCkuc3BsaXQoJ1hYWFhYJykuam9pbihvcHRpb25zLm5hbWUpLnNwbGl0KCdZWVlZWScpLmpvaW4ob3B0aW9ucy50YXJnZXQpLnJlcGxhY2UoJ3t7UEFSTVN9fScsIHBhcmFtZXRlcnMpKTsKICAgICAgICAgICAgICAgICAgICBjb25mLmVuZCgpOwoKICAgICAgICAgICAgICAgICAgICBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL2V0Yy9pbml0LmQvJyArIG9wdGlvbnMubmFtZSkubW9kZTsKICAgICAgICAgICAgICAgICAgICBtIHw9IChyZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2htb2RTeW5jKCcvZXRjL2luaXQuZC8nICsgb3B0aW9ucy5uYW1lLCBtKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3RhcnRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQk9PVF9TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NZU1RFTV9TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FVVE9fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCd1cGRhdGUtcmMuZCAnICsgb3B0aW9ucy5uYW1lICsgJyBkZWZhdWx0c1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd1cHN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9t", 16000);
|
|
memcpy_s(_servicemanager + 128000, 40688, "ZXNoX3NlcnZpY2VzLycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQoKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIG9wdGlvbnMuc2VydmljZVBhdGgpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7CiAgICAgICAgICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7CgogICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvZXRjL2luaXQvJyArIG9wdGlvbnMubmFtZSArICcuY29uZicsIHsgZmxhZ3M6ICd3YicgfSk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0YXJ0VHlwZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JPT1RfU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTWVNURU1fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBVVRPX1NUQVJUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ3N0YXJ0IG9uIHJ1bmxldmVsIFsyMzQ1XVxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdzdG9wIG9uIHJ1bmxldmVsIFswMTZdXG5cbicpOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdyZXNwYXduXG5cbicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdjaGRpciAvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICdcbicpOwogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ2V4ZWMgL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICcgJyArIHBhcmFtZXRlcnMgKyAnXG5cbicpOwogICAgICAgICAgICAgICAgICAgIGNvbmYuZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoKICAgICAgICAgICAgICAgICAgICB2YXIgc2VydmljZURlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbiA/IG9wdGlvbnMuZGVzY3JpcHRpb24gOiAnTWVzaENlbnRyYWwgQWdlbnQnOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMnKTsgfQogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQoKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29weWluZyAnICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jb3B5RmlsZVN5bmMob3B0aW9ucy5zZXJ2aWNlUGF0aCwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7CiAgICAgICAgICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9saWIvc3lzdGVtZC9zeXN0ZW0nKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2UnLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtJykpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSgnL3Vzci9saWIvc3lzdGVtZC9zeXN0ZW0vJyArIG9wdGlvbnMubmFtZSArICcuc2VydmljZScsIHsgZmxhZ3M6ICd3YicgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgndW5rbm93biBsb2NhdGlvbiBmb3Igc3lzdGVtZCBjb25maWd1cmF0aW9uIGZpbGVzJyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdbVW5pdF1cbkRlc2NyaXB0aW9uPScgKyBzZXJ2aWNlRGVzY3JpcHRpb24gKyAnXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdbU2VydmljZV1cbicpOwogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1dvcmtpbmdEaXJlY3Rvcnk9L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdFeGVjU3RhcnQ9L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICcgJyArIHBhcmFtZXRlcnMgKyAnXG4nKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdTdGFuZGFyZE91dHB1dD1udWxsXG4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnUmVzdGFydD1vbi1mYWlsdXJlXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnUmVzdGFydFNlYz0zXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1Jlc3RhcnRTZWM9JyArIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0IC8gMTAwMCkgKyAnXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3RhcnRUeXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQk9PVF9TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NZU1RFTV9TVEFSVCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FVVE9fU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi53cml0ZSgnW0luc3RhbGxdXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ1dhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ0FsaWFzPScgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2VcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuX21vZHVsZU5hbWUgPSBvcHRpb25zLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzeXN0ZW1jdGwgZW5hYmxlICcgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2VcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi5lbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIFVua25vd24gU2VydmljZSBUeXBlLCBpbnN0YWxsIGFzIGEgUHNldWRvIFNlcnZpY2UgKE1lc2hEYWVtb24pCiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucycpOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBvcHRpb25zLm5hbWUpKSB7IHJlcXVpcmUoJ2ZzJykubWtkaXJTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lKTsgfQogICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy9kYWVtb24nKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGVHdWlkID0gJ0I5OTYwMTU4ODA1NDRBMTlCN0Y3RTlCRTQ0OTE0QzE4JzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhZW1vbkpTID0gQnVmZmVyLmZyb20oJ0x5b0tRMjl3ZVhKcFoyaDBJREl3TVRrZ1NXNTBaV3dnUTI5eWNHOXlZWFJwYjI0S0NreHBZMlZ1YzJWa0lIVnVaR1Z5SUhSb1pTQkJjR0ZqYUdVZ1RHbGpaVzV6WlN3Z1ZtVnljMmx2YmlBeUxqQWdLSFJvWlNBaVRHbGpaVzV6WlNJcE93cDViM1VnYldGNUlHNXZkQ0IxYzJVZ2RHaHBjeUJtYVd4bElHVjRZMlZ3ZENCcGJpQmpiMjF3YkdsaGJtTmxJSGRwZEdnZ2RHaGxJRXhwWTJWdWMyVXVDbGx2ZFNCdFlYa2diMkowWVdsdUlHRWdZMjl3ZVNCdlppQjBhR1VnVEdsalpXNXpaU0JoZEFvS0lDQWdJR2gwZEhBNkx5OTNkM2N1WVhCaFkyaGxMbTl5Wnk5c2FXTmxibk5sY3k5TVNVTkZUbE5GTFRJdU1Bb0tWVzVzWlhOeklISmxjWFZwY21Wa0lHSjVJR0Z3Y0d4cFkyRmliR1VnYkdGM0lHOXlJR0ZuY21WbFpDQjBieUJwYmlCM2NtbDBhVzVuTENCemIyWjBkMkZ5WlFwa2FYTjBjbWxpZFhSbFpDQjFibVJsY2lCMGFHVWdUR2xqWlc1elpTQnBjeUJrYVhOMGNtbGlkWFJsWkNCdmJpQmhiaUFpUVZNZ1NWTWlJRUpCVTBsVExBcFhTVlJJVDFWVUlGZEJVbEpCVGxSSlJWTWdUMUlnUTA5T1JFbFVTVTlPVXlCUFJpQkJUbGtnUzBsT1JDd2daV2wwYUdWeUlHVjRjSEpsYzNNZ2IzSWdhVzF3YkdsbFpDNEtVMlZsSUhSb1pTQk1hV05sYm5ObElHWnZjaUIwYUdVZ2MzQmxZMmxtYVdNZ2JHRnVaM1ZoWjJVZ1oyOTJaWEp1YVc1bklIQmxjbTFwYzNOcGIyNXpJR0Z1WkFwc2FXMXBkR0YwYVc5dWN5QjFibVJsY2lCMGFHVWdUR2xqWlc1elpTNEtLaThLQ2dwcFppQW9jSEp2WTJWemN5NWhjbWQyTG14bGJtZDBhQ0E4SURNcENuc0tJQ0FnSUdOdmJuTnZiR1V1Ykc5bktDZDFjMkZuWlRvZ1pHRmxiVzl1SUZzZ2MzUmhjblFnZkNCemRHOXdJSHdnYzNSaGRIVnpJRjBnVzNObGNuWnBZMlZkSnlrN0NpQWdJQ0J3Y205alpYTnpMbVY0YVhRb0tUc0tmUW9LZG1GeUlITWdQU0J1ZFd4c093cDBjbmtLZXdvZ0lDQWdjeUE5SUhKbGNYVnBjbVVvSjNObGNuWnBZMlV0YldGdVlXZGxjaWNwTG0xaGJtRm5aWEl1WjJWMFUyVnlkbWxqWlNod2NtOWpaWE56TG1GeVozWmJNbDBwT3dwOUNtTmhkR05vS0hncENuc0tJQ0FnSUdOdmJuTnZiR1V1Ykc5bktIZ3BPd29nSUNBZ2NISnZZMlZ6Y3k1bGVHbDBLQ2s3Q24wS0NuTjNhWFJqYUNod2NtOWpaWE56TG1GeVozWmJNVjBwQ25zS0lDQWdJR05oYzJVZ0ozTjBZWEowSnpvS0lDQWdJQ0FnSUNCekxuTjBZWEowS0NrN0NpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29KMU4wWVhKMGFXNW5MaTR1SnlrN0NpQWdJQ0FnSUNBZ1luSmxZV3M3Q2lBZ0lDQmpZWE5sSUNkemRHOXdKem9LSUNBZ0lDQWdJQ0J6TG5OMGIzQW9LVHNLSUNBZ0lDQWdJQ0JqYjI1emIyeGxMbXh2WnlnblUzUnZjSEJwYm1jdUxpNG5LVHNLSUNBZ0lDQWdJQ0JpY21WaGF6c0tJQ0FnSUdOaGMyVWdKM04wWVhSMWN5YzZDaUFnSUNBZ0lDQWdhV1lnS0hNdWFYTlNkVzV1YVc1bktDa3BDaUFnSUNBZ0lDQWdld29nSUNBZ0lDQWdJQ0FnSUNCamIyNXpiMnhsTG14dlp5Z25VblZ1Ym1sdVp5d2dVRWxFSUQwZ0p5QXJJSEpsY1hWcGNtVW9KMlp6SnlrdWNtVmhaRVpwYkdWVGVXNWpLQ2N2ZFhOeUwyeHZZMkZzTDIxbGMyaGZaR0ZsYlc5dWN5OG5JQ3NnY0hKdlkyVnpjeTVoY21kMld6SmRJQ3NnSnk5d2FXUW5LUzUwYjFOMGNtbHVaeWdwS1RzS0lDQWdJQ0FnSUNCOUNpQWdJQ0FnSUNBZ1pXeHpaUW9nSUNBZ0lDQWdJSHNLSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29KMDV2ZENCeWRXNXVhVzVuSnlrN0NpQWdJQ0FnSUNBZ2ZRb2dJQ0FnSUNBZ0lHSnlaV0ZyT3dvZ0lDQWdaR1ZtWVhWc2REb0tJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExteHZaeWduVlc1cmJtOTNiaUJqYjIxdFlXNWtPaUFuSUNzZ2NISnZZMlZ6Y3k1aGNtZDJXekZkS1RzS0lDQWdJQ0FnSUNCaWNtVmhhenNLZlFvS2NISnZZMlZ6Y3k1bGVHbDBLQ2s3Q2c9PScsICdiYXNlNjQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZSA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKHByb2Nlc3MuZXhlY1BhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFkZGluZyA9IEJ1ZmZlci5hbGxvYyg4IC0gKChleGUubGVuZ3RoICsgZGFlbW9uSlMubGVuZ3RoICsgMTYgKyA0KSAlIDgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy9kYWVtb24nLCB7IGZsYWdzOiAid2IiIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGFlbW9uSlNMZW4gPSBCdWZmZXIuYWxsb2MoNCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhZW1vbkpTTGVuLndyaXRlVUludDMyQkUoZGFlbW9uSlMubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHcud3JpdGUoZXhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZGRpbmcubGVuZ3RoID4gMCkgeyB3LndyaXRlKHBhZGRpbmcpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIHcud3JpdGUoZGFlbW9uSlMpOwogICAgICAgICAgICAgICAgICAgICAgICB3LndyaXRlKGRhZW1vbkpTTGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgdy53cml0ZShCdWZmZXIuZnJvbShleGVHdWlkLCAnaGV4JykpOwogICAgICAgICAgICAgICAgICAgICAgICB3LmVuZCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG1vZFN5bmMoJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zL2RhZW1vbicsIHJlcXVpcmUoJ2ZzJykuc3RhdFN5bmMoJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zL2RhZW1vbicpLm1vZGUgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVhHUlApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhvcHRpb25zLnNlcnZpY2VQYXRoLCAnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLnN0YXRTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgb3B0aW9ucy50YXJnZXQpLm1vZGU7CiAgICAgICAgICAgICAgICAgICAgbSB8PSAocmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYVVNSIHwgcmVxdWlyZSgnZnMnKS5DSE1PRF9NT0RFUy5TX0lYR1JQKTsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX2RhZW1vbnMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0LCBtKTsKCiAgICAgICAgICAgICAgICAgICAgY29uZiA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0oJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLnNlcnZpY2UnLCB7IGZsYWdzOiAnd2InIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ3dvcmtpbmdEaXJlY3Rvcnk9JyArICcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJ1xuJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFvcHRpb25zLnBhcmFtZXRlcnMpIHtvcHRpb25zLnBhcmFtZXRlcnMgPSBbXTt9CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbWV0ZXJzLnVuc2hpZnQob3B0aW9ucy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICBjb25mLndyaXRlKCdwYXJhbWV0ZXJzPScgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtZXRlcnMpICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbWV0ZXJzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPT0gbnVsbCB8fCBvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYud3JpdGUoJ3Jlc3Bhd25cbicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25mLmVuZCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnSW5zdGFsbGluZyBhcyBTZXJ2aWNlLCByZXF1aXJlcyByb290Jyk7IH0KCiAgICAgICAgICAgIC8vIE1hYyBPUwogICAgICAgICAgICB2YXIgc3Rkb3V0cGF0aCA9IChvcHRpb25zLnN0ZG91dCA/ICgnPGtleT5TdGFuZGFyZE91dFBhdGg8L2tleT5cbjxzdHJpbmc+JyArIG9wdGlvbnMuc3Rkb3V0ICsgJzwvc3RyaW5nPicpIDogJycpOwogICAgICAgICAgICB2YXIgYXV0b1N0YXJ0ID0gKG9wdGlvbnMuc3RhcnRUeXBlID09ICdBVVRPX1NUQVJUJyA/ICc8dHJ1ZS8+JyA6ICc8ZmFsc2UvPicpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gICcgICAgIDxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlxuJzsKICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDxhcnJheT5cbic7CiAgICAgICAgICAgIHBhcmFtcyArPSAoJyAgICAgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBpZihvcHRpb25zLnBhcmFtZXRlcnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcih2YXIgaXRtIGluIG9wdGlvbnMucGFyYW1ldGVycykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMgKz0gKCcgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnBhcmFtZXRlcnNbaXRtXSArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAKICAgICAgICAgICAgcGFyYW1zICs9ICcgICAgIDwvYXJyYXk+XG4nOwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBsaXN0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnPHBsaXN0IHZlcnNpb249IjEuMCI+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnICA8ZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PkxhYmVsPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5uYW1lICsgJzwvc3RyaW5nPlxuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9IChwYXJhbXMgKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+V29ya2luZ0RpcmVjdG9yeTwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+L3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gKHN0ZG91dHBhdGggKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoYXV0b1N0YXJ0ICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PktlZXBBbGl2ZTwva2V5PlxuJzsKICAgICAgICAgICAgaWYob3B0aW9ucy5m", 16000);
|
|
memcpy_s(_servicemanager + 144000, 24688, "YWlsdXJlUmVzdGFydCA9PSBudWxsIHx8IG9wdGlvbnMuZmFpbHVyZVJlc3RhcnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGRpY3Q+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDxrZXk+Q3Jhc2hlZDwva2V5PlxuJzsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgICA8dHJ1ZS8+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDwvZGljdD5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGZhbHNlLz5cbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5UaHJvdHRsZUludGVydmFsPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8L3BsaXN0Pic7CgogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzJykpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcycpOyB9CiAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSkpIHsgcmVxdWlyZSgnZnMnKS5ta2RpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lKTsgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmluYXJ5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5iaW5hcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY29weUZpbGVTeW5jKG9wdGlvbnMuc2VydmljZVBhdGgsICcvdXNyL2xvY2FsL21lc2hfc2VydmljZXMvJyArIG9wdGlvbnMubmFtZSArICcvJyArIG9wdGlvbnMudGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy5wbGlzdCcsIHBsaXN0KTsKICAgICAgICAgICAgICAgIHZhciBtID0gcmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCkubW9kZTsKICAgICAgICAgICAgICAgIG0gfD0gKHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWFVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JWEdSUCk7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNobW9kU3luYygnL3Vzci9sb2NhbC9tZXNoX3NlcnZpY2VzLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBvcHRpb25zLnRhcmdldCwgbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ1NlcnZpY2U6ICcgKyBvcHRpb25zLm5hbWUgKyAnIGFscmVhZHkgZXhpc3RzJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmZpbGVzKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBvcHRpb25zLmZpbGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc1tpXS5fYnVmZmVyKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3dyaXRpbmcgJyArIGV4dHJhY3RGaWxlTmFtZShvcHRpb25zLmZpbGVzW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2VydmljZVBsYXRmb3JtID09ICd1bmtub3duJykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKCcvdXNyL2xvY2FsL21lc2hfZGFlbW9ucy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOw0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pLCBvcHRpb25zLmZpbGVzW2ldLl9idWZmZXIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvcHlpbmcgJyArIGV4dHJhY3RGaWxlU291cmNlKG9wdGlvbnMuZmlsZXNbaV0pKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zZXJ2aWNlUGxhdGZvcm0gPT0gJ3Vua25vd24nKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgJy91c3IvbG9jYWwvbWVzaF9kYWVtb25zLycgKyBvcHRpb25zLm5hbWUgKyAnLycgKyBleHRyYWN0RmlsZU5hbWUob3B0aW9ucy5maWxlc1tpXSkpOw0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLmNvcHlGaWxlU3luYyhleHRyYWN0RmlsZVNvdXJjZShvcHRpb25zLmZpbGVzW2ldKSwgJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgb3B0aW9ucy5uYW1lICsgJy8nICsgZXh0cmFjdEZpbGVOYW1lKG9wdGlvbnMuZmlsZXNbaV0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgewogICAgICAgIHRoaXMuaW5zdGFsbExhdW5jaEFnZW50ID0gZnVuY3Rpb24gaW5zdGFsbExhdW5jaEFnZW50KG9wdGlvbnMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIShvcHRpb25zLnVpZCB8fCBvcHRpb25zLnVzZXIpICYmICF0aGlzLmlzQWRtaW4oKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdJbnN0YWxsaW5nIGEgR2xvYmFsIEFnZW50L0RhZW1vbiwgcmVxdWlyZXMgYWRtaW4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNlcnZpY2VQYXRoVG9rZW5zID0gb3B0aW9ucy5zZXJ2aWNlUGF0aC5zcGxpdCgnLycpOwogICAgICAgICAgICBzZXJ2aWNlUGF0aFRva2Vucy5wb3AoKTsKICAgICAgICAgICAgaWYgKHNlcnZpY2VQYXRoVG9rZW5zLnBlZWsoKSA9PSAnLicpIHsgc2VydmljZVBhdGhUb2tlbnMucG9wKCk7IH0KICAgICAgICAgICAgb3B0aW9ucy53b3JraW5nRGlyZWN0b3J5ID0gc2VydmljZVBhdGhUb2tlbnMuam9pbignLycpOwoKICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9IChvcHRpb25zLnN0YXJ0VHlwZSA9PSAnQVVUT19TVEFSVCcgPyAnPHRydWUvPicgOiAnPGZhbHNlLz4nKTsKICAgICAgICAgICAgdmFyIHN0ZG91dHBhdGggPSAob3B0aW9ucy5zdGRvdXQgPyAoJzxrZXk+U3RhbmRhcmRPdXRQYXRoPC9rZXk+XG48c3RyaW5nPicgKyBvcHRpb25zLnN0ZG91dCArICc8L3N0cmluZz4nKSA6ICcnKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICAgICAgICAgJyAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOwogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8YXJyYXk+XG4nOwogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5zZXJ2aWNlUGF0aCArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpdG0gaW4gb3B0aW9ucy5wYXJhbWV0ZXJzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAgICgnICAgICAgICAgPHN0cmluZz4nICsgb3B0aW9ucy5wYXJhbWV0ZXJzW2l0bV0gKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwYXJhbXMgKz0gICAgICAgICAgICAnICAgICA8L2FycmF5PlxuJzsKCiAgICAgICAgICAgIHZhciBwbGlzdCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJzxwbGlzdCB2ZXJzaW9uPSIxLjAiPlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgPGRpY3Q+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsKICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+JyArIG9wdGlvbnMubmFtZSArICc8L3N0cmluZz5cbicpOwogICAgICAgICAgICBwbGlzdCArPSAocGFyYW1zICsgJ1xuJyk7CiAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PldvcmtpbmdEaXJlY3Rvcnk8L2tleT5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICgnICAgICA8c3RyaW5nPicgKyBvcHRpb25zLndvcmtpbmdEaXJlY3RvcnkgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gKHN0ZG91dHBhdGggKyAnXG4nKTsKICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICBwbGlzdCArPSAoYXV0b1N0YXJ0ICsgJ1xuJyk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnNlc3Npb25UeXBlcyAmJiBvcHRpb25zLnNlc3Npb25UeXBlcy5sZW5ndGggPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MaW1pdExvYWRUb1Nlc3Npb25UeXBlPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxhcnJheT5cbic7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHlwZSBpbiBvcHRpb25zLnNlc3Npb25UeXBlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlc3Npb25UeXBlc1tzdHlwZV0gKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8L2FycmF5PlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5LZWVwQWxpdmU8L2tleT5cbic7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmZhaWx1cmVSZXN0YXJ0ID09IG51bGwgfHwgb3B0aW9ucy5mYWlsdXJlUmVzdGFydCA+IDApIHsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZGljdD5cbic7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICAgPGtleT5DcmFzaGVkPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgIDx0cnVlLz5cbic7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9kaWN0PlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZmFsc2UvPlxuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5UaHJvdHRsZUludGVydmFsPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxpbnRlZ2VyPicgKyAob3B0aW9ucy5mYWlsdXJlUmVzdGFydCAvIDEwMDApICsgJzwvaW50ZWdlcj5cbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgIHBsaXN0ICs9ICc8L3BsaXN0Pic7CgogICAgICAgICAgICBpZiAob3B0aW9ucy51aWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMudXNlciA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRVc2VybmFtZShvcHRpb25zLnVpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBmb2xkZXIgPSBvcHRpb25zLnVzZXIgPyAocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIob3B0aW9ucy51c2VyKSArICcvTGlicmFyeS9MYXVuY2hBZ2VudHMvJykgOiAnL0xpYnJhcnkvTGF1bmNoQWdlbnRzLyc7CiAgICAgICAgICAgIG9wdGlvbnMuZ2lkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEdyb3VwSUQob3B0aW9ucy51aWQpOwogICAgICAgICAgICBpZiAoIXJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhmb2xkZXIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLm1rZGlyU3luYyhmb2xkZXIpOwogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5jaG93blN5bmMoZm9sZGVyLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhmb2xkZXIgKyBvcHRpb25zLm5hbWUgKyAnLnBsaXN0JywgcGxpc3QpOwogICAgICAgICAgICBpZihvcHRpb25zLnVzZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2hvd25TeW5jKGZvbGRlciArIG9wdGlvbnMubmFtZSArICcucGxpc3QnLCBvcHRpb25zLnVpZCwgb3B0aW9ucy5naWQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIHRoaXMudW5pbnN0YWxsU2VydmljZSA9IGZ1bmN0aW9uIHVuaW5zdGFsbFNlcnZpY2UobmFtZSkKICAgIHsKICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbigpKSB7IHRocm93ICgnVW5pbnN0YWxsaW5nIGEgc2VydmljZSwgcmVxdWlyZXMgYWRtaW4nKTsgfQoKICAgICAgICBpZiAodHlwZW9mIChuYW1lKSA9PSAnb2JqZWN0JykgeyBuYW1lID0gbmFtZS5uYW1lOyB9CiAgICAgICAgdmFyIHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UobmFtZSk7CiAgICAgICAgdmFyIHNlcnZpY2VQYXRoID0gc2VydmljZS5hcHBMb2NhdGlvbigpOwoKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnL0MgWSAvTiAvRCBZIC9UIDIgJiBkZWwgIicgKyBzZXJ2aWNlUGF0aCArICciJ10sIHsgdHlwZTogNCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5wcm94eS5EZWxldGVTZXJ2aWNlKHNlcnZpY2UuX3NlcnZpY2UpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnVW5pbnN0YWxsIFNlcnZpY2UgZm9yOiAnICsgbmFtZSArICcsIGZhaWxlZCB3aXRoIGVycm9yOiAnICsgdGhpcy5wcm94eTIuR2V0TGFzdEVycm9yKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7CiAgICAgICAgICAgIHNlcnZpY2UgPSBudWxsOwoKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCiAgICAgICAgICAgICAgICByZWcuRGVsZXRlS2V5KHJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXCcgKyBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlZSkKICAgICAgICAgICAgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoICh0aGlzLmdldFNlcnZpY2VUeXBlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2V0Yy9pbml0LmQvJyArIG5hbWUpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdC5kIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdzZXJ2aWNlICcgKyBuYW1lICsgJyBzdG9wXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCd1cGRhdGUtcmMuZCAtZiAnICsgbmFtZSArICcgcmVtb3ZlXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoJy9ldGMvaW5pdC5kLycgKyBuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyB1bmluc3RhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvaW5pdC8nICsgbmFtZSArICcuY29uZicpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBzdGFydCBzZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnc2VydmljZSAnICsgbmFtZSArICcgc3RvcFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvZXRjL2luaXQvJyArIG5hbWUgKyAnLmNvbmYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyB1bmluc3RhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyBjb3VsZCBub3QgYmUgdW5pbnN0YWxsZWQnLCBlKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0gfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBzdG9wICcgKyBuYW1lICsgJy5zZXJ2aWNlXG4nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ3N5c3RlbWN0bCBkaXNhYmxlICcgKyBuYW1lICsgJy5zZXJ2aWNlXG4nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZS53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpKSB7IHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYygnL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbGliL3N5c3RlbWQvc3lzdGVtLycgKyBuYW1lICsgJy5zZXJ2aWNlJykpIHsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS8nICsgbmFtZSArICcuc2VydmljZScpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUgKyAnIHVuaW5zdGFsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKQogICAg", 16000);
|
|
memcpy_s(_servicemanager + 160000, 8688, "ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobmFtZSArICcgY291bGQgbm90IGJlIHVuaW5zdGFsbGVkJywgZSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyB1bmtub3duIHBsYXRmb3JtIHNlcnZpY2UgdHlwZQogICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzUnVubmluZygpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2VQYXRoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goeCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2UuY29uZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoKHgpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyB1bmluc3RhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG5hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIHN0b3AgJyArIG5hbWUgKyAnXG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdsYXVuY2hjdGwgdW5sb2FkIC9MaWJyYXJ5L0xhdW5jaERhZW1vbnMvJyArIG5hbWUgKyAnLnBsaXN0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyBuYW1lICsgJy5wbGlzdCcpOwogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhzZXJ2aWNlUGF0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgdW5pbnN0YWxsaW5nIHNlcnZpY2U6ICcgKyBuYW1lICsgJyA9PiAnICsgZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5ybWRpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnU2VydmljZTogJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgICAgICB7CiAgICAgICAgICAgIHNlcnZpY2Uuc3RvcCgpOwogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMoc2VydmljZS5hcHBMb2NhdGlvbigpKTsKICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHNlcnZpY2UucmMpOwogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS5ybWRpclN5bmMoJy91c3IvbG9jYWwvbWVzaF9zZXJ2aWNlcy8nICsgbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsgfQogICAgICAgIH0KICAgIH0KCiAgICB0aGlzLmdldFNlcnZpY2VUeXBlID0gZnVuY3Rpb24gZ2V0U2VydmljZVR5cGUoKQogICAgewogICAgICAgIHZhciBwbGF0Zm9ybSA9ICd1bmtub3duJzsKICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ3dpbjMyJzoKICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbmRvd3MnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgICAgICAgICAgcGxhdGZvcm0gPSAnZnJlZWJzZCc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ2xhdW5jaGQnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gcmVxdWlyZSgncHJvY2Vzcy1tYW5hZ2VyJykuZ2V0UHJvY2Vzc0luZm8oMSkuTmFtZTsKICAgICAgICAgICAgICAgIGlmIChwbGF0Zm9ybSA9PSAiYnVzeWJveCIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzIC1heCAtbyBwaWQgLW8gY29tbWFuZCB8IGF3ayAneyBpZigkMT09XCIxXCIpIHsgJDE9XCJcIjsgc3BsaXQoJDAsIHJlcywgXCIgXCIpOyBwcmludCByZXNbMl07IH19J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09ICdpbml0JykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2luaXQnKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3Vwc3RhcnQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhdGZvcm0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3lzdGVtZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHBsYXRmb3JtKTsKICAgIH07CgoKICAgIHRoaXMuZGFlbW9uID0gZnVuY3Rpb24gZGFlbW9uKHBhdGgsIHBhcmFtZXRlcnMsIG9wdGlvbnMpCiAgICB7CiAgICAgICAgdmFyIHRtcCA9IEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpOwogICAgICAgIHRtcCA9IHRtcC5zdWJzdHJpbmcoMSwgdG1wLmxlbmd0aCAtIDEpOwoKICAgICAgICBpZiAoIW9wdGlvbnMpIHsgb3B0aW9ucyA9IHt9OyB9CiAgICAgICAgdmFyIGNoaWxkUGFybXMgPSAiXAogICAgICAgICAgICB2YXIgY2hpbGQgPSBudWxsOyBcCiAgICAgICAgICAgIHZhciBvcHRpb25zID0gIiArIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpICsgIjtcCiAgICAgICAgICAgIGlmKG9wdGlvbnMubG9nT3V0cHV0KVwKICAgICAgICAgICAgeyBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkxPR0ZJTEUpOyBjb25zb2xlLmxvZygnTG9nZ2luZyBPdXRwdXRzLi4uJyk7IH1cCiAgICAgICAgICAgIGVsc2VcCiAgICAgICAgICAgIHtcCiAgICAgICAgICAgICAgY29uc29sZS5zZXREZXN0aW5hdGlvbihjb25zb2xlLkRlc3RpbmF0aW9ucy5ESVNBQkxFRCk7XAogICAgICAgICAgICB9XAogICAgICAgICAgICBmdW5jdGlvbiBjbGVhbnVwQW5kRXhpdCgpXAogICAgICAgICAgICB7XAogICAgICAgICAgICAgICAgaWYob3B0aW9ucy5waWRQYXRoKSB7IHRyeXtyZXF1aXJlKCdmcycpLnVubGlua1N5bmMob3B0aW9ucy5waWRQYXRoKTt9IGNhdGNoKHgpe30gfVwKICAgICAgICAgICAgfVwKICAgICAgICAgICAgZnVuY3Rpb24gc3Bhd25DaGlsZCgpXAogICAgICAgICAgICB7XAogICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJyIgKyBwYXRoICsgIicsIFsnIiArIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyBwYXRoLnNwbGl0KCdcXCcpLnBvcCgpIDogcGF0aC5zcGxpdCgnLycpLnBvcCgpICsgIiciICsgKHRtcCAhPSAnJyA/ICgiLCAiICsgdG1wKSA6ICIiKSkgKyAiXSk7XAogICAgICAgICAgICAgICAgaWYoY2hpbGQpXAogICAgICAgICAgICAgICAge1wKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbihjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7IH0pO1wKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbihjKSB7IGNvbnNvbGUubG9nKGMudG9TdHJpbmcoKSk7IH0pO1wKICAgICAgICAgICAgICAgICAgICBjaGlsZC5vbmNlKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIFwKICAgICAgICAgICAgICAgICAgICB7XAogICAgICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25zLmNyYXNoUmVzdGFydCkgeyBzcGF3bkNoaWxkKCk7IH0gZWxzZSB7IGNsZWFudXBBbmRFeGl0KCk7IH1cCiAgICAgICAgICAgICAgICAgICAgfSk7XAogICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgfVwKICAgICAgICAgICAgaWYob3B0aW9ucy5waWRQYXRoKSB7IHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYyhvcHRpb25zLnBpZFBhdGgsIHByb2Nlc3MucGlkLnRvU3RyaW5nKCkpOyB9XAogICAgICAgICAgICBzcGF3bkNoaWxkKCk7XAogICAgICAgICAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgZnVuY3Rpb24oKVwKICAgICAgICAgICAge1wKICAgICAgICAgICAgICAgIGlmKGNoaWxkKSB7IGNoaWxkLmtpbGwoKTsgfVwKICAgICAgICAgICAgICAgIGNsZWFudXBBbmRFeGl0KCk7XAogICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KCk7XAogICAgICAgICAgICB9KTsiOwogICAgICAgIAogICAgICAgIHZhciBwYXJtcyA9IFtwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyBwcm9jZXNzLmV4ZWNQYXRoLnNwbGl0KCdcXCcpLnBvcCgpIDogcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnLycpLnBvcCgpXTsKICAgICAgICBwYXJtcy5wdXNoKCctYjY0ZXhlYycpOwogICAgICAgIHBhcm1zLnB1c2goQnVmZmVyLmZyb20oY2hpbGRQYXJtcykudG9TdHJpbmcoJ2Jhc2U2NCcpKTsKICAgICAgICBvcHRpb25zLl9wYXJtcyA9IHBhcm1zOwogICAgICAgIG9wdGlvbnMuZGV0YWNoZWQgPSB0cnVlOwogICAgICAgIG9wdGlvbnMudHlwZSA9IDQ7CgogICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBvcHRpb25zLl9wYXJtcywgb3B0aW9ucyk7ICAgICAgIAogICAgICAgIGlmICghY2hpbGQpIHsgdGhyb3cgKCdFcnJvciBzcGF3bmluZyBwcm9jZXNzJyk7IH0KICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBzZXJ2aWNlTWFuYWdlcjsKbW9kdWxlLmV4cG9ydHMubWFuYWdlciA9IG5ldyBzZXJ2aWNlTWFuYWdlcigpOwoKaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCnsKICAgIG1vZHVsZS5leHBvcnRzLmdldE9TVmVyc2lvbiA9IGdldE9TVmVyc2lvbjsKfQo=", 8688);
|
|
ILibBase64DecodeEx((unsigned char*)_servicemanager, 168688, (unsigned char*)_servicemanager + 168688);
|
|
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 + 168688);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_servicemanager);
|
|
|
|
char *_usersessions = ILibMemory_Allocate(106484, 0, NULL, NULL);
|
|
memcpy_s(_usersessions + 0, 60848, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBOT1RJRllfRk9SX1RISVNfU0VTU0lPTiA9IDA7CnZhciBOT1RJRllfRk9SX0FMTF9TRVNTSU9OUyA9IDE7CnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsKdmFyIFdNX1BPV0VSQlJPQURDQVNUID0gMHgyMTg7CnZhciBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFID0gMHg4MDEzOwp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7CnZhciBQQlRfQVBNUkVTVU1FU1VTUEVORCA9IDB4NzsKdmFyIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUMgPSAweDEyOwp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOwp2YXIgUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiA9IDB4MDQwMDsNCnZhciBUT0tFTl9RVUVSWSA9IDB4MDAwODsNCnZhciBUb2tlblVzZXIgPSAxOwp2YXIgVG9rZW5UeXBlID0gODsKdmFyIFRva2VuU2Vzc2lvbklkID0gMTI7CnZhciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSID0gMTIyOw0KdmFyIEhFQVBfWkVST19NRU1PUlkgPSAweDAwMDAwMDA4Ow0KCnZhciBXVFNfQ09OU09MRV9DT05ORUNUICAgICAgICAgPSAoMHgxKTsKdmFyIFdUU19DT05TT0xFX0RJU0NPTk5FQ1QgICAgICA9ICgweDIpOwp2YXIgV1RTX1JFTU9URV9DT05ORUNUICAgICAgICAgID0gKDB4Myk7CnZhciBXVFNfUkVNT1RFX0RJU0NPTk5FQ1QgICAgICAgPSAoMHg0KTsKdmFyIFdUU19TRVNTSU9OX0xPR09OICAgICAgICAgICA9ICgweDUpOwp2YXIgV1RTX1NFU1NJT05fTE9HT0ZGICAgICAgICAgID0gKDB4Nik7CnZhciBXVFNfU0VTU0lPTl9MT0NLICAgICAgICAgICAgPSAoMHg3KTsKdmFyIFdUU19TRVNTSU9OX1VOTE9DSyAgICAgICAgICA9ICgweDgpOwp2YXIgV1RTX1NFU1NJT05fUkVNT1RFX0NPTlRST0wgID0gKDB4OSk7CnZhciBXVFNfU0VTU0lPTl9DUkVBVEUgICAgICAgICAgPSAoMHhBKTsKdmFyIFdUU19TRVNTSU9OX1RFUk1JTkFURSAgICAgICA9ICgweEIpOwoKdmFyIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0U7CnZhciBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkc7CnZhciBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURTsKCmZ1bmN0aW9uIGNvbHVtblBhcnNlKGRhdGEsIGRlbGltaXRlcikKewogICAgdmFyIHRva2VucyA9IGRhdGEuc3BsaXQoZGVsaW1pdGVyKTsKICAgIHZhciByZXQgPSBbXTsKICAgIGZvcih2YXIgaSBpbiB0b2tlbnMpCiAgICB7CiAgICAgICAgaWYgKHRva2Vuc1tpXS5sZW5ndGggPiAwKSB7IHJldC5wdXNoKHRva2Vuc1tpXSk7IH0KICAgIH0KICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIFVzZXJTZXNzaW9ucygpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3VzZXItc2Vzc2lvbnMnOwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2NoYW5nZWQnKQogICAgICAgIC5jcmVhdGVFdmVudCgnbG9ja2VkJykKICAgICAgICAuY3JlYXRlRXZlbnQoJ3VubG9ja2VkJyk7CgogICAgdGhpcy5lbnVtZXJhdGVVc2VycyA9IGZ1bmN0aW9uIGVudW1lcmF0ZVVzZXJzKCkKICAgIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuX19yZXNvbHZlciA9IHJlczsKICAgICAgICAgICAgdGhpcy5fX3JlamVjdG9yID0gcmVqOwogICAgICAgIH0pOwogICAgICAgIHAuX19oYW5kbGVyID0gZnVuY3Rpb24gX19oYW5kbGVyKHVzZXJzKQogICAgICAgIHsKICAgICAgICAgICAgcC5fX3Jlc29sdmVyKHVzZXJzKTsKICAgICAgICB9OwogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5DdXJyZW50KHAuX19oYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2goZSkKICAgICAgICB7CiAgICAgICAgICAgIHAuX19yZWplY3RvcihlKTsKICAgICAgICB9CiAgICAgICAgcC5wYXJlbnQgPSB0aGlzOwogICAgICAgIHJldHVybiAocCk7CiAgICB9CgogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykKICAgIHsKICAgICAgICB0aGlzLl9zZXJ2aWNlSG9va2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fbWFyc2hhbCA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgIHRoaXMuX2tlcm5lbDMyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnS2VybmVsMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHZXRMYXN0RXJyb3InKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1dUU0dldEFjdGl2ZUNvbnNvbGVTZXNzaW9uSWQnKQogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VIYW5kbGUnKTsKCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aGlzLl93dHMgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdXdHNhcGkzMi5kbGwnKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRW51bWVyYXRlU2Vzc2lvbnNBJyk7CiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVycpOwogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOwogICAgICAgIH0KICAgICAgICBjYXRjaChleGMpCiAgICAgICAgewogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQ2hlY2tUb2tlbk1lbWJlcnNoaXAnKTsKICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7CgogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1VucmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nKTsKICAgICAgICB0aGlzLl9ycGNydCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ1JwY3J0NC5kbGwnKTsKICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOwogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCA9IGZ1bmN0aW9uIFN0cmluZ1RvVVVJRChndWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7CiAgICAgICAgICAgIGlmKFN0cmluZ1RvVVVJRC51cy5fcnBjcnQuVXVpZEZyb21TdHJpbmdBKFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShndWlkKSwgcmV0VmFsKS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdDb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVVJRCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRC51cyA9IHRoaXM7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdPcGVuUHJvY2VzcycpCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ09wZW5Qcm9jZXNzVG9rZW4nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0dldFRva2VuSW5mb3JtYXRpb24nKTsNCiAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5DcmVhdGVNZXRob2QoJ0xvb2t1cEFjY291bnRTaWRXJyk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdPcGVuVGhyZWFkVG9rZW4nKTsNCiAgICAgICAgfQogICAgICAgIGNhdGNoKGUpCiAgICAgICAgew0KICAgICAgICB9CgoKICAgICAgICBHVUlEX0FDRENfUE9XRVJfU09VUkNFID0gdGhpcy5fcnBjcnQuU3RyaW5nVG9VVUlEKCc1ZDNlOWE1OS1lOUQ1LTRiMDAtYTZiZC1mZjM0ZmY1MTY1NDgnKTsKICAgICAgICBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJ2E3YWQ4MDQxLWI0NWEtNGNhZS04N2EzLWVlY2JiNDY4YTllMScpOwogICAgICAgIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFID0gdGhpcy5fcnBjcnQuU3RyaW5nVG9VVUlEKCc2ZmU2OTU1Ni03MDRhLTQ3YTAtOGYyNC1jMjhkOTM2ZmRhNDcnKTsKCiAgICAgICAgdGhpcy5TZXNzaW9uU3RhdGVzID0gWydBY3RpdmUnLCAnQ29ubmVjdGVkJywgJ0Nvbm5lY3RRdWVyeScsICdTaGFkb3cnLCAnRGlzY29ubmVjdGVkJywgJ0lkbGUnLCAnTGlzdGVuaW5nJywgJ1Jlc2V0JywgJ0Rvd24nLCAnSW5pdCddOwogICAgICAgIHRoaXMuSW5mb0NsYXNzID0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ1dUU0luaXRpYWxQcm9ncmFtJzogMCwKICAgICAgICAgICAgICAgICdXVFNBcHBsaWNhdGlvbk5hbWUnOiAxLAogICAgICAgICAgICAgICAgJ1dUU1dvcmtpbmdEaXJlY3RvcnknOiAyLAogICAgICAgICAgICAgICAgJ1dUU09FTUlkJzogMywKICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uSWQnOiA0LAogICAgICAgICAgICAgICAgJ1dUU1VzZXJOYW1lJzogNSwKICAgICAgICAgICAgICAgICdXVFNXaW5TdGF0aW9uTmFtZSc6IDYsCiAgICAgICAgICAgICAgICAnV1RTRG9tYWluTmFtZSc6IDcsCiAgICAgICAgICAgICAgICAnV1RTQ29ubmVjdFN0YXRlJzogOCwKICAgICAgICAgICAgICAgICdXVFNDbGllbnRCdWlsZE51bWJlcic6IDksCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50TmFtZSc6IDEwLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudERpcmVjdG9yeSc6IDExLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb2R1Y3RJZCc6IDEyLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEhhcmR3YXJlSWQnOiAxMywKICAgICAgICAgICAgICAgICdXVFNDbGllbnRBZGRyZXNzJzogMTQsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlzcGxheSc6IDE1LAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudFByb3RvY29sVHlwZSc6IDE2LAogICAgICAgICAgICAgICAgJ1dUU0lkbGVUaW1lJzogMTcsCiAgICAgICAgICAgICAgICAnV1RTTG9nb25UaW1lJzogMTgsCiAgICAgICAgICAgICAgICAnV1RTSW5jb21pbmdCeXRlcyc6IDE5LAogICAgICAgICAgICAgICAgJ1dUU091dGdvaW5nQnl0ZXMnOiAyMCwKICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0ZyYW1lcyc6IDIxLAogICAgICAgICAgICAgICAgJ1dUU091dGdvaW5nRnJhbWVzJzogMjIsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50SW5mbyc6IDIzLAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JbmZvJzogMjQsCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbkluZm9FeCc6IDI1LAogICAgICAgICAgICAgICAgJ1dUU0NvbmZpZ0luZm8nOiAyNiwKICAgICAgICAgICAgICAgICdXVFNWYWxpZGF0aW9uSW5mbyc6IDI3LAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25BZGRyZXNzVjQnOiAyOCwKICAgICAgICAgICAgICAgICdXVFNJc1JlbW90ZVNlc3Npb24nOiAyOQogICAgICAgICAgICB9OwoKICAgICAgICB0aGlzLmlzUm9vdCA9IGZ1bmN0aW9uIGlzUm9vdCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgTlRBdXRob3JpdHkgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDYpOwogICAgICAgICAgICBOVEF1dGhvcml0eS50b0J1ZmZlcigpLndyaXRlSW50OCg1LCA1KTsKCiAgICAgICAgICAgIHZhciBBZG1pbmlzdHJhdG9yc0dyb3VwID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBhZG1pbiA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFwaS5BbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoTlRBdXRob3JpdHksIDIsIDMyLCA1NDQsIDAsIDAsIDAsIDAsIDAsIDAsIEFkbWluaXN0cmF0b3JzR3JvdXApLlZhbCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVJbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkNoZWNrVG9rZW5NZW1iZXJzaGlwKDAsIEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSwgbWVtYmVyKS5WYWwgIT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgIT0gMCkgeyBhZG1pbiA9IHRydWU7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFwaS5GcmVlU2lkKEFkbWluaXN0cmF0b3JzR3JvdXAuRGVyZWYoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFkbWluOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFByb2Nlc3NPd25lck5hbWUgPSBmdW5jdGlvbiBnZXRQcm9jZXNzT3duZXJOYW1lKHBpZCkKICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmV0ID0gbnVsbDsNCiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBkb21haW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOw0KICAgICAgICAgICAgdmFyIG5hbWVEb21haW5MZW5ndGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOyBuYW1lRG9tYWluTGVuZ3RoLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSgxMDI0KTsNCiAgICAgICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIHNpZHR5cGUgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIHRva2VudXNlciA9IDA7DQogICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsNCg0KICAgICAgICAgICAgdmFyIGggPSB0aGlzLl9rZXJuZWwzMi5PcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OLCAxLCBwaWQpOw0KICAgICAgICAgICAgaWYgKGguVmFsID09IDApIHsgdGhyb3cgKCdGYWlsZWQgdG8gcXVlcnkgcHJvY2VzcyBpZDogJyArIHBpZCk7IH0NCg0KICAgICAgICAgICAgaWYodGhpcy5fYWR2YXBpLk9wZW5Qcm9jZXNzVG9rZW4oaCwgVE9LRU5fUVVFUlksIHRva2VuKS5WYWw9PTApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUoaCk7DQogICAgICAgICAgICAgICAgdGhyb3cgKCdGYWlsZWQgdG8gUXVlcnkgUHJvY2VzcyBUb2tlbiBmb3IgcGlkOiAnICsgcGlkKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHRzaWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5TZXNzaW9uSWQsIHRzaWQsIDQsIGJ1ZmZlckxlbmd0aCk7DQogICAgICAgICAgICB0aGlzLl9hZHZhcGkuR2V0VG9rZW5JbmZvcm1hdGlvbih0b2tlbi5EZXJlZigpLCBUb2tlblVzZXIsIHRva2VudXNlciwgMCwgYnVmZmVyTGVuZ3RoKTsNCiAgICAgICAgICAgIHRva2VudXNlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoYnVmZmVyTGVuZ3RoLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOw0KDQogICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkdldFRva2VuSW5mb3JtYXRpb24odG9rZW4uRGVyZWYoKSwgVG9rZW5Vc2VyLCB0b2tlbnVzZXIsIGJ1ZmZlckxlbmd0aC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpLCBidWZmZXJMZW5ndGgpLlZhbCA9PSAwKSB7IHRocm93ICgnSW50ZXJuYWwgRXJyb3InKTsgfQ0KICAgICAgICAgICAgaWYodGhpcy5fYWR2YXBpLkxvb2t1cEFjY291bnRTaWRXKDAsIHRva2VudXNlci5EZXJlZigpLCBuYW1lLCBuYW1lRG9tYWluTGVuZ3RoLCBkb21haW4sIG5hbWVEb21haW5MZW5ndGgsIHNpZHR5cGUpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnTG9va3VwIEVycm9yJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgbmFtZS5fc2l6ZSA9IDA7IGRvbWFpbi5fc2l6ZSA9IDA7DQogICAgICAgICAgICAgICAgcmV0ID0geyBuYW1lOiBuYW1lLldpZGUyVVRGOCwgZG9tYWluOiBkb21haW4uV2lkZTJVVEY4LCB0c2lkOiB0c2lkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ2xvc2VIYW5kbGUodG9rZW4uRGVyZWYoKSk7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DbG9zZUhhbmRsZShoKTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfTsKCiAgICAgICAgdGhpcy5nZXRSYXdTZXNzaW9uQXR0cmlidXRlID0gZnVuY3Rpb24gZ2V0UmF3U2Vzc2lvbkF0dHJpYnV0ZShzZXNzaW9uSWQsIGF0dHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGJ5dGVzUmV0dXJuZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwoKICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblcoMCwgc2Vzc2lvbklkLCBhdHRyLCBidWZmZXIsIGJ5dGVzUmV0dXJuZWQpLlZhbCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblc6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsNCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBiID0gYnVmZmVyLkRlcmVmKCkuRGVyZWYoMCwgYnl0ZXNSZXR1cm5lZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKS50b0J1ZmZlcigpOwogICAgICAgICAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jKGJ5dGVzUmV0dXJuZWQudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7CiAgICAgICAgICAgIGIuY29weShyZXQpOwogICAgICAgICAgICB0aGlzLl93dHMuV1RTRnJlZU1lbW9yeShidWZmZXIuRGVyZWYoKSk7CiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQogICAgICAgIHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZSA9IGZ1bmN0aW9uIGdldFNlc3Npb25BdHRyaWJ1dGUoc2Vzc2lvbklkLCBhdHRyKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgYnl0ZXNSZXR1cm5lZCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CgogICAgICAgICAgICBpZiAodGhpcy5fd3RzLldUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uVygwLCBzZXNzaW9uSWQsIGF0dHIsIGJ1ZmZlciwgYnl0ZXNSZXR1cm5lZCkuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvblc6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJldFZhbCA9IGJ1ZmZlci5EZXJlZigpLldpZGUyVVRGODsKCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KGJ1ZmZlci5EZXJlZigpKTsKICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5jb25zb2xlVWlkID0gZnVuY3Rpb24gY29uc29sZVVpZCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLl9rZXJuZWwzMi5XVFNHZXRBY3RpdmVDb25zb2xlU2Vzc2lvbklkKCkuVmFsOwogICAgICAgICAgICBpZihpZD09MHhGRkZGRkZGRikge3Rocm93KCdOb2JvZHkgbG9nZ2VkIGluJyk7fQogICAgICAgICAgICByZXR1cm4gKGlkKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZSh1aWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuQ3VycmVudCA9IGZ1bmN0aW9uIEN1cnJlbnQoY2IpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmV0VmFsID0ge307CiAgICAgICAgICAgIHZhciBwaW5mbyA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwogICAgICAgICAgICBpZiAodGhpcy5fd3RzLldUU0VudW1lcmF0ZVNlc3Npb25zQSgwLCAwLCAxLCBwaW5mbywgY291bnQpLlZhbCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIGNhbGxpbmcgV1RTRW51bWVyYXRlU2Vzc2lvbnNBOiAnICsgdGhpcy5fa2VybmVsMzIuR2V0TGFzdEVycm9yKCkuVmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIDsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHBpbmZvLkRlcmVmKCkuRGVyZWYoaSAqICh0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KSwgdGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gMTIgOiAyNCk7CiAgICAgICAgICAgICAgICB2YXIgaiA9IHsgU2Vzc2lvbklkOiBpbmZvLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfTsKICAgICAgICAgICAgICAgIGouU3RhdGlvbk5hbWUgPSBpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDQgOiA4LCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplKS5EZXJlZigpLlN0cmlu", 16000);
|
|
memcpy_s(_usersessions + 16000, 44848, "ZzsKICAgICAgICAgICAgICAgIGouU3RhdGUgPSB0aGlzLlNlc3Npb25TdGF0ZXNbaW5mby5EZXJlZih0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyA4IDogMTYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCldOwogICAgICAgICAgICAgICAgaWYgKGouU3RhdGUgPT0gJ0FjdGl2ZScpIHsKICAgICAgICAgICAgICAgICAgICBqLlVzZXJuYW1lID0gdGhpcy5nZXRTZXNzaW9uQXR0cmlidXRlKGouU2Vzc2lvbklkLCB0aGlzLkluZm9DbGFzcy5XVFNVc2VyTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgai5Eb21haW4gPSB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUoai5TZXNzaW9uSWQsIHRoaXMuSW5mb0NsYXNzLldUU0RvbWFpbk5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0VmFsW2ouU2Vzc2lvbklkXSA9IGo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KHBpbmZvLkRlcmVmKCkpOwoKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHJldFZhbCkgfSk7CiAgICAgICAgICAgIGlmIChjYikgeyBjYihyZXRWYWwpOyB9CiAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICB9OwoKICAgICAgICBpZiAoIWdsb2JhbC5fbm9NZXNzYWdlUHVtcCkNCiAgICAgICAgewogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNwaW4gdXAgYSBtZXNzYWdlIHB1bXAsIGFuZCBmZXRjaCBhIHdpbmRvdyBoYW5kbGUKICAgICAgICAgICAgdmFyIG1lc3NhZ2VfcHVtcCA9IHJlcXVpcmUoJ3dpbi1tZXNzYWdlLXB1bXAnKTsKICAgICAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAgPSBuZXcgbWVzc2FnZV9wdW1wKHsgZmlsdGVyOiBXTV9XVFNTRVNTSU9OX0NIQU5HRSB9KTsgdGhpcy5fbWVzc2FnZXB1bXAucGFyZW50ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyB0aGlzLnBhcmVudC5fd3RzLldUU1VuUmVnaXN0ZXJTZXNzaW9uTm90aWZpY2F0aW9uKHRoaXMucGFyZW50Lmh3bmQpOyB9KTsKICAgICAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ2h3bmQnLCBmdW5jdGlvbiAoaCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5od25kID0gaDsKCiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHlpZWxkLCBhbmQgZG8gdGhpcyBpbiB0aGUgbmV4dCBldmVudCBsb29wIHBhc3MsIGJlY3Vhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsICdSZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbicKICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG1lc3NhZ2VwdW1wICd0aHJlYWQnLCBiZWNhdXNlIHdlIGFyZSBhY3R1YWxseSBvbiB0aGUgbWljcm9zdGFjayB0aHJlYWQsIHN1Y2ggdGhhdCB0aGUgbWVzc2FnZSBwdW1wIHRocmVhZCwgaXMgaG9sZGluZwogICAgICAgICAgICAgICAgLy8gb24gYSBzZW1hcGhvcmUgZm9yIHVzIHRvIHJldHVybi4gSWYgd2UgY2FsbCBub3csIHdlIG1heSBkZWFkbG9jayBvbiBXaW5kb3dzIDcsIGJlY3Vhc2UgaXQgd2lsbCB0cnkgdG8gbm90aWZ5IGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICB0aGlzLmltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZShmdW5jdGlvbiAoc2VsZikNCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIHdpbmRvdyBoYW5kbGUsIHdlIGNhbiByZWdpc3RlciBpdCB0byByZWNlaXZlIFdpbmRvd3MgTWVzc2FnZXMKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5wYXJlbnQuX3d0cykgeyBzZWxmLnBhcmVudC5fd3RzLldUU1JlZ2lzdGVyU2Vzc2lvbk5vdGlmaWNhdGlvbihzZWxmLnBhcmVudC5od25kLCBOT1RJRllfRk9SX0FMTF9TRVNTSU9OUyk7IH0KICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRSwgMCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0ggPSBzZWxmLnBhcmVudC5fdXNlcjMyLlJlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORywgMCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQuX3VzZXIzMi5ESVNQX0ggPSBzZWxmLnBhcmVudC5fdXNlcjMyLlJlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uKHNlbGYucGFyZW50Lmh3bmQsIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFLCAwKTsKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYucGFyZW50Ll91c2VyMzIuQUNEQ19ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0guVmFsLCBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSC5WYWwpOwogICAgICAgICAgICAgICAgfSwgdGhpcyk7DQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fbWVzc2FnZXB1bXAub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiAobXNnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnLm1lc3NhZ2UpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlIFdNX1dUU1NFU1NJT05fQ0hBTkdFOgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXVFNfU0VTU0lPTl9MT0NLOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVudW1lcmF0ZVVzZXJzKCkudGhlbihmdW5jdGlvbiAodXNlcnMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2Vyc1ttc2cubHBhcmFtXSkgeyB0aGlzLnBhcmVudC5lbWl0KCdsb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX1VOTE9DSzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHVzZXJzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgndW5sb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPR09OOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXVFNfU0VTU0lPTl9MT0dPRkY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFdNX1BPV0VSQlJPQURDQVNUOgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53cGFyYW0pDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV01fUE9XRVJCUk9BRENBU1QgW1VOS05PV04gd3BhcmFtXTogJyArIG1zZy53cGFyYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNU1VTUEVORDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnU0xFRVAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVJFU1VNRUFVVE9NQVRJQzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX05PTl9JTlRFUkFDVElWRScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUkVTVU1FU1VTUEVORDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX0lOVEVSQUNUSVZFJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1QT1dFUlNUQVRVU0NIQU5HRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBscGFyYW0gPSB0aGlzLnBhcmVudC5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKEJ1ZmZlci5mcm9tKG1zZy5scGFyYW1faGV4LCAnaGV4JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gbHBhcmFtLkRlcmVmKDIwLCBscGFyYW0uRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApKS50b0J1ZmZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobHBhcmFtLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHVUlEX0FDRENfUE9XRVJfU09VUkNFLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS5yZWFkVUludDMyTEUoMCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdhY2RjJywgJ0FDJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2FjZGMnLCAnQkFUVEVSWScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdhY2RjJywgJ0hPVCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBHVUlEX0JBVFRFUllfUEVSQ0VOVEFHRV9SRU1BSU5JTkcuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2JhdHRlcnlMZXZlbCcsIGRhdGEucmVhZFVJbnQzMkxFKDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS5yZWFkVUludDMyTEUoMCkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ09GRicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ09OJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncG93ZXItbW9uaXRvcicpLmVtaXQoJ2Rpc3BsYXknLCAnRElNTUVEJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgIHsKICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGRidXMgPSByZXF1aXJlKCdsaW51eC1kYnVzJyk7CiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLndhdGNoKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9saW51eFdhdGNoZXIgPSByZXF1aXJlKCdmcycpLndhdGNoKCcvdmFyL3J1bi91dG1wJyk7CiAgICAgICAgICAgICAgICB0aGlzLl9saW51eFdhdGNoZXIudXNlcl9zZXNzaW9uID0gdGhpczsKICAgICAgICAgICAgICAgIHRoaXMuX2xpbnV4V2F0Y2hlci5vbignY2hhbmdlJywgZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJfc2Vzc2lvbi5lbWl0KCdjaGFuZ2VkJyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLkN1cnJlbnQgPSBmdW5jdGlvbiBDdXJyZW50KGNiKSB7CiAgICAgICAgICAgICAgICB2YXIgcmV0VmFsID0ge307CiAgICAgICAgICAgICAgICByZXRWYWwuX09iamVjdElEID0gJ1VzZXJTZXNzaW9uJwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ19jYWxsYmFjaycsIHsgdmFsdWU6IGNiIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ19jaGlsZCcsIHsgdmFsdWU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vbGFzdCcsIFsnbGFzdCcsICctZicsICcvdmFyL3J1bi91dG1wJ10pIH0pOwoKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuUGFyZW50ID0gcmV0VmFsOwogICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5fdHh0ID0gJyc7CiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlzLl90eHQuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlc3Npb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJzID0ge307CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gbGluZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gZ2V0VG9rZW5zKGxpbmVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0geyBVc2VybmFtZTogdG9rZW5zWzBdLCBTZXNzaW9uSWQ6IHRva2Vuc1sxXSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzNdLmluY2x1ZGVzKCdzdGlsbCBsb2dnZWQgaW4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuU3RhdGUgPSAnQWN0aXZlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuTGFzdEFjdGl2ZSA9IHRva2Vuc1szXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucy5wdXNoKHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNlc3Npb25zLnBvcCgpOwoKCiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJuYW1lcyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHNlc3Npb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uc1tpXS5Vc2VybmFtZSAhPSAncmVib290JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNbc2Vzc2lvbnNbaV0uU2Vzc2lvbklkXSA9IHNlc3Npb25zW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lc1tzZXNzaW9uc1tpXS5Vc2VybmFtZV0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lc1tzZXNzaW9uc1tpXS5Vc2VybmFtZV0gPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgncHJvbWlzZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlBhcmVudC5fY2FsbGJhY2spIHsgdGhpcy5QYXJlbnQuX2NhbGxiYWNrLmNhbGwodGhpcy5QYXJlbnQsIHVzZXJzKTsgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHVzZXJuYW1lcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX3VzZXJuYW1lID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19yZXNvbHZlciA9IHJlczsgdGhpcy5fX3JlamVjdG9yID0gcmVqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9pZCcsIFsnaWQnLCAnLXUnLCBuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGQucHJvbWlzZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGQuc3Rkb3V0Ll90eHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5fdHh0ICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludCh0aGlzLnN0ZG91dC5fdHh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9fcmVqZWN0b3IoJ2ludmFsaWQgdWlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHBhcnNlSW50KHRoaXMuc3Rkb3V0Ll90eHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fX3Jlc29sdmVyKGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKHBsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbmUKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlW3BsaXN0W2ldLl9fdXNlcm5hbWVdID0gcGxpc3RbaV0uX2ludGVybmFsLmNvbXBsZXRlZEFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB1c2VycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNbaV0udWlkID0gdGFibGVbdXNlcnNbaV0uVXNlcm5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAg", 16000);
|
|
memcpy_s(_usersessions + 32000, 28848, "ICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1c2VycywgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHVzZXJzKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbC5fY2FsbGJhY2spIHsgcmV0VmFsLl9jYWxsYmFjay5jYWxsKHJldFZhbCwgdXNlcnMpOyB9CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0VmFsLl9jYWxsYmFjaykgeyByZXRWYWwuX2NhbGxiYWNrLmNhbGwocmV0VmFsLCB1c2Vycyk7IH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5zdGRvdXQuUGFyZW50ID0gcmV0VmFsLl9jaGlsZDsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuUGFyZW50Ll90eHQgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3JlY2hlY2tMb2dnZWRJblVzZXJzID0gZnVuY3Rpb24gX3JlY2hlY2tMb2dnZWRJblVzZXJzKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHUuQWN0aXZlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYWxyZWFkeSBhIHVzZXIgbG9nZ2VkIGluLCBzbyB3ZSBjYW4gbW9uaXRvciBEQlVTIGZvciBsb2NrL3VubG9jawogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlciAhPSBudWxsICYmIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIudWlkICE9IHUuQWN0aXZlWzBdLnVpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlciA9IG5ldyBkYnVzKHByb2Nlc3MuZW52WydYREdfQ1VSUkVOVF9ERVNLVE9QJ10gPT0gJ1VuaXR5JyA/ICdjb20udWJ1bnR1LlVwc3RhcnQwXzYnIDogJ29yZy5nbm9tZS5TY3JlZW5TYXZlcicsIHUuQWN0aXZlWzBdLnVpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIudXNlcl9zZXNzaW9uID0gdGhpcy5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIub24oJ3NpZ25hbCcsIGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMudXNlcl9zZXNzaW9uLmVudW1lcmF0ZVVzZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnNpZ25hbERhdGEgPSBzLmRhdGFbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnRoZW4oZnVuY3Rpb24gKHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2lnbmFsRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRydWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2t0b3AtbG9jayc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdsb2NrZWQnLCB1LkFjdGl2ZVswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBmYWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVza3RvcC11bmxvY2snOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgndW5sb2NrZWQnLCB1LkFjdGl2ZVswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnQuX2xpbnV4X2xvY2tfd2F0Y2hlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuZ2V0VWlkQ29uZmlnID0gZnVuY3Rpb24gZ2V0VWlkQ29uZmlnKCkgewogICAgICAgICAgICAgICAgdmFyIHJldCA9IHt9OwogICAgICAgICAgICAgICAgdmFyIGNmZyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvZXRjL2xvZ2luLmRlZnMnKS50b1N0cmluZygpLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgdmFyIHRva2VuczsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY2ZnKSB7CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gY29sdW1uUGFyc2UoY2ZnW2ldLCAnXHQnKTsgLy9jb25zb2xlLmxvZyh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0gPT0gJ1VJRF9NSU4nKSB7IHJldC5NSU4gPSBwYXJzZUludCh0b2tlbnNbMV0pOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PSAnVUlEX01BWCcpIHsgcmV0Lk1BWCA9IHBhcnNlSW50KHRva2Vuc1sxXSk7IH0KICAgICAgICAgICAgICAgICAgICBpZiAocmV0Lk1JTiAhPSBudWxsICYmIHJldC5NQVggIT0gbnVsbCkgeyBicmVhazsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9uKCdjaGFuZ2VkJywgdGhpcy5fcmVjaGVja0xvZ2dlZEluVXNlcnMpOyAvLyBGb3IgbGludXggTG9jay9VbmxvY2sgbW9uaXRvcmluZywgd2UgbmVlZCB0byB3YXRjaCBmb3IgTG9nT24vTG9nT2ZmLCBhbmQga2VlcCB0cmFjayBvZiB0aGUgVUlELgoKICAgICAgICAgICAgLy8gRmlyc3Qgc3RlcCwgaXMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdXNlciBsb2dnZWQgaW46CiAgICAgICAgICAgIHRoaXMuX3JlY2hlY2tMb2dnZWRJblVzZXJzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubWluVWlkID0gIGZ1bmN0aW9uIG1pblVpZCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9sb2dpbi5kZWZzIHwgZ3JlcCBVSURfIHwgYXdrICd7IGlmKCQxPT1cIlVJRF9NSU5cIikgeyBwcmludCAkMjsgfSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpID49IDAgPyBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgOiA1MDApOwogICAgICAgIH0KICAgICAgICB0aGlzLl91c2VycyA9IGZ1bmN0aW9uIF91c2VycygpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgfCBhd2sgLUY6ICd7IGlmKCQzPj0wKSB7IHByaW50ZiBcIiVzOiVzXFxuXCIsICQxLCAkMzsgfSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgcmV0ID0ge30sIHRva2VuczsKICAgICAgICAgICAgZm9yICh2YXIgbG4gaW4gbGluZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2xuXS5zcGxpdCgnOicpOwogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyByZXRbdG9rZW5zWzBdXSA9IHRva2Vuc1sxXTsgfSAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgIH0KICAgICAgICB0aGlzLl91aWRzID0gZnVuY3Rpb24gX3VpZHMoKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCB8IGF3ayAtRjogJ3sgaWYoJDM+PTApIHsgcHJpbnRmIFwiJXM6JXNcXG5cIiwgJDEsICQzOyB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciByZXQgPSB7fSwgdG9rZW5zOwogICAgICAgICAgICBmb3IgKHZhciBsbiBpbiBsaW5lcykgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbbG5dLnNwbGl0KCc6Jyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHJldFt0b2tlbnNbMV1dID0gdG9rZW5zWzBdOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgIH0KICAgICAgICB0aGlzLmxvZ2luVWlkcyA9IGZ1bmN0aW9uIGxvZ2luVWlkcygpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbWluID0gdGhpcy5taW5VaWQoKTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ2V0ZW50IHBhc3N3ZCB8IGF3ayAtRjogXCd7IGlmKCQzID49ICcgKyBtaW4gKyAnKSB7IGE9c3BsaXQoJDcsYiwiLyIpOyBpZihiW2FdIT0ibm9sb2dpbiIpIHsgcHJpbnQgJDM7IH0gfX1cJyB8IHRyICJcXG4iICJcXCwiIHwgYXdrIFwneyBwcmludGYgIlslc10iLCAkMDsgfVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnJlcGxhY2UoJyxdJywnXScpKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnd2hvXG5leGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRlcnIuc3RyICE9ICcnKSB7IHJldHVybiAoMCk7IH0KCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciB0b2tlbnMsIGksIGo7CiAgICAgICAgICAgIGZvciAoaSBpbiBsaW5lcykgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCB0b2tlbnMubGVuZ3RoOyArK2opIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zW2pdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludCh0aGlzLl91c2VycygpW3Rva2Vuc1swXV0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgKCdub2JvZHkgbG9nZ2VkIGludG8gY29uc29sZScpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLmdldEhvbWVGb2xkZXIgPSBmdW5jdGlvbiBnZXRIb21lRm9sZGVyKGlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJnZXRlbnQgcGFzc3dkICIgKyBpZCArICIgfCBhd2sgLUY6ICd7cHJpbnQgJDZ9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFVpZCA9IGZ1bmN0aW9uIGdldFVpZCh1c2VybmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCBcIiIgKyB1c2VybmFtZSArICJcIiB8IGF3ayAtRjogJ3twcmludCAkM30nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciByZXQgPSBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKTsgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7IHJldHVybiAocmV0KTsgfQogICAgICAgICAgICB0aHJvdyAoJ3VzZXJuYW1lOiAnICsgdXNlcm5hbWUgKyAnIE5PVCBGT1VORCcpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCAiICsgdWlkICsgIiB8IGF3ayAtRjogJ3twcmludCAkMX0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIubGVuZ3RoID4gMCkgeyByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsgfQogICAgICAgICAgICB0aHJvdyAoJ3VpZDogJyArIHVpZCArICcgTk9UIEZPVU5EJyk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldEdyb3VwbmFtZSA9IGZ1bmN0aW9uIGdldEdyb3VwbmFtZShnaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBncm91cCAiICsgZ2lkICsgIiB8IGF3ayAtRjogJ3twcmludCAkMX0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIubGVuZ3RoID4gMCkgeyByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsgfQogICAgICAgICAgICB0aHJvdyAoJ2dpZDogJyArIGdpZCArICcgTk9UIEZPVU5EJyk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLndob2FtaSA9IGZ1bmN0aW9uIHdob2FtaSgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndob2FtaVxuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRFbnZGcm9tUGlkID0gZnVuY3Rpb24gZ2V0RW52RnJvbVBpZChwaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmV0ID0ge307CiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CgogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvcHJvYy8iICsgcGlkICsgIi9lbnZpcm9uIHwgdHIgJ1xcMCcgJ1xcdCcgfCIgKyAnIGF3ayAtRiJcdCIgXCd7IHByaW50ZiAieyI7IGZvcihpPTE7aTxORjsrK2kpIHsgaWYoaT4xKSB7cHJpbnRmICIsIjt9IHg9c3BsaXQoJGksIHRvaywgIj0iKTsgcHJpbnRmICJcXCIlc1xcIjogXFwiJXNcXCIiLCB0b2tbMV0sIHN1YnN0cigkaSwgMitsZW5ndGgodG9rWzFdKSk7IH0gcHJpbnRmICJ9IjsgfVwnJyk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGVlKQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHt9KTsNCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHJvY3N0YXQgLWUgIiArIHBpZCArICIgfCBncmVwICIgKyBwaWQgKyAiIHwgYXdrICd7ICQxPVwiXCI7ICQyPVwiXCI7IHByaW50ICQwIH0nIHwgdHIgXCJcXCBcIiBcIlxcblwiXG5leGl0XG4iKTsgCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoJCQogICAgICAgICAgICAgICAgdmFyIGVudjsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0b2tlbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9rZW5zW2ldLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgcmV0W2VudlswXV0gPSBlbnZbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5maW5kRW52ID0gZnVuY3Rpb24gZmluZEVudih1aWQsIGVudikKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1bmFtZSA9IHRoaXMuZ2V0VXNlcm5hbWUodWlkKTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcyAiICsgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnID8gIi1heCAiOiIiKSArICItZSAtbyBwaWQgLW8gdXNlciB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICBmb3IgKHZhciBuIGluIGxpbmVzKQogICAgICAgICAgICB7CiAg", 16000);
|
|
memcpy_s(_usersessions + 48000, 12848, "ICAgICAgICAgICAgICB2YXIgbG4gPSBsaW5lc1tuXS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAobG4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2V0RW52RnJvbVBpZChsbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVbZW52XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVtlbnZdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKICAgICAgICB9OwogICAgfQogICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgewogICAgICAgIHRoaXMuZ2V0VWlkID0gZnVuY3Rpb24gZ2V0VWlkKHVzZXJuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpZCAiICsgdXNlcm5hbWUgKyAiIHwgYXdrICd7IHNwbGl0KCQxLCB0b2tlbiwgXCI9XCIpOyBzcGxpdCh0b2tlblsyXSwgdWlkLCBcIihcIik7IHByaW50IHVpZFsxXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldEdyb3VwSUQgPSBmdW5jdGlvbiBnZXRHcm91cElEKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiaWQgIiArIHVpZCArICIgfCBhd2sgJ3sgc3BsaXQoJDIsIGdpZCwgXCI9XCIpOyBpZihnaWRbMV09PVwiZ2lkXCIpIHsgc3BsaXQoZ2lkWzJdLCBnaWRudW0sIFwiKFwiKTsgcHJpbnQgZ2lkbnVtWzFdOyAgfSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImRzY2wgLiBsaXN0IC9Vc2VycyBVbmlxdWVJRCB8IGdyZXAgIiArIHVpZCArICIgfCBhd2sgJ3sgaWYoJDI9PSIgKyB1aWQgKyAiKXsgcHJpbnQgJDEgfX0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgaWYoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCd1aWQ6ICcgKyB1aWQgKyAnIG5vdCBmb3VuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldEdyb3VwbmFtZSA9IGZ1bmN0aW9uIGdldEdyb3VwbmFtZShnaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJkc2NsIC4gbGlzdCAvR3JvdXBzIFByaW1hcnlHcm91cElEIHwgZ3JlcCAiICsgZ2lkICsgIiB8IGF3ayAneyBpZigkMj09IiArIGdpZCArICIpeyBwcmludCAkMSB9fSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZihjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ2dpZDogJyArIGdpZCArICcgbm90IGZvdW5kJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG8gfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgcHJpbnQgJDEgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIHJldCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwogICAgICAgICAgICBpZiAocmV0ICE9ICcnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0VWlkKHJldCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93ICgnbm9ib2R5IGxvZ2dlZCBpbnRvIGNvbnNvbGUnKTsgICAgIAogICAgICAgIH0KICAgICAgICB0aGlzLmdldEhvbWVGb2xkZXIgPSBmdW5jdGlvbiBnZXRIb21lRm9sZGVyKHVzZXIpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImRzY2wgLiAtcmVhZCAvVXNlcnMvIiArIHVzZXIgKyAiIHwgZ3JlcCBORlNIb21lRGlyZWN0b3J5IHwgYXdrIC1GOiAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ3VzZXI6ICcgKyB1c2VyICsgJyBub3QgZm91bmQnKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5fdXNlcnMgPSBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciB0b2tlbnMsIGk7CiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyB1c2Vyc1t0b2tlbnNbMF1dID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTsgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gKHVzZXJzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdWlkcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgdG9rZW5zLCBpOwogICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgdXNlcnNbdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXV0gPSB0b2tlbnNbMF07IH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICh1c2Vycyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lkVGFibGUgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFibGUgPSB7fTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9pZCcsIFsnaWQnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKVswXS5zcGxpdCgnICcpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB2YXIgdHlwZXMgPSBsaW5lc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHR5cGVzWzFdLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV0gPSB7fTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBqIGluIHRva2VucykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZGFyciA9IHRva2Vuc1tqXS5zcGxpdCgnKCcpOwogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkYXJyWzBdOwogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gaWRhcnJbMV0uc3Vic3RyaW5nKDAsIGlkYXJyWzFdLmxlbmd0aCAtIDEpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV1bbmFtZV0gPSBpZDsKICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV1baWRdID0gbmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHRhYmxlKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gKGNiKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHVzZXJzID0ge307CiAgICAgICAgICAgIHZhciB0YWJsZSA9IHRoaXMuX2lkVGFibGUoKTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9sYXN0JywgWydsYXN0J10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldLmxlbmd0aCA+IDA7ICsraSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dID0geyBVc2VybmFtZTogbGluZXNbaV0uc3BsaXQoJyAnKVswXSwgU3RhdGU6IGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxID8gJ0FjdGl2ZScgOiAnSW5hY3RpdmUnLCB1aWQ6IHRhYmxlLnVpZFtsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYodXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0uU3RhdGUgIT0gJ0FjdGl2ZScgJiYgbGluZXNbaV0uc3BsaXQoJ3N0aWxsIGxvZ2dlZCBpbicpLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXS5TdGF0ZSA9ICdBY3RpdmUnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOwogICAgICAgICAgICBpZiAoY2IpIHsgY2IuY2FsbCh0aGlzLCB1c2Vycyk7IH0KICAgICAgICB9CiAgICB9CgogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnd2luMzInKSAvLyBMaW51eCwgTWFjT1MsIEZyZWVCU0QKICAgIHsKICAgICAgICB0aGlzLlNlbGYgPSBmdW5jdGlvbiBTZWxmKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJywgJy11J10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5TZWxmKCkgPT0gMCk7CiAgICAgICAgfQogICAgfQoKCn0KZnVuY3Rpb24gc2hvd0FjdGl2ZU9ubHkoc291cmNlKQp7CiAgICB2YXIgcmV0VmFsID0gW107CiAgICB2YXIgdW5pcXVlID0ge307CiAgICB2YXIgdXNlcm5hbWVzID0gW107CiAgICB2YXIgdG1wOwoKICAgIGZvciAodmFyIGkgaW4gc291cmNlKQogICAgewogICAgICAgIGlmIChzb3VyY2VbaV0uU3RhdGUgPT0gJ0FjdGl2ZScpCiAgICAgICAgewogICAgICAgICAgICByZXRWYWwucHVzaChzb3VyY2VbaV0pOwogICAgICAgICAgICB0bXAgPSAoc291cmNlW2ldLkRvbWFpbiA/IChzb3VyY2VbaV0uRG9tYWluICsgJ1xcJykgOiAnJykgKyBzb3VyY2VbaV0uVXNlcm5hbWU7CiAgICAgICAgICAgIGlmICghdW5pcXVlW3RtcF0pIHsgdW5pcXVlW3RtcF0gPSB0bXA7fQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKHZhciBpIGluIHVuaXF1ZSkKICAgIHsKICAgICAgICB1c2VybmFtZXMucHVzaChpKTsKICAgIH0KCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAndXNlcm5hbWVzJywgeyB2YWx1ZTogdXNlcm5hbWVzIH0pOwogICAgcmV0dXJuIChyZXRWYWwpOwp9CmZ1bmN0aW9uIGdldFRva2VucyhzdHIpCnsKICAgIHZhciBjb2x1bW5zID0gW107CiAgICB2YXIgaTsKCiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZygwLCAoaT1zdHIuaW5kZXhPZignICcpKSkpOwogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7CiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZyhpLCAoaT1zdHIuc3Vic3RyaW5nKGkpLmluZGV4T2YoJyAnKSArIGkpKSk7CiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsKICAgIGNvbHVtbnMucHVzaChzdHIuc3Vic3RyaW5nKGksIChpPXN0ci5zdWJzdHJpbmcoaSkuaW5kZXhPZignICcpICsgaSkpKTsKICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOwogICAgdmFyIHN0YXR1cyA9IHN0ci5zdWJzdHJpbmcoaSkudHJpbSgpOwogICAgY29sdW1ucy5wdXNoKHN0YXR1cyk7CgogICAgcmV0dXJuIChjb2x1bW5zKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgVXNlclNlc3Npb25zKCk7Cv==", 12848);
|
|
ILibBase64DecodeEx((unsigned char*)_usersessions, 60848, (unsigned char*)_usersessions + 60848);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 60848);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_usersessions);
|
|
|
|
// Mesh Agent NodeID helper, refer to modules/_agentNodeId.js
|
|
duk_peval_string_noresult(ctx, "addModule('_agentNodeId', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIF9tZXNoTm9kZUlkKCkKewogICAgdmFyIHJldCA9ICcnOwogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgewogICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGggKyAnLmRiJywgeyByZWFkT25seTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHJldCA9IHJlcXVpcmUoJ3RscycpLmxvYWRDZXJ0aWZpY2F0ZSh7IHBmeDogZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKSwgcGFzc3BocmFzZTogJ2hpZGRlbicgfSkuZ2V0S2V5SGFzaCgpLnRvU3RyaW5nKCdoZXgnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnd2luMzInOgogICAgICAgICAgICAvLyBGaXJzdCBDaGVjayBpZiB0aGUgZGIgQ29udGFpbnMgdGhlIE5vZGVJRAogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGgucmVwbGFjZSgnLmV4ZScsICcuZGInKSwgeyByZWFkT25seTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHZhciB2ID0gZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKTsKICAgICAgICAgICAgICAgIGlmICh2KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZSgndGxzJykubG9hZENlcnRpZmljYXRlKHsgcGZ4OiB2LCBwYXNzcGhyYXNlOiAnaGlkZGVuJyB9KS5nZXRLZXlIYXNoKCkudG9TdHJpbmcoJ2hleCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCAmJiAodiA9IGRiLkdldEJ1ZmZlcignTm9kZUlEJykpICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gdi50b1N0cmluZygnaGV4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiAocmV0KTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBfbWVzaE5vZGVJZDsKCv==', 'base64').toString());");
|
|
|
|
// Task Scheduler, refer to modules/task-scheduler.js
|
|
char *_taskscheduler = ILibMemory_Allocate(48679, 0, NULL, NULL);
|
|
memcpy_s(_taskscheduler + 0, 27816, "LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgc2VydmljZW1hbmFnZXIgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKTsKdmFyIG1nciA9IG5ldyBzZXJ2aWNlbWFuYWdlcigpOwoKLy9hdHRhY2hEZWJ1Z2dlcih7IHdlYnBvcnQ6IDk5OTUsIHdhaXQ6IDEgfSkudGhlbihjb25zb2xlLmxvZyk7CgpmdW5jdGlvbiB0YXNrKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAndGFzay1zY2hlZHVsZXInOwoKICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpCiAgICB7CiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgaWYob3B0aW9ucy5uYW1lICYmIG9wdGlvbnMuc2VydmljZSkKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICd3aW4zMic6CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcm1zID0gWydzY2h0YXNrcycsICcvQ3JlYXRlJywgJy9SVSBTWVNURU0nXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmdHlwZSBpbiBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZ0eXBlLnRvVXBwZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIT1VSTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnREFJTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0VFS0xZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01PTlRITFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9TQyAnICsgZnR5cGUudG9VcHBlckNhc2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL01PICcgKyBvcHRpb25zW2Z0eXBlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQVknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9EICcgKyBvcHRpb25zW2Z0eXBlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL00gJyArIG9wdGlvbnNbZnR5cGVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RJTUUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9TVCAnICsgb3B0aW9uc1tmdHlwZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTkFNRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL1ROICInICsgb3B0aW9uc1tmdHlwZV0uc3BsaXQoJy8nKS5qb2luKCdcXCcpICsgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NFUlZJQ0UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9UUiAibmV0IHN0YXJ0ICcgKyBvcHRpb25zW2Z0eXBlXSArICciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFybXMuam9pbignICcpKTsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXHNjaHRhc2tzLmV4ZScsIHBhcm1zKTsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQucHJvbWlzZSA9IHJldDsKICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyBpZiAoY29kZSA9PSAwKSB7IHRoaXMucHJvbWlzZS5fcmVzKCk7IH0gZWxzZSB7IHRoaXMucHJvbWlzZS5fcmVqKGNvZGUpOyB9fSk7IAogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGludXgnOgogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvY3Jvbi5kLycgKyBvcHRpb25zLm5hbWUuc3BsaXQoJy8nKS5qb2luKCdfJykuc3BsaXQoJy4nKS5qb2luKCcnKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignVGFzayBbJyArIG9wdGlvbnMubmFtZSArICddIEFscmVhZHkgZXhpc3RzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbnV0ZSA9ICcqJzsKICAgICAgICAgICAgICAgICAgICB2YXIgaG91ciA9ICcqJzsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF5ID0gJyonOwogICAgICAgICAgICAgICAgICAgIHZhciBtb250aCA9ICcqJzsKICAgICAgICAgICAgICAgICAgICB2YXIgd2Vla2RheSA9ICcqJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmdHlwZSBpbiBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZ0eXBlLnRvVXBwZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLlRJTUUgJiYgIW9wdGlvbnMudGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSA9ICcqLycgKyBvcHRpb25zW2Z0eXBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIT1VSTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5USU1FICYmICFvcHRpb25zLnRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBSUxZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkgPSAnKi8nICsgb3B0aW9uc1tmdHlwZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXRUVLTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zW2Z0eXBlXSA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnMuREFZICYmICFvcHRpb25zLmRheSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ09ubHkgT25jZS9XZWVrbHkgc3VwcG9ydGVkIG9uIExpbnV4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQVknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLndlZWtseSB8fCBvcHRpb25zLldFRUtMWSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBvcHRpb25zW2Z0eXBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gb3B0aW9uc1tmdHlwZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVElNRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9IG9wdGlvbnNbZnR5cGVdLnNwbGl0KCc6JylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlID0gb3B0aW9uc1tmdHlwZV0uc3BsaXQoJzonKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01PTlRITFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gJ1NIRUxMPS9iaW4vc2hcblBBVEg9L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluXG5cbic7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uICs9IChtaW51dGUgKyAnICcgKyBob3VyICsgJyAnICsgZGF5ICsgJyAnICsgbW9udGggKyAnICcgKyB3ZWVrZGF5ICsgJyAgIHJvb3QgICAnKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlVHlwZSgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMgc2VydmljZSB8IGF3ayAne3ByaW50ICQyfSdcblxleGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gKz0gKGNoaWxkLnN0ZG91dC5zdHIgKyAnICcgKyBvcHRpb25zLnNlcnZpY2UgKyAnIHN0YXJ0ID4vZGV2L251bGwgMj4mMSBcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Vwc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzIGluaXRjdGwgfCBhd2sgJ3twcmludCAkMn0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uICs9IChjaGlsZC5zdGRvdXQuc3RyICsgJyBzdGFydCAnICsgb3B0aW9ucy5zZXJ2aWNlICsgJyA+L2Rldi9udWxsIDI+JjEgXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzeXN0ZW1kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBzeXN0ZW1jdGwgfCBhd2sgJ3twcmludCAkMn0nXG5cZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uICs9IChjaGlsZC5zdGRvdXQuc3RyICsgJyBzdGFydCAnICsgb3B0aW9ucy5zZXJ2aWNlICsgJyA+L2Rldi9udWxsIDI+JjEgXG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ1Vua25vd24gU2VydmljZSBQbGF0Zm9ybTogJyArIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZVR5cGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVJVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVdVU1IgfCByZXF1aXJlKCdmcycpLkNITU9EX01PREVTLlNfSVJPVEg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL2V0Yy9jcm9uLmQvJyArIG9wdGlvbnMubmFtZS5zcGxpdCgnLycpLmpvaW4oJ18nKS5zcGxpdCgnLicpLmpvaW4oJycpLCBhY3Rpb24sIHsgZmxhZ3M6ICd3YicsIG1vZGU6IG0gfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXQuX3JlcygpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICAgICB2YXIgdGFza25hbWUgPSBvcHRpb25zLm5hbWUuc3BsaXQoJy8nKS5qb2luKCdfJykuc3BsaXQoJy4nKS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcGxpc3QgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnPHBsaXN0IHZlcnNpb249IjEuMCI+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgIDxkaWN0PlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgPHN0cmluZz4nICsgdGFza25hbWUgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5Qcm9ncmFtQXJndW1lbnRzPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8YXJyYXk+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICAgIDxzdHJpbmc+L2Jpbi9sYXVuY2hjdGw8L3N0cmluZz5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgICAgPHN0cmluZz5zdGFydDwvc3RyaW5nPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlcnZpY2UgKyAnPC9zdHJpbmc+XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPC9hcnJheT5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDxrZXk+UnVuQXRMb2FkPC9rZXk+XG4nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZmFsc2UvPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAne3t7SU5URVJWQUx9fX0nOwogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgIDwvZGljdD5cbic7CiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJzwvcGxpc3Q+JzsKCiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ZjID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKG9wdGlvbnMuc2VydmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ZjLmlzTG9hZGVkKCkpIHsgc3ZjLmxvYWQoKTsgfQogICAgICAgICAgICAgICAgICAgICAgICBzdmMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChzZSkKICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaihzZSk7IHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHZhciBwZXJpb2RpYyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmdHlwZSBpbiBvcHRpb25zKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ0eXBlLnRvVXBwZXJDYXNlKCkpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnREFJTFknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYWlseVZhbCA9IHBhcnNlSW50KG9wdGlvbnNbZnR5cGVdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhaWx5VmFsIDwgMSB8fCBkYWlseVZhbCA+IDMxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignSW52YWxpZCBPcHRpb25zJyk7IHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGFpbHlWYWwgPiAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudERheSA9IChuZXcgRGF0ZSgpKS5nZXREYXRlKCk7ICAvLyAwIC0gMzENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxEYXkgPSBjdXJyZW50RGF5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF5ICs9IGRhaWx5VmFsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RGF5ID4gMzEpIGN1cnJlbnREYXkgPSBjdXJyZW50RGF5ICUgMzE7DQogICAgICAgICAgICAgICAgICAg", 16000);
|
|
memcpy_s(_taskscheduler + 16000, 11816, "ICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgoJyAgICAgICAgIDxrZXk+RGF5PC9rZXk+XG4gICAgICAgICA8aW50ZWdlcj4nICsgY3VycmVudERheSArICc8L2ludGVnZXI+XG4nKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghKGN1cnJlbnREYXkgPCBhY3R1YWxEYXkgJiYgKGN1cnJlbnREYXkgKyBkYWlseVZhbCkgPiBhY3R1YWxEYXkpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpYy5wdXNoKCcnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0VFS0xZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQob3B0aW9uc1tmdHlwZV0pICE9IDEpIHsgcmV0Ll9yZWooJ09ubHkgb25jZSB3ZWVrbHkgaXMgc3VwcG9ydGVkJyk7IHJldHVybiAocmV0KTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLkRBWSA8IDAgfHwgb3B0aW9ucy5EQVkgPiA2IHx8IG9wdGlvbnMuZGF5IDwgMCB8fCBvcHRpb25zLmRheSA+IDYpIHsgcmV0Ll9yZWooJ0RBWSBvdXQgb2YgcmFuZ2UnKTsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuREFZID09IG51bGwgJiYgb3B0aW9ucy5kYXkgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgoJyAgICAgICAgIDxrZXk+RGF5PC9rZXk+XG4gICAgICAgICA8aW50ZWdlcj4nICsgKG5ldyBEYXRlKCkpLmdldERheSgpICsgJzwvaW50ZWdlcj5cbicpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpYy5wdXNoKCcnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTU9OVEhMWSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9udGggPT0gbnVsbCAmJiBvcHRpb25zLk1PTlRIID09IG51bGwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb250aGx5VmFsID0gcGFyc2VJbnQob3B0aW9uc1tmdHlwZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudE1vbnRoID0gKG5ldyBEYXRlKCkpLmdldE1vbnRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxNb250aD0gY3VycmVudE1vbnRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb250aCArPSBtb250aGx5VmFsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TW9udGggPiAxMikgY3VycmVudE1vbnRoID0gY3VycmVudE1vbnRoICUgMTI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgoJyAgICAgICAgIDxrZXk+TW9udGg8L2tleT5cbiAgICAgICAgIDxpbnRlZ2VyPicgKyBjdXJyZW50TW9udGggKyAnPC9pbnRlZ2VyPlxuJykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIShjdXJyZW50TW9udGggPCBhY3R1YWxNb250aCAmJiAoY3VycmVudE1vbnRoICsgbW9udGhseVZhbCkgPiBhY3R1YWxNb250aCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMucHVzaCgnJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZnR5cGUgaW4gb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZnR5cGUudG9VcHBlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTUlOVVRFJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwgIT0gbnVsbCB8fCBwZXJpb2RpYy5sZW5ndGggPiAwKSB7IHJldC5fcmVqKCdJbnZhbGlkIE9wdGlvbnMnKTsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAnICAgICAgPGludGVnZXI+JyArIChwYXJzZUludChvcHRpb25zW2Z0eXBlXSkgKiA2MCkgKyAnPC9pbnRlZ2VyPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hPVVJMWSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsICE9IG51bGwgfHwgcGVyaW9kaWMubGVuZ3RoID4gMCkgeyByZXQuX3JlaignSW52YWxpZCBPcHRpb25zJyk7IHJldHVybiAocmV0KTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gJyAgICAgIDxpbnRlZ2VyPicgKyAocGFyc2VJbnQob3B0aW9uc1tmdHlwZV0pICogNjAgKiA2MCkgKyAnPC9pbnRlZ2VyPlxuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQVknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQgaW4gcGVyaW9kaWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNbZF0gKz0gKCcgICAgICAgICA8a2V5PkRheTwva2V5PlxuICAgICAgICAgPGludGVnZXI+JyArIG9wdGlvbnNbZnR5cGVdICsgJzwvaW50ZWdlcj5cbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbSBpbiBwZXJpb2RpYykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNbbV0gKz0gKCcgICAgICAgICA8a2V5Pk1vbnRoPC9rZXk+XG4gICAgICAgICA8aW50ZWdlcj4nICsgb3B0aW9uc1tmdHlwZV0gKyAnPC9pbnRlZ2VyPlxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RJTUUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCAhPSBudWxsKSB7IHJldC5fcmVqKCdJbnZhbGlkIE9wdGlvbnMnKTsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBwZXJpb2RpYykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNbdF0gKz0gKCcgICAgICAgICA8a2V5PkhvdXI8L2tleT5cbiAgICAgICAgIDxpbnRlZ2VyPicgKyBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzBdICsgJzwvaW50ZWdlcj5cbicgKyAnICAgICAgICAgPGtleT5NaW51dGU8L2tleT5cbiAgICAgICAgIDxpbnRlZ2VyPicgKyBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzFdICsgJzwvaW50ZWdlcj5cbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgPSBwbGlzdC5yZXBsYWNlKCd7e3tJTlRFUlZBTH19fScsICcgICAgICA8a2V5PlN0YXJ0SW50ZXJ2YWw8L2tleT5cbicgKyBpbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAocGVyaW9kaWMubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ID0gcGxpc3QucmVwbGFjZSgne3t7SU5URVJWQUx9fX0nLCAnICAgICAgPGtleT5TdGFydENhbGVuZGFySW50ZXJ2YWw8L2tleT5cbiAgICAgIDxhcnJheT48ZGljdD5cbicgKyBwZXJpb2RpYy5qb2luKCcgICAgICA8L2RpY3Q+XG4gICAgICA8ZGljdD5cbicpICsgJyAgICAgIDwvZGljdD48L2FycmF5PlxuJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0JywgcGxpc3QpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnbGF1bmNoY3RsIGxvYWQgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0XG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKCgogICAgICAgICAgICAgICAgICAgIHJldC5fcmVzKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKCdOb3QgaW1wbGVtZW50ZWQgb24gJyArIHByb2Nlc3MucGxhdGZvcm0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldC5fcmVqKCdJbnZhbGlkIFBhcmFtZXRlcnMsIG11c3QgYXQgbGVhc3Qgc3BlY2lmeSBuYW1lIGFuZCBzZXJ2aWNlJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLmluZm8gPSBmdW5jdGlvbiBpbmZvKG5hbWUpCiAgICB7CiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldC5fcmVqKCdOb3QgaW1wbGVtZW50ZWQgb24gJyArIHByb2Nlc3MucGxhdGZvcm0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLmRlbGV0ZSA9IGZ1bmN0aW9uIF9kZWxldGUobmFtZSkKICAgIHsKICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgICAgICBzd2l0Y2ggKHByb2Nlc3MucGxhdGZvcm0pCiAgICAgICAgewogICAgICAgICAgICBjYXNlICd3aW4zMic6CiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXHNjaHRhc2tzLmV4ZScsIFsnc2NodGFza3MnLCAnL0RlbGV0ZScsICcvVE4gIicgKyBuYW1lLnNwbGl0KCcvJykuam9pbignXFwnKSArICciJywgJy9GJ10pOwogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnByb21pc2UgPSByZXQ7CiAgICAgICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyBpZiAoY29kZSA9PSAwKSB7IHRoaXMucHJvbWlzZS5fcmVzKCk7IH0gZWxzZSB7IHRoaXMucHJvbWlzZS5fcmVqKGNvZGUpOyB9IH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy9ldGMvY3Jvbi5kLycgKyBuYW1lLnNwbGl0KCcvJykuam9pbignXycpLnNwbGl0KCcuJykuam9pbignJykpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvZXRjL2Nyb24uZC8nICsgbmFtZS5zcGxpdCgnLycpLmpvaW4oJ18nKS5zcGxpdCgnLicpLmpvaW4oJycpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldC5fcmVzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ1Rhc2sgWycgKyBuYW1lICsgJ10gZG9lcyBub3QgZXhpc3QnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICAgICAgdmFyIHRhc2tuYW1lID0gbmFtZS5zcGxpdCgnLycpLmpvaW4oJ18nKS5zcGxpdCgnLicpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYygnL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0JykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2xhdW5jaGN0bCB1bmxvYWQgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy8nICsgdGFza25hbWUgKyAnLnBsaXN0XG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKCcvTGlicmFyeS9MYXVuY2hEYWVtb25zLycgKyB0YXNrbmFtZSArICcucGxpc3QnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXQuX3JlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKCdUYXNrIFsnICsgbmFtZSArICddIGRvZXMgbm90IGV4aXN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldC5fcmVqKCdOb3QgaW1wbGVtZW50ZWQgb24gJyArIHByb2Nlc3MucGxhdGZvcm0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07Cn0KCgptb2R1bGUuZXhwb3J0cyA9IG5ldyB0YXNrKCk7Cgo=", 11816);
|
|
ILibBase64DecodeEx((unsigned char*)_taskscheduler, 27816, (unsigned char*)_taskscheduler + 27816);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "task-scheduler"); duk_push_string(ctx, _taskscheduler + 27816);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_taskscheduler);
|
|
|
|
// message-box, refer to modules/message-box.js
|
|
char *_messagebox = ILibMemory_Allocate(55365, 0, NULL, NULL);
|
|
memcpy_s(_messagebox + 0, 31636, "LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgpjb25zdCBNQl9PSyA9IDB4MDAwMDAwMDA7CmNvbnN0IE1CX09LQ0FOQ0VMICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxOwpjb25zdCBNQl9BQk9SVFJFVFJZSUdOT1JFICAgICAgID0gMHgwMDAwMDAwMjsKY29uc3QgTUJfWUVTTk9DQU5DRUwgICAgICAgICAgICA9IDB4MDAwMDAwMDM7CmNvbnN0IE1CX1lFU05PICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0Owpjb25zdCBNQl9SRVRSWUNBTkNFTCAgICAgICAgICAgID0gMHgwMDAwMDAwNTsKY29uc3QgTUJfVE9QTU9TVCAgICAgICAgICAgICAgICA9IDB4MDAwNDAwMDA7CmNvbnN0IE1CX1NFVEZPUkVHUk9VTkQgICAgICAgICAgPSAweDAwMDEwMDAwOwoKY29uc3QgTUJfREVGQlVUVE9OMSAgICAgICAgICAgICA9IDB4MDAwMDAwMDA7CmNvbnN0IE1CX0RFRkJVVFRPTjIgICAgICAgICAgICAgPSAweDAwMDAwMTAwOwpjb25zdCBNQl9ERUZCVVRUT04zICAgICAgICAgICAgID0gMHgwMDAwMDIwMDsKY29uc3QgTUJfSUNPTkhBTkQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTA7CmNvbnN0IE1CX0lDT05RVUVTVElPTiAgICAgICAgICAgPSAweDAwMDAwMDIwOwpjb25zdCBNQl9JQ09ORVhDTEFNQVRJT04gICAgICAgID0gMHgwMDAwMDAzMDsKY29uc3QgTUJfSUNPTkFTVEVSSVNLICAgICAgICAgICA9IDB4MDAwMDAwNDA7Cgpjb25zdCBJRE9LICAgICA9IDE7CmNvbnN0IElEQ0FOQ0VMID0gMjsKY29uc3QgSURBQk9SVCAgPSAzOwpjb25zdCBJRFJFVFJZICA9IDQ7CmNvbnN0IElESUdOT1JFID0gNTsKY29uc3QgSURZRVMgICAgPSA2Owpjb25zdCBJRE5PICAgICA9IDc7Cgp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsKdmFyIGNoaWxkU2NyaXB0ID0gIlwKICAgICAgICByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5vbignZGF0YScsIGZ1bmN0aW9uIChqKVwKICAgICAgICB7XAogICAgICAgICAgICBzd2l0Y2goai5jb21tYW5kKVwKICAgICAgICAgICAge1wKICAgICAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2VCb3gnOlwKICAgICAgICAgICAgICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpXAogICAgICAgICAgICAgICAgICAgIHtcCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpO1wKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCd1c2VyMzIuZGxsJyk7XAogICAgICAgICAgICAgICAgICAgICAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdNZXNzYWdlQm94QScpO1wKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjMyLk1lc3NhZ2VCb3hBLmFzeW5jKDAsIEdNLkNyZWF0ZVZhcmlhYmxlKGouY2FwdGlvbiksIEdNLkNyZWF0ZVZhcmlhYmxlKGoudGl0bGUpLCAiICsgKE1CX1lFU05PIHwgTUJfREVGQlVUVE9OMiB8IE1CX0lDT05FWENMQU1BVElPTiB8IE1CX1RPUE1PU1QpLnRvU3RyaW5nKCkgKyAiKS50aGVuKFwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ocilcCiAgICAgICAgICAgICAgICAgICAgICAgIHtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyLlZhbCA9PSAiICsgSURZRVMudG9TdHJpbmcoKSArICIpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAge1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5zZW5kKCIgKyBJRFlFUy50b1N0cmluZygpICsgIik7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoIiArIElETk8udG9TdHJpbmcoKSArICIpO1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoKTtcCiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIGJyZWFrO1wKICAgICAgICAgICAgfVwKICAgICAgICB9KTtcCiAgICAiOwoKZnVuY3Rpb24gbWVzc2FnZUJveCgpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ21lc3NhZ2UtYm94JzsKICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjYXB0aW9uLCB0aW1lb3V0KQogICAgewogICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgICAgIHZhciBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdrZXJuZWwzMi5kbGwnKTsKICAgICAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1Byb2Nlc3NJZFRvU2Vzc2lvbklkJyk7CiAgICAgICAgdmFyIHBzaWQgPSBHTS5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICBpZiAoa2VybmVsMzIuUHJvY2Vzc0lkVG9TZXNzaW9uSWQocHJvY2Vzcy5waWQsIHBzaWQpLlZhbCA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0Ll9yZWooJ0ludGVybmFsIEVycm9yJyk7CiAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwpIHsgdGltZW91dCA9IDEwOyB9CiAgICAgICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGV4ZWN1dGlvblRpbWVvdXQ6IHRpbWVvdXQgfTsKCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBvcHRpb25zLnNlc3Npb25JZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7CiAgICAgICAgICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCA9PSBwc2lkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpIHsgZGVsZXRlIG9wdGlvbnMuc2Vzc2lvbklkOyB9CiAgICAgICAgfQogICAgICAgIGNhdGNoKGVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0Ll9yZWooJ05vIGxvZ2dlZCBvbiB1c2VycycpOwogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfQogICAgICAgIHJldC5fdGl0bGUgPSB0aXRsZTsKICAgICAgICByZXQuX2NhcHRpb24gPSBjYXB0aW9uOwogICAgICAgIHJldC5fY29udGFpbmVyID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKG9wdGlvbnMpOwogICAgICAgIHJldC5fY29udGFpbmVyLnByb21pc2UgPSByZXQ7CiAgICAgICAgcmV0Ll9jb250YWluZXIub24oJ2RhdGEnLCBmdW5jdGlvbiAoaikKICAgICAgICB7CiAgICAgICAgICAgIGlmKGogPT0gSURZRVMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignRGVuaWVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXQuX2NvbnRhaW5lci5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignVGltZW91dCcpOwogICAgICAgIH0pOwogICAgICAgIHJldC5fY29udGFpbmVyLkV4ZWN1dGVTdHJpbmcoY2hpbGRTY3JpcHQpOwogICAgICAgIHJldC5fY29udGFpbmVyLnNlbmQoeyBjb21tYW5kOiAnbWVzc2FnZUJveCcsIGNhcHRpb246IGNhcHRpb24sIHRpdGxlOiB0aXRsZSB9KTsKICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9Owp9CgoKZnVuY3Rpb24gbGludXhfbWVzc2FnZUJveCgpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ21lc3NhZ2UtYm94JzsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnemVuaXR5JywKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlOiAoZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMgemVuaXR5IHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnJyAmJiByZXF1aXJlKCdmcycpLmV4aXN0c1N5bmMoJy91c3IvbG9jYWwvYmluL3plbml0eScpKSB7IGxvY2F0aW9uID0gJy91c3IvbG9jYWwvYmluL3plbml0eSc7IH0KICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnJykgeyByZXR1cm4gKG51bGwpOyB9CgogICAgICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZShsb2NhdGlvbiArICcgLS1oZWxwLWFsbCB8IGdyZXAgdGltZW91dFxuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgICAgIHZhciByZXQgPSB7IHBhdGg6IGxvY2F0aW9uLCB0aW1lb3V0OiBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IGZhbHNlIDogdHJ1ZSB9OwoKICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUobG9jYXRpb24gKyAnIC0tdmVyc2lvbiB8IGF3ayAtRi4gXCd7IHByaW50ZiAiWyVzLCAlc11cXG4iLCAkMSwgJDI7IH0gXCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXQudmVyc2lvbiA9IEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXQudmVyc2lvbiA9IFsyLCAxNl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgICAgIH0pKCkKICAgICAgICB9KTsKICAgIGlmICghdGhpcy56ZW5pdHkpCiAgICB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdrZGlhbG9nJywKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFsdWU6IChmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMga2RpYWxvZyB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnID8gbnVsbCA6IHsgcGF0aDogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgfSk7CiAgICAgICAgICAgICAgICB9KSgpCiAgICAgICAgICAgIH0pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbm90aWZ5c2VuZCcsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhbHVlOiAoZnVuY3Rpb24gKCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzIG5vdGlmeS1zZW5kIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycgPyBudWxsIDogeyBwYXRoOiBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSB9KTsKICAgICAgICAgICAgICAgIH0pKCkKICAgICAgICAgICAgfSk7CiAgICB9CgogICAgdGhpcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNhcHRpb24sIHRpbWVvdXQpCiAgICB7CiAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCkgeyB0aW1lb3V0ID0gMTA7IH0KICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgICAgICB2YXIgdWlkOyAgICAKICAgICAgICB2YXIgeGluZm87CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsKICAgICAgICAgICAgeGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbyh1aWQpOwogICAgICAgIH0KICAgICAgICBjYXRjaChlKQogICAgICAgIHsKICAgICAgICAgICAgdWlkID0gMDsKICAgICAgICAgICAgeGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbygwKTsKICAgICAgICB9CgogICAgICAgIGlmICh4aW5mbyA9PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0Ll9yZWooJ1RoaXMgc3lzdGVtIGNhbm5vdCBkaXNwbGF5IGEgdXNlciBkaWFsb2cgYm94IHdoZW4gYSB1c2VyIGlzIG5vdCBsb2dnZWQgaW4nKTsKICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuemVuaXR5KQogICAgICAgIHsKICAgICAgICAgICAgLy8gR05PTUUvWkVOSVRZCiAgICAgICAgICAgIGlmICh0aGlzLnplbml0eS50aW1lb3V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1xdWVzdGlvbicsICctLXRpdGxlPScgKyB0aXRsZSwgJy0tdGV4dD0nICsgY2FwdGlvbiwgJy0tdGltZW91dD0nICsgdGltZW91dF0sIHsgdWlkOiB1aWQsIGVudjogeyBYQVVUSE9SSVRZOiB4aW5mby54YXV0aG9yaXR5ID8geGluZm8ueGF1dGhvcml0eSA6ICIiLCBESVNQTEFZOiB4aW5mby5kaXNwbGF5IH0gfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1xdWVzdGlvbicsICctLXRpdGxlPScgKyB0aXRsZSwgJy0tdGV4dD0nICsgY2FwdGlvbl0sIHsgdWlkOiB1aWQsIGVudjogeyBYQVVUSE9SSVRZOiB4aW5mby54YXV0aG9yaXR5ID8geGluZm8ueGF1dGhvcml0eSA6ICIiLCBESVNQTEFZOiB4aW5mby5kaXNwbGF5IH0gfSk7CiAgICAgICAgICAgICAgICByZXQuY2hpbGQudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYy50aW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBjLmtpbGwoKTsKICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQgKiAxMDAwLCByZXQuY2hpbGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldC5jaGlsZC5wcm9taXNlID0gcmV0OwogICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZW91dCkgeyBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsgfQogICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignZGVuaWVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCd0aW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZih0aGlzLmtkaWFsb2cpCiAgICAgICAgewogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnZnJlZWJzZCcgJiYgcHJvY2Vzcy5lbnZbJ0RJU1BMQVknXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHRoaXMua2RpYWxvZy5wYXRoLCBbJ2tkaWFsb2cnLCAnLS10aXRsZScsIHRpdGxlLCAnLS15ZXNubycsIGNhcHRpb25dKTsKICAgICAgICAgICAgICAgIHJldC5jaGlsZC5wcm9taXNlID0gcmV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHhkZyA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5maW5kRW52KHVpZCwgJ1hER19SVU5USU1FX0RJUicpOyBpZiAoeGRnID09IG51bGwpIHsgeGRnID0gJyc7IH0KICAgICAgICAgICAgICAgIGlmICgheGluZm8gfHwgIXhpbmZvLmRpc3BsYXkgfHwgIXhpbmZvLnhhdXRob3JpdHkpIHsgcmV0Ll9yZWooJ0ludGVyYWwgRXJyb3IsIGNvdWxkIG5vdCBkZXRlcm1pbmUgWDExL1hERyBlbnYnKTsgcmV0dXJuIChyZXQpOyB9CiAgICAgICAgICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy5rZGlhbG9nLnBhdGgsIFsna2RpYWxvZycsICctLXRpdGxlJywgdGl0bGUsICctLXllc25vJywgY2FwdGlvbl0sIHsgdWlkOiB1aWQsIGVudjogeyBESVNQTEFZOiB4aW5mby5kaXNwbGF5LCBYQVVUSE9SSVRZOiB4aW5mby54YXV0aG9yaXR5LCBYREdfUlVOVElNRV9ESVI6IHhkZyB9IH0pOwogICAgICAgICAgICAgICAgcmV0LmNoaWxkLnByb21pc2UgPSByZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0LmNoaWxkLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChjKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjLnRpbWVvdXQgPSBudWxsOwogICAgICAgICAgICAgICAgYy5raWxsKCk7CiAgICAgICAgICAgIH0sIHRpbWVvdXQgKiAxMDAwLCByZXQuY2hpbGQpOwogICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZW91dCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdkZW5pZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ3RpbWVvdXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaigndGltZW91dCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfTsKfQoKaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCnsKICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZU9iamVjdChvYmopCiAgICB7CiAgICAgICAgdmFyIGogPSBKU09OLnN0cmluZ2lmeShvYmopOwogICAgICAgIHZhciBiID0gQnVmZmVyLmFsbG9jKGoubGVuZ3RoICsgNCk7CiAgICAgICAgYi53cml0ZVVJbnQzMkxFKGoubGVuZ3RoICsgNCk7CiAgICAgICAgQnVmZmVyLmZyb20oaikuY29weShiLCA0KTsKICAgICAgICByZXR1cm4gKGIpOwogICAgfQp9CgpmdW5jdGlvbiBtYWNvc19tZXNzYWdlQm94KCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnbWVzc2FnZS1ib3gnOwogICAgdGhpcy5faW5pdElQQ0Jhc2UgPSBmdW5j", 16000);
|
|
memcpy_s(_messagebox + 16000, 15636, "dGlvbiBfaW5pdElQQ0Jhc2UoKQogICAgewogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwoKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHJldC51aWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldC5fcmVqKGUpOwogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfQoKICAgICAgICByZXQucGF0aCA9ICcvdmFyL3RtcC8nICsgcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnLycpLnBvcCgpICsgJ19ldic7CiAgICAgICAgdmFyIG47CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgbiA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMScsICc5OTk5OScpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkKICAgICAgICB7CiAgICAgICAgICAgIG4gPSAwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKHJldC5wYXRoICsgbikpCiAgICAgICAgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbiA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMScsICc5OTk5OScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICArK247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0LnBhdGggPSByZXQucGF0aCArIG47CiAgICAgICAgcmV0LnRtcFNlcnZpY2VOYW1lID0gJ21lc2hOb3RpZmljYXRpb25TZXJ2ZXInICsgbjsKICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9OwogICAgCiAgICB0aGlzLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY2FwdGlvbiwgdGltZW91dCkKICAgIHsKICAgICAgICAvLyBTdGFydCBMb2NhbCBTZXJ2ZXIKICAgICAgICB2YXIgcmV0ID0gdGhpcy5faW5pdElQQ0Jhc2UoKTsKICAgICAgICByZXQudGl0bGUgPSB0aXRsZTsgcmV0LmNhcHRpb24gPSBjYXB0aW9uOyByZXQudGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgcmV0LnNlcnZlciA9IHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyKHJldCk7CiAgICAgICAgcmV0LnNlcnZlci5yZXQgPSByZXQ7CiAgICAgICAgcmV0LnNlcnZlci5vbignY29ubmVjdGlvbicsIGZ1bmN0aW9uIChjKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbiA9IGM7CiAgICAgICAgICAgIGMucHJvbWlzZSA9IHRoaXMucmV0OwogICAgICAgICAgICBjLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW4gPCA0IHx8IGJ1ZmZlci5yZWFkVUludDMyTEUoMCkgPiBidWZmZXIubGVuKSB7IHRoaXMudW5zaGlmdChidWZmZXIpOyB9CiAgICAgICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgc3dpdGNoIChwLmNvbW1hbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVJST1InOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaihwLnJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RJQUxPRyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLnRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdUSU1FT1VUJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5idXR0b24gPT0gJ1llcycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZXMocC5idXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdkZW5pZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGMud3JpdGUodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0RJQUxPRycsIHRpdGxlOiB0aGlzLnJldC50aXRsZSwgY2FwdGlvbjogdGhpcy5yZXQuY2FwdGlvbiwgaWNvbjogJ2NhdXRpb24nLCBidXR0b25zOiBbJyJZZXMiJywgJyJObyInXSwgYnV0dG9uRGVmYXVsdDogMiwgdGltZW91dDogdGhpcy5yZXQudGltZW91dCB9KSk7CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLmxvY2sgPSBmdW5jdGlvbiBsb2NrKCkKICAgIHsKICAgICAgICAvLyBTdGFydCBMb2NhbCBTZXJ2ZXIKICAgICAgICB2YXIgcmV0ID0gdGhpcy5faW5pdElQQ0Jhc2UoKTsKICAgICAgICByZXQuc2VydmVyID0gdGhpcy5zdGFydE1lc3NhZ2VTZXJ2ZXIocmV0KTsKICAgICAgICByZXQuc2VydmVyLnJldCA9IHJldDsKICAgICAgICByZXQuc2VydmVyLm9uKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gKGMpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLl9jb25uZWN0aW9uID0gYzsKICAgICAgICAgICAgYy5wcm9taXNlID0gdGhpcy5yZXQ7CiAgICAgICAgICAgIGMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYnVmZmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbiA8IDQgfHwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSA+IGJ1ZmZlci5sZW4pIHsgdGhpcy51bnNoaWZ0KGJ1ZmZlcik7IH0KICAgICAgICAgICAgICAgIHZhciBwID0gSlNPTi5wYXJzZShidWZmZXIuc2xpY2UoNCwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHAuY29tbWFuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdFUlJPUic6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKHAucmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTE9DSyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYy53cml0ZSh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnTE9DSycgfSkpOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9OwogICAgdGhpcy5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkodGl0bGUsIGNhcHRpb24pCiAgICB7CiAgICAgICAgLy8gU3RhcnQgTG9jYWwgU2VydmVyCiAgICAgICAgdmFyIHJldCA9IHRoaXMuX2luaXRJUENCYXNlKCk7CiAgICAgICAgcmV0LnRpdGxlID0gdGl0bGU7IHJldC5jYXB0aW9uID0gY2FwdGlvbjsgCiAgICAgICAgcmV0LnNlcnZlciA9IHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyKHJldCk7CiAgICAgICAgcmV0LnNlcnZlci5yZXQgPSByZXQ7CiAgICAgICAgcmV0LnNlcnZlci5vbignY29ubmVjdGlvbicsIGZ1bmN0aW9uIChjKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbiA9IGM7CiAgICAgICAgICAgIGMucHJvbWlzZSA9IHRoaXMucmV0OwogICAgICAgICAgICBjLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ1ZmZlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW4gPCA0IHx8IGJ1ZmZlci5yZWFkVUludDMyTEUoMCkgPiBidWZmZXIubGVuKSB7IHRoaXMudW5zaGlmdChidWZmZXIpOyB9CiAgICAgICAgICAgICAgICB2YXIgcCA9IEpTT04ucGFyc2UoYnVmZmVyLnNsaWNlKDQsIGJ1ZmZlci5yZWFkVUludDMyTEUoMCkpLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgc3dpdGNoIChwLmNvbW1hbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVJST1InOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaihwLnJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ05PVElGWSc6CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcygpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGMud3JpdGUodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ05PVElGWScsIHRpdGxlOiB0aGlzLnJldC50aXRsZSwgY2FwdGlvbjogdGhpcy5yZXQuY2FwdGlvbiB9KSk7CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiAocmV0KTsKICAgIH07CiAgICB0aGlzLnN0YXJ0Q2xpZW50ID0gZnVuY3Rpb24gc3RhcnRDbGllbnQob3B0aW9ucykKICAgIHsKICAgICAgICAvLyBDcmVhdGUgdGhlIENsaWVudAogICAgICAgIGNvbnNvbGUubG9nKCdTdGFydGluZyBDbGllbnQuLi4nKTsKCiAgICAgICAgb3B0aW9ucy5vc3ZlcnNpb24gPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5nZXRPU1ZlcnNpb24oKTsKICAgICAgICBvcHRpb25zLnVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7CiAgICAgICAgdGhpcy5jbGllbnQgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVDb25uZWN0aW9uKG9wdGlvbnMpOwogICAgICAgIHRoaXMuY2xpZW50Ll9vcHRpb25zID0gb3B0aW9uczsKICAgICAgICB0aGlzLmNsaWVudC5vbignZGF0YScsIGZ1bmN0aW9uIChidWZmZXIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoYnVmZmVyLmxlbiA8IDQgfHwgYnVmZmVyLnJlYWRVSW50MzJMRSgwKSA+IGJ1ZmZlci5sZW4pIHsgdGhpcy51bnNoaWZ0KGJ1ZmZlcik7IH0KICAgICAgICAgICAgdmFyIHAgPSBKU09OLnBhcnNlKGJ1ZmZlci5zbGljZSg0LCBidWZmZXIucmVhZFVJbnQzMkxFKDApKS50b1N0cmluZygpKTsKICAgICAgICAgICAgc3dpdGNoIChwLmNvbW1hbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ0xPQ0snOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRvdXQuc3RyID0gJyc7IHRoaXMuX3NoZWxsLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyID0gJyc7IHRoaXMuX3NoZWxsLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC5zdGRpbi53cml0ZSgnL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9NZW51XFwgRXh0cmFzL1VzZXIubWVudS9Db250ZW50cy9SZXNvdXJjZXMvQ0dTZXNzaW9uIC1zdXNwZW5kXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaGVsbC5zdGRlcnIuc3RyICE9ICcnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0VSUk9SJywgcmVhc29uOiB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0xPQ0snLCBzdGF0dXM6IDAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ05PVElGWSc6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZG91dC5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgPSAnJzsgdGhpcy5fc2hlbGwuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLnN0ZGluLndyaXRlKCdvc2FzY3JpcHQgLWUgXCd0ZWxsIGN1cnJlbnQgYXBwbGljYXRpb24gdG8gZGlzcGxheSBub3RpZmljYXRpb24gIicgKyBwLmNhcHRpb24gKyAnIiB3aXRoIHRpdGxlICInICsgcC50aXRsZSArICciXCdcbmV4aXRcbicpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoZWxsLndhaXRFeGl0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgIT0gJycpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRVJST1InLCByZWFzb246IHRoaXMuX3NoZWxsLnN0ZGVyci5zdHIgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnTk9USUZZJywgc3RhdHVzOiAwIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdESUFMT0cnOgogICAgICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0ID0gcC50aW1lb3V0ID8gKCcgZ2l2aW5nIHVwIGFmdGVyICcgKyBwLnRpbWVvdXQpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgdmFyIGljb24gPSBwLmljb24gPyAoJ3dpdGggaWNvbiAnICsgcC5pY29uKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIHZhciBidXR0b25zID0gcC5idXR0b25zID8gKCdidXR0b25zIHsnICsgcC5idXR0b25zLnRvU3RyaW5nKCkgKyAnfScpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHAuYnV0dG9uRGVmYXVsdCAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyArPSAoJyBkZWZhdWx0IGJ1dHRvbiAnICsgcC5idXR0b25EZWZhdWx0KQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3Rkb3V0LnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3RkZXJyLnN0ciA9ICcnOyB0aGlzLl9zaGVsbC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hlbGwuc3RkaW4ud3JpdGUoJ29zYXNjcmlwdCAtZSBcJ3RlbGwgY3VycmVudCBhcHBsaWNhdGlvbiB0byBkaXNwbGF5IGRpYWxvZyAiJyArIHAuY2FwdGlvbiArICciIHdpdGggdGl0bGUgIicgKyBwLnRpdGxlICsgJyIgJyArIGljb24gKyAnICcgKyBidXR0b25zICsgdGltZW91dCArICdcJyB8IGF3ayBcJ3sgYz1zcGxpdCgkMCwgdG9rZW5zLCAiLCIpOyBzcGxpdCh0b2tlbnNbMV0sIHZhbCwgIjoiKTsgaWYoYz09MSkgeyBwcmludCB2YWxbMl0gfSBlbHNlIHsgc3BsaXQodG9rZW5zWzJdLCBndSwgIjoiKTsgaWYoZ3VbMl09PSJ0cnVlIikgeyBwcmludCAiX1RJTUVPVVRfIiB9IGVsc2UgeyBwcmludCB2YWxbMl0gIH0gIH0gfVwnXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGVsbC53YWl0RXhpdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaGVsbC5zdGRlcnIuc3RyICE9ICcnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQodHJhbnNsYXRlT2JqZWN0KHsgY29tbWFuZDogJ0VSUk9SJywgcmVhc29uOiB0aGlzLl9zaGVsbC5zdGRlcnIuc3RyIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NoZWxsLnN0ZG91dC5zdHIudHJpbSgpID09ICdfVElNRU9VVF8nKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRElBTE9HJywgdGltZW91dDogdHJ1ZSB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZCh0cmFuc2xhdGVPYmplY3QoeyBjb21tYW5kOiAnRElBTE9HJywgYnV0dG9uOiB0aGlzLl9zaGVsbC5zdGRvdXQuc3RyLnRyaW0oKSB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB0aGlzLnVuaW5zdGFsbCgpOyB9KS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyB0aGlzLnVuaW5zdGFsbCgpOyB9KTsKICAgICAgICB0aGlzLmNsaWVudC51bmluc3RhbGwgPSBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgLy8gTmVlZCB0byB1bmluc3RhbGwgb3Vyc2VsdmVzCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnLycpLnBvcCgpLCAnLWV4ZWMnLCAidmFyIHM9cmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRMYXVuY2hBZ2VudCgnIiArIHRoaXMuX29wdGlvbnMuc2VydmljZSArICInLCAiICsgdGhpcy5fb3B0aW9ucy51aWQgKyAiKTsgcy51bmxvYWQoKTsgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHMucGxpc3QpO3Byb2Nlc3MuZXhpdCgpOyJdLCB7IGRldGFjaGVkOiB0cnVlLCB0eXBlOiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuU3Bhd25UeXBlcy5ERVRBQ0hFRCB9KTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiAodGhpcy5jbGllbnQpOwogICAgfTsKICAgIHRoaXMuc3RhcnRNZXNzYWdlU2VydmVyID0gZnVuY3Rpb24gc3RhcnRNZXNzYWdlU2VydmVyKG9wdGlvbnMpCiAgICB7CiAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykuZXhpc3RzU3luYyhvcHRpb25zLnBhdGgpKSB7IHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhvcHRpb25zLnBhdGgpOyB9CiAgICAgICAgb3B0aW9ucy53cml0YWJsZUFsbCA9IHRydWU7CgogICAgICAgIHZhciByZXQgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVTZXJ2ZXIoKTsKICAgICAgICByZXQudWlkID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKTsKICAgICAgICByZXQub3N2ZXJzaW9uID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykuZ2V0T1NWZXJzaW9uKCk7CiAgICAgICAgcmV0Ll9vcHRpb25zID0gb3B0aW9uczsKICAgICAgICByZXQudGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChvYmopCiAgICAgICAgewogICAgICAgICAgICBvYmouY2xvc2UoKTsKICAgICAgICAgICAgb2JqLl9vcHRpb25zLl9yZWooJ0Nvbm5lY3Rpb24gdGltZW91dCcpOwogICAgICAgIH0sIDUwMDAsIHJldCk7CiAgICAgICAgcmV0Lmxpc3RlbihvcHRpb25zKTsKICAgICAgICByZXQub24oJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiAoYykKICAgICAgICB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKICAgICAgICB9KTsKICAgICAgICByZXQub24oJ34nLCBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmVxdWlyZSgnZnMnKS51bmxpbmtTeW5jKHRoaXMuX29wdGlvbnMucGF0aCk7CiAgICAgICAgfSk7CgogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuaW5zdGFsbExhdW5jaEFnZW50KAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnRtcFNlcnZpY2VOYW1lLCBzZXJ2aWNlUGF0aDogcHJvY2Vzcy5leGVjUGF0aCwgc3RhcnRUeXBlOiAnQVVUT19TVEFSVCcsIHVpZDogcmV0LnVpZCwKICAgICAgICAgICAgICAgIHNlc3Npb25UeXBlczogWydBcXVhJ10sIHBhcmFtZXRlcnM6IFsnLWV4ZWMnLCAicmVxdWlyZSgnbWVzc2FnZS1ib3gnKS5zdGFydENsaWVudCh7IHBhdGg6ICciICsgb3B0aW9ucy5wYXRoICsgIicsIHNlcnZpY2U6ICciICsgb3B0aW9ucy50bXBTZXJ2aWNlTmFtZSArICInIH0pLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsiXQogICAgICAgICAgICB9KTsKICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldExhdW5jaEFnZW50KG9wdGlvbnMudG1wU2VydmljZU5hbWUsIHJldC51aWQpLmxvYWQoKTsKCiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfTsKfQoKCnN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQp7CiAgICBjYXNlICd3aW4zMic6CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgbWVzc2FnZUJveCgpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnbGludXgnOgogICAgY2FzZSAnZnJlZWJzZCc6CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgbGludXhfbWVzc2FnZUJveCgpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnZGFyd2luJzoKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBtYWNvc19tZXNzYWdlQm94KCk7CiAgICAgICAgYnJlYWs7Cn0KCgoKCgoK", 15636);
|
|
ILibBase64DecodeEx((unsigned char*)_messagebox, 31636, (unsigned char*)_messagebox + 31636);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "message-box"); duk_push_string(ctx, _messagebox + 31636);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_messagebox);
|
|
|
|
// toaster, refer to modules/toaster.js
|
|
char *_toaster = ILibMemory_Allocate(29731, 0, NULL, NULL);
|
|
memcpy_s(_toaster + 0, 16988, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwoKaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyB8fCBwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nIHx8IHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnKQp7CiAgICBmdW5jdGlvbiBmaW5kUGF0aChhcHApCiAgICB7CiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgewogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyAiICsgYXBwICsgIiB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzICIgKyBhcHAgKyAiXG5leGl0XG4iKTsKICAgICAgICB9CiAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnICYmIGNoaWxkLnN0ZG91dC5zdHIgPT0gJycgJiYgcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvdXNyL2xvY2FsL2Jpbi8nICsgYXBwKSkgeyByZXR1cm4gKCcvdXNyL2xvY2FsL2Jpbi8nICsgYXBwKTsgfQogICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ciA9PSAnJyA/IG51bGwgOiBjaGlsZC5zdGRvdXQuc3RyKTsKICAgIH0KfQoKZnVuY3Rpb24gVG9hc3RlcigpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3RvYXN0ZXInOwogICAgdGhpcy5Ub2FzdCA9IGZ1bmN0aW9uIFRvYXN0KHRpdGxlLCBjYXB0aW9uLCB0c2lkKQogICAgewogICAgICAgIHZhciByZXRWYWwgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgIHJldFZhbC50aXRsZSA9IHRpdGxlOwogICAgICAgIHJldFZhbC5jYXB0aW9uID0gY2FwdGlvbjsKCiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnd2luMzInOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkOwogICAgICAgICAgICAgICAgICAgIHZhciBjb25zb2xlVWlkID0gMDsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVVaWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fcmVqKCdDYW5ub3QgZGlzcGxheSB1c2VyIG5vdGlmaWNhdGlvbiB3aGVuIGEgdXNlciBpcyBub3QgbG9nZ2VkIGluJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBydW5uaW5nIGFzIHVzZXINCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRzaWQgIT0gbnVsbCAmJiB0c2lkICE9IGlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZW4ndCBMb2NhbFN5c3RlbSwgd2UgY2Fubm90IHNwYXduIGFzIGEgZGlmZmVyZW50IHVzZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3JlaignQ2Fubm90IGRpc3BsYXkgdXNlciBub3RpZmljYXRpb24gdG8gVFNJRDogJyArIHRzaWQgKyAnIGZyb20gVFNJRDogJyArIGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQgPSByZXF1aXJlKCdTY3JpcHRDb250YWluZXInKS5DcmVhdGUoeyBwcm9jZXNzSXNvbGF0aW9uOiB0cnVlIH0pOw0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcnVubmluZyBhcyBMb2NhbFN5c3RlbQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzaWQgPT0gbnVsbCkgeyB0c2lkID0gY29uc29sZVVpZDsgfQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkID0gcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuQ3JlYXRlKHsgcHJvY2Vzc0lzb2xhdGlvbjogdHJ1ZSwgc2Vzc2lvbklkOiB0c2lkIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5wYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll9yZXMoJ0RJU01JU1NFRCcpOyB9KTsKICAgICAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLmFkZE1vZHVsZSgnd2luLWNvbnNvbGUnLCBnZXRKU01vZHVsZSgnd2luLWNvbnNvbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5hZGRNb2R1bGUoJ3dpbi1tZXNzYWdlLXB1bXAnLCBnZXRKU01vZHVsZSgnd2luLW1lc3NhZ2UtcHVtcCcpKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICJcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnl7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvYXN0ID0gcmVxdWlyZSgnd2luLWNvbnNvbGUnKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFsbG9vbiA9IHRvYXN0LlNldFRyYXlJY29uKHsgc3pJbmZvOiAnIiArIGNhcHRpb24gKyAiJywgc3pJbmZvVGl0bGU6ICciICsgdGl0bGUgKyAiJywgYmFsbG9vbk9ubHk6IHRydWUgfSk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsbG9vbi5vbignVG9hc3REaXNtaXNzZWQnLCBmdW5jdGlvbigpe3Byb2Nlc3MuZXhpdCgpO30pO1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChlKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSgnU2NyaXB0Q29udGFpbmVyJykuc2VuZChlKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ1NjcmlwdENvbnRhaW5lcicpLnNlbmQoJ2RvbmUnKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwogICAgICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuRXhlY3V0ZVN0cmluZyhzdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICBjYXNlICdmcmVlYnNkJzoKICAgICAgICAgICAgY2FzZSAnbGludXgnOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNvbnNvbGVVaWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwueGluZm8gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRYSW5mbyhyZXRWYWwuY29uc29sZVVpZCk7CgkJCSAgICAgICAgICAgIHJldFZhbC51c2VybmFtZSA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRVc2VybmFtZShyZXRWYWwuY29uc29sZVVpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoICh4eGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3Jlaih4eGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnICYmICFyZXF1aXJlKCdsaW51eC1kYnVzJykuaGFzU2VydmljZSgnb3JnLmZyZWVkZXNrdG9wLk5vdGlmaWNhdGlvbnMnKSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gRC1CdXMgc2VydmljZSB0byBoYW5kbGUgbm90aWZpY2F0aW9ucywgc28gd2UgbXVzdCBmYWtlIGEgbm90aWZpY2F0aW9uIHdpdGggWkVOSVRZIC0taW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGltZW91dCBTdXBwb3J0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1pbmZvJywgJy0tdGl0bGU9JyArIHJldFZhbC50aXRsZSwgJy0tdGV4dD0nICsgcmV0VmFsLmNhcHRpb24sICctLXRpbWVvdXQ9NSddLCB7IHVpZDogcmV0VmFsLmNvbnNvbGVVaWQsIGVudjogeyBYQVVUSE9SSVRZOiByZXRWYWwueGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogcmV0VmFsLnhpbmZvLmRpc3BsYXkgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBUaW1lb3V0IFN1cHBvcnQsIHNvIHdlIG11c3QgZmFrZSBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShyZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS5wYXRoLCBbJ3plbml0eScsICctLWluZm8nLCAnLS10aXRsZT0nICsgcmV0VmFsLnRpdGxlLCAnLS10ZXh0PScgKyByZXRWYWwuY2FwdGlvbl0sIHsgdWlkOiByZXRWYWwuY29uc29sZVVpZCwgZW52OiB7IFhBVVRIT1JJVFk6IHJldFZhbC54aW5mby54YXV0aG9yaXR5LCBESVNQTEFZOiByZXRWYWwueGluZm8uZGlzcGxheSB9IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoYykgeyBjLnRpbWVvdXQgPSBudWxsOyBjLmtpbGwoKTsgfSwgNTAwMCwgcmV0VmFsLmNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkudmVyc2lvblswXSA8IDMgfHwgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnZlcnNpb25bMF0gPT0gMyAmJiByZXF1aXJlKCdtZXNzYWdlLWJveCcpLnplbml0eS52ZXJzaW9uWzFdIDwgMTApKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBaRU5JVFkgTm90aWZpY2F0aW9uIGlzIGJyb2tlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94Jykubm90aWZ5c2VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2luZyBub3RpZnktc2VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykud2hvYW1pKCkgPT0gJ3Jvb3QnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgcm9vdCwgc28gd2UgbXVzdCBydW4gaW4gY29ycmVjdCBjb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5zdGRpbi53cml0ZSgnc3UgLSAnICsgcmV0VmFsLnVzZXJuYW1lICsgJyAtYyAiRElTUExBWT1cJycgKyByZXRWYWwueGluZm8uZGlzcGxheSArICdcJyBub3RpZnktc2VuZCBcJycgKyByZXRWYWwudGl0bGUgKyAnXCcgXCcnICsgcmV0VmFsLmNhcHRpb24gKyAnXCciXG5leGl0XG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYSByZWd1bGFyIHVzZXIsIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS5ub3RpZnlzZW5kLnBhdGgsIFsnbm90aWZ5LXNlbmQnLCByZXRWYWwudGl0bGUsIHJldFZhbC5jYXB0aW9uXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZha2luZyBub3RpZmljYXRpb24gd2l0aCBaRU5JVFkgLS1pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaW1lb3V0IFN1cHBvcnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocmVxdWlyZSgnbWVzc2FnZS1ib3gnKS56ZW5pdHkucGF0aCwgWyd6ZW5pdHknLCAnLS1pbmZvJywgJy0tdGl0bGU9JyArIHJldFZhbC50aXRsZSwgJy0tdGV4dD0nICsgcmV0VmFsLmNhcHRpb24sICctLXRpbWVvdXQ9NSddLCB7IHVpZDogcmV0VmFsLmNvbnNvbGVVaWQsIGVudjogeyBYQVVUSE9SSVRZOiByZXRWYWwueGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogcmV0VmFsLnhpbmZvLmRpc3BsYXkgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gVGltZW91dCBTdXBwb3J0LCBzbyB3ZSBtdXN0IGZha2UgaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnBhdGgsIFsnemVuaXR5JywgJy0taW5mbycsICctLXRpdGxlPScgKyByZXRWYWwudGl0bGUsICctLXRleHQ9JyArIHJldFZhbC5jYXB0aW9uXSwgeyB1aWQ6IHJldFZhbC5jb25zb2xlVWlkLCBlbnY6IHsgWEFVVEhPUklUWTogcmV0VmFsLnhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHJldFZhbC54aW5mby5kaXNwbGF5IH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoYykgeyBjLnRpbWVvdXQgPSBudWxsOyBjLmtpbGwoKTsgfSwgNTAwMCwgcmV0VmFsLmNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgWkVOSVRZIE5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHJlcXVpcmUoJ21lc3NhZ2UtYm94JykuemVuaXR5LnBhdGgsIFsnemVuaXR5JywgJy0tbm90aWZpY2F0aW9uJywgJy0tdGl0bGU9JyArIHRpdGxlLCAnLS10ZXh0PScgKyBjYXB0aW9uLCAnLS10aW1lb3V0PTUnXSwgeyB1aWQ6IHJldFZhbC5jb25zb2xlVWlkLCBlbnY6IHsgWEFVVEhPUklUWTogcmV0VmFsLnhpbmZvLnhhdXRob3JpdHksIERJU1BMQVk6IHJldFZhbC54aW5mby5kaXNwbGF5IH0gfSk7ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5wYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZW91dCkgeyBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX3JlcygnRElTTUlTU0VEJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1dGlsID0gZmluZFBhdGgoJ2tkaWFsb2cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwpIAoJCQkgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgS0RJQUxPRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhkZyA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5maW5kRW52KHJldFZhbC5jb25zb2xlVWlkLCAnWERHX1JVTlRJTUVfRElSJyk7IGlmICh4ZGcgPT0gbnVsbCkgeyB4ZGcgPSAnJzsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXRWYWwueGluZm8gfHwgIXJldFZhbC54aW5mby5kaXNwbGF5IHx8ICFyZXRWYWwueGluZm8ueGF1dGhvcml0eSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX3JlaignSW50ZXJuYWwgRXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldFZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuX25vdGlmeSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSh1dGlsLCBbJ2tkaWFsb2cnLCAnLS10aXRsZScsIHJldFZhbC50aXRsZSwgJy0tcGFzc2l2ZXBvcHVwJywgcmV0VmFsLmNhcHRpb24sICc1J10sIHsgdWlkOiByZXRWYWwuY29uc29sZVVpZCwgZW52OiB7IERJU1BMQVk6IHJldFZhbC54aW5mby5kaXNwbGF5LCBYQVVUSE9SSVRZOiByZXRWYWwueGluZm8ueGF1dGhvcml0eSwgWERHX1JVTlRJTUVfRElSOiB4ZGcgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fbm90aWZ5LnBhcmVudCA9IHJldFZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fbm90aWZ5LnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fbm90aWZ5LnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5fbm90aWZ5Lm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgdGhpcy5wYXJlbnQuX3JlcygnRElTTUlTU0VEJyk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLl9yZWooJ1plbml0eS9LRGlhbG9nIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2Rhcndpbic6CiAgICAgICAgICAgICAgICByZXRWYWwuX3RvYXN0ID0gcmVxdWlyZSgnbWVzc2FnZS1ib3gnKS5ub3RpZnkodGl0bGUsIGNhcHRpb24pOwogICAgICAgICAgICAgICAgcmV0VmFsLl90b2FzdC5wYXJlbnQgPSByZXRWYWw7CiAgICAgICAgICAgICAgICByZXRWYWwuX3RvYXN0LnRoZW4oZnVuY3Rpb24gKHYpIHsgdGhpcy5wYXJlbnQuX3Jlcyh2KTsgfSwgZnVuY3Rpb24gKGUpIHsgdGhpcy5wYXJlbnQuX3JlaihlKTsgfSk7CiAgICAgICAgICAgICAgICBi", 16000);
|
|
memcpy_s(_toaster + 16000, 988, "cmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgIH07Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IFRvYXN0ZXIoKTsKaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JyAmJiAhcmVxdWlyZSgnbGludXgtZGJ1cycpLmhhc1NlcnZpY2UpCnsKICAgIHJlcXVpcmUoJ2xpbnV4LWRidXMnKS5oYXNTZXJ2aWNlID0gZnVuY3Rpb24gaGFzU2VydmljZShuYW1lKQogICAgewogICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnY2F0IC91c3Ivc2hhcmUvZGJ1cy0xL3NlcnZpY2VzLyouc2VydmljZSB8IGdyZXAgIicgKyBuYW1lICsgJyIgfCBhd2sgLUY9IFwneyBpZiggJDI9PSInICsgbmFtZSArICciICkgeyBwcmludCAkMjsgfSB9XCdcbmV4aXRcbicpOwogICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJyk7CiAgICB9Owp9", 988);
|
|
ILibBase64DecodeEx((unsigned char*)_toaster, 16988, (unsigned char*)_toaster + 16988);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "toaster"); duk_push_string(ctx, _toaster + 16988);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_toaster);
|
|
|
|
|
|
// notifybar-desktop, refer to modules/notifybar-desktop.js
|
|
char *_notifybardesktop = ILibMemory_Allocate(29268, 0, NULL, NULL);
|
|
memcpy_s(_notifybardesktop + 0, 16724, "LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwdHJzaXplID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJykuUG9pbnRlclNpemU7CnZhciBDbGllbnRNZXNzYWdlID0gMzM7CgoKZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfY2hlY2sodGl0bGUsIHRzaWQpCnsKICAgIGlmKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuICh3aW5kb3dzX25vdGlmeWJhcl9zeXN0ZW0odGl0bGUsIHRzaWQpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXR1cm4gKHdpbmRvd3Nfbm90aWZ5YmFyX2xvY2FsKHRpdGxlKSk7CiAgICB9Cn0KZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfc3lzdGVtKHRpdGxlLCB0c2lkKQp7CiAgICB2YXIgcmV0ID0ge307CgogICAgdmFyIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCdub3RpZnliYXItZGVza3RvcCcpKCciICsgdGl0bGUgKyAiJykub24oJ2Nsb3NlJywgZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTsiKS50b1N0cmluZygnYmFzZTY0Jyk7CgogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQogICAgICAgIC5hZGRNZXRob2QoJ2Nsb3NlJywgZnVuY3Rpb24gY2xvc2UoKSB7IHRoaXMuY2hpbGQua2lsbCgpOyB9KTsKCiAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQoJ1xcJykucG9wKCksICctYjY0ZXhlYycsIHNjcmlwdF0sIHsgdHlwZTogMSwgdWlkOiB0c2lkIH0pOwogICAgcmV0LmNoaWxkLnBhcmVudCA9IHJldDsKICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgIHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50LmVtaXQoJ2Nsb3NlJywgY29kZSk7IH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfbG9jYWwodGl0bGUpCnsKICAgIHZhciBNZXNzYWdlUHVtcDsKICAgIHZhciByZXQ7CgogICAgTWVzc2FnZVB1bXAgPSByZXF1aXJlKCd3aW4tbWVzc2FnZS1wdW1wJyk7CiAgICByZXQgPSB7IF9PYmplY3RJRDogJ25vdGlmeWJhci1kZXNrdG9wLldpbmRvd3MnLCB0aXRsZTogdGl0bGUsIF9wdW1wczogW10sIF9wcm9taXNlOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRJbmZvKCkgfTsKCiAgICByZXQuX3Byb21pc2Uubm90aWZ5YmFyID0gcmV0OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQogICAgICAgIC5hZGRNZXRob2QoJ2Nsb3NlJywgZnVuY3Rpb24gY2xvc2UoKQogICAgICAgIHsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9wdW1wcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5fcHVtcHNbaV0ucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7CiAgICAgICAgICAgICAgICB0aGlzLl9wdW1wc1tpXS5jbG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3B1bXBzID0gW107CiAgICAgICAgfSk7CgogICAgcmV0Ll9wcm9taXNlLnRoZW4oZnVuY3Rpb24gKG0pCiAgICB7CiAgICAgICAgdmFyIG9mZnNldDsKICAgICAgICB2YXIgYmFyV2lkdGgsIG1vbldpZHRoLCBvZmZzZXQsIGJhckhlaWdodCwgbW9uSGVpZ2h0OwoKICAgICAgICBmb3IgKHZhciBpIGluIG0pCiAgICAgICAgewogICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdNb25pdG9yOiAnICsgaSArICcgPSBXaWR0aFsnICsgKG1baV0ucmlnaHQgLSBtW2ldLmxlZnQpICsgJ10nKTsKICAgICAgICAgICAgbW9uV2lkdGggPSAobVtpXS5yaWdodCAtIG1baV0ubGVmdCk7CiAgICAgICAgICAgIG1vbkhlaWdodCA9IChtW2ldLmJvdHRvbSAtIG1baV0udG9wKTsKICAgICAgICAgICAgYmFyV2lkdGggPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC4zMCk7CiAgICAgICAgICAgIGJhckhlaWdodCA9IE1hdGguZmxvb3IobW9uSGVpZ2h0ICogMC4wMzUpOwogICAgICAgICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC41MCkgLSBNYXRoLmZsb29yKGJhcldpZHRoICogMC41MCk7CiAgICAgICAgICAgIHN0YXJ0ID0gbVtpXS5sZWZ0ICsgb2Zmc2V0OwogICAgICAgICAgICB2YXIgb3B0aW9ucyA9CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93OgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luc3R5bGVzOiBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfVklTSUJMRSB8IE1lc3NhZ2VQdW1wLldpbmRvd1N0eWxlcy5XU19CT1JERVIgfCBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfQ0FQVElPTiB8IE1lc3NhZ2VQdW1wLldpbmRvd1N0eWxlcy5XU19TWVNNRU5VLAogICAgICAgICAgICAgICAgICAgICAgICB4OiBzdGFydCwgeTogbVtpXS50b3AsIGxlZnQ6IG1baV0ubGVmdCwgcmlnaHQ6IG1baV0ucmlnaHQsIHdpZHRoOiBiYXJXaWR0aCwgaGVpZ2h0OiBiYXJIZWlnaHQsIHRpdGxlOiB0aGlzLm5vdGlmeWJhci50aXRsZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucHVzaChuZXcgTWVzc2FnZVB1bXAob3B0aW9ucykpOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm5vdGlmeWJhciA9IHRoaXMubm90aWZ5YmFyOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm9uKCdod25kJywgZnVuY3Rpb24gKGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuX0hBTkRMRSA9IGg7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm9uKCdleGl0JywgZnVuY3Rpb24gKGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLm5vdGlmeWJhci5fcHVtcHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzW2ldLnJlbW92ZUFsbExpc3RlbmVycygnZXhpdCcpOwogICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl9wdW1wc1tpXS5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuZW1pdCgnY2xvc2UnKTsKICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl9wdW1wcyA9IFtdOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzLnBlZWsoKS5vbignbWVzc2FnZScsIGZ1bmN0aW9uIG9uV2luZG93c01lc3NhZ2UobXNnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobXNnLm1lc3NhZ2UgPT0gMTMzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIldNX05DUEFJTlQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtc2cubWVzc2FnZSA9PSA3MCkgICAvLyBXZSBhcmUgaW50ZXJjZXB0aW5nIFdNX1dJTkRPV1BPU0NIQU5HSU5HIHRvIERJU0FCTEUgbW92aW5nIHRoZSB3aW5kb3cKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fSEFORExFKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwdHJzaXplKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBtc2cubHBhcmFtX3Jhdy5EZXJlZigyNCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSB8IDB4MDAwMjsgLy8gU2V0IFNXUF9OT01PVkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmxwYXJhbV9yYXcuRGVyZWYoOCwgNCkudG9CdWZmZXIoKS5yZWFkSW50MzJMRSgpIDwgdGhpcy5fb3B0aW9ucy53aW5kb3cubGVmdCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobXNnLmxwYXJhbV9yYXcuRGVyZWYoOCwgNCkudG9CdWZmZXIoKS5yZWFkSW50MzJMRSgpICsgdGhpcy5fb3B0aW9ucy53aW5kb3cud2lkdGgpID49IHRoaXMuX29wdGlvbnMud2luZG93LnJpZ2h0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FsbG93IHRoaXMgbW92ZSwgYmVjYXVzZSBpdCB3aWxsIGdvIG91dCBvZiBib3VuZHMgb2YgdGhlIGN1cnJlbnQgbW9uaXRvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cubHBhcmFtX3Jhdy5EZXJlZigyNCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgdGhlIG1vdmUsIGJ1dCBvbmx5IG9uIHRoZSBYLWF4aXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5scGFyYW1fcmF3LkRlcmVmKDEyLCA0KS50b0J1ZmZlcigpLndyaXRlSW50MzJMRSh0aGlzLl9vcHRpb25zLndpbmRvdy55KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gbXNnLmxwYXJhbV9yYXcuRGVyZWYoMzIsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfCAweDAwMDIgIC8vIFNldCBTV1BfTk9NT1ZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5scGFyYW1fcmF3LkRlcmVmKDE2LCA0KS50b0J1ZmZlcigpLnJlYWRJbnQzMkxFKCkgPCB0aGlzLl9vcHRpb25zLndpbmRvdy5sZWZ0IHx8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobXNnLmxwYXJhbV9yYXcuRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkucmVhZEludDMyTEUoKSArIHRoaXMuX29wdGlvbnMud2luZG93LndpZHRoKSA+PSB0aGlzLl9vcHRpb25zLndpbmRvdy5yaWdodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FsbG93IHRoaXMgbW92ZSwgYmVjYXVzZSBpdCB3aWxsIGdvIG91dCBvZiBib3VuZHMgb2YgdGhlIGN1cnJlbnQgbW9uaXRvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cubHBhcmFtX3Jhdy5EZXJlZigzMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBtb3ZlLCBidXQgb25seSBvbiB0aGUgWC1heGlzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cubHBhcmFtX3Jhdy5EZXJlZigyMCwgNCkudG9CdWZmZXIoKS53cml0ZUludDMyTEUodGhpcy5fb3B0aW9ucy53aW5kb3cueSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIChyZXQpOwp9CgoKZnVuY3Rpb24geF9ub3RpZnliYXJfY2hlY2sodGl0bGUpCnsKICAgIGlmKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5TZWxmKCkhPTAgfHwgcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmNvbnNvbGVVaWQoKSA9PSAwKQogICAgewogICAgICAgIHJldHVybiAoeF9ub3RpZnliYXIodGl0bGUpKTsgLy8gTm8gRGlzcGF0Y2hpbmcgbmVjZXNzYXJ5CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gV2UgYXJlIHJvb3QsIHNvIHdlIHNob3VsZCB0cnkgdG8gc3Bhd24gYSBjaGlsZCBpbnRvIHRoZSB1c2VyJ3MgZGVza3RvcAogICAgICAgIHZhciB1aWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuY29uc29sZVVpZCgpOwogICAgICAgIHZhciB4aW5mbyA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldFhJbmZvKHVpZCk7CiAgICAgICAgCiAgICAgICAgaWYgKCF4aW5mbykKICAgICAgICB7CiAgICAgICAgICAgIHRocm93KCdYU2VydmVyIEluaXRpYWxpemF0aW9uIEVycm9yJykKICAgICAgICB9CiAgICAgICAgdmFyIHJldCA9IHt9OwogICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgicmVxdWlyZSgnbm90aWZ5YmFyLWRlc2t0b3AnKSgnIiArIHRpdGxlICsgIicpLm9uKCdjbG9zZScsIGZ1bmN0aW9uKCl7cHJvY2Vzcy5leGl0KCk7fSk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOwoKICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQogICAgICAgICAgICAuYWRkTWV0aG9kKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkgeyB0aGlzLmNoaWxkLmtpbGwoKTsgfSk7CgogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnLycpLnBvcCgpLCAnLWI2NGV4ZWMnLCBzY3JpcHRdLCB7IHVpZDogdWlkLCBlbnY6IHhpbmZvLmV4cG9ydEVudigpIH0pOwogICAgICAgIHJldC5jaGlsZC5wYXJlbnQgPSByZXQ7CiAgICAgICAgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOwogICAgICAgIHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKICAgICAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkgeyB0aGlzLnBhcmVudC5lbWl0KCdjbG9zZScsIGNvZGUpOyB9KTsKCiAgICAgICAgcmV0dXJuIChyZXQpOwogICAgfQp9CgpmdW5jdGlvbiB4X25vdGlmeWJhcih0aXRsZSkKewogICAgcmV0ID0geyBfT2JqZWN0SUQ6ICdub3RpZnliYXItZGVza3RvcC5YJywgdGl0bGU6IHRpdGxlLCBfd2luZG93czogW10sIF9wcm9taXNlOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRJbmZvKCkgfTsKCiAgICByZXQuX3Byb21pc2Uubm90aWZ5YmFyID0gcmV0OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQogICAgICAgIC5hZGRNZXRob2QoJ2Nsb3NlJywgZnVuY3Rpb24gY2xvc2UoKQogICAgICAgIHsKICAgICAgICB9KTsKCiAgICByZXQuX3Byb21pc2UudGhlbihmdW5jdGlvbiAobSkKICAgIHsKICAgICAgICB2YXIgb2Zmc2V0OwogICAgICAgIHZhciBiYXJXaWR0aCwgbW9uV2lkdGgsIG9mZnNldCwgYmFySGVpZ2h0LCBtb25IZWlnaHQ7CiAgICAgICAgZm9yICh2YXIgaSBpbiBtKQogICAgICAgIHsKICAgICAgICAgICAgbW9uV2lkdGggPSAobVtpXS5yaWdodCAtIG1baV0ubGVmdCk7CiAgICAgICAgICAgIG1vbkhlaWdodCA9IChtW2ldLmJvdHRvbSAtIG1baV0udG9wKTsKICAgICAgICAgICAgYmFyV2lkdGggPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC4zMCk7CiAgICAgICAgICAgIGJhckhlaWdodCA9IE1hdGguZmxvb3IobW9uSGVpZ2h0ICogMC4wMzUpOwogICAgICAgICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC41MCkgLSBNYXRoLmZsb29yKGJhcldpZHRoICogMC41MCk7CiAgICAgICAgICAgIHN0YXJ0ID0gbVtpXS5sZWZ0ICsgb2Zmc2V0OwoKICAgICAgICAgICAgdmFyIHdoaXRlID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YV2hpdGVQaXhlbChtW2ldLmRpc3BsYXksIG1baV0uc2NyZWVuSWQpLlZhbDsKICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucHVzaCh7CiAgICAgICAgICAgICAgICByb290OiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhSb290V2luZG93KG1baV0uZGlzcGxheSwgbVtpXS5zY3JlZW5JZCksCiAgICAgICAgICAgICAgICBkaXNwbGF5OiBtW2ldLmRpc3BsYXksIGlkOiBtW2ldLnNjcmVlZElkCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLm5vdGlmeWJhciA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWENyZWF0ZVNpbXBsZVdpbmRvdyhtW2ldLmRpc3BsYXksIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5yb290LCBzdGFydCwgMCwgYmFyV2lkdGgsIDEsIDAsIHdoaXRlLCB3aGl0ZSk7CiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWFN0b3JlTmFtZShtW2ldLmRpc3BsYXksIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5ub3RpZnliYXIsIHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLkNyZWF0ZVZhcmlhYmxlKHRoaXMubm90aWZ5YmFyLnRpdGxlKSk7CgogICAgICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5zZXRXaW5kb3dTaXplSGludHMobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyLCBzdGFydCwgMCwgYmFyV2lkdGgsIDEsIGJhcldpZHRoLCAxLCBiYXJXaWR0aCwgMSk7CiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmhpZGVXaW5kb3dJY29uKG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLnJvb3QsIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5ub3RpZnliYXIpOwoKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuc2V0QWxsb3dlZEFjdGlvbnMobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyLCByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5NT1RJRl9GTEFHUy5NV01fRlVOQ19DTE9TRSk7CiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLnNldEFsd2F5c09uVG9wKG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLnJvb3QsIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5ub3RpZnliYXIpOwoKCiAgICAgICAgICAgIHZhciB3bV9kZWxldGVfd2luZG93X2F0b20gPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhJbnRlcm5BdG9tKG1baV0uZGlzcGxheSwgcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJykuQ3JlYXRlVmFyaWFibGUoJ1dNX0RFTEVURV9XSU5ET1cnKSwgMCkuVmFsOwogICAgICAgICAgICB2YXIgYXRvbXMgPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKS5DcmVhdGVWYXJpYWJsZSg0KTsKICAgICAgICAgICAgYXRvbXMudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKHdtX2RlbGV0ZV93aW5kb3dfYXRvbSk7CiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWFNldFdNUHJvdG9jb2xzKG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLm5vdGlmeWJhciwgYXRvbXMsIDEpOwoKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YTWFwV2luZG93KG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLm5vdGlmeWJhcik7CiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWEZsdXNoKG1baV0uZGlzcGxheSk7CgogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkuRGVzY3JpcHRvckV2ZW50ID0gcmVxdWlyZSgnRGVzY3JpcHRvckV2ZW50cycpLmFkZERlc2NyaXB0b3IocmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YQ29ubmVjdGlvbk51bWJlcihtW2ldLmRpc3BsYXkpLlZhbCwgeyByZWFkc2V0OiB0cnVlIH0pOwogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkuRGVzY3JpcHRvckV2ZW50LmF0b20gPSB3bV9kZWxldGVfd2luZG93X2F0b207CiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5EZXNjcmlwdG9yRXZlbnQucmV0ID0gdGhpcy5ub3RpZnliYXI7CiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5EZXNjcmlwdG9yRXZlbnQuX2Rpc3BsYXkgPSBtW2ldLmRpc3BsYXk7CiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5EZXNjcmlwdG9yRXZlbnQub24oJ3JlYWRzZXQnLCBmdW5jdGlvbiAoZmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBYRSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgICAgICAgICAgICAgd2hpbGUgKHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWFBlbmRpbmcodGhpcy5fZGlzcGxheSkuVmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWE5leHRFdmVudFN5bmModGhpcy5fZGlzcGxheSwgWEUpOwogICAgICAgICAgICAgICAgICAgIGlmIChYRS5EZXJlZigwLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID09IENsaWVudE1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50VHlwZSA9IFhFLkRlcmVmKHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLlBvaW50ZXJTaXplID09IDggPyA1NiA6IDI4LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50VHlwZSA9PSB0aGlzLmF0b20pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5yZW1vdmVEZXNjcmlwdG9yKGZkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWENsb3NlRGlzcGxh", 16000);
|
|
memcpy_s(_notifybardesktop + 16000, 724, "eSh0aGlzLl9kaXNwbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5lbWl0KCdjbG9zZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll93aW5kb3dzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gKHJldCk7Cn0KCgoKc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCnsKICAgIGNhc2UgJ3dpbjMyJzoKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd3Nfbm90aWZ5YmFyX2NoZWNrOwogICAgICAgIG1vZHVsZS5leHBvcnRzLnN5c3RlbSA9IHdpbmRvd3Nfbm90aWZ5YmFyX3N5c3RlbTsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2xpbnV4JzoKICAgIGNhc2UgJ2ZyZWVic2QnOgogICAgICAgIG1vZHVsZS5leHBvcnRzID0geF9ub3RpZnliYXJfY2hlY2s7CiAgICAgICAgYnJlYWs7Cn0KCgo=", 724);
|
|
ILibBase64DecodeEx((unsigned char*)_notifybardesktop, 16724, (unsigned char*)_notifybardesktop + 16724);
|
|
duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "notifybar-desktop"); duk_push_string(ctx, _notifybardesktop + 16724);
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx);
|
|
free(_notifybardesktop);
|
|
|
|
|
|
// proxy-helper, refer to modules/proxy-helper.js
|
|
duk_peval_string_noresult(ctx, "addModule('proxy-helper', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gcG9zaXhfcHJveHlDaGVjayh1aWQsIGNoZWNrQWRkcikNCnsNCiAgICB2YXIgZzsNCiAgICB2YXIgeCA9IHByb2Nlc3MuZW52Wydub19wcm94eSddID8gcHJvY2Vzcy5lbnZbJ25vX3Byb3h5J10uc3BsaXQoJywnKSA6IFtdOw0KICAgIHZhciB0Ow0KDQogICAgaWYgKHJlcXVpcmUoJ2xpbnV4LWdub21lLWhlbHBlcnMnKS5hdmFpbGFibGUgJiYgKGcgPSByZXF1aXJlKCdsaW51eC1nbm9tZS1oZWxwZXJzJykuZ2V0UHJveHlTZXR0aW5ncyh1aWQpKS5tb2RlICE9ICdub25lJykNCiAgICB7DQogICAgICAgIHggPSBnLmV4Y2VwdGlvbnM7DQogICAgfQ0KDQogICAgZm9yKHZhciBpIGluIHgpDQogICAgew0KICAgICAgICBpZiAoeFtpXSA9PSBjaGVja0FkZHIpIHsgcmV0dXJuICh0cnVlKTsgfSAgICAgICAgICAgICAgIC8vIERpcmVjdCBNYXRjaA0KICAgICAgICBpZiAoY2hlY2tBZGRyLmVuZHNXaXRoKCcuJyArIHhbaV0pKSB7IHJldHVybiAodHJ1ZSk7IH0gIC8vIFN1YmRvbWFpbiBNYXRjaA0KICAgICAgICBpZiAoKHYgPSB4W2ldLnNwbGl0KCcvJykpLmxlbmd0aCA9PSAyKQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZihyZXF1aXJlKCdpcC1hZGRyZXNzJykuQWRkcmVzczQuZnJvbVN0cmluZyh2WzBdKS5tYXNrKHBhcnNlSW50KHZbMV0pKSA9PSByZXF1aXJlKCdpcC1hZGRyZXNzJykuQWRkcmVzczQuZnJvbVN0cmluZyhjaGVja0FkZHIpLm1hc2socGFyc2VJbnQodlsxXSkpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRydWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChleCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gKGZhbHNlKTsNCn0NCg0KZnVuY3Rpb24gd2luZG93c19wcm94eUNoZWNrKGtleSwgY2hlY2tBZGRyKQ0Kew0KICAgIGlmKCFrZXkpDQogICAgew0KICAgICAgICB2YXIgaTsNCiAgICAgICAgLy8gS2V5IHdhc24ndCBzcGVjaWZpZWQsIHNvIGxldHMgdHJ5IHRvIGZpZ3VyZSBpdCBvdXQNCiAgICAgICAgaWYoKGk9cmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpKS50c2lkID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFdlIGFyZSBhIHNlcnZpY2UsIHNvIHdlIHNob3VsZCBjaGVjayB0aGUgdXNlciB0aGF0IGluc3RhbGxlZCB0aGUgTWVzaCBBZ2VudA0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAga2V5ID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuUXVlcnlLZXkocmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcTWVzaCBBZ2VudCcsICdfSW5zdGFsbGVkQnknKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoKHh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIC8vIFRoaXMgaW5mbyBpc24ndCBhdmFpbGFibGUsIHNvIGxldCdzIHRyeSB0byB1c2UgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlcg0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAga2V5ID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykudXNlcm5hbWVUb1VzZXJLZXkocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCkpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2goeHh4KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gTm8gdXNlcnMgYXJlIGxvZ2dlZCBpbiwgc28gYXMgYSBsYXN0IHJlc29ydCwgbGV0J3MgdHJ5IHRoZSBsYXN0IGxvZ2dlZCBpbiB1c2VyLg0KICAgICAgICAgICAgICAgICAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLlF1ZXJ5S2V5KHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLkhLRVkuVXNlcnMpOw0KICAgICAgICAgICAgICAgICAgICBmb3IoaSBpbiBlbnRyaWVzLnN1YmtleXMpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVudHJpZXMuc3Via2V5c1tpXS5zcGxpdCgnLScpLmxlbmd0aD41ICYmICFlbnRyaWVzLnN1YmtleXNbaV0uZW5kc1dpdGgoJ19DbGFzc2VzJykpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZW50cmllcy5zdWJrZXlzW2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gV2UgYXJlIGEgbG9nZ2VkIGluIHVzZXINCiAgICAgICAgICAgIGtleSA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLnVzZXJuYW1lVG9Vc2VyS2V5KGkubmFtZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYoIWtleSkge3Rocm93KCdDb3VsZCBub3QgZGV0ZXJtaW5lIHdoaWNoIHVzZXIgcHJveHkgc2V0dGluZyB0byBxdWVyeScpO30NCiAgICB9DQogICAgdmFyIHByb3h5T3ZlcnJpZGUgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5RdWVyeUtleShyZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5IS0VZLlVzZXJzLCBrZXkgKyAnXFxTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3MnLCAnUHJveHlPdmVycmlkZScpLnNwbGl0KCc7Jyk7DQogICAgZm9yKHZhciBpIGluIHByb3h5T3ZlcnJpZGUpDQogICAgew0KICAgICAgICBwcm94eU92ZXJyaWRlW2ldID0gcHJveHlPdmVycmlkZVtpXS50cmltKCk7DQogICAgICAgIGlmICgoY2hlY2tBZGRyID09ICcxMjcuMC4wLjEnIHx8IGNoZWNrQWRkciA9PSAnOjoxJykgJiYgcHJveHlPdmVycmlkZVtpXSA9PSAnPGxvY2FsPicpIHsgcmV0dXJuICh0cnVlKTsgfQ0KICAgICAgICBpZiAoY2hlY2tBZGRyID09IHByb3h5T3ZlcnJpZGVbaV0pIHsgcmV0dXJuICh0cnVlKTsgfSAvLyBFeGFjdCBNYXRjaA0KICAgICAgICBpZiAocHJveHlPdmVycmlkZVtpXS5zdGFydHNXaXRoKCcqLicpICYmIGNoZWNrQWRkci5lbmRzV2l0aChwcm94eU92ZXJyaWRlW2ldLnN1YnN0cmluZygxKSkpIHsgcmV0dXJuICh0cnVlKTsgfQ0KICAgICAgICBpZiAocHJveHlPdmVycmlkZVtpXS5lbmRzV2l0aCgnLionKSAmJiBjaGVja0FkZHIuc3RhcnRzV2l0aChwcm94eU92ZXJyaWRlW2ldLnN1YnN0cmluZygwLCBwcm94eU92ZXJyaWRlW2ldLmxlbmd0aCAtIDEpKSkgeyByZXR1cm4gKHRydWUpOyB9DQogICAgfQ0KICAgIHJldHVybiAoZmFsc2UpOw0KfQ0KDQpzd2l0Y2ggKHByb2Nlc3MucGxhdGZvcm0pDQp7DQogICAgY2FzZSAnbGludXgnOg0KICAgIGNhc2UgJ2ZyZWVic2QnOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgaWdub3JlUHJveHk6IHBvc2l4X3Byb3h5Q2hlY2sgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgaWdub3JlUHJveHk6IHdpbmRvd3NfcHJveHlDaGVjayB9Ow0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICBicmVhazsNCn0NCv==', 'base64').toString());");
|
|
|
|
#ifdef _POSIX
|
|
duk_peval_string_noresult(ctx, "addModule('linux-pathfix', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gY2hlY2tQYXRoKCkNCnsNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdlY2hvICRQQVRIIHwgYXdrIFwneyB5ZXM9MDsgYT1zcGxpdCgkMCwgYiwgIjoiKTsgZm9yKHg9MTt4PD1hOysreCkgeyBpZihiW3hdPT0iL3NiaW4iKSB7IHllcz0xOyB9IH0gcHJpbnQgeWVzOyB9XCdcbmV4aXRcbicpOw0KICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgIGlmIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJvY2Vzcy5zZXRlbnYoJ1BBVEgnLCBwcm9jZXNzLmVudlsnUEFUSCddICsgJzovc2JpbicpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQptb2R1bGUuZXhwb3J0cyA9IGNoZWNrUGF0aDsNCg0KDQo=', 'base64').toString());");
|
|
#endif
|
|
|
|
// wget: Refer to modules/wget.js for a human readable version.
|
|
duk_peval_string_noresult(ctx, "addModule('wget', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOw0KdmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7DQp2YXIgd3JpdGFibGUgPSByZXF1aXJlKCdzdHJlYW0nKS5Xcml0YWJsZTsNCg0KDQpmdW5jdGlvbiB3Z2V0KHJlbW90ZVVyaSwgbG9jYWxGaWxlUGF0aCwgd2dldG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgdmFyIGFnZW50Q29ubmVjdGVkID0gZmFsc2U7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2J5dGVzJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdhYm9ydCcpDQogICAgICAgIC5hZGRNZXRob2QoJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLl9yZXF1ZXN0LmFib3J0KCk7IH0pOw0KDQogICAgdHJ5DQogICAgew0KICAgICAgICBhZ2VudENvbm5lY3RlZCA9IHJlcXVpcmUoJ01lc2hBZ2VudCcpLmlzQ29udHJvbENoYW5uZWxDb25uZWN0ZWQ7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICB9DQoNCiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgcHJveHkgc2V0dGluZ3MgaWYgdGhlIGFnZW50IGlzIG5vdCBjb25uZWN0ZWQsIGJlY2F1c2Ugd2hlbiB0aGUgYWdlbnQNCiAgICAvLyBjb25uZWN0cywgaXQgYXV0b21hdGljYWxseSBjb25maWd1cmVzIHRoZSBwcm94eSBmb3IgSmF2YVNjcmlwdC4NCiAgICBpZiAoIWFnZW50Q29ubmVjdGVkKQ0KICAgIHsNCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHJlZyA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpOw0KICAgICAgICAgICAgaWYgKHJlZy5RdWVyeUtleShyZWcuSEtFWS5DdXJyZW50VXNlciwgJ1NvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxJbnRlcm5ldCBTZXR0aW5ncycsICdQcm94eUVuYWJsZScpID09IDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHByb3h5VXJpID0gcmVnLlF1ZXJ5S2V5KHJlZy5IS0VZLkN1cnJlbnRVc2VyLCAnU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEludGVybmV0IFNldHRpbmdzJywgJ1Byb3h5U2VydmVyJyk7DQogICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSByZXF1aXJlKCdodHRwJykucGFyc2VVcmkoJ2h0dHA6Ly8nICsgcHJveHlVcmkpOw0KDQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Byb3h5ID0+ICcgKyBwcm94eVVyaSk7DQogICAgICAgICAgICAgICAgcmVxdWlyZSgnZ2xvYmFsLXR1bm5lbCcpLmluaXRpYWxpemUob3B0aW9ucyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICB2YXIgcmVxT3B0aW9ucyA9IHJlcXVpcmUoJ2h0dHAnKS5wYXJzZVVyaShyZW1vdGVVcmkpOw0KICAgIGlmICh3Z2V0b3B0aW9ucykNCiAgICB7DQogICAgICAgIGZvciAodmFyIGlucHV0T3B0aW9uIGluIHdnZXRvcHRpb25zKSB7DQogICAgICAgICAgICByZXFPcHRpb25zW2lucHV0T3B0aW9uXSA9IHdnZXRvcHRpb25zW2lucHV0T3B0aW9uXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXQuX3RvdGFsQnl0ZXMgPSAwOw0KICAgIHJldC5fcmVxdWVzdCA9IGh0dHAuZ2V0KHJlcU9wdGlvbnMpOw0KICAgIHJldC5fbG9jYWxGaWxlUGF0aCA9IGxvY2FsRmlsZVBhdGg7DQogICAgcmV0Ll9yZXF1ZXN0LnByb21pc2UgPSByZXQ7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7IHRoaXMucHJvbWlzZS5fcmVqKGUpOyB9KTsNCiAgICByZXQuX3JlcXVlc3Qub24oJ2Fib3J0JywgZnVuY3Rpb24gKCkgeyB0aGlzLnByb21pc2UuZW1pdCgnYWJvcnQnKTsgfSk7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uIChpbXNnKQ0KICAgIHsNCiAgICAgICAgaWYoaW1zZy5zdGF0dXNDb2RlICE9IDIwMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ1NlcnZlciByZXNwb25zZWQgd2l0aCBTdGF0dXMgQ29kZTogJyArIGltc2cuc3RhdHVzQ29kZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9maWxlID0gcmVxdWlyZSgnZnMnKS5jcmVhdGVXcml0ZVN0cmVhbSh0aGlzLnByb21pc2UuX2xvY2FsRmlsZVBhdGgsIHsgZmxhZ3M6ICd3YicgfSk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhID0gcmVxdWlyZSgnU0hBMzg0U3RyZWFtJykuY3JlYXRlKCk7DQogICAgICAgICAgICAgICAgdGhpcy5fc2hhLnByb21pc2UgPSB0aGlzLnByb21pc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKGUpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuX3NoYS5vbignaGFzaCcsIGZ1bmN0aW9uIChoKSB7IHRoaXMucHJvbWlzZS5fcmVzKGgudG9TdHJpbmcoJ2hleCcpKTsgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvciA9IG5ldyB3cml0YWJsZSgNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjaHVuaywgY2FsbGJhY2spDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fdG90YWxCeXRlcyArPSBjaHVuay5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuZW1pdCgnYnl0ZXMnLCB0aGlzLnByb21pc2UuX3RvdGFsQnl0ZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgZmluYWw6IGZ1bmN0aW9uKGNhbGxiYWNrKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLl9hY2N1bXVsYXRvci5wcm9taXNlID0gdGhpcy5wcm9taXNlOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2ZpbGUpOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX2FjY3VtdWxhdG9yKTsNCiAgICAgICAgICAgIGltc2cucGlwZSh0aGlzLl9zaGEpOw0KICAgICAgICB9DQogICAgfSk7DQogICAgcmV0LnByb2dyZXNzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX3RvdGFsQnl0ZXMpOyB9Ow0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSB3Z2V0Ow0KDQoNCv==', 'base64').toString());");
|
|
duk_peval_string_noresult(ctx, "Object.defineProperty(this, 'wget', {get: function() { return(require('wget'));}});");
|
|
duk_peval_string_noresult(ctx, "Object.defineProperty(process, 'arch', {get: function() {return( require('os').arch());}});");
|
|
|
|
// default_route: Refer to modules/default_route.js
|
|
duk_peval_string_noresult(ctx, "addModule('default_route', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gd2luZG93c19kZWZhdWx0Um91dGUoKQ0Kew0KICAgIHZhciByZXQgPSBudWxsOw0KICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KICAgIElQID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0lwaGxwYXBpLmRsbCcpOw0KICAgIElQLkNyZWF0ZU1ldGhvZCgnR2V0SXBGb3J3YXJkVGFibGUnKTsNCg0KICAgIHZhciBzaXplID0gR00uQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgdmFyIHJlc3VsdCA9IElQLkdldElwRm9yd2FyZFRhYmxlKDAsIHNpemUsIDEpOw0KICAgIGlmKHJlc3VsdC5WYWwgPT0gMTIyKQ0KICAgIHsNCiAgICAgICAgdmFyIHRhYmxlID0gR00uQ3JlYXRlVmFyaWFibGUoc2l6ZS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsNCiAgICAgICAgcmVzdWx0ID0gSVAuR2V0SXBGb3J3YXJkVGFibGUodGFibGUsIHNpemUsIDEpOw0KICAgICAgICBpZihyZXN1bHQuVmFsID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gdGFibGUuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICAgICAgICAgIHZhciByb3c7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8ZW50cmllczsrK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcm93ID0gdGFibGUuRGVyZWYoNCArIChpICogNTYpLCA1Nik7DQogICAgICAgICAgICAgICAgaWYgKHJvdy5EZXJlZigwLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IFJvdXRlDQogICAgICAgICAgICAgICAgICAgIGlmICghcmV0IHx8IHJldC5tZXRyaWMgPiByb3cuRGVyZWYoMzYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHsgaW50ZXJmYWNlOiByb3cuRGVyZWYoMTYsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCksIG1ldHJpYzogcm93LkRlcmVmKDM2LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIH07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBsaW51eF9kZWZhdWx0Um91dGUoKQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpcCByb3V0ZSB8IGdyZXAgZGVmYXVsdCB8IGF3ayBcJ3sgaWYoICQxPT0iZGVmYXVsdCIgJiYgJDQ9PSJkZXYiICkgeyBwcmludCAkNTsgfSB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IG51bGwgOiB7IGludGVyZmFjZTogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCksIG1ldHJpYzogMSB9KTsNCn0NCg0KZnVuY3Rpb24gYnNkX2RlZmF1bHRSb3V0ZSgpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ25ldHN0YXQgLXJuIC1mIGluZXQgfCBncmVwIGRlZmF1bHQgfCBhd2sgXCd7IHByaW50ICRORiB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSA9PSAnJyA/IG51bGwgOiB7IGludGVyZmFjZTogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCksIG1ldHJpYzogMSB9KTsNCn0NCg0Kc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQp7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd3NfZGVmYXVsdFJvdXRlOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGludXhfZGVmYXVsdFJvdXRlOw0KICAgICAgICBicmVhazsNCiAgICBjYXNlICdmcmVlYnNkJzoNCiAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGJzZF9kZWZhdWx0Um91dGU7DQogICAgICAgIGJyZWFrOw0KfQ0KDQo=', 'base64').toString());");
|
|
}
|
|
|
|
void ILibDuktape_ChainViewer_PostSelect(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset)
|
|
{
|
|
duk_context *ctx = (duk_context*)((void**)((ILibTransport*)object)->ChainLink.ExtraMemoryPtr)[0];
|
|
void *hptr = ((void**)((ILibTransport*)object)->ChainLink.ExtraMemoryPtr)[1];
|
|
|
|
ILibDuktape_EventEmitter_SetupEmit(ctx, hptr, "PostSelect"); // [emit][this][name]
|
|
duk_push_int(ctx, slct); // [emit][this][name][select]
|
|
|
|
char *m = ILibChain_GetMetaDataFromDescriptorSet(Duktape_GetChain(ctx), readset, writeset, errorset);
|
|
duk_push_string(ctx, m);
|
|
if (duk_pcall_method(ctx, 3) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "ChainViewer.emit('PostSelect'): Error "); }
|
|
duk_pop(ctx);
|
|
}
|
|
|
|
extern void ILibPrependToChain(void *Chain, void *object);
|
|
void ILibDuktape_ChainViewer_Push(duk_context *ctx, void *chain)
|
|
{
|
|
duk_push_object(ctx); // [viewer]
|
|
|
|
ILibTransport *t = (ILibTransport*)ILibChain_Link_Allocate(sizeof(ILibTransport), 2*sizeof(void*));
|
|
t->ChainLink.MetaData = "ILibDuktape_ChainViewer";
|
|
t->ChainLink.PostSelectHandler = ILibDuktape_ChainViewer_PostSelect;
|
|
((void**)t->ChainLink.ExtraMemoryPtr)[0] = ctx;
|
|
((void**)t->ChainLink.ExtraMemoryPtr)[1] = duk_get_heapptr(ctx, -1);
|
|
ILibDuktape_EventEmitter *emitter = ILibDuktape_EventEmitter_Create(ctx);
|
|
ILibDuktape_EventEmitter_CreateEventEx(emitter, "PostSelect");
|
|
ILibPrependToChain(chain, (void*)t);
|
|
}
|
|
|
|
duk_ret_t ILibDuktape_httpHeaders(duk_context *ctx)
|
|
{
|
|
ILibHTTPPacket *packet = NULL;
|
|
packetheader_field_node *node;
|
|
int headersOnly = duk_get_top(ctx) > 1 ? (duk_require_boolean(ctx, 1) ? 1 : 0) : 0;
|
|
|
|
duk_size_t bufferLen;
|
|
char *buffer = (char*)Duktape_GetBuffer(ctx, 0, &bufferLen);
|
|
|
|
packet = ILibParsePacketHeader(buffer, 0, (int)bufferLen);
|
|
if (packet == NULL) { return(ILibDuktape_Error(ctx, "http-headers(): Error parsing data")); }
|
|
|
|
if (headersOnly == 0)
|
|
{
|
|
duk_push_object(ctx);
|
|
if (packet->Directive != NULL)
|
|
{
|
|
duk_push_lstring(ctx, packet->Directive, packet->DirectiveLength);
|
|
duk_put_prop_string(ctx, -2, "method");
|
|
duk_push_lstring(ctx, packet->DirectiveObj, packet->DirectiveObjLength);
|
|
duk_put_prop_string(ctx, -2, "url");
|
|
}
|
|
else
|
|
{
|
|
duk_push_int(ctx, packet->StatusCode);
|
|
duk_put_prop_string(ctx, -2, "statusCode");
|
|
duk_push_lstring(ctx, packet->StatusData, packet->StatusDataLength);
|
|
duk_put_prop_string(ctx, -2, "statusMessage");
|
|
}
|
|
if (packet->VersionLength == 3)
|
|
{
|
|
duk_push_object(ctx);
|
|
duk_push_lstring(ctx, packet->Version, 1);
|
|
duk_put_prop_string(ctx, -2, "major");
|
|
duk_push_lstring(ctx, packet->Version + 2, 1);
|
|
duk_put_prop_string(ctx, -2, "minor");
|
|
duk_put_prop_string(ctx, -2, "version");
|
|
}
|
|
}
|
|
|
|
duk_push_object(ctx); // headers
|
|
node = packet->FirstField;
|
|
while (node != NULL)
|
|
{
|
|
duk_push_lstring(ctx, node->Field, node->FieldLength); // [str]
|
|
duk_get_prop_string(ctx, -1, "toLowerCase"); // [str][toLower]
|
|
duk_swap_top(ctx, -2); // [toLower][this]
|
|
duk_call_method(ctx, 0); // [result]
|
|
duk_push_lstring(ctx, node->FieldData, node->FieldDataLength);
|
|
duk_put_prop(ctx, -3);
|
|
node = node->NextField;
|
|
}
|
|
if (headersOnly == 0)
|
|
{
|
|
duk_put_prop_string(ctx, -2, "headers");
|
|
}
|
|
ILibDestructPacket(packet);
|
|
return(1);
|
|
}
|
|
void ILibDuktape_httpHeaders_PUSH(duk_context *ctx, void *chain)
|
|
{
|
|
duk_push_c_function(ctx, ILibDuktape_httpHeaders, DUK_VARARGS);
|
|
}
|
|
void ILibDuktape_DescriptorEvents_PreSelect(void* object, fd_set *readset, fd_set *writeset, fd_set *errorset, int* blocktime)
|
|
{
|
|
duk_context *ctx = (duk_context*)((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[0];
|
|
void *h = ((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[1];
|
|
if (h == NULL || ctx == NULL) { return; }
|
|
|
|
int i = duk_get_top(ctx);
|
|
int fd;
|
|
|
|
duk_push_heapptr(ctx, h); // [obj]
|
|
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [obj][table]
|
|
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY); // [obj][table][enum]
|
|
while (duk_next(ctx, -1, 1)) // [obj][table][enum][FD][emitter]
|
|
{
|
|
fd = (int)duk_to_int(ctx, -2);
|
|
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Options); // [obj][table][enum][FD][emitter][options]
|
|
if (Duktape_GetBooleanProperty(ctx, -1, "readset", 0)) { FD_SET(fd, readset); }
|
|
if (Duktape_GetBooleanProperty(ctx, -1, "writeset", 0)) { FD_SET(fd, writeset); }
|
|
if (Duktape_GetBooleanProperty(ctx, -1, "errorset", 0)) { FD_SET(fd, errorset); }
|
|
duk_pop_3(ctx); // [obj][table][enum]
|
|
}
|
|
|
|
duk_set_top(ctx, i);
|
|
}
|
|
void ILibDuktape_DescriptorEvents_PostSelect(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset)
|
|
{
|
|
duk_context *ctx = (duk_context*)((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[0];
|
|
void *h = ((void**)((ILibChain_Link*)object)->ExtraMemoryPtr)[1];
|
|
if (h == NULL || ctx == NULL) { return; }
|
|
|
|
int i = duk_get_top(ctx);
|
|
int fd;
|
|
|
|
duk_push_array(ctx); // [array]
|
|
duk_push_heapptr(ctx, h); // [array][obj]
|
|
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [array][obj][table]
|
|
duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY); // [array][obj][table][enum]
|
|
while (duk_next(ctx, -1, 1)) // [array][obj][table][enum][FD][emitter]
|
|
{
|
|
fd = (int)duk_to_int(ctx, -2);
|
|
if (FD_ISSET(fd, readset) || FD_ISSET(fd, writeset) || FD_ISSET(fd, errorset))
|
|
{
|
|
duk_put_prop_index(ctx, -6, (duk_uarridx_t)duk_get_length(ctx, -6)); // [array][obj][table][enum][FD]
|
|
duk_pop(ctx); // [array][obj][table][enum]
|
|
}
|
|
else
|
|
{
|
|
duk_pop_2(ctx); // [array][obj][table][enum]
|
|
|
|
}
|
|
}
|
|
duk_pop_3(ctx); // [array]
|
|
|
|
while (duk_get_length(ctx, -1) > 0)
|
|
{
|
|
duk_get_prop_string(ctx, -1, "pop"); // [array][pop]
|
|
duk_dup(ctx, -2); // [array][pop][this]
|
|
if (duk_pcall_method(ctx, 0) == 0) // [array][emitter]
|
|
{
|
|
if ((fd = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_DescriptorEvents_FD, -1)) != -1)
|
|
{
|
|
if (FD_ISSET(fd, readset))
|
|
{
|
|
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "readset"); // [array][emitter][emit][this][readset]
|
|
duk_push_int(ctx, fd); // [array][emitter][emit][this][readset][fd]
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx); // [array][emitter]
|
|
}
|
|
if (FD_ISSET(fd, writeset))
|
|
{
|
|
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "writeset"); // [array][emitter][emit][this][writeset]
|
|
duk_push_int(ctx, fd); // [array][emitter][emit][this][writeset][fd]
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx); // [array][emitter]
|
|
}
|
|
if (FD_ISSET(fd, errorset))
|
|
{
|
|
ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "errorset"); // [array][emitter][emit][this][errorset]
|
|
duk_push_int(ctx, fd); // [array][emitter][emit][this][errorset][fd]
|
|
duk_pcall_method(ctx, 2); duk_pop(ctx); // [array][emitter]
|
|
}
|
|
}
|
|
}
|
|
duk_pop(ctx); // [array]
|
|
}
|
|
duk_set_top(ctx, i);
|
|
}
|
|
duk_ret_t ILibDuktape_DescriptorEvents_Remove(duk_context *ctx)
|
|
{
|
|
if (!duk_is_number(ctx, 0)) { return(ILibDuktape_Error(ctx, "Invalid Descriptor")); }
|
|
ILibForceUnBlockChain(Duktape_GetChain(ctx));
|
|
|
|
duk_push_this(ctx); // [obj]
|
|
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [obj][table]
|
|
duk_dup(ctx, 0); // [obj][table][key]
|
|
duk_del_prop(ctx, -2); // [obj][table]
|
|
return(0);
|
|
}
|
|
#ifdef WIN32
|
|
void ILibDuktape_DescriptorEvents_WaitHandle_EventThread(void *chain, void *user)
|
|
{
|
|
if (!ILibMemory_CanaryOK((void*)user)) { return; }
|
|
ILibDuktape_DescriptorEvents_WindowsWaitHandle *v = (ILibDuktape_DescriptorEvents_WindowsWaitHandle*)user;
|
|
|
|
UnregisterWait(v->waitHandle); v->waitHandle = NULL;
|
|
ILibDuktape_EventEmitter_SetupEmit(v->ctx, v->object, "signaled"); // [emit][this][signaled]
|
|
if (duk_pcall_method(v->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(v->ctx, "WaitHandleAPC Error "); }
|
|
duk_pop(v->ctx);
|
|
}
|
|
void __stdcall ILibDuktape_DescriptorEvents_WaitHandleSignaled(void *user, BOOLEAN TimerOrWaitFired)
|
|
{
|
|
if (!ILibMemory_CanaryOK(user)) { return; }
|
|
ILibDuktape_DescriptorEvents_WindowsWaitHandle *v = (ILibDuktape_DescriptorEvents_WindowsWaitHandle*)user;
|
|
ILibChain_RunOnMicrostackThreadEx(v->chain, ILibDuktape_DescriptorEvents_WaitHandle_EventThread, user);
|
|
}
|
|
#endif
|
|
duk_ret_t ILibDuktape_DescriptorEvents_Add(duk_context *ctx)
|
|
{
|
|
#ifdef WIN32
|
|
if (duk_is_object(ctx, 0) && duk_has_prop_string(ctx, 0, "_ptr"))
|
|
{
|
|
HANDLE h = (HANDLE)Duktape_GetPointerProperty(ctx, 0, "_ptr");
|
|
if (h != NULL)
|
|
{
|
|
duk_push_object(ctx); // [value]
|
|
ILibDuktape_DescriptorEvents_WindowsWaitHandle *v = (ILibDuktape_DescriptorEvents_WindowsWaitHandle*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_DescriptorEvents_WindowsWaitHandle));
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_WaitHandle);
|
|
|
|
ILibDuktape_EventEmitter *e = ILibDuktape_EventEmitter_Create(ctx);
|
|
ILibDuktape_EventEmitter_CreateEventEx(e, "signaled");
|
|
v->ctx = ctx;
|
|
v->object = duk_get_heapptr(ctx, -1);
|
|
v->chain = Duktape_GetChain(ctx);
|
|
v->eventThread = ILibChain_GetMicrostackThreadHandle(v->chain);
|
|
if (RegisterWaitForSingleObject(&(v->waitHandle), h, ILibDuktape_DescriptorEvents_WaitHandleSignaled, (void*)v, INFINITE, WT_EXECUTEINPERSISTENTTHREAD | WT_EXECUTEONLYONCE) == 0)
|
|
{
|
|
return(ILibDuktape_Error(ctx, "Error(%d) Calling RegisterWaitForSingleObject() ", GetLastError()));
|
|
}
|
|
return(1);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (!duk_is_number(ctx, 0)) { return(ILibDuktape_Error(ctx, "Invalid Descriptor")); }
|
|
ILibForceUnBlockChain(Duktape_GetChain(ctx));
|
|
|
|
duk_push_this(ctx); // [obj]
|
|
duk_get_prop_string(ctx, -1, ILibDuktape_DescriptorEvents_Table); // [obj][table]
|
|
duk_push_object(ctx); // [obj][table][value]
|
|
duk_dup(ctx, 0); // [obj][table][value][key]
|
|
duk_dup(ctx, -2); // [obj][table][value][key][value]
|
|
ILibDuktape_EventEmitter *e = ILibDuktape_EventEmitter_Create(ctx);
|
|
ILibDuktape_EventEmitter_CreateEventEx(e, "readset");
|
|
ILibDuktape_EventEmitter_CreateEventEx(e, "writeset");
|
|
ILibDuktape_EventEmitter_CreateEventEx(e, "errorset");
|
|
duk_dup(ctx, 0); // [obj][table][value][key][value][FD]
|
|
duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_FD); // [obj][table][value][key][value]
|
|
duk_dup(ctx, 1); duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_Options);
|
|
|
|
duk_put_prop(ctx, -4); // [obj][table][value]
|
|
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_DescriptorEvents_Finalizer(duk_context *ctx)
|
|
{
|
|
ILibChain_Link *link = (ILibChain_Link*)Duktape_GetPointerProperty(ctx, 0, ILibDuktape_DescriptorEvents_ChainLink);
|
|
void *chain = Duktape_GetChain(ctx);
|
|
|
|
link->PreSelectHandler = NULL;
|
|
link->PostSelectHandler = NULL;
|
|
((void**)link->ExtraMemoryPtr)[0] = NULL;
|
|
((void**)link->ExtraMemoryPtr)[1] = NULL;
|
|
|
|
if (ILibIsChainBeingDestroyed(chain) == 0)
|
|
{
|
|
ILibChain_SafeRemove(chain, link);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
void ILibDuktape_DescriptorEvents_Push(duk_context *ctx, void *chain)
|
|
{
|
|
ILibChain_Link *link = (ILibChain_Link*)ILibChain_Link_Allocate(sizeof(ILibChain_Link), 2 * sizeof(void*));
|
|
link->MetaData = "ILibDuktape_DescriptorEvents";
|
|
link->PreSelectHandler = ILibDuktape_DescriptorEvents_PreSelect;
|
|
link->PostSelectHandler = ILibDuktape_DescriptorEvents_PostSelect;
|
|
|
|
duk_push_object(ctx);
|
|
duk_push_pointer(ctx, link); duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_ChainLink);
|
|
duk_push_object(ctx); duk_put_prop_string(ctx, -2, ILibDuktape_DescriptorEvents_Table);
|
|
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_DescriptorEvents_Finalizer);
|
|
|
|
((void**)link->ExtraMemoryPtr)[0] = ctx;
|
|
((void**)link->ExtraMemoryPtr)[1] = duk_get_heapptr(ctx, -1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "addDescriptor", ILibDuktape_DescriptorEvents_Add, 2);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "removeDescriptor", ILibDuktape_DescriptorEvents_Remove, 1);
|
|
|
|
|
|
ILibAddToChain(chain, link);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_filehash(duk_context *ctx)
|
|
{
|
|
char *hash = duk_push_fixed_buffer(ctx, UTIL_SHA384_HASHSIZE);
|
|
duk_push_buffer_object(ctx, -1, 0, UTIL_SHA384_HASHSIZE, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
if (GenerateSHA384FileHash((char*)duk_require_string(ctx, 0), hash) == 0)
|
|
{
|
|
return(1);
|
|
}
|
|
else
|
|
{
|
|
return(ILibDuktape_Error(ctx, "Error generating FileHash "));
|
|
}
|
|
}
|
|
|
|
duk_ret_t ILibDuktape_Polyfills_ipv4From(duk_context *ctx)
|
|
{
|
|
int v = duk_require_int(ctx, 0);
|
|
ILibDuktape_IPV4AddressToOptions(ctx, v);
|
|
duk_get_prop_string(ctx, -1, "host");
|
|
return(1);
|
|
}
|
|
|
|
duk_ret_t ILibDuktape_Polyfills_global(duk_context *ctx)
|
|
{
|
|
duk_push_global_object(ctx);
|
|
return(1);
|
|
}
|
|
duk_ret_t ILibDuktape_Polyfills_isBuffer(duk_context *ctx)
|
|
{
|
|
duk_push_boolean(ctx, duk_is_buffer_data(ctx, 0));
|
|
return(1);
|
|
}
|
|
void ILibDuktape_Polyfills_Init(duk_context *ctx)
|
|
{
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "queue", ILibDuktape_Queue_Push);
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "DynamicBuffer", ILibDuktape_DynamicBuffer_Push);
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "stream", ILibDuktape_Stream_Init);
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "http-headers", ILibDuktape_httpHeaders_PUSH);
|
|
|
|
#ifndef MICROSTACK_NOTLS
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "pkcs7", ILibDuktape_PKCS7_Push);
|
|
#endif
|
|
|
|
#ifndef MICROSTACK_NOTLS
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "bignum", ILibDuktape_bignum_Push);
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "dataGenerator", ILibDuktape_dataGenerator_Push);
|
|
#endif
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "ChainViewer", ILibDuktape_ChainViewer_Push);
|
|
ILibDuktape_ModSearch_AddHandler(ctx, "DescriptorEvents", ILibDuktape_DescriptorEvents_Push);
|
|
|
|
// Global Polyfills
|
|
duk_push_global_object(ctx); // [g]
|
|
ILibDuktape_WriteID(ctx, "Global");
|
|
|
|
ILibDuktape_Polyfills_String(ctx);
|
|
ILibDuktape_Polyfills_Buffer(ctx);
|
|
ILibDuktape_Polyfills_Console(ctx);
|
|
ILibDuktape_Polyfills_byte_ordering(ctx);
|
|
ILibDuktape_Polyfills_timer(ctx);
|
|
ILibDuktape_Polyfills_object(ctx);
|
|
|
|
ILibDuktape_CreateInstanceMethod(ctx, "addModuleObject", ILibDuktape_Polyfills_addModuleObject, 2);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "addModule", ILibDuktape_Polyfills_addModule, 2);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "getJSModule", ILibDuktape_Polyfills_getJSModule, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "_debugCrash", ILibDuktape_Polyfills_debugCrash, 0);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "_debugGC", ILibDuktape_Polyfills_debugGC, 0);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "_debug", ILibDuktape_Polyfills_debug, 0);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "getSHA384FileHash", ILibDuktape_Polyfills_filehash, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "_ipv4From", ILibDuktape_Polyfills_ipv4From, 1);
|
|
ILibDuktape_CreateInstanceMethod(ctx, "_isBuffer", ILibDuktape_Polyfills_isBuffer, 1);
|
|
|
|
#ifndef MICROSTACK_NOTLS
|
|
ILibDuktape_CreateInstanceMethod(ctx, "crc32c", ILibDuktape_Polyfills_crc32c, DUK_VARARGS);
|
|
#endif
|
|
ILibDuktape_CreateEventWithGetter(ctx, "global", ILibDuktape_Polyfills_global);
|
|
duk_pop(ctx); // ...
|
|
|
|
ILibDuktape_Debugger_Init(ctx, 9091);
|
|
}
|
|
|
|
#ifdef __DOXY__
|
|
/*!
|
|
\brief String
|
|
*/
|
|
class String
|
|
{
|
|
public:
|
|
/*!
|
|
\brief Finds a String within another String
|
|
\param str \<String\> Substring to search for
|
|
\return <Integer> Index of where the string was found. -1 if not found
|
|
*/
|
|
Integer indexOf(str);
|
|
/*!
|
|
\brief Extracts a String from a String.
|
|
\param startIndex <Integer> Starting index to extract
|
|
\param length <Integer> Number of characters to extract
|
|
\return \<String\> extracted String
|
|
*/
|
|
String substr(startIndex, length);
|
|
/*!
|
|
\brief Extracts a String from a String.
|
|
\param startIndex <Integer> Starting index to extract
|
|
\param endIndex <Integer> Ending index to extract
|
|
\return \<String\> extracted String
|
|
*/
|
|
String splice(startIndex, endIndex);
|
|
/*!
|
|
\brief Split String into substrings
|
|
\param str \<String\> Delimiter to split on
|
|
\return Array of Tokens
|
|
*/
|
|
Array<String> split(str);
|
|
/*!
|
|
\brief Determines if a String starts with the given substring
|
|
\param str \<String\> substring
|
|
\return <boolean> True, if this String starts with the given substring
|
|
*/
|
|
boolean startsWith(str);
|
|
};
|
|
/*!
|
|
\brief Instances of the Buffer class are similar to arrays of integers but correspond to fixed-sized, raw memory allocations.
|
|
*/
|
|
class Buffer
|
|
{
|
|
public:
|
|
/*!
|
|
\brief Create a new Buffer instance of the specified number of bytes
|
|
\param size <integer>
|
|
\return \<Buffer\> new Buffer instance
|
|
*/
|
|
Buffer(size);
|
|
|
|
/*!
|
|
\brief Returns the amount of memory allocated in bytes
|
|
*/
|
|
integer length;
|
|
/*!
|
|
\brief Creates a new Buffer instance from an encoded String
|
|
\param str \<String\> encoded String
|
|
\param encoding \<String\> Encoding. Can be either 'base64' or 'hex'
|
|
\return \<Buffer\> new Buffer instance
|
|
*/
|
|
static Buffer from(str, encoding);
|
|
/*!
|
|
\brief Decodes Buffer to a String
|
|
\param encoding \<String\> Optional. Can be either 'base64' or 'hex'. If not specified, will just encode as an ANSI string
|
|
\param start <integer> Optional. Starting offset. <b>Default:</b> 0
|
|
\param end <integer> Optional. Ending offset (not inclusive) <b>Default:</b> buffer length
|
|
\return \<String\> Encoded String
|
|
*/
|
|
String toString([encoding[, start[, end]]]);
|
|
/*!
|
|
\brief Returns a new Buffer that references the same memory as the original, but offset and cropped by the start and end indices.
|
|
\param start <integer> Where the new Buffer will start. <b>Default:</b> 0
|
|
\param end <integer> Where the new Buffer will end. (Not inclusive) <b>Default:</b> buffer length
|
|
\return \<Buffer\>
|
|
*/
|
|
Buffer slice([start[, end]]);
|
|
};
|
|
/*!
|
|
\brief Console
|
|
*/
|
|
class Console
|
|
{
|
|
public:
|
|
/*!
|
|
\brief Serializes the input parameters to the Console Display
|
|
\param args <any>
|
|
*/
|
|
void log(...args);
|
|
};
|
|
/*!
|
|
\brief Global Timer Methods
|
|
*/
|
|
class Timers
|
|
{
|
|
public:
|
|
/*!
|
|
\brief Schedules the "immediate" execution of the callback after I/O events' callbacks.
|
|
\param callback <func> Function to call at the end of the event loop
|
|
\param args <any> Optional arguments to pass when the callback is called
|
|
\return Immediate for use with clearImmediate().
|
|
*/
|
|
Immediate setImmediate(callback[, ...args]);
|
|
/*!
|
|
\brief Schedules execution of a one-time callback after delay milliseconds.
|
|
\param callback <func> Function to call when the timeout elapses
|
|
\param args <any> Optional arguments to pass when the callback is called
|
|
\return Timeout for use with clearTimeout().
|
|
*/
|
|
Timeout setTimeout(callback, delay[, ...args]);
|
|
/*!
|
|
\brief Schedules repeated execution of callback every delay milliseconds.
|
|
\param callback <func> Function to call when the timer elapses
|
|
\param args <any> Optional arguments to pass when the callback is called
|
|
\return Timeout for use with clearInterval().
|
|
*/
|
|
Timeout setInterval(callback, delay[, ...args]);
|
|
|
|
/*!
|
|
\brief Cancels a Timeout returned by setTimeout()
|
|
\param timeout Timeout
|
|
*/
|
|
void clearTimeout(timeout);
|
|
/*!
|
|
\brief Cancels a Timeout returned by setInterval()
|
|
\param interval Timeout
|
|
*/
|
|
void clearInterval(interval);
|
|
/*!
|
|
\brief Cancels an Immediate returned by setImmediate()
|
|
\param immediate Immediate
|
|
*/
|
|
void clearImmediate(immediate);
|
|
|
|
/*!
|
|
\brief Scheduled Timer
|
|
*/
|
|
class Timeout
|
|
{
|
|
public:
|
|
};
|
|
/*!
|
|
\implements Timeout
|
|
\brief Scheduled Immediate
|
|
*/
|
|
class Immediate
|
|
{
|
|
public:
|
|
};
|
|
};
|
|
|
|
/*!
|
|
\brief Global methods for byte ordering manipulation
|
|
*/
|
|
class BytesOrdering
|
|
{
|
|
public:
|
|
/*!
|
|
\brief Converts 2 bytes from network order to host order
|
|
\param buffer \<Buffer\> bytes to convert
|
|
\param offset <integer> offset to start
|
|
\return <integer> host order value
|
|
*/
|
|
static integer ntohs(buffer, offset);
|
|
/*!
|
|
\brief Converts 4 bytes from network order to host order
|
|
\param buffer \<Buffer\> bytes to convert
|
|
\param offset <integer> offset to start
|
|
\return <integer> host order value
|
|
*/
|
|
static integer ntohl(buffer, offset);
|
|
/*!
|
|
\brief Writes 2 bytes in network order
|
|
\param buffer \<Buffer\> Buffer to write to
|
|
\param offset <integer> offset to start writing
|
|
\param val <integer> host order value to write
|
|
*/
|
|
static void htons(buffer, offset, val);
|
|
/*!
|
|
\brief Writes 4 bytes in network order
|
|
\param buffer \<Buffer\> Buffer to write to
|
|
\param offset <integer> offset to start writing
|
|
\param val <integer> host order value to write
|
|
*/
|
|
static void htonl(buffer, offset, val);
|
|
};
|
|
#endif
|