Files
novarix.uk/node_modules/@napi-rs/wasm-runtime/dist/runtime.js
T
Kismet Hasanaj 39a8a128be including-modules
2026-05-03 00:14:08 +02:00

12289 lines
1.9 MiB
Plaintext

var _WebAssembly$2 = typeof WebAssembly !== 'undefined'
? WebAssembly
: typeof WXWebAssembly !== 'undefined'
? WXWebAssembly
: undefined;
var ENVIRONMENT_IS_NODE = null !== null;
function getPostMessage(options) {
return typeof (options === null || options === void 0 ? void 0 : options.postMessage) === 'function'
? options.postMessage
: typeof postMessage === 'function'
? postMessage
: undefined;
}
function serizeErrorToBuffer(sab, code, error) {
var i32array = new Int32Array(sab);
Atomics.store(i32array, 0, code);
if (code > 1 && error) {
var name_1 = error.name;
var message = error.message;
var stack = error.stack;
var nameBuffer = new TextEncoder().encode(name_1);
var messageBuffer = new TextEncoder().encode(message);
var stackBuffer = new TextEncoder().encode(stack);
Atomics.store(i32array, 1, nameBuffer.length);
Atomics.store(i32array, 2, messageBuffer.length);
Atomics.store(i32array, 3, stackBuffer.length);
var buffer = new Uint8Array(sab);
buffer.set(nameBuffer, 16);
buffer.set(messageBuffer, 16 + nameBuffer.length);
buffer.set(stackBuffer, 16 + nameBuffer.length + messageBuffer.length);
}
}
function deserizeErrorFromBuffer(sab) {
var _a, _b;
var i32array = new Int32Array(sab);
var status = Atomics.load(i32array, 0);
if (status <= 1) {
return null;
}
var nameLength = Atomics.load(i32array, 1);
var messageLength = Atomics.load(i32array, 2);
var stackLength = Atomics.load(i32array, 3);
var buffer = new Uint8Array(sab);
var nameBuffer = buffer.slice(16, 16 + nameLength);
var messageBuffer = buffer.slice(16 + nameLength, 16 + nameLength + messageLength);
var stackBuffer = buffer.slice(16 + nameLength + messageLength, 16 + nameLength + messageLength + stackLength);
var name = new TextDecoder().decode(nameBuffer);
var message = new TextDecoder().decode(messageBuffer);
var stack = new TextDecoder().decode(stackBuffer);
var ErrorConstructor = (_a = globalThis[name]) !== null && _a !== void 0 ? _a : (name === 'RuntimeError' ? ((_b = _WebAssembly$2.RuntimeError) !== null && _b !== void 0 ? _b : Error) : Error);
var error = new ErrorConstructor(message);
Object.defineProperty(error, 'stack', {
value: stack,
writable: true,
enumerable: false,
configurable: true
});
return error;
}
/** @public */
function isSharedArrayBuffer(value) {
return ((typeof SharedArrayBuffer === 'function' && value instanceof SharedArrayBuffer) ||
(Object.prototype.toString.call(value) === '[object SharedArrayBuffer]'));
}
/** @public */
function isTrapError(e) {
try {
return e instanceof _WebAssembly$2.RuntimeError;
}
catch (_) {
return false;
}
}
function createMessage(type, payload) {
return {
__emnapi__: {
type: type,
payload: payload
}
};
}
var WASI_THREADS_MAX_TID = 0x1FFFFFFF;
function checkSharedWasmMemory(wasmMemory) {
if (wasmMemory) {
if (!isSharedArrayBuffer(wasmMemory.buffer)) {
throw new Error('Multithread features require shared wasm memory. ' +
'Try to compile with `-matomics -mbulk-memory` and use `--import-memory --shared-memory` during linking, ' +
'then create WebAssembly.Memory with `shared: true` option');
}
}
else {
if (typeof SharedArrayBuffer === 'undefined') {
throw new Error('Current environment does not support SharedArrayBuffer, threads are not available!');
}
}
}
function getReuseWorker(value) {
var _a;
if (typeof value === 'boolean') {
return value ? { size: 0, strict: false } : false;
}
if (typeof value === 'number') {
if (!(value >= 0)) {
throw new RangeError('reuseWorker: size must be a non-negative integer');
}
return { size: value, strict: false };
}
if (!value) {
return false;
}
var size = (_a = Number(value.size)) !== null && _a !== void 0 ? _a : 0;
var strict = Boolean(value.strict);
if (!(size > 0) && strict) {
throw new RangeError('reuseWorker: size must be set to positive integer if strict is set to true');
}
return { size: size, strict: strict };
}
var nextWorkerID = 0;
/** @public */
var ThreadManager = /*#__PURE__*/ (function () {
function ThreadManager(options) {
var _a;
this.unusedWorkers = [];
this.runningWorkers = [];
this.pthreads = Object.create(null);
this.wasmModule = null;
this.wasmMemory = null;
this.messageEvents = new WeakMap();
if (!options) {
throw new TypeError('ThreadManager(): options is not provided');
}
if ('childThread' in options) {
this._childThread = Boolean(options.childThread);
}
else {
this._childThread = false;
}
if (this._childThread) {
this._onCreateWorker = undefined;
this._reuseWorker = false;
this._beforeLoad = undefined;
}
else {
this._onCreateWorker = options.onCreateWorker;
this._reuseWorker = getReuseWorker(options.reuseWorker);
this._beforeLoad = options.beforeLoad;
}
this.printErr = (_a = options.printErr) !== null && _a !== void 0 ? _a : console.error.bind(console);
}
Object.defineProperty(ThreadManager.prototype, "nextWorkerID", {
get: function () { return nextWorkerID; },
enumerable: false,
configurable: true
});
ThreadManager.prototype.init = function () {
if (!this._childThread) {
this.initMainThread();
}
};
ThreadManager.prototype.initMainThread = function () {
this.preparePool();
};
ThreadManager.prototype.preparePool = function () {
if (this._reuseWorker) {
if (this._reuseWorker.size) {
var pthreadPoolSize = this._reuseWorker.size;
while (pthreadPoolSize--) {
this.allocateUnusedWorker();
}
}
}
};
ThreadManager.prototype.shouldPreloadWorkers = function () {
return !this._childThread && this._reuseWorker && this._reuseWorker.size > 0;
};
ThreadManager.prototype.loadWasmModuleToAllWorkers = function () {
var _this_1 = this;
var promises = Array(this.unusedWorkers.length);
var _loop_1 = function (i) {
var worker = this_1.unusedWorkers[i];
promises[i] = this_1.loadWasmModuleToWorker(worker).then(function (w) {
return w;
}, function (e) {
throw e;
});
};
var this_1 = this;
for (var i = 0; i < this.unusedWorkers.length; ++i) {
_loop_1(i);
}
return Promise.all(promises).catch(function (err) {
_this_1.terminateAllThreads();
throw err;
});
};
ThreadManager.prototype.preloadWorkers = function () {
if (this.shouldPreloadWorkers()) {
return this.loadWasmModuleToAllWorkers();
}
return Promise.resolve([]);
};
ThreadManager.prototype.setup = function (wasmModule, wasmMemory) {
this.wasmModule = wasmModule;
this.wasmMemory = wasmMemory;
};
ThreadManager.prototype.markId = function (worker) {
if (worker.__emnapi_tid)
return worker.__emnapi_tid;
var tid = nextWorkerID + 43;
nextWorkerID = (nextWorkerID + 1) % (WASI_THREADS_MAX_TID - 42);
this.pthreads[tid] = worker;
worker.__emnapi_tid = tid;
return tid;
};
ThreadManager.prototype.returnWorkerToPool = function (worker) {
var tid = worker.__emnapi_tid;
if (tid !== undefined) {
delete this.pthreads[tid];
}
this.unusedWorkers.push(worker);
this.runningWorkers.splice(this.runningWorkers.indexOf(worker), 1);
delete worker.__emnapi_tid;
};
ThreadManager.prototype.loadWasmModuleToWorker = function (worker, sab) {
var _this_1 = this;
if (worker.whenLoaded)
return worker.whenLoaded;
var err = this.printErr;
var beforeLoad = this._beforeLoad;
// eslint-disable-next-line @typescript-eslint/no-this-alias
var _this = this;
worker.whenLoaded = new Promise(function (resolve, reject) {
var handleError = function (e) {
var message = 'worker sent an error!';
if (worker.__emnapi_tid !== undefined) {
message = 'worker (tid = ' + worker.__emnapi_tid + ') sent an error!';
}
err(message + ' ' + e.message);
if (e.message.indexOf('RuntimeError') !== -1 || e.message.indexOf('unreachable') !== -1) {
try {
_this.terminateAllThreads();
}
catch (_) { }
}
reject(e);
throw e;
};
var handleMessage = function (data) {
if (data.__emnapi__) {
var type = data.__emnapi__.type;
var payload = data.__emnapi__.payload;
if (type === 'loaded') {
worker.loaded = true;
resolve(worker);
// if (payload.err) {
// err('failed to load in child thread: ' + (payload.err.message || payload.err))
// }
}
else if (type === 'cleanup-thread') {
if (payload.tid in _this_1.pthreads) {
_this_1.cleanThread(worker, payload.tid);
}
}
}
};
worker.onmessage = function (e) {
handleMessage(e.data);
_this_1.fireMessageEvent(worker, e);
};
worker.onerror = handleError;
if (typeof beforeLoad === 'function') {
beforeLoad(worker);
}
try {
worker.postMessage(createMessage('load', {
wasmModule: _this_1.wasmModule,
wasmMemory: _this_1.wasmMemory,
sab: sab
}));
}
catch (err) {
checkSharedWasmMemory(_this_1.wasmMemory);
throw err;
}
});
return worker.whenLoaded;
};
ThreadManager.prototype.allocateUnusedWorker = function () {
var _onCreateWorker = this._onCreateWorker;
if (typeof _onCreateWorker !== 'function') {
throw new TypeError('`options.onCreateWorker` is not provided');
}
var worker = _onCreateWorker({ type: 'thread', name: 'emnapi-pthread' });
this.unusedWorkers.push(worker);
return worker;
};
ThreadManager.prototype.getNewWorker = function (sab) {
if (this._reuseWorker) {
if (this.unusedWorkers.length === 0) {
if (this._reuseWorker.strict) {
{
var err = this.printErr;
err('Tried to spawn a new thread, but the thread pool is exhausted.\n' +
'This might result in a deadlock unless some threads eventually exit or the code explicitly breaks out to the event loop.');
return;
}
}
var worker_1 = this.allocateUnusedWorker();
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.loadWasmModuleToWorker(worker_1, sab);
}
return this.unusedWorkers.pop();
}
var worker = this.allocateUnusedWorker();
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.loadWasmModuleToWorker(worker, sab);
return this.unusedWorkers.pop();
};
ThreadManager.prototype.cleanThread = function (worker, tid, force) {
if (!force && this._reuseWorker) {
this.returnWorkerToPool(worker);
}
else {
delete this.pthreads[tid];
var index = this.runningWorkers.indexOf(worker);
if (index !== -1) {
this.runningWorkers.splice(index, 1);
}
this.terminateWorker(worker);
delete worker.__emnapi_tid;
}
};
ThreadManager.prototype.terminateWorker = function (worker) {
var _this_1 = this;
var _a;
var tid = worker.__emnapi_tid;
// eslint-disable-next-line @typescript-eslint/no-floating-promises
worker.terminate();
(_a = this.messageEvents.get(worker)) === null || _a === void 0 ? void 0 : _a.clear();
this.messageEvents.delete(worker);
worker.onmessage = function (e) {
if (e.data.__emnapi__) {
var err = _this_1.printErr;
err('received "' + e.data.__emnapi__.type + '" command from terminated worker: ' + tid);
}
};
};
ThreadManager.prototype.terminateAllThreads = function () {
for (var i = 0; i < this.runningWorkers.length; ++i) {
this.terminateWorker(this.runningWorkers[i]);
}
for (var i = 0; i < this.unusedWorkers.length; ++i) {
this.terminateWorker(this.unusedWorkers[i]);
}
this.unusedWorkers = [];
this.runningWorkers = [];
this.pthreads = Object.create(null);
this.preparePool();
};
ThreadManager.prototype.addMessageEventListener = function (worker, onMessage) {
var listeners = this.messageEvents.get(worker);
if (!listeners) {
listeners = new Set();
this.messageEvents.set(worker, listeners);
}
listeners.add(onMessage);
return function () {
listeners === null || listeners === void 0 ? void 0 : listeners.delete(onMessage);
};
};
ThreadManager.prototype.fireMessageEvent = function (worker, e) {
var listeners = this.messageEvents.get(worker);
if (!listeners)
return;
var err = this.printErr;
listeners.forEach(function (listener) {
try {
listener(e);
}
catch (e) {
err(e.stack);
}
});
};
return ThreadManager;
}());
var kIsProxy = Symbol('kIsProxy');
/** @public */
function createInstanceProxy(instance, memory) {
if (instance[kIsProxy])
return instance;
// https://github.com/nodejs/help/issues/4102
var originalExports = instance.exports;
var createHandler = function (target) {
var handlers = [
'apply',
'construct',
'defineProperty',
'deleteProperty',
'get',
'getOwnPropertyDescriptor',
'getPrototypeOf',
'has',
'isExtensible',
'ownKeys',
'preventExtensions',
'set',
'setPrototypeOf'
];
var handler = {};
var _loop_1 = function (i) {
var name_1 = handlers[i];
handler[name_1] = function () {
var args = Array.prototype.slice.call(arguments, 1);
args.unshift(target);
return Reflect[name_1].apply(Reflect, args);
};
};
for (var i = 0; i < handlers.length; i++) {
_loop_1(i);
}
return handler;
};
var handler = createHandler(originalExports);
var _initialize = function () { };
var _start = function () { return 0; };
handler.get = function (_target, p, receiver) {
var _a;
if (p === 'memory') {
return (_a = (typeof memory === 'function' ? memory() : memory)) !== null && _a !== void 0 ? _a : Reflect.get(originalExports, p, receiver);
}
if (p === '_initialize') {
return p in originalExports ? _initialize : undefined;
}
if (p === '_start') {
return p in originalExports ? _start : undefined;
}
return Reflect.get(originalExports, p, receiver);
};
handler.has = function (_target, p) {
if (p === 'memory')
return true;
return Reflect.has(originalExports, p);
};
var exportsProxy = new Proxy(Object.create(null), handler);
return new Proxy(instance, {
get: function (target, p, receiver) {
if (p === 'exports') {
return exportsProxy;
}
if (p === kIsProxy) {
return true;
}
return Reflect.get(target, p, receiver);
}
});
}
var patchedWasiInstances = new WeakMap();
/** @public */
var WASIThreads = /*#__PURE__*/ (function () {
function WASIThreads(options) {
var _this_1 = this;
if (!options) {
throw new TypeError('WASIThreads(): options is not provided');
}
if (!options.wasi) {
throw new TypeError('WASIThreads(): options.wasi is not provided');
}
patchedWasiInstances.set(this, new WeakSet());
var wasi = options.wasi;
patchWasiInstance(this, wasi);
this.wasi = wasi;
if ('childThread' in options) {
this.childThread = Boolean(options.childThread);
}
else {
this.childThread = false;
}
this.PThread = undefined;
if ('threadManager' in options) {
if (typeof options.threadManager === 'function') {
this.PThread = options.threadManager();
}
else {
this.PThread = options.threadManager;
}
}
else {
if (!this.childThread) {
this.PThread = new ThreadManager(options);
this.PThread.init();
}
}
var waitThreadStart = false;
if ('waitThreadStart' in options) {
waitThreadStart = typeof options.waitThreadStart === 'number' ? options.waitThreadStart : Boolean(options.waitThreadStart);
}
var postMessage = getPostMessage(options);
if (this.childThread && typeof postMessage !== 'function') {
throw new TypeError('options.postMessage is not a function');
}
this.postMessage = postMessage;
var wasm64 = Boolean(options.wasm64);
var onMessage = function (e) {
if (e.data.__emnapi__) {
var type = e.data.__emnapi__.type;
var payload = e.data.__emnapi__.payload;
if (type === 'spawn-thread') {
threadSpawn(payload.startArg, payload.errorOrTid);
}
else if (type === 'terminate-all-threads') {
_this_1.terminateAllThreads();
}
}
};
var threadSpawn = function (startArg, errorOrTid) {
var _a;
var EAGAIN = 6;
var isNewABI = errorOrTid !== undefined;
try {
checkSharedWasmMemory(_this_1.wasmMemory);
}
catch (err) {
(_a = _this_1.PThread) === null || _a === void 0 ? void 0 : _a.printErr(err.stack);
if (isNewABI) {
var struct_1 = new Int32Array(_this_1.wasmMemory.buffer, errorOrTid, 2);
Atomics.store(struct_1, 0, 1);
Atomics.store(struct_1, 1, EAGAIN);
Atomics.notify(struct_1, 1);
return 1;
}
else {
return -6;
}
}
if (!isNewABI) {
var malloc = _this_1.wasmInstance.exports.malloc;
errorOrTid = wasm64 ? Number(malloc(BigInt(8))) : malloc(8);
if (!errorOrTid) {
return -48; /* ENOMEM */
}
}
var _free = _this_1.wasmInstance.exports.free;
var free = wasm64 ? function (ptr) { _free(BigInt(ptr)); } : _free;
var struct = new Int32Array(_this_1.wasmMemory.buffer, errorOrTid, 2);
Atomics.store(struct, 0, 0);
Atomics.store(struct, 1, 0);
if (_this_1.childThread) {
postMessage(createMessage('spawn-thread', {
startArg: startArg,
errorOrTid: errorOrTid
}));
Atomics.wait(struct, 1, 0);
var isError = Atomics.load(struct, 0);
var result = Atomics.load(struct, 1);
if (isNewABI) {
return isError;
}
free(errorOrTid);
return isError ? -result : result;
}
var shouldWait = waitThreadStart || (waitThreadStart === 0);
var sab;
if (shouldWait) {
sab = new Int32Array(new SharedArrayBuffer(16 + 8192));
Atomics.store(sab, 0, 0);
}
var worker;
var tid;
var PThread = _this_1.PThread;
try {
worker = PThread.getNewWorker(sab);
if (!worker) {
throw new Error('failed to get new worker');
}
PThread.addMessageEventListener(worker, onMessage);
tid = PThread.markId(worker);
if (ENVIRONMENT_IS_NODE) ;
worker.postMessage(createMessage('start', {
tid: tid,
arg: startArg,
sab: sab
}));
if (shouldWait) {
if (typeof waitThreadStart === 'number') {
var waitResult = Atomics.wait(sab, 0, 0, waitThreadStart);
if (waitResult === 'timed-out') {
try {
PThread.cleanThread(worker, tid, true);
}
catch (_) { }
throw new Error('Spawning thread timed out. Please check if the worker is created successfully and if message is handled properly in the worker.');
}
}
else {
Atomics.wait(sab, 0, 0);
}
var r = Atomics.load(sab, 0);
if (r > 1) {
try {
PThread.cleanThread(worker, tid, true);
}
catch (_) { }
throw deserizeErrorFromBuffer(sab.buffer);
}
}
}
catch (e) {
Atomics.store(struct, 0, 1);
Atomics.store(struct, 1, EAGAIN);
Atomics.notify(struct, 1);
PThread === null || PThread === void 0 ? void 0 : PThread.printErr(e.stack);
if (isNewABI) {
return 1;
}
free(errorOrTid);
return -6;
}
Atomics.store(struct, 0, 0);
Atomics.store(struct, 1, tid);
Atomics.notify(struct, 1);
PThread.runningWorkers.push(worker);
if (!shouldWait) {
worker.whenLoaded.catch(function (err) {
delete worker.whenLoaded;
PThread.cleanThread(worker, tid, true);
throw err;
});
}
if (isNewABI) {
return 0;
}
free(errorOrTid);
return tid;
};
this.threadSpawn = threadSpawn;
}
WASIThreads.prototype.getImportObject = function () {
return {
wasi: {
'thread-spawn': this.threadSpawn
}
};
};
WASIThreads.prototype.setup = function (wasmInstance, wasmModule, wasmMemory) {
wasmMemory !== null && wasmMemory !== void 0 ? wasmMemory : (wasmMemory = wasmInstance.exports.memory);
this.wasmInstance = wasmInstance;
this.wasmMemory = wasmMemory;
if (this.PThread) {
this.PThread.setup(wasmModule, wasmMemory);
}
};
WASIThreads.prototype.preloadWorkers = function () {
if (this.PThread) {
return this.PThread.preloadWorkers();
}
return Promise.resolve([]);
};
/**
* It's ok to call this method to a WASI command module.
*
* in child thread, must call this method instead of {@link WASIThreads.start} even if it's a WASI command module
*
* @returns A proxied WebAssembly instance if in child thread, other wise the original instance
*/
WASIThreads.prototype.initialize = function (instance, module, memory) {
var exports = instance.exports;
memory !== null && memory !== void 0 ? memory : (memory = exports.memory);
if (this.childThread) {
instance = createInstanceProxy(instance, memory);
}
this.setup(instance, module, memory);
var wasi = this.wasi;
if (('_start' in exports) && (typeof exports._start === 'function')) {
if (this.childThread) {
wasi.start(instance);
try {
var kStarted = getWasiSymbol(wasi, 'kStarted');
wasi[kStarted] = false;
}
catch (_) { }
}
else {
setupInstance(wasi, instance);
}
}
else {
wasi.initialize(instance);
}
return instance;
};
/**
* Equivalent to calling {@link WASIThreads.initialize} and then calling {@link WASIInstance.start}
* ```js
* this.initialize(instance, module, memory)
* this.wasi.start(instance)
* ```
*/
WASIThreads.prototype.start = function (instance, module, memory) {
var exports = instance.exports;
memory !== null && memory !== void 0 ? memory : (memory = exports.memory);
if (this.childThread) {
instance = createInstanceProxy(instance, memory);
}
this.setup(instance, module, memory);
var exitCode = this.wasi.start(instance);
return { exitCode: exitCode, instance: instance };
};
WASIThreads.prototype.terminateAllThreads = function () {
var _a;
if (!this.childThread) {
(_a = this.PThread) === null || _a === void 0 ? void 0 : _a.terminateAllThreads();
}
else {
this.postMessage(createMessage('terminate-all-threads', {}));
}
};
return WASIThreads;
}());
function patchWasiInstance(wasiThreads, wasi) {
var patched = patchedWasiInstances.get(wasiThreads);
if (patched.has(wasi)) {
return;
}
var _this = wasiThreads;
var wasiImport = wasi.wasiImport;
if (wasiImport) {
var proc_exit_1 = wasiImport.proc_exit;
wasiImport.proc_exit = function (code) {
_this.terminateAllThreads();
return proc_exit_1.call(this, code);
};
}
var start = wasi.start;
if (typeof start === 'function') {
wasi.start = function (instance) {
try {
return start.call(this, instance);
}
catch (err) {
if (isTrapError(err)) {
_this.terminateAllThreads();
}
throw err;
}
};
}
patched.add(wasi);
}
function getWasiSymbol(wasi, description) {
var symbols = Object.getOwnPropertySymbols(wasi);
var selectDescription = function (description) { return function (s) {
if (s.description) {
return s.description === description;
}
return s.toString() === "Symbol(".concat(description, ")");
}; };
if (Array.isArray(description)) {
return description.map(function (d) { return symbols.filter(selectDescription(d))[0]; });
}
return symbols.filter(selectDescription(description))[0];
}
function setupInstance(wasi, instance) {
var _a = getWasiSymbol(wasi, ['kInstance', 'kSetMemory']), kInstance = _a[0], kSetMemory = _a[1];
wasi[kInstance] = instance;
wasi[kSetMemory](instance.exports.memory);
}
/** @public */
var ThreadMessageHandler = /*#__PURE__*/ (function () {
function ThreadMessageHandler(options) {
var postMsg = getPostMessage(options);
if (typeof postMsg !== 'function') {
throw new TypeError('options.postMessage is not a function');
}
this.postMessage = postMsg;
this.onLoad = options === null || options === void 0 ? void 0 : options.onLoad;
this.instance = undefined;
// this.module = undefined
this.messagesBeforeLoad = [];
}
/** @virtual */
ThreadMessageHandler.prototype.instantiate = function (data) {
if (typeof this.onLoad === 'function') {
return this.onLoad(data);
}
throw new Error('ThreadMessageHandler.prototype.instantiate is not implemented');
};
/** @virtual */
ThreadMessageHandler.prototype.handle = function (e) {
var _this = this;
var _a;
if ((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.__emnapi__) {
var type = e.data.__emnapi__.type;
var payload_1 = e.data.__emnapi__.payload;
if (type === 'load') {
this._load(payload_1);
}
else if (type === 'start') {
this.handleAfterLoad(e, function () {
_this._start(payload_1);
});
}
}
};
ThreadMessageHandler.prototype._load = function (payload) {
var _this = this;
if (this.instance !== undefined)
return;
var source;
try {
source = this.instantiate(payload);
}
catch (err) {
this._loaded(err, null, payload);
return;
}
var then = source && 'then' in source ? source.then : undefined;
if (typeof then === 'function') {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
then.call(source, function (source) { _this._loaded(null, source, payload); }, function (err) { _this._loaded(err, null, payload); });
}
else {
this._loaded(null, source, payload);
}
};
ThreadMessageHandler.prototype._start = function (payload) {
if (typeof this.instance.exports.wasi_thread_start !== 'function') {
var err = new TypeError('wasi_thread_start is not exported');
notifyPthreadCreateResult(payload.sab, 2, err);
throw err;
}
var postMessage = this.postMessage;
var tid = payload.tid;
var startArg = payload.arg;
notifyPthreadCreateResult(payload.sab, 1);
try {
this.instance.exports.wasi_thread_start(tid, startArg);
}
catch (err) {
if (isTrapError(err)) {
postMessage(createMessage('terminate-all-threads', {}));
}
throw err;
}
postMessage(createMessage('cleanup-thread', { tid: tid }));
};
ThreadMessageHandler.prototype._loaded = function (err, source, payload) {
if (err) {
notifyPthreadCreateResult(payload.sab, 2, err);
throw err;
}
if (source == null) {
var err_1 = new TypeError('onLoad should return an object');
notifyPthreadCreateResult(payload.sab, 2, err_1);
throw err_1;
}
var instance = source.instance;
if (!instance) {
var err_2 = new TypeError('onLoad should return an object which includes "instance"');
notifyPthreadCreateResult(payload.sab, 2, err_2);
throw err_2;
}
this.instance = instance;
var postMessage = this.postMessage;
postMessage(createMessage('loaded', {}));
var messages = this.messagesBeforeLoad;
this.messagesBeforeLoad = [];
for (var i = 0; i < messages.length; i++) {
var data = messages[i];
this.handle({ data: data });
}
};
ThreadMessageHandler.prototype.handleAfterLoad = function (e, f) {
if (this.instance !== undefined) {
f.call(this, e);
}
else {
this.messagesBeforeLoad.push(e.data);
}
};
return ThreadMessageHandler;
}());
function notifyPthreadCreateResult(sab, result, error) {
if (sab) {
serizeErrorToBuffer(sab.buffer, result, error);
Atomics.notify(sab, 0);
}
}
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
var e = new Error(message);
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};
/* eslint-disable no-undef */
var _WebAssembly$1 = typeof WebAssembly !== 'undefined'
? WebAssembly
: typeof WXWebAssembly !== 'undefined'
? WXWebAssembly
: undefined;
function validateImports(imports) {
if (imports && typeof imports !== 'object') {
throw new TypeError('imports must be an object or undefined');
}
return true;
}
function load(wasmInput, imports) {
if (!wasmInput)
throw new TypeError('Invalid wasm source');
validateImports(imports);
imports = imports !== null && imports !== void 0 ? imports : {};
// Promise<string | URL | Response | BufferSource | WebAssembly.Module>
try {
var then = typeof wasmInput === 'object' && wasmInput !== null && 'then' in wasmInput ? wasmInput.then : undefined;
if (typeof then === 'function') {
return then.call(wasmInput, function (input) { return load(input, imports); });
}
}
catch (_) { }
// BufferSource
if (wasmInput instanceof ArrayBuffer || ArrayBuffer.isView(wasmInput)) {
return _WebAssembly$1.instantiate(wasmInput, imports);
}
// WebAssembly.Module
if (wasmInput instanceof _WebAssembly$1.Module) {
return _WebAssembly$1.instantiate(wasmInput, imports).then(function (instance) {
return { instance: instance, module: wasmInput };
});
}
// Response
if (typeof Response !== 'undefined' && wasmInput instanceof Response) {
return wasmInput.arrayBuffer().then(function (buffer) {
return _WebAssembly$1.instantiate(buffer, imports);
});
}
// string | URL
var inputIsString = typeof wasmInput === 'string';
if (inputIsString || (typeof URL !== 'undefined' && wasmInput instanceof URL)) {
if (inputIsString && typeof wx !== 'undefined' && typeof __wxConfig !== 'undefined') {
return _WebAssembly$1.instantiate(wasmInput, imports);
}
if (typeof fetch !== 'function') {
throw new TypeError('wasm source can not be a string or URL in this environment');
}
if (typeof _WebAssembly$1.instantiateStreaming === 'function') {
try {
return _WebAssembly$1.instantiateStreaming(fetch(wasmInput), imports).catch(function () {
return load(fetch(wasmInput), imports);
});
}
catch (_) {
return load(fetch(wasmInput), imports);
}
}
else {
return load(fetch(wasmInput), imports);
}
}
throw new TypeError('Invalid wasm source');
}
function loadSync(wasmInput, imports) {
if (!wasmInput)
throw new TypeError('Invalid wasm source');
validateImports(imports);
imports = imports !== null && imports !== void 0 ? imports : {};
var module;
if ((wasmInput instanceof ArrayBuffer) || ArrayBuffer.isView(wasmInput)) {
module = new _WebAssembly$1.Module(wasmInput);
}
else if (wasmInput instanceof WebAssembly.Module) {
module = wasmInput;
}
else {
throw new TypeError('Invalid wasm source');
}
var instance = new _WebAssembly$1.Instance(module, imports);
var source = { instance: instance, module: module };
return source;
}
function createNapiModule(options) {
var napiModule = (function () {
var ENVIRONMENT_IS_PTHREAD = Boolean(options.childThread);
var waitThreadStart = typeof options.waitThreadStart === 'number' ? options.waitThreadStart : Boolean(options.waitThreadStart);
var wasmInstance;
var wasmMemory;
var wasmTable;
var _malloc;
var _free;
function abort(msg) {
if (typeof _WebAssembly$1.RuntimeError === 'function') {
throw new _WebAssembly$1.RuntimeError(msg);
}
throw Error(msg);
}
var napiModule = {
imports: {
env: {},
napi: {},
emnapi: {}
},
exports: {},
emnapi: {},
loaded: false,
filename: '',
childThread: ENVIRONMENT_IS_PTHREAD,
initWorker: undefined,
executeAsyncWork: undefined,
waitThreadStart: waitThreadStart,
PThread: undefined,
init: function (options) {
if (napiModule.loaded)
return napiModule.exports;
if (!options)
throw new TypeError('Invalid napi init options');
var instance = options.instance;
if (!(instance === null || instance === void 0 ? void 0 : instance.exports))
throw new TypeError('Invalid wasm instance');
wasmInstance = instance;
var exports = instance.exports;
var module = options.module;
var memory = options.memory || exports.memory;
var table = options.table || exports.__indirect_function_table;
if (!(module instanceof _WebAssembly$1.Module))
throw new TypeError('Invalid wasm module');
if (!(memory instanceof _WebAssembly$1.Memory))
throw new TypeError('Invalid wasm memory');
if (!(table instanceof _WebAssembly$1.Table))
throw new TypeError('Invalid wasm table');
wasmMemory = memory;
wasmTable = table;
if (typeof exports.malloc !== 'function')
throw new TypeError('malloc is not exported');
if (typeof exports.free !== 'function')
throw new TypeError('free is not exported');
_malloc = exports.malloc;
_free = exports.free;
if (!napiModule.childThread) {
// main thread only
var moduleApiVersion = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */;
var node_api_module_get_api_version_v1 = instance.exports.node_api_module_get_api_version_v1;
if (typeof node_api_module_get_api_version_v1 === 'function') {
moduleApiVersion = node_api_module_get_api_version_v1();
}
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
var envObject = napiModule.envObject || (napiModule.envObject = emnapiCtx.createEnv(napiModule.filename, moduleApiVersion, function (cb) { return (wasmTable.get(cb)); }, function (cb) { return (wasmTable.get(cb)); }, abort, emnapiNodeBinding));
var scope_1 = emnapiCtx.openScope(envObject);
try {
envObject.callIntoModule(function (_envObject) {
var exports = napiModule.exports;
var exportsHandle = scope_1.add(exports);
var napi_register_wasm_v1 = instance.exports.napi_register_wasm_v1;
var napiValue = napi_register_wasm_v1(_envObject.id, exportsHandle.id);
napiModule.exports = (!napiValue) ? exports : emnapiCtx.handleStore.get(napiValue).value;
});
}
finally {
emnapiCtx.closeScope(envObject, scope_1);
}
napiModule.loaded = true;
delete napiModule.envObject;
return napiModule.exports;
}
}
};
var emnapiCtx;
var emnapiNodeBinding;
var onCreateWorker = undefined;
var err;
if (!ENVIRONMENT_IS_PTHREAD) {
var context = options.context;
if (typeof context !== 'object' || context === null) {
throw new TypeError("Invalid `options.context`. Use `import { getDefaultContext } from '@emnapi/runtime'`");
}
emnapiCtx = context;
}
else {
emnapiCtx = options === null || options === void 0 ? void 0 : options.context;
var postMsg = typeof options.postMessage === 'function'
? options.postMessage
: typeof postMessage === 'function'
? postMessage
: undefined;
if (typeof postMsg !== 'function') {
throw new TypeError('No postMessage found');
}
napiModule.postMessage = postMsg;
}
if (typeof options.filename === 'string') {
napiModule.filename = options.filename;
}
if (typeof options.onCreateWorker === 'function') {
onCreateWorker = options.onCreateWorker;
}
if (typeof options.print === 'function') {
options.print;
}
else {
console.log.bind(console);
}
if (typeof options.printErr === 'function') {
err = options.printErr;
}
else {
err = console.warn.bind(console);
}
if ('nodeBinding' in options) {
var nodeBinding = options.nodeBinding;
if (typeof nodeBinding !== 'object' || nodeBinding === null) {
throw new TypeError('Invalid `options.nodeBinding`. Use @emnapi/node-binding package');
}
emnapiNodeBinding = nodeBinding;
}
var emnapiAsyncWorkPoolSize = 0;
if ('asyncWorkPoolSize' in options) {
if (typeof options.asyncWorkPoolSize !== 'number') {
throw new TypeError('options.asyncWorkPoolSize must be a integer');
}
emnapiAsyncWorkPoolSize = options.asyncWorkPoolSize >> 0;
if (emnapiAsyncWorkPoolSize > 1024) {
emnapiAsyncWorkPoolSize = 1024;
}
else if (emnapiAsyncWorkPoolSize < -1024) {
emnapiAsyncWorkPoolSize = -1024;
}
}
var singleThreadAsyncWork = ENVIRONMENT_IS_PTHREAD ? false : (emnapiAsyncWorkPoolSize <= 0);
function _emnapi_async_work_pool_size() {
return Math.abs(emnapiAsyncWorkPoolSize);
}
napiModule.imports.env._emnapi_async_work_pool_size = _emnapi_async_work_pool_size;
// ------------------------------ pthread -------------------------------
function emnapiAddSendListener(worker) {
if (!worker)
return false;
if (worker._emnapiSendListener)
return true;
var handler = function (e) {
var data = e.data;
var __emnapi__ = data.__emnapi__;
if (__emnapi__ && __emnapi__.type === 'async-send') {
if (ENVIRONMENT_IS_PTHREAD) {
var postMessage_1 = napiModule.postMessage;
postMessage_1({ __emnapi__: __emnapi__ });
}
else {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var callback = __emnapi__.payload.callback;
(wasmTable.get(callback))(__emnapi__.payload.data);
}
}
};
var dispose = function () {
{
worker.removeEventListener('message', handler, false);
}
delete worker._emnapiSendListener;
};
worker._emnapiSendListener = { handler: handler, dispose: dispose };
{
worker.addEventListener('message', handler, false);
}
return true;
}
napiModule.emnapi.addSendListener = emnapiAddSendListener;
var PThread = new ThreadManager(ENVIRONMENT_IS_PTHREAD
? {
printErr: err,
childThread: true
}
: {
printErr: err,
beforeLoad: function (worker) {
emnapiAddSendListener(worker);
},
reuseWorker: options.reuseWorker,
onCreateWorker: onCreateWorker
});
napiModule.PThread = PThread;
/**
* @__sig ipiip
*/
function napi_set_last_error(env, error_code, engine_error_code, engine_reserved) {
var envObject = emnapiCtx.envStore.get(env);
return envObject.setLastError(error_code, engine_error_code, engine_reserved);
}
/**
* @__sig ip
*/
function napi_clear_last_error(env) {
var envObject = emnapiCtx.envStore.get(env);
return envObject.clearLastError();
}
/**
* @__sig vppp
*/
function _emnapi_get_node_version(major, minor, patch) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var versions = [0, 0, 0];
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setUint32(major, versions[0], true);
HEAP_DATA_VIEW.setUint32(minor, versions[1], true);
HEAP_DATA_VIEW.setUint32(patch, versions[2], true);
}
/**
* @__sig v
* @__deps $runtimeKeepalivePush
*/
function _emnapi_runtime_keepalive_push() {
}
/**
* @__sig v
* @__deps $runtimeKeepalivePop
*/
function _emnapi_runtime_keepalive_pop() {
}
/**
* @__sig vpp
*/
function _emnapi_set_immediate(callback, data) {
emnapiCtx.feature.setImmediate(function () {
(wasmTable.get(callback))(data);
});
}
/**
* @__sig vpp
*/
function _emnapi_next_tick(callback, data) {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
Promise.resolve().then(function () {
(wasmTable.get(callback))(data);
});
}
/**
* @__sig vipppi
*/
function _emnapi_callback_into_module(forceUncaught, env, callback, data, close_scope_if_throw) {
var envObject = emnapiCtx.envStore.get(env);
var scope = emnapiCtx.openScope(envObject);
try {
envObject.callbackIntoModule(Boolean(forceUncaught), function () {
(wasmTable.get(callback))(env, data);
});
}
catch (err) {
emnapiCtx.closeScope(envObject, scope);
if (close_scope_if_throw) {
emnapiCtx.closeScope(envObject);
}
throw err;
}
emnapiCtx.closeScope(envObject, scope);
}
/**
* @__sig vipppp
*/
function _emnapi_call_finalizer(forceUncaught, env, callback, data, hint) {
var envObject = emnapiCtx.envStore.get(env);
envObject.callFinalizerInternal(forceUncaught, callback, data, hint);
}
/**
* @__sig v
*/
function _emnapi_ctx_increase_waiting_request_counter() {
emnapiCtx.increaseWaitingRequestCounter();
}
/**
* @__sig v
*/
function _emnapi_ctx_decrease_waiting_request_counter() {
emnapiCtx.decreaseWaitingRequestCounter();
}
function $emnapiSetValueI64(result, numberValue) {
var tempDouble;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var tempI64 = [
numberValue >>> 0,
(tempDouble = numberValue, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)
];
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, tempI64[0], true);
HEAP_DATA_VIEW.setInt32(result + 4, tempI64[1], true);
}
var utilMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
$emnapiSetValueI64: $emnapiSetValueI64,
_emnapi_call_finalizer: _emnapi_call_finalizer,
_emnapi_callback_into_module: _emnapi_callback_into_module,
_emnapi_ctx_decrease_waiting_request_counter: _emnapi_ctx_decrease_waiting_request_counter,
_emnapi_ctx_increase_waiting_request_counter: _emnapi_ctx_increase_waiting_request_counter,
_emnapi_get_node_version: _emnapi_get_node_version,
_emnapi_next_tick: _emnapi_next_tick,
_emnapi_runtime_keepalive_pop: _emnapi_runtime_keepalive_pop,
_emnapi_runtime_keepalive_push: _emnapi_runtime_keepalive_push,
_emnapi_set_immediate: _emnapi_set_immediate,
napi_clear_last_error: napi_clear_last_error,
napi_set_last_error: napi_set_last_error
});
function emnapiGetWorkerByPthreadPtr(pthreadPtr) {
var view = new DataView(wasmMemory.buffer);
/**
* wasi-sdk-20.0+threads
*
* struct pthread {
* struct pthread *self; // 0
* struct pthread *prev, *next; // 4, 8
* uintptr_t sysinfo; // 12
* uintptr_t canary; // 16
* int tid; // 20
* // ...
* }
*/
var tidOffset = 20;
var tid = view.getInt32(pthreadPtr + tidOffset, true);
var worker = PThread.pthreads[tid];
return worker;
}
/** @__sig vp */
function _emnapi_worker_unref(pthreadPtr) {
if (ENVIRONMENT_IS_PTHREAD)
return;
var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr);
if (worker && typeof worker.unref === 'function') {
worker.unref();
}
}
/** @__sig vipp */
function _emnapi_async_send_js(type, callback, data) {
if (ENVIRONMENT_IS_PTHREAD) {
var postMessage_1 = napiModule.postMessage;
postMessage_1({
__emnapi__: {
type: 'async-send',
payload: {
callback: callback,
data: data
}
}
});
}
else {
switch (type) {
case 0:
_emnapi_set_immediate(callback, data);
break;
case 1:
_emnapi_next_tick(callback, data);
break;
}
}
}
// function ptrToString (ptr: number): string {
// return '0x' + ('00000000' + ptr.toString(16)).slice(-8)
// }
var uvThreadpoolReadyResolve;
var uvThreadpoolReady = new Promise(function (resolve) {
uvThreadpoolReadyResolve = function () {
uvThreadpoolReady.ready = true;
resolve();
};
});
uvThreadpoolReady.ready = false;
/** @__sig i */
function _emnapi_is_main_browser_thread() {
return (typeof window !== 'undefined' && typeof document !== 'undefined' && true) ? 1 : 0;
}
/** @__sig vppi */
function _emnapi_after_uvthreadpool_ready(callback, q, type) {
if (uvThreadpoolReady.ready) {
(wasmTable.get(callback))(q, type);
}
else {
uvThreadpoolReady.then(function () {
(wasmTable.get(callback))(q, type);
});
}
}
/** @__sig vpi */
function _emnapi_tell_js_uvthreadpool(threads, size) {
var p = [];
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
var _loop_1 = function (i) {
var pthreadPtr = HEAP_DATA_VIEW.getInt32(threads + i * 4, true);
var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr);
p.push(new Promise(function (resolve) {
var handler = function (e) {
var data = e.data;
var __emnapi__ = data.__emnapi__;
if (__emnapi__ && __emnapi__.type === 'async-thread-ready') {
resolve();
if (worker && typeof worker.unref === 'function') {
worker.unref();
}
{
worker.removeEventListener('message', handler);
}
}
};
{
worker.addEventListener('message', handler);
}
}));
};
for (var i = 0; i < size; i++) {
_loop_1(i);
}
Promise.all(p).then(uvThreadpoolReadyResolve);
}
/** @__sig v */
function _emnapi_emit_async_thread_ready() {
if (!ENVIRONMENT_IS_PTHREAD)
return;
var postMessage = napiModule.postMessage;
postMessage({
__emnapi__: {
type: 'async-thread-ready',
payload: {}
}
});
}
var asyncMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
_emnapi_after_uvthreadpool_ready: _emnapi_after_uvthreadpool_ready,
_emnapi_async_send_js: _emnapi_async_send_js,
_emnapi_emit_async_thread_ready: _emnapi_emit_async_thread_ready,
_emnapi_is_main_browser_thread: _emnapi_is_main_browser_thread,
_emnapi_tell_js_uvthreadpool: _emnapi_tell_js_uvthreadpool,
_emnapi_worker_unref: _emnapi_worker_unref
});
/* eslint-disable @typescript-eslint/indent */
/** @__sig ipjp */
function napi_adjust_external_memory(env, change_in_bytes, adjusted_value) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!adjusted_value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var change_in_bytes_number = Number(change_in_bytes);
if (change_in_bytes_number < 0) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var old_size = wasmMemory.buffer.byteLength;
var new_size = old_size + change_in_bytes_number;
new_size = new_size + ((65536 - new_size % 65536) % 65536);
if (wasmMemory.grow((new_size - old_size + 65535) >> 16) === -1) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
if (emnapiCtx.feature.supportBigInt) {
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setBigInt64(adjusted_value, BigInt(wasmMemory.buffer.byteLength), true);
}
else {
$emnapiSetValueI64(adjusted_value, wasmMemory.buffer.byteLength);
}
return envObject.clearLastError();
}
var memoryMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_adjust_external_memory: napi_adjust_external_memory
});
/**
* @__postset
* ```
* emnapiAWST.init();
* ```
*/
var emnapiAWST = {
idGen: {},
values: [undefined],
queued: new Set(),
pending: [],
init: function () {
var idGen = {
nextId: 1,
list: [],
generate: function () {
var id;
if (idGen.list.length) {
id = idGen.list.shift();
}
else {
id = idGen.nextId;
idGen.nextId++;
}
return id;
},
reuse: function (id) {
idGen.list.push(id);
}
};
emnapiAWST.idGen = idGen;
emnapiAWST.values = [undefined];
emnapiAWST.queued = new Set();
emnapiAWST.pending = [];
},
create: function (env, resource, resourceName, execute, complete, data) {
var asyncId = 0;
var triggerAsyncId = 0;
if (emnapiNodeBinding) {
var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resourceName, -1);
asyncId = asyncContext.asyncId;
triggerAsyncId = asyncContext.triggerAsyncId;
}
var id = emnapiAWST.idGen.generate();
emnapiAWST.values[id] = {
env: env,
id: id,
resource: resource,
asyncId: asyncId,
triggerAsyncId: triggerAsyncId,
status: 0,
execute: execute,
complete: complete,
data: data
};
return id;
},
callComplete: function (work, status) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var complete = work.complete;
var env = work.env;
var data = work.data;
var callback = function () {
if (!complete)
return;
var envObject = emnapiCtx.envStore.get(env);
var scope = emnapiCtx.openScope(envObject);
try {
envObject.callbackIntoModule(true, function () {
(wasmTable.get(complete))(env, status, data);
});
}
finally {
emnapiCtx.closeScope(envObject, scope);
}
};
if (emnapiNodeBinding) {
emnapiNodeBinding.node.makeCallback(work.resource, callback, [], {
asyncId: work.asyncId,
triggerAsyncId: work.triggerAsyncId
});
}
else {
callback();
}
},
queue: function (id) {
var work = emnapiAWST.values[id];
if (!work)
return;
if (work.status === 0) {
work.status = 1;
if (emnapiAWST.queued.size >= (Math.abs(emnapiAsyncWorkPoolSize) || 4)) {
emnapiAWST.pending.push(id);
return;
}
emnapiAWST.queued.add(id);
var env_1 = work.env;
var data_1 = work.data;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var execute = work.execute;
work.status = 2;
emnapiCtx.feature.setImmediate(function () {
(wasmTable.get(execute))(env_1, data_1);
emnapiAWST.queued.delete(id);
work.status = 3;
emnapiCtx.feature.setImmediate(function () {
emnapiAWST.callComplete(work, 0 /* napi_status.napi_ok */);
});
if (emnapiAWST.pending.length > 0) {
var nextWorkId = emnapiAWST.pending.shift();
emnapiAWST.values[nextWorkId].status = 0;
emnapiAWST.queue(nextWorkId);
}
});
}
},
cancel: function (id) {
var index = emnapiAWST.pending.indexOf(id);
if (index !== -1) {
var work_1 = emnapiAWST.values[id];
if (work_1 && (work_1.status === 1)) {
work_1.status = 4;
emnapiAWST.pending.splice(index, 1);
emnapiCtx.feature.setImmediate(function () {
emnapiAWST.callComplete(work_1, 11 /* napi_status.napi_cancelled */);
});
return 0 /* napi_status.napi_ok */;
}
else {
return 9 /* napi_status.napi_generic_failure */;
}
}
return 9 /* napi_status.napi_generic_failure */;
},
remove: function (id) {
var work = emnapiAWST.values[id];
if (!work)
return;
if (emnapiNodeBinding) {
emnapiNodeBinding.node.emitAsyncDestroy({
asyncId: work.asyncId,
triggerAsyncId: work.triggerAsyncId
});
}
emnapiAWST.values[id] = undefined;
emnapiAWST.idGen.reuse(id);
}
};
/** @__sig vppdp */
function _emnapi_node_emit_async_init(async_resource, async_resource_name, trigger_async_id, result) {
if (!emnapiNodeBinding)
return;
var resource = emnapiCtx.handleStore.get(async_resource).value;
var resource_name = emnapiCtx.handleStore.get(async_resource_name).value;
var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resource_name, trigger_async_id);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var asyncId = asyncContext.asyncId;
var triggerAsyncId = asyncContext.triggerAsyncId;
if (result) {
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setFloat64(result, asyncId, true);
HEAP_DATA_VIEW.setFloat64(result + 8, triggerAsyncId, true);
}
}
/** @__sig vdd */
function _emnapi_node_emit_async_destroy(async_id, trigger_async_id) {
if (!emnapiNodeBinding)
return;
emnapiNodeBinding.node.emitAsyncDestroy({
asyncId: async_id,
triggerAsyncId: trigger_async_id
});
}
/* vpddp export function _emnapi_node_open_callback_scope (async_resource: napi_value, async_id: double, trigger_async_id: double, result: Pointer<int64_t>): void {
if (!emnapiNodeBinding || !result) return
const resource = emnapiCtx.handleStore.get(async_resource)!.value
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const nativeCallbackScopePointer = emnapiNodeBinding.node.openCallbackScope(resource, {
asyncId: async_id,
triggerAsyncId: trigger_async_id
})
from64('result')
$_TODO_makeSetValue('result', 0, 'nativeCallbackScopePointer', 'i64')
}
vp
export function _emnapi_node_close_callback_scope (scope: Pointer<int64_t>): void {
if (!emnapiNodeBinding || !scope) return
from64('scope')
const nativeCallbackScopePointer = $_TODO_makeGetValue('scope', 0, 'i64')
emnapiNodeBinding.node.closeCallbackScope(BigInt(nativeCallbackScopePointer))
} */
/** @__sig ipppppddp */
function _emnapi_node_make_callback(env, async_resource, cb, argv, size, async_id, trigger_async_id, result) {
var i = 0;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!emnapiNodeBinding)
return;
var resource = emnapiCtx.handleStore.get(async_resource).value;
var callback = emnapiCtx.handleStore.get(cb).value;
size = size >>> 0;
var arr = Array(size);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
for (; i < size; i++) {
var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true);
arr[i] = emnapiCtx.handleStore.get(argVal).value;
}
var ret = emnapiNodeBinding.node.makeCallback(resource, callback, arr, {
asyncId: async_id,
triggerAsyncId: trigger_async_id
});
if (result) {
var envObject = emnapiCtx.envStore.get(env);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
v = envObject.ensureHandleId(ret);
HEAP_DATA_VIEW.setInt32(result, v, true);
}
}
/** @__sig ippp */
function _emnapi_async_init_js(async_resource, async_resource_name, result) {
if (!emnapiNodeBinding) {
return 9 /* napi_status.napi_generic_failure */;
}
var resource;
if (async_resource) {
resource = Object(emnapiCtx.handleStore.get(async_resource).value);
}
var name = emnapiCtx.handleStore.get(async_resource_name).value;
var ret = emnapiNodeBinding.napi.asyncInit(resource, name);
if (ret.status !== 0)
return ret.status;
var numberValue = ret.value;
if (!((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63))))) {
numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1));
if (numberValue >= (BigInt(1) << BigInt(63))) {
numberValue = numberValue - (BigInt(1) << BigInt(64));
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var low = Number(numberValue & BigInt(0xffffffff));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var high = Number(numberValue >> BigInt(32));
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, low, true);
HEAP_DATA_VIEW.setInt32(result + 4, high, true);
return 0 /* napi_status.napi_ok */;
}
/** @__sig ip */
function _emnapi_async_destroy_js(async_context) {
if (!emnapiNodeBinding) {
return 9 /* napi_status.napi_generic_failure */;
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
var low = HEAP_DATA_VIEW.getInt32(async_context, true);
var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true);
var pointer = BigInt(low >>> 0) | (BigInt(high) << BigInt(32));
var ret = emnapiNodeBinding.napi.asyncDestroy(pointer);
if (ret.status !== 0)
return ret.status;
return 0 /* napi_status.napi_ok */;
}
// https://github.com/nodejs/node-addon-api/pull/1283
/** @__sig ipppp */
function napi_open_callback_scope(env, ignored, async_context_handle, result) {
throw new Error('napi_open_callback_scope has not been implemented yet');
}
/** @__sig ipp */
function napi_close_callback_scope(env, scope) {
throw new Error('napi_close_callback_scope has not been implemented yet');
}
/** @__sig ippppppp */
function napi_make_callback(env, async_context, recv, func, argc, argv, result) {
var i = 0;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!emnapiNodeBinding) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
if (!recv)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (argc > 0) {
if (!argv)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var v8recv = Object(emnapiCtx.handleStore.get(recv).value);
var v8func = emnapiCtx.handleStore.get(func).value;
if (typeof v8func !== 'function') {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
var low = HEAP_DATA_VIEW.getInt32(async_context, true);
var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true);
var ctx = BigInt(low >>> 0) | (BigInt(high) << BigInt(32));
argc = argc >>> 0;
var arr = Array(argc);
for (; i < argc; i++) {
var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true);
arr[i] = emnapiCtx.handleStore.get(argVal).value;
}
var ret = emnapiNodeBinding.napi.makeCallback(ctx, v8recv, v8func, arr);
if (ret.error) {
throw ret.error;
}
if (ret.status !== 0 /* napi_status.napi_ok */)
return envObject.setLastError(ret.status);
if (result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
v = envObject.ensureHandleId(ret.value);
HEAP_DATA_VIEW.setInt32(result, v, true);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig vp */
function _emnapi_env_check_gc_access(env) {
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
}
var nodeMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
_emnapi_async_destroy_js: _emnapi_async_destroy_js,
_emnapi_async_init_js: _emnapi_async_init_js,
_emnapi_env_check_gc_access: _emnapi_env_check_gc_access,
_emnapi_node_emit_async_destroy: _emnapi_node_emit_async_destroy,
_emnapi_node_emit_async_init: _emnapi_node_emit_async_init,
_emnapi_node_make_callback: _emnapi_node_make_callback,
napi_close_callback_scope: napi_close_callback_scope,
napi_make_callback: napi_make_callback,
napi_open_callback_scope: napi_open_callback_scope
});
/**
* @__deps malloc
* @__deps free
* @__postset
* ```
* emnapiTSFN.init();
* ```
*/
var emnapiTSFN = {
offset: {
/* napi_ref */ resource: 0,
/* double */ async_id: 8,
/* double */ trigger_async_id: 16,
/* size_t */ queue_size: 24,
/* void* */ queue: 1 * 4 + 24,
/* size_t */ thread_count: 2 * 4 + 24,
/* bool */ is_closing: 3 * 4 + 24,
/* atomic_uchar */ dispatch_state: 3 * 4 + 28,
/* void* */ context: 3 * 4 + 32,
/* size_t */ max_queue_size: 4 * 4 + 32,
/* napi_ref */ ref: 5 * 4 + 32,
/* napi_env */ env: 6 * 4 + 32,
/* void* */ finalize_data: 7 * 4 + 32,
/* napi_finalize */ finalize_cb: 8 * 4 + 32,
/* napi_threadsafe_function_call_js */ call_js_cb: 9 * 4 + 32,
/* bool */ handles_closing: 10 * 4 + 32,
/* bool */ async_ref: 10 * 4 + 36,
/* int32_t */ mutex: 10 * 4 + 40,
/* int32_t */ cond: 10 * 4 + 44,
end: 10 * 4 + 48
},
init: function () {
if (typeof PThread !== 'undefined') {
PThread.unusedWorkers.forEach(emnapiTSFN.addListener);
PThread.runningWorkers.forEach(emnapiTSFN.addListener);
var __original_getNewWorker_1 = PThread.getNewWorker;
PThread.getNewWorker = function () {
var r = __original_getNewWorker_1.apply(this, arguments);
emnapiTSFN.addListener(r);
return r;
};
}
},
addListener: function (worker) {
if (!worker)
return false;
if (worker._emnapiTSFNListener)
return true;
var handler = function (e) {
var data = e.data;
var __emnapi__ = data.__emnapi__;
if (__emnapi__) {
var type = __emnapi__.type;
var payload = __emnapi__.payload;
if (type === 'tsfn-send') {
emnapiTSFN.dispatch(payload.tsfn);
}
}
};
var dispose = function () {
{
worker.removeEventListener('message', handler, false);
}
delete worker._emnapiTSFNListener;
};
worker._emnapiTSFNListener = { handler: handler, dispose: dispose };
{
worker.addEventListener('message', handler, false);
}
return true;
},
initQueue: function (func) {
var size = 2 * 4;
var queue = _malloc(size);
if (!queue)
return false;
new Uint8Array(wasmMemory.buffer, queue, size).fill(0);
emnapiTSFN.storeSizeTypeValue(func + emnapiTSFN.offset.queue, queue, false);
return true;
},
destroyQueue: function (func) {
var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);
if (queue) {
_free(queue);
}
},
pushQueue: function (func, data) {
var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);
var head = emnapiTSFN.loadSizeTypeValue(queue, false);
var tail = emnapiTSFN.loadSizeTypeValue(queue + 4, false);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var size = 2 * 4;
var node = _malloc(size);
if (!node)
throw new Error('OOM');
emnapiTSFN.storeSizeTypeValue(node, data, false);
emnapiTSFN.storeSizeTypeValue(node + 4, 0, false);
if (head === 0 && tail === 0) {
emnapiTSFN.storeSizeTypeValue(queue, node, false);
emnapiTSFN.storeSizeTypeValue(queue + 4, node, false);
}
else {
emnapiTSFN.storeSizeTypeValue(tail + 4, node, false);
emnapiTSFN.storeSizeTypeValue(queue + 4, node, false);
}
emnapiTSFN.addQueueSize(func);
},
shiftQueue: function (func) {
var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);
var head = emnapiTSFN.loadSizeTypeValue(queue, false);
if (head === 0)
return 0;
var node = head;
var next = emnapiTSFN.loadSizeTypeValue(head + 4, false);
emnapiTSFN.storeSizeTypeValue(queue, next, false);
if (next === 0) {
emnapiTSFN.storeSizeTypeValue(queue + 4, 0, false);
}
emnapiTSFN.storeSizeTypeValue(node + 4, 0, false);
var value = emnapiTSFN.loadSizeTypeValue(node, false);
_free(node);
emnapiTSFN.subQueueSize(func);
return value;
},
push: function (func, data, mode) {
var mutex = emnapiTSFN.getMutex(func);
var cond = emnapiTSFN.getCond(func);
var waitCondition = function () {
var queueSize = emnapiTSFN.getQueueSize(func);
var maxSize = emnapiTSFN.getMaxQueueSize(func);
var isClosing = emnapiTSFN.getIsClosing(func);
return queueSize >= maxSize && maxSize > 0 && !isClosing;
};
var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && true;
return mutex.execute(function () {
while (waitCondition()) {
if (mode === 0 /* napi_threadsafe_function_call_mode.napi_tsfn_nonblocking */) {
return 15 /* napi_status.napi_queue_full */;
}
/**
* Browser JS main thread can not use `Atomics.wait`
*
* Related:
* https://github.com/nodejs/node/pull/32689
* https://github.com/nodejs/node/pull/33453
*/
if (isBrowserMain) {
return 21 /* napi_status.napi_would_deadlock */;
}
cond.wait();
}
if (emnapiTSFN.getIsClosing(func)) {
if (emnapiTSFN.getThreadCount(func) === 0) {
return 1 /* napi_status.napi_invalid_arg */;
}
else {
emnapiTSFN.subThreadCount(func);
return 16 /* napi_status.napi_closing */;
}
}
else {
emnapiTSFN.pushQueue(func, data);
emnapiTSFN.send(func);
return 0 /* napi_status.napi_ok */;
}
});
},
getMutex: function (func) {
var index = func + emnapiTSFN.offset.mutex;
var mutex = {
lock: function () {
var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && true;
var i32a = new Int32Array(wasmMemory.buffer, index, 1);
if (isBrowserMain) {
while (true) {
var oldValue = Atomics.compareExchange(i32a, 0, 0, 1);
if (oldValue === 0) {
return;
}
}
}
else {
while (true) {
var oldValue = Atomics.compareExchange(i32a, 0, 0, 1);
if (oldValue === 0) {
return;
}
Atomics.wait(i32a, 0, 1);
}
}
},
/* lockAsync () {
return new Promise<void>(resolve => {
const again = (): void => { fn() }
const fn = (): void => {
const i32a = new Int32Array(wasmMemory.buffer, index, 1)
const oldValue = Atomics.compareExchange(i32a, 0, 0, 1)
if (oldValue === 0) {
resolve()
return
}
(Atomics as any).waitAsync(i32a, 0, 1).value.then(again)
}
fn()
})
}, */
unlock: function () {
var i32a = new Int32Array(wasmMemory.buffer, index, 1);
var oldValue = Atomics.compareExchange(i32a, 0, 1, 0);
if (oldValue !== 1) {
throw new Error('Tried to unlock while not holding the mutex');
}
Atomics.notify(i32a, 0, 1);
},
execute: function (fn) {
mutex.lock();
try {
return fn();
}
finally {
mutex.unlock();
}
} /* ,
executeAsync<T> (fn: () => Promise<T>): Promise<T> {
return mutex.lockAsync().then(() => {
const r = fn()
mutex.unlock()
return r
}, (err) => {
mutex.unlock()
throw err
})
} */
};
return mutex;
},
getCond: function (func) {
var index = func + emnapiTSFN.offset.cond;
var mutex = emnapiTSFN.getMutex(func);
var cond = {
wait: function () {
var i32a = new Int32Array(wasmMemory.buffer, index, 1);
var value = Atomics.load(i32a, 0);
mutex.unlock();
Atomics.wait(i32a, 0, value);
mutex.lock();
},
/* waitAsync () {
const i32a = new Int32Array(wasmMemory.buffer, index, 1)
const value = Atomics.load(i32a, 0)
mutex.unlock()
const lock = (): Promise<void> => mutex.lockAsync()
try {
return (Atomics as any).waitAsync(i32a, 0, value).value.then(lock, lock)
} catch (err) {
return lock()
}
}, */
signal: function () {
var i32a = new Int32Array(wasmMemory.buffer, index, 1);
Atomics.add(i32a, 0, 1);
Atomics.notify(i32a, 0, 1);
}
};
return cond;
},
getQueueSize: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue_size, true);
},
addQueueSize: function (func) {
var offset = emnapiTSFN.offset.queue_size;
var arr, index;
arr = new Uint32Array(wasmMemory.buffer);
index = (func + offset) >> 2;
Atomics.add(arr, index, 1);
},
subQueueSize: function (func) {
var offset = emnapiTSFN.offset.queue_size;
var arr, index;
arr = new Uint32Array(wasmMemory.buffer);
index = (func + offset) >> 2;
Atomics.sub(arr, index, 1);
},
getThreadCount: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.thread_count, true);
},
addThreadCount: function (func) {
var offset = emnapiTSFN.offset.thread_count;
var arr, index;
arr = new Uint32Array(wasmMemory.buffer);
index = (func + offset) >> 2;
Atomics.add(arr, index, 1);
},
subThreadCount: function (func) {
var offset = emnapiTSFN.offset.thread_count;
var arr, index;
arr = new Uint32Array(wasmMemory.buffer);
index = (func + offset) >> 2;
Atomics.sub(arr, index, 1);
},
getIsClosing: function (func) {
return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2);
},
setIsClosing: function (func, value) {
Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2, value);
},
getHandlesClosing: function (func) {
return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2);
},
setHandlesClosing: function (func, value) {
Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2, value);
},
getDispatchState: function (func) {
return Atomics.load(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2);
},
getContext: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.context, false);
},
getMaxQueueSize: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.max_queue_size, true);
},
getEnv: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.env, false);
},
getCallJSCb: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.call_js_cb, false);
},
getRef: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.ref, false);
},
getResource: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.resource, false);
},
getFinalizeCb: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_cb, false);
},
getFinalizeData: function (func) {
return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_data, false);
},
loadSizeTypeValue: function (offset, unsigned) {
var ret;
var arr;
if (unsigned) {
arr = new Uint32Array(wasmMemory.buffer);
ret = Atomics.load(arr, offset >> 2);
return ret;
}
else {
arr = new Int32Array(wasmMemory.buffer);
ret = Atomics.load(arr, offset >> 2);
return ret;
}
},
storeSizeTypeValue: function (offset, value, unsigned) {
var arr;
if (unsigned) {
arr = new Uint32Array(wasmMemory.buffer);
Atomics.store(arr, offset >> 2, value);
return undefined;
}
else {
arr = new Int32Array(wasmMemory.buffer);
Atomics.store(arr, offset >> 2, value >>> 0);
return undefined;
}
},
destroy: function (func) {
emnapiTSFN.destroyQueue(func);
var env = emnapiTSFN.getEnv(func);
var envObject = emnapiCtx.envStore.get(env);
var ref = emnapiTSFN.getRef(func);
if (ref) {
emnapiCtx.refStore.get(ref).dispose();
}
emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);
envObject.unref();
var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
var arr = new Int32Array(wasmMemory.buffer);
if (Atomics.load(arr, asyncRefOffset)) {
Atomics.store(arr, asyncRefOffset, 0);
emnapiCtx.decreaseWaitingRequestCounter();
}
var resource = emnapiTSFN.getResource(func);
emnapiCtx.refStore.get(resource).dispose();
if (emnapiNodeBinding) {
var view = new DataView(wasmMemory.buffer);
var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
_emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
}
_free(func);
},
emptyQueueAndDelete: function (func) {
var callJsCb = emnapiTSFN.getCallJSCb(func);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var context = emnapiTSFN.getContext(func);
var data;
while (emnapiTSFN.getQueueSize(func) > 0) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
data = emnapiTSFN.shiftQueue(func);
if (callJsCb) {
(wasmTable.get(callJsCb))(0, 0, context, data);
}
}
emnapiTSFN.destroy(func);
},
finalize: function (func) {
var env = emnapiTSFN.getEnv(func);
var envObject = emnapiCtx.envStore.get(env);
emnapiCtx.openScope(envObject);
var finalize = emnapiTSFN.getFinalizeCb(func);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var data = emnapiTSFN.getFinalizeData(func);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var context = emnapiTSFN.getContext(func);
var f = function () {
envObject.callFinalizerInternal(0, finalize, data, context);
};
try {
if (finalize) {
if (emnapiNodeBinding) {
var resource = emnapiTSFN.getResource(func);
var resource_value = emnapiCtx.refStore.get(resource).get();
var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
var view = new DataView(wasmMemory.buffer);
var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
asyncId: asyncId,
triggerAsyncId: triggerAsyncId
});
}
else {
f();
}
}
emnapiTSFN.emptyQueueAndDelete(func);
}
finally {
emnapiCtx.closeScope(envObject);
}
},
cleanup: function (func) {
emnapiTSFN.closeHandlesAndMaybeDelete(func, 1);
},
closeHandlesAndMaybeDelete: function (func, set_closing) {
var env = emnapiTSFN.getEnv(func);
var envObject = emnapiCtx.envStore.get(env);
emnapiCtx.openScope(envObject);
try {
if (set_closing) {
emnapiTSFN.getMutex(func).execute(function () {
emnapiTSFN.setIsClosing(func, 1);
if (emnapiTSFN.getMaxQueueSize(func) > 0) {
emnapiTSFN.getCond(func).signal();
}
});
}
if (emnapiTSFN.getHandlesClosing(func)) {
return;
}
emnapiTSFN.setHandlesClosing(func, 1);
emnapiCtx.feature.setImmediate(function () {
emnapiTSFN.finalize(func);
});
}
finally {
emnapiCtx.closeScope(envObject);
}
},
dispatchOne: function (func) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var data = 0;
var popped_value = false;
var has_more = false;
var mutex = emnapiTSFN.getMutex(func);
var cond = emnapiTSFN.getCond(func);
mutex.execute(function () {
if (emnapiTSFN.getIsClosing(func)) {
emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);
}
else {
var size = emnapiTSFN.getQueueSize(func);
if (size > 0) {
data = emnapiTSFN.shiftQueue(func);
popped_value = true;
var maxQueueSize = emnapiTSFN.getMaxQueueSize(func);
if (size === maxQueueSize && maxQueueSize > 0) {
cond.signal();
}
size--;
}
if (size === 0) {
if (emnapiTSFN.getThreadCount(func) === 0) {
emnapiTSFN.setIsClosing(func, 1);
if (emnapiTSFN.getMaxQueueSize(func) > 0) {
cond.signal();
}
emnapiTSFN.closeHandlesAndMaybeDelete(func, 0);
}
}
else {
has_more = true;
}
}
});
if (popped_value) {
var env = emnapiTSFN.getEnv(func);
var envObject_1 = emnapiCtx.envStore.get(env);
emnapiCtx.openScope(envObject_1);
var f = function () {
envObject_1.callbackIntoModule(false, function () {
var callJsCb = emnapiTSFN.getCallJSCb(func);
var ref = emnapiTSFN.getRef(func);
var js_callback = ref ? emnapiCtx.refStore.get(ref).get() : 0;
if (callJsCb) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var context = emnapiTSFN.getContext(func);
(wasmTable.get(callJsCb))(env, js_callback, context, data);
}
else {
var jsCallback = js_callback ? emnapiCtx.handleStore.get(js_callback).value : null;
if (typeof jsCallback === 'function') {
jsCallback();
}
}
});
};
try {
if (emnapiNodeBinding) {
var resource = emnapiTSFN.getResource(func);
var resource_value = emnapiCtx.refStore.get(resource).get();
var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
var view = new DataView(wasmMemory.buffer);
emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
asyncId: view.getFloat64(func + emnapiTSFN.offset.async_id, true),
triggerAsyncId: view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true)
});
}
else {
f();
}
}
finally {
emnapiCtx.closeScope(envObject_1);
}
}
return has_more;
},
dispatch: function (func) {
var has_more = true;
var iterations_left = 1000;
var ui32a = new Uint32Array(wasmMemory.buffer);
var index = (func + emnapiTSFN.offset.dispatch_state) >> 2;
while (has_more && --iterations_left !== 0) {
Atomics.store(ui32a, index, 1);
has_more = emnapiTSFN.dispatchOne(func);
if (Atomics.exchange(ui32a, index, 0) !== 1) {
has_more = true;
}
}
if (has_more) {
emnapiTSFN.send(func);
}
},
send: function (func) {
var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2, 1 << 1);
if ((current_state & 1) === 1) {
return;
}
if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {
postMessage({
__emnapi__: {
type: 'tsfn-send',
payload: {
tsfn: func
}
}
});
}
else {
emnapiCtx.feature.setImmediate(function () {
emnapiTSFN.dispatch(func);
});
}
}
};
/** @__sig ippppppppppp */
function napi_create_threadsafe_function(env, func, async_resource, async_resource_name, max_queue_size, initial_thread_count, thread_finalize_data, thread_finalize_cb, context, call_js_cb, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!async_resource_name)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
max_queue_size = max_queue_size >>> 0;
initial_thread_count = initial_thread_count >>> 0;
if (initial_thread_count === 0) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var ref = 0;
if (!func) {
if (!call_js_cb)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
else {
var funcValue = emnapiCtx.handleStore.get(func).value;
if (typeof funcValue !== 'function') {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
ref = emnapiCtx.createReference(envObject, func, 1, 1 /* ReferenceOwnership.kUserland */).id;
}
var asyncResourceObject;
if (async_resource) {
asyncResourceObject = emnapiCtx.handleStore.get(async_resource).value;
if (asyncResourceObject == null) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
asyncResourceObject = Object(asyncResourceObject);
}
else {
asyncResourceObject = {};
}
var resource = envObject.ensureHandleId(asyncResourceObject);
var asyncResourceName = emnapiCtx.handleStore.get(async_resource_name).value;
if (typeof asyncResourceName === 'symbol') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
asyncResourceName = String(asyncResourceName);
var resource_name = envObject.ensureHandleId(asyncResourceName);
// tsfn create
var sizeofTSFN = emnapiTSFN.offset.end;
var tsfn = _malloc(sizeofTSFN);
if (!tsfn)
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* ReferenceOwnership.kUserland */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var resource_ = resourceRef.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(tsfn, resource_, true);
if (!emnapiTSFN.initQueue(tsfn)) {
_free(tsfn);
resourceRef.dispose();
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
_emnapi_node_emit_async_init(resource, resource_name, -1, tsfn + emnapiTSFN.offset.async_id);
HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.thread_count, initial_thread_count, true);
HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.context, context, true);
HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.max_queue_size, max_queue_size, true);
HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.ref, ref, true);
HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.env, env, true);
HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.finalize_data, thread_finalize_data, true);
HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.finalize_cb, thread_finalize_cb, true);
HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.call_js_cb, call_js_cb, true);
emnapiCtx.addCleanupHook(envObject, emnapiTSFN.cleanup, tsfn);
envObject.ref();
emnapiCtx.increaseWaitingRequestCounter();
HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.async_ref, 1, true);
HEAP_DATA_VIEW.setInt32(result, tsfn, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_get_threadsafe_function_context(func, result) {
if (!func || !result) {
abort();
return 1 /* napi_status.napi_invalid_arg */;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var context = emnapiTSFN.getContext(func);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, context, true);
return 0 /* napi_status.napi_ok */;
}
/** @__sig ippi */
function napi_call_threadsafe_function(func, data, mode) {
if (!func) {
abort();
return 1 /* napi_status.napi_invalid_arg */;
}
return emnapiTSFN.push(func, data, mode);
}
/** @__sig ip */
function napi_acquire_threadsafe_function(func) {
if (!func) {
abort();
return 1 /* napi_status.napi_invalid_arg */;
}
var mutex = emnapiTSFN.getMutex(func);
return mutex.execute(function () {
if (emnapiTSFN.getIsClosing(func)) {
return 16 /* napi_status.napi_closing */;
}
emnapiTSFN.addThreadCount(func);
return 0 /* napi_status.napi_ok */;
});
}
/** @__sig ipi */
function napi_release_threadsafe_function(func, mode) {
if (!func) {
abort();
return 1 /* napi_status.napi_invalid_arg */;
}
var mutex = emnapiTSFN.getMutex(func);
var cond = emnapiTSFN.getCond(func);
return mutex.execute(function () {
if (emnapiTSFN.getThreadCount(func) === 0) {
return 1 /* napi_status.napi_invalid_arg */;
}
emnapiTSFN.subThreadCount(func);
if (emnapiTSFN.getThreadCount(func) === 0 || mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) {
var isClosing = emnapiTSFN.getIsClosing(func);
if (!isClosing) {
var isClosingValue = (mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) ? 1 : 0;
emnapiTSFN.setIsClosing(func, isClosingValue);
if (isClosingValue && emnapiTSFN.getMaxQueueSize(func) > 0) {
cond.signal();
}
emnapiTSFN.send(func);
}
}
return 0 /* napi_status.napi_ok */;
});
}
/** @__sig ipp */
function napi_unref_threadsafe_function(env, func) {
if (!func) {
abort();
return 1 /* napi_status.napi_invalid_arg */;
}
var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
var arr = new Int32Array(wasmMemory.buffer);
if (Atomics.load(arr, asyncRefOffset)) {
Atomics.store(arr, asyncRefOffset, 0);
emnapiCtx.decreaseWaitingRequestCounter();
}
return 0 /* napi_status.napi_ok */;
}
/** @__sig ipp */
function napi_ref_threadsafe_function(env, func) {
if (!func) {
abort();
return 1 /* napi_status.napi_invalid_arg */;
}
var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2;
var arr = new Int32Array(wasmMemory.buffer);
if (!Atomics.load(arr, asyncRefOffset)) {
Atomics.store(arr, asyncRefOffset, 1);
emnapiCtx.increaseWaitingRequestCounter();
}
return 0 /* napi_status.napi_ok */;
}
var emnapiAWMT = {
unusedWorkers: [],
runningWorkers: [],
workQueue: [],
workerReady: null,
offset: {
/* napi_ref */ resource: 0,
/* double */ async_id: 8,
/* double */ trigger_async_id: 16,
/* napi_env */ env: 24,
/* void* */ data: 1 * 4 + 24,
/* napi_async_execute_callback */ execute: 2 * 4 + 24,
/* napi_async_complete_callback */ complete: 3 * 4 + 24,
end: 4 * 4 + 24
},
init: function () {
emnapiAWMT.unusedWorkers = [];
emnapiAWMT.runningWorkers = [];
emnapiAWMT.workQueue = [];
emnapiAWMT.workerReady = null;
},
addListener: function (worker) {
if (!worker)
return false;
if (worker._emnapiAWMTListener)
return true;
var handler = function (e) {
var data = e.data;
var __emnapi__ = data.__emnapi__;
if (__emnapi__) {
var type = __emnapi__.type;
var payload = __emnapi__.payload;
if (type === 'async-work-complete') {
emnapiCtx.decreaseWaitingRequestCounter();
emnapiAWMT.runningWorkers.splice(emnapiAWMT.runningWorkers.indexOf(worker), 1);
emnapiAWMT.unusedWorkers.push(worker);
emnapiAWMT.checkIdleWorker();
emnapiAWMT.callComplete(payload.work, 0 /* napi_status.napi_ok */);
}
else if (type === 'async-work-queue') {
emnapiAWMT.scheduleWork(payload.work);
}
else if (type === 'async-work-cancel') {
emnapiAWMT.cancelWork(payload.work);
}
}
};
var dispose = function () {
{
worker.removeEventListener('message', handler, false);
}
delete worker._emnapiAWMTListener;
};
worker._emnapiAWMTListener = { handler: handler, dispose: dispose };
{
worker.addEventListener('message', handler, false);
}
return true;
},
initWorkers: function (n) {
if (ENVIRONMENT_IS_PTHREAD) {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
return emnapiAWMT.workerReady || (emnapiAWMT.workerReady = Promise.resolve());
}
if (emnapiAWMT.workerReady)
return emnapiAWMT.workerReady;
if (typeof onCreateWorker !== 'function') {
throw new TypeError('`options.onCreateWorker` is not a function');
}
var promises = [];
var args = [];
if (!('emnapi_async_worker_create' in wasmInstance.exports)) {
throw new TypeError('`emnapi_async_worker_create` is not exported, please try to add `--export=emnapi_async_worker_create` to linker flags');
}
for (var i = 0; i < n; ++i) {
args.push(wasmInstance.exports.emnapi_async_worker_create());
}
try {
var _loop_1 = function (i) {
var worker = onCreateWorker({ type: 'async-work', name: 'emnapi-async-worker' });
var p = PThread.loadWasmModuleToWorker(worker);
emnapiAWMT.addListener(worker);
promises.push(p.then(function () {
if (typeof worker.unref === 'function') {
worker.unref();
}
}));
emnapiAWMT.unusedWorkers.push(worker);
var arg = args[i];
worker.threadBlockBase = arg;
worker.postMessage({
__emnapi__: {
type: 'async-worker-init',
payload: { arg: arg }
}
});
};
for (var i = 0; i < n; ++i) {
_loop_1(i);
}
}
catch (err) {
for (var i = 0; i < n; ++i) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var arg = args[i];
_free(arg);
}
throw err;
}
emnapiAWMT.workerReady = Promise.all(promises);
return emnapiAWMT.workerReady;
},
checkIdleWorker: function () {
if (emnapiAWMT.unusedWorkers.length > 0 && emnapiAWMT.workQueue.length > 0) {
var worker = emnapiAWMT.unusedWorkers.shift();
var work = emnapiAWMT.workQueue.shift();
emnapiAWMT.runningWorkers.push(worker);
worker.postMessage({
__emnapi__: {
type: 'async-work-execute',
payload: { work: work }
}
});
}
},
getResource: function (work) {
return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.resource, false);
},
getExecute: function (work) {
return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.execute, false);
},
getComplete: function (work) {
return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.complete, false);
},
getEnv: function (work) {
return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.env, false);
},
getData: function (work) {
return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.data, false);
},
scheduleWork: function (work) {
var _a;
if (ENVIRONMENT_IS_PTHREAD) {
var postMessage_1 = napiModule.postMessage;
postMessage_1({
__emnapi__: {
type: 'async-work-queue',
payload: { work: work }
}
});
return;
}
emnapiCtx.increaseWaitingRequestCounter();
emnapiAWMT.workQueue.push(work);
if ((_a = emnapiAWMT.workerReady) === null || _a === void 0 ? void 0 : _a.ready) {
emnapiAWMT.checkIdleWorker();
}
else {
var fail = function (err) {
emnapiCtx.decreaseWaitingRequestCounter();
throw err;
};
try {
emnapiAWMT.initWorkers(_emnapi_async_work_pool_size()).then(function () {
emnapiAWMT.workerReady.ready = true;
emnapiAWMT.checkIdleWorker();
}, fail);
}
catch (err) {
fail(err);
}
}
},
cancelWork: function (work) {
if (ENVIRONMENT_IS_PTHREAD) {
var postMessage_2 = napiModule.postMessage;
postMessage_2({
__emnapi__: {
type: 'async-work-cancel',
payload: { work: work }
}
});
return 0 /* napi_status.napi_ok */;
}
var index = emnapiAWMT.workQueue.indexOf(work);
if (index !== -1) {
emnapiAWMT.workQueue.splice(index, 1);
emnapiCtx.feature.setImmediate(function () {
emnapiCtx.decreaseWaitingRequestCounter();
emnapiAWMT.checkIdleWorker();
emnapiAWMT.callComplete(work, 11 /* napi_status.napi_cancelled */);
});
return 0 /* napi_status.napi_ok */;
}
return 9 /* napi_status.napi_generic_failure */;
},
callComplete: function (work, status) {
var complete = emnapiAWMT.getComplete(work);
var env = emnapiAWMT.getEnv(work);
var data = emnapiAWMT.getData(work);
var envObject = emnapiCtx.envStore.get(env);
var scope = emnapiCtx.openScope(envObject);
var callback = function () {
if (!complete)
return;
envObject.callbackIntoModule(true, function () {
(wasmTable.get(complete))(env, status, data);
});
};
try {
if (emnapiNodeBinding) {
var resource = emnapiAWMT.getResource(work);
var resource_value = emnapiCtx.refStore.get(resource).get();
var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
var view = new DataView(wasmMemory.buffer);
var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true);
var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true);
emnapiNodeBinding.node.makeCallback(resourceObject, callback, [], {
asyncId: asyncId,
triggerAsyncId: triggerAsyncId
});
}
else {
callback();
}
}
finally {
emnapiCtx.closeScope(envObject, scope);
}
}
};
/** @__sig ippppppp */
var napi_create_async_work = singleThreadAsyncWork
? function (env, resource, resource_name, execute, complete, data, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!execute)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var resourceObject;
if (resource) {
resourceObject = Object(emnapiCtx.handleStore.get(resource).value);
}
else {
resourceObject = {};
}
if (!resource_name)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var resourceName = String(emnapiCtx.handleStore.get(resource_name).value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var id = emnapiAWST.create(env, resourceObject, resourceName, execute, complete, data);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, id, true);
return envObject.clearLastError();
}
: function (env, resource, resource_name, execute, complete, data, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!execute)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var resourceObject;
if (resource) {
resourceObject = Object(emnapiCtx.handleStore.get(resource).value);
}
else {
resourceObject = {};
}
if (!resource_name)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var sizeofAW = emnapiAWMT.offset.end;
var aw = _malloc(sizeofAW);
if (!aw)
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
new Uint8Array(wasmMemory.buffer).subarray(aw, aw + sizeofAW).fill(0);
var s = envObject.ensureHandleId(resourceObject);
var resourceRef = emnapiCtx.createReference(envObject, s, 1, 1 /* ReferenceOwnership.kUserland */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var resource_ = resourceRef.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(aw, resource_, true);
_emnapi_node_emit_async_init(s, resource_name, -1, aw + emnapiAWMT.offset.async_id);
HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.env, env, true);
HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.execute, execute, true);
HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.complete, complete, true);
HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.data, data, true);
HEAP_DATA_VIEW.setInt32(result, aw, true);
return envObject.clearLastError();
};
/** @__sig ipp */
var napi_delete_async_work = singleThreadAsyncWork
? function (env, work) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!work)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
emnapiAWST.remove(work);
return envObject.clearLastError();
}
: function (env, work) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!work)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var resource = emnapiAWMT.getResource(work);
emnapiCtx.refStore.get(resource).dispose();
if (emnapiNodeBinding) {
var view = new DataView(wasmMemory.buffer);
var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true);
var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true);
_emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
}
_free(work);
return envObject.clearLastError();
};
/** @__sig ipp */
var napi_queue_async_work = singleThreadAsyncWork
? function (env, work) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!work)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
emnapiAWST.queue(work);
return envObject.clearLastError();
}
: function (env, work) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!work)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
emnapiAWMT.scheduleWork(work);
return envObject.clearLastError();
};
/** @__sig ipp */
var napi_cancel_async_work = singleThreadAsyncWork
? function (env, work) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!work)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var status = emnapiAWST.cancel(work);
if (status === 0 /* napi_status.napi_ok */)
return envObject.clearLastError();
return envObject.setLastError(status);
}
: function (env, work) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!work)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var status = emnapiAWMT.cancelWork(work);
if (status === 0 /* napi_status.napi_ok */)
return envObject.clearLastError();
return envObject.setLastError(status);
};
function initWorker(startArg) {
if (napiModule.childThread) {
if (typeof wasmInstance.exports.emnapi_async_worker_init !== 'function') {
throw new TypeError('`emnapi_async_worker_init` is not exported, please try to add `--export=emnapi_async_worker_init` to linker flags');
}
wasmInstance.exports.emnapi_async_worker_init(startArg);
}
else {
throw new Error('startThread is only available in child threads');
}
}
function executeAsyncWork(work) {
if (!ENVIRONMENT_IS_PTHREAD)
return;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var execute = emnapiAWMT.getExecute(work);
var env = emnapiAWMT.getEnv(work);
var data = emnapiAWMT.getData(work);
(wasmTable.get(execute))(env, data);
var postMessage = napiModule.postMessage;
postMessage({
__emnapi__: {
type: 'async-work-complete',
payload: { work: work }
}
});
}
napiModule.initWorker = initWorker;
napiModule.executeAsyncWork = executeAsyncWork;
var asyncWorkMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_cancel_async_work: napi_cancel_async_work,
napi_create_async_work: napi_create_async_work,
napi_delete_async_work: napi_delete_async_work,
napi_queue_async_work: napi_queue_async_work
});
/**
* @__deps malloc
* @__deps free
* @__postset
* ```
* emnapiExternalMemory.init();
* ```
*/
var emnapiExternalMemory = {
registry: typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined,
table: new WeakMap(),
wasmMemoryViewTable: new WeakMap(),
init: function () {
emnapiExternalMemory.registry = typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined;
emnapiExternalMemory.table = new WeakMap();
emnapiExternalMemory.wasmMemoryViewTable = new WeakMap();
},
isDetachedArrayBuffer: function (arrayBuffer) {
if (arrayBuffer.byteLength === 0) {
try {
// eslint-disable-next-line no-new
new Uint8Array(arrayBuffer);
}
catch (_) {
return true;
}
}
return false;
},
getArrayBufferPointer: function (arrayBuffer, shouldCopy) {
var _a;
var info = {
address: 0,
ownership: 0 /* ReferenceOwnership.kRuntime */,
runtimeAllocated: 0
};
if (arrayBuffer === wasmMemory.buffer) {
return info;
}
var isDetached = emnapiExternalMemory.isDetachedArrayBuffer(arrayBuffer);
if (emnapiExternalMemory.table.has(arrayBuffer)) {
var cachedInfo = emnapiExternalMemory.table.get(arrayBuffer);
if (isDetached) {
cachedInfo.address = 0;
return cachedInfo;
}
if (shouldCopy && cachedInfo.ownership === 0 /* ReferenceOwnership.kRuntime */ && cachedInfo.runtimeAllocated === 1) {
new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), cachedInfo.address);
}
return cachedInfo;
}
if (isDetached || (arrayBuffer.byteLength === 0)) {
return info;
}
if (!shouldCopy) {
return info;
}
var pointer = _malloc(arrayBuffer.byteLength);
if (!pointer)
throw new Error('Out of memory');
new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), pointer);
info.address = pointer;
info.ownership = emnapiExternalMemory.registry ? 0 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.kUserland */;
info.runtimeAllocated = 1;
emnapiExternalMemory.table.set(arrayBuffer, info);
(_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(arrayBuffer, pointer);
return info;
},
getOrUpdateMemoryView: function (view) {
if (view.buffer === wasmMemory.buffer) {
if (!emnapiExternalMemory.wasmMemoryViewTable.has(view)) {
emnapiExternalMemory.wasmMemoryViewTable.set(view, {
Ctor: view.constructor,
address: view.byteOffset,
length: view instanceof DataView ? view.byteLength : view.length,
ownership: 1 /* ReferenceOwnership.kUserland */,
runtimeAllocated: 0
});
}
return view;
}
var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) ||
((typeof SharedArrayBuffer === 'function') && (view.buffer instanceof SharedArrayBuffer));
if (maybeOldWasmMemory && emnapiExternalMemory.wasmMemoryViewTable.has(view)) {
var info = emnapiExternalMemory.wasmMemoryViewTable.get(view);
var Ctor = info.Ctor;
var newView = void 0;
var Buffer_1 = emnapiCtx.feature.Buffer;
if (typeof Buffer_1 === 'function' && Ctor === Buffer_1) {
newView = Buffer_1.from(wasmMemory.buffer, info.address, info.length);
}
else {
newView = new Ctor(wasmMemory.buffer, info.address, info.length);
}
emnapiExternalMemory.wasmMemoryViewTable.set(newView, info);
return newView;
}
return view;
},
getViewPointer: function (view, shouldCopy) {
view = emnapiExternalMemory.getOrUpdateMemoryView(view);
if (view.buffer === wasmMemory.buffer) {
if (emnapiExternalMemory.wasmMemoryViewTable.has(view)) {
var _a = emnapiExternalMemory.wasmMemoryViewTable.get(view), address_1 = _a.address, ownership_1 = _a.ownership, runtimeAllocated_1 = _a.runtimeAllocated;
return { address: address_1, ownership: ownership_1, runtimeAllocated: runtimeAllocated_1, view: view };
}
return { address: view.byteOffset, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0, view: view };
}
var _b = emnapiExternalMemory.getArrayBufferPointer(view.buffer, shouldCopy), address = _b.address, ownership = _b.ownership, runtimeAllocated = _b.runtimeAllocated;
return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view };
}
};
/* eslint-disable @typescript-eslint/indent */
/**
* @__postset
* ```
* emnapiString.init();
* ```
*/
var emnapiString = {
utf8Decoder: undefined,
utf16Decoder: undefined,
init: function () {
var fallbackDecoder = {
decode: function (bytes) {
var inputIndex = 0;
var pendingSize = Math.min(0x1000, bytes.length + 1);
var pending = new Uint16Array(pendingSize);
var chunks = [];
var pendingIndex = 0;
for (;;) {
var more = inputIndex < bytes.length;
if (!more || (pendingIndex >= pendingSize - 1)) {
var subarray = pending.subarray(0, pendingIndex);
var arraylike = subarray;
chunks.push(String.fromCharCode.apply(null, arraylike));
if (!more) {
return chunks.join('');
}
bytes = bytes.subarray(inputIndex);
inputIndex = 0;
pendingIndex = 0;
}
var byte1 = bytes[inputIndex++];
if ((byte1 & 0x80) === 0) {
pending[pendingIndex++] = byte1;
}
else if ((byte1 & 0xe0) === 0xc0) {
var byte2 = bytes[inputIndex++] & 0x3f;
pending[pendingIndex++] = ((byte1 & 0x1f) << 6) | byte2;
}
else if ((byte1 & 0xf0) === 0xe0) {
var byte2 = bytes[inputIndex++] & 0x3f;
var byte3 = bytes[inputIndex++] & 0x3f;
pending[pendingIndex++] = ((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3;
}
else if ((byte1 & 0xf8) === 0xf0) {
var byte2 = bytes[inputIndex++] & 0x3f;
var byte3 = bytes[inputIndex++] & 0x3f;
var byte4 = bytes[inputIndex++] & 0x3f;
var codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;
if (codepoint > 0xffff) {
codepoint -= 0x10000;
pending[pendingIndex++] = (codepoint >>> 10) & 0x3ff | 0xd800;
codepoint = 0xdc00 | codepoint & 0x3ff;
}
pending[pendingIndex++] = codepoint;
}
else ;
}
}
};
var utf8Decoder;
utf8Decoder = typeof TextDecoder === 'function' ? new TextDecoder() : fallbackDecoder;
emnapiString.utf8Decoder = utf8Decoder;
var fallbackDecoder2 = {
decode: function (input) {
var bytes = new Uint16Array(input.buffer, input.byteOffset, input.byteLength / 2);
if (bytes.length <= 0x1000) {
return String.fromCharCode.apply(null, bytes);
}
var chunks = [];
var i = 0;
var len = 0;
for (; i < bytes.length; i += len) {
len = Math.min(0x1000, bytes.length - i);
chunks.push(String.fromCharCode.apply(null, bytes.subarray(i, i + len)));
}
return chunks.join('');
}
};
var utf16Decoder;
utf16Decoder = typeof TextDecoder === 'function' ? new TextDecoder('utf-16le') : fallbackDecoder2;
emnapiString.utf16Decoder = utf16Decoder;
},
lengthBytesUTF8: function (str) {
var c;
var len = 0;
for (var i = 0; i < str.length; ++i) {
c = str.charCodeAt(i);
if (c <= 0x7F) {
len++;
}
else if (c <= 0x7FF) {
len += 2;
}
else if (c >= 0xD800 && c <= 0xDFFF) {
len += 4;
++i;
}
else {
len += 3;
}
}
return len;
},
UTF8ToString: function (ptr, length) {
if (!ptr || !length)
return '';
ptr >>>= 0;
var HEAPU8 = new Uint8Array(wasmMemory.buffer);
var end = ptr;
if (length === -1) {
for (; HEAPU8[end];)
++end;
}
else {
end = ptr + (length >>> 0);
}
length = end - ptr;
if (length <= 16) {
var idx = ptr;
var str = '';
while (idx < end) {
var u0 = HEAPU8[idx++];
if (!(u0 & 0x80)) {
str += String.fromCharCode(u0);
continue;
}
var u1 = HEAPU8[idx++] & 63;
if ((u0 & 0xE0) === 0xC0) {
str += String.fromCharCode(((u0 & 31) << 6) | u1);
continue;
}
var u2 = HEAPU8[idx++] & 63;
if ((u0 & 0xF0) === 0xE0) {
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
}
else {
u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (HEAPU8[idx++] & 63);
}
if (u0 < 0x10000) {
str += String.fromCharCode(u0);
}
else {
var ch = u0 - 0x10000;
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
}
}
return str;
}
return emnapiString.utf8Decoder.decode(((typeof SharedArrayBuffer === "function" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer) === "[object SharedArrayBuffer]")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end));
},
stringToUTF8: function (str, outPtr, maxBytesToWrite) {
var HEAPU8 = new Uint8Array(wasmMemory.buffer);
var outIdx = outPtr;
outIdx >>>= 0;
if (!(maxBytesToWrite > 0)) {
return 0;
}
var startIdx = outIdx;
var endIdx = outIdx + maxBytesToWrite - 1;
for (var i = 0; i < str.length; ++i) {
var u = str.charCodeAt(i);
if (u >= 0xD800 && u <= 0xDFFF) {
var u1 = str.charCodeAt(++i);
u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
}
if (u <= 0x7F) {
if (outIdx >= endIdx)
break;
HEAPU8[outIdx++] = u;
}
else if (u <= 0x7FF) {
if (outIdx + 1 >= endIdx)
break;
HEAPU8[outIdx++] = 0xC0 | (u >> 6);
HEAPU8[outIdx++] = 0x80 | (u & 63);
}
else if (u <= 0xFFFF) {
if (outIdx + 2 >= endIdx)
break;
HEAPU8[outIdx++] = 0xE0 | (u >> 12);
HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63);
HEAPU8[outIdx++] = 0x80 | (u & 63);
}
else {
if (outIdx + 3 >= endIdx)
break;
HEAPU8[outIdx++] = 0xF0 | (u >> 18);
HEAPU8[outIdx++] = 0x80 | ((u >> 12) & 63);
HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63);
HEAPU8[outIdx++] = 0x80 | (u & 63);
}
}
HEAPU8[outIdx] = 0;
return outIdx - startIdx;
},
UTF16ToString: function (ptr, length) {
if (!ptr || !length)
return '';
ptr >>>= 0;
var end = ptr;
if (length === -1) {
var idx = end >> 1;
var HEAPU16 = new Uint16Array(wasmMemory.buffer);
while (HEAPU16[idx])
++idx;
end = idx << 1;
}
else {
end = ptr + (length >>> 0) * 2;
}
length = end - ptr;
if (length <= 32) {
return String.fromCharCode.apply(null, new Uint16Array(wasmMemory.buffer, ptr, length / 2));
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var HEAPU8 = new Uint8Array(wasmMemory.buffer);
return emnapiString.utf16Decoder.decode(((typeof SharedArrayBuffer === "function" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer) === "[object SharedArrayBuffer]")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end));
},
stringToUTF16: function (str, outPtr, maxBytesToWrite) {
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
if (maxBytesToWrite < 2)
return 0;
maxBytesToWrite -= 2;
var startPtr = outPtr;
var numCharsToWrite = (maxBytesToWrite < str.length * 2) ? (maxBytesToWrite / 2) : str.length;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
for (var i = 0; i < numCharsToWrite; ++i) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var codeUnit = str.charCodeAt(i);
HEAP_DATA_VIEW.setInt16(outPtr, codeUnit, true);
outPtr += 2;
}
HEAP_DATA_VIEW.setInt16(outPtr, 0, true);
return outPtr - startPtr;
},
newString: function (env, str, length, result, stringMaker) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
var autoLength = length === -1;
var sizelength = length >>> 0;
if (length !== 0) {
if (!str)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!(autoLength || (sizelength <= 2147483647)))
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var strValue = stringMaker(str, autoLength, sizelength);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(strValue).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
},
newExternalString: function (env, str, length, finalize_callback, finalize_hint, result, copied, createApi, stringMaker) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
var autoLength = length === -1;
var sizelength = length >>> 0;
if (length !== 0) {
if (!str)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!(autoLength || (sizelength <= 2147483647)))
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var status = createApi(env, str, length, result);
if (status === 0 /* napi_status.napi_ok */) {
if (copied) {
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(copied, 1, true);
}
if (finalize_callback) {
envObject.callFinalizer(finalize_callback, str, finalize_hint);
}
}
return status;
}
};
/**
* @__sig ippp
*/
function napi_get_array_length(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (!handle.isArray()) {
return envObject.setLastError(8 /* napi_status.napi_array_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = handle.value.length >>> 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setUint32(result, v, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppp
*/
function napi_get_arraybuffer_info(env, arraybuffer, data, byte_length) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!arraybuffer)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(arraybuffer);
if (!handle.isArrayBuffer()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (data) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var p = emnapiExternalMemory.getArrayBufferPointer(handle.value, true).address;
HEAP_DATA_VIEW.setInt32(data, p, true);
}
if (byte_length) {
HEAP_DATA_VIEW.setUint32(byte_length, handle.value.byteLength, true);
}
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_get_prototype(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (handle.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = handle.isObject() || handle.isFunction() ? handle.value : Object(handle.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var p = envObject.ensureHandleId(Object.getPrototypeOf(v));
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, p, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ippppppp
*/
function napi_get_typedarray_info(env, typedarray, type, length, data, arraybuffer, byte_offset) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!typedarray)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(typedarray);
if (!handle.isTypedArray()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var v = handle.value;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (type) {
var t = void 0;
if (v instanceof Int8Array) {
t = 0 /* napi_typedarray_type.napi_int8_array */;
}
else if (v instanceof Uint8Array) {
t = 1 /* napi_typedarray_type.napi_uint8_array */;
}
else if (v instanceof Uint8ClampedArray) {
t = 2 /* napi_typedarray_type.napi_uint8_clamped_array */;
}
else if (v instanceof Int16Array) {
t = 3 /* napi_typedarray_type.napi_int16_array */;
}
else if (v instanceof Uint16Array) {
t = 4 /* napi_typedarray_type.napi_uint16_array */;
}
else if (v instanceof Int32Array) {
t = 5 /* napi_typedarray_type.napi_int32_array */;
}
else if (v instanceof Uint32Array) {
t = 6 /* napi_typedarray_type.napi_uint32_array */;
}
else if (v instanceof Float32Array) {
t = 7 /* napi_typedarray_type.napi_float32_array */;
}
else if (v instanceof Float64Array) {
t = 8 /* napi_typedarray_type.napi_float64_array */;
}
else if (v instanceof BigInt64Array) {
t = 9 /* napi_typedarray_type.napi_bigint64_array */;
}
else if (v instanceof BigUint64Array) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
t = 10 /* napi_typedarray_type.napi_biguint64_array */;
}
else {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
HEAP_DATA_VIEW.setInt32(type, t, true);
}
if (length) {
HEAP_DATA_VIEW.setUint32(length, v.length, true);
}
var buffer;
if (data || arraybuffer) {
buffer = v.buffer;
if (data) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var p = emnapiExternalMemory.getViewPointer(v, true).address;
HEAP_DATA_VIEW.setInt32(data, p, true);
}
if (arraybuffer) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var ab = envObject.ensureHandleId(buffer);
HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true);
}
}
if (byte_offset) {
HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true);
}
return envObject.clearLastError();
}
/**
* @__sig ipppp
*/
function napi_get_buffer_info(env, buffer, data, length) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!buffer)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(buffer);
if (!handle.isBuffer(emnapiCtx.feature.Buffer))
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (handle.isDataView()) {
return napi_get_dataview_info(env, buffer, length, data, 0, 0);
}
return napi_get_typedarray_info(env, buffer, 0, length, data, 0, 0);
}
/**
* @__sig ipppppp
*/
function napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer, byte_offset) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!dataview)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(dataview);
if (!handle.isDataView()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var v = handle.value;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (byte_length) {
HEAP_DATA_VIEW.setUint32(byte_length, v.byteLength, true);
}
var buffer;
if (data || arraybuffer) {
buffer = v.buffer;
if (data) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var p = emnapiExternalMemory.getViewPointer(v, true).address;
HEAP_DATA_VIEW.setInt32(data, p, true);
}
if (arraybuffer) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var ab = envObject.ensureHandleId(buffer);
HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true);
}
}
if (byte_offset) {
HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true);
}
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_get_date_value(env, value, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (!handle.isDate()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
v = handle.value.valueOf();
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setFloat64(result, v, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ippp
*/
function napi_get_value_bool(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'boolean') {
return envObject.setLastError(7 /* napi_status.napi_boolean_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = handle.value ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_get_value_double(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'number') {
return envObject.setLastError(6 /* napi_status.napi_number_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = handle.value;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setFloat64(result, r, true);
return envObject.clearLastError();
}
/**
* @__sig ipppp
*/
function napi_get_value_bigint_int64(env, value, result, lossless) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!emnapiCtx.feature.supportBigInt) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!lossless)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
var numberValue = handle.value;
if (typeof numberValue !== 'bigint') {
return envObject.setLastError(6 /* napi_status.napi_number_expected */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if ((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63)))) {
HEAP_DATA_VIEW.setInt8(lossless, 1, true);
}
else {
HEAP_DATA_VIEW.setInt8(lossless, 0, true);
numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1));
if (numberValue >= (BigInt(1) << BigInt(63))) {
numberValue = numberValue - (BigInt(1) << BigInt(64));
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var low = Number(numberValue & BigInt(0xffffffff));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var high = Number(numberValue >> BigInt(32));
HEAP_DATA_VIEW.setInt32(result, low, true);
HEAP_DATA_VIEW.setInt32(result + 4, high, true);
return envObject.clearLastError();
}
/**
* @__sig ipppp
*/
function napi_get_value_bigint_uint64(env, value, result, lossless) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!emnapiCtx.feature.supportBigInt) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!lossless)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
var numberValue = handle.value;
if (typeof numberValue !== 'bigint') {
return envObject.setLastError(6 /* napi_status.napi_number_expected */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if ((numberValue >= BigInt(0)) && (numberValue < (BigInt(1) << BigInt(64)))) {
HEAP_DATA_VIEW.setInt8(lossless, 1, true);
}
else {
HEAP_DATA_VIEW.setInt8(lossless, 0, true);
numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1));
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var low = Number(numberValue & BigInt(0xffffffff));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var high = Number(numberValue >> BigInt(32));
HEAP_DATA_VIEW.setUint32(result, low, true);
HEAP_DATA_VIEW.setUint32(result + 4, high, true);
return envObject.clearLastError();
}
/**
* @__sig ippppp
*/
function napi_get_value_bigint_words(env, value, sign_bit, word_count, words) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!emnapiCtx.feature.supportBigInt) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!word_count)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (!handle.isBigInt()) {
return envObject.setLastError(17 /* napi_status.napi_bigint_expected */);
}
var isMinus = handle.value < BigInt(0);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
var word_count_int = HEAP_DATA_VIEW.getUint32(word_count, true);
var wordCount = 0;
var bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value;
while (bigintValue !== BigInt(0)) {
wordCount++;
bigintValue = bigintValue >> BigInt(64);
}
bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value;
if (!sign_bit && !words) {
word_count_int = wordCount;
HEAP_DATA_VIEW.setUint32(word_count, word_count_int, true);
}
else {
if (!sign_bit)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!words)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var wordsArr = [];
while (bigintValue !== BigInt(0)) {
var uint64 = bigintValue & ((BigInt(1) << BigInt(64)) - BigInt(1));
wordsArr.push(uint64);
bigintValue = bigintValue >> BigInt(64);
}
var len = Math.min(word_count_int, wordsArr.length);
for (var i = 0; i < len; i++) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var low = Number(wordsArr[i] & BigInt(0xffffffff));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var high = Number(wordsArr[i] >> BigInt(32));
HEAP_DATA_VIEW.setUint32(words + i * 8, low, true);
HEAP_DATA_VIEW.setUint32(words + (i * 8 + 4), high, true);
}
HEAP_DATA_VIEW.setInt32(sign_bit, isMinus ? 1 : 0, true);
HEAP_DATA_VIEW.setUint32(word_count, len, true);
}
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_get_value_external(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (!handle.isExternal()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var p = handle.data();
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, p, true);
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_get_value_int32(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'number') {
return envObject.setLastError(6 /* napi_status.napi_number_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = new Int32Array([handle.value])[0];
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_get_value_int64(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'number') {
return envObject.setLastError(6 /* napi_status.napi_number_expected */);
}
var numberValue = handle.value;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (numberValue === Number.POSITIVE_INFINITY || numberValue === Number.NEGATIVE_INFINITY || isNaN(numberValue)) {
HEAP_DATA_VIEW.setInt32(result, 0, true);
HEAP_DATA_VIEW.setInt32(result + 4, 0, true);
}
else if (numberValue < /* INT64_RANGE_NEGATIVE */ -9223372036854776e3) {
HEAP_DATA_VIEW.setInt32(result, 0, true);
HEAP_DATA_VIEW.setInt32(result + 4, 2147483648, true);
}
else if (numberValue >= /* INT64_RANGE_POSITIVE */ 9223372036854776000) {
HEAP_DATA_VIEW.setUint32(result, 4294967295, true);
HEAP_DATA_VIEW.setUint32(result + 4, 2147483647, true);
}
else {
$emnapiSetValueI64(result, Math.trunc(numberValue));
}
return envObject.clearLastError();
}
/**
* @__sig ippppp
*/
function napi_get_value_string_latin1(env, value, buf, buf_size, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
buf_size = buf_size >>> 0;
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (!buf) {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
HEAP_DATA_VIEW.setUint32(result, handle.value.length, true);
}
else if (buf_size !== 0) {
var copied = 0;
var v = void 0;
for (var i = 0; i < buf_size - 1; ++i) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
v = handle.value.charCodeAt(i) & 0xff;
HEAP_DATA_VIEW.setUint8(buf + i, v, true);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
copied++;
}
HEAP_DATA_VIEW.setUint8(buf + copied, 0, true);
if (result) {
HEAP_DATA_VIEW.setUint32(result, copied, true);
}
}
else if (result) {
HEAP_DATA_VIEW.setUint32(result, 0, true);
}
return envObject.clearLastError();
}
/**
* @__sig ippppp
*/
function napi_get_value_string_utf8(env, value, buf, buf_size, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
buf_size = buf_size >>> 0;
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (!buf) {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var strLength = emnapiString.lengthBytesUTF8(handle.value);
HEAP_DATA_VIEW.setUint32(result, strLength, true);
}
else if (buf_size !== 0) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var copied = emnapiString.stringToUTF8(handle.value, buf, buf_size);
if (result) {
HEAP_DATA_VIEW.setUint32(result, copied, true);
}
}
else if (result) {
HEAP_DATA_VIEW.setUint32(result, 0, true);
}
return envObject.clearLastError();
}
/**
* @__sig ippppp
*/
function napi_get_value_string_utf16(env, value, buf, buf_size, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
buf_size = buf_size >>> 0;
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (!buf) {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
HEAP_DATA_VIEW.setUint32(result, handle.value.length, true);
}
else if (buf_size !== 0) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var copied = emnapiString.stringToUTF16(handle.value, buf, buf_size * 2);
if (result) {
HEAP_DATA_VIEW.setUint32(result, copied / 2, true);
}
}
else if (result) {
HEAP_DATA_VIEW.setUint32(result, 0, true);
}
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_get_value_uint32(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (typeof handle.value !== 'number') {
return envObject.setLastError(6 /* napi_status.napi_number_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = new Uint32Array([handle.value])[0];
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setUint32(result, v, true);
return envObject.clearLastError();
}
var convert2cMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_get_array_length: napi_get_array_length,
napi_get_arraybuffer_info: napi_get_arraybuffer_info,
napi_get_buffer_info: napi_get_buffer_info,
napi_get_dataview_info: napi_get_dataview_info,
napi_get_date_value: napi_get_date_value,
napi_get_prototype: napi_get_prototype,
napi_get_typedarray_info: napi_get_typedarray_info,
napi_get_value_bigint_int64: napi_get_value_bigint_int64,
napi_get_value_bigint_uint64: napi_get_value_bigint_uint64,
napi_get_value_bigint_words: napi_get_value_bigint_words,
napi_get_value_bool: napi_get_value_bool,
napi_get_value_double: napi_get_value_double,
napi_get_value_external: napi_get_value_external,
napi_get_value_int32: napi_get_value_int32,
napi_get_value_int64: napi_get_value_int64,
napi_get_value_string_latin1: napi_get_value_string_latin1,
napi_get_value_string_utf16: napi_get_value_string_utf16,
napi_get_value_string_utf8: napi_get_value_string_utf8,
napi_get_value_uint32: napi_get_value_uint32
});
/**
* @__sig ipip
*/
function napi_create_int32(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = emnapiCtx.addToCurrentScope(value).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.clearLastError();
}
/**
* @__sig ipip
*/
function napi_create_uint32(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = emnapiCtx.addToCurrentScope(value >>> 0).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.clearLastError();
}
/**
* @__sig ipjp
*/
function napi_create_int64(env, low, high, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
var value;
if (!high)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
value = Number(low);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v1 = emnapiCtx.addToCurrentScope(value).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(high, v1, true);
return envObject.clearLastError();
}
/**
* @__sig ipdp
*/
function napi_create_double(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = emnapiCtx.addToCurrentScope(value).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.clearLastError();
}
/**
* @__sig ipppp
*/
function napi_create_string_latin1(env, str, length, result) {
return emnapiString.newString(env, str, length, result, function (str, autoLength, sizeLength) {
var latin1String = '';
var len = 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (autoLength) {
while (true) {
var ch = HEAP_DATA_VIEW.getUint8(str, true);
if (!ch)
break;
latin1String += String.fromCharCode(ch);
str++;
}
}
else {
while (len < sizeLength) {
var ch = HEAP_DATA_VIEW.getUint8(str, true);
if (!ch)
break;
latin1String += String.fromCharCode(ch);
len++;
str++;
}
}
return latin1String;
});
}
/**
* @__sig ipppp
*/
function napi_create_string_utf16(env, str, length, result) {
return emnapiString.newString(env, str, length, result, function (str) {
return emnapiString.UTF16ToString(str, length);
});
}
/**
* @__sig ipppp
*/
function napi_create_string_utf8(env, str, length, result) {
return emnapiString.newString(env, str, length, result, function (str) {
return emnapiString.UTF8ToString(str, length);
});
}
/**
* @__sig ippppppp
*/
function node_api_create_external_string_latin1(env, str, length, finalize_callback, finalize_hint, result, copied) {
return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_latin1, undefined);
}
/**
* @__sig ippppppp
*/
function node_api_create_external_string_utf16(env, str, length, finalize_callback, finalize_hint, result, copied) {
return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_utf16, undefined);
}
/**
* @__sig ipppp
*/
function node_api_create_property_key_latin1(env, str, length, result) {
return napi_create_string_latin1(env, str, length, result);
}
/**
* @__sig ipppp
*/
function node_api_create_property_key_utf8(env, str, length, result) {
return napi_create_string_utf8(env, str, length, result);
}
/**
* @__sig ipppp
*/
function node_api_create_property_key_utf16(env, str, length, result) {
return napi_create_string_utf16(env, str, length, result);
}
/**
* @__sig ipjp
*/
function napi_create_bigint_int64(env, low, high, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!emnapiCtx.feature.supportBigInt) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
var value;
if (!high)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
value = low;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v1 = emnapiCtx.addToCurrentScope(value).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(high, v1, true);
return envObject.clearLastError();
}
/**
* @__sig ipjp
*/
function napi_create_bigint_uint64(env, low, high, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!emnapiCtx.feature.supportBigInt) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
var value;
if (!high)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
value = low & ((BigInt(1) << BigInt(64)) - BigInt(1));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v1 = emnapiCtx.addToCurrentScope(value).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(high, v1, true);
return envObject.clearLastError();
}
/**
* @__sig ipippp
*/
function napi_create_bigint_words(env, sign_bit, word_count, words, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v, i;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!emnapiCtx.feature.supportBigInt) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
word_count = word_count >>> 0;
if (word_count > 2147483647) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (word_count > (1024 * 1024 / (4 * 8) / 2)) {
throw new RangeError('Maximum BigInt size exceeded');
}
var value = BigInt(0);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
for (i = 0; i < word_count; i++) {
var low = HEAP_DATA_VIEW.getUint32(words + i * 8, true);
var high = HEAP_DATA_VIEW.getUint32(words + (i * 8 + 4), true);
var wordi = BigInt(low) | (BigInt(high) << BigInt(32));
value += wordi << BigInt(64 * i);
}
value *= ((BigInt(sign_bit) % BigInt(2) === BigInt(0)) ? BigInt(1) : BigInt(-1));
v = emnapiCtx.addToCurrentScope(value).id;
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
var convert2napiMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_create_bigint_int64: napi_create_bigint_int64,
napi_create_bigint_uint64: napi_create_bigint_uint64,
napi_create_bigint_words: napi_create_bigint_words,
napi_create_double: napi_create_double,
napi_create_int32: napi_create_int32,
napi_create_int64: napi_create_int64,
napi_create_string_latin1: napi_create_string_latin1,
napi_create_string_utf16: napi_create_string_utf16,
napi_create_string_utf8: napi_create_string_utf8,
napi_create_uint32: napi_create_uint32,
node_api_create_external_string_latin1: node_api_create_external_string_latin1,
node_api_create_external_string_utf16: node_api_create_external_string_utf16,
node_api_create_property_key_latin1: node_api_create_property_key_latin1,
node_api_create_property_key_utf16: node_api_create_property_key_utf16,
node_api_create_property_key_utf8: node_api_create_property_key_utf8
});
function emnapiCreateFunction(envObject, utf8name, length, cb, data) {
var functionName = (!utf8name || !length) ? '' : (emnapiString.UTF8ToString(utf8name, length));
var f;
var napiCallback = (wasmTable.get(cb));
var callback = function (envObject) {
return napiCallback(envObject.id, envObject.ctx.scopeStore.currentScope.id);
};
var makeFunction = function (envObject, callback) {
return function () {
var scope = envObject.ctx.openScope(envObject);
var callbackInfo = scope.callbackInfo;
callbackInfo.data = data;
callbackInfo.args = arguments;
callbackInfo.thiz = this;
callbackInfo.fn = f;
try {
var napiValue = envObject.callIntoModule(callback);
return (!napiValue) ? undefined : envObject.ctx.handleStore.get(napiValue).value;
}
finally {
callbackInfo.data = 0;
callbackInfo.args = undefined;
callbackInfo.thiz = undefined;
callbackInfo.fn = undefined;
envObject.ctx.closeScope(envObject, scope);
}
};
};
if (functionName === '') {
f = makeFunction(envObject, callback);
return { status: 0 /* napi_status.napi_ok */, f: f };
}
if (!(/^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(functionName))) {
return { status: 1 /* napi_status.napi_invalid_arg */, f: undefined };
}
if (emnapiCtx.feature.supportNewFunction) {
var _ = makeFunction(envObject, callback);
try {
f = (new Function('_', 'return function ' + functionName + '(){' +
'"use strict";' +
'return _.apply(this,arguments);' +
'};'))(_);
}
catch (_err) {
f = makeFunction(envObject, callback);
if (emnapiCtx.feature.canSetFunctionName)
Object.defineProperty(f, 'name', { value: functionName });
}
}
else {
f = makeFunction(envObject, callback);
if (emnapiCtx.feature.canSetFunctionName)
Object.defineProperty(f, 'name', { value: functionName });
}
return { status: 0 /* napi_status.napi_ok */, f: f };
}
function emnapiDefineProperty(envObject, obj, propertyName, method, getter, setter, value, attributes, data) {
if (getter || setter) {
var localGetter = void 0;
var localSetter = void 0;
if (getter) {
localGetter = emnapiCreateFunction(envObject, 0, 0, getter, data).f;
}
if (setter) {
localSetter = emnapiCreateFunction(envObject, 0, 0, setter, data).f;
}
var desc = {
configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0,
enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0,
get: localGetter,
set: localSetter
};
Object.defineProperty(obj, propertyName, desc);
}
else if (method) {
var localMethod = emnapiCreateFunction(envObject, 0, 0, method, data).f;
var desc = {
configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0,
enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0,
writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0,
value: localMethod
};
Object.defineProperty(obj, propertyName, desc);
}
else {
var desc = {
configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0,
enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0,
writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0,
value: emnapiCtx.handleStore.get(value).value
};
Object.defineProperty(obj, propertyName, desc);
}
}
function emnapiGetHandle(js_object) {
var handle = emnapiCtx.handleStore.get(js_object);
if (!(handle.isObject() || handle.isFunction())) {
return { status: 1 /* napi_status.napi_invalid_arg */ };
}
if (typeof emnapiExternalMemory !== 'undefined' && ArrayBuffer.isView(handle.value)) {
if (emnapiExternalMemory.wasmMemoryViewTable.has(handle.value)) {
handle = emnapiCtx.addToCurrentScope(emnapiExternalMemory.wasmMemoryViewTable.get(handle.value));
}
}
return { status: 0 /* napi_status.napi_ok */, handle: handle };
}
function emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var referenceId;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!emnapiCtx.feature.supportFinalizer) {
if (finalize_cb) {
throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter "finalize_cb" must be 0(NULL)');
}
if (result) {
throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter "result" must be 0(NULL)');
}
}
if (!js_object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handleResult = emnapiGetHandle(js_object);
if (handleResult.status !== 0 /* napi_status.napi_ok */) {
return envObject.setLastError(handleResult.status);
}
var handle = handleResult.handle;
if (envObject.getObjectBinding(handle.value).wrapped !== 0) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var reference = void 0;
if (result) {
if (!finalize_cb)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, 1 /* ReferenceOwnership.kUserland */, finalize_cb, native_object, finalize_hint);
referenceId = reference.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, referenceId, true);
}
else {
if (finalize_cb) {
reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, 0 /* ReferenceOwnership.kRuntime */, finalize_cb, native_object, finalize_hint);
}
else {
reference = emnapiCtx.createReferenceWithData(envObject, handle.id, 0, 0 /* ReferenceOwnership.kRuntime */, native_object);
}
}
envObject.getObjectBinding(handle.value).wrapped = reference.id;
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
function emnapiUnwrap(env, js_object, result, action) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var data;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!js_object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (action === 0 /* UnwrapAction.KeepWrap */) {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var value = emnapiCtx.handleStore.get(js_object);
if (!(value.isObject() || value.isFunction())) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var binding = envObject.getObjectBinding(value.value);
var referenceId = binding.wrapped;
var ref = emnapiCtx.refStore.get(referenceId);
if (!ref)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
data = ref.data();
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, data, true);
}
if (action === 1 /* UnwrapAction.RemoveWrap */) {
binding.wrapped = 0;
if (ref.ownership() === 1 /* ReferenceOwnership.kUserland */) {
// When the wrap is been removed, the finalizer should be reset.
ref.resetFinalizer();
}
else {
ref.dispose();
}
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppppppp
*/
function napi_define_class(env, utf8name, length, constructor, callback_data, property_count, properties, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var propPtr, valueHandleId, attributes;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!constructor)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
property_count = property_count >>> 0;
if (property_count > 0) {
if (!properties)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if ((length < -1) || (length > 2147483647) || (!utf8name)) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var fresult = emnapiCreateFunction(envObject, utf8name, length, constructor, callback_data);
if (fresult.status !== 0 /* napi_status.napi_ok */)
return envObject.setLastError(fresult.status);
var F = fresult.f;
var propertyName = void 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
for (var i = 0; i < property_count; i++) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
propPtr = properties + (i * (4 * 8));
var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true);
var name_1 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true);
var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true);
var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true);
var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true);
var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true);
attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true);
var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true);
if (utf8Name) {
propertyName = emnapiString.UTF8ToString(utf8Name, -1);
}
else {
if (!name_1) {
return envObject.setLastError(4 /* napi_status.napi_name_expected */);
}
propertyName = emnapiCtx.handleStore.get(name_1).value;
if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') {
return envObject.setLastError(4 /* napi_status.napi_name_expected */);
}
}
if ((attributes & 1024 /* napi_property_attributes.napi_static */) !== 0) {
emnapiDefineProperty(envObject, F, propertyName, method, getter, setter, value, attributes, data);
continue;
}
emnapiDefineProperty(envObject, F.prototype, propertyName, method, getter, setter, value, attributes, data);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var valueHandle = emnapiCtx.addToCurrentScope(F);
valueHandleId = valueHandle.id;
HEAP_DATA_VIEW.setInt32(result, valueHandleId, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppppp
*/
function napi_wrap(env, js_object, native_object, finalize_cb, finalize_hint, result) {
return emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result);
}
/**
* @__sig ippp
*/
function napi_unwrap(env, js_object, result) {
return emnapiUnwrap(env, js_object, result, 0 /* UnwrapAction.KeepWrap */);
}
/**
* @__sig ippp
*/
function napi_remove_wrap(env, js_object, result) {
return emnapiUnwrap(env, js_object, result, 1 /* UnwrapAction.RemoveWrap */);
}
/**
* @__sig ippp
*/
function napi_type_tag_object(env, object, type_tag) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!object) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);
}
var value = emnapiCtx.handleStore.get(object);
if (!(value.isObject() || value.isFunction())) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */);
}
if (!type_tag) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);
}
var binding = envObject.getObjectBinding(value.value);
if (binding.tag !== null) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);
}
var tag = new Uint8Array(16);
tag.set(new Uint8Array(wasmMemory.buffer, type_tag, 16));
binding.tag = new Uint32Array(tag.buffer);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppp
*/
function napi_check_object_type_tag(env, object, type_tag, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars, one-var
var ret = true;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!object) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);
}
var value = emnapiCtx.handleStore.get(object);
if (!(value.isObject() || value.isFunction())) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */);
}
if (!type_tag) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);
}
if (!result) {
return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */);
}
var binding = envObject.getObjectBinding(value.value);
if (binding.tag !== null) {
var tag = binding.tag;
var typeTag = new Uint32Array(wasmMemory.buffer, type_tag, 4);
ret = (tag[0] === typeTag[0] &&
tag[1] === typeTag[1] &&
tag[2] === typeTag[2] &&
tag[3] === typeTag[3]);
}
else {
ret = false;
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, ret ? 1 : 0, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppppp
*/
function napi_add_finalizer(env, js_object, finalize_data, finalize_cb, finalize_hint, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!emnapiCtx.feature.supportFinalizer) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
if (!js_object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!finalize_cb)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handleResult = emnapiGetHandle(js_object);
if (handleResult.status !== 0 /* napi_status.napi_ok */) {
return envObject.setLastError(handleResult.status);
}
var handle = handleResult.handle;
var ownership = !result ? 0 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.kUserland */;
var reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, ownership, finalize_cb, finalize_data, finalize_hint);
if (result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var referenceId = reference.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, referenceId, true);
}
return envObject.clearLastError();
}
/**
* @__sig ipppp
*/
function node_api_post_finalizer(env, finalize_cb, finalize_data, finalize_hint) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
envObject.enqueueFinalizer(emnapiCtx.createTrackedFinalizer(envObject, finalize_cb, finalize_data, finalize_hint));
return envObject.clearLastError();
}
var wrapMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_add_finalizer: napi_add_finalizer,
napi_check_object_type_tag: napi_check_object_type_tag,
napi_define_class: napi_define_class,
napi_remove_wrap: napi_remove_wrap,
napi_type_tag_object: napi_type_tag_object,
napi_unwrap: napi_unwrap,
napi_wrap: napi_wrap,
node_api_post_finalizer: node_api_post_finalizer
});
/**
* @__sig ipippppp
*/
function emnapi_create_memory_view(env, typedarray_type, external_data, byte_length, finalize_cb, finalize_hint, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
byte_length = byte_length >>> 0;
if (!external_data) {
byte_length = 0;
}
if (byte_length > 2147483647) {
throw new RangeError('Cannot create a memory view larger than 2147483647 bytes');
}
if ((external_data + byte_length) > wasmMemory.buffer.byteLength) {
throw new RangeError('Memory out of range');
}
if (!emnapiCtx.feature.supportFinalizer && finalize_cb) {
throw emnapiCtx.createNotSupportWeakRefError('emnapi_create_memory_view', 'Parameter "finalize_cb" must be 0(NULL)');
}
var viewDescriptor = void 0;
switch (typedarray_type) {
case 0 /* emnapi_memory_view_type.emnapi_int8_array */:
viewDescriptor = { Ctor: Int8Array, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 1 /* emnapi_memory_view_type.emnapi_uint8_array */:
viewDescriptor = { Ctor: Uint8Array, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 2 /* emnapi_memory_view_type.emnapi_uint8_clamped_array */:
viewDescriptor = { Ctor: Uint8ClampedArray, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 3 /* emnapi_memory_view_type.emnapi_int16_array */:
viewDescriptor = { Ctor: Int16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 4 /* emnapi_memory_view_type.emnapi_uint16_array */:
viewDescriptor = { Ctor: Uint16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 5 /* emnapi_memory_view_type.emnapi_int32_array */:
viewDescriptor = { Ctor: Int32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 6 /* emnapi_memory_view_type.emnapi_uint32_array */:
viewDescriptor = { Ctor: Uint32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 7 /* emnapi_memory_view_type.emnapi_float32_array */:
viewDescriptor = { Ctor: Float32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 8 /* emnapi_memory_view_type.emnapi_float64_array */:
viewDescriptor = { Ctor: Float64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 9 /* emnapi_memory_view_type.emnapi_bigint64_array */:
viewDescriptor = { Ctor: BigInt64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case 10 /* emnapi_memory_view_type.emnapi_biguint64_array */:
viewDescriptor = { Ctor: BigUint64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case -1 /* emnapi_memory_view_type.emnapi_data_view */:
viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
case -2 /* emnapi_memory_view_type.emnapi_buffer */: {
if (!emnapiCtx.feature.Buffer) {
throw emnapiCtx.createNotSupportBufferError('emnapi_create_memory_view', '');
}
viewDescriptor = { Ctor: emnapiCtx.feature.Buffer, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 };
break;
}
default: return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var Ctor = viewDescriptor.Ctor;
var typedArray = typedarray_type === -2 /* emnapi_memory_view_type.emnapi_buffer */
? emnapiCtx.feature.Buffer.from(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length)
: new Ctor(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length);
var handle = emnapiCtx.addToCurrentScope(typedArray);
emnapiExternalMemory.wasmMemoryViewTable.set(typedArray, viewDescriptor);
if (finalize_cb) {
var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0);
if (status_1 === 10 /* napi_status.napi_pending_exception */) {
var err = envObject.tryCatch.extractException();
envObject.clearLastError();
throw err;
}
else if (status_1 !== 0 /* napi_status.napi_ok */) {
return envObject.setLastError(status_1);
}
}
value = handle.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig i
*/
function emnapi_is_support_weakref() {
return emnapiCtx.feature.supportFinalizer ? 1 : 0;
}
/**
* @__sig i
*/
function emnapi_is_support_bigint() {
return emnapiCtx.feature.supportBigInt ? 1 : 0;
}
/**
* @__sig i
*/
function emnapi_is_node_binding_available() {
return emnapiNodeBinding ? 1 : 0;
}
function $emnapiSyncMemory(js_to_wasm, arrayBufferOrView, offset, len) {
offset = offset !== null && offset !== void 0 ? offset : 0;
offset = offset >>> 0;
var view;
if (arrayBufferOrView instanceof ArrayBuffer) {
var pointer = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false).address;
if (!pointer)
throw new Error('Unknown ArrayBuffer address');
if (typeof len !== 'number' || len === -1) {
len = arrayBufferOrView.byteLength - offset;
}
len = len >>> 0;
if (len === 0)
return arrayBufferOrView;
view = new Uint8Array(arrayBufferOrView, offset, len);
var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer);
if (!js_to_wasm) {
view.set(wasmMemoryU8.subarray(pointer, pointer + len));
}
else {
wasmMemoryU8.set(view, pointer);
}
return arrayBufferOrView;
}
if (ArrayBuffer.isView(arrayBufferOrView)) {
var viewPointerInfo = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false);
var latestView = viewPointerInfo.view;
var pointer = viewPointerInfo.address;
if (!pointer)
throw new Error('Unknown ArrayBuffer address');
if (typeof len !== 'number' || len === -1) {
len = latestView.byteLength - offset;
}
len = len >>> 0;
if (len === 0)
return latestView;
view = new Uint8Array(latestView.buffer, latestView.byteOffset + offset, len);
var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer);
if (!js_to_wasm) {
view.set(wasmMemoryU8.subarray(pointer, pointer + len));
}
else {
wasmMemoryU8.set(view, pointer);
}
return latestView;
}
throw new TypeError('emnapiSyncMemory expect ArrayBuffer or ArrayBufferView as first parameter');
}
/**
* @__sig ipippp
*/
function emnapi_sync_memory(env, js_to_wasm, arraybuffer_or_view, offset, len) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!arraybuffer_or_view)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
var handleId = HEAP_DATA_VIEW.getInt32(arraybuffer_or_view, true);
var handle = envObject.ctx.handleStore.get(handleId);
if (!handle.isArrayBuffer() && !handle.isTypedArray() && !handle.isDataView()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var ret = $emnapiSyncMemory(Boolean(js_to_wasm), handle.value, offset, len);
if (handle.value !== ret) {
v = envObject.ensureHandleId(ret);
HEAP_DATA_VIEW.setInt32(arraybuffer_or_view, v, true);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
function $emnapiGetMemoryAddress(arrayBufferOrView) {
var isArrayBuffer = arrayBufferOrView instanceof ArrayBuffer;
var isDataView = arrayBufferOrView instanceof DataView;
var isTypedArray = ArrayBuffer.isView(arrayBufferOrView) && !isDataView;
if (!isArrayBuffer && !isTypedArray && !isDataView) {
throw new TypeError('emnapiGetMemoryAddress expect ArrayBuffer or ArrayBufferView as first parameter');
}
var info;
if (isArrayBuffer) {
info = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false);
}
else {
info = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false);
}
return {
address: info.address,
ownership: info.ownership,
runtimeAllocated: info.runtimeAllocated
};
}
/**
* @__sig ipppp
*/
function emnapi_get_memory_address(env, arraybuffer_or_view, address, ownership, runtime_allocated) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var p, runtimeAllocated, ownershipOut;
var info;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!arraybuffer_or_view)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!address && !ownership && !runtime_allocated) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var handle = envObject.ctx.handleStore.get(arraybuffer_or_view);
info = $emnapiGetMemoryAddress(handle.value);
p = info.address;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (address) {
HEAP_DATA_VIEW.setInt32(address, p, true);
}
if (ownership) {
ownershipOut = info.ownership;
HEAP_DATA_VIEW.setInt32(ownership, ownershipOut, true);
}
if (runtime_allocated) {
runtimeAllocated = info.runtimeAllocated;
HEAP_DATA_VIEW.setInt8(runtime_allocated, runtimeAllocated, true);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipp
*/
function emnapi_get_runtime_version(env, version) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!version)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var runtimeVersion;
try {
runtimeVersion = emnapiCtx.getRuntimeVersions().version;
}
catch (_) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var versions = runtimeVersion.split('.')
.map(function (n) { return Number(n); });
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setUint32(version, versions[0], true);
HEAP_DATA_VIEW.setUint32(version + 4, versions[1], true);
HEAP_DATA_VIEW.setUint32(version + 8, versions[2], true);
return envObject.clearLastError();
}
var emnapiMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
$emnapiGetMemoryAddress: $emnapiGetMemoryAddress,
$emnapiSyncMemory: $emnapiSyncMemory,
emnapi_create_memory_view: emnapi_create_memory_view,
emnapi_get_memory_address: emnapi_get_memory_address,
emnapi_get_runtime_version: emnapi_get_runtime_version,
emnapi_is_node_binding_available: emnapi_is_node_binding_available,
emnapi_is_support_bigint: emnapi_is_support_bigint,
emnapi_is_support_weakref: emnapi_is_support_weakref,
emnapi_sync_memory: emnapi_sync_memory
});
/**
* @__sig ipp
*/
function napi_create_array(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope([]).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_create_array_with_length(env, length, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
length = length >>> 0;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(new Array(length)).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
function emnapiCreateArrayBuffer(byte_length, data) {
byte_length = byte_length >>> 0;
var arrayBuffer = new ArrayBuffer(byte_length);
if (data) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var p = emnapiExternalMemory.getArrayBufferPointer(arrayBuffer, true).address;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(data, p, true);
}
return arrayBuffer;
}
/**
* @__sig ipppp
*/
function napi_create_arraybuffer(env, byte_length, data, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var arrayBuffer = emnapiCreateArrayBuffer(byte_length, data);
value = emnapiCtx.addToCurrentScope(arrayBuffer).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipdp
*/
function napi_create_date(env, time, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = emnapiCtx.addToCurrentScope(new Date(time)).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ippppp
*/
function napi_create_external(env, data, finalize_cb, finalize_hint, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!emnapiCtx.feature.supportFinalizer && finalize_cb) {
throw emnapiCtx.createNotSupportWeakRefError('napi_create_external', 'Parameter "finalize_cb" must be 0(NULL)');
}
var externalHandle = emnapiCtx.getCurrentScope().addExternal(data);
if (finalize_cb) {
emnapiCtx.createReferenceWithFinalizer(envObject, externalHandle.id, 0, 0 /* ReferenceOwnership.kRuntime */, finalize_cb, data, finalize_hint);
}
value = externalHandle.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppppp
*/
function napi_create_external_arraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
byte_length = byte_length >>> 0;
if (!external_data) {
byte_length = 0;
}
if ((external_data + byte_length) > wasmMemory.buffer.byteLength) {
throw new RangeError('Memory out of range');
}
if (!emnapiCtx.feature.supportFinalizer && finalize_cb) {
throw emnapiCtx.createNotSupportWeakRefError('napi_create_external_arraybuffer', 'Parameter "finalize_cb" must be 0(NULL)');
}
var arrayBuffer = new ArrayBuffer(byte_length);
if (byte_length === 0) {
try {
var MessageChannel_1 = emnapiCtx.feature.MessageChannel;
var messageChannel = new MessageChannel_1();
messageChannel.port1.postMessage(arrayBuffer, [arrayBuffer]);
}
catch (_) { }
}
else {
var u8arr = new Uint8Array(arrayBuffer);
u8arr.set(new Uint8Array(wasmMemory.buffer).subarray(external_data, external_data + byte_length));
emnapiExternalMemory.table.set(arrayBuffer, {
address: external_data,
ownership: 1 /* ReferenceOwnership.kUserland */,
runtimeAllocated: 0
});
}
var handle = emnapiCtx.addToCurrentScope(arrayBuffer);
if (finalize_cb) {
var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0);
if (status_1 === 10 /* napi_status.napi_pending_exception */) {
var err = envObject.tryCatch.extractException();
envObject.clearLastError();
throw err;
}
else if (status_1 !== 0 /* napi_status.napi_ok */) {
return envObject.setLastError(status_1);
}
}
value = handle.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipp
*/
function napi_create_object(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope({}).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/**
* @__sig ippp
*/
function napi_create_symbol(env, description, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (!description) {
// eslint-disable-next-line symbol-description, @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(Symbol()).id;
HEAP_DATA_VIEW.setInt32(result, value, true);
}
else {
var handle = emnapiCtx.handleStore.get(description);
var desc = handle.value;
if (typeof desc !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = emnapiCtx.addToCurrentScope(Symbol(desc)).id;
HEAP_DATA_VIEW.setInt32(result, v, true);
}
return envObject.clearLastError();
}
/**
* @__sig ipipppp
*/
function napi_create_typedarray(env, type, length, arraybuffer, byte_offset, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!arraybuffer)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(arraybuffer);
if (!handle.isArrayBuffer()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var buffer = handle.value;
var createTypedArray = function (envObject, Type, size_of_element, buffer, byte_offset, length) {
var _a;
byte_offset = byte_offset >>> 0;
length = length >>> 0;
if (size_of_element > 1) {
if ((byte_offset) % (size_of_element) !== 0) {
var err = new RangeError("start offset of ".concat((_a = Type.name) !== null && _a !== void 0 ? _a : '', " should be a multiple of ").concat(size_of_element));
err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT';
envObject.tryCatch.setError(err);
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
}
if (((length * size_of_element) + byte_offset) > buffer.byteLength) {
var err = new RangeError('Invalid typed array length');
err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_LENGTH';
envObject.tryCatch.setError(err);
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
var out = new Type(buffer, byte_offset, length);
if (buffer === wasmMemory.buffer) {
if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) {
emnapiExternalMemory.wasmMemoryViewTable.set(out, {
Ctor: Type,
address: byte_offset,
length: length,
ownership: 1 /* ReferenceOwnership.kUserland */,
runtimeAllocated: 0
});
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = emnapiCtx.addToCurrentScope(out).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
};
switch (type) {
case 0 /* napi_typedarray_type.napi_int8_array */:
return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length);
case 1 /* napi_typedarray_type.napi_uint8_array */:
return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length);
case 2 /* napi_typedarray_type.napi_uint8_clamped_array */:
return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length);
case 3 /* napi_typedarray_type.napi_int16_array */:
return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length);
case 4 /* napi_typedarray_type.napi_uint16_array */:
return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length);
case 5 /* napi_typedarray_type.napi_int32_array */:
return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length);
case 6 /* napi_typedarray_type.napi_uint32_array */:
return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length);
case 7 /* napi_typedarray_type.napi_float32_array */:
return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length);
case 8 /* napi_typedarray_type.napi_float64_array */:
return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length);
case 9 /* napi_typedarray_type.napi_bigint64_array */:
return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length);
case 10 /* napi_typedarray_type.napi_biguint64_array */:
return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length);
default:
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__deps malloc
* @__sig ippp
*/
function napi_create_buffer(env, size, data, result) {
var _a;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value, pointer;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var Buffer = emnapiCtx.feature.Buffer;
if (!Buffer) {
throw emnapiCtx.createNotSupportBufferError('napi_create_buffer', '');
}
var buffer = void 0;
size = size >>> 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (!data || (size === 0)) {
buffer = Buffer.alloc(size);
value = emnapiCtx.addToCurrentScope(buffer).id;
HEAP_DATA_VIEW.setInt32(result, value, true);
}
else {
pointer = _malloc(size);
if (!pointer)
throw new Error('Out of memory');
new Uint8Array(wasmMemory.buffer).subarray(pointer, pointer + size).fill(0);
var buffer_1 = Buffer.from(wasmMemory.buffer, pointer, size);
var viewDescriptor = {
Ctor: Buffer,
address: pointer,
length: size,
ownership: emnapiExternalMemory.registry ? 0 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.kUserland */,
runtimeAllocated: 1
};
emnapiExternalMemory.wasmMemoryViewTable.set(buffer_1, viewDescriptor);
(_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(viewDescriptor, pointer);
value = emnapiCtx.addToCurrentScope(buffer_1).id;
HEAP_DATA_VIEW.setInt32(result, value, true);
HEAP_DATA_VIEW.setInt32(data, pointer, true);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ippppp
*/
function napi_create_buffer_copy(env, length, data, result_data, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var Buffer = emnapiCtx.feature.Buffer;
if (!Buffer) {
throw emnapiCtx.createNotSupportBufferError('napi_create_buffer_copy', '');
}
var arrayBuffer = emnapiCreateArrayBuffer(length, result_data);
var buffer = Buffer.from(arrayBuffer);
buffer.set(new Uint8Array(wasmMemory.buffer).subarray(data, data + length));
value = emnapiCtx.addToCurrentScope(buffer).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppppp
*/
function napi_create_external_buffer(env, length, data, finalize_cb, finalize_hint, result) {
return emnapi_create_memory_view(env, -2 /* emnapi_memory_view_type.emnapi_buffer */, data, length, finalize_cb, finalize_hint, result);
}
/**
* @__sig ippppp
*/
function node_api_create_buffer_from_arraybuffer(env, arraybuffer, byte_offset, byte_length, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!arraybuffer)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
byte_offset = byte_offset >>> 0;
byte_length = byte_length >>> 0;
var handle = emnapiCtx.handleStore.get(arraybuffer);
if (!handle.isArrayBuffer()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var buffer = handle.value;
if ((byte_length + byte_offset) > buffer.byteLength) {
var err = new RangeError('The byte offset + length is out of range');
err.code = 'ERR_OUT_OF_RANGE';
throw err;
}
var Buffer = emnapiCtx.feature.Buffer;
if (!Buffer) {
throw emnapiCtx.createNotSupportBufferError('node_api_create_buffer_from_arraybuffer', '');
}
var out = Buffer.from(buffer, byte_offset, byte_length);
if (buffer === wasmMemory.buffer) {
if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) {
emnapiExternalMemory.wasmMemoryViewTable.set(out, {
Ctor: Buffer,
address: byte_offset,
length: byte_length,
ownership: 1 /* ReferenceOwnership.kUserland */,
runtimeAllocated: 0
});
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = emnapiCtx.addToCurrentScope(out).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ippppp
*/
function napi_create_dataview(env, byte_length, arraybuffer, byte_offset, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!arraybuffer)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
byte_length = byte_length >>> 0;
byte_offset = byte_offset >>> 0;
var handle = emnapiCtx.handleStore.get(arraybuffer);
if (!handle.isArrayBuffer()) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var buffer = handle.value;
if ((byte_length + byte_offset) > buffer.byteLength) {
var err = new RangeError('byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in');
err.code = 'ERR_NAPI_INVALID_DATAVIEW_ARGS';
throw err;
}
var dataview = new DataView(buffer, byte_offset, byte_length);
if (buffer === wasmMemory.buffer) {
if (!emnapiExternalMemory.wasmMemoryViewTable.has(dataview)) {
emnapiExternalMemory.wasmMemoryViewTable.set(dataview, {
Ctor: DataView,
address: byte_offset,
length: byte_length,
ownership: 1 /* ReferenceOwnership.kUserland */,
runtimeAllocated: 0
});
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = emnapiCtx.addToCurrentScope(dataview).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/**
* @__sig ipppp
*/
function node_api_symbol_for(env, utf8description, length, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var autoLength = length === -1;
var sizelength = length >>> 0;
if (length !== 0) {
if (!utf8description)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (!(autoLength || (sizelength <= 2147483647))) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var descriptionString = emnapiString.UTF8ToString(utf8description, length);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(Symbol.for(descriptionString)).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
var createMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_create_array: napi_create_array,
napi_create_array_with_length: napi_create_array_with_length,
napi_create_arraybuffer: napi_create_arraybuffer,
napi_create_buffer: napi_create_buffer,
napi_create_buffer_copy: napi_create_buffer_copy,
napi_create_dataview: napi_create_dataview,
napi_create_date: napi_create_date,
napi_create_external: napi_create_external,
napi_create_external_arraybuffer: napi_create_external_arraybuffer,
napi_create_external_buffer: napi_create_external_buffer,
napi_create_object: napi_create_object,
napi_create_symbol: napi_create_symbol,
napi_create_typedarray: napi_create_typedarray,
node_api_create_buffer_from_arraybuffer: node_api_create_buffer_from_arraybuffer,
node_api_symbol_for: node_api_symbol_for
});
/** @__sig ipip */
function napi_get_boolean(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = value === 0 ? 3 /* GlobalHandle.FALSE */ : 4 /* GlobalHandle.TRUE */;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_get_global(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = 5 /* GlobalHandle.GLOBAL */;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_get_null(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = 2 /* GlobalHandle.NULL */;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_get_undefined(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = 1 /* GlobalHandle.UNDEFINED */;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
var globalMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_get_boolean: napi_get_boolean,
napi_get_global: napi_get_global,
napi_get_null: napi_get_null,
napi_get_undefined: napi_get_undefined
});
/** @__sig ipppp */
function napi_set_instance_data(env, data, finalize_cb, finalize_hint) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
envObject.setInstanceData(data, finalize_cb, finalize_hint);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_get_instance_data(env, data) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!data)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = envObject.getInstanceData();
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(data, value, true);
return envObject.clearLastError();
}
var envMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_get_instance_data: napi_get_instance_data,
napi_set_instance_data: napi_set_instance_data
});
/** @__sig vpppp */
function _emnapi_get_last_error_info(env, error_code, engine_error_code, engine_reserved) {
var envObject = emnapiCtx.envStore.get(env);
var lastError = envObject.lastError;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var errorCode = lastError.errorCode;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var engineErrorCode = lastError.engineErrorCode >>> 0;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var engineReserved = lastError.engineReserved;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(error_code, errorCode, true);
HEAP_DATA_VIEW.setUint32(engine_error_code, engineErrorCode, true);
HEAP_DATA_VIEW.setInt32(engine_reserved, engineReserved, true);
}
/** @__sig ipp */
function napi_throw(env, error) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!error)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
envObject.tryCatch.setError(emnapiCtx.handleStore.get(error).value);
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_throw_error(env, code, msg) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var error = new Error(emnapiString.UTF8ToString(msg, -1));
if (code)
error.code = emnapiString.UTF8ToString(code, -1);
envObject.tryCatch.setError(error);
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_throw_type_error(env, code, msg) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var error = new TypeError(emnapiString.UTF8ToString(msg, -1));
if (code)
error.code = emnapiString.UTF8ToString(code, -1);
envObject.tryCatch.setError(error);
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_throw_range_error(env, code, msg) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var error = new RangeError(emnapiString.UTF8ToString(msg, -1));
if (code)
error.code = emnapiString.UTF8ToString(code, -1);
envObject.tryCatch.setError(error);
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function node_api_throw_syntax_error(env, code, msg) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var error = new SyntaxError(emnapiString.UTF8ToString(msg, -1));
if (code)
error.code = emnapiString.UTF8ToString(code, -1);
envObject.tryCatch.setError(error);
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipp */
function napi_is_exception_pending(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = envObject.tryCatch.hasCaught();
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);
return envObject.clearLastError();
}
/** @__sig ipppp */
function napi_create_error(env, code, msg, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var msgValue = emnapiCtx.handleStore.get(msg).value;
if (typeof msgValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var error = new Error(msgValue);
if (code) {
var codeValue = emnapiCtx.handleStore.get(code).value;
if (typeof codeValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
error.code = codeValue;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(error).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/** @__sig ipppp */
function napi_create_type_error(env, code, msg, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var msgValue = emnapiCtx.handleStore.get(msg).value;
if (typeof msgValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var error = new TypeError(msgValue);
if (code) {
var codeValue = emnapiCtx.handleStore.get(code).value;
if (typeof codeValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
error.code = codeValue;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(error).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/** @__sig ipppp */
function napi_create_range_error(env, code, msg, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var msgValue = emnapiCtx.handleStore.get(msg).value;
if (typeof msgValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var error = new RangeError(msgValue);
if (code) {
var codeValue = emnapiCtx.handleStore.get(code).value;
if (typeof codeValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
error.code = codeValue;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(error).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/** @__sig ipppp */
function node_api_create_syntax_error(env, code, msg, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!msg)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var msgValue = emnapiCtx.handleStore.get(msg).value;
if (typeof msgValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var error = new SyntaxError(msgValue);
if (code) {
var codeValue = emnapiCtx.handleStore.get(code).value;
if (typeof codeValue !== 'string') {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
error.code = codeValue;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = emnapiCtx.addToCurrentScope(error).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_get_and_clear_last_exception(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (!envObject.tryCatch.hasCaught()) {
HEAP_DATA_VIEW.setInt32(result, 1, true); // ID_UNDEFINED
return envObject.clearLastError();
}
else {
var err = envObject.tryCatch.exception();
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = envObject.ensureHandleId(err);
HEAP_DATA_VIEW.setInt32(result, value, true);
envObject.tryCatch.reset();
}
return envObject.clearLastError();
}
/** @__sig vpppp */
function napi_fatal_error(location, location_len, message, message_len) {
var locationStr = emnapiString.UTF8ToString(location, location_len);
var messageStr = emnapiString.UTF8ToString(message, message_len);
if (emnapiNodeBinding) {
emnapiNodeBinding.napi.fatalError(locationStr, messageStr);
}
else {
abort('FATAL ERROR: ' + locationStr + ' ' + messageStr);
}
}
/** @__sig ipp */
function napi_fatal_exception(env, err) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!err)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var error = envObject.ctx.handleStore.get(err);
try {
envObject.triggerFatalException(error.value);
}
catch (_) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
var errorMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
_emnapi_get_last_error_info: _emnapi_get_last_error_info,
napi_create_error: napi_create_error,
napi_create_range_error: napi_create_range_error,
napi_create_type_error: napi_create_type_error,
napi_fatal_error: napi_fatal_error,
napi_fatal_exception: napi_fatal_exception,
napi_get_and_clear_last_exception: napi_get_and_clear_last_exception,
napi_is_exception_pending: napi_is_exception_pending,
napi_throw: napi_throw,
napi_throw_error: napi_throw_error,
napi_throw_range_error: napi_throw_range_error,
napi_throw_type_error: napi_throw_type_error,
node_api_create_syntax_error: node_api_create_syntax_error,
node_api_throw_syntax_error: node_api_throw_syntax_error
});
/** @__sig ipppppp */
function napi_create_function(env, utf8name, length, cb, data, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!cb)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var fresult = emnapiCreateFunction(envObject, utf8name, length, cb, data);
if (fresult.status !== 0 /* napi_status.napi_ok */)
return envObject.setLastError(fresult.status);
var f = fresult.f;
var valueHandle = emnapiCtx.addToCurrentScope(f);
value = valueHandle.id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppppp */
function napi_get_cb_info(env, cbinfo, argc, argv, this_arg, data) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!cbinfo)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var cbinfoValue = emnapiCtx.scopeStore.get(cbinfo).callbackInfo;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (argv) {
if (!argc)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var argcValue = HEAP_DATA_VIEW.getUint32(argc, true);
var len = cbinfoValue.args.length;
var arrlen = argcValue < len ? argcValue : len;
var i = 0;
for (; i < arrlen; i++) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var argVal = envObject.ensureHandleId(cbinfoValue.args[i]);
HEAP_DATA_VIEW.setInt32(argv + i * 4, argVal, true);
}
if (i < argcValue) {
for (; i < argcValue; i++) {
HEAP_DATA_VIEW.setInt32(argv + i * 4, 1, true);
}
}
}
if (argc) {
HEAP_DATA_VIEW.setUint32(argc, cbinfoValue.args.length, true);
}
if (this_arg) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v = envObject.ensureHandleId(cbinfoValue.thiz);
HEAP_DATA_VIEW.setInt32(this_arg, v, true);
}
if (data) {
HEAP_DATA_VIEW.setInt32(data, cbinfoValue.data, true);
}
return envObject.clearLastError();
}
/** @__sig ipppppp */
function napi_call_function(env, recv, func, argc, argv, result) {
var i = 0;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!recv)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
argc = argc >>> 0;
if (argc > 0) {
if (!argv)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var v8recv = emnapiCtx.handleStore.get(recv).value;
if (!func)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var v8func = emnapiCtx.handleStore.get(func).value;
if (typeof v8func !== 'function')
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var args = [];
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
for (; i < argc; i++) {
var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true);
args.push(emnapiCtx.handleStore.get(argVal).value);
}
var ret = v8func.apply(v8recv, args);
if (result) {
v = envObject.ensureHandleId(ret);
HEAP_DATA_VIEW.setInt32(result, v, true);
}
return envObject.clearLastError();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippppp */
function napi_new_instance(env, constructor, argc, argv, result) {
var i;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!constructor)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
argc = argc >>> 0;
if (argc > 0) {
if (!argv)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var Ctor = emnapiCtx.handleStore.get(constructor).value;
if (typeof Ctor !== 'function')
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var ret = void 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (emnapiCtx.feature.supportReflect) {
var argList = Array(argc);
for (i = 0; i < argc; i++) {
var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true);
argList[i] = emnapiCtx.handleStore.get(argVal).value;
}
ret = Reflect.construct(Ctor, argList, Ctor);
}
else {
var args = Array(argc + 1);
args[0] = undefined;
for (i = 0; i < argc; i++) {
var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true);
args[i + 1] = emnapiCtx.handleStore.get(argVal).value;
}
var BoundCtor = Ctor.bind.apply(Ctor, args);
ret = new BoundCtor();
}
if (result) {
v = envObject.ensureHandleId(ret);
HEAP_DATA_VIEW.setInt32(result, v, true);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_get_new_target(env, cbinfo, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!cbinfo)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var cbinfoValue = emnapiCtx.scopeStore.get(cbinfo).callbackInfo;
var thiz = cbinfoValue.thiz, fn = cbinfoValue.fn;
var value = thiz == null || thiz.constructor == null
? 0
: thiz instanceof fn
? envObject.ensureHandleId(thiz.constructor)
: 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
var functionMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_call_function: napi_call_function,
napi_create_function: napi_create_function,
napi_get_cb_info: napi_get_cb_info,
napi_get_new_target: napi_get_new_target,
napi_new_instance: napi_new_instance
});
/** @__sig ipp */
function napi_open_handle_scope(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var scope = emnapiCtx.openScope(envObject);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, scope.id, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_close_handle_scope(env, scope) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!scope)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if ((envObject.openHandleScopes === 0)) {
return 13 /* napi_status.napi_handle_scope_mismatch */;
}
emnapiCtx.closeScope(envObject);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_open_escapable_handle_scope(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var scope = emnapiCtx.openScope(envObject);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, scope.id, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_close_escapable_handle_scope(env, scope) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!scope)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if ((envObject.openHandleScopes === 0)) {
return 13 /* napi_status.napi_handle_scope_mismatch */;
}
emnapiCtx.closeScope(envObject);
return envObject.clearLastError();
}
/** @__sig ipppp */
function napi_escape_handle(env, scope, escapee, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!scope)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!escapee)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var scopeObject = emnapiCtx.scopeStore.get(scope);
if (!scopeObject.escapeCalled()) {
var newHandle = scopeObject.escape(escapee);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value = newHandle ? newHandle.id : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.clearLastError();
}
return envObject.setLastError(12 /* napi_status.napi_escape_called_twice */);
}
/** @__sig ippip */
function napi_create_reference(env, value, initial_refcount, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (envObject.moduleApiVersion < 10) {
if (!(handle.isObject() || handle.isFunction() || handle.isSymbol())) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var ref = emnapiCtx.createReference(envObject, handle.id, initial_refcount >>> 0, 1 /* ReferenceOwnership.kUserland */);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, ref.id, true);
return envObject.clearLastError();
}
/** @__sig ipp */
function napi_delete_reference(env, ref) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!ref)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
emnapiCtx.refStore.get(ref).dispose();
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_reference_ref(env, ref, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!ref)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var count = emnapiCtx.refStore.get(ref).ref();
if (result) {
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setUint32(result, count, true);
}
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_reference_unref(env, ref, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!ref)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var reference = emnapiCtx.refStore.get(ref);
var refcount = reference.refcount();
if (refcount === 0) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var count = reference.unref();
if (result) {
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setUint32(result, count, true);
}
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_get_reference_value(env, ref, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!ref)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var reference = emnapiCtx.refStore.get(ref);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var handleId = reference.get(envObject);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, handleId, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_add_env_cleanup_hook(env, fun, arg) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!fun)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
emnapiCtx.addCleanupHook(envObject, fun, arg);
return 0 /* napi_status.napi_ok */;
}
/** @__sig ippp */
function napi_remove_env_cleanup_hook(env, fun, arg) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!fun)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
emnapiCtx.removeCleanupHook(envObject, fun, arg);
return 0 /* napi_status.napi_ok */;
}
/** @__sig vp */
function _emnapi_env_ref(env) {
var envObject = emnapiCtx.envStore.get(env);
envObject.ref();
}
/** @__sig vp */
function _emnapi_env_unref(env) {
var envObject = emnapiCtx.envStore.get(env);
envObject.unref();
}
var lifeMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
_emnapi_env_ref: _emnapi_env_ref,
_emnapi_env_unref: _emnapi_env_unref,
napi_add_env_cleanup_hook: napi_add_env_cleanup_hook,
napi_close_escapable_handle_scope: napi_close_escapable_handle_scope,
napi_close_handle_scope: napi_close_handle_scope,
napi_create_reference: napi_create_reference,
napi_delete_reference: napi_delete_reference,
napi_escape_handle: napi_escape_handle,
napi_get_reference_value: napi_get_reference_value,
napi_open_escapable_handle_scope: napi_open_escapable_handle_scope,
napi_open_handle_scope: napi_open_handle_scope,
napi_reference_ref: napi_reference_ref,
napi_reference_unref: napi_reference_unref,
napi_remove_env_cleanup_hook: napi_remove_env_cleanup_hook
});
/** @__sig ippi */
function _emnapi_get_filename(env, buf, len) {
var envObject = emnapiCtx.envStore.get(env);
var filename = envObject.filename;
if (!buf) {
return emnapiString.lengthBytesUTF8(filename);
}
return emnapiString.stringToUTF8(filename, buf, len);
}
var miscellaneousMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
_emnapi_get_filename: _emnapi_get_filename
});
/** @__sig ippp */
function napi_create_promise(env, deferred, promise) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var deferredObjectId, value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!deferred)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!promise)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
var p = new Promise(function (resolve, reject) {
var deferredObject = emnapiCtx.createDeferred({ resolve: resolve, reject: reject });
deferredObjectId = deferredObject.id;
HEAP_DATA_VIEW.setInt32(deferred, deferredObjectId, true);
});
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = emnapiCtx.addToCurrentScope(p).id;
HEAP_DATA_VIEW.setInt32(promise, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_resolve_deferred(env, deferred, resolution) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!deferred)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!resolution)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var deferredObject = emnapiCtx.deferredStore.get(deferred);
deferredObject.resolve(emnapiCtx.handleStore.get(resolution).value);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_reject_deferred(env, deferred, resolution) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!deferred)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!resolution)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var deferredObject = emnapiCtx.deferredStore.get(deferred);
deferredObject.reject(emnapiCtx.handleStore.get(resolution).value);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_is_promise(env, value, is_promise) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!is_promise)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = h.isPromise() ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(is_promise, r, true);
return envObject.clearLastError();
}
var promiseMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_create_promise: napi_create_promise,
napi_is_promise: napi_is_promise,
napi_reject_deferred: napi_reject_deferred,
napi_resolve_deferred: napi_resolve_deferred
});
/** @__sig ippiiip */
function napi_get_all_property_names(env, object, key_mode, key_filter, key_conversion, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var obj = void 0;
try {
obj = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
if (key_mode !== 0 /* napi_key_collection_mode.napi_key_include_prototypes */ && key_mode !== 1 /* napi_key_collection_mode.napi_key_own_only */) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (key_conversion !== 0 /* napi_key_conversion.napi_key_keep_numbers */ && key_conversion !== 1 /* napi_key_conversion.napi_key_numbers_to_strings */) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var props = [];
var names = void 0;
var symbols = void 0;
var i = void 0;
var own = true;
var integerIndiceRegex = /^(0|[1-9][0-9]*)$/;
do {
names = Object.getOwnPropertyNames(obj);
symbols = Object.getOwnPropertySymbols(obj);
for (i = 0; i < names.length; i++) {
props.push({
name: integerIndiceRegex.test(names[i]) ? Number(names[i]) : names[i],
desc: Object.getOwnPropertyDescriptor(obj, names[i]),
own: own
});
}
for (i = 0; i < symbols.length; i++) {
props.push({
name: symbols[i],
desc: Object.getOwnPropertyDescriptor(obj, symbols[i]),
own: own
});
}
if (key_mode === 1 /* napi_key_collection_mode.napi_key_own_only */) {
break;
}
obj = Object.getPrototypeOf(obj);
own = false;
} while (obj);
var ret = [];
var addName = function (ret, name, key_filter, conversion_mode) {
if (ret.indexOf(name) !== -1)
return;
if (conversion_mode === 0 /* napi_key_conversion.napi_key_keep_numbers */) {
ret.push(name);
}
else if (conversion_mode === 1 /* napi_key_conversion.napi_key_numbers_to_strings */) {
var realName = typeof name === 'number' ? String(name) : name;
if (typeof realName === 'string') {
if (!(key_filter & 8 /* napi_key_filter.napi_key_skip_strings */)) {
ret.push(realName);
}
}
else {
ret.push(realName);
}
}
};
for (i = 0; i < props.length; i++) {
var prop = props[i];
var name_1 = prop.name;
var desc = prop.desc;
if (key_filter === 0 /* napi_key_filter.napi_key_all_properties */) {
addName(ret, name_1, key_filter, key_conversion);
}
else {
if (key_filter & 8 /* napi_key_filter.napi_key_skip_strings */ && typeof name_1 === 'string') {
continue;
}
if (key_filter & 16 /* napi_key_filter.napi_key_skip_symbols */ && typeof name_1 === 'symbol') {
continue;
}
var shouldAdd = true;
switch (key_filter & 7) {
case 1 /* napi_key_filter.napi_key_writable */: {
shouldAdd = Boolean(desc.writable);
break;
}
case 2 /* napi_key_filter.napi_key_enumerable */: {
shouldAdd = Boolean(desc.enumerable);
break;
}
case (1 /* napi_key_filter.napi_key_writable */ | 2 /* napi_key_filter.napi_key_enumerable */): {
shouldAdd = Boolean(desc.writable && desc.enumerable);
break;
}
case 4 /* napi_key_filter.napi_key_configurable */: {
shouldAdd = Boolean(desc.configurable);
break;
}
case (4 /* napi_key_filter.napi_key_configurable */ | 1 /* napi_key_filter.napi_key_writable */): {
shouldAdd = Boolean(desc.configurable && desc.writable);
break;
}
case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */): {
shouldAdd = Boolean(desc.configurable && desc.enumerable);
break;
}
case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */ | 1 /* napi_key_filter.napi_key_writable */): {
shouldAdd = Boolean(desc.configurable && desc.enumerable && desc.writable);
break;
}
}
if (shouldAdd) {
addName(ret, name_1, key_filter, key_conversion);
}
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = emnapiCtx.addToCurrentScope(ret).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_get_property_names(env, object, result) {
return napi_get_all_property_names(env, object, 0 /* napi_key_collection_mode.napi_key_include_prototypes */, 2 /* napi_key_filter.napi_key_enumerable */ | 16 /* napi_key_filter.napi_key_skip_symbols */, 1 /* napi_key_conversion.napi_key_numbers_to_strings */, result);
}
/** @__sig ipppp */
function napi_set_property(env, object, key, value) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!key)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
h.value[emnapiCtx.handleStore.get(key).value] = emnapiCtx.handleStore.get(value).value;
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_has_property(env, object, key, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!key)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
r = (emnapiCtx.handleStore.get(key).value in v) ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_get_property(env, object, key, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!key)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = envObject.ensureHandleId(v[emnapiCtx.handleStore.get(key).value]);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_delete_property(env, object, key, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!key)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
var propertyKey = emnapiCtx.handleStore.get(key).value;
if (emnapiCtx.feature.supportReflect) {
r = Reflect.deleteProperty(h.value, propertyKey);
}
else {
try {
r = delete h.value[propertyKey];
}
catch (_) {
r = false;
}
}
if (result) {
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_has_own_property(env, object, key, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!key)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
var prop = emnapiCtx.handleStore.get(key).value;
if (typeof prop !== 'string' && typeof prop !== 'symbol') {
return envObject.setLastError(4 /* napi_status.napi_name_expected */);
}
r = Object.prototype.hasOwnProperty.call(v, emnapiCtx.handleStore.get(key).value);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_set_named_property(env, object, cname, value) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
if (!cname) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
emnapiCtx.handleStore.get(object).value[emnapiString.UTF8ToString(cname, -1)] = emnapiCtx.handleStore.get(value).value;
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_has_named_property(env, object, utf8name, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!utf8name) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
r = emnapiString.UTF8ToString(utf8name, -1) in v;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_get_named_property(env, object, utf8name, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!utf8name) {
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = envObject.ensureHandleId(v[emnapiString.UTF8ToString(utf8name, -1)]);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippip */
function napi_set_element(env, object, index, value) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
h.value[index >>> 0] = emnapiCtx.handleStore.get(value).value;
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippip */
function napi_has_element(env, object, index, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
r = ((index >>> 0) in v) ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippip */
function napi_get_element(env, object, index, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (h.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var v = void 0;
try {
v = h.isObject() || h.isFunction() ? h.value : Object(h.value);
}
catch (_) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = envObject.ensureHandleId(v[index >>> 0]);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippip */
function napi_delete_element(env, object, index, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
if (emnapiCtx.feature.supportReflect) {
r = Reflect.deleteProperty(h.value, index >>> 0);
}
else {
try {
r = delete h.value[index >>> 0];
}
catch (_) {
r = false;
}
}
if (result) {
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_define_properties(env, object, property_count, properties) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var propPtr, attributes;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
property_count = property_count >>> 0;
if (property_count > 0) {
if (!properties)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
var maybeObject = h.value;
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
var propertyName = void 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
for (var i = 0; i < property_count; i++) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
propPtr = properties + (i * (4 * 8));
var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true);
var name_2 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true);
var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true);
var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true);
var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true);
var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true);
attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true);
var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true);
if (utf8Name) {
propertyName = emnapiString.UTF8ToString(utf8Name, -1);
}
else {
if (!name_2) {
return envObject.setLastError(4 /* napi_status.napi_name_expected */);
}
propertyName = emnapiCtx.handleStore.get(name_2).value;
if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') {
return envObject.setLastError(4 /* napi_status.napi_name_expected */);
}
}
emnapiDefineProperty(envObject, maybeObject, propertyName, method, getter, setter, value, attributes, data);
}
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipp */
function napi_object_freeze(env, object) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
var maybeObject = h.value;
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
Object.freeze(maybeObject);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipp */
function napi_object_seal(env, object) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(object);
var maybeObject = h.value;
if (!(h.isObject() || h.isFunction())) {
return envObject.setLastError(2 /* napi_status.napi_object_expected */);
}
Object.seal(maybeObject);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
var propertyMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_define_properties: napi_define_properties,
napi_delete_element: napi_delete_element,
napi_delete_property: napi_delete_property,
napi_get_all_property_names: napi_get_all_property_names,
napi_get_element: napi_get_element,
napi_get_named_property: napi_get_named_property,
napi_get_property: napi_get_property,
napi_get_property_names: napi_get_property_names,
napi_has_element: napi_has_element,
napi_has_named_property: napi_has_named_property,
napi_has_own_property: napi_has_own_property,
napi_has_property: napi_has_property,
napi_object_freeze: napi_object_freeze,
napi_object_seal: napi_object_seal,
napi_set_element: napi_set_element,
napi_set_named_property: napi_set_named_property,
napi_set_property: napi_set_property
});
/** @__sig ippp */
function napi_run_script(env, script, result) {
var status;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var value;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!script)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var v8Script = emnapiCtx.handleStore.get(script);
if (!v8Script.isString()) {
return envObject.setLastError(3 /* napi_status.napi_string_expected */);
}
var g = emnapiCtx.handleStore.get(5 /* GlobalHandle.GLOBAL */).value;
var ret = g.eval(v8Script.value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
value = envObject.ensureHandleId(ret);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, value, true);
status = envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
return status;
}
var scriptMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_run_script: napi_run_script
});
/** @__sig ippp */
function napi_typeof(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var v = emnapiCtx.handleStore.get(value);
var r;
if (v.isNumber()) {
r = 3 /* napi_valuetype.napi_number */;
}
else if (v.isBigInt()) {
r = 9 /* napi_valuetype.napi_bigint */;
}
else if (v.isString()) {
r = 4 /* napi_valuetype.napi_string */;
}
else if (v.isFunction()) {
// This test has to come before IsObject because IsFunction
// implies IsObject
r = 7 /* napi_valuetype.napi_function */;
}
else if (v.isExternal()) {
// This test has to come before IsObject because IsExternal
// implies IsObject
r = 8 /* napi_valuetype.napi_external */;
}
else if (v.isObject()) {
r = 6 /* napi_valuetype.napi_object */;
}
else if (v.isBoolean()) {
r = 2 /* napi_valuetype.napi_boolean */;
}
else if (v.isUndefined()) {
r = 0 /* napi_valuetype.napi_undefined */;
}
else if (v.isSymbol()) {
r = 5 /* napi_valuetype.napi_symbol */;
}
else if (v.isNull()) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
r = 1 /* napi_valuetype.napi_null */;
}
else {
// Should not get here unless V8 has added some new kind of value.
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
}
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, r, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_coerce_to_bool(env, value, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
v = handle.value ? 4 /* GlobalHandle.TRUE */ : 3 /* GlobalHandle.FALSE */;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_coerce_to_number(env, value, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (handle.isBigInt()) {
throw new TypeError('Cannot convert a BigInt value to a number');
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
v = emnapiCtx.addToCurrentScope(Number(handle.value)).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_coerce_to_object(env, value, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (handle.value == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
v = envObject.ensureHandleId(Object(handle.value));
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_coerce_to_string(env, value, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var v;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var handle = emnapiCtx.handleStore.get(value);
if (handle.isSymbol()) {
throw new TypeError('Cannot convert a Symbol value to a string');
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
v = emnapiCtx.addToCurrentScope(String(handle.value)).id;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt32(result, v, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipppp */
function napi_instanceof(env, object, constructor, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!object)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!constructor)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, 0, true);
var ctor = emnapiCtx.handleStore.get(constructor);
if (!ctor.isFunction()) {
return envObject.setLastError(5 /* napi_status.napi_function_expected */);
}
var val = emnapiCtx.handleStore.get(object).value;
var ret = val instanceof ctor.value;
r = ret ? 1 : 0;
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ippp */
function napi_is_array(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = h.isArray() ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_is_arraybuffer(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = h.isArrayBuffer() ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_is_date(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = h.isDate() ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_is_error(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var val = emnapiCtx.handleStore.get(value).value;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = (val instanceof Error) ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_is_typedarray(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = h.isTypedArray() ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_is_buffer(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = h.isBuffer(emnapiCtx.feature.Buffer) ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_is_dataview(env, value, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!value)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(value);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r = h.isDataView() ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.clearLastError();
}
/** @__sig ipppp */
function napi_strict_equals(env, lhs, rhs, result) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var r;
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!lhs)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!rhs)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var lv = emnapiCtx.handleStore.get(lhs).value;
var rv = emnapiCtx.handleStore.get(rhs).value;
r = (lv === rv) ? 1 : 0;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setInt8(result, r, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
/** @__sig ipp */
function napi_detach_arraybuffer(env, arraybuffer) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!arraybuffer)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var value = emnapiCtx.handleStore.get(arraybuffer).value;
if (!(value instanceof ArrayBuffer)) {
if (typeof SharedArrayBuffer === 'function' && (value instanceof SharedArrayBuffer)) {
return envObject.setLastError(20 /* napi_status.napi_detachable_arraybuffer_expected */);
}
return envObject.setLastError(19 /* napi_status.napi_arraybuffer_expected */);
}
try {
var MessageChannel_1 = emnapiCtx.feature.MessageChannel;
var messageChannel = new MessageChannel_1();
messageChannel.port1.postMessage(value, [value]);
}
catch (_) {
return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
}
return envObject.clearLastError();
}
/** @__sig ippp */
function napi_is_detached_arraybuffer(env, arraybuffer, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
// @ts-expect-error
var envObject = emnapiCtx.envStore.get(env);
envObject.checkGCAccess();
if (!envObject.tryCatch.isEmpty())
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
if (!envObject.canCallIntoJs())
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
envObject.clearLastError();
try {
if (!arraybuffer)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
var h = emnapiCtx.handleStore.get(arraybuffer);
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
if (h.isArrayBuffer() && h.value.byteLength === 0) {
try {
// eslint-disable-next-line no-new
new Uint8Array(h.value);
}
catch (_) {
HEAP_DATA_VIEW.setInt8(result, 1, true);
return envObject.getReturnStatus();
}
}
HEAP_DATA_VIEW.setInt8(result, 0, true);
return envObject.getReturnStatus();
}
catch (err) {
envObject.tryCatch.setError(err);
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
}
}
var valueOperationMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_coerce_to_bool: napi_coerce_to_bool,
napi_coerce_to_number: napi_coerce_to_number,
napi_coerce_to_object: napi_coerce_to_object,
napi_coerce_to_string: napi_coerce_to_string,
napi_detach_arraybuffer: napi_detach_arraybuffer,
napi_instanceof: napi_instanceof,
napi_is_array: napi_is_array,
napi_is_arraybuffer: napi_is_arraybuffer,
napi_is_buffer: napi_is_buffer,
napi_is_dataview: napi_is_dataview,
napi_is_date: napi_is_date,
napi_is_detached_arraybuffer: napi_is_detached_arraybuffer,
napi_is_error: napi_is_error,
napi_is_typedarray: napi_is_typedarray,
napi_strict_equals: napi_strict_equals,
napi_typeof: napi_typeof
});
/** @__sig ipp */
function napi_get_version(env, result) {
if (!env)
return 1 /* napi_status.napi_invalid_arg */;
var envObject = emnapiCtx.envStore.get(env);
if (!result)
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var NODE_API_SUPPORTED_VERSION_MAX = 10 /* Version.NODE_API_SUPPORTED_VERSION_MAX */;
var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer);
HEAP_DATA_VIEW.setUint32(result, NODE_API_SUPPORTED_VERSION_MAX, true);
return envObject.clearLastError();
}
var versionMod = /*#__PURE__*/ Object.freeze({
__proto__: null,
napi_get_version: napi_get_version
});
emnapiAWST.init();
emnapiExternalMemory.init();
emnapiString.init();
emnapiTSFN.init();
PThread.init();
napiModule.emnapi.syncMemory = $emnapiSyncMemory;
napiModule.emnapi.getMemoryAddress = $emnapiGetMemoryAddress;
function addImports(mod) {
var keys = Object.keys(mod);
for (var i = 0; i < keys.length; ++i) {
var k = keys[i];
if (k.indexOf('$') === 0)
continue;
if (k.indexOf('emnapi_') === 0) {
napiModule.imports.emnapi[k] = mod[k];
}
else if (k.indexOf('_emnapi_') === 0 || k === 'napi_set_last_error' || k === 'napi_clear_last_error') {
napiModule.imports.env[k] = mod[k];
}
else {
napiModule.imports.napi[k] = mod[k];
}
}
}
addImports(asyncMod);
addImports(memoryMod);
addImports(asyncWorkMod);
addImports(utilMod);
addImports(convert2cMod);
addImports(convert2napiMod);
addImports(createMod);
addImports(globalMod);
addImports(wrapMod);
addImports(envMod);
addImports(emnapiMod);
addImports(errorMod);
addImports(functionMod);
addImports(lifeMod);
addImports(miscellaneousMod);
addImports(nodeMod);
addImports(promiseMod);
addImports(propertyMod);
addImports(scriptMod);
addImports(valueOperationMod);
addImports(versionMod);
napiModule.imports.napi.napi_create_threadsafe_function = napi_create_threadsafe_function;
napiModule.imports.napi.napi_get_threadsafe_function_context = napi_get_threadsafe_function_context;
napiModule.imports.napi.napi_call_threadsafe_function = napi_call_threadsafe_function;
napiModule.imports.napi.napi_acquire_threadsafe_function = napi_acquire_threadsafe_function;
napiModule.imports.napi.napi_release_threadsafe_function = napi_release_threadsafe_function;
napiModule.imports.napi.napi_unref_threadsafe_function = napi_unref_threadsafe_function;
napiModule.imports.napi.napi_ref_threadsafe_function = napi_ref_threadsafe_function;
return napiModule;
})();
return napiModule;
}
function loadNapiModuleImpl(loadFn, userNapiModule, wasmInput, options) {
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
options = options !== null && options !== void 0 ? options : {};
var getMemory = options.getMemory;
var getTable = options.getTable;
var beforeInit = options.beforeInit;
if (getMemory != null && typeof getMemory !== 'function') {
throw new TypeError('options.getMemory is not a function');
}
if (getTable != null && typeof getTable !== 'function') {
throw new TypeError('options.getTable is not a function');
}
if (beforeInit != null && typeof beforeInit !== 'function') {
throw new TypeError('options.beforeInit is not a function');
}
var napiModule;
{
napiModule = createNapiModule(options);
}
var wasi = options.wasi;
var wasiThreads;
var importObject = {
env: napiModule.imports.env,
napi: napiModule.imports.napi,
emnapi: napiModule.imports.emnapi
};
if (wasi) {
wasiThreads = new WASIThreads(napiModule.childThread
? {
wasi: wasi,
childThread: true,
postMessage: napiModule.postMessage
}
: {
wasi: wasi,
threadManager: napiModule.PThread,
waitThreadStart: napiModule.waitThreadStart
});
Object.assign(importObject, typeof wasi.getImportObject === 'function'
? wasi.getImportObject()
: { wasi_snapshot_preview1: wasi.wasiImport });
Object.assign(importObject, wasiThreads.getImportObject());
}
var overwriteImports = options.overwriteImports;
if (typeof overwriteImports === 'function') {
var newImportObject = overwriteImports(importObject);
if (typeof newImportObject === 'object' && newImportObject !== null) {
importObject = newImportObject;
}
}
return loadFn(wasmInput, importObject, function (err, source) {
if (err) {
throw err;
}
var originalInstance = source.instance;
var instance = originalInstance;
var originalExports = originalInstance.exports;
var exportMemory = 'memory' in originalExports;
var importMemory = 'memory' in importObject.env;
var memory = getMemory
? getMemory(originalExports)
: exportMemory
? originalExports.memory
: importMemory
? importObject.env.memory
: undefined;
if (!memory) {
throw new Error('memory is neither exported nor imported');
}
var table = getTable ? getTable(originalExports) : originalExports.__indirect_function_table;
if (wasi && !exportMemory) {
var exports_1 = Object.create(null);
Object.assign(exports_1, originalExports, { memory: memory });
instance = { exports: exports_1 };
}
var module = source.module;
if (wasi) {
instance = wasiThreads.initialize(instance, module, memory);
}
else {
napiModule.PThread.setup(module, memory);
}
var emnapiInit = function () {
if (beforeInit) {
beforeInit({
instance: originalInstance,
module: module
});
}
napiModule.init({
instance: instance,
module: module,
memory: memory,
table: table
});
var ret = {
instance: originalInstance,
module: module,
usedInstance: instance
};
{
ret.napiModule = napiModule;
}
return ret;
};
if (napiModule.PThread.shouldPreloadWorkers()) {
var poolReady = napiModule.PThread.loadWasmModuleToAllWorkers();
if (loadFn === loadCallback) {
return poolReady.then(emnapiInit);
}
else {
throw new Error('Synchronous loading is not supported with worker pool (reuseWorker.size > 0)');
}
}
return emnapiInit();
});
}
function loadCallback(wasmInput, importObject, callback) {
return load(wasmInput, importObject).then(function (source) {
return callback(null, source);
}, function (err) {
return callback(err);
});
}
function loadSyncCallback(wasmInput, importObject, callback) {
var source;
try {
source = loadSync(wasmInput, importObject);
}
catch (err) {
return callback(err);
}
return callback(null, source);
}
/** @public */
function instantiateNapiModule(
/** Only support `BufferSource` or `WebAssembly.Module` on Node.js */
wasmInput, options) {
return loadNapiModuleImpl(loadCallback, undefined, wasmInput, options);
}
/** @public */
function instantiateNapiModuleSync(wasmInput, options) {
return loadNapiModuleImpl(loadSyncCallback, undefined, wasmInput, options);
}
/** @public */
var MessageHandler = /*#__PURE__*/ (function (_super) {
__extends(MessageHandler, _super);
function MessageHandler(options) {
var _this = this;
if (typeof options.onLoad !== 'function') {
throw new TypeError('options.onLoad is not a function');
}
_this = _super.call(this, options) || this;
_this.napiModule = undefined;
return _this;
}
MessageHandler.prototype.instantiate = function (data) {
var _this = this;
var source = this.onLoad(data);
var then = source.then;
if (typeof then === 'function') {
return source.then(function (result) {
_this.napiModule = result.napiModule;
return result;
});
}
this.napiModule = source.napiModule;
return source;
};
MessageHandler.prototype.handle = function (e) {
var _this = this;
var _a;
_super.prototype.handle.call(this, e);
if ((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.__emnapi__) {
var type = e.data.__emnapi__.type;
var payload_1 = e.data.__emnapi__.payload;
if (type === 'async-worker-init') {
this.handleAfterLoad(e, function () {
_this.napiModule.initWorker(payload_1.arg);
});
}
else if (type === 'async-work-execute') {
this.handleAfterLoad(e, function () {
_this.napiModule.executeAsyncWork(payload_1.work);
});
}
}
};
return MessageHandler;
}(ThreadMessageHandler));
var externalValue = new WeakMap();
/** @public */
function isExternal(object) {
return externalValue.has(object);
}
/** @public */ // eslint-disable-next-line @typescript-eslint/no-redeclare
var External = (function () {
function External(value) {
Object.setPrototypeOf(this, null);
externalValue.set(this, value);
}
External.prototype = null;
return External;
})();
/** @public */
function getExternalValue(external) {
if (!isExternal(external)) {
throw new TypeError('not external');
}
return externalValue.get(external);
}
var supportNewFunction = /*#__PURE__*/ (function () {
var f;
try {
f = new Function();
}
catch (_) {
return false;
}
return typeof f === 'function';
})();
var _global = /*#__PURE__*/ (function () {
if (typeof globalThis !== 'undefined')
return globalThis;
var g = (function () { return this; })();
if (!g && supportNewFunction) {
try {
g = new Function('return this')();
}
catch (_) { }
}
if (!g) {
{
if (typeof global !== 'undefined')
return global;
}
if (typeof window !== 'undefined')
return window;
if (typeof self !== 'undefined')
return self;
}
return g;
})();
var TryCatch = /*#__PURE__*/ (function () {
function TryCatch() {
this._exception = undefined;
this._caught = false;
}
TryCatch.prototype.isEmpty = function () {
return !this._caught;
};
TryCatch.prototype.hasCaught = function () {
return this._caught;
};
TryCatch.prototype.exception = function () {
return this._exception;
};
TryCatch.prototype.setError = function (err) {
this._caught = true;
this._exception = err;
};
TryCatch.prototype.reset = function () {
this._caught = false;
this._exception = undefined;
};
TryCatch.prototype.extractException = function () {
var e = this._exception;
this.reset();
return e;
};
return TryCatch;
}());
var canSetFunctionName = /*#__PURE__*/ (function () {
var _a;
try {
return Boolean((_a = Object.getOwnPropertyDescriptor(Function.prototype, 'name')) === null || _a === void 0 ? void 0 : _a.configurable);
}
catch (_) {
return false;
}
})();
var supportReflect = typeof Reflect === 'object';
var supportFinalizer = (typeof FinalizationRegistry !== 'undefined') && (typeof WeakRef !== 'undefined');
var supportWeakSymbol = /*#__PURE__*/ (function () {
try {
// eslint-disable-next-line symbol-description
var sym = Symbol();
// eslint-disable-next-line no-new
new WeakRef(sym);
new WeakMap().set(sym, undefined);
}
catch (_) {
return false;
}
return true;
})();
var supportBigInt = typeof BigInt !== 'undefined';
var _require = /*#__PURE__*/ (function () {
var nativeRequire;
{
nativeRequire = (function () {
return (typeof require !== 'undefined' ? require : undefined);
})();
}
return nativeRequire;
})();
var _MessageChannel = typeof MessageChannel === 'function'
? MessageChannel
: /*#__PURE__*/ (function () {
try {
return _require('worker_threads').MessageChannel;
}
catch (_) { }
return undefined;
})();
var _setImmediate = typeof setImmediate === 'function'
? setImmediate
: function (callback) {
if (typeof callback !== 'function') {
throw new TypeError('The "callback" argument must be of type function');
}
if (_MessageChannel) {
var channel_1 = new _MessageChannel();
channel_1.port1.onmessage = function () {
channel_1.port1.onmessage = null;
channel_1 = undefined;
callback();
};
channel_1.port2.postMessage(null);
}
else {
setTimeout(callback, 0);
}
};
var _Buffer = typeof Buffer === 'function'
? Buffer
: /*#__PURE__*/ (function () {
try {
return _require('buffer').Buffer;
}
catch (_) { }
return undefined;
})();
var version = "1.4.3";
var NODE_API_SUPPORTED_VERSION_MAX = 10 /* Version.NODE_API_SUPPORTED_VERSION_MAX */;
var NAPI_VERSION_EXPERIMENTAL = 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */;
var NODE_API_DEFAULT_MODULE_API_VERSION = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */;
var Handle = /*#__PURE__*/ (function () {
function Handle(id, value) {
this.id = id;
this.value = value;
}
Handle.prototype.data = function () {
return getExternalValue(this.value);
};
Handle.prototype.isNumber = function () {
return typeof this.value === 'number';
};
Handle.prototype.isBigInt = function () {
return typeof this.value === 'bigint';
};
Handle.prototype.isString = function () {
return typeof this.value === 'string';
};
Handle.prototype.isFunction = function () {
return typeof this.value === 'function';
};
Handle.prototype.isExternal = function () {
return isExternal(this.value);
};
Handle.prototype.isObject = function () {
return typeof this.value === 'object' && this.value !== null;
};
Handle.prototype.isArray = function () {
return Array.isArray(this.value);
};
Handle.prototype.isArrayBuffer = function () {
return (this.value instanceof ArrayBuffer);
};
Handle.prototype.isTypedArray = function () {
return (ArrayBuffer.isView(this.value)) && !(this.value instanceof DataView);
};
Handle.prototype.isBuffer = function (BufferConstructor) {
if (ArrayBuffer.isView(this.value))
return true;
BufferConstructor !== null && BufferConstructor !== void 0 ? BufferConstructor : (BufferConstructor = _Buffer);
return typeof BufferConstructor === 'function' && BufferConstructor.isBuffer(this.value);
};
Handle.prototype.isDataView = function () {
return (this.value instanceof DataView);
};
Handle.prototype.isDate = function () {
return (this.value instanceof Date);
};
Handle.prototype.isPromise = function () {
return (this.value instanceof Promise);
};
Handle.prototype.isBoolean = function () {
return typeof this.value === 'boolean';
};
Handle.prototype.isUndefined = function () {
return this.value === undefined;
};
Handle.prototype.isSymbol = function () {
return typeof this.value === 'symbol';
};
Handle.prototype.isNull = function () {
return this.value === null;
};
Handle.prototype.dispose = function () {
this.value = undefined;
};
return Handle;
}());
var ConstHandle = /*#__PURE__*/ (function (_super) {
__extends(ConstHandle, _super);
function ConstHandle(id, value) {
return _super.call(this, id, value) || this;
}
ConstHandle.prototype.dispose = function () { };
return ConstHandle;
}(Handle));
var HandleStore = /*#__PURE__*/ (function () {
function HandleStore() {
this._values = [
undefined,
HandleStore.UNDEFINED,
HandleStore.NULL,
HandleStore.FALSE,
HandleStore.TRUE,
HandleStore.GLOBAL
];
this._next = HandleStore.MIN_ID;
}
HandleStore.prototype.push = function (value) {
var h;
var next = this._next;
var values = this._values;
if (next < values.length) {
h = values[next];
h.value = value;
}
else {
h = new Handle(next, value);
values[next] = h;
}
this._next++;
return h;
};
HandleStore.prototype.erase = function (start, end) {
this._next = start;
var values = this._values;
for (var i = start; i < end; ++i) {
values[i].dispose();
}
};
HandleStore.prototype.get = function (id) {
return this._values[id];
};
HandleStore.prototype.swap = function (a, b) {
var values = this._values;
var h = values[a];
values[a] = values[b];
values[a].id = Number(a);
values[b] = h;
h.id = Number(b);
};
HandleStore.prototype.dispose = function () {
this._values.length = HandleStore.MIN_ID;
this._next = HandleStore.MIN_ID;
};
HandleStore.UNDEFINED = new ConstHandle(1 /* GlobalHandle.UNDEFINED */, undefined);
HandleStore.NULL = new ConstHandle(2 /* GlobalHandle.NULL */, null);
HandleStore.FALSE = new ConstHandle(3 /* GlobalHandle.FALSE */, false);
HandleStore.TRUE = new ConstHandle(4 /* GlobalHandle.TRUE */, true);
HandleStore.GLOBAL = new ConstHandle(5 /* GlobalHandle.GLOBAL */, _global);
HandleStore.MIN_ID = 6;
return HandleStore;
}());
var HandleScope = /*#__PURE__*/ (function () {
function HandleScope(handleStore, id, parentScope, start, end) {
if (end === void 0) { end = start; }
this.handleStore = handleStore;
this.id = id;
this.parent = parentScope;
this.child = null;
if (parentScope !== null)
parentScope.child = this;
this.start = start;
this.end = end;
this._escapeCalled = false;
this.callbackInfo = {
thiz: undefined,
data: 0,
args: undefined,
fn: undefined
};
}
HandleScope.prototype.add = function (value) {
var h = this.handleStore.push(value);
this.end++;
return h;
};
HandleScope.prototype.addExternal = function (data) {
return this.add(new External(data));
};
HandleScope.prototype.dispose = function () {
if (this._escapeCalled)
this._escapeCalled = false;
if (this.start === this.end)
return;
this.handleStore.erase(this.start, this.end);
};
HandleScope.prototype.escape = function (handle) {
if (this._escapeCalled)
return null;
this._escapeCalled = true;
if (handle < this.start || handle >= this.end) {
return null;
}
this.handleStore.swap(handle, this.start);
var h = this.handleStore.get(this.start);
this.start++;
this.parent.end++;
return h;
};
HandleScope.prototype.escapeCalled = function () {
return this._escapeCalled;
};
return HandleScope;
}());
var ScopeStore = /*#__PURE__*/ (function () {
function ScopeStore() {
this._rootScope = new HandleScope(null, 0, null, 1, HandleStore.MIN_ID);
this.currentScope = this._rootScope;
this._values = [undefined];
}
ScopeStore.prototype.get = function (id) {
return this._values[id];
};
ScopeStore.prototype.openScope = function (envObject) {
var currentScope = this.currentScope;
var scope = currentScope.child;
if (scope !== null) {
scope.start = scope.end = currentScope.end;
}
else {
var id = currentScope.id + 1;
scope = new HandleScope(envObject.ctx.handleStore, id, currentScope, currentScope.end);
this._values[id] = scope;
}
this.currentScope = scope;
envObject.openHandleScopes++;
return scope;
};
ScopeStore.prototype.closeScope = function (envObject) {
if (envObject.openHandleScopes === 0)
return;
var scope = this.currentScope;
this.currentScope = scope.parent;
scope.dispose();
envObject.openHandleScopes--;
};
ScopeStore.prototype.dispose = function () {
this.currentScope = this._rootScope;
this._values.length = 1;
};
return ScopeStore;
}());
var RefTracker = /*#__PURE__*/ (function () {
function RefTracker() {
this._next = null;
this._prev = null;
}
/** @virtual */
RefTracker.prototype.dispose = function () { };
/** @virtual */
RefTracker.prototype.finalize = function () { };
RefTracker.prototype.link = function (list) {
this._prev = list;
this._next = list._next;
if (this._next !== null) {
this._next._prev = this;
}
list._next = this;
};
RefTracker.prototype.unlink = function () {
if (this._prev !== null) {
this._prev._next = this._next;
}
if (this._next !== null) {
this._next._prev = this._prev;
}
this._prev = null;
this._next = null;
};
RefTracker.finalizeAll = function (list) {
while (list._next !== null) {
list._next.finalize();
}
};
return RefTracker;
}());
var Finalizer = /*#__PURE__*/ (function () {
function Finalizer(envObject, _finalizeCallback, _finalizeData, _finalizeHint) {
if (_finalizeCallback === void 0) { _finalizeCallback = 0; }
if (_finalizeData === void 0) { _finalizeData = 0; }
if (_finalizeHint === void 0) { _finalizeHint = 0; }
this.envObject = envObject;
this._finalizeCallback = _finalizeCallback;
this._finalizeData = _finalizeData;
this._finalizeHint = _finalizeHint;
this._makeDynCall_vppp = envObject.makeDynCall_vppp;
}
Finalizer.prototype.callback = function () { return this._finalizeCallback; };
Finalizer.prototype.data = function () { return this._finalizeData; };
Finalizer.prototype.hint = function () { return this._finalizeHint; };
Finalizer.prototype.resetEnv = function () {
this.envObject = undefined;
};
Finalizer.prototype.resetFinalizer = function () {
this._finalizeCallback = 0;
this._finalizeData = 0;
this._finalizeHint = 0;
};
Finalizer.prototype.callFinalizer = function () {
var finalize_callback = this._finalizeCallback;
var finalize_data = this._finalizeData;
var finalize_hint = this._finalizeHint;
this.resetFinalizer();
if (!finalize_callback)
return;
var fini = Number(finalize_callback);
if (!this.envObject) {
this._makeDynCall_vppp(fini)(0, finalize_data, finalize_hint);
}
else {
this.envObject.callFinalizer(fini, finalize_data, finalize_hint);
}
};
Finalizer.prototype.dispose = function () {
this.envObject = undefined;
this._makeDynCall_vppp = undefined;
};
return Finalizer;
}());
var TrackedFinalizer = /*#__PURE__*/ (function (_super) {
__extends(TrackedFinalizer, _super);
function TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint) {
var _this = _super.call(this) || this;
_this._finalizer = new Finalizer(envObject, finalize_callback, finalize_data, finalize_hint);
return _this;
}
TrackedFinalizer.create = function (envObject, finalize_callback, finalize_data, finalize_hint) {
var finalizer = new TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint);
finalizer.link(envObject.finalizing_reflist);
return finalizer;
};
TrackedFinalizer.prototype.data = function () {
return this._finalizer.data();
};
TrackedFinalizer.prototype.dispose = function () {
if (!this._finalizer)
return;
this.unlink();
this._finalizer.envObject.dequeueFinalizer(this);
this._finalizer.dispose();
this._finalizer = undefined;
_super.prototype.dispose.call(this);
};
TrackedFinalizer.prototype.finalize = function () {
this.unlink();
var error;
var caught = false;
try {
this._finalizer.callFinalizer();
}
catch (err) {
caught = true;
error = err;
}
this.dispose();
if (caught) {
throw error;
}
};
return TrackedFinalizer;
}(RefTracker));
function throwNodeApiVersionError(moduleName, moduleApiVersion) {
var errorMessage = "".concat(moduleName, " requires Node-API version ").concat(moduleApiVersion, ", but this version of Node.js only supports version ").concat(NODE_API_SUPPORTED_VERSION_MAX, " add-ons.");
throw new Error(errorMessage);
}
function handleThrow(envObject, value) {
if (envObject.terminatedOrTerminating()) {
return;
}
throw value;
}
var Env = /*#__PURE__*/ (function () {
function Env(ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) {
this.ctx = ctx;
this.moduleApiVersion = moduleApiVersion;
this.makeDynCall_vppp = makeDynCall_vppp;
this.makeDynCall_vp = makeDynCall_vp;
this.abort = abort;
this.openHandleScopes = 0;
this.instanceData = null;
this.tryCatch = new TryCatch();
this.refs = 1;
this.reflist = new RefTracker();
this.finalizing_reflist = new RefTracker();
this.pendingFinalizers = [];
this.lastError = {
errorCode: 0 /* napi_status.napi_ok */,
engineErrorCode: 0,
engineReserved: 0
};
this.inGcFinalizer = false;
this._bindingMap = new WeakMap();
this.id = 0;
}
/** @virtual */
Env.prototype.canCallIntoJs = function () {
return true;
};
Env.prototype.terminatedOrTerminating = function () {
return !this.canCallIntoJs();
};
Env.prototype.ref = function () {
this.refs++;
};
Env.prototype.unref = function () {
this.refs--;
if (this.refs === 0) {
this.dispose();
}
};
Env.prototype.ensureHandle = function (value) {
return this.ctx.ensureHandle(value);
};
Env.prototype.ensureHandleId = function (value) {
return this.ensureHandle(value).id;
};
Env.prototype.clearLastError = function () {
var lastError = this.lastError;
if (lastError.errorCode !== 0 /* napi_status.napi_ok */)
lastError.errorCode = 0 /* napi_status.napi_ok */;
if (lastError.engineErrorCode !== 0)
lastError.engineErrorCode = 0;
if (lastError.engineReserved !== 0)
lastError.engineReserved = 0;
return 0 /* napi_status.napi_ok */;
};
Env.prototype.setLastError = function (error_code, engine_error_code, engine_reserved) {
if (engine_error_code === void 0) { engine_error_code = 0; }
if (engine_reserved === void 0) { engine_reserved = 0; }
var lastError = this.lastError;
if (lastError.errorCode !== error_code)
lastError.errorCode = error_code;
if (lastError.engineErrorCode !== engine_error_code)
lastError.engineErrorCode = engine_error_code;
if (lastError.engineReserved !== engine_reserved)
lastError.engineReserved = engine_reserved;
return error_code;
};
Env.prototype.getReturnStatus = function () {
return !this.tryCatch.hasCaught() ? 0 /* napi_status.napi_ok */ : this.setLastError(10 /* napi_status.napi_pending_exception */);
};
Env.prototype.callIntoModule = function (fn, handleException) {
if (handleException === void 0) { handleException = handleThrow; }
var openHandleScopesBefore = this.openHandleScopes;
this.clearLastError();
var r = fn(this);
if (openHandleScopesBefore !== this.openHandleScopes) {
this.abort('open_handle_scopes != open_handle_scopes_before');
}
if (this.tryCatch.hasCaught()) {
var err = this.tryCatch.extractException();
handleException(this, err);
}
return r;
};
Env.prototype.invokeFinalizerFromGC = function (finalizer) {
if (this.moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) {
this.enqueueFinalizer(finalizer);
}
else {
var saved = this.inGcFinalizer;
this.inGcFinalizer = true;
try {
finalizer.finalize();
}
finally {
this.inGcFinalizer = saved;
}
}
};
Env.prototype.checkGCAccess = function () {
if (this.moduleApiVersion === NAPI_VERSION_EXPERIMENTAL && this.inGcFinalizer) {
this.abort('Finalizer is calling a function that may affect GC state.\n' +
'The finalizers are run directly from GC and must not affect GC ' +
'state.\n' +
'Use `node_api_post_finalizer` from inside of the finalizer to work ' +
'around this issue.\n' +
'It schedules the call as a new task in the event loop.');
}
};
/** @virtual */
Env.prototype.enqueueFinalizer = function (finalizer) {
if (this.pendingFinalizers.indexOf(finalizer) === -1) {
this.pendingFinalizers.push(finalizer);
}
};
/** @virtual */
Env.prototype.dequeueFinalizer = function (finalizer) {
var index = this.pendingFinalizers.indexOf(finalizer);
if (index !== -1) {
this.pendingFinalizers.splice(index, 1);
}
};
/** @virtual */
Env.prototype.deleteMe = function () {
RefTracker.finalizeAll(this.finalizing_reflist);
RefTracker.finalizeAll(this.reflist);
this.tryCatch.extractException();
this.ctx.envStore.remove(this.id);
};
Env.prototype.dispose = function () {
if (this.id === 0)
return;
this.deleteMe();
this.finalizing_reflist.dispose();
this.reflist.dispose();
this.id = 0;
};
Env.prototype.initObjectBinding = function (value) {
var binding = {
wrapped: 0,
tag: null
};
this._bindingMap.set(value, binding);
return binding;
};
Env.prototype.getObjectBinding = function (value) {
if (this._bindingMap.has(value)) {
return this._bindingMap.get(value);
}
return this.initObjectBinding(value);
};
Env.prototype.setInstanceData = function (data, finalize_cb, finalize_hint) {
if (this.instanceData) {
this.instanceData.dispose();
}
this.instanceData = TrackedFinalizer.create(this, finalize_cb, data, finalize_hint);
};
Env.prototype.getInstanceData = function () {
return this.instanceData ? this.instanceData.data() : 0;
};
return Env;
}());
var NodeEnv = /*#__PURE__*/ (function (_super) {
__extends(NodeEnv, _super);
function NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) {
var _this = _super.call(this, ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) || this;
_this.filename = filename;
_this.nodeBinding = nodeBinding;
_this.destructing = false;
_this.finalizationScheduled = false;
return _this;
}
NodeEnv.prototype.deleteMe = function () {
this.destructing = true;
this.drainFinalizerQueue();
_super.prototype.deleteMe.call(this);
};
NodeEnv.prototype.canCallIntoJs = function () {
return _super.prototype.canCallIntoJs.call(this) && this.ctx.canCallIntoJs();
};
NodeEnv.prototype.triggerFatalException = function (err) {
if (this.nodeBinding) {
this.nodeBinding.napi.fatalException(err);
}
else {
{
throw err;
}
}
};
NodeEnv.prototype.callbackIntoModule = function (enforceUncaughtExceptionPolicy, fn) {
return this.callIntoModule(fn, function (envObject, err) {
if (envObject.terminatedOrTerminating()) {
return;
}
if (envObject.moduleApiVersion < 10 && true && !enforceUncaughtExceptionPolicy) {
var warn = function (warning, type, code) {
if (warning instanceof Error) {
console.warn(warning.toString());
}
else {
var prefix = code ? "[".concat(code, "] ") : '';
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
console.warn("".concat(prefix).concat(type || 'Warning', ": ").concat(warning));
}
};
warn('Uncaught N-API callback exception detected, please run node with option --force-node-api-uncaught-exceptions-policy=true to handle those exceptions properly.', 'DeprecationWarning', 'DEP0168');
return;
}
envObject.triggerFatalException(err);
});
};
NodeEnv.prototype.callFinalizer = function (cb, data, hint) {
this.callFinalizerInternal(1, cb, data, hint);
};
NodeEnv.prototype.callFinalizerInternal = function (forceUncaught, cb, data, hint) {
var f = this.makeDynCall_vppp(cb);
var env = this.id;
var scope = this.ctx.openScope(this);
try {
this.callbackIntoModule(Boolean(forceUncaught), function () { f(env, data, hint); });
}
finally {
this.ctx.closeScope(this, scope);
}
};
NodeEnv.prototype.enqueueFinalizer = function (finalizer) {
var _this = this;
_super.prototype.enqueueFinalizer.call(this, finalizer);
if (!this.finalizationScheduled && !this.destructing) {
this.finalizationScheduled = true;
this.ref();
_setImmediate(function () {
_this.finalizationScheduled = false;
_this.unref();
_this.drainFinalizerQueue();
});
}
};
NodeEnv.prototype.drainFinalizerQueue = function () {
while (this.pendingFinalizers.length > 0) {
var refTracker = this.pendingFinalizers.shift();
refTracker.finalize();
}
};
return NodeEnv;
}(Env));
function newEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) {
moduleApiVersion = typeof moduleApiVersion !== 'number' ? NODE_API_DEFAULT_MODULE_API_VERSION : moduleApiVersion;
// Validate module_api_version.
if (moduleApiVersion < NODE_API_DEFAULT_MODULE_API_VERSION) {
moduleApiVersion = NODE_API_DEFAULT_MODULE_API_VERSION;
}
else if (moduleApiVersion > NODE_API_SUPPORTED_VERSION_MAX && moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) {
throwNodeApiVersionError(filename, moduleApiVersion);
}
var env = new NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding);
ctx.envStore.add(env);
ctx.addCleanupHook(env, function () { env.unref(); }, 0);
return env;
}
var EmnapiError = /*#__PURE__*/ (function (_super) {
__extends(EmnapiError, _super);
function EmnapiError(message) {
var _newTarget = this.constructor;
var _this = _super.call(this, message) || this;
var ErrorConstructor = _newTarget;
var proto = ErrorConstructor.prototype;
if (!(_this instanceof EmnapiError)) {
var setPrototypeOf = Object.setPrototypeOf;
if (typeof setPrototypeOf === 'function') {
setPrototypeOf.call(Object, _this, proto);
}
else {
// eslint-disable-next-line no-proto
_this.__proto__ = proto;
}
if (typeof Error.captureStackTrace === 'function') {
Error.captureStackTrace(_this, ErrorConstructor);
}
}
return _this;
}
return EmnapiError;
}(Error));
Object.defineProperty(EmnapiError.prototype, 'name', {
configurable: true,
writable: true,
value: 'EmnapiError'
});
var NotSupportWeakRefError = /*#__PURE__*/ (function (_super) {
__extends(NotSupportWeakRefError, _super);
function NotSupportWeakRefError(api, message) {
return _super.call(this, "".concat(api, ": The current runtime does not support \"FinalizationRegistry\" and \"WeakRef\".").concat(message ? " ".concat(message) : '')) || this;
}
return NotSupportWeakRefError;
}(EmnapiError));
Object.defineProperty(NotSupportWeakRefError.prototype, 'name', {
configurable: true,
writable: true,
value: 'NotSupportWeakRefError'
});
var NotSupportBufferError = /*#__PURE__*/ (function (_super) {
__extends(NotSupportBufferError, _super);
function NotSupportBufferError(api, message) {
return _super.call(this, "".concat(api, ": The current runtime does not support \"Buffer\". Consider using buffer polyfill to make sure `globalThis.Buffer` is defined.").concat(message ? " ".concat(message) : '')) || this;
}
return NotSupportBufferError;
}(EmnapiError));
Object.defineProperty(NotSupportBufferError.prototype, 'name', {
configurable: true,
writable: true,
value: 'NotSupportBufferError'
});
var StrongRef = /*#__PURE__*/ (function () {
function StrongRef(value) {
this._value = value;
}
StrongRef.prototype.deref = function () {
return this._value;
};
StrongRef.prototype.dispose = function () {
this._value = undefined;
};
return StrongRef;
}());
var Persistent = /*#__PURE__*/ (function () {
function Persistent(value) {
this._ref = new StrongRef(value);
}
Persistent.prototype.setWeak = function (param, callback) {
if (!supportFinalizer || this._ref === undefined || this._ref instanceof WeakRef)
return;
var value = this._ref.deref();
try {
Persistent._registry.register(value, this, this);
var weakRef = new WeakRef(value);
this._ref.dispose();
this._ref = weakRef;
this._param = param;
this._callback = callback;
}
catch (err) {
if (typeof value === 'symbol') ;
else {
throw err;
}
}
};
Persistent.prototype.clearWeak = function () {
if (!supportFinalizer || this._ref === undefined)
return;
if (this._ref instanceof WeakRef) {
try {
Persistent._registry.unregister(this);
}
catch (_) { }
this._param = undefined;
this._callback = undefined;
var value = this._ref.deref();
if (value === undefined) {
this._ref = value;
}
else {
this._ref = new StrongRef(value);
}
}
};
Persistent.prototype.reset = function () {
if (supportFinalizer) {
try {
Persistent._registry.unregister(this);
}
catch (_) { }
}
this._param = undefined;
this._callback = undefined;
if (this._ref instanceof StrongRef) {
this._ref.dispose();
}
this._ref = undefined;
};
Persistent.prototype.isEmpty = function () {
return this._ref === undefined;
};
Persistent.prototype.deref = function () {
if (this._ref === undefined)
return undefined;
return this._ref.deref();
};
Persistent._registry = supportFinalizer
? new FinalizationRegistry(function (value) {
value._ref = undefined;
var callback = value._callback;
var param = value._param;
value._callback = undefined;
value._param = undefined;
if (typeof callback === 'function') {
callback(param);
}
})
: undefined;
return Persistent;
}());
var ReferenceOwnership;
(function (ReferenceOwnership) {
ReferenceOwnership[ReferenceOwnership["kRuntime"] = 0] = "kRuntime";
ReferenceOwnership[ReferenceOwnership["kUserland"] = 1] = "kUserland";
})(ReferenceOwnership || (ReferenceOwnership = {}));
function canBeHeldWeakly(value) {
return value.isObject() || value.isFunction() || value.isSymbol();
}
var Reference = /*#__PURE__*/ (function (_super) {
__extends(Reference, _super);
function Reference(envObject, handle_id, initialRefcount, ownership) {
var _this = _super.call(this) || this;
_this.envObject = envObject;
_this._refcount = initialRefcount;
_this._ownership = ownership;
var handle = envObject.ctx.handleStore.get(handle_id);
_this.canBeWeak = canBeHeldWeakly(handle);
_this.persistent = new Persistent(handle.value);
_this.id = 0;
if (initialRefcount === 0) {
_this._setWeak();
}
return _this;
}
Reference.weakCallback = function (ref) {
ref.persistent.reset();
ref.invokeFinalizerFromGC();
};
Reference.create = function (envObject, handle_id, initialRefcount, ownership, _unused1, _unused2, _unused3) {
var ref = new Reference(envObject, handle_id, initialRefcount, ownership);
envObject.ctx.refStore.add(ref);
ref.link(envObject.reflist);
return ref;
};
Reference.prototype.ref = function () {
if (this.persistent.isEmpty()) {
return 0;
}
if (++this._refcount === 1 && this.canBeWeak) {
this.persistent.clearWeak();
}
return this._refcount;
};
Reference.prototype.unref = function () {
if (this.persistent.isEmpty() || this._refcount === 0) {
return 0;
}
if (--this._refcount === 0) {
this._setWeak();
}
return this._refcount;
};
Reference.prototype.get = function (envObject) {
if (envObject === void 0) { envObject = this.envObject; }
if (this.persistent.isEmpty()) {
return 0;
}
var obj = this.persistent.deref();
var handle = envObject.ensureHandle(obj);
return handle.id;
};
/** @virtual */
Reference.prototype.resetFinalizer = function () { };
/** @virtual */
Reference.prototype.data = function () { return 0; };
Reference.prototype.refcount = function () { return this._refcount; };
Reference.prototype.ownership = function () { return this._ownership; };
/** @virtual */
Reference.prototype.callUserFinalizer = function () { };
/** @virtual */
Reference.prototype.invokeFinalizerFromGC = function () {
this.finalize();
};
Reference.prototype._setWeak = function () {
if (this.canBeWeak) {
this.persistent.setWeak(this, Reference.weakCallback);
}
else {
this.persistent.reset();
}
};
Reference.prototype.finalize = function () {
this.persistent.reset();
var deleteMe = this._ownership === ReferenceOwnership.kRuntime;
this.unlink();
this.callUserFinalizer();
if (deleteMe) {
this.dispose();
}
};
Reference.prototype.dispose = function () {
if (this.id === 0)
return;
this.unlink();
this.persistent.reset();
this.envObject.ctx.refStore.remove(this.id);
_super.prototype.dispose.call(this);
this.envObject = undefined;
this.id = 0;
};
return Reference;
}(RefTracker));
var ReferenceWithData = /*#__PURE__*/ (function (_super) {
__extends(ReferenceWithData, _super);
function ReferenceWithData(envObject, value, initialRefcount, ownership, _data) {
var _this = _super.call(this, envObject, value, initialRefcount, ownership) || this;
_this._data = _data;
return _this;
}
ReferenceWithData.create = function (envObject, value, initialRefcount, ownership, data) {
var reference = new ReferenceWithData(envObject, value, initialRefcount, ownership, data);
envObject.ctx.refStore.add(reference);
reference.link(envObject.reflist);
return reference;
};
ReferenceWithData.prototype.data = function () {
return this._data;
};
return ReferenceWithData;
}(Reference));
var ReferenceWithFinalizer = /*#__PURE__*/ (function (_super) {
__extends(ReferenceWithFinalizer, _super);
function ReferenceWithFinalizer(envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) {
var _this = _super.call(this, envObject, value, initialRefcount, ownership) || this;
_this._finalizer = new Finalizer(envObject, finalize_callback, finalize_data, finalize_hint);
return _this;
}
ReferenceWithFinalizer.create = function (envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) {
var reference = new ReferenceWithFinalizer(envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint);
envObject.ctx.refStore.add(reference);
reference.link(envObject.finalizing_reflist);
return reference;
};
ReferenceWithFinalizer.prototype.resetFinalizer = function () {
this._finalizer.resetFinalizer();
};
ReferenceWithFinalizer.prototype.data = function () {
return this._finalizer.data();
};
ReferenceWithFinalizer.prototype.callUserFinalizer = function () {
this._finalizer.callFinalizer();
};
ReferenceWithFinalizer.prototype.invokeFinalizerFromGC = function () {
this._finalizer.envObject.invokeFinalizerFromGC(this);
};
ReferenceWithFinalizer.prototype.dispose = function () {
if (!this._finalizer)
return;
this._finalizer.envObject.dequeueFinalizer(this);
this._finalizer.dispose();
_super.prototype.dispose.call(this);
this._finalizer = undefined;
};
return ReferenceWithFinalizer;
}(Reference));
var Deferred = /*#__PURE__*/ (function () {
function Deferred(ctx, value) {
this.id = 0;
this.ctx = ctx;
this.value = value;
}
Deferred.create = function (ctx, value) {
var deferred = new Deferred(ctx, value);
ctx.deferredStore.add(deferred);
return deferred;
};
Deferred.prototype.resolve = function (value) {
this.value.resolve(value);
this.dispose();
};
Deferred.prototype.reject = function (reason) {
this.value.reject(reason);
this.dispose();
};
Deferred.prototype.dispose = function () {
this.ctx.deferredStore.remove(this.id);
this.id = 0;
this.value = null;
this.ctx = null;
};
return Deferred;
}());
var Store = /*#__PURE__*/ (function () {
function Store() {
this._values = [undefined];
this._values.length = 4;
this._size = 1;
this._freeList = [];
}
Store.prototype.add = function (value) {
var id;
if (this._freeList.length) {
id = this._freeList.shift();
}
else {
id = this._size;
this._size++;
var capacity = this._values.length;
if (id >= capacity) {
this._values.length = capacity + (capacity >> 1) + 16;
}
}
value.id = id;
this._values[id] = value;
};
Store.prototype.get = function (id) {
return this._values[id];
};
Store.prototype.has = function (id) {
return this._values[id] !== undefined;
};
Store.prototype.remove = function (id) {
var value = this._values[id];
if (value) {
value.id = 0;
this._values[id] = undefined;
this._freeList.push(Number(id));
}
};
Store.prototype.dispose = function () {
for (var i = 1; i < this._size; ++i) {
var value = this._values[i];
value === null || value === void 0 ? void 0 : value.dispose();
}
this._values = [undefined];
this._size = 1;
this._freeList = [];
};
return Store;
}());
var CleanupHookCallback = /*#__PURE__*/ (function () {
function CleanupHookCallback(envObject, fn, arg, order) {
this.envObject = envObject;
this.fn = fn;
this.arg = arg;
this.order = order;
}
return CleanupHookCallback;
}());
var CleanupQueue = /*#__PURE__*/ (function () {
function CleanupQueue() {
this._cleanupHooks = [];
this._cleanupHookCounter = 0;
}
CleanupQueue.prototype.empty = function () {
return this._cleanupHooks.length === 0;
};
CleanupQueue.prototype.add = function (envObject, fn, arg) {
if (this._cleanupHooks.filter(function (hook) { return (hook.envObject === envObject && hook.fn === fn && hook.arg === arg); }).length > 0) {
throw new Error('Can not add same fn and arg twice');
}
this._cleanupHooks.push(new CleanupHookCallback(envObject, fn, arg, this._cleanupHookCounter++));
};
CleanupQueue.prototype.remove = function (envObject, fn, arg) {
for (var i = 0; i < this._cleanupHooks.length; ++i) {
var hook = this._cleanupHooks[i];
if (hook.envObject === envObject && hook.fn === fn && hook.arg === arg) {
this._cleanupHooks.splice(i, 1);
return;
}
}
};
CleanupQueue.prototype.drain = function () {
var hooks = this._cleanupHooks.slice();
hooks.sort(function (a, b) { return (b.order - a.order); });
for (var i = 0; i < hooks.length; ++i) {
var cb = hooks[i];
if (typeof cb.fn === 'number') {
cb.envObject.makeDynCall_vp(cb.fn)(cb.arg);
}
else {
cb.fn(cb.arg);
}
this._cleanupHooks.splice(this._cleanupHooks.indexOf(cb), 1);
}
};
CleanupQueue.prototype.dispose = function () {
this._cleanupHooks.length = 0;
this._cleanupHookCounter = 0;
};
return CleanupQueue;
}());
var Context = /*#__PURE__*/ (function () {
function Context() {
this._isStopping = false;
this._canCallIntoJs = true;
this._suppressDestroy = false;
this.envStore = new Store();
this.scopeStore = new ScopeStore();
this.refStore = new Store();
this.deferredStore = new Store();
this.handleStore = new HandleStore();
this.feature = {
supportReflect: supportReflect,
supportFinalizer: supportFinalizer,
supportWeakSymbol: supportWeakSymbol,
supportBigInt: supportBigInt,
supportNewFunction: supportNewFunction,
canSetFunctionName: canSetFunctionName,
setImmediate: _setImmediate,
Buffer: _Buffer,
MessageChannel: _MessageChannel
};
this.cleanupQueue = new CleanupQueue();
}
/**
* Suppress the destroy on `beforeExit` event in Node.js.
* Call this method if you want to keep the context and
* all associated {@link Env | Env} alive,
* this also means that cleanup hooks will not be called.
* After call this method, you should call
* {@link Context.destroy | `Context.prototype.destroy`} method manually.
*/
Context.prototype.suppressDestroy = function () {
this._suppressDestroy = true;
};
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
Context.prototype.getRuntimeVersions = function () {
return {
version: version,
NODE_API_SUPPORTED_VERSION_MAX: NODE_API_SUPPORTED_VERSION_MAX,
NAPI_VERSION_EXPERIMENTAL: NAPI_VERSION_EXPERIMENTAL,
NODE_API_DEFAULT_MODULE_API_VERSION: NODE_API_DEFAULT_MODULE_API_VERSION
};
};
Context.prototype.createNotSupportWeakRefError = function (api, message) {
return new NotSupportWeakRefError(api, message);
};
Context.prototype.createNotSupportBufferError = function (api, message) {
return new NotSupportBufferError(api, message);
};
Context.prototype.createReference = function (envObject, handle_id, initialRefcount, ownership) {
return Reference.create(envObject, handle_id, initialRefcount, ownership);
};
Context.prototype.createReferenceWithData = function (envObject, handle_id, initialRefcount, ownership, data) {
return ReferenceWithData.create(envObject, handle_id, initialRefcount, ownership, data);
};
Context.prototype.createReferenceWithFinalizer = function (envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) {
if (finalize_callback === void 0) { finalize_callback = 0; }
if (finalize_data === void 0) { finalize_data = 0; }
if (finalize_hint === void 0) { finalize_hint = 0; }
return ReferenceWithFinalizer.create(envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint);
};
Context.prototype.createDeferred = function (value) {
return Deferred.create(this, value);
};
Context.prototype.createEnv = function (filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) {
return newEnv(this, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding);
};
Context.prototype.createTrackedFinalizer = function (envObject, finalize_callback, finalize_data, finalize_hint) {
return TrackedFinalizer.create(envObject, finalize_callback, finalize_data, finalize_hint);
};
Context.prototype.getCurrentScope = function () {
return this.scopeStore.currentScope;
};
Context.prototype.addToCurrentScope = function (value) {
return this.scopeStore.currentScope.add(value);
};
Context.prototype.openScope = function (envObject) {
return this.scopeStore.openScope(envObject);
};
Context.prototype.closeScope = function (envObject, _scope) {
this.scopeStore.closeScope(envObject);
};
Context.prototype.ensureHandle = function (value) {
switch (value) {
case undefined: return HandleStore.UNDEFINED;
case null: return HandleStore.NULL;
case true: return HandleStore.TRUE;
case false: return HandleStore.FALSE;
case _global: return HandleStore.GLOBAL;
}
return this.addToCurrentScope(value);
};
Context.prototype.addCleanupHook = function (envObject, fn, arg) {
this.cleanupQueue.add(envObject, fn, arg);
};
Context.prototype.removeCleanupHook = function (envObject, fn, arg) {
this.cleanupQueue.remove(envObject, fn, arg);
};
Context.prototype.runCleanup = function () {
while (!this.cleanupQueue.empty()) {
this.cleanupQueue.drain();
}
};
Context.prototype.increaseWaitingRequestCounter = function () {
var _a;
(_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.increase();
};
Context.prototype.decreaseWaitingRequestCounter = function () {
var _a;
(_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.decrease();
};
Context.prototype.setCanCallIntoJs = function (value) {
this._canCallIntoJs = value;
};
Context.prototype.setStopping = function (value) {
this._isStopping = value;
};
Context.prototype.canCallIntoJs = function () {
return this._canCallIntoJs && !this._isStopping;
};
/**
* Destroy the context and call cleanup hooks.
* Associated {@link Env | Env} will be destroyed.
*/
Context.prototype.destroy = function () {
this.setStopping(true);
this.setCanCallIntoJs(false);
this.runCleanup();
};
return Context;
}());
var defaultContext;
function createContext() {
return new Context();
}
function getDefaultContext() {
if (!defaultContext) {
defaultContext = createContext();
}
return defaultContext;
}
const _WebAssembly = typeof WebAssembly !== 'undefined'
? WebAssembly
: typeof WXWebAssembly !== 'undefined'
? WXWebAssembly
: undefined;
if (!_WebAssembly) {
throw new Error('WebAssembly is not supported in this environment');
}
/* eslint-disable spaced-comment */
function validateObject(value, name) {
if (value === null || typeof value !== 'object') {
throw new TypeError(`${name} must be an object. Received ${value === null ? 'null' : typeof value}`);
}
}
function validateArray(value, name) {
if (!Array.isArray(value)) {
throw new TypeError(`${name} must be an array. Received ${value === null ? 'null' : typeof value}`);
}
}
function validateBoolean(value, name) {
if (typeof value !== 'boolean') {
throw new TypeError(`${name} must be a boolean. Received ${value === null ? 'null' : typeof value}`);
}
}
function validateString(value, name) {
if (typeof value !== 'string') {
throw new TypeError(`${name} must be a string. Received ${value === null ? 'null' : typeof value}`);
}
}
function validateFunction(value, name) {
if (typeof value !== 'function') {
throw new TypeError(`${name} must be a function. Received ${value === null ? 'null' : typeof value}`);
}
}
function validateUndefined(value, name) {
if (value !== undefined) {
throw new TypeError(`${name} must be undefined. Received ${value === null ? 'null' : typeof value}`);
}
}
function isPromiseLike(obj) {
return !!(obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function');
}
function unsharedSlice(view, start, end) {
return ((typeof SharedArrayBuffer === 'function' && view.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(view.buffer.constructor) === '[object SharedArrayBuffer]'))
? view.slice(start, end)
: view.subarray(start, end);
}
const CHAR_DOT = 46; /* . */
const CHAR_FORWARD_SLASH = 47; /* / */
function isPosixPathSeparator(code) {
return code === CHAR_FORWARD_SLASH;
}
function normalizeString(path, allowAboveRoot, separator, isPathSeparator) {
let res = '';
let lastSegmentLength = 0;
let lastSlash = -1;
let dots = 0;
let code = 0;
for (let i = 0; i <= path.length; ++i) {
if (i < path.length) {
code = path.charCodeAt(i);
}
else if (isPathSeparator(code)) {
break;
}
else {
code = CHAR_FORWARD_SLASH;
}
if (isPathSeparator(code)) {
if (lastSlash === i - 1 || dots === 1) ;
else if (dots === 2) {
if (res.length < 2 || lastSegmentLength !== 2 ||
res.charCodeAt(res.length - 1) !== CHAR_DOT ||
res.charCodeAt(res.length - 2) !== CHAR_DOT) {
if (res.length > 2) {
const lastSlashIndex = res.indexOf(separator);
if (lastSlashIndex === -1) {
res = '';
lastSegmentLength = 0;
}
else {
res = res.slice(0, lastSlashIndex);
lastSegmentLength =
res.length - 1 - res.indexOf(separator);
}
lastSlash = i;
dots = 0;
continue;
}
else if (res.length !== 0) {
res = '';
lastSegmentLength = 0;
lastSlash = i;
dots = 0;
continue;
}
}
if (allowAboveRoot) {
res += res.length > 0 ? `${separator}..` : '..';
lastSegmentLength = 2;
}
}
else {
if (res.length > 0) {
res += `${separator}${path.slice(lastSlash + 1, i)}`;
}
else {
res = path.slice(lastSlash + 1, i);
}
lastSegmentLength = i - lastSlash - 1;
}
lastSlash = i;
dots = 0;
}
else if (code === CHAR_DOT && dots !== -1) {
++dots;
}
else {
dots = -1;
}
}
return res;
}
function resolve(...args) {
let resolvedPath = '';
let resolvedAbsolute = false;
for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
const path = i >= 0 ? args[i] : '/';
validateString(path, 'path');
// Skip empty entries
if (path.length === 0) {
continue;
}
resolvedPath = `${path}/${resolvedPath}`;
resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH;
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator);
if (resolvedAbsolute) {
return `/${resolvedPath}`;
}
return resolvedPath.length > 0 ? resolvedPath : '.';
}
const FD_DATASYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(0));
const FD_READ = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(1));
const FD_SEEK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(2));
const FD_FDSTAT_SET_FLAGS = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(3));
const FD_SYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(4));
const FD_TELL = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(5));
const FD_WRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(6));
const FD_ADVISE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(7));
const FD_ALLOCATE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(8));
const PATH_CREATE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(9));
const PATH_CREATE_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(10));
const PATH_LINK_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(11));
const PATH_LINK_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(12));
const PATH_OPEN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(13));
const FD_READDIR = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(14));
const PATH_READLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(15));
const PATH_RENAME_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(16));
const PATH_RENAME_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(17));
const PATH_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(18));
const PATH_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(19));
const PATH_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(20));
const FD_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(21));
const FD_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(22));
const FD_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(23));
const PATH_SYMLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(24));
const PATH_REMOVE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(25));
const PATH_UNLINK_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(26));
const POLL_FD_READWRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(27));
const SOCK_SHUTDOWN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(28));
const SOCK_ACCEPT = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(29));
const WasiRights = {
FD_DATASYNC,
FD_READ,
FD_SEEK,
FD_FDSTAT_SET_FLAGS,
FD_SYNC,
FD_TELL,
FD_WRITE,
FD_ADVISE,
FD_ALLOCATE,
PATH_CREATE_DIRECTORY,
PATH_CREATE_FILE,
PATH_LINK_SOURCE,
PATH_LINK_TARGET,
PATH_OPEN,
FD_READDIR,
PATH_READLINK,
PATH_RENAME_SOURCE,
PATH_RENAME_TARGET,
PATH_FILESTAT_GET,
PATH_FILESTAT_SET_SIZE,
PATH_FILESTAT_SET_TIMES,
FD_FILESTAT_GET,
FD_FILESTAT_SET_SIZE,
FD_FILESTAT_SET_TIMES,
PATH_SYMLINK,
PATH_REMOVE_DIRECTORY,
PATH_UNLINK_FILE,
POLL_FD_READWRITE,
SOCK_SHUTDOWN,
SOCK_ACCEPT
};
function strerror(errno) {
switch (errno) {
case 0 /* WasiErrno.ESUCCESS */: return 'Success';
case 1 /* WasiErrno.E2BIG */: return 'Argument list too long';
case 2 /* WasiErrno.EACCES */: return 'Permission denied';
case 3 /* WasiErrno.EADDRINUSE */: return 'Address in use';
case 4 /* WasiErrno.EADDRNOTAVAIL */: return 'Address not available';
case 5 /* WasiErrno.EAFNOSUPPORT */: return 'Address family not supported by protocol';
case 6 /* WasiErrno.EAGAIN */: return 'Resource temporarily unavailable';
case 7 /* WasiErrno.EALREADY */: return 'Operation already in progress';
case 8 /* WasiErrno.EBADF */: return 'Bad file descriptor';
case 9 /* WasiErrno.EBADMSG */: return 'Bad message';
case 10 /* WasiErrno.EBUSY */: return 'Resource busy';
case 11 /* WasiErrno.ECANCELED */: return 'Operation canceled';
case 12 /* WasiErrno.ECHILD */: return 'No child null';
case 13 /* WasiErrno.ECONNABORTED */: return 'Connection aborted';
case 14 /* WasiErrno.ECONNREFUSED */: return 'Connection refused';
case 15 /* WasiErrno.ECONNRESET */: return 'Connection reset by peer';
case 16 /* WasiErrno.EDEADLK */: return 'Resource deadlock would occur';
case 17 /* WasiErrno.EDESTADDRREQ */: return 'Destination address required';
case 18 /* WasiErrno.EDOM */: return 'Domain error';
case 19 /* WasiErrno.EDQUOT */: return 'Quota exceeded';
case 20 /* WasiErrno.EEXIST */: return 'File exists';
case 21 /* WasiErrno.EFAULT */: return 'Bad address';
case 22 /* WasiErrno.EFBIG */: return 'File too large';
case 23 /* WasiErrno.EHOSTUNREACH */: return 'Host is unreachable';
case 24 /* WasiErrno.EIDRM */: return 'Identifier removed';
case 25 /* WasiErrno.EILSEQ */: return 'Illegal byte sequence';
case 26 /* WasiErrno.EINPROGRESS */: return 'Operation in progress';
case 27 /* WasiErrno.EINTR */: return 'Interrupted system call';
case 28 /* WasiErrno.EINVAL */: return 'Invalid argument';
case 29 /* WasiErrno.EIO */: return 'I/O error';
case 30 /* WasiErrno.EISCONN */: return 'Socket is connected';
case 31 /* WasiErrno.EISDIR */: return 'Is a directory';
case 32 /* WasiErrno.ELOOP */: return 'Symbolic link loop';
case 33 /* WasiErrno.EMFILE */: return 'No file descriptors available';
case 34 /* WasiErrno.EMLINK */: return 'Too many links';
case 35 /* WasiErrno.EMSGSIZE */: return 'Message too large';
case 36 /* WasiErrno.EMULTIHOP */: return 'Multihop attempted';
case 37 /* WasiErrno.ENAMETOOLONG */: return 'Filename too long';
case 38 /* WasiErrno.ENETDOWN */: return 'Network is down';
case 39 /* WasiErrno.ENETRESET */: return 'Connection reset by network';
case 40 /* WasiErrno.ENETUNREACH */: return 'Network unreachable';
case 41 /* WasiErrno.ENFILE */: return 'Too many files open in system';
case 42 /* WasiErrno.ENOBUFS */: return 'No buffer space available';
case 43 /* WasiErrno.ENODEV */: return 'No such device';
case 44 /* WasiErrno.ENOENT */: return 'No such file or directory';
case 45 /* WasiErrno.ENOEXEC */: return 'Exec format error';
case 46 /* WasiErrno.ENOLCK */: return 'No locks available';
case 47 /* WasiErrno.ENOLINK */: return 'Link has been severed';
case 48 /* WasiErrno.ENOMEM */: return 'Out of memory';
case 49 /* WasiErrno.ENOMSG */: return 'No message of the desired type';
case 50 /* WasiErrno.ENOPROTOOPT */: return 'Protocol not available';
case 51 /* WasiErrno.ENOSPC */: return 'No space left on device';
case 52 /* WasiErrno.ENOSYS */: return 'Function not implemented';
case 53 /* WasiErrno.ENOTCONN */: return 'Socket not connected';
case 54 /* WasiErrno.ENOTDIR */: return 'Not a directory';
case 55 /* WasiErrno.ENOTEMPTY */: return 'Directory not empty';
case 56 /* WasiErrno.ENOTRECOVERABLE */: return 'State not recoverable';
case 57 /* WasiErrno.ENOTSOCK */: return 'Not a socket';
case 58 /* WasiErrno.ENOTSUP */: return 'Not supported';
case 59 /* WasiErrno.ENOTTY */: return 'Not a tty';
case 60 /* WasiErrno.ENXIO */: return 'No such device or address';
case 61 /* WasiErrno.EOVERFLOW */: return 'Value too large for data type';
case 62 /* WasiErrno.EOWNERDEAD */: return 'Previous owner died';
case 63 /* WasiErrno.EPERM */: return 'Operation not permitted';
case 64 /* WasiErrno.EPIPE */: return 'Broken pipe';
case 65 /* WasiErrno.EPROTO */: return 'Protocol error';
case 66 /* WasiErrno.EPROTONOSUPPORT */: return 'Protocol not supported';
case 67 /* WasiErrno.EPROTOTYPE */: return 'Protocol wrong type for socket';
case 68 /* WasiErrno.ERANGE */: return 'Result not representable';
case 69 /* WasiErrno.EROFS */: return 'Read-only file system';
case 70 /* WasiErrno.ESPIPE */: return 'Invalid seek';
case 71 /* WasiErrno.ESRCH */: return 'No such null';
case 72 /* WasiErrno.ESTALE */: return 'Stale file handle';
case 73 /* WasiErrno.ETIMEDOUT */: return 'Operation timed out';
case 74 /* WasiErrno.ETXTBSY */: return 'Text file busy';
case 75 /* WasiErrno.EXDEV */: return 'Cross-device link';
case 76 /* WasiErrno.ENOTCAPABLE */: return 'Capabilities insufficient';
default: return 'Unknown error';
}
}
class WasiError extends Error {
constructor(message, errno) {
super(message);
this.errno = errno;
}
getErrorMessage() {
return strerror(this.errno);
}
}
Object.defineProperty(WasiError.prototype, 'name', {
configurable: true,
writable: true,
value: 'WasiError'
});
const RIGHTS_ALL = WasiRights.FD_DATASYNC |
WasiRights.FD_READ |
WasiRights.FD_SEEK |
WasiRights.FD_FDSTAT_SET_FLAGS |
WasiRights.FD_SYNC |
WasiRights.FD_TELL |
WasiRights.FD_WRITE |
WasiRights.FD_ADVISE |
WasiRights.FD_ALLOCATE |
WasiRights.PATH_CREATE_DIRECTORY |
WasiRights.PATH_CREATE_FILE |
WasiRights.PATH_LINK_SOURCE |
WasiRights.PATH_LINK_TARGET |
WasiRights.PATH_OPEN |
WasiRights.FD_READDIR |
WasiRights.PATH_READLINK |
WasiRights.PATH_RENAME_SOURCE |
WasiRights.PATH_RENAME_TARGET |
WasiRights.PATH_FILESTAT_GET |
WasiRights.PATH_FILESTAT_SET_SIZE |
WasiRights.PATH_FILESTAT_SET_TIMES |
WasiRights.FD_FILESTAT_GET |
WasiRights.FD_FILESTAT_SET_TIMES |
WasiRights.FD_FILESTAT_SET_SIZE |
WasiRights.PATH_SYMLINK |
WasiRights.PATH_UNLINK_FILE |
WasiRights.PATH_REMOVE_DIRECTORY |
WasiRights.POLL_FD_READWRITE |
WasiRights.SOCK_SHUTDOWN |
WasiRights.SOCK_ACCEPT;
const BLOCK_DEVICE_BASE = RIGHTS_ALL;
const BLOCK_DEVICE_INHERITING = RIGHTS_ALL;
const CHARACTER_DEVICE_BASE = RIGHTS_ALL;
const CHARACTER_DEVICE_INHERITING = RIGHTS_ALL;
const REGULAR_FILE_BASE = WasiRights.FD_DATASYNC |
WasiRights.FD_READ |
WasiRights.FD_SEEK |
WasiRights.FD_FDSTAT_SET_FLAGS |
WasiRights.FD_SYNC |
WasiRights.FD_TELL |
WasiRights.FD_WRITE |
WasiRights.FD_ADVISE |
WasiRights.FD_ALLOCATE |
WasiRights.FD_FILESTAT_GET |
WasiRights.FD_FILESTAT_SET_SIZE |
WasiRights.FD_FILESTAT_SET_TIMES |
WasiRights.POLL_FD_READWRITE;
const REGULAR_FILE_INHERITING = /*#__PURE__*/ BigInt(0);
const DIRECTORY_BASE = WasiRights.FD_FDSTAT_SET_FLAGS |
WasiRights.FD_SYNC |
WasiRights.FD_ADVISE |
WasiRights.PATH_CREATE_DIRECTORY |
WasiRights.PATH_CREATE_FILE |
WasiRights.PATH_LINK_SOURCE |
WasiRights.PATH_LINK_TARGET |
WasiRights.PATH_OPEN |
WasiRights.FD_READDIR |
WasiRights.PATH_READLINK |
WasiRights.PATH_RENAME_SOURCE |
WasiRights.PATH_RENAME_TARGET |
WasiRights.PATH_FILESTAT_GET |
WasiRights.PATH_FILESTAT_SET_SIZE |
WasiRights.PATH_FILESTAT_SET_TIMES |
WasiRights.FD_FILESTAT_GET |
WasiRights.FD_FILESTAT_SET_TIMES |
WasiRights.PATH_SYMLINK |
WasiRights.PATH_UNLINK_FILE |
WasiRights.PATH_REMOVE_DIRECTORY |
WasiRights.POLL_FD_READWRITE;
const DIRECTORY_INHERITING = DIRECTORY_BASE | REGULAR_FILE_BASE;
const SOCKET_BASE = (WasiRights.FD_READ |
WasiRights.FD_FDSTAT_SET_FLAGS |
WasiRights.FD_WRITE |
WasiRights.FD_FILESTAT_GET |
WasiRights.POLL_FD_READWRITE |
WasiRights.SOCK_SHUTDOWN);
const SOCKET_INHERITING = RIGHTS_ALL;
const TTY_BASE = WasiRights.FD_READ |
WasiRights.FD_FDSTAT_SET_FLAGS |
WasiRights.FD_WRITE |
WasiRights.FD_FILESTAT_GET |
WasiRights.POLL_FD_READWRITE;
const TTY_INHERITING = /*#__PURE__*/ BigInt(0);
function getRights(stdio, fd, flags, type) {
const ret = {
base: BigInt(0),
inheriting: BigInt(0)
};
if (type === 0 /* WasiFileType.UNKNOWN */) {
throw new WasiError('Unknown file type', 28 /* WasiErrno.EINVAL */);
}
switch (type) {
case 4 /* WasiFileType.REGULAR_FILE */:
ret.base = REGULAR_FILE_BASE;
ret.inheriting = REGULAR_FILE_INHERITING;
break;
case 3 /* WasiFileType.DIRECTORY */:
ret.base = DIRECTORY_BASE;
ret.inheriting = DIRECTORY_INHERITING;
break;
case 6 /* WasiFileType.SOCKET_STREAM */:
case 5 /* WasiFileType.SOCKET_DGRAM */:
ret.base = SOCKET_BASE;
ret.inheriting = SOCKET_INHERITING;
break;
case 2 /* WasiFileType.CHARACTER_DEVICE */:
if (stdio.indexOf(fd) !== -1) {
ret.base = TTY_BASE;
ret.inheriting = TTY_INHERITING;
}
else {
ret.base = CHARACTER_DEVICE_BASE;
ret.inheriting = CHARACTER_DEVICE_INHERITING;
}
break;
case 1 /* WasiFileType.BLOCK_DEVICE */:
ret.base = BLOCK_DEVICE_BASE;
ret.inheriting = BLOCK_DEVICE_INHERITING;
break;
default:
ret.base = BigInt(0);
ret.inheriting = BigInt(0);
}
/* Disable read/write bits depending on access mode. */
const read_or_write_only = flags & (0 | 1 | 2);
if (read_or_write_only === 0) {
ret.base &= ~WasiRights.FD_WRITE;
}
else if (read_or_write_only === 1) {
ret.base &= ~WasiRights.FD_READ;
}
return ret;
}
function concatBuffer(buffers, size) {
let total = 0;
{
for (let i = 0; i < buffers.length; i++) {
const buffer = buffers[i];
total += buffer.length;
}
}
let pos = 0;
const ret = new Uint8Array(total);
for (let i = 0; i < buffers.length; i++) {
const buffer = buffers[i];
ret.set(buffer, pos);
pos += buffer.length;
}
return ret;
}
class FileDescriptor {
constructor(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) {
this.id = id;
this.fd = fd;
this.path = path;
this.realPath = realPath;
this.type = type;
this.rightsBase = rightsBase;
this.rightsInheriting = rightsInheriting;
this.preopen = preopen;
this.pos = BigInt(0);
this.size = BigInt(0);
}
seek(offset, whence) {
if (whence === 0 /* WasiWhence.SET */) {
this.pos = BigInt(offset);
}
else if (whence === 1 /* WasiWhence.CUR */) {
this.pos += BigInt(offset);
}
else if (whence === 2 /* WasiWhence.END */) {
this.pos = BigInt(this.size) - BigInt(offset);
}
else {
throw new WasiError('Unknown whence', 29 /* WasiErrno.EIO */);
}
return this.pos;
}
}
class StandardOutput extends FileDescriptor {
constructor(log, id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) {
super(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen);
this._log = log;
this._buf = null;
}
write(buffer) {
const originalBuffer = buffer;
if (this._buf) {
buffer = concatBuffer([this._buf, buffer]);
this._buf = null;
}
if (buffer.indexOf(10) === -1) {
this._buf = buffer;
return originalBuffer.byteLength;
}
let written = 0;
let lastBegin = 0;
let index;
while ((index = buffer.indexOf(10, written)) !== -1) {
const str = new TextDecoder().decode(buffer.subarray(lastBegin, index));
this._log(str);
written += index - lastBegin + 1;
lastBegin = index + 1;
}
if (written < buffer.length) {
this._buf = buffer.slice(written);
}
return originalBuffer.byteLength;
}
}
function toFileType(stat) {
if (stat.isBlockDevice())
return 1 /* WasiFileType.BLOCK_DEVICE */;
if (stat.isCharacterDevice())
return 2 /* WasiFileType.CHARACTER_DEVICE */;
if (stat.isDirectory())
return 3 /* WasiFileType.DIRECTORY */;
if (stat.isSocket())
return 6 /* WasiFileType.SOCKET_STREAM */;
if (stat.isFile())
return 4 /* WasiFileType.REGULAR_FILE */;
if (stat.isSymbolicLink())
return 7 /* WasiFileType.SYMBOLIC_LINK */;
return 0 /* WasiFileType.UNKNOWN */;
}
function toFileStat(view, buf, stat) {
view.setBigUint64(buf, stat.dev, true);
view.setBigUint64(buf + 8, stat.ino, true);
view.setBigUint64(buf + 16, BigInt(toFileType(stat)), true);
view.setBigUint64(buf + 24, stat.nlink, true);
view.setBigUint64(buf + 32, stat.size, true);
view.setBigUint64(buf + 40, stat.atimeMs * BigInt(1000000), true);
view.setBigUint64(buf + 48, stat.mtimeMs * BigInt(1000000), true);
view.setBigUint64(buf + 56, stat.ctimeMs * BigInt(1000000), true);
}
class FileDescriptorTable {
constructor(options) {
this.used = 0;
this.size = options.size;
this.fds = Array(options.size);
this.stdio = [options.in, options.out, options.err];
this.print = options.print;
this.printErr = options.printErr;
this.insertStdio(options.in, 0, '<stdin>');
this.insertStdio(options.out, 1, '<stdout>');
this.insertStdio(options.err, 2, '<stderr>');
}
insertStdio(fd, expected, name) {
const type = 2 /* WasiFileType.CHARACTER_DEVICE */;
const { base, inheriting } = getRights(this.stdio, fd, 2 /* FileControlFlag.O_RDWR */, type);
const wrap = this.insert(fd, name, name, type, base, inheriting, 0);
if (wrap.id !== expected) {
throw new WasiError(`id: ${wrap.id} !== expected: ${expected}`, 8 /* WasiErrno.EBADF */);
}
return wrap;
}
insert(fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen) {
var _a, _b;
let index = -1;
if (this.used >= this.size) {
const newSize = this.size * 2;
this.fds.length = newSize;
index = this.size;
this.size = newSize;
}
else {
for (let i = 0; i < this.size; ++i) {
if (this.fds[i] == null) {
index = i;
break;
}
}
}
let entry;
if (mappedPath === '<stdout>') {
entry = new StandardOutput((_a = this.print) !== null && _a !== void 0 ? _a : console.log, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen);
}
else if (mappedPath === '<stderr>') {
entry = new StandardOutput((_b = this.printErr) !== null && _b !== void 0 ? _b : console.error, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen);
}
else {
entry = new FileDescriptor(index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen);
}
this.fds[index] = entry;
this.used++;
return entry;
}
get(id, base, inheriting) {
if (id >= this.size) {
throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);
}
const entry = this.fds[id];
if (!entry || entry.id !== id) {
throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */);
}
/* Validate that the fd has the necessary rights. */
if ((~entry.rightsBase & base) !== BigInt(0) || (~entry.rightsInheriting & inheriting) !== BigInt(0)) {
throw new WasiError('Capabilities insufficient', 76 /* WasiErrno.ENOTCAPABLE */);
}
return entry;
}
remove(id) {
if (id >= this.size) {
throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);
}
const entry = this.fds[id];
if (!entry || entry.id !== id) {
throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */);
}
this.fds[id] = undefined;
this.used--;
}
}
class SyncTable extends FileDescriptorTable {
constructor(options) {
super(options);
this.fs = options.fs;
}
getFileTypeByFd(fd) {
const stats = this.fs.fstatSync(fd, { bigint: true });
return toFileType(stats);
}
insertPreopen(fd, mappedPath, realPath) {
const type = this.getFileTypeByFd(fd);
if (type !== 3 /* WasiFileType.DIRECTORY */) {
throw new WasiError(`Preopen not dir: ["${mappedPath}", "${realPath}"]`, 54 /* WasiErrno.ENOTDIR */);
}
const result = getRights(this.stdio, fd, 0, type);
return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1);
}
renumber(dst, src) {
if (dst === src)
return;
if (dst >= this.size || src >= this.size) {
throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);
}
const dstEntry = this.fds[dst];
const srcEntry = this.fds[src];
if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) {
throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);
}
this.fs.closeSync(dstEntry.fd);
this.fds[dst] = this.fds[src];
this.fds[dst].id = dst;
this.fds[src] = undefined;
this.used--;
}
}
class AsyncTable extends FileDescriptorTable {
// eslint-disable-next-line @typescript-eslint/no-useless-constructor
constructor(options) {
super(options);
}
async getFileTypeByFd(fd) {
const stats = await fd.stat({ bigint: true });
return toFileType(stats);
}
async insertPreopen(fd, mappedPath, realPath) {
const type = await this.getFileTypeByFd(fd);
if (type !== 3 /* WasiFileType.DIRECTORY */) {
throw new WasiError(`Preopen not dir: ["${mappedPath}", "${realPath}"]`, 54 /* WasiErrno.ENOTDIR */);
}
const result = getRights(this.stdio, fd.fd, 0, type);
return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1);
}
async renumber(dst, src) {
if (dst === src)
return;
if (dst >= this.size || src >= this.size) {
throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);
}
const dstEntry = this.fds[dst];
const srcEntry = this.fds[src];
if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) {
throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */);
}
await dstEntry.fd.close();
this.fds[dst] = this.fds[src];
this.fds[dst].id = dst;
this.fds[src] = undefined;
this.used--;
}
}
/** @public */
const WebAssemblyMemory = /*#__PURE__*/ (function () { return _WebAssembly.Memory; })();
/** @public */
class Memory extends WebAssemblyMemory {
// eslint-disable-next-line @typescript-eslint/no-useless-constructor
constructor(descriptor) {
super(descriptor);
}
get HEAP8() { return new Int8Array(super.buffer); }
get HEAPU8() { return new Uint8Array(super.buffer); }
get HEAP16() { return new Int16Array(super.buffer); }
get HEAPU16() { return new Uint16Array(super.buffer); }
get HEAP32() { return new Int32Array(super.buffer); }
get HEAPU32() { return new Uint32Array(super.buffer); }
get HEAP64() { return new BigInt64Array(super.buffer); }
get HEAPU64() { return new BigUint64Array(super.buffer); }
get HEAPF32() { return new Float32Array(super.buffer); }
get HEAPF64() { return new Float64Array(super.buffer); }
get view() { return new DataView(super.buffer); }
}
/** @public */
function extendMemory(memory) {
if (Object.getPrototypeOf(memory) === _WebAssembly.Memory.prototype) {
Object.setPrototypeOf(memory, Memory.prototype);
}
return memory;
}
function checkWebAssemblyFunction() {
const WebAssemblyFunction = _WebAssembly.Function;
if (typeof WebAssemblyFunction !== 'function') {
throw new Error('WebAssembly.Function is not supported in this environment.' +
' If you are using V8 based browser like Chrome, try to specify' +
' --js-flags="--wasm-staging --experimental-wasm-stack-switching"');
}
return WebAssemblyFunction;
}
/** @public */
function wrapAsyncImport(f, parameterType, returnType) {
const WebAssemblyFunction = checkWebAssemblyFunction();
if (typeof f !== 'function') {
throw new TypeError('Function required');
}
const parameters = parameterType.slice(0);
parameters.unshift('externref');
return new WebAssemblyFunction({ parameters, results: returnType }, f, { suspending: 'first' });
}
function copyMemory(targets, src) {
if (targets.length === 0 || src.length === 0)
return 0;
let copied = 0;
let left = src.length - copied;
for (let i = 0; i < targets.length; ++i) {
const target = targets[i];
if (left < target.length) {
target.set(src.subarray(copied, copied + left), 0);
copied += left;
left = 0;
return copied;
}
target.set(src.subarray(copied, copied + target.length), 0);
copied += target.length;
left -= target.length;
}
return copied;
}
const _memory = new WeakMap();
const _wasi = new WeakMap();
const _fs = new WeakMap();
function getMemory(wasi) {
return _memory.get(wasi);
}
function getFs(wasi) {
const fs = _fs.get(wasi);
if (!fs)
throw new Error('filesystem is unavailable');
return fs;
}
function handleError(err) {
if (err instanceof WasiError) {
return err.errno;
}
switch (err.code) {
case 'ENOENT': return 44 /* WasiErrno.ENOENT */;
case 'EBADF': return 8 /* WasiErrno.EBADF */;
case 'EINVAL': return 28 /* WasiErrno.EINVAL */;
case 'EPERM': return 63 /* WasiErrno.EPERM */;
case 'EPROTO': return 65 /* WasiErrno.EPROTO */;
case 'EEXIST': return 20 /* WasiErrno.EEXIST */;
case 'ENOTDIR': return 54 /* WasiErrno.ENOTDIR */;
case 'EMFILE': return 33 /* WasiErrno.EMFILE */;
case 'EACCES': return 2 /* WasiErrno.EACCES */;
case 'EISDIR': return 31 /* WasiErrno.EISDIR */;
case 'ENOTEMPTY': return 55 /* WasiErrno.ENOTEMPTY */;
case 'ENOSYS': return 52 /* WasiErrno.ENOSYS */;
}
throw err;
}
function defineName(name, f) {
Object.defineProperty(f, 'name', { value: name });
return f;
}
function syscallWrap(self, name, f) {
return defineName(name, function () {
let r;
try {
r = f.apply(self, arguments);
}
catch (err) {
return handleError(err);
}
if (isPromiseLike(r)) {
return r.then(_ => _, handleError);
}
return r;
});
}
function resolvePathSync(fs, fileDescriptor, path, flags) {
let resolvedPath = resolve(fileDescriptor.realPath, path);
if ((flags & 1) === 1) {
try {
resolvedPath = fs.readlinkSync(resolvedPath);
}
catch (err) {
if (err.code !== 'EINVAL' && err.code !== 'ENOENT') {
throw err;
}
}
}
return resolvedPath;
}
async function resolvePathAsync(fs, fileDescriptor, path, flags) {
let resolvedPath = resolve(fileDescriptor.realPath, path);
if ((flags & 1) === 1) {
try {
resolvedPath = await fs.promises.readlink(resolvedPath);
}
catch (err) {
if (err.code !== 'EINVAL' && err.code !== 'ENOENT') {
throw err;
}
}
}
return resolvedPath;
}
// eslint-disable-next-line spaced-comment
const encoder = /*#__PURE__*/ new TextEncoder();
// eslint-disable-next-line spaced-comment
const decoder = /*#__PURE__*/ new TextDecoder();
const INT64_MAX = (BigInt(1) << BigInt(63)) - BigInt(1);
function readStdin() {
const value = window.prompt();
if (value === null)
return new Uint8Array();
const buffer = new TextEncoder().encode(value + '\n');
return buffer;
}
function validateFstFlagsOrReturn(flags) {
return (Boolean((flags) & -16) ||
((flags) & (1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */)) ===
(1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */) ||
((flags) & (4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)) ===
(4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */));
}
class WASI$1 {
constructor(args, env, fds, asyncFs, fs, asyncify) {
this.args_get = syscallWrap(this, 'args_get', function (argv, argv_buf) {
argv = Number(argv);
argv_buf = Number(argv_buf);
if (argv === 0 || argv_buf === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const args = wasi.args;
for (let i = 0; i < args.length; ++i) {
const arg = args[i];
view.setInt32(argv, argv_buf, true);
argv += 4;
const data = encoder.encode(arg + '\0');
HEAPU8.set(data, argv_buf);
argv_buf += data.length;
}
return 0 /* WasiErrno.ESUCCESS */;
});
this.args_sizes_get = syscallWrap(this, 'args_sizes_get', function (argc, argv_buf_size) {
argc = Number(argc);
argv_buf_size = Number(argv_buf_size);
if (argc === 0 || argv_buf_size === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { view } = getMemory(this);
const wasi = _wasi.get(this);
const args = wasi.args;
view.setUint32(argc, args.length, true);
view.setUint32(argv_buf_size, encoder.encode(args.join('\0') + '\0').length, true);
return 0 /* WasiErrno.ESUCCESS */;
});
this.environ_get = syscallWrap(this, 'environ_get', function (environ, environ_buf) {
environ = Number(environ);
environ_buf = Number(environ_buf);
if (environ === 0 || environ_buf === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const env = wasi.env;
for (let i = 0; i < env.length; ++i) {
const pair = env[i];
view.setInt32(environ, environ_buf, true);
environ += 4;
const data = encoder.encode(pair + '\0');
HEAPU8.set(data, environ_buf);
environ_buf += data.length;
}
return 0 /* WasiErrno.ESUCCESS */;
});
this.environ_sizes_get = syscallWrap(this, 'environ_sizes_get', function (len, buflen) {
len = Number(len);
buflen = Number(buflen);
if (len === 0 || buflen === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { view } = getMemory(this);
const wasi = _wasi.get(this);
view.setUint32(len, wasi.env.length, true);
view.setUint32(buflen, encoder.encode(wasi.env.join('\0') + '\0').length, true);
return 0 /* WasiErrno.ESUCCESS */;
});
this.clock_res_get = syscallWrap(this, 'clock_res_get', function (id, resolution) {
resolution = Number(resolution);
if (resolution === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { view } = getMemory(this);
switch (id) {
case 0 /* WasiClockid.REALTIME */:
view.setBigUint64(resolution, BigInt(1000000), true);
return 0 /* WasiErrno.ESUCCESS */;
case 1 /* WasiClockid.MONOTONIC */:
case 2 /* WasiClockid.PROCESS_CPUTIME_ID */:
case 3 /* WasiClockid.THREAD_CPUTIME_ID */:
view.setBigUint64(resolution, BigInt(1000), true);
return 0 /* WasiErrno.ESUCCESS */;
default: return 28 /* WasiErrno.EINVAL */;
}
});
this.clock_time_get = syscallWrap(this, 'clock_time_get', function (id, _percision, time) {
time = Number(time);
if (time === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { view } = getMemory(this);
switch (id) {
case 0 /* WasiClockid.REALTIME */:
view.setBigUint64(time, BigInt(Date.now()) * BigInt(1000000), true);
return 0 /* WasiErrno.ESUCCESS */;
case 1 /* WasiClockid.MONOTONIC */:
case 2 /* WasiClockid.PROCESS_CPUTIME_ID */:
case 3 /* WasiClockid.THREAD_CPUTIME_ID */: {
const t = performance.now() / 1000;
const s = Math.trunc(t);
const ms = Math.floor((t - s) * 1000);
const result = BigInt(s) * BigInt(1000000000) + BigInt(ms) * BigInt(1000000);
view.setBigUint64(time, result, true);
return 0 /* WasiErrno.ESUCCESS */;
}
default: return 28 /* WasiErrno.EINVAL */;
}
});
this.fd_advise = syscallWrap(this, 'fd_advise', function (_fd, _offset, _len, _advice) {
return 52 /* WasiErrno.ENOSYS */;
});
this.fd_fdstat_get = syscallWrap(this, 'fd_fdstat_get', function (fd, fdstat) {
fdstat = Number(fdstat);
if (fdstat === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));
const { view } = getMemory(this);
view.setUint16(fdstat, fileDescriptor.type, true);
view.setUint16(fdstat + 2, 0, true);
view.setBigUint64(fdstat + 8, fileDescriptor.rightsBase, true);
view.setBigUint64(fdstat + 16, fileDescriptor.rightsInheriting, true);
return 0 /* WasiErrno.ESUCCESS */;
});
this.fd_fdstat_set_flags = syscallWrap(this, 'fd_fdstat_set_flags', function (_fd, _flags) {
return 52 /* WasiErrno.ENOSYS */;
});
this.fd_fdstat_set_rights = syscallWrap(this, 'fd_fdstat_set_rights', function (fd, rightsBase, rightsInheriting) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));
if ((rightsBase | fileDescriptor.rightsBase) > fileDescriptor.rightsBase) {
return 76 /* WasiErrno.ENOTCAPABLE */;
}
if ((rightsInheriting | fileDescriptor.rightsInheriting) >
fileDescriptor.rightsInheriting) {
return 76 /* WasiErrno.ENOTCAPABLE */;
}
fileDescriptor.rightsBase = rightsBase;
fileDescriptor.rightsInheriting = rightsInheriting;
return 0 /* WasiErrno.ESUCCESS */;
});
this.fd_prestat_get = syscallWrap(this, 'fd_prestat_get', function (fd, prestat) {
prestat = Number(prestat);
if (prestat === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const wasi = _wasi.get(this);
let fileDescriptor;
try {
fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));
}
catch (err) {
if (err instanceof WasiError)
return err.errno;
throw err;
}
if (fileDescriptor.preopen !== 1)
return 28 /* WasiErrno.EINVAL */;
const { view } = getMemory(this);
// preopen type is dir(0)
view.setUint32(prestat, 0, true);
view.setUint32(prestat + 4, encoder.encode(fileDescriptor.path).length, true);
return 0 /* WasiErrno.ESUCCESS */;
});
this.fd_prestat_dir_name = syscallWrap(this, 'fd_prestat_dir_name', function (fd, path, path_len) {
path = Number(path);
path_len = Number(path_len);
if (path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));
if (fileDescriptor.preopen !== 1)
return 8 /* WasiErrno.EBADF */;
const buffer = encoder.encode(fileDescriptor.path);
const size = buffer.length;
if (size > path_len)
return 42 /* WasiErrno.ENOBUFS */;
const { HEAPU8 } = getMemory(this);
HEAPU8.set(buffer, path);
return 0 /* WasiErrno.ESUCCESS */;
});
this.fd_seek = syscallWrap(this, 'fd_seek', function (fd, offset, whence, newOffset) {
newOffset = Number(newOffset);
if (newOffset === 0) {
return 28 /* WasiErrno.EINVAL */;
}
if (fd === 0 || fd === 1 || fd === 2)
return 0 /* WasiErrno.ESUCCESS */;
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SEEK, BigInt(0));
const r = fileDescriptor.seek(offset, whence);
const { view } = getMemory(this);
view.setBigUint64(newOffset, r, true);
return 0 /* WasiErrno.ESUCCESS */;
});
this.fd_tell = syscallWrap(this, 'fd_tell', function (fd, offset) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_TELL, BigInt(0));
const pos = BigInt(fileDescriptor.pos);
const { view } = getMemory(this);
view.setBigUint64(Number(offset), pos, true);
return 0 /* WasiErrno.ESUCCESS */;
});
this.poll_oneoff = syscallWrap(this, 'poll_oneoff', function (in_ptr, out_ptr, nsubscriptions, nevents) {
in_ptr = Number(in_ptr);
out_ptr = Number(out_ptr);
nevents = Number(nevents);
nsubscriptions = Number(nsubscriptions);
nsubscriptions = nsubscriptions >>> 0;
if (in_ptr === 0 || out_ptr === 0 || nsubscriptions === 0 || nevents === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { view } = getMemory(this);
view.setUint32(nevents, 0, true);
let i = 0;
let timer_userdata = BigInt(0);
let cur_timeout = BigInt(0);
let has_timeout = 0;
let min_timeout = BigInt(0);
let sub;
const subscriptions = Array(nsubscriptions);
for (i = 0; i < nsubscriptions; i++) {
sub = in_ptr + i * 48;
const userdata = view.getBigUint64(sub, true);
const type = view.getUint8(sub + 8);
const clockIdOrFd = view.getUint32(sub + 16, true);
const timeout = view.getBigUint64(sub + 24, true);
const precision = view.getBigUint64(sub + 32, true);
const flags = view.getUint16(sub + 40, true);
subscriptions[i] = {
userdata,
type,
u: {
clock: {
clock_id: clockIdOrFd,
timeout,
precision,
flags
},
fd_readwrite: {
fd: clockIdOrFd
}
}
};
}
const fdevents = [];
for (i = 0; i < nsubscriptions; i++) {
sub = subscriptions[i];
switch (sub.type) {
case 0 /* WasiEventType.CLOCK */: {
if (sub.u.clock.flags === 1 /* WasiSubclockflags.ABSTIME */) {
/* Convert absolute time to relative delay. */
const now = BigInt(Date.now()) * BigInt(1000000);
cur_timeout = sub.u.clock.timeout - now;
}
else {
cur_timeout = sub.u.clock.timeout;
}
if (has_timeout === 0 || cur_timeout < min_timeout) {
min_timeout = cur_timeout;
timer_userdata = sub.userdata;
has_timeout = 1;
}
break;
}
case 1 /* WasiEventType.FD_READ */:
case 2 /* WasiEventType.FD_WRITE */:
fdevents.push(sub);
break;
default: return 28 /* WasiErrno.EINVAL */;
}
}
if (fdevents.length > 0) {
for (i = 0; i < fdevents.length; i++) {
const fdevent = fdevents[i];
const event = out_ptr + 32 * i;
view.setBigUint64(event, fdevent.userdata, true);
view.setUint32(event + 8, 52 /* WasiErrno.ENOSYS */, true);
view.setUint32(event + 12, fdevent.type, true);
view.setBigUint64(event + 16, BigInt(0), true);
view.setUint16(event + 24, 0, true);
view.setUint32(nevents, 1, true);
}
view.setUint32(nevents, fdevents.length, true);
return 0 /* WasiErrno.ESUCCESS */;
}
if (has_timeout) {
Number(min_timeout / BigInt(1000000));
// } else {
// const buf = new SharedArrayBuffer(4)
// const arr = new Int32Array(buf)
// postMsg({
// __tybys_wasm_util_wasi__: {
// type: 'set-timeout',
// payload: {
// buffer: buf,
// delay
// }
// }
// })
// Atomics.wait(arr, 0, 0)
// }
const event = out_ptr;
view.setBigUint64(event, timer_userdata, true);
view.setUint32(event + 8, 0 /* WasiErrno.ESUCCESS */, true);
view.setUint32(event + 12, 0 /* WasiEventType.CLOCK */, true);
view.setUint32(nevents, 1, true);
}
return 0 /* WasiErrno.ESUCCESS */;
});
this.proc_exit = syscallWrap(this, 'proc_exit', function (rval) {
return 0 /* WasiErrno.ESUCCESS */;
});
this.proc_raise = syscallWrap(this, 'proc_raise', function (_sig) {
return 52 /* WasiErrno.ENOSYS */;
});
this.sched_yield = syscallWrap(this, 'sched_yield', function () {
return 0 /* WasiErrno.ESUCCESS */;
});
this.random_get = typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function'
? syscallWrap(this, 'random_get', function (buf, buf_len) {
buf = Number(buf);
if (buf === 0) {
return 28 /* WasiErrno.EINVAL */;
}
buf_len = Number(buf_len);
const { HEAPU8, view } = getMemory(this);
if ((typeof SharedArrayBuffer === 'function' && HEAPU8.buffer instanceof SharedArrayBuffer) ||
(Object.prototype.toString.call(HEAPU8.buffer) === '[object SharedArrayBuffer]')) {
for (let i = buf; i < buf + buf_len; ++i) {
view.setUint8(i, Math.floor(Math.random() * 256));
}
return 0 /* WasiErrno.ESUCCESS */;
}
let pos;
const stride = 65536;
for (pos = 0; pos + stride < buf_len; pos += stride) {
crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + pos + stride));
}
crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + buf_len));
return 0 /* WasiErrno.ESUCCESS */;
})
: syscallWrap(this, 'random_get', function (buf, buf_len) {
buf = Number(buf);
if (buf === 0) {
return 28 /* WasiErrno.EINVAL */;
}
buf_len = Number(buf_len);
const { view } = getMemory(this);
for (let i = buf; i < buf + buf_len; ++i) {
view.setUint8(i, Math.floor(Math.random() * 256));
}
return 0 /* WasiErrno.ESUCCESS */;
});
this.sock_recv = syscallWrap(this, 'sock_recv', function () {
return 58 /* WasiErrno.ENOTSUP */;
});
this.sock_send = syscallWrap(this, 'sock_send', function () {
return 58 /* WasiErrno.ENOTSUP */;
});
this.sock_shutdown = syscallWrap(this, 'sock_shutdown', function () {
return 58 /* WasiErrno.ENOTSUP */;
});
this.sock_accept = syscallWrap(this, 'sock_accept', function () {
return 58 /* WasiErrno.ENOTSUP */;
});
_wasi.set(this, {
fds,
args,
env
});
if (fs)
_fs.set(this, fs);
// eslint-disable-next-line @typescript-eslint/no-this-alias
const _this = this;
function defineImport(name, syncVersion, asyncVersion, parameterType, returnType) {
if (asyncFs) {
if (asyncify) {
_this[name] = asyncify.wrapImportFunction(syscallWrap(_this, name, asyncVersion));
}
else {
_this[name] = wrapAsyncImport(syscallWrap(_this, name, asyncVersion), parameterType, returnType);
}
}
else {
_this[name] = syscallWrap(_this, name, syncVersion);
}
}
defineImport('fd_allocate', function fd_allocate(fd, offset, len) {
const wasi = _wasi.get(this);
const fs = getFs(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0));
const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true });
if (stat.size < offset + len) {
fs.ftruncateSync(fileDescriptor.fd, Number(offset + len));
}
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_allocate(fd, offset, len) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0));
const h = fileDescriptor.fd;
const stat = await h.stat({ bigint: true });
if (stat.size < offset + len) {
await h.truncate(Number(offset + len));
}
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i64', 'f64'], ['i32']);
defineImport('fd_close', function fd_close(fd) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));
const fs = getFs(this);
fs.closeSync(fileDescriptor.fd);
wasi.fds.remove(fd);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_close(fd) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0));
await fileDescriptor.fd.close();
wasi.fds.remove(fd);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32'], ['i32']);
defineImport('fd_datasync', function fd_datasync(fd) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0));
const fs = getFs(this);
fs.fdatasyncSync(fileDescriptor.fd);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_datasync(fd) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0));
await fileDescriptor.fd.datasync();
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32'], ['i32']);
defineImport('fd_filestat_get', function fd_filestat_get(fd, buf) {
buf = Number(buf);
if (buf === 0)
return 28 /* WasiErrno.EINVAL */;
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0));
const fs = getFs(this);
const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true });
const { view } = getMemory(this);
toFileStat(view, buf, stat);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_filestat_get(fd, buf) {
buf = Number(buf);
if (buf === 0)
return 28 /* WasiErrno.EINVAL */;
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0));
const h = fileDescriptor.fd;
const stat = await h.stat({ bigint: true });
const { view } = getMemory(this);
toFileStat(view, buf, stat);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32'], ['i32']);
defineImport('fd_filestat_set_size', function fd_filestat_set_size(fd, size) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0));
const fs = getFs(this);
fs.ftruncateSync(fileDescriptor.fd, Number(size));
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_filestat_set_size(fd, size) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0));
const h = fileDescriptor.fd;
await h.truncate(Number(size));
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i64'], ['i32']);
function fdFilestatGetTimes(fd, atim, mtim, flags) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_TIMES, BigInt(0));
if ((flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) {
atim = BigInt(Date.now() * 1000000);
}
if ((flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) {
mtim = BigInt(Date.now() * 1000000);
}
return { fileDescriptor, atim, mtim };
}
defineImport('fd_filestat_set_times', function fd_filestat_set_times(fd, atim, mtim, flags) {
if (validateFstFlagsOrReturn(flags)) {
return 28 /* WasiErrno.EINVAL */;
}
const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags);
const fs = getFs(this);
fs.futimesSync(fileDescriptor.fd, Number(atimRes), Number(mtimRes));
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_filestat_set_times(fd, atim, mtim, flags) {
if (validateFstFlagsOrReturn(flags)) {
return 28 /* WasiErrno.EINVAL */;
}
const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags);
const h = fileDescriptor.fd;
await h.utimes(Number(atimRes), Number(mtimRes));
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i64', 'i64', 'i32'], ['i32']);
defineImport('fd_pread', function fd_pread(fd, iovs, iovslen, offset, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
let totalSize = 0;
const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
totalSize += bufLen;
return HEAPU8.subarray(buf, buf + bufLen);
});
let nread = 0;
const buffer = (() => {
try {
return new Uint8Array(new SharedArrayBuffer(totalSize));
}
catch (_) {
return new Uint8Array(totalSize);
}
})();
buffer._isBuffer = true;
const fs = getFs(this);
const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset));
nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;
view.setUint32(size, nread, true);
return 0 /* WasiErrno.ESUCCESS */;
}, async function (fd, iovs, iovslen, offset, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
let totalSize = 0;
const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
totalSize += bufLen;
return HEAPU8.subarray(buf, buf + bufLen);
});
let nread = 0;
const buffer = new Uint8Array(totalSize);
buffer._isBuffer = true;
const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(offset));
nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;
view.setUint32(size, nread, true);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']);
defineImport('fd_pwrite', function fd_pwrite(fd, iovs, iovslen, offset, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
return HEAPU8.subarray(buf, buf + bufLen);
}));
const fs = getFs(this);
const nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset));
view.setUint32(size, nwritten, true);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_pwrite(fd, iovs, iovslen, offset, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
return HEAPU8.subarray(buf, buf + bufLen);
}));
const { bytesWritten } = await fileDescriptor.fd.write(buffer, 0, buffer.length, Number(offset));
view.setUint32(size, bytesWritten, true);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']);
defineImport('fd_read', function fd_read(fd, iovs, iovslen, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
let totalSize = 0;
const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
totalSize += bufLen;
return HEAPU8.subarray(buf, buf + bufLen);
});
let buffer;
let nread = 0;
if (fd === 0) {
if (typeof window === 'undefined' || typeof window.prompt !== 'function') {
return 58 /* WasiErrno.ENOTSUP */;
}
buffer = readStdin();
nread = buffer ? copyMemory(ioVecs, buffer) : 0;
}
else {
buffer = (() => {
try {
return new Uint8Array(new SharedArrayBuffer(totalSize));
}
catch (_) {
return new Uint8Array(totalSize);
}
})();
buffer._isBuffer = true;
const fs = getFs(this);
const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos));
nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;
fileDescriptor.pos += BigInt(nread);
}
view.setUint32(size, nread, true);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_read(fd, iovs, iovslen, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
let totalSize = 0;
const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
totalSize += bufLen;
return HEAPU8.subarray(buf, buf + bufLen);
});
let buffer;
let nread = 0;
if (fd === 0) {
if (typeof window === 'undefined' || typeof window.prompt !== 'function') {
return 58 /* WasiErrno.ENOTSUP */;
}
buffer = readStdin();
nread = buffer ? copyMemory(ioVecs, buffer) : 0;
}
else {
buffer = new Uint8Array(totalSize);
buffer._isBuffer = true;
const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(fileDescriptor.pos));
nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0;
fileDescriptor.pos += BigInt(nread);
}
view.setUint32(size, nread, true);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32'], ['i32']);
defineImport('fd_readdir', function fd_readdir(fd, buf, buf_len, cookie, bufused) {
buf = Number(buf);
buf_len = Number(buf_len);
bufused = Number(bufused);
if (buf === 0 || bufused === 0)
return 0 /* WasiErrno.ESUCCESS */;
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0));
const fs = getFs(this);
const entries = fs.readdirSync(fileDescriptor.realPath, { withFileTypes: true });
const { HEAPU8, view } = getMemory(this);
let bufferUsed = 0;
for (let i = Number(cookie); i < entries.length; i++) {
const nameData = encoder.encode(entries[i].name);
const entryInfo = fs.statSync(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true });
const entryData = new Uint8Array(24 + nameData.byteLength);
const entryView = new DataView(entryData.buffer);
entryView.setBigUint64(0, BigInt(i + 1), true);
entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true);
entryView.setUint32(16, nameData.byteLength, true);
let type;
if (entries[i].isFile()) {
type = 4 /* WasiFileType.REGULAR_FILE */;
}
else if (entries[i].isDirectory()) {
type = 3 /* WasiFileType.DIRECTORY */;
}
else if (entries[i].isSymbolicLink()) {
type = 7 /* WasiFileType.SYMBOLIC_LINK */;
}
else if (entries[i].isCharacterDevice()) {
type = 2 /* WasiFileType.CHARACTER_DEVICE */;
}
else if (entries[i].isBlockDevice()) {
type = 1 /* WasiFileType.BLOCK_DEVICE */;
}
else if (entries[i].isSocket()) {
type = 6 /* WasiFileType.SOCKET_STREAM */;
}
else {
type = 0 /* WasiFileType.UNKNOWN */;
}
entryView.setUint8(20, type);
entryData.set(nameData, 24);
const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed));
HEAPU8.set(data, buf + bufferUsed);
bufferUsed += data.byteLength;
}
view.setUint32(bufused, bufferUsed, true);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_readdir(fd, buf, buf_len, cookie, bufused) {
buf = Number(buf);
buf_len = Number(buf_len);
bufused = Number(bufused);
if (buf === 0 || bufused === 0)
return 0 /* WasiErrno.ESUCCESS */;
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0));
const fs = getFs(this);
const entries = await fs.promises.readdir(fileDescriptor.realPath, { withFileTypes: true });
const { HEAPU8, view } = getMemory(this);
let bufferUsed = 0;
for (let i = Number(cookie); i < entries.length; i++) {
const nameData = encoder.encode(entries[i].name);
const entryInfo = await fs.promises.stat(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true });
const entryData = new Uint8Array(24 + nameData.byteLength);
const entryView = new DataView(entryData.buffer);
entryView.setBigUint64(0, BigInt(i + 1), true);
entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true);
entryView.setUint32(16, nameData.byteLength, true);
let type;
if (entries[i].isFile()) {
type = 4 /* WasiFileType.REGULAR_FILE */;
}
else if (entries[i].isDirectory()) {
type = 3 /* WasiFileType.DIRECTORY */;
}
else if (entries[i].isSymbolicLink()) {
type = 7 /* WasiFileType.SYMBOLIC_LINK */;
}
else if (entries[i].isCharacterDevice()) {
type = 2 /* WasiFileType.CHARACTER_DEVICE */;
}
else if (entries[i].isBlockDevice()) {
type = 1 /* WasiFileType.BLOCK_DEVICE */;
}
else if (entries[i].isSocket()) {
type = 6 /* WasiFileType.SOCKET_STREAM */;
}
else {
type = 0 /* WasiFileType.UNKNOWN */;
}
entryView.setUint8(20, type);
entryData.set(nameData, 24);
const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed));
HEAPU8.set(data, buf + bufferUsed);
bufferUsed += data.byteLength;
}
view.setUint32(bufused, bufferUsed, true);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']);
defineImport('fd_renumber', function fd_renumber(from, to) {
const wasi = _wasi.get(this);
wasi.fds.renumber(to, from);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_renumber(from, to) {
const wasi = _wasi.get(this);
await wasi.fds.renumber(to, from);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32'], ['i32']);
defineImport('fd_sync', function fd_sync(fd) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0));
const fs = getFs(this);
fs.fsyncSync(fileDescriptor.fd);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_sync(fd) {
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0));
await fileDescriptor.fd.sync();
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32'], ['i32']);
defineImport('fd_write', function fd_write(fd, iovs, iovslen, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
return HEAPU8.subarray(buf, buf + bufLen);
}));
let nwritten;
if (fd === 1 || fd === 2) {
nwritten = fileDescriptor.write(buffer);
}
else {
const fs = getFs(this);
nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos));
fileDescriptor.pos += BigInt(nwritten);
}
view.setUint32(size, nwritten, true);
return 0 /* WasiErrno.ESUCCESS */;
}, async function fd_write(fd, iovs, iovslen, size) {
iovs = Number(iovs);
size = Number(size);
if ((iovs === 0 && iovslen) || size === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0));
if (!iovslen) {
view.setUint32(size, 0, true);
return 0 /* WasiErrno.ESUCCESS */;
}
const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => {
const offset = iovs + (i * 8);
const buf = view.getInt32(offset, true);
const bufLen = view.getUint32(offset + 4, true);
return HEAPU8.subarray(buf, buf + bufLen);
}));
let nwritten;
if (fd === 1 || fd === 2) {
nwritten = fileDescriptor.write(buffer);
}
else {
nwritten = await (await (fileDescriptor.fd.write(buffer, 0, buffer.length, Number(fileDescriptor.pos)))).bytesWritten;
fileDescriptor.pos += BigInt(nwritten);
}
view.setUint32(size, nwritten, true);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32'], ['i32']);
defineImport('path_create_directory', function path_create_directory(fd, path, path_len) {
path = Number(path);
path_len = Number(path_len);
if (path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
fs.mkdirSync(pathString);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_create_directory(fd, path, path_len) {
path = Number(path);
path_len = Number(path_len);
if (path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
await fs.promises.mkdir(pathString);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32'], ['i32']);
defineImport('path_filestat_get', function path_filestat_get(fd, flags, path, path_len, filestat) {
path = Number(path);
path_len = Number(path_len);
filestat = Number(filestat);
if (path === 0 || filestat === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
const fs = getFs(this);
pathString = resolve(fileDescriptor.realPath, pathString);
let stat;
if ((flags & 1) === 1) {
stat = fs.statSync(pathString, { bigint: true });
}
else {
stat = fs.lstatSync(pathString, { bigint: true });
}
toFileStat(view, filestat, stat);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_filestat_get(fd, flags, path, path_len, filestat) {
path = Number(path);
path_len = Number(path_len);
filestat = Number(filestat);
if (path === 0 || filestat === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
const fs = getFs(this);
pathString = resolve(fileDescriptor.realPath, pathString);
let stat;
if ((flags & 1) === 1) {
stat = await fs.promises.stat(pathString, { bigint: true });
}
else {
stat = await fs.promises.lstat(pathString, { bigint: true });
}
toFileStat(view, filestat, stat);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);
defineImport('path_filestat_set_times', function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) {
path = Number(path);
path_len = Number(path_len);
if (path === 0)
return 28 /* WasiErrno.EINVAL */;
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0));
if (validateFstFlagsOrReturn(fst_flags)) {
return 28 /* WasiErrno.EINVAL */;
}
const fs = getFs(this);
const resolvedPath = resolvePathSync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags);
if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) {
atim = BigInt(Date.now() * 1000000);
}
if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) {
mtim = BigInt(Date.now() * 1000000);
}
fs.utimesSync(resolvedPath, Number(atim), Number(mtim));
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) {
path = Number(path);
path_len = Number(path_len);
if (path === 0)
return 28 /* WasiErrno.EINVAL */;
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0));
if (validateFstFlagsOrReturn(fst_flags)) {
return 28 /* WasiErrno.EINVAL */;
}
const fs = getFs(this);
const resolvedPath = await resolvePathAsync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags);
if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) {
atim = BigInt(Date.now() * 1000000);
}
if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) {
mtim = BigInt(Date.now() * 1000000);
}
await fs.promises.utimes(resolvedPath, Number(atim), Number(mtim));
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32'], ['i32']);
defineImport('path_link', function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) {
old_path = Number(old_path);
old_path_len = Number(old_path_len);
new_path = Number(new_path);
new_path_len = Number(new_path_len);
if (old_path === 0 || new_path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const wasi = _wasi.get(this);
let oldWrap;
let newWrap;
if (old_fd === new_fd) {
oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0));
}
else {
oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0));
newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0));
}
const { HEAPU8 } = getMemory(this);
const fs = getFs(this);
const resolvedOldPath = resolvePathSync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags);
const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));
fs.linkSync(resolvedOldPath, resolvedNewPath);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) {
old_path = Number(old_path);
old_path_len = Number(old_path_len);
new_path = Number(new_path);
new_path_len = Number(new_path_len);
if (old_path === 0 || new_path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const wasi = _wasi.get(this);
let oldWrap;
let newWrap;
if (old_fd === new_fd) {
oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0));
}
else {
oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0));
newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0));
}
const { HEAPU8 } = getMemory(this);
const fs = getFs(this);
const resolvedOldPath = await resolvePathAsync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags);
const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));
await fs.promises.link(resolvedOldPath, resolvedNewPath);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);
function pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags) {
const read = (fs_rights_base & (WasiRights.FD_READ |
WasiRights.FD_READDIR)) !== BigInt(0);
const write = (fs_rights_base & (WasiRights.FD_DATASYNC |
WasiRights.FD_WRITE |
WasiRights.FD_ALLOCATE |
WasiRights.FD_FILESTAT_SET_SIZE)) !== BigInt(0);
let flags = write ? read ? 2 /* FileControlFlag.O_RDWR */ : 1 /* FileControlFlag.O_WRONLY */ : 0 /* FileControlFlag.O_RDONLY */;
let needed_base = WasiRights.PATH_OPEN;
let needed_inheriting = fs_rights_base | fs_rights_inheriting;
if ((o_flags & 1 /* WasiFileControlFlag.O_CREAT */) !== 0) {
flags |= 64 /* FileControlFlag.O_CREAT */;
needed_base |= WasiRights.PATH_CREATE_FILE;
}
if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0) {
flags |= 65536 /* FileControlFlag.O_DIRECTORY */;
}
if ((o_flags & 4 /* WasiFileControlFlag.O_EXCL */) !== 0) {
flags |= 128 /* FileControlFlag.O_EXCL */;
}
if ((o_flags & 8 /* WasiFileControlFlag.O_TRUNC */) !== 0) {
flags |= 512 /* FileControlFlag.O_TRUNC */;
needed_base |= WasiRights.PATH_FILESTAT_SET_SIZE;
}
if ((fs_flags & 1 /* WasiFdFlag.APPEND */) !== 0) {
flags |= 1024 /* FileControlFlag.O_APPEND */;
}
if ((fs_flags & 2 /* WasiFdFlag.DSYNC */) !== 0) {
// flags |= FileControlFlag.O_DSYNC;
needed_inheriting |= WasiRights.FD_DATASYNC;
}
if ((fs_flags & 4 /* WasiFdFlag.NONBLOCK */) !== 0) {
flags |= 2048 /* FileControlFlag.O_NONBLOCK */;
}
if ((fs_flags & 8 /* WasiFdFlag.RSYNC */) !== 0) {
flags |= 1052672 /* FileControlFlag.O_SYNC */;
needed_inheriting |= WasiRights.FD_SYNC;
}
if ((fs_flags & 16 /* WasiFdFlag.SYNC */) !== 0) {
flags |= 1052672 /* FileControlFlag.O_SYNC */;
needed_inheriting |= WasiRights.FD_SYNC;
}
if (write && (flags & (1024 /* FileControlFlag.O_APPEND */ | 512 /* FileControlFlag.O_TRUNC */)) === 0) {
needed_inheriting |= WasiRights.FD_SEEK;
}
return { flags, needed_base, needed_inheriting };
}
defineImport('path_open', function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) {
path = Number(path);
fd = Number(fd);
if (path === 0 || fd === 0) {
return 28 /* WasiErrno.EINVAL */;
}
path_len = Number(path_len);
fs_rights_base = BigInt(fs_rights_base);
fs_rights_inheriting = BigInt(fs_rights_inheriting);
const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting);
const memory = getMemory(this);
const HEAPU8 = memory.HEAPU8;
const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
const fs = getFs(this);
const resolved_path = resolvePathSync(fs, fileDescriptor, pathString, dirflags);
const r = fs.openSync(resolved_path, flagsRes, 0o666);
const filetype = wasi.fds.getFileTypeByFd(r);
if ((filetype !== 3 /* WasiFileType.DIRECTORY */) &&
((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 ||
(resolved_path.endsWith('/')))) {
return 54 /* WasiErrno.ENOTDIR */;
}
const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r, flagsRes, filetype);
const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0);
const stat = fs.fstatSync(r, { bigint: true });
if (stat.isFile()) {
wrap.size = stat.size;
if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) {
wrap.pos = stat.size;
}
}
const view = memory.view;
view.setInt32(fd, wrap.id, true);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) {
path = Number(path);
fd = Number(fd);
if (path === 0 || fd === 0) {
return 28 /* WasiErrno.EINVAL */;
}
path_len = Number(path_len);
fs_rights_base = BigInt(fs_rights_base);
fs_rights_inheriting = BigInt(fs_rights_inheriting);
const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting);
const memory = getMemory(this);
const HEAPU8 = memory.HEAPU8;
const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
const fs = getFs(this);
const resolved_path = await resolvePathAsync(fs, fileDescriptor, pathString, dirflags);
const r = await fs.promises.open(resolved_path, flagsRes, 0o666);
const filetype = await wasi.fds.getFileTypeByFd(r);
if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 && filetype !== 3 /* WasiFileType.DIRECTORY */) {
return 54 /* WasiErrno.ENOTDIR */;
}
const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r.fd, flagsRes, filetype);
const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0);
const stat = await r.stat({ bigint: true });
if (stat.isFile()) {
wrap.size = stat.size;
if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) {
wrap.pos = stat.size;
}
}
const view = memory.view;
view.setInt32(fd, wrap.id, true);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32', 'i32'], ['i32']);
defineImport('path_readlink', function path_readlink(fd, path, path_len, buf, buf_len, bufused) {
path = Number(path);
path_len = Number(path_len);
buf = Number(buf);
buf_len = Number(buf_len);
bufused = Number(bufused);
if (path === 0 || buf === 0 || bufused === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
const link = fs.readlinkSync(pathString);
const linkData = encoder.encode(link);
const len = Math.min(linkData.length, buf_len);
if (len >= buf_len)
return 42 /* WasiErrno.ENOBUFS */;
HEAPU8.set(linkData.subarray(0, len), buf);
HEAPU8[buf + len] = 0;
view.setUint32(bufused, len, true);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_readlink(fd, path, path_len, buf, buf_len, bufused) {
path = Number(path);
path_len = Number(path_len);
buf = Number(buf);
buf_len = Number(buf_len);
bufused = Number(bufused);
if (path === 0 || buf === 0 || bufused === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8, view } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
const link = await fs.promises.readlink(pathString);
const linkData = encoder.encode(link);
const len = Math.min(linkData.length, buf_len);
if (len >= buf_len)
return 42 /* WasiErrno.ENOBUFS */;
HEAPU8.set(linkData.subarray(0, len), buf);
HEAPU8[buf + len] = 0;
view.setUint32(bufused, len, true);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);
defineImport('path_remove_directory', function path_remove_directory(fd, path, path_len) {
path = Number(path);
path_len = Number(path_len);
if (path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
fs.rmdirSync(pathString);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_remove_directory(fd, path, path_len) {
path = Number(path);
path_len = Number(path_len);
if (path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
await fs.promises.rmdir(pathString);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32'], ['i32']);
defineImport('path_rename', function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) {
old_path = Number(old_path);
old_path_len = Number(old_path_len);
new_path = Number(new_path);
new_path_len = Number(new_path_len);
if (old_path === 0 || new_path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const wasi = _wasi.get(this);
let oldWrap;
let newWrap;
if (old_fd === new_fd) {
oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0));
}
else {
oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0));
newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0));
}
const { HEAPU8 } = getMemory(this);
const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)));
const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));
const fs = getFs(this);
fs.renameSync(resolvedOldPath, resolvedNewPath);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) {
old_path = Number(old_path);
old_path_len = Number(old_path_len);
new_path = Number(new_path);
new_path_len = Number(new_path_len);
if (old_path === 0 || new_path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const wasi = _wasi.get(this);
let oldWrap;
let newWrap;
if (old_fd === new_fd) {
oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0));
}
else {
oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0));
newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0));
}
const { HEAPU8 } = getMemory(this);
const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)));
const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)));
const fs = getFs(this);
await fs.promises.rename(resolvedOldPath, resolvedNewPath);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);
defineImport('path_symlink', function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) {
old_path = Number(old_path);
old_path_len = Number(old_path_len);
new_path = Number(new_path);
new_path_len = Number(new_path_len);
if (old_path === 0 || new_path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0));
const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len));
if (oldPath.length > 0 && oldPath[0] === '/') {
return 63 /* WasiErrno.EPERM */;
}
let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len));
newPath = resolve(fileDescriptor.realPath, newPath);
const fs = getFs(this);
fs.symlinkSync(oldPath, newPath);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) {
old_path = Number(old_path);
old_path_len = Number(old_path_len);
new_path = Number(new_path);
new_path_len = Number(new_path_len);
if (old_path === 0 || new_path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0));
const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len));
let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len));
newPath = resolve(fileDescriptor.realPath, newPath);
const fs = getFs(this);
await fs.promises.symlink(oldPath, newPath);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']);
defineImport('path_unlink_file', function path_unlink_file(fd, path, path_len) {
path = Number(path);
path_len = Number(path_len);
if (path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
fs.unlinkSync(pathString);
return 0 /* WasiErrno.ESUCCESS */;
}, async function path_unlink_file(fd, path, path_len) {
path = Number(path);
path_len = Number(path_len);
if (path === 0) {
return 28 /* WasiErrno.EINVAL */;
}
const { HEAPU8 } = getMemory(this);
const wasi = _wasi.get(this);
const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0));
let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len));
pathString = resolve(fileDescriptor.realPath, pathString);
const fs = getFs(this);
await fs.promises.unlink(pathString);
return 0 /* WasiErrno.ESUCCESS */;
}, ['i32', 'i32', 'i32'], ['i32']);
this._setMemory = function setMemory(m) {
if (!(m instanceof _WebAssembly.Memory)) {
throw new TypeError('"instance.exports.memory" property must be a WebAssembly.Memory');
}
_memory.set(_this, extendMemory(m));
};
}
static createSync(args, env, preopens, stdio, fs, print, printErr) {
const fds = new SyncTable({
size: 3,
in: stdio[0],
out: stdio[1],
err: stdio[2],
fs,
print,
printErr
});
const _this = new WASI$1(args, env, fds, false, fs);
if (preopens.length > 0) {
for (let i = 0; i < preopens.length; ++i) {
const realPath = fs.realpathSync(preopens[i].realPath, 'utf8');
const fd = fs.openSync(realPath, 'r', 0o666);
fds.insertPreopen(fd, preopens[i].mappedPath, realPath);
}
}
return _this;
}
static async createAsync(args, env, preopens, stdio, fs, print, printErr, asyncify) {
const fds = new AsyncTable({
size: 3,
in: stdio[0],
out: stdio[1],
err: stdio[2],
print,
printErr
});
const _this = new WASI$1(args, env, fds, true, fs, asyncify);
if (preopens.length > 0) {
for (let i = 0; i < preopens.length; ++i) {
const entry = preopens[i];
const realPath = await fs.promises.realpath(entry.realPath);
const fd = await fs.promises.open(realPath, 'r', 0o666);
await fds.insertPreopen(fd, entry.mappedPath, realPath);
}
}
return _this;
}
}
// eslint-disable-next-line spaced-comment
const kEmptyObject = /*#__PURE__*/ Object.freeze(/*#__PURE__*/ Object.create(null));
const kExitCode = Symbol('kExitCode');
const kSetMemory = Symbol('kSetMemory');
const kStarted = Symbol('kStarted');
const kInstance = Symbol('kInstance');
const kBindingName = Symbol('kBindingName');
function validateOptions(options) {
var _a;
validateObject(options, 'options');
let _WASI;
if (options.version !== undefined) {
validateString(options.version, 'options.version');
switch (options.version) {
case 'unstable':
_WASI = WASI$1;
this[kBindingName] = 'wasi_unstable';
break;
case 'preview1':
_WASI = WASI$1;
this[kBindingName] = 'wasi_snapshot_preview1';
break;
default:
throw new TypeError(`unsupported WASI version "${options.version}"`);
}
}
else {
_WASI = WASI$1;
this[kBindingName] = 'wasi_snapshot_preview1';
}
if (options.args !== undefined) {
validateArray(options.args, 'options.args');
}
const args = ((_a = options.args) !== null && _a !== void 0 ? _a : []).map(String);
const env = [];
if (options.env !== undefined) {
validateObject(options.env, 'options.env');
Object.entries(options.env).forEach(({ 0: key, 1: value }) => {
if (value !== undefined) {
env.push(`${key}=${value}`);
}
});
}
const preopens = [];
if (options.preopens !== undefined) {
validateObject(options.preopens, 'options.preopens');
Object.entries(options.preopens).forEach(({ 0: key, 1: value }) => preopens.push({ mappedPath: String(key), realPath: String(value) }));
}
if (preopens.length > 0) {
if (options.fs === undefined) {
throw new Error('filesystem is disabled, can not preopen directory');
}
try {
validateObject(options.fs, 'options.fs');
}
catch (_) {
throw new TypeError('Node.js fs like implementation is not provided');
}
}
// if (options.filesystem !== undefined) {
// validateObject(options.filesystem, 'options.filesystem')
// validateString(options.filesystem.type, 'options.filesystem.type')
// if (options.filesystem.type !== 'memfs' && options.filesystem.type !== 'file-system-access-api') {
// throw new Error(`Filesystem type ${(options.filesystem as any).type as string} is not supported, only "memfs" and "file-system-access-api" is supported currently`)
// }
// try {
// validateObject(options.filesystem.fs, 'options.filesystem.fs')
// } catch (_) {
// throw new Error('Node.js fs like implementation is not provided')
// }
// }
if (options.print !== undefined)
validateFunction(options.print, 'options.print');
if (options.printErr !== undefined)
validateFunction(options.printErr, 'options.printErr');
if (options.returnOnExit !== undefined) {
validateBoolean(options.returnOnExit, 'options.returnOnExit');
}
// const { stdin = 0, stdout = 1, stderr = 2 } = options
// validateInt32(stdin, 'options.stdin', 0)
// validateInt32(stdout, 'options.stdout', 0)
// validateInt32(stderr, 'options.stderr', 0)
// const stdio = [stdin, stdout, stderr] as const
const stdio = [0, 1, 2];
return {
args,
env,
preopens,
stdio,
_WASI
};
}
function initWASI(setMemory, wrap) {
this[kSetMemory] = setMemory;
this.wasiImport = wrap;
this[kStarted] = false;
this[kExitCode] = 0;
this[kInstance] = undefined;
}
/** @public */
class WASI {
constructor(options = kEmptyObject) {
const { args, env, preopens, stdio, _WASI } = validateOptions.call(this, options);
const wrap = _WASI.createSync(args, env, preopens, stdio, options.fs, options.print, options.printErr);
const setMemory = wrap._setMemory;
delete wrap._setMemory;
initWASI.call(this, setMemory, wrap);
if (options.returnOnExit) {
wrap.proc_exit = wasiReturnOnProcExit.bind(this);
}
}
finalizeBindings(instance, _a) {
var _b;
var { memory = (_b = instance === null || instance === void 0 ? void 0 : instance.exports) === null || _b === void 0 ? void 0 : _b.memory } = _a === void 0 ? {} : _a;
if (this[kStarted]) {
throw new Error('WASI instance has already started');
}
validateObject(instance, 'instance');
validateObject(instance.exports, 'instance.exports');
this[kSetMemory](memory);
this[kInstance] = instance;
this[kStarted] = true;
}
// Must not export _initialize, must export _start
start(instance) {
this.finalizeBindings(instance);
const { _start, _initialize } = this[kInstance].exports;
validateFunction(_start, 'instance.exports._start');
validateUndefined(_initialize, 'instance.exports._initialize');
let ret;
try {
ret = _start();
}
catch (err) {
if (err !== kExitCode) {
throw err;
}
}
if (ret instanceof Promise) {
return ret.then(() => this[kExitCode], (err) => {
if (err !== kExitCode) {
throw err;
}
return this[kExitCode];
});
}
return this[kExitCode];
}
// Must not export _start, may optionally export _initialize
initialize(instance) {
this.finalizeBindings(instance);
const { _start, _initialize } = this[kInstance].exports;
validateUndefined(_start, 'instance.exports._start');
if (_initialize !== undefined) {
validateFunction(_initialize, 'instance.exports._initialize');
return _initialize();
}
}
getImportObject() {
return { [this[kBindingName]]: this.wasiImport };
}
}
function wasiReturnOnProcExit(rval) {
this[kExitCode] = rval;
// eslint-disable-next-line @typescript-eslint/no-throw-literal
throw kExitCode;
}
var fsProxy = {};
var hasRequiredFsProxy;
function requireFsProxy () {
if (hasRequiredFsProxy) return fsProxy;
hasRequiredFsProxy = 1;
// @ts-check
/**
* @param {unknown} value
*/
const getType = (value) => {
if (value === undefined) return 0
if (value === null) return 1
const t = typeof value;
if (t === 'boolean') return 2
if (t === 'number') return 3
if (t === 'string') return 4
if (t === 'object') return 6
if (t === 'bigint') return 9
return -1
};
/**
* @param {import('memfs').IFs} memfs
* @param {any} value
* @param {ReturnType<typeof getType>} type
* @returns {Uint8Array}
*/
const encodeValue = (memfs, value, type) => {
switch (type) {
case 0:
case 1:
return new Uint8Array(0)
case 2: {
const view = new Int32Array(1);
view[0] = value ? 1 : 0;
return new Uint8Array(view.buffer)
}
case 3: {
const view = new Float64Array(1);
view[0] = value;
return new Uint8Array(view.buffer)
}
case 4: {
const view = new TextEncoder().encode(value);
return view
}
case 6: {
const [entry] = Object.entries(memfs).filter(([_, v]) => v === value.constructor)[0] ?? [];
if (entry) {
Object.defineProperty(value, '__constructor__', {
configurable: true,
writable: true,
enumerable: true,
value: entry
});
}
const json = JSON.stringify(value, (_, value) => {
if (typeof value === 'bigint') {
return `BigInt(${String(value)})`
}
if (value instanceof Error) {
return {
...value,
message: value.message,
stack: value.stack,
__error__: value.constructor.name,
}
}
return value
});
const view = new TextEncoder().encode(json);
return view
}
case 9: {
const view = new BigInt64Array(1);
view[0] = value;
return new Uint8Array(view.buffer)
}
case -1:
default:
throw new Error('unsupported data')
}
};
/**
* @param {typeof import('memfs')} memfs
* @param {Uint8Array} payload
* @param {number} type
* @returns {any}
*/
const decodeValue = (memfs, payload, type) => {
if (type === 0) return undefined
if (type === 1) return null
if (type === 2) return Boolean(new Int32Array(payload.buffer, payload.byteOffset, 1)[0])
if (type === 3) return new Float64Array(payload.buffer, payload.byteOffset, 1)[0]
if (type === 4) return new TextDecoder().decode(payload.slice())
if (type === 6) {
const obj = JSON.parse(new TextDecoder().decode(payload.slice()), (_key, value) => {
if (typeof value === 'string') {
const matched = value.match(/^BigInt\((-?\d+)\)$/);
if (matched && matched[1]) {
return BigInt(matched[1])
}
}
return value
});
if (obj.__constructor__) {
const ctor = obj.__constructor__;
delete obj.__constructor__;
Object.setPrototypeOf(obj, memfs[ctor].prototype);
}
if (obj.__error__) {
const name = obj.__error__;
const ErrorConstructor = globalThis[name] || Error;
delete obj.__error__;
const err = new ErrorConstructor(obj.message);
Object.defineProperty(err, 'stack', {
configurable: true,
enumerable: false,
writable: true,
value: err.stack
});
Object.defineProperty(err, Symbol.toStringTag, {
configurable: true,
enumerable: false,
writable: true,
value: name
});
for (const [k, v] of Object.entries(obj)) {
if (k === 'message' || k === 'stack') continue
err[k] = v;
}
return err
}
return obj
}
if (type === 9) return new BigInt64Array(payload.buffer, payload.byteOffset, 1)[0]
throw new Error('unsupported data')
};
/**
* @param {import('memfs').IFs} fs
* @returns {(e: { data: { __fs__: { sab: Int32Array, type: keyof import('memfs').IFs, payload: any[] } } }) => void}
*/
// oxlint-disable-next-line no-unused-vars -- fixed in an upcoming release
fsProxy.createOnMessage = (fs) => function onMessage(e) {
if (e.data.__fs__) {
/**
* 0..4 status(int32_t): 21(waiting) 0(success) 1(error)
* 5..8 type(napi_valuetype): 0(undefined) 1(null) 2(boolean) 3(number) 4(string) 6(jsonstring) 9(bigint) -1(unsupported)
* 9..16 payload_size(uint32_t) <= 1024
* 16..16 + payload_size payload_content
*/
const { sab, type, payload } = e.data.__fs__;
const fn = fs[type];
try {
const ret = fn.apply(fs, payload);
const t = getType(ret);
Atomics.store(sab, 1, t);
const v = encodeValue(fs, ret, t);
Atomics.store(sab, 2, v.length);
new Uint8Array(sab.buffer).set(v, 16);
Atomics.store(sab, 0, 0); // success
} catch (/** @type {any} */ err) {
const t = getType(err);
Atomics.store(sab, 1, t);
const v = encodeValue(fs, err, t);
Atomics.store(sab, 2, v.length);
new Uint8Array(sab.buffer).set(v, 16);
Atomics.store(sab, 0, 1); // error
} finally {
Atomics.notify(sab, 0);
}
}
};
/**
* @param {typeof import('memfs')} memfs
*/
fsProxy.createFsProxy = (memfs) => new Proxy({}, {
get (_target, p, _receiver) {
/**
* @param {any[]} args
*/
return function (...args) {
const sab = new SharedArrayBuffer(16 + 10240);
const i32arr = new Int32Array(sab);
Atomics.store(i32arr, 0, 21);
postMessage({
__fs__: {
sab: i32arr,
type: p,
payload: args
}
});
Atomics.wait(i32arr, 0, 21);
const status = Atomics.load(i32arr, 0);
const type = Atomics.load(i32arr, 1);
const size = Atomics.load(i32arr, 2);
const content = new Uint8Array(sab, 16, size);
const value = decodeValue(memfs, content, type);
if (status === 1) {
throw value
}
return value
}
}
});
return fsProxy;
}
var fsProxyExports = requireFsProxy();
var createFsProxy = fsProxyExports.createFsProxy;
var createOnMessage = fsProxyExports.createOnMessage;
export { MessageHandler, WASI, createFsProxy, createOnMessage, getDefaultContext, instantiateNapiModule, instantiateNapiModuleSync };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL0BlbW5hcGkvd2FzaS10aHJlYWRzL2Rpc3Qvd2FzaS10aHJlYWRzLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGVtbmFwaS9jb3JlL2Rpc3QvZW1uYXBpLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGVtbmFwaS9ydW50aW1lL2Rpc3QvZW1uYXBpLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0eWJ5cy93YXNtLXV0aWwvZGlzdC93YXNtLXV0aWwuZXNtLWJ1bmRsZXIuanMiLCIuLi9mcy1wcm94eS5janMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9XZWJBc3NlbWJseSA9IHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IFdlYkFzc2VtYmx5XG4gICAgOiB0eXBlb2YgV1hXZWJBc3NlbWJseSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBXWFdlYkFzc2VtYmx5XG4gICAgICAgIDogdW5kZWZpbmVkO1xudmFyIEVOVklST05NRU5UX0lTX05PREUgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2VzcyAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZyc7XG5mdW5jdGlvbiBnZXRQb3N0TWVzc2FnZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBvc3RNZXNzYWdlKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG9wdGlvbnMucG9zdE1lc3NhZ2VcbiAgICAgICAgOiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gcG9zdE1lc3NhZ2VcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gc2VyaXplRXJyb3JUb0J1ZmZlcihzYWIsIGNvZGUsIGVycm9yKSB7XG4gICAgdmFyIGkzMmFycmF5ID0gbmV3IEludDMyQXJyYXkoc2FiKTtcbiAgICBBdG9taWNzLnN0b3JlKGkzMmFycmF5LCAwLCBjb2RlKTtcbiAgICBpZiAoY29kZSA+IDEgJiYgZXJyb3IpIHtcbiAgICAgICAgdmFyIG5hbWVfMSA9IGVycm9yLm5hbWU7XG4gICAgICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgdmFyIHN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgIHZhciBuYW1lQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG5hbWVfMSk7XG4gICAgICAgIHZhciBtZXNzYWdlQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpO1xuICAgICAgICB2YXIgc3RhY2tCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RhY2spO1xuICAgICAgICBBdG9taWNzLnN0b3JlKGkzMmFycmF5LCAxLCBuYW1lQnVmZmVyLmxlbmd0aCk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoaTMyYXJyYXksIDIsIG1lc3NhZ2VCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgQXRvbWljcy5zdG9yZShpMzJhcnJheSwgMywgc3RhY2tCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHNhYik7XG4gICAgICAgIGJ1ZmZlci5zZXQobmFtZUJ1ZmZlciwgMTYpO1xuICAgICAgICBidWZmZXIuc2V0KG1lc3NhZ2VCdWZmZXIsIDE2ICsgbmFtZUJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICBidWZmZXIuc2V0KHN0YWNrQnVmZmVyLCAxNiArIG5hbWVCdWZmZXIubGVuZ3RoICsgbWVzc2FnZUJ1ZmZlci5sZW5ndGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlc2VyaXplRXJyb3JGcm9tQnVmZmVyKHNhYikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGkzMmFycmF5ID0gbmV3IEludDMyQXJyYXkoc2FiKTtcbiAgICB2YXIgc3RhdHVzID0gQXRvbWljcy5sb2FkKGkzMmFycmF5LCAwKTtcbiAgICBpZiAoc3RhdHVzIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBuYW1lTGVuZ3RoID0gQXRvbWljcy5sb2FkKGkzMmFycmF5LCAxKTtcbiAgICB2YXIgbWVzc2FnZUxlbmd0aCA9IEF0b21pY3MubG9hZChpMzJhcnJheSwgMik7XG4gICAgdmFyIHN0YWNrTGVuZ3RoID0gQXRvbWljcy5sb2FkKGkzMmFycmF5LCAzKTtcbiAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc2FiKTtcbiAgICB2YXIgbmFtZUJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgxNiwgMTYgKyBuYW1lTGVuZ3RoKTtcbiAgICB2YXIgbWVzc2FnZUJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgxNiArIG5hbWVMZW5ndGgsIDE2ICsgbmFtZUxlbmd0aCArIG1lc3NhZ2VMZW5ndGgpO1xuICAgIHZhciBzdGFja0J1ZmZlciA9IGJ1ZmZlci5zbGljZSgxNiArIG5hbWVMZW5ndGggKyBtZXNzYWdlTGVuZ3RoLCAxNiArIG5hbWVMZW5ndGggKyBtZXNzYWdlTGVuZ3RoICsgc3RhY2tMZW5ndGgpO1xuICAgIHZhciBuYW1lID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5hbWVCdWZmZXIpO1xuICAgIHZhciBtZXNzYWdlID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG1lc3NhZ2VCdWZmZXIpO1xuICAgIHZhciBzdGFjayA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShzdGFja0J1ZmZlcik7XG4gICAgdmFyIEVycm9yQ29uc3RydWN0b3IgPSAoX2EgPSBnbG9iYWxUaGlzW25hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAobmFtZSA9PT0gJ1J1bnRpbWVFcnJvcicgPyAoKF9iID0gX1dlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRXJyb3IpIDogRXJyb3IpO1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvckNvbnN0cnVjdG9yKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywge1xuICAgICAgICB2YWx1ZTogc3RhY2ssXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGlzU2hhcmVkQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgICByZXR1cm4gKCh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgfHxcbiAgICAgICAgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXScpKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBpc1RyYXBFcnJvcihlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuUnVudGltZUVycm9yO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHR5cGUsIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgICB9XG4gICAgfTtcbn1cblxudmFyIFdBU0lfVEhSRUFEU19NQVhfVElEID0gMHgxRkZGRkZGRjtcbmZ1bmN0aW9uIGNoZWNrU2hhcmVkV2FzbU1lbW9yeSh3YXNtTWVtb3J5KSB7XG4gICAgaWYgKHdhc21NZW1vcnkpIHtcbiAgICAgICAgaWYgKCFpc1NoYXJlZEFycmF5QnVmZmVyKHdhc21NZW1vcnkuYnVmZmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXRocmVhZCBmZWF0dXJlcyByZXF1aXJlIHNoYXJlZCB3YXNtIG1lbW9yeS4gJyArXG4gICAgICAgICAgICAgICAgJ1RyeSB0byBjb21waWxlIHdpdGggYC1tYXRvbWljcyAtbWJ1bGstbWVtb3J5YCBhbmQgdXNlIGAtLWltcG9ydC1tZW1vcnkgLS1zaGFyZWQtbWVtb3J5YCBkdXJpbmcgbGlua2luZywgJyArXG4gICAgICAgICAgICAgICAgJ3RoZW4gY3JlYXRlIFdlYkFzc2VtYmx5Lk1lbW9yeSB3aXRoIGBzaGFyZWQ6IHRydWVgIG9wdGlvbicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgU2hhcmVkQXJyYXlCdWZmZXIsIHRocmVhZHMgYXJlIG5vdCBhdmFpbGFibGUhJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRSZXVzZVdvcmtlcih2YWx1ZSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID8geyBzaXplOiAwLCBzdHJpY3Q6IGZhbHNlIH0gOiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKCEodmFsdWUgPj0gMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdyZXVzZVdvcmtlcjogc2l6ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzaXplOiB2YWx1ZSwgc3RyaWN0OiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHNpemUgPSAoX2EgPSBOdW1iZXIodmFsdWUuc2l6ZSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgdmFyIHN0cmljdCA9IEJvb2xlYW4odmFsdWUuc3RyaWN0KTtcbiAgICBpZiAoIShzaXplID4gMCkgJiYgc3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdyZXVzZVdvcmtlcjogc2l6ZSBtdXN0IGJlIHNldCB0byBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHN0cmljdCBpcyBzZXQgdG8gdHJ1ZScpO1xuICAgIH1cbiAgICByZXR1cm4geyBzaXplOiBzaXplLCBzdHJpY3Q6IHN0cmljdCB9O1xufVxudmFyIG5leHRXb3JrZXJJRCA9IDA7XG4vKiogQHB1YmxpYyAqL1xudmFyIFRocmVhZE1hbmFnZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGhyZWFkTWFuYWdlcihvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy51bnVzZWRXb3JrZXJzID0gW107XG4gICAgICAgIHRoaXMucnVubmluZ1dvcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5wdGhyZWFkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMud2FzbU1vZHVsZSA9IG51bGw7XG4gICAgICAgIHRoaXMud2FzbU1lbW9yeSA9IG51bGw7XG4gICAgICAgIHRoaXMubWVzc2FnZUV2ZW50cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhyZWFkTWFuYWdlcigpOiBvcHRpb25zIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnY2hpbGRUaHJlYWQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkVGhyZWFkID0gQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkVGhyZWFkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNyZWF0ZVdvcmtlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX3JldXNlV29ya2VyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9iZWZvcmVMb2FkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb25DcmVhdGVXb3JrZXIgPSBvcHRpb25zLm9uQ3JlYXRlV29ya2VyO1xuICAgICAgICAgICAgdGhpcy5fcmV1c2VXb3JrZXIgPSBnZXRSZXVzZVdvcmtlcihvcHRpb25zLnJldXNlV29ya2VyKTtcbiAgICAgICAgICAgIHRoaXMuX2JlZm9yZUxvYWQgPSBvcHRpb25zLmJlZm9yZUxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmludEVyciA9IChfYSA9IG9wdGlvbnMucHJpbnRFcnIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRocmVhZE1hbmFnZXIucHJvdG90eXBlLCBcIm5leHRXb3JrZXJJRFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV4dFdvcmtlcklEOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFRocmVhZCkge1xuICAgICAgICAgICAgdGhpcy5pbml0TWFpblRocmVhZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5pbml0TWFpblRocmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlUG9vbCgpO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUucHJlcGFyZVBvb2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JldXNlV29ya2VyLnNpemUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHRocmVhZFBvb2xTaXplID0gdGhpcy5fcmV1c2VXb3JrZXIuc2l6ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHRocmVhZFBvb2xTaXplLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtlciA9IHRoaXMuYWxsb2NhdGVVbnVzZWRXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNTMwMzZcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbmNlKCdtZXNzYWdlJywgZnVuY3Rpb24gKCkgeyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5zaG91bGRQcmVsb2FkV29ya2VycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9jaGlsZFRocmVhZCAmJiB0aGlzLl9yZXVzZVdvcmtlciAmJiB0aGlzLl9yZXVzZVdvcmtlci5zaXplID4gMDtcbiAgICB9O1xuICAgIFRocmVhZE1hbmFnZXIucHJvdG90eXBlLmxvYWRXYXNtTW9kdWxlVG9BbGxXb3JrZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXNfMSA9IHRoaXM7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IEFycmF5KHRoaXMudW51c2VkV29ya2Vycy5sZW5ndGgpO1xuICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICB2YXIgd29ya2VyID0gdGhpc18xLnVudXNlZFdvcmtlcnNbaV07XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSlcbiAgICAgICAgICAgICAgICB3b3JrZXIucmVmKCk7XG4gICAgICAgICAgICBwcm9taXNlc1tpXSA9IHRoaXNfMS5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcikudGhlbihmdW5jdGlvbiAodykge1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKVxuICAgICAgICAgICAgICAgICAgICB3b3JrZXIudW5yZWYoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy51bnVzZWRXb3JrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXNfMS50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUucHJlbG9hZFdvcmtlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFByZWxvYWRXb3JrZXJzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRXYXNtTW9kdWxlVG9BbGxXb3JrZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5zZXR1cCA9IGZ1bmN0aW9uICh3YXNtTW9kdWxlLCB3YXNtTWVtb3J5KSB7XG4gICAgICAgIHRoaXMud2FzbU1vZHVsZSA9IHdhc21Nb2R1bGU7XG4gICAgICAgIHRoaXMud2FzbU1lbW9yeSA9IHdhc21NZW1vcnk7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5tYXJrSWQgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIGlmICh3b3JrZXIuX19lbW5hcGlfdGlkKVxuICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5fX2VtbmFwaV90aWQ7XG4gICAgICAgIHZhciB0aWQgPSBuZXh0V29ya2VySUQgKyA0MztcbiAgICAgICAgbmV4dFdvcmtlcklEID0gKG5leHRXb3JrZXJJRCArIDEpICUgKFdBU0lfVEhSRUFEU19NQVhfVElEIC0gNDIpO1xuICAgICAgICB0aGlzLnB0aHJlYWRzW3RpZF0gPSB3b3JrZXI7XG4gICAgICAgIHdvcmtlci5fX2VtbmFwaV90aWQgPSB0aWQ7XG4gICAgICAgIHJldHVybiB0aWQ7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5yZXR1cm5Xb3JrZXJUb1Bvb2wgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIHZhciB0aWQgPSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICBpZiAodGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnB0aHJlYWRzW3RpZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgdGhpcy5ydW5uaW5nV29ya2Vycy5zcGxpY2UodGhpcy5ydW5uaW5nV29ya2Vycy5pbmRleE9mKHdvcmtlciksIDEpO1xuICAgICAgICBkZWxldGUgd29ya2VyLl9fZW1uYXBpX3RpZDtcbiAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5sb2FkV2FzbU1vZHVsZVRvV29ya2VyID0gZnVuY3Rpb24gKHdvcmtlciwgc2FiKSB7XG4gICAgICAgIHZhciBfdGhpc18xID0gdGhpcztcbiAgICAgICAgaWYgKHdvcmtlci53aGVuTG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIHdvcmtlci53aGVuTG9hZGVkO1xuICAgICAgICB2YXIgZXJyID0gdGhpcy5wcmludEVycjtcbiAgICAgICAgdmFyIGJlZm9yZUxvYWQgPSB0aGlzLl9iZWZvcmVMb2FkO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgd29ya2VyLndoZW5Mb2FkZWQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gJ3dvcmtlciBzZW50IGFuIGVycm9yISc7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlci5fX2VtbmFwaV90aWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ3dvcmtlciAodGlkID0gJyArIHdvcmtlci5fX2VtbmFwaV90aWQgKyAnKSBzZW50IGFuIGVycm9yISc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycihtZXNzYWdlICsgJyAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5tZXNzYWdlLmluZGV4T2YoJ1J1bnRpbWVFcnJvcicpICE9PSAtMSB8fCBlLm1lc3NhZ2UuaW5kZXhPZigndW5yZWFjaGFibGUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBoYW5kbGVNZXNzYWdlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fX2VtbmFwaV9fKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5fX2VtbmFwaV9fLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0gZGF0YS5fX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSAmJiAhd29ya2VyLl9fZW1uYXBpX3RpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh3b3JrZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHBheWxvYWQuZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVycignZmFpbGVkIHRvIGxvYWQgaW4gY2hpbGQgdGhyZWFkOiAnICsgKHBheWxvYWQuZXJyLm1lc3NhZ2UgfHwgcGF5bG9hZC5lcnIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdjbGVhbnVwLXRocmVhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLnRpZCBpbiBfdGhpc18xLnB0aHJlYWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXNfMS5jbGVhblRocmVhZCh3b3JrZXIsIHBheWxvYWQudGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNZXNzYWdlKGUuZGF0YSk7XG4gICAgICAgICAgICAgICAgX3RoaXNfMS5maXJlTWVzc2FnZUV2ZW50KHdvcmtlciwgZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgd29ya2VyLm9uZXJyb3IgPSBoYW5kbGVFcnJvcjtcbiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgKF9iID0gKF9hID0gd29ya2VyKS5vbm1lc3NhZ2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdvcmtlci5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgICAgICAoX2IgPSAoX2EgPSB3b3JrZXIpLm9uZXJyb3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3b3JrZXIub24oJ2RldGFjaGVkRXhpdCcsIGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJlZm9yZUxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmVMb2FkKHdvcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKCdsb2FkJywge1xuICAgICAgICAgICAgICAgICAgICB3YXNtTW9kdWxlOiBfdGhpc18xLndhc21Nb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnk6IF90aGlzXzEud2FzbU1lbW9yeSxcbiAgICAgICAgICAgICAgICAgICAgc2FiOiBzYWJcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTaGFyZWRXYXNtTWVtb3J5KF90aGlzXzEud2FzbU1lbW9yeSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdvcmtlci53aGVuTG9hZGVkO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUuYWxsb2NhdGVVbnVzZWRXb3JrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfb25DcmVhdGVXb3JrZXIgPSB0aGlzLl9vbkNyZWF0ZVdvcmtlcjtcbiAgICAgICAgaWYgKHR5cGVvZiBfb25DcmVhdGVXb3JrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BvcHRpb25zLm9uQ3JlYXRlV29ya2VyYCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd29ya2VyID0gX29uQ3JlYXRlV29ya2VyKHsgdHlwZTogJ3RocmVhZCcsIG5hbWU6ICdlbW5hcGktcHRocmVhZCcgfSk7XG4gICAgICAgIHRoaXMudW51c2VkV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5nZXROZXdXb3JrZXIgPSBmdW5jdGlvbiAoc2FiKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMudW51c2VkV29ya2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmV1c2VXb3JrZXIuc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHRoaXMucHJpbnRFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIoJ1RyaWVkIHRvIHNwYXduIGEgbmV3IHRocmVhZCwgYnV0IHRoZSB0aHJlYWQgcG9vbCBpcyBleGhhdXN0ZWQuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgbWlnaHQgcmVzdWx0IGluIGEgZGVhZGxvY2sgdW5sZXNzIHNvbWUgdGhyZWFkcyBldmVudHVhbGx5IGV4aXQgb3IgdGhlIGNvZGUgZXhwbGljaXRseSBicmVha3Mgb3V0IHRvIHRoZSBldmVudCBsb29wLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB3b3JrZXJfMSA9IHRoaXMuYWxsb2NhdGVVbnVzZWRXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcl8xLCBzYWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudW51c2VkV29ya2Vycy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd29ya2VyID0gdGhpcy5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMubG9hZFdhc21Nb2R1bGVUb1dvcmtlcih3b3JrZXIsIHNhYik7XG4gICAgICAgIHJldHVybiB0aGlzLnVudXNlZFdvcmtlcnMucG9wKCk7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5jbGVhblRocmVhZCA9IGZ1bmN0aW9uICh3b3JrZXIsIHRpZCwgZm9yY2UpIHtcbiAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLl9yZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5yZXR1cm5Xb3JrZXJUb1Bvb2wod29ya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnB0aHJlYWRzW3RpZF07XG4gICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZVdvcmtlcih3b3JrZXIpO1xuICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fX2VtbmFwaV90aWQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRocmVhZE1hbmFnZXIucHJvdG90eXBlLnRlcm1pbmF0ZVdvcmtlciA9IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgdmFyIF90aGlzXzEgPSB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0aWQgPSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgKF9hID0gdGhpcy5tZXNzYWdlRXZlbnRzLmdldCh3b3JrZXIpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlRXZlbnRzLmRlbGV0ZSh3b3JrZXIpO1xuICAgICAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmRhdGEuX19lbW5hcGlfXykge1xuICAgICAgICAgICAgICAgIHZhciBlcnIgPSBfdGhpc18xLnByaW50RXJyO1xuICAgICAgICAgICAgICAgIGVycigncmVjZWl2ZWQgXCInICsgZS5kYXRhLl9fZW1uYXBpX18udHlwZSArICdcIiBjb21tYW5kIGZyb20gdGVybWluYXRlZCB3b3JrZXI6ICcgKyB0aWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUudGVybWluYXRlQWxsVGhyZWFkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJ1bm5pbmdXb3JrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZVdvcmtlcih0aGlzLnJ1bm5pbmdXb3JrZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudW51c2VkV29ya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVXb3JrZXIodGhpcy51bnVzZWRXb3JrZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVudXNlZFdvcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5ydW5uaW5nV29ya2VycyA9IFtdO1xuICAgICAgICB0aGlzLnB0aHJlYWRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlUG9vbCgpO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUuYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAod29ya2VyLCBvbk1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMubWVzc2FnZUV2ZW50cy5nZXQod29ya2VyKTtcbiAgICAgICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUV2ZW50cy5zZXQod29ya2VyLCBsaXN0ZW5lcnMpO1xuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVycy5hZGQob25NZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9PT0gbnVsbCB8fCBsaXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxpc3RlbmVycy5kZWxldGUob25NZXNzYWdlKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFRocmVhZE1hbmFnZXIucHJvdG90eXBlLmZpcmVNZXNzYWdlRXZlbnQgPSBmdW5jdGlvbiAod29ya2VyLCBlKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLm1lc3NhZ2VFdmVudHMuZ2V0KHdvcmtlcik7XG4gICAgICAgIGlmICghbGlzdGVuZXJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZXJyID0gdGhpcy5wcmludEVycjtcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBlcnIoZS5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRocmVhZE1hbmFnZXI7XG59KCkpO1xuXG52YXIga0lzUHJveHkgPSBTeW1ib2woJ2tJc1Byb3h5Jyk7XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VQcm94eShpbnN0YW5jZSwgbWVtb3J5KSB7XG4gICAgaWYgKGluc3RhbmNlW2tJc1Byb3h5XSlcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvaGVscC9pc3N1ZXMvNDEwMlxuICAgIHZhciBvcmlnaW5hbEV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzO1xuICAgIHZhciBjcmVhdGVIYW5kbGVyID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSBbXG4gICAgICAgICAgICAnYXBwbHknLFxuICAgICAgICAgICAgJ2NvbnN0cnVjdCcsXG4gICAgICAgICAgICAnZGVmaW5lUHJvcGVydHknLFxuICAgICAgICAgICAgJ2RlbGV0ZVByb3BlcnR5JyxcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsXG4gICAgICAgICAgICAnZ2V0UHJvdG90eXBlT2YnLFxuICAgICAgICAgICAgJ2hhcycsXG4gICAgICAgICAgICAnaXNFeHRlbnNpYmxlJyxcbiAgICAgICAgICAgICdvd25LZXlzJyxcbiAgICAgICAgICAgICdwcmV2ZW50RXh0ZW5zaW9ucycsXG4gICAgICAgICAgICAnc2V0JyxcbiAgICAgICAgICAgICdzZXRQcm90b3R5cGVPZidcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSB7fTtcbiAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IGhhbmRsZXJzW2ldO1xuICAgICAgICAgICAgaGFuZGxlcltuYW1lXzFdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgICAgICBhcmdzLnVuc2hpZnQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdFtuYW1lXzFdLmFwcGx5KFJlZmxlY3QsIGFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgX2xvb3BfMShpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVyID0gY3JlYXRlSGFuZGxlcihvcmlnaW5hbEV4cG9ydHMpO1xuICAgIHZhciBfaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICB2YXIgX3N0YXJ0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfTtcbiAgICBoYW5kbGVyLmdldCA9IGZ1bmN0aW9uIChfdGFyZ2V0LCBwLCByZWNlaXZlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwID09PSAnbWVtb3J5Jykge1xuICAgICAgICAgICAgcmV0dXJuIChfYSA9ICh0eXBlb2YgbWVtb3J5ID09PSAnZnVuY3Rpb24nID8gbWVtb3J5KCkgOiBtZW1vcnkpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBSZWZsZWN0LmdldChvcmlnaW5hbEV4cG9ydHMsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gJ19pbml0aWFsaXplJykge1xuICAgICAgICAgICAgcmV0dXJuIHAgaW4gb3JpZ2luYWxFeHBvcnRzID8gX2luaXRpYWxpemUgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAgPT09ICdfc3RhcnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcCBpbiBvcmlnaW5hbEV4cG9ydHMgPyBfc3RhcnQgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KG9yaWdpbmFsRXhwb3J0cywgcCwgcmVjZWl2ZXIpO1xuICAgIH07XG4gICAgaGFuZGxlci5oYXMgPSBmdW5jdGlvbiAoX3RhcmdldCwgcCkge1xuICAgICAgICBpZiAocCA9PT0gJ21lbW9yeScpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKG9yaWdpbmFsRXhwb3J0cywgcCk7XG4gICAgfTtcbiAgICB2YXIgZXhwb3J0c1Byb3h5ID0gbmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCksIGhhbmRsZXIpO1xuICAgIHJldHVybiBuZXcgUHJveHkoaW5zdGFuY2UsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0LCBwLCByZWNlaXZlcikge1xuICAgICAgICAgICAgaWYgKHAgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzUHJveHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocCA9PT0ga0lzUHJveHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG52YXIgcGF0Y2hlZFdhc2lJbnN0YW5jZXMgPSBuZXcgV2Vha01hcCgpO1xuLyoqIEBwdWJsaWMgKi9cbnZhciBXQVNJVGhyZWFkcyA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXQVNJVGhyZWFkcyhvcHRpb25zKSB7XG4gICAgICAgIHZhciBfdGhpc18xID0gdGhpcztcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXQVNJVGhyZWFkcygpOiBvcHRpb25zIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy53YXNpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXQVNJVGhyZWFkcygpOiBvcHRpb25zLndhc2kgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2hlZFdhc2lJbnN0YW5jZXMuc2V0KHRoaXMsIG5ldyBXZWFrU2V0KCkpO1xuICAgICAgICB2YXIgd2FzaSA9IG9wdGlvbnMud2FzaTtcbiAgICAgICAgcGF0Y2hXYXNpSW5zdGFuY2UodGhpcywgd2FzaSk7XG4gICAgICAgIHRoaXMud2FzaSA9IHdhc2k7XG4gICAgICAgIGlmICgnY2hpbGRUaHJlYWQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRUaHJlYWQgPSBCb29sZWFuKG9wdGlvbnMuY2hpbGRUaHJlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGlsZFRocmVhZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuUFRocmVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCd0aHJlYWRNYW5hZ2VyJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudGhyZWFkTWFuYWdlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuUFRocmVhZCA9IG9wdGlvbnMudGhyZWFkTWFuYWdlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5QVGhyZWFkID0gb3B0aW9ucy50aHJlYWRNYW5hZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5QVGhyZWFkID0gbmV3IFRocmVhZE1hbmFnZXIob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5QVGhyZWFkLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgd2FpdFRocmVhZFN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIGlmICgnd2FpdFRocmVhZFN0YXJ0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICB3YWl0VGhyZWFkU3RhcnQgPSB0eXBlb2Ygb3B0aW9ucy53YWl0VGhyZWFkU3RhcnQgPT09ICdudW1iZXInID8gb3B0aW9ucy53YWl0VGhyZWFkU3RhcnQgOiBCb29sZWFuKG9wdGlvbnMud2FpdFRocmVhZFN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zdE1lc3NhZ2UgPSBnZXRQb3N0TWVzc2FnZShvcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRUaHJlYWQgJiYgdHlwZW9mIHBvc3RNZXNzYWdlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnBvc3RNZXNzYWdlIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSA9IHBvc3RNZXNzYWdlO1xuICAgICAgICB2YXIgd2FzbTY0ID0gQm9vbGVhbihvcHRpb25zLndhc202NCk7XG4gICAgICAgIHZhciBvbk1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKGUuZGF0YS5fX2VtbmFwaV9fKSB7XG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlLmRhdGEuX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0gZS5kYXRhLl9fZW1uYXBpX18ucGF5bG9hZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NwYXduLXRocmVhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3Bhd24ocGF5bG9hZC5zdGFydEFyZywgcGF5bG9hZC5lcnJvck9yVGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3Rlcm1pbmF0ZS1hbGwtdGhyZWFkcycpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXNfMS50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdGhyZWFkU3Bhd24gPSBmdW5jdGlvbiAoc3RhcnRBcmcsIGVycm9yT3JUaWQpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHZhciBFQUdBSU4gPSA2O1xuICAgICAgICAgICAgdmFyIGlzTmV3QUJJID0gZXJyb3JPclRpZCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGVja1NoYXJlZFdhc21NZW1vcnkoX3RoaXNfMS53YXNtTWVtb3J5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAoX2EgPSBfdGhpc18xLlBUaHJlYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcmludEVycihlcnIuc3RhY2spO1xuICAgICAgICAgICAgICAgIGlmIChpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RydWN0XzEgPSBuZXcgSW50MzJBcnJheShfdGhpc18xLndhc21NZW1vcnkuYnVmZmVyLCBlcnJvck9yVGlkLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3RfMSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoc3RydWN0XzEsIDEsIEVBR0FJTik7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Mubm90aWZ5KHN0cnVjdF8xLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgIHZhciBtYWxsb2MgPSBfdGhpc18xLndhc21JbnN0YW5jZS5leHBvcnRzLm1hbGxvYztcbiAgICAgICAgICAgICAgICBlcnJvck9yVGlkID0gd2FzbTY0ID8gTnVtYmVyKG1hbGxvYyhCaWdJbnQoOCkpKSA6IG1hbGxvYyg4KTtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yT3JUaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC00ODsgLyogRU5PTUVNICovXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIF9mcmVlID0gX3RoaXNfMS53YXNtSW5zdGFuY2UuZXhwb3J0cy5mcmVlO1xuICAgICAgICAgICAgdmFyIGZyZWUgPSB3YXNtNjQgPyBmdW5jdGlvbiAocHRyKSB7IF9mcmVlKEJpZ0ludChwdHIpKTsgfSA6IF9mcmVlO1xuICAgICAgICAgICAgdmFyIHN0cnVjdCA9IG5ldyBJbnQzMkFycmF5KF90aGlzXzEud2FzbU1lbW9yeS5idWZmZXIsIGVycm9yT3JUaWQsIDIpO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDApO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDEsIDApO1xuICAgICAgICAgICAgaWYgKF90aGlzXzEuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKCdzcGF3bi10aHJlYWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0QXJnOiBzdGFydEFyZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JPclRpZDogZXJyb3JPclRpZFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBBdG9taWNzLndhaXQoc3RydWN0LCAxLCAwKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNFcnJvciA9IEF0b21pY3MubG9hZChzdHJ1Y3QsIDApO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBBdG9taWNzLmxvYWQoc3RydWN0LCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOZXdBQkkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyZWUoZXJyb3JPclRpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRXJyb3IgPyAtcmVzdWx0IDogcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHNob3VsZFdhaXQgPSB3YWl0VGhyZWFkU3RhcnQgfHwgKHdhaXRUaHJlYWRTdGFydCA9PT0gMCk7XG4gICAgICAgICAgICB2YXIgc2FiO1xuICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQpIHtcbiAgICAgICAgICAgICAgICBzYWIgPSBuZXcgSW50MzJBcnJheShuZXcgU2hhcmVkQXJyYXlCdWZmZXIoMTYgKyA4MTkyKSk7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzYWIsIDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHdvcmtlcjtcbiAgICAgICAgICAgIHZhciB0aWQ7XG4gICAgICAgICAgICB2YXIgUFRocmVhZCA9IF90aGlzXzEuUFRocmVhZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd29ya2VyID0gUFRocmVhZC5nZXROZXdXb3JrZXIoc2FiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBnZXQgbmV3IHdvcmtlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBQVGhyZWFkLmFkZE1lc3NhZ2VFdmVudExpc3RlbmVyKHdvcmtlciwgb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aWQgPSBQVGhyZWFkLm1hcmtJZCh3b3JrZXIpO1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZWYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoJ3N0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICB0aWQ6IHRpZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnOiBzdGFydEFyZyxcbiAgICAgICAgICAgICAgICAgICAgc2FiOiBzYWJcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YWl0VGhyZWFkU3RhcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2FpdFJlc3VsdCA9IEF0b21pY3Mud2FpdChzYWIsIDAsIDAsIHdhaXRUaHJlYWRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFJlc3VsdCA9PT0gJ3RpbWVkLW91dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVGhyZWFkLmNsZWFuVGhyZWFkKHdvcmtlciwgdGlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3Bhd25pbmcgdGhyZWFkIHRpbWVkIG91dC4gUGxlYXNlIGNoZWNrIGlmIHRoZSB3b3JrZXIgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgYW5kIGlmIG1lc3NhZ2UgaXMgaGFuZGxlZCBwcm9wZXJseSBpbiB0aGUgd29ya2VyLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljcy53YWl0KHNhYiwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBBdG9taWNzLmxvYWQoc2FiLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUaHJlYWQuY2xlYW5UaHJlYWQod29ya2VyLCB0aWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZGVzZXJpemVFcnJvckZyb21CdWZmZXIoc2FiLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoc3RydWN0LCAwLCAxKTtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKHN0cnVjdCwgMSwgRUFHQUlOKTtcbiAgICAgICAgICAgICAgICBBdG9taWNzLm5vdGlmeShzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgICAgIFBUaHJlYWQgPT09IG51bGwgfHwgUFRocmVhZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogUFRocmVhZC5wcmludEVycihlLnN0YWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOZXdBQkkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyZWUoZXJyb3JPclRpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC02O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDApO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDEsIHRpZCk7XG4gICAgICAgICAgICBBdG9taWNzLm5vdGlmeShzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgUFRocmVhZC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICBpZiAoIXNob3VsZFdhaXQpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXIud2hlbkxvYWRlZC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIud2hlbkxvYWRlZDtcbiAgICAgICAgICAgICAgICAgICAgUFRocmVhZC5jbGVhblRocmVhZCh3b3JrZXIsIHRpZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJlZShlcnJvck9yVGlkKTtcbiAgICAgICAgICAgIHJldHVybiB0aWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGhyZWFkU3Bhd24gPSB0aHJlYWRTcGF3bjtcbiAgICB9XG4gICAgV0FTSVRocmVhZHMucHJvdG90eXBlLmdldEltcG9ydE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdhc2k6IHtcbiAgICAgICAgICAgICAgICAndGhyZWFkLXNwYXduJzogdGhpcy50aHJlYWRTcGF3blxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgV0FTSVRocmVhZHMucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKHdhc21JbnN0YW5jZSwgd2FzbU1vZHVsZSwgd2FzbU1lbW9yeSkge1xuICAgICAgICB3YXNtTWVtb3J5ICE9PSBudWxsICYmIHdhc21NZW1vcnkgIT09IHZvaWQgMCA/IHdhc21NZW1vcnkgOiAod2FzbU1lbW9yeSA9IHdhc21JbnN0YW5jZS5leHBvcnRzLm1lbW9yeSk7XG4gICAgICAgIHRoaXMud2FzbUluc3RhbmNlID0gd2FzbUluc3RhbmNlO1xuICAgICAgICB0aGlzLndhc21NZW1vcnkgPSB3YXNtTWVtb3J5O1xuICAgICAgICBpZiAodGhpcy5QVGhyZWFkKSB7XG4gICAgICAgICAgICB0aGlzLlBUaHJlYWQuc2V0dXAod2FzbU1vZHVsZSwgd2FzbU1lbW9yeSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFdBU0lUaHJlYWRzLnByb3RvdHlwZS5wcmVsb2FkV29ya2VycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuUFRocmVhZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuUFRocmVhZC5wcmVsb2FkV29ya2VycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSXQncyBvayB0byBjYWxsIHRoaXMgbWV0aG9kIHRvIGEgV0FTSSBjb21tYW5kIG1vZHVsZS5cbiAgICAgKlxuICAgICAqIGluIGNoaWxkIHRocmVhZCwgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIGluc3RlYWQgb2Yge0BsaW5rIFdBU0lUaHJlYWRzLnN0YXJ0fSBldmVuIGlmIGl0J3MgYSBXQVNJIGNvbW1hbmQgbW9kdWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHByb3hpZWQgV2ViQXNzZW1ibHkgaW5zdGFuY2UgaWYgaW4gY2hpbGQgdGhyZWFkLCBvdGhlciB3aXNlIHRoZSBvcmlnaW5hbCBpbnN0YW5jZVxuICAgICAqL1xuICAgIFdBU0lUaHJlYWRzLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKGluc3RhbmNlLCBtb2R1bGUsIG1lbW9yeSkge1xuICAgICAgICB2YXIgZXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7XG4gICAgICAgIG1lbW9yeSAhPT0gbnVsbCAmJiBtZW1vcnkgIT09IHZvaWQgMCA/IG1lbW9yeSA6IChtZW1vcnkgPSBleHBvcnRzLm1lbW9yeSk7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlUHJveHkoaW5zdGFuY2UsIG1lbW9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cChpbnN0YW5jZSwgbW9kdWxlLCBtZW1vcnkpO1xuICAgICAgICB2YXIgd2FzaSA9IHRoaXMud2FzaTtcbiAgICAgICAgaWYgKCgnX3N0YXJ0JyBpbiBleHBvcnRzKSAmJiAodHlwZW9mIGV4cG9ydHMuX3N0YXJ0ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgICAgICB3YXNpLnN0YXJ0KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga1N0YXJ0ZWQgPSBnZXRXYXNpU3ltYm9sKHdhc2ksICdrU3RhcnRlZCcpO1xuICAgICAgICAgICAgICAgICAgICB3YXNpW2tTdGFydGVkXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXR1cEluc3RhbmNlKHdhc2ksIGluc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdhc2kuaW5pdGlhbGl6ZShpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBXQVNJVGhyZWFkcy5pbml0aWFsaXplfSBhbmQgdGhlbiBjYWxsaW5nIHtAbGluayBXQVNJSW5zdGFuY2Uuc3RhcnR9XG4gICAgICogYGBganNcbiAgICAgKiB0aGlzLmluaXRpYWxpemUoaW5zdGFuY2UsIG1vZHVsZSwgbWVtb3J5KVxuICAgICAqIHRoaXMud2FzaS5zdGFydChpbnN0YW5jZSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBXQVNJVGhyZWFkcy5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIG1vZHVsZSwgbWVtb3J5KSB7XG4gICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgbWVtb3J5ICE9PSBudWxsICYmIG1lbW9yeSAhPT0gdm9pZCAwID8gbWVtb3J5IDogKG1lbW9yeSA9IGV4cG9ydHMubWVtb3J5KTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2VQcm94eShpbnN0YW5jZSwgbWVtb3J5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwKGluc3RhbmNlLCBtb2R1bGUsIG1lbW9yeSk7XG4gICAgICAgIHZhciBleGl0Q29kZSA9IHRoaXMud2FzaS5zdGFydChpbnN0YW5jZSk7XG4gICAgICAgIHJldHVybiB7IGV4aXRDb2RlOiBleGl0Q29kZSwgaW5zdGFuY2U6IGluc3RhbmNlIH07XG4gICAgfTtcbiAgICBXQVNJVGhyZWFkcy5wcm90b3R5cGUudGVybWluYXRlQWxsVGhyZWFkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuUFRocmVhZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZSgndGVybWluYXRlLWFsbC10aHJlYWRzJywge30pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFdBU0lUaHJlYWRzO1xufSgpKTtcbmZ1bmN0aW9uIHBhdGNoV2FzaUluc3RhbmNlKHdhc2lUaHJlYWRzLCB3YXNpKSB7XG4gICAgdmFyIHBhdGNoZWQgPSBwYXRjaGVkV2FzaUluc3RhbmNlcy5nZXQod2FzaVRocmVhZHMpO1xuICAgIGlmIChwYXRjaGVkLmhhcyh3YXNpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBfdGhpcyA9IHdhc2lUaHJlYWRzO1xuICAgIHZhciB3YXNpSW1wb3J0ID0gd2FzaS53YXNpSW1wb3J0O1xuICAgIGlmICh3YXNpSW1wb3J0KSB7XG4gICAgICAgIHZhciBwcm9jX2V4aXRfMSA9IHdhc2lJbXBvcnQucHJvY19leGl0O1xuICAgICAgICB3YXNpSW1wb3J0LnByb2NfZXhpdCA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgICAgICBfdGhpcy50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7XG4gICAgICAgICAgICByZXR1cm4gcHJvY19leGl0XzEuY2FsbCh0aGlzLCBjb2RlKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0ID0gd2FzaS5zdGFydDtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhc2kuc3RhcnQgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0LmNhbGwodGhpcywgaW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChpc1RyYXBFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBwYXRjaGVkLmFkZCh3YXNpKTtcbn1cbmZ1bmN0aW9uIGdldFdhc2lTeW1ib2wod2FzaSwgZGVzY3JpcHRpb24pIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod2FzaSk7XG4gICAgdmFyIHNlbGVjdERlc2NyaXB0aW9uID0gZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7IHJldHVybiBmdW5jdGlvbiAocykge1xuICAgICAgICBpZiAocy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHMuZGVzY3JpcHRpb24gPT09IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCkgPT09IFwiU3ltYm9sKFwiLmNvbmNhdChkZXNjcmlwdGlvbiwgXCIpXCIpO1xuICAgIH07IH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVzY3JpcHRpb24pKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHN5bWJvbHMuZmlsdGVyKHNlbGVjdERlc2NyaXB0aW9uKGQpKVswXTsgfSk7XG4gICAgfVxuICAgIHJldHVybiBzeW1ib2xzLmZpbHRlcihzZWxlY3REZXNjcmlwdGlvbihkZXNjcmlwdGlvbikpWzBdO1xufVxuZnVuY3Rpb24gc2V0dXBJbnN0YW5jZSh3YXNpLCBpbnN0YW5jZSkge1xuICAgIHZhciBfYSA9IGdldFdhc2lTeW1ib2wod2FzaSwgWydrSW5zdGFuY2UnLCAna1NldE1lbW9yeSddKSwga0luc3RhbmNlID0gX2FbMF0sIGtTZXRNZW1vcnkgPSBfYVsxXTtcbiAgICB3YXNpW2tJbnN0YW5jZV0gPSBpbnN0YW5jZTtcbiAgICB3YXNpW2tTZXRNZW1vcnldKGluc3RhbmNlLmV4cG9ydHMubWVtb3J5KTtcbn1cblxuLyoqIEBwdWJsaWMgKi9cbnZhciBUaHJlYWRNZXNzYWdlSGFuZGxlciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaHJlYWRNZXNzYWdlSGFuZGxlcihvcHRpb25zKSB7XG4gICAgICAgIHZhciBwb3N0TXNnID0gZ2V0UG9zdE1lc3NhZ2Uob3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zdE1zZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5wb3N0TWVzc2FnZSBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2UgPSBwb3N0TXNnO1xuICAgICAgICB0aGlzLm9uTG9hZCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vbkxvYWQ7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHRoaXMubW9kdWxlID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMubWVzc2FnZXNCZWZvcmVMb2FkID0gW107XG4gICAgfVxuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIFRocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5pbnN0YW50aWF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vbkxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9uTG9hZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5pbnN0YW50aWF0ZSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIFRocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZS5kYXRhLl9fZW1uYXBpX18udHlwZTtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkXzEgPSBlLmRhdGEuX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdsb2FkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWQocGF5bG9hZF8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFmdGVyTG9hZChlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zdGFydChwYXlsb2FkXzEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuX2xvYWQgPSBmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgc291cmNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc291cmNlID0gdGhpcy5pbnN0YW50aWF0ZShwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQoZXJyLCBudWxsLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhlbiA9IHNvdXJjZSAmJiAndGhlbicgaW4gc291cmNlID8gc291cmNlLnRoZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgdGhlbi5jYWxsKHNvdXJjZSwgZnVuY3Rpb24gKHNvdXJjZSkgeyBfdGhpcy5fbG9hZGVkKG51bGwsIHNvdXJjZSwgcGF5bG9hZCk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgX3RoaXMuX2xvYWRlZChlcnIsIG51bGwsIHBheWxvYWQpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZChudWxsLCBzb3VyY2UsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmluc3RhbmNlLmV4cG9ydHMud2FzaV90aHJlYWRfc3RhcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCd3YXNpX3RocmVhZF9zdGFydCBpcyBub3QgZXhwb3J0ZWQnKTtcbiAgICAgICAgICAgIG5vdGlmeVB0aHJlYWRDcmVhdGVSZXN1bHQocGF5bG9hZC5zYWIsIDIsIGVycik7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc3RNZXNzYWdlID0gdGhpcy5wb3N0TWVzc2FnZTtcbiAgICAgICAgdmFyIHRpZCA9IHBheWxvYWQudGlkO1xuICAgICAgICB2YXIgc3RhcnRBcmcgPSBwYXlsb2FkLmFyZztcbiAgICAgICAgbm90aWZ5UHRocmVhZENyZWF0ZVJlc3VsdChwYXlsb2FkLnNhYiwgMSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmV4cG9ydHMud2FzaV90aHJlYWRfc3RhcnQodGlkLCBzdGFydEFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGlzVHJhcEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKCd0ZXJtaW5hdGUtYWxsLXRocmVhZHMnLCB7fSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoJ2NsZWFudXAtdGhyZWFkJywgeyB0aWQ6IHRpZCB9KSk7XG4gICAgfTtcbiAgICBUaHJlYWRNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuX2xvYWRlZCA9IGZ1bmN0aW9uIChlcnIsIHNvdXJjZSwgcGF5bG9hZCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBub3RpZnlQdGhyZWFkQ3JlYXRlUmVzdWx0KHBheWxvYWQuc2FiLCAyLCBlcnIpO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGVycl8xID0gbmV3IFR5cGVFcnJvcignb25Mb2FkIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0Jyk7XG4gICAgICAgICAgICBub3RpZnlQdGhyZWFkQ3JlYXRlUmVzdWx0KHBheWxvYWQuc2FiLCAyLCBlcnJfMSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJfMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5zdGFuY2UgPSBzb3VyY2UuaW5zdGFuY2U7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHZhciBlcnJfMiA9IG5ldyBUeXBlRXJyb3IoJ29uTG9hZCBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBpbmNsdWRlcyBcImluc3RhbmNlXCInKTtcbiAgICAgICAgICAgIG5vdGlmeVB0aHJlYWRDcmVhdGVSZXN1bHQocGF5bG9hZC5zYWIsIDIsIGVycl8yKTtcbiAgICAgICAgICAgIHRocm93IGVycl8yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgdmFyIHBvc3RNZXNzYWdlID0gdGhpcy5wb3N0TWVzc2FnZTtcbiAgICAgICAgcG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZSgnbG9hZGVkJywge30pKTtcbiAgICAgICAgdmFyIG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlc0JlZm9yZUxvYWQ7XG4gICAgICAgIHRoaXMubWVzc2FnZXNCZWZvcmVMb2FkID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gbWVzc2FnZXNbaV07XG4gICAgICAgICAgICB0aGlzLmhhbmRsZSh7IGRhdGE6IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVBZnRlckxvYWQgPSBmdW5jdGlvbiAoZSwgZikge1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmLmNhbGwodGhpcywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzQmVmb3JlTG9hZC5wdXNoKGUuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUaHJlYWRNZXNzYWdlSGFuZGxlcjtcbn0oKSk7XG5mdW5jdGlvbiBub3RpZnlQdGhyZWFkQ3JlYXRlUmVzdWx0KHNhYiwgcmVzdWx0LCBlcnJvcikge1xuICAgIGlmIChzYWIpIHtcbiAgICAgICAgc2VyaXplRXJyb3JUb0J1ZmZlcihzYWIuYnVmZmVyLCByZXN1bHQsIGVycm9yKTtcbiAgICAgICAgQXRvbWljcy5ub3RpZnkoc2FiLCAwKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFRocmVhZE1hbmFnZXIsIFRocmVhZE1lc3NhZ2VIYW5kbGVyLCBXQVNJVGhyZWFkcywgY3JlYXRlSW5zdGFuY2VQcm94eSwgaXNTaGFyZWRBcnJheUJ1ZmZlciwgaXNUcmFwRXJyb3IgfTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIGFyID0gW107XG4gICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICByZXR1cm4gYXI7XG4gIH07XG4gIHJldHVybiBvd25LZXlzKG8pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICB2YXIgciwgcyA9IDA7XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xuICAgICAgICBpZiAoci5kaXNwb3NlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xuICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzIHw9IDE7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XG4gICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19lc0RlY29yYXRlLFxuICBfX3J1bkluaXRpYWxpemVycyxcbiAgX19wcm9wS2V5LFxuICBfX3NldEZ1bmN0aW9uTmFtZSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG4gIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxufTtcbiIsImltcG9ydCB7IFRocmVhZE1hbmFnZXIsIFdBU0lUaHJlYWRzLCBUaHJlYWRNZXNzYWdlSGFuZGxlciB9IGZyb20gJ0BlbW5hcGkvd2FzaS10aHJlYWRzJztcbmV4cG9ydCAqIGZyb20gJ0BlbW5hcGkvd2FzaS10aHJlYWRzJztcbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gJ3RzbGliJztcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbnZhciBfV2ViQXNzZW1ibHkgPSB0eXBlb2YgV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgPyBXZWJBc3NlbWJseVxuICAgIDogdHlwZW9mIFdYV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gV1hXZWJBc3NlbWJseVxuICAgICAgICA6IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKSB7XG4gICAgaWYgKGltcG9ydHMgJiYgdHlwZW9mIGltcG9ydHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ltcG9ydHMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbG9hZCh3YXNtSW5wdXQsIGltcG9ydHMpIHtcbiAgICBpZiAoIXdhc21JbnB1dClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xuICAgIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKTtcbiAgICBpbXBvcnRzID0gaW1wb3J0cyAhPT0gbnVsbCAmJiBpbXBvcnRzICE9PSB2b2lkIDAgPyBpbXBvcnRzIDoge307XG4gICAgLy8gUHJvbWlzZTxzdHJpbmcgfCBVUkwgfCBSZXNwb25zZSB8IEJ1ZmZlclNvdXJjZSB8IFdlYkFzc2VtYmx5Lk1vZHVsZT5cbiAgICB0cnkge1xuICAgICAgICB2YXIgdGhlbiA9IHR5cGVvZiB3YXNtSW5wdXQgPT09ICdvYmplY3QnICYmIHdhc21JbnB1dCAhPT0gbnVsbCAmJiAndGhlbicgaW4gd2FzbUlucHV0ID8gd2FzbUlucHV0LnRoZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoZW4uY2FsbCh3YXNtSW5wdXQsIGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gbG9hZChpbnB1dCwgaW1wb3J0cyk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChfKSB7IH1cbiAgICAvLyBCdWZmZXJTb3VyY2VcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgIH1cbiAgICAvLyBXZWJBc3NlbWJseS5Nb2R1bGVcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgX1dlYkFzc2VtYmx5Lk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21JbnB1dCwgaW1wb3J0cykudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiB3YXNtSW5wdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFJlc3BvbnNlXG4gICAgaWYgKHR5cGVvZiBSZXNwb25zZSAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHdhc21JbnB1dC5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShidWZmZXIsIGltcG9ydHMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gc3RyaW5nIHwgVVJMXG4gICAgdmFyIGlucHV0SXNTdHJpbmcgPSB0eXBlb2Ygd2FzbUlucHV0ID09PSAnc3RyaW5nJztcbiAgICBpZiAoaW5wdXRJc1N0cmluZyB8fCAodHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgVVJMKSkge1xuICAgICAgICBpZiAoaW5wdXRJc1N0cmluZyAmJiB0eXBlb2Ygd3ggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX3d4Q29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dhc20gc291cmNlIGNhbiBub3QgYmUgYSBzdHJpbmcgb3IgVVJMIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xufVxuZnVuY3Rpb24gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgaWYgKCF3YXNtSW5wdXQpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cyk7XG4gICAgaW1wb3J0cyA9IGltcG9ydHMgIT09IG51bGwgJiYgaW1wb3J0cyAhPT0gdm9pZCAwID8gaW1wb3J0cyA6IHt9O1xuICAgIHZhciBtb2R1bGU7XG4gICAgaWYgKCh3YXNtSW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgbW9kdWxlID0gbmV3IF9XZWJBc3NlbWJseS5Nb2R1bGUod2FzbUlucHV0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgIG1vZHVsZSA9IHdhc21JbnB1dDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB9XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IF9XZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpO1xuICAgIHZhciBzb3VyY2UgPSB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiBtb2R1bGUgfTtcbiAgICByZXR1cm4gc291cmNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOYXBpTW9kdWxlKG9wdGlvbnMpIHtcbiAgICB2YXIgbmFwaU1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19OT0RFID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgPT09ICdvYmplY3QnICYmIHByb2Nlc3MudmVyc2lvbnMgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZyc7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19QVEhSRUFEID0gQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKTtcbiAgICAgICAgdmFyIHdhaXRUaHJlYWRTdGFydCA9IHR5cGVvZiBvcHRpb25zLndhaXRUaHJlYWRTdGFydCA9PT0gJ251bWJlcicgPyBvcHRpb25zLndhaXRUaHJlYWRTdGFydCA6IEJvb2xlYW4ob3B0aW9ucy53YWl0VGhyZWFkU3RhcnQpO1xuICAgICAgICB2YXIgd2FzbUluc3RhbmNlO1xuICAgICAgICB2YXIgd2FzbU1lbW9yeTtcbiAgICAgICAgdmFyIHdhc21UYWJsZTtcbiAgICAgICAgdmFyIF9tYWxsb2M7XG4gICAgICAgIHZhciBfZnJlZTtcbiAgICAgICAgZnVuY3Rpb24gYWJvcnQobXNnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIF9XZWJBc3NlbWJseS5SdW50aW1lRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX1dlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFwaU1vZHVsZSA9IHtcbiAgICAgICAgICAgIGltcG9ydHM6IHtcbiAgICAgICAgICAgICAgICBlbnY6IHt9LFxuICAgICAgICAgICAgICAgIG5hcGk6IHt9LFxuICAgICAgICAgICAgICAgIGVtbmFwaToge31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHBvcnRzOiB7fSxcbiAgICAgICAgICAgIGVtbmFwaToge30sXG4gICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZmlsZW5hbWU6ICcnLFxuICAgICAgICAgICAgY2hpbGRUaHJlYWQ6IEVOVklST05NRU5UX0lTX1BUSFJFQUQsXG4gICAgICAgICAgICBpbml0V29ya2VyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBleGVjdXRlQXN5bmNXb3JrOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB3YWl0VGhyZWFkU3RhcnQ6IHdhaXRUaHJlYWRTdGFydCxcbiAgICAgICAgICAgIFBUaHJlYWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hcGlNb2R1bGUubG9hZGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFwaU1vZHVsZS5leHBvcnRzO1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBuYXBpIGluaXQgb3B0aW9ucycpO1xuICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG9wdGlvbnMuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgPT09IG51bGwgfHwgaW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluc3RhbmNlLmV4cG9ydHMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB3YXNtSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgdmFyIG1vZHVsZSA9IG9wdGlvbnMubW9kdWxlO1xuICAgICAgICAgICAgICAgIHZhciBtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSB8fCBleHBvcnRzLm1lbW9yeTtcbiAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBvcHRpb25zLnRhYmxlIHx8IGV4cG9ydHMuX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZTtcbiAgICAgICAgICAgICAgICBpZiAoIShtb2R1bGUgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuTW9kdWxlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIG1vZHVsZScpO1xuICAgICAgICAgICAgICAgIGlmICghKG1lbW9yeSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5NZW1vcnkpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gbWVtb3J5Jyk7XG4gICAgICAgICAgICAgICAgaWYgKCEodGFibGUgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuVGFibGUpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gdGFibGUnKTtcbiAgICAgICAgICAgICAgICB3YXNtTWVtb3J5ID0gbWVtb3J5O1xuICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IHRhYmxlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cy5tYWxsb2MgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hbGxvYyBpcyBub3QgZXhwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMuZnJlZSAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZnJlZSBpcyBub3QgZXhwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICBfbWFsbG9jID0gZXhwb3J0cy5tYWxsb2M7XG4gICAgICAgICAgICAgICAgX2ZyZWUgPSBleHBvcnRzLmZyZWU7XG4gICAgICAgICAgICAgICAgaWYgKCFuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1haW4gdGhyZWFkIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZUFwaVZlcnNpb24gPSA4IC8qIFZlcnNpb24uTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT04gKi87XG4gICAgICAgICAgICAgICAgICAgIHZhciBub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxID0gaW5zdGFuY2UuZXhwb3J0cy5ub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVfYXBpX21vZHVsZV9nZXRfYXBpX3ZlcnNpb25fdjEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUFwaVZlcnNpb24gPSBub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBuYXBpTW9kdWxlLmVudk9iamVjdCB8fCAobmFwaU1vZHVsZS5lbnZPYmplY3QgPSBlbW5hcGlDdHguY3JlYXRlRW52KG5hcGlNb2R1bGUuZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIGZ1bmN0aW9uIChjYikgeyByZXR1cm4gKHdhc21UYWJsZS5nZXQoY2IpKTsgfSwgZnVuY3Rpb24gKGNiKSB7IHJldHVybiAod2FzbVRhYmxlLmdldChjYikpOyB9LCBhYm9ydCwgZW1uYXBpTm9kZUJpbmRpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3BlXzEgPSBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbEludG9Nb2R1bGUoZnVuY3Rpb24gKF9lbnZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IG5hcGlNb2R1bGUuZXhwb3J0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0c0hhbmRsZSA9IHNjb3BlXzEuYWRkKGV4cG9ydHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXBpX3JlZ2lzdGVyX3dhc21fdjEgPSBpbnN0YW5jZS5leHBvcnRzLm5hcGlfcmVnaXN0ZXJfd2FzbV92MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFwaVZhbHVlID0gbmFwaV9yZWdpc3Rlcl93YXNtX3YxKF9lbnZPYmplY3QuaWQsIGV4cG9ydHNIYW5kbGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUuZXhwb3J0cyA9ICghbmFwaVZhbHVlKSA/IGV4cG9ydHMgOiBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG5hcGlWYWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCwgc2NvcGVfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbmFwaU1vZHVsZS5lbnZPYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXBpTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgZW1uYXBpQ3R4O1xuICAgICAgICB2YXIgZW1uYXBpTm9kZUJpbmRpbmc7XG4gICAgICAgIHZhciBvbkNyZWF0ZVdvcmtlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGVycjtcbiAgICAgICAgaWYgKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcgfHwgY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGBvcHRpb25zLmNvbnRleHRgLiBVc2UgYGltcG9ydCB7IGdldERlZmF1bHRDb250ZXh0IH0gZnJvbSAnQGVtbmFwaS9ydW50aW1lJ2BcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHggPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW1uYXBpQ3R4ID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgICAgICB2YXIgcG9zdE1zZyA9IHR5cGVvZiBvcHRpb25zLnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLnBvc3RNZXNzYWdlXG4gICAgICAgICAgICAgICAgOiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyBwb3N0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcG9zdE1zZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIHBvc3RNZXNzYWdlIGZvdW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlID0gcG9zdE1zZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsZW5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBuYXBpTW9kdWxlLmZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DcmVhdGVXb3JrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uQ3JlYXRlV29ya2VyID0gb3B0aW9ucy5vbkNyZWF0ZVdvcmtlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJpbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJpbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wcmludEVyciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZXJyID0gb3B0aW9ucy5wcmludEVycjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVyciA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnbm9kZUJpbmRpbmcnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBub2RlQmluZGluZyA9IG9wdGlvbnMubm9kZUJpbmRpbmc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVCaW5kaW5nICE9PSAnb2JqZWN0JyB8fCBub2RlQmluZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYG9wdGlvbnMubm9kZUJpbmRpbmdgLiBVc2UgQGVtbmFwaS9ub2RlLWJpbmRpbmcgcGFja2FnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcgPSBub2RlQmluZGluZztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPSAwO1xuICAgICAgICBpZiAoJ2FzeW5jV29ya1Bvb2xTaXplJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYXN5bmNXb3JrUG9vbFNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5hc3luY1dvcmtQb29sU2l6ZSBtdXN0IGJlIGEgaW50ZWdlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPSBvcHRpb25zLmFzeW5jV29ya1Bvb2xTaXplID4+IDA7XG4gICAgICAgICAgICBpZiAoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPiAxMDI0KSB7XG4gICAgICAgICAgICAgICAgZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPSAxMDI0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPCAtMTAyNCkge1xuICAgICAgICAgICAgICAgIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gLTEwMjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNpbmdsZVRocmVhZEFzeW5jV29yayA9IEVOVklST05NRU5UX0lTX1BUSFJFQUQgPyBmYWxzZSA6IChlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSA8PSAwKTtcbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLmVudi5fZW1uYXBpX2FzeW5jX3dvcmtfcG9vbF9zaXplID0gX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZTtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHB0aHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlBZGRTZW5kTGlzdGVuZXIod29ya2VyKSB7XG4gICAgICAgICAgICBpZiAoIXdvcmtlcilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAod29ya2VyLl9lbW5hcGlTZW5kTGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBFTlZJUk9OTUVOVF9JU19OT0RFID8gZSA6IGUuZGF0YTtcbiAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICBpZiAoX19lbW5hcGlfXyAmJiBfX2VtbmFwaV9fLnR5cGUgPT09ICdhc3luYy1zZW5kJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzEgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7IF9fZW1uYXBpX186IF9fZW1uYXBpX18gfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfX2VtbmFwaV9fLnBheWxvYWQuY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsYmFjaykpKF9fZW1uYXBpX18ucGF5bG9hZC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub2ZmKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fZW1uYXBpU2VuZExpc3RlbmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHdvcmtlci5fZW1uYXBpU2VuZExpc3RlbmVyID0geyBoYW5kbGVyOiBoYW5kbGVyLCBkaXNwb3NlOiBkaXNwb3NlIH07XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5vbignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBuYXBpTW9kdWxlLmVtbmFwaS5hZGRTZW5kTGlzdGVuZXIgPSBlbW5hcGlBZGRTZW5kTGlzdGVuZXI7XG4gICAgICAgIHZhciBQVGhyZWFkID0gbmV3IFRocmVhZE1hbmFnZXIoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgcHJpbnRFcnI6IGVycixcbiAgICAgICAgICAgICAgICBjaGlsZFRocmVhZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgcHJpbnRFcnI6IGVycixcbiAgICAgICAgICAgICAgICBiZWZvcmVMb2FkOiBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUFkZFNlbmRMaXN0ZW5lcih3b3JrZXIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmV1c2VXb3JrZXI6IG9wdGlvbnMucmV1c2VXb3JrZXIsXG4gICAgICAgICAgICAgICAgb25DcmVhdGVXb3JrZXI6IG9uQ3JlYXRlV29ya2VyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgbmFwaU1vZHVsZS5QVGhyZWFkID0gUFRocmVhZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlpcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfbGFzdF9lcnJvcihlbnYsIGVycm9yX2NvZGUsIGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVfcmVzZXJ2ZWQpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlcnJvcl9jb2RlLCBlbmdpbmVfZXJyb3JfY29kZSwgZW5naW5lX3Jlc2VydmVkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NsZWFyX2xhc3RfZXJyb3IoZW52KSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdnBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9nZXRfbm9kZV92ZXJzaW9uKG1ham9yLCBtaW5vciwgcGF0Y2gpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ZXJzaW9ucyA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2VzcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgPyBwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIE51bWJlcihuKTsgfSlcbiAgICAgICAgICAgICAgICA6IFswLCAwLCAwXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIobWFqb3IsIHZlcnNpb25zWzBdLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihtaW5vciwgdmVyc2lvbnNbMV0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHBhdGNoLCB2ZXJzaW9uc1syXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2XG4gICAgICAgICAqIEBfX2RlcHMgJHJ1bnRpbWVLZWVwYWxpdmVQdXNoXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3B1c2goKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2XG4gICAgICAgICAqIEBfX2RlcHMgJHJ1bnRpbWVLZWVwYWxpdmVQb3BcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfcnVudGltZV9rZWVwYWxpdmVfcG9wKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdnBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3NldF9pbW1lZGlhdGUoY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdnBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX25leHRfdGljayhjYWxsYmFjaywgZGF0YSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdmlwcHBpXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2NhbGxiYWNrX2ludG9fbW9kdWxlKGZvcmNlVW5jYXVnaHQsIGVudiwgY2FsbGJhY2ssIGRhdGEsIGNsb3NlX3Njb3BlX2lmX3Rocm93KSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbGJhY2tJbnRvTW9kdWxlKEJvb2xlYW4oZm9yY2VVbmNhdWdodCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShlbnYsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCwgc2NvcGUpO1xuICAgICAgICAgICAgICAgIGlmIChjbG9zZV9zY29wZV9pZl90aHJvdykge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jYWxsX2ZpbmFsaXplcihmb3JjZVVuY2F1Z2h0LCBlbnYsIGNhbGxiYWNrLCBkYXRhLCBoaW50KSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXJJbnRlcm5hbChmb3JjZVVuY2F1Z2h0LCBjYWxsYmFjaywgZGF0YSwgaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2N0eF9pbmNyZWFzZV93YWl0aW5nX3JlcXVlc3RfY291bnRlcigpIHtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jdHhfZGVjcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXIoKSB7XG4gICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiAkZW1uYXBpU2V0VmFsdWVJNjQocmVzdWx0LCBudW1iZXJWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIHRlbXBEb3VibGU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdGVtcEk2NCA9IFtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA+Pj4gMCxcbiAgICAgICAgICAgICAgICAodGVtcERvdWJsZSA9IG51bWJlclZhbHVlLCArTWF0aC5hYnModGVtcERvdWJsZSkgPj0gMSA/IHRlbXBEb3VibGUgPiAwID8gKE1hdGgubWluKCtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSwgNDI5NDk2NzI5NSkgfCAwKSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdGVtcEk2NFswXSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCB0ZW1wSTY0WzFdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRpbE1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICAkZW1uYXBpU2V0VmFsdWVJNjQ6ICRlbW5hcGlTZXRWYWx1ZUk2NCxcbiAgICAgICAgICAgIF9lbW5hcGlfY2FsbF9maW5hbGl6ZXI6IF9lbW5hcGlfY2FsbF9maW5hbGl6ZXIsXG4gICAgICAgICAgICBfZW1uYXBpX2NhbGxiYWNrX2ludG9fbW9kdWxlOiBfZW1uYXBpX2NhbGxiYWNrX2ludG9fbW9kdWxlLFxuICAgICAgICAgICAgX2VtbmFwaV9jdHhfZGVjcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXI6IF9lbW5hcGlfY3R4X2RlY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyLFxuICAgICAgICAgICAgX2VtbmFwaV9jdHhfaW5jcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXI6IF9lbW5hcGlfY3R4X2luY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyLFxuICAgICAgICAgICAgX2VtbmFwaV9nZXRfbm9kZV92ZXJzaW9uOiBfZW1uYXBpX2dldF9ub2RlX3ZlcnNpb24sXG4gICAgICAgICAgICBfZW1uYXBpX25leHRfdGljazogX2VtbmFwaV9uZXh0X3RpY2ssXG4gICAgICAgICAgICBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3BvcDogX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wb3AsXG4gICAgICAgICAgICBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3B1c2g6IF9lbW5hcGlfcnVudGltZV9rZWVwYWxpdmVfcHVzaCxcbiAgICAgICAgICAgIF9lbW5hcGlfc2V0X2ltbWVkaWF0ZTogX2VtbmFwaV9zZXRfaW1tZWRpYXRlLFxuICAgICAgICAgICAgbmFwaV9jbGVhcl9sYXN0X2Vycm9yOiBuYXBpX2NsZWFyX2xhc3RfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX3NldF9sYXN0X2Vycm9yOiBuYXBpX3NldF9sYXN0X2Vycm9yXG4gICAgICAgIH0pO1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlHZXRXb3JrZXJCeVB0aHJlYWRQdHIocHRocmVhZFB0cikge1xuICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB3YXNpLXNkay0yMC4wK3RocmVhZHNcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBzdHJ1Y3QgcHRocmVhZCB7XG4gICAgICAgICAgICAgKiAgIHN0cnVjdCBwdGhyZWFkICpzZWxmOyAgICAgICAgLy8gMFxuICAgICAgICAgICAgICogICBzdHJ1Y3QgcHRocmVhZCAqcHJldiwgKm5leHQ7IC8vIDQsIDhcbiAgICAgICAgICAgICAqICAgdWludHB0cl90IHN5c2luZm87ICAgICAgICAgICAvLyAxMlxuICAgICAgICAgICAgICogICB1aW50cHRyX3QgY2FuYXJ5OyAgICAgICAgICAgIC8vIDE2XG4gICAgICAgICAgICAgKiAgIGludCB0aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gMjBcbiAgICAgICAgICAgICAqICAgLy8gLi4uXG4gICAgICAgICAgICAgKiB9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciB0aWRPZmZzZXQgPSAyMDtcbiAgICAgICAgICAgIHZhciB0aWQgPSB2aWV3LmdldEludDMyKHB0aHJlYWRQdHIgKyB0aWRPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IFBUaHJlYWQucHRocmVhZHNbdGlkXTtcbiAgICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3dvcmtlcl91bnJlZihwdGhyZWFkUHRyKSB7XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgd29ya2VyID0gZW1uYXBpR2V0V29ya2VyQnlQdGhyZWFkUHRyKHB0aHJlYWRQdHIpO1xuICAgICAgICAgICAgaWYgKHdvcmtlciAmJiB0eXBlb2Ygd29ya2VyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2aXBwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfYXN5bmNfc2VuZF9qcyh0eXBlLCBjYWxsYmFjaywgZGF0YSkge1xuICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VfMSA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7XG4gICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhc3luYy1zZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2VtbmFwaV9zZXRfaW1tZWRpYXRlKGNhbGxiYWNrLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZW1uYXBpX25leHRfdGljayhjYWxsYmFjaywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZnVuY3Rpb24gcHRyVG9TdHJpbmcgKHB0cjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgLy8gICByZXR1cm4gJzB4JyArICgnMDAwMDAwMDAnICsgcHRyLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTgpXG4gICAgICAgIC8vIH1cbiAgICAgICAgdmFyIHV2VGhyZWFkcG9vbFJlYWR5UmVzb2x2ZTtcbiAgICAgICAgdmFyIHV2VGhyZWFkcG9vbFJlYWR5ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHV2VGhyZWFkcG9vbFJlYWR5UmVzb2x2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1dlRocmVhZHBvb2xSZWFkeS5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHV2VGhyZWFkcG9vbFJlYWR5LnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIC8qKiBAX19zaWcgaSAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2lzX21haW5fYnJvd3Nlcl90aHJlYWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIUVOVklST05NRU5UX0lTX05PREUpID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cHBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfYWZ0ZXJfdXZ0aHJlYWRwb29sX3JlYWR5KGNhbGxiYWNrLCBxLCB0eXBlKSB7XG4gICAgICAgICAgICBpZiAodXZUaHJlYWRwb29sUmVhZHkucmVhZHkpIHtcbiAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsYmFjaykpKHEsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXZUaHJlYWRwb29sUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkocSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cGkgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV90ZWxsX2pzX3V2dGhyZWFkcG9vbCh0aHJlYWRzLCBzaXplKSB7XG4gICAgICAgICAgICB2YXIgcCA9IFtdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHRocmVhZFB0ciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHRocmVhZHMgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlciA9IGVtbmFwaUdldFdvcmtlckJ5UHRocmVhZFB0cihwdGhyZWFkUHRyKTtcbiAgICAgICAgICAgICAgICBwLnB1c2gobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBFTlZJUk9OTUVOVF9JU19OT0RFID8gZSA6IGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfX2VtbmFwaV9fID0gZGF0YS5fX2VtbmFwaV9fO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18gJiYgX19lbW5hcGlfXy50eXBlID09PSAnYXN5bmMtdGhyZWFkLXJlYWR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2VyICYmIHR5cGVvZiB3b3JrZXIudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vZmYoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgX2xvb3BfMShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHApLnRoZW4odXZUaHJlYWRwb29sUmVhZHlSZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHYgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9lbWl0X2FzeW5jX3RocmVhZF9yZWFkeSgpIHtcbiAgICAgICAgICAgIGlmICghRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2UgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXRocmVhZC1yZWFkeScsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFzeW5jTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIF9lbW5hcGlfYWZ0ZXJfdXZ0aHJlYWRwb29sX3JlYWR5OiBfZW1uYXBpX2FmdGVyX3V2dGhyZWFkcG9vbF9yZWFkeSxcbiAgICAgICAgICAgIF9lbW5hcGlfYXN5bmNfc2VuZF9qczogX2VtbmFwaV9hc3luY19zZW5kX2pzLFxuICAgICAgICAgICAgX2VtbmFwaV9lbWl0X2FzeW5jX3RocmVhZF9yZWFkeTogX2VtbmFwaV9lbWl0X2FzeW5jX3RocmVhZF9yZWFkeSxcbiAgICAgICAgICAgIF9lbW5hcGlfaXNfbWFpbl9icm93c2VyX3RocmVhZDogX2VtbmFwaV9pc19tYWluX2Jyb3dzZXJfdGhyZWFkLFxuICAgICAgICAgICAgX2VtbmFwaV90ZWxsX2pzX3V2dGhyZWFkcG9vbDogX2VtbmFwaV90ZWxsX2pzX3V2dGhyZWFkcG9vbCxcbiAgICAgICAgICAgIF9lbW5hcGlfd29ya2VyX3VucmVmOiBfZW1uYXBpX3dvcmtlcl91bnJlZlxuICAgICAgICB9KTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuICAgICAgICAvKiogQF9fc2lnIGlwanAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9hZGp1c3RfZXh0ZXJuYWxfbWVtb3J5KGVudiwgY2hhbmdlX2luX2J5dGVzLCBhZGp1c3RlZF92YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWFkanVzdGVkX3ZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlX2luX2J5dGVzX251bWJlciA9IE51bWJlcihjaGFuZ2VfaW5fYnl0ZXMpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZV9pbl9ieXRlc19udW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvbGRfc2l6ZSA9IHdhc21NZW1vcnkuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB2YXIgbmV3X3NpemUgPSBvbGRfc2l6ZSArIGNoYW5nZV9pbl9ieXRlc19udW1iZXI7XG4gICAgICAgICAgICBuZXdfc2l6ZSA9IG5ld19zaXplICsgKCg2NTUzNiAtIG5ld19zaXplICUgNjU1MzYpICUgNjU1MzYpO1xuICAgICAgICAgICAgaWYgKHdhc21NZW1vcnkuZ3JvdygobmV3X3NpemUgLSBvbGRfc2l6ZSArIDY1NTM1KSA+PiAxNikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0QmlnSW50NjQoYWRqdXN0ZWRfdmFsdWUsIEJpZ0ludCh3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoKSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAkZW1uYXBpU2V0VmFsdWVJNjQoYWRqdXN0ZWRfdmFsdWUsIHdhc21NZW1vcnkuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZW1vcnlNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9hZGp1c3RfZXh0ZXJuYWxfbWVtb3J5OiBuYXBpX2FkanVzdF9leHRlcm5hbF9tZW1vcnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlBV1NULmluaXQoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgZW1uYXBpQVdTVCA9IHtcbiAgICAgICAgICAgIGlkR2VuOiB7fSxcbiAgICAgICAgICAgIHZhbHVlczogW3VuZGVmaW5lZF0sXG4gICAgICAgICAgICBxdWV1ZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIHBlbmRpbmc6IFtdLFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBpZEdlbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dElkOiAxLFxuICAgICAgICAgICAgICAgICAgICBsaXN0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEdlbi5saXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gaWRHZW4ubGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBpZEdlbi5uZXh0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRHZW4ubmV4dElkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJldXNlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkR2VuLmxpc3QucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QuaWRHZW4gPSBpZEdlbjtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlcyA9IFt1bmRlZmluZWRdO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucXVldWVkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucGVuZGluZyA9IFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKGVudiwgcmVzb3VyY2UsIHJlc291cmNlTmFtZSwgZXhlY3V0ZSwgY29tcGxldGUsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXN5bmNJZCA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jQ29udGV4dCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jSW5pdChyZXNvdXJjZSwgcmVzb3VyY2VOYW1lLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jSWQgPSBhc3luY0NvbnRleHQuYXN5bmNJZDtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQgPSBhc3luY0NvbnRleHQudHJpZ2dlckFzeW5jSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpZCA9IGVtbmFwaUFXU1QuaWRHZW4uZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlc1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGVudjogZW52LFxuICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJBc3luY0lkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGV4ZWN1dGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmssIHN0YXR1cykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGUgPSB3b3JrLmNvbXBsZXRlO1xuICAgICAgICAgICAgICAgIHZhciBlbnYgPSB3b3JrLmVudjtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHdvcmsuZGF0YTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tcGxldGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC5jYWxsYmFja0ludG9Nb2R1bGUodHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNvbXBsZXRlKSkoZW52LCBzdGF0dXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUubWFrZUNhbGxiYWNrKHdvcmsucmVzb3VyY2UsIGNhbGxiYWNrLCBbXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogd29yay5hc3luY0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHdvcmsudHJpZ2dlckFzeW5jSWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBxdWV1ZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmsgPSBlbW5hcGlBV1NULnZhbHVlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHdvcmsuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmsuc3RhdHVzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaUFXU1QucXVldWVkLnNpemUgPj0gKE1hdGguYWJzKGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplKSB8fCA0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5wZW5kaW5nLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucXVldWVkLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZfMSA9IHdvcmsuZW52O1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YV8xID0gd29yay5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRlID0gd29yay5leGVjdXRlO1xuICAgICAgICAgICAgICAgICAgICB3b3JrLnN0YXR1cyA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChleGVjdXRlKSkoZW52XzEsIGRhdGFfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlZC5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29yay5zdGF0dXMgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULmNhbGxDb21wbGV0ZSh3b3JrLCAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdTVC5wZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFdvcmtJZCA9IGVtbmFwaUFXU1QucGVuZGluZy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QudmFsdWVzW25leHRXb3JrSWRdLnN0YXR1cyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5xdWV1ZShuZXh0V29ya0lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZW1uYXBpQVdTVC5wZW5kaW5nLmluZGV4T2YoaWQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtfMSA9IGVtbmFwaUFXU1QudmFsdWVzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtfMSAmJiAod29ya18xLnN0YXR1cyA9PT0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfMS5zdGF0dXMgPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5wZW5kaW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZmVhdHVyZS5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QuY2FsbENvbXBsZXRlKHdvcmtfMSwgMTEgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5jZWxsZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgd29yayA9IGVtbmFwaUFXU1QudmFsdWVzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5lbWl0QXN5bmNEZXN0cm95KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IHdvcmsuYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB3b3JrLnRyaWdnZXJBc3luY0lkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5pZEdlbi5yZXVzZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgdnBwZHAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfaW5pdChhc3luY19yZXNvdXJjZSwgYXN5bmNfcmVzb3VyY2VfbmFtZSwgdHJpZ2dlcl9hc3luY19pZCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlX25hbWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlX25hbWUpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIGFzeW5jQ29udGV4dCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jSW5pdChyZXNvdXJjZSwgcmVzb3VyY2VfbmFtZSwgdHJpZ2dlcl9hc3luY19pZCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgYXN5bmNJZCA9IGFzeW5jQ29udGV4dC5hc3luY0lkO1xuICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gYXN5bmNDb250ZXh0LnRyaWdnZXJBc3luY0lkO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0RmxvYXQ2NChyZXN1bHQsIGFzeW5jSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0ICsgOCwgdHJpZ2dlckFzeW5jSWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdmRkICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3koYXN5bmNfaWQsIHRyaWdnZXJfYXN5bmNfaWQpIHtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5lbWl0QXN5bmNEZXN0cm95KHtcbiAgICAgICAgICAgICAgICBhc3luY0lkOiBhc3luY19pZCxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlcl9hc3luY19pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogdnBkZHAgZXhwb3J0IGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9vcGVuX2NhbGxiYWNrX3Njb3BlIChhc3luY19yZXNvdXJjZTogbmFwaV92YWx1ZSwgYXN5bmNfaWQ6IGRvdWJsZSwgdHJpZ2dlcl9hc3luY19pZDogZG91YmxlLCByZXN1bHQ6IFBvaW50ZXI8aW50NjRfdD4pOiB2b2lkIHtcbiAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nIHx8ICFyZXN1bHQpIHJldHVyblxuICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkhLnZhbHVlXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgIGNvbnN0IG5hdGl2ZUNhbGxiYWNrU2NvcGVQb2ludGVyID0gZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5vcGVuQ2FsbGJhY2tTY29wZShyZXNvdXJjZSwge1xuICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNfaWQsXG4gICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlcl9hc3luY19pZFxuICAgICAgICAgIH0pXG4gICAgXG4gICAgICAgICAgZnJvbTY0KCdyZXN1bHQnKVxuICAgICAgICAgICRfVE9ET19tYWtlU2V0VmFsdWUoJ3Jlc3VsdCcsIDAsICduYXRpdmVDYWxsYmFja1Njb3BlUG9pbnRlcicsICdpNjQnKVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIHZwXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBfZW1uYXBpX25vZGVfY2xvc2VfY2FsbGJhY2tfc2NvcGUgKHNjb3BlOiBQb2ludGVyPGludDY0X3Q+KTogdm9pZCB7XG4gICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZyB8fCAhc2NvcGUpIHJldHVyblxuICAgICAgICAgIGZyb202NCgnc2NvcGUnKVxuICAgICAgICAgIGNvbnN0IG5hdGl2ZUNhbGxiYWNrU2NvcGVQb2ludGVyID0gJF9UT0RPX21ha2VHZXRWYWx1ZSgnc2NvcGUnLCAwLCAnaTY0JylcbiAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLmNsb3NlQ2FsbGJhY2tTY29wZShCaWdJbnQobmF0aXZlQ2FsbGJhY2tTY29wZVBvaW50ZXIpKVxuICAgICAgICB9ICovXG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwZGRwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9tYWtlX2NhbGxiYWNrKGVudiwgYXN5bmNfcmVzb3VyY2UsIGNiLCBhcmd2LCBzaXplLCBhc3luY19pZCwgdHJpZ2dlcl9hc3luY19pZCwgcmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkudmFsdWU7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNiKS52YWx1ZTtcbiAgICAgICAgICAgIHNpemUgPSBzaXplID4+PiAwO1xuICAgICAgICAgICAgdmFyIGFyciA9IEFycmF5KHNpemUpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFyZ3YgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYXJyW2ldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJldCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUubWFrZUNhbGxiYWNrKHJlc291cmNlLCBjYWxsYmFjaywgYXJyLCB7XG4gICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNfaWQsXG4gICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJfYXN5bmNfaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQocmV0KTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FzeW5jX2luaXRfanMoYXN5bmNfcmVzb3VyY2UsIGFzeW5jX3Jlc291cmNlX25hbWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc291cmNlO1xuICAgICAgICAgICAgaWYgKGFzeW5jX3Jlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBPYmplY3QoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5hbWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlX25hbWUpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIHJldCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5hcGkuYXN5bmNJbml0KHJlc291cmNlLCBuYW1lKTtcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXQuc3RhdHVzO1xuICAgICAgICAgICAgdmFyIG51bWJlclZhbHVlID0gcmV0LnZhbHVlO1xuICAgICAgICAgICAgaWYgKCEoKG51bWJlclZhbHVlID49IChCaWdJbnQoLTEpICogKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSkge1xuICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgJiAoKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjQpKSAtIEJpZ0ludCgxKSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlclZhbHVlID49IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyVmFsdWUgPSBudW1iZXJWYWx1ZSAtIChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGxvdyA9IE51bWJlcihudW1iZXJWYWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcihudW1iZXJWYWx1ZSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FzeW5jX2Rlc3Ryb3lfanMoYXN5bmNfY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIHZhciBsb3cgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhc3luY19jb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHZhciBoaWdoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXN5bmNfY29udGV4dCArIDQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBCaWdJbnQobG93ID4+PiAwKSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICB2YXIgcmV0ID0gZW1uYXBpTm9kZUJpbmRpbmcubmFwaS5hc3luY0Rlc3Ryb3kocG9pbnRlcik7XG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0LnN0YXR1cztcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlLWFkZG9uLWFwaS9wdWxsLzEyODNcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5fY2FsbGJhY2tfc2NvcGUoZW52LCBpZ25vcmVkLCBhc3luY19jb250ZXh0X2hhbmRsZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25hcGlfb3Blbl9jYWxsYmFja19zY29wZSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jbG9zZV9jYWxsYmFja19zY29wZShlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25hcGlfY2xvc2VfY2FsbGJhY2tfc2NvcGUgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9tYWtlX2NhbGxiYWNrKGVudiwgYXN5bmNfY29udGV4dCwgcmVjdiwgZnVuYywgYXJnYywgYXJndiwgcmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVjdilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnYyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmd2KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHY4cmVjdiA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlY3YpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YXIgdjhmdW5jID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChmdW5jKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHY4ZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBsb3cgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhc3luY19jb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgaGlnaCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFzeW5jX2NvbnRleHQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gQmlnSW50KGxvdyA+Pj4gMCkgfCAoQmlnSW50KGhpZ2gpIDw8IEJpZ0ludCgzMikpO1xuICAgICAgICAgICAgICAgIGFyZ2MgPSBhcmdjID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSBBcnJheShhcmdjKTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ2M7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJnVmFsID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXJndiArIGkgKiA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYXJyW2ldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gZW1uYXBpTm9kZUJpbmRpbmcubmFwaS5tYWtlQ2FsbGJhY2soY3R4LCB2OHJlY3YsIHY4ZnVuYywgYXJyKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJldC5lcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IocmV0LnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQocmV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW52X2NoZWNrX2djX2FjY2VzcyhlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBub2RlTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIF9lbW5hcGlfYXN5bmNfZGVzdHJveV9qczogX2VtbmFwaV9hc3luY19kZXN0cm95X2pzLFxuICAgICAgICAgICAgX2VtbmFwaV9hc3luY19pbml0X2pzOiBfZW1uYXBpX2FzeW5jX2luaXRfanMsXG4gICAgICAgICAgICBfZW1uYXBpX2Vudl9jaGVja19nY19hY2Nlc3M6IF9lbW5hcGlfZW52X2NoZWNrX2djX2FjY2VzcyxcbiAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3k6IF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3ksXG4gICAgICAgICAgICBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19pbml0OiBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19pbml0LFxuICAgICAgICAgICAgX2VtbmFwaV9ub2RlX21ha2VfY2FsbGJhY2s6IF9lbW5hcGlfbm9kZV9tYWtlX2NhbGxiYWNrLFxuICAgICAgICAgICAgbmFwaV9jbG9zZV9jYWxsYmFja19zY29wZTogbmFwaV9jbG9zZV9jYWxsYmFja19zY29wZSxcbiAgICAgICAgICAgIG5hcGlfbWFrZV9jYWxsYmFjazogbmFwaV9tYWtlX2NhbGxiYWNrLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2NhbGxiYWNrX3Njb3BlOiBuYXBpX29wZW5fY2FsbGJhY2tfc2NvcGVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19kZXBzIG1hbGxvY1xuICAgICAgICAgKiBAX19kZXBzIGZyZWVcbiAgICAgICAgICogQF9fcG9zdHNldFxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogZW1uYXBpVFNGTi5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaVRTRk4gPSB7XG4gICAgICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3JlZiAqLyByZXNvdXJjZTogMCxcbiAgICAgICAgICAgICAgICAvKiBkb3VibGUgKi8gYXN5bmNfaWQ6IDgsXG4gICAgICAgICAgICAgICAgLyogZG91YmxlICovIHRyaWdnZXJfYXN5bmNfaWQ6IDE2LFxuICAgICAgICAgICAgICAgIC8qIHNpemVfdCAqLyBxdWV1ZV9zaXplOiAyNCxcbiAgICAgICAgICAgICAgICAvKiB2b2lkKiAqLyBxdWV1ZTogMSAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBzaXplX3QgKi8gdGhyZWFkX2NvdW50OiAyICogNCArIDI0LFxuICAgICAgICAgICAgICAgIC8qIGJvb2wgKi8gaXNfY2xvc2luZzogMyAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBhdG9taWNfdWNoYXIgKi8gZGlzcGF0Y2hfc3RhdGU6IDMgKiA0ICsgMjgsXG4gICAgICAgICAgICAgICAgLyogdm9pZCogKi8gY29udGV4dDogMyAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBzaXplX3QgKi8gbWF4X3F1ZXVlX3NpemU6IDQgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9yZWYgKi8gcmVmOiA1ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIG5hcGlfZW52ICovIGVudjogNiAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiB2b2lkKiAqLyBmaW5hbGl6ZV9kYXRhOiA3ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIG5hcGlfZmluYWxpemUgKi8gZmluYWxpemVfY2I6IDggKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX2NhbGxfanMgKi8gY2FsbF9qc19jYjogOSAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBib29sICovIGhhbmRsZXNfY2xvc2luZzogMTAgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogYm9vbCAqLyBhc3luY19yZWY6IDEwICogNCArIDM2LFxuICAgICAgICAgICAgICAgIC8qIGludDMyX3QgKi8gbXV0ZXg6IDEwICogNCArIDQwLFxuICAgICAgICAgICAgICAgIC8qIGludDMyX3QgKi8gY29uZDogMTAgKiA0ICsgNDQsXG4gICAgICAgICAgICAgICAgZW5kOiAxMCAqIDQgKyA0OFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFBUaHJlYWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIFBUaHJlYWQudW51c2VkV29ya2Vycy5mb3JFYWNoKGVtbmFwaVRTRk4uYWRkTGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICBQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmZvckVhY2goZW1uYXBpVFNGTi5hZGRMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfX29yaWdpbmFsX2dldE5ld1dvcmtlcl8xID0gUFRocmVhZC5nZXROZXdXb3JrZXI7XG4gICAgICAgICAgICAgICAgICAgIFBUaHJlYWQuZ2V0TmV3V29ya2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBfX29yaWdpbmFsX2dldE5ld1dvcmtlcl8xLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmFkZExpc3RlbmVyKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFkZExpc3RlbmVyOiBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyLl9lbW5hcGlUU0ZOTGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBFTlZJUk9OTUVOVF9JU19OT0RFID8gZSA6IGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9fZW1uYXBpX18gPSBkYXRhLl9fZW1uYXBpX187XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2VtbmFwaV9fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IF9fZW1uYXBpX18udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0gX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICd0c2ZuLXNlbmQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5kaXNwYXRjaChwYXlsb2FkLnRzZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vZmYoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX2VtbmFwaVRTRk5MaXN0ZW5lcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdvcmtlci5fZW1uYXBpVFNGTkxpc3RlbmVyID0geyBoYW5kbGVyOiBoYW5kbGVyLCBkaXNwb3NlOiBkaXNwb3NlIH07XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdFF1ZXVlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gMiAqIDQ7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gX21hbGxvYyhzaXplKTtcbiAgICAgICAgICAgICAgICBpZiAoIXF1ZXVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIHF1ZXVlLCBzaXplKS5maWxsKDApO1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgcXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0cm95UXVldWU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ZyZWUocXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwdXNoUXVldWU6IGZ1bmN0aW9uIChmdW5jLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZCA9IGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUocXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgdGFpbCA9IGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUocXVldWUgKyA0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gMiAqIDQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBfbWFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPT00nKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShub2RlLCBkYXRhLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUobm9kZSArIDQsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZCA9PT0gMCAmJiB0YWlsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKHF1ZXVlLCBub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKHF1ZXVlICsgNCwgbm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUodGFpbCArIDQsIG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUgKyA0LCBub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uYWRkUXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNoaWZ0UXVldWU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZCA9IGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUocXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBoZWFkO1xuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShoZWFkICsgNCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKHF1ZXVlLCBuZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUgKyA0LCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKG5vZGUgKyA0LCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgX2ZyZWUobm9kZSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdWJRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChmdW5jLCBkYXRhLCBtb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0gZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZCA9IGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgd2FpdENvbmRpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXVlU2l6ZSA9IGVtbmFwaVRTRk4uZ2V0UXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4U2l6ZSA9IGVtbmFwaVRTRk4uZ2V0TWF4UXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNDbG9zaW5nID0gZW1uYXBpVFNGTi5nZXRJc0Nsb3NpbmcoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWV1ZVNpemUgPj0gbWF4U2l6ZSAmJiBtYXhTaXplID4gMCAmJiAhaXNDbG9zaW5nO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIGlzQnJvd3Nlck1haW4gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFTlZJUk9OTUVOVF9JU19OT0RFO1xuICAgICAgICAgICAgICAgIHJldHVybiBtdXRleC5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhaXRDb25kaXRpb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IDAgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX2NhbGxfbW9kZS5uYXBpX3RzZm5fbm9uYmxvY2tpbmcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTUgLyogbmFwaV9zdGF0dXMubmFwaV9xdWV1ZV9mdWxsICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBCcm93c2VyIEpTIG1haW4gdGhyZWFkIGNhbiBub3QgdXNlIGBBdG9taWNzLndhaXRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsYXRlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMyNjg5XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zMzQ1M1xuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCcm93c2VyTWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMSAvKiBuYXBpX3N0YXR1cy5uYXBpX3dvdWxkX2RlYWRsb2NrICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZC53YWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRUaHJlYWRDb3VudChmdW5jKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN1YlRocmVhZENvdW50KGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNiAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nsb3NpbmcgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnB1c2hRdWV1ZShmdW5jLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2VuZChmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRNdXRleDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQubXV0ZXg7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0ge1xuICAgICAgICAgICAgICAgICAgICBsb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNCcm93c2VyTWFpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIUVOVklST05NRU5UX0lTX05PREU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCcm93c2VyTWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLndhaXQoaTMyYSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAvKiBsb2NrQXN5bmMgKCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFnYWluID0gKCk6IHZvaWQgPT4geyBmbigpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpMzJhID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIGluZGV4LCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChBdG9taWNzIGFzIGFueSkud2FpdEFzeW5jKGkzMmEsIDAsIDEpLnZhbHVlLnRoZW4oYWdhaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSwgKi9cbiAgICAgICAgICAgICAgICAgICAgdW5sb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBBdG9taWNzLmNvbXBhcmVFeGNoYW5nZShpMzJhLCAwLCAxLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gdW5sb2NrIHdoaWxlIG5vdCBob2xkaW5nIHRoZSBtdXRleCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5ub3RpZnkoaTMyYSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgubG9jaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8qICxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFzeW5jPFQ+IChmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdXRleC5sb2NrQXN5bmMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJcbiAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSAqL1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGV4O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvbmQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmNvbmQ7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0gZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gQXRvbWljcy5sb2FkKGkzMmEsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgudW5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLndhaXQoaTMyYSwgMCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgubG9jaygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAvKiB3YWl0QXN5bmMgKCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBdG9taWNzLmxvYWQoaTMyYSwgMClcbiAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2sgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiBtdXRleC5sb2NrQXN5bmMoKVxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEF0b21pY3MgYXMgYW55KS53YWl0QXN5bmMoaTMyYSwgMCwgdmFsdWUpLnZhbHVlLnRoZW4obG9jaywgbG9jaylcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NrKClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sICovXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5hZGQoaTMyYSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLm5vdGlmeShpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UXVldWVTaXplOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZV9zaXplLCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZGRRdWV1ZVNpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGVtbmFwaVRTRk4ub2Zmc2V0LnF1ZXVlX3NpemU7XG4gICAgICAgICAgICAgICAgdmFyIGFyciwgaW5kZXg7XG4gICAgICAgICAgICAgICAgYXJyID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IChmdW5jICsgb2Zmc2V0KSA+PiAyO1xuICAgICAgICAgICAgICAgIEF0b21pY3MuYWRkKGFyciwgaW5kZXgsIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YlF1ZXVlU2l6ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQucXVldWVfc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdWIoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0VGhyZWFkQ291bnQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkVGhyZWFkQ291bnQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudDtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5hZGQoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3ViVGhyZWFkQ291bnQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudDtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdWIoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0SXNDbG9zaW5nOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQobmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmlzX2Nsb3NpbmcpID4+IDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldElzQ2xvc2luZzogZnVuY3Rpb24gKGZ1bmMsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaXNfY2xvc2luZykgPj4gMiwgdmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEhhbmRsZXNDbG9zaW5nOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQobmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmhhbmRsZXNfY2xvc2luZykgPj4gMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0SGFuZGxlc0Nsb3Npbmc6IGZ1bmN0aW9uIChmdW5jLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUobmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmhhbmRsZXNfY2xvc2luZykgPj4gMiwgdmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldERpc3BhdGNoU3RhdGU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF0b21pY3MubG9hZChuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmRpc3BhdGNoX3N0YXRlKSA+PiAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDb250ZXh0OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5jb250ZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0TWF4UXVldWVTaXplOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5tYXhfcXVldWVfc2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0RW52OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5lbnYsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDYWxsSlNDYjogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuY2FsbF9qc19jYiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlZjogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucmVmLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UmVzb3VyY2U6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnJlc291cmNlLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0RmluYWxpemVDYjogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfY2IsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRGaW5hbGl6ZURhdGE6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmZpbmFsaXplX2RhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2FkU2l6ZVR5cGVWYWx1ZTogZnVuY3Rpb24gKG9mZnNldCwgdW5zaWduZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgICAgICAgIHZhciBhcnI7XG4gICAgICAgICAgICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IEF0b21pY3MubG9hZChhcnIsIG9mZnNldCA+PiAyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyciA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQXRvbWljcy5sb2FkKGFyciwgb2Zmc2V0ID4+IDIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdG9yZVNpemVUeXBlVmFsdWU6IGZ1bmN0aW9uIChvZmZzZXQsIHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnI7XG4gICAgICAgICAgICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBvZmZzZXQgPj4gMiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgb2Zmc2V0ID4+IDIsIHZhbHVlID4+PiAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRlc3Ryb3lRdWV1ZShmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpVFNGTi5nZXRSZWYoZnVuYyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgucmVtb3ZlQ2xlYW51cEhvb2soZW52T2JqZWN0LCBlbW5hcGlUU0ZOLmNsZWFudXAsIGZ1bmMpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC51bnJlZigpO1xuICAgICAgICAgICAgICAgIHZhciBhc3luY1JlZk9mZnNldCA9IChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfcmVmKSA+PiAyO1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKEF0b21pY3MubG9hZChhcnIsIGFzeW5jUmVmT2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgYXN5bmNSZWZPZmZzZXQsIDApO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlID0gZW1uYXBpVFNGTi5nZXRSZXNvdXJjZShmdW5jKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlc291cmNlKS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC50cmlnZ2VyX2FzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfZGVzdHJveShhc3luY0lkLCB0cmlnZ2VyQXN5bmNJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9mcmVlKGZ1bmMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtcHR5UXVldWVBbmREZWxldGU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxKc0NiID0gZW1uYXBpVFNGTi5nZXRDYWxsSlNDYihmdW5jKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBlbW5hcGlUU0ZOLmdldENvbnRleHQoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVtbmFwaVRTRk4uZ2V0UXVldWVTaXplKGZ1bmMpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlbW5hcGlUU0ZOLnNoaWZ0UXVldWUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsSnNDYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbEpzQ2IpKSgwLCAwLCBjb250ZXh0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRlc3Ryb3koZnVuYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaVRTRk4uZ2V0RW52KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBmaW5hbGl6ZSA9IGVtbmFwaVRTRk4uZ2V0RmluYWxpemVDYihmdW5jKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBlbW5hcGlUU0ZOLmdldEZpbmFsaXplRGF0YShmdW5jKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBlbW5hcGlUU0ZOLmdldENvbnRleHQoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC5jYWxsRmluYWxpemVySW50ZXJuYWwoMCwgZmluYWxpemUsIGRhdGEsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlUU0ZOLmdldFJlc291cmNlKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV92YWx1ZSA9IGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVzb3VyY2UpLmdldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5tYWtlQ2FsbGJhY2socmVzb3VyY2VPYmplY3QsIGYsIFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB0cmlnZ2VyQXN5bmNJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZW1wdHlRdWV1ZUFuZERlbGV0ZShmdW5jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsZWFudXA6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5jbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZShmdW5jLCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZTogZnVuY3Rpb24gKGZ1bmMsIHNldF9jbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaVRTRk4uZ2V0RW52KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXRfY2xvc2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKS5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNldElzQ2xvc2luZyhmdW5jLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKS5zaWduYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRIYW5kbGVzQ2xvc2luZyhmdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2V0SGFuZGxlc0Nsb3NpbmcoZnVuYywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmZpbmFsaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoT25lOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIHBvcHBlZF92YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBoYXNfbW9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBtdXRleCA9IGVtbmFwaVRTRk4uZ2V0TXV0ZXgoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmQgPSBlbW5hcGlUU0ZOLmdldENvbmQoZnVuYyk7XG4gICAgICAgICAgICAgICAgbXV0ZXguZXhlY3V0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5jbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZShmdW5jLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gZW1uYXBpVFNGTi5nZXRRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZW1uYXBpVFNGTi5zaGlmdFF1ZXVlKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHBlZF92YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heFF1ZXVlU2l6ZSA9IGVtbmFwaVRTRk4uZ2V0TWF4UXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09PSBtYXhRdWV1ZVNpemUgJiYgbWF4UXVldWVTaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kLnNpZ25hbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldFRocmVhZENvdW50KGZ1bmMpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2V0SXNDbG9zaW5nKGZ1bmMsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kLnNpZ25hbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uY2xvc2VIYW5kbGVzQW5kTWF5YmVEZWxldGUoZnVuYywgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX21vcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHBlZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3RfMSA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3RfMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0XzEuY2FsbGJhY2tJbnRvTW9kdWxlKGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxKc0NiID0gZW1uYXBpVFNGTi5nZXRDYWxsSlNDYihmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpVFNGTi5nZXRSZWYoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpzX2NhbGxiYWNrID0gcmVmID8gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpLmdldCgpIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEpzQ2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbEpzQ2IpKShlbnYsIGpzX2NhbGxiYWNrLCBjb250ZXh0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqc0NhbGxiYWNrID0ganNfY2FsbGJhY2sgPyBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX2NhbGxiYWNrKS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlUU0ZOLmdldFJlc291cmNlKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV92YWx1ZSA9IGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVzb3VyY2UpLmdldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgZiwgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19pZCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnRyaWdnZXJfYXN5bmNfaWQsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3RfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc19tb3JlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBoYXNfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdGlvbnNfbGVmdCA9IDEwMDA7XG4gICAgICAgICAgICAgICAgdmFyIHVpMzJhID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmRpc3BhdGNoX3N0YXRlKSA+PiAyO1xuICAgICAgICAgICAgICAgIHdoaWxlIChoYXNfbW9yZSAmJiAtLWl0ZXJhdGlvbnNfbGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKHVpMzJhLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGhhc19tb3JlID0gZW1uYXBpVFNGTi5kaXNwYXRjaE9uZShmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEF0b21pY3MuZXhjaGFuZ2UodWkzMmEsIGluZGV4LCAwKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzX21vcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoYXNfbW9yZSkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNlbmQoZnVuYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfc3RhdGUgPSBBdG9taWNzLm9yKG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZGlzcGF0Y2hfc3RhdGUpID4+IDIsIDEgPDwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKChjdXJyZW50X3N0YXRlICYgMSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBFTlZJUk9OTUVOVF9JU19QVEhSRUFEICE9PSAndW5kZWZpbmVkJykgJiYgRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RzZm4tc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2ZuOiBmdW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRpc3BhdGNoKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3RocmVhZHNhZmVfZnVuY3Rpb24oZW52LCBmdW5jLCBhc3luY19yZXNvdXJjZSwgYXN5bmNfcmVzb3VyY2VfbmFtZSwgbWF4X3F1ZXVlX3NpemUsIGluaXRpYWxfdGhyZWFkX2NvdW50LCB0aHJlYWRfZmluYWxpemVfZGF0YSwgdGhyZWFkX2ZpbmFsaXplX2NiLCBjb250ZXh0LCBjYWxsX2pzX2NiLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYXN5bmNfcmVzb3VyY2VfbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgbWF4X3F1ZXVlX3NpemUgPSBtYXhfcXVldWVfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIGluaXRpYWxfdGhyZWFkX2NvdW50ID0gaW5pdGlhbF90aHJlYWRfY291bnQgPj4+IDA7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbF90aHJlYWRfY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciByZWYgPSAwO1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWxsX2pzX2NiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmNWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoZnVuYykudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jVmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHJlZiA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2UoZW52T2JqZWN0LCBmdW5jLCAxLCAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8pLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFzeW5jUmVzb3VyY2VPYmplY3Q7XG4gICAgICAgICAgICBpZiAoYXN5bmNfcmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBhc3luY1Jlc291cmNlT2JqZWN0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jUmVzb3VyY2VPYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXN5bmNSZXNvdXJjZU9iamVjdCA9IE9iamVjdChhc3luY1Jlc291cmNlT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzeW5jUmVzb3VyY2VPYmplY3QgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChhc3luY1Jlc291cmNlT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBhc3luY1Jlc291cmNlTmFtZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2VfbmFtZSkudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFzeW5jUmVzb3VyY2VOYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXN5bmNSZXNvdXJjZU5hbWUgPSBTdHJpbmcoYXN5bmNSZXNvdXJjZU5hbWUpO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlX25hbWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQoYXN5bmNSZXNvdXJjZU5hbWUpO1xuICAgICAgICAgICAgLy8gdHNmbiBjcmVhdGVcbiAgICAgICAgICAgIHZhciBzaXplb2ZUU0ZOID0gZW1uYXBpVFNGTi5vZmZzZXQuZW5kO1xuICAgICAgICAgICAgdmFyIHRzZm4gPSBfbWFsbG9jKHNpemVvZlRTRk4pO1xuICAgICAgICAgICAgaWYgKCF0c2ZuKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KHRzZm4sIHRzZm4gKyBzaXplb2ZUU0ZOKS5maWxsKDApO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlUmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIHJlc291cmNlLCAxLCAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHJlc291cmNlXyA9IHJlc291cmNlUmVmLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRzZm4sIHJlc291cmNlXywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaVRTRk4uaW5pdFF1ZXVlKHRzZm4pKSB7XG4gICAgICAgICAgICAgICAgX2ZyZWUodHNmbik7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2VSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfaW5pdChyZXNvdXJjZSwgcmVzb3VyY2VfbmFtZSwgLTEsIHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19pZCk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudCwgaW5pdGlhbF90aHJlYWRfY291bnQsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmNvbnRleHQsIGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5tYXhfcXVldWVfc2l6ZSwgbWF4X3F1ZXVlX3NpemUsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LnJlZiwgcmVmLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5lbnYsIGVudiwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfZGF0YSwgdGhyZWFkX2ZpbmFsaXplX2RhdGEsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmZpbmFsaXplX2NiLCB0aHJlYWRfZmluYWxpemVfY2IsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmNhbGxfanNfY2IsIGNhbGxfanNfY2IsIHRydWUpO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LmFkZENsZWFudXBIb29rKGVudk9iamVjdCwgZW1uYXBpVFNGTi5jbGVhbnVwLCB0c2ZuKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5yZWYoKTtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX3JlZiwgMSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHRzZm4sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3RocmVhZHNhZmVfZnVuY3Rpb25fY29udGV4dChmdW5jLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZnVuYyB8fCAhcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBlbW5hcGlUU0ZOLmdldENvbnRleHQoZnVuYyk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBjb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2FsbF90aHJlYWRzYWZlX2Z1bmN0aW9uKGZ1bmMsIGRhdGEsIG1vZGUpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLnB1c2goZnVuYywgZGF0YSwgbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FjcXVpcmVfdGhyZWFkc2FmZV9mdW5jdGlvbihmdW5jKSB7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgcmV0dXJuIG11dGV4LmV4ZWN1dGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYgLyogbmFwaV9zdGF0dXMubmFwaV9jbG9zaW5nICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmFkZFRocmVhZENvdW50KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwaSAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3JlbGVhc2VfdGhyZWFkc2FmZV9mdW5jdGlvbihmdW5jLCBtb2RlKSB7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgdmFyIGNvbmQgPSBlbW5hcGlUU0ZOLmdldENvbmQoZnVuYyk7XG4gICAgICAgICAgICByZXR1cm4gbXV0ZXguZXhlY3V0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0VGhyZWFkQ291bnQoZnVuYykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdWJUaHJlYWRDb3VudChmdW5jKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRUaHJlYWRDb3VudChmdW5jKSA9PT0gMCB8fCBtb2RlID09PSAxIC8qIG5hcGlfdGhyZWFkc2FmZV9mdW5jdGlvbl9yZWxlYXNlX21vZGUubmFwaV90c2ZuX2Fib3J0ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0Nsb3NpbmcgPSBlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Nsb3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0Nsb3NpbmdWYWx1ZSA9IChtb2RlID09PSAxIC8qIG5hcGlfdGhyZWFkc2FmZV9mdW5jdGlvbl9yZWxlYXNlX21vZGUubmFwaV90c2ZuX2Fib3J0ICovKSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZXRJc0Nsb3NpbmcoZnVuYywgaXNDbG9zaW5nVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2xvc2luZ1ZhbHVlICYmIGVtbmFwaVRTRk4uZ2V0TWF4UXVldWVTaXplKGZ1bmMpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQuc2lnbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNlbmQoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdW5yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbihlbnYsIGZ1bmMpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhc3luY1JlZk9mZnNldCA9IChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfcmVmKSA+PiAyO1xuICAgICAgICAgICAgdmFyIGFyciA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChBdG9taWNzLmxvYWQoYXJyLCBhc3luY1JlZk9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgYXN5bmNSZWZPZmZzZXQsIDApO1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3JlZl90aHJlYWRzYWZlX2Z1bmN0aW9uKGVudiwgZnVuYykge1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFzeW5jUmVmT2Zmc2V0ID0gKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19yZWYpID4+IDI7XG4gICAgICAgICAgICB2YXIgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFBdG9taWNzLmxvYWQoYXJyLCBhc3luY1JlZk9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgYXN5bmNSZWZPZmZzZXQsIDEpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpQVdNVCA9IHtcbiAgICAgICAgICAgIHVudXNlZFdvcmtlcnM6IFtdLFxuICAgICAgICAgICAgcnVubmluZ1dvcmtlcnM6IFtdLFxuICAgICAgICAgICAgd29ya1F1ZXVlOiBbXSxcbiAgICAgICAgICAgIHdvcmtlclJlYWR5OiBudWxsLFxuICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgLyogbmFwaV9yZWYgKi8gcmVzb3VyY2U6IDAsXG4gICAgICAgICAgICAgICAgLyogZG91YmxlICovIGFzeW5jX2lkOiA4LFxuICAgICAgICAgICAgICAgIC8qIGRvdWJsZSAqLyB0cmlnZ2VyX2FzeW5jX2lkOiAxNixcbiAgICAgICAgICAgICAgICAvKiBuYXBpX2VudiAqLyBlbnY6IDI0LFxuICAgICAgICAgICAgICAgIC8qIHZvaWQqICovIGRhdGE6IDEgKiA0ICsgMjQsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9hc3luY19leGVjdXRlX2NhbGxiYWNrICovIGV4ZWN1dGU6IDIgKiA0ICsgMjQsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9hc3luY19jb21wbGV0ZV9jYWxsYmFjayAqLyBjb21wbGV0ZTogMyAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICBlbmQ6IDQgKiA0ICsgMjRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzID0gW107XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2VycyA9IFtdO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQud29ya1F1ZXVlID0gW107XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrZXJSZWFkeSA9IG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrZXIuX2VtbmFwaUFXTVRMaXN0ZW5lcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEVOVklST05NRU5UX0lTX05PREUgPyBlIDogZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBfX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmstY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5zcGxpY2UoZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5pbmRleE9mKHdvcmtlciksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQudW51c2VkV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jaGVja0lkbGVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNhbGxDb21wbGV0ZShwYXlsb2FkLndvcmssIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1xdWV1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnNjaGVkdWxlV29yayhwYXlsb2FkLndvcmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmstY2FuY2VsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FuY2VsV29yayhwYXlsb2FkLndvcmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vZmYoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX2VtbmFwaUFXTVRMaXN0ZW5lcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdvcmtlci5fZW1uYXBpQVdNVExpc3RlbmVyID0geyBoYW5kbGVyOiBoYW5kbGVyLCBkaXNwb3NlOiBkaXNwb3NlIH07XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdFdvcmtlcnM6IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlBV01ULndvcmtlclJlYWR5IHx8IChlbW5hcGlBV01ULndvcmtlclJlYWR5ID0gUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdNVC53b3JrZXJSZWFkeSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUFXTVQud29ya2VyUmVhZHk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvbkNyZWF0ZVdvcmtlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgb3B0aW9ucy5vbkNyZWF0ZVdvcmtlcmAgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoISgnZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGUnIGluIHdhc21JbnN0YW5jZS5leHBvcnRzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGVgIGlzIG5vdCBleHBvcnRlZCwgcGxlYXNlIHRyeSB0byBhZGQgYC0tZXhwb3J0PWVtbmFwaV9hc3luY193b3JrZXJfY3JlYXRlYCB0byBsaW5rZXIgZmxhZ3MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHdhc21JbnN0YW5jZS5leHBvcnRzLmVtbmFwaV9hc3luY193b3JrZXJfY3JlYXRlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gb25DcmVhdGVXb3JrZXIoeyB0eXBlOiAnYXN5bmMtd29yaycsIG5hbWU6ICdlbW5hcGktYXN5bmMtd29ya2VyJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gUFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmFkZExpc3RlbmVyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3b3JrZXIudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnRocmVhZEJsb2NrQmFzZSA9IGFyZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29ya2VyLWluaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGFyZzogYXJnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEoaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfZnJlZShhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrZXJSZWFkeSA9IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpQVdNVC53b3JrZXJSZWFkeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja0lkbGVXb3JrZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLmxlbmd0aCA+IDAgJiYgZW1uYXBpQVdNVC53b3JrUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JrID0gZW1uYXBpQVdNVC53b3JrUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstZXhlY3V0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyB3b3JrOiB3b3JrIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlc291cmNlOiBmdW5jdGlvbiAod29yaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5yZXNvdXJjZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEV4ZWN1dGU6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmV4ZWN1dGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZSh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQuY29tcGxldGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRFbnY6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmVudiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldERhdGE6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmRhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzY2hlZHVsZVdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8xID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQud29ya1F1ZXVlLnB1c2god29yayk7XG4gICAgICAgICAgICAgICAgaWYgKChfYSA9IGVtbmFwaUFXTVQud29ya2VyUmVhZHkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWwgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuaW5pdFdvcmtlcnMoX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULndvcmtlclJlYWR5LnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbFdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzIgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZV8yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jYW5jZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBlbW5hcGlBV01ULndvcmtRdWV1ZS5pbmRleE9mKHdvcmspO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrUXVldWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jaGVja0lkbGVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FsbENvbXBsZXRlKHdvcmssIDExIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2FuY2VsbGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmssIHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZSA9IGVtbmFwaUFXTVQuZ2V0Q29tcGxldGUod29yayk7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZW1uYXBpQVdNVC5nZXREYXRhKHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxiYWNrSW50b01vZHVsZSh0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjb21wbGV0ZSkpKGVudiwgc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2VfdmFsdWUgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlc291cmNlKS5nZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgY2FsbGJhY2ssIFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlckFzeW5jSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHBwICovXG4gICAgICAgIHZhciBuYXBpX2NyZWF0ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlTmFtZSA9IFN0cmluZyhlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlX25hbWUpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gZW1uYXBpQVdTVC5jcmVhdGUoZW52LCByZXNvdXJjZU9iamVjdCwgcmVzb3VyY2VOYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVvZkFXID0gZW1uYXBpQVdNVC5vZmZzZXQuZW5kO1xuICAgICAgICAgICAgICAgIHZhciBhdyA9IF9tYWxsb2Moc2l6ZW9mQVcpO1xuICAgICAgICAgICAgICAgIGlmICghYXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKS5zdWJhcnJheShhdywgYXcgKyBzaXplb2ZBVykuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXNvdXJjZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlUmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIHMsIDEsIDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV8gPSByZXNvdXJjZVJlZi5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3LCByZXNvdXJjZV8sIHRydWUpO1xuICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQocywgcmVzb3VyY2VfbmFtZSwgLTEsIGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuYXN5bmNfaWQpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZW52LCBlbnYsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZXhlY3V0ZSwgZXhlY3V0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXcgKyBlbW5hcGlBV01ULm9mZnNldC5jb21wbGV0ZSwgY29tcGxldGUsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZGF0YSwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBhdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgdmFyIG5hcGlfZGVsZXRlX2FzeW5jX3dvcmsgPSBzaW5nbGVUaHJlYWRBc3luY1dvcmtcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucmVtb3ZlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3koYXN5bmNJZCwgdHJpZ2dlckFzeW5jSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZnJlZSh3b3JrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICB2YXIgbmFwaV9xdWV1ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuc2NoZWR1bGVXb3JrKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIHZhciBuYXBpX2NhbmNlbF9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gZW1uYXBpQVdTVC5jYW5jZWwod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBlbW5hcGlBV01ULmNhbmNlbFdvcmsod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGluaXRXb3JrZXIoc3RhcnRBcmcpIHtcbiAgICAgICAgICAgIGlmIChuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YXNtSW5zdGFuY2UuZXhwb3J0cy5lbW5hcGlfYXN5bmNfd29ya2VyX2luaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGVtbmFwaV9hc3luY193b3JrZXJfaW5pdGAgaXMgbm90IGV4cG9ydGVkLCBwbGVhc2UgdHJ5IHRvIGFkZCBgLS1leHBvcnQ9ZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0YCB0byBsaW5rZXIgZmxhZ3MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FzbUluc3RhbmNlLmV4cG9ydHMuZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0KHN0YXJ0QXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnRUaHJlYWQgaXMgb25seSBhdmFpbGFibGUgaW4gY2hpbGQgdGhyZWFkcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4ZWN1dGVBc3luY1dvcmsod29yaykge1xuICAgICAgICAgICAgaWYgKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBleGVjdXRlID0gZW1uYXBpQVdNVC5nZXRFeGVjdXRlKHdvcmspO1xuICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBlbW5hcGlBV01ULmdldERhdGEod29yayk7XG4gICAgICAgICAgICAod2FzbVRhYmxlLmdldChleGVjdXRlKSkoZW52LCBkYXRhKTtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZSA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5pbml0V29ya2VyID0gaW5pdFdvcmtlcjtcbiAgICAgICAgbmFwaU1vZHVsZS5leGVjdXRlQXN5bmNXb3JrID0gZXhlY3V0ZUFzeW5jV29yaztcbiAgICAgICAgdmFyIGFzeW5jV29ya01vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbmNlbF9hc3luY193b3JrOiBuYXBpX2NhbmNlbF9hc3luY193b3JrLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXN5bmNfd29yazogbmFwaV9jcmVhdGVfYXN5bmNfd29yayxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX2FzeW5jX3dvcms6IG5hcGlfZGVsZXRlX2FzeW5jX3dvcmssXG4gICAgICAgICAgICBuYXBpX3F1ZXVlX2FzeW5jX3dvcms6IG5hcGlfcXVldWVfYXN5bmNfd29ya1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX2RlcHMgZnJlZVxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlFeHRlcm5hbE1lbW9yeS5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaUV4dGVybmFsTWVtb3J5ID0ge1xuICAgICAgICAgICAgcmVnaXN0cnk6IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRhYmxlOiBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgICAgd2FzbU1lbW9yeVZpZXdUYWJsZTogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSA9IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNEZXRhY2hlZEFycmF5QnVmZmVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0QXJyYXlCdWZmZXJQb2ludGVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIsIHNob3VsZENvcHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IDAsXG4gICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpc0RldGFjaGVkID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpRXh0ZXJuYWxNZW1vcnkudGFibGUuaGFzKGFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkSW5mbyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLmdldChhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRJbmZvLmFkZHJlc3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZENvcHkgJiYgY2FjaGVkSW5mby5vd25lcnNoaXAgPT09IDAgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtSdW50aW1lICovICYmIGNhY2hlZEluZm8ucnVudGltZUFsbG9jYXRlZCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksIGNhY2hlZEluZm8uYWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkIHx8IChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRDb3B5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IF9tYWxsb2MoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dCBvZiBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSwgcG9pbnRlcik7XG4gICAgICAgICAgICAgICAgaW5mby5hZGRyZXNzID0gcG9pbnRlcjtcbiAgICAgICAgICAgICAgICBpbmZvLm93bmVyc2hpcCA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5ID8gMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi87XG4gICAgICAgICAgICAgICAgaW5mby5ydW50aW1lQWxsb2NhdGVkID0gMTtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZS5zZXQoYXJyYXlCdWZmZXIsIGluZm8pO1xuICAgICAgICAgICAgICAgIChfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVnaXN0ZXIoYXJyYXlCdWZmZXIsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE9yVXBkYXRlTWVtb3J5VmlldzogZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlldy5idWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXModmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KHZpZXcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiB2aWV3LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHZpZXcuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHZpZXcgaW5zdGFuY2VvZiBEYXRhVmlldyA/IHZpZXcuYnl0ZUxlbmd0aCA6IHZpZXcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWF5YmVPbGRXYXNtTWVtb3J5ID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiYgKHZpZXcuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKTtcbiAgICAgICAgICAgICAgICBpZiAobWF5YmVPbGRXYXNtTWVtb3J5ICYmIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuaGFzKHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmZvID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5nZXQodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBDdG9yID0gaW5mby5DdG9yO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmlldyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEJ1ZmZlcl8xID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlcl8xID09PSAnZnVuY3Rpb24nICYmIEN0b3IgPT09IEJ1ZmZlcl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3ID0gQnVmZmVyXzEuZnJvbSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5mby5hZGRyZXNzLCBpbmZvLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3ID0gbmV3IEN0b3Iod2FzbU1lbW9yeS5idWZmZXIsIGluZm8uYWRkcmVzcywgaW5mby5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KG5ld1ZpZXcsIGluZm8pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmlldztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0Vmlld1BvaW50ZXI6IGZ1bmN0aW9uICh2aWV3LCBzaG91bGRDb3B5KSB7XG4gICAgICAgICAgICAgICAgdmlldyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldE9yVXBkYXRlTWVtb3J5Vmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICBpZiAodmlldy5idWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyh2aWV3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5nZXQodmlldyksIGFkZHJlc3NfMSA9IF9hLmFkZHJlc3MsIG93bmVyc2hpcF8xID0gX2Eub3duZXJzaGlwLCBydW50aW1lQWxsb2NhdGVkXzEgPSBfYS5ydW50aW1lQWxsb2NhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYWRkcmVzczogYWRkcmVzc18xLCBvd25lcnNoaXA6IG93bmVyc2hpcF8xLCBydW50aW1lQWxsb2NhdGVkOiBydW50aW1lQWxsb2NhdGVkXzEsIHZpZXc6IHZpZXcgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhZGRyZXNzOiB2aWV3LmJ5dGVPZmZzZXQsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwLCB2aWV3OiB2aWV3IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBfYiA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldEFycmF5QnVmZmVyUG9pbnRlcih2aWV3LmJ1ZmZlciwgc2hvdWxkQ29weSksIGFkZHJlc3MgPSBfYi5hZGRyZXNzLCBvd25lcnNoaXAgPSBfYi5vd25lcnNoaXAsIHJ1bnRpbWVBbGxvY2F0ZWQgPSBfYi5ydW50aW1lQWxsb2NhdGVkO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGFkZHJlc3M6IGFkZHJlc3MgPT09IDAgPyAwIDogKGFkZHJlc3MgKyB2aWV3LmJ5dGVPZmZzZXQpLCBvd25lcnNoaXA6IG93bmVyc2hpcCwgcnVudGltZUFsbG9jYXRlZDogcnVudGltZUFsbG9jYXRlZCwgdmlldzogdmlldyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlTdHJpbmcuaW5pdCgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgICAgIHZhciBlbW5hcGlTdHJpbmcgPSB7XG4gICAgICAgICAgICB1dGY4RGVjb2RlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdXRmMTZEZWNvZGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZhbGxiYWNrRGVjb2RlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwZW5kaW5nU2l6ZSA9IE1hdGgubWluKDB4MTAwMCwgYnl0ZXMubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGVuZGluZyA9IG5ldyBVaW50MTZBcnJheShwZW5kaW5nU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmtzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGVuZGluZ0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9yZSA9IGlucHV0SW5kZXggPCBieXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3JlIHx8IChwZW5kaW5nSW5kZXggPj0gcGVuZGluZ1NpemUgLSAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViYXJyYXkgPSBwZW5kaW5nLnN1YmFycmF5KDAsIHBlbmRpbmdJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheWxpa2UgPSBzdWJhcnJheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheWxpa2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2h1bmtzLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkoaW5wdXRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTEgPSBieXRlc1tpbnB1dEluZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYnl0ZTEgJiAweDgwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9IGJ5dGUxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoYnl0ZTEgJiAweGUwKSA9PT0gMHhjMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTIgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSAoKGJ5dGUxICYgMHgxZikgPDwgNikgfCBieXRlMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJ5dGUxICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMyA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9ICgoYnl0ZTEgJiAweDFmKSA8PCAxMikgfCAoYnl0ZTIgPDwgNikgfCBieXRlMztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJ5dGUxICYgMHhmOCkgPT09IDB4ZjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMyA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTQgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVwb2ludCA9ICgoYnl0ZTEgJiAweDA3KSA8PCAweDEyKSB8IChieXRlMiA8PCAweDBjKSB8IChieXRlMyA8PCAweDA2KSB8IGJ5dGU0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXBvaW50ID4gMHhmZmZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0luZGV4KytdID0gKGNvZGVwb2ludCA+Pj4gMTApICYgMHgzZmYgfCAweGQ4MDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcG9pbnQgPSAweGRjMDAgfCBjb2RlcG9pbnQgJiAweDNmZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9IGNvZGVwb2ludDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB1dGY4RGVjb2RlcjtcbiAgICAgICAgICAgICAgICB1dGY4RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RGVjb2RlcigpIDogZmFsbGJhY2tEZWNvZGVyO1xuICAgICAgICAgICAgICAgIGVtbmFwaVN0cmluZy51dGY4RGVjb2RlciA9IHV0ZjhEZWNvZGVyO1xuICAgICAgICAgICAgICAgIHZhciBmYWxsYmFja0RlY29kZXIyID0ge1xuICAgICAgICAgICAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQxNkFycmF5KGlucHV0LmJ1ZmZlciwgaW5wdXQuYnl0ZU9mZnNldCwgaW5wdXQuYnl0ZUxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA8PSAweDEwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmtzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IE1hdGgubWluKDB4MTAwMCwgYnl0ZXMubGVuZ3RoIC0gaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcy5zdWJhcnJheShpLCBpICsgbGVuKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rcy5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHV0ZjE2RGVjb2RlcjtcbiAgICAgICAgICAgICAgICB1dGYxNkRlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICdmdW5jdGlvbicgPyBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNmxlJykgOiBmYWxsYmFja0RlY29kZXIyO1xuICAgICAgICAgICAgICAgIGVtbmFwaVN0cmluZy51dGYxNkRlY29kZXIgPSB1dGYxNkRlY29kZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVuZ3RoQnl0ZXNVVEY4OiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGM7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4rKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjIDw9IDB4N0ZGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gMztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFVURjhUb1N0cmluZzogZnVuY3Rpb24gKHB0ciwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwdHIgfHwgIWxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHB0ciA+Pj49IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBIRUFQVThbZW5kXTspXG4gICAgICAgICAgICAgICAgICAgICAgICArK2VuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHB0ciArIChsZW5ndGggPj4+IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBwdHI7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAxNikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gcHRyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IEhFQVBVOFtpZHgrK107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDB4ODApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gSEVBUFU4W2lkeCsrXSAmIDYzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDB4RTApID09PSAweEMwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IEhFQVBVOFtpZHgrK10gJiA2MztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAweEYwKSA9PT0gMHhFMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUwID0gKCh1MCAmIDE1KSA8PCAxMikgfCAodTEgPDwgNikgfCB1MjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUwID0gKCh1MCAmIDcpIDw8IDE4KSB8ICh1MSA8PCAxMikgfCAodTIgPDwgNikgfCAoSEVBUFU4W2lkeCsrXSAmIDYzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODAwIHwgKGNoID4+IDEwKSwgMHhEQzAwIHwgKGNoICYgMHgzRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLnV0ZjhEZWNvZGVyLmRlY29kZSgoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIEhFQVBVOC5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgfHwgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChIRUFQVTguYnVmZmVyKSA9PT0gXCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXVwiKSkgPyBIRUFQVTguc2xpY2UocHRyLCBlbmQpIDogSEVBUFU4LnN1YmFycmF5KHB0ciwgZW5kKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyaW5nVG9VVEY4OiBmdW5jdGlvbiAoc3RyLCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQVTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIG91dElkeCA9IG91dFB0cjtcbiAgICAgICAgICAgICAgICBvdXRJZHggPj4+PSAwO1xuICAgICAgICAgICAgICAgIGlmICghKG1heEJ5dGVzVG9Xcml0ZSA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRJZHggPSBvdXRJZHg7XG4gICAgICAgICAgICAgICAgdmFyIGVuZElkeCA9IG91dElkeCArIG1heEJ5dGVzVG9Xcml0ZSAtIDE7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPj0gMHhEODAwICYmIHUgPD0gMHhERkZGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdTEgPSBzdHIuY2hhckNvZGVBdCgrK2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdSA9IDB4MTAwMDAgKyAoKHUgJiAweDNGRikgPDwgMTApIHwgKHUxICYgMHgzRkYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh1IDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggPj0gZW5kSWR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IHU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodSA8PSAweDdGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dElkeCArIDEgPj0gZW5kSWR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4QzAgfCAodSA+PiA2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweDgwIHwgKHUgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodSA8PSAweEZGRkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAyID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweEUwIHwgKHUgPj4gMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAoKHUgPj4gNikgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICh1ICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dElkeCArIDMgPj0gZW5kSWR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4RjAgfCAodSA+PiAxOCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICgodSA+PiAxMikgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICgodSA+PiA2KSAmIDYzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweDgwIHwgKHUgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSEVBUFU4W291dElkeF0gPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRJZHggLSBzdGFydElkeDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBVVEYxNlRvU3RyaW5nOiBmdW5jdGlvbiAocHRyLCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXB0ciB8fCAhbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgcHRyID4+Pj0gMDtcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBlbmQgPj4gMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEhFQVBVMTYgPSBuZXcgVWludDE2QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSEVBUFUxNltpZHhdKVxuICAgICAgICAgICAgICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlkeCA8PCAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gcHRyICsgKGxlbmd0aCA+Pj4gMCkgKiAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBwdHI7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAzMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIHB0ciwgbGVuZ3RoIC8gMikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLnV0ZjE2RGVjb2Rlci5kZWNvZGUoKCh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiBIRUFQVTguYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpIHx8IChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSEVBUFU4LmJ1ZmZlcikgPT09IFwiW29iamVjdCBTaGFyZWRBcnJheUJ1ZmZlcl1cIikpID8gSEVBUFU4LnNsaWNlKHB0ciwgZW5kKSA6IEhFQVBVOC5zdWJhcnJheShwdHIsIGVuZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cmluZ1RvVVRGMTY6IGZ1bmN0aW9uIChzdHIsIG91dFB0ciwgbWF4Qnl0ZXNUb1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heEJ5dGVzVG9Xcml0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9Xcml0ZSA9IDB4N0ZGRkZGRkY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvV3JpdGUgPCAyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBtYXhCeXRlc1RvV3JpdGUgLT0gMjtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRQdHIgPSBvdXRQdHI7XG4gICAgICAgICAgICAgICAgdmFyIG51bUNoYXJzVG9Xcml0ZSA9IChtYXhCeXRlc1RvV3JpdGUgPCBzdHIubGVuZ3RoICogMikgPyAobWF4Qnl0ZXNUb1dyaXRlIC8gMikgOiBzdHIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1DaGFyc1RvV3JpdGU7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2RlVW5pdCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQxNihvdXRQdHIsIGNvZGVVbml0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0UHRyICs9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDE2KG91dFB0ciwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dFB0ciAtIHN0YXJ0UHRyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ld1N0cmluZzogZnVuY3Rpb24gKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCwgc3RyaW5nTWFrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgICAgIHZhciBhdXRvTGVuZ3RoID0gbGVuZ3RoID09PSAtMTtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZWxlbmd0aCA9IGxlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoYXV0b0xlbmd0aCB8fCAoc2l6ZWxlbmd0aCA8PSAyMTQ3NDgzNjQ3KSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHN0clZhbHVlID0gc3RyaW5nTWFrZXIoc3RyLCBhdXRvTGVuZ3RoLCBzaXplbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHN0clZhbHVlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXdFeHRlcm5hbFN0cmluZzogZnVuY3Rpb24gKGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCwgY3JlYXRlQXBpLCBzdHJpbmdNYWtlcikge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGF1dG9MZW5ndGggPSBsZW5ndGggPT09IC0xO1xuICAgICAgICAgICAgICAgIHZhciBzaXplbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIShhdXRvTGVuZ3RoIHx8IChzaXplbGVuZ3RoIDw9IDIxNDc0ODM2NDcpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gY3JlYXRlQXBpKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGNvcGllZCwgMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbEZpbmFsaXplcihmaW5hbGl6ZV9jYWxsYmFjaywgc3RyLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2FycmF5X2xlbmd0aChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig4IC8qIG5hcGlfc3RhdHVzLm5hcGlfYXJyYXlfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBoYW5kbGUudmFsdWUubGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9hcnJheWJ1ZmZlcl9pbmZvKGVudiwgYXJyYXlidWZmZXIsIGRhdGEsIGJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0FycmF5QnVmZmVyKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBwID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0QXJyYXlCdWZmZXJQb2ludGVyKGhhbmRsZS52YWx1ZSwgdHJ1ZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChieXRlX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihieXRlX2xlbmd0aCwgaGFuZGxlLnZhbHVlLmJ5dGVMZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfcHJvdG90eXBlKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaGFuZGxlLmlzT2JqZWN0KCkgfHwgaGFuZGxlLmlzRnVuY3Rpb24oKSA/IGhhbmRsZS52YWx1ZSA6IE9iamVjdChoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBwID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKE9iamVjdC5nZXRQcm90b3R5cGVPZih2KSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdHlwZWRhcnJheV9pbmZvKGVudiwgdHlwZWRhcnJheSwgdHlwZSwgbGVuZ3RoLCBkYXRhLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdHlwZWRhcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodHlwZWRhcnJheSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc1R5cGVkQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgSW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAyIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDhfY2xhbXBlZF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDMgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQxNl9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA0IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDE2X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgSW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gNSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDYgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50MzJfYXJyYXkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDcgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9mbG9hdDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA4IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfZmxvYXQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDkgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWdpbnQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfYmlndWludDY0X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHR5cGUsIHQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihsZW5ndGgsIHYubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgICAgICBpZiAoZGF0YSB8fCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHYuYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcih2LCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5YnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFiID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyLCBhYiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfb2Zmc2V0LCB2LmJ5dGVPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2J1ZmZlcl9pbmZvKGVudiwgYnVmZmVyLCBkYXRhLCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYnVmZmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChidWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNCdWZmZXIoZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKGhhbmRsZS5pc0RhdGFWaWV3KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFwaV9nZXRfZGF0YXZpZXdfaW5mbyhlbnYsIGJ1ZmZlciwgbGVuZ3RoLCBkYXRhLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYXBpX2dldF90eXBlZGFycmF5X2luZm8oZW52LCBidWZmZXIsIDAsIGxlbmd0aCwgZGF0YSwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9kYXRhdmlld19pbmZvKGVudiwgZGF0YXZpZXcsIGJ5dGVfbGVuZ3RoLCBkYXRhLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZGF0YXZpZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGRhdGF2aWV3KTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlLmlzRGF0YVZpZXcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoYnl0ZV9sZW5ndGgsIHYuYnl0ZUxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYnVmZmVyO1xuICAgICAgICAgICAgaWYgKGRhdGEgfHwgYXJyYXlidWZmZXIpIHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSB2LmJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBwID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0Vmlld1BvaW50ZXIodiwgdHJ1ZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgcCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBhYiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhcnJheWJ1ZmZlciwgYWIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChieXRlX29mZnNldCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihieXRlX29mZnNldCwgdi5ieXRlT2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2RhdGVfdmFsdWUoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzRGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYgPSBoYW5kbGUudmFsdWUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0RmxvYXQ2NChyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9ib29sKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig3IC8qIG5hcGlfc3RhdHVzLm5hcGlfYm9vbGVhbl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGhhbmRsZS52YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2RvdWJsZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfaW50NjQoZW52LCB2YWx1ZSwgcmVzdWx0LCBsb3NzbGVzcykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFsb3NzbGVzcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgdmFyIG51bWJlclZhbHVlID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBudW1iZXJWYWx1ZSAhPT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoKG51bWJlclZhbHVlID49IChCaWdJbnQoLTEpICogKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgLSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBsb3cgPSBOdW1iZXIobnVtYmVyVmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhpZ2ggPSBOdW1iZXIobnVtYmVyVmFsdWUgPj4gQmlnSW50KDMyKSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0KGVudiwgdmFsdWUsIHJlc3VsdCwgbG9zc2xlc3MpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghbG9zc2xlc3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbnVtYmVyVmFsdWUgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKChudW1iZXJWYWx1ZSA+PSBCaWdJbnQoMCkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGxvdyA9IE51bWJlcihudW1iZXJWYWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcihudW1iZXJWYWx1ZSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF93b3JkcyhlbnYsIHZhbHVlLCBzaWduX2JpdCwgd29yZF9jb3VudCwgd29yZHMpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCF3b3JkX2NvdW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTcgLyogbmFwaV9zdGF0dXMubmFwaV9iaWdpbnRfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzTWludXMgPSBoYW5kbGUudmFsdWUgPCBCaWdJbnQoMCk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgdmFyIHdvcmRfY291bnRfaW50ID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKHdvcmRfY291bnQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHdvcmRDb3VudCA9IDA7XG4gICAgICAgICAgICB2YXIgYmlnaW50VmFsdWUgPSBpc01pbnVzID8gKGhhbmRsZS52YWx1ZSAqIEJpZ0ludCgtMSkpIDogaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICB3b3JkQ291bnQrKztcbiAgICAgICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGJpZ2ludFZhbHVlID4+IEJpZ0ludCg2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGlzTWludXMgPyAoaGFuZGxlLnZhbHVlICogQmlnSW50KC0xKSkgOiBoYW5kbGUudmFsdWU7XG4gICAgICAgICAgICBpZiAoIXNpZ25fYml0ICYmICF3b3Jkcykge1xuICAgICAgICAgICAgICAgIHdvcmRfY291bnRfaW50ID0gd29yZENvdW50O1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkX2NvdW50LCB3b3JkX2NvdW50X2ludCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNpZ25fYml0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghd29yZHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmRzQXJyID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVpbnQ2NCA9IGJpZ2ludFZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgICAgICB3b3Jkc0Fyci5wdXNoKHVpbnQ2NCk7XG4gICAgICAgICAgICAgICAgICAgIGJpZ2ludFZhbHVlID0gYmlnaW50VmFsdWUgPj4gQmlnSW50KDY0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKHdvcmRfY291bnRfaW50LCB3b3Jkc0Fyci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG93ID0gTnVtYmVyKHdvcmRzQXJyW2ldICYgQmlnSW50KDB4ZmZmZmZmZmYpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcih3b3Jkc0FycltpXSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHdvcmRzICsgaSAqIDgsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkcyArIChpICogOCArIDQpLCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoc2lnbl9iaXQsIGlzTWludXMgPyAxIDogMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHdvcmRfY291bnQsIGxlbiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9leHRlcm5hbChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0V4dGVybmFsKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHAgPSBoYW5kbGUuZGF0YSgpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgcCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9pbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gbmV3IEludDMyQXJyYXkoW2hhbmRsZS52YWx1ZV0pWzBdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9pbnQ2NChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAobnVtYmVyVmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBudW1iZXJWYWx1ZSA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIHx8IGlzTmFOKG51bWJlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChudW1iZXJWYWx1ZSA8IC8qIElOVDY0X1JBTkdFX05FR0FUSVZFICovIC05MjIzMzcyMDM2ODU0Nzc2ZTMpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCArIDQsIDIxNDc0ODM2NDgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnVtYmVyVmFsdWUgPj0gLyogSU5UNjRfUkFOR0VfUE9TSVRJVkUgKi8gOTIyMzM3MjAzNjg1NDc3NjAwMCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDQyOTQ5NjcyOTUsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQgKyA0LCAyMTQ3NDgzNjQ3LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICRlbW5hcGlTZXRWYWx1ZUk2NChyZXN1bHQsIE1hdGgudHJ1bmMobnVtYmVyVmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfc3RyaW5nX2xhdGluMShlbnYsIHZhbHVlLCBidWYsIGJ1Zl9zaXplLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGJ1Zl9zaXplID0gYnVmX3NpemUgPj4+IDA7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGhhbmRsZS52YWx1ZS5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYnVmX3NpemUgIT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zl9zaXplIC0gMTsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdiA9IGhhbmRsZS52YWx1ZS5jaGFyQ29kZUF0KGkpICYgMHhmZjtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDgoYnVmICsgaSwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgY29waWVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQ4KGJ1ZiArIGNvcGllZCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3BpZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmOChlbnYsIHZhbHVlLCBidWYsIGJ1Zl9zaXplLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGJ1Zl9zaXplID0gYnVmX3NpemUgPj4+IDA7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgc3RyTGVuZ3RoID0gZW1uYXBpU3RyaW5nLmxlbmd0aEJ5dGVzVVRGOChoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIHN0ckxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZfc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gZW1uYXBpU3RyaW5nLnN0cmluZ1RvVVRGOChoYW5kbGUudmFsdWUsIGJ1ZiwgYnVmX3NpemUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgY29waWVkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjE2KGVudiwgdmFsdWUsIGJ1ZiwgYnVmX3NpemUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgYnVmX3NpemUgPSBidWZfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgaGFuZGxlLnZhbHVlLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZfc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gZW1uYXBpU3RyaW5nLnN0cmluZ1RvVVRGMTYoaGFuZGxlLnZhbHVlLCBidWYsIGJ1Zl9zaXplICogMik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3BpZWQgLyAyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX3VpbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gbmV3IFVpbnQzMkFycmF5KFtoYW5kbGUudmFsdWVdKVswXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udmVydDJjTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2FycmF5X2xlbmd0aDogbmFwaV9nZXRfYXJyYXlfbGVuZ3RoLFxuICAgICAgICAgICAgbmFwaV9nZXRfYXJyYXlidWZmZXJfaW5mbzogbmFwaV9nZXRfYXJyYXlidWZmZXJfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2J1ZmZlcl9pbmZvOiBuYXBpX2dldF9idWZmZXJfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2RhdGF2aWV3X2luZm86IG5hcGlfZ2V0X2RhdGF2aWV3X2luZm8sXG4gICAgICAgICAgICBuYXBpX2dldF9kYXRlX3ZhbHVlOiBuYXBpX2dldF9kYXRlX3ZhbHVlLFxuICAgICAgICAgICAgbmFwaV9nZXRfcHJvdG90eXBlOiBuYXBpX2dldF9wcm90b3R5cGUsXG4gICAgICAgICAgICBuYXBpX2dldF90eXBlZGFycmF5X2luZm86IG5hcGlfZ2V0X3R5cGVkYXJyYXlfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF9pbnQ2NDogbmFwaV9nZXRfdmFsdWVfYmlnaW50X2ludDY0LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYmlnaW50X3VpbnQ2NDogbmFwaV9nZXRfdmFsdWVfYmlnaW50X3VpbnQ2NCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF93b3JkczogbmFwaV9nZXRfdmFsdWVfYmlnaW50X3dvcmRzLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYm9vbDogbmFwaV9nZXRfdmFsdWVfYm9vbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX2RvdWJsZTogbmFwaV9nZXRfdmFsdWVfZG91YmxlLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfZXh0ZXJuYWw6IG5hcGlfZ2V0X3ZhbHVlX2V4dGVybmFsLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfaW50MzI6IG5hcGlfZ2V0X3ZhbHVlX2ludDMyLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfaW50NjQ6IG5hcGlfZ2V0X3ZhbHVlX2ludDY0LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfc3RyaW5nX2xhdGluMTogbmFwaV9nZXRfdmFsdWVfc3RyaW5nX2xhdGluMSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX3N0cmluZ191dGYxNjogbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0Zjg6IG5hcGlfZ2V0X3ZhbHVlX3N0cmluZ191dGY4LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfdWludDMyOiBuYXBpX2dldF92YWx1ZV91aW50MzJcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfaW50MzIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV91aW50MzIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUgPj4+IDApLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGpwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9pbnQ2NChlbnYsIGxvdywgaGlnaCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWhpZ2gpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKGxvdyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjEgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGhpZ2gsIHYxLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwZHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2RvdWJsZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9zdHJpbmdfbGF0aW4xKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0LCBmdW5jdGlvbiAoc3RyLCBhdXRvTGVuZ3RoLCBzaXplTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhdGluMVN0cmluZyA9ICcnO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGF1dG9MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IEhFQVBfREFUQV9WSUVXLmdldFVpbnQ4KHN0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0aW4xU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPCBzaXplTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBIRUFQX0RBVEFfVklFVy5nZXRVaW50OChzdHIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGluMVN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhdGluMVN0cmluZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNihlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubmV3U3RyaW5nKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCwgZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuVVRGMTZUb1N0cmluZyhzdHIsIGxlbmd0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9zdHJpbmdfdXRmOChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubmV3U3RyaW5nKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCwgZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHN0ciwgbGVuZ3RoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX2NyZWF0ZV9leHRlcm5hbF9zdHJpbmdfbGF0aW4xKGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdFeHRlcm5hbFN0cmluZyhlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQsIG5hcGlfY3JlYXRlX3N0cmluZ19sYXRpbjEsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ191dGYxNihlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubmV3RXh0ZXJuYWxTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2hpbnQsIHJlc3VsdCwgY29waWVkLCBuYXBpX2NyZWF0ZV9zdHJpbmdfdXRmMTYsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV9sYXRpbjEoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMShlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfdXRmOChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuYXBpX2NyZWF0ZV9zdHJpbmdfdXRmOChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfdXRmMTYoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGpwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9iaWdpbnRfaW50NjQoZW52LCBsb3csIGhpZ2gsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWhpZ2gpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhbHVlID0gbG93O1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYxID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihoaWdoLCB2MSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGpwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9iaWdpbnRfdWludDY0KGVudiwgbG93LCBoaWdoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoaWdoKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YWx1ZSA9IGxvdyAmICgoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpIC0gQmlnSW50KDEpKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2MSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoaGlnaCwgdjEsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9iaWdpbnRfd29yZHMoZW52LCBzaWduX2JpdCwgd29yZF9jb3VudCwgd29yZHMsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYsIGk7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHdvcmRfY291bnQgPSB3b3JkX2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmICh3b3JkX2NvdW50ID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod29yZF9jb3VudCA+ICgxMDI0ICogMTAyNCAvICg0ICogOCkgLyAyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWF4aW11bSBCaWdJbnQgc2l6ZSBleGNlZWRlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBCaWdJbnQoMCk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZF9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb3cgPSBIRUFQX0RBVEFfVklFVy5nZXRVaW50MzIod29yZHMgKyBpICogOCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoaWdoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKHdvcmRzICsgKGkgKiA4ICsgNCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGkgPSBCaWdJbnQobG93KSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHdvcmRpIDw8IEJpZ0ludCg2NCAqIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSAqPSAoKEJpZ0ludChzaWduX2JpdCkgJSBCaWdJbnQoMikgPT09IEJpZ0ludCgwKSkgPyBCaWdJbnQoMSkgOiBCaWdJbnQoLTEpKTtcbiAgICAgICAgICAgICAgICB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnZlcnQybmFwaU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfaW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF9pbnQ2NCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfd29yZHM6IG5hcGlfY3JlYXRlX2JpZ2ludF93b3JkcyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RvdWJsZTogbmFwaV9jcmVhdGVfZG91YmxlLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50MzI6IG5hcGlfY3JlYXRlX2ludDMyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50NjQ6IG5hcGlfY3JlYXRlX2ludDY0LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMTogbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNjogbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX3V0Zjg6IG5hcGlfY3JlYXRlX3N0cmluZ191dGY4LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdWludDMyOiBuYXBpX2NyZWF0ZV91aW50MzIsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX2xhdGluMTogbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ19sYXRpbjEsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2OiBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV9sYXRpbjE6IG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfbGF0aW4xLFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNjogbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNixcbiAgICAgICAgICAgIG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfdXRmODogbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGY4XG4gICAgICAgIH0pO1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhKSB7XG4gICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gKCF1dGY4bmFtZSB8fCAhbGVuZ3RoKSA/ICcnIDogKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOG5hbWUsIGxlbmd0aCkpO1xuICAgICAgICAgICAgdmFyIGY7XG4gICAgICAgICAgICB2YXIgbmFwaUNhbGxiYWNrID0gKHdhc21UYWJsZS5nZXQoY2IpKTtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFwaUNhbGxiYWNrKGVudk9iamVjdC5pZCwgZW52T2JqZWN0LmN0eC5zY29wZVN0b3JlLmN1cnJlbnRTY29wZS5pZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIG1ha2VGdW5jdGlvbiA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW52T2JqZWN0LmN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrSW5mbyA9IHNjb3BlLmNhbGxiYWNrSW5mbztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8uYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLnRoaXogPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8uZm4gPSBmO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hcGlWYWx1ZSA9IGVudk9iamVjdC5jYWxsSW50b01vZHVsZShjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCFuYXBpVmFsdWUpID8gdW5kZWZpbmVkIDogZW52T2JqZWN0LmN0eC5oYW5kbGVTdG9yZS5nZXQobmFwaVZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby5kYXRhID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby5hcmdzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLnRoaXogPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8uZm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgZiA9IG1ha2VGdW5jdGlvbihlbnZPYmplY3QsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgZjogZiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoL15bXyRhLXpBLVpdW18kYS16QS1aMC05XSokLy50ZXN0KGZ1bmN0aW9uTmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8sIGY6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnROZXdGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHZhciBfID0gbWFrZUZ1bmN0aW9uKGVudk9iamVjdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGYgPSAobmV3IEZ1bmN0aW9uKCdfJywgJ3JldHVybiBmdW5jdGlvbiAnICsgZnVuY3Rpb25OYW1lICsgJygpeycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1widXNlIHN0cmljdFwiOycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybiBfLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICd9OycpKShfKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZiA9IG1ha2VGdW5jdGlvbihlbnZPYmplY3QsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLmNhblNldEZ1bmN0aW9uTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmID0gbWFrZUZ1bmN0aW9uKGVudk9iamVjdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5jYW5TZXRGdW5jdGlvbk5hbWUpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovLCBmOiBmIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBvYmosIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsR2V0dGVyID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbFNldHRlciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsR2V0dGVyID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCAwLCAwLCBnZXR0ZXIsIGRhdGEpLmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTZXR0ZXIgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIDAsIDAsIHNldHRlciwgZGF0YSkuZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogKGF0dHJpYnV0ZXMgJiA0IC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2NvbmZpZ3VyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IChhdHRyaWJ1dGVzICYgMiAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9lbnVtZXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBsb2NhbEdldHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBsb2NhbFNldHRlclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcGVydHlOYW1lLCBkZXNjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbE1ldGhvZCA9IGVtbmFwaUNyZWF0ZUZ1bmN0aW9uKGVudk9iamVjdCwgMCwgMCwgbWV0aG9kLCBkYXRhKS5mO1xuICAgICAgICAgICAgICAgIHZhciBkZXNjID0ge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IChhdHRyaWJ1dGVzICYgNCAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9jb25maWd1cmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAoYXR0cmlidXRlcyAmIDIgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfZW51bWVyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAoYXR0cmlidXRlcyAmIDEgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfd3JpdGFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxNZXRob2RcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwgZGVzYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAoYXR0cmlidXRlcyAmIDQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfY29uZmlndXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogKGF0dHJpYnV0ZXMgJiAyIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2VudW1lcmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogKGF0dHJpYnV0ZXMgJiAxIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX3dyaXRhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpLnZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eU5hbWUsIGRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaUdldEhhbmRsZShqc19vYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX29iamVjdCk7XG4gICAgICAgICAgICBpZiAoIShoYW5kbGUuaXNPYmplY3QoKSB8fCBoYW5kbGUuaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVtbmFwaUV4dGVybmFsTWVtb3J5ICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoaGFuZGxlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhoYW5kbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmdldChoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgaGFuZGxlOiBoYW5kbGUgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlSWQ7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlbW5hcGlDdHguY3JlYXRlTm90U3VwcG9ydFdlYWtSZWZFcnJvcignbmFwaV93cmFwJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfd3JhcCcsICdQYXJhbWV0ZXIgXCJyZXN1bHRcIiBtdXN0IGJlIDAoTlVMTCknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWpzX29iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlUmVzdWx0ID0gZW1uYXBpR2V0SGFuZGxlKGpzX29iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZVJlc3VsdC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihoYW5kbGVSZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGhhbmRsZVJlc3VsdC5oYW5kbGU7XG4gICAgICAgICAgICAgICAgaWYgKGVudk9iamVjdC5nZXRPYmplY3RCaW5kaW5nKGhhbmRsZS52YWx1ZSkud3JhcHBlZCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5hbGl6ZV9jYilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2VXaXRoRmluYWxpemVyKGVudk9iamVjdCwgaGFuZGxlLmlkLCAwLCAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlSWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgcmVmZXJlbmNlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlV2l0aEZpbmFsaXplcihlbnZPYmplY3QsIGhhbmRsZS5pZCwgMCwgMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2VXaXRoRGF0YShlbnZPYmplY3QsIGhhbmRsZS5pZCwgMCwgMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sIG5hdGl2ZV9vYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudk9iamVjdC5nZXRPYmplY3RCaW5kaW5nKGhhbmRsZS52YWx1ZSkud3JhcHBlZCA9IHJlZmVyZW5jZS5pZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaVVud3JhcChlbnYsIGpzX29iamVjdCwgcmVzdWx0LCBhY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBkYXRhO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFqc19vYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gMCAvKiBVbndyYXBBY3Rpb24uS2VlcFdyYXAgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX29iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFsdWUuaXNPYmplY3QoKSB8fCB2YWx1ZS5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nID0gZW52T2JqZWN0LmdldE9iamVjdEJpbmRpbmcodmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IGJpbmRpbmcud3JhcHBlZDtcbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWZlcmVuY2VJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZWYuZGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGRhdGEsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAxIC8qIFVud3JhcEFjdGlvbi5SZW1vdmVXcmFwICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcud3JhcHBlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYub3duZXJzaGlwKCkgPT09IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgd3JhcCBpcyBiZWVuIHJlbW92ZWQsIHRoZSBmaW5hbGl6ZXIgc2hvdWxkIGJlIHJlc2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmLnJlc2V0RmluYWxpemVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGVmaW5lX2NsYXNzKGVudiwgdXRmOG5hbWUsIGxlbmd0aCwgY29uc3RydWN0b3IsIGNhbGxiYWNrX2RhdGEsIHByb3BlcnR5X2NvdW50LCBwcm9wZXJ0aWVzLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwcm9wUHRyLCB2YWx1ZUhhbmRsZUlkLCBhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eV9jb3VudCA9IHByb3BlcnR5X2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPCAtMSkgfHwgKGxlbmd0aCA+IDIxNDc0ODM2NDcpIHx8ICghdXRmOG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmcmVzdWx0ID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCB1dGY4bmFtZSwgbGVuZ3RoLCBjb25zdHJ1Y3RvciwgY2FsbGJhY2tfZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGZyZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB2YXIgRiA9IGZyZXN1bHQuZjtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eV9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcHJvcFB0ciA9IHByb3BlcnRpZXMgKyAoaSAqICg0ICogOCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXRmOE5hbWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVfMSA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdldHRlciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAxMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXRmOE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOE5hbWUsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYW1lXzEpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcyAmIDEwMjQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfc3RhdGljICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBGLCBwcm9wZXJ0eU5hbWUsIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIHZhbHVlLCBhdHRyaWJ1dGVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaURlZmluZVByb3BlcnR5KGVudk9iamVjdCwgRi5wcm90b3R5cGUsIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlSGFuZGxlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKEYpO1xuICAgICAgICAgICAgICAgIHZhbHVlSGFuZGxlSWQgPSB2YWx1ZUhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlSGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3dyYXAoZW52LCBqc19vYmplY3QsIG5hdGl2ZV9vYmplY3QsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlVbndyYXAoZW52LCBqc19vYmplY3QsIHJlc3VsdCwgMCAvKiBVbndyYXBBY3Rpb24uS2VlcFdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZW1vdmVfd3JhcChlbnYsIGpzX29iamVjdCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpVW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQsIDEgLyogVW53cmFwQWN0aW9uLlJlbW92ZVdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90eXBlX3RhZ19vYmplY3QoZW52LCBvYmplY3QsIHR5cGVfdGFnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmICghKHZhbHVlLmlzT2JqZWN0KCkgfHwgdmFsdWUuaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdHlwZV90YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nID0gZW52T2JqZWN0LmdldE9iamVjdEJpbmRpbmcodmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRhZyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgICAgICAgICB0YWcuc2V0KG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCB0eXBlX3RhZywgMTYpKTtcbiAgICAgICAgICAgICAgICBiaW5kaW5nLnRhZyA9IG5ldyBVaW50MzJBcnJheSh0YWcuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2hlY2tfb2JqZWN0X3R5cGVfdGFnKGVudiwgb2JqZWN0LCB0eXBlX3RhZywgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBvbmUtdmFyXG4gICAgICAgICAgICB2YXIgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFsdWUuaXNPYmplY3QoKSB8fCB2YWx1ZS5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlX3RhZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nID0gZW52T2JqZWN0LmdldE9iamVjdEJpbmRpbmcodmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gYmluZGluZy50YWc7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlVGFnID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCB0eXBlX3RhZywgNCk7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9ICh0YWdbMF0gPT09IHR5cGVUYWdbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1sxXSA9PT0gdHlwZVRhZ1sxXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnWzJdID09PSB0eXBlVGFnWzJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdbM10gPT09IHR5cGVUYWdbM10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHJldCA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9hZGRfZmluYWxpemVyKGVudiwganNfb2JqZWN0LCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghanNfb2JqZWN0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIWZpbmFsaXplX2NiKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlUmVzdWx0ID0gZW1uYXBpR2V0SGFuZGxlKGpzX29iamVjdCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlUmVzdWx0LnN0YXR1cyAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoaGFuZGxlUmVzdWx0LnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gaGFuZGxlUmVzdWx0LmhhbmRsZTtcbiAgICAgICAgICAgIHZhciBvd25lcnNoaXAgPSAhcmVzdWx0ID8gMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi87XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIoZW52T2JqZWN0LCBoYW5kbGUuaWQsIDAsIG93bmVyc2hpcCwgZmluYWxpemVfY2IsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgcmVmZXJlbmNlSWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHJlZmVyZW5jZUlkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9wb3N0X2ZpbmFsaXplcihlbnYsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5lbnF1ZXVlRmluYWxpemVyKGVtbmFwaUN0eC5jcmVhdGVUcmFja2VkRmluYWxpemVyKGVudk9iamVjdCwgZmluYWxpemVfY2IsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd3JhcE1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2FkZF9maW5hbGl6ZXI6IG5hcGlfYWRkX2ZpbmFsaXplcixcbiAgICAgICAgICAgIG5hcGlfY2hlY2tfb2JqZWN0X3R5cGVfdGFnOiBuYXBpX2NoZWNrX29iamVjdF90eXBlX3RhZyxcbiAgICAgICAgICAgIG5hcGlfZGVmaW5lX2NsYXNzOiBuYXBpX2RlZmluZV9jbGFzcyxcbiAgICAgICAgICAgIG5hcGlfcmVtb3ZlX3dyYXA6IG5hcGlfcmVtb3ZlX3dyYXAsXG4gICAgICAgICAgICBuYXBpX3R5cGVfdGFnX29iamVjdDogbmFwaV90eXBlX3RhZ19vYmplY3QsXG4gICAgICAgICAgICBuYXBpX3Vud3JhcDogbmFwaV91bndyYXAsXG4gICAgICAgICAgICBuYXBpX3dyYXA6IG5hcGlfd3JhcCxcbiAgICAgICAgICAgIG5vZGVfYXBpX3Bvc3RfZmluYWxpemVyOiBub2RlX2FwaV9wb3N0X2ZpbmFsaXplclxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2NyZWF0ZV9tZW1vcnlfdmlldyhlbnYsIHR5cGVkYXJyYXlfdHlwZSwgZXh0ZXJuYWxfZGF0YSwgYnl0ZV9sZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFleHRlcm5hbF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQ2Fubm90IGNyZWF0ZSBhIG1lbW9yeSB2aWV3IGxhcmdlciB0aGFuIDIxNDc0ODM2NDcgYnl0ZXMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChleHRlcm5hbF9kYXRhICsgYnl0ZV9sZW5ndGgpID4gd2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWVtb3J5IG91dCBvZiByYW5nZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ2VtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcnLCAnUGFyYW1ldGVyIFwiZmluYWxpemVfY2JcIiBtdXN0IGJlIDAoTlVMTCknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZpZXdEZXNjcmlwdG9yID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZWRhcnJheV90eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfaW50OF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBJbnQ4QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV91aW50OF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBVaW50OEFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfdWludDhfY2xhbXBlZF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBVaW50OENsYW1wZWRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCwgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2ludDE2X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEludDE2QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMSwgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX3VpbnQxNl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBVaW50MTZBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAxLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNSAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfaW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogSW50MzJBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAyLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfdWludDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQzMkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDIsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9mbG9hdDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEZsb2F0MzJBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAyLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOCAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfZmxvYXQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBGbG9hdDY0QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMywgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDkgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2JpZ2ludDY0X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEJpZ0ludDY0QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMywgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9iaWd1aW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogQmlnVWludDY0QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMywgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIC0xIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9kYXRhX3ZpZXcgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogRGF0YVZpZXcsIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLkJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ2VtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcnLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyLCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIEN0b3IgPSB2aWV3RGVzY3JpcHRvci5DdG9yO1xuICAgICAgICAgICAgICAgIHZhciB0eXBlZEFycmF5ID0gdHlwZWRhcnJheV90eXBlID09PSAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovXG4gICAgICAgICAgICAgICAgICAgID8gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyLmZyb20od2FzbU1lbW9yeS5idWZmZXIsIHZpZXdEZXNjcmlwdG9yLmFkZHJlc3MsIHZpZXdEZXNjcmlwdG9yLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgQ3Rvcih3YXNtTWVtb3J5LmJ1ZmZlciwgdmlld0Rlc2NyaXB0b3IuYWRkcmVzcywgdmlld0Rlc2NyaXB0b3IubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHR5cGVkQXJyYXkpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KHR5cGVkQXJyYXksIHZpZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1c18xID0gbmFwaV9hZGRfZmluYWxpemVyKGVudiwgaGFuZGxlLmlkLCBleHRlcm5hbF9kYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgLyogTlVMTCAqLyAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c18xID09PSAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gZW52T2JqZWN0LnRyeUNhdGNoLmV4dHJhY3RFeGNlcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1c18xICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKHN0YXR1c18xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlfaXNfc3VwcG9ydF93ZWFrcmVmKCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgPyAxIDogMDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9pc19zdXBwb3J0X2JpZ2ludCgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50ID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlfaXNfbm9kZV9iaW5kaW5nX2F2YWlsYWJsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlOb2RlQmluZGluZyA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uICRlbW5hcGlTeW5jTWVtb3J5KGpzX3RvX3dhc20sIGFycmF5QnVmZmVyT3JWaWV3LCBvZmZzZXQsIGxlbikge1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICE9PSBudWxsICYmIG9mZnNldCAhPT0gdm9pZCAwID8gb2Zmc2V0IDogMDtcbiAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICAgICAgICAgIHZhciB2aWV3O1xuICAgICAgICAgICAgaWYgKGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldEFycmF5QnVmZmVyUG9pbnRlcihhcnJheUJ1ZmZlck9yVmlldywgZmFsc2UpLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gQXJyYXlCdWZmZXIgYWRkcmVzcycpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGVuICE9PSAnbnVtYmVyJyB8fCBsZW4gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbiA9IGFycmF5QnVmZmVyT3JWaWV3LmJ5dGVMZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbiA9IGxlbiA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlCdWZmZXJPclZpZXc7XG4gICAgICAgICAgICAgICAgdmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyT3JWaWV3LCBvZmZzZXQsIGxlbik7XG4gICAgICAgICAgICAgICAgdmFyIHdhc21NZW1vcnlVOCA9IG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpzX3RvX3dhc20pIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXQod2FzbU1lbW9yeVU4LnN1YmFycmF5KHBvaW50ZXIsIHBvaW50ZXIgKyBsZW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnlVOC5zZXQodmlldywgcG9pbnRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUJ1ZmZlck9yVmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYXlCdWZmZXJPclZpZXcpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXdQb2ludGVySW5mbyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldFZpZXdQb2ludGVyKGFycmF5QnVmZmVyT3JWaWV3LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIGxhdGVzdFZpZXcgPSB2aWV3UG9pbnRlckluZm8udmlldztcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IHZpZXdQb2ludGVySW5mby5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIGlmICghcG9pbnRlcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIEFycmF5QnVmZmVyIGFkZHJlc3MnKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxlbiAhPT0gJ251bWJlcicgfHwgbGVuID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZW4gPSBsYXRlc3RWaWV3LmJ5dGVMZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbiA9IGxlbiA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0VmlldztcbiAgICAgICAgICAgICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkobGF0ZXN0Vmlldy5idWZmZXIsIGxhdGVzdFZpZXcuYnl0ZU9mZnNldCArIG9mZnNldCwgbGVuKTtcbiAgICAgICAgICAgICAgICB2YXIgd2FzbU1lbW9yeVU4ID0gbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghanNfdG9fd2FzbSkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldCh3YXNtTWVtb3J5VTguc3ViYXJyYXkocG9pbnRlciwgcG9pbnRlciArIGxlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeVU4LnNldCh2aWV3LCBwb2ludGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFZpZXc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbW5hcGlTeW5jTWVtb3J5IGV4cGVjdCBBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcgYXMgZmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9zeW5jX21lbW9yeShlbnYsIGpzX3RvX3dhc20sIGFycmF5YnVmZmVyX29yX3ZpZXcsIG9mZnNldCwgbGVuKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXJfb3JfdmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVJZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChoYW5kbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNBcnJheUJ1ZmZlcigpICYmICFoYW5kbGUuaXNUeXBlZEFycmF5KCkgJiYgIWhhbmRsZS5pc0RhdGFWaWV3KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9ICRlbW5hcGlTeW5jTWVtb3J5KEJvb2xlYW4oanNfdG9fd2FzbSksIGhhbmRsZS52YWx1ZSwgb2Zmc2V0LCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUudmFsdWUgIT09IHJldCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzKGFycmF5QnVmZmVyT3JWaWV3KSB7XG4gICAgICAgICAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG4gICAgICAgICAgICB2YXIgaXNEYXRhVmlldyA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgRGF0YVZpZXc7XG4gICAgICAgICAgICB2YXIgaXNUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmF5QnVmZmVyT3JWaWV3KSAmJiAhaXNEYXRhVmlldztcbiAgICAgICAgICAgIGlmICghaXNBcnJheUJ1ZmZlciAmJiAhaXNUeXBlZEFycmF5ICYmICFpc0RhdGFWaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyBleHBlY3QgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3IGFzIGZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGluZm87XG4gICAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoYXJyYXlCdWZmZXJPclZpZXcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcihhcnJheUJ1ZmZlck9yVmlldywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBpbmZvLmFkZHJlc3MsXG4gICAgICAgICAgICAgICAgb3duZXJzaGlwOiBpbmZvLm93bmVyc2hpcCxcbiAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiBpbmZvLnJ1bnRpbWVBbGxvY2F0ZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzcyhlbnYsIGFycmF5YnVmZmVyX29yX3ZpZXcsIGFkZHJlc3MsIG93bmVyc2hpcCwgcnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwLCBydW50aW1lQWxsb2NhdGVkLCBvd25lcnNoaXBPdXQ7XG4gICAgICAgICAgICB2YXIgaW5mbztcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXJfb3JfdmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MgJiYgIW93bmVyc2hpcCAmJiAhcnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyX29yX3ZpZXcpO1xuICAgICAgICAgICAgICAgIGluZm8gPSAkZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyhoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIHAgPSBpbmZvLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhZGRyZXNzLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG93bmVyc2hpcCkge1xuICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXBPdXQgPSBpbmZvLm93bmVyc2hpcDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIob3duZXJzaGlwLCBvd25lcnNoaXBPdXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZCA9IGluZm8ucnVudGltZUFsbG9jYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChydW50aW1lX2FsbG9jYXRlZCwgcnVudGltZUFsbG9jYXRlZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9nZXRfcnVudGltZV92ZXJzaW9uKGVudiwgdmVyc2lvbikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIXZlcnNpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBydW50aW1lVmVyc2lvbjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcnVudGltZVZlcnNpb24gPSBlbW5hcGlDdHguZ2V0UnVudGltZVZlcnNpb25zKCkudmVyc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmVyc2lvbnMgPSBydW50aW1lVmVyc2lvbi5zcGxpdCgnLicpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gTnVtYmVyKG4pOyB9KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodmVyc2lvbiwgdmVyc2lvbnNbMF0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHZlcnNpb24gKyA0LCB2ZXJzaW9uc1sxXSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodmVyc2lvbiArIDgsIHZlcnNpb25zWzJdLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzOiAkZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyxcbiAgICAgICAgICAgICRlbW5hcGlTeW5jTWVtb3J5OiAkZW1uYXBpU3luY01lbW9yeSxcbiAgICAgICAgICAgIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXc6IGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcsXG4gICAgICAgICAgICBlbW5hcGlfZ2V0X21lbW9yeV9hZGRyZXNzOiBlbW5hcGlfZ2V0X21lbW9yeV9hZGRyZXNzLFxuICAgICAgICAgICAgZW1uYXBpX2dldF9ydW50aW1lX3ZlcnNpb246IGVtbmFwaV9nZXRfcnVudGltZV92ZXJzaW9uLFxuICAgICAgICAgICAgZW1uYXBpX2lzX25vZGVfYmluZGluZ19hdmFpbGFibGU6IGVtbmFwaV9pc19ub2RlX2JpbmRpbmdfYXZhaWxhYmxlLFxuICAgICAgICAgICAgZW1uYXBpX2lzX3N1cHBvcnRfYmlnaW50OiBlbW5hcGlfaXNfc3VwcG9ydF9iaWdpbnQsXG4gICAgICAgICAgICBlbW5hcGlfaXNfc3VwcG9ydF93ZWFrcmVmOiBlbW5hcGlfaXNfc3VwcG9ydF93ZWFrcmVmLFxuICAgICAgICAgICAgZW1uYXBpX3N5bmNfbWVtb3J5OiBlbW5hcGlfc3luY19tZW1vcnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9hcnJheShlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShbXSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9hcnJheV93aXRoX2xlbmd0aChlbnYsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKG5ldyBBcnJheShsZW5ndGgpKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCwgZGF0YSkge1xuICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgcCA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldEFycmF5QnVmZmVyUG9pbnRlcihhcnJheUJ1ZmZlciwgdHJ1ZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGRhdGEsIHAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFycmF5QnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2FycmF5YnVmZmVyKGVudiwgYnl0ZV9sZW5ndGgsIGRhdGEsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGFycmF5QnVmZmVyID0gZW1uYXBpQ3JlYXRlQXJyYXlCdWZmZXIoYnl0ZV9sZW5ndGgsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKGFycmF5QnVmZmVyKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGRwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9kYXRlKGVudiwgdGltZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUobmV3IERhdGUodGltZSkpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXh0ZXJuYWwoZW52LCBkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfY3JlYXRlX2V4dGVybmFsJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBleHRlcm5hbEhhbmRsZSA9IGVtbmFwaUN0eC5nZXRDdXJyZW50U2NvcGUoKS5hZGRFeHRlcm5hbChkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIoZW52T2JqZWN0LCBleHRlcm5hbEhhbmRsZS5pZCwgMCwgMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sIGZpbmFsaXplX2NiLCBkYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBleHRlcm5hbEhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyKGVudiwgZXh0ZXJuYWxfZGF0YSwgYnl0ZV9sZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFleHRlcm5hbF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChleHRlcm5hbF9kYXRhICsgYnl0ZV9sZW5ndGgpID4gd2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWVtb3J5IG91dCBvZiByYW5nZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZUNoYW5uZWxfMSA9IGVtbmFwaUN0eC5mZWF0dXJlLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VDaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsXzEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKGFycmF5QnVmZmVyLCBbYXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdThhcnIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHU4YXJyLnNldChuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc3ViYXJyYXkoZXh0ZXJuYWxfZGF0YSwgZXh0ZXJuYWxfZGF0YSArIGJ5dGVfbGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLnNldChhcnJheUJ1ZmZlciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXNfMSA9IG5hcGlfYWRkX2ZpbmFsaXplcihlbnYsIGhhbmRsZS5pZCwgZXh0ZXJuYWxfZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIC8qIE5VTEwgKi8gMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNfMSA9PT0gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IGVudk9iamVjdC50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0dXNfMSAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihzdGF0dXNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBoYW5kbGUuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9vYmplY3QoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoe30pLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfc3ltYm9sKGVudiwgZGVzY3JpcHRpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN5bWJvbC1kZXNjcmlwdGlvbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKFN5bWJvbCgpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlc2MgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoU3ltYm9sKGRlc2MpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfdHlwZWRhcnJheShlbnYsIHR5cGUsIGxlbmd0aCwgYXJyYXlidWZmZXIsIGJ5dGVfb2Zmc2V0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJyYXlidWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXlCdWZmZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBjcmVhdGVUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGVudk9iamVjdCwgVHlwZSwgc2l6ZV9vZl9lbGVtZW50LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBieXRlX29mZnNldCA9IGJ5dGVfb2Zmc2V0ID4+PiAwO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplX29mX2VsZW1lbnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJ5dGVfb2Zmc2V0KSAlIChzaXplX29mX2VsZW1lbnQpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKFwic3RhcnQgb2Zmc2V0IG9mIFwiLmNvbmNhdCgoX2EgPSBUeXBlLm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnLCBcIiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBcIikuY29uY2F0KHNpemVfb2ZfZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9OQVBJX0lOVkFMSURfVFlQRURBUlJBWV9BTElHTk1FTlQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgoKGxlbmd0aCAqIHNpemVfb2ZfZWxlbWVudCkgKyBieXRlX29mZnNldCkgPiBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnRVJSX05BUElfSU5WQUxJRF9UWVBFREFSUkFZX0xFTkdUSCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBvdXQgPSBuZXcgVHlwZShidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09PSB3YXNtTWVtb3J5LmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhvdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQob3V0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0b3I6IFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGJ5dGVfb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKG91dCkuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDhfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEludDhBcnJheSwgMSwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDhfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIFVpbnQ4QXJyYXksIDEsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQ4X2NsYW1wZWRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIFVpbnQ4Q2xhbXBlZEFycmF5LCAxLCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQxNl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgSW50MTZBcnJheSwgMiwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDE2X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBVaW50MTZBcnJheSwgMiwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEludDMyQXJyYXksIDQsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNiAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQzMl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgVWludDMyQXJyYXksIDQsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNyAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2Zsb2F0MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEZsb2F0MzJBcnJheSwgNCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfZmxvYXQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgRmxvYXQ2NEFycmF5LCA4LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDkgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWdpbnQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgQmlnSW50NjRBcnJheSwgOCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2JpZ3VpbnQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgQmlnVWludDY0QXJyYXksIDgsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fZGVwcyBtYWxsb2NcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2J1ZmZlcihlbnYsIHNpemUsIGRhdGEsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlLCBwb2ludGVyO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIEJ1ZmZlciA9IGVtbmFwaUN0eC5mZWF0dXJlLkJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAoIUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlbW5hcGlDdHguY3JlYXRlTm90U3VwcG9ydEJ1ZmZlckVycm9yKCduYXBpX2NyZWF0ZV9idWZmZXInLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUgPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgKHNpemUgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoYnVmZmVyKS5pZDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gX21hbGxvYyhzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdXQgb2YgbWVtb3J5Jyk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKS5zdWJhcnJheShwb2ludGVyLCBwb2ludGVyICsgc2l6ZSkuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlcl8xID0gQnVmZmVyLmZyb20od2FzbU1lbW9yeS5idWZmZXIsIHBvaW50ZXIsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiBCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBwb2ludGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBzaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwOiBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSA/IDAgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtSdW50aW1lICovIDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLnNldChidWZmZXJfMSwgdmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlZ2lzdGVyKHZpZXdEZXNjcmlwdG9yLCBwb2ludGVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoYnVmZmVyXzEpLmlkO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgcG9pbnRlciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5KGVudiwgbGVuZ3RoLCBkYXRhLCByZXN1bHRfZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQnVmZmVyID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmICghQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ25hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5JywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihsZW5ndGgsIHJlc3VsdF9kYXRhKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KGRhdGEsIGRhdGEgKyBsZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2V4dGVybmFsX2J1ZmZlcihlbnYsIGxlbmd0aCwgZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcoZW52LCAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovLCBkYXRhLCBsZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfYnVmZmVyX2Zyb21fYXJyYXlidWZmZXIoZW52LCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYnl0ZV9vZmZzZXQgPSBieXRlX29mZnNldCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBieXRlX2xlbmd0aCA9IGJ5dGVfbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0FycmF5QnVmZmVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoKGJ5dGVfbGVuZ3RoICsgYnl0ZV9vZmZzZXQpID4gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKCdUaGUgYnl0ZSBvZmZzZXQgKyBsZW5ndGggaXMgb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9PVVRfT0ZfUkFOR0UnO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBCdWZmZXIgPSBlbW5hcGlDdHguZmVhdHVyZS5CdWZmZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRCdWZmZXJFcnJvcignbm9kZV9hcGlfY3JlYXRlX2J1ZmZlcl9mcm9tX2FycmF5YnVmZmVyJywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgb3V0ID0gQnVmZmVyLmZyb20oYnVmZmVyLCBieXRlX29mZnNldCwgYnl0ZV9sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXMob3V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQob3V0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RvcjogQnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGJ5dGVfb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogYnl0ZV9sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKG91dCkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9kYXRhdmlldyhlbnYsIGJ5dGVfbGVuZ3RoLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhcnJheWJ1ZmZlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBieXRlX2xlbmd0aCA9IGJ5dGVfbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIGJ5dGVfb2Zmc2V0ID0gYnl0ZV9vZmZzZXQgPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJyYXlidWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXlCdWZmZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICgoYnl0ZV9sZW5ndGggKyBieXRlX29mZnNldCkgPiBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IFJhbmdlRXJyb3IoJ2J5dGVfb2Zmc2V0ICsgYnl0ZV9sZW5ndGggc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXJyYXkgcGFzc2VkIGluJyk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9OQVBJX0lOVkFMSURfREFUQVZJRVdfQVJHUyc7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRhdGF2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09PSB3YXNtTWVtb3J5LmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuaGFzKGRhdGF2aWV3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQoZGF0YXZpZXcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiBEYXRhVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBieXRlX29mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGJ5dGVfbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShkYXRhdmlldykuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX3N5bWJvbF9mb3IoZW52LCB1dGY4ZGVzY3JpcHRpb24sIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGF1dG9MZW5ndGggPSBsZW5ndGggPT09IC0xO1xuICAgICAgICAgICAgdmFyIHNpemVsZW5ndGggPSBsZW5ndGggPj4+IDA7XG4gICAgICAgICAgICBpZiAobGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGY4ZGVzY3JpcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShhdXRvTGVuZ3RoIHx8IChzaXplbGVuZ3RoIDw9IDIxNDc0ODM2NDcpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRpb25TdHJpbmcgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhkZXNjcmlwdGlvbiwgbGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShTeW1ib2wuZm9yKGRlc2NyaXB0aW9uU3RyaW5nKSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNyZWF0ZU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9hcnJheTogbmFwaV9jcmVhdGVfYXJyYXksXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9hcnJheV93aXRoX2xlbmd0aDogbmFwaV9jcmVhdGVfYXJyYXlfd2l0aF9sZW5ndGgsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9hcnJheWJ1ZmZlcjogbmFwaV9jcmVhdGVfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9idWZmZXI6IG5hcGlfY3JlYXRlX2J1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5OiBuYXBpX2NyZWF0ZV9idWZmZXJfY29weSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RhdGF2aWV3OiBuYXBpX2NyZWF0ZV9kYXRhdmlldyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RhdGU6IG5hcGlfY3JlYXRlX2RhdGUsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9leHRlcm5hbDogbmFwaV9jcmVhdGVfZXh0ZXJuYWwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9leHRlcm5hbF9hcnJheWJ1ZmZlcjogbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9leHRlcm5hbF9idWZmZXI6IG5hcGlfY3JlYXRlX2V4dGVybmFsX2J1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX29iamVjdDogbmFwaV9jcmVhdGVfb2JqZWN0LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3ltYm9sOiBuYXBpX2NyZWF0ZV9zeW1ib2wsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV90eXBlZGFycmF5OiBuYXBpX2NyZWF0ZV90eXBlZGFycmF5LFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX2J1ZmZlcl9mcm9tX2FycmF5YnVmZmVyOiBub2RlX2FwaV9jcmVhdGVfYnVmZmVyX2Zyb21fYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBub2RlX2FwaV9zeW1ib2xfZm9yOiBub2RlX2FwaV9zeW1ib2xfZm9yXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYm9vbGVhbihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IHZhbHVlID09PSAwID8gMyAvKiBHbG9iYWxIYW5kbGUuRkFMU0UgKi8gOiA0IC8qIEdsb2JhbEhhbmRsZS5UUlVFICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfZ2xvYmFsKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gNSAvKiBHbG9iYWxIYW5kbGUuR0xPQkFMICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X251bGwoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSAyIC8qIEdsb2JhbEhhbmRsZS5OVUxMICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3VuZGVmaW5lZChlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IDEgLyogR2xvYmFsSGFuZGxlLlVOREVGSU5FRCAqLztcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2xvYmFsTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2Jvb2xlYW46IG5hcGlfZ2V0X2Jvb2xlYW4sXG4gICAgICAgICAgICBuYXBpX2dldF9nbG9iYWw6IG5hcGlfZ2V0X2dsb2JhbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X251bGw6IG5hcGlfZ2V0X251bGwsXG4gICAgICAgICAgICBuYXBpX2dldF91bmRlZmluZWQ6IG5hcGlfZ2V0X3VuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3NldF9pbnN0YW5jZV9kYXRhKGVudiwgZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LnNldEluc3RhbmNlRGF0YShkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfaW5zdGFuY2VfZGF0YShlbnYsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnZPYmplY3QuZ2V0SW5zdGFuY2VEYXRhKCk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnZNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfaW5zdGFuY2VfZGF0YTogbmFwaV9nZXRfaW5zdGFuY2VfZGF0YSxcbiAgICAgICAgICAgIG5hcGlfc2V0X2luc3RhbmNlX2RhdGE6IG5hcGlfc2V0X2luc3RhbmNlX2RhdGFcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgdnBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9nZXRfbGFzdF9lcnJvcl9pbmZvKGVudiwgZXJyb3JfY29kZSwgZW5naW5lX2Vycm9yX2NvZGUsIGVuZ2luZV9yZXNlcnZlZCkge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIHZhciBsYXN0RXJyb3IgPSBlbnZPYmplY3QubGFzdEVycm9yO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGVycm9yQ29kZSA9IGxhc3RFcnJvci5lcnJvckNvZGU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZW5naW5lRXJyb3JDb2RlID0gbGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSA+Pj4gMDtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBlbmdpbmVSZXNlcnZlZCA9IGxhc3RFcnJvci5lbmdpbmVSZXNlcnZlZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihlcnJvcl9jb2RlLCBlcnJvckNvZGUsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVFcnJvckNvZGUsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZW5naW5lX3Jlc2VydmVkLCBlbmdpbmVSZXNlcnZlZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90aHJvdyhlbnYsIGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGVycm9yKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Rocm93X2Vycm9yKGVudiwgY29kZSwgbXNnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhtc2csIC0xKSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGNvZGUsIC0xKTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90aHJvd190eXBlX2Vycm9yKGVudiwgY29kZSwgbXNnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgVHlwZUVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdGhyb3dfcmFuZ2VfZXJyb3IoZW52LCBjb2RlLCBtc2cpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBSYW5nZUVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX3Rocm93X3N5bnRheF9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IFN5bnRheEVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19leGNlcHRpb25fcGVuZGluZyhlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXJyb3IoZW52LCBjb2RlLCBtc2csIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgbXNnVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG1zZykudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZ1ZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1zZ1ZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGVWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoY29kZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gY29kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKGVycm9yKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3R5cGVfZXJyb3IoZW52LCBjb2RlLCBtc2csIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgbXNnVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG1zZykudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZ1ZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IFR5cGVFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9yYW5nZV9lcnJvcihlbnYsIGNvZGUsIG1zZywgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBtc2dWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQobXNnKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbXNnVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgUmFuZ2VFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfc3ludGF4X2Vycm9yKGVudiwgY29kZSwgbXNnLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIG1zZ1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChtc2cpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtc2dWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBTeW50YXhFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYW5kX2NsZWFyX2xhc3RfZXhjZXB0aW9uKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCAxLCB0cnVlKTsgLy8gSURfVU5ERUZJTkVEXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGVyciA9IGVudk9iamVjdC50cnlDYXRjaC5leGNlcHRpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGVycik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2ZhdGFsX2Vycm9yKGxvY2F0aW9uLCBsb2NhdGlvbl9sZW4sIG1lc3NhZ2UsIG1lc3NhZ2VfbGVuKSB7XG4gICAgICAgICAgICB2YXIgbG9jYXRpb25TdHIgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGxvY2F0aW9uLCBsb2NhdGlvbl9sZW4pO1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2VTdHIgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKG1lc3NhZ2UsIG1lc3NhZ2VfbGVuKTtcbiAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5hcGkuZmF0YWxFcnJvcihsb2NhdGlvblN0ciwgbWVzc2FnZVN0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgnRkFUQUwgRVJST1I6ICcgKyBsb2NhdGlvblN0ciArICcgJyArIG1lc3NhZ2VTdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZmF0YWxfZXhjZXB0aW9uKGVudiwgZXJyKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChlcnIpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC50cmlnZ2VyRmF0YWxFeGNlcHRpb24oZXJyb3IudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvck1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2dldF9sYXN0X2Vycm9yX2luZm86IF9lbW5hcGlfZ2V0X2xhc3RfZXJyb3JfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2Vycm9yOiBuYXBpX2NyZWF0ZV9lcnJvcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3JhbmdlX2Vycm9yOiBuYXBpX2NyZWF0ZV9yYW5nZV9lcnJvcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3R5cGVfZXJyb3I6IG5hcGlfY3JlYXRlX3R5cGVfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX2ZhdGFsX2Vycm9yOiBuYXBpX2ZhdGFsX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9mYXRhbF9leGNlcHRpb246IG5hcGlfZmF0YWxfZXhjZXB0aW9uLFxuICAgICAgICAgICAgbmFwaV9nZXRfYW5kX2NsZWFyX2xhc3RfZXhjZXB0aW9uOiBuYXBpX2dldF9hbmRfY2xlYXJfbGFzdF9leGNlcHRpb24sXG4gICAgICAgICAgICBuYXBpX2lzX2V4Y2VwdGlvbl9wZW5kaW5nOiBuYXBpX2lzX2V4Y2VwdGlvbl9wZW5kaW5nLFxuICAgICAgICAgICAgbmFwaV90aHJvdzogbmFwaV90aHJvdyxcbiAgICAgICAgICAgIG5hcGlfdGhyb3dfZXJyb3I6IG5hcGlfdGhyb3dfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX3Rocm93X3JhbmdlX2Vycm9yOiBuYXBpX3Rocm93X3JhbmdlX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV90aHJvd190eXBlX2Vycm9yOiBuYXBpX3Rocm93X3R5cGVfZXJyb3IsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfc3ludGF4X2Vycm9yOiBub2RlX2FwaV9jcmVhdGVfc3ludGF4X2Vycm9yLFxuICAgICAgICAgICAgbm9kZV9hcGlfdGhyb3dfc3ludGF4X2Vycm9yOiBub2RlX2FwaV90aHJvd19zeW50YXhfZXJyb3JcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9mdW5jdGlvbihlbnYsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghY2IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGZyZXN1bHQgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJlc3VsdC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZnJlc3VsdC5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gZnJlc3VsdC5mO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZUhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShmKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlSGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfY2JfaW5mbyhlbnYsIGNiaW5mbywgYXJnYywgYXJndiwgdGhpc19hcmcsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFjYmluZm8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBjYmluZm9WYWx1ZSA9IGVtbmFwaUN0eC5zY29wZVN0b3JlLmdldChjYmluZm8pLmNhbGxiYWNrSW5mbztcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoYXJndikge1xuICAgICAgICAgICAgICAgIGlmICghYXJnYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnY1ZhbHVlID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKGFyZ2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSBjYmluZm9WYWx1ZS5hcmdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgYXJybGVuID0gYXJnY1ZhbHVlIDwgbGVuID8gYXJnY1ZhbHVlIDogbGVuO1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFycmxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChjYmluZm9WYWx1ZS5hcmdzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXJndiArIGkgKiA0LCBhcmdWYWwsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA8IGFyZ2NWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ2NWYWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhcmd2ICsgaSAqIDQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ2MpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoYXJnYywgY2JpbmZvVmFsdWUuYXJncy5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXNfYXJnKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGNiaW5mb1ZhbHVlLnRoaXopO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRoaXNfYXJnLCB2LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgY2JpbmZvVmFsdWUuZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2FsbF9mdW5jdGlvbihlbnYsIHJlY3YsIGZ1bmMsIGFyZ2MsIGFyZ3YsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlY3YpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYXJnYyA9IGFyZ2MgPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJndilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2OHJlY3YgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlY3YpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghZnVuYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgdjhmdW5jID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChmdW5jKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHY4ZnVuYyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICg7IGkgPCBhcmdjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFyZ3YgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFyZ1ZhbCkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdjhmdW5jLmFwcGx5KHY4cmVjdiwgYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX25ld19pbnN0YW5jZShlbnYsIGNvbnN0cnVjdG9yLCBhcmdjLCBhcmd2LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGFyZ2MgPSBhcmdjID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3YpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQ3RvciA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoY29uc3RydWN0b3IpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRSZWZsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdMaXN0ID0gQXJyYXkoYXJnYyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnTGlzdFtpXSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJnVmFsKS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXQgPSBSZWZsZWN0LmNvbnN0cnVjdChDdG9yLCBhcmdMaXN0LCBDdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkoYXJnYyArIDEpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzWzBdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnVmFsID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXJndiArIGkgKiA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaSArIDFdID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBCb3VuZEN0b3IgPSBDdG9yLmJpbmQuYXBwbHkoQ3RvciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBCb3VuZEN0b3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X25ld190YXJnZXQoZW52LCBjYmluZm8sIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFjYmluZm8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgY2JpbmZvVmFsdWUgPSBlbW5hcGlDdHguc2NvcGVTdG9yZS5nZXQoY2JpbmZvKS5jYWxsYmFja0luZm87XG4gICAgICAgICAgICB2YXIgdGhpeiA9IGNiaW5mb1ZhbHVlLnRoaXosIGZuID0gY2JpbmZvVmFsdWUuZm47XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGl6ID09IG51bGwgfHwgdGhpei5jb25zdHJ1Y3RvciA9PSBudWxsXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiB0aGl6IGluc3RhbmNlb2YgZm5cbiAgICAgICAgICAgICAgICAgICAgPyBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodGhpei5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jdGlvbk1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbGxfZnVuY3Rpb246IG5hcGlfY2FsbF9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2Z1bmN0aW9uOiBuYXBpX2NyZWF0ZV9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfZ2V0X2NiX2luZm86IG5hcGlfZ2V0X2NiX2luZm8sXG4gICAgICAgICAgICBuYXBpX2dldF9uZXdfdGFyZ2V0OiBuYXBpX2dldF9uZXdfdGFyZ2V0LFxuICAgICAgICAgICAgbmFwaV9uZXdfaW5zdGFuY2U6IG5hcGlfbmV3X2luc3RhbmNlXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5faGFuZGxlX3Njb3BlKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgc2NvcGUuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghc2NvcGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICgoZW52T2JqZWN0Lm9wZW5IYW5kbGVTY29wZXMgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEzIC8qIG5hcGlfc3RhdHVzLm5hcGlfaGFuZGxlX3Njb3BlX21pc21hdGNoICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5fZXNjYXBhYmxlX2hhbmRsZV9zY29wZShlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHNjb3BlLmlkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGUoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKChlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTMgLyogbmFwaV9zdGF0dXMubmFwaV9oYW5kbGVfc2NvcGVfbWlzbWF0Y2ggKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9lc2NhcGVfaGFuZGxlKGVudiwgc2NvcGUsIGVzY2FwZWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHNjb3BlT2JqZWN0ID0gZW1uYXBpQ3R4LnNjb3BlU3RvcmUuZ2V0KHNjb3BlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmplY3QuZXNjYXBlQ2FsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3SGFuZGxlID0gc2NvcGVPYmplY3QuZXNjYXBlKGVzY2FwZWUpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXdIYW5kbGUgPyBuZXdIYW5kbGUuaWQgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTIgLyogbmFwaV9zdGF0dXMubmFwaV9lc2NhcGVfY2FsbGVkX3R3aWNlICovKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3JlZmVyZW5jZShlbnYsIHZhbHVlLCBpbml0aWFsX3JlZmNvdW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPCAxMCkge1xuICAgICAgICAgICAgICAgIGlmICghKGhhbmRsZS5pc09iamVjdCgpIHx8IGhhbmRsZS5pc0Z1bmN0aW9uKCkgfHwgaGFuZGxlLmlzU3ltYm9sKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHJlZiA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2UoZW52T2JqZWN0LCBoYW5kbGUuaWQsIGluaXRpYWxfcmVmY291bnQgPj4+IDAsIDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCByZWYuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGVsZXRlX3JlZmVyZW5jZShlbnYsIHJlZikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIXJlZilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZWZlcmVuY2VfcmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgY291bnQgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikucmVmKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVmZXJlbmNlX3VucmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgdmFyIHJlZmNvdW50ID0gcmVmZXJlbmNlLnJlZmNvdW50KCk7XG4gICAgICAgICAgICBpZiAocmVmY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHJlZmVyZW5jZS51bnJlZigpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgY291bnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9yZWZlcmVuY2VfdmFsdWUoZW52LCByZWYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhhbmRsZUlkID0gcmVmZXJlbmNlLmdldChlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgaGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FkZF9lbnZfY2xlYW51cF9ob29rKGVudiwgZnVuLCBhcmcpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFmdW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5hZGRDbGVhbnVwSG9vayhlbnZPYmplY3QsIGZ1biwgYXJnKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVtb3ZlX2Vudl9jbGVhbnVwX2hvb2soZW52LCBmdW4sIGFyZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWZ1bilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlbW92ZUNsZWFudXBIb29rKGVudk9iamVjdCwgZnVuLCBhcmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW52X3JlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2Vudl91bnJlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlmZU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2Vudl9yZWY6IF9lbW5hcGlfZW52X3JlZixcbiAgICAgICAgICAgIF9lbW5hcGlfZW52X3VucmVmOiBfZW1uYXBpX2Vudl91bnJlZixcbiAgICAgICAgICAgIG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2s6IG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2ssXG4gICAgICAgICAgICBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfY2xvc2VfZXNjYXBhYmxlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlOiBuYXBpX2Nsb3NlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3JlZmVyZW5jZTogbmFwaV9jcmVhdGVfcmVmZXJlbmNlLFxuICAgICAgICAgICAgbmFwaV9kZWxldGVfcmVmZXJlbmNlOiBuYXBpX2RlbGV0ZV9yZWZlcmVuY2UsXG4gICAgICAgICAgICBuYXBpX2VzY2FwZV9oYW5kbGU6IG5hcGlfZXNjYXBlX2hhbmRsZSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3JlZmVyZW5jZV92YWx1ZTogbmFwaV9nZXRfcmVmZXJlbmNlX3ZhbHVlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfb3Blbl9lc2NhcGFibGVfaGFuZGxlX3Njb3BlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2hhbmRsZV9zY29wZTogbmFwaV9vcGVuX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfcmVmZXJlbmNlX3JlZjogbmFwaV9yZWZlcmVuY2VfcmVmLFxuICAgICAgICAgICAgbmFwaV9yZWZlcmVuY2VfdW5yZWY6IG5hcGlfcmVmZXJlbmNlX3VucmVmLFxuICAgICAgICAgICAgbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9vazogbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9va1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZ2V0X2ZpbGVuYW1lKGVudiwgYnVmLCBsZW4pIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBlbnZPYmplY3QuZmlsZW5hbWU7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubGVuZ3RoQnl0ZXNVVEY4KGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEY4KGZpbGVuYW1lLCBidWYsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pc2NlbGxhbmVvdXNNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgX2VtbmFwaV9nZXRfZmlsZW5hbWU6IF9lbW5hcGlfZ2V0X2ZpbGVuYW1lXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfcHJvbWlzZShlbnYsIGRlZmVycmVkLCBwcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3RJZCwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZmVycmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3QgPSBlbW5hcGlDdHguY3JlYXRlRGVmZXJyZWQoeyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRPYmplY3RJZCA9IGRlZmVycmVkT2JqZWN0LmlkO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkZWZlcnJlZCwgZGVmZXJyZWRPYmplY3RJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHApLmlkO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHByb21pc2UsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Jlc29sdmVfZGVmZXJyZWQoZW52LCBkZWZlcnJlZCwgcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZlcnJlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdXRpb24pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGRlZmVycmVkT2JqZWN0ID0gZW1uYXBpQ3R4LmRlZmVycmVkU3RvcmUuZ2V0KGRlZmVycmVkKTtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZE9iamVjdC5yZXNvbHZlKGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb2x1dGlvbikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVqZWN0X2RlZmVycmVkKGVudiwgZGVmZXJyZWQsIHJlc29sdXRpb24pIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZGVmZXJyZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHV0aW9uKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBkZWZlcnJlZE9iamVjdCA9IGVtbmFwaUN0eC5kZWZlcnJlZFN0b3JlLmdldChkZWZlcnJlZCk7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWRPYmplY3QucmVqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb2x1dGlvbikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfcHJvbWlzZShlbnYsIHZhbHVlLCBpc19wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIWlzX3Byb21pc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNQcm9taXNlKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGlzX3Byb21pc2UsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3Byb21pc2U6IG5hcGlfY3JlYXRlX3Byb21pc2UsXG4gICAgICAgICAgICBuYXBpX2lzX3Byb21pc2U6IG5hcGlfaXNfcHJvbWlzZSxcbiAgICAgICAgICAgIG5hcGlfcmVqZWN0X2RlZmVycmVkOiBuYXBpX3JlamVjdF9kZWZlcnJlZCxcbiAgICAgICAgICAgIG5hcGlfcmVzb2x2ZV9kZWZlcnJlZDogbmFwaV9yZXNvbHZlX2RlZmVycmVkXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcGlpaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzKGVudiwgb2JqZWN0LCBrZXlfbW9kZSwga2V5X2ZpbHRlciwga2V5X2NvbnZlcnNpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBvYmogPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleV9tb2RlICE9PSAwIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9pbmNsdWRlX3Byb3RvdHlwZXMgKi8gJiYga2V5X21vZGUgIT09IDEgLyogbmFwaV9rZXlfY29sbGVjdGlvbl9tb2RlLm5hcGlfa2V5X293bl9vbmx5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXlfY29udmVyc2lvbiAhPT0gMCAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X2tlZXBfbnVtYmVycyAqLyAmJiBrZXlfY29udmVyc2lvbiAhPT0gMSAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X251bWJlcnNfdG9fc3RyaW5ncyAqLykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIHN5bWJvbHMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGludGVnZXJJbmRpY2VSZWdleCA9IC9eKDB8WzEtOV1bMC05XSopJC87XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaW50ZWdlckluZGljZVJlZ2V4LnRlc3QobmFtZXNbaV0pID8gTnVtYmVyKG5hbWVzW2ldKSA6IG5hbWVzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBuYW1lc1tpXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duOiBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzeW1ib2xzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW1ib2xzW2ldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd246IG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9tb2RlID09PSAxIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9vd25fb25seSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9iaik7XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBhZGROYW1lID0gZnVuY3Rpb24gKHJldCwgbmFtZSwga2V5X2ZpbHRlciwgY29udmVyc2lvbl9tb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXQuaW5kZXhPZihuYW1lKSAhPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJzaW9uX21vZGUgPT09IDAgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9rZWVwX251bWJlcnMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnZlcnNpb25fbW9kZSA9PT0gMSAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X251bWJlcnNfdG9fc3RyaW5ncyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlYWxOYW1lID0gdHlwZW9mIG5hbWUgPT09ICdudW1iZXInID8gU3RyaW5nKG5hbWUpIDogbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhbE5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5X2ZpbHRlciAmIDggLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3NraXBfc3RyaW5ncyAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocmVhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHJlYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lXzEgPSBwcm9wLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXNjID0gcHJvcC5kZXNjO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2ZpbHRlciA9PT0gMCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfYWxsX3Byb3BlcnRpZXMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWUocmV0LCBuYW1lXzEsIGtleV9maWx0ZXIsIGtleV9jb252ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlfZmlsdGVyICYgOCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfc2tpcF9zdHJpbmdzICovICYmIHR5cGVvZiBuYW1lXzEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2ZpbHRlciAmIDE2IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9za2lwX3N5bWJvbHMgKi8gJiYgdHlwZW9mIG5hbWVfMSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaG91bGRBZGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlfZmlsdGVyICYgNykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLndyaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfZW51bWVyYWJsZSAqLzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGQgPSBCb29sZWFuKGRlc2MuZW51bWVyYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgxIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV93cml0YWJsZSAqLyB8IDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy53cml0YWJsZSAmJiBkZXNjLmVudW1lcmFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmNvbmZpZ3VyYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICg0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi8gfCAxIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV93cml0YWJsZSAqLyk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmNvbmZpZ3VyYWJsZSAmJiBkZXNjLndyaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKDQgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2NvbmZpZ3VyYWJsZSAqLyB8IDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy5lbnVtZXJhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKDQgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2NvbmZpZ3VyYWJsZSAqLyB8IDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8gfCAxIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV93cml0YWJsZSAqLyk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmNvbmZpZ3VyYWJsZSAmJiBkZXNjLmVudW1lcmFibGUgJiYgZGVzYy53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lKHJldCwgbmFtZV8xLCBrZXlfZmlsdGVyLCBrZXlfY29udmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHJldCkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9wcm9wZXJ0eV9uYW1lcyhlbnYsIG9iamVjdCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzKGVudiwgb2JqZWN0LCAwIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9pbmNsdWRlX3Byb3RvdHlwZXMgKi8sIDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8gfCAxNiAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfc2tpcF9zeW1ib2xzICovLCAxIC8qIG5hcGlfa2V5X2NvbnZlcnNpb24ubmFwaV9rZXlfbnVtYmVyc190b19zdHJpbmdzICovLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaC52YWx1ZVtlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWVdID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSAoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlIGluIHYpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodltlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWVdKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2RlbGV0ZV9wcm9wZXJ0eShlbnYsIG9iamVjdCwga2V5LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5S2V5ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0UmVmbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICByID0gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShoLnZhbHVlLCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgciA9IGRlbGV0ZSBoLnZhbHVlW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIgPyAxIDogMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2hhc19vd25fcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3AgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcHJvcCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoa2V5KS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfbmFtZWRfcHJvcGVydHkoZW52LCBvYmplY3QsIGNuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KS52YWx1ZVtlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGNuYW1lLCAtMSldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX25hbWVkX3Byb3BlcnR5KGVudiwgb2JqZWN0LCB1dGY4bmFtZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdXRmOG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyh1dGY4bmFtZSwgLTEpIGluIHY7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfbmFtZWRfcHJvcGVydHkoZW52LCBvYmplY3QsIHV0ZjhuYW1lLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdXRmOG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodltlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCAtMSldKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3NldF9lbGVtZW50KGVudiwgb2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaC52YWx1ZVtpbmRleCA+Pj4gMF0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9oYXNfZWxlbWVudChlbnYsIG9iamVjdCwgaW5kZXgsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSAoKGluZGV4ID4+PiAwKSBpbiB2KSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9lbGVtZW50KGVudiwgb2JqZWN0LCBpbmRleCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZCh2W2luZGV4ID4+PiAwXSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfZWxlbWVudChlbnYsIG9iamVjdCwgaW5kZXgsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydFJlZmxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgciA9IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoaC52YWx1ZSwgaW5kZXggPj4+IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBkZWxldGUgaC52YWx1ZVtpbmRleCA+Pj4gMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWZpbmVfcHJvcGVydGllcyhlbnYsIG9iamVjdCwgcHJvcGVydHlfY291bnQsIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwcm9wUHRyLCBhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlfY291bnQgPSBwcm9wZXJ0eV9jb3VudCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBtYXliZU9iamVjdCA9IGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlfY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHByb3BQdHIgPSBwcm9wZXJ0aWVzICsgKGkgKiAoNCAqIDgpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHV0ZjhOYW1lID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lXzIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgOCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBnZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2V0dGVyID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDE2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDIwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAyNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0ZjhOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhOYW1lLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWVfMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDQgLyogbmFwaV9zdGF0dXMubmFwaV9uYW1lX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQobmFtZV8yKS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlOYW1lICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcHJvcGVydHlOYW1lICE9PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDQgLyogbmFwaV9zdGF0dXMubmFwaV9uYW1lX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlEZWZpbmVQcm9wZXJ0eShlbnZPYmplY3QsIG1heWJlT2JqZWN0LCBwcm9wZXJ0eU5hbWUsIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIHZhbHVlLCBhdHRyaWJ1dGVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29iamVjdF9mcmVlemUoZW52LCBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBtYXliZU9iamVjdCA9IGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShtYXliZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29iamVjdF9zZWFsKGVudiwgb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgbWF5YmVPYmplY3QgPSBoLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghKGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5zZWFsKG1heWJlT2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9wZXJ0eU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2RlZmluZV9wcm9wZXJ0aWVzOiBuYXBpX2RlZmluZV9wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgbmFwaV9kZWxldGVfZWxlbWVudDogbmFwaV9kZWxldGVfZWxlbWVudCxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX3Byb3BlcnR5OiBuYXBpX2RlbGV0ZV9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2FsbF9wcm9wZXJ0eV9uYW1lczogbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzLFxuICAgICAgICAgICAgbmFwaV9nZXRfZWxlbWVudDogbmFwaV9nZXRfZWxlbWVudCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X25hbWVkX3Byb3BlcnR5OiBuYXBpX2dldF9uYW1lZF9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3Byb3BlcnR5OiBuYXBpX2dldF9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3Byb3BlcnR5X25hbWVzOiBuYXBpX2dldF9wcm9wZXJ0eV9uYW1lcyxcbiAgICAgICAgICAgIG5hcGlfaGFzX2VsZW1lbnQ6IG5hcGlfaGFzX2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX2hhc19uYW1lZF9wcm9wZXJ0eTogbmFwaV9oYXNfbmFtZWRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2hhc19vd25fcHJvcGVydHk6IG5hcGlfaGFzX293bl9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfaGFzX3Byb3BlcnR5OiBuYXBpX2hhc19wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfb2JqZWN0X2ZyZWV6ZTogbmFwaV9vYmplY3RfZnJlZXplLFxuICAgICAgICAgICAgbmFwaV9vYmplY3Rfc2VhbDogbmFwaV9vYmplY3Rfc2VhbCxcbiAgICAgICAgICAgIG5hcGlfc2V0X2VsZW1lbnQ6IG5hcGlfc2V0X2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX3NldF9uYW1lZF9wcm9wZXJ0eTogbmFwaV9zZXRfbmFtZWRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX3NldF9wcm9wZXJ0eTogbmFwaV9zZXRfcHJvcGVydHlcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3J1bl9zY3JpcHQoZW52LCBzY3JpcHQsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIHN0YXR1cztcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghc2NyaXB0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciB2OFNjcmlwdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXY4U2NyaXB0LmlzU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBnID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCg1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi8pLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciByZXQgPSBnLmV2YWwodjhTY3JpcHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXQpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NyaXB0TW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfcnVuX3NjcmlwdDogbmFwaV9ydW5fc2NyaXB0XG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90eXBlb2YoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKHYuaXNOdW1iZXIoKSkge1xuICAgICAgICAgICAgICAgIHIgPSAzIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfbnVtYmVyICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDkgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9iaWdpbnQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICByID0gNCAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX3N0cmluZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGhhcyB0byBjb21lIGJlZm9yZSBJc09iamVjdCBiZWNhdXNlIElzRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBpbXBsaWVzIElzT2JqZWN0XG4gICAgICAgICAgICAgICAgciA9IDcgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9mdW5jdGlvbiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNFeHRlcm5hbCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGhhcyB0byBjb21lIGJlZm9yZSBJc09iamVjdCBiZWNhdXNlIElzRXh0ZXJuYWxcbiAgICAgICAgICAgICAgICAvLyBpbXBsaWVzIElzT2JqZWN0XG4gICAgICAgICAgICAgICAgciA9IDggLyogbmFwaV92YWx1ZXR5cGUubmFwaV9leHRlcm5hbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNPYmplY3QoKSkge1xuICAgICAgICAgICAgICAgIHIgPSA2IC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfb2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0Jvb2xlYW4oKSkge1xuICAgICAgICAgICAgICAgIHIgPSAyIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfYm9vbGVhbiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNVbmRlZmluZWQoKSkge1xuICAgICAgICAgICAgICAgIHIgPSAwIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfdW5kZWZpbmVkICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc1N5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDUgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9zeW1ib2wgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzTnVsbCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHIgPSAxIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfbnVsbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgZ2V0IGhlcmUgdW5sZXNzIFY4IGhhcyBhZGRlZCBzb21lIG5ldyBraW5kIG9mIHZhbHVlLlxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fYm9vbChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdiA9IGhhbmRsZS52YWx1ZSA/IDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8gOiAzIC8qIEdsb2JhbEhhbmRsZS5GQUxTRSAqLztcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fbnVtYmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmlzQmlnSW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBCaWdJbnQgdmFsdWUgdG8gYSBudW1iZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoTnVtYmVyKGhhbmRsZS52YWx1ZSkpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NvZXJjZV90b19vYmplY3QoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQoT2JqZWN0KGhhbmRsZS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NvZXJjZV90b19zdHJpbmcoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuaXNTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShTdHJpbmcoaGFuZGxlLnZhbHVlKSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2luc3RhbmNlb2YoZW52LCBvYmplY3QsIGNvbnN0cnVjdG9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgY3RvciA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgICAgIGlmICghY3Rvci5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNSAvKiBuYXBpX3N0YXR1cy5uYXBpX2Z1bmN0aW9uX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KS52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdmFsIGluc3RhbmNlb2YgY3Rvci52YWx1ZTtcbiAgICAgICAgICAgICAgICByID0gcmV0ID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfYXJyYXkoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0FycmF5KCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfYXJyYXlidWZmZXIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0FycmF5QnVmZmVyKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZGF0ZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzRGF0ZSgpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2Vycm9yKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gKHZhbCBpbnN0YW5jZW9mIEVycm9yKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc190eXBlZGFycmF5KGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNUeXBlZEFycmF5KCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfYnVmZmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNCdWZmZXIoZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19kYXRhdmlldyhlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzRGF0YVZpZXcoKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc3RyaWN0X2VxdWFscyhlbnYsIGxocywgcmhzLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyaHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGx2ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChsaHMpLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBydiA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmhzKS52YWx1ZTtcbiAgICAgICAgICAgICAgICByID0gKGx2ID09PSBydikgPyAxIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGV0YWNoX2FycmF5YnVmZmVyKGVudiwgYXJyYXlidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJyYXlidWZmZXIpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmICh2YWx1ZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyMCAvKiBuYXBpX3N0YXR1cy5uYXBpX2RldGFjaGFibGVfYXJyYXlidWZmZXJfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2FycmF5YnVmZmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIE1lc3NhZ2VDaGFubmVsXzEgPSBlbW5hcGlDdHguZmVhdHVyZS5NZXNzYWdlQ2hhbm5lbDtcbiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZUNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWxfMSgpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKHZhbHVlLCBbdmFsdWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZGV0YWNoZWRfYXJyYXlidWZmZXIoZW52LCBhcnJheWJ1ZmZlciwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoaC5pc0FycmF5QnVmZmVyKCkgJiYgaC52YWx1ZS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVPcGVyYXRpb25Nb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fYm9vbDogbmFwaV9jb2VyY2VfdG9fYm9vbCxcbiAgICAgICAgICAgIG5hcGlfY29lcmNlX3RvX251bWJlcjogbmFwaV9jb2VyY2VfdG9fbnVtYmVyLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fb2JqZWN0OiBuYXBpX2NvZXJjZV90b19vYmplY3QsXG4gICAgICAgICAgICBuYXBpX2NvZXJjZV90b19zdHJpbmc6IG5hcGlfY29lcmNlX3RvX3N0cmluZyxcbiAgICAgICAgICAgIG5hcGlfZGV0YWNoX2FycmF5YnVmZmVyOiBuYXBpX2RldGFjaF9hcnJheWJ1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfaW5zdGFuY2VvZjogbmFwaV9pbnN0YW5jZW9mLFxuICAgICAgICAgICAgbmFwaV9pc19hcnJheTogbmFwaV9pc19hcnJheSxcbiAgICAgICAgICAgIG5hcGlfaXNfYXJyYXlidWZmZXI6IG5hcGlfaXNfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2J1ZmZlcjogbmFwaV9pc19idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2RhdGF2aWV3OiBuYXBpX2lzX2RhdGF2aWV3LFxuICAgICAgICAgICAgbmFwaV9pc19kYXRlOiBuYXBpX2lzX2RhdGUsXG4gICAgICAgICAgICBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyOiBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9pc19lcnJvcjogbmFwaV9pc19lcnJvcixcbiAgICAgICAgICAgIG5hcGlfaXNfdHlwZWRhcnJheTogbmFwaV9pc190eXBlZGFycmF5LFxuICAgICAgICAgICAgbmFwaV9zdHJpY3RfZXF1YWxzOiBuYXBpX3N0cmljdF9lcXVhbHMsXG4gICAgICAgICAgICBuYXBpX3R5cGVvZjogbmFwaV90eXBlb2ZcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZlcnNpb24oZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggPSAxMCAvKiBWZXJzaW9uLk5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCAqLztcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2ZXJzaW9uTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZlcnNpb246IG5hcGlfZ2V0X3ZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGVtbmFwaUFXU1QuaW5pdCgpO1xuICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS5pbml0KCk7XG4gICAgICAgIGVtbmFwaVN0cmluZy5pbml0KCk7XG4gICAgICAgIGVtbmFwaVRTRk4uaW5pdCgpO1xuICAgICAgICBQVGhyZWFkLmluaXQoKTtcbiAgICAgICAgbmFwaU1vZHVsZS5lbW5hcGkuc3luY01lbW9yeSA9ICRlbW5hcGlTeW5jTWVtb3J5O1xuICAgICAgICBuYXBpTW9kdWxlLmVtbmFwaS5nZXRNZW1vcnlBZGRyZXNzID0gJGVtbmFwaUdldE1lbW9yeUFkZHJlc3M7XG4gICAgICAgIGZ1bmN0aW9uIGFkZEltcG9ydHMobW9kKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG1vZCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB2YXIgayA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGsuaW5kZXhPZignJCcpID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoay5pbmRleE9mKCdlbW5hcGlfJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLmVtbmFwaVtrXSA9IG1vZFtrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdfZW1uYXBpXycpID09PSAwIHx8IGsgPT09ICduYXBpX3NldF9sYXN0X2Vycm9yJyB8fCBrID09PSAnbmFwaV9jbGVhcl9sYXN0X2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICBuYXBpTW9kdWxlLmltcG9ydHMuZW52W2tdID0gbW9kW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGlba10gPSBtb2Rba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFkZEltcG9ydHMoYXN5bmNNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKG1lbW9yeU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoYXN5bmNXb3JrTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh1dGlsTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhjb252ZXJ0MmNNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGNvbnZlcnQybmFwaU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoY3JlYXRlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhnbG9iYWxNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHdyYXBNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGVudk1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZW1uYXBpTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhlcnJvck1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZnVuY3Rpb25Nb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGxpZmVNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKG1pc2NlbGxhbmVvdXNNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKG5vZGVNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHByb21pc2VNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHByb3BlcnR5TW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhzY3JpcHRNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHZhbHVlT3BlcmF0aW9uTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh2ZXJzaW9uTW9kKTtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9jcmVhdGVfdGhyZWFkc2FmZV9mdW5jdGlvbiA9IG5hcGlfY3JlYXRlX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfZ2V0X3RocmVhZHNhZmVfZnVuY3Rpb25fY29udGV4dCA9IG5hcGlfZ2V0X3RocmVhZHNhZmVfZnVuY3Rpb25fY29udGV4dDtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9jYWxsX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX2NhbGxfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9hY3F1aXJlX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX2FjcXVpcmVfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9yZWxlYXNlX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX3JlbGVhc2VfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV91bnJlZl90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV91bnJlZl90aHJlYWRzYWZlX2Z1bmN0aW9uO1xuICAgICAgICBuYXBpTW9kdWxlLmltcG9ydHMubmFwaS5uYXBpX3JlZl90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgcmV0dXJuIG5hcGlNb2R1bGU7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gbmFwaU1vZHVsZTtcbn1cblxuZnVuY3Rpb24gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRGbiwgdXNlck5hcGlNb2R1bGUsIHdhc21JbnB1dCwgb3B0aW9ucykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcbiAgICBvcHRpb25zID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgdmFyIGdldE1lbW9yeSA9IG9wdGlvbnMuZ2V0TWVtb3J5O1xuICAgIHZhciBnZXRUYWJsZSA9IG9wdGlvbnMuZ2V0VGFibGU7XG4gICAgdmFyIGJlZm9yZUluaXQgPSBvcHRpb25zLmJlZm9yZUluaXQ7XG4gICAgaWYgKGdldE1lbW9yeSAhPSBudWxsICYmIHR5cGVvZiBnZXRNZW1vcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5nZXRNZW1vcnkgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKGdldFRhYmxlICE9IG51bGwgJiYgdHlwZW9mIGdldFRhYmxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuZ2V0VGFibGUgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKGJlZm9yZUluaXQgIT0gbnVsbCAmJiB0eXBlb2YgYmVmb3JlSW5pdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLmJlZm9yZUluaXQgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdmFyIG5hcGlNb2R1bGU7XG4gICAgdmFyIGlzTG9hZCA9IHR5cGVvZiB1c2VyTmFwaU1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdXNlck5hcGlNb2R1bGUgIT09IG51bGw7XG4gICAgaWYgKGlzTG9hZCkge1xuICAgICAgICBpZiAodXNlck5hcGlNb2R1bGUubG9hZGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25hcGlNb2R1bGUgaGFzIGFscmVhZHkgbG9hZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZSA9IHVzZXJOYXBpTW9kdWxlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmFwaU1vZHVsZSA9IGNyZWF0ZU5hcGlNb2R1bGUob3B0aW9ucyk7XG4gICAgfVxuICAgIHZhciB3YXNpID0gb3B0aW9ucy53YXNpO1xuICAgIHZhciB3YXNpVGhyZWFkcztcbiAgICB2YXIgaW1wb3J0T2JqZWN0ID0ge1xuICAgICAgICBlbnY6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbnYsXG4gICAgICAgIG5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLFxuICAgICAgICBlbW5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbW5hcGlcbiAgICB9O1xuICAgIGlmICh3YXNpKSB7XG4gICAgICAgIHdhc2lUaHJlYWRzID0gbmV3IFdBU0lUaHJlYWRzKG5hcGlNb2R1bGUuY2hpbGRUaHJlYWRcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHdhc2k6IHdhc2ksXG4gICAgICAgICAgICAgICAgY2hpbGRUaHJlYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIHdhc2k6IHdhc2ksXG4gICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcjogbmFwaU1vZHVsZS5QVGhyZWFkLFxuICAgICAgICAgICAgICAgIHdhaXRUaHJlYWRTdGFydDogbmFwaU1vZHVsZS53YWl0VGhyZWFkU3RhcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKGltcG9ydE9iamVjdCwgdHlwZW9mIHdhc2kuZ2V0SW1wb3J0T2JqZWN0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHdhc2kuZ2V0SW1wb3J0T2JqZWN0KClcbiAgICAgICAgICAgIDogeyB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiB3YXNpLndhc2lJbXBvcnQgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaW1wb3J0T2JqZWN0LCB3YXNpVGhyZWFkcy5nZXRJbXBvcnRPYmplY3QoKSk7XG4gICAgfVxuICAgIHZhciBvdmVyd3JpdGVJbXBvcnRzID0gb3B0aW9ucy5vdmVyd3JpdGVJbXBvcnRzO1xuICAgIGlmICh0eXBlb2Ygb3ZlcndyaXRlSW1wb3J0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbmV3SW1wb3J0T2JqZWN0ID0gb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG5ld0ltcG9ydE9iamVjdCA9PT0gJ29iamVjdCcgJiYgbmV3SW1wb3J0T2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpbXBvcnRPYmplY3QgPSBuZXdJbXBvcnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvYWRGbih3YXNtSW5wdXQsIGltcG9ydE9iamVjdCwgZnVuY3Rpb24gKGVyciwgc291cmNlKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3JpZ2luYWxJbnN0YW5jZSA9IHNvdXJjZS5pbnN0YW5jZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gb3JpZ2luYWxJbnN0YW5jZTtcbiAgICAgICAgdmFyIG9yaWdpbmFsRXhwb3J0cyA9IG9yaWdpbmFsSW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgdmFyIGV4cG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIG9yaWdpbmFsRXhwb3J0cztcbiAgICAgICAgdmFyIGltcG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIGltcG9ydE9iamVjdC5lbnY7XG4gICAgICAgIHZhciBtZW1vcnkgPSBnZXRNZW1vcnlcbiAgICAgICAgICAgID8gZ2V0TWVtb3J5KG9yaWdpbmFsRXhwb3J0cylcbiAgICAgICAgICAgIDogZXhwb3J0TWVtb3J5XG4gICAgICAgICAgICAgICAgPyBvcmlnaW5hbEV4cG9ydHMubWVtb3J5XG4gICAgICAgICAgICAgICAgOiBpbXBvcnRNZW1vcnlcbiAgICAgICAgICAgICAgICAgICAgPyBpbXBvcnRPYmplY3QuZW52Lm1lbW9yeVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFtZW1vcnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWVtb3J5IGlzIG5laXRoZXIgZXhwb3J0ZWQgbm9yIGltcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhYmxlID0gZ2V0VGFibGUgPyBnZXRUYWJsZShvcmlnaW5hbEV4cG9ydHMpIDogb3JpZ2luYWxFeHBvcnRzLl9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGU7XG4gICAgICAgIGlmICh3YXNpICYmICFleHBvcnRNZW1vcnkpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRzXzEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleHBvcnRzXzEsIG9yaWdpbmFsRXhwb3J0cywgeyBtZW1vcnk6IG1lbW9yeSB9KTtcbiAgICAgICAgICAgIGluc3RhbmNlID0geyBleHBvcnRzOiBleHBvcnRzXzEgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kdWxlID0gc291cmNlLm1vZHVsZTtcbiAgICAgICAgaWYgKHdhc2kpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gd2FzaVRocmVhZHMuaW5pdGlhbGl6ZShpbnN0YW5jZSwgbW9kdWxlLCBtZW1vcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmFwaU1vZHVsZS5QVGhyZWFkLnNldHVwKG1vZHVsZSwgbWVtb3J5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpSW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVJbml0KSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlSW5pdCh7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBvcmlnaW5hbEluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFwaU1vZHVsZS5pbml0KHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGUsXG4gICAgICAgICAgICAgICAgbWVtb3J5OiBtZW1vcnksXG4gICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2U6IG9yaWdpbmFsSW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGUsXG4gICAgICAgICAgICAgICAgdXNlZEluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghaXNMb2FkKSB7XG4gICAgICAgICAgICAgICAgcmV0Lm5hcGlNb2R1bGUgPSBuYXBpTW9kdWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5hcGlNb2R1bGUuUFRocmVhZC5zaG91bGRQcmVsb2FkV29ya2VycygpKSB7XG4gICAgICAgICAgICB2YXIgcG9vbFJlYWR5ID0gbmFwaU1vZHVsZS5QVGhyZWFkLmxvYWRXYXNtTW9kdWxlVG9BbGxXb3JrZXJzKCk7XG4gICAgICAgICAgICBpZiAobG9hZEZuID09PSBsb2FkQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9vbFJlYWR5LnRoZW4oZW1uYXBpSW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIGxvYWRpbmcgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHdvcmtlciBwb29sIChyZXVzZVdvcmtlci5zaXplID4gMCknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW1uYXBpSW5pdCgpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gbG9hZENhbGxiYWNrKHdhc21JbnB1dCwgaW1wb3J0T2JqZWN0LCBjYWxsYmFjaykge1xuICAgIHJldHVybiBsb2FkKHdhc21JbnB1dCwgaW1wb3J0T2JqZWN0KS50aGVuKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHNvdXJjZSk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGxvYWRTeW5jQ2FsbGJhY2sod2FzbUlucHV0LCBpbXBvcnRPYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNvdXJjZTtcbiAgICB0cnkge1xuICAgICAgICBzb3VyY2UgPSBsb2FkU3luYyh3YXNtSW5wdXQsIGltcG9ydE9iamVjdCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGxvYWROYXBpTW9kdWxlKG5hcGlNb2R1bGUsIFxuLyoqIE9ubHkgc3VwcG9ydCBgQnVmZmVyU291cmNlYCBvciBgV2ViQXNzZW1ibHkuTW9kdWxlYCBvbiBOb2RlLmpzICovXG53YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG5hcGlNb2R1bGUgIT09ICdvYmplY3QnIHx8IG5hcGlNb2R1bGUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBuYXBpTW9kdWxlJyk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkTmFwaU1vZHVsZUltcGwobG9hZENhbGxiYWNrLCBuYXBpTW9kdWxlLCB3YXNtSW5wdXQsIG9wdGlvbnMpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGxvYWROYXBpTW9kdWxlU3luYyhuYXBpTW9kdWxlLCB3YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG5hcGlNb2R1bGUgIT09ICdvYmplY3QnIHx8IG5hcGlNb2R1bGUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBuYXBpTW9kdWxlJyk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkTmFwaU1vZHVsZUltcGwobG9hZFN5bmNDYWxsYmFjaywgbmFwaU1vZHVsZSwgd2FzbUlucHV0LCBvcHRpb25zKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBpbnN0YW50aWF0ZU5hcGlNb2R1bGUoXG4vKiogT25seSBzdXBwb3J0IGBCdWZmZXJTb3VyY2VgIG9yIGBXZWJBc3NlbWJseS5Nb2R1bGVgIG9uIE5vZGUuanMgKi9cbndhc21JbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBsb2FkTmFwaU1vZHVsZUltcGwobG9hZENhbGxiYWNrLCB1bmRlZmluZWQsIHdhc21JbnB1dCwgb3B0aW9ucyk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyh3YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRTeW5jQ2FsbGJhY2ssIHVuZGVmaW5lZCwgd2FzbUlucHV0LCBvcHRpb25zKTtcbn1cblxuLyoqIEBwdWJsaWMgKi9cbnZhciBNZXNzYWdlSGFuZGxlciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWVzc2FnZUhhbmRsZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWVzc2FnZUhhbmRsZXIob3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25Mb2FkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLm9uTG9hZCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgb3B0aW9ucykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFwaU1vZHVsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuaW5zdGFudGlhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5vbkxvYWQoZGF0YSk7XG4gICAgICAgIHZhciB0aGVuID0gc291cmNlLnRoZW47XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5uYXBpTW9kdWxlID0gcmVzdWx0Lm5hcGlNb2R1bGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmFwaU1vZHVsZSA9IHNvdXJjZS5uYXBpTW9kdWxlO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG4gICAgTWVzc2FnZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5oYW5kbGUuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgaWYgKChfYSA9IGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX19lbW5hcGlfXykge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBlLmRhdGEuX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgdmFyIHBheWxvYWRfMSA9IGUuZGF0YS5fX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmtlci1pbml0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWZ0ZXJMb2FkKGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubmFwaU1vZHVsZS5pbml0V29ya2VyKHBheWxvYWRfMS5hcmcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmstZXhlY3V0ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFmdGVyTG9hZChlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm5hcGlNb2R1bGUuZXhlY3V0ZUFzeW5jV29yayhwYXlsb2FkXzEud29yayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBNZXNzYWdlSGFuZGxlcjtcbn0oVGhyZWFkTWVzc2FnZUhhbmRsZXIpKTtcblxudmFyIHZlcnNpb24gPSBcIjEuNC4zXCI7XG5cbmV4cG9ydCB7IE1lc3NhZ2VIYW5kbGVyLCBjcmVhdGVOYXBpTW9kdWxlLCBpbnN0YW50aWF0ZU5hcGlNb2R1bGUsIGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsIGxvYWROYXBpTW9kdWxlLCBsb2FkTmFwaU1vZHVsZVN5bmMsIHZlcnNpb24gfTtcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gJ3RzbGliJztcblxudmFyIGV4dGVybmFsVmFsdWUgPSBuZXcgV2Vha01hcCgpO1xuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGlzRXh0ZXJuYWwob2JqZWN0KSB7XG4gICAgcmV0dXJuIGV4dGVybmFsVmFsdWUuaGFzKG9iamVjdCk7XG59XG4vKiogQHB1YmxpYyAqLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZGVjbGFyZVxudmFyIEV4dGVybmFsID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFeHRlcm5hbCh2YWx1ZSkge1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbnVsbCk7XG4gICAgICAgIGV4dGVybmFsVmFsdWUuc2V0KHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gICAgRXh0ZXJuYWwucHJvdG90eXBlID0gbnVsbDtcbiAgICByZXR1cm4gRXh0ZXJuYWw7XG59KSgpO1xuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGdldEV4dGVybmFsVmFsdWUoZXh0ZXJuYWwpIHtcbiAgICBpZiAoIWlzRXh0ZXJuYWwoZXh0ZXJuYWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdCBleHRlcm5hbCcpO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZXJuYWxWYWx1ZS5nZXQoZXh0ZXJuYWwpO1xufVxuXG52YXIgc3VwcG9ydE5ld0Z1bmN0aW9uID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBmO1xuICAgIHRyeSB7XG4gICAgICAgIGYgPSBuZXcgRnVuY3Rpb24oKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbic7XG59KSgpO1xudmFyIF9nbG9iYWwgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXM7XG4gICAgdmFyIGcgPSAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKTtcbiAgICBpZiAoIWcgJiYgc3VwcG9ydE5ld0Z1bmN0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBnID0gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgIH1cbiAgICBpZiAoIWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gICAgcmV0dXJuIGc7XG59KSgpO1xudmFyIFRyeUNhdGNoID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyeUNhdGNoKCkge1xuICAgICAgICB0aGlzLl9leGNlcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhdWdodCA9IGZhbHNlO1xuICAgIH1cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9jYXVnaHQ7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuaGFzQ2F1Z2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2F1Z2h0O1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLmV4Y2VwdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2VwdGlvbjtcbiAgICB9O1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5zZXRFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5fY2F1Z2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZXhjZXB0aW9uID0gZXJyO1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jYXVnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLmV4dHJhY3RFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5fZXhjZXB0aW9uO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH07XG4gICAgcmV0dXJuIFRyeUNhdGNoO1xufSgpKTtcbnZhciBjYW5TZXRGdW5jdGlvbk5hbWUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKChfYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRnVuY3Rpb24ucHJvdG90eXBlLCAnbmFtZScpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29uZmlndXJhYmxlKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pKCk7XG52YXIgc3VwcG9ydFJlZmxlY3QgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCc7XG52YXIgc3VwcG9ydEZpbmFsaXplciA9ICh0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFdlYWtSZWYgIT09ICd1bmRlZmluZWQnKTtcbnZhciBzdXBwb3J0V2Vha1N5bWJvbCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3ltYm9sLWRlc2NyaXB0aW9uXG4gICAgICAgIHZhciBzeW0gPSBTeW1ib2woKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICBuZXcgV2Vha1JlZihzeW0pO1xuICAgICAgICBuZXcgV2Vha01hcCgpLnNldChzeW0sIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59KSgpO1xudmFyIHN1cHBvcnRCaWdJbnQgPSB0eXBlb2YgQmlnSW50ICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGlzUmVmZXJlbmNlVHlwZSh2KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCkgfHwgdHlwZW9mIHYgPT09ICdmdW5jdGlvbic7XG59XG52YXIgX3JlcXVpcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hdGl2ZVJlcXVpcmU7XG4gICAgaWYgKHR5cGVvZiBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbmF0aXZlUmVxdWlyZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fICE9PSAndW5kZWZpbmVkJyA/IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIDogdW5kZWZpbmVkO1xuICAgICAgICB9KSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmF0aXZlUmVxdWlyZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIF9fd2VicGFja19wdWJsaWNfcGF0aF9fICE9PSAndW5kZWZpbmVkJyA/ICh0eXBlb2YgX19ub25fd2VicGFja19yZXF1aXJlX18gIT09ICd1bmRlZmluZWQnID8gX19ub25fd2VicGFja19yZXF1aXJlX18gOiB1bmRlZmluZWQpIDogKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUgOiB1bmRlZmluZWQpO1xuICAgICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gbmF0aXZlUmVxdWlyZTtcbn0pKCk7XG52YXIgX01lc3NhZ2VDaGFubmVsID0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAnZnVuY3Rpb24nXG4gICAgPyBNZXNzYWdlQ2hhbm5lbFxuICAgIDogLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlKCd3b3JrZXJfdGhyZWFkcycpLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KSgpO1xudmFyIF9zZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nXG4gICAgPyBzZXRJbW1lZGlhdGVcbiAgICA6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgICAgIHZhciBjaGFubmVsXzEgPSBuZXcgX01lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgICAgICBjaGFubmVsXzEucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNoYW5uZWxfMS5wb3J0MS5vbm1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNoYW5uZWxfMSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoYW5uZWxfMS5wb3J0Mi5wb3N0TWVzc2FnZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICAgICAgICB9XG4gICAgfTtcbnZhciBfQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gQnVmZmVyXG4gICAgOiAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gX3JlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSkoKTtcbnZhciB2ZXJzaW9uID0gXCIxLjQuM1wiO1xudmFyIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiA9IDEgLyogVmVyc2lvbi5OT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NSU4gKi87XG52YXIgTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYID0gMTAgLyogVmVyc2lvbi5OT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggKi87XG52YXIgTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCA9IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovO1xudmFyIE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OID0gOCAvKiBWZXJzaW9uLk5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OICovO1xuXG52YXIgSGFuZGxlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhhbmRsZShpZCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIEhhbmRsZS5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldEV4dGVybmFsVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzTnVtYmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0JpZ0ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYmlnaW50JztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNFeHRlcm5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGlzRXh0ZXJuYWwodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdvYmplY3QnICYmIHRoaXMudmFsdWUgIT09IG51bGw7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy52YWx1ZSkpICYmICEodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3KTtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNCdWZmZXIgPSBmdW5jdGlvbiAoQnVmZmVyQ29uc3RydWN0b3IpIHtcbiAgICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLnZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBCdWZmZXJDb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiBCdWZmZXJDb25zdHJ1Y3RvciAhPT0gdm9pZCAwID8gQnVmZmVyQ29uc3RydWN0b3IgOiAoQnVmZmVyQ29uc3RydWN0b3IgPSBfQnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBCdWZmZXJDb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiBCdWZmZXJDb25zdHJ1Y3Rvci5pc0J1ZmZlcih0aGlzLnZhbHVlKTtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNEYXRhVmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgRGF0YVZpZXcpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc1Byb21pc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0Jvb2xlYW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNTeW1ib2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N5bWJvbCc7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzTnVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IG51bGw7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gSGFuZGxlO1xufSgpKTtcbnZhciBDb25zdEhhbmRsZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29uc3RIYW5kbGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29uc3RIYW5kbGUoaWQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBpZCwgdmFsdWUpIHx8IHRoaXM7XG4gICAgfVxuICAgIENvbnN0SGFuZGxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIHJldHVybiBDb25zdEhhbmRsZTtcbn0oSGFuZGxlKSk7XG52YXIgSGFuZGxlU3RvcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSGFuZGxlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlVOREVGSU5FRCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLk5VTEwsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5GQUxTRSxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlRSVUUsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5HTE9CQUxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5fbmV4dCA9IEhhbmRsZVN0b3JlLk1JTl9JRDtcbiAgICB9XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgaWYgKG5leHQgPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoID0gdmFsdWVzW25leHRdO1xuICAgICAgICAgICAgaC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaCA9IG5ldyBIYW5kbGUobmV4dCwgdmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVzW25leHRdID0gaDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZXh0Kys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmVyYXNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdGhpcy5fbmV4dCA9IHN0YXJ0O1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgdmFsdWVzW2ldLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIEhhbmRsZVN0b3JlLnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgdmFyIGggPSB2YWx1ZXNbYV07XG4gICAgICAgIHZhbHVlc1thXSA9IHZhbHVlc1tiXTtcbiAgICAgICAgdmFsdWVzW2FdLmlkID0gTnVtYmVyKGEpO1xuICAgICAgICB2YWx1ZXNbYl0gPSBoO1xuICAgICAgICBoLmlkID0gTnVtYmVyKGIpO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgICAgIHRoaXMuX25leHQgPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgfTtcbiAgICBIYW5kbGVTdG9yZS5VTkRFRklORUQgPSBuZXcgQ29uc3RIYW5kbGUoMSAvKiBHbG9iYWxIYW5kbGUuVU5ERUZJTkVEICovLCB1bmRlZmluZWQpO1xuICAgIEhhbmRsZVN0b3JlLk5VTEwgPSBuZXcgQ29uc3RIYW5kbGUoMiAvKiBHbG9iYWxIYW5kbGUuTlVMTCAqLywgbnVsbCk7XG4gICAgSGFuZGxlU3RvcmUuRkFMU0UgPSBuZXcgQ29uc3RIYW5kbGUoMyAvKiBHbG9iYWxIYW5kbGUuRkFMU0UgKi8sIGZhbHNlKTtcbiAgICBIYW5kbGVTdG9yZS5UUlVFID0gbmV3IENvbnN0SGFuZGxlKDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8sIHRydWUpO1xuICAgIEhhbmRsZVN0b3JlLkdMT0JBTCA9IG5ldyBDb25zdEhhbmRsZSg1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi8sIF9nbG9iYWwpO1xuICAgIEhhbmRsZVN0b3JlLk1JTl9JRCA9IDY7XG4gICAgcmV0dXJuIEhhbmRsZVN0b3JlO1xufSgpKTtcblxudmFyIEhhbmRsZVNjb3BlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhhbmRsZVNjb3BlKGhhbmRsZVN0b3JlLCBpZCwgcGFyZW50U2NvcGUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKGVuZCA9PT0gdm9pZCAwKSB7IGVuZCA9IHN0YXJ0OyB9XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBoYW5kbGVTdG9yZTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudFNjb3BlO1xuICAgICAgICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudFNjb3BlICE9PSBudWxsKVxuICAgICAgICAgICAgcGFyZW50U2NvcGUuY2hpbGQgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLl9lc2NhcGVDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0luZm8gPSB7XG4gICAgICAgICAgICB0aGl6OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXRhOiAwLFxuICAgICAgICAgICAgYXJnczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZm46IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgIH1cbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBoID0gdGhpcy5oYW5kbGVTdG9yZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgdGhpcy5lbmQrKztcbiAgICAgICAgcmV0dXJuIGg7XG4gICAgfTtcbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuYWRkRXh0ZXJuYWwgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGQobmV3IEV4dGVybmFsKGRhdGEpKTtcbiAgICB9O1xuICAgIEhhbmRsZVNjb3BlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZXNjYXBlQ2FsbGVkKVxuICAgICAgICAgICAgdGhpcy5fZXNjYXBlQ2FsbGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmVuZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5lcmFzZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XG4gICAgfTtcbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAodGhpcy5fZXNjYXBlQ2FsbGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuX2VzY2FwZUNhbGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChoYW5kbGUgPCB0aGlzLnN0YXJ0IHx8IGhhbmRsZSA+PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5zd2FwKGhhbmRsZSwgdGhpcy5zdGFydCk7XG4gICAgICAgIHZhciBoID0gdGhpcy5oYW5kbGVTdG9yZS5nZXQodGhpcy5zdGFydCk7XG4gICAgICAgIHRoaXMuc3RhcnQrKztcbiAgICAgICAgdGhpcy5wYXJlbnQuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmVzY2FwZUNhbGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VzY2FwZUNhbGxlZDtcbiAgICB9O1xuICAgIHJldHVybiBIYW5kbGVTY29wZTtcbn0oKSk7XG5cbnZhciBTY29wZVN0b3JlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjb3BlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3RTY29wZSA9IG5ldyBIYW5kbGVTY29wZShudWxsLCAwLCBudWxsLCAxLCBIYW5kbGVTdG9yZS5NSU5fSUQpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHRoaXMuX3Jvb3RTY29wZTtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLm9wZW5TY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTY29wZSA9IHRoaXMuY3VycmVudFNjb3BlO1xuICAgICAgICB2YXIgc2NvcGUgPSBjdXJyZW50U2NvcGUuY2hpbGQ7XG4gICAgICAgIGlmIChzY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NvcGUuc3RhcnQgPSBzY29wZS5lbmQgPSBjdXJyZW50U2NvcGUuZW5kO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGlkID0gY3VycmVudFNjb3BlLmlkICsgMTtcbiAgICAgICAgICAgIHNjb3BlID0gbmV3IEhhbmRsZVNjb3BlKGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUsIGlkLCBjdXJyZW50U2NvcGUsIGN1cnJlbnRTY29wZS5lbmQpO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IHNjb3BlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFNjb3BlID0gc2NvcGU7XG4gICAgICAgIGVudk9iamVjdC5vcGVuSGFuZGxlU2NvcGVzKys7XG4gICAgICAgIHJldHVybiBzY29wZTtcbiAgICB9O1xuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLmNsb3NlU2NvcGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0KSB7XG4gICAgICAgIGlmIChlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGU7XG4gICAgICAgIHRoaXMuY3VycmVudFNjb3BlID0gc2NvcGUucGFyZW50O1xuICAgICAgICBzY29wZS5kaXNwb3NlKCk7XG4gICAgICAgIGVudk9iamVjdC5vcGVuSGFuZGxlU2NvcGVzLS07XG4gICAgfTtcbiAgICBTY29wZVN0b3JlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHRoaXMuX3Jvb3RTY29wZTtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDE7XG4gICAgfTtcbiAgICByZXR1cm4gU2NvcGVTdG9yZTtcbn0oKSk7XG5cbnZhciBSZWZUcmFja2VyID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZlRyYWNrZXIoKSB7XG4gICAgICAgIHRoaXMuX25leHQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgUmVmVHJhY2tlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgdGhpcy5fcHJldiA9IGxpc3Q7XG4gICAgICAgIHRoaXMuX25leHQgPSBsaXN0Ll9uZXh0O1xuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5fbmV4dCA9IHRoaXM7XG4gICAgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2Ll9uZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXMuX3ByZXY7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldiA9IG51bGw7XG4gICAgICAgIHRoaXMuX25leHQgPSBudWxsO1xuICAgIH07XG4gICAgUmVmVHJhY2tlci5maW5hbGl6ZUFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHdoaWxlIChsaXN0Ll9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsaXN0Ll9uZXh0LmZpbmFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWZUcmFja2VyO1xufSgpKTtcblxudmFyIEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaW5hbGl6ZXIoZW52T2JqZWN0LCBfZmluYWxpemVDYWxsYmFjaywgX2ZpbmFsaXplRGF0YSwgX2ZpbmFsaXplSGludCkge1xuICAgICAgICBpZiAoX2ZpbmFsaXplQ2FsbGJhY2sgPT09IHZvaWQgMCkgeyBfZmluYWxpemVDYWxsYmFjayA9IDA7IH1cbiAgICAgICAgaWYgKF9maW5hbGl6ZURhdGEgPT09IHZvaWQgMCkgeyBfZmluYWxpemVEYXRhID0gMDsgfVxuICAgICAgICBpZiAoX2ZpbmFsaXplSGludCA9PT0gdm9pZCAwKSB7IF9maW5hbGl6ZUhpbnQgPSAwOyB9XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gZW52T2JqZWN0O1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrID0gX2ZpbmFsaXplQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplRGF0YSA9IF9maW5hbGl6ZURhdGE7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplSGludCA9IF9maW5hbGl6ZUhpbnQ7XG4gICAgICAgIHRoaXMuX21ha2VEeW5DYWxsX3ZwcHAgPSBlbnZPYmplY3QubWFrZUR5bkNhbGxfdnBwcDtcbiAgICB9XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2ZpbmFsaXplQ2FsbGJhY2s7IH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZmluYWxpemVEYXRhOyB9O1xuICAgIEZpbmFsaXplci5wcm90b3R5cGUuaGludCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2ZpbmFsaXplSGludDsgfTtcbiAgICBGaW5hbGl6ZXIucHJvdG90eXBlLnJlc2V0RW52ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEZpbmFsaXplci5wcm90b3R5cGUucmVzZXRGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplQ2FsbGJhY2sgPSAwO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZURhdGEgPSAwO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUhpbnQgPSAwO1xuICAgIH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5jYWxsRmluYWxpemVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZmluYWxpemVfY2FsbGJhY2sgPSB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrO1xuICAgICAgICB2YXIgZmluYWxpemVfZGF0YSA9IHRoaXMuX2ZpbmFsaXplRGF0YTtcbiAgICAgICAgdmFyIGZpbmFsaXplX2hpbnQgPSB0aGlzLl9maW5hbGl6ZUhpbnQ7XG4gICAgICAgIHRoaXMucmVzZXRGaW5hbGl6ZXIoKTtcbiAgICAgICAgaWYgKCFmaW5hbGl6ZV9jYWxsYmFjaylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGZpbmkgPSBOdW1iZXIoZmluYWxpemVfY2FsbGJhY2spO1xuICAgICAgICBpZiAoIXRoaXMuZW52T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9tYWtlRHluQ2FsbF92cHBwKGZpbmkpKDAsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbnZPYmplY3QuY2FsbEZpbmFsaXplcihmaW5pLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbWFrZUR5bkNhbGxfdnBwcCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiBGaW5hbGl6ZXI7XG59KCkpO1xuXG52YXIgVHJhY2tlZEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJhY2tlZEZpbmFsaXplciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUcmFja2VkRmluYWxpemVyKGVudk9iamVjdCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2ZpbmFsaXplciA9IG5ldyBGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVHJhY2tlZEZpbmFsaXplci5jcmVhdGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICB2YXIgZmluYWxpemVyID0gbmV3IFRyYWNrZWRGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgIGZpbmFsaXplci5saW5rKGVudk9iamVjdC5maW5hbGl6aW5nX3JlZmxpc3QpO1xuICAgICAgICByZXR1cm4gZmluYWxpemVyO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplci5kYXRhKCk7XG4gICAgfTtcbiAgICBUcmFja2VkRmluYWxpemVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ZpbmFsaXplcilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy51bmxpbmsoKTtcbiAgICAgICAgdGhpcy5fZmluYWxpemVyLmVudk9iamVjdC5kZXF1ZXVlRmluYWxpemVyKHRoaXMpO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5saW5rKCk7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgdmFyIGNhdWdodCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fZmluYWxpemVyLmNhbGxGaW5hbGl6ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjYXVnaHQgPSB0cnVlO1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2tlZEZpbmFsaXplcjtcbn0oUmVmVHJhY2tlcikpO1xuXG5mdW5jdGlvbiB0aHJvd05vZGVBcGlWZXJzaW9uRXJyb3IobW9kdWxlTmFtZSwgbW9kdWxlQXBpVmVyc2lvbikge1xuICAgIHZhciBlcnJvck1lc3NhZ2UgPSBcIlwiLmNvbmNhdChtb2R1bGVOYW1lLCBcIiByZXF1aXJlcyBOb2RlLUFQSSB2ZXJzaW9uIFwiKS5jb25jYXQobW9kdWxlQXBpVmVyc2lvbiwgXCIsIGJ1dCB0aGlzIHZlcnNpb24gb2YgTm9kZS5qcyBvbmx5IHN1cHBvcnRzIHZlcnNpb24gXCIpLmNvbmNhdChOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIFwiIGFkZC1vbnMuXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gaGFuZGxlVGhyb3coZW52T2JqZWN0LCB2YWx1ZSkge1xuICAgIGlmIChlbnZPYmplY3QudGVybWluYXRlZE9yVGVybWluYXRpbmcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IHZhbHVlO1xufVxudmFyIEVudiA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnYoY3R4LCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQpIHtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIHRoaXMubW9kdWxlQXBpVmVyc2lvbiA9IG1vZHVsZUFwaVZlcnNpb247XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnBwcCA9IG1ha2VEeW5DYWxsX3ZwcHA7XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnAgPSBtYWtlRHluQ2FsbF92cDtcbiAgICAgICAgdGhpcy5hYm9ydCA9IGFib3J0O1xuICAgICAgICB0aGlzLm9wZW5IYW5kbGVTY29wZXMgPSAwO1xuICAgICAgICB0aGlzLmluc3RhbmNlRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudHJ5Q2F0Y2ggPSBuZXcgVHJ5Q2F0Y2goKTtcbiAgICAgICAgdGhpcy5yZWZzID0gMTtcbiAgICAgICAgdGhpcy5yZWZsaXN0ID0gbmV3IFJlZlRyYWNrZXIoKTtcbiAgICAgICAgdGhpcy5maW5hbGl6aW5nX3JlZmxpc3QgPSBuZXcgUmVmVHJhY2tlcigpO1xuICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzID0gW107XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0ge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8sXG4gICAgICAgICAgICBlbmdpbmVFcnJvckNvZGU6IDAsXG4gICAgICAgICAgICBlbmdpbmVSZXNlcnZlZDogMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluR2NGaW5hbGl6ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYmluZGluZ01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgIH1cbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmNhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS50ZXJtaW5hdGVkT3JUZXJtaW5hdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNhbkNhbGxJbnRvSnMoKTtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlZnMrKztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVmcy0tO1xuICAgICAgICBpZiAodGhpcy5yZWZzID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5lbnN1cmVIYW5kbGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmVuc3VyZUhhbmRsZSh2YWx1ZSk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmVuc3VyZUhhbmRsZUlkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuc3VyZUhhbmRsZSh2YWx1ZSkuaWQ7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmNsZWFyTGFzdEVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdEVycm9yID0gdGhpcy5sYXN0RXJyb3I7XG4gICAgICAgIGlmIChsYXN0RXJyb3IuZXJyb3JDb2RlICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSAhPT0gMClcbiAgICAgICAgICAgIGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgPSAwO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSAwKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZVJlc2VydmVkID0gMDtcbiAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuc2V0TGFzdEVycm9yID0gZnVuY3Rpb24gKGVycm9yX2NvZGUsIGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVfcmVzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKGVuZ2luZV9lcnJvcl9jb2RlID09PSB2b2lkIDApIHsgZW5naW5lX2Vycm9yX2NvZGUgPSAwOyB9XG4gICAgICAgIGlmIChlbmdpbmVfcmVzZXJ2ZWQgPT09IHZvaWQgMCkgeyBlbmdpbmVfcmVzZXJ2ZWQgPSAwOyB9XG4gICAgICAgIHZhciBsYXN0RXJyb3IgPSB0aGlzLmxhc3RFcnJvcjtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lcnJvckNvZGUgIT09IGVycm9yX2NvZGUpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gZXJyb3JfY29kZTtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgIT09IGVuZ2luZV9lcnJvcl9jb2RlKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSA9IGVuZ2luZV9lcnJvcl9jb2RlO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSBlbmdpbmVfcmVzZXJ2ZWQpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZW5naW5lUmVzZXJ2ZWQgPSBlbmdpbmVfcmVzZXJ2ZWQ7XG4gICAgICAgIHJldHVybiBlcnJvcl9jb2RlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRSZXR1cm5TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLyA6IHRoaXMuc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5jYWxsSW50b01vZHVsZSA9IGZ1bmN0aW9uIChmbiwgaGFuZGxlRXhjZXB0aW9uKSB7XG4gICAgICAgIGlmIChoYW5kbGVFeGNlcHRpb24gPT09IHZvaWQgMCkgeyBoYW5kbGVFeGNlcHRpb24gPSBoYW5kbGVUaHJvdzsgfVxuICAgICAgICB2YXIgb3BlbkhhbmRsZVNjb3Blc0JlZm9yZSA9IHRoaXMub3BlbkhhbmRsZVNjb3BlcztcbiAgICAgICAgdGhpcy5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB2YXIgciA9IGZuKHRoaXMpO1xuICAgICAgICBpZiAob3BlbkhhbmRsZVNjb3Blc0JlZm9yZSAhPT0gdGhpcy5vcGVuSGFuZGxlU2NvcGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCdvcGVuX2hhbmRsZV9zY29wZXMgIT0gb3Blbl9oYW5kbGVfc2NvcGVzX2JlZm9yZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRyeUNhdGNoLmhhc0NhdWdodCgpKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gdGhpcy50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24odGhpcywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuaW52b2tlRmluYWxpemVyRnJvbUdDID0gZnVuY3Rpb24gKGZpbmFsaXplcikge1xuICAgICAgICBpZiAodGhpcy5tb2R1bGVBcGlWZXJzaW9uICE9PSBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMKSB7XG4gICAgICAgICAgICB0aGlzLmVucXVldWVGaW5hbGl6ZXIoZmluYWxpemVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzYXZlZCA9IHRoaXMuaW5HY0ZpbmFsaXplcjtcbiAgICAgICAgICAgIHRoaXMuaW5HY0ZpbmFsaXplciA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZpbmFsaXplci5maW5hbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbkdjRmluYWxpemVyID0gc2F2ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuY2hlY2tHQ0FjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kdWxlQXBpVmVyc2lvbiA9PT0gTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAmJiB0aGlzLmluR2NGaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQoJ0ZpbmFsaXplciBpcyBjYWxsaW5nIGEgZnVuY3Rpb24gdGhhdCBtYXkgYWZmZWN0IEdDIHN0YXRlLlxcbicgK1xuICAgICAgICAgICAgICAgICdUaGUgZmluYWxpemVycyBhcmUgcnVuIGRpcmVjdGx5IGZyb20gR0MgYW5kIG11c3Qgbm90IGFmZmVjdCBHQyAnICtcbiAgICAgICAgICAgICAgICAnc3RhdGUuXFxuJyArXG4gICAgICAgICAgICAgICAgJ1VzZSBgbm9kZV9hcGlfcG9zdF9maW5hbGl6ZXJgIGZyb20gaW5zaWRlIG9mIHRoZSBmaW5hbGl6ZXIgdG8gd29yayAnICtcbiAgICAgICAgICAgICAgICAnYXJvdW5kIHRoaXMgaXNzdWUuXFxuJyArXG4gICAgICAgICAgICAgICAgJ0l0IHNjaGVkdWxlcyB0aGUgY2FsbCBhcyBhIG5ldyB0YXNrIGluIHRoZSBldmVudCBsb29wLicpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmVucXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLmluZGV4T2YoZmluYWxpemVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0ZpbmFsaXplcnMucHVzaChmaW5hbGl6ZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmRlcXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMucGVuZGluZ0ZpbmFsaXplcnMuaW5kZXhPZihmaW5hbGl6ZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIEVudi5wcm90b3R5cGUuZGVsZXRlTWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFJlZlRyYWNrZXIuZmluYWxpemVBbGwodGhpcy5maW5hbGl6aW5nX3JlZmxpc3QpO1xuICAgICAgICBSZWZUcmFja2VyLmZpbmFsaXplQWxsKHRoaXMucmVmbGlzdCk7XG4gICAgICAgIHRoaXMudHJ5Q2F0Y2guZXh0cmFjdEV4Y2VwdGlvbigpO1xuICAgICAgICB0aGlzLmN0eC5lbnZTdG9yZS5yZW1vdmUodGhpcy5pZCk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlkID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmRlbGV0ZU1lKCk7XG4gICAgICAgIHRoaXMuZmluYWxpemluZ19yZWZsaXN0LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5yZWZsaXN0LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmluaXRPYmplY3RCaW5kaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBiaW5kaW5nID0ge1xuICAgICAgICAgICAgd3JhcHBlZDogMCxcbiAgICAgICAgICAgIHRhZzogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iaW5kaW5nTWFwLnNldCh2YWx1ZSwgYmluZGluZyk7XG4gICAgICAgIHJldHVybiBiaW5kaW5nO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRPYmplY3RCaW5kaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9iaW5kaW5nTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nTWFwLmdldCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdE9iamVjdEJpbmRpbmcodmFsdWUpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5zZXRJbnN0YW5jZURhdGEgPSBmdW5jdGlvbiAoZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlRGF0YS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnN0YW5jZURhdGEgPSBUcmFja2VkRmluYWxpemVyLmNyZWF0ZSh0aGlzLCBmaW5hbGl6ZV9jYiwgZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmdldEluc3RhbmNlRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VEYXRhID8gdGhpcy5pbnN0YW5jZURhdGEuZGF0YSgpIDogMDtcbiAgICB9O1xuICAgIHJldHVybiBFbnY7XG59KCkpO1xudmFyIE5vZGVFbnYgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5vZGVFbnYsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm9kZUVudihjdHgsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGN0eCwgbW9kdWxlQXBpVmVyc2lvbiwgbWFrZUR5bkNhbGxfdnBwcCwgbWFrZUR5bkNhbGxfdnAsIGFib3J0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICBfdGhpcy5ub2RlQmluZGluZyA9IG5vZGVCaW5kaW5nO1xuICAgICAgICBfdGhpcy5kZXN0cnVjdGluZyA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOb2RlRW52LnByb3RvdHlwZS5kZWxldGVNZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZHJhaW5GaW5hbGl6ZXJRdWV1ZSgpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRlbGV0ZU1lLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYW5DYWxsSW50b0pzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5jYW5DYWxsSW50b0pzLmNhbGwodGhpcykgJiYgdGhpcy5jdHguY2FuQ2FsbEludG9KcygpO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUudHJpZ2dlckZhdGFsRXhjZXB0aW9uID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAodGhpcy5ub2RlQmluZGluZykge1xuICAgICAgICAgICAgdGhpcy5ub2RlQmluZGluZy5uYXBpLmZhdGFsRXhjZXB0aW9uKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MuX2ZhdGFsRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZWQgPSBwcm9jZXNzLl9mYXRhbEV4Y2VwdGlvbihlcnIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLmNhbGxiYWNrSW50b01vZHVsZSA9IGZ1bmN0aW9uIChlbmZvcmNlVW5jYXVnaHRFeGNlcHRpb25Qb2xpY3ksIGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJbnRvTW9kdWxlKGZuLCBmdW5jdGlvbiAoZW52T2JqZWN0LCBlcnIpIHtcbiAgICAgICAgICAgIGlmIChlbnZPYmplY3QudGVybWluYXRlZE9yVGVybWluYXRpbmcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoYXNQcm9jZXNzID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGw7XG4gICAgICAgICAgICB2YXIgaGFzRm9yY2VGbGFnID0gaGFzUHJvY2VzcyA/IEJvb2xlYW4ocHJvY2Vzcy5leGVjQXJndiAmJiAocHJvY2Vzcy5leGVjQXJndi5pbmRleE9mKCctLWZvcmNlLW5vZGUtYXBpLXVuY2F1Z2h0LWV4Y2VwdGlvbnMtcG9saWN5JykgIT09IC0xKSkgOiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA8IDEwICYmICFoYXNGb3JjZUZsYWcgJiYgIWVuZm9yY2VVbmNhdWdodEV4Y2VwdGlvblBvbGljeSkge1xuICAgICAgICAgICAgICAgIHZhciB3YXJuID0gaGFzUHJvY2VzcyAmJiB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IHByb2Nlc3MuZW1pdFdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAod2FybmluZywgdHlwZSwgY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5pbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IGNvZGUgPyBcIltcIi5jb25jYXQoY29kZSwgXCJdIFwiKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdCh0eXBlIHx8ICdXYXJuaW5nJywgXCI6IFwiKS5jb25jYXQod2FybmluZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdhcm4oJ1VuY2F1Z2h0IE4tQVBJIGNhbGxiYWNrIGV4Y2VwdGlvbiBkZXRlY3RlZCwgcGxlYXNlIHJ1biBub2RlIHdpdGggb3B0aW9uIC0tZm9yY2Utbm9kZS1hcGktdW5jYXVnaHQtZXhjZXB0aW9ucy1wb2xpY3k9dHJ1ZSB0byBoYW5kbGUgdGhvc2UgZXhjZXB0aW9ucyBwcm9wZXJseS4nLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgJ0RFUDAxNjgnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnZPYmplY3QudHJpZ2dlckZhdGFsRXhjZXB0aW9uKGVycik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUuY2FsbEZpbmFsaXplciA9IGZ1bmN0aW9uIChjYiwgZGF0YSwgaGludCkge1xuICAgICAgICB0aGlzLmNhbGxGaW5hbGl6ZXJJbnRlcm5hbCgxLCBjYiwgZGF0YSwgaGludCk7XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYWxsRmluYWxpemVySW50ZXJuYWwgPSBmdW5jdGlvbiAoZm9yY2VVbmNhdWdodCwgY2IsIGRhdGEsIGhpbnQpIHtcbiAgICAgICAgdmFyIGYgPSB0aGlzLm1ha2VEeW5DYWxsX3ZwcHAoY2IpO1xuICAgICAgICB2YXIgZW52ID0gdGhpcy5pZDtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdHgub3BlblNjb3BlKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0ludG9Nb2R1bGUoQm9vbGVhbihmb3JjZVVuY2F1Z2h0KSwgZnVuY3Rpb24gKCkgeyBmKGVudiwgZGF0YSwgaGludCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xvc2VTY29wZSh0aGlzLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLmVucXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZW5xdWV1ZUZpbmFsaXplci5jYWxsKHRoaXMsIGZpbmFsaXplcik7XG4gICAgICAgIGlmICghdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgJiYgIXRoaXMuZGVzdHJ1Y3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemF0aW9uU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVmKCk7XG4gICAgICAgICAgICBfc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfdGhpcy51bnJlZigpO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWluRmluYWxpemVyUXVldWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5kcmFpbkZpbmFsaXplclF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5wZW5kaW5nRmluYWxpemVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcmVmVHJhY2tlciA9IHRoaXMucGVuZGluZ0ZpbmFsaXplcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJlZlRyYWNrZXIuZmluYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE5vZGVFbnY7XG59KEVudikpO1xuZnVuY3Rpb24gbmV3RW52KGN0eCwgZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCwgbm9kZUJpbmRpbmcpIHtcbiAgICBtb2R1bGVBcGlWZXJzaW9uID0gdHlwZW9mIG1vZHVsZUFwaVZlcnNpb24gIT09ICdudW1iZXInID8gTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT04gOiBtb2R1bGVBcGlWZXJzaW9uO1xuICAgIC8vIFZhbGlkYXRlIG1vZHVsZV9hcGlfdmVyc2lvbi5cbiAgICBpZiAobW9kdWxlQXBpVmVyc2lvbiA8IE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OKSB7XG4gICAgICAgIG1vZHVsZUFwaVZlcnNpb24gPSBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTjtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kdWxlQXBpVmVyc2lvbiA+IE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCAmJiBtb2R1bGVBcGlWZXJzaW9uICE9PSBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMKSB7XG4gICAgICAgIHRocm93Tm9kZUFwaVZlcnNpb25FcnJvcihmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbik7XG4gICAgfVxuICAgIHZhciBlbnYgPSBuZXcgTm9kZUVudihjdHgsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKTtcbiAgICBjdHguZW52U3RvcmUuYWRkKGVudik7XG4gICAgY3R4LmFkZENsZWFudXBIb29rKGVudiwgZnVuY3Rpb24gKCkgeyBlbnYudW5yZWYoKTsgfSwgMCk7XG4gICAgcmV0dXJuIGVudjtcbn1cblxudmFyIEVtbmFwaUVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbW5hcGlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbW5hcGlFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgdmFyIEVycm9yQ29uc3RydWN0b3IgPSBfbmV3VGFyZ2V0O1xuICAgICAgICB2YXIgcHJvdG8gPSBFcnJvckNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKCEoX3RoaXMgaW5zdGFuY2VvZiBFbW5hcGlFcnJvcikpIHtcbiAgICAgICAgICAgIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0UHJvdG90eXBlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBzZXRQcm90b3R5cGVPZi5jYWxsKE9iamVjdCwgX3RoaXMsIHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuICAgICAgICAgICAgICAgIF90aGlzLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKF90aGlzLCBFcnJvckNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbW5hcGlFcnJvcjtcbn0oRXJyb3IpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbW5hcGlFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ0VtbmFwaUVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydFdlYWtSZWZFcnJvciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm90U3VwcG9ydFdlYWtSZWZFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJGaW5hbGl6YXRpb25SZWdpc3RyeVxcXCIgYW5kIFxcXCJXZWFrUmVmXFxcIi5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yO1xufShFbW5hcGlFcnJvcikpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE5vdFN1cHBvcnRXZWFrUmVmRXJyb3IucHJvdG90eXBlLCAnbmFtZScsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6ICdOb3RTdXBwb3J0V2Vha1JlZkVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydEJ1ZmZlckVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb3RTdXBwb3J0QnVmZmVyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm90U3VwcG9ydEJ1ZmZlckVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJCdWZmZXJcXFwiLiBDb25zaWRlciB1c2luZyBidWZmZXIgcG9seWZpbGwgdG8gbWFrZSBzdXJlIGBnbG9iYWxUaGlzLkJ1ZmZlcmAgaXMgZGVmaW5lZC5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0QnVmZmVyRXJyb3I7XG59KEVtbmFwaUVycm9yKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTm90U3VwcG9ydEJ1ZmZlckVycm9yLnByb3RvdHlwZSwgJ25hbWUnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiAnTm90U3VwcG9ydEJ1ZmZlckVycm9yJ1xufSk7XG5cbnZhciBTdHJvbmdSZWYgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3Ryb25nUmVmKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGVyZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9O1xuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gU3Ryb25nUmVmO1xufSgpKTtcbnZhciBQZXJzaXN0ZW50ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNpc3RlbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcmVmID0gbmV3IFN0cm9uZ1JlZih2YWx1ZSk7XG4gICAgfVxuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLnNldFdlYWsgPSBmdW5jdGlvbiAocGFyYW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9yZWYgaW5zdGFuY2VvZiBXZWFrUmVmKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnJlZ2lzdGVyKHZhbHVlLCB0aGlzLCB0aGlzKTtcbiAgICAgICAgICAgIHZhciB3ZWFrUmVmID0gbmV3IFdlYWtSZWYodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fcmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZiA9IHdlYWtSZWY7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbSA9IHBhcmFtO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykgO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50LnByb3RvdHlwZS5jbGVhcldlYWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX3JlZiBpbnN0YW5jZW9mIFdlYWtSZWYpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgUGVyc2lzdGVudC5fcmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgIHRoaXMuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWYgPSBuZXcgU3Ryb25nUmVmKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUGVyc2lzdGVudC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzdXBwb3J0RmluYWxpemVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFyYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5fcmVmIGluc3RhbmNlb2YgU3Ryb25nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWYuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlZiA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmRlcmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVmID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmLmRlcmVmKCk7XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50Ll9yZWdpc3RyeSA9IHN1cHBvcnRGaW5hbGl6ZXJcbiAgICAgICAgPyBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZS5fcmVmID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gdmFsdWUuX2NhbGxiYWNrO1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gdmFsdWUuX3BhcmFtO1xuICAgICAgICAgICAgdmFsdWUuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFsdWUuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIFBlcnNpc3RlbnQ7XG59KCkpO1xuXG52YXIgUmVmZXJlbmNlT3duZXJzaGlwO1xuKGZ1bmN0aW9uIChSZWZlcmVuY2VPd25lcnNoaXApIHtcbiAgICBSZWZlcmVuY2VPd25lcnNoaXBbUmVmZXJlbmNlT3duZXJzaGlwW1wia1J1bnRpbWVcIl0gPSAwXSA9IFwia1J1bnRpbWVcIjtcbiAgICBSZWZlcmVuY2VPd25lcnNoaXBbUmVmZXJlbmNlT3duZXJzaGlwW1wia1VzZXJsYW5kXCJdID0gMV0gPSBcImtVc2VybGFuZFwiO1xufSkoUmVmZXJlbmNlT3duZXJzaGlwIHx8IChSZWZlcmVuY2VPd25lcnNoaXAgPSB7fSkpO1xuZnVuY3Rpb24gY2FuQmVIZWxkV2Vha2x5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzT2JqZWN0KCkgfHwgdmFsdWUuaXNGdW5jdGlvbigpIHx8IHZhbHVlLmlzU3ltYm9sKCk7XG59XG52YXIgUmVmZXJlbmNlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWZlcmVuY2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKGVudk9iamVjdCwgaGFuZGxlX2lkLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbnZPYmplY3QgPSBlbnZPYmplY3Q7XG4gICAgICAgIF90aGlzLl9yZWZjb3VudCA9IGluaXRpYWxSZWZjb3VudDtcbiAgICAgICAgX3RoaXMuX293bmVyc2hpcCA9IG93bmVyc2hpcDtcbiAgICAgICAgdmFyIGhhbmRsZSA9IGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUuZ2V0KGhhbmRsZV9pZCk7XG4gICAgICAgIF90aGlzLmNhbkJlV2VhayA9IGNhbkJlSGVsZFdlYWtseShoYW5kbGUpO1xuICAgICAgICBfdGhpcy5wZXJzaXN0ZW50ID0gbmV3IFBlcnNpc3RlbnQoaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgX3RoaXMuaWQgPSAwO1xuICAgICAgICBpZiAoaW5pdGlhbFJlZmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBfdGhpcy5fc2V0V2VhaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVmZXJlbmNlLndlYWtDYWxsYmFjayA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgcmVmLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICAgICAgcmVmLmludm9rZUZpbmFsaXplckZyb21HQygpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIF91bnVzZWQxLCBfdW51c2VkMiwgX3VudXNlZDMpIHtcbiAgICAgICAgdmFyIHJlZiA9IG5ldyBSZWZlcmVuY2UoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwKTtcbiAgICAgICAgZW52T2JqZWN0LmN0eC5yZWZTdG9yZS5hZGQocmVmKTtcbiAgICAgICAgcmVmLmxpbmsoZW52T2JqZWN0LnJlZmxpc3QpO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlcnNpc3RlbnQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKyt0aGlzLl9yZWZjb3VudCA9PT0gMSAmJiB0aGlzLmNhbkJlV2Vhaykge1xuICAgICAgICAgICAgdGhpcy5wZXJzaXN0ZW50LmNsZWFyV2VhaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZjb3VudDtcbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlcnNpc3RlbnQuaXNFbXB0eSgpIHx8IHRoaXMuX3JlZmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoLS10aGlzLl9yZWZjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fc2V0V2VhaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZjb3VudDtcbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGVudk9iamVjdCkge1xuICAgICAgICBpZiAoZW52T2JqZWN0ID09PSB2b2lkIDApIHsgZW52T2JqZWN0ID0gdGhpcy5lbnZPYmplY3Q7IH1cbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvYmogPSB0aGlzLnBlcnNpc3RlbnQuZGVyZWYoKTtcbiAgICAgICAgdmFyIGhhbmRsZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGUob2JqKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZS5pZDtcbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVzZXRGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLnJlZmNvdW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVmY291bnQ7IH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5vd25lcnNoaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9vd25lcnNoaXA7IH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5jYWxsVXNlckZpbmFsaXplciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmludm9rZUZpbmFsaXplckZyb21HQyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5fc2V0V2VhayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQmVXZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RlbnQuc2V0V2Vhayh0aGlzLCBSZWZlcmVuY2Uud2Vha0NhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGVyc2lzdGVudC5yZXNldCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICAgICAgdmFyIGRlbGV0ZU1lID0gdGhpcy5fb3duZXJzaGlwID09PSBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWU7XG4gICAgICAgIHRoaXMudW5saW5rKCk7XG4gICAgICAgIHRoaXMuY2FsbFVzZXJGaW5hbGl6ZXIoKTtcbiAgICAgICAgaWYgKGRlbGV0ZU1lKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pZCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy51bmxpbmsoKTtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW50LnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0LmN0eC5yZWZTdG9yZS5yZW1vdmUodGhpcy5pZCk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgfTtcbiAgICByZXR1cm4gUmVmZXJlbmNlO1xufShSZWZUcmFja2VyKSk7XG52YXIgUmVmZXJlbmNlV2l0aERhdGEgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlZmVyZW5jZVdpdGhEYXRhLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlZmVyZW5jZVdpdGhEYXRhKGVudk9iamVjdCwgdmFsdWUsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBfZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2RhdGEgPSBfZGF0YTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZWZlcmVuY2VXaXRoRGF0YS5jcmVhdGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCB2YWx1ZSwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGRhdGEpIHtcbiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2VXaXRoRGF0YShlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZGF0YSk7XG4gICAgICAgIGVudk9iamVjdC5jdHgucmVmU3RvcmUuYWRkKHJlZmVyZW5jZSk7XG4gICAgICAgIHJlZmVyZW5jZS5saW5rKGVudk9iamVjdC5yZWZsaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICB9O1xuICAgIFJlZmVyZW5jZVdpdGhEYXRhLnByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9O1xuICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRGF0YTtcbn0oUmVmZXJlbmNlKSk7XG52YXIgUmVmZXJlbmNlV2l0aEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVmZXJlbmNlV2l0aEZpbmFsaXplciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZWZlcmVuY2VXaXRoRmluYWxpemVyKGVudk9iamVjdCwgdmFsdWUsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2ZpbmFsaXplciA9IG5ldyBGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVmZXJlbmNlV2l0aEZpbmFsaXplci5jcmVhdGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCB2YWx1ZSwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHZhciByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlV2l0aEZpbmFsaXplcihlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICBlbnZPYmplY3QuY3R4LnJlZlN0b3JlLmFkZChyZWZlcmVuY2UpO1xuICAgICAgICByZWZlcmVuY2UubGluayhlbnZPYmplY3QuZmluYWxpemluZ19yZWZsaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICB9O1xuICAgIFJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIucHJvdG90eXBlLnJlc2V0RmluYWxpemVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9maW5hbGl6ZXIucmVzZXRGaW5hbGl6ZXIoKTtcbiAgICB9O1xuICAgIFJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIucHJvdG90eXBlLmRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5hbGl6ZXIuZGF0YSgpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlV2l0aEZpbmFsaXplci5wcm90b3R5cGUuY2FsbFVzZXJGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplci5jYWxsRmluYWxpemVyKCk7XG4gICAgfTtcbiAgICBSZWZlcmVuY2VXaXRoRmluYWxpemVyLnByb3RvdHlwZS5pbnZva2VGaW5hbGl6ZXJGcm9tR0MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplci5lbnZPYmplY3QuaW52b2tlRmluYWxpemVyRnJvbUdDKHRoaXMpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlV2l0aEZpbmFsaXplci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9maW5hbGl6ZXIpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplci5lbnZPYmplY3QuZGVxdWV1ZUZpbmFsaXplcih0aGlzKTtcbiAgICAgICAgdGhpcy5fZmluYWxpemVyLmRpc3Bvc2UoKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplciA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRmluYWxpemVyO1xufShSZWZlcmVuY2UpKTtcblxudmFyIERlZmVycmVkID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmVycmVkKGN0eCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIERlZmVycmVkLmNyZWF0ZSA9IGZ1bmN0aW9uIChjdHgsIHZhbHVlKSB7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZChjdHgsIHZhbHVlKTtcbiAgICAgICAgY3R4LmRlZmVycmVkU3RvcmUuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZS5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgfTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICB0aGlzLnZhbHVlLnJlamVjdChyZWFzb24pO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB9O1xuICAgIERlZmVycmVkLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmN0eC5kZWZlcnJlZFN0b3JlLnJlbW92ZSh0aGlzLmlkKTtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmN0eCA9IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmZXJyZWQ7XG59KCkpO1xuXG52YXIgU3RvcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFt1bmRlZmluZWRdO1xuICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gNDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDE7XG4gICAgICAgIHRoaXMuX2ZyZWVMaXN0ID0gW107XG4gICAgfVxuICAgIFN0b3JlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGlkO1xuICAgICAgICBpZiAodGhpcy5fZnJlZUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMuX2ZyZWVMaXN0LnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMuX3NpemU7XG4gICAgICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgICAgICB2YXIgY2FwYWNpdHkgPSB0aGlzLl92YWx1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGlkID49IGNhcGFjaXR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IGNhcGFjaXR5ICsgKGNhcGFjaXR5ID4+IDEpICsgMTY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IHZhbHVlO1xuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIFN0b3JlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1tpZF0gIT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFN0b3JlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZS5pZCA9IDA7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNbaWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fZnJlZUxpc3QucHVzaChOdW1iZXIoaWQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5fc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFt1bmRlZmluZWRdO1xuICAgICAgICB0aGlzLl9zaXplID0gMTtcbiAgICAgICAgdGhpcy5fZnJlZUxpc3QgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBTdG9yZTtcbn0oKSk7XG5cbnZhciBDbGVhbnVwSG9va0NhbGxiYWNrID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsZWFudXBIb29rQ2FsbGJhY2soZW52T2JqZWN0LCBmbiwgYXJnLCBvcmRlcikge1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IGVudk9iamVjdDtcbiAgICAgICAgdGhpcy5mbiA9IGZuO1xuICAgICAgICB0aGlzLmFyZyA9IGFyZztcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgIH1cbiAgICByZXR1cm4gQ2xlYW51cEhvb2tDYWxsYmFjaztcbn0oKSk7XG52YXIgQ2xlYW51cFF1ZXVlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsZWFudXBRdWV1ZSgpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzID0gW107XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rQ291bnRlciA9IDA7XG4gICAgfVxuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGVhbnVwSG9va3MubGVuZ3RoID09PSAwO1xuICAgIH07XG4gICAgQ2xlYW51cFF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmbiwgYXJnKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbGVhbnVwSG9va3MuZmlsdGVyKGZ1bmN0aW9uIChob29rKSB7IHJldHVybiAoaG9vay5lbnZPYmplY3QgPT09IGVudk9iamVjdCAmJiBob29rLmZuID09PSBmbiAmJiBob29rLmFyZyA9PT0gYXJnKTsgfSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGFkZCBzYW1lIGZuIGFuZCBhcmcgdHdpY2UnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbGVhbnVwSG9va3MucHVzaChuZXcgQ2xlYW51cEhvb2tDYWxsYmFjayhlbnZPYmplY3QsIGZuLCBhcmcsIHRoaXMuX2NsZWFudXBIb29rQ291bnRlcisrKSk7XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZuLCBhcmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jbGVhbnVwSG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBob29rID0gdGhpcy5fY2xlYW51cEhvb2tzW2ldO1xuICAgICAgICAgICAgaWYgKGhvb2suZW52T2JqZWN0ID09PSBlbnZPYmplY3QgJiYgaG9vay5mbiA9PT0gZm4gJiYgaG9vay5hcmcgPT09IGFyZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFudXBIb29rcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaG9va3MgPSB0aGlzLl9jbGVhbnVwSG9va3Muc2xpY2UoKTtcbiAgICAgICAgaG9va3Muc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGIub3JkZXIgLSBhLm9yZGVyKTsgfSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBjYiA9IGhvb2tzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYi5mbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjYi5lbnZPYmplY3QubWFrZUR5bkNhbGxfdnAoY2IuZm4pKGNiLmFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYi5mbihjYi5hcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzLnNwbGljZSh0aGlzLl9jbGVhbnVwSG9va3MuaW5kZXhPZihjYiksIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9jbGVhbnVwSG9va0NvdW50ZXIgPSAwO1xuICAgIH07XG4gICAgcmV0dXJuIENsZWFudXBRdWV1ZTtcbn0oKSk7XG52YXIgTm9kZWpzV2FpdGluZ1JlcXVlc3RDb3VudGVyID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlcigpIHtcbiAgICAgICAgdGhpcy5yZWZIYW5kbGUgPSBuZXcgX01lc3NhZ2VDaGFubmVsKCkucG9ydDE7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgIH1cbiAgICBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIucHJvdG90eXBlLmluY3JlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVmSGFuZGxlLnJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmSGFuZGxlLnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY291bnQrKztcbiAgICB9O1xuICAgIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlci5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVmSGFuZGxlLnVucmVmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZIYW5kbGUudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvdW50LS07XG4gICAgfTtcbiAgICByZXR1cm4gTm9kZWpzV2FpdGluZ1JlcXVlc3RDb3VudGVyO1xufSgpKTtcbnZhciBDb250ZXh0ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnRleHQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2lzU3RvcHBpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2FuQ2FsbEludG9KcyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N1cHByZXNzRGVzdHJveSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVudlN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuc2NvcGVTdG9yZSA9IG5ldyBTY29wZVN0b3JlKCk7XG4gICAgICAgIHRoaXMucmVmU3RvcmUgPSBuZXcgU3RvcmUoKTtcbiAgICAgICAgdGhpcy5kZWZlcnJlZFN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBuZXcgSGFuZGxlU3RvcmUoKTtcbiAgICAgICAgdGhpcy5mZWF0dXJlID0ge1xuICAgICAgICAgICAgc3VwcG9ydFJlZmxlY3Q6IHN1cHBvcnRSZWZsZWN0LFxuICAgICAgICAgICAgc3VwcG9ydEZpbmFsaXplcjogc3VwcG9ydEZpbmFsaXplcixcbiAgICAgICAgICAgIHN1cHBvcnRXZWFrU3ltYm9sOiBzdXBwb3J0V2Vha1N5bWJvbCxcbiAgICAgICAgICAgIHN1cHBvcnRCaWdJbnQ6IHN1cHBvcnRCaWdJbnQsXG4gICAgICAgICAgICBzdXBwb3J0TmV3RnVuY3Rpb246IHN1cHBvcnROZXdGdW5jdGlvbixcbiAgICAgICAgICAgIGNhblNldEZ1bmN0aW9uTmFtZTogY2FuU2V0RnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlOiBfc2V0SW1tZWRpYXRlLFxuICAgICAgICAgICAgQnVmZmVyOiBfQnVmZmVyLFxuICAgICAgICAgICAgTWVzc2FnZUNoYW5uZWw6IF9NZXNzYWdlQ2hhbm5lbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZSA9IG5ldyBDbGVhbnVwUXVldWUoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzICE9PSBudWxsICYmIHR5cGVvZiBwcm9jZXNzLm9uY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucmVmQ291bnRlciA9IG5ldyBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgIHByb2Nlc3Mub25jZSgnYmVmb3JlRXhpdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLl9zdXBwcmVzc0Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN1cHByZXNzIHRoZSBkZXN0cm95IG9uIGBiZWZvcmVFeGl0YCBldmVudCBpbiBOb2RlLmpzLlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgY29udGV4dCBhbmRcbiAgICAgKiBhbGwgYXNzb2NpYXRlZCB7QGxpbmsgRW52IHwgRW52fSBhbGl2ZSxcbiAgICAgKiB0aGlzIGFsc28gbWVhbnMgdGhhdCBjbGVhbnVwIGhvb2tzIHdpbGwgbm90IGJlIGNhbGxlZC5cbiAgICAgKiBBZnRlciBjYWxsIHRoaXMgbWV0aG9kLCB5b3Ugc2hvdWxkIGNhbGxcbiAgICAgKiB7QGxpbmsgQ29udGV4dC5kZXN0cm95IHwgYENvbnRleHQucHJvdG90eXBlLmRlc3Ryb3lgfSBtZXRob2QgbWFudWFsbHkuXG4gICAgICovXG4gICAgQ29udGV4dC5wcm90b3R5cGUuc3VwcHJlc3NEZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zdXBwcmVzc0Rlc3Ryb3kgPSB0cnVlO1xuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZVxuICAgIENvbnRleHQucHJvdG90eXBlLmdldFJ1bnRpbWVWZXJzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgICAgICBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVg6IE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCxcbiAgICAgICAgICAgIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUw6IE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwsXG4gICAgICAgICAgICBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTjogTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT05cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IgPSBmdW5jdGlvbiAoYXBpLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90U3VwcG9ydFdlYWtSZWZFcnJvcihhcGksIG1lc3NhZ2UpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlTm90U3VwcG9ydEJ1ZmZlckVycm9yID0gZnVuY3Rpb24gKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IE5vdFN1cHBvcnRCdWZmZXJFcnJvcihhcGksIG1lc3NhZ2UpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlUmVmZXJlbmNlID0gZnVuY3Rpb24gKGVudk9iamVjdCwgaGFuZGxlX2lkLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkge1xuICAgICAgICByZXR1cm4gUmVmZXJlbmNlLmNyZWF0ZShlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXApO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlUmVmZXJlbmNlV2l0aERhdGEgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRGF0YS5jcmVhdGUoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBkYXRhKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZVJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICBpZiAoZmluYWxpemVfY2FsbGJhY2sgPT09IHZvaWQgMCkgeyBmaW5hbGl6ZV9jYWxsYmFjayA9IDA7IH1cbiAgICAgICAgaWYgKGZpbmFsaXplX2RhdGEgPT09IHZvaWQgMCkgeyBmaW5hbGl6ZV9kYXRhID0gMDsgfVxuICAgICAgICBpZiAoZmluYWxpemVfaGludCA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2hpbnQgPSAwOyB9XG4gICAgICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRmluYWxpemVyLmNyZWF0ZShlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZURlZmVycmVkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBEZWZlcnJlZC5jcmVhdGUodGhpcywgdmFsdWUpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRW52ID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXdFbnYodGhpcywgZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCwgbm9kZUJpbmRpbmcpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlVHJhY2tlZEZpbmFsaXplciA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHJldHVybiBUcmFja2VkRmluYWxpemVyLmNyZWF0ZShlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmdldEN1cnJlbnRTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVTdG9yZS5jdXJyZW50U2NvcGU7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5hZGRUb0N1cnJlbnRTY29wZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZVN0b3JlLmN1cnJlbnRTY29wZS5hZGQodmFsdWUpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUub3BlblNjb3BlID0gZnVuY3Rpb24gKGVudk9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZVN0b3JlLm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY2xvc2VTY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIF9zY29wZSkge1xuICAgICAgICB0aGlzLnNjb3BlU3RvcmUuY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuZW5zdXJlSGFuZGxlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOiByZXR1cm4gSGFuZGxlU3RvcmUuVU5ERUZJTkVEO1xuICAgICAgICAgICAgY2FzZSBudWxsOiByZXR1cm4gSGFuZGxlU3RvcmUuTlVMTDtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTogcmV0dXJuIEhhbmRsZVN0b3JlLlRSVUU7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOiByZXR1cm4gSGFuZGxlU3RvcmUuRkFMU0U7XG4gICAgICAgICAgICBjYXNlIF9nbG9iYWw6IHJldHVybiBIYW5kbGVTdG9yZS5HTE9CQUw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuYWRkQ2xlYW51cEhvb2sgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmbiwgYXJnKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cFF1ZXVlLmFkZChlbnZPYmplY3QsIGZuLCBhcmcpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUucmVtb3ZlQ2xlYW51cEhvb2sgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmbiwgYXJnKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cFF1ZXVlLnJlbW92ZShlbnZPYmplY3QsIGZuLCBhcmcpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUucnVuQ2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmNsZWFudXBRdWV1ZS5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZS5kcmFpbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnJlZkNvdW50ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbmNyZWFzZSgpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5yZWZDb3VudGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjcmVhc2UoKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnNldENhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY2FuQ2FsbEludG9KcyA9IHZhbHVlO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuc2V0U3RvcHBpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faXNTdG9wcGluZyA9IHZhbHVlO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY2FuQ2FsbEludG9KcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkNhbGxJbnRvSnMgJiYgIXRoaXMuX2lzU3RvcHBpbmc7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBjb250ZXh0IGFuZCBjYWxsIGNsZWFudXAgaG9va3MuXG4gICAgICogQXNzb2NpYXRlZCB7QGxpbmsgRW52IHwgRW52fSB3aWxsIGJlIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBDb250ZXh0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNldFN0b3BwaW5nKHRydWUpO1xuICAgICAgICB0aGlzLnNldENhbkNhbGxJbnRvSnMoZmFsc2UpO1xuICAgICAgICB0aGlzLnJ1bkNsZWFudXAoKTtcbiAgICB9O1xuICAgIHJldHVybiBDb250ZXh0O1xufSgpKTtcbnZhciBkZWZhdWx0Q29udGV4dDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0KCk7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0Q29udGV4dCgpIHtcbiAgICBpZiAoIWRlZmF1bHRDb250ZXh0KSB7XG4gICAgICAgIGRlZmF1bHRDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdENvbnRleHQ7XG59XG5cbmV4cG9ydCB7IENvbnN0SGFuZGxlLCBDb250ZXh0LCBEZWZlcnJlZCwgRW1uYXBpRXJyb3IsIEVudiwgRXh0ZXJuYWwsIEZpbmFsaXplciwgSGFuZGxlLCBIYW5kbGVTY29wZSwgSGFuZGxlU3RvcmUsIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwsIE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OLCBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiwgTm9kZUVudiwgTm90U3VwcG9ydEJ1ZmZlckVycm9yLCBOb3RTdXBwb3J0V2Vha1JlZkVycm9yLCBQZXJzaXN0ZW50LCBSZWZUcmFja2VyLCBSZWZlcmVuY2UsIFJlZmVyZW5jZU93bmVyc2hpcCwgUmVmZXJlbmNlV2l0aERhdGEsIFJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIsIFNjb3BlU3RvcmUsIFN0b3JlLCBUcmFja2VkRmluYWxpemVyLCBUcnlDYXRjaCwgY3JlYXRlQ29udGV4dCwgZ2V0RGVmYXVsdENvbnRleHQsIGdldEV4dGVybmFsVmFsdWUsIGlzRXh0ZXJuYWwsIGlzUmVmZXJlbmNlVHlwZSwgdmVyc2lvbiB9O1xuIiwiY29uc3QgX1dlYkFzc2VtYmx5ID0gdHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gV2ViQXNzZW1ibHlcbiAgICA6IHR5cGVvZiBXWFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IFdYV2ViQXNzZW1ibHlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5pZiAoIV9XZWJBc3NlbWJseSkge1xuICAgIHRocm93IG5ldyBFcnJvcignV2ViQXNzZW1ibHkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHNwYWNlZC1jb21tZW50ICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGFuIG9iamVjdC4gUmVjZWl2ZWQgJHt2YWx1ZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB2YWx1ZX1gKTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5KHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgYW4gYXJyYXkuIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIGJvb2xlYW4uIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgZnVuY3Rpb24uIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVVbmRlZmluZWQodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgdW5kZWZpbmVkLiBSZWNlaXZlZCAke3ZhbHVlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2Uob2JqKSB7XG4gICAgcmV0dXJuICEhKG9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIHdyYXBJbnN0YW5jZUV4cG9ydHMoZXhwb3J0cywgbWFwRm4pIHtcbiAgICBjb25zdCBuZXdFeHBvcnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IGV4cG9ydHNbbmFtZV07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdFeHBvcnRzLCBuYW1lLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG1hcEZuKGV4cG9ydFZhbHVlLCBuYW1lKVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3RXhwb3J0cztcbn1cbmZ1bmN0aW9uIHNsZWVwQnJlYWtJZihkZWxheSwgYnJlYWtJZikge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGRlbGF5O1xuICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGVuZCkge1xuICAgICAgICBpZiAoYnJlYWtJZigpKSB7XG4gICAgICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIHVuc2hhcmVkU2xpY2Uodmlldywgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2aWV3LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSB8fCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZpZXcuYnVmZmVyLmNvbnN0cnVjdG9yKSA9PT0gJ1tvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdJykpXG4gICAgICAgID8gdmlldy5zbGljZShzdGFydCwgZW5kKVxuICAgICAgICA6IHZpZXcuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG59XG5cbmNvbnN0IGlnbm9yZU5hbWVzID0gW1xuICAgICdhc3luY2lmeV9nZXRfc3RhdGUnLFxuICAgICdhc3luY2lmeV9zdGFydF9yZXdpbmQnLFxuICAgICdhc3luY2lmeV9zdGFydF91bndpbmQnLFxuICAgICdhc3luY2lmeV9zdG9wX3Jld2luZCcsXG4gICAgJ2FzeW5jaWZ5X3N0b3BfdW53aW5kJ1xuXTtcbmZ1bmN0aW9uIHRyeUFsbG9jYXRlKGluc3RhbmNlLCB3YXNtNjQsIHNpemUsIG1hbGxvY05hbWUpIHtcbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmV4cG9ydHNbbWFsbG9jTmFtZV0gIT09ICdmdW5jdGlvbicgfHwgc2l6ZSA8PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3YXNtNjQsXG4gICAgICAgICAgICBkYXRhUHRyOiAxNixcbiAgICAgICAgICAgIHN0YXJ0OiB3YXNtNjQgPyAzMiA6IDI0LFxuICAgICAgICAgICAgZW5kOiAxMDI0XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1hbGxvYyA9IGluc3RhbmNlLmV4cG9ydHNbbWFsbG9jTmFtZV07XG4gICAgY29uc3QgZGF0YVB0ciA9IHdhc202NCA/IE51bWJlcihtYWxsb2MoQmlnSW50KDE2KSArIEJpZ0ludChzaXplKSkpIDogbWFsbG9jKDggKyBzaXplKTtcbiAgICBpZiAoZGF0YVB0ciA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbG9jYXRlIGFzeW5jaWZ5IGRhdGEgZmFpbGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB3YXNtNjRcbiAgICAgICAgPyB7IHdhc202NCwgZGF0YVB0ciwgc3RhcnQ6IGRhdGFQdHIgKyAxNiwgZW5kOiBkYXRhUHRyICsgMTYgKyBzaXplIH1cbiAgICAgICAgOiB7IHdhc202NCwgZGF0YVB0ciwgc3RhcnQ6IGRhdGFQdHIgKyA4LCBlbmQ6IGRhdGFQdHIgKyA4ICsgc2l6ZSB9O1xufVxuLyoqIEBwdWJsaWMgKi9cbmNsYXNzIEFzeW5jaWZ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5leHBvcnRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRhdGFQdHIgPSAwO1xuICAgIH1cbiAgICBpbml0KG1lbW9yeSwgaW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKHRoaXMuZXhwb3J0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3luY2lmeSBoYXMgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKG1lbW9yeSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5NZW1vcnkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1aXJlIFdlYkFzc2VtYmx5Lk1lbW9yeSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZ25vcmVOYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzW2lnbm9yZU5hbWVzW2ldXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXN5bmNpZnkgd2FzbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBhZGRyZXNzO1xuICAgICAgICBjb25zdCB3YXNtNjQgPSBCb29sZWFuKG9wdGlvbnMud2FzbTY0KTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnRyeUFsbG9jYXRlKSB7XG4gICAgICAgICAgICBhZGRyZXNzID0ge1xuICAgICAgICAgICAgICAgIHdhc202NCxcbiAgICAgICAgICAgICAgICBkYXRhUHRyOiAxNixcbiAgICAgICAgICAgICAgICBzdGFydDogd2FzbTY0ID8gMzIgOiAyNCxcbiAgICAgICAgICAgICAgICBlbmQ6IDEwMjRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cnlBbGxvY2F0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MgPSB0cnlBbGxvY2F0ZShpbnN0YW5jZSwgd2FzbTY0LCA0MDk2LCAnbWFsbG9jJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzID0gdHJ5QWxsb2NhdGUoaW5zdGFuY2UsIHdhc202NCwgKF9hID0gb3B0aW9ucy50cnlBbGxvY2F0ZS5zaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiA0MDk2LCAoX2IgPSBvcHRpb25zLnRyeUFsbG9jYXRlLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdtYWxsb2MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFQdHIgPSBhZGRyZXNzLmRhdGFQdHI7XG4gICAgICAgIGlmICh3YXNtNjQpIHtcbiAgICAgICAgICAgIG5ldyBCaWdJbnQ2NEFycmF5KG1lbW9yeS5idWZmZXIsIHRoaXMuZGF0YVB0cikuc2V0KFtCaWdJbnQoYWRkcmVzcy5zdGFydCksIEJpZ0ludChhZGRyZXNzLmVuZCldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIsIHRoaXMuZGF0YVB0cikuc2V0KFthZGRyZXNzLnN0YXJ0LCBhZGRyZXNzLmVuZF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwb3J0cyA9IHRoaXMud3JhcEV4cG9ydHMoZXhwb3J0cywgb3B0aW9ucy53cmFwRXhwb3J0cyk7XG4gICAgICAgIGNvbnN0IGFzeW5jaWZpZWRJbnN0YW5jZSA9IE9iamVjdC5jcmVhdGUoX1dlYkFzc2VtYmx5Lkluc3RhbmNlLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhc3luY2lmaWVkSW5zdGFuY2UsICdleHBvcnRzJywgeyB2YWx1ZTogdGhpcy5leHBvcnRzIH0pO1xuICAgICAgICAvLyBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIEluc3RhbmNlLnByb3RvdHlwZSlcbiAgICAgICAgcmV0dXJuIGFzeW5jaWZpZWRJbnN0YW5jZTtcbiAgICB9XG4gICAgYXNzZXJ0U3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCkgIT09IDAgLyogQXN5bmNpZnlTdGF0ZS5OT05FICovKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FzeW5jaWZ5IHN0YXRlIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd3JhcEltcG9ydEZ1bmN0aW9uKGYpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGUtbG9vcFxuICAgICAgICAgICAgd2hpbGUgKF90aGlzLmV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCkgPT09IDIgLyogQXN5bmNpZnlTdGF0ZS5SRVdJTkRJTkcgKi8pIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0b3BfcmV3aW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAoIWlzUHJvbWlzZUxpa2UodikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICBfdGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Vud2luZChfdGhpcy5kYXRhUHRyKTtcbiAgICAgICAgICAgIF90aGlzLnZhbHVlID0gdjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdyYXBJbXBvcnRzKGltcG9ydHMpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0T2JqZWN0ID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGltcG9ydHMpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBpbXBvcnRzW2tdO1xuICAgICAgICAgICAgY29uc3QgbmV3TW9kdWxlID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtb2QpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0VmFsdWUgPSBtb2RbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBuZXdNb2R1bGVbbmFtZV0gPSB0aGlzLndyYXBJbXBvcnRGdW5jdGlvbihpbXBvcnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdNb2R1bGVbbmFtZV0gPSBpbXBvcnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltcG9ydE9iamVjdFtrXSA9IG5ld01vZHVsZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbXBvcnRPYmplY3Q7XG4gICAgfVxuICAgIHdyYXBFeHBvcnRGdW5jdGlvbihmKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCByZXQgPSBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB3aGlsZSAoX3RoaXMuZXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKSA9PT0gMSAvKiBBc3luY2lmeVN0YXRlLlVOV0lORElORyAqLykge1xuICAgICAgICAgICAgICAgIF90aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF91bndpbmQoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy52YWx1ZSA9IGF3YWl0IF90aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIF90aGlzLmFzc2VydFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXhwb3J0cy5hc3luY2lmeV9zdGFydF9yZXdpbmQoX3RoaXMuZGF0YVB0cik7XG4gICAgICAgICAgICAgICAgcmV0ID0gZi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3cmFwRXhwb3J0cyhleHBvcnRzLCBuZWVkV3JhcCkge1xuICAgICAgICByZXR1cm4gd3JhcEluc3RhbmNlRXhwb3J0cyhleHBvcnRzLCAoZXhwb3J0VmFsdWUsIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGxldCBpZ25vcmUgPSBpZ25vcmVOYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCB0eXBlb2YgZXhwb3J0VmFsdWUgIT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZWVkV3JhcCkpIHtcbiAgICAgICAgICAgICAgICBpZ25vcmUgPSBpZ25vcmUgfHwgKG5lZWRXcmFwLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpZ25vcmUgPyBleHBvcnRWYWx1ZSA6IHRoaXMud3JhcEV4cG9ydEZ1bmN0aW9uKGV4cG9ydFZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cykge1xuICAgIGlmIChpbXBvcnRzICYmIHR5cGVvZiBpbXBvcnRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbXBvcnRzIG11c3QgYmUgYW4gb2JqZWN0IG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZldGNoV2FzbSh1cmxPckJ1ZmZlciwgaW1wb3J0cykge1xuICAgIGlmICh0eXBlb2Ygd3ggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX3d4Q29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHVybE9yQnVmZmVyLCBpbXBvcnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoKHVybE9yQnVmZmVyKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKVxuICAgICAgICAudGhlbihidWZmZXIgPT4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ1ZmZlciwgaW1wb3J0cykpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGxvYWQod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgdmFsaWRhdGVJbXBvcnRzKGltcG9ydHMpO1xuICAgIGltcG9ydHMgPSBpbXBvcnRzICE9PSBudWxsICYmIGltcG9ydHMgIT09IHZvaWQgMCA/IGltcG9ydHMgOiB7fTtcbiAgICBsZXQgc291cmNlO1xuICAgIGlmICh3YXNtSW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcod2FzbUlucHV0KSkge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21JbnB1dCwgaW1wb3J0cyk7XG4gICAgfVxuICAgIGlmICh3YXNtSW5wdXQgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiBfV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbUlucHV0LCBpbXBvcnRzKS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgaW5zdGFuY2UsIG1vZHVsZTogd2FzbUlucHV0IH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdhc21JbnB1dCAhPT0gJ3N0cmluZycgJiYgISh3YXNtSW5wdXQgaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc291cmNlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxldCByZXNwb25zZVByb21pc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UgPSBmZXRjaCh3YXNtSW5wdXQpO1xuICAgICAgICAgICAgc291cmNlID0gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlUHJvbWlzZSwgaW1wb3J0cykuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaFdhc20od2FzbUlucHV0LCBpbXBvcnRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBmZXRjaFdhc20od2FzbUlucHV0LCBpbXBvcnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc291cmNlID0gZmV0Y2hXYXNtKHdhc21JbnB1dCwgaW1wb3J0cyk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gYXN5bmNpZnlMb2FkKGFzeW5jaWZ5LCB1cmxPckJ1ZmZlciwgaW1wb3J0cykge1xuICAgIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKTtcbiAgICBpbXBvcnRzID0gaW1wb3J0cyAhPT0gbnVsbCAmJiBpbXBvcnRzICE9PSB2b2lkIDAgPyBpbXBvcnRzIDoge307XG4gICAgY29uc3QgYXN5bmNpZnlIZWxwZXIgPSBuZXcgQXN5bmNpZnkoKTtcbiAgICBpbXBvcnRzID0gYXN5bmNpZnlIZWxwZXIud3JhcEltcG9ydHMoaW1wb3J0cyk7XG4gICAgcmV0dXJuIGxvYWQodXJsT3JCdWZmZXIsIGltcG9ydHMpLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZW1vcnkgPSBzb3VyY2UuaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnkgfHwgKChfYSA9IGltcG9ydHMuZW52KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWVtb3J5KTtcbiAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBzb3VyY2UubW9kdWxlLCBpbnN0YW5jZTogYXN5bmNpZnlIZWxwZXIuaW5pdChtZW1vcnksIHNvdXJjZS5pbnN0YW5jZSwgYXN5bmNpZnkpIH07XG4gICAgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgdmFsaWRhdGVJbXBvcnRzKGltcG9ydHMpO1xuICAgIGltcG9ydHMgPSBpbXBvcnRzICE9PSBudWxsICYmIGltcG9ydHMgIT09IHZvaWQgMCA/IGltcG9ydHMgOiB7fTtcbiAgICBsZXQgbW9kdWxlO1xuICAgIGlmICgod2FzbUlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8IEFycmF5QnVmZmVyLmlzVmlldyh3YXNtSW5wdXQpKSB7XG4gICAgICAgIG1vZHVsZSA9IG5ldyBfV2ViQXNzZW1ibHkuTW9kdWxlKHdhc21JbnB1dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdhc21JbnB1dCBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZSkge1xuICAgICAgICBtb2R1bGUgPSB3YXNtSW5wdXQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHNvdXJjZScpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBfV2ViQXNzZW1ibHkuSW5zdGFuY2UobW9kdWxlLCBpbXBvcnRzKTtcbiAgICBjb25zdCBzb3VyY2UgPSB7IGluc3RhbmNlLCBtb2R1bGUgfTtcbiAgICByZXR1cm4gc291cmNlO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGFzeW5jaWZ5TG9hZFN5bmMoYXN5bmNpZnksIGJ1ZmZlciwgaW1wb3J0cykge1xuICAgIHZhciBfYTtcbiAgICB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cyk7XG4gICAgaW1wb3J0cyA9IGltcG9ydHMgIT09IG51bGwgJiYgaW1wb3J0cyAhPT0gdm9pZCAwID8gaW1wb3J0cyA6IHt9O1xuICAgIGNvbnN0IGFzeW5jaWZ5SGVscGVyID0gbmV3IEFzeW5jaWZ5KCk7XG4gICAgaW1wb3J0cyA9IGFzeW5jaWZ5SGVscGVyLndyYXBJbXBvcnRzKGltcG9ydHMpO1xuICAgIGNvbnN0IHNvdXJjZSA9IGxvYWRTeW5jKGJ1ZmZlciwgaW1wb3J0cyk7XG4gICAgY29uc3QgbWVtb3J5ID0gc291cmNlLmluc3RhbmNlLmV4cG9ydHMubWVtb3J5IHx8ICgoX2EgPSBpbXBvcnRzLmVudikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1lbW9yeSk7XG4gICAgcmV0dXJuIHsgbW9kdWxlOiBzb3VyY2UubW9kdWxlLCBpbnN0YW5jZTogYXN5bmNpZnlIZWxwZXIuaW5pdChtZW1vcnksIHNvdXJjZS5pbnN0YW5jZSwgYXN5bmNpZnkpIH07XG59XG5cbmNvbnN0IENIQVJfRE9UID0gNDY7IC8qIC4gKi9cbmNvbnN0IENIQVJfRk9SV0FSRF9TTEFTSCA9IDQ3OyAvKiAvICovXG5mdW5jdGlvbiBpc1Bvc2l4UGF0aFNlcGFyYXRvcihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZyhwYXRoLCBhbGxvd0Fib3ZlUm9vdCwgc2VwYXJhdG9yLCBpc1BhdGhTZXBhcmF0b3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgbGV0IGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICBsZXQgbGFzdFNsYXNoID0gLTE7XG4gICAgbGV0IGRvdHMgPSAwO1xuICAgIGxldCBjb2RlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBwYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpIDwgcGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvZGUgPSBDSEFSX0ZPUldBUkRfU0xBU0g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaSAtIDEgfHwgZG90cyA9PT0gMSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG90cyA9PT0gMikge1xuICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoIDwgMiB8fCBsYXN0U2VnbWVudExlbmd0aCAhPT0gMiB8fFxuICAgICAgICAgICAgICAgICAgICByZXMuY2hhckNvZGVBdChyZXMubGVuZ3RoIC0gMSkgIT09IENIQVJfRE9UIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAyKSAhPT0gQ0hBUl9ET1QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHJlcy5pbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5sZW5ndGggLSAxIC0gcmVzLmluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSByZXMubGVuZ3RoID4gMCA/IGAke3NlcGFyYXRvcn0uLmAgOiAnLi4nO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSBgJHtzZXBhcmF0b3J9JHtwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGkgLSBsYXN0U2xhc2ggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IENIQVJfRE9UICYmIGRvdHMgIT09IC0xKSB7XG4gICAgICAgICAgICArK2RvdHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb3RzID0gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHJlc29sdmUoLi4uYXJncykge1xuICAgIGxldCByZXNvbHZlZFBhdGggPSAnJztcbiAgICBsZXQgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgICAgICBjb25zdCBwYXRoID0gaSA+PSAwID8gYXJnc1tpXSA6ICcvJztcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTtcbiAgICAgICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YDtcbiAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIO1xuICAgIH1cbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gICAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUsICcvJywgaXNQb3NpeFBhdGhTZXBhcmF0b3IpO1xuICAgIGlmIChyZXNvbHZlZEFic29sdXRlKSB7XG4gICAgICAgIHJldHVybiBgLyR7cmVzb2x2ZWRQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZFBhdGgubGVuZ3RoID4gMCA/IHJlc29sdmVkUGF0aCA6ICcuJztcbn1cblxuY29uc3QgRkRfREFUQVNZTkMgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMCkpO1xuY29uc3QgRkRfUkVBRCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxKSk7XG5jb25zdCBGRF9TRUVLID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIpKTtcbmNvbnN0IEZEX0ZEU1RBVF9TRVRfRkxBR1MgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMykpO1xuY29uc3QgRkRfU1lOQyA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg0KSk7XG5jb25zdCBGRF9URUxMID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDUpKTtcbmNvbnN0IEZEX1dSSVRFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDYpKTtcbmNvbnN0IEZEX0FEVklTRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg3KSk7XG5jb25zdCBGRF9BTExPQ0FURSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg4KSk7XG5jb25zdCBQQVRIX0NSRUFURV9ESVJFQ1RPUlkgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoOSkpO1xuY29uc3QgUEFUSF9DUkVBVEVfRklMRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMCkpO1xuY29uc3QgUEFUSF9MSU5LX1NPVVJDRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMSkpO1xuY29uc3QgUEFUSF9MSU5LX1RBUkdFVCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMikpO1xuY29uc3QgUEFUSF9PUEVOID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDEzKSk7XG5jb25zdCBGRF9SRUFERElSID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDE0KSk7XG5jb25zdCBQQVRIX1JFQURMSU5LID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDE1KSk7XG5jb25zdCBQQVRIX1JFTkFNRV9TT1VSQ0UgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTYpKTtcbmNvbnN0IFBBVEhfUkVOQU1FX1RBUkdFVCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxNykpO1xuY29uc3QgUEFUSF9GSUxFU1RBVF9HRVQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTgpKTtcbmNvbnN0IFBBVEhfRklMRVNUQVRfU0VUX1NJWkUgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTkpKTtcbmNvbnN0IFBBVEhfRklMRVNUQVRfU0VUX1RJTUVTID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIwKSk7XG5jb25zdCBGRF9GSUxFU1RBVF9HRVQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjEpKTtcbmNvbnN0IEZEX0ZJTEVTVEFUX1NFVF9TSVpFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIyKSk7XG5jb25zdCBGRF9GSUxFU1RBVF9TRVRfVElNRVMgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjMpKTtcbmNvbnN0IFBBVEhfU1lNTElOSyA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyNCkpO1xuY29uc3QgUEFUSF9SRU1PVkVfRElSRUNUT1JZID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDI1KSk7XG5jb25zdCBQQVRIX1VOTElOS19GSUxFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDI2KSk7XG5jb25zdCBQT0xMX0ZEX1JFQURXUklURSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyNykpO1xuY29uc3QgU09DS19TSFVURE9XTiA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyOCkpO1xuY29uc3QgU09DS19BQ0NFUFQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjkpKTtcbmNvbnN0IFdhc2lSaWdodHMgPSB7XG4gICAgRkRfREFUQVNZTkMsXG4gICAgRkRfUkVBRCxcbiAgICBGRF9TRUVLLFxuICAgIEZEX0ZEU1RBVF9TRVRfRkxBR1MsXG4gICAgRkRfU1lOQyxcbiAgICBGRF9URUxMLFxuICAgIEZEX1dSSVRFLFxuICAgIEZEX0FEVklTRSxcbiAgICBGRF9BTExPQ0FURSxcbiAgICBQQVRIX0NSRUFURV9ESVJFQ1RPUlksXG4gICAgUEFUSF9DUkVBVEVfRklMRSxcbiAgICBQQVRIX0xJTktfU09VUkNFLFxuICAgIFBBVEhfTElOS19UQVJHRVQsXG4gICAgUEFUSF9PUEVOLFxuICAgIEZEX1JFQURESVIsXG4gICAgUEFUSF9SRUFETElOSyxcbiAgICBQQVRIX1JFTkFNRV9TT1VSQ0UsXG4gICAgUEFUSF9SRU5BTUVfVEFSR0VULFxuICAgIFBBVEhfRklMRVNUQVRfR0VULFxuICAgIFBBVEhfRklMRVNUQVRfU0VUX1NJWkUsXG4gICAgUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMsXG4gICAgRkRfRklMRVNUQVRfR0VULFxuICAgIEZEX0ZJTEVTVEFUX1NFVF9TSVpFLFxuICAgIEZEX0ZJTEVTVEFUX1NFVF9USU1FUyxcbiAgICBQQVRIX1NZTUxJTkssXG4gICAgUEFUSF9SRU1PVkVfRElSRUNUT1JZLFxuICAgIFBBVEhfVU5MSU5LX0ZJTEUsXG4gICAgUE9MTF9GRF9SRUFEV1JJVEUsXG4gICAgU09DS19TSFVURE9XTixcbiAgICBTT0NLX0FDQ0VQVFxufTtcblxuZnVuY3Rpb24gc3RyZXJyb3IoZXJybm8pIHtcbiAgICBzd2l0Y2ggKGVycm5vKSB7XG4gICAgICAgIGNhc2UgMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi86IHJldHVybiAnU3VjY2Vzcyc7XG4gICAgICAgIGNhc2UgMSAvKiBXYXNpRXJybm8uRTJCSUcgKi86IHJldHVybiAnQXJndW1lbnQgbGlzdCB0b28gbG9uZyc7XG4gICAgICAgIGNhc2UgMiAvKiBXYXNpRXJybm8uRUFDQ0VTICovOiByZXR1cm4gJ1Blcm1pc3Npb24gZGVuaWVkJztcbiAgICAgICAgY2FzZSAzIC8qIFdhc2lFcnJuby5FQUREUklOVVNFICovOiByZXR1cm4gJ0FkZHJlc3MgaW4gdXNlJztcbiAgICAgICAgY2FzZSA0IC8qIFdhc2lFcnJuby5FQUREUk5PVEFWQUlMICovOiByZXR1cm4gJ0FkZHJlc3Mgbm90IGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNSAvKiBXYXNpRXJybm8uRUFGTk9TVVBQT1JUICovOiByZXR1cm4gJ0FkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wnO1xuICAgICAgICBjYXNlIDYgLyogV2FzaUVycm5vLkVBR0FJTiAqLzogcmV0dXJuICdSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNyAvKiBXYXNpRXJybm8uRUFMUkVBRFkgKi86IHJldHVybiAnT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MnO1xuICAgICAgICBjYXNlIDggLyogV2FzaUVycm5vLkVCQURGICovOiByZXR1cm4gJ0JhZCBmaWxlIGRlc2NyaXB0b3InO1xuICAgICAgICBjYXNlIDkgLyogV2FzaUVycm5vLkVCQURNU0cgKi86IHJldHVybiAnQmFkIG1lc3NhZ2UnO1xuICAgICAgICBjYXNlIDEwIC8qIFdhc2lFcnJuby5FQlVTWSAqLzogcmV0dXJuICdSZXNvdXJjZSBidXN5JztcbiAgICAgICAgY2FzZSAxMSAvKiBXYXNpRXJybm8uRUNBTkNFTEVEICovOiByZXR1cm4gJ09wZXJhdGlvbiBjYW5jZWxlZCc7XG4gICAgICAgIGNhc2UgMTIgLyogV2FzaUVycm5vLkVDSElMRCAqLzogcmV0dXJuICdObyBjaGlsZCBwcm9jZXNzJztcbiAgICAgICAgY2FzZSAxMyAvKiBXYXNpRXJybm8uRUNPTk5BQk9SVEVEICovOiByZXR1cm4gJ0Nvbm5lY3Rpb24gYWJvcnRlZCc7XG4gICAgICAgIGNhc2UgMTQgLyogV2FzaUVycm5vLkVDT05OUkVGVVNFRCAqLzogcmV0dXJuICdDb25uZWN0aW9uIHJlZnVzZWQnO1xuICAgICAgICBjYXNlIDE1IC8qIFdhc2lFcnJuby5FQ09OTlJFU0VUICovOiByZXR1cm4gJ0Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcic7XG4gICAgICAgIGNhc2UgMTYgLyogV2FzaUVycm5vLkVERUFETEsgKi86IHJldHVybiAnUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXInO1xuICAgICAgICBjYXNlIDE3IC8qIFdhc2lFcnJuby5FREVTVEFERFJSRVEgKi86IHJldHVybiAnRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCc7XG4gICAgICAgIGNhc2UgMTggLyogV2FzaUVycm5vLkVET00gKi86IHJldHVybiAnRG9tYWluIGVycm9yJztcbiAgICAgICAgY2FzZSAxOSAvKiBXYXNpRXJybm8uRURRVU9UICovOiByZXR1cm4gJ1F1b3RhIGV4Y2VlZGVkJztcbiAgICAgICAgY2FzZSAyMCAvKiBXYXNpRXJybm8uRUVYSVNUICovOiByZXR1cm4gJ0ZpbGUgZXhpc3RzJztcbiAgICAgICAgY2FzZSAyMSAvKiBXYXNpRXJybm8uRUZBVUxUICovOiByZXR1cm4gJ0JhZCBhZGRyZXNzJztcbiAgICAgICAgY2FzZSAyMiAvKiBXYXNpRXJybm8uRUZCSUcgKi86IHJldHVybiAnRmlsZSB0b28gbGFyZ2UnO1xuICAgICAgICBjYXNlIDIzIC8qIFdhc2lFcnJuby5FSE9TVFVOUkVBQ0ggKi86IHJldHVybiAnSG9zdCBpcyB1bnJlYWNoYWJsZSc7XG4gICAgICAgIGNhc2UgMjQgLyogV2FzaUVycm5vLkVJRFJNICovOiByZXR1cm4gJ0lkZW50aWZpZXIgcmVtb3ZlZCc7XG4gICAgICAgIGNhc2UgMjUgLyogV2FzaUVycm5vLkVJTFNFUSAqLzogcmV0dXJuICdJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UnO1xuICAgICAgICBjYXNlIDI2IC8qIFdhc2lFcnJuby5FSU5QUk9HUkVTUyAqLzogcmV0dXJuICdPcGVyYXRpb24gaW4gcHJvZ3Jlc3MnO1xuICAgICAgICBjYXNlIDI3IC8qIFdhc2lFcnJuby5FSU5UUiAqLzogcmV0dXJuICdJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCc7XG4gICAgICAgIGNhc2UgMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLzogcmV0dXJuICdJbnZhbGlkIGFyZ3VtZW50JztcbiAgICAgICAgY2FzZSAyOSAvKiBXYXNpRXJybm8uRUlPICovOiByZXR1cm4gJ0kvTyBlcnJvcic7XG4gICAgICAgIGNhc2UgMzAgLyogV2FzaUVycm5vLkVJU0NPTk4gKi86IHJldHVybiAnU29ja2V0IGlzIGNvbm5lY3RlZCc7XG4gICAgICAgIGNhc2UgMzEgLyogV2FzaUVycm5vLkVJU0RJUiAqLzogcmV0dXJuICdJcyBhIGRpcmVjdG9yeSc7XG4gICAgICAgIGNhc2UgMzIgLyogV2FzaUVycm5vLkVMT09QICovOiByZXR1cm4gJ1N5bWJvbGljIGxpbmsgbG9vcCc7XG4gICAgICAgIGNhc2UgMzMgLyogV2FzaUVycm5vLkVNRklMRSAqLzogcmV0dXJuICdObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgMzQgLyogV2FzaUVycm5vLkVNTElOSyAqLzogcmV0dXJuICdUb28gbWFueSBsaW5rcyc7XG4gICAgICAgIGNhc2UgMzUgLyogV2FzaUVycm5vLkVNU0dTSVpFICovOiByZXR1cm4gJ01lc3NhZ2UgdG9vIGxhcmdlJztcbiAgICAgICAgY2FzZSAzNiAvKiBXYXNpRXJybm8uRU1VTFRJSE9QICovOiByZXR1cm4gJ011bHRpaG9wIGF0dGVtcHRlZCc7XG4gICAgICAgIGNhc2UgMzcgLyogV2FzaUVycm5vLkVOQU1FVE9PTE9ORyAqLzogcmV0dXJuICdGaWxlbmFtZSB0b28gbG9uZyc7XG4gICAgICAgIGNhc2UgMzggLyogV2FzaUVycm5vLkVORVRET1dOICovOiByZXR1cm4gJ05ldHdvcmsgaXMgZG93bic7XG4gICAgICAgIGNhc2UgMzkgLyogV2FzaUVycm5vLkVORVRSRVNFVCAqLzogcmV0dXJuICdDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsnO1xuICAgICAgICBjYXNlIDQwIC8qIFdhc2lFcnJuby5FTkVUVU5SRUFDSCAqLzogcmV0dXJuICdOZXR3b3JrIHVucmVhY2hhYmxlJztcbiAgICAgICAgY2FzZSA0MSAvKiBXYXNpRXJybm8uRU5GSUxFICovOiByZXR1cm4gJ1RvbyBtYW55IGZpbGVzIG9wZW4gaW4gc3lzdGVtJztcbiAgICAgICAgY2FzZSA0MiAvKiBXYXNpRXJybm8uRU5PQlVGUyAqLzogcmV0dXJuICdObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlJztcbiAgICAgICAgY2FzZSA0MyAvKiBXYXNpRXJybm8uRU5PREVWICovOiByZXR1cm4gJ05vIHN1Y2ggZGV2aWNlJztcbiAgICAgICAgY2FzZSA0NCAvKiBXYXNpRXJybm8uRU5PRU5UICovOiByZXR1cm4gJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknO1xuICAgICAgICBjYXNlIDQ1IC8qIFdhc2lFcnJuby5FTk9FWEVDICovOiByZXR1cm4gJ0V4ZWMgZm9ybWF0IGVycm9yJztcbiAgICAgICAgY2FzZSA0NiAvKiBXYXNpRXJybm8uRU5PTENLICovOiByZXR1cm4gJ05vIGxvY2tzIGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNDcgLyogV2FzaUVycm5vLkVOT0xJTksgKi86IHJldHVybiAnTGluayBoYXMgYmVlbiBzZXZlcmVkJztcbiAgICAgICAgY2FzZSA0OCAvKiBXYXNpRXJybm8uRU5PTUVNICovOiByZXR1cm4gJ091dCBvZiBtZW1vcnknO1xuICAgICAgICBjYXNlIDQ5IC8qIFdhc2lFcnJuby5FTk9NU0cgKi86IHJldHVybiAnTm8gbWVzc2FnZSBvZiB0aGUgZGVzaXJlZCB0eXBlJztcbiAgICAgICAgY2FzZSA1MCAvKiBXYXNpRXJybm8uRU5PUFJPVE9PUFQgKi86IHJldHVybiAnUHJvdG9jb2wgbm90IGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNTEgLyogV2FzaUVycm5vLkVOT1NQQyAqLzogcmV0dXJuICdObyBzcGFjZSBsZWZ0IG9uIGRldmljZSc7XG4gICAgICAgIGNhc2UgNTIgLyogV2FzaUVycm5vLkVOT1NZUyAqLzogcmV0dXJuICdGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQnO1xuICAgICAgICBjYXNlIDUzIC8qIFdhc2lFcnJuby5FTk9UQ09OTiAqLzogcmV0dXJuICdTb2NrZXQgbm90IGNvbm5lY3RlZCc7XG4gICAgICAgIGNhc2UgNTQgLyogV2FzaUVycm5vLkVOT1RESVIgKi86IHJldHVybiAnTm90IGEgZGlyZWN0b3J5JztcbiAgICAgICAgY2FzZSA1NSAvKiBXYXNpRXJybm8uRU5PVEVNUFRZICovOiByZXR1cm4gJ0RpcmVjdG9yeSBub3QgZW1wdHknO1xuICAgICAgICBjYXNlIDU2IC8qIFdhc2lFcnJuby5FTk9UUkVDT1ZFUkFCTEUgKi86IHJldHVybiAnU3RhdGUgbm90IHJlY292ZXJhYmxlJztcbiAgICAgICAgY2FzZSA1NyAvKiBXYXNpRXJybm8uRU5PVFNPQ0sgKi86IHJldHVybiAnTm90IGEgc29ja2V0JztcbiAgICAgICAgY2FzZSA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLzogcmV0dXJuICdOb3Qgc3VwcG9ydGVkJztcbiAgICAgICAgY2FzZSA1OSAvKiBXYXNpRXJybm8uRU5PVFRZICovOiByZXR1cm4gJ05vdCBhIHR0eSc7XG4gICAgICAgIGNhc2UgNjAgLyogV2FzaUVycm5vLkVOWElPICovOiByZXR1cm4gJ05vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MnO1xuICAgICAgICBjYXNlIDYxIC8qIFdhc2lFcnJuby5FT1ZFUkZMT1cgKi86IHJldHVybiAnVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUnO1xuICAgICAgICBjYXNlIDYyIC8qIFdhc2lFcnJuby5FT1dORVJERUFEICovOiByZXR1cm4gJ1ByZXZpb3VzIG93bmVyIGRpZWQnO1xuICAgICAgICBjYXNlIDYzIC8qIFdhc2lFcnJuby5FUEVSTSAqLzogcmV0dXJuICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCc7XG4gICAgICAgIGNhc2UgNjQgLyogV2FzaUVycm5vLkVQSVBFICovOiByZXR1cm4gJ0Jyb2tlbiBwaXBlJztcbiAgICAgICAgY2FzZSA2NSAvKiBXYXNpRXJybm8uRVBST1RPICovOiByZXR1cm4gJ1Byb3RvY29sIGVycm9yJztcbiAgICAgICAgY2FzZSA2NiAvKiBXYXNpRXJybm8uRVBST1RPTk9TVVBQT1JUICovOiByZXR1cm4gJ1Byb3RvY29sIG5vdCBzdXBwb3J0ZWQnO1xuICAgICAgICBjYXNlIDY3IC8qIFdhc2lFcnJuby5FUFJPVE9UWVBFICovOiByZXR1cm4gJ1Byb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCc7XG4gICAgICAgIGNhc2UgNjggLyogV2FzaUVycm5vLkVSQU5HRSAqLzogcmV0dXJuICdSZXN1bHQgbm90IHJlcHJlc2VudGFibGUnO1xuICAgICAgICBjYXNlIDY5IC8qIFdhc2lFcnJuby5FUk9GUyAqLzogcmV0dXJuICdSZWFkLW9ubHkgZmlsZSBzeXN0ZW0nO1xuICAgICAgICBjYXNlIDcwIC8qIFdhc2lFcnJuby5FU1BJUEUgKi86IHJldHVybiAnSW52YWxpZCBzZWVrJztcbiAgICAgICAgY2FzZSA3MSAvKiBXYXNpRXJybm8uRVNSQ0ggKi86IHJldHVybiAnTm8gc3VjaCBwcm9jZXNzJztcbiAgICAgICAgY2FzZSA3MiAvKiBXYXNpRXJybm8uRVNUQUxFICovOiByZXR1cm4gJ1N0YWxlIGZpbGUgaGFuZGxlJztcbiAgICAgICAgY2FzZSA3MyAvKiBXYXNpRXJybm8uRVRJTUVET1VUICovOiByZXR1cm4gJ09wZXJhdGlvbiB0aW1lZCBvdXQnO1xuICAgICAgICBjYXNlIDc0IC8qIFdhc2lFcnJuby5FVFhUQlNZICovOiByZXR1cm4gJ1RleHQgZmlsZSBidXN5JztcbiAgICAgICAgY2FzZSA3NSAvKiBXYXNpRXJybm8uRVhERVYgKi86IHJldHVybiAnQ3Jvc3MtZGV2aWNlIGxpbmsnO1xuICAgICAgICBjYXNlIDc2IC8qIFdhc2lFcnJuby5FTk9UQ0FQQUJMRSAqLzogcmV0dXJuICdDYXBhYmlsaXRpZXMgaW5zdWZmaWNpZW50JztcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICdVbmtub3duIGVycm9yJztcbiAgICB9XG59XG5jbGFzcyBXYXNpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZXJybm8pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZXJybm8gPSBlcnJubztcbiAgICB9XG4gICAgZ2V0RXJyb3JNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gc3RyZXJyb3IodGhpcy5lcnJubyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdhc2lFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ1dhc2lFcnJvcidcbn0pO1xuXG5jb25zdCBSSUdIVFNfQUxMID0gV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9SRUFEIHxcbiAgICBXYXNpUmlnaHRzLkZEX1NFRUsgfFxuICAgIFdhc2lSaWdodHMuRkRfRkRTVEFUX1NFVF9GTEFHUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9TWU5DIHxcbiAgICBXYXNpUmlnaHRzLkZEX1RFTEwgfFxuICAgIFdhc2lSaWdodHMuRkRfV1JJVEUgfFxuICAgIFdhc2lSaWdodHMuRkRfQURWSVNFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0FMTE9DQVRFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0NSRUFURV9GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX09QRU4gfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUiB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfU0laRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX1NFVF9TSVpFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSyB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1VOTElOS19GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURSB8XG4gICAgV2FzaVJpZ2h0cy5TT0NLX1NIVVRET1dOIHxcbiAgICBXYXNpUmlnaHRzLlNPQ0tfQUNDRVBUO1xuY29uc3QgQkxPQ0tfREVWSUNFX0JBU0UgPSBSSUdIVFNfQUxMO1xuY29uc3QgQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkcgPSBSSUdIVFNfQUxMO1xuY29uc3QgQ0hBUkFDVEVSX0RFVklDRV9CQVNFID0gUklHSFRTX0FMTDtcbmNvbnN0IENIQVJBQ1RFUl9ERVZJQ0VfSU5IRVJJVElORyA9IFJJR0hUU19BTEw7XG5jb25zdCBSRUdVTEFSX0ZJTEVfQkFTRSA9IFdhc2lSaWdodHMuRkRfREFUQVNZTkMgfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRCB8XG4gICAgV2FzaVJpZ2h0cy5GRF9TRUVLIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZEU1RBVF9TRVRfRkxBR1MgfFxuICAgIFdhc2lSaWdodHMuRkRfU1lOQyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9URUxMIHxcbiAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0FEVklTRSB8XG4gICAgV2FzaVJpZ2h0cy5GRF9BTExPQ0FURSB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1NJWkUgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLlBPTExfRkRfUkVBRFdSSVRFO1xuY29uc3QgUkVHVUxBUl9GSUxFX0lOSEVSSVRJTkcgPSAvKiNfX1BVUkVfXyovIEJpZ0ludCgwKTtcbmNvbnN0IERJUkVDVE9SWV9CQVNFID0gV2FzaVJpZ2h0cy5GRF9GRFNUQVRfU0VUX0ZMQUdTIHxcbiAgICBXYXNpUmlnaHRzLkZEX1NZTkMgfFxuICAgIFdhc2lSaWdodHMuRkRfQURWSVNFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0NSRUFURV9GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX09QRU4gfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUiB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfU0laRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSyB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1VOTElOS19GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURTtcbmNvbnN0IERJUkVDVE9SWV9JTkhFUklUSU5HID0gRElSRUNUT1JZX0JBU0UgfCBSRUdVTEFSX0ZJTEVfQkFTRTtcbmNvbnN0IFNPQ0tFVF9CQVNFID0gKFdhc2lSaWdodHMuRkRfUkVBRCB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GRFNUQVRfU0VUX0ZMQUdTIHxcbiAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX0dFVCB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURSB8XG4gICAgV2FzaVJpZ2h0cy5TT0NLX1NIVVRET1dOKTtcbmNvbnN0IFNPQ0tFVF9JTkhFUklUSU5HID0gUklHSFRTX0FMTDtcbmNvbnN0IFRUWV9CQVNFID0gV2FzaVJpZ2h0cy5GRF9SRUFEIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZEU1RBVF9TRVRfRkxBR1MgfFxuICAgIFdhc2lSaWdodHMuRkRfV1JJVEUgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfR0VUIHxcbiAgICBXYXNpUmlnaHRzLlBPTExfRkRfUkVBRFdSSVRFO1xuY29uc3QgVFRZX0lOSEVSSVRJTkcgPSAvKiNfX1BVUkVfXyovIEJpZ0ludCgwKTtcbmZ1bmN0aW9uIGdldFJpZ2h0cyhzdGRpbywgZmQsIGZsYWdzLCB0eXBlKSB7XG4gICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBiYXNlOiBCaWdJbnQoMCksXG4gICAgICAgIGluaGVyaXRpbmc6IEJpZ0ludCgwKVxuICAgIH07XG4gICAgaWYgKHR5cGUgPT09IDAgLyogV2FzaUZpbGVUeXBlLlVOS05PV04gKi8pIHtcbiAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignVW5rbm93biBmaWxlIHR5cGUnLCAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgNCAvKiBXYXNpRmlsZVR5cGUuUkVHVUxBUl9GSUxFICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBSRUdVTEFSX0ZJTEVfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gUkVHVUxBUl9GSUxFX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzIC8qIFdhc2lGaWxlVHlwZS5ESVJFQ1RPUlkgKi86XG4gICAgICAgICAgICByZXQuYmFzZSA9IERJUkVDVE9SWV9CQVNFO1xuICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBESVJFQ1RPUllfSU5IRVJJVElORztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDYgLyogV2FzaUZpbGVUeXBlLlNPQ0tFVF9TVFJFQU0gKi86XG4gICAgICAgIGNhc2UgNSAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX0RHUkFNICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBTT0NLRVRfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gU09DS0VUX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyIC8qIFdhc2lGaWxlVHlwZS5DSEFSQUNURVJfREVWSUNFICovOlxuICAgICAgICAgICAgaWYgKHN0ZGlvLmluZGV4T2YoZmQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldC5iYXNlID0gVFRZX0JBU0U7XG4gICAgICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBUVFlfSU5IRVJJVElORztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldC5iYXNlID0gQ0hBUkFDVEVSX0RFVklDRV9CQVNFO1xuICAgICAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gQ0hBUkFDVEVSX0RFVklDRV9JTkhFUklUSU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMSAvKiBXYXNpRmlsZVR5cGUuQkxPQ0tfREVWSUNFICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBCTE9DS19ERVZJQ0VfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldC5iYXNlID0gQmlnSW50KDApO1xuICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBCaWdJbnQoMCk7XG4gICAgfVxuICAgIC8qIERpc2FibGUgcmVhZC93cml0ZSBiaXRzIGRlcGVuZGluZyBvbiBhY2Nlc3MgbW9kZS4gKi9cbiAgICBjb25zdCByZWFkX29yX3dyaXRlX29ubHkgPSBmbGFncyAmICgwIHwgMSB8IDIpO1xuICAgIGlmIChyZWFkX29yX3dyaXRlX29ubHkgPT09IDApIHtcbiAgICAgICAgcmV0LmJhc2UgJj0gfldhc2lSaWdodHMuRkRfV1JJVEU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlYWRfb3Jfd3JpdGVfb25seSA9PT0gMSkge1xuICAgICAgICByZXQuYmFzZSAmPSB+V2FzaVJpZ2h0cy5GRF9SRUFEO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjb25jYXRCdWZmZXIoYnVmZmVycywgc2l6ZSkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJyAmJiBzaXplID49IDApIHtcbiAgICAgICAgdG90YWwgPSBzaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBidWZmZXJzW2ldO1xuICAgICAgICAgICAgdG90YWwgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcG9zID0gMDtcbiAgICBjb25zdCByZXQgPSBuZXcgVWludDhBcnJheSh0b3RhbCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlcnNbaV07XG4gICAgICAgIHJldC5zZXQoYnVmZmVyLCBwb3MpO1xuICAgICAgICBwb3MgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmNsYXNzIEZpbGVEZXNjcmlwdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgZmQsIHBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5mZCA9IGZkO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnJlYWxQYXRoID0gcmVhbFBhdGg7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMucmlnaHRzQmFzZSA9IHJpZ2h0c0Jhc2U7XG4gICAgICAgIHRoaXMucmlnaHRzSW5oZXJpdGluZyA9IHJpZ2h0c0luaGVyaXRpbmc7XG4gICAgICAgIHRoaXMucHJlb3BlbiA9IHByZW9wZW47XG4gICAgICAgIHRoaXMucG9zID0gQmlnSW50KDApO1xuICAgICAgICB0aGlzLnNpemUgPSBCaWdJbnQoMCk7XG4gICAgfVxuICAgIHNlZWsob2Zmc2V0LCB3aGVuY2UpIHtcbiAgICAgICAgaWYgKHdoZW5jZSA9PT0gMCAvKiBXYXNpV2hlbmNlLlNFVCAqLykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBCaWdJbnQob2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aGVuY2UgPT09IDEgLyogV2FzaVdoZW5jZS5DVVIgKi8pIHtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IEJpZ0ludChvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdoZW5jZSA9PT0gMiAvKiBXYXNpV2hlbmNlLkVORCAqLykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBCaWdJbnQodGhpcy5zaXplKSAtIEJpZ0ludChvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignVW5rbm93biB3aGVuY2UnLCAyOSAvKiBXYXNpRXJybm8uRUlPICovKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3M7XG4gICAgfVxufVxuY2xhc3MgU3RhbmRhcmRPdXRwdXQgZXh0ZW5kcyBGaWxlRGVzY3JpcHRvciB7XG4gICAgY29uc3RydWN0b3IobG9nLCBpZCwgZmQsIHBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHN1cGVyKGlkLCBmZCwgcGF0aCwgcmVhbFBhdGgsIHR5cGUsIHJpZ2h0c0Jhc2UsIHJpZ2h0c0luaGVyaXRpbmcsIHByZW9wZW4pO1xuICAgICAgICB0aGlzLl9sb2cgPSBsb2c7XG4gICAgICAgIHRoaXMuX2J1ZiA9IG51bGw7XG4gICAgfVxuICAgIHdyaXRlKGJ1ZmZlcikge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgaWYgKHRoaXMuX2J1Zikge1xuICAgICAgICAgICAgYnVmZmVyID0gY29uY2F0QnVmZmVyKFt0aGlzLl9idWYsIGJ1ZmZlcl0pO1xuICAgICAgICAgICAgdGhpcy5fYnVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmZmVyLmluZGV4T2YoMTApID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fYnVmID0gYnVmZmVyO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsQnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdyaXR0ZW4gPSAwO1xuICAgICAgICBsZXQgbGFzdEJlZ2luID0gMDtcbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICB3aGlsZSAoKGluZGV4ID0gYnVmZmVyLmluZGV4T2YoMTAsIHdyaXR0ZW4pKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShidWZmZXIuc3ViYXJyYXkobGFzdEJlZ2luLCBpbmRleCkpO1xuICAgICAgICAgICAgdGhpcy5fbG9nKHN0cik7XG4gICAgICAgICAgICB3cml0dGVuICs9IGluZGV4IC0gbGFzdEJlZ2luICsgMTtcbiAgICAgICAgICAgIGxhc3RCZWdpbiA9IGluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JpdHRlbiA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZiA9IGJ1ZmZlci5zbGljZSh3cml0dGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9XG59XG5mdW5jdGlvbiB0b0ZpbGVUeXBlKHN0YXQpIHtcbiAgICBpZiAoc3RhdC5pc0Jsb2NrRGV2aWNlKCkpXG4gICAgICAgIHJldHVybiAxIC8qIFdhc2lGaWxlVHlwZS5CTE9DS19ERVZJQ0UgKi87XG4gICAgaWYgKHN0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSlcbiAgICAgICAgcmV0dXJuIDIgLyogV2FzaUZpbGVUeXBlLkNIQVJBQ1RFUl9ERVZJQ0UgKi87XG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgcmV0dXJuIDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLztcbiAgICBpZiAoc3RhdC5pc1NvY2tldCgpKVxuICAgICAgICByZXR1cm4gNiAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX1NUUkVBTSAqLztcbiAgICBpZiAoc3RhdC5pc0ZpbGUoKSlcbiAgICAgICAgcmV0dXJuIDQgLyogV2FzaUZpbGVUeXBlLlJFR1VMQVJfRklMRSAqLztcbiAgICBpZiAoc3RhdC5pc1N5bWJvbGljTGluaygpKVxuICAgICAgICByZXR1cm4gNyAvKiBXYXNpRmlsZVR5cGUuU1lNQk9MSUNfTElOSyAqLztcbiAgICByZXR1cm4gMCAvKiBXYXNpRmlsZVR5cGUuVU5LTk9XTiAqLztcbn1cbmZ1bmN0aW9uIHRvRmlsZVN0YXQodmlldywgYnVmLCBzdGF0KSB7XG4gICAgdmlldy5zZXRCaWdVaW50NjQoYnVmLCBzdGF0LmRldiwgdHJ1ZSk7XG4gICAgdmlldy5zZXRCaWdVaW50NjQoYnVmICsgOCwgc3RhdC5pbm8sIHRydWUpO1xuICAgIHZpZXcuc2V0QmlnVWludDY0KGJ1ZiArIDE2LCBCaWdJbnQodG9GaWxlVHlwZShzdGF0KSksIHRydWUpO1xuICAgIHZpZXcuc2V0QmlnVWludDY0KGJ1ZiArIDI0LCBzdGF0Lm5saW5rLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyAzMiwgc3RhdC5zaXplLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA0MCwgc3RhdC5hdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA0OCwgc3RhdC5tdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA1Niwgc3RhdC5jdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbn1cbmNsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy51c2VkID0gMDtcbiAgICAgICAgdGhpcy5zaXplID0gb3B0aW9ucy5zaXplO1xuICAgICAgICB0aGlzLmZkcyA9IEFycmF5KG9wdGlvbnMuc2l6ZSk7XG4gICAgICAgIHRoaXMuc3RkaW8gPSBbb3B0aW9ucy5pbiwgb3B0aW9ucy5vdXQsIG9wdGlvbnMuZXJyXTtcbiAgICAgICAgdGhpcy5wcmludCA9IG9wdGlvbnMucHJpbnQ7XG4gICAgICAgIHRoaXMucHJpbnRFcnIgPSBvcHRpb25zLnByaW50RXJyO1xuICAgICAgICB0aGlzLmluc2VydFN0ZGlvKG9wdGlvbnMuaW4sIDAsICc8c3RkaW4+Jyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0U3RkaW8ob3B0aW9ucy5vdXQsIDEsICc8c3Rkb3V0PicpO1xuICAgICAgICB0aGlzLmluc2VydFN0ZGlvKG9wdGlvbnMuZXJyLCAyLCAnPHN0ZGVycj4nKTtcbiAgICB9XG4gICAgaW5zZXJ0U3RkaW8oZmQsIGV4cGVjdGVkLCBuYW1lKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAyIC8qIFdhc2lGaWxlVHlwZS5DSEFSQUNURVJfREVWSUNFICovO1xuICAgICAgICBjb25zdCB7IGJhc2UsIGluaGVyaXRpbmcgfSA9IGdldFJpZ2h0cyh0aGlzLnN0ZGlvLCBmZCwgMiAvKiBGaWxlQ29udHJvbEZsYWcuT19SRFdSICovLCB0eXBlKTtcbiAgICAgICAgY29uc3Qgd3JhcCA9IHRoaXMuaW5zZXJ0KGZkLCBuYW1lLCBuYW1lLCB0eXBlLCBiYXNlLCBpbmhlcml0aW5nLCAwKTtcbiAgICAgICAgaWYgKHdyYXAuaWQgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKGBpZDogJHt3cmFwLmlkfSAhPT0gZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YCwgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwO1xuICAgIH1cbiAgICBpbnNlcnQoZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICBpZiAodGhpcy51c2VkID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbmV3U2l6ZSA9IHRoaXMuc2l6ZSAqIDI7XG4gICAgICAgICAgICB0aGlzLmZkcy5sZW5ndGggPSBuZXdTaXplO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnNpemU7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBuZXdTaXplO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemU7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZkc1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyeTtcbiAgICAgICAgaWYgKG1hcHBlZFBhdGggPT09ICc8c3Rkb3V0PicpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gbmV3IFN0YW5kYXJkT3V0cHV0KChfYSA9IHRoaXMucHJpbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnNvbGUubG9nLCBpbmRleCwgZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXBwZWRQYXRoID09PSAnPHN0ZGVycj4nKSB7XG4gICAgICAgICAgICBlbnRyeSA9IG5ldyBTdGFuZGFyZE91dHB1dCgoX2IgPSB0aGlzLnByaW50RXJyKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBjb25zb2xlLmVycm9yLCBpbmRleCwgZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVudHJ5ID0gbmV3IEZpbGVEZXNjcmlwdG9yKGluZGV4LCBmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgsIHR5cGUsIHJpZ2h0c0Jhc2UsIHJpZ2h0c0luaGVyaXRpbmcsIHByZW9wZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmRzW2luZGV4XSA9IGVudHJ5O1xuICAgICAgICB0aGlzLnVzZWQrKztcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgICBnZXQoaWQsIGJhc2UsIGluaGVyaXRpbmcpIHtcbiAgICAgICAgaWYgKGlkID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignSW52YWxpZCBmZCcsIDggLyogV2FzaUVycm5vLkVCQURGICovKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZmRzW2lkXTtcbiAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5pZCAhPT0gaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0JhZCBmaWxlIGRlc2NyaXB0b3InLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogVmFsaWRhdGUgdGhhdCB0aGUgZmQgaGFzIHRoZSBuZWNlc3NhcnkgcmlnaHRzLiAqL1xuICAgICAgICBpZiAoKH5lbnRyeS5yaWdodHNCYXNlICYgYmFzZSkgIT09IEJpZ0ludCgwKSB8fCAofmVudHJ5LnJpZ2h0c0luaGVyaXRpbmcgJiBpbmhlcml0aW5nKSAhPT0gQmlnSW50KDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdDYXBhYmlsaXRpZXMgaW5zdWZmaWNpZW50JywgNzYgLyogV2FzaUVycm5vLkVOT1RDQVBBQkxFICovKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIHJlbW92ZShpZCkge1xuICAgICAgICBpZiAoaWQgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5mZHNbaWRdO1xuICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmlkICE9PSBpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignQmFkIGZpbGUgZGVzY3JpcHRvcicsIDggLyogV2FzaUVycm5vLkVCQURGICovKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZkc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXNlZC0tO1xuICAgIH1cbn1cbmNsYXNzIFN5bmNUYWJsZSBleHRlbmRzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZnMgPSBvcHRpb25zLmZzO1xuICAgIH1cbiAgICBnZXRGaWxlVHlwZUJ5RmQoZmQpIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmZzLmZzdGF0U3luYyhmZCwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0b0ZpbGVUeXBlKHN0YXRzKTtcbiAgICB9XG4gICAgaW5zZXJ0UHJlb3BlbihmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGVCeUZkKGZkKTtcbiAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcihgUHJlb3BlbiBub3QgZGlyOiBbXCIke21hcHBlZFBhdGh9XCIsIFwiJHtyZWFsUGF0aH1cIl1gLCA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UmlnaHRzKHRoaXMuc3RkaW8sIGZkLCAwLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZkLCBtYXBwZWRQYXRoLCByZWFsUGF0aCwgdHlwZSwgcmVzdWx0LmJhc2UsIHJlc3VsdC5pbmhlcml0aW5nLCAxKTtcbiAgICB9XG4gICAgcmVudW1iZXIoZHN0LCBzcmMpIHtcbiAgICAgICAgaWYgKGRzdCA9PT0gc3JjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZHN0ID49IHRoaXMuc2l6ZSB8fCBzcmMgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRzdEVudHJ5ID0gdGhpcy5mZHNbZHN0XTtcbiAgICAgICAgY29uc3Qgc3JjRW50cnkgPSB0aGlzLmZkc1tzcmNdO1xuICAgICAgICBpZiAoIWRzdEVudHJ5IHx8ICFzcmNFbnRyeSB8fCBkc3RFbnRyeS5pZCAhPT0gZHN0IHx8IHNyY0VudHJ5LmlkICE9PSBzcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0ludmFsaWQgZmQnLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcy5jbG9zZVN5bmMoZHN0RW50cnkuZmQpO1xuICAgICAgICB0aGlzLmZkc1tkc3RdID0gdGhpcy5mZHNbc3JjXTtcbiAgICAgICAgdGhpcy5mZHNbZHN0XS5pZCA9IGRzdDtcbiAgICAgICAgdGhpcy5mZHNbc3JjXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy51c2VkLS07XG4gICAgfVxufVxuY2xhc3MgQXN5bmNUYWJsZSBleHRlbmRzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jIGdldEZpbGVUeXBlQnlGZChmZCkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZkLnN0YXQoeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0b0ZpbGVUeXBlKHN0YXRzKTtcbiAgICB9XG4gICAgYXN5bmMgaW5zZXJ0UHJlb3BlbihmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMuZ2V0RmlsZVR5cGVCeUZkKGZkKTtcbiAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcihgUHJlb3BlbiBub3QgZGlyOiBbXCIke21hcHBlZFBhdGh9XCIsIFwiJHtyZWFsUGF0aH1cIl1gLCA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UmlnaHRzKHRoaXMuc3RkaW8sIGZkLmZkLCAwLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZkLCBtYXBwZWRQYXRoLCByZWFsUGF0aCwgdHlwZSwgcmVzdWx0LmJhc2UsIHJlc3VsdC5pbmhlcml0aW5nLCAxKTtcbiAgICB9XG4gICAgYXN5bmMgcmVudW1iZXIoZHN0LCBzcmMpIHtcbiAgICAgICAgaWYgKGRzdCA9PT0gc3JjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZHN0ID49IHRoaXMuc2l6ZSB8fCBzcmMgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRzdEVudHJ5ID0gdGhpcy5mZHNbZHN0XTtcbiAgICAgICAgY29uc3Qgc3JjRW50cnkgPSB0aGlzLmZkc1tzcmNdO1xuICAgICAgICBpZiAoIWRzdEVudHJ5IHx8ICFzcmNFbnRyeSB8fCBkc3RFbnRyeS5pZCAhPT0gZHN0IHx8IHNyY0VudHJ5LmlkICE9PSBzcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0ludmFsaWQgZmQnLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZHN0RW50cnkuZmQuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5mZHNbZHN0XSA9IHRoaXMuZmRzW3NyY107XG4gICAgICAgIHRoaXMuZmRzW2RzdF0uaWQgPSBkc3Q7XG4gICAgICAgIHRoaXMuZmRzW3NyY10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXNlZC0tO1xuICAgIH1cbn1cblxuLyoqIEBwdWJsaWMgKi9cbmNvbnN0IFdlYkFzc2VtYmx5TWVtb3J5ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkgeyByZXR1cm4gX1dlYkFzc2VtYmx5Lk1lbW9yeTsgfSkoKTtcbi8qKiBAcHVibGljICovXG5jbGFzcyBNZW1vcnkgZXh0ZW5kcyBXZWJBc3NlbWJseU1lbW9yeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yXG4gICAgY29uc3RydWN0b3IoZGVzY3JpcHRvcikge1xuICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgZ2V0IEhFQVA4KCkgeyByZXR1cm4gbmV3IEludDhBcnJheShzdXBlci5idWZmZXIpOyB9XG4gICAgZ2V0IEhFQVBVOCgpIHsgcmV0dXJuIG5ldyBVaW50OEFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDE2KCkgeyByZXR1cm4gbmV3IEludDE2QXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTE2KCkgeyByZXR1cm4gbmV3IFVpbnQxNkFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDMyKCkgeyByZXR1cm4gbmV3IEludDMyQXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTMyKCkgeyByZXR1cm4gbmV3IFVpbnQzMkFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDY0KCkgeyByZXR1cm4gbmV3IEJpZ0ludDY0QXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTY0KCkgeyByZXR1cm4gbmV3IEJpZ1VpbnQ2NEFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUEYzMigpIHsgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQRjY0KCkgeyByZXR1cm4gbmV3IEZsb2F0NjRBcnJheShzdXBlci5idWZmZXIpOyB9XG4gICAgZ2V0IHZpZXcoKSB7IHJldHVybiBuZXcgRGF0YVZpZXcoc3VwZXIuYnVmZmVyKTsgfVxufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGV4dGVuZE1lbW9yeShtZW1vcnkpIHtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1lbW9yeSkgPT09IF9XZWJBc3NlbWJseS5NZW1vcnkucHJvdG90eXBlKSB7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihtZW1vcnksIE1lbW9yeS5wcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gbWVtb3J5O1xufVxuXG5mdW5jdGlvbiBjaGVja1dlYkFzc2VtYmx5RnVuY3Rpb24oKSB7XG4gICAgY29uc3QgV2ViQXNzZW1ibHlGdW5jdGlvbiA9IF9XZWJBc3NlbWJseS5GdW5jdGlvbjtcbiAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5RnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJBc3NlbWJseS5GdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuJyArXG4gICAgICAgICAgICAnIElmIHlvdSBhcmUgdXNpbmcgVjggYmFzZWQgYnJvd3NlciBsaWtlIENocm9tZSwgdHJ5IHRvIHNwZWNpZnknICtcbiAgICAgICAgICAgICcgLS1qcy1mbGFncz1cIi0td2FzbS1zdGFnaW5nIC0tZXhwZXJpbWVudGFsLXdhc20tc3RhY2stc3dpdGNoaW5nXCInKTtcbiAgICB9XG4gICAgcmV0dXJuIFdlYkFzc2VtYmx5RnVuY3Rpb247XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEFzeW5jSW1wb3J0KGYsIHBhcmFtZXRlclR5cGUsIHJldHVyblR5cGUpIHtcbiAgICBjb25zdCBXZWJBc3NlbWJseUZ1bmN0aW9uID0gY2hlY2tXZWJBc3NlbWJseUZ1bmN0aW9uKCk7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJUeXBlLnNsaWNlKDApO1xuICAgIHBhcmFtZXRlcnMudW5zaGlmdCgnZXh0ZXJucmVmJyk7XG4gICAgcmV0dXJuIG5ldyBXZWJBc3NlbWJseUZ1bmN0aW9uKHsgcGFyYW1ldGVycywgcmVzdWx0czogcmV0dXJuVHlwZSB9LCBmLCB7IHN1c3BlbmRpbmc6ICdmaXJzdCcgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEFzeW5jRXhwb3J0KGYpIHtcbiAgICBjb25zdCBXZWJBc3NlbWJseUZ1bmN0aW9uID0gY2hlY2tXZWJBc3NlbWJseUZ1bmN0aW9uKCk7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgV2ViQXNzZW1ibHlGdW5jdGlvbih7IHBhcmFtZXRlcnM6IFsuLi5XZWJBc3NlbWJseUZ1bmN0aW9uLnR5cGUoZikucGFyYW1ldGVycy5zbGljZSgxKV0sIHJlc3VsdHM6IFsnZXh0ZXJucmVmJ10gfSwgZiwgeyBwcm9taXNpbmc6ICdmaXJzdCcgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEV4cG9ydHMoZXhwb3J0cywgbmVlZFdyYXApIHtcbiAgICByZXR1cm4gd3JhcEluc3RhbmNlRXhwb3J0cyhleHBvcnRzLCAoZXhwb3J0VmFsdWUsIG5hbWUpID0+IHtcbiAgICAgICAgbGV0IGlnbm9yZSA9IHR5cGVvZiBleHBvcnRWYWx1ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmVlZFdyYXApKSB7XG4gICAgICAgICAgICBpZ25vcmUgPSBpZ25vcmUgfHwgKG5lZWRXcmFwLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWdub3JlID8gZXhwb3J0VmFsdWUgOiB3cmFwQXN5bmNFeHBvcnQoZXhwb3J0VmFsdWUpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjb3B5TWVtb3J5KHRhcmdldHMsIHNyYykge1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCB8fCBzcmMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBsZXQgY29waWVkID0gMDtcbiAgICBsZXQgbGVmdCA9IHNyYy5sZW5ndGggLSBjb3BpZWQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHNbaV07XG4gICAgICAgIGlmIChsZWZ0IDwgdGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNldChzcmMuc3ViYXJyYXkoY29waWVkLCBjb3BpZWQgKyBsZWZ0KSwgMCk7XG4gICAgICAgICAgICBjb3BpZWQgKz0gbGVmdDtcbiAgICAgICAgICAgIGxlZnQgPSAwO1xuICAgICAgICAgICAgcmV0dXJuIGNvcGllZDtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuc2V0KHNyYy5zdWJhcnJheShjb3BpZWQsIGNvcGllZCArIHRhcmdldC5sZW5ndGgpLCAwKTtcbiAgICAgICAgY29waWVkICs9IHRhcmdldC5sZW5ndGg7XG4gICAgICAgIGxlZnQgLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcGllZDtcbn1cbmNvbnN0IF9tZW1vcnkgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgX3dhc2kgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgX2ZzID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIGdldE1lbW9yeSh3YXNpKSB7XG4gICAgcmV0dXJuIF9tZW1vcnkuZ2V0KHdhc2kpO1xufVxuZnVuY3Rpb24gZ2V0RnMod2FzaSkge1xuICAgIGNvbnN0IGZzID0gX2ZzLmdldCh3YXNpKTtcbiAgICBpZiAoIWZzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbGVzeXN0ZW0gaXMgdW5hdmFpbGFibGUnKTtcbiAgICByZXR1cm4gZnM7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgV2FzaUVycm9yKSB7XG4gICAgICAgIGlmICgoKHByb2Nlc3MuZW52Lk5PREVfRU5WKSkgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVyci5lcnJubztcbiAgICB9XG4gICAgc3dpdGNoIChlcnIuY29kZSkge1xuICAgICAgICBjYXNlICdFTk9FTlQnOiByZXR1cm4gNDQgLyogV2FzaUVycm5vLkVOT0VOVCAqLztcbiAgICAgICAgY2FzZSAnRUJBREYnOiByZXR1cm4gOCAvKiBXYXNpRXJybm8uRUJBREYgKi87XG4gICAgICAgIGNhc2UgJ0VJTlZBTCc6IHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICBjYXNlICdFUEVSTSc6IHJldHVybiA2MyAvKiBXYXNpRXJybm8uRVBFUk0gKi87XG4gICAgICAgIGNhc2UgJ0VQUk9UTyc6IHJldHVybiA2NSAvKiBXYXNpRXJybm8uRVBST1RPICovO1xuICAgICAgICBjYXNlICdFRVhJU1QnOiByZXR1cm4gMjAgLyogV2FzaUVycm5vLkVFWElTVCAqLztcbiAgICAgICAgY2FzZSAnRU5PVERJUic6IHJldHVybiA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLztcbiAgICAgICAgY2FzZSAnRU1GSUxFJzogcmV0dXJuIDMzIC8qIFdhc2lFcnJuby5FTUZJTEUgKi87XG4gICAgICAgIGNhc2UgJ0VBQ0NFUyc6IHJldHVybiAyIC8qIFdhc2lFcnJuby5FQUNDRVMgKi87XG4gICAgICAgIGNhc2UgJ0VJU0RJUic6IHJldHVybiAzMSAvKiBXYXNpRXJybm8uRUlTRElSICovO1xuICAgICAgICBjYXNlICdFTk9URU1QVFknOiByZXR1cm4gNTUgLyogV2FzaUVycm5vLkVOT1RFTVBUWSAqLztcbiAgICAgICAgY2FzZSAnRU5PU1lTJzogcmV0dXJuIDUyIC8qIFdhc2lFcnJuby5FTk9TWVMgKi87XG4gICAgfVxuICAgIHRocm93IGVycjtcbn1cbmZ1bmN0aW9uIGRlZmluZU5hbWUobmFtZSwgZikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG4gICAgcmV0dXJuIGY7XG59XG5mdW5jdGlvbiBzeXNjYWxsV3JhcChzZWxmLCBuYW1lLCBmKSB7XG4gICAgcmV0dXJuIGRlZmluZU5hbWUobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9ERUJVR19OQVRJVkUgPT09ICd3YXNpJykge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBsZXQgZGVidWdBcmdzID0gW2Ake25hbWV9KCR7QXJyYXkuZnJvbSh7IGxlbmd0aDogYXJndW1lbnRzLmxlbmd0aCB9KS5tYXAoKCkgPT4gJyVkJykuam9pbignLCAnKX0pYF07XG4gICAgICAgICAgICBkZWJ1Z0FyZ3MgPSBkZWJ1Z0FyZ3MuY29uY2F0KGFyZ3MpO1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1Zy5hcHBseShjb25zb2xlLCBkZWJ1Z0FyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgciA9IGYuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHIudGhlbihfID0+IF8sIGhhbmRsZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQYXRoU3luYyhmcywgZmlsZURlc2NyaXB0b3IsIHBhdGgsIGZsYWdzKSB7XG4gICAgbGV0IHJlc29sdmVkUGF0aCA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGgpO1xuICAgIGlmICgoZmxhZ3MgJiAxKSA9PT0gMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gZnMucmVhZGxpbmtTeW5jKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRUlOVkFMJyAmJiBlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQYXRoQXN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBwYXRoLCBmbGFncykge1xuICAgIGxldCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoKTtcbiAgICBpZiAoKGZsYWdzICYgMSkgPT09IDEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRsaW5rKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRUlOVkFMJyAmJiBlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzcGFjZWQtY29tbWVudFxuY29uc3QgZW5jb2RlciA9IC8qI19fUFVSRV9fKi8gbmV3IFRleHRFbmNvZGVyKCk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3BhY2VkLWNvbW1lbnRcbmNvbnN0IGRlY29kZXIgPSAvKiNfX1BVUkVfXyovIG5ldyBUZXh0RGVjb2RlcigpO1xuY29uc3QgSU5UNjRfTUFYID0gKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSAtIEJpZ0ludCgxKTtcbmZ1bmN0aW9uIHJlYWRTdGRpbigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHdpbmRvdy5wcm9tcHQoKTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSArICdcXG4nKTtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVGc3RGbGFnc09yUmV0dXJuKGZsYWdzKSB7XG4gICAgcmV0dXJuIChCb29sZWFuKChmbGFncykgJiB+KDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLyB8XG4gICAgICAgIDQgLyogV2FzaUZzdEZsYWcuU0VUX01USU0gKi8gfCA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykpIHx8XG4gICAgICAgICgoZmxhZ3MpICYgKDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykpID09PVxuICAgICAgICAgICAgKDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykgfHxcbiAgICAgICAgKChmbGFncykgJiAoNCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTSAqLyB8IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSkgPT09XG4gICAgICAgICAgICAoNCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTSAqLyB8IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSk7XG59XG5jbGFzcyBXQVNJJDEge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MsIGVudiwgZmRzLCBhc3luY0ZzLCBmcywgYXN5bmNpZnkpIHtcbiAgICAgICAgdGhpcy5hcmdzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdhcmdzX2dldCcsIGZ1bmN0aW9uIChhcmd2LCBhcmd2X2J1Zikge1xuICAgICAgICAgICAgYXJndiA9IE51bWJlcihhcmd2KTtcbiAgICAgICAgICAgIGFyZ3ZfYnVmID0gTnVtYmVyKGFyZ3ZfYnVmKTtcbiAgICAgICAgICAgIGlmIChhcmd2ID09PSAwIHx8IGFyZ3ZfYnVmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB3YXNpLmFyZ3M7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0SW50MzIoYXJndiwgYXJndl9idWYsIHRydWUpO1xuICAgICAgICAgICAgICAgIGFyZ3YgKz0gNDtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUoYXJnICsgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIEhFQVBVOC5zZXQoZGF0YSwgYXJndl9idWYpO1xuICAgICAgICAgICAgICAgIGFyZ3ZfYnVmICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hcmdzX3NpemVzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdhcmdzX3NpemVzX2dldCcsIGZ1bmN0aW9uIChhcmdjLCBhcmd2X2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBhcmdjID0gTnVtYmVyKGFyZ2MpO1xuICAgICAgICAgICAgYXJndl9idWZfc2l6ZSA9IE51bWJlcihhcmd2X2J1Zl9zaXplKTtcbiAgICAgICAgICAgIGlmIChhcmdjID09PSAwIHx8IGFyZ3ZfYnVmX3NpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB3YXNpLmFyZ3M7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihhcmdjLCBhcmdzLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihhcmd2X2J1Zl9zaXplLCBlbmNvZGVyLmVuY29kZShhcmdzLmpvaW4oJ1xcMCcpICsgJ1xcMCcpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVudmlyb25fZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2Vudmlyb25fZ2V0JywgZnVuY3Rpb24gKGVudmlyb24sIGVudmlyb25fYnVmKSB7XG4gICAgICAgICAgICBlbnZpcm9uID0gTnVtYmVyKGVudmlyb24pO1xuICAgICAgICAgICAgZW52aXJvbl9idWYgPSBOdW1iZXIoZW52aXJvbl9idWYpO1xuICAgICAgICAgICAgaWYgKGVudmlyb24gPT09IDAgfHwgZW52aXJvbl9idWYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gd2FzaS5lbnY7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBlbnZbaV07XG4gICAgICAgICAgICAgICAgdmlldy5zZXRJbnQzMihlbnZpcm9uLCBlbnZpcm9uX2J1ZiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZW52aXJvbiArPSA0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShwYWlyICsgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIEhFQVBVOC5zZXQoZGF0YSwgZW52aXJvbl9idWYpO1xuICAgICAgICAgICAgICAgIGVudmlyb25fYnVmICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbnZpcm9uX3NpemVzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdlbnZpcm9uX3NpemVzX2dldCcsIGZ1bmN0aW9uIChsZW4sIGJ1Zmxlbikge1xuICAgICAgICAgICAgbGVuID0gTnVtYmVyKGxlbik7XG4gICAgICAgICAgICBidWZsZW4gPSBOdW1iZXIoYnVmbGVuKTtcbiAgICAgICAgICAgIGlmIChsZW4gPT09IDAgfHwgYnVmbGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihsZW4sIHdhc2kuZW52Lmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihidWZsZW4sIGVuY29kZXIuZW5jb2RlKHdhc2kuZW52LmpvaW4oJ1xcMCcpICsgJ1xcMCcpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb2NrX3Jlc19nZXQgPSBzeXNjYWxsV3JhcCh0aGlzLCAnY2xvY2tfcmVzX2dldCcsIGZ1bmN0aW9uIChpZCwgcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgcmVzb2x1dGlvbiA9IE51bWJlcihyZXNvbHV0aW9uKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogV2FzaUNsb2NraWQuUkVBTFRJTUUgKi86XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KHJlc29sdXRpb24sIEJpZ0ludCgxMDAwMDAwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogV2FzaUNsb2NraWQuTU9OT1RPTklDICovOlxuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBXYXNpQ2xvY2tpZC5QUk9DRVNTX0NQVVRJTUVfSUQgKi86XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFdhc2lDbG9ja2lkLlRIUkVBRF9DUFVUSU1FX0lEICovOlxuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChyZXNvbHV0aW9uLCBCaWdJbnQoMTAwMCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb2NrX3RpbWVfZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2Nsb2NrX3RpbWVfZ2V0JywgZnVuY3Rpb24gKGlkLCBfcGVyY2lzaW9uLCB0aW1lKSB7XG4gICAgICAgICAgICB0aW1lID0gTnVtYmVyKHRpbWUpO1xuICAgICAgICAgICAgaWYgKHRpbWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgc3dpdGNoIChpZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBXYXNpQ2xvY2tpZC5SRUFMVElNRSAqLzpcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQodGltZSwgQmlnSW50KERhdGUubm93KCkpICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBXYXNpQ2xvY2tpZC5NT05PVE9OSUMgKi86XG4gICAgICAgICAgICAgICAgY2FzZSAyIC8qIFdhc2lDbG9ja2lkLlBST0NFU1NfQ1BVVElNRV9JRCAqLzpcbiAgICAgICAgICAgICAgICBjYXNlIDMgLyogV2FzaUNsb2NraWQuVEhSRUFEX0NQVVRJTUVfSUQgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHBlcmZvcm1hbmNlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IE1hdGgudHJ1bmModCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zID0gTWF0aC5mbG9vcigodCAtIHMpICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEJpZ0ludChzKSAqIEJpZ0ludCgxMDAwMDAwMDAwKSArIEJpZ0ludChtcykgKiBCaWdJbnQoMTAwMDAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KHRpbWUsIHJlc3VsdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZkX2FkdmlzZSA9IHN5c2NhbGxXcmFwKHRoaXMsICdmZF9hZHZpc2UnLCBmdW5jdGlvbiAoX2ZkLCBfb2Zmc2V0LCBfbGVuLCBfYWR2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gNTIgLyogV2FzaUVycm5vLkVOT1NZUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmRfZmRzdGF0X2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdmZF9mZHN0YXRfZ2V0JywgZnVuY3Rpb24gKGZkLCBmZHN0YXQpIHtcbiAgICAgICAgICAgIGZkc3RhdCA9IE51bWJlcihmZHN0YXQpO1xuICAgICAgICAgICAgaWYgKGZkc3RhdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBCaWdJbnQoMCksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KGZkc3RhdCwgZmlsZURlc2NyaXB0b3IudHlwZSwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQxNihmZHN0YXQgKyAyLCAwLCB0cnVlKTtcbiAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KGZkc3RhdCArIDgsIGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0Jhc2UsIHRydWUpO1xuICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQoZmRzdGF0ICsgMTYsIGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0luaGVyaXRpbmcsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9mZHN0YXRfc2V0X2ZsYWdzID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX2Zkc3RhdF9zZXRfZmxhZ3MnLCBmdW5jdGlvbiAoX2ZkLCBfZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiA1MiAvKiBXYXNpRXJybm8uRU5PU1lTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9mZHN0YXRfc2V0X3JpZ2h0cyA9IHN5c2NhbGxXcmFwKHRoaXMsICdmZF9mZHN0YXRfc2V0X3JpZ2h0cycsIGZ1bmN0aW9uIChmZCwgcmlnaHRzQmFzZSwgcmlnaHRzSW5oZXJpdGluZykge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBCaWdJbnQoMCksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoKHJpZ2h0c0Jhc2UgfCBmaWxlRGVzY3JpcHRvci5yaWdodHNCYXNlKSA+IGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0Jhc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNzYgLyogV2FzaUVycm5vLkVOT1RDQVBBQkxFICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChyaWdodHNJbmhlcml0aW5nIHwgZmlsZURlc2NyaXB0b3IucmlnaHRzSW5oZXJpdGluZykgPlxuICAgICAgICAgICAgICAgIGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0luaGVyaXRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNzYgLyogV2FzaUVycm5vLkVOT1RDQVBBQkxFICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZURlc2NyaXB0b3IucmlnaHRzQmFzZSA9IHJpZ2h0c0Jhc2U7XG4gICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5yaWdodHNJbmhlcml0aW5nID0gcmlnaHRzSW5oZXJpdGluZztcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmRfcHJlc3RhdF9nZXQgPSBzeXNjYWxsV3JhcCh0aGlzLCAnZmRfcHJlc3RhdF9nZXQnLCBmdW5jdGlvbiAoZmQsIHByZXN0YXQpIHtcbiAgICAgICAgICAgIHByZXN0YXQgPSBOdW1iZXIocHJlc3RhdCk7XG4gICAgICAgICAgICBpZiAocHJlc3RhdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGxldCBmaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIEJpZ0ludCgwKSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgV2FzaUVycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyLmVycm5vO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlRGVzY3JpcHRvci5wcmVvcGVuICE9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICAvLyBwcmVvcGVuIHR5cGUgaXMgZGlyKDApXG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihwcmVzdGF0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHByZXN0YXQgKyA0LCBlbmNvZGVyLmVuY29kZShmaWxlRGVzY3JpcHRvci5wYXRoKS5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9wcmVzdGF0X2Rpcl9uYW1lID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX3ByZXN0YXRfZGlyX25hbWUnLCBmdW5jdGlvbiAoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgQmlnSW50KDApLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKGZpbGVEZXNjcmlwdG9yLnByZW9wZW4gIT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDggLyogV2FzaUVycm5vLkVCQURGICovO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoZmlsZURlc2NyaXB0b3IucGF0aCk7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChzaXplID4gcGF0aF9sZW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIDQyIC8qIFdhc2lFcnJuby5FTk9CVUZTICovO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIEhFQVBVOC5zZXQoYnVmZmVyLCBwYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmRfc2VlayA9IHN5c2NhbGxXcmFwKHRoaXMsICdmZF9zZWVrJywgZnVuY3Rpb24gKGZkLCBvZmZzZXQsIHdoZW5jZSwgbmV3T2Zmc2V0KSB7XG4gICAgICAgICAgICBuZXdPZmZzZXQgPSBOdW1iZXIobmV3T2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChuZXdPZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmZCA9PT0gMCB8fCBmZCA9PT0gMSB8fCBmZCA9PT0gMilcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfU0VFSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBmaWxlRGVzY3JpcHRvci5zZWVrKG9mZnNldCwgd2hlbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQobmV3T2Zmc2V0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmRfdGVsbCA9IHN5c2NhbGxXcmFwKHRoaXMsICdmZF90ZWxsJywgZnVuY3Rpb24gKGZkLCBvZmZzZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9URUxMLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gQmlnSW50KGZpbGVEZXNjcmlwdG9yLnBvcyk7XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KE51bWJlcihvZmZzZXQpLCBwb3MsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb2xsX29uZW9mZiA9IHN5c2NhbGxXcmFwKHRoaXMsICdwb2xsX29uZW9mZicsIGZ1bmN0aW9uIChpbl9wdHIsIG91dF9wdHIsIG5zdWJzY3JpcHRpb25zLCBuZXZlbnRzKSB7XG4gICAgICAgICAgICBpbl9wdHIgPSBOdW1iZXIoaW5fcHRyKTtcbiAgICAgICAgICAgIG91dF9wdHIgPSBOdW1iZXIob3V0X3B0cik7XG4gICAgICAgICAgICBuZXZlbnRzID0gTnVtYmVyKG5ldmVudHMpO1xuICAgICAgICAgICAgbnN1YnNjcmlwdGlvbnMgPSBOdW1iZXIobnN1YnNjcmlwdGlvbnMpO1xuICAgICAgICAgICAgbnN1YnNjcmlwdGlvbnMgPSBuc3Vic2NyaXB0aW9ucyA+Pj4gMDtcbiAgICAgICAgICAgIGlmIChpbl9wdHIgPT09IDAgfHwgb3V0X3B0ciA9PT0gMCB8fCBuc3Vic2NyaXB0aW9ucyA9PT0gMCB8fCBuZXZlbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKG5ldmVudHMsIDAsIHRydWUpO1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IHRpbWVyX3VzZXJkYXRhID0gQmlnSW50KDApO1xuICAgICAgICAgICAgbGV0IGN1cl90aW1lb3V0ID0gQmlnSW50KDApO1xuICAgICAgICAgICAgbGV0IGhhc190aW1lb3V0ID0gMDtcbiAgICAgICAgICAgIGxldCBtaW5fdGltZW91dCA9IEJpZ0ludCgwKTtcbiAgICAgICAgICAgIGxldCBzdWI7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gQXJyYXkobnN1YnNjcmlwdGlvbnMpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zdWJzY3JpcHRpb25zOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdWIgPSBpbl9wdHIgKyBpICogNDg7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcmRhdGEgPSB2aWV3LmdldEJpZ1VpbnQ2NChzdWIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2aWV3LmdldFVpbnQ4KHN1YiArIDgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsb2NrSWRPckZkID0gdmlldy5nZXRVaW50MzIoc3ViICsgMTYsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSB2aWV3LmdldEJpZ1VpbnQ2NChzdWIgKyAyNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlY2lzaW9uID0gdmlldy5nZXRCaWdVaW50NjQoc3ViICsgMzIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsYWdzID0gdmlldy5nZXRVaW50MTYoc3ViICsgNDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJkYXRhLFxuICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICB1OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrX2lkOiBjbG9ja0lkT3JGZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZkX3JlYWR3cml0ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkOiBjbG9ja0lkT3JGZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZkZXZlbnRzID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnN1YnNjcmlwdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgICAgIHN1YiA9IHN1YnNjcmlwdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgc3dpdGNoIChzdWIudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDAgLyogV2FzaUV2ZW50VHlwZS5DTE9DSyAqLzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yi51LmNsb2NrLmZsYWdzID09PSAxIC8qIFdhc2lTdWJjbG9ja2ZsYWdzLkFCU1RJTUUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IGFic29sdXRlIHRpbWUgdG8gcmVsYXRpdmUgZGVsYXkuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gQmlnSW50KERhdGUubm93KCkpICogQmlnSW50KDEwMDAwMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90aW1lb3V0ID0gc3ViLnUuY2xvY2sudGltZW91dCAtIG5vdztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90aW1lb3V0ID0gc3ViLnUuY2xvY2sudGltZW91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNfdGltZW91dCA9PT0gMCB8fCBjdXJfdGltZW91dCA8IG1pbl90aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3RpbWVvdXQgPSBjdXJfdGltZW91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl91c2VyZGF0YSA9IHN1Yi51c2VyZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfdGltZW91dCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogV2FzaUV2ZW50VHlwZS5GRF9SRUFEICovOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogV2FzaUV2ZW50VHlwZS5GRF9XUklURSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZkZXZlbnRzLnB1c2goc3ViKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmRldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZGV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmZGV2ZW50ID0gZmRldmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gb3V0X3B0ciArIDMyICogaTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQoZXZlbnQsIGZkZXZlbnQudXNlcmRhdGEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihldmVudCArIDgsIDUyIC8qIFdhc2lFcnJuby5FTk9TWVMgKi8sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihldmVudCArIDEyLCBmZGV2ZW50LnR5cGUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChldmVudCArIDE2LCBCaWdJbnQoMCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQxNihldmVudCArIDI0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIobmV2ZW50cywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKG5ldmVudHMsIGZkZXZlbnRzLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc190aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBOdW1iZXIobWluX3RpbWVvdXQgLyBCaWdJbnQoMTAwMDAwMCkpO1xuICAgICAgICAgICAgICAgIC8vIGlmIChpc01haW5UaHJlYWQgfHwgdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgc2xlZXBCcmVha0lmKGRlbGF5LCAoKSA9PiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IGJ1ZiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KVxuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgYXJyID0gbmV3IEludDMyQXJyYXkoYnVmKVxuICAgICAgICAgICAgICAgIC8vICAgcG9zdE1zZyh7XG4gICAgICAgICAgICAgICAgLy8gICAgIF9fdHlieXNfd2FzbV91dGlsX3dhc2lfXzoge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6ICdzZXQtdGltZW91dCcsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgYnVmZmVyOiBidWYsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkZWxheVxuICAgICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgfSlcbiAgICAgICAgICAgICAgICAvLyAgIEF0b21pY3Mud2FpdChhcnIsIDAsIDApXG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gb3V0X3B0cjtcbiAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChldmVudCwgdGltZXJfdXNlcmRhdGEsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGV2ZW50ICsgOCwgMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi8sIHRydWUpO1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGV2ZW50ICsgMTIsIDAgLyogV2FzaUV2ZW50VHlwZS5DTE9DSyAqLywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIobmV2ZW50cywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb2NfZXhpdCA9IHN5c2NhbGxXcmFwKHRoaXMsICdwcm9jX2V4aXQnLCBmdW5jdGlvbiAocnZhbCkge1xuICAgICAgICAgICAgaWYgKCh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcpICYmIChwcm9jZXNzICE9PSBudWxsKSAmJiAodHlwZW9mIHByb2Nlc3MuZXhpdCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQocnZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb2NfcmFpc2UgPSBzeXNjYWxsV3JhcCh0aGlzLCAncHJvY19yYWlzZScsIGZ1bmN0aW9uIChfc2lnKSB7XG4gICAgICAgICAgICByZXR1cm4gNTIgLyogV2FzaUVycm5vLkVOT1NZUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NoZWRfeWllbGQgPSBzeXNjYWxsV3JhcCh0aGlzLCAnc2NoZWRfeWllbGQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJhbmRvbV9nZXQgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBzeXNjYWxsV3JhcCh0aGlzLCAncmFuZG9tX2dldCcsIGZ1bmN0aW9uIChidWYsIGJ1Zl9sZW4pIHtcbiAgICAgICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgICAgICBpZiAoYnVmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZfbGVuID0gTnVtYmVyKGJ1Zl9sZW4pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgSEVBUFU4LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEhFQVBVOC5idWZmZXIpID09PSAnW29iamVjdCBTaGFyZWRBcnJheUJ1ZmZlcl0nKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gYnVmOyBpIDwgYnVmICsgYnVmX2xlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQ4KGksIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1NikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBvcztcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpZGUgPSA2NTUzNjtcbiAgICAgICAgICAgICAgICBmb3IgKHBvcyA9IDA7IHBvcyArIHN0cmlkZSA8IGJ1Zl9sZW47IHBvcyArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhIRUFQVTguc3ViYXJyYXkoYnVmICsgcG9zLCBidWYgKyBwb3MgKyBzdHJpZGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhIRUFQVTguc3ViYXJyYXkoYnVmICsgcG9zLCBidWYgKyBidWZfbGVuKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogc3lzY2FsbFdyYXAodGhpcywgJ3JhbmRvbV9nZXQnLCBmdW5jdGlvbiAoYnVmLCBidWZfbGVuKSB7XG4gICAgICAgICAgICAgICAgYnVmID0gTnVtYmVyKGJ1Zik7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmX2xlbiA9IE51bWJlcihidWZfbGVuKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gYnVmOyBpIDwgYnVmICsgYnVmX2xlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoaSwgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvY2tfcmVjdiA9IHN5c2NhbGxXcmFwKHRoaXMsICdzb2NrX3JlY3YnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gNTggLyogV2FzaUVycm5vLkVOT1RTVVAgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvY2tfc2VuZCA9IHN5c2NhbGxXcmFwKHRoaXMsICdzb2NrX3NlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gNTggLyogV2FzaUVycm5vLkVOT1RTVVAgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvY2tfc2h1dGRvd24gPSBzeXNjYWxsV3JhcCh0aGlzLCAnc29ja19zaHV0ZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ja19hY2NlcHQgPSBzeXNjYWxsV3JhcCh0aGlzLCAnc29ja19hY2NlcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gNTggLyogV2FzaUVycm5vLkVOT1RTVVAgKi87XG4gICAgICAgIH0pO1xuICAgICAgICBfd2FzaS5zZXQodGhpcywge1xuICAgICAgICAgICAgZmRzLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGVudlxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZzKVxuICAgICAgICAgICAgX2ZzLnNldCh0aGlzLCBmcyk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZUltcG9ydChuYW1lLCBzeW5jVmVyc2lvbiwgYXN5bmNWZXJzaW9uLCBwYXJhbWV0ZXJUeXBlLCByZXR1cm5UeXBlKSB7XG4gICAgICAgICAgICBpZiAoYXN5bmNGcykge1xuICAgICAgICAgICAgICAgIGlmIChhc3luY2lmeSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpc1tuYW1lXSA9IGFzeW5jaWZ5LndyYXBJbXBvcnRGdW5jdGlvbihzeXNjYWxsV3JhcChfdGhpcywgbmFtZSwgYXN5bmNWZXJzaW9uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfdGhpc1tuYW1lXSA9IHdyYXBBc3luY0ltcG9ydChzeXNjYWxsV3JhcChfdGhpcywgbmFtZSwgYXN5bmNWZXJzaW9uKSwgcGFyYW1ldGVyVHlwZSwgcmV0dXJuVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXNbbmFtZV0gPSBzeXNjYWxsV3JhcChfdGhpcywgbmFtZSwgc3luY1ZlcnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfYWxsb2NhdGUnLCBmdW5jdGlvbiBmZF9hbGxvY2F0ZShmZCwgb2Zmc2V0LCBsZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfQUxMT0NBVEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gZnMuZnN0YXRTeW5jKGZpbGVEZXNjcmlwdG9yLmZkLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmIChzdGF0LnNpemUgPCBvZmZzZXQgKyBsZW4pIHtcbiAgICAgICAgICAgICAgICBmcy5mdHJ1bmNhdGVTeW5jKGZpbGVEZXNjcmlwdG9yLmZkLCBOdW1iZXIob2Zmc2V0ICsgbGVuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIGZkX2FsbG9jYXRlKGZkLCBvZmZzZXQsIGxlbikge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX0FMTE9DQVRFLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgaCA9IGZpbGVEZXNjcmlwdG9yLmZkO1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IGguc3RhdCh7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmIChzdGF0LnNpemUgPCBvZmZzZXQgKyBsZW4pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoLnRydW5jYXRlKE51bWJlcihvZmZzZXQgKyBsZW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTY0JywgJ2Y2NCddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9jbG9zZScsIGZ1bmN0aW9uIGZkX2Nsb3NlKGZkKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIEJpZ0ludCgwKSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmlsZURlc2NyaXB0b3IuZmQpO1xuICAgICAgICAgICAgd2FzaS5mZHMucmVtb3ZlKGZkKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfY2xvc2UoZmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgQmlnSW50KDApLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgYXdhaXQgZmlsZURlc2NyaXB0b3IuZmQuY2xvc2UoKTtcbiAgICAgICAgICAgIHdhc2kuZmRzLnJlbW92ZShmZCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX2RhdGFzeW5jJywgZnVuY3Rpb24gZmRfZGF0YXN5bmMoZmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy5mZGF0YXN5bmNTeW5jKGZpbGVEZXNjcmlwdG9yLmZkKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfZGF0YXN5bmMoZmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGF3YWl0IGZpbGVEZXNjcmlwdG9yLmZkLmRhdGFzeW5jKCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX2ZpbGVzdGF0X2dldCcsIGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X2dldChmZCwgYnVmKSB7XG4gICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgIGlmIChidWYgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBmcy5mc3RhdFN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICB0b0ZpbGVTdGF0KHZpZXcsIGJ1Ziwgc3RhdCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X2dldChmZCwgYnVmKSB7XG4gICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgIGlmIChidWYgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgaCA9IGZpbGVEZXNjcmlwdG9yLmZkO1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IGguc3RhdCh7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdG9GaWxlU3RhdCh2aWV3LCBidWYsIHN0YXQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfZmlsZXN0YXRfc2V0X3NpemUnLCBmdW5jdGlvbiBmZF9maWxlc3RhdF9zZXRfc2l6ZShmZCwgc2l6ZSkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX1NFVF9TSVpFLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLmZ0cnVuY2F0ZVN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIE51bWJlcihzaXplKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X3NldF9zaXplKGZkLCBzaXplKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1NJWkUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBoID0gZmlsZURlc2NyaXB0b3IuZmQ7XG4gICAgICAgICAgICBhd2FpdCBoLnRydW5jYXRlKE51bWJlcihzaXplKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2k2NCddLCBbJ2kzMiddKTtcbiAgICAgICAgZnVuY3Rpb24gZmRGaWxlc3RhdEdldFRpbWVzKGZkLCBhdGltLCBtdGltLCBmbGFncykge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX1NFVF9USU1FUywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykgPT09IDIgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgYXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgOCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTV9OT1cgKi8pID09PSA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykge1xuICAgICAgICAgICAgICAgIG10aW0gPSBCaWdJbnQoRGF0ZS5ub3coKSAqIDEwMDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZURlc2NyaXB0b3IsIGF0aW0sIG10aW0gfTtcbiAgICAgICAgfVxuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX2ZpbGVzdGF0X3NldF90aW1lcycsIGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X3NldF90aW1lcyhmZCwgYXRpbSwgbXRpbSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUZzdEZsYWdzT3JSZXR1cm4oZmxhZ3MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGZpbGVEZXNjcmlwdG9yLCBhdGltOiBhdGltUmVzLCBtdGltOiBtdGltUmVzIH0gPSBmZEZpbGVzdGF0R2V0VGltZXMuY2FsbCh0aGlzLCBmZCwgYXRpbSwgbXRpbSwgZmxhZ3MpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLmZ1dGltZXNTeW5jKGZpbGVEZXNjcmlwdG9yLmZkLCBOdW1iZXIoYXRpbVJlcyksIE51bWJlcihtdGltUmVzKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X3NldF90aW1lcyhmZCwgYXRpbSwgbXRpbSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUZzdEZsYWdzT3JSZXR1cm4oZmxhZ3MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGZpbGVEZXNjcmlwdG9yLCBhdGltOiBhdGltUmVzLCBtdGltOiBtdGltUmVzIH0gPSBmZEZpbGVzdGF0R2V0VGltZXMuY2FsbCh0aGlzLCBmZCwgYXRpbSwgbXRpbSwgZmxhZ3MpO1xuICAgICAgICAgICAgY29uc3QgaCA9IGZpbGVEZXNjcmlwdG9yLmZkO1xuICAgICAgICAgICAgYXdhaXQgaC51dGltZXMoTnVtYmVyKGF0aW1SZXMpLCBOdW1iZXIobXRpbVJlcykpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpNjQnLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9wcmVhZCcsIGZ1bmN0aW9uIGZkX3ByZWFkKGZkLCBpb3ZzLCBpb3ZzbGVuLCBvZmZzZXQsIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDAgfHwgb2Zmc2V0ID4gSU5UNjRfTUFYKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1JFQUQgfCBXYXNpUmlnaHRzLkZEX1NFRUssIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoIWlvdnNsZW4pIHtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGlvVmVjcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihpb3ZzbGVuKSB9LCAoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGlvdnMgKyAoaSAqIDgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IHZpZXcuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZMZW4gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gYnVmTGVuO1xuICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTguc3ViYXJyYXkoYnVmLCBidWYgKyBidWZMZW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgbnJlYWQgPSAwO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFNoYXJlZEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgYnVmZmVyLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgYnl0ZXNSZWFkID0gZnMucmVhZFN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgTnVtYmVyKG9mZnNldCkpO1xuICAgICAgICAgICAgbnJlYWQgPSBidWZmZXIgPyBjb3B5TWVtb3J5KGlvVmVjcywgYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpIDogMDtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG5yZWFkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gKGZkLCBpb3ZzLCBpb3ZzbGVuLCBvZmZzZXQsIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDAgfHwgb2Zmc2V0ID4gSU5UNjRfTUFYKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1JFQUQgfCBXYXNpUmlnaHRzLkZEX1NFRUssIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoIWlvdnNsZW4pIHtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGlvVmVjcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihpb3ZzbGVuKSB9LCAoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGlvdnMgKyAoaSAqIDgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IHZpZXcuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZMZW4gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gYnVmTGVuO1xuICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTguc3ViYXJyYXkoYnVmLCBidWYgKyBidWZMZW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgbnJlYWQgPSAwO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgICAgIGJ1ZmZlci5faXNCdWZmZXIgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IGF3YWl0IGZpbGVEZXNjcmlwdG9yLmZkLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIob2Zmc2V0KSk7XG4gICAgICAgICAgICBucmVhZCA9IGJ1ZmZlciA/IGNvcHlNZW1vcnkoaW9WZWNzLCBidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSkgOiAwO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgbnJlYWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2k2NCcsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfcHdyaXRlJywgZnVuY3Rpb24gZmRfcHdyaXRlKGZkLCBpb3ZzLCBpb3ZzbGVuLCBvZmZzZXQsIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDAgfHwgb2Zmc2V0ID4gSU5UNjRfTUFYKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1dSSVRFIHwgV2FzaVJpZ2h0cy5GRF9TRUVLLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gY29uY2F0QnVmZmVyKEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihpb3ZzbGVuKSB9LCAoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGlvdnMgKyAoaSAqIDgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IHZpZXcuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZMZW4gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBud3JpdHRlbiA9IGZzLndyaXRlU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIob2Zmc2V0KSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCBud3JpdHRlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIGZkX3B3cml0ZShmZCwgaW92cywgaW92c2xlbiwgb2Zmc2V0LCBzaXplKSB7XG4gICAgICAgICAgICBpb3ZzID0gTnVtYmVyKGlvdnMpO1xuICAgICAgICAgICAgc2l6ZSA9IE51bWJlcihzaXplKTtcbiAgICAgICAgICAgIGlmICgoaW92cyA9PT0gMCAmJiBpb3ZzbGVuKSB8fCBzaXplID09PSAwIHx8IG9mZnNldCA+IElOVDY0X01BWCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9XUklURSB8IFdhc2lSaWdodHMuRkRfU0VFSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGNvbmNhdEJ1ZmZlcihBcnJheS5mcm9tKHsgbGVuZ3RoOiBOdW1iZXIoaW92c2xlbikgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpb3ZzICsgKGkgKiA4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmTGVuID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ5dGVzV3JpdHRlbiB9ID0gYXdhaXQgZmlsZURlc2NyaXB0b3IuZmQud3JpdGUoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIob2Zmc2V0KSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCBieXRlc1dyaXR0ZW4sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2k2NCcsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfcmVhZCcsIGZ1bmN0aW9uIGZkX3JlYWQoZmQsIGlvdnMsIGlvdnNsZW4sIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgaW9WZWNzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBidWZMZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgICAgICBsZXQgbnJlYWQgPSAwO1xuICAgICAgICAgICAgaWYgKGZkID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cucHJvbXB0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gcmVhZFN0ZGluKCk7XG4gICAgICAgICAgICAgICAgbnJlYWQgPSBidWZmZXIgPyBjb3B5TWVtb3J5KGlvVmVjcywgYnVmZmVyKSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBTaGFyZWRBcnJheUJ1ZmZlcih0b3RhbFNpemUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5faXNCdWZmZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXNSZWFkID0gZnMucmVhZFN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgTnVtYmVyKGZpbGVEZXNjcmlwdG9yLnBvcykpO1xuICAgICAgICAgICAgICAgIG5yZWFkID0gYnVmZmVyID8gY29weU1lbW9yeShpb1ZlY3MsIGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKSA6IDA7XG4gICAgICAgICAgICAgICAgZmlsZURlc2NyaXB0b3IucG9zICs9IEJpZ0ludChucmVhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCBucmVhZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIGZkX3JlYWQoZmQsIGlvdnMsIGlvdnNsZW4sIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgaW9WZWNzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBidWZMZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgICAgICBsZXQgbnJlYWQgPSAwO1xuICAgICAgICAgICAgaWYgKGZkID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cucHJvbXB0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gcmVhZFN0ZGluKCk7XG4gICAgICAgICAgICAgICAgbnJlYWQgPSBidWZmZXIgPyBjb3B5TWVtb3J5KGlvVmVjcywgYnVmZmVyKSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5faXNCdWZmZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSBhd2FpdCBmaWxlRGVzY3JpcHRvci5mZC5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgTnVtYmVyKGZpbGVEZXNjcmlwdG9yLnBvcykpO1xuICAgICAgICAgICAgICAgIG5yZWFkID0gYnVmZmVyID8gY29weU1lbW9yeShpb1ZlY3MsIGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKSA6IDA7XG4gICAgICAgICAgICAgICAgZmlsZURlc2NyaXB0b3IucG9zICs9IEJpZ0ludChucmVhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCBucmVhZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX3JlYWRkaXInLCBmdW5jdGlvbiBmZF9yZWFkZGlyKGZkLCBidWYsIGJ1Zl9sZW4sIGNvb2tpZSwgYnVmdXNlZCkge1xuICAgICAgICAgICAgYnVmID0gTnVtYmVyKGJ1Zik7XG4gICAgICAgICAgICBidWZfbGVuID0gTnVtYmVyKGJ1Zl9sZW4pO1xuICAgICAgICAgICAgYnVmdXNlZCA9IE51bWJlcihidWZ1c2VkKTtcbiAgICAgICAgICAgIGlmIChidWYgPT09IDAgfHwgYnVmdXNlZCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRERJUiwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBsZXQgYnVmZmVyVXNlZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gTnVtYmVyKGNvb2tpZSk7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZURhdGEgPSBlbmNvZGVyLmVuY29kZShlbnRyaWVzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5SW5mbyA9IGZzLnN0YXRTeW5jKHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIGVudHJpZXNbaV0ubmFtZSksIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5RGF0YSA9IG5ldyBVaW50OEFycmF5KDI0ICsgbmFtZURhdGEuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlWaWV3ID0gbmV3IERhdGFWaWV3KGVudHJ5RGF0YS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGVudHJ5Vmlldy5zZXRCaWdVaW50NjQoMCwgQmlnSW50KGkgKyAxKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZW50cnlWaWV3LnNldEJpZ1VpbnQ2NCg4LCBCaWdJbnQoZW50cnlJbmZvLmlubyA/IGVudHJ5SW5mby5pbm8gOiAwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZW50cnlWaWV3LnNldFVpbnQzMigxNiwgbmFtZURhdGEuYnl0ZUxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbGV0IHR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJpZXNbaV0uaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDQgLyogV2FzaUZpbGVUeXBlLlJFR1VMQVJfRklMRSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAzIC8qIFdhc2lGaWxlVHlwZS5ESVJFQ1RPUlkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gNyAvKiBXYXNpRmlsZVR5cGUuU1lNQk9MSUNfTElOSyAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc0NoYXJhY3RlckRldmljZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAyIC8qIFdhc2lGaWxlVHlwZS5DSEFSQUNURVJfREVWSUNFICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzQmxvY2tEZXZpY2UoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gMSAvKiBXYXNpRmlsZVR5cGUuQkxPQ0tfREVWSUNFICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzU29ja2V0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDYgLyogV2FzaUZpbGVUeXBlLlNPQ0tFVF9TVFJFQU0gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gMCAvKiBXYXNpRmlsZVR5cGUuVU5LTk9XTiAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW50cnlWaWV3LnNldFVpbnQ4KDIwLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBlbnRyeURhdGEuc2V0KG5hbWVEYXRhLCAyNCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVudHJ5RGF0YS5zbGljZSgwLCBNYXRoLm1pbihlbnRyeURhdGEubGVuZ3RoLCBidWZfbGVuIC0gYnVmZmVyVXNlZCkpO1xuICAgICAgICAgICAgICAgIEhFQVBVOC5zZXQoZGF0YSwgYnVmICsgYnVmZmVyVXNlZCk7XG4gICAgICAgICAgICAgICAgYnVmZmVyVXNlZCArPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihidWZ1c2VkLCBidWZmZXJVc2VkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfcmVhZGRpcihmZCwgYnVmLCBidWZfbGVuLCBjb29raWUsIGJ1ZnVzZWQpIHtcbiAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgYnVmX2xlbiA9IE51bWJlcihidWZfbGVuKTtcbiAgICAgICAgICAgIGJ1ZnVzZWQgPSBOdW1iZXIoYnVmdXNlZCk7XG4gICAgICAgICAgICBpZiAoYnVmID09PSAwIHx8IGJ1ZnVzZWQgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1JFQURESVIsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBsZXQgYnVmZmVyVXNlZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gTnVtYmVyKGNvb2tpZSk7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZURhdGEgPSBlbmNvZGVyLmVuY29kZShlbnRyaWVzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5SW5mbyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgZW50cmllc1tpXS5uYW1lKSwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMjQgKyBuYW1lRGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeVZpZXcgPSBuZXcgRGF0YVZpZXcoZW50cnlEYXRhLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZW50cnlWaWV3LnNldEJpZ1VpbnQ2NCgwLCBCaWdJbnQoaSArIDEpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0QmlnVWludDY0KDgsIEJpZ0ludChlbnRyeUluZm8uaW5vID8gZW50cnlJbmZvLmlubyA6IDApLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0VWludDMyKDE2LCBuYW1lRGF0YS5ieXRlTGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllc1tpXS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gNCAvKiBXYXNpRmlsZVR5cGUuUkVHVUxBUl9GSUxFICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSA3IC8qIFdhc2lGaWxlVHlwZS5TWU1CT0xJQ19MSU5LICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzQ2hhcmFjdGVyRGV2aWNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDIgLyogV2FzaUZpbGVUeXBlLkNIQVJBQ1RFUl9ERVZJQ0UgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNCbG9ja0RldmljZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAxIC8qIFdhc2lGaWxlVHlwZS5CTE9DS19ERVZJQ0UgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNTb2NrZXQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gNiAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX1NUUkVBTSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAwIC8qIFdhc2lGaWxlVHlwZS5VTktOT1dOICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0VWludDgoMjAsIHR5cGUpO1xuICAgICAgICAgICAgICAgIGVudHJ5RGF0YS5zZXQobmFtZURhdGEsIDI0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZW50cnlEYXRhLnNsaWNlKDAsIE1hdGgubWluKGVudHJ5RGF0YS5sZW5ndGgsIGJ1Zl9sZW4gLSBidWZmZXJVc2VkKSk7XG4gICAgICAgICAgICAgICAgSEVBUFU4LnNldChkYXRhLCBidWYgKyBidWZmZXJVc2VkKTtcbiAgICAgICAgICAgICAgICBidWZmZXJVc2VkICs9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGJ1ZnVzZWQsIGJ1ZmZlclVzZWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2k2NCcsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfcmVudW1iZXInLCBmdW5jdGlvbiBmZF9yZW51bWJlcihmcm9tLCB0bykge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIHdhc2kuZmRzLnJlbnVtYmVyKHRvLCBmcm9tKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfcmVudW1iZXIoZnJvbSwgdG8pIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBhd2FpdCB3YXNpLmZkcy5yZW51bWJlcih0bywgZnJvbSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9zeW5jJywgZnVuY3Rpb24gZmRfc3luYyhmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1NZTkMsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMuZnN5bmNTeW5jKGZpbGVEZXNjcmlwdG9yLmZkKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfc3luYyhmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1NZTkMsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBhd2FpdCBmaWxlRGVzY3JpcHRvci5mZC5zeW5jKCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX3dyaXRlJywgZnVuY3Rpb24gZmRfd3JpdGUoZmQsIGlvdnMsIGlvdnNsZW4sIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfV1JJVEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoIWlvdnNsZW4pIHtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBjb25jYXRCdWZmZXIoQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTguc3ViYXJyYXkoYnVmLCBidWYgKyBidWZMZW4pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgbGV0IG53cml0dGVuO1xuICAgICAgICAgICAgaWYgKGZkID09PSAxIHx8IGZkID09PSAyKSB7XG4gICAgICAgICAgICAgICAgbndyaXR0ZW4gPSBmaWxlRGVzY3JpcHRvci53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgICAgICBud3JpdHRlbiA9IGZzLndyaXRlU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIoZmlsZURlc2NyaXB0b3IucG9zKSk7XG4gICAgICAgICAgICAgICAgZmlsZURlc2NyaXB0b3IucG9zICs9IEJpZ0ludChud3JpdHRlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCBud3JpdHRlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIGZkX3dyaXRlKGZkLCBpb3ZzLCBpb3ZzbGVuLCBzaXplKSB7XG4gICAgICAgICAgICBpb3ZzID0gTnVtYmVyKGlvdnMpO1xuICAgICAgICAgICAgc2l6ZSA9IE51bWJlcihzaXplKTtcbiAgICAgICAgICAgIGlmICgoaW92cyA9PT0gMCAmJiBpb3ZzbGVuKSB8fCBzaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1dSSVRFLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gY29uY2F0QnVmZmVyKEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihpb3ZzbGVuKSB9LCAoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGlvdnMgKyAoaSAqIDgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IHZpZXcuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZMZW4gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGxldCBud3JpdHRlbjtcbiAgICAgICAgICAgIGlmIChmZCA9PT0gMSB8fCBmZCA9PT0gMikge1xuICAgICAgICAgICAgICAgIG53cml0dGVuID0gZmlsZURlc2NyaXB0b3Iud3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG53cml0dGVuID0gYXdhaXQgKGF3YWl0IChmaWxlRGVzY3JpcHRvci5mZC53cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihmaWxlRGVzY3JpcHRvci5wb3MpKSkpLmJ5dGVzV3JpdHRlbjtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5wb3MgKz0gQmlnSW50KG53cml0dGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG53cml0dGVuLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9jcmVhdGVfZGlyZWN0b3J5JywgZnVuY3Rpb24gcGF0aF9jcmVhdGVfZGlyZWN0b3J5KGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9jcmVhdGVfZGlyZWN0b3J5KGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfZmlsZXN0YXRfZ2V0JywgZnVuY3Rpb24gcGF0aF9maWxlc3RhdF9nZXQoZmQsIGZsYWdzLCBwYXRoLCBwYXRoX2xlbiwgZmlsZXN0YXQpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBmaWxlc3RhdCA9IE51bWJlcihmaWxlc3RhdCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCB8fCBmaWxlc3RhdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX0dFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGxldCBzdGF0O1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIDEpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgc3RhdCA9IGZzLnN0YXRTeW5jKHBhdGhTdHJpbmcsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdCA9IGZzLmxzdGF0U3luYyhwYXRoU3RyaW5nLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvRmlsZVN0YXQodmlldywgZmlsZXN0YXQsIHN0YXQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X2dldChmZCwgZmxhZ3MsIHBhdGgsIHBhdGhfbGVuLCBmaWxlc3RhdCkge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGZpbGVzdGF0ID0gTnVtYmVyKGZpbGVzdGF0KTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwIHx8IGZpbGVzdGF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfRklMRVNUQVRfR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgbGV0IHN0YXQ7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgMSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoU3RyaW5nLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChwYXRoU3RyaW5nLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvRmlsZVN0YXQodmlldywgZmlsZXN0YXQsIHN0YXQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9maWxlc3RhdF9zZXRfdGltZXMnLCBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X3NldF90aW1lcyhmZCwgZmxhZ3MsIHBhdGgsIHBhdGhfbGVuLCBhdGltLCBtdGltLCBmc3RfZmxhZ3MpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVGc3RGbGFnc09yUmV0dXJuKGZzdF9mbGFncykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlUGF0aFN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSksIGZsYWdzKTtcbiAgICAgICAgICAgIGlmICgoZnN0X2ZsYWdzICYgMiAvKiBXYXNpRnN0RmxhZy5TRVRfQVRJTV9OT1cgKi8pID09PSAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykge1xuICAgICAgICAgICAgICAgIGF0aW0gPSBCaWdJbnQoRGF0ZS5ub3coKSAqIDEwMDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChmc3RfZmxhZ3MgJiA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykgPT09IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgbXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy51dGltZXNTeW5jKHJlc29sdmVkUGF0aCwgTnVtYmVyKGF0aW0pLCBOdW1iZXIobXRpbSkpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X3NldF90aW1lcyhmZCwgZmxhZ3MsIHBhdGgsIHBhdGhfbGVuLCBhdGltLCBtdGltLCBmc3RfZmxhZ3MpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVGc3RGbGFnc09yUmV0dXJuKGZzdF9mbGFncykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBhd2FpdCByZXNvbHZlUGF0aEFzeW5jKGZzLCBmaWxlRGVzY3JpcHRvciwgZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpLCBmbGFncyk7XG4gICAgICAgICAgICBpZiAoKGZzdF9mbGFncyAmIDIgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU1fTk9XICovKSA9PT0gMiAvKiBXYXNpRnN0RmxhZy5TRVRfQVRJTV9OT1cgKi8pIHtcbiAgICAgICAgICAgICAgICBhdGltID0gQmlnSW50KERhdGUubm93KCkgKiAxMDAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnN0X2ZsYWdzICYgOCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTV9OT1cgKi8pID09PSA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykge1xuICAgICAgICAgICAgICAgIG10aW0gPSBCaWdJbnQoRGF0ZS5ub3coKSAqIDEwMDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudXRpbWVzKHJlc29sdmVkUGF0aCwgTnVtYmVyKGF0aW0pLCBOdW1iZXIobXRpbSkpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpNjQnLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX2xpbmsnLCBmdW5jdGlvbiBwYXRoX2xpbmsob2xkX2ZkLCBvbGRfZmxhZ3MsIG9sZF9wYXRoLCBvbGRfcGF0aF9sZW4sIG5ld19mZCwgbmV3X3BhdGgsIG5ld19wYXRoX2xlbikge1xuICAgICAgICAgICAgb2xkX3BhdGggPSBOdW1iZXIob2xkX3BhdGgpO1xuICAgICAgICAgICAgb2xkX3BhdGhfbGVuID0gTnVtYmVyKG9sZF9wYXRoX2xlbik7XG4gICAgICAgICAgICBuZXdfcGF0aCA9IE51bWJlcihuZXdfcGF0aCk7XG4gICAgICAgICAgICBuZXdfcGF0aF9sZW4gPSBOdW1iZXIobmV3X3BhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChvbGRfcGF0aCA9PT0gMCB8fCBuZXdfcGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGxldCBvbGRXcmFwO1xuICAgICAgICAgICAgbGV0IG5ld1dyYXA7XG4gICAgICAgICAgICBpZiAob2xkX2ZkID09PSBuZXdfZmQpIHtcbiAgICAgICAgICAgICAgICBvbGRXcmFwID0gbmV3V3JhcCA9IHdhc2kuZmRzLmdldChvbGRfZmQsIFdhc2lSaWdodHMuUEFUSF9MSU5LX1NPVVJDRSB8IFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICAgICAgbmV3V3JhcCA9IHdhc2kuZmRzLmdldChuZXdfZmQsIFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRPbGRQYXRoID0gcmVzb2x2ZVBhdGhTeW5jKGZzLCBvbGRXcmFwLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSksIG9sZF9mbGFncyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE5ld1BhdGggPSByZXNvbHZlKG5ld1dyYXAucmVhbFBhdGgsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKSk7XG4gICAgICAgICAgICBmcy5saW5rU3luYyhyZXNvbHZlZE9sZFBhdGgsIHJlc29sdmVkTmV3UGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfbGluayhvbGRfZmQsIG9sZF9mbGFncywgb2xkX3BhdGgsIG9sZF9wYXRoX2xlbiwgbmV3X2ZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IG9sZFdyYXA7XG4gICAgICAgICAgICBsZXQgbmV3V3JhcDtcbiAgICAgICAgICAgIGlmIChvbGRfZmQgPT09IG5ld19mZCkge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfU09VUkNFIHwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IHdhc2kuZmRzLmdldChvbGRfZmQsIFdhc2lSaWdodHMuUEFUSF9MSU5LX1NPVVJDRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgICAgICBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG5ld19mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE9sZFBhdGggPSBhd2FpdCByZXNvbHZlUGF0aEFzeW5jKGZzLCBvbGRXcmFwLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSksIG9sZF9mbGFncyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE5ld1BhdGggPSByZXNvbHZlKG5ld1dyYXAucmVhbFBhdGgsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKSk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5saW5rKHJlc29sdmVkT2xkUGF0aCwgcmVzb2x2ZWROZXdQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGZ1bmN0aW9uIHBhdGhPcGVuKG9fZmxhZ3MsIGZzX3JpZ2h0c19iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZywgZnNfZmxhZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWQgPSAoZnNfcmlnaHRzX2Jhc2UgJiAoV2FzaVJpZ2h0cy5GRF9SRUFEIHxcbiAgICAgICAgICAgICAgICBXYXNpUmlnaHRzLkZEX1JFQURESVIpKSAhPT0gQmlnSW50KDApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGUgPSAoZnNfcmlnaHRzX2Jhc2UgJiAoV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQyB8XG4gICAgICAgICAgICAgICAgV2FzaVJpZ2h0cy5GRF9XUklURSB8XG4gICAgICAgICAgICAgICAgV2FzaVJpZ2h0cy5GRF9BTExPQ0FURSB8XG4gICAgICAgICAgICAgICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9TRVRfU0laRSkpICE9PSBCaWdJbnQoMCk7XG4gICAgICAgICAgICBsZXQgZmxhZ3MgPSB3cml0ZSA/IHJlYWQgPyAyIC8qIEZpbGVDb250cm9sRmxhZy5PX1JEV1IgKi8gOiAxIC8qIEZpbGVDb250cm9sRmxhZy5PX1dST05MWSAqLyA6IDAgLyogRmlsZUNvbnRyb2xGbGFnLk9fUkRPTkxZICovO1xuICAgICAgICAgICAgbGV0IG5lZWRlZF9iYXNlID0gV2FzaVJpZ2h0cy5QQVRIX09QRU47XG4gICAgICAgICAgICBsZXQgbmVlZGVkX2luaGVyaXRpbmcgPSBmc19yaWdodHNfYmFzZSB8IGZzX3JpZ2h0c19pbmhlcml0aW5nO1xuICAgICAgICAgICAgaWYgKChvX2ZsYWdzICYgMSAvKiBXYXNpRmlsZUNvbnRyb2xGbGFnLk9fQ1JFQVQgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gNjQgLyogRmlsZUNvbnRyb2xGbGFnLk9fQ1JFQVQgKi87XG4gICAgICAgICAgICAgICAgbmVlZGVkX2Jhc2UgfD0gV2FzaVJpZ2h0cy5QQVRIX0NSRUFURV9GSUxFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChvX2ZsYWdzICYgMiAvKiBXYXNpRmlsZUNvbnRyb2xGbGFnLk9fRElSRUNUT1JZICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDY1NTM2IC8qIEZpbGVDb250cm9sRmxhZy5PX0RJUkVDVE9SWSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgob19mbGFncyAmIDQgLyogV2FzaUZpbGVDb250cm9sRmxhZy5PX0VYQ0wgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTI4IC8qIEZpbGVDb250cm9sRmxhZy5PX0VYQ0wgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG9fZmxhZ3MgJiA4IC8qIFdhc2lGaWxlQ29udHJvbEZsYWcuT19UUlVOQyAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSA1MTIgLyogRmlsZUNvbnRyb2xGbGFnLk9fVFJVTkMgKi87XG4gICAgICAgICAgICAgICAgbmVlZGVkX2Jhc2UgfD0gV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9TSVpFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChmc19mbGFncyAmIDEgLyogV2FzaUZkRmxhZy5BUFBFTkQgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTAyNCAvKiBGaWxlQ29udHJvbEZsYWcuT19BUFBFTkQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzX2ZsYWdzICYgMiAvKiBXYXNpRmRGbGFnLkRTWU5DICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZsYWdzIHw9IEZpbGVDb250cm9sRmxhZy5PX0RTWU5DO1xuICAgICAgICAgICAgICAgIG5lZWRlZF9pbmhlcml0aW5nIHw9IFdhc2lSaWdodHMuRkRfREFUQVNZTkM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzX2ZsYWdzICYgNCAvKiBXYXNpRmRGbGFnLk5PTkJMT0NLICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDIwNDggLyogRmlsZUNvbnRyb2xGbGFnLk9fTk9OQkxPQ0sgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzX2ZsYWdzICYgOCAvKiBXYXNpRmRGbGFnLlJTWU5DICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDEwNTI2NzIgLyogRmlsZUNvbnRyb2xGbGFnLk9fU1lOQyAqLztcbiAgICAgICAgICAgICAgICBuZWVkZWRfaW5oZXJpdGluZyB8PSBXYXNpUmlnaHRzLkZEX1NZTkM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzX2ZsYWdzICYgMTYgLyogV2FzaUZkRmxhZy5TWU5DICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDEwNTI2NzIgLyogRmlsZUNvbnRyb2xGbGFnLk9fU1lOQyAqLztcbiAgICAgICAgICAgICAgICBuZWVkZWRfaW5oZXJpdGluZyB8PSBXYXNpUmlnaHRzLkZEX1NZTkM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod3JpdGUgJiYgKGZsYWdzICYgKDEwMjQgLyogRmlsZUNvbnRyb2xGbGFnLk9fQVBQRU5EICovIHwgNTEyIC8qIEZpbGVDb250cm9sRmxhZy5PX1RSVU5DICovKSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBuZWVkZWRfaW5oZXJpdGluZyB8PSBXYXNpUmlnaHRzLkZEX1NFRUs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBmbGFncywgbmVlZGVkX2Jhc2UsIG5lZWRlZF9pbmhlcml0aW5nIH07XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX29wZW4nLCBmdW5jdGlvbiBwYXRoX29wZW4oZGlyZmQsIGRpcmZsYWdzLCBwYXRoLCBwYXRoX2xlbiwgb19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncywgZmQpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBmZCA9IE51bWJlcihmZCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCB8fCBmZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgZnNfcmlnaHRzX2Jhc2UgPSBCaWdJbnQoZnNfcmlnaHRzX2Jhc2UpO1xuICAgICAgICAgICAgZnNfcmlnaHRzX2luaGVyaXRpbmcgPSBCaWdJbnQoZnNfcmlnaHRzX2luaGVyaXRpbmcpO1xuICAgICAgICAgICAgY29uc3QgeyBmbGFnczogZmxhZ3NSZXMsIG5lZWRlZF9iYXNlOiBuZWVkZWRCYXNlLCBuZWVkZWRfaW5oZXJpdGluZzogbmVlZGVkSW5oZXJpdGluZyB9ID0gcGF0aE9wZW4ob19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZGlyZmQsIG5lZWRlZEJhc2UsIG5lZWRlZEluaGVyaXRpbmcpO1xuICAgICAgICAgICAgY29uc3QgbWVtb3J5ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgSEVBUFU4ID0gbWVtb3J5LkhFQVBVODtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRfcGF0aCA9IHJlc29sdmVQYXRoU3luYyhmcywgZmlsZURlc2NyaXB0b3IsIHBhdGhTdHJpbmcsIGRpcmZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBmcy5vcGVuU3luYyhyZXNvbHZlZF9wYXRoLCBmbGFnc1JlcywgMG82NjYpO1xuICAgICAgICAgICAgY29uc3QgZmlsZXR5cGUgPSB3YXNpLmZkcy5nZXRGaWxlVHlwZUJ5RmQocik7XG4gICAgICAgICAgICBpZiAoKGZpbGV0eXBlICE9PSAzIC8qIFdhc2lGaWxlVHlwZS5ESVJFQ1RPUlkgKi8pICYmXG4gICAgICAgICAgICAgICAgKChvX2ZsYWdzICYgMiAvKiBXYXNpRmlsZUNvbnRyb2xGbGFnLk9fRElSRUNUT1JZICovKSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAocmVzb2x2ZWRfcGF0aC5lbmRzV2l0aCgnLycpKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNTQgLyogV2FzaUVycm5vLkVOT1RESVIgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGJhc2U6IG1heF9iYXNlLCBpbmhlcml0aW5nOiBtYXhfaW5oZXJpdGluZyB9ID0gZ2V0UmlnaHRzKHdhc2kuZmRzLnN0ZGlvLCByLCBmbGFnc1JlcywgZmlsZXR5cGUpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcCA9IHdhc2kuZmRzLmluc2VydChyLCByZXNvbHZlZF9wYXRoLCByZXNvbHZlZF9wYXRoLCBmaWxldHlwZSwgZnNfcmlnaHRzX2Jhc2UgJiBtYXhfYmFzZSwgZnNfcmlnaHRzX2luaGVyaXRpbmcgJiBtYXhfaW5oZXJpdGluZywgMCk7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gZnMuZnN0YXRTeW5jKHIsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwLnNpemUgPSBzdGF0LnNpemU7XG4gICAgICAgICAgICAgICAgaWYgKChmbGFnc1JlcyAmIDEwMjQgLyogRmlsZUNvbnRyb2xGbGFnLk9fQVBQRU5EICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwLnBvcyA9IHN0YXQuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gbWVtb3J5LnZpZXc7XG4gICAgICAgICAgICB2aWV3LnNldEludDMyKGZkLCB3cmFwLmlkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9vcGVuKGRpcmZkLCBkaXJmbGFncywgcGF0aCwgcGF0aF9sZW4sIG9fZmxhZ3MsIGZzX3JpZ2h0c19iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZywgZnNfZmxhZ3MsIGZkKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgZmQgPSBOdW1iZXIoZmQpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDAgfHwgZmQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGZzX3JpZ2h0c19iYXNlID0gQmlnSW50KGZzX3JpZ2h0c19iYXNlKTtcbiAgICAgICAgICAgIGZzX3JpZ2h0c19pbmhlcml0aW5nID0gQmlnSW50KGZzX3JpZ2h0c19pbmhlcml0aW5nKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZmxhZ3M6IGZsYWdzUmVzLCBuZWVkZWRfYmFzZTogbmVlZGVkQmFzZSwgbmVlZGVkX2luaGVyaXRpbmc6IG5lZWRlZEluaGVyaXRpbmcgfSA9IHBhdGhPcGVuKG9fZmxhZ3MsIGZzX3JpZ2h0c19iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZywgZnNfZmxhZ3MpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGRpcmZkLCBuZWVkZWRCYXNlLCBuZWVkZWRJbmhlcml0aW5nKTtcbiAgICAgICAgICAgIGNvbnN0IG1lbW9yeSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IEhFQVBVOCA9IG1lbW9yeS5IRUFQVTg7XG4gICAgICAgICAgICBjb25zdCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkX3BhdGggPSBhd2FpdCByZXNvbHZlUGF0aEFzeW5jKGZzLCBmaWxlRGVzY3JpcHRvciwgcGF0aFN0cmluZywgZGlyZmxhZ3MpO1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4ocmVzb2x2ZWRfcGF0aCwgZmxhZ3NSZXMsIDBvNjY2KTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGV0eXBlID0gYXdhaXQgd2FzaS5mZHMuZ2V0RmlsZVR5cGVCeUZkKHIpO1xuICAgICAgICAgICAgaWYgKChvX2ZsYWdzICYgMiAvKiBXYXNpRmlsZUNvbnRyb2xGbGFnLk9fRElSRUNUT1JZICovKSAhPT0gMCAmJiBmaWxldHlwZSAhPT0gMyAvKiBXYXNpRmlsZVR5cGUuRElSRUNUT1JZICovKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDU0IC8qIFdhc2lFcnJuby5FTk9URElSICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBiYXNlOiBtYXhfYmFzZSwgaW5oZXJpdGluZzogbWF4X2luaGVyaXRpbmcgfSA9IGdldFJpZ2h0cyh3YXNpLmZkcy5zdGRpbywgci5mZCwgZmxhZ3NSZXMsIGZpbGV0eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXAgPSB3YXNpLmZkcy5pbnNlcnQociwgcmVzb2x2ZWRfcGF0aCwgcmVzb2x2ZWRfcGF0aCwgZmlsZXR5cGUsIGZzX3JpZ2h0c19iYXNlICYgbWF4X2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nICYgbWF4X2luaGVyaXRpbmcsIDApO1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IHIuc3RhdCh7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgd3JhcC5zaXplID0gc3RhdC5zaXplO1xuICAgICAgICAgICAgICAgIGlmICgoZmxhZ3NSZXMgJiAxMDI0IC8qIEZpbGVDb250cm9sRmxhZy5PX0FQUEVORCAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcC5wb3MgPSBzdGF0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmlldyA9IG1lbW9yeS52aWV3O1xuICAgICAgICAgICAgdmlldy5zZXRJbnQzMihmZCwgd3JhcC5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpNjQnLCAnaTY0JywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9yZWFkbGluaycsIGZ1bmN0aW9uIHBhdGhfcmVhZGxpbmsoZmQsIHBhdGgsIHBhdGhfbGVuLCBidWYsIGJ1Zl9sZW4sIGJ1ZnVzZWQpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgIGJ1Zl9sZW4gPSBOdW1iZXIoYnVmX2xlbik7XG4gICAgICAgICAgICBidWZ1c2VkID0gTnVtYmVyKGJ1ZnVzZWQpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDAgfHwgYnVmID09PSAwIHx8IGJ1ZnVzZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9SRUFETElOSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBmcy5yZWFkbGlua1N5bmMocGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBsaW5rRGF0YSA9IGVuY29kZXIuZW5jb2RlKGxpbmspO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGlua0RhdGEubGVuZ3RoLCBidWZfbGVuKTtcbiAgICAgICAgICAgIGlmIChsZW4gPj0gYnVmX2xlbilcbiAgICAgICAgICAgICAgICByZXR1cm4gNDIgLyogV2FzaUVycm5vLkVOT0JVRlMgKi87XG4gICAgICAgICAgICBIRUFQVTguc2V0KGxpbmtEYXRhLnN1YmFycmF5KDAsIGxlbiksIGJ1Zik7XG4gICAgICAgICAgICBIRUFQVThbYnVmICsgbGVuXSA9IDA7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihidWZ1c2VkLCBsZW4sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX3JlYWRsaW5rKGZkLCBwYXRoLCBwYXRoX2xlbiwgYnVmLCBidWZfbGVuLCBidWZ1c2VkKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgYnVmID0gTnVtYmVyKGJ1Zik7XG4gICAgICAgICAgICBidWZfbGVuID0gTnVtYmVyKGJ1Zl9sZW4pO1xuICAgICAgICAgICAgYnVmdXNlZCA9IE51bWJlcihidWZ1c2VkKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwIHx8IGJ1ZiA9PT0gMCB8fCBidWZ1c2VkID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfUkVBRExJTkssIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGxpbmsocGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBsaW5rRGF0YSA9IGVuY29kZXIuZW5jb2RlKGxpbmspO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGlua0RhdGEubGVuZ3RoLCBidWZfbGVuKTtcbiAgICAgICAgICAgIGlmIChsZW4gPj0gYnVmX2xlbilcbiAgICAgICAgICAgICAgICByZXR1cm4gNDIgLyogV2FzaUVycm5vLkVOT0JVRlMgKi87XG4gICAgICAgICAgICBIRUFQVTguc2V0KGxpbmtEYXRhLnN1YmFycmF5KDAsIGxlbiksIGJ1Zik7XG4gICAgICAgICAgICBIRUFQVThbYnVmICsgbGVuXSA9IDA7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihidWZ1c2VkLCBsZW4sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfcmVtb3ZlX2RpcmVjdG9yeScsIGZ1bmN0aW9uIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeShmZCwgcGF0aCwgcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTU9WRV9ESVJFQ1RPUlksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy5ybWRpclN5bmMocGF0aFN0cmluZyk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeShmZCwgcGF0aCwgcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTU9WRV9ESVJFQ1RPUlksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybWRpcihwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX3JlbmFtZScsIGZ1bmN0aW9uIHBhdGhfcmVuYW1lKG9sZF9mZCwgb2xkX3BhdGgsIG9sZF9wYXRoX2xlbiwgbmV3X2ZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IG9sZFdyYXA7XG4gICAgICAgICAgICBsZXQgbmV3V3JhcDtcbiAgICAgICAgICAgIGlmIChvbGRfZmQgPT09IG5ld19mZCkge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9TT1VSQ0UgfCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1RBUkdFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgICAgICBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG5ld19mZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRPbGRQYXRoID0gcmVzb2x2ZShvbGRXcmFwLnJlYWxQYXRoLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWROZXdQYXRoID0gcmVzb2x2ZShuZXdXcmFwLnJlYWxQYXRoLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgbmV3X3BhdGgsIG5ld19wYXRoICsgbmV3X3BhdGhfbGVuKSkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLnJlbmFtZVN5bmMocmVzb2x2ZWRPbGRQYXRoLCByZXNvbHZlZE5ld1BhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX3JlbmFtZShvbGRfZmQsIG9sZF9wYXRoLCBvbGRfcGF0aF9sZW4sIG5ld19mZCwgbmV3X3BhdGgsIG5ld19wYXRoX2xlbikge1xuICAgICAgICAgICAgb2xkX3BhdGggPSBOdW1iZXIob2xkX3BhdGgpO1xuICAgICAgICAgICAgb2xkX3BhdGhfbGVuID0gTnVtYmVyKG9sZF9wYXRoX2xlbik7XG4gICAgICAgICAgICBuZXdfcGF0aCA9IE51bWJlcihuZXdfcGF0aCk7XG4gICAgICAgICAgICBuZXdfcGF0aF9sZW4gPSBOdW1iZXIobmV3X3BhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChvbGRfcGF0aCA9PT0gMCB8fCBuZXdfcGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGxldCBvbGRXcmFwO1xuICAgICAgICAgICAgbGV0IG5ld1dyYXA7XG4gICAgICAgICAgICBpZiAob2xkX2ZkID09PSBuZXdfZmQpIHtcbiAgICAgICAgICAgICAgICBvbGRXcmFwID0gbmV3V3JhcCA9IHdhc2kuZmRzLmdldChvbGRfZmQsIFdhc2lSaWdodHMuUEFUSF9SRU5BTUVfU09VUkNFIHwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvbGRXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9TT1VSQ0UsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICAgICAgbmV3V3JhcCA9IHdhc2kuZmRzLmdldChuZXdfZmQsIFdhc2lSaWdodHMuUEFUSF9SRU5BTUVfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT2xkUGF0aCA9IHJlc29sdmUob2xkV3JhcC5yZWFsUGF0aCwgZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG9sZF9wYXRoLCBvbGRfcGF0aCArIG9sZF9wYXRoX2xlbikpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTmV3UGF0aCA9IHJlc29sdmUobmV3V3JhcC5yZWFsUGF0aCwgZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG5ld19wYXRoLCBuZXdfcGF0aCArIG5ld19wYXRoX2xlbikpKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUocmVzb2x2ZWRPbGRQYXRoLCByZXNvbHZlZE5ld1BhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfc3ltbGluaycsIGZ1bmN0aW9uIHBhdGhfc3ltbGluayhvbGRfcGF0aCwgb2xkX3BhdGhfbGVuLCBmZCwgbmV3X3BhdGgsIG5ld19wYXRoX2xlbikge1xuICAgICAgICAgICAgb2xkX3BhdGggPSBOdW1iZXIob2xkX3BhdGgpO1xuICAgICAgICAgICAgb2xkX3BhdGhfbGVuID0gTnVtYmVyKG9sZF9wYXRoX2xlbik7XG4gICAgICAgICAgICBuZXdfcGF0aCA9IE51bWJlcihuZXdfcGF0aCk7XG4gICAgICAgICAgICBuZXdfcGF0aF9sZW4gPSBOdW1iZXIobmV3X3BhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChvbGRfcGF0aCA9PT0gMCB8fCBuZXdfcGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX1NZTUxJTkssIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBvbGRQYXRoID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG9sZF9wYXRoLCBvbGRfcGF0aCArIG9sZF9wYXRoX2xlbikpO1xuICAgICAgICAgICAgaWYgKG9sZFBhdGgubGVuZ3RoID4gMCAmJiBvbGRQYXRoWzBdID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNjMgLyogV2FzaUVycm5vLkVQRVJNICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5ld1BhdGggPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgbmV3X3BhdGgsIG5ld19wYXRoICsgbmV3X3BhdGhfbGVuKSk7XG4gICAgICAgICAgICBuZXdQYXRoID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgbmV3UGF0aCk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMuc3ltbGlua1N5bmMob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfc3ltbGluayhvbGRfcGF0aCwgb2xkX3BhdGhfbGVuLCBmZCwgbmV3X3BhdGgsIG5ld19wYXRoX2xlbikge1xuICAgICAgICAgICAgb2xkX3BhdGggPSBOdW1iZXIob2xkX3BhdGgpO1xuICAgICAgICAgICAgb2xkX3BhdGhfbGVuID0gTnVtYmVyKG9sZF9wYXRoX2xlbik7XG4gICAgICAgICAgICBuZXdfcGF0aCA9IE51bWJlcihuZXdfcGF0aCk7XG4gICAgICAgICAgICBuZXdfcGF0aF9sZW4gPSBOdW1iZXIobmV3X3BhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChvbGRfcGF0aCA9PT0gMCB8fCBuZXdfcGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX1NZTUxJTkssIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBvbGRQYXRoID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG9sZF9wYXRoLCBvbGRfcGF0aCArIG9sZF9wYXRoX2xlbikpO1xuICAgICAgICAgICAgbGV0IG5ld1BhdGggPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgbmV3X3BhdGgsIG5ld19wYXRoICsgbmV3X3BhdGhfbGVuKSk7XG4gICAgICAgICAgICBuZXdQYXRoID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgbmV3UGF0aCk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMuc3ltbGluayhvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfdW5saW5rX2ZpbGUnLCBmdW5jdGlvbiBwYXRoX3VubGlua19maWxlKGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfVU5MSU5LX0ZJTEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX3VubGlua19maWxlKGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfVU5MSU5LX0ZJTEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aFN0cmluZyk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIHRoaXMuX3NldE1lbW9yeSA9IGZ1bmN0aW9uIHNldE1lbW9yeShtKSB7XG4gICAgICAgICAgICBpZiAoIShtIGluc3RhbmNlb2YgX1dlYkFzc2VtYmx5Lk1lbW9yeSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImluc3RhbmNlLmV4cG9ydHMubWVtb3J5XCIgcHJvcGVydHkgbXVzdCBiZSBhIFdlYkFzc2VtYmx5Lk1lbW9yeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX21lbW9yeS5zZXQoX3RoaXMsIGV4dGVuZE1lbW9yeShtKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVTeW5jKGFyZ3MsIGVudiwgcHJlb3BlbnMsIHN0ZGlvLCBmcywgcHJpbnQsIHByaW50RXJyKSB7XG4gICAgICAgIGNvbnN0IGZkcyA9IG5ldyBTeW5jVGFibGUoe1xuICAgICAgICAgICAgc2l6ZTogMyxcbiAgICAgICAgICAgIGluOiBzdGRpb1swXSxcbiAgICAgICAgICAgIG91dDogc3RkaW9bMV0sXG4gICAgICAgICAgICBlcnI6IHN0ZGlvWzJdLFxuICAgICAgICAgICAgZnMsXG4gICAgICAgICAgICBwcmludCxcbiAgICAgICAgICAgIHByaW50RXJyXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfdGhpcyA9IG5ldyBXQVNJJDEoYXJncywgZW52LCBmZHMsIGZhbHNlLCBmcyk7XG4gICAgICAgIGlmIChwcmVvcGVucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZW9wZW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbFBhdGggPSBmcy5yZWFscGF0aFN5bmMocHJlb3BlbnNbaV0ucmVhbFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhyZWFsUGF0aCwgJ3InLCAwbzY2Nik7XG4gICAgICAgICAgICAgICAgZmRzLmluc2VydFByZW9wZW4oZmQsIHByZW9wZW5zW2ldLm1hcHBlZFBhdGgsIHJlYWxQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGVBc3luYyhhcmdzLCBlbnYsIHByZW9wZW5zLCBzdGRpbywgZnMsIHByaW50LCBwcmludEVyciwgYXN5bmNpZnkpIHtcbiAgICAgICAgY29uc3QgZmRzID0gbmV3IEFzeW5jVGFibGUoe1xuICAgICAgICAgICAgc2l6ZTogMyxcbiAgICAgICAgICAgIGluOiBzdGRpb1swXSxcbiAgICAgICAgICAgIG91dDogc3RkaW9bMV0sXG4gICAgICAgICAgICBlcnI6IHN0ZGlvWzJdLFxuICAgICAgICAgICAgcHJpbnQsXG4gICAgICAgICAgICBwcmludEVyclxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgX3RoaXMgPSBuZXcgV0FTSSQxKGFyZ3MsIGVudiwgZmRzLCB0cnVlLCBmcywgYXN5bmNpZnkpO1xuICAgICAgICBpZiAocHJlb3BlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVvcGVucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gcHJlb3BlbnNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbFBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChlbnRyeS5yZWFsUGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmQgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKHJlYWxQYXRoLCAncicsIDBvNjY2KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmZHMuaW5zZXJ0UHJlb3BlbihmZCwgZW50cnkubWFwcGVkUGF0aCwgcmVhbFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzcGFjZWQtY29tbWVudFxuY29uc3Qga0VtcHR5T2JqZWN0ID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKC8qI19fUFVSRV9fKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5jb25zdCBrRXhpdENvZGUgPSBTeW1ib2woJ2tFeGl0Q29kZScpO1xuY29uc3Qga1NldE1lbW9yeSA9IFN5bWJvbCgna1NldE1lbW9yeScpO1xuY29uc3Qga1N0YXJ0ZWQgPSBTeW1ib2woJ2tTdGFydGVkJyk7XG5jb25zdCBrSW5zdGFuY2UgPSBTeW1ib2woJ2tJbnN0YW5jZScpO1xuY29uc3Qga0JpbmRpbmdOYW1lID0gU3ltYm9sKCdrQmluZGluZ05hbWUnKTtcbmZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgbGV0IF9XQVNJO1xuICAgIGlmIChvcHRpb25zLnZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhvcHRpb25zLnZlcnNpb24sICdvcHRpb25zLnZlcnNpb24nKTtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3Vuc3RhYmxlJzpcbiAgICAgICAgICAgICAgICBfV0FTSSA9IFdBU0kkMTtcbiAgICAgICAgICAgICAgICB0aGlzW2tCaW5kaW5nTmFtZV0gPSAnd2FzaV91bnN0YWJsZSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwcmV2aWV3MSc6XG4gICAgICAgICAgICAgICAgX1dBU0kgPSBXQVNJJDE7XG4gICAgICAgICAgICAgICAgdGhpc1trQmluZGluZ05hbWVdID0gJ3dhc2lfc25hcHNob3RfcHJldmlldzEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGB1bnN1cHBvcnRlZCBXQVNJIHZlcnNpb24gXCIke29wdGlvbnMudmVyc2lvbn1cImApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBfV0FTSSA9IFdBU0kkMTtcbiAgICAgICAgdGhpc1trQmluZGluZ05hbWVdID0gJ3dhc2lfc25hcHNob3RfcHJldmlldzEnO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hcmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVBcnJheShvcHRpb25zLmFyZ3MsICdvcHRpb25zLmFyZ3MnKTtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9ICgoX2EgPSBvcHRpb25zLmFyZ3MpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBlbnYgPSBbXTtcbiAgICBpZiAob3B0aW9ucy5lbnYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLmVudiwgJ29wdGlvbnMuZW52Jyk7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZW52KS5mb3JFYWNoKCh7IDA6IGtleSwgMTogdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnYucHVzaChgJHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBwcmVvcGVucyA9IFtdO1xuICAgIGlmIChvcHRpb25zLnByZW9wZW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucy5wcmVvcGVucywgJ29wdGlvbnMucHJlb3BlbnMnKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5wcmVvcGVucykuZm9yRWFjaCgoeyAwOiBrZXksIDE6IHZhbHVlIH0pID0+IHByZW9wZW5zLnB1c2goeyBtYXBwZWRQYXRoOiBTdHJpbmcoa2V5KSwgcmVhbFBhdGg6IFN0cmluZyh2YWx1ZSkgfSkpO1xuICAgIH1cbiAgICBpZiAocHJlb3BlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5mcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbGVzeXN0ZW0gaXMgZGlzYWJsZWQsIGNhbiBub3QgcHJlb3BlbiBkaXJlY3RvcnknKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucy5mcywgJ29wdGlvbnMuZnMnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTm9kZS5qcyBmcyBsaWtlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIChvcHRpb25zLmZpbGVzeXN0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIC8vICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucy5maWxlc3lzdGVtLCAnb3B0aW9ucy5maWxlc3lzdGVtJylcbiAgICAvLyAgIHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMuZmlsZXN5c3RlbS50eXBlLCAnb3B0aW9ucy5maWxlc3lzdGVtLnR5cGUnKVxuICAgIC8vICAgaWYgKG9wdGlvbnMuZmlsZXN5c3RlbS50eXBlICE9PSAnbWVtZnMnICYmIG9wdGlvbnMuZmlsZXN5c3RlbS50eXBlICE9PSAnZmlsZS1zeXN0ZW0tYWNjZXNzLWFwaScpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlc3lzdGVtIHR5cGUgJHsob3B0aW9ucy5maWxlc3lzdGVtIGFzIGFueSkudHlwZSBhcyBzdHJpbmd9IGlzIG5vdCBzdXBwb3J0ZWQsIG9ubHkgXCJtZW1mc1wiIGFuZCBcImZpbGUtc3lzdGVtLWFjY2Vzcy1hcGlcIiBpcyBzdXBwb3J0ZWQgY3VycmVudGx5YClcbiAgICAvLyAgIH1cbiAgICAvLyAgIHRyeSB7XG4gICAgLy8gICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMuZmlsZXN5c3RlbS5mcywgJ29wdGlvbnMuZmlsZXN5c3RlbS5mcycpXG4gICAgLy8gICB9IGNhdGNoIChfKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignTm9kZS5qcyBmcyBsaWtlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBwcm92aWRlZCcpXG4gICAgLy8gICB9XG4gICAgLy8gfVxuICAgIGlmIChvcHRpb25zLnByaW50ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucy5wcmludCwgJ29wdGlvbnMucHJpbnQnKTtcbiAgICBpZiAob3B0aW9ucy5wcmludEVyciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKG9wdGlvbnMucHJpbnRFcnIsICdvcHRpb25zLnByaW50RXJyJyk7XG4gICAgaWYgKG9wdGlvbnMucmV0dXJuT25FeGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVCb29sZWFuKG9wdGlvbnMucmV0dXJuT25FeGl0LCAnb3B0aW9ucy5yZXR1cm5PbkV4aXQnKTtcbiAgICB9XG4gICAgLy8gY29uc3QgeyBzdGRpbiA9IDAsIHN0ZG91dCA9IDEsIHN0ZGVyciA9IDIgfSA9IG9wdGlvbnNcbiAgICAvLyB2YWxpZGF0ZUludDMyKHN0ZGluLCAnb3B0aW9ucy5zdGRpbicsIDApXG4gICAgLy8gdmFsaWRhdGVJbnQzMihzdGRvdXQsICdvcHRpb25zLnN0ZG91dCcsIDApXG4gICAgLy8gdmFsaWRhdGVJbnQzMihzdGRlcnIsICdvcHRpb25zLnN0ZGVycicsIDApXG4gICAgLy8gY29uc3Qgc3RkaW8gPSBbc3RkaW4sIHN0ZG91dCwgc3RkZXJyXSBhcyBjb25zdFxuICAgIGNvbnN0IHN0ZGlvID0gWzAsIDEsIDJdO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3MsXG4gICAgICAgIGVudixcbiAgICAgICAgcHJlb3BlbnMsXG4gICAgICAgIHN0ZGlvLFxuICAgICAgICBfV0FTSVxuICAgIH07XG59XG5mdW5jdGlvbiBpbml0V0FTSShzZXRNZW1vcnksIHdyYXApIHtcbiAgICB0aGlzW2tTZXRNZW1vcnldID0gc2V0TWVtb3J5O1xuICAgIHRoaXMud2FzaUltcG9ydCA9IHdyYXA7XG4gICAgdGhpc1trU3RhcnRlZF0gPSBmYWxzZTtcbiAgICB0aGlzW2tFeGl0Q29kZV0gPSAwO1xuICAgIHRoaXNba0luc3RhbmNlXSA9IHVuZGVmaW5lZDtcbn1cbi8qKiBAcHVibGljICovXG5jbGFzcyBXQVNJIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ga0VtcHR5T2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHsgYXJncywgZW52LCBwcmVvcGVucywgc3RkaW8sIF9XQVNJIH0gPSB2YWxpZGF0ZU9wdGlvbnMuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgd3JhcCA9IF9XQVNJLmNyZWF0ZVN5bmMoYXJncywgZW52LCBwcmVvcGVucywgc3RkaW8sIG9wdGlvbnMuZnMsIG9wdGlvbnMucHJpbnQsIG9wdGlvbnMucHJpbnRFcnIpO1xuICAgICAgICBjb25zdCBzZXRNZW1vcnkgPSB3cmFwLl9zZXRNZW1vcnk7XG4gICAgICAgIGRlbGV0ZSB3cmFwLl9zZXRNZW1vcnk7XG4gICAgICAgIGluaXRXQVNJLmNhbGwodGhpcywgc2V0TWVtb3J5LCB3cmFwKTtcbiAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuT25FeGl0KSB7XG4gICAgICAgICAgICB3cmFwLnByb2NfZXhpdCA9IHdhc2lSZXR1cm5PblByb2NFeGl0LmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluYWxpemVCaW5kaW5ncyhpbnN0YW5jZSwgX2EpIHtcbiAgICAgICAgdmFyIF9iO1xuICAgICAgICB2YXIgeyBtZW1vcnkgPSAoX2IgPSBpbnN0YW5jZSA9PT0gbnVsbCB8fCBpbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5zdGFuY2UuZXhwb3J0cykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm1lbW9yeSB9ID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2E7XG4gICAgICAgIGlmICh0aGlzW2tTdGFydGVkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXQVNJIGluc3RhbmNlIGhhcyBhbHJlYWR5IHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZU9iamVjdChpbnN0YW5jZSwgJ2luc3RhbmNlJyk7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLmV4cG9ydHMsICdpbnN0YW5jZS5leHBvcnRzJyk7XG4gICAgICAgIHRoaXNba1NldE1lbW9yeV0obWVtb3J5KTtcbiAgICAgICAgdGhpc1trSW5zdGFuY2VdID0gaW5zdGFuY2U7XG4gICAgICAgIHRoaXNba1N0YXJ0ZWRdID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gTXVzdCBub3QgZXhwb3J0IF9pbml0aWFsaXplLCBtdXN0IGV4cG9ydCBfc3RhcnRcbiAgICBzdGFydChpbnN0YW5jZSkge1xuICAgICAgICB0aGlzLmZpbmFsaXplQmluZGluZ3MoaW5zdGFuY2UpO1xuICAgICAgICBjb25zdCB7IF9zdGFydCwgX2luaXRpYWxpemUgfSA9IHRoaXNba0luc3RhbmNlXS5leHBvcnRzO1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKF9zdGFydCwgJ2luc3RhbmNlLmV4cG9ydHMuX3N0YXJ0Jyk7XG4gICAgICAgIHZhbGlkYXRlVW5kZWZpbmVkKF9pbml0aWFsaXplLCAnaW5zdGFuY2UuZXhwb3J0cy5faW5pdGlhbGl6ZScpO1xuICAgICAgICBsZXQgcmV0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0ID0gX3N0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciAhPT0ga0V4aXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0LnRoZW4oKCkgPT4gdGhpc1trRXhpdENvZGVdLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVyciAhPT0ga0V4aXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba0V4aXRDb2RlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2tFeGl0Q29kZV07XG4gICAgfVxuICAgIC8vIE11c3Qgbm90IGV4cG9ydCBfc3RhcnQsIG1heSBvcHRpb25hbGx5IGV4cG9ydCBfaW5pdGlhbGl6ZVxuICAgIGluaXRpYWxpemUoaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZUJpbmRpbmdzKGluc3RhbmNlKTtcbiAgICAgICAgY29uc3QgeyBfc3RhcnQsIF9pbml0aWFsaXplIH0gPSB0aGlzW2tJbnN0YW5jZV0uZXhwb3J0cztcbiAgICAgICAgdmFsaWRhdGVVbmRlZmluZWQoX3N0YXJ0LCAnaW5zdGFuY2UuZXhwb3J0cy5fc3RhcnQnKTtcbiAgICAgICAgaWYgKF9pbml0aWFsaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb24oX2luaXRpYWxpemUsICdpbnN0YW5jZS5leHBvcnRzLl9pbml0aWFsaXplJyk7XG4gICAgICAgICAgICByZXR1cm4gX2luaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRJbXBvcnRPYmplY3QoKSB7XG4gICAgICAgIHJldHVybiB7IFt0aGlzW2tCaW5kaW5nTmFtZV1dOiB0aGlzLndhc2lJbXBvcnQgfTtcbiAgICB9XG59XG5mdW5jdGlvbiB3YXNpUmV0dXJuT25Qcm9jRXhpdChydmFsKSB7XG4gICAgdGhpc1trRXhpdENvZGVdID0gcnZhbDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRocm93LWxpdGVyYWxcbiAgICB0aHJvdyBrRXhpdENvZGU7XG59XG4vKiogQHB1YmxpYyAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXN5bmNXQVNJKG9wdGlvbnMgPSBrRW1wdHlPYmplY3QpIHtcbiAgICBjb25zdCBfdGhpcyA9IE9iamVjdC5jcmVhdGUoV0FTSS5wcm90b3R5cGUpO1xuICAgIGNvbnN0IHsgYXJncywgZW52LCBwcmVvcGVucywgc3RkaW8sIF9XQVNJIH0gPSB2YWxpZGF0ZU9wdGlvbnMuY2FsbChfdGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuYXN5bmNpZnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLmFzeW5jaWZ5LCAnb3B0aW9ucy5hc3luY2lmeScpO1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKG9wdGlvbnMuYXN5bmNpZnkud3JhcEltcG9ydEZ1bmN0aW9uLCAnb3B0aW9ucy5hc3luY2lmeS53cmFwSW1wb3J0RnVuY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhcCA9IGF3YWl0IF9XQVNJLmNyZWF0ZUFzeW5jKGFyZ3MsIGVudiwgcHJlb3BlbnMsIHN0ZGlvLCBvcHRpb25zLmZzLCBvcHRpb25zLnByaW50LCBvcHRpb25zLnByaW50RXJyLCBvcHRpb25zLmFzeW5jaWZ5KTtcbiAgICBjb25zdCBzZXRNZW1vcnkgPSB3cmFwLl9zZXRNZW1vcnk7XG4gICAgZGVsZXRlIHdyYXAuX3NldE1lbW9yeTtcbiAgICBpbml0V0FTSS5jYWxsKF90aGlzLCBzZXRNZW1vcnksIHdyYXApO1xuICAgIGlmIChvcHRpb25zLnJldHVybk9uRXhpdCkge1xuICAgICAgICB3cmFwLnByb2NfZXhpdCA9IHdhc2lSZXR1cm5PblByb2NFeGl0LmJpbmQoX3RoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG59XG5cbmV4cG9ydCB7IEFzeW5jaWZ5LCBNZW1vcnksIFdBU0ksIFdlYkFzc2VtYmx5TWVtb3J5LCBhc3luY2lmeUxvYWQsIGFzeW5jaWZ5TG9hZFN5bmMsIGNyZWF0ZUFzeW5jV0FTSSwgZXh0ZW5kTWVtb3J5LCBsb2FkLCBsb2FkU3luYywgd3JhcEFzeW5jRXhwb3J0LCB3cmFwQXN5bmNJbXBvcnQsIHdyYXBFeHBvcnRzIH07XG4iLCIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKi9cbmNvbnN0IGdldFR5cGUgPSAodmFsdWUpID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAwXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIDFcbiAgY29uc3QgdCA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodCA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gMlxuICBpZiAodCA9PT0gJ251bWJlcicpIHJldHVybiAzXG4gIGlmICh0ID09PSAnc3RyaW5nJykgcmV0dXJuIDRcbiAgaWYgKHQgPT09ICdvYmplY3QnKSByZXR1cm4gNlxuICBpZiAodCA9PT0gJ2JpZ2ludCcpIHJldHVybiA5XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCdtZW1mcycpLklGc30gbWVtZnNcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBnZXRUeXBlPn0gdHlwZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbmNvbnN0IGVuY29kZVZhbHVlID0gKG1lbWZzLCB2YWx1ZSwgdHlwZSkgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIDA6XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApXG4gICAgY2FzZSAyOiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IEludDMyQXJyYXkoMSlcbiAgICAgIHZpZXdbMF0gPSB2YWx1ZSA/IDEgOiAwXG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmlldy5idWZmZXIpXG4gICAgfVxuICAgIGNhc2UgMzoge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoMSlcbiAgICAgIHZpZXdbMF0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZpZXcuYnVmZmVyKVxuICAgIH1cbiAgICBjYXNlIDQ6IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodmFsdWUpXG4gICAgICByZXR1cm4gdmlld1xuICAgIH1cbiAgICBjYXNlIDY6IHtcbiAgICAgIGNvbnN0IFtlbnRyeV0gPSBPYmplY3QuZW50cmllcyhtZW1mcykuZmlsdGVyKChbXywgdl0pID0+IHYgPT09IHZhbHVlLmNvbnN0cnVjdG9yKVswXSA/PyBbXVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ19fY29uc3RydWN0b3JfXycsIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogZW50cnlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlLCAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICByZXR1cm4gYEJpZ0ludCgke1N0cmluZyh2YWx1ZSl9KWBcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICAgICAgICBfX2Vycm9yX186IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoanNvbilcbiAgICAgIHJldHVybiB2aWV3XG4gICAgfVxuICAgIGNhc2UgOToge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBCaWdJbnQ2NEFycmF5KDEpXG4gICAgICB2aWV3WzBdID0gdmFsdWVcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2aWV3LmJ1ZmZlcilcbiAgICB9XG4gICAgY2FzZSAtMTpcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBkYXRhJylcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydCgnbWVtZnMnKX0gbWVtZnNcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gcGF5bG9hZFxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmNvbnN0IGRlY29kZVZhbHVlID0gKG1lbWZzLCBwYXlsb2FkLCB0eXBlKSA9PiB7XG4gIGlmICh0eXBlID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICh0eXBlID09PSAxKSByZXR1cm4gbnVsbFxuICBpZiAodHlwZSA9PT0gMikgcmV0dXJuIEJvb2xlYW4obmV3IEludDMyQXJyYXkocGF5bG9hZC5idWZmZXIsIHBheWxvYWQuYnl0ZU9mZnNldCwgMSlbMF0pXG4gIGlmICh0eXBlID09PSAzKSByZXR1cm4gbmV3IEZsb2F0NjRBcnJheShwYXlsb2FkLmJ1ZmZlciwgcGF5bG9hZC5ieXRlT2Zmc2V0LCAxKVswXVxuICBpZiAodHlwZSA9PT0gNCkgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkLnNsaWNlKCkpXG4gIGlmICh0eXBlID09PSA2KSB7XG4gICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZC5zbGljZSgpKSwgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gdmFsdWUubWF0Y2goL15CaWdJbnRcXCgoLT9cXGQrKVxcKSQvKVxuICAgICAgICBpZiAobWF0Y2hlZCAmJiBtYXRjaGVkWzFdKSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChtYXRjaGVkWzFdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9KVxuICAgIGlmIChvYmouX19jb25zdHJ1Y3Rvcl9fKSB7XG4gICAgICBjb25zdCBjdG9yID0gb2JqLl9fY29uc3RydWN0b3JfX1xuICAgICAgZGVsZXRlIG9iai5fX2NvbnN0cnVjdG9yX19cbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihvYmosIG1lbWZzW2N0b3JdLnByb3RvdHlwZSlcbiAgICB9XG4gICAgaWYgKG9iai5fX2Vycm9yX18pIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBvYmouX19lcnJvcl9fXG4gICAgICBjb25zdCBFcnJvckNvbnN0cnVjdG9yID0gZ2xvYmFsVGhpc1tuYW1lXSB8fCBFcnJvclxuICAgICAgZGVsZXRlIG9iai5fX2Vycm9yX19cbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvckNvbnN0cnVjdG9yKG9iai5tZXNzYWdlKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ3N0YWNrJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGVyci5zdGFja1xuICAgICAgfSlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IG5hbWVcbiAgICAgIH0pXG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGlmIChrID09PSAnbWVzc2FnZScgfHwgayA9PT0gJ3N0YWNrJykgY29udGludWVcbiAgICAgICAgZXJyW2tdID0gdlxuICAgICAgfVxuICAgICAgcmV0dXJuIGVyclxuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cbiAgaWYgKHR5cGUgPT09IDkpIHJldHVybiBuZXcgQmlnSW50NjRBcnJheShwYXlsb2FkLmJ1ZmZlciwgcGF5bG9hZC5ieXRlT2Zmc2V0LCAxKVswXVxuICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGRhdGEnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCdtZW1mcycpLklGc30gZnNcbiAqIEByZXR1cm5zIHsoZTogeyBkYXRhOiB7IF9fZnNfXzogeyBzYWI6IEludDMyQXJyYXksIHR5cGU6IGtleW9mIGltcG9ydCgnbWVtZnMnKS5JRnMsIHBheWxvYWQ6IGFueVtdIH0gfSB9KSA9PiB2b2lkfVxuICovXG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gZml4ZWQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZVxubW9kdWxlLmV4cG9ydHMuY3JlYXRlT25NZXNzYWdlID0gKGZzKSA9PiBmdW5jdGlvbiBvbk1lc3NhZ2UoZSkge1xuICBpZiAoZS5kYXRhLl9fZnNfXykge1xuICAgIC8qKlxuICAgICAqIDAuLjQgICAgICAgICAgICAgICAgICAgIHN0YXR1cyhpbnQzMl90KTogICAgICAgIDIxKHdhaXRpbmcpIDAoc3VjY2VzcykgMShlcnJvcilcbiAgICAgKiA1Li44ICAgICAgICAgICAgICAgICAgICB0eXBlKG5hcGlfdmFsdWV0eXBlKTogICAwKHVuZGVmaW5lZCkgMShudWxsKSAyKGJvb2xlYW4pIDMobnVtYmVyKSA0KHN0cmluZykgNihqc29uc3RyaW5nKSA5KGJpZ2ludCkgLTEodW5zdXBwb3J0ZWQpXG4gICAgICogOS4uMTYgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplKHVpbnQzMl90KSAgPD0gMTAyNFxuICAgICAqIDE2Li4xNiArIHBheWxvYWRfc2l6ZSAgIHBheWxvYWRfY29udGVudFxuICAgICAqL1xuICAgIGNvbnN0IHsgc2FiLCB0eXBlLCBwYXlsb2FkIH0gPSBlLmRhdGEuX19mc19fXG4gICAgY29uc3QgZm4gPSBmc1t0eXBlXVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBmbi5hcHBseShmcywgcGF5bG9hZClcbiAgICAgIGNvbnN0IHQgPSBnZXRUeXBlKHJldClcbiAgICAgIEF0b21pY3Muc3RvcmUoc2FiLCAxLCB0KVxuICAgICAgY29uc3QgdiA9IGVuY29kZVZhbHVlKGZzLCByZXQsIHQpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMiwgdi5sZW5ndGgpXG4gICAgICBuZXcgVWludDhBcnJheShzYWIuYnVmZmVyKS5zZXQodiwgMTYpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMCwgMCkgLy8gc3VjY2Vzc1xuXG4gICAgfSBjYXRjaCAoLyoqIEB0eXBlIHthbnl9ICovIGVycikge1xuICAgICAgY29uc3QgdCA9IGdldFR5cGUoZXJyKVxuICAgICAgQXRvbWljcy5zdG9yZShzYWIsIDEsIHQpXG4gICAgICBjb25zdCB2ID0gZW5jb2RlVmFsdWUoZnMsIGVyciwgdClcbiAgICAgIEF0b21pY3Muc3RvcmUoc2FiLCAyLCB2Lmxlbmd0aClcbiAgICAgIG5ldyBVaW50OEFycmF5KHNhYi5idWZmZXIpLnNldCh2LCAxNilcbiAgICAgIEF0b21pY3Muc3RvcmUoc2FiLCAwLCAxKSAvLyBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICBBdG9taWNzLm5vdGlmeShzYWIsIDApXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KCdtZW1mcycpfSBtZW1mc1xuICovXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVGc1Byb3h5ID0gKG1lbWZzKSA9PiBuZXcgUHJveHkoe30sIHtcbiAgZ2V0IChfdGFyZ2V0LCBwLCBfcmVjZWl2ZXIpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBjb25zdCBzYWIgPSBuZXcgU2hhcmVkQXJyYXlCdWZmZXIoMTYgKyAxMDI0MClcbiAgICAgIGNvbnN0IGkzMmFyciA9IG5ldyBJbnQzMkFycmF5KHNhYilcbiAgICAgIEF0b21pY3Muc3RvcmUoaTMyYXJyLCAwLCAyMSlcblxuICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICBfX2ZzX186IHtcbiAgICAgICAgICBzYWI6IGkzMmFycixcbiAgICAgICAgICB0eXBlOiBwLFxuICAgICAgICAgIHBheWxvYWQ6IGFyZ3NcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgQXRvbWljcy53YWl0KGkzMmFyciwgMCwgMjEpXG5cbiAgICAgIGNvbnN0IHN0YXR1cyA9IEF0b21pY3MubG9hZChpMzJhcnIsIDApXG4gICAgICBjb25zdCB0eXBlID0gQXRvbWljcy5sb2FkKGkzMmFyciwgMSlcbiAgICAgIGNvbnN0IHNpemUgPSBBdG9taWNzLmxvYWQoaTMyYXJyLCAyKVxuICAgICAgY29uc3QgY29udGVudCA9IG5ldyBVaW50OEFycmF5KHNhYiwgMTYsIHNpemUpXG4gICAgICBjb25zdCB2YWx1ZSA9IGRlY29kZVZhbHVlKG1lbWZzLCBjb250ZW50LCB0eXBlKVxuICAgICAgaWYgKHN0YXR1cyA9PT0gMSkge1xuICAgICAgICB0aHJvdyB2YWx1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICB9XG59KVxuIl0sIm5hbWVzIjpbIl9XZWJBc3NlbWJseSJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsY0FBWSxHQUFHLE9BQU8sV0FBVyxLQUFLO0FBQzFDLE1BQU07QUFDTixNQUFNLE9BQU8sYUFBYSxLQUFLO0FBQy9CLFVBQVU7QUFDVixVQUFVLFNBQVM7QUFDbkIsSUFBSSxtQkFBbUIsR0FBa0MsSUFBTyxLQUFLLElBRXhCO0FBQzdDLFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRTtBQUNqQyxJQUFJLE9BQU8s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RUFBRTtBQUNyQyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFDckQsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxLQUFLLElBQUksR0FBRyxNQUFNLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVHO0FBQ0E7QUFDQSxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ3BDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDL0IsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxLQUFLLElBQUksR0FBRyxNQUFNLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNHO0FBQ0E7QUFDQSxTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ3RDLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDcEMsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxLQUFLLElBQUksR0FBRyxNQUFNLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVHO0FBQ0E7QUFDQSxTQUFTLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ3JDLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFDbkMsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxLQUFLLElBQUksR0FBRyxNQUFNLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNHO0FBQ0E7QUFDQSxTQUFTLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDdkMsSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRTtBQUNyQyxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLEtBQUssSUFBSSxHQUFHLE1BQU0sR0FBRyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDN0c7QUFDQTtBQUNBLFNBQVMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN4QyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUM3QixRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLEtBQUssSUFBSSxHQUFHLE1BQU0sR0FBRyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUc7QUFDQTtBQUNBLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRTtBQUM1QixJQUFJLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLEtBQUssVUFBVSxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztBQUM5RztBQXdCQSxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtBQUN6QyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8saUJBQWlCLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksaUJBQWlCLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssNEJBQTRCLENBQUM7QUFDL0wsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHO0FBQy9CLFVBQVUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0FBQ25DOztBQTJPQSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsU0FBUyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUU7QUFDcEMsSUFBSSxPQUFPLElBQUksS0FBSyxrQkFBa0I7QUFDdEM7QUFDQSxTQUFTLGVBQWUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7QUFDM0UsSUFBSSxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQ2hCLElBQUksSUFBSSxpQkFBaUIsR0FBRyxDQUFDO0FBQzdCLElBQUksSUFBSSxTQUFTLEdBQUcsRUFBRTtBQUN0QixJQUFJLElBQUksSUFBSSxHQUFHLENBQUM7QUFDaEIsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDO0FBQ2hCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDM0MsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzdCLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsYUFBYSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN4QyxZQUFZO0FBQ1o7QUFDQSxhQUFhO0FBQ2IsWUFBWSxJQUFJLEdBQUcsa0JBQWtCO0FBQ3JDO0FBQ0EsUUFBUSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNuQyxZQUFZLElBQUksU0FBUyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtBQUNuRCxpQkFBaUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ2pDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixLQUFLLENBQUM7QUFDN0Qsb0JBQW9CLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxRQUFRO0FBQy9ELG9CQUFvQixHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO0FBQ2pFLG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3hDLHdCQUF3QixNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNyRSx3QkFBd0IsSUFBSSxjQUFjLEtBQUssRUFBRSxFQUFFO0FBQ25ELDRCQUE0QixHQUFHLEdBQUcsRUFBRTtBQUNwQyw0QkFBNEIsaUJBQWlCLEdBQUcsQ0FBQztBQUNqRDtBQUNBLDZCQUE2QjtBQUM3Qiw0QkFBNEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQztBQUM5RCw0QkFBNEIsaUJBQWlCO0FBQzdDLGdDQUFnQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUN2RTtBQUNBLHdCQUF3QixTQUFTLEdBQUcsQ0FBQztBQUNyQyx3QkFBd0IsSUFBSSxHQUFHLENBQUM7QUFDaEMsd0JBQXdCO0FBQ3hCO0FBQ0EseUJBQXlCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDL0Msd0JBQXdCLEdBQUcsR0FBRyxFQUFFO0FBQ2hDLHdCQUF3QixpQkFBaUIsR0FBRyxDQUFDO0FBQzdDLHdCQUF3QixTQUFTLEdBQUcsQ0FBQztBQUNyQyx3QkFBd0IsSUFBSSxHQUFHLENBQUM7QUFDaEMsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSSxjQUFjLEVBQUU7QUFDcEMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUk7QUFDbkUsb0JBQW9CLGlCQUFpQixHQUFHLENBQUM7QUFDekM7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0IsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNwQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RTtBQUNBLHFCQUFxQjtBQUNyQixvQkFBb0IsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEQ7QUFDQSxnQkFBZ0IsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDO0FBQ3JEO0FBQ0EsWUFBWSxTQUFTLEdBQUcsQ0FBQztBQUN6QixZQUFZLElBQUksR0FBRyxDQUFDO0FBQ3BCO0FBQ0EsYUFBYSxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRTtBQUNuRCxZQUFZLEVBQUUsSUFBSTtBQUNsQjtBQUNBLGFBQWE7QUFDYixZQUFZLElBQUksR0FBRyxFQUFFO0FBQ3JCO0FBQ0E7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkO0FBQ0EsU0FBUyxPQUFPLENBQUMsR0FBRyxJQUFJLEVBQUU7QUFDMUIsSUFBSSxJQUFJLFlBQVksR0FBRyxFQUFFO0FBQ3pCLElBQUksSUFBSSxnQkFBZ0IsR0FBRyxLQUFLO0FBQ2hDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckUsUUFBUSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQzNDLFFBQVEsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDL0IsWUFBWTtBQUNaO0FBQ0EsUUFBUSxZQUFZLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDaEQsUUFBUSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLGtCQUFrQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxHQUFHLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsb0JBQW9CLENBQUM7QUFDOUYsSUFBSSxJQUFJLGdCQUFnQixFQUFFO0FBQzFCLFFBQVEsT0FBTyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNqQztBQUNBLElBQUksT0FBTyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxZQUFZLEdBQUcsR0FBRztBQUN2RDs7QUFFQSxNQUFNLFdBQVcsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxNQUFNLE9BQU8sa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRSxNQUFNLE9BQU8sa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRSxNQUFNLG1CQUFtQixrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLE1BQU0sT0FBTyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sT0FBTyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sUUFBUSxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sU0FBUyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLE1BQU0sV0FBVyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLE1BQU0scUJBQXFCLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEYsTUFBTSxnQkFBZ0Isa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM5RSxNQUFNLGdCQUFnQixrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLE1BQU0sZ0JBQWdCLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUUsTUFBTSxTQUFTLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxVQUFVLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEUsTUFBTSxhQUFhLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0UsTUFBTSxrQkFBa0Isa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRixNQUFNLGtCQUFrQixrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hGLE1BQU0saUJBQWlCLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDL0UsTUFBTSxzQkFBc0Isa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwRixNQUFNLHVCQUF1QixrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JGLE1BQU0sZUFBZSxrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdFLE1BQU0sb0JBQW9CLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEYsTUFBTSxxQkFBcUIsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuRixNQUFNLFlBQVksa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxRSxNQUFNLHFCQUFxQixrQkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25GLE1BQU0sZ0JBQWdCLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUUsTUFBTSxpQkFBaUIsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvRSxNQUFNLGFBQWEsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzRSxNQUFNLFdBQVcsa0JBQWtCLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxNQUFNLFVBQVUsR0FBRztBQUNuQixJQUFJLFdBQVc7QUFDZixJQUFJLE9BQU87QUFDWCxJQUFJLE9BQU87QUFDWCxJQUFJLG1CQUFtQjtBQUN2QixJQUFJLE9BQU87QUFDWCxJQUFJLE9BQU87QUFDWCxJQUFJLFFBQVE7QUFDWixJQUFJLFNBQVM7QUFDYixJQUFJLFdBQVc7QUFDZixJQUFJLHFCQUFxQjtBQUN6QixJQUFJLGdCQUFnQjtBQUNwQixJQUFJLGdCQUFnQjtBQUNwQixJQUFJLGdCQUFnQjtBQUNwQixJQUFJLFNBQVM7QUFDYixJQUFJLFVBQVU7QUFDZCxJQUFJLGFBQWE7QUFDakIsSUFBSSxrQkFBa0I7QUFDdEIsSUFBSSxrQkFBa0I7QUFDdEIsSUFBSSxpQkFBaUI7QUFDckIsSUFBSSxzQkFBc0I7QUFDMUIsSUFBSSx1QkFBdUI7QUFDM0IsSUFBSSxlQUFlO0FBQ25CLElBQUksb0JBQW9CO0FBQ3hCLElBQUkscUJBQXFCO0FBQ3pCLElBQUksWUFBWTtBQUNoQixJQUFJLHFCQUFxQjtBQUN6QixJQUFJLGdCQUFnQjtBQUNwQixJQUFJLGlCQUFpQjtBQUNyQixJQUFJLGFBQWE7QUFDakIsSUFBSTtBQUNKLENBQUM7O0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFO0FBQ3pCLElBQUksUUFBUSxLQUFLO0FBQ2pCLFFBQVEsS0FBSyxDQUFDLDJCQUEyQixPQUFPLFNBQVM7QUFDekQsUUFBUSxLQUFLLENBQUMsd0JBQXdCLE9BQU8sd0JBQXdCO0FBQ3JFLFFBQVEsS0FBSyxDQUFDLHlCQUF5QixPQUFPLG1CQUFtQjtBQUNqRSxRQUFRLEtBQUssQ0FBQyw2QkFBNkIsT0FBTyxnQkFBZ0I7QUFDbEUsUUFBUSxLQUFLLENBQUMsZ0NBQWdDLE9BQU8sdUJBQXVCO0FBQzVFLFFBQVEsS0FBSyxDQUFDLCtCQUErQixPQUFPLDBDQUEwQztBQUM5RixRQUFRLEtBQUssQ0FBQyx5QkFBeUIsT0FBTyxrQ0FBa0M7QUFDaEYsUUFBUSxLQUFLLENBQUMsMkJBQTJCLE9BQU8sK0JBQStCO0FBQy9FLFFBQVEsS0FBSyxDQUFDLHdCQUF3QixPQUFPLHFCQUFxQjtBQUNsRSxRQUFRLEtBQUssQ0FBQywwQkFBMEIsT0FBTyxhQUFhO0FBQzVELFFBQVEsS0FBSyxFQUFFLHdCQUF3QixPQUFPLGVBQWU7QUFDN0QsUUFBUSxLQUFLLEVBQUUsNEJBQTRCLE9BQU8sb0JBQW9CO0FBQ3RFLFFBQVEsS0FBSyxFQUFFLHlCQUF5QixPQUFPLGVBQWtCO0FBQ2pFLFFBQVEsS0FBSyxFQUFFLCtCQUErQixPQUFPLG9CQUFvQjtBQUN6RSxRQUFRLEtBQUssRUFBRSwrQkFBK0IsT0FBTyxvQkFBb0I7QUFDekUsUUFBUSxLQUFLLEVBQUUsNkJBQTZCLE9BQU8sMEJBQTBCO0FBQzdFLFFBQVEsS0FBSyxFQUFFLDBCQUEwQixPQUFPLCtCQUErQjtBQUMvRSxRQUFRLEtBQUssRUFBRSwrQkFBK0IsT0FBTyw4QkFBOEI7QUFDbkYsUUFBUSxLQUFLLEVBQUUsdUJBQXVCLE9BQU8sY0FBYztBQUMzRCxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxnQkFBZ0I7QUFDL0QsUUFBUSxLQUFLLEVBQUUseUJBQXlCLE9BQU8sYUFBYTtBQUM1RCxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxhQUFhO0FBQzVELFFBQVEsS0FBSyxFQUFFLHdCQUF3QixPQUFPLGdCQUFnQjtBQUM5RCxRQUFRLEtBQUssRUFBRSwrQkFBK0IsT0FBTyxxQkFBcUI7QUFDMUUsUUFBUSxLQUFLLEVBQUUsd0JBQXdCLE9BQU8sb0JBQW9CO0FBQ2xFLFFBQVEsS0FBSyxFQUFFLHlCQUF5QixPQUFPLHVCQUF1QjtBQUN0RSxRQUFRLEtBQUssRUFBRSw4QkFBOEIsT0FBTyx1QkFBdUI7QUFDM0UsUUFBUSxLQUFLLEVBQUUsd0JBQXdCLE9BQU8seUJBQXlCO0FBQ3ZFLFFBQVEsS0FBSyxFQUFFLHlCQUF5QixPQUFPLGtCQUFrQjtBQUNqRSxRQUFRLEtBQUssRUFBRSxzQkFBc0IsT0FBTyxXQUFXO0FBQ3ZELFFBQVEsS0FBSyxFQUFFLDBCQUEwQixPQUFPLHFCQUFxQjtBQUNyRSxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxnQkFBZ0I7QUFDL0QsUUFBUSxLQUFLLEVBQUUsd0JBQXdCLE9BQU8sb0JBQW9CO0FBQ2xFLFFBQVEsS0FBSyxFQUFFLHlCQUF5QixPQUFPLCtCQUErQjtBQUM5RSxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxnQkFBZ0I7QUFDL0QsUUFBUSxLQUFLLEVBQUUsMkJBQTJCLE9BQU8sbUJBQW1CO0FBQ3BFLFFBQVEsS0FBSyxFQUFFLDRCQUE0QixPQUFPLG9CQUFvQjtBQUN0RSxRQUFRLEtBQUssRUFBRSwrQkFBK0IsT0FBTyxtQkFBbUI7QUFDeEUsUUFBUSxLQUFLLEVBQUUsMkJBQTJCLE9BQU8saUJBQWlCO0FBQ2xFLFFBQVEsS0FBSyxFQUFFLDRCQUE0QixPQUFPLDZCQUE2QjtBQUMvRSxRQUFRLEtBQUssRUFBRSw4QkFBOEIsT0FBTyxxQkFBcUI7QUFDekUsUUFBUSxLQUFLLEVBQUUseUJBQXlCLE9BQU8sK0JBQStCO0FBQzlFLFFBQVEsS0FBSyxFQUFFLDBCQUEwQixPQUFPLDJCQUEyQjtBQUMzRSxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxnQkFBZ0I7QUFDL0QsUUFBUSxLQUFLLEVBQUUseUJBQXlCLE9BQU8sMkJBQTJCO0FBQzFFLFFBQVEsS0FBSyxFQUFFLDBCQUEwQixPQUFPLG1CQUFtQjtBQUNuRSxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxvQkFBb0I7QUFDbkUsUUFBUSxLQUFLLEVBQUUsMEJBQTBCLE9BQU8sdUJBQXVCO0FBQ3ZFLFFBQVEsS0FBSyxFQUFFLHlCQUF5QixPQUFPLGVBQWU7QUFDOUQsUUFBUSxLQUFLLEVBQUUseUJBQXlCLE9BQU8sZ0NBQWdDO0FBQy9FLFFBQVEsS0FBSyxFQUFFLDhCQUE4QixPQUFPLHdCQUF3QjtBQUM1RSxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyx5QkFBeUI7QUFDeEUsUUFBUSxLQUFLLEVBQUUseUJBQXlCLE9BQU8sMEJBQTBCO0FBQ3pFLFFBQVEsS0FBSyxFQUFFLDJCQUEyQixPQUFPLHNCQUFzQjtBQUN2RSxRQUFRLEtBQUssRUFBRSwwQkFBMEIsT0FBTyxpQkFBaUI7QUFDakUsUUFBUSxLQUFLLEVBQUUsNEJBQTRCLE9BQU8scUJBQXFCO0FBQ3ZFLFFBQVEsS0FBSyxFQUFFLGtDQUFrQyxPQUFPLHVCQUF1QjtBQUMvRSxRQUFRLEtBQUssRUFBRSwyQkFBMkIsT0FBTyxjQUFjO0FBQy9ELFFBQVEsS0FBSyxFQUFFLDBCQUEwQixPQUFPLGVBQWU7QUFDL0QsUUFBUSxLQUFLLEVBQUUseUJBQXlCLE9BQU8sV0FBVztBQUMxRCxRQUFRLEtBQUssRUFBRSx3QkFBd0IsT0FBTywyQkFBMkI7QUFDekUsUUFBUSxLQUFLLEVBQUUsNEJBQTRCLE9BQU8sK0JBQStCO0FBQ2pGLFFBQVEsS0FBSyxFQUFFLDZCQUE2QixPQUFPLHFCQUFxQjtBQUN4RSxRQUFRLEtBQUssRUFBRSx3QkFBd0IsT0FBTyx5QkFBeUI7QUFDdkUsUUFBUSxLQUFLLEVBQUUsd0JBQXdCLE9BQU8sYUFBYTtBQUMzRCxRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxnQkFBZ0I7QUFDL0QsUUFBUSxLQUFLLEVBQUUsa0NBQWtDLE9BQU8sd0JBQXdCO0FBQ2hGLFFBQVEsS0FBSyxFQUFFLDZCQUE2QixPQUFPLGdDQUFnQztBQUNuRixRQUFRLEtBQUssRUFBRSx5QkFBeUIsT0FBTywwQkFBMEI7QUFDekUsUUFBUSxLQUFLLEVBQUUsd0JBQXdCLE9BQU8sdUJBQXVCO0FBQ3JFLFFBQVEsS0FBSyxFQUFFLHlCQUF5QixPQUFPLGNBQWM7QUFDN0QsUUFBUSxLQUFLLEVBQUUsd0JBQXdCLE9BQU8sY0FBaUI7QUFDL0QsUUFBUSxLQUFLLEVBQUUseUJBQXlCLE9BQU8sbUJBQW1CO0FBQ2xFLFFBQVEsS0FBSyxFQUFFLDRCQUE0QixPQUFPLHFCQUFxQjtBQUN2RSxRQUFRLEtBQUssRUFBRSwwQkFBMEIsT0FBTyxnQkFBZ0I7QUFDaEUsUUFBUSxLQUFLLEVBQUUsd0JBQXdCLE9BQU8sbUJBQW1CO0FBQ2pFLFFBQVEsS0FBSyxFQUFFLDhCQUE4QixPQUFPLDJCQUEyQjtBQUMvRSxRQUFRLFNBQVMsT0FBTyxlQUFlO0FBQ3ZDO0FBQ0E7QUFDQSxNQUFNLFNBQVMsU0FBUyxLQUFLLENBQUM7QUFDOUIsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRTtBQUNoQyxRQUFRLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDdEIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUs7QUFDMUI7QUFDQSxJQUFJLGVBQWUsR0FBRztBQUN0QixRQUFRLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDbkM7QUFDQTtBQUNBLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUU7QUFDbkQsSUFBSSxZQUFZLEVBQUUsSUFBSTtBQUN0QixJQUFJLFFBQVEsRUFBRSxJQUFJO0FBQ2xCLElBQUksS0FBSyxFQUFFO0FBQ1gsQ0FBQyxDQUFDOztBQUVGLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXO0FBQ3pDLElBQUksVUFBVSxDQUFDLE9BQU87QUFDdEIsSUFBSSxVQUFVLENBQUMsT0FBTztBQUN0QixJQUFJLFVBQVUsQ0FBQyxtQkFBbUI7QUFDbEMsSUFBSSxVQUFVLENBQUMsT0FBTztBQUN0QixJQUFJLFVBQVUsQ0FBQyxPQUFPO0FBQ3RCLElBQUksVUFBVSxDQUFDLFFBQVE7QUFDdkIsSUFBSSxVQUFVLENBQUMsU0FBUztBQUN4QixJQUFJLFVBQVUsQ0FBQyxXQUFXO0FBQzFCLElBQUksVUFBVSxDQUFDLHFCQUFxQjtBQUNwQyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0I7QUFDL0IsSUFBSSxVQUFVLENBQUMsZ0JBQWdCO0FBQy9CLElBQUksVUFBVSxDQUFDLGdCQUFnQjtBQUMvQixJQUFJLFVBQVUsQ0FBQyxTQUFTO0FBQ3hCLElBQUksVUFBVSxDQUFDLFVBQVU7QUFDekIsSUFBSSxVQUFVLENBQUMsYUFBYTtBQUM1QixJQUFJLFVBQVUsQ0FBQyxrQkFBa0I7QUFDakMsSUFBSSxVQUFVLENBQUMsa0JBQWtCO0FBQ2pDLElBQUksVUFBVSxDQUFDLGlCQUFpQjtBQUNoQyxJQUFJLFVBQVUsQ0FBQyxzQkFBc0I7QUFDckMsSUFBSSxVQUFVLENBQUMsdUJBQXVCO0FBQ3RDLElBQUksVUFBVSxDQUFDLGVBQWU7QUFDOUIsSUFBSSxVQUFVLENBQUMscUJBQXFCO0FBQ3BDLElBQUksVUFBVSxDQUFDLG9CQUFvQjtBQUNuQyxJQUFJLFVBQVUsQ0FBQyxZQUFZO0FBQzNCLElBQUksVUFBVSxDQUFDLGdCQUFnQjtBQUMvQixJQUFJLFVBQVUsQ0FBQyxxQkFBcUI7QUFDcEMsSUFBSSxVQUFVLENBQUMsaUJBQWlCO0FBQ2hDLElBQUksVUFBVSxDQUFDLGFBQWE7QUFDNUIsSUFBSSxVQUFVLENBQUMsV0FBVztBQUMxQixNQUFNLGlCQUFpQixHQUFHLFVBQVU7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxVQUFVO0FBQzFDLE1BQU0scUJBQXFCLEdBQUcsVUFBVTtBQUN4QyxNQUFNLDJCQUEyQixHQUFHLFVBQVU7QUFDOUMsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsV0FBVztBQUNoRCxJQUFJLFVBQVUsQ0FBQyxPQUFPO0FBQ3RCLElBQUksVUFBVSxDQUFDLE9BQU87QUFDdEIsSUFBSSxVQUFVLENBQUMsbUJBQW1CO0FBQ2xDLElBQUksVUFBVSxDQUFDLE9BQU87QUFDdEIsSUFBSSxVQUFVLENBQUMsT0FBTztBQUN0QixJQUFJLFVBQVUsQ0FBQyxRQUFRO0FBQ3ZCLElBQUksVUFBVSxDQUFDLFNBQVM7QUFDeEIsSUFBSSxVQUFVLENBQUMsV0FBVztBQUMxQixJQUFJLFVBQVUsQ0FBQyxlQUFlO0FBQzlCLElBQUksVUFBVSxDQUFDLG9CQUFvQjtBQUNuQyxJQUFJLFVBQVUsQ0FBQyxxQkFBcUI7QUFDcEMsSUFBSSxVQUFVLENBQUMsaUJBQWlCO0FBQ2hDLE1BQU0sdUJBQXVCLGlCQUFpQixNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUI7QUFDckQsSUFBSSxVQUFVLENBQUMsT0FBTztBQUN0QixJQUFJLFVBQVUsQ0FBQyxTQUFTO0FBQ3hCLElBQUksVUFBVSxDQUFDLHFCQUFxQjtBQUNwQyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0I7QUFDL0IsSUFBSSxVQUFVLENBQUMsZ0JBQWdCO0FBQy9CLElBQUksVUFBVSxDQUFDLGdCQUFnQjtBQUMvQixJQUFJLFVBQVUsQ0FBQyxTQUFTO0FBQ3hCLElBQUksVUFBVSxDQUFDLFVBQVU7QUFDekIsSUFBSSxVQUFVLENBQUMsYUFBYTtBQUM1QixJQUFJLFVBQVUsQ0FBQyxrQkFBa0I7QUFDakMsSUFBSSxVQUFVLENBQUMsa0JBQWtCO0FBQ2pDLElBQUksVUFBVSxDQUFDLGlCQUFpQjtBQUNoQyxJQUFJLFVBQVUsQ0FBQyxzQkFBc0I7QUFDckMsSUFBSSxVQUFVLENBQUMsdUJBQXVCO0FBQ3RDLElBQUksVUFBVSxDQUFDLGVBQWU7QUFDOUIsSUFBSSxVQUFVLENBQUMscUJBQXFCO0FBQ3BDLElBQUksVUFBVSxDQUFDLFlBQVk7QUFDM0IsSUFBSSxVQUFVLENBQUMsZ0JBQWdCO0FBQy9CLElBQUksVUFBVSxDQUFDLHFCQUFxQjtBQUNwQyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUI7QUFDaEMsTUFBTSxvQkFBb0IsR0FBRyxjQUFjLEdBQUcsaUJBQWlCO0FBQy9ELE1BQU0sV0FBVyxJQUFJLFVBQVUsQ0FBQyxPQUFPO0FBQ3ZDLElBQUksVUFBVSxDQUFDLG1CQUFtQjtBQUNsQyxJQUFJLFVBQVUsQ0FBQyxRQUFRO0FBQ3ZCLElBQUksVUFBVSxDQUFDLGVBQWU7QUFDOUIsSUFBSSxVQUFVLENBQUMsaUJBQWlCO0FBQ2hDLElBQUksVUFBVSxDQUFDLGFBQWEsQ0FBQztBQUM3QixNQUFNLGlCQUFpQixHQUFHLFVBQVU7QUFDcEMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU87QUFDbkMsSUFBSSxVQUFVLENBQUMsbUJBQW1CO0FBQ2xDLElBQUksVUFBVSxDQUFDLFFBQVE7QUFDdkIsSUFBSSxVQUFVLENBQUMsZUFBZTtBQUM5QixJQUFJLFVBQVUsQ0FBQyxpQkFBaUI7QUFDaEMsTUFBTSxjQUFjLGlCQUFpQixNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlDLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLE1BQU0sR0FBRyxHQUFHO0FBQ2hCLFFBQVEsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdkIsUUFBUSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUIsS0FBSztBQUNMLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyw2QkFBNkI7QUFDL0MsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsd0JBQXdCO0FBQzNFO0FBQ0EsSUFBSSxRQUFRLElBQUk7QUFDaEIsUUFBUSxLQUFLLENBQUM7QUFDZCxZQUFZLEdBQUcsQ0FBQyxJQUFJLEdBQUcsaUJBQWlCO0FBQ3hDLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyx1QkFBdUI7QUFDcEQsWUFBWTtBQUNaLFFBQVEsS0FBSyxDQUFDO0FBQ2QsWUFBWSxHQUFHLENBQUMsSUFBSSxHQUFHLGNBQWM7QUFDckMsWUFBWSxHQUFHLENBQUMsVUFBVSxHQUFHLG9CQUFvQjtBQUNqRCxZQUFZO0FBQ1osUUFBUSxLQUFLLENBQUM7QUFDZCxRQUFRLEtBQUssQ0FBQztBQUNkLFlBQVksR0FBRyxDQUFDLElBQUksR0FBRyxXQUFXO0FBQ2xDLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyxpQkFBaUI7QUFDOUMsWUFBWTtBQUNaLFFBQVEsS0FBSyxDQUFDO0FBQ2QsWUFBWSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO0FBQzFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxHQUFHLFFBQVE7QUFDbkMsZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsY0FBYztBQUMvQztBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0IsR0FBRyxDQUFDLElBQUksR0FBRyxxQkFBcUI7QUFDaEQsZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsMkJBQTJCO0FBQzVEO0FBQ0EsWUFBWTtBQUNaLFFBQVEsS0FBSyxDQUFDO0FBQ2QsWUFBWSxHQUFHLENBQUMsSUFBSSxHQUFHLGlCQUFpQjtBQUN4QyxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsdUJBQXVCO0FBQ3BELFlBQVk7QUFDWixRQUFRO0FBQ1IsWUFBWSxHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDaEMsWUFBWSxHQUFHLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdEM7QUFDQTtBQUNBLElBQUksTUFBTSxrQkFBa0IsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEQsSUFBSSxJQUFJLGtCQUFrQixLQUFLLENBQUMsRUFBRTtBQUNsQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtBQUN4QztBQUNBLFNBQVMsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLEVBQUU7QUFDdkMsUUFBUSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87QUFDdkM7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkOztBQUVBLFNBQVMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDckMsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDO0FBQ2pCLElBR1M7QUFDVCxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELFlBQVksTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNyQyxZQUFZLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTTtBQUNsQztBQUNBO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2YsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUM7QUFDckMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM3QyxRQUFRLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7QUFDNUIsUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU07QUFDNUI7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkO0FBQ0EsTUFBTSxjQUFjLENBQUM7QUFDckIsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFO0FBQ3JGLFFBQVEsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3BCLFFBQVEsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3BCLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJO0FBQ3hCLFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJO0FBQ3hCLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQjtBQUNoRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTztBQUM5QixRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM1QixRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM3QjtBQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDekIsUUFBUSxJQUFJLE1BQU0sS0FBSyxDQUFDLHVCQUF1QjtBQUMvQyxZQUFZLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNyQztBQUNBLGFBQWEsSUFBSSxNQUFNLEtBQUssQ0FBQyx1QkFBdUI7QUFDcEQsWUFBWSxJQUFJLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDdEM7QUFDQSxhQUFhLElBQUksTUFBTSxLQUFLLENBQUMsdUJBQXVCO0FBQ3BELFlBQVksSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDekQ7QUFDQSxhQUFhO0FBQ2IsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLGdCQUFnQixFQUFFLEVBQUUscUJBQXFCO0FBQ3pFO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHO0FBQ3ZCO0FBQ0E7QUFDQSxNQUFNLGNBQWMsU0FBUyxjQUFjLENBQUM7QUFDNUMsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRTtBQUMxRixRQUFRLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7QUFDbEYsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUc7QUFDdkIsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUk7QUFDeEI7QUFDQSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDbEIsUUFBUSxNQUFNLGNBQWMsR0FBRyxNQUFNO0FBQ3JDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ3ZCLFlBQVksTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEQsWUFBWSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUk7QUFDNUI7QUFDQSxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7QUFDdkMsWUFBWSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU07QUFDOUIsWUFBWSxPQUFPLGNBQWMsQ0FBQyxVQUFVO0FBQzVDO0FBQ0EsUUFBUSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ3ZCLFFBQVEsSUFBSSxTQUFTLEdBQUcsQ0FBQztBQUN6QixRQUFRLElBQUksS0FBSztBQUNqQixRQUFRLE9BQU8sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFO0FBQzdELFlBQVksTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkYsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQixZQUFZLE9BQU8sSUFBSSxLQUFLLEdBQUcsU0FBUyxHQUFHLENBQUM7QUFDNUMsWUFBWSxTQUFTLEdBQUcsS0FBSyxHQUFHLENBQUM7QUFDakM7QUFDQSxRQUFRLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU7QUFDckMsWUFBWSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQzdDO0FBQ0EsUUFBUSxPQUFPLGNBQWMsQ0FBQyxVQUFVO0FBQ3hDO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUU7QUFDMUIsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDNUIsUUFBUSxPQUFPLENBQUM7QUFDaEIsSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtBQUNoQyxRQUFRLE9BQU8sQ0FBQztBQUNoQixJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUMxQixRQUFRLE9BQU8sQ0FBQztBQUNoQixJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUN2QixRQUFRLE9BQU8sQ0FBQztBQUNoQixJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNyQixRQUFRLE9BQU8sQ0FBQztBQUNoQixJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUM3QixRQUFRLE9BQU8sQ0FBQztBQUNoQixJQUFJLE9BQU8sQ0FBQztBQUNaO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDckMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztBQUMxQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztBQUM5QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQy9ELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQ2pELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ2hELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNyRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDckUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ3JFO0FBQ0EsTUFBTSxtQkFBbUIsQ0FBQztBQUMxQixJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUU7QUFDekIsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDckIsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUMzRCxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUs7QUFDbEMsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRO0FBQ3hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDbEQsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQztBQUNwRCxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDO0FBQ3BEO0FBQ0EsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7QUFDcEMsUUFBUSxNQUFNLElBQUksR0FBRyxDQUFDO0FBQ3RCLFFBQVEsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQywrQkFBK0IsSUFBSSxDQUFDO0FBQ3BHLFFBQVEsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDM0UsUUFBUSxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFO0FBQ2xDLFlBQVksTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsdUJBQXVCO0FBQ3BHO0FBQ0EsUUFBUSxPQUFPLElBQUk7QUFDbkI7QUFDQSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRTtBQUNsRixRQUFRLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDbEIsUUFBUSxJQUFJLEtBQUssR0FBRyxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDcEMsWUFBWSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDekMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxPQUFPO0FBQ3JDLFlBQVksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJO0FBQzdCLFlBQVksSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPO0FBQy9CO0FBQ0EsYUFBYTtBQUNiLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDaEQsZ0JBQWdCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDekMsb0JBQW9CLEtBQUssR0FBRyxDQUFDO0FBQzdCLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQUksS0FBSztBQUNqQixRQUFRLElBQUksVUFBVSxLQUFLLFVBQVUsRUFBRTtBQUN2QyxZQUFZLEtBQUssR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxNQUFNLElBQUksSUFBSSxFQUFFLEtBQUssTUFBTSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQztBQUNwTDtBQUNBLGFBQWEsSUFBSSxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQzVDLFlBQVksS0FBSyxHQUFHLElBQUksY0FBYyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLE1BQU0sSUFBSSxJQUFJLEVBQUUsS0FBSyxNQUFNLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDO0FBQ3pMO0FBQ0EsYUFBYTtBQUNiLFlBQVksS0FBSyxHQUFHLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQztBQUNwSDtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLO0FBQy9CLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtBQUNuQixRQUFRLE9BQU8sS0FBSztBQUNwQjtBQUNBLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0FBQzlCLFFBQVEsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUM3QixZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCO0FBQ3RFO0FBQ0EsUUFBUSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7QUFDdkMsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsdUJBQXVCO0FBQy9FO0FBQ0E7QUFDQSxRQUFRLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLFVBQVUsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDOUcsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsNkJBQTZCO0FBQzVGO0FBQ0EsUUFBUSxPQUFPLEtBQUs7QUFDcEI7QUFDQSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQUU7QUFDZixRQUFRLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDN0IsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLHVCQUF1QjtBQUN0RTtBQUNBLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO0FBQ3ZDLFlBQVksTUFBTSxJQUFJLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLHVCQUF1QjtBQUMvRTtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtBQUNuQjtBQUNBO0FBQ0EsTUFBTSxTQUFTLFNBQVMsbUJBQW1CLENBQUM7QUFDNUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO0FBQ3pCLFFBQVEsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7QUFDNUI7QUFDQSxJQUFJLGVBQWUsQ0FBQyxFQUFFLEVBQUU7QUFDeEIsUUFBUSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDN0QsUUFBUSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7QUFDaEM7QUFDQSxJQUFJLGFBQWEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRTtBQUM1QyxRQUFRLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO0FBQzdDLFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQywrQkFBK0I7QUFDckQsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSx5QkFBeUI7QUFDaEg7QUFDQSxRQUFRLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ3pELFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzdGO0FBQ0EsSUFBSSxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN2QixRQUFRLElBQUksR0FBRyxLQUFLLEdBQUc7QUFDdkIsWUFBWTtBQUNaLFFBQVEsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUNsRCxZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCO0FBQ3RFO0FBQ0EsUUFBUSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN0QyxRQUFRLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRTtBQUNsRixZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCO0FBQ3RFO0FBQ0EsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUc7QUFDOUIsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVM7QUFDakMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ25CO0FBQ0E7QUFDQSxNQUFNLFVBQVUsU0FBUyxtQkFBbUIsQ0FBQztBQUM3QztBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUN6QixRQUFRLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDdEI7QUFDQSxJQUFJLE1BQU0sZUFBZSxDQUFDLEVBQUUsRUFBRTtBQUM5QixRQUFRLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNyRCxRQUFRLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztBQUNoQztBQUNBLElBQUksTUFBTSxhQUFhLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUU7QUFDbEQsUUFBUSxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO0FBQ25ELFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQywrQkFBK0I7QUFDckQsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSx5QkFBeUI7QUFDaEg7QUFDQSxRQUFRLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUM1RCxRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUM3RjtBQUNBLElBQUksTUFBTSxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM3QixRQUFRLElBQUksR0FBRyxLQUFLLEdBQUc7QUFDdkIsWUFBWTtBQUNaLFFBQVEsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUNsRCxZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCO0FBQ3RFO0FBQ0EsUUFBUSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN0QyxRQUFRLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRTtBQUNsRixZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCO0FBQ3RFO0FBQ0EsUUFBUSxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUc7QUFDOUIsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVM7QUFDakMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLGlCQUFpQixpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRztBQUN2RjtBQUNBLE1BQU0sTUFBTSxTQUFTLGlCQUFpQixDQUFDO0FBQ3ZDO0FBQ0EsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFO0FBQzVCLFFBQVEsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUN6QjtBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNyRCxJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkQsSUFBSSxJQUFJLE1BQU0sR0FBRyxFQUFFLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRSxPQUFPLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6RCxJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkQsSUFBSSxJQUFJLE9BQU8sR0FBRyxFQUFFLE9BQU8sSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pELElBQUksSUFBSSxNQUFNLEdBQUcsRUFBRSxPQUFPLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxRCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUQsSUFBSSxJQUFJLE9BQU8sR0FBRyxFQUFFLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFELElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRSxPQUFPLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxRCxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkQ7QUFDQTtBQUNBLFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRTtBQUM5QixJQUFJLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtBQUN6RSxRQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDdkQ7QUFDQSxJQUFJLE9BQU8sTUFBTTtBQUNqQjs7QUFFQSxTQUFTLHdCQUF3QixHQUFHO0FBQ3BDLElBQUksTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUMsUUFBUTtBQUNyRCxJQUFJLElBQUksT0FBTyxtQkFBbUIsS0FBSyxVQUFVLEVBQUU7QUFDbkQsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RDtBQUNwRixZQUFZLGdFQUFnRTtBQUM1RSxZQUFZLGtFQUFrRSxDQUFDO0FBQy9FO0FBQ0EsSUFBSSxPQUFPLG1CQUFtQjtBQUM5QjtBQUNBO0FBQ0EsU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUU7QUFDdkQsSUFBSSxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixFQUFFO0FBQzFELElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDakMsUUFBUSxNQUFNLElBQUksU0FBUyxDQUFDLG1CQUFtQixDQUFDO0FBQ2hEO0FBQ0EsSUFBSSxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3QyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ25DLElBQUksT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDbkc7O0FBb0JBLFNBQVMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7QUFDbEMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUNoRCxRQUFRLE9BQU8sQ0FBQztBQUNoQixJQUFJLElBQUksTUFBTSxHQUFHLENBQUM7QUFDbEIsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU07QUFDbEMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUM3QyxRQUFRLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBUSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQ2xDLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlELFlBQVksTUFBTSxJQUFJLElBQUk7QUFDMUIsWUFBWSxJQUFJLEdBQUcsQ0FBQztBQUNwQixZQUFZLE9BQU8sTUFBTTtBQUN6QjtBQUNBLFFBQVEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuRSxRQUFRLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTTtBQUMvQixRQUFRLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTTtBQUM3QjtBQUNBLElBQUksT0FBTyxNQUFNO0FBQ2pCO0FBQ0EsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUU7QUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUU7QUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUU7QUFDekIsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQ3pCLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUM1QjtBQUNBLFNBQVMsS0FBSyxDQUFDLElBQUksRUFBRTtBQUNyQixJQUFJLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQzVCLElBQUksSUFBSSxDQUFDLEVBQUU7QUFDWCxRQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUM7QUFDcEQsSUFBSSxPQUFPLEVBQUU7QUFDYjtBQUNBLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRTtBQUMxQixJQUFJLElBQUksR0FBRyxZQUFZLFNBQVMsRUFBRTtBQUlsQyxRQUFRLE9BQU8sR0FBRyxDQUFDLEtBQUs7QUFDeEI7QUFDQSxJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUk7QUFDcEIsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDaEMsUUFBUSxLQUFLLE9BQU8sRUFBRSxPQUFPLENBQUM7QUFDOUIsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDaEMsUUFBUSxLQUFLLE9BQU8sRUFBRSxPQUFPLEVBQUU7QUFDL0IsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDaEMsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDaEMsUUFBUSxLQUFLLFNBQVMsRUFBRSxPQUFPLEVBQUU7QUFDakMsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDaEMsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLENBQUM7QUFDL0IsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDaEMsUUFBUSxLQUFLLFdBQVcsRUFBRSxPQUFPLEVBQUU7QUFDbkMsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDaEM7QUFDQSxJQUFJLE1BQU0sR0FBRztBQUNiO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtBQUM3QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNyRCxJQUFJLE9BQU8sQ0FBQztBQUNaO0FBQ0EsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDcEMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWTtBQU94QyxRQUFRLElBQUksQ0FBQztBQUNiLFFBQVEsSUFBSTtBQUNaLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztBQUN4QztBQUNBLFFBQVEsT0FBTyxHQUFHLEVBQUU7QUFDcEIsWUFBWSxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUM7QUFDbkM7QUFDQSxRQUFRLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzlCLFlBQVksT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxDQUFDO0FBQzlDO0FBQ0EsUUFBUSxPQUFPLENBQUM7QUFDaEIsS0FBSyxDQUFDO0FBQ047QUFDQSxTQUFTLGVBQWUsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDMUQsSUFBSSxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7QUFDN0QsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDM0IsUUFBUSxJQUFJO0FBQ1osWUFBWSxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7QUFDeEQ7QUFDQSxRQUFRLE9BQU8sR0FBRyxFQUFFO0FBQ3BCLFlBQVksSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUNoRSxnQkFBZ0IsTUFBTSxHQUFHO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxZQUFZO0FBQ3ZCO0FBQ0EsZUFBZSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDakUsSUFBSSxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7QUFDN0QsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDM0IsUUFBUSxJQUFJO0FBQ1osWUFBWSxZQUFZLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7QUFDbkU7QUFDQSxRQUFRLE9BQU8sR0FBRyxFQUFFO0FBQ3BCLFlBQVksSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUNoRSxnQkFBZ0IsTUFBTSxHQUFHO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQSxNQUFNLE9BQU8saUJBQWlCLElBQUksV0FBVyxFQUFFO0FBQy9DO0FBQ0EsTUFBTSxPQUFPLGlCQUFpQixJQUFJLFdBQVcsRUFBRTtBQUMvQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN2RCxTQUFTLFNBQVMsR0FBRztBQUNyQixJQUFJLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU7QUFDakMsSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJO0FBQ3RCLFFBQVEsT0FBTyxJQUFJLFVBQVUsRUFBRTtBQUMvQixJQUFJLE1BQU0sTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDekQsSUFBSSxPQUFPLE1BQU07QUFDakI7QUFDQSxTQUFTLHdCQUF3QixDQUFDLEtBQUssRUFBRTtBQUN6QyxJQUFJLFFBQVEsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQzBDLENBQUM7QUFDekUsUUFBUSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsOEJBQThCLENBQUMsZ0NBQWdDO0FBQ3BGLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxnQ0FBZ0M7QUFDN0UsUUFBUSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsOEJBQThCLENBQUMsZ0NBQWdDO0FBQ3BGLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxnQ0FBZ0M7QUFDN0U7QUFDQSxNQUFNLE1BQU0sQ0FBQztBQUNiLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFO0FBQ3ZELFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDaEYsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDOUMsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ3BELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSTtBQUNsQyxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2xELGdCQUFnQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ25DLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0FBQ25ELGdCQUFnQixJQUFJLElBQUksQ0FBQztBQUN6QixnQkFBZ0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3ZELGdCQUFnQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7QUFDMUMsZ0JBQWdCLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTTtBQUN2QztBQUNBLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsSUFBSSxFQUFFLGFBQWEsRUFBRTtBQUNqRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7QUFDakQsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtBQUNuRCxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM1QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUk7QUFDbEMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztBQUNuRCxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO0FBQzlGLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLE9BQU8sRUFBRSxXQUFXLEVBQUU7QUFDNUYsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyQyxZQUFZLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0FBQzdDLFlBQVksSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUU7QUFDcEQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ3BELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRztBQUNoQyxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2pELGdCQUFnQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25DLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDO0FBQ3pELGdCQUFnQixPQUFPLElBQUksQ0FBQztBQUM1QixnQkFBZ0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3hELGdCQUFnQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUM7QUFDN0MsZ0JBQWdCLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTTtBQUMxQztBQUNBLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQy9GLFlBQVksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDN0IsWUFBWSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNuQyxZQUFZLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQzNDLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzVDLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDdEQsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDM0YsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRTtBQUMxRixZQUFZLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO0FBQzNDLFlBQVksSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO0FBQ2xDLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzVDLFlBQVksUUFBUSxFQUFFO0FBQ3RCLGdCQUFnQixLQUFLLENBQUM7QUFDdEIsb0JBQW9CLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDeEUsb0JBQW9CLE9BQU8sQ0FBQztBQUM1QixnQkFBZ0IsS0FBSyxDQUFDO0FBQ3RCLGdCQUFnQixLQUFLLENBQUM7QUFDdEIsZ0JBQWdCLEtBQUssQ0FBQztBQUN0QixvQkFBb0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNyRSxvQkFBb0IsT0FBTyxDQUFDO0FBQzVCLGdCQUFnQixTQUFTLE9BQU8sRUFBRTtBQUNsQztBQUNBLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7QUFDbEcsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtBQUM1QixnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM1QyxZQUFZLFFBQVEsRUFBRTtBQUN0QixnQkFBZ0IsS0FBSyxDQUFDO0FBQ3RCLG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQztBQUN2RixvQkFBb0IsT0FBTyxDQUFDO0FBQzVCLGdCQUFnQixLQUFLLENBQUM7QUFDdEIsZ0JBQWdCLEtBQUssQ0FBQztBQUN0QixnQkFBZ0IsS0FBSyxDQUFDLHNDQUFzQztBQUM1RCxvQkFBb0IsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDdEQsb0JBQW9CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNDLG9CQUFvQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDekQsb0JBQW9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDaEcsb0JBQW9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDekQsb0JBQW9CLE9BQU8sQ0FBQztBQUM1QjtBQUNBLGdCQUFnQixTQUFTLE9BQU8sRUFBRTtBQUNsQztBQUNBLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxVQUFVLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUMvRixZQUFZLE9BQU8sRUFBRTtBQUNyQixTQUFTLENBQUM7QUFDVixRQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFO0FBQ3RGLFlBQVksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDbkMsWUFBWSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDOUIsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzVDLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDN0QsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMvQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQztBQUMxRSxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDO0FBQ2pGLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQ25HLFlBQVksT0FBTyxFQUFFO0FBQ3JCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFO0FBQzFILFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxZQUFZLElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsVUFBVSxFQUFFO0FBQ3RGLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsZ0JBQWdCO0FBQ25FLGdCQUFnQixjQUFjLENBQUMsZ0JBQWdCLEVBQUU7QUFDakQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksY0FBYyxDQUFDLFVBQVUsR0FBRyxVQUFVO0FBQ2xELFlBQVksY0FBYyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQjtBQUM5RCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLENBQUM7QUFDVixRQUFRLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUU7QUFDekYsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyQyxZQUFZLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtBQUMvQixnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLElBQUksY0FBYztBQUM5QixZQUFZLElBQUk7QUFDaEIsZ0JBQWdCLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RTtBQUNBLFlBQVksT0FBTyxHQUFHLEVBQUU7QUFDeEIsZ0JBQWdCLElBQUksR0FBRyxZQUFZLFNBQVM7QUFDNUMsb0JBQW9CLE9BQU8sR0FBRyxDQUFDLEtBQUs7QUFDcEMsZ0JBQWdCLE1BQU0sR0FBRztBQUN6QjtBQUNBLFlBQVksSUFBSSxjQUFjLENBQUMsT0FBTyxLQUFLLENBQUM7QUFDNUMsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QixZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzVDO0FBQ0EsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzVDLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDekYsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQzFHLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtBQUM1QixnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLFlBQVksSUFBSSxjQUFjLENBQUMsT0FBTyxLQUFLLENBQUM7QUFDNUMsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4QixZQUFZLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztBQUM5RCxZQUFZLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNO0FBQ3RDLFlBQVksSUFBSSxJQUFJLEdBQUcsUUFBUTtBQUMvQixnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDOUMsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDcEMsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0FBQzdGLFlBQVksU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDekMsWUFBWSxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7QUFDakMsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7QUFDaEQsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4QixZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLFlBQVksTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0FBQ3pELFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDNUMsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ2pELFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUU7QUFDMUUsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRixZQUFZLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO0FBQ2xELFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDNUMsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQ3hELFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRTtBQUNoSCxZQUFZLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ25DLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckMsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyQyxZQUFZLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQ25ELFlBQVksY0FBYyxHQUFHLGNBQWMsS0FBSyxDQUFDO0FBQ2pELFlBQVksSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksY0FBYyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQ3hGLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzVDLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUM1QyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDckIsWUFBWSxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFlBQVksSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN2QyxZQUFZLElBQUksV0FBVyxHQUFHLENBQUM7QUFDL0IsWUFBWSxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFlBQVksSUFBSSxHQUFHO0FBQ25CLFlBQVksTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztBQUN2RCxZQUFZLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELGdCQUFnQixHQUFHLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFO0FBQ3JDLGdCQUFnQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7QUFDN0QsZ0JBQWdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNuRCxnQkFBZ0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztBQUNsRSxnQkFBZ0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztBQUNqRSxnQkFBZ0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztBQUNuRSxnQkFBZ0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztBQUM1RCxnQkFBZ0IsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQ25DLG9CQUFvQixRQUFRO0FBQzVCLG9CQUFvQixJQUFJO0FBQ3hCLG9CQUFvQixDQUFDLEVBQUU7QUFDdkIsd0JBQXdCLEtBQUssRUFBRTtBQUMvQiw0QkFBNEIsUUFBUSxFQUFFLFdBQVc7QUFDakQsNEJBQTRCLE9BQU87QUFDbkMsNEJBQTRCLFNBQVM7QUFDckMsNEJBQTRCO0FBQzVCLHlCQUF5QjtBQUN6Qix3QkFBd0IsWUFBWSxFQUFFO0FBQ3RDLDRCQUE0QixFQUFFLEVBQUU7QUFDaEM7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFlBQVksTUFBTSxRQUFRLEdBQUcsRUFBRTtBQUMvQixZQUFZLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELGdCQUFnQixHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN0QyxnQkFBZ0IsUUFBUSxHQUFHLENBQUMsSUFBSTtBQUNoQyxvQkFBb0IsS0FBSyxDQUFDLDRCQUE0QjtBQUN0RCx3QkFBd0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxrQ0FBa0M7QUFDckY7QUFDQSw0QkFBNEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUUsNEJBQTRCLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRztBQUNuRTtBQUNBLDZCQUE2QjtBQUM3Qiw0QkFBNEIsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU87QUFDN0Q7QUFDQSx3QkFBd0IsSUFBSSxXQUFXLEtBQUssQ0FBQyxJQUFJLFdBQVcsR0FBRyxXQUFXLEVBQUU7QUFDNUUsNEJBQTRCLFdBQVcsR0FBRyxXQUFXO0FBQ3JELDRCQUE0QixjQUFjLEdBQUcsR0FBRyxDQUFDLFFBQVE7QUFDekQsNEJBQTRCLFdBQVcsR0FBRyxDQUFDO0FBQzNDO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0Esb0JBQW9CLEtBQUssQ0FBQztBQUMxQixvQkFBb0IsS0FBSyxDQUFDO0FBQzFCLHdCQUF3QixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQyx3QkFBd0I7QUFDeEIsb0JBQW9CLFNBQVMsT0FBTyxFQUFFO0FBQ3RDO0FBQ0E7QUFDQSxZQUFZLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDckMsZ0JBQWdCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0RCxvQkFBb0IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMvQyxvQkFBb0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ2xELG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztBQUNwRSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUseUJBQXlCLElBQUksQ0FBQztBQUM5RSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBQ2xFLG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNsRSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDdkQsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDcEQ7QUFDQSxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDOUQsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4QjtBQUNBLFlBQVksSUFBSSxXQUFXLEVBQUU7QUFDN0IsZ0JBQThCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUdsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sS0FBSyxHQUFHLE9BQU87QUFDckMsZ0JBQWdCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUM7QUFDOUQsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLDJCQUEyQixJQUFJLENBQUM7QUFDM0UsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixJQUFJLENBQUM7QUFDN0UsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDaEQ7QUFDQSxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLENBQUM7QUFDVixRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsVUFBVSxJQUFJLEVBQUU7QUFJeEUsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsSUFBSSxFQUFFO0FBQzFFLFlBQVksT0FBTyxFQUFFO0FBQ3JCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZO0FBQ3hFLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxNQUFNLENBQUMsZUFBZSxLQUFLO0FBQzdGLGNBQWMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxHQUFHLEVBQUUsT0FBTyxFQUFFO0FBQ3RFLGdCQUFnQixHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUNqQyxnQkFBZ0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQy9CLG9CQUFvQixPQUFPLEVBQUU7QUFDN0I7QUFDQSxnQkFBZ0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekMsZ0JBQWdCLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUN4RCxnQkFBZ0IsSUFBSSxDQUFDLE9BQU8saUJBQWlCLEtBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksaUJBQWlCO0FBQzFHLHFCQUFxQixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLDRCQUE0QixDQUFDLEVBQUU7QUFDdEcsb0JBQW9CLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzlELHdCQUF3QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RTtBQUNBLG9CQUFvQixPQUFPLENBQUM7QUFDNUI7QUFDQSxnQkFBZ0IsSUFBSSxHQUFHO0FBQ3ZCLGdCQUFnQixNQUFNLE1BQU0sR0FBRyxLQUFLO0FBQ3BDLGdCQUFnQixLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLE1BQU0sRUFBRTtBQUNyRSxvQkFBb0IsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUMxRjtBQUNBLGdCQUFnQixNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDakYsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4QixhQUFhO0FBQ2IsY0FBYyxXQUFXLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFDdEUsZ0JBQWdCLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ2pDLGdCQUFnQixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDL0Isb0JBQW9CLE9BQU8sRUFBRTtBQUM3QjtBQUNBLGdCQUFnQixPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6QyxnQkFBZ0IsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDaEQsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzFELG9CQUFvQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyRTtBQUNBLGdCQUFnQixPQUFPLENBQUM7QUFDeEIsYUFBYSxDQUFDO0FBQ2QsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVk7QUFDcEUsWUFBWSxPQUFPLEVBQUU7QUFDckIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVk7QUFDcEUsWUFBWSxPQUFPLEVBQUU7QUFDckIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLFlBQVk7QUFDNUUsWUFBWSxPQUFPLEVBQUU7QUFDckIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVk7QUFDeEUsWUFBWSxPQUFPLEVBQUU7QUFDckIsU0FBUyxDQUFDO0FBQ1YsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtBQUN4QixZQUFZLEdBQUc7QUFDZixZQUFZLElBQUk7QUFDaEIsWUFBWTtBQUNaLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxFQUFFO0FBQ2QsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7QUFDN0I7QUFDQSxRQUFRLE1BQU0sS0FBSyxHQUFHLElBQUk7QUFDMUIsUUFBUSxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFO0FBQzFGLFlBQVksSUFBSSxPQUFPLEVBQUU7QUFDekIsZ0JBQWdCLElBQUksUUFBUSxFQUFFO0FBQzlCLG9CQUFvQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3JHO0FBQ0EscUJBQXFCO0FBQ3JCLG9CQUFvQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7QUFDcEg7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQztBQUNuRTtBQUNBO0FBQ0EsUUFBUSxZQUFZLENBQUMsYUFBYSxFQUFFLFNBQVMsV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQzFFLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLFlBQVksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFFLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxHQUFHLEVBQUU7QUFDMUMsZ0JBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFO0FBQ0EsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEYsWUFBWSxNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRTtBQUN2QyxZQUFZLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN2RCxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsR0FBRyxFQUFFO0FBQzFDLGdCQUFnQixNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN0RDtBQUNBLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQyxRQUFRLFlBQVksQ0FBQyxVQUFVLEVBQUUsU0FBUyxRQUFRLENBQUMsRUFBRSxFQUFFO0FBQ3ZELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7QUFDM0MsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDL0IsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsUUFBUSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekUsWUFBWSxNQUFNLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFO0FBQzNDLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQy9CLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsUUFBUSxZQUFZLENBQUMsYUFBYSxFQUFFLFNBQVMsV0FBVyxDQUFDLEVBQUUsRUFBRTtBQUM3RCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztBQUMvQyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsZUFBZSxXQUFXLENBQUMsRUFBRSxFQUFFO0FBQzFDLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEYsWUFBWSxNQUFNLGNBQWMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFO0FBQzlDLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsUUFBUSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxlQUFlLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtBQUMxRSxZQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQzdCLFlBQVksSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN6QixnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUYsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFFLFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDNUMsWUFBWSxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7QUFDdkMsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7QUFDbkQsWUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUM3QixZQUFZLElBQUksR0FBRyxLQUFLLENBQUM7QUFDekIsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QixZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFGLFlBQVksTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUU7QUFDdkMsWUFBWSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDdkQsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM1QyxZQUFZLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztBQUN2QyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQyxRQUFRLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFDckYsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9GLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0QsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsb0JBQW9CLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtBQUN6RCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0YsWUFBWSxNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRTtBQUN2QyxZQUFZLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUMsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsUUFBUSxTQUFTLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUMzRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsWUFBWSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMscUNBQXFDLENBQUMsaUNBQWlDO0FBQ2pHLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDbkQ7QUFDQSxZQUFZLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxpQ0FBaUM7QUFDakcsZ0JBQWdCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNuRDtBQUNBLFlBQVksT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ2pEO0FBQ0EsUUFBUSxZQUFZLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDcEcsWUFBWSxJQUFJLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ2pELGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7QUFDekgsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0UsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUscUJBQXFCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ3ZFLFlBQVksSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQ3pILFlBQVksTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUU7QUFDdkMsWUFBWSxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pELFFBQVEsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQ3BGLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sR0FBRyxTQUFTLEVBQUU7QUFDN0UsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ3BELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RyxZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDMUIsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDN0MsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4QjtBQUNBLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQztBQUM3QixZQUFZLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLO0FBQzdFLGdCQUFnQixNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO0FBQ3ZELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQy9ELGdCQUFnQixTQUFTLElBQUksTUFBTTtBQUNuQyxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQ3pELGFBQWEsQ0FBQztBQUNkLFlBQVksSUFBSSxLQUFLLEdBQUcsQ0FBQztBQUN6QixZQUFZLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTTtBQUNsQyxnQkFBZ0IsSUFBSTtBQUNwQixvQkFBb0IsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzNFO0FBQ0EsZ0JBQWdCLE9BQU8sQ0FBQyxFQUFFO0FBQzFCLG9CQUFvQixPQUFPLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQztBQUNwRDtBQUNBLGFBQWEsR0FBRztBQUNoQixZQUFZLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSTtBQUNuQyxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RyxZQUFZLEtBQUssR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDbEYsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQzdDLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtBQUM1RCxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxFQUFFO0FBQzdFLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUNwRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkcsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzdDLGdCQUFnQixPQUFPLENBQUM7QUFDeEI7QUFDQSxZQUFZLElBQUksU0FBUyxHQUFHLENBQUM7QUFDN0IsWUFBWSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUM3RSxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztBQUN2RCxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMvRCxnQkFBZ0IsU0FBUyxJQUFJLE1BQU07QUFDbkMsZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQztBQUN6RCxhQUFhLENBQUM7QUFDZCxZQUFZLElBQUksS0FBSyxHQUFHLENBQUM7QUFDekIsWUFBWSxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUM7QUFDcEQsWUFBWSxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUk7QUFDbkMsWUFBWSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hHLFlBQVksS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNsRixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7QUFDN0MsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsUUFBUSxZQUFZLENBQUMsV0FBVyxFQUFFLFNBQVMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDdEYsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRTtBQUM3RSxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDcEQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hHLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUM3QyxnQkFBZ0IsT0FBTyxDQUFDO0FBQ3hCO0FBQ0EsWUFBWSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7QUFDMUYsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLGdCQUFnQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDdkQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDL0QsZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQztBQUN6RCxhQUFhLENBQUMsQ0FBQztBQUNmLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RHLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztBQUNoRCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsZUFBZSxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtBQUNyRSxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxFQUFFO0FBQzdFLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUNwRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEcsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzdDLGdCQUFnQixPQUFPLENBQUM7QUFDeEI7QUFDQSxZQUFZLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUMxRixnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztBQUN2RCxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMvRCxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQ3pELGFBQWEsQ0FBQyxDQUFDO0FBQ2YsWUFBWSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVHLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQztBQUNwRCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxRQUFRLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzFFLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ3ZELGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUNwRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUM3QyxnQkFBZ0IsT0FBTyxDQUFDO0FBQ3hCO0FBQ0EsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDO0FBQzdCLFlBQVksTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7QUFDN0UsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLGdCQUFnQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDdkQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDL0QsZ0JBQWdCLFNBQVMsSUFBSSxNQUFNO0FBQ25DLGdCQUFnQixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDekQsYUFBYSxDQUFDO0FBQ2QsWUFBWSxJQUFJLE1BQU07QUFDdEIsWUFBWSxJQUFJLEtBQUssR0FBRyxDQUFDO0FBQ3pCLFlBQVksSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO0FBQzFGLG9CQUFvQixPQUFPLEVBQUU7QUFDN0I7QUFDQSxnQkFBZ0IsTUFBTSxHQUFHLFNBQVMsRUFBRTtBQUNwQyxnQkFBZ0IsS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDL0Q7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU0sR0FBRyxDQUFDLE1BQU07QUFDaEMsb0JBQW9CLElBQUk7QUFDeEIsd0JBQXdCLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvRTtBQUNBLG9CQUFvQixPQUFPLENBQUMsRUFBRTtBQUM5Qix3QkFBd0IsT0FBTyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUM7QUFDeEQ7QUFDQSxpQkFBaUIsR0FBRztBQUNwQixnQkFBZ0IsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJO0FBQ3ZDLGdCQUFnQixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ3RDLGdCQUFnQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEgsZ0JBQWdCLEtBQUssR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDdEYsZ0JBQWdCLGNBQWMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztBQUNuRDtBQUNBLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztBQUM3QyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsZUFBZSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzNELFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ3ZELGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUNwRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUM3QyxnQkFBZ0IsT0FBTyxDQUFDO0FBQ3hCO0FBQ0EsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDO0FBQzdCLFlBQVksTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7QUFDN0UsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLGdCQUFnQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDdkQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDL0QsZ0JBQWdCLFNBQVMsSUFBSSxNQUFNO0FBQ25DLGdCQUFnQixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDekQsYUFBYSxDQUFDO0FBQ2QsWUFBWSxJQUFJLE1BQU07QUFDdEIsWUFBWSxJQUFJLEtBQUssR0FBRyxDQUFDO0FBQ3pCLFlBQVksSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO0FBQzFGLG9CQUFvQixPQUFPLEVBQUU7QUFDN0I7QUFDQSxnQkFBZ0IsTUFBTSxHQUFHLFNBQVMsRUFBRTtBQUNwQyxnQkFBZ0IsS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDL0Q7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUM7QUFDbEQsZ0JBQWdCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSTtBQUN2QyxnQkFBZ0IsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEgsZ0JBQWdCLEtBQUssR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDdEYsZ0JBQWdCLGNBQWMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztBQUNuRDtBQUNBLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztBQUM3QyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pELFFBQVEsWUFBWSxDQUFDLFlBQVksRUFBRSxTQUFTLFVBQVUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQzFGLFlBQVksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDN0IsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyQyxZQUFZLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3JDLFlBQVksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQzFDLGdCQUFnQixPQUFPLENBQUM7QUFDeEIsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUYsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDcEQsWUFBWSxJQUFJLFVBQVUsR0FBRyxDQUFDO0FBQzlCLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbEUsZ0JBQWdCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNoRSxnQkFBZ0IsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDbEgsZ0JBQWdCLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO0FBQzFFLGdCQUFnQixNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ2hFLGdCQUFnQixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUM5RCxnQkFBZ0IsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDMUYsZ0JBQWdCLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDO0FBQ2xFLGdCQUFnQixJQUFJLElBQUk7QUFDeEIsZ0JBQWdCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO0FBQ3pDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQztBQUM1QjtBQUNBLHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtBQUNuRCxvQkFBb0IsSUFBSSxHQUFHLENBQUM7QUFDNUI7QUFDQSxxQkFBcUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7QUFDdEQsb0JBQW9CLElBQUksR0FBRyxDQUFDO0FBQzVCO0FBQ0EscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUU7QUFDekQsb0JBQW9CLElBQUksR0FBRyxDQUFDO0FBQzVCO0FBQ0EscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO0FBQ3JELG9CQUFvQixJQUFJLEdBQUcsQ0FBQztBQUM1QjtBQUNBLHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtBQUNoRCxvQkFBb0IsSUFBSSxHQUFHLENBQUM7QUFDNUI7QUFDQSxxQkFBcUI7QUFDckIsb0JBQW9CLElBQUksR0FBRyxDQUFDO0FBQzVCO0FBQ0EsZ0JBQWdCLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztBQUM1QyxnQkFBZ0IsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO0FBQzNDLGdCQUFnQixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQ2pHLGdCQUFnQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsVUFBVSxDQUFDO0FBQ2xELGdCQUFnQixVQUFVLElBQUksSUFBSSxDQUFDLFVBQVU7QUFDN0M7QUFDQSxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUM7QUFDckQsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7QUFDeEUsWUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUM3QixZQUFZLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3JDLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckMsWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUM7QUFDMUMsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4QixZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN2RyxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUNwRCxZQUFZLElBQUksVUFBVSxHQUFHLENBQUM7QUFDOUIsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRSxnQkFBZ0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2hFLGdCQUFnQixNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM3SCxnQkFBZ0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDMUUsZ0JBQWdCLE1BQU0sU0FBUyxHQUFHLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDaEUsZ0JBQWdCLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzlELGdCQUFnQixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMxRixnQkFBZ0IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7QUFDbEUsZ0JBQWdCLElBQUksSUFBSTtBQUN4QixnQkFBZ0IsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7QUFDekMsb0JBQW9CLElBQUksR0FBRyxDQUFDO0FBQzVCO0FBQ0EscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO0FBQ25ELG9CQUFvQixJQUFJLEdBQUcsQ0FBQztBQUM1QjtBQUNBLHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtBQUN0RCxvQkFBb0IsSUFBSSxHQUFHLENBQUM7QUFDNUI7QUFDQSxxQkFBcUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtBQUN6RCxvQkFBb0IsSUFBSSxHQUFHLENBQUM7QUFDNUI7QUFDQSxxQkFBcUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7QUFDckQsb0JBQW9CLElBQUksR0FBRyxDQUFDO0FBQzVCO0FBQ0EscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO0FBQ2hELG9CQUFvQixJQUFJLEdBQUcsQ0FBQztBQUM1QjtBQUNBLHFCQUFxQjtBQUNyQixvQkFBb0IsSUFBSSxHQUFHLENBQUM7QUFDNUI7QUFDQSxnQkFBZ0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO0FBQzVDLGdCQUFnQixTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7QUFDM0MsZ0JBQWdCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDakcsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUM7QUFDbEQsZ0JBQWdCLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVTtBQUM3QztBQUNBLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQztBQUNyRCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxRQUFRLFlBQVksQ0FBQyxhQUFhLEVBQUUsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNuRSxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztBQUN2QyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsZUFBZSxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNoRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO0FBQzdDLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25DLFFBQVEsWUFBWSxDQUFDLFNBQVMsRUFBRSxTQUFTLE9BQU8sQ0FBQyxFQUFFLEVBQUU7QUFDckQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7QUFDM0MsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUN0QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLFlBQVksTUFBTSxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRTtBQUMxQyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLFFBQVEsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDNUUsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDdkQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ3BELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQzdDLGdCQUFnQixPQUFPLENBQUM7QUFDeEI7QUFDQSxZQUFZLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUMxRixnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztBQUN2RCxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMvRCxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQ3pELGFBQWEsQ0FBQyxDQUFDO0FBQ2YsWUFBWSxJQUFJLFFBQVE7QUFDeEIsWUFBWSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtBQUN0QyxnQkFBZ0IsUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3ZEO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ3RDLGdCQUFnQixRQUFRLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hILGdCQUFnQixjQUFjLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdEQ7QUFDQSxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUM7QUFDaEQsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsUUFBUSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtBQUM1RCxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRTtBQUN2RCxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDcEQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRixZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDMUIsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDN0MsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4QjtBQUNBLFlBQVksTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLO0FBQzFGLGdCQUFnQixNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QyxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO0FBQ3ZELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQy9ELGdCQUFnQixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDekQsYUFBYSxDQUFDLENBQUM7QUFDZixZQUFZLElBQUksUUFBUTtBQUN4QixZQUFZLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQ3RDLGdCQUFnQixRQUFRLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDdkQ7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWTtBQUNySSxnQkFBZ0IsY0FBYyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3REO0FBQ0EsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0FBQ2hELFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakQsUUFBUSxZQUFZLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNqRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDOUMsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDekYsWUFBWSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO0FBQ3JFLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO0FBQ3BDLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxlQUFlLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3BFLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtBQUM1QixnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM5QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsWUFBWSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztBQUN6RixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7QUFDckUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDL0MsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFDLFFBQVEsWUFBWSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUMxRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQzlDLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUNwRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUYsWUFBWSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztBQUN6RixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO0FBQ3JFLFlBQVksSUFBSSxJQUFJO0FBQ3BCLFlBQVksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ25DLGdCQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDaEU7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNqRTtBQUNBLFlBQVksVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0FBQzVDLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxlQUFlLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDakYsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRTtBQUM5QyxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDcEQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVGLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDekYsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksVUFBVSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztBQUNyRSxZQUFZLElBQUksSUFBSTtBQUNwQixZQUFZLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuQyxnQkFBZ0IsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzNFO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUU7QUFDQSxZQUFZLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztBQUM1QyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxRQUFRLFlBQVksQ0FBQyx5QkFBeUIsRUFBRSxTQUFTLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUNuSSxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDO0FBQzFCLGdCQUFnQixPQUFPLEVBQUU7QUFDekIsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM5QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEcsWUFBWSxJQUFJLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQ3JELGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUN6SSxZQUFZLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxpQ0FBaUM7QUFDckcsZ0JBQWdCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNuRDtBQUNBLFlBQVksSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLHFDQUFxQyxDQUFDLGlDQUFpQztBQUNyRyxnQkFBZ0IsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ25EO0FBQ0EsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25FLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxlQUFlLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUNwRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDO0FBQzFCLGdCQUFnQixPQUFPLEVBQUU7QUFDekIsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM5QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEcsWUFBWSxJQUFJLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQ3JELGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLFlBQVksR0FBRyxNQUFNLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDaEosWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMscUNBQXFDLENBQUMsaUNBQWlDO0FBQ3JHLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDbkQ7QUFDQSxZQUFZLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxpQ0FBaUM7QUFDckcsZ0JBQWdCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNuRDtBQUNBLFlBQVksTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5RSxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsWUFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7QUFDaEksWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQy9DLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUMvQyxZQUFZLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQ2xELGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksSUFBSSxPQUFPO0FBQ3ZCLFlBQVksSUFBSSxPQUFPO0FBQ3ZCLFlBQVksSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO0FBQ25DLGdCQUFnQixPQUFPLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5SDtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLGdCQUFnQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEY7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzlDLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO0FBQ3JKLFlBQVksTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUN2SSxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztBQUN6RCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsZUFBZSxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0FBQy9HLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUMvQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDL0MsWUFBWSxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRTtBQUNsRCxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLElBQUksT0FBTztBQUN2QixZQUFZLElBQUksT0FBTztBQUN2QixZQUFZLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRTtBQUNuQyxnQkFBZ0IsT0FBTyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUg7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixnQkFBZ0IsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGO0FBQ0EsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM5QyxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLGVBQWUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDNUosWUFBWSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3ZJLFlBQVksTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDO0FBQ3BFLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEUsUUFBUSxTQUFTLFFBQVEsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRTtBQUNuRixZQUFZLE1BQU0sSUFBSSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQyxPQUFPO0FBQzlELGdCQUFnQixVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNyRCxZQUFZLE1BQU0sS0FBSyxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQyxXQUFXO0FBQ25FLGdCQUFnQixVQUFVLENBQUMsUUFBUTtBQUNuQyxnQkFBZ0IsVUFBVSxDQUFDLFdBQVc7QUFDdEMsZ0JBQWdCLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0QsWUFBWSxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsZ0NBQWdDLENBQUMsa0NBQWtDLENBQUM7QUFDNUcsWUFBWSxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUztBQUNsRCxZQUFZLElBQUksaUJBQWlCLEdBQUcsY0FBYyxHQUFHLG9CQUFvQjtBQUN6RSxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFO0FBQ3ZFLGdCQUFnQixLQUFLLElBQUksRUFBRTtBQUMzQixnQkFBZ0IsV0FBVyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0I7QUFDMUQ7QUFDQSxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxFQUFFO0FBQzNFLGdCQUFnQixLQUFLLElBQUksS0FBSztBQUM5QjtBQUNBLFlBQVksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLHVDQUF1QyxDQUFDLEVBQUU7QUFDdEUsZ0JBQWdCLEtBQUssSUFBSSxHQUFHO0FBQzVCO0FBQ0EsWUFBWSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsd0NBQXdDLENBQUMsRUFBRTtBQUN2RSxnQkFBZ0IsS0FBSyxJQUFJLEdBQUc7QUFDNUIsZ0JBQWdCLFdBQVcsSUFBSSxVQUFVLENBQUMsc0JBQXNCO0FBQ2hFO0FBQ0EsWUFBWSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRTtBQUM5RCxnQkFBZ0IsS0FBSyxJQUFJLElBQUk7QUFDN0I7QUFDQSxZQUFZLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFO0FBQzdEO0FBQ0EsZ0JBQWdCLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxXQUFXO0FBQzNEO0FBQ0EsWUFBWSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtBQUNoRSxnQkFBZ0IsS0FBSyxJQUFJLElBQUk7QUFDN0I7QUFDQSxZQUFZLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFO0FBQzdELGdCQUFnQixLQUFLLElBQUksT0FBTztBQUNoQyxnQkFBZ0IsaUJBQWlCLElBQUksVUFBVSxDQUFDLE9BQU87QUFDdkQ7QUFDQSxZQUFZLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQyxFQUFFO0FBQzdELGdCQUFnQixLQUFLLElBQUksT0FBTztBQUNoQyxnQkFBZ0IsaUJBQWlCLElBQUksVUFBVSxDQUFDLE9BQU87QUFDdkQ7QUFDQSxZQUFZLElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksa0NBQWtDLEdBQUcsK0JBQStCLE1BQU0sQ0FBQyxFQUFFO0FBQ3BILGdCQUFnQixpQkFBaUIsSUFBSSxVQUFVLENBQUMsT0FBTztBQUN2RDtBQUNBLFlBQVksT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUU7QUFDNUQ7QUFDQSxRQUFRLFlBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtBQUNuSixZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDM0IsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtBQUN4QyxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQ25ELFlBQVksb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDO0FBQy9ELFlBQVksTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsQ0FBQztBQUN2SyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQztBQUNwRixZQUFZLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDMUMsWUFBWSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTTtBQUN4QyxZQUFZLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQzNGLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7QUFDM0YsWUFBWSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO0FBQ2pFLFlBQVksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFlBQVksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO0FBQy9CLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxDQUFDLDRDQUE0QyxDQUFDO0FBQzFFLHFCQUFxQixhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNwRCxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQ25ILFlBQVksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsR0FBRyxRQUFRLEVBQUUsb0JBQW9CLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQztBQUN4SixZQUFZLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFELFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUU7QUFDL0IsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUk7QUFDckMsZ0JBQWdCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxxQ0FBcUMsQ0FBQyxFQUFFO0FBQzVFLG9CQUFvQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQSxZQUFZLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJO0FBQ3BDLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUM7QUFDNUMsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7QUFDbEksWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQzNCLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDeEMsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztBQUNuRCxZQUFZLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztBQUMvRCxZQUFZLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLENBQUM7QUFDdkssWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUM7QUFDcEYsWUFBWSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzFDLFlBQVksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU07QUFDeEMsWUFBWSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztBQUMzRixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLGFBQWEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQztBQUNsRyxZQUFZLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUM7QUFDNUUsWUFBWSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUM5RCxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLCtCQUErQjtBQUMxSCxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztBQUN0SCxZQUFZLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxjQUFjLEdBQUcsUUFBUSxFQUFFLG9CQUFvQixHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDeEosWUFBWSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDdkQsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtBQUMvQixnQkFBZ0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSTtBQUNyQyxnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFDQUFxQyxDQUFDLEVBQUU7QUFDNUUsb0JBQW9CLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUk7QUFDeEM7QUFDQTtBQUNBLFlBQVksTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUk7QUFDcEMsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztBQUM1QyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEYsUUFBUSxZQUFZLENBQUMsZUFBZSxFQUFFLFNBQVMsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3hHLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQzdCLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckMsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyQyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFDMUQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ3BELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEYsWUFBWSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztBQUN6RixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7QUFDckUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7QUFDcEQsWUFBWSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNqRCxZQUFZLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDMUQsWUFBWSxJQUFJLEdBQUcsSUFBSSxPQUFPO0FBQzlCLGdCQUFnQixPQUFPLEVBQUU7QUFDekIsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQztBQUN0RCxZQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNqQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7QUFDOUMsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ25GLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQzdCLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckMsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyQyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFDMUQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ3BELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEYsWUFBWSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztBQUN6RixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7QUFDckUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDL0QsWUFBWSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNqRCxZQUFZLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDMUQsWUFBWSxJQUFJLEdBQUcsSUFBSSxPQUFPO0FBQzlCLGdCQUFnQixPQUFPLEVBQUU7QUFDekIsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQztBQUN0RCxZQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNqQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7QUFDOUMsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9ELFFBQVEsWUFBWSxDQUFDLHVCQUF1QixFQUFFLFNBQVMscUJBQXFCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDakcsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQzVCLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzlDLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRyxZQUFZLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQ3pGLFlBQVksVUFBVSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztBQUNyRSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztBQUNwQyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsZUFBZSxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwRSxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQy9CLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDOUMsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDekYsWUFBWSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO0FBQ3JFLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO0FBQy9DLFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQyxRQUFRLFlBQVksQ0FBQyxhQUFhLEVBQUUsU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7QUFDekgsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQy9DLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUMvQyxZQUFZLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQ2xELGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksSUFBSSxPQUFPO0FBQ3ZCLFlBQVksSUFBSSxPQUFPO0FBQ3ZCLFlBQVksSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO0FBQ25DLGdCQUFnQixPQUFPLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsSTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLGdCQUFnQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEY7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzlDLFlBQVksTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUN2SSxZQUFZLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDdkksWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDO0FBQzNELFlBQVksT0FBTyxDQUFDO0FBQ3BCLFNBQVMsRUFBRSxlQUFlLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtBQUN0RyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDL0MsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQy9DLFlBQVksSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDbEQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxJQUFJLE9BQU87QUFDdkIsWUFBWSxJQUFJLE9BQU87QUFDdkIsWUFBWSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7QUFDbkMsZ0JBQWdCLE9BQU8sR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xJO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEYsZ0JBQWdCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDOUMsWUFBWSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3ZJLFlBQVksTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUN2SSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7QUFDdEUsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9ELFFBQVEsWUFBWSxDQUFDLGNBQWMsRUFBRSxTQUFTLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0FBQy9HLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDdkMsWUFBWSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUMvQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDL0MsWUFBWSxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRTtBQUNsRCxnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM5QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLFlBQVksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUM7QUFDcEcsWUFBWSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDMUQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUM7QUFDbEcsWUFBWSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO0FBQy9ELFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztBQUM1QyxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsZUFBZSxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtBQUMzRixZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDL0MsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQy9DLFlBQVksSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDbEQsZ0JBQWdCLE9BQU8sRUFBRTtBQUN6QjtBQUNBLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDOUMsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN4QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixZQUFZLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQ3BHLFlBQVksSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUM7QUFDbEcsWUFBWSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO0FBQy9ELFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUNsQyxZQUFZLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztBQUN2RCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxRQUFRLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3ZGLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtBQUM1QixnQkFBZ0IsT0FBTyxFQUFFO0FBQ3pCO0FBQ0EsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztBQUM5QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0YsWUFBWSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztBQUN6RixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7QUFDckUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQ2xDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7QUFDckMsWUFBWSxPQUFPLENBQUM7QUFDcEIsU0FBUyxFQUFFLGVBQWUsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7QUFDL0QsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMvQixZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQzVCLGdCQUFnQixPQUFPLEVBQUU7QUFDekI7QUFDQSxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQzlDLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRixZQUFZLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQ3pGLFlBQVksVUFBVSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztBQUNyRSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDbEMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUNoRCxZQUFZLE9BQU8sQ0FBQztBQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRTtBQUNoRCxZQUFZLElBQUksRUFBRSxDQUFDLFlBQVksWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ3JELGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLGlFQUFpRSxDQUFDO0FBQ3RHO0FBQ0EsWUFBWSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsU0FBUztBQUNUO0FBQ0EsSUFBSSxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7QUFDdkUsUUFBUSxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQztBQUNsQyxZQUFZLElBQUksRUFBRSxDQUFDO0FBQ25CLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsWUFBWSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QixZQUFZLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFlBQVksRUFBRTtBQUNkLFlBQVksS0FBSztBQUNqQixZQUFZO0FBQ1osU0FBUyxDQUFDO0FBQ1YsUUFBUSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQzNELFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNqQyxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ3RELGdCQUFnQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0FBQzlFLGdCQUFnQixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO0FBQzVELGdCQUFnQixHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQztBQUN2RTtBQUNBO0FBQ0EsUUFBUSxPQUFPLEtBQUs7QUFDcEI7QUFDQSxJQUFJLGFBQWEsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDeEYsUUFBUSxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQztBQUNuQyxZQUFZLElBQUksRUFBRSxDQUFDO0FBQ25CLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsWUFBWSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QixZQUFZLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFlBQVksS0FBSztBQUNqQixZQUFZO0FBQ1osU0FBUyxDQUFDO0FBQ1YsUUFBUSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQztBQUNwRSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDakMsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUN0RCxnQkFBZ0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUN6QyxnQkFBZ0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQzNFLGdCQUFnQixNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO0FBQ3ZFLGdCQUFnQixNQUFNLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDO0FBQ3ZFO0FBQ0E7QUFDQSxRQUFRLE9BQU8sS0FBSztBQUNwQjtBQUNBOztBQUVBO0FBQ0EsTUFBTSxZQUFZLGlCQUFpQixNQUFNLENBQUMsTUFBTSxlQUFlLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUNyQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUNyQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0FBQzNDLFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRTtBQUNsQyxJQUFJLElBQUksRUFBRTtBQUNWLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7QUFDdEMsSUFBSSxJQUFJLEtBQUs7QUFDYixJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDdkMsUUFBUSxjQUFjLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQztBQUMxRCxRQUFRLFFBQVEsT0FBTyxDQUFDLE9BQU87QUFDL0IsWUFBWSxLQUFLLFVBQVU7QUFDM0IsZ0JBQWdCLEtBQUssR0FBRyxNQUFNO0FBQzlCLGdCQUFnQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsZUFBZTtBQUNwRCxnQkFBZ0I7QUFDaEIsWUFBWSxLQUFLLFVBQVU7QUFDM0IsZ0JBQWdCLEtBQUssR0FBRyxNQUFNO0FBQzlCLGdCQUFnQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsd0JBQXdCO0FBQzdELGdCQUFnQjtBQUNoQixZQUFZO0FBQ1osZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQywwQkFBMEIsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BGO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUSxLQUFLLEdBQUcsTUFBTTtBQUN0QixRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyx3QkFBd0I7QUFDckQ7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDcEMsUUFBUSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUM7QUFDbkQ7QUFDQSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxLQUFLLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDdEYsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFO0FBQ2xCLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtBQUNuQyxRQUFRLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQztBQUNsRCxRQUFRLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDdEUsWUFBWSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDckMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzQztBQUNBLFNBQVMsQ0FBQztBQUNWO0FBQ0EsSUFBSSxNQUFNLFFBQVEsR0FBRyxFQUFFO0FBQ3ZCLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUN4QyxRQUFRLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDO0FBQzVELFFBQVEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvSTtBQUNBLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUM3QixRQUFRLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUU7QUFDdEMsWUFBWSxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDO0FBQ2hGO0FBQ0EsUUFBUSxJQUFJO0FBQ1osWUFBWSxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUM7QUFDcEQ7QUFDQSxRQUFRLE9BQU8sQ0FBQyxFQUFFO0FBQ2xCLFlBQVksTUFBTSxJQUFJLFNBQVMsQ0FBQyxnREFBZ0QsQ0FBQztBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUztBQUNuQyxRQUFRLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDO0FBQ3hELElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVM7QUFDdEMsUUFBUSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDO0FBQzlELElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtBQUM1QyxRQUFRLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLHNCQUFzQixDQUFDO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzQixJQUFJLE9BQU87QUFDWCxRQUFRLElBQUk7QUFDWixRQUFRLEdBQUc7QUFDWCxRQUFRLFFBQVE7QUFDaEIsUUFBUSxLQUFLO0FBQ2IsUUFBUTtBQUNSLEtBQUs7QUFDTDtBQUNBLFNBQVMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUU7QUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUztBQUNoQyxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSTtBQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLO0FBQzFCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUztBQUMvQjtBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUM7QUFDWCxJQUFJLFdBQVcsQ0FBQyxPQUFPLEdBQUcsWUFBWSxFQUFFO0FBQ3hDLFFBQVEsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7QUFDekYsUUFBUSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUM5RyxRQUFRLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVO0FBQ3pDLFFBQVEsT0FBTyxJQUFJLENBQUMsVUFBVTtBQUM5QixRQUFRLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUM7QUFDNUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7QUFDbEMsWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDNUQ7QUFDQTtBQUNBLElBQUksZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRTtBQUNuQyxRQUFRLElBQUksRUFBRTtBQUNkLFFBQVEsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxNQUFNLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLE1BQU0sSUFBSSxJQUFJLEVBQUUsS0FBSyxNQUFNLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQzdLLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDNUIsWUFBWSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDO0FBQ2hFO0FBQ0EsUUFBUSxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztBQUM1QyxRQUFRLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDO0FBQzVELFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxRQUFRO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUk7QUFDN0I7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtBQUNwQixRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7QUFDdkMsUUFBUSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPO0FBQy9ELFFBQVEsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDO0FBQzNELFFBQVEsaUJBQWlCLENBQUMsV0FBVyxFQUFFLDhCQUE4QixDQUFDO0FBQ3RFLFFBQVEsSUFBSSxHQUFHO0FBQ2YsUUFBUSxJQUFJO0FBQ1osWUFBWSxHQUFHLEdBQUcsTUFBTSxFQUFFO0FBQzFCO0FBQ0EsUUFBUSxPQUFPLEdBQUcsRUFBRTtBQUNwQixZQUFZLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtBQUNuQyxnQkFBZ0IsTUFBTSxHQUFHO0FBQ3pCO0FBQ0E7QUFDQSxRQUFRLElBQUksR0FBRyxZQUFZLE9BQU8sRUFBRTtBQUNwQyxZQUFZLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSztBQUM1RCxnQkFBZ0IsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO0FBQ3ZDLG9CQUFvQixNQUFNLEdBQUc7QUFDN0I7QUFDQSxnQkFBZ0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ3RDLGFBQWEsQ0FBQztBQUNkO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDOUI7QUFDQTtBQUNBLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRTtBQUN6QixRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7QUFDdkMsUUFBUSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPO0FBQy9ELFFBQVEsaUJBQWlCLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDO0FBQzVELFFBQVEsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO0FBQ3ZDLFlBQVksZ0JBQWdCLENBQUMsV0FBVyxFQUFFLDhCQUE4QixDQUFDO0FBQ3pFLFlBQVksT0FBTyxXQUFXLEVBQUU7QUFDaEM7QUFDQTtBQUNBLElBQUksZUFBZSxHQUFHO0FBQ3RCLFFBQVEsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDeEQ7QUFDQTtBQUNBLFNBQVMsb0JBQW9CLENBQUMsSUFBSSxFQUFFO0FBQ3BDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUk7QUFDMUI7QUFDQSxJQUFJLE1BQU0sU0FBUztBQUNuQjs7Ozs7Ozs7O0FDanFGQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLO0FBQzNCLEdBQUUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLE9BQU87QUFDbEMsR0FBRSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsT0FBTztHQUMzQixNQUFNLENBQUMsR0FBRyxPQUFPO0FBQ25CLEdBQUUsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLE9BQU87QUFDOUIsR0FBRSxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUUsT0FBTztBQUM3QixHQUFFLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRSxPQUFPO0FBQzdCLEdBQUUsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFLE9BQU87QUFDN0IsR0FBRSxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUUsT0FBTztBQUM3QixHQUFFLE9BQU87QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FDQSxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLO0FBQzVDLEdBQUUsUUFBUSxJQUFJO0FBQ2QsS0FBSSxLQUFLLENBQUM7QUFDVixLQUFJLEtBQUssQ0FBQztBQUNWLE9BQU0sT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDO0tBQ3pCLEtBQUssQ0FBQyxFQUFFO0FBQ1osT0FBTSxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDO09BQzdCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHO0FBQzVCLE9BQU0sT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTTtBQUN2QztLQUNJLEtBQUssQ0FBQyxFQUFFO0FBQ1osT0FBTSxNQUFNLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDO0FBQ3JDLE9BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQ2hCLE9BQU0sT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTTtBQUN2QztLQUNJLEtBQUssQ0FBQyxFQUFFO09BQ04sTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSztBQUNqRCxPQUFNLE9BQU87QUFDYjtLQUNJLEtBQUssQ0FBQyxFQUFFO0FBQ1osT0FBTSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO09BQ3hGLElBQUksS0FBSyxFQUFFO0FBQ2pCLFNBQVEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7V0FDOUMsWUFBWSxFQUFFLElBQUk7V0FDbEIsUUFBUSxFQUFFLElBQUk7V0FDZCxVQUFVLEVBQUUsSUFBSTtBQUMxQixXQUFVLEtBQUssRUFBRTtVQUNSO0FBQ1Q7O0FBRUEsT0FBTSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUs7QUFDdkQsU0FBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtXQUM3QixPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsU0FBUSxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7QUFDcEMsV0FBVSxPQUFPO0FBQ2pCLGFBQVksR0FBRyxLQUFLO0FBQ3BCLGFBQVksT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO0FBQ2xDLGFBQVksS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO0FBQzlCLGFBQVksU0FBUyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSTtBQUM3QztBQUNBO0FBQ0EsU0FBUSxPQUFPO1FBQ1I7T0FDRCxNQUFNLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJO0FBQ2hELE9BQU0sT0FBTztBQUNiO0tBQ0ksS0FBSyxDQUFDLEVBQUU7QUFDWixPQUFNLE1BQU0sSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLENBQUM7QUFDdEMsT0FBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDaEIsT0FBTSxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNO0FBQ3ZDO0tBQ0ksS0FBSyxFQUFFO0tBQ1A7QUFDSixPQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksS0FBSztBQUM5QyxHQUFFLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQ3pCLEdBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLE9BQU87R0FDdkIsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDdkYsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEYsR0FBRSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ2pFLEdBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0tBQ2QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEtBQUs7QUFDdkYsT0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUNyQyxTQUFRLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMscUJBQXFCO0FBQ3pELFNBQVEsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ25DLFdBQVUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNsQztBQUNBO0FBQ0EsT0FBTSxPQUFPO01BQ1I7QUFDTCxLQUFJLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRTtBQUM3QixPQUFNLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQztPQUNqQixPQUFPLEdBQUcsQ0FBQztPQUNYLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTO0FBQ3REO0FBQ0EsS0FBSSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUU7QUFDdkIsT0FBTSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7QUFDdkIsT0FBTSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSTtPQUM3QyxPQUFPLEdBQUcsQ0FBQztPQUNYLE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU87QUFDbEQsT0FBTSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7U0FDbEMsWUFBWSxFQUFFLElBQUk7U0FDbEIsVUFBVSxFQUFFLEtBQUs7U0FDakIsUUFBUSxFQUFFLElBQUk7U0FDZCxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQ1o7T0FDRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO1NBQzdDLFlBQVksRUFBRSxJQUFJO1NBQ2xCLFVBQVUsRUFBRSxLQUFLO1NBQ2pCLFFBQVEsRUFBRSxJQUFJO0FBQ3RCLFNBQVEsS0FBSyxFQUFFO1FBQ1I7QUFDUCxPQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1NBQ3hDLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssT0FBTyxFQUFFO0FBQzlDLFNBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQ2pCO0FBQ0EsT0FBTSxPQUFPO0FBQ2I7QUFDQSxLQUFJLE9BQU87QUFDWDtHQUNFLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLEdBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0I7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsT0FBQSxDQUFBLGVBQThCLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFO0FBQy9ELEdBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFJLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDMUMsS0FBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtBQUN0QixLQUFJLElBQUk7T0FDRixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPO0FBQ3RDLE9BQU0sTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUc7T0FDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7T0FDdkIsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQztPQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU07QUFDcEMsT0FBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO09BQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUM7O01BRXpCLENBQUMsMEJBQTBCLEdBQUcsRUFBRTtBQUNyQyxPQUFNLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHO09BQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO09BQ3ZCLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7T0FDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNO0FBQ3BDLE9BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtPQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDO0FBQzlCLE1BQUssU0FBUztBQUNkLE9BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxPQUFBLENBQUEsYUFBNEIsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUU7R0FDdEQsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsS0FBSSxPQUFPLFVBQVUsR0FBRyxJQUFJLEVBQUU7T0FDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsS0FBSztBQUNsRCxPQUFNLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUc7T0FDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O0FBRWpDLE9BQU0sV0FBVyxDQUFDO0FBQ2xCLFNBQVEsTUFBTSxFQUFFO1dBQ04sR0FBRyxFQUFFLE1BQU07V0FDWCxJQUFJLEVBQUUsQ0FBQztBQUNqQixXQUFVLE9BQU8sRUFBRTtBQUNuQjtRQUNPOztPQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztPQUUxQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO09BQ3JDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7T0FDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztPQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUk7T0FDNUMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUNwRCxPQUFNLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN4QixTQUFRLE1BQU07QUFDZDtBQUNBLE9BQU0sT0FBTztBQUNiO0FBQ0E7RUFDQzs7Ozs7Ozs7OzsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0XX0=