UNPKG

obsidian-dev-utils

Version:

This is the collection of useful functions that you can use for your Obsidian plugin development

117 lines (114 loc) 13.7 kB
/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd(){return"/"},env:{},platform:"android"};globalThis.process=browserProcess})(); import { AsyncEvents } from "./AsyncEvents.mjs"; const ASYNC_ERROR_EVENT = "asyncError"; const asyncErrorEventEmitter = new AsyncEvents(); asyncErrorEventEmitter.on(ASYNC_ERROR_EVENT, handleAsyncError); const ASYNC_WRAPPER_ERROR_MESSAGE = "An unhandled error occurred executing async operation"; const STACK_TRACE_PREFIX = " at"; class CustomStackTraceError extends Error { /** * Creates a new CustomStackTraceError. * * @param message - The message of the error. * @param stackTrace - The stack trace of the error. * @param cause - The cause of the error. */ constructor(message, stackTrace, cause) { super(message, { cause }); this.name = "CustomStackTraceError"; Error.captureStackTrace?.(this, CustomStackTraceError); let rootCause = cause; const parentCauses = /* @__PURE__ */ new Set(); while (rootCause instanceof CustomStackTraceError) { if (parentCauses.has(rootCause)) { throw new Error("Circular cause detected"); } parentCauses.add(rootCause); rootCause = rootCause.cause; } const originalStackLines = (this.stack ?? "").split("\n"); const stackLines = stackTrace.split("\n"); const ERROR_HEADER_REG_EXP = /^\w*Error(?:: |$)/; if (ERROR_HEADER_REG_EXP.test(stackLines[0] ?? "")) { stackLines.splice(0, 1); } originalStackLines.splice(1, originalStackLines.length - 1, ...stackLines); this.stack = originalStackLines.join("\n"); } } class SilentError extends Error { /** * Creates a new SilentError. * * @param message - The message of the error. */ constructor(message) { super(message); this.name = "SilentError"; Error.captureStackTrace?.(this, SilentError); } } function emitAsyncErrorEvent(asyncError) { asyncErrorEventEmitter.trigger(ASYNC_ERROR_EVENT, asyncError); } function errorToString(error) { if (!(error instanceof Error)) { return String(error); } let message = error.stack ?? `${error.name}: ${error.message}`; if (error.cause !== void 0) { const causeStrLines = errorToString(error.cause).split("\n"); message += ` ${generateStackTraceLine("Caused by:")}`; for (const line of causeStrLines) { if (!line.trim()) { continue; } message += line.startsWith(STACK_TRACE_PREFIX) ? ` ${line}` : ` ${generateStackTraceLine(line)}`; } } return message; } function getStackTrace(framesToSkip = 0) { const ADDITIONAL_FRAMES_TO_SKIP = 2; const stack = new Error().stack ?? ""; const lines = stack.split("\n"); return lines.slice(framesToSkip + ADDITIONAL_FRAMES_TO_SKIP).join("\n"); } function printError(error, console) { console ??= globalThis.console; console.error(errorToString(error)); } function registerAsyncErrorEventHandler(handler) { const eventRef = asyncErrorEventEmitter.on(ASYNC_ERROR_EVENT, handler); return () => { asyncErrorEventEmitter.offref(eventRef); }; } function throwExpression(error) { throw error; } function generateStackTraceLine(title) { return `${STACK_TRACE_PREFIX} --- ${title} --- (0)`; } function handleAsyncError(asyncError) { printError(asyncError); } export { ASYNC_WRAPPER_ERROR_MESSAGE, CustomStackTraceError, SilentError, emitAsyncErrorEvent, errorToString, getStackTrace, printError, registerAsyncErrorEventHandler, throwExpression }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0Vycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBlcnJvciBoYW5kbGluZy5cbiAqL1xuXG5pbXBvcnQgeyBBc3luY0V2ZW50cyB9IGZyb20gJy4vQXN5bmNFdmVudHMudHMnO1xuXG5jb25zdCBBU1lOQ19FUlJPUl9FVkVOVCA9ICdhc3luY0Vycm9yJztcblxuY29uc3QgYXN5bmNFcnJvckV2ZW50RW1pdHRlciA9IG5ldyBBc3luY0V2ZW50cygpO1xuYXN5bmNFcnJvckV2ZW50RW1pdHRlci5vbihBU1lOQ19FUlJPUl9FVkVOVCwgaGFuZGxlQXN5bmNFcnJvcik7XG5cbi8qKlxuICogQSBtZXNzYWdlIG9mIHRoZSBBc3luY1dyYXBwZXJFcnJvci5cbiAqL1xuZXhwb3J0IGNvbnN0IEFTWU5DX1dSQVBQRVJfRVJST1JfTUVTU0FHRSA9ICdBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQgZXhlY3V0aW5nIGFzeW5jIG9wZXJhdGlvbic7XG5cbmNvbnN0IFNUQUNLX1RSQUNFX1BSRUZJWCA9ICcgICAgYXQnO1xuXG4vKipcbiAqIEFuIGVycm9yIHRoYXQgd3JhcHMgYW4gZXJyb3Igd2l0aCBhIGN1c3RvbSBzdGFjayB0cmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEN1c3RvbVN0YWNrVHJhY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gY2F1c2UgLSBUaGUgY2F1c2Ugb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhY2tUcmFjZTogc3RyaW5nLCBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIHsgY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gJ0N1c3RvbVN0YWNrVHJhY2VFcnJvcic7XG5cbiAgICAvLyBOT1RFOiBgPy5gIGlzIHVzZWQgdG8gc3VwcG9ydCBpT1MgYmVmb3JlIDE3LjJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcywgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKTtcblxuICAgIGxldCByb290Q2F1c2UgPSBjYXVzZTtcbiAgICBjb25zdCBwYXJlbnRDYXVzZXMgPSBuZXcgU2V0PEN1c3RvbVN0YWNrVHJhY2VFcnJvcj4oKTtcbiAgICB3aGlsZSAocm9vdENhdXNlIGluc3RhbmNlb2YgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKSB7XG4gICAgICBpZiAocGFyZW50Q2F1c2VzLmhhcyhyb290Q2F1c2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2lyY3VsYXIgY2F1c2UgZGV0ZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudENhdXNlcy5hZGQocm9vdENhdXNlKTtcbiAgICAgIHJvb3RDYXVzZSA9IHJvb3RDYXVzZS5jYXVzZTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFN0YWNrTGluZXMgPSAodGhpcy5zdGFjayA/PyAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBzdGFja1RyYWNlLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCBFUlJPUl9IRUFERVJfUkVHX0VYUCA9IC9eXFx3KkVycm9yKD86OiB8JCkvO1xuICAgIGlmIChFUlJPUl9IRUFERVJfUkVHX0VYUC50ZXN0KHN0YWNrTGluZXNbMF0gPz8gJycpKSB7XG4gICAgICBzdGFja0xpbmVzLnNwbGljZSgwLCAxKTtcbiAgICB9XG4gICAgb3JpZ2luYWxTdGFja0xpbmVzLnNwbGljZSgxLCBvcmlnaW5hbFN0YWNrTGluZXMubGVuZ3RoIC0gMSwgLi4uc3RhY2tMaW5lcyk7XG4gICAgdGhpcy5zdGFjayA9IG9yaWdpbmFsU3RhY2tMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGVycm9yIHRoYXQgaXMgbm90IHByaW50ZWQgdG8gdGhlIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWxlbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU2lsZW50RXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdTaWxlbnRFcnJvcic7XG5cbiAgICAvLyBOT1RFOiBgPy5gIGlzIHVzZWQgdG8gc3VwcG9ydCBpT1MgYmVmb3JlIDE3LjJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcywgU2lsZW50RXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgYW4gYXN5bmNocm9ub3VzIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0Vycm9yIC0gVGhlIGVycm9yIHRvIGVtaXQgYXMgYW4gYXN5bmNocm9ub3VzIGVycm9yIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1pdEFzeW5jRXJyb3JFdmVudChhc3luY0Vycm9yOiB1bmtub3duKTogdm9pZCB7XG4gIGFzeW5jRXJyb3JFdmVudEVtaXR0ZXIudHJpZ2dlcihBU1lOQ19FUlJPUl9FVkVOVCwgYXN5bmNFcnJvcik7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gZXJyb3IgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGluY2x1ZGluZyBuZXN0ZWQgY2F1c2VzIHdpdGggaW5kZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9TdHJpbmcoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICB9XG5cbiAgbGV0IG1lc3NhZ2UgPSBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gIGlmIChlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2F1c2VTdHJMaW5lcyA9IGVycm9yVG9TdHJpbmcoZXJyb3IuY2F1c2UpLnNwbGl0KCdcXG4nKTtcbiAgICBtZXNzYWdlICs9IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUoJ0NhdXNlZCBieTonKX1gO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBjYXVzZVN0ckxpbmVzKSB7XG4gICAgICBpZiAoIWxpbmUudHJpbSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbWVzc2FnZSArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBzdGFjayB0cmFjZSBhcyBhIHN0cmluZywgZXhjbHVkaW5nIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGNhbGwuXG4gKlxuICogQHBhcmFtIGZyYW1lc1RvU2tpcCAtIFRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIHNraXAgaW4gdGhlIHN0YWNrIHRyYWNlLlxuICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UsIGV4Y2x1ZGluZyB0aGUgY3VycmVudCBmdW5jdGlvbiBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhY2tUcmFjZShmcmFtZXNUb1NraXAgPSAwKTogc3RyaW5nIHtcbiAgLy8gU2tpcHBpbmcgRXJyb3IgcHJlZml4IGFuZCBgZ2V0U3RhY2tUcmFjZWAgZnVuY3Rpb24gY2FsbFxuICBjb25zdCBBRERJVElPTkFMX0ZSQU1FU19UT19TS0lQID0gMjtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjayA/PyAnJztcbiAgY29uc3QgbGluZXMgPSBzdGFjay5zcGxpdCgnXFxuJyk7XG4gIHJldHVybiBsaW5lcy5zbGljZShmcmFtZXNUb1NraXAgKyBBRERJVElPTkFMX0ZSQU1FU19UT19TS0lQKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBQcmludHMgYW4gZXJyb3IgdG8gdGhlIGNvbnNvbGUsIGluY2x1ZGluZyBuZXN0ZWQgY2F1c2VzIGFuZCBvcHRpb25hbCBBTlNJIHNlcXVlbmNlIGNsZWFyaW5nLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBwcmludC5cbiAqIEBwYXJhbSBjb25zb2xlIC0gVGhlIGNvbnNvbGUgdG8gcHJpbnQgdG8gKGRlZmF1bHQ6IGBnbG9iYWxUaGlzLmNvbnNvbGVgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50RXJyb3IoZXJyb3I6IHVua25vd24sIGNvbnNvbGU/OiBDb25zb2xlKTogdm9pZCB7XG4gIGNvbnNvbGUgPz89IGdsb2JhbFRoaXMuY29uc29sZTtcbiAgY29uc29sZS5lcnJvcihlcnJvclRvU3RyaW5nKGVycm9yKSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGFzeW5jaHJvbm91cyBlcnJvcnMuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhbiBhc3luY2hyb25vdXMgZXJyb3IgZXZlbnQgb2NjdXJzLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBc3luY0Vycm9yRXZlbnRIYW5kbGVyKGhhbmRsZXI6IChhc3luY0Vycm9yOiB1bmtub3duKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IGV2ZW50UmVmID0gYXN5bmNFcnJvckV2ZW50RW1pdHRlci5vbihBU1lOQ19FUlJPUl9FVkVOVCwgaGFuZGxlcik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgYXN5bmNFcnJvckV2ZW50RW1pdHRlci5vZmZyZWYoZXZlbnRSZWYpO1xuICB9O1xufVxuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gdGhyb3cuXG4gKiBAdGhyb3dzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0V4cHJlc3Npb24oZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gIHRocm93IGVycm9yO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U1RBQ0tfVFJBQ0VfUFJFRklYfSAtLS0gJHt0aXRsZX0gLS0tICgwKWA7XG59XG5cbi8qKlxuICogSGFuZGxlcyBhc3luY2hyb25vdXMgZXJyb3JzIGJ5IHByaW50aW5nIHRoZW0uXG4gKlxuICogQHBhcmFtIGFzeW5jRXJyb3IgLSBUaGUgYXN5bmNocm9ub3VzIGVycm9yIHRvIGhhbmRsZS5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlQXN5bmNFcnJvcihhc3luY0Vycm9yOiB1bmtub3duKTogdm9pZCB7XG4gIHByaW50RXJyb3IoYXN5bmNFcnJvcik7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBTUEsU0FBUyxtQkFBbUI7QUFFNUIsTUFBTSxvQkFBb0I7QUFFMUIsTUFBTSx5QkFBeUIsSUFBSSxZQUFZO0FBQy9DLHVCQUF1QixHQUFHLG1CQUFtQixnQkFBZ0I7QUFLdEQsTUFBTSw4QkFBOEI7QUFFM0MsTUFBTSxxQkFBcUI7QUFLcEIsTUFBTSw4QkFBOEIsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFReEMsWUFBWSxTQUFpQixZQUFvQixPQUFnQjtBQUN0RSxVQUFNLFNBQVMsRUFBRSxNQUFNLENBQUM7QUFDeEIsU0FBSyxPQUFPO0FBSVosVUFBTSxvQkFBb0IsTUFBTSxxQkFBcUI7QUFFckQsUUFBSSxZQUFZO0FBQ2hCLFVBQU0sZUFBZSxvQkFBSSxJQUEyQjtBQUNwRCxXQUFPLHFCQUFxQix1QkFBdUI7QUFDakQsVUFBSSxhQUFhLElBQUksU0FBUyxHQUFHO0FBQy9CLGNBQU0sSUFBSSxNQUFNLHlCQUF5QjtBQUFBLE1BQzNDO0FBQ0EsbUJBQWEsSUFBSSxTQUFTO0FBQzFCLGtCQUFZLFVBQVU7QUFBQSxJQUN4QjtBQUVBLFVBQU0sc0JBQXNCLEtBQUssU0FBUyxJQUFJLE1BQU0sSUFBSTtBQUN4RCxVQUFNLGFBQWEsV0FBVyxNQUFNLElBQUk7QUFDeEMsVUFBTSx1QkFBdUI7QUFDN0IsUUFBSSxxQkFBcUIsS0FBSyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUc7QUFDbEQsaUJBQVcsT0FBTyxHQUFHLENBQUM7QUFBQSxJQUN4QjtBQUNBLHVCQUFtQixPQUFPLEdBQUcsbUJBQW1CLFNBQVMsR0FBRyxHQUFHLFVBQVU7QUFDekUsU0FBSyxRQUFRLG1CQUFtQixLQUFLLElBQUk7QUFBQSxFQUMzQztBQUNGO0FBS08sTUFBTSxvQkFBb0IsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU05QixZQUFZLFNBQWlCO0FBQ2xDLFVBQU0sT0FBTztBQUNiLFNBQUssT0FBTztBQUlaLFVBQU0sb0JBQW9CLE1BQU0sV0FBVztBQUFBLEVBQzdDO0FBQ0Y7QUFPTyxTQUFTLG9CQUFvQixZQUEyQjtBQUM3RCx5QkFBdUIsUUFBUSxtQkFBbUIsVUFBVTtBQUM5RDtBQVFPLFNBQVMsY0FBYyxPQUF3QjtBQUNwRCxNQUFJLEVBQUUsaUJBQWlCLFFBQVE7QUFDN0IsV0FBTyxPQUFPLEtBQUs7QUFBQSxFQUNyQjtBQUVBLE1BQUksVUFBVSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksS0FBSyxNQUFNLE9BQU87QUFDNUQsTUFBSSxNQUFNLFVBQVUsUUFBVztBQUM3QixVQUFNLGdCQUFnQixjQUFjLE1BQU0sS0FBSyxFQUFFLE1BQU0sSUFBSTtBQUMzRCxlQUFXO0FBQUEsRUFBSyx1QkFBdUIsWUFBWSxDQUFDO0FBQ3BELGVBQVcsUUFBUSxlQUFlO0FBQ2hDLFVBQUksQ0FBQyxLQUFLLEtBQUssR0FBRztBQUNoQjtBQUFBLE1BQ0Y7QUFDQSxpQkFBVyxLQUFLLFdBQVcsa0JBQWtCLElBQ3pDO0FBQUEsRUFBSyxJQUFJLEtBQ1Q7QUFBQSxFQUFLLHVCQUF1QixJQUFJLENBQUM7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLGNBQWMsZUFBZSxHQUFXO0FBRXRELFFBQU0sNEJBQTRCO0FBQ2xDLFFBQU0sUUFBUSxJQUFJLE1BQU0sRUFBRSxTQUFTO0FBQ25DLFFBQU0sUUFBUSxNQUFNLE1BQU0sSUFBSTtBQUM5QixTQUFPLE1BQU0sTUFBTSxlQUFlLHlCQUF5QixFQUFFLEtBQUssSUFBSTtBQUN4RTtBQVFPLFNBQVMsV0FBVyxPQUFnQixTQUF5QjtBQUNsRSxjQUFZLFdBQVc7QUFDdkIsVUFBUSxNQUFNLGNBQWMsS0FBSyxDQUFDO0FBQ3BDO0FBUU8sU0FBUywrQkFBK0IsU0FBb0Q7QUFDakcsUUFBTSxXQUFXLHVCQUF1QixHQUFHLG1CQUFtQixPQUFPO0FBQ3JFLFNBQU8sTUFBTTtBQUNYLDJCQUF1QixPQUFPLFFBQVE7QUFBQSxFQUN4QztBQUNGO0FBUU8sU0FBUyxnQkFBZ0IsT0FBdUI7QUFDckQsUUFBTTtBQUNSO0FBRUEsU0FBUyx1QkFBdUIsT0FBdUI7QUFDckQsU0FBTyxHQUFHLGtCQUFrQixRQUFRLEtBQUs7QUFDM0M7QUFPQSxTQUFTLGlCQUFpQixZQUEyQjtBQUNuRCxhQUFXLFVBQVU7QUFDdkI7IiwKICAibmFtZXMiOiBbXQp9Cg==