From 3824ef638c47e4b26ddfaaecf50c25d32d284232 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Thu, 28 May 2020 00:54:30 -0700 Subject: [PATCH] Updated project files, and fixed compiler warnings --- makefile | 2 +- meshconsole/MeshConsole.vcxproj | 2 - meshservice/MeshService.vcxproj | 2 - microscript/ILibDuktape_ChildProcess.c | 3 +- microscript/ILibDuktape_HECI.c | 1313 --------------------- microscript/ILibDuktape_HECI.h | 25 - microscript/ILibDuktape_Polyfills.c | 11 + microscript/ILibDuktape_ScriptContainer.c | 4 - microscript/ILibDuktape_fs.c | 2 - modules/heci.js | 1 + 10 files changed, 15 insertions(+), 1350 deletions(-) delete mode 100644 microscript/ILibDuktape_HECI.c delete mode 100644 microscript/ILibDuktape_HECI.h diff --git a/makefile b/makefile index eb004da..a217685 100644 --- a/makefile +++ b/makefile @@ -118,7 +118,7 @@ SOURCES += microscript/ILibDuktape_SimpleDataStore.c microscript/ILibDuktape_Gen SOURCES += microscript/ILibDuktape_fs.c microscript/ILibDuktape_SHA256.c microscript/ILibduktape_EventEmitter.c SOURCES += microscript/ILibDuktape_EncryptionStream.c microscript/ILibDuktape_Polyfills.c microscript/ILibDuktape_Dgram.c SOURCES += microscript/ILibDuktape_ScriptContainer.c microscript/ILibDuktape_MemoryStream.c microscript/ILibDuktape_NetworkMonitor.c -SOURCES += microscript/ILibDuktape_ChildProcess.c microscript/ILibDuktape_HECI.c microscript/ILibDuktape_HttpStream.c microscript/ILibDuktape_Debugger.c +SOURCES += microscript/ILibDuktape_ChildProcess.c microscript/ILibDuktape_HttpStream.c microscript/ILibDuktape_Debugger.c SOURCES += $(ADDITIONALSOURCES) # Mesh Agent core diff --git a/meshconsole/MeshConsole.vcxproj b/meshconsole/MeshConsole.vcxproj index 29eac37..b5b7376 100644 --- a/meshconsole/MeshConsole.vcxproj +++ b/meshconsole/MeshConsole.vcxproj @@ -68,7 +68,6 @@ - @@ -118,7 +117,6 @@ - diff --git a/meshservice/MeshService.vcxproj b/meshservice/MeshService.vcxproj index 096bb1a..7c72d1c 100644 --- a/meshservice/MeshService.vcxproj +++ b/meshservice/MeshService.vcxproj @@ -573,7 +573,6 @@ - @@ -625,7 +624,6 @@ - diff --git a/microscript/ILibDuktape_ChildProcess.c b/microscript/ILibDuktape_ChildProcess.c index 538fa58..5c0f5cc 100644 --- a/microscript/ILibDuktape_ChildProcess.c +++ b/microscript/ILibDuktape_ChildProcess.c @@ -170,7 +170,8 @@ duk_ret_t ILibDuktape_ChildProcess_waitExit(duk_context *ctx) } duk_push_this(ctx); // [spawnedProcess] - char *_target = Duktape_GetStringPropertyValue(ctx, -1, "_target", NULL); + //char *_target = Duktape_GetStringPropertyValue(ctx, -1, "_target", NULL); + if (!ILibChain_IsLinkAlive(Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager))) { return(ILibDuktape_Error(ctx, "Cannot waitExit() because JS Engine is exiting")); diff --git a/microscript/ILibDuktape_HECI.c b/microscript/ILibDuktape_HECI.c deleted file mode 100644 index c205bc3..0000000 --- a/microscript/ILibDuktape_HECI.c +++ /dev/null @@ -1,1313 +0,0 @@ -/* -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 "ILibDuktape_HECI.h" -#include "ILibDuktapeModSearch.h" -#include "ILibDuktape_Helpers.h" -#include "ILibDuktape_DuplexStream.h" -#include "ILibDuktape_EventEmitter.h" -#include "ILibDuktape_ChildProcess.h" -#include "../microstack/ILibParsers.h" -#include "../microstack/ILibProcessPipe.h" -#include "../microstack/ILibRemoteLogging.h" - -#ifndef _NOHECI - -#ifdef WIN32 -#include -#include -#include -#include -DEFINE_GUID(GUID_DEVINTERFACE_HECI, 0xE2D1FF34, 0x3458, 0x49A9, 0x88, 0xDA, 0x8E, 0x69, 0x15, 0xCE, 0x9B, 0xE5); -#elif defined(_POSIX) -typedef struct HECI_client -{ - unsigned int max_msg_length; - unsigned char protocol_version; - unsigned char reserved[3]; -}HECI_client; -typedef struct uuid_le -{ - unsigned char b[16]; -}uuid_le; -struct HECI_CONNECT_client_data -{ - union - { - uuid_le uuid; - HECI_client properties; - }; -}; -#endif - -#define ILibDuktape_HECI_ChainLink "\xFF_HECI_ChainLink" -#define ILibDuktape_HECI_Descriptor "\xFF_HECI_Descriptor" -#define ILibDuktape_HECI_ChildProcess "\xFF_HECI_ChildProcess" -#define ILibDuktape_HECI_Q "\xFF_HECI_Q" -#define ILibDuktape_HECI_CTX_PTRS "\xFF_HECI_CTX_PTRS" -//#define ILibDuktape_HECI_IoctlWaitHandle "\xFF_HECI_IoctlWaitHandle" -#define ILibDuktape_HECI_OVERLAPPED "\xFF_HECI_OVERLAPPED" -#define ILibDuktape_HECI_Child "\xFF_HECI_Child" -#define ILibDuktape_HECI_Parent "\xFF_HECI_Parent" -#define ILibDuktape_HECI_Root "\xFF_HECI_Root" -#define ILibDuktape_HECI_MaxBufferSize "\xFF_HECI_MaxBufSize" -#define ILibDuktape_HECI_SessionMemPtr "\xFF_HECI_SessionMemPtr" -#define ILibDuktape_HECI_Session_NoPipeline "\xFF_HECI_Session_NoPipeline" -#define ILibDuktape_HECI_Session_Metadata "\xFF_HECI_Session_Metadata" - -#ifdef __DOXY__ -/*! -\implements EventEmitter -\brief JavaScript object interface for HECI calls. require('heci') to use; -*/ -class Heci -{ -public: - /*! - \brief Performs an Ioctl on the HECI device - \param code Ioctl Code to invoke - \param inBuffer \ Input data for Ioctl. Can be null - \param outBuffer \ Optional. Output data from Ioctl. Must be specified if Ioctl code returns data - \param callback Dispatched when a response is received from the HECI device\n - status Success Code. 0 = Success, Error code on failure\n - buffer \ Output Buffer\n - args Optional parameters that were passed in\n - \param args Optional arguments to pass when the callback is called - */ - void doIoctl(code, inBuffer[, outBuffer], callback[, ...args]); -}; -#endif - -typedef struct ILibDuktape_HECI_ioctl_data -{ - duk_context *ctx; - uintptr_t ctxnonce; - void *heciObject; - void *data; - void *Q; - void *chain; - ILibProcessPipe_Manager pipeManager; -#ifdef WIN32 - OVERLAPPED v; - HANDLE device; - DWORD bytesReceived; - DWORD abort; -#elif defined(_POSIX) - int device; -#endif - void *reserved; - - int code; - char *outBuffer; - void *outBuffer_obj; - duk_size_t outBufferLen; - duk_size_t bufferLen; - char buffer[]; -}ILibDuktape_HECI_ioctl_data; - -typedef struct ILibDuktape_HECI_Session -{ - void *chain; - int noPipelining; - ILibDuktape_DuplexStream *stream; -#ifdef WIN32 - OVERLAPPED v; - OVERLAPPED wv; - ILibProcessPipe_Manager mgr; - HANDLE descriptor; - DWORD bytesRead; -#else - int descriptor; -#endif - ILibQueue PendingWrites; - duk_size_t bufferSize; - char buffer[]; -}ILibDuktape_HECI_Session; -typedef struct ILibDuktape_HECI_WriteState -{ - ILibDuktape_HECI_Session *session; - int returnIgnored; -#ifndef WIN32 - int bufferOffset; -#endif - int bufferLen; - char buffer[]; -}ILibDuktape_HECI_WriteState; - -typedef struct HECI_chainLink -{ - ILibChain_Link link; - duk_context *ctx; - ILibDuktape_HECI_Session *session; - void *heciObject; - int descriptor; - int paused; -}HECI_chainLink; - -void ILibDuktape_HECI_Push(duk_context *ctx, void *chain); -ILibTransport_DoneState ILibDuktape_HECI_Session_WriteHandler_Process(ILibDuktape_HECI_Session *session); -extern int ILibDuktape_HECI_Debug; - -#ifdef WIN32 -BOOL ILibDuktape_HECI_Session_ReceiveSink(void *chain, HANDLE event, ILibWaitHandle_ErrorStatus errors, void* user); - -HANDLE ILibDuktape_HECI_windowsInit() -{ - PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetail = NULL; - HDEVINFO hDeviceInfo; - DWORD bufferSize; - SP_DEVICE_INTERFACE_DATA interfaceData; - LONG ii = 0; - HANDLE retVal = NULL; - - if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_windowsInit()\n"); } - - // Find all devices that have our interface - hDeviceInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_HECI, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - if (hDeviceInfo == INVALID_HANDLE_VALUE) - { - if (ILibDuktape_HECI_Debug) { printf("...[FAILED]\n"); } - return(NULL); - } - if (ILibDuktape_HECI_Debug) { printf("...[Acquired hDeviceInfo]\n"); } - - - // Setup the interface data struct - interfaceData.cbSize = sizeof(interfaceData); - for (ii = 0; - SetupDiEnumDeviceInterfaces(hDeviceInfo, NULL, (LPGUID)&GUID_DEVINTERFACE_HECI, ii, &interfaceData); - ++ii) - { - // Found our device instance - if (!SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &interfaceData, NULL, 0, &bufferSize, NULL)) - { - DWORD err = GetLastError(); - if (err != ERROR_INSUFFICIENT_BUFFER) - { - continue; - } - } - - // Allocate a big enough buffer to get detail data - deviceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)ILibMemory_AllocateA(bufferSize); - if (deviceDetail == NULL) { continue; } - - // Setup the device interface struct - deviceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - - // Try again to get the device interface detail info - if (!SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &interfaceData, deviceDetail, bufferSize, NULL, NULL)) - { - deviceDetail = NULL; - continue; - } - - break; - } - SetupDiDestroyDeviceInfoList(hDeviceInfo); - - if (deviceDetail == NULL) - { - if (ILibDuktape_HECI_Debug) { printf("...[deviceDetail FAILED]\n"); } - return(NULL); - } - - retVal = CreateFile(deviceDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); - if (retVal == INVALID_HANDLE_VALUE) - { - if (ILibDuktape_HECI_Debug) { printf("...[FAILED to acquire descriptor]\n"); } - return(NULL); - } - if (ILibDuktape_HECI_Debug) { printf("...[Acquired Descriptor]\n"); } - - return(retVal); -} -#else -int ILibDuktape_HECI_linuxInit() -{ - int fd, flags; - - if ((fd = open("/dev/mei", O_RDWR)) == -1 && (fd = open("/dev/mei0", O_RDWR)) == -1) - { - return(-1); - } - else - { - flags = fcntl(fd, F_GETFL, 0); - if (fcntl(fd, F_SETFL, O_NONBLOCK | flags) == -1) { printf("Failed to set O_NONBLOCK\n"); close(fd); fd = -1; } - return(fd); - } -} -#endif - -duk_ret_t ILibDuktape_HECI_SessionFinalizer(duk_context *ctx) -{ - if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_SessionFinalizer()\n"); } - if (duk_has_prop_string(ctx, 0, ILibDuktape_HECI_SessionMemPtr)) - { - duk_get_prop_string(ctx, 0, ILibDuktape_HECI_SessionMemPtr); - ILibDuktape_HECI_Session *s = (ILibDuktape_HECI_Session*)Duktape_GetBuffer(ctx, -1, NULL); - if (s != NULL && s->PendingWrites != NULL) { ILibQueue_Destroy(s->PendingWrites); } // ToDo: If there is anything pending, we need to clear that too - if (s != NULL) { s->stream = NULL; } - } - return(0); -} - - -void ILibDuktape_HECI_Session_EmitErrorEvent(void *chain, void *session) -{ - ILibDuktape_HECI_Session *s = (ILibDuktape_HECI_Session*)session; - duk_context *ctx = s->stream->readableStream->ctx; - if (ILibIsRunningOnChainThread(chain) == 0) { Duktape_RunOnEventLoop(chain, duk_ctx_nonce(ctx), ctx, ILibDuktape_HECI_Session_EmitErrorEvent, NULL, session); return; } - - duk_push_heapptr(ctx, s->stream->ParentObject); // [session] - duk_get_prop_string(ctx, -1, "emit"); // [session][emit] - duk_swap_top(ctx, -2); // [emit][this] - duk_push_string(ctx, "error"); // [emit][this][error] - duk_push_error_object(ctx, DUK_ERR_ERROR, "HECI Connection Error"); // [emit][this][error][err] - if (duk_pcall_method(ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "HECI.session.onError(): "); } - duk_pop(ctx); // ... -} -void ILibDuktape_HECI_Session_EmitStreamReady(void *chain, void *session) -{ - if (ILibIsRunningOnChainThread(chain) == 0) { Duktape_RunOnEventLoop(chain, duk_ctx_nonce(((ILibDuktape_HECI_Session*)session)->stream->writableStream->ctx), ((ILibDuktape_HECI_Session*)session)->stream->writableStream->ctx, ILibDuktape_HECI_Session_EmitStreamReady, NULL, session); return; } - ILibDuktape_DuplexStream_Ready(((ILibDuktape_HECI_Session*)session)->stream); -} - -#ifdef WIN32 -BOOL ILibDuktape_HECI_Session_WriteHandler_Ready(void *chain, HANDLE event, ILibWaitHandle_ErrorStatus errors, void* user) -{ - if (errors != ILibWaitHandle_ErrorStatus_NONE) { return(FALSE); } - - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; - DWORD bytesWritten; - - if (!ILibMemory_CanaryOK(session)) { return(FALSE); } - - ILibChain_RemoveWaitHandle(session->chain, session->wv.hEvent); - - if (session->noPipelining == 0) - { - ILibDuktape_HECI_WriteState *state = (ILibDuktape_HECI_WriteState*)ILibQueue_DeQueue(session->PendingWrites); - free(state); - } - - if (GetOverlappedResult(session->descriptor, &(session->wv), &bytesWritten, FALSE) == 0) - { - // Broken Connection - ILibDuktape_HECI_Session_EmitErrorEvent(session->chain, (void*)session); - } - else - { - if (session->noPipelining == 0) - { - // Write Completed - ILibDuktape_HECI_Session_WriteHandler_Process(session); - } - } - return(TRUE); -} -#endif - -ILibTransport_DoneState ILibDuktape_HECI_Session_WriteHandler_Process(ILibDuktape_HECI_Session *session) -{ - ILibTransport_DoneState retVal = ILibTransport_DoneState_ERROR; - int returnIgnored = 0; - -#ifdef WIN32 - DWORD bytesWritten; - BOOL result = TRUE; -#else - ssize_t bytesWritten; -#endif - - while (session->noPipelining || ILibQueue_GetCount(session->PendingWrites) > 0) - { - ILibDuktape_HECI_WriteState *state = (ILibDuktape_HECI_WriteState*)ILibQueue_PeekQueue(session->PendingWrites); - returnIgnored = state->returnIgnored; - -#ifdef WIN32 - if ((result = WriteFile(state->session->descriptor, state->buffer, state->bufferLen, &bytesWritten, &(state->session->wv))) == TRUE) - { - if (session->noPipelining == 0) { ILibQueue_DeQueue(state->session->PendingWrites); free(state); } - } - else - { - break; - } -#elif defined(_POSIX) - - bytesWritten = write(state->session->descriptor, state->buffer + state->bufferOffset, state->bufferLen - state->bufferOffset); - if (bytesWritten > 0) - { - state->bufferOffset += bytesWritten; - if (state->bufferOffset == state->bufferLen) { ILibQueue_DeQueue(state->session->PendingWrites); free(state); retVal = session->noPipelining == 0 ? ILibTransport_DoneState_COMPLETE:ILibTransport_DoneState_INCOMPLETE; } - } - else - { - if (errno != EAGAIN) - { - // Error Occured - retVal = ILibTransport_DoneState_ERROR; - ILibDuktape_HECI_Session_EmitErrorEvent(session->chain, (void*)session); - } - else - { - retVal = ILibTransport_DoneState_INCOMPLETE; - } - break; - } -#endif - - if (session->noPipelining != 0) { break; } - } - -#ifdef WIN32 - if (result == FALSE) - { - if (GetLastError() == ERROR_IO_PENDING) - { - // Not done writing - retVal = ILibTransport_DoneState_INCOMPLETE; - ILibChain_AddWaitHandle(session->chain, session->wv.hEvent, -1, ILibDuktape_HECI_Session_WriteHandler_Ready, session); - } - else - { - // Error Occured - retVal = ILibTransport_DoneState_ERROR; - ILibDuktape_HECI_Session_EmitErrorEvent(session->chain, (void*)session); - } - } - else - { - if (session->noPipelining == 0) - { - // No more Pending Writes - retVal = ILibTransport_DoneState_COMPLETE; - if (returnIgnored != 0) { ILibDuktape_HECI_Session_EmitStreamReady(session->chain, (void*)session); } - } - else - { - retVal = ILibTransport_DoneState_INCOMPLETE; - } - } -#else - if (ILibQueue_GetCount(session->PendingWrites) == 0 && session->noPipelining == 0) - { - // No more Pending Writes - retVal = ILibTransport_DoneState_COMPLETE; - if (returnIgnored != 0) { ILibDuktape_HECI_Session_EmitStreamReady(session->chain, (void*)session); } - } -#endif - return(retVal); -} - -#ifdef WIN32 -void __stdcall ILibDuktape_HECI_Session_WriteHandler(ULONG_PTR obj) -{ - // This Method is always dispatched from the WindowsRunLoop APC Thread - - ILibDuktape_HECI_WriteState *state = (ILibDuktape_HECI_WriteState*)obj; - ILibQueue_EnQueue(state->session->PendingWrites, state); - - if (ILibQueue_GetCount(state->session->PendingWrites) == 1) - { - // No Pending Writes, so we can go ahead and send out the first block - ILibDuktape_HECI_Session_WriteHandler_Process(state->session); - } -} -#elif defined(_POSIX) -ILibTransport_DoneState ILibDuktape_HECI_Session_WriteHandler(void *chain, ILibDuktape_HECI_WriteState* state) -{ - // This Method is always dispatched from the Microstack Thread - ILibQueue_EnQueue(state->session->PendingWrites, state); - - if (ILibQueue_GetCount(state->session->PendingWrites) == 1) - { - return(ILibDuktape_HECI_Session_WriteHandler_Process(state->session)); - } - else - { - return(ILibTransport_DoneState_INCOMPLETE); - } -} -#endif - -ILibTransport_DoneState ILibDuktape_HECI_Session_WriteSink_NoPipeline(void *chain, void *user) -{ - // This is always called from the Microstack Thread - - ILibDuktape_HECI_WriteState *state = (ILibDuktape_HECI_WriteState*)user; - ILibQueue_EnQueue(state->session->PendingWrites, state); - if (ILibQueue_GetCount(state->session->PendingWrites) == 1) - { - return(ILibDuktape_HECI_Session_WriteHandler_Process(state->session)); - } - else - { - return(ILibTransport_DoneState_INCOMPLETE); - } -} -ILibTransport_DoneState ILibDuktape_HECI_Session_WriteSink(ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user) -{ - if ((duk_size_t)bufferLen > ((ILibDuktape_HECI_Session*)user)->bufferSize) { return(ILibTransport_DoneState_ERROR); } - - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; - ILibDuktape_HECI_WriteState *state = (ILibDuktape_HECI_WriteState*)ILibMemory_Allocate(bufferLen + sizeof(ILibDuktape_HECI_WriteState), 0, NULL, NULL); - state->session = session; - state->bufferLen = bufferLen; - memcpy_s(state->buffer, bufferLen, buffer, bufferLen); - - if (session->noPipelining == 0) - { -#if defined(WIN32) - state->returnIgnored = 1; - ILibDuktape_HECI_Session_WriteHandler((ULONG_PTR)state); -#elif defined(_POSIX) - if (ILibIsRunningOnChainThread(stream->readableStream->chain) != 0) - { - return(ILibDuktape_HECI_Session_WriteHandler(NULL, state)); - } - else - { - state->returnIgnored = 1; - ILibChain_RunOnMicrostackThreadEx(stream->readableStream->chain, (ILibChain_StartEvent)ILibDuktape_HECI_Session_WriteHandler, state); - } -#endif - } - else - { - // We can't pipeline write requests - if (ILibIsRunningOnChainThread(stream->readableStream->chain) != 0) - { - return(ILibDuktape_HECI_Session_WriteSink_NoPipeline(stream->readableStream->chain, state)); - } - else - { - state->returnIgnored = 1; - Duktape_RunOnEventLoop(stream->readableStream->chain, duk_ctx_nonce(stream->readableStream->ctx), stream->readableStream->ctx, (Duktape_EventLoopDispatch)ILibDuktape_HECI_Session_WriteSink_NoPipeline, NULL, state); - } - } - - return(ILibTransport_DoneState_INCOMPLETE); -} -void ILibDuktape_HECI_Session_EndSink(ILibDuktape_DuplexStream *stream, void *user) -{ - duk_context *ctx = stream->readableStream->ctx; - duk_push_this(ctx); - duk_get_prop_string(ctx, -1, "disconnect"); - duk_swap_top(ctx, -2); - if (duk_pcall_method(ctx, 0) != 0) { ILibDuktape_Process_UncaughtException(ctx); } - duk_pop(ctx); -} -void ILibDuktape_HECI_Session_PauseSink(ILibDuktape_DuplexStream *sender, void *user) -{ -#ifdef WIN32 - // NO-OP Because we are already PAUSED, since we context switched - UNREFERENCED_PARAMETER(sender); - UNREFERENCED_PARAMETER(user); -#else - UNREFERENCED_PARAMETER(sender); - UNREFERENCED_PARAMETER(user); -#endif -} -void ILibDuktape_HECI_Session_ResumeSink_NoPipeline(void *chain, void *user) -{ - // This is always called from the Microstack Thread - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; - ILibDuktape_HECI_WriteState *state = (ILibDuktape_HECI_WriteState*)ILibQueue_DeQueue(session->PendingWrites); - free(state); - - if (ILibQueue_GetCount(session->PendingWrites) == 0) - { - ILibDuktape_HECI_Session_EmitStreamReady(session->chain, session); - } - else - { - ILibDuktape_HECI_Session_WriteHandler_Process(session); - } -} -void ILibDuktape_HECI_Session_ResumeSink(ILibDuktape_DuplexStream *sender, void *user) -{ - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; - if (session->noPipelining != 0) - { - ILibDuktape_HECI_Session_ResumeSink_NoPipeline(sender->readableStream->chain, session); - } - -#ifdef WIN32 - BOOL result = ReadFile(session->descriptor, session->buffer, (DWORD)session->bufferSize, &(session->bytesRead), &(session->v)); - if (result == TRUE || GetLastError() == ERROR_IO_PENDING) - { - //if (ILibDuktape_HECI_Debug) { printf("...[Wait Handle Added]\n"); } - ILibChain_AddWaitHandle(session->chain, session->v.hEvent, -1, ILibDuktape_HECI_Session_ReceiveSink, session); - } -#endif -} -#ifdef WIN32 -void ILibDuktape_HECI_Session_ReceiveSink2(void *chain, void *user) -{ - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; - if (!ILibMemory_CanaryOK(session)) { return; } - - ILibDuktape_DuplexStream_WriteData(session->stream, session->buffer, session->bytesRead); - if (session->stream != NULL && !session->stream->readableStream->paused) - { - ILibDuktape_HECI_Session_ResumeSink(session->stream, session->stream->user); - } -} -BOOL ILibDuktape_HECI_Session_ReceiveSink(void *chain, HANDLE event, ILibWaitHandle_ErrorStatus errors, void* user) -{ - //if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_Session_ReceiveSink\n"); } - if (errors != ILibWaitHandle_ErrorStatus_NONE) - { - if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_Session_ReceiveSink\n"); } - if (ILibDuktape_HECI_Debug) { printf("...[ERROR: %d]\n", errors); } - return(FALSE); - } - //if (ILibDuktape_HECI_Debug) { printf("...[SIGNALED]\n"); } - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; - if (ILibMemory_CanaryOK(session)) - { - if (GetOverlappedResult(session->descriptor, &(session->v), &(session->bytesRead), FALSE) == TRUE) - { - ILibDuktape_DuplexStream_WriteData(session->stream, session->buffer, session->bytesRead); - if (session->stream != NULL && !session->stream->readableStream->paused) - { - ILibDuktape_HECI_Session_ResumeSink(session->stream, session->stream->user); - } - } - } - return(FALSE); -} -void __stdcall ILibDuktape_HECI_Session_Start(ULONG_PTR obj) -{ - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)obj; - DWORD bytesRead; - if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_Session_Start()\n"); } - BOOL result = ReadFile(session->descriptor, session->buffer, (DWORD)session->bufferSize, &bytesRead, &(session->v)); - - duk_push_heapptr(session->stream->readableStream->ctx, session->stream->ParentObject); // [session] - ILibChain_AddWaitHandleEx(session->chain, session->v.hEvent, -1, ILibDuktape_HECI_Session_ReceiveSink, session, (char*)Duktape_GetStringPropertyValue(session->stream->readableStream->ctx, -1, ILibDuktape_HECI_Session_Metadata, "heci.session")); - duk_pop(session->stream->readableStream->ctx); // ... -} -#endif - -duk_ret_t ILibDuktape_HECI_create_OnClientConnect(duk_context *ctx) -{ - int statusCode = duk_require_int(ctx, 0); - ILibDuktape_HECI_Session *session = NULL; - duk_dup(ctx, 2); // [Session] - if (statusCode != 0) - { - duk_get_prop_string(ctx, -1, "emit"); // [session][emit] - duk_swap_top(ctx, -2); // [emit][this] - duk_push_string(ctx, "error"); // [emit][this][error] - duk_push_error_object(ctx, DUK_ERR_ERROR, "HECI Connection Error [%d]", statusCode); // [emit][this][error][err] - duk_push_int(ctx, statusCode); duk_put_prop_string(ctx, -2, "errno"); - if (duk_pcall_method(ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "HECI.session.onError(): "); } - duk_pop(ctx); // ... - } - else - { - duk_size_t bufferLen; - char *buffer = (char*)Duktape_GetBuffer(ctx, 1, &bufferLen); - if (bufferLen > 4) - { - duk_push_int(ctx, ((int*)buffer)[0]); - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_MaxBufferSize); // [session] - - session = (ILibDuktape_HECI_Session*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_HECI_Session) + ((int*)buffer)[0]); // [session][buffer] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_SessionMemPtr); // [session] -#ifdef WIN32 - session->v.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - session->wv.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); -#endif - session->chain = Duktape_GetChain(ctx); - session->bufferSize = (duk_size_t)((int*)buffer)[0]; - session->stream = ILibDuktape_DuplexStream_Init(ctx, - ILibDuktape_HECI_Session_WriteSink, ILibDuktape_HECI_Session_EndSink, - ILibDuktape_HECI_Session_PauseSink, ILibDuktape_HECI_Session_ResumeSink, session); - ILibDuktape_CreateReadonlyProperty_int(ctx, "maxBufferSize", (int)session->bufferSize); - session->PendingWrites = ILibQueue_Create(); - duk_push_current_function(ctx); - session->noPipelining = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_HECI_Session_NoPipeline, 0); - duk_pop(ctx); -#ifdef _POSIX - //printf("Session: %p\n", session); - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Child); // [session][heci] - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_ChainLink); // [session][heci][link] - HECI_chainLink *link = (HECI_chainLink*)duk_get_pointer(ctx, -1); - link->session = session; - duk_pop_2(ctx); // [session] -#endif - - //printf("NoPipeline: %d\n", session->noPipelining); - } - else - { - // Even tho it was a success, the result buffer is invalid - duk_get_prop_string(ctx, -1, "emit"); // [session][emit] - duk_swap_top(ctx, -2); // [emit][this] - duk_push_string(ctx, "error"); // [emit][this][error] - duk_push_error_object(ctx, DUK_ERR_ERROR, "HECI Connection Error"); // [emit][this][error][err] - if (duk_pcall_method(ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "HECI.session.onError(): "); } - duk_pop(ctx); // ... - } - } - - if (session != NULL) - { - // Hookup the Send/Receive logic -#ifdef WIN32 - duk_push_this(ctx); // [HECI] - session->descriptor = (HANDLE)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_HECI_Descriptor); - duk_del_prop_string(ctx, -1, ILibDuktape_HECI_Descriptor); - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_ChildProcess); // [HECI][childProcess] - duk_get_prop_string(ctx, -1, ILibDuktape_ChildProcess_Manager); // [HECI][childProcess][manager] - session->mgr = (ILibProcessPipe_Manager)duk_get_pointer(ctx, -1); - ILibDuktape_HECI_Session_Start((ULONG_PTR)session); -#else - duk_push_this(ctx); // [HECI] - session->descriptor = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_HECI_Descriptor, -1); - ILibForceUnBlockChain(session->chain); -#endif - - duk_dup(ctx, 2); - duk_get_prop_string(ctx, -1, "emit"); // [session][emit] - duk_swap_top(ctx, -2); // [emit][this] - duk_push_string(ctx, "connect"); // [emit][this][connect] - if (duk_pcall_method(ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "HECI.session.onConnect(): "); } - duk_pop(ctx); // ... - - - } - return(0); -} -duk_ret_t ILibDuktape_HECI_Session_connect(duk_context *ctx) -{ - if (ILibDuktape_HECI_Debug) { printf("connect()\n"); } - - int i; - int nargs = duk_get_top(ctx); - duk_push_this(ctx); // [Session] - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Child); // [Session][HECI] - duk_remove(ctx, -2); // [HECI] - - duk_get_prop_string(ctx, -1, "doIoctl"); // [HECI][func] - duk_swap_top(ctx, -2); // [doIoctl][this] - duk_get_prop_string(ctx, -1, "IOCTL"); // [doIoctl][this][IOCTL] - duk_get_prop_string(ctx, -1, "CLIENT_CONNECT"); // [doIoctl][this][IOCTL][CLIENT_CONNECT] - duk_remove(ctx, -2); // [doIoctl][this][CLIENT_CONNECT] - duk_dup(ctx, 0); // [doIoctl][this][CLIENT_CONNECT][guid] - duk_push_fixed_buffer(ctx, 16); // [doIoctl][this][CLIENT_CONNECT][guid][outBuffer] - duk_push_buffer_object(ctx, -1, 0, 16, DUK_BUFOBJ_NODEJS_BUFFER); // [doIoctl][this][CLIENT_CONNECT][guid][outBuffer][buf] - duk_remove(ctx, -2); - duk_push_c_function(ctx, ILibDuktape_HECI_create_OnClientConnect, DUK_VARARGS); // [doIoctl][this][CLIENT_CONNECT][guid][outBuffer][callback] - duk_push_int(ctx, 0); - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Session_NoPipeline); - - for (i = 1; i < nargs; ++i) - { - if (duk_is_function(ctx, i)) { ILibDuktape_EventEmitter_AddOnce(ILibDuktape_EventEmitter_GetEmitter_fromThis(ctx), "connect", duk_require_heapptr(ctx, i)); } - else if (duk_is_object(ctx, i)) - { - int noPipeline = Duktape_GetIntPropertyValue(ctx, i, "noPipeline", 0); - duk_push_int(ctx, noPipeline); - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Session_NoPipeline); - } - } - duk_push_this(ctx); // [doIoctl][this][CLIENT_CONNECT][guid][outBuffer][callback][Session] - duk_call_method(ctx, 5); // [retVal] - duk_pop(ctx); // ... - return(0); -} -#ifdef WIN32 -void __stdcall ILibDuktape_HECI_Session_CloseSink2(ULONG_PTR obj) -{ - HANDLE h = (HANDLE)obj; - CloseHandle(h); -} -#endif -duk_ret_t ILibDuktape_HECI_Session_close(duk_context *ctx) -{ - if (ILibDuktape_HECI_Debug) { printf("heci.disconnect()\n\n"); } - duk_push_this(ctx); // [session] - - if (duk_has_prop_string(ctx, -1, ILibDuktape_HECI_Child)) - { - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Child); // [session][heci] - duk_get_prop_string(ctx, -1, "disconnect"); // [session][heci][close] - duk_swap_top(ctx, -2); // [session][close][this] - duk_call_method(ctx, 0); - } - - duk_push_this(ctx); -#ifdef WIN32 - ILibDuktape_HECI_Session *session = NULL; - if (duk_has_prop_string(ctx, -1, ILibDuktape_HECI_SessionMemPtr)) - { - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_SessionMemPtr); // [HECI][SESSION] - session = (ILibDuktape_HECI_Session*)Duktape_GetBuffer(ctx, -1, NULL); - - ILibChain_RemoveWaitHandle(session->chain, session->v.hEvent); - ILibChain_RemoveWaitHandle(session->chain, session->wv.hEvent); - session->stream = NULL; - CloseHandle(session->descriptor); - CloseHandle(session->v.hEvent); session->v.hEvent = NULL; - CloseHandle(session->wv.hEvent); session->wv.hEvent = NULL; - } -#else - int d = Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_HECI_Descriptor, -1); - HECI_chainLink *hcl = (HECI_chainLink*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_HECI_ChainLink); - if (hcl != NULL) - { - hcl->descriptor = -1; - if (d != -1) { close(d); }; - duk_del_prop_string(ctx, -1, ILibDuktape_HECI_Descriptor); - } -#endif - - duk_push_this(ctx); // [Session] - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Root); // [Session][root] - ILibDuktape_Push_ObjectStash(ctx); // [Session][root][stash] - duk_del_prop_string(ctx, -1, Duktape_GetStashKey(duk_get_heapptr(ctx, -3))); - - return(0); -} -duk_ret_t ILibDuktape_HECI_session_descriptorMetadata(duk_context *ctx) -{ - duk_push_this(ctx); // [session] - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Session_Metadata); // [session][oldVal] - duk_push_string(ctx, ", "); // [session][oldVal][newVal] - duk_string_concat(ctx, -2); duk_remove(ctx, -2); // [session][val] - duk_dup(ctx, 0); // [session][val][newVal] - duk_string_concat(ctx, -2); duk_remove(ctx, -2); // [session][newVal] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Session_Metadata); // [session] - - ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_HECI_SessionMemPtr); - if (session != NULL) - { - ILibChain_WaitHandle_UpdateMetadata(duk_ctx_chain(ctx), session->v.hEvent, (char*)Duktape_GetStringPropertyValue(ctx, -1, ILibDuktape_HECI_Session_Metadata, "heci.session")); - } - return(0); -} -duk_ret_t ILibDuktape_HECI_create(duk_context *ctx) -{ - if (ILibDuktape_HECI_Debug) { printf("\n\nILibDuktape_HECI_create()\n"); } - - duk_push_object(ctx); // [Session] - ILibDuktape_WriteID(ctx, "heci.session"); - ILibDuktape_HECI_Push(ctx, NULL); // [Session][HECI] - duk_dup(ctx, -2); // [Session][HECI][Session] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Parent); // [Session][HECI] - duk_push_this(ctx); // [session][HECI][root] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Root); // [session][HECI] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Child); // [Session] - duk_push_string(ctx, "heci.session"); duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Session_Metadata); - ILibDuktape_CreateEventWithSetterEx(ctx, "descriptorMetadata", ILibDuktape_HECI_session_descriptorMetadata); - - duk_push_this(ctx); // [Session][root] - ILibDuktape_Push_ObjectStash(ctx); // [Session][root][stash] - duk_dup(ctx, -3); // [Session][root][stash][Session] - duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); // [Session][root][stash] - duk_pop(ctx); // [Session][root] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Root); // [Session] - - ILibDuktape_EventEmitter *emitter = ILibDuktape_EventEmitter_Create(ctx); - ILibDuktape_EventEmitter_CreateEventEx(emitter, "connect"); - ILibDuktape_EventEmitter_CreateEventEx(emitter, "error"); - ILibDuktape_CreateProperty_InstanceMethod(ctx, "connect", ILibDuktape_HECI_Session_connect, DUK_VARARGS); - ILibDuktape_CreateFinalizer(ctx, ILibDuktape_HECI_SessionFinalizer); - ILibDuktape_CreateInstanceMethod(ctx, "disconnect", ILibDuktape_HECI_Session_close, 0); - return(1); -} - - -void ILibDuktape_HECI_IoctlHandler_Dispatch(void *chain, void *user) -{ - ILibDuktape_HECI_ioctl_data *data = (ILibDuktape_HECI_ioctl_data*)user; - duk_size_t count; - int i; - duk_context *ctx; - - if (!ILibMemory_CanaryOK(data) || ! ILibMemory_CanaryOK(data->reserved)) - { - // Abort Dispatch, becuase the HECI object was GC'ed. - if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_IoctlHandler_Dispatch() [ABORTED]\n"); } - if (ILibMemory_CanaryOK(data)) - { - if (ILibDuktape_HECI_Debug) { printf("...Release HECI Ioctl Data [%p]\n", (void*)data); } - ILibMemory_Free(data); - } - return; - } - - ctx = data->ctx; - duk_push_heapptr(data->ctx, data->data); // [array] - duk_push_heapptr(data->ctx, data->heciObject); // [array][heci] - duk_get_prop_index(data->ctx, -2, 2); // [array][heci][callback] - duk_swap_top(data->ctx, -2); // [array][callback][this] - count = duk_get_length(data->ctx, -3); - duk_push_int(data->ctx, data->code); // [array][callback][this][status] - duk_get_prop_index(data->ctx, -4, 1); // [array][callback][this][status][buffer] - - for (i = 3; i < (int)count; ++i) - { - duk_get_prop_index(data->ctx, -i - 2, i); // [array][callback][this][status][buffer][...args...] - } - if (duk_pcall_method(data->ctx, (duk_idx_t)count - 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(data->ctx, "heci.ioctlHandler_Dispatch.callback(): "); } - duk_pop_2(data->ctx); // ... - - duk_push_heapptr(data->ctx, data->heciObject); // [heci] - ILibDuktape_Push_ObjectStash(data->ctx); // [heci][stash] - duk_del_prop_string(data->ctx, -1, Duktape_GetStashKey(data->data)); // (This will dereference args passed to doIoctl) - duk_pop_2(ctx); // ... - if (ILibDuktape_HECI_Debug) { printf("doIoctl() [COMPLETE] -> ** Release HECI Ioctl Data [%p]\n", (void*)data); } - ILibMemory_Free(data); -} -#ifdef WIN32 -//void ILibDuktape_HECI_NextIoctl(ILibQueue q); -void ILibDuktape_HECI_NextIoctl(duk_context *ctx, void *heci); -BOOL ILibDuktape_HECI_IoctlHandler(void * chain, HANDLE h, ILibWaitHandle_ErrorStatus errors, void *user) -{ - if (!ILibMemory_CanaryOK(user)) { return(FALSE); } - - duk_context *ctx = (duk_context*)((void**)user)[0]; - int top = duk_get_top(ctx); - - duk_push_heapptr(ctx, ((void**)user)[1]); // [HECI] - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Q); // [HECI][QUEUE] - HANDLE descriptor = Duktape_GetPointerProperty(ctx, -2, ILibDuktape_HECI_Descriptor); - OVERLAPPED *p = (OVERLAPPED*)Duktape_GetBufferProperty(ctx, -2, ILibDuktape_HECI_OVERLAPPED); - DWORD bytesReceived = 0; - - if (errors == ILibWaitHandle_ErrorStatus_NONE) - { - if (GetOverlappedResult(descriptor, p, &bytesReceived, FALSE) == FALSE) { return(TRUE); } - duk_queue_deQueue(ctx, -1); // [HECI][QUEUE][OBJ] - duk_get_prop_string(ctx, -1, "callback"); // [HECI][QUEUE][OBJ][callback] - duk_get_prop_string(ctx, -1, "apply"); // [HECI][QUEUE][OBJ][callback][apply] - duk_swap_top(ctx, -2); // [HECI][QUEUE][OBJ][apply][func] - duk_dup(ctx, -5); // [HECI][QUEUE][OBJ][apply][func][this] - duk_get_prop_string(ctx, -4, "args"); // [HECI][QUEUE][OBJ][apply][func][this][args] - duk_get_prop_string(ctx, -5, "outbuffer"); // [HECI][QUEUE][OBJ][apply][func][this][args][outbuffer] - if (!duk_is_null(ctx, -1)) { duk_buffer_slice(ctx, -1, 0, bytesReceived); } // [HECI][QUEUE][OBJ][apply][func][this][args][outbuffer] - duk_array_unshift(ctx, -2); // [HECI][QUEUE][OBJ][apply][func][this][args] - duk_push_int(ctx, 0); duk_array_unshift(ctx, -2); // [HECI][QUEUE][OBJ][apply][func][this][args] - duk_pcall_method(ctx, 2); duk_pop_2(ctx); // [HECI][QUEUE] - if (!duk_queue_isEmpty(ctx, -1)) - { - ILibDuktape_HECI_NextIoctl(ctx, ((void**)user)[1]); - duk_set_top(ctx, top); - return(TRUE); - } - } - else - { - DebugBreak(); - } - duk_set_top(ctx, top); - return(FALSE); -} -void ILibDuktape_HECI_NextIoctl(duk_context *ctx, void *heci) -{ - duk_push_heapptr(ctx, heci); // [HECI] - HANDLE descriptor = (HANDLE)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_HECI_Descriptor); - OVERLAPPED *p = (OVERLAPPED*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_HECI_OVERLAPPED); - void **ptrs = (void**)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_HECI_CTX_PTRS); - - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Q); // [HECI][QUEUE] - - duk_queue_peek(ctx, -1); // [HECI][QUEUE][OBJ] - duk_size_t bufferLen = 0; - duk_size_t outBufferLen = 0; - char *buffer = Duktape_GetBufferPropertyEx(ctx, -1, "buffer", &bufferLen); - char *outBuffer = Duktape_GetBufferPropertyEx(ctx, -1, "outbuffer", &outBufferLen); - DWORD dwIoControlCode = (DWORD)Duktape_GetIntPropertyValue(ctx, -1, "code", 0); - - DeviceIoControl(descriptor, dwIoControlCode, buffer, (DWORD)bufferLen, outBuffer, (DWORD)outBufferLen, NULL, p); - ILibChain_AddWaitHandleEx(duk_ctx_chain(ctx), p->hEvent, 5000, ILibDuktape_HECI_IoctlHandler, ptrs, "heci.doIoctl()"); -} -#endif - -duk_ret_t ILibDuktape_HECI_doIoctl(duk_context *ctx) -{ - int code = duk_require_int(ctx, 0); - duk_size_t bufferLen = 0; - char *buffer = duk_is_null(ctx, 1) ? NULL : (char*)Duktape_GetBuffer(ctx, 1, &bufferLen); - int nargs = duk_get_top(ctx); - int i; - duk_size_t outBufferLen; - char *outBuffer; - int cbx; - - if (duk_is_buffer(ctx, 2) || duk_is_buffer_data(ctx, 2)) - { - outBuffer = (char*)Duktape_GetBuffer(ctx, 2, &outBufferLen); - cbx = 3; - } - else - { - outBuffer = NULL; - outBufferLen = 0; - cbx = 2; - } - -#ifdef _POSIX - if (outBuffer == NULL) - { - outBuffer = buffer; - outBufferLen = bufferLen; - } - else - { - if (bufferLen < outBufferLen) { return(ILibDuktape_Error(ctx, "HECI.doIoctl(): Output Buffer too small")); } - memcpy_s(outBuffer, outBufferLen, buffer, bufferLen); - } -#endif - - duk_require_function(ctx, cbx); // Make sure a callback function was specified - - duk_push_this(ctx); // [HECI] -#ifdef WIN32 - if (!duk_has_prop_string(ctx, -1, ILibDuktape_HECI_Descriptor)) { return(ILibDuktape_Error(ctx, "Invalid Operation. Call Reset()")); } -#endif - duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Q); // [HECI][QUEUE] - duk_push_object(ctx); // [HECI][QUEUE][OBJ] - - duk_dup(ctx, cbx); duk_put_prop_string(ctx, -2, "callback"); - duk_dup(ctx, 1); duk_put_prop_string(ctx, -2, "buffer"); - if (outBufferLen > 0) { duk_dup(ctx, 2); } else { duk_push_null(ctx); } - duk_put_prop_string(ctx, -2, "outbuffer"); - duk_push_int(ctx, code); duk_put_prop_string(ctx, -2, "code"); - void **ptrs = Duktape_PushBuffer(ctx, 2 * sizeof(void*)); duk_put_prop_string(ctx, -2, ILibDuktape_HECI_CTX_PTRS); - ptrs[0] = ctx; - ptrs[1] = duk_get_heapptr(ctx, -3); - - duk_push_array(ctx); // [HECI][QUEUE][OBJ][ARGS] - for (i = cbx + 1; i < nargs; ++i) - { - duk_dup(ctx, i); // [HECI][QUEUE][OBJ][ARGS][arg] - duk_array_push(ctx, -2); // [HECI][QUEUE][OBJ][ARGS] - } - duk_put_prop_string(ctx, -2, "args"); // [HECI][QUEUE][OBJ] - duk_queue_enQueue(ctx, -2); // [HECI][QUEUE] - if (duk_get_length(ctx, -1) == 1) - { -#ifdef WIN32 - ILibDuktape_HECI_NextIoctl(ctx, duk_get_heapptr(ctx, -2)); -#else - ILibForceUnBlockChain(duk_ctx_chain(ctx)); -#endif - } - return(0); -// -// duk_require_function(ctx, cbx); -// duk_push_this(ctx); // [heci] -// duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Q); // [heci][q] -// qptr = duk_get_heapptr(ctx, -1); -// duk_pop(ctx); // [heci] -// -// ILibDuktape_Push_ObjectStash(ctx); // [heci][stash] -// duk_push_array(ctx); // [heci][stash][array] -// ILibDuktape_HECI_ioctl_data *data; -// data = (ILibDuktape_HECI_ioctl_data*)ILibMemory_SmartAllocate(bufferLen + sizeof(ILibDuktape_HECI_ioctl_data)); -// data->ctxnonce = duk_ctx_nonce(ctx); -// if (ILibDuktape_HECI_Debug) { printf("doIoctl() -> Allocate HECI Ioctl Data [%p]\n", (void*)data); } -// data->reserved = Duktape_PushBuffer(ctx, sizeof(void*)); // [heci][stash][array][ptr] -// duk_put_prop_index(ctx, -2, 0); // [heci][stash][array] -// if (outBufferLen > 0) -// { // [heci][stash][array][buffer] -// duk_dup(ctx, 2); -// } -// else -// { -// duk_push_null(ctx); // [heci][stash][array][buffer] -// } -// -// duk_put_prop_index(ctx, -2, 1); // [heci][stash][array] -// data->ctx = ctx; -// -// duk_dup(ctx, cbx); // [heci][stash][array][callback] -// duk_put_prop_index(ctx, -2, 2); // [heci][stash][array] -// -//#ifdef WIN32 -// duk_get_prop_string(ctx, -3, ILibDuktape_HECI_IoctlWaitHandle); // [heci][stash][array][handle] -// data->v.hEvent = (HANDLE)duk_get_pointer(ctx, -1); -// duk_pop(ctx); // [heci][stash][array] -//#endif -// -// duk_get_prop_string(ctx, -3, ILibDuktape_HECI_Descriptor); // [heci][stash][array][descriptor] -//#ifdef WIN32 -// data->device = (HANDLE)duk_get_pointer(ctx, -1); -//#elif defined(_POSIX) -// data->device = duk_get_int(ctx, -1); -//#endif -// duk_pop(ctx); // [heci][stash][array] -// data->chain = Duktape_GetChain(ctx); -// data->Q = Q; -// data->code = code; -// data->outBuffer = outBuffer; -// data->outBufferLen = outBufferLen; -// data->heciObject = duk_get_heapptr(ctx, -3); -// data->bufferLen = bufferLen; -// data->data = duk_get_heapptr(ctx, -1); -// memcpy_s(data->buffer, bufferLen, buffer, bufferLen); -// -// for (i = cbx + 1; i < nargs; ++i) -// { -// duk_dup(ctx, i); // [heci][stash][array][object] -// duk_put_prop_index(ctx, -2, i-1); // [heci][stash][array] -// } -// duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); // [heci][stash] -// -// -//#ifdef WIN32 -// duk_get_prop_string(ctx, -2, ILibDuktape_HECI_ChildProcess); // [heci][stash][childProcess] -// duk_get_prop_string(ctx, -1, ILibDuktape_ChildProcess_Manager); // [heci][stash][childProcess][manager] -// data->pipeManager = (ILibProcessPipe_Manager)duk_get_pointer(ctx, -1); -// -// ILibDuktape_HECI_apc_AddIoctl((ULONG_PTR)data); -//#elif defined(_POSIX) -// ILibDuktape_HECI_AddIoctl(data); -//#endif -// -// return(0); -} - -#ifdef WIN32 -void __stdcall ILibDuktape_HECI_Finalizer2(ULONG_PTR obj) -{ - ILibQueue Q = (ILibQueue)obj; - - if (ILibQueue_IsEmpty(Q) != 0) - { - if (ILibDuktape_HECI_Debug) { printf("<== Queue: %p Destroyed in Finalizer ==>\n", (void*)Q); } - ILibQueue_Destroy(Q); - } - else - { - void *node = ILibLinkedList_GetNode_Head((void*)Q); - while (node != NULL) - { - ((ILibDuktape_HECI_ioctl_data*)ILibLinkedList_GetDataFromNode(node))->abort = 1; - node = ILibLinkedList_GetNextNode(node); - } - } -} -#endif - -duk_ret_t ILibDuktape_HECI_Finalizer(duk_context *ctx) -{ - if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_Finalizer()\n"); } -#ifdef WIN32 - HANDLE h = Duktape_GetPointerProperty(ctx, 0, ILibDuktape_HECI_Descriptor); - if (h != NULL) { CloseHandle(h); } - OVERLAPPED *p = (OVERLAPPED*)Duktape_GetBufferProperty(ctx, 0, ILibDuktape_HECI_OVERLAPPED); - if (p->hEvent != NULL) - { - ILibChain_RemoveWaitHandle(duk_ctx_chain(ctx), p->hEvent); - CloseHandle(p->hEvent); - } -#endif - - -#ifdef _POSIX - if (duk_has_prop_string(ctx, 0, ILibDuktape_HECI_ChainLink)) - { - duk_get_prop_string(ctx, 0, ILibDuktape_HECI_ChainLink); - HECI_chainLink *h = (HECI_chainLink*)duk_get_pointer(ctx, -1); - h->ctx = NULL; - h->heciObject = NULL; - if (h->link.ParentChain != NULL) { ILibChain_SafeRemove(h->link.ParentChain, h); } - } -#endif - - return(0); -} -#if !defined(WIN32) && !defined(__APPLE__) -void ILibDuktape_HECI_PreSelect(void* object, fd_set *readset, fd_set *writeset, fd_set *errorset, int* blocktime) -{ - - int result; - HECI_chainLink *h = (HECI_chainLink*)object; - //printf("h = %p, descriptor = %d, paused = %d, session = %p\n", (void*)h, h->descriptor, h->paused, (void*)h->session); - - if (h->descriptor <= 0) { return; } - if (h->paused == 0 && h->session != NULL) { FD_SET(h->descriptor, readset); } - if (h->session != NULL && ILibMemory_CanaryOK(h->session) && ILibQueue_GetCount(h->session->PendingWrites) > 0) { FD_SET(h->descriptor, writeset); } - - while (ILibQueue_GetCount(h->Q) > 0 && h->paused == 0) - { - ILibDuktape_HECI_ioctl_data *data = (ILibDuktape_HECI_ioctl_data*)ILibQueue_DeQueue(h->Q); - switch (data->code) - { - case 0x00: - break; - case 0x01: - case 0x02: - case 0x03: - result = ioctl(h->descriptor, _IOC(_IOC_READ | _IOC_WRITE, 'H', data->code, data->outBufferLen), data->outBuffer); - data->code = result ? errno : 0; - ILibDuktape_HECI_IoctlHandler_Dispatch(NULL, data); - break; - default: - break; - } - } -} -void ILibDuktape_HECI_PostSelect(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset) -{ - HECI_chainLink *h = (HECI_chainLink*)object; - if (h->descriptor <= 0) { return; } - - if (FD_ISSET(h->descriptor, readset)) - { - //printf("session = %p\n", (void*)h->session); - //printf("Attempting to read: %d bytes from %p\n", h->session->bufferSize, (void*)h->session->buffer); - int bytesRead = read(h->descriptor, h->session->buffer, h->session->bufferSize); - if (bytesRead >= 0) - { - ILibDuktape_DuplexStream_WriteData(h->session->stream, h->session->buffer, bytesRead); - } - else if(h->ctx != NULL && ILibMemory_CanaryOK(h->session)) - { - ILibDuktape_EventEmitter_SetupEmit(h->ctx, h->session->stream->ParentObject, "error"); // [emit][this][error] - duk_push_string(h->ctx, "HECI Read Error"); // [emit][this][error][msg] - duk_pcall_method(h->ctx, 2); duk_pop(h->ctx); // ... - - duk_push_heapptr(h->ctx, h->session->stream->ParentObject); // [heci] - duk_del_prop_string(h->ctx, -1, ILibDuktape_HECI_Descriptor); - duk_pop(h->ctx); // ... - - int td = h->descriptor; - h->descriptor = -1; - close(td); - } - } - if (FD_ISSET(h->descriptor, writeset)) - { - ILibDuktape_HECI_Session_WriteHandler_Process(h->session); - } -} -void ILibDuktape_HECI_Destroy(void *object) -{ - HECI_chainLink *h = (HECI_chainLink*)object; - if (h->ctx != NULL && h->heciObject != NULL) - { - duk_push_heapptr(h->ctx, h->heciObject); // [heci] - duk_del_prop_string(h->ctx, -1, ILibDuktape_HECI_ChainLink); - duk_pop(h->ctx); // ... - } - close(h->descriptor); -} -#endif - -duk_ret_t ILibDuktape_HECI_reset(duk_context *ctx) -{ - duk_push_this(ctx); -#ifdef WIN32 - if (ILibDuktape_HECI_Debug) { printf("ILibDuktape_HECI_reset()\n"); } - - HANDLE h = (HANDLE)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_HECI_Descriptor); - if (h != NULL) - { - CloseHandle(h); - } - h = ILibDuktape_HECI_windowsInit(); - duk_push_pointer(ctx, h); - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Descriptor); -#endif - return(0); -} - -void ILibDuktape_HECI_Push(duk_context *ctx, void *chain) -{ - duk_push_object(ctx); // [HECI] - ILibDuktape_WriteID(ctx, "heci"); - ILibDuktape_CreateFinalizer(ctx, ILibDuktape_HECI_Finalizer); - -#ifdef WIN32 - HANDLE h = ILibDuktape_HECI_windowsInit(); - if (h == NULL) { ILibDuktape_Error(ctx, "Error initializing HECI"); return; } - duk_push_pointer(ctx, h); // [HECI][HANDLE] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Descriptor); // [HECI] - - if (duk_peval_string(ctx, "require('child_process');") != 0) // [HECI][child_process] - { - ILibDuktape_Error(ctx, "Error instantiating dependency 'child_process'"); - return; - } - - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_ChildProcess); // [HECI] - OVERLAPPED *v = Duktape_PushBuffer(ctx, sizeof(OVERLAPPED)); // [HECI][OVERLAPPED] - v->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_OVERLAPPED); // [HECI] - void **ptrs = (void**)Duktape_PushBuffer(ctx, 2*sizeof(void*)); duk_put_prop_string(ctx, -2, ILibDuktape_HECI_CTX_PTRS); - ptrs[0] = ctx; - ptrs[1] = duk_get_heapptr(ctx, -1); - -#elif defined(_POSIX) && !defined(__APPLE__) - int h = ILibDuktape_HECI_linuxInit(); - if (h < 0) { ILibDuktape_Error(ctx, "error initializing HECI"); return; } - duk_push_int(ctx, h); // [HECI][descriptor] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Descriptor); // [HECI] - - HECI_chainLink *hlink = ILibMemory_Allocate(sizeof(HECI_chainLink), 0, NULL, NULL); - hlink->link.MetaData = "ILibDuktape_HECI"; - hlink->ctx = ctx; - hlink->descriptor = h; - hlink->link.PreSelectHandler = ILibDuktape_HECI_PreSelect; - hlink->link.PostSelectHandler = ILibDuktape_HECI_PostSelect; - hlink->link.DestroyHandler = ILibDuktape_HECI_Destroy; - duk_push_pointer(ctx, hlink); // [HECI][link] - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_ChainLink); // [HECI] - - ILibChain_SafeAdd(Duktape_GetChain(ctx), hlink); -#endif - if (chain != NULL) { ILibDuktape_CreateInstanceMethod(ctx, "create", ILibDuktape_HECI_create, 0); } - ILibDuktape_CreateInstanceMethod(ctx, "doIoctl", ILibDuktape_HECI_doIoctl, DUK_VARARGS); - ILibDuktape_CreateInstanceMethod(ctx, "disconnect", ILibDuktape_HECI_Session_close, 0); - ILibDuktape_CreateInstanceMethod(ctx, "reset", ILibDuktape_HECI_reset, 0); - - duk_queue_create(ctx); - duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Q); // [HECI] - duk_push_object(ctx); -#ifdef WIN32 - ILibDuktape_CreateReadonlyProperty_int(ctx, "HECI_VERSION", (int)(CTL_CODE(0x8000, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS))); - ILibDuktape_CreateReadonlyProperty_int(ctx, "CLIENT_CONNECT", (int)(CTL_CODE(0x8000, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS))); -#elif defined(_POSIX) - ILibDuktape_CreateReadonlyProperty_int(ctx, "HECI_VERSION", (int)0x00); - ILibDuktape_CreateReadonlyProperty_int(ctx, "CLIENT_CONNECT", (int)0x01); -#endif - - ILibDuktape_CreateReadonlyProperty(ctx, "IOCTL"); - duk_push_object(ctx); - duk_peval_string(ctx, "Buffer.from('DBA4336776047B4EB3AFBCFC29BEE7A7', 'hex');"); - ILibDuktape_CreateReadonlyProperty(ctx, "LME"); - duk_peval_string(ctx, "Buffer.from('2800F812B7B42D4BACA846E0FF65814C', 'hex');"); - ILibDuktape_CreateReadonlyProperty(ctx, "AMT"); - ILibDuktape_CreateReadonlyProperty(ctx, "GUIDS"); - -} // KLOCKWORK: We are not losing reference to created Event... It is freed in the object finalizer 'ILibDuktape_HECI_Finalizer' -void ILibDuktape_HECI_Init(duk_context *ctx) -{ - ILibDuktape_ModSearch_AddHandler(ctx, "heci", ILibDuktape_HECI_Push); -} - -#endif - diff --git a/microscript/ILibDuktape_HECI.h b/microscript/ILibDuktape_HECI.h deleted file mode 100644 index 9a361dc..0000000 --- a/microscript/ILibDuktape_HECI.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -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. -*/ - -#ifndef __DUKTAPEHECI__ -#define __DUKTAPEHECI__ - -#include "duktape.h" - -void ILibDuktape_HECI_Init(duk_context *ctx); - - -#endif diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index e2ff4f1..e424e80 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2269,6 +2269,17 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_pcall_method(ctx, 2); duk_pop(ctx); free(_identifiers); +#ifndef _NOHECI + char *_heci = ILibMemory_Allocate(57652, 0, NULL, NULL); + memcpy_s(_heci + 0, 32944, "LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgR00gPSBudWxsOw0KdmFyIHNldHVwID0gbnVsbDsNCnZhciBrZXJuZWwzMiA9IG51bGw7DQp2YXIgZHVwbGV4ID0gcmVxdWlyZSgnc3RyZWFtJykuRHVwbGV4Ow0KDQoNCmlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQp7DQogICAgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsNCiAgICBzZXR1cCA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdTZXR1cEFQSS5kbGwnKTsNCiAgICBzZXR1cC5DcmVhdGVNZXRob2QoJ1NldHVwRGlHZXRDbGFzc0RldnNBJyk7DQogICAgc2V0dXAuQ3JlYXRlTWV0aG9kKCdTZXR1cERpRW51bURldmljZUludGVyZmFjZXMnKTsNCiAgICBzZXR1cC5DcmVhdGVNZXRob2QoJ1NldHVwRGlHZXREZXZpY2VJbnRlcmZhY2VEZXRhaWxBJyk7DQogICAgc2V0dXAuQ3JlYXRlTWV0aG9kKCdTZXR1cERpRGVzdHJveURldmljZUluZm9MaXN0Jyk7DQoNCiAgICBrZXJuZWwzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsNCiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0Nsb3NlSGFuZGxlJyk7DQogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdDcmVhdGVFdmVudEEnKTsNCiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0NyZWF0ZUZpbGVBJyk7DQogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdEZXZpY2VJb0NvbnRyb2wnKTsNCiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldE92ZXJsYXBwZWRSZXN1bHQnKTsNCiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1JlYWRGaWxlJyk7DQogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdXcml0ZUZpbGUnKTsNCn0NCg0KdmFyIERJR0NGX0RFRkFVTFQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDE7ICANCnZhciBESUdDRl9QUkVTRU5UICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOw0KdmFyIERJR0NGX0FMTENMQVNTRVMgICAgICAgICAgICA9IDB4MDAwMDAwMDQ7DQp2YXIgRElHQ0ZfUFJPRklMRSAgICAgICAgICAgICAgID0gMHgwMDAwMDAwODsNCnZhciBESUdDRl9ERVZJQ0VJTlRFUkZBQ0UgICAgICAgPSAweDAwMDAwMDEwOw0KdmFyIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgICA9IDEyMjsgICAgDQp2YXIgR0VORVJJQ19SRUFEICAgICAgICAgICAgICAgID0gMHg4MDAwMDAwMDsNCnZhciBHRU5FUklDX1dSSVRFICAgICAgICAgICAgICAgPSAweDQwMDAwMDAwOw0KdmFyIEZJTEVfU0hBUkVfUkVBRCAgICAgICAgICAgICA9IDB4MDAwMDAwMDE7ICANCnZhciBGSUxFX1NIQVJFX1dSSVRFICAgICAgICAgICAgPSAweDAwMDAwMDAyOyAgDQp2YXIgT1BFTl9FWElTVElORyAgICAgICAgICAgICAgID0gMzsNCnZhciBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCAgICAgICAgPSAweDQwMDAwMDAwOw0KdmFyIEVSUk9SX0lPX1BFTkRJTkcgICAgICAgICAgICA9IDk5NzsNCg0KZnVuY3Rpb24gaGVjaV9jcmVhdGUoKQ0Kew0KICAgIHZhciByZXQgPSBuZXcgZHVwbGV4KA0KICAgIHsNCiAgICAgICAgJ3dyaXRlJzogZnVuY3Rpb24gKGNodW5rLCBmbHVzaCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IHRoaXMuTWF4QnVmZmVyU2l6ZSkgeyB0aHJvdyAoJ0J1ZmZlciB0b28gbGFyZ2UnKTsgfQ0KICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fd3JpdGVvdmVybGFwcGVkID09IG51bGwpIHsgdGhyb3cgKCdOb3QgQ29ubmVjdGVkJyk7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMudW5zaGlmdCh7IGJ1ZmZlcjogY2h1bmssIGZsdXNoOiBmbHVzaCB9KTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdXcml0ZXMubGVuZ3RoID09IDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgLy8gS2lja3N0YXJ0IHRoZSB3cml0ZQ0KICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZSgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICAnZmluYWwnOiBmdW5jdGlvbiAoZmx1c2gpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgIH0sDQogICAgICAgICdyZWFkJzogZnVuY3Rpb24oc2l6ZSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCF0aGlzLl9yZWFkYnVmZmVyKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRidWZmZXIgPSBwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyBHTS5DcmVhdGVWYXJpYWJsZSh0aGlzLk1heEJ1ZmZlclNpemUpIDogQnVmZmVyLmFsbG9jKHRoaXMuTWF4QnVmZmVyU2l6ZSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1JlYWQoKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBrZXJuZWwzMi5SZWFkRmlsZSh0aGlzLl9kZXNjcmlwdG9yLCB0aGlzLl9yZWFkYnVmZmVyLCB0aGlzLl9yZWFkYnVmZmVyLl9zaXplLCAwLCB0aGlzLl9yZWFkb3ZlcmxhcHBlZCk7DQogICAgICAgICAgICBpZihyZXN1bHQuVmFsICE9IDAgfHwgcmVzdWx0Ll9MYXN0RXJyb3IgPT0gRVJST1JfSU9fUEVORElORykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZighdGhpcy5fckRlc2NyaXB0b3JFdmVudCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JEZXNjcmlwdG9yRXZlbnQgPSByZXF1aXJlKCdEZXNjcmlwdG9yRXZlbnRzJykuYWRkRGVzY3JpcHRvcih0aGlzLl9yZWFkb3ZlcmxhcHBlZC5oRXZlbnQsIHsgbWV0YWRhdGE6ICdoZWNpLnNlc3Npb24gW3JlYWRdJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fckRlc2NyaXB0b3JFdmVudC5zZXNzaW9uID0gdGhpczsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fckRlc2NyaXB0b3JFdmVudC5vbignc2lnbmFsZWQnLCBmdW5jdGlvbiAoc3RhdHVzKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMgIT0gJ05PTkUnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbzMoJz4+PiBoZWNpLnNlc3Npb24gc2lnbmFsZWQgd2l0aCBzdGF0dXM6ICcgKyBzdGF0dXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5wdXNoKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlc1JlYWQgPSBHTS5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigocmVzdWx0PWtlcm5lbDMyLkdldE92ZXJsYXBwZWRSZXN1bHQodGhpcy5zZXNzaW9uLl9kZXNjcmlwdG9yLCB0aGlzLnNlc3Npb24uX3JlYWRvdmVybGFwcGVkLCBieXRlc1JlYWQsIDApKS5WYWwgIT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5zZXNzaW9uLl9yZWFkYnVmZmVyLnRvQnVmZmVyKCkuc2xpY2UoMCwgYnl0ZXNSZWFkLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbzMoYnVmZmVyLmxlbmd0aCArICcgYnl0ZXMgUkVBRCcpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHB1c2hSZXN1bHQgPSB0aGlzLnNlc3Npb24ucHVzaChidWZmZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uX29wdGlvbnMubm9QaXBlbGluZSAhPSAwICYmIHRoaXMuc2Vzc2lvbi5fcGVuZGluZ1dyaXRlcy5sZW5ndGg+MCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVubG9jayBhIHdyaXRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbzIoJ3BlbmRpbmdXcml0ZUNvdW50OiAnICsgdGhpcy5zZXNzaW9uLl9wZW5kaW5nV3JpdGVzLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5zZXNzaW9uLl9wZW5kaW5nV3JpdGVzLnBvcCgpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uX3BlbmRpbmdXcml0ZXMubGVuZ3RoID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLl9wcm9jZXNzV3JpdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbzIoJ1dyaXRlL0ZsdXNoJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmZsdXNoKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHVzaFJlc3VsdCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiByZWFkIG1vcmUsIGJlY2F1c2UgZGF0YSBpcyBzdGlsbCBmbG93aW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBrZXJuZWwzMi5SZWFkRmlsZSh0aGlzLnNlc3Npb24uX2Rlc2NyaXB0b3IsIHRoaXMuc2Vzc2lvbi5fcmVhZGJ1ZmZlciwgdGhpcy5zZXNzaW9uLl9yZWFkYnVmZmVyLl9zaXplLCAwLCB0aGlzLnNlc3Npb24uX3JlYWRvdmVybGFwcGVkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzdWx0LlZhbCAhPSAwIHx8IHJlc3VsdC5fTGFzdEVycm9yID09IEVSUk9SX0lPX1BFTkRJTkcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCdTb21ldHlwZSBvZiBlcnJvcjogJyArIHJlc3VsdC5fTGFzdEVycm9yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5wdXNoKG51bGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbzEoJ1JFQURfT1ZFUkxBUFBFRF9FUlJPUjogJyArIHJlc3VsdC5fTGFzdEVycm9yICsgJyBvbiAnICsgdGhpcy5zZXNzaW9uLl9oYXNoQ29kZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnU29tZSBPdGhlciBFcnJvcjogJyArIHJlc3VsdC5fTGFzdEVycm9yKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJldC5fT2JqZWN0SUQgPSAnaGVjaS5zZXNzaW9uJzsNCiAgICByZXQuYnVmZmVyTW9kZSA9IDE7DQogICAgcmV0Ll9pb2N0bHMgPSBbXTsNCiAgICByZXQuX3BlbmRpbmdXcml0ZXMgPSBbXTsNCiAgICByZXQuaGVjaVBhcmVudCA9IHRoaXM7DQoNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgIC5jcmVhdGVFdmVudCgnY29ubmVjdCcpDQogICAgICAgIC5jcmVhdGVFdmVudCgnZXJyb3InKQ0KICAgICAgICAuYWRkTWV0aG9kKCdjb25uZWN0JywgZnVuY3Rpb24gX2Nvbm5lY3QoZ3VpZCwgb3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnY29ubmVjdCgpJyk7DQogICAgICAgICAgICB0aGlzLmRvSW9jdGwodGhpcy5oZWNpUGFyZW50LklPQ1RMLkNMSUVOVF9DT05ORUNULCBndWlkLCBCdWZmZXIuYWxsb2MoMTYpLCBmdW5jdGlvbiBfb25jb25uZWN0KHN0YXR1cywgYnVmZmVyLCBvcHQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYoc3RhdHVzIT0wKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnSEVDSSBDb25uZWN0aW9uIEVycm9yIFsnICsgdGhpcy5MYXN0RXJyb3IgKyAnXScpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgJ0hFQ0kgQ29ubmVjdGlvbiBFcnJvciBbJyArIHRoaXMuTGFzdEVycm9yICsgJ10nKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZihidWZmZXIubGVuZ3RoIDw9NCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgUmVzcG9uc2UNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsICdIRUNJIENvbm5lY3Rpb24gRXJyb3IgW0lOVkFMSUQgUkVTUE9OU0VdJyk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJNYXhCdWZmZXJTaXplIiwgeyB2YWx1ZTogYnVmZmVyLnJlYWRVSW50MzJMRSgpIH0pOw0KICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHQ7DQoNCiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZG92ZXJsYXBwZWQgPSBHTS5DcmVhdGVWYXJpYWJsZShHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gMzIgOiAyMCk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlb3ZlcmxhcHBlZCA9IEdNLkNyZWF0ZVZhcmlhYmxlKEdNLlBvaW50ZXJTaXplID09IDggPyAzMiA6IDIwKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZG92ZXJsYXBwZWQuaEV2ZW50ID0ga2VybmVsMzIuQ3JlYXRlRXZlbnRBKDAsIDEsIDAsIDApOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl93cml0ZW92ZXJsYXBwZWQuaEV2ZW50ID0ga2VybmVsMzIuQ3JlYXRlRXZlbnRBKDAsIDEsIDAsIDApOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkb3ZlcmxhcHBlZC5oRXZlbnQucG9pbnRlckJ1ZmZlcigpLmNvcHkodGhpcy5fcmVhZG92ZXJsYXBwZWQuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gOCA/IDI0IDogMTYsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVvdmVybGFwcGVkLmhFdmVudC5wb2ludGVyQnVmZmVyKCkuY29weSh0aGlzLl93cml0ZW92ZXJsYXBwZWQuRGVyZWYoR00uUG9pbnRlclNpemUgPT0gOCA/IDI0IDogMTYsIEdNLlBvaW50ZXJTaXplKS50b0J1ZmZlcigpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnQ29ubmVjdGVkLCBidWZmZXIgc2l6ZTogJyArIHRoaXMuTWF4QnVmZmVyU2l6ZSk7DQogICAgICAgICAgICAgICAgdGhpcy5fcmVhZCh0aGlzLk1heEJ1ZmZlclNpemUpOw0KICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcpOw0KICAgICAgICAgICAgfSwgb3B0aW9ucyk7DQogICAgICAgIH0pDQogICAgICAgIC5hZGRNZXRob2QoJ2Rlc2NyaXB0b3JQYXRoJywgZnVuY3Rpb24gX2Rlc2NyaXB0b3JQYXRoKCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZGV2L21laScpKSB7IHJldHVybiAoJy9kZXYvbWVpJyk7IH0NCiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZGV2L21laTAnKSkgeyByZXR1cm4gKCcvZGV2L21laTAnKTsgfQ0KICAgICAgICAgICAgICAgIHRocm93ICgnSEVDSSBub3Qgc3VwcG9ydGVkJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnd2luMzInKSB7IHRocm93ICgnSEVDSSBub3Qgc3VwcG9ydGVkJyk7IH0NCg0KICAgICAgICAgICAgdmFyIHJlc3VsdDsNCiAgICAgICAgICAgIHZhciBpaTsNCiAgICAgICAgICAgIHZhciBkZXZpY2VEZXRhaWw7DQogICAgICAgICAgICB2YXIgYnVmZmVyU2l6ZSA9IEdNLkNyZWF0ZVZhcmlhYmxlKDQpOyAgLy8gRFdPUkQNCiAgICAgICAgICAgIHZhciBoZWNpZ3VpZCA9IEdNLkNyZWF0ZVZhcmlhYmxlKHRoaXMuaGVjaVBhcmVudC5HVUlEUy5IRUNJKTsNCiAgICAgICAgICAgIHZhciBkZXZpY2VJbmZvID0gc2V0dXAuU2V0dXBEaUdldENsYXNzRGV2c0EoaGVjaWd1aWQsIDAsIDAsIERJR0NGX1BSRVNFTlQgfCBESUdDRl9ERVZJQ0VJTlRFUkZBQ0UpOw0KICAgICAgICAgICAgaWYgKGRldmljZUluZm8uVmFsID09IC0xKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbzEoJy4uLiBVbmFibGUgdG8gYWNxdWlyZSBbZGV2aWNlSW5mb10nKTsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3VuYWJsZSB0byBhY3F1aXJlIFtkZXZpY2VJbmZvXScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnLi4uIGFjcXVpcmVkIFtkZXZpY2VJbmZvXScpOw0KDQoNCiAgICAgICAgICAgIHZhciBpbnRlcmZhY2VEYXRhID0gR00uQ3JlYXRlVmFyaWFibGUoR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMjgpOw0KICAgICAgICAgICAgaW50ZXJmYWNlRGF0YS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoaW50ZXJmYWNlRGF0YS5fc2l6ZSwgMCk7DQoNCiAgICAgICAgICAgIGZvciAoaWkgPSAwOyBzZXR1cC5TZXR1cERpRW51bURldmljZUludGVyZmFjZXMoZGV2aWNlSW5mbywgMCwgaGVjaWd1aWQsIGlpLCBpbnRlcmZhY2VEYXRhKS5WYWwgIT0gMDsgKytpaSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvLyBGb3VuZCBvdXIgZGV2aWNlIGluc3RhbmNlDQogICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgPSBzZXR1cC5TZXR1cERpR2V0RGV2aWNlSW50ZXJmYWNlRGV0YWlsQShkZXZpY2VJbmZvLCBpbnRlcmZhY2VEYXRhLCAwLCAwLCBidWZmZXJTaXplLCAwKSkuVmFsID09IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Ll9MYXN0RXJyb3IgIT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIGJpZyBlbm91Z2ggYnVmZmVyIHRvIGdldCBkZXRhaWwgZGF0YQ0KICAgICAgICAgICAgICAgIGRldmljZURldGFpbCA9IEdNLkNyZWF0ZVZhcmlhYmxlKGJ1ZmZlclNpemUudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSk7DQogICAgICAgICAgICAgICAgZGV2aWNlRGV0YWlsLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRShHTS5Qb2ludGVyU2l6ZSA9PSA4ID8gOCA6IDUsIDApOw0KDQogICAgICAgICAgICAgICAgLy8gVHJ5IGFnYWluIHRvIGdldCB0aGUgZGV2aWNlIGludGVyZmFjZSBkZXRhaWwgaW5mbw0KICAgICAgICAgICAgICAgIGlmIChzZXR1cC5TZXR1cERpR2V0RGV2aWNlSW50ZXJmYWNlRGV0YWlsQShkZXZpY2VJbmZvLCBpbnRlcmZhY2VEYXRhLCBkZXZpY2VEZXRhaWwsIGJ1ZmZlclNpemUsIDAsIDApLlZhbCA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZGV2aWNlRGV0YWlsID0gTlVMTDsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0dXAuU2V0dXBEaURlc3Ryb3lEZXZpY2VJbmZvTGlzdChkZXZpY2VJbmZvKTsNCiAgICAgICAgICAgIGlmIChkZXZpY2VEZXRhaWwgPT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8xKCcuLi4gZmFpbGVkIHRvIGFjcXVpcmUgW2RldmljZURldGFpbF0nKTsNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3VuYWJsZSB0byBhY3F1aXJlIFtkZXZpY2VEZXRhaWxdJyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBkZXZQYXRoID0gZGV2aWNlRGV0YWlsLkRlcmVmKDQsIEdNLlBvaW50ZXJTaXplKTsNCiAgICAgICAgICAgIHJldHVybiAoZGV2UGF0aC5TdHJpbmcpOw0KICAgICAgICB9KQ0KICAgICAgICAuYWRkTWV0aG9kKCdjcmVhdGVEZXNjcmlwdG9yJywgZnVuY3Rpb24gX2NyZWF0ZURlc2NyaXB0b3IocGF0aCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHJlcXVpcmUoJ2ZzJykub3BlblN5bmMocGF0aCwgcmVxdWlyZSgnZnMnKS5jb25zdGFudHMuT19SRFdSIHwgcmVxdWlyZSgnZnMnKS5jb25zdGFudHMuT19OT05CTE9DSykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgeyB0aHJvdyAoJ0hFQ0kgbm90IHN1cHBvcnRlZCcpOyB9DQoNCiAgICAgICAgICAgIHZhciBkZXZQYXRoID0gR00uQ3JlYXRlVmFyaWFibGUo", 16000); + memcpy_s(_heci + 16000, 16944, "cGF0aCk7DQogICAgICAgICAgICB2YXIgcmV0ID0ga2VybmVsMzIuQ3JlYXRlRmlsZUEoZGV2UGF0aCwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgMCwgT1BFTl9FWElTVElORywgRklMRV9GTEFHX09WRVJMQVBQRUQsIDApOw0KICAgICAgICAgICAgaWYgKHJldC5WYWwgPT0gLTEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnLi4uIGZhaWxlZCB0byBhY3F1aXJlIFtkZXNjcmlwdG9yXScpOw0KICAgICAgICAgICAgICAgIHRocm93ICgnZmFpbGVkIHRvIGFjcXVpcmUgZGVzY3JpcHRvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnLi4uIGFjcXVpcmVkIFtERVNDUklQVE9SXScpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9KTsNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgcmV0Ll9vdmVybGFwcGVkID0gR00uQ3JlYXRlVmFyaWFibGUoR00uUG9pbnRlclNpemUgPT0gOCA/IDMyIDogMjApOw0KICAgICAgICByZXQuX292ZXJsYXBwZWQuaEV2ZW50ID0ga2VybmVsMzIuQ3JlYXRlRXZlbnRBKDAsIDEsIDAsIDApOw0KDQogICAgICAgIHZhciBvdmVybGFwcGVkX2V2ZW50cHRyID0gcmV0Ll9vdmVybGFwcGVkLkRlcmVmKEdNLlBvaW50ZXJTaXplID09IDggPyAyNCA6IDE2LCBHTS5Qb2ludGVyU2l6ZSkudG9CdWZmZXIoKTsNCiAgICAgICAgcmV0Ll9vdmVybGFwcGVkLmhFdmVudC5wb2ludGVyQnVmZmVyKCkuY29weShvdmVybGFwcGVkX2V2ZW50cHRyKTsNCiAgICB9DQogICAgcmV0LmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiBkaXNjb25uZWN0KCkNCiAgICB7DQogICAgICAgIC8vIENsZWFuIHVwIGFsbCBIYW5kbGVzIGFuZCBEZXNjcmlwdG9ycw0KICAgICAgICBjb25zb2xlLmluZm8xKCdESVNDT05ORUNUIG9uICcgKyB0aGlzLl9oYXNoQ29kZSgpKTsNCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYodGhpcy5fZGVzY3JpcHRvciAhPSBudWxsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5yZW1vdmVEZXNjcmlwdG9yKHRoaXMuX2Rlc2NyaXB0b3IpOw0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykuY2xvc2VTeW5jKHRoaXMuX2Rlc2NyaXB0b3IpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2Rlc2NyaXB0b3IgPSBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgLy8NCiAgICAgICAgICAgIC8vIGRvSW9jdGwoKSANCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICBpZiAodGhpcy5fZGVzY3JpcHRvckV2ZW50KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGFwcGVkKSB7IHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5yZW1vdmVEZXNjcmlwdG9yKHRoaXMuX292ZXJsYXBwZWQuaEV2ZW50KTsgfQ0KICAgICAgICAgICAgICAgIHRoaXMuX2Rlc2NyaXB0b3JFdmVudCA9IG51bGw7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxhcHBlZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBrZXJuZWwzMi5DbG9zZUhhbmRsZSh0aGlzLl9vdmVybGFwcGVkLmhFdmVudCk7DQogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxhcHBlZCA9IG51bGw7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vDQogICAgICAgICAgICAvLyBSZWFkDQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgaWYgKHRoaXMuX3JEZXNjcmlwdG9yRXZlbnQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWRvdmVybGFwcGVkKSB7IHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5yZW1vdmVEZXNjcmlwdG9yKHRoaXMuX3JlYWRvdmVybGFwcGVkLmhFdmVudCk7IH0NCiAgICAgICAgICAgICAgICB0aGlzLl9yRGVzY3JpcHRvckV2ZW50ID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLl9yZWFkb3ZlcmxhcHBlZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBrZXJuZWwzMi5DbG9zZUhhbmRsZSh0aGlzLl9yZWFkb3ZlcmxhcHBlZC5oRXZlbnQpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRvdmVybGFwcGVkID0gbnVsbDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8NCiAgICAgICAgICAgIC8vIFdyaXRlDQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgaWYgKHRoaXMuX3dEZXNjcmlwdG9yRXZlbnQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3dyaXRlb3ZlcmxhcHBlZCkgeyByZXF1aXJlKCdEZXNjcmlwdG9yRXZlbnRzJykucmVtb3ZlRGVzY3JpcHRvcih0aGlzLl93cml0ZW92ZXJsYXBwZWQuaEV2ZW50KTsgfQ0KICAgICAgICAgICAgICAgIHRoaXMuX3dEZXNjcmlwdG9yRXZlbnQgPSBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMuX3dyaXRlb3ZlcmxhcHBlZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBrZXJuZWwzMi5DbG9zZUhhbmRsZSh0aGlzLl93cml0ZW92ZXJsYXBwZWQuaEV2ZW50KTsNCiAgICAgICAgICAgICAgICB0aGlzLl93cml0ZW92ZXJsYXBwZWQgPSBudWxsOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLw0KICAgICAgICAgICAgLy8gSEVDSQ0KICAgICAgICAgICAgLy8NCiAgICAgICAgICAgIGlmICh0aGlzLl9kZXNjcmlwdG9yKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGtlcm5lbDMyLkNsb3NlSGFuZGxlKHRoaXMuX2Rlc2NyaXB0b3IpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2Rlc2NyaXB0b3IgPSBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfTsNCiAgICByZXQuZG9Jb2N0bCA9IGZ1bmN0aW9uIGRvSW9jdGwoY29kZSwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgY2FsbGJhY2spDQogICAgew0KICAgICAgICBpZiAodHlwZW9mIChjYWxsYmFjaykgIT0gJ2Z1bmN0aW9uJykgeyB0aHJvdyAoJ0NhbGxiYWNrIG5vdCBzcGVjaWZpZWQnKTsgfQ0KDQogICAgICAgIHZhciBpOw0KICAgICAgICB2YXIgcGFybXMgPSBbXTsNCiAgICAgICAgZm9yIChpID0gNDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkNCiAgICAgICAgew0KICAgICAgICAgICAgcGFybXMucHVzaChhcmd1bWVudHNbaV0pOw0KICAgICAgICB9DQoNCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLmxlbmd0aCA8IGlucHV0QnVmZmVyLmxlbmd0aCkgeyB0aHJvdyAoJ291dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsJyk7IH0NCiAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5maWxsKDApOw0KICAgICAgICAgICAgaW5wdXRCdWZmZXIuY29weShvdXRwdXRCdWZmZXIpOw0KICAgICAgICAgICAgaWYgKHRoaXMuX2Rlc2NyaXB0b3IgPT0gbnVsbCkgeyB0aGlzLl9kZXNjcmlwdG9yID0gdGhpcy5jcmVhdGVEZXNjcmlwdG9yKHRoaXMuZGVzY3JpcHRvclBhdGgoKSk7IH0NCiAgICAgICAgICAgIHZhciByZXQgPSByZXF1aXJlKCdpb2N0bCcpKHRoaXMuX2Rlc2NyaXB0b3IsIGNvZGUsIG91dHB1dEJ1ZmZlcik7DQogICAgICAgICAgICBwYXJtcy51bnNoaWZ0KG91dHB1dEJ1ZmZlcik7DQogICAgICAgICAgICBwYXJtcy51bnNoaWZ0KHJldCk7DQogICAgICAgICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBwYXJtcyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLl9pb2N0bHMudW5zaGlmdCh7IGNvZGU6IGNvZGUsIGlucHV0OiBpbnB1dEJ1ZmZlciwgb3V0cHV0OiBvdXRwdXRCdWZmZXIsIGNhbGxiYWNrOiBjYWxsYmFjaywgcGFybXM6IHBhcm1zIH0pOw0KICAgICAgICBpZih0aGlzLl9pb2N0bHMubGVuZ3RoID09IDEpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEZpcnN0IElPQ1RMLCBzbyB3ZSBuZWVkIHRvIHNlbmQgdGhlIGZpcnN0IG9uZQ0KICAgICAgICAgICAgdGhpcy5fc2VuZCh0aGlzLl9pb2N0bHMucGVlaygpKTsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICByZXQuX3NlbmQgPSBmdW5jdGlvbiBfc2VuZChvcHRpb25zKQ0KICAgIHsNCiAgICAgICAgaWYodGhpcy5fZGVzY3JpcHRvciA9PSBudWxsKSANCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRvciA9IHRoaXMuY3JlYXRlRGVzY3JpcHRvcih0aGlzLmRlc2NyaXB0b3JQYXRoKCkpOyANCiAgICAgICAgICAgIHRoaXMuX2Rlc2NyaXB0b3JFdmVudCA9IHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5hZGREZXNjcmlwdG9yKHRoaXMuX292ZXJsYXBwZWQuaEV2ZW50LCB7bWV0YWRhdGE6ICdoZWNpJ30pOw0KICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRvckV2ZW50LnNlc3Npb24gPSB0aGlzOw0KICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRvckV2ZW50Lm9uKCdzaWduYWxlZCcsIGZ1bmN0aW9uKHN0YXR1cykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuc2Vzc2lvbi5faW9jdGxzLnBvcCgpOw0KICAgICAgICAgICAgICAgIGlmKHN0YXR1cyA9PSAnTk9ORScpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZXNSZWFkID0gR00uQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBrZXJuZWwzMi5HZXRPdmVybGFwcGVkUmVzdWx0KHRoaXMuc2Vzc2lvbi5fZGVzY3JpcHRvciwgdGhpcy5zZXNzaW9uLl9vdmVybGFwcGVkLCBieXRlc1JlYWQsIDApOw0KICAgICAgICAgICAgICAgICAgICBpZihyZXN1bHQuVmFsICE9IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvdXQgPSBkYXRhLm91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5zbGljZSgwLGJ5dGVzUmVhZC50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucGFybXMudW5zaGlmdChvdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wYXJtcy51bnNoaWZ0KDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLkxhc3RFcnJvciA9ICdOT05FJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucGFybXMudW5zaGlmdChudWxsKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucGFybXMudW5zaGlmdCgxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5MYXN0RXJyb3IgPSAnT1ZFUkxBUFBFRF9FUlJPUjogJyArIHJlc3VsdC5fTGFzdEVycm9yOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGRhdGEucGFybXMudW5zaGlmdChudWxsKTsNCiAgICAgICAgICAgICAgICAgICAgZGF0YS5wYXJtcy51bnNoaWZ0KDEpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uTGFzdEVycm9yID0gc3RhdHVzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGRhdGEuY2FsbGJhY2suYXBwbHkodGhpcy5zZXNzaW9uLCBkYXRhLnBhcm1zKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2godWUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZih0aGlzLnNlc3Npb24uX2lvY3Rscy5sZW5ndGggPiAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gU3RpbGwgbW9yZSBJT0NUTHMgdG8gc2VuZA0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uX3NlbmQodGhpcy5zZXNzaW9uLl9pb2N0bHMucGVlaygpKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBrZXJuZWwzMi5EZXZpY2VJb0NvbnRyb2wodGhpcy5fZGVzY3JpcHRvciwgb3B0aW9ucy5jb2RlLCBHTS5DcmVhdGVWYXJpYWJsZShvcHRpb25zLmlucHV0KSwgb3B0aW9ucy5pbnB1dC5sZW5ndGgsIEdNLkNyZWF0ZVZhcmlhYmxlKG9wdGlvbnMub3V0cHV0KSwgb3B0aW9ucy5vdXRwdXQubGVuZ3RoLCAwLCB0aGlzLl9vdmVybGFwcGVkKTsNCiAgICB9Ow0KICAgIHJldC5fcHJvY2Vzc1dyaXRlID0gZnVuY3Rpb24gX3Byb2Nlc3NXcml0ZSgpDQogICAgew0KICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLl9wZW5kaW5nV3JpdGVzLnBlZWsoKTsNCiAgICAgICAgY29uc29sZS5pbmZvMygnX1dSSVRJTkc6ICcgKyBjaHVuay5idWZmZXIubGVuZ3RoICsgJyBieXRlcycgKyAnIG9uICcgKyB0aGlzLl9oYXNoQ29kZSgpKTsNCg0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmVzdWx0ID0ga2VybmVsMzIuV3JpdGVGaWxlKHRoaXMuX2Rlc2NyaXB0b3IsIEdNLkNyZWF0ZVZhcmlhYmxlKGNodW5rLmJ1ZmZlciksIGNodW5rLmJ1ZmZlci5sZW5ndGgsIDAsIHRoaXMuX3dyaXRlb3ZlcmxhcHBlZCk7DQogICAgICAgICAgICBpZiAocmVzdWx0LlZhbCAhPSAwIHx8IHJlc3VsdC5fTGFzdEVycm9yID09IEVSUk9SX0lPX1BFTkRJTkcpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl93RGVzY3JpcHRvckV2ZW50KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd0Rlc2NyaXB0b3JFdmVudCA9IHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5hZGREZXNjcmlwdG9yKHRoaXMuX3dyaXRlb3ZlcmxhcHBlZC5oRXZlbnQsIHsgbWV0YWRhdGE6ICdoZWNpLnNlc3Npb24gW3dyaXRlXScgfSk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3dEZXNjcmlwdG9yRXZlbnQuc2Vzc2lvbiA9IHRoaXM7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3dEZXNjcmlwdG9yRXZlbnQub24oJ3NpZ25hbGVkJywgdGhpcy5fcHJvY2Vzc1dyaXRlX3NpZ25hbGVkKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMSgnV3JpdGUgRXJyb3I6ICcgKyByZXN1bHQuX0xhc3RFcnJvcik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXF1aXJlKCdmcycpLndyaXRlKHRoaXMuX2Rlc2NyaXB0b3IsIGNodW5rLmJ1ZmZlciwgdGhpcy5fcHJvY2Vzc1dyaXRlX2xpbnV4X3NpZ25hbGVkLCB7IG1ldGFkYXRhOiAnaGVjaS5zZXNzaW9uJywgc2Vzc2lvbjogdGhpcyB9KTsNCiAgICB9Ow0KICAgIHJldC5fcHJvY2Vzc1dyaXRlX2xpbnV4X3NpZ25hbGVkID0gZnVuY3Rpb24gX3Byb2Nlc3NXcml0ZV9saW51eF9zaWduYWxlZChzdGF0dXMsIGJ5dGVzV3JpdHRlbiwgYnVmZmVyLCBvcHRpb25zKQ0KICAgIHsNCiAgICAgICAgaWYoc3RhdHVzID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUuaW5mbzMoYnl0ZXNXcml0dGVuICsgJyBieXRlcyB3cml0dGVuJyk7DQogICAgICAgICAgICBjb25zb2xlLmluZm8zKCdub1BpcGVsaW5lID0gJyArIG9wdGlvbnMuc2Vzc2lvbi5fb3B0aW9ucy5ub1BpcGVsaW5lLCBvcHRpb25zLnNlc3Npb24uX3BlbmRpbmdXcml0ZXMubGVuZ3RoKTsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLnNlc3Npb24uX29wdGlvbnMubm9QaXBlbGluZSA9PSBudWxsIHx8IG9wdGlvbnMuc2Vzc2lvbi5fb3B0aW9ucy5ub1BpcGVsaW5lID09IGZhbHNlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBpdGVtID0gb3B0aW9ucy5zZXNzaW9uLl9wZW5kaW5nV3JpdGVzLnBvcCgpOw0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNlc3Npb24uX3BlbmRpbmdXcml0ZXMubGVuZ3RoID4gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2Vzc2lvbi5fcHJvY2Vzc1dyaXRlKCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbzMoJ1dyaXRlL0ZsdXNoJyk7DQogICAgICAgICAgICAgICAgICAgIGl0ZW0uZmx1c2goKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9Ow0KICAgIHJldC5fcHJvY2Vzc1dyaXRlX3NpZ25hbGVkID0gZnVuY3Rpb24gX3Byb2Nlc3NXcml0ZV9zaWduYWxlZChzdGF0dXMpDQogICAgew0KICAgICAgICBjb25zb2xlLmluZm8zKCdXcml0ZSBTaWduYWxlZDogJyArIHN0YXR1cyk7DQogICAgICAgIGlmKHN0YXR1cyA9PSAnTk9ORScpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIE5vIEVycm9ycw0KICAgICAgICAgICAgdmFyIGJ5dGVzV3JpdHRlbiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDQpOw0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGtlcm5lbDMyLkdldE92ZXJsYXBwZWRSZXN1bHQodGhpcy5zZXNzaW9uLl9kZXNjcmlwdG9yLCB0aGlzLnNlc3Npb24uX3dyaXRlb3ZlcmxhcHBlZCwgYnl0ZXNXcml0dGVuLCAwKTsNCiAgICAgICAgICAgIGlmKHJlc3VsdC5WYWwgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8zKGJ5dGVzV3JpdHRlbi50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpICsgJyBieXRlcyB3cml0dGVuJyk7DQogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMygnbm9QaXBlbGluZSA9ICcgKyB0aGlzLnNlc3Npb24uX29wdGlvbnMubm9QaXBlbGluZSwgdGhpcy5zZXNzaW9uLl9wZW5kaW5nV3JpdGVzLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgaWYodGhpcy5zZXNzaW9uLl9vcHRpb25zLm5vUGlwZWxpbmU9PW51bGwgfHwgdGhpcy5zZXNzaW9uLl9vcHRpb25zLm5vUGlwZWxpbmUgPT0gZmFsc2UpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuc2Vzc2lvbi5fcGVuZGluZ1dyaXRlcy5wb3AoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5fcGVuZGluZ1dyaXRlcy5sZW5ndGggPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uX3Byb2Nlc3NXcml0ZSgpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvMygnV3JpdGUvRmx1c2gnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZmx1c2goKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH07DQogICAgcmV0Ll9wcm9jZXNzUmVhZF9yZWFkU2V0X3NpbmsgPSBmdW5jdGlvbiBfcHJvY2Vzc1JlYWRfcmVhZFNldF9zaW5rKHN0YXR1cywgYnl0ZXNSZWFkLCBidWZmZXIsIG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsgb3B0aW9ucy5zZXNzaW9uLnB1c2gobnVsbCk7IHJldHVybjsgfQ0KICAgICAgICBjb25zb2xlLmluZm8zKGJ5dGVzUmVhZCArICcgYnl0ZXMgcmVhZCcpOw0KDQogICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCBieXRlc1JlYWQpOw0KICAgICAgICB2YXIgcHVzaFJlc3VsdCA9IG9wdGlvbnMuc2Vzc2lvbi5wdXNoKGJ1ZmZlcik7DQogICAgICAgIGlmIChvcHRpb25zLnNlc3Npb24uX29wdGlvbnMubm9QaXBlbGluZSAhPSAwICYmIG9wdGlvbnMuc2Vzc2lvbi5fcGVuZGluZ1dyaXRlcy5sZW5ndGggPiAwKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBVbmxvY2sgYSB3cml0ZQ0KICAgICAgICAgICAgY29uc29sZS5pbmZvMygncGVuZGluZ1dyaXRlQ291bnQ6ICcgKyBvcHRpb25zLnNlc3Npb24uX3BlbmRpbmdXcml0ZXMubGVuZ3RoKTsNCiAgICAgICAgICAgIHZhciBpdGVtID0gb3B0aW9ucy5zZXNzaW9uLl9wZW5kaW5nV3JpdGVzLnBvcCgpOw0KDQogICAgICAgICAgICBpZiAob3B0aW9ucy5zZXNzaW9uLl9wZW5kaW5nV3JpdGVzLmxlbmd0aCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3B0aW9ucy5zZXNzaW9uLl9wcm9jZXNzV3JpdGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8zKCdXcml0ZS9GbHVzaCcpOw0KICAgICAgICAgICAgICAgIGl0ZW0uZmx1c2goKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChwdXNoUmVzdWx0KQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBXZSBjYW4gcmVhZCBtb3JlLCBiZWNhdXNlIGRhdGEgaXMgc3RpbGwgZmxvd2luZw0KICAgICAgICAgICAgb3B0aW9ucy5zZXNzaW9uLl9wcm9jZXNzUmVhZCgpOw0KICAgICAgICB9DQogICAgfTsNCiAgICByZXQuX3Byb2Nlc3NSZWFkID0gZnVuY3Rpb24gX3Byb2Nlc3NSZWFkKCkNCiAgICB7DQogICAgICAgIGlmICh0aGlzLl9kZXNjcmlwdG9yID09IG51bGwpIHsgcmV0dXJuOyB9DQogICAgICAgIHJlcXVpcmUoJ2ZzJykucmVhZCh0aGlzLl9kZXNjcmlwdG9yLCB7IG1ldGFkYXRhOiAnaGVjaS5zZXNzaW9uJywgYnVmZmVyOiB0aGlzLl9yZWFkYnVmZmVyLCBzZXNzaW9uOiB0aGlzIH0sIHRoaXMuX3Byb2Nlc3NSZWFkX3JlYWRTZXRfc2luayk7DQogICAgfTsNCiAgICByZXQub25jZSgnficsIGZ1bmN0aW9uICgpIHsgdGhpcy5kaXNjb25uZWN0KCk7IH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KdmFyIGlvY3RsID0ge307DQppZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQp7DQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGlvY3RsLCAnSEVDSV9WRVJTSU9OJywgeyB2YWx1ZTogMHg4MDAwRTAwMCB9KTsNCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW9jdGwsICdDTElFTlRfQ09OTkVDVCcsIHsgdmFsdWU6IDB4ODAwMEUwMDQgfSk7DQp9DQppZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpDQp7DQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGlvY3RsLCAnSEVDSV9WRVJTSU9OJywgeyB2YWx1ZTogMHgwMCB9KTsNCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW9jdGwsICdDTElFTlRfQ09OTkVDVCcsIHsgdmFsdWU6IDB4MDEgfSk7DQp9DQoNCnZhciBndWlkcyA9IHt9Ow0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGd1aWRzLCAnQU1UJywgeyB2YWx1ZTogQnVmZmVyLmZyb20oJzI4MDBGODEyQjdCNDJENEJBQ0E4NDZF", 16000); + memcpy_s(_heci + 32000, 944, "MEZGNjU4MTRDJywgJ2hleCcpIH0pOw0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGd1aWRzLCAnTE1FJywgeyB2YWx1ZTogQnVmZmVyLmZyb20oJ0RCQTQzMzY3NzYwNDdCNEVCM0FGQkNGQzI5QkVFN0E3JywgJ2hleCcpIH0pOw0KaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCnsNCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ3VpZHMsICdIRUNJJywgeyB2YWx1ZTogQnVmZmVyLmZyb20oJzM0RkZEMUUyNTgzNEE5NDk4OERBOEU2OTE1Q0U5QkU1JywgJ2hleCcpIH0pOw0KfQ0KDQoNCm1vZHVsZS5leHBvcnRzID0geyBfT2JqZWN0SUQ6ICdoZWNpJywgSU9DVEw6IGlvY3RsLCBHVUlEUzogZ3VpZHMsIGNyZWF0ZTogaGVjaV9jcmVhdGUgfTsNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgInN1cHBvcnRlZCIsIHsNCiAgICBnZXQ6IGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIHAgPSB0aGlzLmNyZWF0ZSgpLmRlc2NyaXB0b3JQYXRoKCk7DQogICAgICAgICAgICB2YXIgZCA9IHRoaXMuY3JlYXRlKCkuY3JlYXRlRGVzY3JpcHRvcihwKTsNCiAgICAgICAgICAgIHJldHVybih0cnVlKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaChlKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsNCiAgICAgICAgfQ0KICAgIH0NCn0pOw==", 944); + ILibBase64DecodeEx((unsigned char*)_heci, 32944, (unsigned char*)_heci + 32944); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "heci"); duk_push_string(ctx, _heci + 32944); + duk_pcall_method(ctx, 2); duk_pop(ctx); + free(_heci); +#endif + #ifdef __APPLE__ duk_peval_string_noresult(ctx, "addModule('mac-powerutil', Buffer.from('LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIHBvd2VydXRpbCgpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ21hYy1wb3dlcnV0aWwnOwoKICAgIHRoaXMuc2xlZXAgPSBmdW5jdGlvbiBzbGVlcCgpCiAgICB7DQogICAgICAgIHZhciBjaGlsZDsNCiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gc2xlZXBcJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NsZWVwKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KICAgIHRoaXMucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2h1dGRvd24gLXIgbm93XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHRocm93ICgncmVzdGFydCgpIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtJyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9CiAgICB0aGlzLnNodXRkb3duID0gZnVuY3Rpb24gc2h1dGRvd24oKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaCAocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NodXRkb3duIC1oIG5vd1xuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NodXRkb3duKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgcG93ZXJ1dGlsKCk7', 'base64').toString());"); #endif diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index 8db2749..0db6643 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -72,7 +72,6 @@ limitations under the License. #include "ILibDuktape_SHA256.h" #include "ILibDuktape_EncryptionStream.h" #include "ILibDuktape_ChildProcess.h" -#include "ILibDuktape_HECI.h" #include "ILibDuktape_Debugger.h" #include "ILibDuktape_Commit.h" @@ -2377,9 +2376,6 @@ duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx3(duk_conte if ((securityFlags & SCRIPT_ENGINE_NO_PROCESS_SPAWNING) == 0) { ILibDuktape_ChildProcess_Init(ctx); -#ifndef _NOHECI - ILibDuktape_HECI_Init(ctx); -#endif } if ((securityFlags & SCRIPT_ENGINE_NO_FILE_SYSTEM_ACCESS) == 0) { ILibDuktape_fs_init(ctx); } diff --git a/microscript/ILibDuktape_fs.c b/microscript/ILibDuktape_fs.c index e5179f5..eaccee7 100644 --- a/microscript/ILibDuktape_fs.c +++ b/microscript/ILibDuktape_fs.c @@ -473,7 +473,6 @@ duk_ret_t ILibDuktape_fs_write_writeset_sink(duk_context *ctx) } duk_ret_t ILibDuktape_fs_write(duk_context *ctx) { - int top = duk_get_top(ctx); int fd = (int)duk_require_int(ctx, 0); duk_size_t bufferLen; char *buffer = Duktape_GetBuffer(ctx, 1, &bufferLen); @@ -1419,7 +1418,6 @@ duk_ret_t ILibDuktape_fs_watcher_finalizer(duk_context *ctx) void ILibDuktape_fs_notifyDispatcher_QueryEx(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user) { ILibDuktape_fs_watcherData *data = (ILibDuktape_fs_watcherData*)Data; - int fd = (int)(uintptr_t)Key1; duk_push_heapptr(data->ctx, user); // [array] duk_push_heapptr(data->ctx, data->object); // [array][watcher] duk_get_prop_string(data->ctx, -1, FS_WATCH_PATH); // [array][watcher][path] diff --git a/modules/heci.js b/modules/heci.js index e870ff3..2ff0590 100644 --- a/modules/heci.js +++ b/modules/heci.js @@ -563,6 +563,7 @@ function heci_create() if (this._descriptor == null) { return; } require('fs').read(this._descriptor, { metadata: 'heci.session', buffer: this._readbuffer, session: this }, this._processRead_readSet_sink); }; + ret.once('~', function () { this.disconnect(); }); return (ret); }