@scriptdb/cli 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/constants.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/buffer-util.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/limiter.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/permessage-deflate.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/validation.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/receiver.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/sender.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/event-target.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/extension.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/websocket.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/stream.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/subprotocol.js","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/lib/websocket-server.js","../../server/src/protocal.ts","../../server/src/utils/basePath.ts","../../server/src/utils/homeDir.ts","../../server/src/index.ts","../../vm/src/index.ts","../../storage/src/index.ts","../../server/src/utils/setupDir.ts","../../../node_modules/.bun/ws@8.18.3/node_modules/ws/wrapper.mjs","../../client/src/index.ts","../../server/src/wsProxy.ts","../../system-modules/src/modules/update.ts","../../system-modules/src/utils/isIdentifier.ts","../../system-modules/src/utils/valueToCode.ts","../../system-modules/src/modules/remove.ts","../../system-modules/src/modules/create.ts","../../system-modules/src/modules/save.ts","../../system-modules/src/modules/read.ts","../../system-modules/src/index.ts","../src/index.ts","../src/shell.ts"],"sourcesContent":["'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst closeTimeout = 30 * 1000;\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch (e) {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n let chunk;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written and `readable.read()`\n // will return `null`. If instead, the socket is paused, any possible buffered\n // data will be read as a single chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n (chunk = websocket._socket.read()) !== null\n ) {\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n","import * as net from \"net\";\nimport * as tls from \"tls\";\nimport * as fs from \"fs\";\nimport * as jwt from \"jsonwebtoken\";\nimport * as crypto from \"crypto\";\n// import * as bcrypt from \"bcryptjs\";\nimport Bottleneck from \"bottleneck\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { Worker } from \"worker_threads\";\nimport { LRUCache } from \"lru-cache\";\nimport getBasePath from \"./utils/basePath\";\nimport { getHomeDir } from \"./utils/homeDir\";\n// import VM from \"@scriptdb/vm\";\n// Try to import getBasePath, but provide a fallback if it doesn't exist\n// let getBasePath: (() => string) | undefined;\n// try {\n// const basePathModule = require(\"../basePath.js\");\n// getBasePath = basePathModule.getBasePath;\n// } catch (e) {\n// // Fallback implementation\n// getBasePath = () => process.cwd();\n// }\n\n// Try to import VM, but provide a fallback if it doesn't exist\n// let VM: any;\n// try {\n// const vmModule = require(\"@scriptdb/vm\");\n// VM = vmModule && vmModule.VM ? vmModule.VM : vmModule;\n// } catch (e) {\n// VM = null;\n// }\n\n// Types definition\ninterface User {\n username: string;\n password?: string;\n hash?: boolean;\n algorithm?: 'bcrypt' | 'sha256' | 'sha512';\n}\n\ninterface FileConfig {\n host?: string;\n port?: number;\n secure?: boolean;\n users?: User[];\n serverSecret?: string;\n folder?: string;\n connectionTimeoutMs?: number;\n tlsOptions?: tls.TlsOptions;\n payloadSchema?: Record<string, string>;\n ipFailWindowMs?: number;\n maxLoginAttempts?: number;\n lockDurationMs?: number;\n enableIpLockout?: boolean;\n}\n\ninterface LoginAttemptRecord {\n attempts: number;\n lockedUntil: number;\n expiresAt: number;\n}\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (reason: any) => void;\n timer: NodeJS.Timeout;\n start?: number;\n}\n\ninterface Metrics {\n bcryptPending: () => number;\n vmPending: () => number;\n vmWorkers: () => number;\n activeConnections: number;\n validatorPending: () => number;\n validatorWorkers: () => number;\n bcryptAvgLatency: () => number;\n vmAvgLatency: () => number;\n validatorAvgLatency: () => number;\n compactActive: () => number;\n compactTripped: () => boolean;\n}\n\ninterface ProtocalOptions {\n host?: string;\n port?: number;\n secure?: boolean;\n users?: User[] | User;\n vm?: any;\n serverSecret?: string;\n folder?: string;\n validatorPoolSize?: number;\n ipFailWindowMs?: number;\n maxLoginAttempts?: number;\n lockDurationMs?: number;\n enableIpLockout?: boolean;\n maxMessageBytes?: number;\n maxMessagesPerConnection?: number;\n connectionTimeoutMs?: number;\n tlsOptions?: tls.TlsOptions;\n requireTlsInProduction?: boolean;\n payloadSchema?: Record<string, string>;\n allowPerUserSigning?: boolean;\n payloadMaxDepth?: number;\n payloadMaxNodes?: number;\n payloadMaxBytes?: number;\n sanitizeMaxDepth?: number;\n sanitizeMaxNodes?: number;\n sanitizeMaxString?: number;\n attemptCacheTTL?: number;\n alertPendingThreshold?: number;\n bcryptPoolSize?: number;\n bcryptMaxPoolSize?: number;\n bcryptLatencyWindow?: number;\n bcryptFailureWindowMs?: number;\n bcryptFailureThreshold?: number;\n bcryptCircuitCooldownMs?: number;\n bcryptWorkerTimeoutMs?: number;\n vmWorkerPoolSize?: number;\n vmMaxPoolSize?: number;\n vmLatencyWindow?: number;\n vmFailureWindowMs?: number;\n vmFailureThreshold?: number;\n vmCircuitCooldownMs?: number;\n vmWorkerTimeoutMs?: number;\n validatorTimeoutMs?: number;\n validatorLatencyWindow?: number;\n validatorFailureWindowMs?: number;\n validatorFailureThreshold?: number;\n validatorCircuitCooldownMs?: number;\n maxConnections?: number;\n backlog?: number;\n runTimeoutMs?: number;\n autoscaleIntervalMs?: number;\n storage?: any;\n}\n\n// Load optional file config safely (don't throw if missing)\nlet fileConfig: FileConfig = {};\ntry {\n const configPath = path.join(getHomeDir(), \".scriptdb\", \"config.json\");\n if (fs.existsSync(configPath)) {\n const configContent = fs.readFileSync(configPath, 'utf8');\n fileConfig = JSON.parse(configContent);\n // console.log('Loaded config from:', configPath);\n // console.log('Config users:', fileConfig.users);\n } else {\n console.log('No config file found at:', configPath, '- using defaults');\n }\n} catch (e) {\n console.error('Failed to load config:', e);\n fileConfig = {};\n}\n\nexport class Protocal {\n // Server configuration\n host: string;\n port: number;\n secure: boolean;\n users: User[];\n vm: any;\n serverSecret: string | null;\n validatorPoolSize: number;\n \n // Rate limiting and security\n ipLimiterGroup: Bottleneck.Group;\n loginAttemptCache: Map<string, LoginAttemptRecord>;\n ipAttemptCache: Map<string, LoginAttemptRecord>;\n IP_FAIL_WINDOW_MS: number;\n MAX_LOGIN_ATTEMPTS: number;\n LOCK_DURATION_MS: number;\n ENABLE_IP_LOCKOUT: boolean;\n MAX_MESSAGE_BYTES: number;\n MAX_MESSAGES_PER_CONNECTION: number;\n CONNECTION_TIMEOUT_MS: number;\n tlsOptions: tls.TlsOptions | null;\n requireTlsInProduction: boolean;\n payloadSchema: Record<string, string>;\n allowPerUserSigning: boolean;\n \n // Validation limits\n _payloadMaxDepth: number;\n _payloadMaxNodes: number;\n _payloadMaxBytes: number;\n _sanitizeMaxDepth: number;\n _sanitizeMaxNodes: number;\n _sanitizeMaxString: number;\n _attemptCacheTTL: number;\n _attemptCacheCleanupInterval: NodeJS.Timeout;\n \n // Worker pools\n _bcryptWorkers: Worker[];\n _bcryptNext: number;\n _bcryptPending: Map<string, PendingRequest>;\n bcryptPoolSize: number;\n bcryptMaxPoolSize: number;\n _bcryptLatencies: number[];\n _bcryptLatencyWindow: number;\n _bcryptFailures: number[];\n _bcryptFailureWindowMs: number;\n _bcryptFailureThreshold: number;\n _bcryptCircuitCooldownMs: number;\n _bcryptTrippedUntil: number;\n bcryptWorkerTimeoutMs: number;\n \n // Token verification\n _tokenVerifyCache: any;\n \n // Storage\n storage: any;\n \n // Alerting\n alertPendingThreshold: number;\n \n // VM Worker pool\n _vmWorkers: Worker[];\n _vmNext: number;\n _vmPending: Map<string, PendingRequest>;\n vmMaxPoolSize?: number;\n _vmLatencies: number[];\n _vmLatencyWindow: number;\n _vmFailures: number[];\n _vmFailureWindowMs: number;\n _vmFailureThreshold: number;\n _vmCircuitCooldownMs: number;\n _vmTrippedUntil: number;\n vmWorkerTimeoutMs: number;\n \n // Validator worker pool\n _validatorWorkers: Worker[];\n _validatorNext: number;\n _validatorPending: Map<string, PendingRequest>;\n _validatorLatencies: number[];\n _validatorLatencyWindow: number;\n _validatorFailures: number[];\n _validatorFailureWindowMs: number;\n _validatorFailureThreshold: number;\n _validatorCircuitCooldownMs: number;\n _validatorTrippedUntil: number;\n _validatorTimeoutMs?: number;\n \n // Metrics\n metrics: Metrics;\n \n // Connection limits\n maxConnections: number;\n backlog: number;\n \n // Autoscale\n _autoscaleIntervalMs: number;\n _autoscaleTimer: NodeJS.Timeout | null;\n \n // Server instance\n server?: net.Server | tls.Server;\n audit: (event: string, meta?: any) => void;\n\n // Helper to get the effective secret for JWT operations\n private getEffectiveSecret(): string {\n return this.serverSecret || 'default-dev-secret-change-in-production';\n }\n\n constructor(options: ProtocalOptions = {}) {\n this.host = options.host || fileConfig.host || \"localhost\";\n this.port = Number.isFinite(Number(options.port))\n ? Number(options.port)\n : fileConfig.port || 1234;\n \n // Get secure setting from options or config file\n this.secure = options.secure !== undefined ? options.secure : (fileConfig.secure !== undefined ? fileConfig.secure : true);\n \n // normalize users to array\n if (Array.isArray(options.users)) {\n this.users = options.users;\n console.log('Using users from options:', this.users.length, 'users');\n } else if (options.users && typeof options.users === \"object\") {\n this.users = [options.users];\n console.log('Using single user from options');\n } else if (Array.isArray(fileConfig.users)) {\n this.users = fileConfig.users;\n console.log('Using users from fileConfig:', this.users.length, 'users');\n } else {\n this.users = [];\n console.log('No users configured!');\n }\n \n // Log first user for debugging\n if (this.users.length > 0) {\n console.log('First user config:', {\n username: this.users[0].username,\n hasPassword: !!this.users[0].password,\n hash: this.users[0].hash,\n algorithm: this.users[0].algorithm\n });\n }\n\n // prefer injected vm, otherwise try to create one lazily\n if (options.vm) {\n this.vm = options.vm;\n } else {\n try {\n const basePath = getBasePath ? getBasePath() : process.cwd();\n const folder = options.folder || fileConfig.folder || \"databases\";\n } catch (err) {\n // don't throw during construction; log and allow server to start\n console.error(\n \"Failed to create internal VM:\",\n (err && (err as Error).message) ? (err as Error).message : err\n );\n this.vm = null;\n }\n }\n\n // server-side secret for signing JWTs. Prefer an explicit env or file-based secret\n this.serverSecret =\n options.serverSecret ||\n process.env.SCRIPTDB_JWT_SECRET ||\n fileConfig.serverSecret ||\n null;\n if (!this.serverSecret) {\n console.warn(\n \"Protocal: No serverSecret configured. In production a serverSecret is required.\"\n );\n }\n\n // In production require a server-wide signing secret (do not allow fallback)\n const cpuCount = os.cpus && os.cpus().length ? os.cpus().length : 1;\n const defaultValidatorPool = Math.max(\n 0,\n Math.min(2, Math.floor(cpuCount / 4))\n );\n this.validatorPoolSize =\n typeof options.validatorPoolSize === \"number\"\n ? options.validatorPoolSize\n : defaultValidatorPool;\n\n // rate limiting: per-IP and per-username login attempts\n // Use a Bottleneck.Group to create per-IP limiters (enforced with await)\n this.ipLimiterGroup = new Bottleneck.Group({\n maxConcurrent: 1,\n minTime: 50,\n });\n \n // per-username attempts: { attempts, lockedUntil, expiresAt }\n this.loginAttemptCache = new Map(); // username -> { attempts, lockedUntil, expiresAt }\n // per-IP attempts tracking to detect abusive IPs\n this.ipAttemptCache = new Map(); // ip -> { attempts, lockedUntil, expiresAt }\n this.IP_FAIL_WINDOW_MS = options.ipFailWindowMs || fileConfig.ipFailWindowMs || 15 * 60 * 1000; // 15 minutes sliding window\n this.MAX_LOGIN_ATTEMPTS = options.maxLoginAttempts || fileConfig.maxLoginAttempts || 5;\n this.LOCK_DURATION_MS = options.lockDurationMs || fileConfig.lockDurationMs || 15 * 60 * 1000; // 15 minutes lockout\n this.ENABLE_IP_LOCKOUT = options.enableIpLockout !== undefined ? options.enableIpLockout : (fileConfig.enableIpLockout !== undefined ? fileConfig.enableIpLockout : true);\n this.MAX_MESSAGE_BYTES = options.maxMessageBytes || 64 * 1024; // 64 KB per NDJSON message\n this.MAX_MESSAGES_PER_CONNECTION = options.maxMessagesPerConnection || 1000;\n \n // By default do not set a server-side connection timeout (0 = disabled).\n // Prefer explicit option, then fileConfig, otherwise 0.\n this.CONNECTION_TIMEOUT_MS =\n typeof options.connectionTimeoutMs === \"number\"\n ? options.connectionTimeoutMs\n : typeof fileConfig.connectionTimeoutMs === \"number\"\n ? fileConfig.connectionTimeoutMs\n : 0;\n this.tlsOptions = options.tlsOptions || fileConfig.tlsOptions || null;\n this.requireTlsInProduction =\n options.requireTlsInProduction !== undefined\n ? options.requireTlsInProduction\n : true;\n\n // optional payload schema (simple white-listing). If provided, it should be an object\n // mapping allowed top-level fields to expected types: { command: 'string', args: 'object' }\n this.payloadSchema = options.payloadSchema ||\n fileConfig.payloadSchema || { \n command: \"string\", \n args: \"object\",\n code: \"string\",\n databaseName: \"string\"\n };\n\n // controls whether per-user signingSecret is allowed as a fallback\n this.allowPerUserSigning = options.allowPerUserSigning || false;\n\n // sanitizer and payload validation limits\n this._payloadMaxDepth = options.payloadMaxDepth || 4;\n this._payloadMaxNodes = options.payloadMaxNodes || 1000;\n this._payloadMaxBytes = options.payloadMaxBytes || 16 * 1024; // 16KB\n this._sanitizeMaxDepth = options.sanitizeMaxDepth || 6;\n this._sanitizeMaxNodes = options.sanitizeMaxNodes || 2000;\n this._sanitizeMaxString = options.sanitizeMaxString || 1000; // chars\n\n // cleanup timer to evict expired attempt records and prevent unbounded growth\n this._attemptCacheTTL = options.attemptCacheTTL || 60 * 60 * 1000; // 1 hour default\n this._attemptCacheCleanupInterval = setInterval(() => {\n const now = Date.now();\n this.loginAttemptCache.forEach((v, k) => {\n if (v.expiresAt && v.expiresAt <= now) this.loginAttemptCache.delete(k);\n });\n this.ipAttemptCache.forEach((v, k) => {\n if (v.expiresAt && v.expiresAt <= now) this.ipAttemptCache.delete(k);\n });\n }, Math.max(30 * 1000, this._attemptCacheTTL / 4));\n\n // simple audit logger (avoid writing secrets). Use structured object for later integration with logging systems.\n this.audit = function (event: string, meta?: any) {\n try {\n const safeMeta = Object.assign({}, meta || {});\n // redact sensitive keys if present\n if (safeMeta.token) safeMeta.token = \"[REDACTED]\";\n if (safeMeta.password) safeMeta.password = \"[REDACTED]\";\n if (safeMeta.passwordHash) safeMeta.passwordHash = \"[REDACTED]\";\n if (safeMeta.signingSecret) safeMeta.signingSecret = \"[REDACTED]\";\n console.warn(\n JSON.stringify({\n ts: new Date().toISOString(),\n event,\n meta: safeMeta,\n })\n );\n } catch (e) {}\n };\n\n // worker pools\n this._bcryptWorkers = [];\n this._bcryptNext = 0;\n this._bcryptPending = new Map();\n const defaultBcrypt = Math.max(1, Math.min(4, Math.floor(cpuCount / 2)));\n this.bcryptPoolSize =\n typeof options.bcryptPoolSize === \"number\"\n ? options.bcryptPoolSize\n : defaultBcrypt;\n this.bcryptMaxPoolSize =\n options.bcryptMaxPoolSize || Math.max(4, this.bcryptPoolSize * 4);\n \n for (let i = 0; i < this.bcryptPoolSize; i++) {\n const w = new Worker(path.join(__dirname, \"workers\", \"bcrypt-worker.js\"));\n w.on(\"message\", (m) => {\n const p = this._bcryptPending.get(m.id);\n if (p) {\n const start = p.start || 0;\n const lat = start ? Date.now() - start : 0;\n if (lat > 0)\n this._recordLatency(\n this._bcryptLatencies,\n lat,\n this._bcryptLatencyWindow\n );\n clearTimeout(p.timer);\n this._bcryptPending.delete(m.id);\n if (m.error) {\n this._bcryptFailures.push(Date.now());\n p.reject(new Error(m.error));\n } else {\n p.resolve(m.ok);\n }\n }\n // opportunistic autoscale\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n w.on(\"error\", (e) => {\n console.error(\"bcrypt worker error\", (e && (e as Error).message));\n this._bcryptFailures.push(Date.now());\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n this._bcryptWorkers.push(w);\n }\n\n // bcrypt metrics and simple latency window\n this._bcryptLatencies = [];\n this._bcryptLatencyWindow = options.bcryptLatencyWindow || 100; // keep last N latencies\n\n // bcrypt circuit-breaker\n this._bcryptFailures = [];\n this._bcryptFailureWindowMs = options.bcryptFailureWindowMs || 60 * 1000; // 1min\n this._bcryptFailureThreshold = options.bcryptFailureThreshold || 5; // trips after N failures in window\n this._bcryptCircuitCooldownMs =\n options.bcryptCircuitCooldownMs || 2 * 60 * 1000; // 2min\n this._bcryptTrippedUntil = 0;\n\n // token verification cache (LRU) to reduce jwt.verify calls\n this._tokenVerifyCache = new LRUCache({ max: 1000, ttl: 1000 * 60 * 5 }); // 5m default\n\n // attach optional storage instance if provided (so server.metrics can reference compact state)\n this.storage = options.storage || null;\n\n // alerting thresholds\n this.alertPendingThreshold =\n typeof options.alertPendingThreshold === \"number\"\n ? options.alertPendingThreshold\n : 50;\n\n // optional VM worker pool\n this._vmWorkers = [];\n this._vmNext = 0;\n this._vmPending = new Map();\n this._vmLatencies = [];\n this._vmLatencyWindow = options.vmLatencyWindow || 100;\n this._vmFailures = [];\n this._vmFailureWindowMs = options.vmFailureWindowMs || 60 * 1000;\n this._vmFailureThreshold = options.vmFailureThreshold || 3;\n this._vmCircuitCooldownMs = options.vmCircuitCooldownMs || 2 * 60 * 1000;\n this._vmTrippedUntil = 0;\n \n if (options.vmWorkerPoolSize && options.vmWorkerPoolSize > 0) {\n const defaultVmPool = Math.max(\n 0,\n Math.min(2, Math.max(1, Math.floor(cpuCount / 2)) - 1)\n );\n const vmPool =\n typeof options.vmWorkerPoolSize === \"number\"\n ? options.vmWorkerPoolSize\n : defaultVmPool;\n \n for (let i = 0; i < vmPool; i++) {\n const w = new Worker(path.join(__dirname, \"vm-worker.js\"));\n // init VM worker\n w.postMessage({\n id: `init-${i}`,\n action: \"init\",\n options: {\n baseDir: options.folder\n ? path.join(getBasePath ? getBasePath() : process.cwd(), options.folder)\n : undefined,\n },\n });\n \n w.on(\"message\", (m) => {\n const p = this._vmPending.get(m.id);\n if (p) {\n const start = p.start || 0;\n const lat = start ? Date.now() - start : 0;\n if (lat > 0)\n this._recordLatency(\n this._vmLatencies,\n lat,\n this._vmLatencyWindow\n );\n clearTimeout(p.timer);\n this._vmPending.delete(m.id);\n if (m.error) {\n this._vmFailures.push(Date.now());\n p.reject(new Error(m.error));\n } else {\n p.resolve(m.res);\n }\n }\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n \n w.on(\"error\", (e) => {\n console.error(\"vm worker error\", (e && (e as Error).message));\n this._vmFailures.push(Date.now());\n try {\n this._autoscalePools();\n } catch (e) {}\n });\n this._vmWorkers.push(w);\n }\n }\n\n // validator worker pool (offload heavy validate/sanitize)\n this._validatorWorkers = [];\n this._validatorNext = 0;\n this._validatorPending = new Map();\n const validatorPoolSize = options.validatorPoolSize || 0;\n this.validatorPoolSize = validatorPoolSize;\n this._validatorLatencies = [];\n this._validatorLatencyWindow = options.validatorLatencyWindow || 100;\n this._validatorFailures = [];\n this._validatorFailureWindowMs =\n options.validatorFailureWindowMs || 60 * 1000;\n this._validatorFailureThreshold = options.validatorFailureThreshold || 5;\n this._validatorCircuitCooldownMs =\n options.validatorCircuitCooldownMs || 2 * 60 * 1000;\n this._validatorTrippedUntil = 0;\n \n if (validatorPoolSize > 0) {\n for (let i = 0; i < validatorPoolSize; i++) {\n const vw = new Worker(path.join(__dirname, \"validator-worker.js\"));\n vw.on(\"message\", (m) => {\n const p = this._validatorPending.get(m.id);\n if (p) {\n const start = p.start || 0;\n const lat = start ? Date.now() - start : 0;\n if (lat > 0)\n this._recordLatency(\n this._validatorLatencies,\n lat,\n this._validatorLatencyWindow\n );\n clearTimeout(p.timer);\n this._validatorPending.delete(m.id);\n if (m.error) {\n this._validatorFailures.push(Date.now());\n p.reject(new Error(m.error));\n } else {\n p.resolve(m.res);\n }\n }\n });\n vw.on(\"error\", (e) => {\n console.error(\"validator worker error\", (e && (e as Error).message));\n this._validatorFailures.push(Date.now());\n });\n this._validatorWorkers.push(vw);\n }\n }\n\n // metrics\n this.metrics = {\n bcryptPending: () => this._bcryptPending.size,\n vmPending: () => this._vmPending.size,\n vmWorkers: () => this._vmWorkers.length,\n activeConnections: 0,\n validatorPending: () => this._validatorPending.size,\n validatorWorkers: () => this._validatorWorkers.length,\n bcryptAvgLatency: () => {\n const a = this._bcryptLatencies;\n return a.length ? a.reduce((s, v) => s + v, 0) / a.length : 0;\n },\n vmAvgLatency: () => {\n const a = this._vmLatencies;\n return a.length ? a.reduce((s, v) => s + v, 0) / a.length : 0;\n },\n validatorAvgLatency: () => {\n const a = this._validatorLatencies;\n return a.length ? a.reduce((s, v) => s + v, 0) / a.length : 0;\n },\n compactActive: () =>\n this.storage && this.storage._compactActive\n ? this.storage._compactActive\n : 0,\n compactTripped: () =>\n this.storage &&\n this.storage._compactTrippedUntil &&\n Date.now() < this.storage._compactTrippedUntil\n ? true\n : false,\n };\n\n // connection limits\n this.maxConnections = options.maxConnections || 1000;\n this.backlog = options.backlog || 128;\n\n // worker timeouts\n this.bcryptWorkerTimeoutMs = options.bcryptWorkerTimeoutMs || 5000;\n this.vmWorkerTimeoutMs =\n options.vmWorkerTimeoutMs ||\n (options.runTimeoutMs ? options.runTimeoutMs + 500 : 5000);\n\n // autoscale check interval (for bcrypt & vm pools)\n this._autoscaleIntervalMs = options.autoscaleIntervalMs || 2000;\n this._autoscaleTimer = null;\n }\n\n // simple helper to record latency into a fixed window\n _recordLatency(arr: number[], val: number, cap: number) {\n try {\n arr.push(val);\n if (arr.length > cap) arr.shift();\n } catch (e) {}\n }\n\n // check and perform simple autoscaling for bcrypt pool\n _autoscalePools() {\n try {\n // bcrypt: scale up if pending queue depth is large\n const pending = this._bcryptPending.size;\n const workers = this._bcryptWorkers.length;\n if (pending > workers * 2 && workers < this.bcryptMaxPoolSize) {\n // spawn one worker\n const w = new Worker(path.join(__dirname, \"workers\", \"bcrypt-worker.js\"));\n w.on(\"message\", (m) => {\n const p = this._bcryptPending.get(m.id);\n if (p) {\n clearTimeout(p.timer);\n this._bcryptPending.delete(m.id);\n if (m.error) p.reject(new Error(m.error));\n else p.resolve(m.ok);\n }\n });\n w.on(\"error\", (e) => {\n console.error(\"bcrypt worker error (autoscale)\", (e && (e as Error).message));\n });\n this._bcryptWorkers.push(w);\n }\n // alert if exceptionally high backlog\n if (pending > Math.max(this.alertPendingThreshold, workers * 5)) {\n try {\n this.audit(\"queue.high\", { type: \"bcrypt\", pending, workers });\n } catch (e) {}\n }\n \n // vm: scale up similarly (only if configured to allow dynamic expansion)\n const vmPending = this._vmPending.size;\n const vmWorkers = this._vmWorkers.length;\n const vmMax = Math.max(\n this._vmWorkers.length,\n this.vmMaxPoolSize || this._vmWorkers.length + 4\n );\n \n if (vmPending > vmWorkers * 2 && vmWorkers < vmMax) {\n const w = new Worker(path.join(__dirname, \"vm-worker.js\"));\n w.postMessage({\n id: `init-auto-${Date.now()}`,\n action: \"init\",\n options: { baseDir: undefined },\n });\n \n w.on(\"message\", (m) => {\n const p = this._vmPending.get(m.id);\n if (p) {\n clearTimeout(p.timer);\n this._vmPending.delete(m.id);\n if (m.error) p.reject(new Error(m.error));\n else p.resolve(m.res);\n }\n });\n \n w.on(\"error\", (e) => {\n console.error(\"vm worker error (autoscale)\", (e && (e as Error).message));\n });\n this._vmWorkers.push(w);\n }\n \n if (vmPending > Math.max(this.alertPendingThreshold, vmWorkers * 5)) {\n try {\n this.audit(\"queue.high\", {\n type: \"vm\",\n pending: vmPending,\n workers: vmWorkers,\n });\n } catch (e) {}\n }\n } catch (e) {}\n }\n\n start() {\n const createListener = async (socket: net.Socket | tls.TLSSocket) => {\n // enforce connection limit\n if (this.metrics.activeConnections >= this.maxConnections) {\n try {\n socket.end();\n } catch (e) {}\n return;\n }\n this.metrics.activeConnections++;\n console.log(\"Client connected\");\n \n // do not store the socket on the server instance (multiple clients)\n // handle socket errors to avoid crashing the server when clients disconnect abruptly\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", (err && (err as Error).message) ? (err as Error).message : err);\n });\n \n socket.on(\"close\", (hadError: boolean) => {\n // informative log; don't throw\n console.log(\"Socket closed\", hadError ? \"(due to error)\" : \"\");\n this.metrics.activeConnections = Math.max(\n 0,\n this.metrics.activeConnections - 1\n );\n });\n \n // support multiple JSON messages over the same socket by using newline-delimited JSON (NDJSON)\n let recvBuf = \"\";\n let messagesReceived = 0;\n socket.setTimeout(this.CONNECTION_TIMEOUT_MS);\n \n socket.on(\"timeout\", () => {\n try {\n sendWithBackpressure({ command: \"error\", message: \"TIMEOUT\" });\n } catch (e) {}\n socket.end();\n });\n\n // helper to write JSON respecting backpressure\n const sendWithBackpressure = (obj: any) => {\n try {\n const s = JSON.stringify(obj) + \"\\n\";\n console.log('sendWithBackpressure: sending message to socket:', socket.remoteAddress, socket.remotePort, ':', s.trim());\n const ok = socket.write(s);\n console.log('sendWithBackpressure: write returned:', ok);\n if (!ok) {\n socket.pause();\n socket.once(\"drain\", () => socket.resume());\n }\n } catch (e) {\n console.error('sendWithBackpressure error:', e);\n }\n };\n\n // Async version for critical messages that need to be delivered\n const sendCritical = (obj: any): Promise<void> => {\n return new Promise((resolve, reject) => {\n try {\n const s = JSON.stringify(obj) + \"\\n\";\n console.log('sendCritical writing:', s.trim());\n socket.write(s, (err) => {\n if (err) {\n console.error('sendCritical write error:', err);\n return reject(err);\n }\n console.log('sendCritical write callback called, waiting 50ms...');\n // Give time for OS to flush the write buffer\n setTimeout(() => {\n console.log('sendCritical resolved after 50ms');\n resolve();\n }, 50);\n });\n } catch (e) {\n console.error('sendCritical exception:', e);\n reject(e);\n }\n });\n };\n\n socket.on(\"data\", async (data: Buffer) => {\n // enforce per-message size limit\n if (data.length > this.MAX_MESSAGE_BYTES) {\n try {\n sendWithBackpressure({\n command: \"error\",\n message: \"MSG_TOO_LARGE\",\n });\n } catch (e) {}\n socket.end();\n return;\n }\n \n recvBuf += data.toString();\n let idx;\n while ((idx = recvBuf.indexOf(\"\\n\")) !== -1) {\n if (++messagesReceived > this.MAX_MESSAGES_PER_CONNECTION) {\n try {\n sendWithBackpressure({\n command: \"error\",\n message: \"TOO_MANY_MESSAGES\",\n });\n } catch (e) {}\n socket.end();\n return;\n }\n \n const line = recvBuf.slice(0, idx).trim();\n recvBuf = recvBuf.slice(idx + 1);\n if (!line) continue;\n \n let object: any;\n try {\n object = JSON.parse(line);\n } catch (err) {\n console.error(\n \"Invalid JSON from client:\",\n (err && (err as Error).message) ? (err as Error).message : err\n );\n try {\n sendWithBackpressure({\n command: \"error\",\n message: \"INVALID_JSON\",\n });\n } catch (e) {}\n // do not close immediately; continue to next message\n continue;\n }\n\n // Support both 'command' and 'action' fields for compatibility\n const commandOrAction = object.command || object.action;\n\n switch (commandOrAction) {\n case \"login\":\n // Check secure mode\n const username = object.data?.username || '';\n const password = object.data?.password || '';\n \n console.log('Login attempt:', { username, hasPassword: !!password, objectId: object.id, secure: this.secure });\n \n // If secure mode is false, allow anonymous access automatically\n if (!this.secure) {\n console.log('Secure mode disabled - allowing anonymous access');\n const secretToUse = this.getEffectiveSecret();\n const token = jwt.sign(\n { username: username || '', role: 'anonymous' },\n secretToUse,\n { expiresIn: '24h' }\n );\n \n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH OK\",\n data: { token },\n });\n console.log('Anonymous AUTH OK sent (secure=false)');\n } catch (e) {\n console.error('Error sending AUTH OK:', e);\n }\n break;\n }\n \n // Secure mode is true - username and password are REQUIRED\n if (!username || !password) {\n console.log('Secure mode enabled - credentials required but not provided');\n try {\n await sendCritical({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH FAIL\",\n data: \"Username and password are required in secure mode\",\n });\n console.log('AUTH FAIL message sent and flushed, now closing socket...');\n // Close socket after message is sent\n socket.end();\n console.log('Socket closed after AUTH FAIL');\n } catch (e) {\n console.error('Error sending AUTH FAIL:', e);\n socket.end();\n }\n return;\n }\n\n // rate-limit per-IP (enforced). Use a per-IP limiter and await schedule.\n const remoteIP =\n (socket as any).remoteAddress || (socket as any).remoteAddress || \"unknown\";\n try {\n const ipLimiter = this.ipLimiterGroup.key(remoteIP);\n await ipLimiter.schedule(() => Promise.resolve());\n } catch (e) {\n // If limiter scheduling fails, audit and continue\n this.audit(\"limiter.schedule.error\", {\n ip: remoteIP,\n err: ((e as Error) && (e as Error).message) || String(e),\n });\n }\n\n // bump per-IP counter (only if IP lockout is enabled)\n if (this.ENABLE_IP_LOCKOUT) {\n const nowTs = Date.now();\n const ipRec = this.ipAttemptCache.get(remoteIP) || {\n attempts: 0,\n lockedUntil: 0,\n expiresAt: nowTs + this._attemptCacheTTL,\n };\n ipRec.attempts = (ipRec.attempts || 0) + 1;\n ipRec.expiresAt = nowTs + this._attemptCacheTTL;\n // if IP exceeds attempts threshold, lock it\n if (ipRec.attempts >= this.MAX_LOGIN_ATTEMPTS) {\n ipRec.lockedUntil = nowTs + this.LOCK_DURATION_MS;\n this.audit(\"ip.lockout\", {\n ip: remoteIP,\n attempts: ipRec.attempts,\n });\n }\n this.ipAttemptCache.set(remoteIP, ipRec);\n if (ipRec.lockedUntil && ipRec.lockedUntil > nowTs) {\n this.audit(\"ip.locked\", { ip: remoteIP });\n try {\n sendWithBackpressure({\n command: \"login\",\n message: \"LOCKED_IP\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n }\n\n // simple account lockout\n const now = Date.now();\n const record = this.loginAttemptCache.get(username) || {\n attempts: 0,\n lockedUntil: 0,\n expiresAt: now + this._attemptCacheTTL,\n };\n if (record.lockedUntil && record.lockedUntil > now) {\n try {\n sendWithBackpressure({\n command: \"login\",\n message: \"LOCKED\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n\n // find user record\n const user = this.users.find((u) => u.username === username);\n if (!user) {\n // increment attempts and set expiry\n record.attempts = (record.attempts || 0) + 1;\n record.expiresAt = Date.now() + this._attemptCacheTTL;\n if (record.attempts >= this.MAX_LOGIN_ATTEMPTS) {\n record.lockedUntil = now + this.LOCK_DURATION_MS;\n // observe failed auth\n this.audit(\"login.lockout\", { user: username, ip: remoteIP });\n }\n this.loginAttemptCache.set(username, record);\n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH FAIL\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n\n // Debug: log user found and password received\n console.log('User found:', {\n username: user.username,\n hasPassword: !!user.password,\n passwordValue: user.password,\n hash: user.hash,\n algorithm: user.algorithm\n });\n console.log('Password received:', password);\n\n // Check if using plain password or hashed password\n let matches = false;\n \n // Determine authentication method based on user config\n if (user.hash === false && user.password) {\n // Plain password comparison (hash disabled)\n console.log('Using plain password authentication (hash: false)');\n matches = user.password === password;\n } else if (user.hash === true && user.password) {\n // Need to hash the password first based on algorithm\n console.log('Using password hashing with algorithm:', user.algorithm || 'bcrypt');\n const algorithm = user.algorithm || 'bcrypt';\n \n if (algorithm === 'bcrypt') {\n // Use bcrypt worker for hashing and comparison\n const doBcryptCompare = (password: string, hash: string): Promise<boolean> =>\n new Promise((resolve, reject) => {\n if (!this._bcryptWorkers || this._bcryptWorkers.length === 0)\n return resolve(false);\n \n const id = Math.random().toString(36).slice(2);\n const wIndex =\n this._bcryptNext++ % this._bcryptWorkers.length;\n const start = Date.now();\n const timer = setTimeout(() => {\n const p = this._bcryptPending.get(id);\n if (p) {\n this._bcryptPending.delete(id);\n p.reject(new Error(\"bcrypt worker timeout\"));\n }\n try {\n this._bcryptWorkers[wIndex].terminate();\n } catch (e) {}\n const nw = new Worker(\n path.join(__dirname, \"workers\", \"bcrypt-worker.js\")\n );\n this._bcryptWorkers[wIndex] = nw;\n }, this.bcryptWorkerTimeoutMs);\n \n this._bcryptPending.set(id, {\n resolve,\n reject,\n timer,\n start,\n });\n \n try {\n this._bcryptWorkers[wIndex].postMessage({\n id,\n password,\n hash,\n });\n } catch (e) {\n clearTimeout(timer);\n this._bcryptPending.delete(id);\n return resolve(false);\n }\n });\n \n try {\n // Hash the stored password if it's not already hashed\n // For now, we'll assume user.password is the plain text to compare\n // In production, you should pre-hash passwords and store in passwordHash\n matches = user.password === password;\n } catch (e) {\n matches = false;\n }\n } else if (algorithm === 'sha256' || algorithm === 'sha512') {\n // Use crypto for SHA hashing\n const hashedPassword = crypto.createHash(algorithm).update(password).digest('hex');\n matches = user.password === hashedPassword;\n }\n }\n \n if (!matches) {\n record.attempts = (record.attempts || 0) + 1;\n record.expiresAt = Date.now() + this._attemptCacheTTL;\n if (record.attempts >= this.MAX_LOGIN_ATTEMPTS) {\n record.lockedUntil = now + this.LOCK_DURATION_MS;\n this.audit(\"login.lockout\", { user: username, ip: remoteIP });\n }\n this.loginAttemptCache.set(username, record);\n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH FAIL\",\n data: null,\n });\n } catch (e) {}\n break;\n }\n\n // reset attempts on success\n this.loginAttemptCache.delete(username);\n\n // sign token using serverSecret (with fallback for dev mode)\n let token: string;\n try {\n token = jwt.sign({ username: user.username }, this.getEffectiveSecret(), {\n expiresIn: \"1d\",\n });\n } catch (e) {\n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"ERROR\",\n data: { error: ((e as Error) && (e as Error).message) || String(e) },\n });\n } catch (e) {}\n break;\n }\n \n try {\n sendWithBackpressure({\n id: object.id,\n action: \"login\",\n command: \"login\",\n message: \"AUTH OK\",\n data: { token },\n });\n } catch (e) {}\n break;\n \n case \"script-code\":\n console.log(\"script-code command\", object);\n \n try {\n // accept token either at top-level or inside data\n const token =\n object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n\n // guard: token size cap (avoid huge tokens)\n if (\n typeof token === \"string\" &&\n Buffer.byteLength(token, \"utf8\") > 4096\n )\n throw new Error(\"Token too large\");\n \n const decodedUnverified = jwt.decode(token) as any;\n if (!decodedUnverified)\n throw new Error(\"Invalid token payload\");\n \n // For anonymous users, username might be empty but role should be \"anonymous\"\n const username = decodedUnverified.username || (decodedUnverified.role === 'anonymous' ? '' : null);\n if (username === null)\n throw new Error(\"Invalid token payload\");\n\n // Find user record, allow anonymous if secure is disabled\n const userRecord = this.users.find(\n (u) => u.username === username\n );\n if (!userRecord) {\n // Allow anonymous access if secure mode is disabled\n if (username === '' && !this.secure) {\n // Continue with anonymous user\n } else {\n throw new Error(\"Unknown user\");\n }\n }\n\n // Verify token using serverSecret\n let decoded: any;\n // check cache first\n const cacheKey = `${token}:${this.serverSecret}`;\n const cached = this._tokenVerifyCache.get(cacheKey);\n if (cached) {\n decoded = cached;\n } else {\n try {\n decoded = jwt.verify(token, this.getEffectiveSecret());\n this._tokenVerifyCache.set(cacheKey, decoded);\n } catch (eServer) {\n this.audit(\"jwt.verify.failed\", {\n user: username,\n });\n throw new Error(\"Invalid token after verify\");\n }\n }\n if (!decoded)\n throw new Error(\"Invalid token after verify\");\n\n console.log('script-code: token verified, checking VM...');\n \n // now run the vm command\n if (!this.vm || typeof this.vm.run !== \"function\") {\n console.error('script-code: VM not available');\n sendWithBackpressure({\n command: \"script-code\",\n message: \"ERROR\",\n data: \"VM_NOT_AVAILABLE\",\n });\n break;\n }\n \n console.log('script-code: VM available, preparing data...');\n \n // Validate and sanitize payload before passing to VM. Only allow a constrained shape.\n const data =\n object.data && typeof object.data === \"object\"\n ? object.data\n : {};\n \n // offload heavy validation to validator worker when available to avoid blocking\n const validateViaWorker = (payload: any): Promise<any> =>\n new Promise((resolve, reject) => {\n try {\n if (\n !this._validatorWorkers ||\n this._validatorWorkers.length === 0\n )\n return resolve(null);\n // circuit-breaker: if validator tripped, refuse\n if (Date.now() < (this._validatorTrippedUntil || 0))\n return resolve(null);\n const wIndex =\n this._validatorNext++ % this._validatorWorkers.length;\n const w = this._validatorWorkers[wIndex];\n const id = Math.random().toString(36).slice(2);\n const timer = setTimeout(\n () => {\n const p = this._validatorPending.get(id);\n if (p) {\n this._validatorPending.delete(id);\n p.reject(new Error(\"validator worker timeout\"));\n }\n try {\n w.terminate();\n } catch (e) {}\n // mark failure\n this._validatorFailures.push(Date.now());\n // if failures exceed threshold in window, trip\n const recent = this._validatorFailures.filter(\n (t) =>\n t > Date.now() - this._validatorFailureWindowMs\n );\n if (recent.length >= this._validatorFailureThreshold)\n this._validatorTrippedUntil =\n Date.now() + this._validatorCircuitCooldownMs;\n },\n this._validatorTimeoutMs || 3000\n );\n this._validatorPending.set(id, {\n resolve,\n reject,\n timer,\n start: Date.now(),\n });\n w.postMessage({\n id,\n action: \"validate\",\n payload,\n options: {\n schema: this.payloadSchema,\n maxDepth: this._payloadMaxDepth,\n maxNodes: this._payloadMaxNodes,\n },\n });\n } catch (e) {\n return resolve(null);\n }\n });\n\n const sanitizeViaWorker = (payload: any): Promise<any> =>\n new Promise((resolve, reject) => {\n try {\n if (\n !this._validatorWorkers ||\n this._validatorWorkers.length === 0\n )\n return resolve(null);\n if (Date.now() < (this._validatorTrippedUntil || 0))\n return resolve(null);\n const wIndex =\n this._validatorNext++ % this._validatorWorkers.length;\n const w = this._validatorWorkers[wIndex];\n const id = Math.random().toString(36).slice(2);\n const timer = setTimeout(\n () => {\n const p = this._validatorPending.get(id);\n if (p) {\n this._validatorPending.delete(id);\n p.reject(new Error(\"validator worker timeout\"));\n }\n try {\n w.terminate();\n } catch (e) {}\n this._validatorFailures.push(Date.now());\n const recent = this._validatorFailures.filter(\n (t) =>\n t > Date.now() - this._validatorFailureWindowMs\n );\n if (recent.length >= this._validatorFailureThreshold)\n this._validatorTrippedUntil =\n Date.now() + this._validatorCircuitCooldownMs;\n },\n this._validatorTimeoutMs || 3000\n );\n this._validatorPending.set(id, {\n resolve,\n reject,\n timer,\n start: Date.now(),\n });\n w.postMessage({\n id,\n action: \"sanitize\",\n payload,\n options: {\n allowedKeys: [\n \"result\",\n \"value\",\n \"items\",\n \"length\",\n \"status\",\n \"message\",\n ],\n maxNodes: this._sanitizeMaxNodes,\n maxDepth: this._sanitizeMaxDepth,\n maxString: this._sanitizeMaxString,\n },\n });\n } catch (e) {\n return resolve(null);\n }\n });\n\n const localValidate = (payload: any) => {\n const out: any = {};\n let nodes = 0;\n const checkDepth = (obj: any, depth: number): boolean => {\n if (depth > this._payloadMaxDepth) return false;\n if (nodes++ > this._payloadMaxNodes) return false;\n if (obj && typeof obj === \"object\") {\n for (const k of Object.keys(obj)) {\n const expected = (this.payloadSchema || {})[k];\n if (!expected) continue; // not allowed\n const val = obj[k];\n if (expected === \"string\" && typeof val === \"string\")\n out[k] = val;\n else if (\n expected === \"number\" &&\n typeof val === \"number\"\n )\n out[k] = val;\n else if (\n expected === \"object\" &&\n val &&\n typeof val === \"object\"\n ) {\n if (depth + 1 <= this._payloadMaxDepth) {\n out[k] = {};\n for (const nk of Object.keys(val)) {\n if ((this.payloadSchema || {})[nk])\n out[k][nk] = val[nk];\n }\n }\n }\n }\n return true;\n }\n return false;\n };\n if (!checkDepth(payload, 0)) return {};\n return out;\n };\n\n // Try validator worker first (if present), otherwise fallback to local validate\n let allowed: any = {};\n try {\n if (\n this._validatorWorkers &&\n this._validatorWorkers.length > 0\n ) {\n const res = await Promise.race([\n validateViaWorker(data).catch(() => null),\n new Promise((r) => setTimeout(() => r(null), 1500)),\n ]);\n if (res && typeof res === \"object\") allowed = res;\n else allowed = localValidate(data);\n } else {\n allowed = localValidate(data);\n }\n } catch (e) {\n allowed = localValidate(data);\n }\n \n console.log('script-code: validation complete, allowed keys:', Object.keys(allowed));\n \n // if no allowed fields and schema required, reject\n if (Object.keys(allowed).length === 0) {\n console.error('script-code: empty payload after validation');\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: \"INVALID_PAYLOAD\",\n });\n } catch (e) {}\n break;\n }\n\n // Ensure the VM runs in a promise. If VM worker pool exists, dispatch to a worker.\n const runInVmWorker = (payload: any): Promise<any> =>\n new Promise((resolve, reject) => {\n if (!this._vmWorkers || this._vmWorkers.length === 0)\n return resolve(null);\n const wIndex = this._vmNext++ % this._vmWorkers.length;\n const w = this._vmWorkers[wIndex];\n const id = Math.random().toString(36).slice(2);\n const timer = setTimeout(() => {\n const p = this._vmPending.get(id);\n if (p) {\n this._vmPending.delete(id);\n p.reject(new Error(\"vm worker timeout\"));\n }\n try {\n w.terminate();\n } catch (e) {}\n // replace worker\n const nw = new Worker(\n path.join(__dirname, \"vm-worker.js\")\n );\n nw.on(\"message\", (m) => {\n const p = this._vmPending.get(m.id);\n if (p) {\n clearTimeout(p.timer);\n this._vmPending.delete(m.id);\n if (m.error) p.reject(new Error(m.error));\n else p.resolve(m.res);\n }\n });\n this._vmWorkers[wIndex] = nw;\n }, this.vmWorkerTimeoutMs);\n this._vmPending.set(id, {\n resolve,\n reject,\n timer,\n start: Date.now(),\n });\n try {\n w.postMessage({ id, action: \"run\", payload });\n } catch (e) {\n clearTimeout(timer);\n this._vmPending.delete(id);\n return resolve(null);\n }\n });\n\n // Extract code and databaseName from allowed object\n const code = allowed.code;\n const databaseName = allowed.databaseName;\n \n if (!code || typeof code !== 'string') {\n console.error('script-code: invalid code type');\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: \"Missing or invalid code\",\n });\n } catch (e) {}\n break;\n }\n\n console.log('script-code: running code for database:', databaseName);\n \n const runPromise =\n this._vmWorkers && this._vmWorkers.length > 0\n ? runInVmWorker(code)\n : Promise.resolve(this.vm.run(code, databaseName));\n\n console.log('script-code: calling VM...');\n \n // handle runPromise resolution and sanitize via validator worker when possible\n Promise.resolve(runPromise)\n .then(async (res) => {\n console.log('script-code: VM returned result:', typeof res);\n try {\n let out: any;\n if (\n this._validatorWorkers &&\n this._validatorWorkers.length > 0\n ) {\n try {\n const wres = await Promise.race([\n sanitizeViaWorker(res).catch(() => null),\n new Promise((r) => setTimeout(() => r(null), 1500)),\n ]);\n out = wres && typeof wres === \"object\" ? wres : null;\n } catch (e) {\n out = null;\n }\n }\n if (!out) {\n // fallback local sanitize\n const allowedKeys = [\n \"result\",\n \"value\",\n \"items\",\n \"length\",\n \"status\",\n \"message\",\n \"namespace\",\n \"logs\",\n // Log object properties\n \"type\",\n \"args\",\n // Database properties\n \"name\",\n \"id\",\n \"data\",\n \"properties\",\n \"fields\",\n \"records\",\n \"rows\",\n \"columns\",\n // Allow database name from request\n databaseName,\n ];\n let nodes = 0;\n const rec = (input: any, depth = 0, isTopLevel = false, path: string[] = []): any => {\n if (nodes++ > this._sanitizeMaxNodes)\n return \"[REDACTED_NODES]\";\n if (depth > this._sanitizeMaxDepth)\n return \"[REDACTED_DEPTH]\";\n if (input === null || input === undefined)\n return input;\n if (typeof input === \"string\") {\n if (input.length > this._sanitizeMaxString)\n return (\n input.slice(0, this._sanitizeMaxString) +\n \"...[TRUNC]\"\n );\n return input;\n }\n if (\n typeof input === \"number\" ||\n typeof input === \"boolean\"\n )\n return input;\n if (typeof input === \"function\") {\n // Allow functions inside namespace (user exports)\n const isInsideNamespace = path.includes('namespace');\n if (isInsideNamespace) {\n return `[Function: ${input.name || 'anonymous'}]`;\n }\n return \"[REDACTED]\";\n }\n if (Array.isArray(input))\n return input.map((v) => rec(v, depth + 1, false, path));\n if (typeof input === \"object\") {\n const out2: any = {};\n // Check if we're inside namespace or logs\n const isInsideNamespace = path.includes('namespace');\n const isInsideLogs = path.includes('logs');\n for (const k of Object.keys(input)) {\n // At top level, allow all keys for maximum flexibility\n // Also allow all keys inside 'namespace' and 'logs' objects\n if (isTopLevel || allowedKeys.includes(k) || isInsideNamespace || isInsideLogs) {\n out2[k] = rec(input[k], depth + 1, false, [...path, k]);\n } else {\n out2[k] = \"[REDACTED]\";\n }\n }\n return out2;\n }\n return \"[REDACTED]\";\n };\n out = rec(res, 0, true, []);\n }\n console.log('script-code: sanitized result:', typeof out, out);\n try {\n console.log('script-code: sending OK response with id:', object.id);\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"OK\",\n data: out,\n });\n } catch (e) {\n console.error('script-code: failed to send OK response:', e);\n }\n } catch (e) {\n console.error('script-code: error during sanitize:', e);\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: ((e as Error) && (e as Error).message) || String(e),\n });\n } catch (ee) {}\n }\n })\n .catch((err) => {\n console.error('script-code: VM error:', err);\n try {\n sendWithBackpressure({\n id: object.id,\n command: \"script-code\",\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error('script-code: failed to send ERROR response:', e);\n }\n });\n } catch (err) {\n try {\n await sendCritical({\n command: \"script-code\",\n message: \"AUTH FAIL\",\n data: ((err as Error) && (err as Error).message) || null,\n });\n console.log('Token verification AUTH FAIL sent and flushed - client will close');\n // Don't close socket - let client handle it after receiving message\n } catch (e) {\n console.error('Error sending token AUTH FAIL:', e);\n }\n return;\n }\n // Handle script-code command\n break;\n \n case \"create-db\":\n console.log(\"create-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n const username = decoded.username || decoded.role || 'anonymous';\n \n // Get database name\n const databaseName = object.data?.databaseName;\n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n \n // Validate database name\n if (!/^[a-zA-Z0-9_-]+$/.test(databaseName)) {\n throw new Error(\"Invalid database name. Use only alphanumeric characters, hyphens, and underscores.\");\n }\n \n // Create database file using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n console.log(`Creating database: ${databaseName} for user: ${username}`);\n \n // Create initial database content\n const initialContent = `// Database: ${databaseName}\\n// Created: ${new Date().toISOString()}\\n// Author: ${username}\\n\\nexport const ${databaseName} = {};\\n`;\n \n const result = await this.storage.addFile(`${databaseName}.ts`, initialContent);\n \n console.log('Storage addFile result:', result);\n \n if (!result.success) {\n throw new Error(result.message);\n }\n \n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n databaseName,\n path: result.path,\n message: `Database '${databaseName}' created successfully`\n },\n });\n } catch (err) {\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {}\n }\n break;\n \n case \"list-dbs\":\n console.log(\"list-dbs command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n console.log(\"list-dbs: verifying token...\");\n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n console.log(\"list-dbs: token verified, listing files...\");\n // Get list of database files\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n const files = await this.storage.listFiles();\n console.log(\"list-dbs: found files:\", files);\n \n // Filter only .ts files and remove extension\n const databases = files\n .filter((file: string) => file.endsWith('.ts'))\n .map((file: string) => {\n const name = file.replace(/\\.ts$/, '');\n return { name, path: file };\n });\n \n console.log(\"list-dbs: sending response with\", databases.length, \"databases\");\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n databases,\n count: databases.length\n },\n });\n } catch (err) {\n console.error(\"list-dbs ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n \n case \"remove-db\":\n console.log(\"remove-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n const username = decoded.username || decoded.role || 'anonymous';\n \n // Get database name\n const databaseName = object.data?.databaseName;\n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n \n // Delete database file using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n console.log(`Removing database: ${databaseName} by user: ${username}`);\n \n const result = await this.storage.deleteFile(`${databaseName}.ts`);\n \n console.log('Storage deleteFile result:', result);\n \n if (!result.success) {\n throw new Error(result.message);\n }\n \n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n databaseName,\n message: `Database '${databaseName}' removed successfully`\n },\n });\n } catch (err) {\n console.error(\"remove-db ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n \n case \"rename-db\":\n console.log(\"rename-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n \n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n \n const username = decoded.username || decoded.role || 'anonymous';\n \n // Get database names\n const databaseName = object.data?.databaseName;\n const newName = object.data?.newName;\n \n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n if (!newName || typeof newName !== 'string') {\n throw new Error(\"Missing or invalid newName\");\n }\n \n // Validate new database name\n if (!/^[a-zA-Z0-9_-]+$/.test(newName)) {\n throw new Error(\"Invalid new database name. Use only alphanumeric characters, hyphens, and underscores.\");\n }\n \n // Rename database file using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n \n console.log(`Renaming database: ${databaseName} to ${newName} by user: ${username}`);\n \n // Read old file content\n const getResult = await this.storage.getFile(`${databaseName}.ts`);\n if (!getResult.success) {\n throw new Error(getResult.message || `Database '${databaseName}' not found`);\n }\n \n // Update content with new name in comments and exports\n let content = getResult.content || '';\n content = content\n .replace(new RegExp(`// Database: ${databaseName}`, 'g'), `// Database: ${newName}`)\n .replace(new RegExp(`export const ${databaseName}`, 'g'), `export const ${newName}`);\n \n // Create new file\n const addResult = await this.storage.addFile(`${newName}.ts`, content);\n if (!addResult.success) {\n throw new Error(addResult.message);\n }\n \n // Delete old file\n const deleteResult = await this.storage.deleteFile(`${databaseName}.ts`);\n if (!deleteResult.success) {\n // Rollback: delete the new file\n await this.storage.deleteFile(`${newName}.ts`);\n throw new Error(deleteResult.message);\n }\n \n console.log('Database renamed successfully');\n \n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n oldName: databaseName,\n newName: newName,\n message: `Database '${databaseName}' renamed to '${newName}' successfully`\n },\n });\n } catch (err) {\n console.error(\"rename-db ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n \n case \"get-db\":\n console.log(\"get-db command\", object);\n try {\n // Verify token first\n const token = object.token || (object.data && object.data.token);\n if (!token) throw new Error(\"Missing token\");\n\n // Verify token\n const decoded = jwt.verify(token, this.getEffectiveSecret()) as any;\n if (!decoded) throw new Error(\"Invalid token\");\n\n // Get database name\n const databaseName = object.data?.databaseName;\n if (!databaseName || typeof databaseName !== 'string') {\n throw new Error(\"Missing or invalid databaseName\");\n }\n\n // Get database file content using storage\n if (!this.storage) {\n throw new Error(\"Storage not available\");\n }\n\n console.log(`Getting database: ${databaseName}`);\n\n const result = await this.storage.getFile(`${databaseName}.ts`);\n\n console.log('Storage getFile result:', result);\n\n if (!result.success) {\n throw new Error(result.message);\n }\n\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"SUCCESS\",\n data: {\n success: true,\n databaseName,\n content: result.content || '',\n path: result.path\n },\n });\n } catch (err) {\n console.error(\"get-db ERROR:\", err);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: ((err as Error) && (err as Error).message) || String(err),\n });\n } catch (e) {\n console.error(\"Failed to send error response:\", e);\n }\n }\n break;\n\n case \"save-db\":\n case \"update-db\":\n case \"get-info\":\n console.log(`Command ${commandOrAction} not yet implemented`);\n try {\n sendWithBackpressure({\n id: object.id,\n action: commandOrAction,\n command: commandOrAction,\n message: \"ERROR\",\n data: `Command ${commandOrAction} not yet implemented in protocol server`,\n });\n } catch (e) {}\n break;\n \n default:\n console.log('Unknown command:', commandOrAction, 'object:', object);\n socket.write(\n JSON.stringify({\n command: \"error\",\n message: \"UNKNOWN_COMMAND\",\n }) + \"\\n\"\n );\n socket.end();\n return;\n }\n }\n });\n \n socket.on(\"end\", () => {\n console.log(\"Client disconnected\");\n });\n };\n\n // enforce TLS in production if required\n if (this.requireTlsInProduction && process.env.NODE_ENV === \"production\") {\n if (!(this.tlsOptions && (this.tlsOptions.key || this.tlsOptions.cert))) {\n throw new Error(\n \"TLS is required in production but tlsOptions are not configured\"\n );\n }\n }\n\n // create actual server (TLS if configured)\n let serverImpl: net.Server | tls.Server;\n if (this.tlsOptions && (this.tlsOptions.key || this.tlsOptions.cert)) {\n const tlsOpts = Object.assign({}, this.tlsOptions);\n // allow paths to key/cert\n try {\n if (typeof tlsOpts.key === \"string\" && fs.existsSync(tlsOpts.key))\n tlsOpts.key = fs.readFileSync(tlsOpts.key);\n if (typeof tlsOpts.cert === \"string\" && fs.existsSync(tlsOpts.cert))\n tlsOpts.cert = fs.readFileSync(tlsOpts.cert);\n } catch (e) {}\n serverImpl = tls.createServer(tlsOpts, createListener);\n } else {\n serverImpl = net.createServer(createListener);\n }\n\n this.server = serverImpl;\n\n this.server.listen(this.port, this.host, () => {\n // If a user is configured with username/password, include credentials in the URI for convenience.\n let cred = \"\";\n try {\n if (this.users && Array.isArray(this.users) && this.users.length > 0) {\n const u: User = this.users[0] || { username: \"\" };\n const uname = u.username || null;\n // Mask password with asterisks for security\n if (uname && typeof u.password === \"string\" && u.password) {\n cred =\n encodeURIComponent(String(uname)) +\n \":\" +\n \"*****\" +\n \"@\";\n } else if (uname) {\n cred = encodeURIComponent(String(uname)) + \"@\";\n }\n }\n } catch (e) {\n /* ignore and show no creds */\n }\n console.log(\n `Server listening on scriptdb://${cred}${this.host}:${this.port}`\n );\n // start autoscale timer\n try {\n if (!this._autoscaleTimer && this._autoscaleIntervalMs > 0) {\n this._autoscaleTimer = setInterval(() => {\n try {\n this._autoscalePools();\n } catch (e) {}\n }, this._autoscaleIntervalMs);\n }\n } catch (e) {}\n });\n \n this.server.on(\"close\", () => {\n try {\n if (this._autoscaleTimer) {\n clearInterval(this._autoscaleTimer);\n this._autoscaleTimer = null;\n }\n } catch (e) {}\n });\n }\n}\n\nexport default Protocal;","import * as fs from \"fs\";\n\nexport function getBasePath() {\n // เมื่อเรียกจากไฟล์ที่อยู่ใน root (เช่น index.js) __dirname จะเป็น project base\n return fs.realpathSync(\".\");\n // หรือถ้าต้องการแน่นอนจาก process working dir:\n // return process.cwd();\n}\n\nexport default getBasePath;","import * as os from \"os\";\nimport * as path from \"path\";\n\n/**\n * Gets the home directory path for the current user\n * @returns The absolute path to the user's home directory\n */\nexport function getHomeDir(): string {\n return os.homedir();\n}\n\n/**\n * Gets the path to a file or directory relative to the user's home directory\n * @param relativePath - The path relative to the home directory\n * @returns The absolute path to the specified location in the home directory\n */\nexport function getHomePath(relativePath: string): string {\n return path.join(getHomeDir(), relativePath);\n}\n\n/**\n * Gets the path to the user's Documents directory\n * @returns The absolute path to the Documents folder\n */\nexport function getDocumentsDir(): string {\n const platform = os.platform();\n \n if (platform === 'win32') {\n return getHomePath('Documents');\n } else if (platform === 'darwin') {\n return getHomePath('Documents');\n } else {\n // For Linux and other Unix-like systems\n const xdgDocs = process.env.XDG_DOCUMENTS_DIR;\n if (xdgDocs) {\n return xdgDocs;\n }\n return getHomePath('Documents');\n }\n}\n\n/**\n * Gets the path to the user's Downloads directory\n * @returns The absolute path to the Downloads folder\n */\nexport function getDownloadsDir(): string {\n const platform = os.platform();\n \n if (platform === 'win32') {\n return getHomePath('Downloads');\n } else if (platform === 'darwin') {\n return getHomePath('Downloads');\n } else {\n // For Linux and other Unix-like systems\n return getHomePath('Downloads');\n }\n}\n\n/**\n * Gets the path to the user's Desktop directory\n * @returns The absolute path to the Desktop folder\n */\nexport function getDesktopDir(): string {\n const platform = os.platform();\n \n if (platform === 'win32') {\n return getHomePath('Desktop');\n } else if (platform === 'darwin') {\n return getHomePath('Desktop');\n } else {\n // For Linux and other Unix-like systems\n const xdgDesktop = process.env.XDG_DESKTOP_DIR;\n if (xdgDesktop) {\n return xdgDesktop;\n }\n return getHomePath('Desktop');\n }\n}\n\n/**\n * Creates a ScriptDB directory in the user's home directory\n * @param dirName - Optional custom directory name (defaults to 'scriptdb')\n * @returns The path to the created ScriptDB directory\n */\nexport function createScriptDBDir(dirName: string = 'scriptdb'): string {\n const scriptdbPath = getHomePath(dirName);\n \n const fs = require('fs');\n if (!fs.existsSync(scriptdbPath)) {\n fs.mkdirSync(scriptdbPath, { recursive: true });\n }\n \n return scriptdbPath;\n}\n\n/**\n * Gets the default ScriptDB directory path\n * @returns The path to the ScriptDB directory in the user's home folder\n */\nexport function getScriptDBDir(): string {\n return getHomePath('scriptdb');\n}\n\n/**\n * Checks if a path exists in the user's home directory\n * @param relativePath - The path relative to the home directory to check\n * @returns True if the path exists, false otherwise\n */\nexport function homePathExists(relativePath: string): boolean {\n const fs = require('fs');\n return fs.existsSync(getHomePath(relativePath));\n}\n\nexport default {\n getHomeDir,\n getHomePath,\n getDocumentsDir,\n getDownloadsDir,\n getDesktopDir,\n createScriptDBDir,\n getScriptDBDir,\n homePathExists\n};","import { Protocal } from \"./protocal\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport VM from \"@scriptdb/vm\";\nimport { Storage } from \"@scriptdb/storage\";\nimport { getHomeDir } from \"./utils/homeDir\";\nimport { setupDir } from \"./utils/setupDir\";\nimport { createWebSocketProxy } from \"./wsProxy\";\nimport SystemModuleResolver from \"@scriptdb/system-modules\";\n\n// Type definitions\ninterface User {\n username: string;\n password?: string;\n hash?: boolean;\n algorithm?: 'bcrypt' | 'sha256' | 'sha512';\n}\n\ninterface Config {\n host: string;\n port: number;\n users: User[];\n folder: string;\n secure?: boolean;\n}\n\ninterface ParsedConfig {\n host?: string;\n port?: number;\n users?: User[] | string[] | User;\n folder?: string;\n secure?: boolean;\n}\n\n// Helper to print error and exit\nfunction exitWithError(message: string, err?: Error | unknown): void {\n console.error(message);\n if (err) console.error(err);\n process.exit(1);\n}\n\nexport async function server(): Promise<void> {\n // กำหนดค่า base path สำหรับ VM\n let basePath = path.join(getHomeDir(), '.scriptdb');\n\n // Setup directory structure (จะตรวจสอบและสร้างไฟล์ที่จำเป็นถ้ายังไม่มี)\n try {\n console.log(\"Setting up scriptdb directory...\");\n await setupDir();\n console.log(\"Setup complete\");\n } catch (err) {\n exitWithError(\"Failed to setup scriptdb directory\", err);\n }\n\n console.log(\"Loading configuration...\");\n let config: Config = {\n host: \"localhost\",\n port: 1234,\n users: [\n {\n username: \"\",\n password: undefined,\n },\n ],\n folder: \"databases\",\n secure: false,\n };\n\n // Read config file if present (safely)\n const configPath: string = path.join(basePath, \"config.json\");\n if (fs.existsSync(configPath)) {\n try {\n const fileContent: string = fs.readFileSync(configPath, \"utf8\");\n const parsed: unknown = JSON.parse(fileContent);\n if (parsed && typeof parsed === \"object\") {\n const parsedConfig = parsed as ParsedConfig;\n // Only merge known top-level keys to avoid injecting unexpected values\n const allowed: Partial<Config> = {};\n if (typeof parsedConfig.host === 'string') allowed.host = parsedConfig.host;\n if (parsedConfig.port !== undefined) allowed.port = parsedConfig.port;\n if (parsedConfig.users !== undefined) {\n // Normalize users to User[] format\n if (Array.isArray(parsedConfig.users)) {\n if (parsedConfig.users.length === 0) {\n allowed.users = [];\n } else if (typeof parsedConfig.users[0] === 'string') {\n // string[] format: convert to User[] with hash=false\n allowed.users = (parsedConfig.users as string[]).map((username: string) => ({\n username,\n password: '',\n hash: false\n }));\n } else {\n // Already User[] format\n allowed.users = parsedConfig.users as User[];\n }\n } else {\n // Single User object, wrap in array\n allowed.users = [parsedConfig.users as User];\n }\n }\n if (typeof parsedConfig.folder === 'string') allowed.folder = parsedConfig.folder;\n if (typeof parsedConfig.secure === 'boolean') allowed.secure = parsedConfig.secure;\n config = { ...config, ...allowed };\n } else {\n console.warn(\"config.json parsed to a non-object, ignoring\");\n }\n } catch (err) {\n console.warn(\"Failed to read/parse config.json, using defaults:\", err);\n }\n }\n\n // Normalize and validate config values\n if (typeof config.port === \"string\") {\n const p = parseInt(config.port, 10);\n if (!Number.isNaN(p)) config.port = p;\n }\n if (!Number.isFinite(config.port)) config.port = 1234;\n // validate port range\n if (config.port < 1 || config.port > 65535) {\n console.warn('Configured port out of range, falling back to 1234');\n config.port = 1234;\n }\n // Normalize users: allow a single object, array of objects, or array of strings\n if (!Array.isArray(config.users)) {\n if (config.users && typeof config.users === \"object\") config.users = [config.users];\n else config.users = [{ username: \"\", password: undefined }];\n }\n config.users = config.users.map((u: any): User => {\n if (!u) return { username: \"\", password: undefined };\n if (typeof u === 'string') return { username: u, password: undefined };\n if (typeof u === 'object') {\n return {\n username: typeof u.username === 'string' ? u.username : \"\",\n password: typeof u.password === 'string' ? u.password : undefined,\n hash: typeof u.hash === 'boolean' ? u.hash : undefined,\n algorithm: (u.algorithm === 'bcrypt' || u.algorithm === 'sha256' || u.algorithm === 'sha512') ? u.algorithm : undefined,\n };\n }\n return { username: \"\", password: undefined };\n });\n\n // Ensure the configured folder exists and is a directory\n const baseDir: string = path.resolve(basePath, String(config.folder || \"databases\")); // โฟลเดอร์ที่อนุญาต\n const pluginDir: string = path.resolve(basePath, \"plugins\"); // โฟลเดอร์ที่อนุญาตสำหรับปลั๊กอิน\n try {\n if (!fs.existsSync(baseDir)) {\n fs.mkdirSync(baseDir, { recursive: true });\n console.log(`Created folder for databases at ${baseDir}`);\n } else if (!fs.statSync(baseDir).isDirectory()) {\n exitWithError(`Configured folder exists but is not a directory: ${baseDir}`);\n }\n } catch (err) {\n exitWithError(\"Failed to ensure database folder exists\", err);\n }\n\n // Initialize VM and server with defensive checks\n let vm: any;\n try {\n // VM constructor expects an options object with a `language` and `registerModules` properties.\n vm = new VM({ language: 'ts', registerModules: {} });\n\n // DatabaseManager and PluginManager are async, must await them\n console.log(\"Loading databases and plugins into VM...\");\n const systemModules = await SystemModuleResolver();\n // vm.register(databases);\n vm.register(systemModules);\n // vm.register(plugins);\n console.log(\"VM initialized with databases and plugins\");\n } catch (err) {\n exitWithError(\"Failed to initialize VM\", err);\n }\n\n // Initialize Storage with git at basePath (not baseDir)\n let storage: Storage | null = null;\n try {\n storage = new Storage(baseDir, basePath); // Pass basePath as gitRoot\n await storage.initialize();\n console.log(`Storage initialized at ${baseDir} (git at ${basePath})`);\n } catch (err) {\n exitWithError(\"Failed to initialize Storage\", err);\n }\n\n // Ensure storage was initialized\n if (!storage) {\n exitWithError(\"Storage was not initialized\");\n }\n\n let scriptDBServer: any;\n try {\n scriptDBServer = new Protocal({\n host: config.host,\n port: config.port,\n users: config.users,\n vm: vm,\n storage: storage,\n });\n if (typeof scriptDBServer.start !== \"function\") {\n exitWithError(\"Protocal.start is not a function\");\n }\n scriptDBServer.start();\n console.log(`ScriptDB server started on ${config.host}:${config.port}`);\n } catch (err) {\n exitWithError(\"Failed to start Protocal\", err);\n }\n\n // Start WebSocket proxy for browser clients\n try {\n const wsPort = config.port + 1;\n await createWebSocketProxy({\n wsPort,\n scriptdbHost: config.host,\n scriptdbPort: config.port,\n secure: config.secure !== undefined ? config.secure : false,\n logger: {\n debug: console.log,\n info: console.log,\n warn: console.warn,\n error: console.error,\n },\n });\n console.log(`WebSocket proxy started on port ${wsPort}`);\n } catch (err) {\n console.warn(\"Failed to start WebSocket proxy (browser support disabled)\", err);\n }\n}\n\nexport default server;","import Bun from \"bun\";\nimport vm from \"node:vm\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\ninterface VMOptions {\n language?: 'ts' | 'js';\n registerModules?: { [key: string]: any };\n}\n\nexport class VM {\n private transpiler: Bun.Transpiler;\n private ctx: vm.Context;\n private registerModules: { [key: string]: any };\n private DATABASE_DIR = path.join(os.homedir(), '.scriptdb', 'databases');\n private SCRIPTDB_DIR = path.join(os.homedir(), '.scriptdb');\n private pkgScriptDB: { dependencies?: Record<string, string> } = {};\n constructor(options?: VMOptions) {\n // Ensure directories exist\n if (!fs.existsSync(this.DATABASE_DIR)) {\n fs.mkdirSync(this.DATABASE_DIR, { recursive: true });\n }\n if (!fs.existsSync(this.SCRIPTDB_DIR)) {\n fs.mkdirSync(this.SCRIPTDB_DIR, { recursive: true });\n }\n\n // Load scriptdb workspace package.json if it exists\n const pkgPath = path.join(this.SCRIPTDB_DIR, 'package.json');\n if (fs.existsSync(pkgPath)) {\n this.pkgScriptDB = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n }\n this.transpiler = new Bun.Transpiler({\n loader: options?.language || 'ts',\n });\n\n\n\n this.registerModules = options?.registerModules || {};\n\n this.ctx = vm.createContext(this.registerModules);\n\n\n }\n\n register(context: { [key: string]: any }) {\n this.registerModules = { ...this.registerModules, ...context };\n // Register any custom modules or plugins here if needed\n this.ctx = vm.createContext(this.registerModules);\n }\n\n resolvePath(fileList: any[], query: string) {\n const aliases = { '@db': this.DATABASE_DIR };\n \n let resolvedPath = query;\n for (const [alias, target] of Object.entries(aliases)) {\n if (resolvedPath.startsWith(alias + '/')) {\n resolvedPath = resolvedPath.replace(alias, target);\n break;\n }\n }\n\n // Normalize path separators for cross-platform compatibility\n resolvedPath = path.normalize(resolvedPath);\n\n return fileList.find(file => {\n const normalizedFile = path.normalize(file);\n const fileWithoutExt = normalizedFile.replace(/\\.[^/.]+$/, \"\");\n return normalizedFile === resolvedPath || \n fileWithoutExt === resolvedPath || \n normalizedFile === resolvedPath + '.ts' || \n normalizedFile === resolvedPath + '.js';\n });\n }\n\n async moduleLinker(specifier: any, referencingModule: any) {\n // Try database files first\n const dbFiles = fs.readdirSync(this.DATABASE_DIR)\n .filter(f => f.endsWith(\".ts\"))\n .map(f => path.join(this.DATABASE_DIR, f));\n\n const dbResult = this.resolvePath(dbFiles, specifier);\n if (dbResult) {\n try {\n const actualModule = await import(dbResult);\n const exportNames = Object.keys(actualModule);\n return new vm.SyntheticModule(\n exportNames,\n function () {\n exportNames.forEach(key => {\n this.setExport(key, actualModule[key]);\n });\n },\n { identifier: specifier, context: referencingModule.context }\n );\n } catch (err) {\n console.error(`Failed to load database module ${specifier}:`, err);\n throw err;\n }\n }\n\n // Try workspace packages\n const allowedPackages = Object.keys(this.pkgScriptDB.dependencies || {});\n if (allowedPackages.includes(specifier)) {\n try {\n // Import from scriptdb workspace node_modules\n const modulePath = path.join(this.SCRIPTDB_DIR, 'node_modules', specifier);\n const actualModule = await import(modulePath);\n const exportNames = Object.keys(actualModule);\n return new vm.SyntheticModule(\n exportNames,\n function () {\n exportNames.forEach(key => {\n this.setExport(key, actualModule[key]);\n });\n },\n { identifier: specifier, context: referencingModule.context }\n );\n } catch (err) {\n console.error(`Failed to load workspace module ${specifier}:`, err);\n throw err;\n }\n }\n\n throw new Error(`Module ${specifier} is not allowed or not found.`);\n }\n\n async run(code: string, options?: vm.RunningCodeOptions | string) {\n // Remove import statements since modules are already registered in context\n // import { testdb } from 'testdb' -> testdb is already available in this.ctx\n // const importRegex = /^\\s*import\\s+\\{?\\s*([^}]+?)\\s*\\}?\\s+from\\s+['\"]([^'\"]+)['\"]\\s*;?\\s*$/gm;\n // const importMatches = code.match(importRegex);\n // const importCode = importMatches ? importMatches.join('\\n') : '';\n\n\n // const codeWithoutImports = code.replace(importRegex, '').trim();\n\n // // Wrap code in async function\n // const wrappedCode = `(async () => {\\n${codeWithoutImports}\\n})()`;\n\n const logs: any[] = [];\n\n const customConsole = ['log', 'error', 'warn', 'info', 'debug', 'trace'].reduce((acc: any, type: any) => {\n acc[type] = (...args: any[]) => logs.push({ type, args });\n return acc;\n }, {});\n\n this.register({\n console: customConsole\n });\n\n\n const js = this.transpiler.transformSync(code);\n const mod = new vm.SourceTextModule(js, { context: this.ctx, identifier: path.join(this.SCRIPTDB_DIR, 'virtual-entry.js') });\n await mod.link(this.moduleLinker.bind(this));\n await mod.evaluate();\n\n return {\n namespace: mod.namespace,\n logs: logs\n }\n }\n}\n\n\nexport default VM;","// TypeScript Sandbox Storage module\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { simpleGit, SimpleGit } from 'simple-git';\n\nexport interface GitConfig {\n userName?: string;\n userEmail?: string;\n options?: Record<string, string>;\n}\n\nexport interface RepoStatus {\n staged: string[];\n unstaged: string[];\n untracked: string[];\n clean: boolean;\n error?: string;\n}\n\nexport interface RemoteInfo {\n name: string;\n refs: string;\n pushUrl: string;\n}\n\nexport interface CommitHistory {\n hash: string;\n message: string;\n date: string;\n author: string;\n}\n\nexport class Storage {\n private repoPath: string;\n private gitRoot: string;\n private repo: SimpleGit | null = null;\n\n constructor(repoPath: string, gitRoot?: string) {\n this.repoPath = repoPath;\n this.gitRoot = gitRoot || repoPath; // Default to repoPath if gitRoot not specified\n }\n\n async initialize(repoPath: string | null = null): Promise<SimpleGit> {\n try {\n // Update repoPath if provided\n if (repoPath) {\n this.repoPath = repoPath;\n }\n \n // Create repository directory if it doesn't exist\n if (!fs.existsSync(this.repoPath)) {\n fs.mkdirSync(this.repoPath, { recursive: true });\n }\n\n // Initialize simple-git at gitRoot (not repoPath)\n this.repo = simpleGit(this.gitRoot);\n\n // Check if it's already a git repository at gitRoot\n if (!fs.existsSync(path.join(this.gitRoot, '.git'))) {\n // Initialize a new repository at gitRoot\n try {\n await this.repo.init();\n // Set up basic configuration\n await this.setupBasicConfig();\n } catch (error: any) {\n throw new Error(`Failed to initialize git repository: ${error.message}`);\n }\n }\n \n return this.repo;\n } catch (error: any) {\n throw new Error(`Failed to initialize repository: ${error.message}`);\n }\n }\n\n async addFile(filePath: string, content: string): Promise<{ success: boolean; message: string; path?: string }> {\n try {\n const fullPath = path.join(this.repoPath, filePath);\n const dir = path.dirname(fullPath);\n \n // Create directory if it doesn't exist\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n \n // Write file content\n fs.writeFileSync(fullPath, content);\n \n // Add file to git using relative path from gitRoot\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n const gitRelativePath = path.relative(this.gitRoot, fullPath);\n await this.repo.add(gitRelativePath);\n \n return {\n success: true,\n message: `File ${filePath} added successfully`,\n path: fullPath\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to add file: ${error.message}`\n };\n }\n }\n\n async updateFile(filePath: string, content: string): Promise<{ success: boolean; message: string; path?: string }> {\n try {\n const fullPath = path.join(this.repoPath, filePath);\n \n if (!fs.existsSync(fullPath)) {\n return {\n success: false,\n message: `File ${filePath} does not exist`\n };\n }\n \n // Update file content\n fs.writeFileSync(fullPath, content);\n \n // Stage the changes using relative path from gitRoot\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n const gitRelativePath = path.relative(this.gitRoot, fullPath);\n await this.repo.add(gitRelativePath);\n \n return {\n success: true,\n message: `File ${filePath} updated successfully`,\n path: fullPath\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to update file: ${error.message}`\n };\n }\n }\n\n async getFile(filePath: string): Promise<{ success: boolean; content?: string; path?: string; message?: string }> {\n try {\n const fullPath = path.join(this.repoPath, filePath);\n \n if (!fs.existsSync(fullPath)) {\n return {\n success: false,\n message: `File ${filePath} does not exist`\n };\n }\n \n const content = fs.readFileSync(fullPath, 'utf8');\n \n return {\n success: true,\n content: content,\n path: fullPath\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to read file: ${error.message}`\n };\n }\n }\n\n async deleteFile(filePath: string): Promise<{ success: boolean; message: string }> {\n try {\n const fullPath = path.join(this.repoPath, filePath);\n \n if (!fs.existsSync(fullPath)) {\n return {\n success: false,\n message: `File ${filePath} does not exist`\n };\n }\n \n // Remove file\n fs.unlinkSync(fullPath);\n \n // Stage the deletion using relative path from gitRoot\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n const gitRelativePath = path.relative(this.gitRoot, fullPath);\n await this.repo.add(gitRelativePath);\n \n return {\n success: true,\n message: `File ${filePath} deleted successfully`\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to delete file: ${error.message}`\n };\n }\n }\n\n async commit(message: string): Promise<{ success: boolean; message: string }> {\n try {\n // Check if there are staged changes\n const status = await this.getStatus();\n if (status.staged.length === 0) {\n return {\n success: false,\n message: 'No staged changes to commit'\n };\n }\n \n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n await this.repo.commit(message);\n \n return {\n success: true,\n message: 'Changes committed successfully'\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to commit changes: ${error.message}`\n };\n }\n }\n\n async getStatus(): Promise<RepoStatus> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n const status = await this.repo.status();\n \n const staged: string[] = [];\n const unstaged: string[] = [];\n const untracked: string[] = [];\n \n // Process modified files\n status.modified.forEach(file => {\n unstaged.push(file);\n });\n \n // Process created files\n status.created.forEach(file => {\n staged.push(file);\n });\n \n // Process deleted files\n status.deleted.forEach(file => {\n unstaged.push(file);\n });\n \n // Process renamed files\n status.renamed.forEach(file => {\n staged.push(file.to);\n });\n \n // Process untracked files\n status.not_added.forEach(file => {\n untracked.push(file);\n });\n \n // Process staged files\n status.staged.forEach(file => {\n staged.push(file);\n });\n \n return {\n staged,\n unstaged,\n untracked,\n clean: status.isClean()\n };\n } catch (error: any) {\n return {\n staged: [],\n unstaged: [],\n untracked: [],\n clean: false,\n error: error.message\n };\n }\n }\n\n async getHistory(filePath: string): Promise<CommitHistory[]> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n const log = await this.repo.log({ file: filePath });\n \n return log.all.map(commit => ({\n hash: commit.hash.substring(0, 7),\n message: commit.message || '',\n date: commit.date || '',\n author: commit.author_name || ''\n }));\n } catch (error: any) {\n return [];\n }\n }\n\n /**\n * Set Git configuration values\n * @param config - Configuration object\n * @param scope - Configuration scope ('local', 'global', 'system')\n * @returns Result of the operation\n */\n async setConfig(config: GitConfig, scope: 'local' | 'global' | 'system' = 'local'): Promise<{ success: boolean; message: string; changes?: any[] }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n const results: any[] = [];\n \n // Set user name if provided\n if (config.userName) {\n await this.repo.raw(['config', `--${scope}`, 'user.name', config.userName]);\n results.push({ key: 'user.name', value: config.userName, scope });\n }\n \n // Set user email if provided\n if (config.userEmail) {\n await this.repo.raw(['config', `--${scope}`, 'user.email', config.userEmail]);\n results.push({ key: 'user.email', value: config.userEmail, scope });\n }\n \n // Set additional options if provided\n if (config.options && typeof config.options === 'object') {\n for (const [key, value] of Object.entries(config.options)) {\n await this.repo.raw(['config', `--${scope}`, key, value]);\n results.push({ key, value, scope });\n }\n }\n \n return {\n success: true,\n message: `Configuration updated successfully`,\n changes: results\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to set configuration: ${error.message}`\n };\n }\n }\n\n /**\n * Get Git configuration value\n * @param key - Configuration key (e.g., 'user.name')\n * @param scope - Configuration scope ('local', 'global', 'system')\n * @returns Result containing the configuration value\n */\n async getConfig(key: string, scope: 'local' | 'global' | 'system' = 'local'): Promise<{ success: boolean; key?: string; value?: string; scope?: string; message?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n const result = await this.repo.raw(['config', `--${scope}`, '--get', key]);\n \n return {\n success: true,\n key,\n value: result.trim(),\n scope\n };\n } catch (error: any) {\n // If the key doesn't exist, return a more helpful message\n if (error.message.includes('exit code: 1')) {\n return {\n success: false,\n message: `Configuration key '${key}' not found in ${scope} scope`\n };\n }\n \n return {\n success: false,\n message: `Failed to get configuration for ${key}: ${error.message}`\n };\n }\n }\n\n /**\n * Get all Git configuration values\n * @param scope - Configuration scope ('local', 'global', 'system')\n * @returns Result containing all configuration values\n */\n async listConfig(scope: 'local' | 'global' | 'system' = 'local'): Promise<{ success: boolean; scope: string; config?: any; message?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n const result = await this.repo.raw(['config', `--${scope}`, '--list']);\n const lines = result.trim().split('\\n');\n const config: any = {};\n \n lines.forEach(line => {\n const [key, value] = line.split('=');\n if (key) {\n config[key] = value || '';\n }\n });\n \n return {\n success: true,\n scope,\n config\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to list configuration: ${error.message}`,\n scope\n };\n }\n }\n\n /**\n * Set up a basic configuration for the repository\n * @param userName - User name (optional, defaults to 'Sandbox Storage')\n * @param userEmail - User email (optional, defaults to 'sandbox@example.com')\n * @param additionalConfig - Additional configuration options (optional)\n * @returns Result of the operation\n */\n async setupBasicConfig(userName = 'Sandbox Storage', userEmail = 'sandbox@example.com', additionalConfig: Record<string, string> = {}): Promise<{ success: boolean; message: string }> {\n const config: GitConfig = {\n userName,\n userEmail,\n options: {\n 'core.autocrlf': 'false', // Important for cross-platform compatibility\n 'core.filemode': 'false', // Important for cross-platform compatibility\n ...additionalConfig\n }\n };\n \n return this.setConfig(config, 'local');\n }\n\n /**\n * Add a remote repository\n * @param name - Remote name (e.g., 'origin')\n * @param url - Remote repository URL\n * @returns Result of the operation\n */\n async addRemote(name: string, url: string): Promise<{ success: boolean; message: string; name?: string; url?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n await this.repo.addRemote(name, url);\n \n return {\n success: true,\n message: `Remote '${name}' added successfully`,\n name,\n url\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to add remote '${name}': ${error.message}`\n };\n }\n }\n\n /**\n * Remove a remote repository\n * @param name - Remote name to remove\n * @returns Result of the operation\n */\n async removeRemote(name: string): Promise<{ success: boolean; message: string; name?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n await this.repo.removeRemote(name);\n \n return {\n success: true,\n message: `Remote '${name}' removed successfully`,\n name\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to remove remote '${name}': ${error.message}`\n };\n }\n }\n\n /**\n * List all remote repositories\n * @returns Result containing the list of remotes\n */\n async listRemotes(): Promise<{ success: boolean; remotes: RemoteInfo[]; message?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n const remotes = await this.repo.getRemotes(true);\n \n return {\n success: true,\n remotes: remotes.map(remote => ({\n name: remote.name,\n refs: remote.refs.fetch,\n pushUrl: remote.refs.push\n }))\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to list remotes: ${error.message}`,\n remotes: []\n };\n }\n }\n\n /**\n * Push changes to a remote repository\n * @param remote - Remote name (defaults to 'origin')\n * @param branch - Branch to push (defaults to current branch)\n * @param options - Additional options\n * @returns Result of the operation\n */\n async push(remote = 'origin', branch = 'main', options: { force?: boolean; setUpstream?: boolean } = {}): Promise<{ success: boolean; message: string; remote?: string; branch?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n // Check if remote exists\n const remotes = await this.listRemotes();\n const remoteExists = remotes.remotes.some(r => r.name === remote);\n \n if (!remoteExists) {\n return {\n success: false,\n message: `Remote '${remote}' does not exist`\n };\n }\n\n // Get current branch if branch not specified\n if (!branch || branch === 'current') {\n try {\n const status = await this.repo.status();\n branch = status.current || 'main';\n } catch {\n branch = 'main';\n }\n }\n\n // Prepare push options\n const pushOptions: any = {};\n \n if (options.force) {\n pushOptions['--force'] = null;\n }\n \n // For first push, set upstream\n if (options.setUpstream !== false) {\n pushOptions['-u'] = null;\n }\n\n // Execute push\n await this.repo.push(remote, branch, pushOptions);\n \n return {\n success: true,\n message: `Successfully pushed to ${remote}/${branch}`,\n remote,\n branch\n };\n } catch (error: any) {\n // Handle specific errors\n if (error.message.includes('could not find remote') || error.message.includes('does not appear to be a git repository')) {\n return {\n success: false,\n message: `Remote '${remote}' does not exist or is not a valid git repository`\n };\n }\n \n if (error.message.includes('authentication failed')) {\n return {\n success: false,\n message: `Authentication failed. Please check your credentials.`\n };\n }\n \n return {\n success: false,\n message: `Failed to push to ${remote}/${branch}: ${error.message}`\n };\n }\n }\n\n /**\n * Pull changes from a remote repository\n * @param remote - Remote name (defaults to 'origin')\n * @param branch - Branch to pull from (defaults to current branch)\n * @param options - Additional options\n * @returns Result of the operation\n */\n async pull(remote = 'origin', branch = 'main', options: { allowUnrelatedHistories?: boolean } = {}): Promise<{ success: boolean; message: string; remote?: string; branch?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n // Check if remote exists\n const remotes = await this.listRemotes();\n const remoteExists = remotes.remotes.some(r => r.name === remote);\n \n if (!remoteExists) {\n return {\n success: false,\n message: `Remote '${remote}' does not exist`\n };\n }\n\n // Get current branch if branch not specified\n if (!branch || branch === 'current') {\n try {\n const status = await this.repo.status();\n branch = status.current || 'main';\n } catch {\n branch = 'main';\n }\n }\n\n // Prepare pull options\n const pullOptions: any = [];\n \n if (options.allowUnrelatedHistories) {\n pullOptions.push('--allow-unrelated-histories');\n }\n\n // Execute pull\n await this.repo.pull(remote, branch, pullOptions);\n \n return {\n success: true,\n message: `Successfully pulled from ${remote}/${branch}`,\n remote,\n branch\n };\n } catch (error: any) {\n // Handle specific errors\n if (error.message.includes('could not find remote')) {\n return {\n success: false,\n message: `Remote '${remote}' does not exist`\n };\n }\n \n if (error.message.includes('authentication failed')) {\n return {\n success: false,\n message: `Authentication failed. Please check your credentials.`\n };\n }\n \n if (error.message.includes('conflict')) {\n return {\n success: false,\n message: `Merge conflict occurred. Please resolve conflicts manually.`\n };\n }\n \n return {\n success: false,\n message: `Failed to pull from ${remote}/${branch}: ${error.message}`\n };\n }\n }\n\n /**\n * Fetch changes from a remote repository without merging\n * @param remote - Remote name (defaults to 'origin')\n * @param branch - Branch to fetch (defaults to 'main')\n * @param options - Additional options\n * @returns Result of the operation\n */\n async fetch(remote = 'origin', branch = 'main', options: { prune?: boolean } = {}): Promise<{ success: boolean; message: string; remote?: string; branch?: string }> {\n try {\n if (!this.repo) {\n throw new Error('Repository not initialized. Call initialize() first.');\n }\n \n // Check if remote exists\n const remotes = await this.listRemotes();\n const remoteExists = remotes.remotes.some(r => r.name === remote);\n \n if (!remoteExists) {\n return {\n success: false,\n message: `Remote '${remote}' does not exist`\n };\n }\n\n // Prepare fetch options\n const fetchOptions: any = {};\n \n if (options.prune) {\n fetchOptions['--prune'] = null;\n }\n\n // Execute fetch\n await this.repo.fetch(remote, branch, fetchOptions);\n \n return {\n success: true,\n message: `Successfully fetched from ${remote}/${branch}`,\n remote,\n branch\n };\n } catch (error: any) {\n // Handle specific errors\n if (error.message.includes('could not find remote')) {\n return {\n success: false,\n message: `Remote '${remote}' does not exist`\n };\n }\n \n if (error.message.includes('authentication failed')) {\n return {\n success: false,\n message: `Authentication failed. Please check your credentials.`\n };\n }\n \n return {\n success: false,\n message: `Failed to fetch from ${remote}/${branch}: ${error.message}`\n };\n }\n }\n\n /**\n * Clone a remote repository\n * @param url - Repository URL to clone\n * @param targetPath - Directory to clone into (optional)\n * @param options - Additional options\n * @returns Result of the operation\n */\n async clone(url: string, targetPath: string | null = null, options: { bare?: boolean; branch?: string; depth?: number } = {}): Promise<{ success: boolean; message: string; url?: string; path?: string }> {\n try {\n // Use provided target path or the current repo path\n const clonePath = targetPath || this.repoPath;\n \n // Clone the repository using simple-git\n const cloneOptions: any = {};\n \n if (options.bare) {\n cloneOptions['--bare'] = null;\n }\n \n if (options.branch) {\n cloneOptions['--branch'] = options.branch;\n }\n \n if (options.depth) {\n cloneOptions['--depth'] = options.depth.toString();\n }\n \n // Use simple-git's clone method\n const git = simpleGit();\n await git.clone(url, clonePath, cloneOptions);\n \n // Update the repoPath if we used the default path\n if (!targetPath) {\n this.repoPath = clonePath;\n this.repo = simpleGit(clonePath);\n }\n \n return {\n success: true,\n message: `Repository cloned successfully from ${url}`,\n url,\n path: clonePath\n };\n } catch (error: any) {\n return {\n success: false,\n message: `Failed to clone repository from ${url}: ${error.message}`\n };\n }\n }\n\n listFiles(): Promise<string[]> {\n return new Promise((resolve) => {\n try {\n const files: string[] = [];\n \n const traverse = (dir: string, relativePath = '') => {\n const items = fs.readdirSync(dir);\n \n items.forEach(item => {\n const itemPath = path.join(dir, item);\n const itemRelativePath = path.join(relativePath, item);\n \n if (fs.statSync(itemPath).isDirectory()) {\n traverse(itemPath, itemRelativePath);\n } else {\n files.push(itemRelativePath);\n }\n });\n };\n \n traverse(this.repoPath);\n \n // Filter out .git files\n resolve(files.filter(file => !file.startsWith('.git')));\n } catch (error) {\n resolve([]);\n }\n });\n }\n\n \n}\n\nexport default Storage;","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { getHomeDir } from \"./homeDir\";\nimport Storage from \"@scriptdb/storage\";\n\nconst pkgData: string = `{\n \"name\": \"scriptdb-workspace\",\n \"version\": \"1.1.2\",\n \"description\": \"ScriptDB workspace for custom scripts, services, and databases\",\n \"private\": true,\n \"devDependencies\": {\n \"@types/bun\": \"^1.3.2\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n \"@typescript-eslint/parser\": \"^6.0.0\",\n \"bun-types\": \"latest\",\n \"eslint\": \"^8.0.0\",\n \"typescript\": \"^5.0.0\"\n },\n \"dependencies\": {\n \"lodash\": \"^4.17.21\"\n }\n}\n`;\nconst tsconfigData: string = `\n{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"lib\": [\"ES2020\", \"DOM\"],\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"allowSyntheticDefaultImports\": true,\n \"esModuleInterop\": true,\n \"allowJs\": true,\n \"strict\": true,\n \"noEmit\": false,\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"removeComments\": false,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"incremental\": true,\n \"composite\": true,\n \"types\": [\"node\"]\n }\n}\n`;\n\nconst dotGitignoreData: string = `\n# Ignore all files in this directory\nnode_modules/\nbin/\n`;\n\nconst ecosystemData: string = `\nmodule.exports = {\n apps: [{\n name: 'scriptdb',\n script: process.platform === 'win32'\n ? require('path').join(require('os').homedir(), '.scriptdb', 'bin', 'scriptdb.exe')\n : 'scriptdb',\n args: 'start --force',\n cwd: require('path').join(require('os').homedir(), '.scriptdb'),\n instances: 1,\n autorestart: true,\n watch: false,\n max_memory_restart: '1G',\n env: {\n NODE_ENV: 'production'\n },\n error_file: require('path').join(require('os').homedir(), '.scriptdb', 'pm2-error.log'),\n out_file: require('path').join(require('os').homedir(), '.scriptdb', 'pm2-out.log'),\n log_file: require('path').join(require('os').homedir(), '.scriptdb', 'pm2-combined.log'),\n time: true,\n log_date_format: 'YYYY-MM-DD HH:mm:ss Z',\n merge_logs: true\n }]\n};\n`;\n\nconst configDefault = {\n PORT: 3800,\n HOST: \"127.0.0.1\",\n secure: false,\n jwtSecret: \"scriptdb_secret_key\",\n maxConnections: 100,\n logLevel: \"info\",\n DB_USERNAME: \"admin\",\n DB_PASSWORD: \"password\",\n GITHUB_USERNAME: \"\",\n GITHUB_EMAIL: \"\",\n GITHUB_URL: \"\",\n GITHUB_TOKEN: \"\",\n GITHUB_BRANCH: \"main\",\n enableIpLockout: true,\n ipFailWindowMs: 900000,\n maxLoginAttempts: 5,\n lockDurationMs: 900000,\n users: [\n {\n username: \"admin\",\n password: \"password\",\n hash: false,\n algorithm: \"bcrypt\"\n }\n ]\n};\n\nfunction isGitUrl(url: string) {\n const regex = /^(git@[\\w.-]+:[\\w./-]+\\.git|https?:\\/\\/[\\w.-]+\\/[\\w./-]+\\.git)$/;\n return regex.test(url);\n}\n\nfunction injectGitToken(url: string, token: string) {\n const newUrl = url.replace(\n \"https://\",\n `https://${token}@`\n );\n return newUrl;\n}\n\nfunction installPackage(scriptdbDir?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n console.log(\"Installing plugins in:\", scriptdbDir);\n\n const proc = spawn(\"bun\", [\"i\"], {\n cwd: scriptdbDir,\n stdio: \"inherit\",\n shell: true\n });\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n console.log(\"bun i finished successfully\");\n resolve();\n } else {\n console.error(\"bun i failed with code:\", code);\n reject(new Error(`bun install failed with code ${code}`));\n }\n });\n\n proc.on(\"error\", (err) => {\n console.error(\"Failed to spawn bun install:\", err);\n reject(err);\n });\n });\n}\n\nasync function setupStorage(scriptdbDir: string) {\n try {\n console.log(\"Initializing storage...\");\n const storage = new Storage(scriptdbDir)\n\n const configStr = fs.readFileSync(path.join(scriptdbDir, \"config.json\"), \"utf8\");\n const config = JSON.parse(configStr);\n\n await storage.initialize(scriptdbDir)\n console.log(\"Storage initialized\");\n\n // Only set git config if username and email are provided\n if (config.GITHUB_USERNAME && config.GITHUB_EMAIL) {\n const gitConfig = {\n userName: config.GITHUB_USERNAME,\n userEmail: config.GITHUB_EMAIL\n }\n await storage.setConfig(gitConfig);\n console.log(\"Git config set\");\n } else {\n console.log(\"Git config not set (configure later with 'scriptdb config')\");\n }\n\n // Only setup remote if URL is provided and valid\n if (config.GITHUB_URL && isGitUrl(config.GITHUB_URL)) {\n const remoteUrl = injectGitToken(config.GITHUB_URL, config.GITHUB_TOKEN);\n await storage.addRemote(\"origin\", config.GITHUB_TOKEN ? remoteUrl : config.GITHUB_URL);\n await storage.pull(\"origin\", config.GITHUB_BRANCH || \"main\");\n console.log(\"Remote repository configured\");\n } else {\n console.log(\"Remote repository not configured (configure later with 'scriptdb config')\");\n }\n\n console.log(\"Storage setup complete\");\n } catch (err) {\n console.warn(\"Storage setup failed (non-critical):\", err);\n }\n}\n\nexport async function setupDir() {\n const scriptdbDir = path.join(getHomeDir(), \".scriptdb\");\n const databasesDir = path.join(scriptdbDir, \"databases\");\n const servicesDir = path.join(scriptdbDir, \"services\");\n const clientsDir = path.join(scriptdbDir, \"clients\");\n const binDir = path.join(scriptdbDir, \"bin\");\n const configFile = path.join(scriptdbDir, \"config.json\");\n const gitignoreFile = path.join(scriptdbDir, \".gitignore\");\n const packageJsonFile = path.join(scriptdbDir, \"package.json\");\n const tsconfigFile = path.join(scriptdbDir, \"tsconfig.json\");\n const ecosystemFile = path.join(scriptdbDir, \"ecosystem.config.js\");\n\n // Check if all required files and directories exist\n const isFullySetup = fs.existsSync(scriptdbDir) &&\n fs.existsSync(databasesDir) &&\n fs.existsSync(servicesDir) &&\n fs.existsSync(clientsDir) &&\n fs.existsSync(binDir) &&\n fs.existsSync(configFile) &&\n fs.existsSync(gitignoreFile) &&\n fs.existsSync(packageJsonFile) &&\n fs.existsSync(tsconfigFile) &&\n fs.existsSync(ecosystemFile);\n\n if (isFullySetup) {\n console.log(\"ScriptDB directory already fully configured:\", scriptdbDir);\n return;\n }\n\n console.log(\"Setting up scriptdb directory...\");\n\n if (!fs.existsSync(scriptdbDir)) {\n fs.mkdirSync(scriptdbDir, { recursive: true });\n fs.mkdirSync(databasesDir, { recursive: true });\n fs.mkdirSync(servicesDir, { recursive: true });\n fs.mkdirSync(clientsDir, { recursive: true });\n fs.mkdirSync(binDir, { recursive: true });\n fs.writeFileSync(configFile, JSON.stringify(configDefault, null, 2), \"utf8\");\n fs.writeFileSync(gitignoreFile, dotGitignoreData, \"utf8\");\n fs.writeFileSync(packageJsonFile, pkgData, \"utf8\");\n fs.writeFileSync(tsconfigFile, tsconfigData, \"utf8\");\n fs.writeFileSync(ecosystemFile, ecosystemData, \"utf8\");\n console.log(\"Created:\", scriptdbDir);\n await installPackage(scriptdbDir);\n await setupStorage(scriptdbDir);\n } else {\n // Ensure all required directories exist\n if (!fs.existsSync(databasesDir)) {\n fs.mkdirSync(databasesDir, { recursive: true });\n }\n\n if (!fs.existsSync(servicesDir)) {\n fs.mkdirSync(servicesDir, { recursive: true });\n }\n\n if (!fs.existsSync(clientsDir)) {\n fs.mkdirSync(clientsDir, { recursive: true });\n }\n\n if (!fs.existsSync(binDir)) {\n fs.mkdirSync(binDir, { recursive: true });\n }\n\n // Ensure all required files exist\n if (!fs.existsSync(configFile)) {\n fs.writeFileSync(configFile, JSON.stringify(configDefault, null, 2), \"utf8\");\n }\n\n if (!fs.existsSync(gitignoreFile)) {\n fs.writeFileSync(gitignoreFile, dotGitignoreData, \"utf8\");\n }\n\n if (!fs.existsSync(packageJsonFile)) {\n fs.writeFileSync(packageJsonFile, pkgData, \"utf8\");\n }\n\n if (!fs.existsSync(tsconfigFile)) {\n fs.writeFileSync(tsconfigFile, tsconfigData, \"utf8\");\n }\n\n if (!fs.existsSync(ecosystemFile)) {\n fs.writeFileSync(ecosystemFile, ecosystemData, \"utf8\");\n }\n\n // Check if node_modules exists, if not run install\n if (!fs.existsSync(path.join(scriptdbDir, \"node_modules\"))) {\n await installPackage(scriptdbDir);\n }\n\n console.log(\"Setup complete\");\n await setupStorage(scriptdbDir);\n }\n}","import createWebSocketStream from './lib/stream.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer };\nexport default WebSocket;\n","import * as net from \"net\";\nimport * as tls from \"tls\";\nimport { URL } from \"url\";\nimport * as crypto from \"crypto\";\n\ntype Action = 'script-code' | 'save-db' | 'remove-db' | 'rename-db' | 'login' | 'logout' | 'get-info' | 'list-dbs' | 'create-db' | 'update-db' | 'get-db' | 'shell-command' | 'string';\n\ninterface DataOptions {\n code?: string | any;\n databaseName?: string | any;\n token?: string | any;\n username?: string | any;\n password?: string | any;\n newName?: string | any;\n}\n\ninterface PayloadOptions {\n id?: number;\n action?: Action;\n data?: DataOptions;\n}\n// Type definitions\ninterface Logger {\n debug?: (...args: any[]) => void;\n info?: (...args: any[]) => void;\n warn?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n}\n\ninterface ClientOptions {\n secure?: boolean;\n logger?: Logger;\n requestTimeout?: number;\n socketTimeout?: number;\n retries?: number;\n retryDelay?: number;\n tlsOptions?: tls.TlsOptions;\n frame?: 'ndjson' | 'length-prefix';\n preferLengthPrefix?: boolean;\n maxPending?: number;\n maxQueue?: number;\n maxMessageSize?: number;\n signing?: {\n secret: string;\n algorithm?: string;\n };\n stringify?: (obj: any) => string;\n username?: string;\n password?: string;\n tokenRefresh?: () => Promise<{ token: string; expiresAt?: number }>;\n}\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout | null;\n}\n\ninterface QueuedRequest extends PendingRequest {\n payloadBase: PayloadOptions;\n id: number;\n}\n\ninterface Message {\n id?: number;\n action?: Action;\n command?: string;\n message?: string;\n data?: DataOptions;\n token?: string;\n signature?: string;\n payload?: any;\n}\n\n// Minimal no-op logger\nconst noopLogger = {\n debug: () => { },\n info: () => { },\n warn: () => { },\n error: () => { },\n};\n\nexport class ScriptDBClient {\n // Properties\n private options: ClientOptions;\n private socketTimeout: number = 0;\n private maxMessageSize: number = 0;\n private _mask: (obj: any) => any = () => { };\n private _maskArgs: (args: any[]) => any[] = () => [];\n private logger?: Logger = {};\n private secure: boolean = true;\n private requestTimeout: number = 0;\n private retries: number = 0;\n private retryDelay: number = 0;\n private frame: 'ndjson' | 'length-prefix' = 'ndjson';\n private uri: string = '';\n private protocolName: string = '';\n private username: string | null = null;\n private password: string | null = null;\n private host: string = '';\n private port: number = 0;\n private database: string | null = null;\n private client: net.Socket | tls.TLSSocket | null = null;\n private buffer: Buffer = Buffer.alloc(0);\n private _nextId: number = 1;\n private _pending: Map<number, PendingRequest> = new Map();\n private _maxPending: number = 0;\n private _maxQueue: number = 0;\n private _pendingQueue: QueuedRequest[] = [];\n private _connected: boolean = false;\n private _authenticating: boolean = false;\n private token: string | null = null;\n private _currentRetries: number = 0;\n private tokenExpiry: number | null = null;\n private _destroyed: boolean = false;\n private _reconnectTimer: NodeJS.Timeout | null = null;\n private signing: { secret: string; algorithm?: string } | null = null;\n private _stringify: (obj: any) => string = JSON.stringify;\n private ready: Promise<any> = Promise.resolve();\n private _resolveReadyFn: ((value: any) => void) | null = null;\n private _rejectReadyFn: ((err: Error) => void) | null = null;\n private _connecting: Promise<any> | null = null;\n private _authPendingId: number | null = null;\n\n /**\n * Create a new client. Do NOT auto-connect in constructor — call connect()\n * @param uri - Connection URI\n * @param options - Client options\n * @param options.secure - use TLS\n * @param options.logger - { debug, info, warn, error }\n * @param options.requestTimeout - Request timeout in ms\n * @param options.retries - Reconnection retries\n * @param options.retryDelay - Initial retry delay in ms\n * @param options.tlsOptions - Passed to tls.connect when secure\n */\n constructor(uri: string, options: ClientOptions = {}) {\n if (!uri || typeof uri !== \"string\") throw new Error(\"uri required\");\n this.options = Object.assign({}, options);\n // sensible default socket timeout (ms). 0 = disabled (no socket timeout)\n this.socketTimeout = Number.isFinite(this.options.socketTimeout)\n ? this.options.socketTimeout!\n : 0;\n // sensible default max message size (bytes)\n this.maxMessageSize = Number.isFinite(this.options.maxMessageSize)\n ? this.options.maxMessageSize!\n : 5 * 1024 * 1024; // 5MB\n\n // masking helper (used to hide tokens/passwords from logs)\n this._mask = (obj) => {\n try {\n if (!obj || typeof obj !== \"object\") return obj;\n const copy = Array.isArray(obj) ? obj.slice() : Object.assign({}, obj);\n if (copy.token) copy.token = \"****\";\n if (copy.password) copy.password = \"****\";\n if (copy.data && copy.data.password) copy.data.password = \"****\";\n return copy;\n } catch (e) {\n return obj;\n }\n };\n\n // helper to mask any arguments passed to logger methods\n const rawLogger =\n this.options.logger && typeof this.options.logger === \"object\"\n ? this.options.logger\n : noopLogger;\n this._maskArgs = (args) => {\n return args.map((a) => {\n if (!a) return a;\n if (typeof a === \"string\") return a;\n return this._mask(a);\n });\n };\n\n // wrapper logger that masks sensitive fields in objects before delegating\n this.logger = {\n debug: (...args) =>\n rawLogger.debug && rawLogger.debug(...this._maskArgs(args)),\n info: (...args) =>\n rawLogger.info && rawLogger.info(...this._maskArgs(args)),\n warn: (...args) =>\n rawLogger.warn && rawLogger.warn(...this._maskArgs(args)),\n error: (...args) =>\n rawLogger.error && rawLogger.error(...this._maskArgs(args)),\n };\n // secure by default; warn if user explicitly disables secure\n this.secure =\n typeof this.options.secure === \"boolean\" ? !!this.options.secure : true;\n if (!this.secure)\n this.logger.warn?.(\n \"Warning: connecting in insecure mode (secure=false). This is not recommended.\"\n );\n // By default do not set a per-request timeout (0 = disabled).\n this.requestTimeout = Number.isFinite(this.options.requestTimeout)\n ? this.options.requestTimeout!\n : 0;\n this.retries = Number.isFinite(this.options.retries)\n ? this.options.retries!\n : 3;\n this.retryDelay = Number.isFinite(this.options.retryDelay)\n ? this.options.retryDelay!\n : 1000;\n // framing: 'ndjson' (default) or 'length-prefix'. If the caller prefers higher throughput\n // they can set options.preferLengthPrefix = true or options.frame = 'length-prefix'.\n this.frame =\n this.options.frame === \"length-prefix\" || this.options.preferLengthPrefix\n ? \"length-prefix\"\n : \"ndjson\";\n\n // Validate and parse URI - only accept scriptdb:// protocol\n let parsed;\n try {\n parsed = new URL(uri);\n } catch (e) {\n throw new Error(\"Invalid uri\");\n }\n\n // Validate protocol\n if (parsed.protocol !== \"scriptdb:\") {\n throw new Error(\"URI must use scriptdb:// protocol\");\n }\n\n this.uri = uri;\n this.protocolName = parsed.protocol\n ? parsed.protocol.replace(\":\", \"\")\n : \"scriptdb\";\n // prefer explicit credentials passed in options over credentials embedded in the URI\n this.username =\n (typeof this.options.username === \"string\"\n ? this.options.username\n : parsed.username) || null;\n this.password =\n (typeof this.options.password === \"string\"\n ? this.options.password\n : parsed.password) || null;\n if (parsed.username && !(typeof this.options.username === \"string\")) {\n this.logger.warn?.(\n \"Credentials found in URI — consider passing credentials via options instead of embedding in URI\"\n );\n }\n // do not keep credentials in the stored URI representation\n try {\n parsed.username = \"\";\n parsed.password = \"\";\n this.uri = parsed.toString();\n } catch (e) {\n // fallback to original uri\n this.uri = uri;\n }\n this.host = parsed.hostname || \"localhost\";\n this.port = parsed.port ? parseInt(parsed.port, 10) : 1234;\n this.database =\n parsed.pathname && parsed.pathname.length > 1\n ? parsed.pathname.slice(1)\n : null;\n\n // internal state\n this.client = null;\n this.buffer = Buffer.alloc(0);\n this._nextId = 1; // request id generator\n this._pending = new Map(); // id -> {resolve,reject,timer}\n this._maxPending = Number.isFinite(this.options.maxPending)\n ? this.options.maxPending!\n : 100;\n this._maxQueue = Number.isFinite(this.options.maxQueue)\n ? this.options.maxQueue!\n : 1000;\n this._pendingQueue = []; // queued requests when pending >= max\n this._connected = false;\n this._authenticating = false;\n this.token = null;\n this._currentRetries = 0;\n this.tokenExpiry = null; // ms timestamp when token expires\n this._destroyed = false;\n this._reconnectTimer = null;\n\n // signing options: { secret: '...', algorithm: 'sha256' }\n this.signing =\n this.options.signing && this.options.signing.secret\n ? this.options.signing\n : null;\n\n // fast stringify support: allow user to pass a custom stringify function (e.g. fast-json-stringify)\n this._stringify =\n typeof this.options.stringify === \"function\"\n ? this.options.stringify\n : JSON.stringify;\n\n // ready promise lifecycle managed by helpers to avoid race conditions\n this._createReady();\n }\n\n _createReady() {\n this.ready = new Promise((resolve, reject) => {\n this._resolveReadyFn = resolve;\n this._rejectReadyFn = reject;\n });\n }\n\n _resolveReady(value: any) {\n if (this._resolveReadyFn) {\n try {\n this._resolveReadyFn(value);\n } catch (e) { }\n this._resolveReadyFn = null;\n this._rejectReadyFn = null;\n }\n }\n\n _rejectReady(err: Error) {\n if (this._rejectReadyFn) {\n // Use process.nextTick to defer the rejection, preventing unhandled errors\n // when called from event handlers\n const rejectFn = this._rejectReadyFn;\n this._resolveReadyFn = null;\n this._rejectReadyFn = null;\n\n process.nextTick(() => {\n try {\n rejectFn(err);\n } catch (e) {\n // Silently ignore - promise already rejected\n }\n });\n }\n }\n\n /**\n * Check if connected\n */\n get connected(): boolean {\n return this._connected;\n }\n\n /**\n * Connect to server and authenticate. Returns a Promise that resolves when authenticated.\n */\n connect() {\n // avoid double connect\n if (this._connecting) return this._connecting;\n\n this._connecting = new Promise((resolve, reject) => {\n const opts = { host: this.host, port: this.port };\n const onConnect = () => {\n console.log(\"ScriptDBClient: Connected to server at\", opts.host, opts.port);\n this.logger?.info?.(\"Connected to server\");\n this._connected = true;\n this._currentRetries = 0;\n console.log(\"ScriptDBClient: Setting up listeners...\");\n this._setupListeners();\n console.log(\"ScriptDBClient: Authenticating...\");\n this.authenticate()\n .then(() => {\n // reset pending queue processing after auth\n this._processQueue();\n resolve(this);\n })\n .catch((err) => {\n reject(err);\n });\n };\n\n try {\n if (this.secure) {\n // Create a separate object for host and port to avoid type conflicts\n const connectionOpts = { host: opts.host, port: opts.port };\n const tlsOptions: any = Object.assign(\n {},\n this.options.tlsOptions || {},\n connectionOpts\n );\n // safe default\n if (typeof tlsOptions.rejectUnauthorized === \"undefined\")\n tlsOptions.rejectUnauthorized = true;\n this.client = tls.connect(tlsOptions as tls.ConnectionOptions, onConnect);\n } else {\n this.client = net.createConnection(opts, onConnect);\n }\n } catch (e) {\n const error = e as Error;\n this.logger?.error?.(\"Connection failed\", error.message);\n // reject ready if present and clear handlers\n this._rejectReady(error);\n // make sure ready is recreated on next attempt\n this._createReady();\n // allow future connect attempts\n this._connecting = null;\n return reject(error);\n }\n\n // Guard against client not being set (shouldn't happen, but TypeScript needs it)\n if (!this.client) {\n const error = new Error(\"Failed to create client socket\");\n this.logger?.error?.(\"Connection failed\", error.message);\n this._connecting = null;\n return reject(error);\n }\n\n // attach top-level handlers for errors/close to trigger reconnect logic\n const onError = (err: Error) => {\n this.logger?.error?.(\n \"Client socket error:\",\n err && err.message ? err.message : err\n );\n this._handleDisconnect(err);\n };\n const onClose = (hadError: boolean) => {\n this.logger?.info?.(\"Server closed connection\");\n // Don't pass error to avoid double error throwing\n this._handleDisconnect(null);\n };\n this.client.on(\"error\", onError);\n this.client.on(\"close\", onClose);\n // socket timeouts\n if (this.socketTimeout > 0 && this.client) {\n this.client.setTimeout(this.socketTimeout);\n this.client.on(\"timeout\", () => {\n this.logger?.warn?.(\"Socket timeout, destroying connection\");\n try {\n this.client?.destroy();\n } catch (e) { }\n });\n }\n }).catch((err) => {\n // Ensure errors are properly propagated without additional throwing\n this._connecting = null;\n throw err;\n });\n\n return this._connecting;\n }\n\n _setupListeners() {\n if (!this.client) return;\n console.log(\"ScriptDBClient _setupListeners: called, client exists:\", !!this.client);\n // clear any previous data listeners and reset buffer\n this.client.removeAllListeners(\"data\");\n this.buffer = Buffer.alloc(0);\n\n console.log(\"ScriptDBClient _setupListeners: frame mode:\", this.frame);\n\n // Parser depends on framing\n if (this.frame === \"length-prefix\") {\n // length-prefixed framing: [uint32BE length][payload]\n this.client.on(\"data\", (chunk) => {\n if (!Buffer.isBuffer(chunk)) {\n try {\n chunk = Buffer.from(chunk);\n } catch (e) {\n return;\n }\n }\n // fast path: append and scan (we keep concat here for simplicity)\n this.buffer = Buffer.concat([this.buffer, chunk]);\n while (this.buffer.length >= 4) {\n const len = this.buffer.readUInt32BE(0);\n // enforce max message/frame size\n if (len > this.maxMessageSize) {\n this.logger?.error?.(\n \"Incoming length-prefixed frame exceeds maxMessageSize — closing connection\"\n );\n try {\n this.client?.destroy();\n } catch (e) { }\n return;\n }\n if (this.buffer.length < 4 + len) break;\n const payload = this.buffer.slice(4, 4 + len);\n this.buffer = this.buffer.slice(4 + len);\n let msg;\n try {\n msg = JSON.parse(payload.toString(\"utf8\"));\n } catch (e) {\n this.logger?.error?.(\n \"Invalid JSON frame\",\n e && (e as Error).message ? (e as Error).message : e\n );\n continue;\n }\n // validate schema\n if (!msg || typeof msg !== \"object\") continue;\n const validSchema =\n (typeof msg.id === \"undefined\" || typeof msg.id === \"number\") &&\n (typeof msg.action === \"string\" ||\n typeof msg.action === \"undefined\") &&\n (typeof msg.command === \"string\" ||\n typeof msg.command === \"undefined\") &&\n (typeof msg.message === \"string\" ||\n typeof msg.message === \"undefined\") &&\n (typeof msg.data === \"object\" ||\n typeof msg.data === \"undefined\" ||\n msg.data === null);\n if (!validSchema) {\n this.logger?.warn?.(\"Message failed schema validation — ignoring\");\n continue;\n }\n this._handleMessage(msg);\n }\n });\n } else {\n // Buffer-aware NDJSON parser: avoid repeated string concatenation\n console.log(\"ScriptDBClient _setupListeners: Setting up NDJSON data listener\");\n this.client.on(\"data\", (chunk) => {\n console.log(\"ScriptDBClient: Received data chunk, length:\", chunk.length);\n if (!Buffer.isBuffer(chunk)) {\n try {\n chunk = Buffer.from(chunk);\n } catch (e) {\n return;\n }\n }\n\n // If buffer is empty and chunk contains no trailing partial line, avoid concat\n const idxLastNewline = chunk.indexOf(0x0a);\n if (this.buffer.length === 0 && idxLastNewline === chunk.length - 1) {\n // chunk ends with newline and no previous partial: process in-place\n let start = 0;\n let idx;\n while ((idx = chunk.indexOf(0x0a, start)) !== -1) {\n const lineBuf = chunk.slice(start, idx);\n start = idx + 1;\n if (lineBuf.length === 0) continue;\n let msg;\n try {\n msg = JSON.parse(lineBuf.toString(\"utf8\"));\n } catch (e: any) {\n this.logger?.error?.(\n \"Invalid JSON from server\",\n e && e.message ? e.message : e\n );\n continue;\n }\n // schema check\n if (!msg || typeof msg !== \"object\") continue;\n const validSchema =\n (typeof msg.id === \"undefined\" || typeof msg.id === \"number\") &&\n (typeof msg.action === \"string\" ||\n typeof msg.action === \"undefined\") &&\n (typeof msg.command === \"string\" ||\n typeof msg.command === \"undefined\") &&\n (typeof msg.message === \"string\" ||\n typeof msg.message === \"undefined\");\n if (!validSchema) continue;\n this._handleMessage(msg);\n }\n return;\n }\n\n // fallback: append chunk to buffer (infrequent), then scan\n this.buffer = Buffer.concat([this.buffer, chunk]);\n\n // enforce max message size\n // enforce max message size using configured value\n if (this.buffer.length > this.maxMessageSize) {\n this.logger?.error?.(\n \"Incoming message exceeds maxMessageSize — closing connection\"\n );\n try {\n this.client?.destroy();\n } catch (e) { }\n return;\n }\n\n let idx;\n while ((idx = this.buffer.indexOf(0x0a)) !== -1) {\n const lineBuf = this.buffer.slice(0, idx);\n this.buffer = this.buffer.slice(idx + 1);\n if (lineBuf.length === 0) continue;\n let msg;\n try {\n msg = JSON.parse(lineBuf.toString(\"utf8\"));\n } catch (e: any) {\n this.logger?.error?.(\n \"Invalid JSON from server\",\n e && (e as Error).message ? (e as Error).message : e\n );\n continue;\n }\n\n const validSchema =\n (typeof msg.id === \"undefined\" || typeof msg.id === \"number\") &&\n (typeof msg.action === \"string\" ||\n typeof msg.action === \"undefined\") &&\n (typeof msg.command === \"string\" ||\n typeof msg.command === \"undefined\") &&\n (typeof msg.message === \"string\" ||\n typeof msg.message === \"undefined\");\n if (!validSchema) {\n this.logger?.warn?.(\"Message failed schema validation — ignoring\");\n continue;\n }\n\n this._handleMessage(msg);\n }\n });\n }\n }\n\n // build the final buffer for sending using current token and signing settings\n _buildFinalBuffer(payloadBase: Message, id: number) {\n // payloadBase is { action, data }\n const payloadObj: Message = Object.assign(\n { id, action: payloadBase.action },\n payloadBase.data !== undefined ? { data: payloadBase.data } : {}\n );\n // attach current token at send time\n if (this.token) payloadObj.token = this.token;\n\n const payloadStr = this._stringify(payloadObj);\n\n if (this.signing && this.signing.secret) {\n const hmac = crypto.createHmac(\n this.signing.algorithm || \"sha256\",\n this.signing.secret\n );\n hmac.update(payloadStr);\n const sig = hmac.digest(\"hex\");\n const envelope = { id, signature: sig, payload: payloadObj };\n const envelopeStr = this._stringify(envelope);\n if (this.frame === \"length-prefix\") {\n const body = Buffer.from(envelopeStr, \"utf8\");\n const buf = Buffer.allocUnsafe(4 + body.length);\n buf.writeUInt32BE(body.length, 0);\n body.copy(buf, 4);\n return buf;\n }\n return Buffer.from(envelopeStr + \"\\n\", \"utf8\");\n }\n\n // no signing\n if (this.frame === \"length-prefix\") {\n const body = Buffer.from(payloadStr, \"utf8\");\n const buf = Buffer.allocUnsafe(4 + body.length);\n buf.writeUInt32BE(body.length, 0);\n body.copy(buf, 4);\n return buf;\n }\n return Buffer.from(payloadStr + \"\\n\", \"utf8\");\n }\n\n _handleMessage(msg: Message) {\n console.log('ScriptDBClient _handleMessage:', JSON.stringify(msg));\n console.log('ScriptDBClient _handleMessage msg.id:', msg.id, 'msg.action:', msg.action, 'msg.command:', (msg as any).command, 'msg.message:', msg.message);\n\n // message with id for request/response mapping (check this FIRST)\n if (msg && typeof msg.id !== \"undefined\") {\n console.log('Handling message with id:', msg.id, 'action:', msg.action, 'message:', msg.message);\n const pending = this._pending.get(msg.id);\n if (!pending) {\n console.log('No pending request for id', msg.id, 'pending map size:', this._pending.size);\n this.logger?.debug?.(\"No pending request for id\", msg.id);\n return;\n }\n const { resolve, reject, timer } = pending;\n if (timer) clearTimeout(timer);\n this._pending.delete(msg.id);\n // process next queued request if any\n this._processQueue();\n\n // Handle login responses with id\n if (msg.action === \"login\" || msg.command === \"login\") {\n console.log('Processing login response with id');\n if (msg.message === \"AUTH OK\") {\n console.log('AUTH OK - setting token and resolving');\n this.token = msg.data && msg.data.token ? msg.data.token : null;\n this._resolveReady(null);\n return resolve(msg.data);\n } else {\n console.log('AUTH FAILED:', msg.data);\n this._rejectReady(new Error(\"Authentication failed\"));\n const errorMsg = msg.data || \"Authentication failed\";\n // Close the connection after receiving AUTH FAIL\n try {\n this.client?.end();\n } catch (e) { }\n return reject(new Error(typeof errorMsg === 'string' ? errorMsg : \"Authentication failed\"));\n }\n }\n\n if ((msg.action === \"script-code\" || msg.command === \"script-code\") && msg.message === \"OK\")\n return resolve(msg.data);\n if ((msg.action === \"script-code\" || msg.command === \"script-code\") && msg.message === \"ERROR\")\n return reject(new Error(typeof msg.data === 'string' ? msg.data : \"Server returned ERROR\"));\n\n // Handle create-db responses\n if (msg.action === \"create-db\" && msg.message === \"SUCCESS\")\n return resolve(msg.data);\n if (msg.action === \"create-db\" && msg.message === \"ERROR\")\n return reject(new Error(typeof msg.data === 'string' ? msg.data : \"Failed to create database\"));\n\n // Default: resolve for OK/SUCCESS, reject for ERROR\n if (msg.message === \"OK\" || msg.message === \"SUCCESS\") {\n return resolve(msg.data);\n } else if (msg.message === \"ERROR\") {\n return reject(new Error(typeof msg.data === 'string' ? msg.data : \"Request failed\"));\n }\n\n return reject(new Error(\"Invalid response from server\"));\n }\n\n // otherwise, unhandled message\n console.log('Unhandled message:', msg);\n this.logger?.debug?.(\"Unhandled message from server\", this._mask(msg));\n }\n\n authenticate() {\n if (this._authenticating)\n return Promise.reject(new Error(\"Already authenticating\"));\n this._authenticating = true;\n\n return new Promise((resolve, reject) => {\n const id = this._nextId++;\n const payload: Message = {\n id,\n action: \"login\",\n data: { username: this.username, password: this.password },\n };\n\n // create a timer only when requestTimeout is enabled (>0)\n let timer: any = null;\n if (this.requestTimeout > 0) {\n timer = setTimeout(() => {\n this._pending.delete(id);\n this._authenticating = false;\n reject(new Error(\"Auth timeout\"));\n this.close();\n }, this.requestTimeout);\n }\n\n this._pending.set(id, {\n resolve: (data: any) => {\n if (timer) clearTimeout(timer);\n this._authenticating = false;\n // server may still send a login message; set token if present\n if (data && (data as any).token) this.token = (data as any).token;\n resolve(data);\n },\n reject: (err: any) => {\n if (timer) clearTimeout(timer);\n this._authenticating = false;\n reject(err);\n },\n timer,\n });\n\n try {\n // use _write to respect backpressure\n const buf = Buffer.from(JSON.stringify(payload) + \"\\n\", \"utf8\");\n this._write(buf).catch((err: any) => {\n if (timer) clearTimeout(timer);\n this._pending.delete(id);\n this._authenticating = false;\n reject(err);\n });\n } catch (e: any) {\n clearTimeout(timer);\n this._pending.delete(id);\n this._authenticating = false;\n reject(e);\n }\n })\n .then((data: any) => {\n // mark ready if token present\n if (data && (data as any).token) {\n this.token = (data as any).token;\n this._resolveReady(null);\n }\n return data;\n })\n .catch((err: any) => {\n this._rejectReady(err);\n throw err;\n });\n }\n\n // internal write helper that respects backpressure\n _write(buf: any) {\n return new Promise((resolve, reject) => {\n if (!this.client || !this._connected)\n return reject(new Error(\"Not connected\"));\n try {\n const ok = this.client.write(buf, (err) => {\n if (err) return reject(err);\n resolve(undefined);\n });\n if (!ok) {\n // wait for drain\n this.client.once(\"drain\", () => resolve(undefined));\n }\n // if ok was true, the callback above resolves\n } catch (e) {\n reject(e);\n }\n });\n }\n\n async _processQueue() {\n while (\n this._pending.size < this._maxPending &&\n this._pendingQueue.length > 0\n ) {\n const item: any = this._pendingQueue.shift();\n const { payloadBase, id, resolve, reject, timer } = item;\n // ensure token valid or attempt refresh\n if (this.tokenExpiry && Date.now() >= this.tokenExpiry) {\n const refreshed = await this._maybeRefreshToken();\n if (!refreshed) {\n clearTimeout(timer);\n try {\n reject(new Error(\"Token expired and refresh failed\"));\n } catch (e) { }\n continue;\n }\n }\n\n // build final buffer at send time so token is fresh and we don't store tokens in queue\n let buf;\n try {\n buf = this._buildFinalBuffer(payloadBase, id);\n } catch (e) {\n clearTimeout(timer);\n try {\n reject(e);\n } catch (er) { }\n continue;\n }\n\n // register pending before writing so that responses arriving quickly are handled\n this._pending.set(id, { resolve, reject, timer });\n // write with backpressure\n try {\n await this._write(buf);\n } catch (e) {\n clearTimeout(timer);\n this._pending.delete(id);\n try {\n reject(e);\n } catch (er) { }\n }\n }\n }\n\n /**\n * Execute a command. Supports concurrent requests via request id mapping.\n * Returns a Promise resolved with response.data or rejected on ERROR/timeout.\n */\n async execute(payload: Message) {\n // wait until authenticated\n try {\n await this.ready;\n } catch (err: any) {\n throw new Error(\n \"Not authenticated: \" + (err && err.message ? err.message : err)\n );\n }\n\n if (!this.token) throw new Error(\"Not authenticated\");\n\n const id = this._nextId++;\n\n // payloadBase stored in queue; final buffer will be built at send time\n const payloadBase: PayloadOptions = { action: payload.action, data: payload.data };\n\n // if token expired, try refresh before proceeding\n if (this.tokenExpiry && Date.now() >= this.tokenExpiry) {\n const refreshed = await this._maybeRefreshToken();\n if (!refreshed) throw new Error(\"Token expired\");\n }\n\n return new Promise((resolve, reject) => {\n // create request timer only if requestTimeout > 0\n let timer: any = null;\n if (this.requestTimeout > 0) {\n timer = setTimeout(() => {\n if (this._pending.has(id)) {\n this._pending.delete(id);\n reject(new Error(\"Request timeout\"));\n }\n }, this.requestTimeout);\n }\n\n // if too many pending, queue this request\n if (this._pending.size >= this._maxPending) {\n if (this._pendingQueue.length >= this._maxQueue) {\n if (timer) clearTimeout(timer);\n return reject(new Error(\"Pending queue full\"));\n }\n // enqueue payload base so we don't store tokens in the queue\n this._pendingQueue.push({ payloadBase, id, resolve, reject, timer });\n // try to process queue (async)\n this._processQueue().catch(() => { });\n return;\n }\n\n // build final buffer now using current token\n let finalBuf;\n try {\n finalBuf = this._buildFinalBuffer(payloadBase, id);\n } catch (e) {\n clearTimeout(timer);\n return reject(e);\n }\n\n this._pending.set(id, { resolve, reject, timer });\n // write with backpressure handling\n this._write(finalBuf).catch((e) => {\n if (timer) clearTimeout(timer);\n this._pending.delete(id);\n reject(e);\n });\n });\n }\n /**\n * Attempt to refresh token using provided tokenRefresh option if token expired.\n * options.tokenRefresh should be async function that returns { token, expiresAt }\n */\n async _maybeRefreshToken() {\n if (\n !this.options.tokenRefresh ||\n typeof this.options.tokenRefresh !== \"function\"\n )\n return false;\n try {\n const res = await this.options.tokenRefresh();\n if (res && res.token) {\n this.token = res.token;\n if (res.expiresAt) this.tokenExpiry = res.expiresAt;\n return true;\n }\n } catch (e) {\n this.logger?.error?.(\n \"Token refresh failed\",\n e && (e as Error).message ? (e as Error).message : String(e)\n );\n }\n return false;\n }\n\n destroy() {\n this._destroyed = true;\n if (this._reconnectTimer) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n // reject ready and clear queues/pending\n this._rejectReady(new Error(\"Client destroyed\"));\n this._pending.forEach((pending, id) => {\n if (pending.timer) clearTimeout(pending.timer);\n try {\n pending.reject(new Error(\"Client destroyed\"));\n } catch (e: any) { }\n this._pending.delete(id);\n });\n this._pendingQueue = [];\n try {\n if (this.client) this.client.destroy();\n } catch (e: any) { }\n this.client = null;\n }\n\n _handleDisconnect(err: any) {\n // Prevent handling disconnect multiple times\n if (!this._connected && !this._authenticating) {\n return;\n }\n\n // Check if we're disconnecting during authentication - likely an AUTH FAIL\n const wasAuthenticating = this._authenticating;\n\n // cleanup pending requests\n this._pending.forEach((pending, id) => {\n if (pending.timer) clearTimeout(pending.timer);\n\n // Defer rejection to next tick to allow outer promise chain to catch it\n const errorMsg = wasAuthenticating\n ? \"Authentication failed - credentials may be required\"\n : (err && err.message ? err.message : \"Disconnected\");\n\n process.nextTick(() => {\n try {\n // Create Error here to avoid Bun logging it immediately\n pending.reject(new Error(errorMsg));\n } catch (e: any) {\n // Ignore - rejection already handled\n }\n });\n\n this._pending.delete(id);\n });\n\n this._connected = false;\n // allow new connect() calls to create a fresh connection\n this._connecting = null;\n // reset authenticating state so future connect/auth attempts are clean\n this._authenticating = false;\n\n // DON'T reconnect on auth failure when retries is 0\n if (wasAuthenticating && this.retries === 0) {\n const rejectErr = err || new Error(\"Authentication failed and no retries configured\");\n try {\n this._rejectReady(rejectErr);\n } catch (e: any) { }\n return;\n }\n\n // try reconnect\n if (this._currentRetries < this.retries) {\n // create a fresh ready promise for the reconnect attempt\n this._createReady();\n // add jitter to avoid thundering herd\n const base = Math.min(\n this.retryDelay * Math.pow(2, this._currentRetries),\n 30000\n );\n const jitter = Math.floor(Math.random() * Math.min(1000, base));\n const delay = base + jitter;\n this._currentRetries += 1;\n this.logger?.info?.(\n \"Attempting reconnect in \" +\n delay +\n \"ms (attempt \" +\n this._currentRetries +\n \")\"\n );\n // clear token/state before reconnect attempt\n this.token = null;\n setTimeout(() => {\n // clear any lingering pending queue when reconnecting to fresh state\n // we keep queued requests but they will be reprocessed after connect\n this.connect().catch((e: any) => {\n this.logger?.error?.(\"Reconnect failed\", e && e.message ? e.message : e);\n });\n }, delay);\n } else {\n // give up\n try {\n this._rejectReady(err || new Error(\"Disconnected and no retries left\"));\n } catch (e: any) { }\n }\n }\n\n close() {\n if (!this.client) return;\n try {\n this.client.removeAllListeners(\"data\");\n this.client.removeAllListeners(\"error\");\n this.client.removeAllListeners(\"close\");\n this.client.end();\n } catch (e: any) { }\n this.client = null;\n }\n\n /**\n * Disconnect (alias for close)\n */\n disconnect() {\n this.close();\n }\n\n /**\n * Send request helper (for public API methods)\n */\n async sendRequest(action: Action, data: any = {}): Promise<any> {\n return this.execute({ action, data });\n }\n\n // ========== Public API Methods ==========\n\n /**\n * Login with username and password\n */\n async login(username: string, password: string): Promise<any> {\n return this.sendRequest('login', { username, password });\n }\n\n /**\n * Logout from server\n */\n async logout(): Promise<any> {\n return this.sendRequest('logout', {});\n }\n\n /**\n * List all databases\n */\n async listDatabases(): Promise<any> {\n return this.sendRequest('list-dbs', {});\n }\n\n /**\n * Create a new database\n */\n async createDatabase(name: string): Promise<any> {\n return this.sendRequest('create-db', { databaseName: name });\n }\n\n /**\n * Remove a database\n */\n async removeDatabase(name: string): Promise<any> {\n return this.sendRequest('remove-db', { databaseName: name });\n }\n\n /**\n * Rename a database\n */\n async renameDatabase(oldName: string, newName: string): Promise<any> {\n return this.sendRequest('rename-db', { databaseName: oldName, newName });\n }\n\n /**\n * Execute code in a database\n */\n async run(code: string|Function, databaseName: string): Promise<any> {\n let stringCode: string;\n if (typeof code === 'function') {\n const funcStr = code.toString();\n // ตัด arrow function หรือ function keyword และ opening brace ออก\n const arrowMatch = funcStr.match(/^[\\s]*\\(?\\s*\\)?\\s*=>\\s*{?/);\n const functionMatch = funcStr.match(/^[\\s]*function\\s*\\(?[\\w\\s]*\\)?\\s*{/);\n const match = arrowMatch || functionMatch;\n const start = match ? match[0].length : 0;\n const end = funcStr.lastIndexOf('}');\n stringCode = funcStr.substring(start, end);\n // Trim leading newline, spaces, and trailing\n stringCode = stringCode.replace(/^[\\s\\r\\n]+/, '').replace(/[\\s\\r\\n]+$/, '');\n\n // Transform import(aa).from(\"module\") to import aa from \"module\"\n stringCode = stringCode.replace(\n /import\\s*\\(\\s*([^)]+?)\\s*\\)\\s*\\.from\\s*\\(\\s*(['\"])([^'\"]+)\\2\\s*\\)/g,\n (_, importArg, quote, modulePath) => {\n // Check if importArg is wrapped in braces (destructuring)\n const trimmed = importArg.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n // Destructuring: import({bb}) -> import { bb }\n const inner = trimmed.slice(1, -1).trim();\n return `import { ${inner} } from ${quote}${modulePath}${quote}`;\n } else {\n // Default: import(aa) -> import aa\n return `import ${trimmed} from ${quote}${modulePath}${quote}`;\n }\n }\n );\n\n // Trim leading whitespace from each line\n stringCode = stringCode.split('\\n').map(line => line.trim()).join('\\n').trim();\n } else {\n stringCode = code;\n }\n return this.sendRequest('script-code', { code: stringCode, databaseName });\n }\n\n /**\n * Save a database to disk\n */\n async saveDatabase(databaseName: string): Promise<any> {\n return this.sendRequest('save-db', { databaseName });\n }\n\n /**\n * Update database metadata\n */\n async updateDatabase(databaseName: string, data: any): Promise<any> {\n return this.sendRequest('update-db', { databaseName, ...data });\n }\n\n /**\n * Get server information\n */\n async getInfo(): Promise<any> {\n return this.sendRequest('get-info', {});\n }\n\n /**\n * Execute shell command on server\n */\n async executeShell(command: string): Promise<{ stdout: string; stderr: string }> {\n return this.sendRequest('shell-command', { command });\n }\n}\n\nexport default ScriptDBClient;\n","/**\n * WebSocket Proxy Server\n *\n * This proxy receives WebSocket connections from browsers and forwards\n * the messages to the ScriptDB TCP/TLS server using @scriptdb/client.\n * This allows browsers to use the full @scriptdb/client functionality.\n */\n\nimport { WebSocketServer, WebSocket } from 'ws';\nimport ScriptDBClient from '../../client/src/index';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execPromise = promisify(exec);\n\ninterface ProxyOptions {\n wsPort: number;\n scriptdbHost: string;\n scriptdbPort: number;\n secure?: boolean;\n logger?: {\n debug?: (...args: any[]) => void;\n info?: (...args: any[]) => void;\n warn?: (...args: any[]) => void;\n error?: (...args: any[]) => void;\n };\n}\n\ninterface ClientSession {\n ws: WebSocket;\n client: ScriptDBClient | null;\n authenticated: boolean;\n}\n\nconst noopLogger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\nexport class WebSocketProxy {\n private wss: WebSocketServer | null = null;\n private options: ProxyOptions;\n private logger: any;\n private sessions: Map<WebSocket, ClientSession> = new Map();\n\n constructor(options: ProxyOptions) {\n this.options = options;\n this.logger = options.logger || noopLogger;\n }\n\n /**\n * Start the WebSocket proxy server\n */\n start(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.wss = new WebSocketServer({ port: this.options.wsPort });\n\n this.wss.on('listening', () => {\n this.logger.info?.(`WebSocket proxy listening on port ${this.options.wsPort}`);\n resolve();\n });\n\n this.wss.on('error', (error) => {\n this.logger.error?.('WebSocket server error:', error);\n reject(error);\n });\n\n this.wss.on('connection', (ws) => {\n this.handleConnection(ws);\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Handle new WebSocket connection\n */\n private handleConnection(ws: WebSocket) {\n this.logger.info?.('New WebSocket connection');\n\n const session: ClientSession = {\n ws,\n client: null,\n authenticated: false,\n };\n\n this.sessions.set(ws, session);\n\n ws.on('message', async (data) => {\n await this.handleMessage(session, data);\n });\n\n ws.on('close', () => {\n this.handleClose(session);\n });\n\n ws.on('error', (error) => {\n this.logger.error?.('WebSocket error:', error);\n this.handleClose(session);\n });\n }\n\n /**\n * Handle incoming message from browser\n */\n private async handleMessage(session: ClientSession, data: any) {\n try {\n const message = JSON.parse(data.toString());\n const { id, action, data: payload } = message;\n\n // Handle login specially to create ScriptDB client connection\n if (action === 'login') {\n await this.handleLogin(session, id, payload);\n return;\n }\n\n // Check if authenticated\n if (!session.authenticated || !session.client) {\n this.sendError(session.ws, id, 'Not authenticated');\n return;\n }\n\n // Forward other actions to ScriptDB client\n await this.forwardAction(session, id, action, payload);\n\n } catch (error: any) {\n this.logger.error?.('Error handling message:', error);\n this.sendError(session.ws, undefined, error.message);\n }\n }\n\n /**\n * Handle login action\n */\n private async handleLogin(session: ClientSession, id: number, payload: any) {\n try {\n const { username, password, secure: clientSecure } = payload;\n \n // Get server secure mode from options (already loaded from config)\n const serverSecure = this.options.secure !== undefined ? this.options.secure : false;\n \n console.log('Login validation:', { clientSecure, serverSecure, username: username || '(empty)' });\n \n // Validate client secure mode matches server config\n if (clientSecure !== undefined && clientSecure !== serverSecure) {\n const errorMsg = serverSecure \n ? 'Server is in secure mode (secure: true). Please uncheck \"Anonymous Connection\" and provide credentials.'\n : 'Server is in non-secure mode (secure: false). Please check \"Anonymous Connection\".';\n this.logger.warn?.('Secure mode mismatch:', { clientSecure, serverSecure });\n throw new Error(errorMsg);\n }\n\n // Create ScriptDB client URI\n let uri: string;\n if (username && username !== '') {\n // With credentials\n uri = `scriptdb://${username}:${password || ''}@${this.options.scriptdbHost}:${this.options.scriptdbPort}`;\n } else {\n // Without credentials (anonymous)\n uri = `scriptdb://${this.options.scriptdbHost}:${this.options.scriptdbPort}`;\n }\n \n this.logger.info?.('Creating ScriptDB client with URI:', uri.replace(/:[^:@]+@/, ':****@'));\n \n const client = new ScriptDBClient(uri, {\n secure: false, // Always use plain TCP (secure option controls authentication, not transport)\n logger: this.logger,\n requestTimeout: 0, // Disable timeout - let browser handle it\n retries: 0, // No retries in proxy\n });\n\n // Connect and authenticate\n console.log('Connecting to ScriptDB server...');\n this.logger.info?.('Connecting to ScriptDB server...');\n \n const connectStartTime = Date.now();\n \n // Wrap client.connect() to suppress error logging from internal rejections\n await client.connect().catch((err) => {\n // Re-throw to be caught by outer try-catch\n throw err;\n });\n \n const connectDuration = Date.now() - connectStartTime;\n \n console.log(`ScriptDB client connected and authenticated in ${connectDuration}ms`);\n this.logger.info?.('ScriptDB client connected and authenticated');\n\n // Store client in session\n session.client = client;\n session.authenticated = true;\n\n // Send success response to browser\n console.log('Sending AUTH OK to browser with id:', id);\n this.logger.info?.('Sending AUTH OK to browser');\n this.sendResponse(session.ws, id, 'login', 'AUTH OK', { token: 'proxy-session' });\n console.log('AUTH OK sent to browser');\n\n } catch (error: any) {\n this.logger.error?.('Login failed:', error);\n this.sendResponse(session.ws, id, 'login', 'AUTH FAILED', error.message);\n \n // Cleanup client if it was created\n if (session.client) {\n try {\n session.client.destroy();\n } catch (e) {}\n session.client = null;\n }\n \n // Remove session from map\n this.sessions.delete(session.ws);\n \n // Close WebSocket connection\n session.ws.close();\n }\n }\n\n /**\n * Forward action to ScriptDB client\n */\n private async forwardAction(session: ClientSession, id: number, action: string, payload: any) {\n try {\n console.log('Forwarding action:', action, 'payload:', payload);\n const client = session.client!;\n let result: any;\n\n switch (action) {\n case 'logout':\n console.log('Executing logout');\n result = await client.execute({ action: 'logout' });\n session.authenticated = false;\n session.client = null;\n break;\n\n case 'list-dbs':\n console.log('Executing list-dbs');\n result = await client.execute({ action: 'list-dbs' });\n console.log('list-dbs result:', result);\n break;\n\n case 'create-db':\n result = await client.execute({ \n action: 'create-db', \n data: { databaseName: payload.databaseName } \n });\n break;\n\n case 'remove-db':\n result = await client.execute({ \n action: 'remove-db', \n data: { databaseName: payload.databaseName } \n });\n break;\n\n case 'rename-db':\n result = await client.execute({ \n action: 'rename-db', \n data: { \n databaseName: payload.databaseName, \n newName: payload.newName \n } \n });\n break;\n\n case 'script-code':\n console.log('wsProxy: executing script-code');\n result = await client.execute({ \n action: 'script-code', \n data: { \n code: payload.code, \n databaseName: payload.databaseName \n } \n });\n console.log('wsProxy: script-code result:', result);\n break;\n\n case 'save-db':\n result = await client.execute({ \n action: 'save-db', \n data: { databaseName: payload.databaseName } \n });\n break;\n\n case 'update-db':\n result = await client.execute({ \n action: 'update-db', \n data: payload \n });\n break;\n\n case 'get-info':\n result = await client.execute({ action: 'get-info' });\n break;\n\n case 'get-db':\n result = await client.execute({\n action: 'get-db',\n data: { databaseName: payload.databaseName }\n });\n break;\n\n case 'shell-command':\n // Execute shell command on server\n result = await this.executeShellCommand(payload.command);\n break;\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n // Send response back to browser\n this.sendResponse(session.ws, id, action, 'OK', result);\n\n } catch (error: any) {\n this.logger.error?.(`Error executing ${action}:`, error);\n this.sendResponse(session.ws, id, action, 'ERROR', error.message);\n }\n }\n\n /**\n * Send response to browser\n */\n private sendResponse(ws: WebSocket, id: number | undefined, action: string, message: string, data?: any) {\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n console.error('Cannot send response - WebSocket not ready:', { \n exists: !!ws, \n readyState: ws?.readyState,\n expectedState: WebSocket.OPEN \n });\n this.logger.error?.('Cannot send response: WebSocket not ready');\n return;\n }\n\n const response = {\n id,\n action,\n message,\n data,\n };\n\n console.log('Sending response to browser:', response);\n this.logger.info?.('Sending response to browser:', { id, action, message });\n \n try {\n ws.send(JSON.stringify(response));\n console.log('Response sent successfully via ws.send()');\n this.logger.info?.('Response sent successfully');\n } catch (error) {\n console.error('Failed to send response:', error);\n this.logger.error?.('Failed to send response:', error);\n }\n }\n\n /**\n * Send error to browser\n */\n private sendError(ws: WebSocket, id: number | undefined, error: string) {\n this.sendResponse(ws, id, 'error', 'ERROR', error);\n }\n\n /**\n * Execute shell command\n */\n private async executeShellCommand(command: string): Promise<{ stdout: string; stderr: string }> {\n try {\n this.logger.info?.(`Executing shell command: ${command}`);\n\n // Security: limit command length\n if (command.length > 1000) {\n throw new Error('Command too long');\n }\n\n const { stdout, stderr } = await execPromise(command, {\n timeout: 30000, // 30 second timeout\n maxBuffer: 1024 * 1024, // 1MB buffer\n cwd: process.cwd()\n });\n\n return {\n stdout: stdout || '',\n stderr: stderr || ''\n };\n } catch (error: any) {\n this.logger.error?.('Shell command failed:', error);\n return {\n stdout: '',\n stderr: error.message || String(error)\n };\n }\n }\n\n /**\n * Handle connection close\n */\n private handleClose(session: ClientSession) {\n this.logger.info?.('WebSocket connection closed');\n\n if (session.client) {\n try {\n session.client.destroy();\n } catch (error) {\n this.logger.error?.('Error destroying client:', error);\n }\n session.client = null;\n }\n\n this.sessions.delete(session.ws);\n }\n\n /**\n * Stop the WebSocket proxy server\n */\n async stop(): Promise<void> {\n return new Promise((resolve) => {\n // Close all sessions\n this.sessions.forEach((session) => {\n if (session.client) {\n try {\n session.client.destroy();\n } catch (error) {\n this.logger.error?.('Error destroying client:', error);\n }\n }\n session.ws.close();\n });\n\n this.sessions.clear();\n\n if (this.wss) {\n this.wss.close(() => {\n this.logger.info?.('WebSocket proxy stopped');\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n}\n\n/**\n * Create and start a WebSocket proxy server\n */\nexport async function createWebSocketProxy(options: ProxyOptions): Promise<WebSocketProxy> {\n const proxy = new WebSocketProxy(options);\n await proxy.start();\n return proxy;\n}\n\nexport default createWebSocketProxy;\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport * as os from \"os\";\nimport { valueToCode } from \"../utils/valueToCode\";\n\nexport function update(dbName: string, fnName: string, code: string | Function) {\n const DIR = \"databases\";\n const basePath = path.join(os.homedir(), '.scriptdb');\n const baseDir: string = path.resolve(basePath, DIR); // โฟลเดอร์ที่อนุญาต\n const dbPath = path.join(baseDir, `${dbName}.ts`);\n\n let src;\n\n if (!fs.existsSync(dbPath)) {\n // If dbPath doesn't exist, create an empty module file so we can insert into it.\n try {\n fs.writeFileSync(dbPath, \"\", \"utf8\");\n // console.log(\"Created new database file:\", dbPath);\n return `Created new database file: ${dbPath}`;\n } catch (e) {\n // console.error(\"Failed to create dbPath file:\", dbPath, e && e.message ? e.message : e);\n return `Failed to create dbPath file: ${dbPath}`;\n }\n }\n\n src = fs.readFileSync(dbPath, \"utf8\");\n\n const originalSrc = src;\n\n const escaped = fnName.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n const startRe = new RegExp(\n `function\\\\s+${escaped}\\\\s*\\\\(|\\\\bclass\\\\s+${escaped}\\\\b|\\\\b(?:const|let|var)\\\\s+${escaped}\\\\s*=\\\\s*(?:function\\\\b|class\\\\b|\\\\(|\\\\{|\\\\[)`,\n \"m\"\n );\n const startMatch = src.match(startRe);\n\n // determine declKind in the current file (if present)\n let declKind = null;\n\n if (startMatch) {\n let startIdx: any = startMatch.index;\n const snippet = src.slice(startIdx, startIdx + 80);\n if (/^function\\b/.test(snippet)) declKind = \"functionDecl\";\n else if (/^class\\b/.test(snippet)) declKind = \"classDecl\";\n else if (/^\\b(?:const|let|var)\\b/.test(snippet)) declKind = \"varAssign\";\n }\n\n // build replacement code for this value\n let newCode;\n if (typeof code === \"function\") {\n const fnStr = code.toString();\n // prefer const assignment for anonymous functions/classes or arrow functions\n if (declKind === \"functionDecl\") {\n if (/^function\\s+\\w+/.test(fnStr)) newCode = fnStr;\n else\n newCode = `function ${fnName}${fnStr.replace(\n /^function\\s*\\(/,\n \"(\"\n )}`;\n } else if (declKind === \"classDecl\") {\n if (/^class\\s+\\w+/.test(fnStr)) newCode = fnStr;\n else if (/^class\\s*\\{/.test(fnStr))\n newCode = fnStr.replace(/^class\\s*\\{/, `class ${fnName} {`);\n else newCode = `const ${fnName} = ${fnStr};`;\n } else {\n newCode = `const ${fnName} = ${fnStr};`;\n }\n } else {\n newCode = `const ${fnName} = ${valueToCode(code, 0)};`;\n }\n\n // replacement: if found startMatch, find block and replace between startIdx and endIdx\n if (startMatch) {\n const startIdx = startMatch.index;\n // find first '{' or '[' after startIdx\n const idxCurly = src.indexOf(\"{\", startIdx);\n const idxBracket = src.indexOf(\"[\", startIdx);\n let braceOpen = -1;\n if (idxCurly === -1) braceOpen = idxBracket;\n else if (idxBracket === -1) braceOpen = idxCurly;\n else braceOpen = Math.min(idxCurly, idxBracket);\n\n if (braceOpen === -1) {\n // no block — fallback: replace export or append\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"m\"\n );\n if (exportRe.test(src)) {\n src = src.replace(\n exportRe,\n `${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`\n );\n } else {\n src =\n src + `\\n\\n${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`;\n }\n } else {\n const openingChar = src[braceOpen];\n const closingChar = openingChar === \"[\" ? \"]\" : \"}\";\n let i = braceOpen + 1;\n let depth = 1;\n const len = src.length;\n while (i < len && depth > 0) {\n const ch = src[i];\n if (ch === openingChar) depth++;\n else if (ch === closingChar) depth--;\n i++;\n }\n let braceClose = i;\n let endIdx = braceClose;\n if (src.slice(braceClose, braceClose + 1) === \";\")\n endIdx = braceClose + 1;\n\n const before = src.slice(0, startIdx);\n const after = src.slice(endIdx);\n src = before + newCode + after;\n }\n } else {\n // not found — try to insert before existing export or append\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"m\"\n );\n if (exportRe.test(src)) {\n src = src.replace(\n exportRe,\n `${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`\n );\n } else {\n src =\n src + `\\n\\n${newCode}\\n\\nexport const ${fnName}: any = ${fnName};`;\n }\n }\n\n fs.writeFileSync(dbPath, src, \"utf8\");\n\n if (src === originalSrc) {\n return `Saved ${fnName} to database ${dbName}.`;\n } else {\n return `Updated ${dbName} with ${fnName}.`;\n }\n}\n","export function isIdentifier(key: any) {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);\n}","import { isIdentifier } from \"./isIdentifier\";\n\nexport function valueToCode(val: any, depth: number = 0): string {\n const indentUnit = \" \";\n const indent = indentUnit.repeat(depth);\n const indentInner = indentUnit.repeat(depth + 1);\n\n if (val === null) return \"null\";\n const t = typeof val;\n if (t === \"string\") return JSON.stringify(val);\n if (t === \"number\" || t === \"boolean\") return String(val);\n if (t === \"function\") return val.toString();\n if (Array.isArray(val)) {\n if (val.length === 0) return \"[]\";\n const items = val.map((v) => valueToCode(v, depth + 1));\n return (\n \"[\\n\" +\n items.map((it) => indentInner + it).join(\",\\n\") +\n \"\\n\" +\n indent +\n \"]\"\n );\n }\n if (t === \"object\") {\n const keys = Object.keys(val);\n if (keys.length === 0) return \"{}\";\n const entries = keys.map((k) => {\n const keyPart = isIdentifier(k) ? k : JSON.stringify(k);\n const v = valueToCode(val[k], depth + 1);\n return indentInner + keyPart + \": \" + v;\n });\n return \"{\\n\" + entries.join(\",\\n\") + \"\\n\" + indent + \"}\";\n }\n return String(val);\n}","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport * as os from \"os\";\n\nexport function remove(dbName: string, fnName: string) {\n const DIR = \"databases\";\n const basePath = path.join(os.homedir(), '.scriptdb');\n const baseDir: string = path.resolve(basePath, DIR); // โฟลเดอร์ที่อนุญาต \n const dbPath = path.join(baseDir, `${dbName}.ts`);\n if (!fs.existsSync(dbPath)) return false;\n\n // if no functionName provided -> remove the whole file (after backup)\n if (!fnName) {\n const bak = `${dbPath}.bak`;\n try {\n fs.copyFileSync(dbPath, bak);\n } catch (e) {\n // ignore backup errors\n }\n try {\n fs.unlinkSync(dbPath);\n return \"Removed successfully\";\n } catch (e) {\n return \"Removed failed\";\n }\n }\n\n // create a backup before editing the file in-place\n const bak = `${dbPath}.bak`;\n try {\n fs.copyFileSync(dbPath, bak);\n } catch (e) {\n // ignore backup errors but continue carefully\n }\n\n let src = fs.readFileSync(dbPath, \"utf8\");\n const escaped = fnName.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n\n // regex to find a declaration of the named symbol (function, class, or var/const/let assignment)\n const startRe = new RegExp(\n `function\\\\s+${escaped}\\\\s*\\\\(|\\\\bclass\\\\s+${escaped}\\\\b|\\\\b(?:const|let|var)\\\\s+${escaped}\\\\s*=\\\\s*(?:function\\\\b|class\\\\b|\\\\(|\\\\{|\\\\[)`,\n \"m\"\n );\n\n const startMatch = src.match(startRe);\n\n if (startMatch) {\n const startIdx = startMatch.index;\n\n // find the first meaningful character after startIdx: {, [, or ; or newline\n const len = src.length;\n const idxCurly = src.indexOf(\"{\", startIdx);\n const idxBracket = src.indexOf(\"[\", startIdx);\n let braceOpen = -1;\n if (idxCurly === -1) braceOpen = idxBracket;\n else if (idxBracket === -1) braceOpen = idxCurly;\n else braceOpen = Math.min(idxCurly, idxBracket);\n\n if (braceOpen !== -1) {\n const openingChar = src[braceOpen];\n const closingChar = openingChar === \"[\" ? \"]\" : \"}\";\n let i = braceOpen + 1;\n let depth = 1;\n while (i < len && depth > 0) {\n const ch = src[i];\n if (ch === openingChar) depth++;\n else if (ch === closingChar) depth--;\n i++;\n }\n let braceClose = i;\n let endIdx = braceClose;\n if (src.slice(braceClose, braceClose + 1) === \";\")\n endIdx = braceClose + 1;\n\n const before = src.slice(0, startIdx);\n const after = src.slice(endIdx);\n src = before + after;\n } else {\n // fallback: remove until next semicolon or a blank line\n const semi = src.indexOf(\";\", startIdx);\n let endIdx = semi !== -1 ? semi + 1 : src.indexOf(\"\\n\\n\", startIdx);\n if (endIdx === -1) endIdx = len;\n src = src.slice(0, startIdx) + src.slice(endIdx);\n }\n }\n\n // remove any export const <name>: any = <name>; lines\n const exportRe = new RegExp(\n `export\\\\s+const\\\\s+${escaped}\\\\s*:\\\\s*any\\\\s*=\\\\s*${escaped}\\\\s*;?`,\n \"g\"\n );\n src = src.replace(exportRe, \"\");\n\n // tidy up multiple blank lines\n src = src.replace(/\\n{3,}/g, \"\\n\\n\");\n\n fs.writeFileSync(dbPath, src, \"utf8\");\n\n return `Removed ${fnName} from database ${dbName}.`;\n}","// create.ts\n// Module for creating new code snippets in the system-modules database\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as os from \"os\";\n/**\n * Creates a new code snippet in the specified database file.\n * @param dbName Name of the database file (without extension)\n * @param code Code content of the snippet\n */\nexport function create(dbName: string, code: string | Function): void {\n const DIR = \"databases\";\n const basePath = path.join(os.homedir(), '.scriptdb');\n const baseDir: string = path.resolve(basePath, DIR); // โฟลเดอร์ที่อนุญาต \n const dbPath = path.join(baseDir, `${dbName}.ts`);\n // Prepare the export line\n fs.appendFileSync(dbPath, code.toString(), 'utf8');\n}\n\n/**\n * Example usage:\n * create('myDatabase', 'function myFunc() { return 42; }');\n */\n","// update.ts\n// Module for updating existing code snippets in the system-modules database\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from \"os\";\n\n/**\n * Updates an existing code snippet in the specified database file.\n * If the snippet does not exist, it will be created.\n * @param dbFilePath Absolute path to the database file\n * @param name Name of the snippet\n * @param code New code content of the snippet\n */\nexport function save(dbName: string, code: string | Function | any): void {\n const DIR = \"databases\";\n const basePath = path.join(os.homedir(), '.scriptdb');\n const baseDir: string = path.resolve(basePath, DIR); // โฟลเดอร์ที่อนุญาต \n const dbPath = path.join(baseDir, `${dbName}.ts`);\n\n let fileContent = typeof code === 'function' ? code.toString() : code;\n\n fs.writeFileSync(dbPath, fileContent, 'utf8');\n}\n\n/**\n * Example usage:\n * updateSnippet('path/to/db.ts', 'myFunc', 'function myFunc() { return 99; }');\n */\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\n/**\n * Read database file content\n * @param dbName - Database name (without .ts extension)\n * @returns File content as string\n */\nexport function read(dbName: string): string {\n const DIR = \"databases\";\n const basePath = path.join(os.homedir(), '.scriptdb');\n const baseDir: string = path.resolve(basePath, DIR);\n const dbPath = path.join(baseDir, `${dbName}.ts`);\n\n if (!fs.existsSync(dbPath)) {\n throw new Error(`Database '${dbName}' not found`);\n }\n\n return fs.readFileSync(dbPath, 'utf8');\n}\n\nexport default read;\n","import { update as updateModule } from './modules/update';\nimport { remove as removeModule } from './modules/remove';\nimport { create as createModule } from './modules/create';\nimport { save as createsaveModule } from './modules/save';\nimport { read as readModule } from './modules/read';\n\nexport const update = updateModule;\nexport const remove = removeModule;\nexport const create = createModule;\nexport const save = createsaveModule;\nexport const read = readModule;\n\nexport async function SystemModuleResolver() {\n\n const moduleRegistry = new Map<string, any>();\n\n moduleRegistry.set(\"update\", update);\n moduleRegistry.set(\"remove\", remove);\n moduleRegistry.set(\"create\", create);\n moduleRegistry.set(\"save\", save);\n moduleRegistry.set(\"read\", read);\n\n const context: Record<string, any> = {\n // Add require-like functionality\n require: (moduleName: string) => {\n const module = moduleRegistry.get(moduleName);\n if (!module) {\n throw new Error(`Module '${moduleName}' not found`);\n }\n // Return the default export if available, otherwise the module itself\n return module.default || module;\n },\n\n // Add import functionality (simulated)\n import: async (moduleName: string) => {\n const module = moduleRegistry.get(moduleName);\n if (!module) {\n throw new Error(`Module '${moduleName}' not found`);\n }\n return {\n default: module.default || module\n };\n }\n };\n\n for (const [name, moduleExports] of moduleRegistry) {\n context[name] = moduleExports.default || moduleExports;\n }\n\n return context;\n}\n\nexport default SystemModuleResolver;","#!/usr/bin/env node\n\nimport { server } from '../../server/src/index'\nimport { execSync } from 'child_process'\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { startShell } from './shell'\n\n// PM2 API import\nlet pm2: any = null\ntry {\n pm2 = require('pm2')\n} catch {\n // PM2 not installed, will install automatically\n}\n\nconst SCRIPTDB_DIR = join(homedir(), '.scriptdb')\nconst CONFIG_FILE = join(SCRIPTDB_DIR, 'config.json')\nconst PACKAGE_JSON = join(SCRIPTDB_DIR, 'package.json')\nconst ECOSYSTEM_FILE = join(SCRIPTDB_DIR, 'ecosystem.config.js')\n\nasync function main() {\n const args = process.argv.slice(2)\n const command = args[0]\n const isDaemon = args.includes('-d') || args.includes('--daemon')\n const isForce = args.includes('--force')\n\n if (!command || command === 'start') {\n await startCommand(isDaemon, isForce)\n } else if (command === 'stop') {\n await stopCommand()\n } else if (command === 'restart') {\n await restartCommand(isDaemon)\n } else if (command === 'status') {\n await statusCommand()\n } else if (command === 'logs') {\n await logsCommand()\n } else if (command === 'monit') {\n await monitCommand()\n } else if (command === 'shell') {\n await shellCommand()\n } else if (command === 'add') {\n await addCommand(args.slice(1))\n } else if (command === 'remove' || command === 'rm') {\n await removeCommand(args.slice(1))\n } else if (command === 'help' || command === '--help' || command === '-h') {\n printHelp()\n } else if (command === 'version' || command === '--version' || command === '-v') {\n printVersion()\n } else {\n console.error(`Unknown command: ${command}`)\n console.error('Run \"scriptdb help\" for usage information')\n process.exit(1)\n }\n}\n\nasync function startCommand(daemon: boolean, force: boolean = false) {\n // Check if already running (skip if --force flag is set)\n if (!force) {\n const running = await isServerRunning()\n if (running) {\n console.error('ScriptDB server is already running')\n console.log('Run \"scriptdb status\" to check status')\n console.log('Run \"scriptdb stop\" to stop the server')\n process.exit(1)\n }\n }\n\n if (daemon) {\n console.log('Starting ScriptDB server in daemon mode...')\n await startDaemonWithPM2()\n } else {\n console.log('Starting ScriptDB server...')\n try {\n await server()\n } catch (err) {\n console.error('Failed to start server:', err)\n process.exit(1)\n }\n }\n}\n\nasync function isServerRunning(): Promise<boolean> {\n if (!pm2) return false\n\n return new Promise((resolve) => {\n pm2.describe('scriptdb', (err: any, processDescription: any) => {\n if (err || !processDescription || processDescription.length === 0) {\n resolve(false)\n } else {\n const isOnline = processDescription[0]?.pm2_env?.status === 'online'\n resolve(isOnline)\n }\n })\n })\n}\n\nasync function startDaemonWithPM2() {\n if (!pm2) {\n console.error('PM2 is not installed. Installing PM2...')\n try {\n execSync('npm install -g pm2', { stdio: 'inherit' })\n console.log('✓ PM2 installed successfully')\n\n // Clear require cache and try loading PM2 again\n delete require.cache[require.resolve('pm2')]\n try {\n pm2 = require('pm2')\n } catch {\n // If still fails, the user may need to restart their terminal\n console.error('Failed to load PM2 after installation')\n console.log('Please restart your terminal and run again, or run:')\n console.log(' npm install -g pm2')\n process.exit(1)\n }\n } catch (err) {\n console.error('Failed to install PM2:', err)\n console.log('Please install PM2 manually: npm install -g pm2')\n process.exit(1)\n }\n }\n\n // Ensure ecosystem config exists in ~/.scriptdb/\n ensureEcosystemConfig()\n\n // Use ecosystem config from ~/.scriptdb/\n const ecosystemPath = ECOSYSTEM_FILE\n\n // Use PM2 API to start\n return new Promise<void>((resolve, reject) => {\n pm2.start(ecosystemPath, (err: any) => {\n if (err) {\n console.error('Failed to start server:', err)\n pm2.disconnect(() => process.exit(1))\n return reject(err)\n }\n\n console.log('✓ ScriptDB server started in daemon mode')\n console.log(`Config: ${ecosystemPath}`)\n console.log('Run \"scriptdb status\" to check status')\n console.log('Run \"scriptdb logs\" to view logs')\n console.log('Run \"scriptdb monit\" to monitor performance')\n\n // Disconnect from PM2 daemon\n pm2.disconnect(() => {\n resolve()\n })\n })\n })\n}\n\nasync function stopCommand() {\n if (!pm2) {\n console.error('PM2 is not available')\n process.exit(1)\n }\n\n return new Promise<void>((resolve, reject) => {\n // Use PM2 API to stop\n pm2.describe('scriptdb', (err: any, processDescription: any) => {\n if (err || !processDescription || processDescription.length === 0) {\n console.log('ScriptDB server is not running')\n pm2.disconnect(() => resolve())\n return\n }\n\n // Stop with PM2\n console.log('Stopping ScriptDB server...')\n pm2.stop('scriptdb', (err: any) => {\n if (err) {\n console.error('Failed to stop server:', err)\n pm2.disconnect(() => process.exit(1))\n return reject(err)\n }\n\n // Delete from PM2\n pm2.delete('scriptdb', (err: any) => {\n if (err) {\n console.error('Failed to delete process:', err)\n } else {\n console.log('✓ ScriptDB server stopped')\n }\n pm2.disconnect(() => resolve())\n })\n })\n })\n })\n}\n\nasync function restartCommand(daemon: boolean) {\n console.log('Restarting ScriptDB server...')\n await stopCommand()\n await new Promise(resolve => setTimeout(resolve, 1000))\n await startCommand(daemon, daemon) // force=true when restarting as daemon\n}\n\nasync function statusCommand() {\n if (!pm2) {\n console.error('PM2 is not available')\n process.exit(1)\n }\n\n return new Promise<void>((resolve) => {\n // Use PM2 API to get status\n pm2.list((err: any, list: any) => {\n if (err) {\n console.error('Failed to get status:', err)\n pm2.disconnect(() => resolve())\n return\n }\n\n const scriptdbProcess = list.find((p: any) => p.name === 'scriptdb')\n\n if (scriptdbProcess && scriptdbProcess.pm2_env.status === 'online') {\n console.log('✓ ScriptDB server is running')\n console.log(` PID: ${scriptdbProcess.pid}`)\n console.log(` Memory: ${(scriptdbProcess.monit.memory / 1024 / 1024).toFixed(1)} MB`)\n console.log(` CPU: ${scriptdbProcess.monit.cpu.toFixed(1)}%`)\n console.log(` Uptime: ${Math.floor(scriptdbProcess.pm2_env.uptime / 1000)}s`)\n console.log(` Restarts: ${scriptdbProcess.pm2_env.restart_time}`)\n console.log('\\nAdditional Commands:')\n console.log(' scriptdb logs - View real-time logs')\n console.log(' scriptdb monit - Monitor performance')\n console.log(' scriptdb restart - Restart server')\n console.log(' scriptdb stop - Stop server')\n } else {\n console.log('✗ ScriptDB server is not running')\n }\n\n pm2.disconnect(() => resolve())\n })\n })\n}\n\nasync function logsCommand() {\n // Show log file location and use tail to stream logs\n const logFile = join(SCRIPTDB_DIR, 'pm2-combined.log')\n\n if (!existsSync(logFile)) {\n console.log('No log file found. The server might not have started yet.')\n console.log('Start the server first with: scriptdb start -d')\n return\n }\n\n console.log('Showing logs for ScriptDB server (Ctrl+C to exit)...')\n console.log(`Log file: ${logFile}`)\n console.log('')\n\n try {\n // Use tail to follow the log file\n const { spawn } = require('child_process')\n const tail = spawn('tail', ['-f', logFile], { stdio: 'inherit' })\n\n // Handle Ctrl+C\n process.on('SIGINT', () => {\n tail.kill()\n process.exit(0)\n })\n\n tail.on('error', () => {\n // If tail fails (e.g., on Windows without Git Bash), just show the file content\n console.log('Note: Install Git Bash or use a terminal that supports \"tail\" command for live log streaming')\n console.log('You can manually view the log file at:', logFile)\n const logContent = readFileSync(logFile, 'utf-8')\n console.log(logContent)\n })\n } catch (err) {\n console.error('Failed to stream logs:', err)\n console.log(`You can manually view the log file at: ${logFile}`)\n }\n}\n\nasync function monitCommand() {\n if (!pm2) {\n console.error('PM2 is not available')\n process.exit(1)\n }\n\n return new Promise<void>((resolve) => {\n // Use PM2 API to get detailed monitoring info\n pm2.list((err: any, list: any) => {\n if (err) {\n console.error('Failed to get status:', err)\n pm2.disconnect(() => resolve())\n return\n }\n\n const scriptdbProcess = list.find((p: any) => p.name === 'scriptdb')\n\n if (scriptdbProcess && scriptdbProcess.pm2_env.status === 'online') {\n console.log('ScriptDB Server Monitoring')\n console.log('=======================')\n console.log(`Status: ${scriptdbProcess.pm2_env.status}`)\n console.log(`PID: ${scriptdbProcess.pid}`)\n console.log(`Memory: ${(scriptdbProcess.monit.memory / 1024 / 1024).toFixed(1)} MB`)\n console.log(`CPU: ${scriptdbProcess.monit.cpu.toFixed(1)}%`)\n console.log(`Uptime: ${Math.floor(scriptdbProcess.pm2_env.uptime / 1000)}s`)\n console.log(`Restarts: ${scriptdbProcess.pm2_env.restart_time}`)\n console.log(`Restart Time: ${new Date(scriptdbProcess.pm2_env.created_at).toISOString()}`)\n console.log(`Mode: ${scriptdbProcess.pm2_env.exec_mode === 'fork' ? 'fork' : 'cluster'}`)\n console.log(`Watching: ${scriptdbProcess.pm2_env.watch ? 'Yes' : 'No'}`)\n console.log(`Script: ${scriptdbProcess.pm2_env.script || scriptdbProcess.pm2_env.pm_cwd}`)\n } else {\n console.log('✗ ScriptDB server is not running')\n }\n\n pm2.disconnect(() => resolve())\n })\n })\n}\n\nasync function shellCommand() {\n // Check if server is running\n const running = await isServerRunning()\n if (!running) {\n console.error('✗ ScriptDB server is not running')\n console.log('Start the server first with: scriptdb start -d')\n process.exit(1)\n }\n\n // Read config to get host and port\n let host = 'localhost'\n let port = 1234\n let secure = false\n\n if (existsSync(CONFIG_FILE)) {\n try {\n const config = JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'))\n if (config.host) host = config.host\n if (config.port) port = config.port\n if (config.secure) secure = config.secure\n } catch {\n // Use defaults\n }\n }\n\n await startShell({ host, port, secure })\n}\n\nasync function addCommand(packages: string[]) {\n if (packages.length === 0) {\n console.error('Error: No package specified')\n console.log('Usage: scriptdb add <package> [package2] [package3] ...')\n console.log('')\n console.log('Examples:')\n console.log(' scriptdb add lodash # Install to ~/.scriptdb/packages')\n console.log(' scriptdb add axios express # Install multiple packages')\n console.log(' scriptdb add --local lodash # Install to current directory')\n process.exit(1)\n }\n\n // Check for --local flag (install to current directory instead of ~/.scriptdb)\n const isLocal = packages.includes('--local') || packages.includes('-l')\n\n // Remove flags from packages list\n const pkgs = packages.filter(p => !p.startsWith('-'))\n\n if (pkgs.length === 0) {\n console.error('Error: No package specified')\n process.exit(1)\n }\n\n try {\n let cwd: string\n\n if (isLocal) {\n // Install to current directory\n cwd = process.cwd()\n console.log(`Installing ${pkgs.join(', ')} to current directory...`)\n } else {\n // Install to ~/.scriptdb\n ensureScriptDBDir()\n cwd = SCRIPTDB_DIR\n console.log(`Installing ${pkgs.join(', ')} to ScriptDB packages...`)\n }\n\n const cmd = 'bun add ' + pkgs.join(' ')\n execSync(cmd, { stdio: 'inherit', cwd })\n\n if (isLocal) {\n console.log(`✓ Successfully installed ${pkgs.join(', ')} locally`)\n } else {\n console.log(`✓ Successfully installed ${pkgs.join(', ')} to ~/.scriptdb/packages`)\n }\n } catch (error) {\n console.error('Failed to install packages')\n process.exit(1)\n }\n}\n\nasync function removeCommand(packages: string[]) {\n if (packages.length === 0) {\n console.error('Error: No package specified')\n console.log('Usage: scriptdb remove <package> [package2] [package3] ...')\n console.log(' scriptdb rm <package> [package2] [package3] ...')\n console.log('')\n console.log('Examples:')\n console.log(' scriptdb remove lodash # Remove from ~/.scriptdb/packages')\n console.log(' scriptdb rm axios express # Remove multiple packages')\n console.log(' scriptdb remove --local lodash # Remove from current directory')\n process.exit(1)\n }\n\n // Check for --local flag (remove from current directory instead of ~/.scriptdb)\n const isLocal = packages.includes('--local') || packages.includes('-l')\n\n // Remove flags from packages list\n const pkgs = packages.filter(p => !p.startsWith('-'))\n\n if (pkgs.length === 0) {\n console.error('Error: No package specified')\n process.exit(1)\n }\n\n try {\n let cwd: string\n\n if (isLocal) {\n // Remove from current directory\n cwd = process.cwd()\n console.log(`Removing ${pkgs.join(', ')} from current directory...`)\n } else {\n // Remove from ~/.scriptdb\n if (!existsSync(PACKAGE_JSON)) {\n console.error('No ScriptDB packages found')\n console.log('Run \"scriptdb add <package>\" first to install packages')\n process.exit(1)\n }\n cwd = SCRIPTDB_DIR\n console.log(`Removing ${pkgs.join(', ')} from ScriptDB packages...`)\n }\n\n const cmd = 'bun remove ' + pkgs.join(' ')\n execSync(cmd, { stdio: 'inherit', cwd })\n\n if (isLocal) {\n console.log(`✓ Successfully removed ${pkgs.join(', ')} locally`)\n } else {\n console.log(`✓ Successfully removed ${pkgs.join(', ')} from ~/.scriptdb/packages`)\n }\n } catch (error) {\n console.error('Failed to remove packages')\n process.exit(1)\n }\n}\n\nfunction ensureScriptDBDir() {\n // Create ~/.scriptdb directory if it doesn't exist\n if (!existsSync(SCRIPTDB_DIR)) {\n mkdirSync(SCRIPTDB_DIR, { recursive: true })\n }\n\n // Create package.json if it doesn't exist\n if (!existsSync(PACKAGE_JSON)) {\n const packageJsonContent = {\n \"name\": \"scriptdb-workspace\",\n \"version\": \"1.1.2\",\n \"description\": \"ScriptDB workspace for custom scripts, services, and databases\",\n \"private\": true,\n \"devDependencies\": {\n \"@types/bun\": \"^1.3.2\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n \"@typescript-eslint/parser\": \"^6.0.0\",\n \"bun-types\": \"latest\",\n \"eslint\": \"^8.0.0\",\n \"typescript\": \"^5.0.0\"\n },\n \"dependencies\": {\n \"lodash\": \"^4.17.21\"\n }\n }\n writeFileSync(PACKAGE_JSON, JSON.stringify(packageJsonContent, null, 2))\n console.log('Created ~/.scriptdb/package.json')\n }\n}\n\n// Create or update ecosystem config in ~/.scriptdb/\nfunction ensureEcosystemConfig() {\n ensureScriptDBDir()\n\n // Create bin directory if it doesn't exist\n const binDir = join(SCRIPTDB_DIR, 'bin')\n if (!existsSync(binDir)) {\n mkdirSync(binDir, { recursive: true })\n }\n\n if (!existsSync(ECOSYSTEM_FILE)) {\n const exePath = join(binDir, 'scriptdb.exe')\n const template = `module.exports = {\n apps: [{\n name: 'scriptdb',\n script: '${exePath}',\n args: 'start --force',\n cwd: '${SCRIPTDB_DIR}',\n instances: 1,\n autorestart: true,\n watch: false,\n max_memory_restart: '1G',\n env: {\n NODE_ENV: 'production'\n },\n error_file: '${join(SCRIPTDB_DIR, 'pm2-error.log')}',\n out_file: '${join(SCRIPTDB_DIR, 'pm2-out.log')}',\n log_file: '${join(SCRIPTDB_DIR, 'pm2-combined.log')}',\n time: true,\n log_date_format: 'YYYY-MM-DD HH:mm:ss Z',\n merge_logs: true\n }]\n};`\n\n writeFileSync(ECOSYSTEM_FILE, template)\n console.log(`Created ecosystem config: ${ECOSYSTEM_FILE}`)\n }\n}\n\nmain().catch((err: Error) => {\n console.error('Unexpected error:', err)\n process.exit(1)\n})\n\nfunction printHelp() {\n console.log(`\nScriptDB CLI - Database management with TypeScript scripting\n\nUsage:\n scriptdb [command] [options]\n\nCommands:\n start Start the ScriptDB server\n -d, --daemon Run in background (PM2 daemon mode)\n --force Skip duplicate check (used internally by PM2)\n stop Stop the running server\n restart Restart the server\n -d, --daemon Run in background after restart\n status Check server status\n logs View real-time logs\n monit Monitor performance (CPU, memory, etc.)\n shell Start interactive shell (requires server running)\n add Install packages to ~/.scriptdb/packages\n --local, -l Install to current directory instead of ~/.scriptdb\n remove, rm Remove packages from ~/.scriptdb/packages\n --local, -l Remove from current directory instead of ~/.scriptdb\n help Show this help message\n version Show version information\n\nExamples:\n scriptdb start -d Start server in background\n scriptdb status Check if server is running\n scriptdb logs View real-time logs\n scriptdb monit Monitor performance\n scriptdb shell Start interactive shell\n scriptdb stop Stop the server\n scriptdb restart -d Restart in background\n scriptdb add lodash Install package to ScriptDB\n scriptdb add axios express Install multiple packages\n scriptdb add --local lodash Install to current directory\n scriptdb remove lodash Remove package from ScriptDB\n\nConfiguration:\n Configuration file: ~/.scriptdb/config.json\n\n Example config.json:\n {\n \"host\": \"localhost\",\n \"port\": 1234,\n \"users\": [\n {\n \"username\": \"admin\",\n \"password\": \"your-password\",\n \"hash\": false\n }\n ],\n \"folder\": \"databases\",\n \"secure\": false\n }\n\nProcess Management:\n - PM2 ecosystem file: ~/.scriptdb/ecosystem.config.js\n - PM2 logs: ~/.scriptdb/pm2-*.log\n`)\n}\n\nfunction printVersion() {\n // Read version from package.json\n const packageJson = readFileSync(join(__dirname, '../package.json'), 'utf-8')\n const { version } = JSON.parse(packageJson)\n console.log(`ScriptDB CLI v${version}`)\n}\n","import { createInterface } from 'readline'\nimport Client from '../../client/src/index'\n\ninterface ShellOptions {\n host: string\n port: number\n secure?: boolean\n}\n\nexport async function startShell(options: ShellOptions) {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: '> '\n })\n\n console.log('\\nScriptDB Shell')\n console.log('==============')\n console.log(`Connecting to ${options.host}:${options.port}...`)\n\n // Login prompt\n const username = await question(rl, 'Username: ')\n const password = await question(rl, 'Password: ', true)\n\n let client: Client\n let token: string | undefined\n\n try {\n // Connect and login\n client = new Client(`scriptdb://${options.host}:${options.port}`, {\n secure: options.secure || false,\n logger: {\n debug: () => {}, // Silent\n info: () => {},\n warn: console.warn,\n error: console.error\n }\n })\n\n await client.connect()\n\n // Login\n const loginResult: any = await client.execute({\n action: 'login',\n data: { username, password }\n })\n\n if (loginResult.error) {\n console.error('\\n✗ Login failed:', loginResult.error)\n await client.close()\n rl.close()\n return\n }\n\n token = loginResult.token\n console.log('\\n✓ Connected successfully!')\n console.log('\\nType your TypeScript code and press Enter to execute.')\n console.log('Commands: .exit, .quit, .help, .dbs, .use <name>, .create <name>')\n console.log()\n\n let currentDb: string | undefined\n\n rl.prompt()\n\n rl.on('line', async (line) => {\n const trimmed = line.trim()\n\n if (!trimmed) {\n rl.prompt()\n return\n }\n\n // Handle shell commands\n if (trimmed === '.exit' || trimmed === '.quit') {\n console.log('Goodbye!')\n await client.close()\n rl.close()\n return\n }\n\n if (trimmed === '.help') {\n printShellHelp()\n rl.prompt()\n return\n }\n\n if (trimmed === '.dbs') {\n try {\n const result: any = await client.execute({\n action: 'list-dbs',\n data: { token }\n })\n if (result.error) {\n console.error('Error:', result.error)\n } else {\n console.log('\\nDatabases:')\n if (result.databases && result.databases.length > 0) {\n result.databases.forEach((db: string) => {\n const marker = db === currentDb ? ' *' : ''\n console.log(` - ${db}${marker}`)\n })\n } else {\n console.log(' (no databases)')\n }\n console.log()\n }\n } catch (err) {\n console.error('Error:', err)\n }\n rl.prompt()\n return\n }\n\n if (trimmed.startsWith('.use ')) {\n currentDb = trimmed.substring(5).trim()\n console.log(`✓ Using database: ${currentDb}`)\n rl.prompt()\n return\n }\n\n if (trimmed.startsWith('.create ')) {\n const dbName = trimmed.substring(8).trim()\n try {\n const result: any = await client.execute({\n action: 'create-db',\n data: { token, databaseName: dbName }\n })\n if (result.error) {\n console.error('Error:', result.error)\n } else {\n console.log(`✓ Created database: ${dbName}`)\n currentDb = dbName\n }\n } catch (err) {\n console.error('Error:', err)\n }\n rl.prompt()\n return\n }\n\n // Execute code\n if (!currentDb) {\n console.error('Error: No database selected. Use .use <name> or .create <name>')\n rl.prompt()\n return\n }\n\n try {\n const result: any = await client.execute({\n action: 'script-code',\n data: {\n token,\n databaseName: currentDb,\n code: trimmed\n }\n })\n\n if (result.error) {\n console.error('Error:', result.error)\n } else {\n // Pretty print result\n if (result.result !== undefined) {\n console.log(formatResult(result.result))\n }\n }\n } catch (err: any) {\n console.error('Error:', err.message || err)\n }\n\n rl.prompt()\n })\n\n rl.on('close', async () => {\n console.log('\\nGoodbye!')\n await client.close()\n process.exit(0)\n })\n\n } catch (err: any) {\n console.error('\\n✗ Connection failed:', err.message || err)\n rl.close()\n process.exit(1)\n }\n}\n\nfunction question(rl: any, prompt: string, silent: boolean = false): Promise<string> {\n return new Promise((resolve) => {\n if (silent) {\n // Hide password input\n const stdin = process.stdin as any\n stdin.setRawMode?.(true)\n process.stdout.write(prompt)\n\n let password = ''\n stdin.on('data', function onData(char: Buffer) {\n const c = char.toString()\n if (c === '\\n' || c === '\\r' || c === '\\u0004') {\n stdin.setRawMode?.(false)\n stdin.removeListener('data', onData)\n process.stdout.write('\\n')\n resolve(password)\n } else if (c === '\\u0003') {\n // Ctrl+C\n stdin.setRawMode?.(false)\n process.exit(1)\n } else if (c === '\\u007f' || c === '\\b') {\n // Backspace\n if (password.length > 0) {\n password = password.slice(0, -1)\n process.stdout.write('\\b \\b')\n }\n } else {\n password += c\n process.stdout.write('*')\n }\n })\n } else {\n rl.question(prompt, (answer: string) => {\n resolve(answer)\n })\n }\n })\n}\n\nfunction formatResult(result: any): string {\n if (result === null) return 'null'\n if (result === undefined) return 'undefined'\n\n if (typeof result === 'object') {\n try {\n return JSON.stringify(result, null, 2)\n } catch {\n return String(result)\n }\n }\n\n return String(result)\n}\n\nfunction printShellHelp() {\n console.log(`\nShell Commands:\n .exit, .quit Exit the shell\n .help Show this help\n .dbs List all databases\n .use <name> Switch to a database\n .create <name> Create a new database\n\nExecute TypeScript:\n Just type your code and press Enter\n\nExamples:\n .create mydb\n .use mydb\n const x = 1 + 1\n x\n [1,2,3].map(n => n * 2)\n`)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAEA,QAAM,eAAe,CAAC,cAAc,eAAe,WAAW;AAC9D,QAAM,UAAU,OAAO,SAAS;AAEhC,QAAI,QAAS,cAAa,KAAK,MAAM;AAErC,WAAO,UAAU;AAAA,MACf;AAAA,MACA,cAAc,OAAO,MAAM,CAAC;AAAA,MAC5B,MAAM;AAAA,MACN;AAAA,MACA,sBAAsB,uBAAO,wBAAwB;AAAA,MACrD,WAAW,uBAAO,WAAW;AAAA,MAC7B,aAAa,uBAAO,aAAa;AAAA,MACjC,YAAY,uBAAO,WAAW;AAAA,MAC9B,MAAM,MAAM;AAAA,MAAC;AAAA,IACf;AAAA;AAAA;;;ACjBA;AAAA;AAAA;AAEA,QAAM,EAAE,aAAa,IAAI;AAEzB,QAAM,aAAa,OAAO,OAAO,OAAO;AAUxC,aAAS,OAAO,MAAM,aAAa;AACjC,UAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAI,KAAK,WAAW,EAAG,QAAO,KAAK,CAAC;AAEpC,YAAM,SAAS,OAAO,YAAY,WAAW;AAC7C,UAAI,SAAS;AAEb,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,CAAC;AAClB,eAAO,IAAI,KAAK,MAAM;AACtB,kBAAU,IAAI;AAAA,MAChB;AAEA,UAAI,SAAS,aAAa;AACxB,eAAO,IAAI,WAAW,OAAO,QAAQ,OAAO,YAAY,MAAM;AAAA,MAChE;AAEA,aAAO;AAAA,IACT;AAYA,aAAS,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AACnD,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,SAAS,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;AAAA,MAC7C;AAAA,IACF;AASA,aAAS,QAAQ,QAAQ,MAAM;AAC7B,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAO,CAAC,KAAK,KAAK,IAAI,CAAC;AAAA,MACzB;AAAA,IACF;AASA,aAAS,cAAc,KAAK;AAC1B,UAAI,IAAI,WAAW,IAAI,OAAO,YAAY;AACxC,eAAO,IAAI;AAAA,MACb;AAEA,aAAO,IAAI,OAAO,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,MAAM;AAAA,IACrE;AAUA,aAAS,SAAS,MAAM;AACtB,eAAS,WAAW;AAEpB,UAAI,OAAO,SAAS,IAAI,EAAG,QAAO;AAElC,UAAI;AAEJ,UAAI,gBAAgB,aAAa;AAC/B,cAAM,IAAI,WAAW,IAAI;AAAA,MAC3B,WAAW,YAAY,OAAO,IAAI,GAAG;AACnC,cAAM,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAAA,MACpE,OAAO;AACL,cAAM,OAAO,KAAK,IAAI;AACtB,iBAAS,WAAW;AAAA,MACtB;AAEA,aAAO;AAAA,IACT;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAGA,QAAI,CAAC,QAAQ,IAAI,mBAAmB;AAClC,UAAI;AACF,cAAM,aAAa,UAAQ,YAAY;AAEvC,eAAO,QAAQ,OAAO,SAAU,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AACpE,cAAI,SAAS,GAAI,OAAM,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAAA,cACtD,YAAW,KAAK,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAAA,QAC3D;AAEA,eAAO,QAAQ,SAAS,SAAU,QAAQ,MAAM;AAC9C,cAAI,OAAO,SAAS,GAAI,SAAQ,QAAQ,IAAI;AAAA,cACvC,YAAW,OAAO,QAAQ,IAAI;AAAA,QACrC;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAAA;AAAA;;;AClIA;AAAA;AAAA;AAEA,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,OAAO,uBAAO,MAAM;AAM1B,QAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOZ,YAAY,aAAa;AACvB,aAAK,KAAK,IAAI,MAAM;AAClB,eAAK;AACL,eAAK,IAAI,EAAE;AAAA,QACb;AACA,aAAK,cAAc,eAAe;AAClC,aAAK,OAAO,CAAC;AACb,aAAK,UAAU;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,IAAI,KAAK;AACP,aAAK,KAAK,KAAK,GAAG;AAClB,aAAK,IAAI,EAAE;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,CAAC,IAAI,IAAI;AACP,YAAI,KAAK,YAAY,KAAK,YAAa;AAEvC,YAAI,KAAK,KAAK,QAAQ;AACpB,gBAAM,MAAM,KAAK,KAAK,MAAM;AAE5B,eAAK;AACL,cAAI,KAAK,KAAK,CAAC;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACtDjB;AAAA;AAAA;AAEA,QAAM,OAAO,UAAQ,MAAM;AAE3B,QAAM,aAAa;AACnB,QAAM,UAAU;AAChB,QAAM,EAAE,YAAY,IAAI;AAExB,QAAM,aAAa,OAAO,OAAO,OAAO;AACxC,QAAM,UAAU,OAAO,KAAK,CAAC,GAAM,GAAM,KAAM,GAAI,CAAC;AACpD,QAAM,qBAAqB,uBAAO,oBAAoB;AACtD,QAAM,eAAe,uBAAO,cAAc;AAC1C,QAAM,YAAY,uBAAO,UAAU;AACnC,QAAM,WAAW,uBAAO,SAAS;AACjC,QAAM,SAAS,uBAAO,OAAO;AAS7B,QAAI;AAKJ,QAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBtB,YAAY,SAAS,UAAU,YAAY;AACzC,aAAK,cAAc,aAAa;AAChC,aAAK,WAAW,WAAW,CAAC;AAC5B,aAAK,aACH,KAAK,SAAS,cAAc,SAAY,KAAK,SAAS,YAAY;AACpE,aAAK,YAAY,CAAC,CAAC;AACnB,aAAK,WAAW;AAChB,aAAK,WAAW;AAEhB,aAAK,SAAS;AAEd,YAAI,CAAC,aAAa;AAChB,gBAAM,cACJ,KAAK,SAAS,qBAAqB,SAC/B,KAAK,SAAS,mBACd;AACN,wBAAc,IAAI,QAAQ,WAAW;AAAA,QACvC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,WAAW,gBAAgB;AACzB,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ;AACN,cAAM,SAAS,CAAC;AAEhB,YAAI,KAAK,SAAS,yBAAyB;AACzC,iBAAO,6BAA6B;AAAA,QACtC;AACA,YAAI,KAAK,SAAS,yBAAyB;AACzC,iBAAO,6BAA6B;AAAA,QACtC;AACA,YAAI,KAAK,SAAS,qBAAqB;AACrC,iBAAO,yBAAyB,KAAK,SAAS;AAAA,QAChD;AACA,YAAI,KAAK,SAAS,qBAAqB;AACrC,iBAAO,yBAAyB,KAAK,SAAS;AAAA,QAChD,WAAW,KAAK,SAAS,uBAAuB,MAAM;AACpD,iBAAO,yBAAyB;AAAA,QAClC;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,gBAAgB;AACrB,yBAAiB,KAAK,gBAAgB,cAAc;AAEpD,aAAK,SAAS,KAAK,YACf,KAAK,eAAe,cAAc,IAClC,KAAK,eAAe,cAAc;AAEtC,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,UAAU;AACR,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,MAAM;AACpB,eAAK,WAAW;AAAA,QAClB;AAEA,YAAI,KAAK,UAAU;AACjB,gBAAM,WAAW,KAAK,SAAS,SAAS;AAExC,eAAK,SAAS,MAAM;AACpB,eAAK,WAAW;AAEhB,cAAI,UAAU;AACZ;AAAA,cACE,IAAI;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,eAAe,QAAQ;AACrB,cAAM,OAAO,KAAK;AAClB,cAAM,WAAW,OAAO,KAAK,CAAC,WAAW;AACvC,cACG,KAAK,4BAA4B,SAChC,OAAO,8BACR,OAAO,2BACL,KAAK,wBAAwB,SAC3B,OAAO,KAAK,wBAAwB,YACnC,KAAK,sBAAsB,OAAO,2BACvC,OAAO,KAAK,wBAAwB,YACnC,CAAC,OAAO,wBACV;AACA,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAChE;AAEA,YAAI,KAAK,yBAAyB;AAChC,mBAAS,6BAA6B;AAAA,QACxC;AACA,YAAI,KAAK,yBAAyB;AAChC,mBAAS,6BAA6B;AAAA,QACxC;AACA,YAAI,OAAO,KAAK,wBAAwB,UAAU;AAChD,mBAAS,yBAAyB,KAAK;AAAA,QACzC;AACA,YAAI,OAAO,KAAK,wBAAwB,UAAU;AAChD,mBAAS,yBAAyB,KAAK;AAAA,QACzC,WACE,SAAS,2BAA2B,QACpC,KAAK,wBAAwB,OAC7B;AACA,iBAAO,SAAS;AAAA,QAClB;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,eAAe,UAAU;AACvB,cAAM,SAAS,SAAS,CAAC;AAEzB,YACE,KAAK,SAAS,4BAA4B,SAC1C,OAAO,4BACP;AACA,gBAAM,IAAI,MAAM,mDAAmD;AAAA,QACrE;AAEA,YAAI,CAAC,OAAO,wBAAwB;AAClC,cAAI,OAAO,KAAK,SAAS,wBAAwB,UAAU;AACzD,mBAAO,yBAAyB,KAAK,SAAS;AAAA,UAChD;AAAA,QACF,WACE,KAAK,SAAS,wBAAwB,SACrC,OAAO,KAAK,SAAS,wBAAwB,YAC5C,OAAO,yBAAyB,KAAK,SAAS,qBAChD;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,gBAAgB,gBAAgB;AAC9B,uBAAe,QAAQ,CAAC,WAAW;AACjC,iBAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACnC,gBAAI,QAAQ,OAAO,GAAG;AAEtB,gBAAI,MAAM,SAAS,GAAG;AACpB,oBAAM,IAAI,MAAM,cAAc,GAAG,iCAAiC;AAAA,YACpE;AAEA,oBAAQ,MAAM,CAAC;AAEf,gBAAI,QAAQ,0BAA0B;AACpC,kBAAI,UAAU,MAAM;AAClB,sBAAM,MAAM,CAAC;AACb,oBAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,IAAI;AACjD,wBAAM,IAAI;AAAA,oBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,kBAChD;AAAA,gBACF;AACA,wBAAQ;AAAA,cACV,WAAW,CAAC,KAAK,WAAW;AAC1B,sBAAM,IAAI;AAAA,kBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,gBAChD;AAAA,cACF;AAAA,YACF,WAAW,QAAQ,0BAA0B;AAC3C,oBAAM,MAAM,CAAC;AACb,kBAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,IAAI;AACjD,sBAAM,IAAI;AAAA,kBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,gBAChD;AAAA,cACF;AACA,sBAAQ;AAAA,YACV,WACE,QAAQ,gCACR,QAAQ,8BACR;AACA,kBAAI,UAAU,MAAM;AAClB,sBAAM,IAAI;AAAA,kBACR,gCAAgC,GAAG,MAAM,KAAK;AAAA,gBAChD;AAAA,cACF;AAAA,YACF,OAAO;AACL,oBAAM,IAAI,MAAM,sBAAsB,GAAG,GAAG;AAAA,YAC9C;AAEA,mBAAO,GAAG,IAAI;AAAA,UAChB,CAAC;AAAA,QACH,CAAC;AAED,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,WAAW,MAAM,KAAK,UAAU;AAC9B,oBAAY,IAAI,CAAC,SAAS;AACxB,eAAK,YAAY,MAAM,KAAK,CAAC,KAAK,WAAW;AAC3C,iBAAK;AACL,qBAAS,KAAK,MAAM;AAAA,UACtB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,SAAS,MAAM,KAAK,UAAU;AAC5B,oBAAY,IAAI,CAAC,SAAS;AACxB,eAAK,UAAU,MAAM,KAAK,CAAC,KAAK,WAAW;AACzC,iBAAK;AACL,qBAAS,KAAK,MAAM;AAAA,UACtB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,YAAY,MAAM,KAAK,UAAU;AAC/B,cAAM,WAAW,KAAK,YAAY,WAAW;AAE7C,YAAI,CAAC,KAAK,UAAU;AAClB,gBAAM,MAAM,GAAG,QAAQ;AACvB,gBAAM,aACJ,OAAO,KAAK,OAAO,GAAG,MAAM,WACxB,KAAK,uBACL,KAAK,OAAO,GAAG;AAErB,eAAK,WAAW,KAAK,iBAAiB;AAAA,YACpC,GAAG,KAAK,SAAS;AAAA,YACjB;AAAA,UACF,CAAC;AACD,eAAK,SAAS,kBAAkB,IAAI;AACpC,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAC3B,eAAK,SAAS,GAAG,SAAS,cAAc;AACxC,eAAK,SAAS,GAAG,QAAQ,aAAa;AAAA,QACxC;AAEA,aAAK,SAAS,SAAS,IAAI;AAE3B,aAAK,SAAS,MAAM,IAAI;AACxB,YAAI,IAAK,MAAK,SAAS,MAAM,OAAO;AAEpC,aAAK,SAAS,MAAM,MAAM;AACxB,gBAAM,MAAM,KAAK,SAAS,MAAM;AAEhC,cAAI,KAAK;AACP,iBAAK,SAAS,MAAM;AACpB,iBAAK,WAAW;AAChB,qBAAS,GAAG;AACZ;AAAA,UACF;AAEA,gBAAMA,QAAO,WAAW;AAAA,YACtB,KAAK,SAAS,QAAQ;AAAA,YACtB,KAAK,SAAS,YAAY;AAAA,UAC5B;AAEA,cAAI,KAAK,SAAS,eAAe,YAAY;AAC3C,iBAAK,SAAS,MAAM;AACpB,iBAAK,WAAW;AAAA,UAClB,OAAO;AACL,iBAAK,SAAS,YAAY,IAAI;AAC9B,iBAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,gBAAI,OAAO,KAAK,OAAO,GAAG,QAAQ,sBAAsB,GAAG;AACzD,mBAAK,SAAS,MAAM;AAAA,YACtB;AAAA,UACF;AAEA,mBAAS,MAAMA,KAAI;AAAA,QACrB,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,UAAU,MAAM,KAAK,UAAU;AAC7B,cAAM,WAAW,KAAK,YAAY,WAAW;AAE7C,YAAI,CAAC,KAAK,UAAU;AAClB,gBAAM,MAAM,GAAG,QAAQ;AACvB,gBAAM,aACJ,OAAO,KAAK,OAAO,GAAG,MAAM,WACxB,KAAK,uBACL,KAAK,OAAO,GAAG;AAErB,eAAK,WAAW,KAAK,iBAAiB;AAAA,YACpC,GAAG,KAAK,SAAS;AAAA,YACjB;AAAA,UACF,CAAC;AAED,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,eAAK,SAAS,GAAG,QAAQ,aAAa;AAAA,QACxC;AAEA,aAAK,SAAS,SAAS,IAAI;AAE3B,aAAK,SAAS,MAAM,IAAI;AACxB,aAAK,SAAS,MAAM,KAAK,cAAc,MAAM;AAC3C,cAAI,CAAC,KAAK,UAAU;AAIlB;AAAA,UACF;AAEA,cAAIA,QAAO,WAAW;AAAA,YACpB,KAAK,SAAS,QAAQ;AAAA,YACtB,KAAK,SAAS,YAAY;AAAA,UAC5B;AAEA,cAAI,KAAK;AACP,YAAAA,QAAO,IAAI,WAAWA,MAAK,QAAQA,MAAK,YAAYA,MAAK,SAAS,CAAC;AAAA,UACrE;AAMA,eAAK,SAAS,SAAS,IAAI;AAE3B,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,cAAI,OAAO,KAAK,OAAO,GAAG,QAAQ,sBAAsB,GAAG;AACzD,iBAAK,SAAS,MAAM;AAAA,UACtB;AAEA,mBAAS,MAAMA,KAAI;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,UAAU;AAQjB,aAAS,cAAc,OAAO;AAC5B,WAAK,QAAQ,EAAE,KAAK,KAAK;AACzB,WAAK,YAAY,KAAK,MAAM;AAAA,IAC9B;AAQA,aAAS,cAAc,OAAO;AAC5B,WAAK,YAAY,KAAK,MAAM;AAE5B,UACE,KAAK,kBAAkB,EAAE,cAAc,KACvC,KAAK,YAAY,KAAK,KAAK,kBAAkB,EAAE,aAC/C;AACA,aAAK,QAAQ,EAAE,KAAK,KAAK;AACzB;AAAA,MACF;AAEA,WAAK,MAAM,IAAI,IAAI,WAAW,2BAA2B;AACzD,WAAK,MAAM,EAAE,OAAO;AACpB,WAAK,MAAM,EAAE,WAAW,IAAI;AAC5B,WAAK,eAAe,QAAQ,aAAa;AASzC,WAAK,MAAM;AAAA,IACb;AAQA,aAAS,eAAe,KAAK;AAK3B,WAAK,kBAAkB,EAAE,WAAW;AAEpC,UAAI,KAAK,MAAM,GAAG;AAChB,aAAK,SAAS,EAAE,KAAK,MAAM,CAAC;AAC5B;AAAA,MACF;AAEA,UAAI,WAAW,IAAI;AACnB,WAAK,SAAS,EAAE,GAAG;AAAA,IACrB;AAAA;AAAA;;;AC/gBA;AAAA;AAAA;AAEA,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AAEnC,QAAM,EAAE,QAAQ,IAAI;AAcpB,QAAM,aAAa;AAAA,MACjB;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,MAC7C;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA;AAAA,IAC/C;AASA,aAAS,kBAAkB,MAAM;AAC/B,aACG,QAAQ,OACP,QAAQ,QACR,SAAS,QACT,SAAS,QACT,SAAS,QACV,QAAQ,OAAQ,QAAQ;AAAA,IAE7B;AAWA,aAAS,aAAa,KAAK;AACzB,YAAM,MAAM,IAAI;AAChB,UAAI,IAAI;AAER,aAAO,IAAI,KAAK;AACd,aAAK,IAAI,CAAC,IAAI,SAAU,GAAG;AAEzB;AAAA,QACF,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,MAAM,QACT,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,CAAC,IAAI,SAAU,KACpB;AACA,mBAAO;AAAA,UACT;AAEA,eAAK;AAAA,QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACvB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;AAAA,UAC3C,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU,KAC5C;AACA,mBAAO;AAAA,UACT;AAEA,eAAK;AAAA,QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACvB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;AAAA,UAC3C,IAAI,CAAC,MAAM,OAAQ,IAAI,IAAI,CAAC,IAAI,OACjC,IAAI,CAAC,IAAI,KACT;AACA,mBAAO;AAAA,UACT;AAEA,eAAK;AAAA,QACP,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AASA,aAAS,OAAO,OAAO;AACrB,aACE,WACA,OAAO,UAAU,YACjB,OAAO,MAAM,gBAAgB,cAC7B,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,WAAW,eACvB,MAAM,OAAO,WAAW,MAAM,UAC7B,MAAM,OAAO,WAAW,MAAM;AAAA,IAEpC;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,aAAO,QAAQ,cAAc,SAAU,KAAK;AAC1C,eAAO,IAAI,SAAS,KAAK,aAAa,GAAG,IAAI,OAAO,GAAG;AAAA,MACzD;AAAA,IACF,WAAuC,CAAC,QAAQ,IAAI,sBAAsB;AACxE,UAAI;AACF,cAAM,cAAc,UAAQ,gBAAgB;AAE5C,eAAO,QAAQ,cAAc,SAAU,KAAK;AAC1C,iBAAO,IAAI,SAAS,KAAK,aAAa,GAAG,IAAI,YAAY,GAAG;AAAA,QAC9D;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAAA;AAAA;;;ACvJA;AAAA;AAAA;AAEA,QAAM,EAAE,SAAS,IAAI,UAAQ,QAAQ;AAErC,QAAM,oBAAoB;AAC1B,QAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,QAAM,EAAE,QAAQ,eAAe,OAAO,IAAI;AAC1C,QAAM,EAAE,mBAAmB,YAAY,IAAI;AAE3C,QAAM,aAAa,OAAO,OAAO,OAAO;AAExC,QAAM,WAAW;AACjB,QAAM,wBAAwB;AAC9B,QAAM,wBAAwB;AAC9B,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,cAAc;AAOpB,QAAMC,YAAN,cAAuB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiB9B,YAAY,UAAU,CAAC,GAAG;AACxB,cAAM;AAEN,aAAK,0BACH,QAAQ,2BAA2B,SAC/B,QAAQ,yBACR;AACN,aAAK,cAAc,QAAQ,cAAc,aAAa,CAAC;AACvD,aAAK,cAAc,QAAQ,cAAc,CAAC;AAC1C,aAAK,YAAY,CAAC,CAAC,QAAQ;AAC3B,aAAK,cAAc,QAAQ,aAAa;AACxC,aAAK,sBAAsB,CAAC,CAAC,QAAQ;AACrC,aAAK,UAAU,IAAI;AAEnB,aAAK,iBAAiB;AACtB,aAAK,WAAW,CAAC;AAEjB,aAAK,cAAc;AACnB,aAAK,iBAAiB;AACtB,aAAK,QAAQ;AACb,aAAK,cAAc;AACnB,aAAK,UAAU;AACf,aAAK,OAAO;AACZ,aAAK,UAAU;AAEf,aAAK,sBAAsB;AAC3B,aAAK,iBAAiB;AACtB,aAAK,aAAa,CAAC;AAEnB,aAAK,WAAW;AAChB,aAAK,QAAQ;AACb,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,OAAO,OAAO,UAAU,IAAI;AAC1B,YAAI,KAAK,YAAY,KAAQ,KAAK,UAAU,SAAU,QAAO,GAAG;AAEhE,aAAK,kBAAkB,MAAM;AAC7B,aAAK,SAAS,KAAK,KAAK;AACxB,aAAK,UAAU,EAAE;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,QAAQ,GAAG;AACT,aAAK,kBAAkB;AAEvB,YAAI,MAAM,KAAK,SAAS,CAAC,EAAE,OAAQ,QAAO,KAAK,SAAS,MAAM;AAE9D,YAAI,IAAI,KAAK,SAAS,CAAC,EAAE,QAAQ;AAC/B,gBAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,eAAK,SAAS,CAAC,IAAI,IAAI;AAAA,YACrB,IAAI;AAAA,YACJ,IAAI,aAAa;AAAA,YACjB,IAAI,SAAS;AAAA,UACf;AAEA,iBAAO,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,CAAC;AAAA,QACrD;AAEA,cAAM,MAAM,OAAO,YAAY,CAAC;AAEhC,WAAG;AACD,gBAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,gBAAM,SAAS,IAAI,SAAS;AAE5B,cAAI,KAAK,IAAI,QAAQ;AACnB,gBAAI,IAAI,KAAK,SAAS,MAAM,GAAG,MAAM;AAAA,UACvC,OAAO;AACL,gBAAI,IAAI,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,CAAC,GAAG,MAAM;AAC7D,iBAAK,SAAS,CAAC,IAAI,IAAI;AAAA,cACrB,IAAI;AAAA,cACJ,IAAI,aAAa;AAAA,cACjB,IAAI,SAAS;AAAA,YACf;AAAA,UACF;AAEA,eAAK,IAAI;AAAA,QACX,SAAS,IAAI;AAEb,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,UAAU,IAAI;AACZ,aAAK,QAAQ;AAEb,WAAG;AACD,kBAAQ,KAAK,QAAQ;AAAA,YACnB,KAAK;AACH,mBAAK,QAAQ,EAAE;AACf;AAAA,YACF,KAAK;AACH,mBAAK,mBAAmB,EAAE;AAC1B;AAAA,YACF,KAAK;AACH,mBAAK,mBAAmB,EAAE;AAC1B;AAAA,YACF,KAAK;AACH,mBAAK,QAAQ;AACb;AAAA,YACF,KAAK;AACH,mBAAK,QAAQ,EAAE;AACf;AAAA,YACF,KAAK;AAAA,YACL,KAAK;AACH,mBAAK,QAAQ;AACb;AAAA,UACJ;AAAA,QACF,SAAS,KAAK;AAEd,YAAI,CAAC,KAAK,SAAU,IAAG;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ,IAAI;AACV,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,cAAM,MAAM,KAAK,QAAQ,CAAC;AAE1B,aAAK,IAAI,CAAC,IAAI,QAAU,GAAM;AAC5B,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,cAAM,cAAc,IAAI,CAAC,IAAI,QAAU;AAEvC,YAAI,cAAc,CAAC,KAAK,YAAY,kBAAkB,aAAa,GAAG;AACpE,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,aAAK,QAAQ,IAAI,CAAC,IAAI,SAAU;AAChC,aAAK,UAAU,IAAI,CAAC,IAAI;AACxB,aAAK,iBAAiB,IAAI,CAAC,IAAI;AAE/B,YAAI,KAAK,YAAY,GAAM;AACzB,cAAI,YAAY;AACd,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cAAI,CAAC,KAAK,aAAa;AACrB,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,eAAK,UAAU,KAAK;AAAA,QACtB,WAAW,KAAK,YAAY,KAAQ,KAAK,YAAY,GAAM;AACzD,cAAI,KAAK,aAAa;AACpB,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA,kBAAkB,KAAK,OAAO;AAAA,cAC9B;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,eAAK,cAAc;AAAA,QACrB,WAAW,KAAK,UAAU,KAAQ,KAAK,UAAU,IAAM;AACrD,cAAI,CAAC,KAAK,MAAM;AACd,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cAAI,YAAY;AACd,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cACE,KAAK,iBAAiB,OACrB,KAAK,YAAY,KAAQ,KAAK,mBAAmB,GAClD;AACA,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA,0BAA0B,KAAK,cAAc;AAAA,cAC7C;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA,kBAAkB,KAAK,OAAO;AAAA,YAC9B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,YAAa,MAAK,cAAc,KAAK;AAC7D,aAAK,WAAW,IAAI,CAAC,IAAI,SAAU;AAEnC,YAAI,KAAK,WAAW;AAClB,cAAI,CAAC,KAAK,SAAS;AACjB,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAAA,QACF,WAAW,KAAK,SAAS;AACvB,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,YAAI,KAAK,mBAAmB,IAAK,MAAK,SAAS;AAAA,iBACtC,KAAK,mBAAmB,IAAK,MAAK,SAAS;AAAA,YAC/C,MAAK,WAAW,EAAE;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,mBAAmB,IAAI;AACrB,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,aAAK,iBAAiB,KAAK,QAAQ,CAAC,EAAE,aAAa,CAAC;AACpD,aAAK,WAAW,EAAE;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,mBAAmB,IAAI;AACrB,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,cAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,cAAM,MAAM,IAAI,aAAa,CAAC;AAM9B,YAAI,MAAM,KAAK,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG;AAClC,gBAAM,QAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,aAAG,KAAK;AACR;AAAA,QACF;AAEA,aAAK,iBAAiB,MAAM,KAAK,IAAI,GAAG,EAAE,IAAI,IAAI,aAAa,CAAC;AAChE,aAAK,WAAW,EAAE;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,WAAW,IAAI;AACb,YAAI,KAAK,kBAAkB,KAAK,UAAU,GAAM;AAC9C,eAAK,uBAAuB,KAAK;AACjC,cAAI,KAAK,sBAAsB,KAAK,eAAe,KAAK,cAAc,GAAG;AACvE,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,QAAS,MAAK,SAAS;AAAA,YAC3B,MAAK,SAAS;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,UAAU;AACR,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;AAAA,QACF;AAEA,aAAK,QAAQ,KAAK,QAAQ,CAAC;AAC3B,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ,IAAI;AACV,YAAI,OAAO;AAEX,YAAI,KAAK,gBAAgB;AACvB,cAAI,KAAK,iBAAiB,KAAK,gBAAgB;AAC7C,iBAAK,QAAQ;AACb;AAAA,UACF;AAEA,iBAAO,KAAK,QAAQ,KAAK,cAAc;AAEvC,cACE,KAAK,YACJ,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,GACpE;AACA,mBAAO,MAAM,KAAK,KAAK;AAAA,UACzB;AAAA,QACF;AAEA,YAAI,KAAK,UAAU,GAAM;AACvB,eAAK,eAAe,MAAM,EAAE;AAC5B;AAAA,QACF;AAEA,YAAI,KAAK,aAAa;AACpB,eAAK,SAAS;AACd,eAAK,WAAW,MAAM,EAAE;AACxB;AAAA,QACF;AAEA,YAAI,KAAK,QAAQ;AAKf,eAAK,iBAAiB,KAAK;AAC3B,eAAK,WAAW,KAAK,IAAI;AAAA,QAC3B;AAEA,aAAK,YAAY,EAAE;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,WAAW,MAAM,IAAI;AACnB,cAAM,oBAAoB,KAAK,YAAY,kBAAkB,aAAa;AAE1E,0BAAkB,WAAW,MAAM,KAAK,MAAM,CAAC,KAAK,QAAQ;AAC1D,cAAI,IAAK,QAAO,GAAG,GAAG;AAEtB,cAAI,IAAI,QAAQ;AACd,iBAAK,kBAAkB,IAAI;AAC3B,gBAAI,KAAK,iBAAiB,KAAK,eAAe,KAAK,cAAc,GAAG;AAClE,oBAAM,QAAQ,KAAK;AAAA,gBACjB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,iBAAG,KAAK;AACR;AAAA,YACF;AAEA,iBAAK,WAAW,KAAK,GAAG;AAAA,UAC1B;AAEA,eAAK,YAAY,EAAE;AACnB,cAAI,KAAK,WAAW,SAAU,MAAK,UAAU,EAAE;AAAA,QACjD,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,YAAY,IAAI;AACd,YAAI,CAAC,KAAK,MAAM;AACd,eAAK,SAAS;AACd;AAAA,QACF;AAEA,cAAM,gBAAgB,KAAK;AAC3B,cAAM,YAAY,KAAK;AAEvB,aAAK,sBAAsB;AAC3B,aAAK,iBAAiB;AACtB,aAAK,cAAc;AACnB,aAAK,aAAa,CAAC;AAEnB,YAAI,KAAK,YAAY,GAAG;AACtB,cAAI;AAEJ,cAAI,KAAK,gBAAgB,cAAc;AACrC,mBAAO,OAAO,WAAW,aAAa;AAAA,UACxC,WAAW,KAAK,gBAAgB,eAAe;AAC7C,mBAAO,cAAc,OAAO,WAAW,aAAa,CAAC;AAAA,UACvD,WAAW,KAAK,gBAAgB,QAAQ;AACtC,mBAAO,IAAI,KAAK,SAAS;AAAA,UAC3B,OAAO;AACL,mBAAO;AAAA,UACT;AAEA,cAAI,KAAK,yBAAyB;AAChC,iBAAK,KAAK,WAAW,MAAM,IAAI;AAC/B,iBAAK,SAAS;AAAA,UAChB,OAAO;AACL,iBAAK,SAAS;AACd,yBAAa,MAAM;AACjB,mBAAK,KAAK,WAAW,MAAM,IAAI;AAC/B,mBAAK,SAAS;AACd,mBAAK,UAAU,EAAE;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,gBAAM,MAAM,OAAO,WAAW,aAAa;AAE3C,cAAI,CAAC,KAAK,uBAAuB,CAAC,YAAY,GAAG,GAAG;AAClD,kBAAM,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,eAAG,KAAK;AACR;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,aAAa,KAAK,yBAAyB;AAC7D,iBAAK,KAAK,WAAW,KAAK,KAAK;AAC/B,iBAAK,SAAS;AAAA,UAChB,OAAO;AACL,iBAAK,SAAS;AACd,yBAAa,MAAM;AACjB,mBAAK,KAAK,WAAW,KAAK,KAAK;AAC/B,mBAAK,SAAS;AACd,mBAAK,UAAU,EAAE;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,eAAe,MAAM,IAAI;AACvB,YAAI,KAAK,YAAY,GAAM;AACzB,cAAI,KAAK,WAAW,GAAG;AACrB,iBAAK,QAAQ;AACb,iBAAK,KAAK,YAAY,MAAM,YAAY;AACxC,iBAAK,IAAI;AAAA,UACX,OAAO;AACL,kBAAM,OAAO,KAAK,aAAa,CAAC;AAEhC,gBAAI,CAAC,kBAAkB,IAAI,GAAG;AAC5B,oBAAM,QAAQ,KAAK;AAAA,gBACjB;AAAA,gBACA,uBAAuB,IAAI;AAAA,gBAC3B;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,iBAAG,KAAK;AACR;AAAA,YACF;AAEA,kBAAM,MAAM,IAAI;AAAA,cACd,KAAK;AAAA,cACL,KAAK,aAAa;AAAA,cAClB,KAAK,SAAS;AAAA,YAChB;AAEA,gBAAI,CAAC,KAAK,uBAAuB,CAAC,YAAY,GAAG,GAAG;AAClD,oBAAM,QAAQ,KAAK;AAAA,gBACjB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,iBAAG,KAAK;AACR;AAAA,YACF;AAEA,iBAAK,QAAQ;AACb,iBAAK,KAAK,YAAY,MAAM,GAAG;AAC/B,iBAAK,IAAI;AAAA,UACX;AAEA,eAAK,SAAS;AACd;AAAA,QACF;AAEA,YAAI,KAAK,yBAAyB;AAChC,eAAK,KAAK,KAAK,YAAY,IAAO,SAAS,QAAQ,IAAI;AACvD,eAAK,SAAS;AAAA,QAChB,OAAO;AACL,eAAK,SAAS;AACd,uBAAa,MAAM;AACjB,iBAAK,KAAK,KAAK,YAAY,IAAO,SAAS,QAAQ,IAAI;AACvD,iBAAK,SAAS;AACd,iBAAK,UAAU,EAAE;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,YAAY,WAAW,SAAS,QAAQ,YAAY,WAAW;AAC7D,aAAK,QAAQ;AACb,aAAK,WAAW;AAEhB,cAAM,MAAM,IAAI;AAAA,UACd,SAAS,4BAA4B,OAAO,KAAK;AAAA,QACnD;AAEA,cAAM,kBAAkB,KAAK,KAAK,WAAW;AAC7C,YAAI,OAAO;AACX,YAAI,WAAW,IAAI;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,UAAUA;AAAA;AAAA;;;ACjsBjB;AAAA;AAAA;AAIA,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AACnC,QAAM,EAAE,eAAe,IAAI,UAAQ,QAAQ;AAE3C,QAAM,oBAAoB;AAC1B,QAAM,EAAE,cAAc,YAAY,KAAK,IAAI;AAC3C,QAAM,EAAE,QAAQ,kBAAkB,IAAI;AACtC,QAAM,EAAE,MAAM,WAAW,SAAS,IAAI;AAEtC,QAAM,cAAc,uBAAO,aAAa;AACxC,QAAM,aAAa,OAAO,MAAM,CAAC;AACjC,QAAM,mBAAmB,IAAI;AAC7B,QAAI;AACJ,QAAI,oBAAoB;AAExB,QAAM,UAAU;AAChB,QAAM,YAAY;AAClB,QAAM,gBAAgB;AAKtB,QAAMC,UAAN,MAAM,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASX,YAAY,QAAQ,YAAY,cAAc;AAC5C,aAAK,cAAc,cAAc,CAAC;AAElC,YAAI,cAAc;AAChB,eAAK,gBAAgB;AACrB,eAAK,cAAc,OAAO,MAAM,CAAC;AAAA,QACnC;AAEA,aAAK,UAAU;AAEf,aAAK,iBAAiB;AACtB,aAAK,YAAY;AAEjB,aAAK,iBAAiB;AACtB,aAAK,SAAS,CAAC;AACf,aAAK,SAAS;AACd,aAAK,UAAU;AACf,aAAK,UAAU,IAAI;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,OAAO,MAAM,MAAM,SAAS;AAC1B,YAAI;AACJ,YAAI,QAAQ;AACZ,YAAI,SAAS;AACb,YAAI,cAAc;AAElB,YAAI,QAAQ,MAAM;AAChB,iBAAO,QAAQ,cAAc;AAE7B,cAAI,QAAQ,cAAc;AACxB,oBAAQ,aAAa,IAAI;AAAA,UAC3B,OAAO;AACL,gBAAI,sBAAsB,kBAAkB;AAE1C,kBAAI,eAAe,QAAW;AAK5B,6BAAa,OAAO,MAAM,gBAAgB;AAAA,cAC5C;AAEA,6BAAe,YAAY,GAAG,gBAAgB;AAC9C,kCAAoB;AAAA,YACtB;AAEA,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AAAA,UAC1C;AAEA,yBAAe,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO;AAC1D,mBAAS;AAAA,QACX;AAEA,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,eACG,CAAC,QAAQ,QAAQ,gBAClB,QAAQ,WAAW,MAAM,QACzB;AACA,yBAAa,QAAQ,WAAW;AAAA,UAClC,OAAO;AACL,mBAAO,OAAO,KAAK,IAAI;AACvB,yBAAa,KAAK;AAAA,UACpB;AAAA,QACF,OAAO;AACL,uBAAa,KAAK;AAClB,kBAAQ,QAAQ,QAAQ,QAAQ,YAAY,CAAC;AAAA,QAC/C;AAEA,YAAI,gBAAgB;AAEpB,YAAI,cAAc,OAAO;AACvB,oBAAU;AACV,0BAAgB;AAAA,QAClB,WAAW,aAAa,KAAK;AAC3B,oBAAU;AACV,0BAAgB;AAAA,QAClB;AAEA,cAAM,SAAS,OAAO,YAAY,QAAQ,aAAa,SAAS,MAAM;AAEtE,eAAO,CAAC,IAAI,QAAQ,MAAM,QAAQ,SAAS,MAAO,QAAQ;AAC1D,YAAI,QAAQ,KAAM,QAAO,CAAC,KAAK;AAE/B,eAAO,CAAC,IAAI;AAEZ,YAAI,kBAAkB,KAAK;AACzB,iBAAO,cAAc,YAAY,CAAC;AAAA,QACpC,WAAW,kBAAkB,KAAK;AAChC,iBAAO,CAAC,IAAI,OAAO,CAAC,IAAI;AACxB,iBAAO,YAAY,YAAY,GAAG,CAAC;AAAA,QACrC;AAEA,YAAI,CAAC,QAAQ,KAAM,QAAO,CAAC,QAAQ,IAAI;AAEvC,eAAO,CAAC,KAAK;AACb,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAE3B,YAAI,YAAa,QAAO,CAAC,QAAQ,IAAI;AAErC,YAAI,OAAO;AACT,oBAAU,MAAM,MAAM,QAAQ,QAAQ,UAAU;AAChD,iBAAO,CAAC,MAAM;AAAA,QAChB;AAEA,kBAAU,MAAM,MAAM,MAAM,GAAG,UAAU;AACzC,eAAO,CAAC,QAAQ,IAAI;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAM,MAAM,MAAM,MAAM,IAAI;AAC1B,YAAI;AAEJ,YAAI,SAAS,QAAW;AACtB,gBAAM;AAAA,QACR,WAAW,OAAO,SAAS,YAAY,CAAC,kBAAkB,IAAI,GAAG;AAC/D,gBAAM,IAAI,UAAU,kDAAkD;AAAA,QACxE,WAAW,SAAS,UAAa,CAAC,KAAK,QAAQ;AAC7C,gBAAM,OAAO,YAAY,CAAC;AAC1B,cAAI,cAAc,MAAM,CAAC;AAAA,QAC3B,OAAO;AACL,gBAAM,SAAS,OAAO,WAAW,IAAI;AAErC,cAAI,SAAS,KAAK;AAChB,kBAAM,IAAI,WAAW,gDAAgD;AAAA,UACvE;AAEA,gBAAM,OAAO,YAAY,IAAI,MAAM;AACnC,cAAI,cAAc,MAAM,CAAC;AAEzB,cAAI,OAAO,SAAS,UAAU;AAC5B,gBAAI,MAAM,MAAM,CAAC;AAAA,UACnB,OAAO;AACL,gBAAI,IAAI,MAAM,CAAC;AAAA,UACjB;AAAA,QACF;AAEA,cAAM,UAAU;AAAA,UACd,CAAC,WAAW,GAAG,IAAI;AAAA,UACnB,KAAK;AAAA,UACL,cAAc,KAAK;AAAA,UACnB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAEA,YAAI,KAAK,WAAW,SAAS;AAC3B,eAAK,QAAQ,CAAC,KAAK,UAAU,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,QACvD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,KAAK,OAAO,GAAG,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;AAAA,QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;AAAA,QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;AAAA,QACtB;AAEA,YAAI,aAAa,KAAK;AACpB,gBAAM,IAAI,WAAW,kDAAkD;AAAA,QACzE;AAEA,cAAM,UAAU;AAAA,UACd,CAAC,WAAW,GAAG;AAAA,UACf,KAAK;AAAA,UACL,cAAc,KAAK;AAAA,UACnB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR;AAAA,UACA,MAAM;AAAA,QACR;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,UAC3D,OAAO;AACL,iBAAK,YAAY,MAAM,OAAO,SAAS,EAAE;AAAA,UAC3C;AAAA,QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,QACxD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;AAAA,QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;AAAA,QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;AAAA,QACtB;AAEA,YAAI,aAAa,KAAK;AACpB,gBAAM,IAAI,WAAW,kDAAkD;AAAA,QACzE;AAEA,cAAM,UAAU;AAAA,UACd,CAAC,WAAW,GAAG;AAAA,UACf,KAAK;AAAA,UACL,cAAc,KAAK;AAAA,UACnB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR;AAAA,UACA,MAAM;AAAA,QACR;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,UAC3D,OAAO;AACL,iBAAK,YAAY,MAAM,OAAO,SAAS,EAAE;AAAA,UAC3C;AAAA,QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,QACxD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBA,KAAK,MAAM,SAAS,IAAI;AACtB,cAAM,oBAAoB,KAAK,YAAY,kBAAkB,aAAa;AAC1E,YAAI,SAAS,QAAQ,SAAS,IAAI;AAClC,YAAI,OAAO,QAAQ;AAEnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;AAAA,QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;AAAA,QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;AAAA,QACtB;AAEA,YAAI,KAAK,gBAAgB;AACvB,eAAK,iBAAiB;AACtB,cACE,QACA,qBACA,kBAAkB,OAChB,kBAAkB,YACd,+BACA,4BACN,GACA;AACA,mBAAO,cAAc,kBAAkB;AAAA,UACzC;AACA,eAAK,YAAY;AAAA,QACnB,OAAO;AACL,iBAAO;AACP,mBAAS;AAAA,QACX;AAEA,YAAI,QAAQ,IAAK,MAAK,iBAAiB;AAEvC,cAAM,OAAO;AAAA,UACX,CAAC,WAAW,GAAG;AAAA,UACf,KAAK,QAAQ;AAAA,UACb,cAAc,KAAK;AAAA,UACnB,MAAM,QAAQ;AAAA,UACd,YAAY,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,KAAK,WAAW,MAAM,EAAE,CAAC;AAAA,UACjE,OAAO;AACL,iBAAK,YAAY,MAAM,KAAK,WAAW,MAAM,EAAE;AAAA,UACjD;AAAA,QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,KAAK,WAAW,MAAM,EAAE,CAAC;AAAA,QAC9D,OAAO;AACL,eAAK,SAAS,MAAM,KAAK,WAAW,MAAM,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,YAAY,MAAM,UAAU,SAAS,IAAI;AACvC,aAAK,kBAAkB,QAAQ,WAAW;AAC1C,aAAK,SAAS;AAEd,aACG,YAAY,EACZ,KAAK,CAAC,gBAAgB;AACrB,cAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAM,MAAM,IAAI;AAAA,cACd;AAAA,YACF;AAOA,oBAAQ,SAAS,eAAe,MAAM,KAAK,EAAE;AAC7C;AAAA,UACF;AAEA,eAAK,kBAAkB,QAAQ,WAAW;AAC1C,gBAAM,OAAO,SAAS,WAAW;AAEjC,cAAI,CAAC,UAAU;AACb,iBAAK,SAAS;AACd,iBAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAC9C,iBAAK,QAAQ;AAAA,UACf,OAAO;AACL,iBAAK,SAAS,MAAM,UAAU,SAAS,EAAE;AAAA,UAC3C;AAAA,QACF,CAAC,EACA,MAAM,CAAC,QAAQ;AAKd,kBAAQ,SAAS,SAAS,MAAM,KAAK,EAAE;AAAA,QACzC,CAAC;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,SAAS,MAAM,UAAU,SAAS,IAAI;AACpC,YAAI,CAAC,UAAU;AACb,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAC9C;AAAA,QACF;AAEA,cAAM,oBAAoB,KAAK,YAAY,kBAAkB,aAAa;AAE1E,aAAK,kBAAkB,QAAQ,WAAW;AAC1C,aAAK,SAAS;AACd,0BAAkB,SAAS,MAAM,QAAQ,KAAK,CAAC,GAAG,QAAQ;AACxD,cAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAM,MAAM,IAAI;AAAA,cACd;AAAA,YACF;AAEA,0BAAc,MAAM,KAAK,EAAE;AAC3B;AAAA,UACF;AAEA,eAAK,kBAAkB,QAAQ,WAAW;AAC1C,eAAK,SAAS;AACd,kBAAQ,WAAW;AACnB,eAAK,UAAU,QAAO,MAAM,KAAK,OAAO,GAAG,EAAE;AAC7C,eAAK,QAAQ;AAAA,QACf,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,UAAU;AACR,eAAO,KAAK,WAAW,WAAW,KAAK,OAAO,QAAQ;AACpD,gBAAM,SAAS,KAAK,OAAO,MAAM;AAEjC,eAAK,kBAAkB,OAAO,CAAC,EAAE,WAAW;AAC5C,kBAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,QAChD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAQ,QAAQ;AACd,aAAK,kBAAkB,OAAO,CAAC,EAAE,WAAW;AAC5C,aAAK,OAAO,KAAK,MAAM;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,UAAU,MAAM,IAAI;AAClB,YAAI,KAAK,WAAW,GAAG;AACrB,eAAK,QAAQ,KAAK;AAClB,eAAK,QAAQ,MAAM,KAAK,CAAC,CAAC;AAC1B,eAAK,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE;AAC9B,eAAK,QAAQ,OAAO;AAAA,QACtB,OAAO;AACL,eAAK,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAUA;AAUjB,aAAS,cAAc,QAAQ,KAAK,IAAI;AACtC,UAAI,OAAO,OAAO,WAAY,IAAG,GAAG;AAEpC,eAAS,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAC7C,cAAM,SAAS,OAAO,OAAO,CAAC;AAC9B,cAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AAEzC,YAAI,OAAO,aAAa,WAAY,UAAS,GAAG;AAAA,MAClD;AAAA,IACF;AAUA,aAAS,QAAQ,QAAQ,KAAK,IAAI;AAChC,oBAAc,QAAQ,KAAK,EAAE;AAC7B,aAAO,QAAQ,GAAG;AAAA,IACpB;AAAA;AAAA;;;ACzlBA;AAAA;AAAA;AAEA,QAAM,EAAE,sBAAsB,UAAU,IAAI;AAE5C,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,SAAS,uBAAO,QAAQ;AAC9B,QAAM,WAAW,uBAAO,UAAU;AAClC,QAAM,UAAU,uBAAO,SAAS;AAChC,QAAM,UAAU,uBAAO,SAAS;AAChC,QAAM,QAAQ,uBAAO,OAAO;AAC5B,QAAM,YAAY,uBAAO,WAAW;AAKpC,QAAM,QAAN,MAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOV,YAAY,MAAM;AAChB,aAAK,OAAO,IAAI;AAChB,aAAK,KAAK,IAAI;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,SAAS;AACX,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,eAAe,MAAM,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AACrE,WAAO,eAAe,MAAM,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AAOnE,QAAM,aAAN,cAAyB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAc7B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,KAAK,IAAI,QAAQ,SAAS,SAAY,IAAI,QAAQ;AACvD,aAAK,OAAO,IAAI,QAAQ,WAAW,SAAY,KAAK,QAAQ;AAC5D,aAAK,SAAS,IAAI,QAAQ,aAAa,SAAY,QAAQ,QAAQ;AAAA,MACrE;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,SAAS;AACX,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAW;AACb,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA,IACF;AAEA,WAAO,eAAe,WAAW,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AACxE,WAAO,eAAe,WAAW,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AAC1E,WAAO,eAAe,WAAW,WAAW,YAAY,EAAE,YAAY,KAAK,CAAC;AAO5E,QAAM,aAAN,cAAyB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAU7B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,MAAM,IAAI,QAAQ,UAAU,SAAY,OAAO,QAAQ;AAC5D,aAAK,QAAQ,IAAI,QAAQ,YAAY,SAAY,KAAK,QAAQ;AAAA,MAChE;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,QAAQ;AACV,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,UAAU;AACZ,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AAEA,WAAO,eAAe,WAAW,WAAW,SAAS,EAAE,YAAY,KAAK,CAAC;AACzE,WAAO,eAAe,WAAW,WAAW,WAAW,EAAE,YAAY,KAAK,CAAC;AAO3E,QAAM,eAAN,cAA2B,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAS/B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,KAAK,IAAI,QAAQ,SAAS,SAAY,OAAO,QAAQ;AAAA,MAC5D;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,eAAe,aAAa,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AAQ1E,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAalB,iBAAiB,MAAM,SAAS,UAAU,CAAC,GAAG;AAC5C,mBAAW,YAAY,KAAK,UAAU,IAAI,GAAG;AAC3C,cACE,CAAC,QAAQ,oBAAoB,KAC7B,SAAS,SAAS,MAAM,WACxB,CAAC,SAAS,oBAAoB,GAC9B;AACA;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AAEJ,YAAI,SAAS,WAAW;AACtB,oBAAU,SAAS,UAAU,MAAM,UAAU;AAC3C,kBAAM,QAAQ,IAAI,aAAa,WAAW;AAAA,cACxC,MAAM,WAAW,OAAO,KAAK,SAAS;AAAA,YACxC,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,WAAW,SAAS,SAAS;AAC3B,oBAAU,SAAS,QAAQ,MAAM,SAAS;AACxC,kBAAM,QAAQ,IAAI,WAAW,SAAS;AAAA,cACpC;AAAA,cACA,QAAQ,QAAQ,SAAS;AAAA,cACzB,UAAU,KAAK,uBAAuB,KAAK;AAAA,YAC7C,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,WAAW,SAAS,SAAS;AAC3B,oBAAU,SAAS,QAAQ,OAAO;AAChC,kBAAM,QAAQ,IAAI,WAAW,SAAS;AAAA,cACpC;AAAA,cACA,SAAS,MAAM;AAAA,YACjB,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,WAAW,SAAS,QAAQ;AAC1B,oBAAU,SAAS,SAAS;AAC1B,kBAAM,QAAQ,IAAI,MAAM,MAAM;AAE9B,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;AAAA,UACnC;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAEA,gBAAQ,oBAAoB,IAAI,CAAC,CAAC,QAAQ,oBAAoB;AAC9D,gBAAQ,SAAS,IAAI;AAErB,YAAI,QAAQ,MAAM;AAChB,eAAK,KAAK,MAAM,OAAO;AAAA,QACzB,OAAO;AACL,eAAK,GAAG,MAAM,OAAO;AAAA,QACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,oBAAoB,MAAM,SAAS;AACjC,mBAAW,YAAY,KAAK,UAAU,IAAI,GAAG;AAC3C,cAAI,SAAS,SAAS,MAAM,WAAW,CAAC,SAAS,oBAAoB,GAAG;AACtE,iBAAK,eAAe,MAAM,QAAQ;AAClC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAUA,aAAS,aAAa,UAAU,SAAS,OAAO;AAC9C,UAAI,OAAO,aAAa,YAAY,SAAS,aAAa;AACxD,iBAAS,YAAY,KAAK,UAAU,KAAK;AAAA,MAC3C,OAAO;AACL,iBAAS,KAAK,SAAS,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA;AAAA;;;ACnSA;AAAA;AAAA;AAEA,QAAM,EAAE,WAAW,IAAI;AAYvB,aAAS,KAAK,MAAM,MAAM,MAAM;AAC9B,UAAI,KAAK,IAAI,MAAM,OAAW,MAAK,IAAI,IAAI,CAAC,IAAI;AAAA,UAC3C,MAAK,IAAI,EAAE,KAAK,IAAI;AAAA,IAC3B;AASA,aAAS,MAAM,QAAQ;AACrB,YAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,UAAI,SAAS,uBAAO,OAAO,IAAI;AAC/B,UAAI,eAAe;AACnB,UAAI,aAAa;AACjB,UAAI,WAAW;AACf,UAAI;AACJ,UAAI;AACJ,UAAI,QAAQ;AACZ,UAAI,OAAO;AACX,UAAI,MAAM;AACV,UAAI,IAAI;AAER,aAAO,IAAI,OAAO,QAAQ,KAAK;AAC7B,eAAO,OAAO,WAAW,CAAC;AAE1B,YAAI,kBAAkB,QAAW;AAC/B,cAAI,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AACxC,gBAAI,UAAU,GAAI,SAAQ;AAAA,UAC5B,WACE,MAAM,MACL,SAAS,MAAkB,SAAS,IACrC;AACA,gBAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;AAAA,UACxC,WAAW,SAAS,MAAkB,SAAS,IAAgB;AAC7D,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,kBAAM,OAAO,OAAO,MAAM,OAAO,GAAG;AACpC,gBAAI,SAAS,IAAM;AACjB,mBAAK,QAAQ,MAAM,MAAM;AACzB,uBAAS,uBAAO,OAAO,IAAI;AAAA,YAC7B,OAAO;AACL,8BAAgB;AAAA,YAClB;AAEA,oBAAQ,MAAM;AAAA,UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAAA,QACF,WAAW,cAAc,QAAW;AAClC,cAAI,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AACxC,gBAAI,UAAU,GAAI,SAAQ;AAAA,UAC5B,WAAW,SAAS,MAAQ,SAAS,GAAM;AACzC,gBAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;AAAA,UACxC,WAAW,SAAS,MAAQ,SAAS,IAAM;AACzC,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,iBAAK,QAAQ,OAAO,MAAM,OAAO,GAAG,GAAG,IAAI;AAC3C,gBAAI,SAAS,IAAM;AACjB,mBAAK,QAAQ,eAAe,MAAM;AAClC,uBAAS,uBAAO,OAAO,IAAI;AAC3B,8BAAgB;AAAA,YAClB;AAEA,oBAAQ,MAAM;AAAA,UAChB,WAAW,SAAS,MAAkB,UAAU,MAAM,QAAQ,IAAI;AAChE,wBAAY,OAAO,MAAM,OAAO,CAAC;AACjC,oBAAQ,MAAM;AAAA,UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAAA,QACF,OAAO;AAML,cAAI,YAAY;AACd,gBAAI,WAAW,IAAI,MAAM,GAAG;AAC1B,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AACA,gBAAI,UAAU,GAAI,SAAQ;AAAA,qBACjB,CAAC,aAAc,gBAAe;AACvC,yBAAa;AAAA,UACf,WAAW,UAAU;AACnB,gBAAI,WAAW,IAAI,MAAM,GAAG;AAC1B,kBAAI,UAAU,GAAI,SAAQ;AAAA,YAC5B,WAAW,SAAS,MAAkB,UAAU,IAAI;AAClD,yBAAW;AACX,oBAAM;AAAA,YACR,WAAW,SAAS,IAAgB;AAClC,2BAAa;AAAA,YACf,OAAO;AACL,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAAA,UACF,WAAW,SAAS,MAAQ,OAAO,WAAW,IAAI,CAAC,MAAM,IAAM;AAC7D,uBAAW;AAAA,UACb,WAAW,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AAC/C,gBAAI,UAAU,GAAI,SAAQ;AAAA,UAC5B,WAAW,UAAU,OAAO,SAAS,MAAQ,SAAS,IAAO;AAC3D,gBAAI,QAAQ,GAAI,OAAM;AAAA,UACxB,WAAW,SAAS,MAAQ,SAAS,IAAM;AACzC,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,gBAAI,QAAQ,OAAO,MAAM,OAAO,GAAG;AACnC,gBAAI,cAAc;AAChB,sBAAQ,MAAM,QAAQ,OAAO,EAAE;AAC/B,6BAAe;AAAA,YACjB;AACA,iBAAK,QAAQ,WAAW,KAAK;AAC7B,gBAAI,SAAS,IAAM;AACjB,mBAAK,QAAQ,eAAe,MAAM;AAClC,uBAAS,uBAAO,OAAO,IAAI;AAC3B,8BAAgB;AAAA,YAClB;AAEA,wBAAY;AACZ,oBAAQ,MAAM;AAAA,UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,MAAM,YAAY,SAAS,MAAQ,SAAS,GAAM;AAC9D,cAAM,IAAI,YAAY,yBAAyB;AAAA,MACjD;AAEA,UAAI,QAAQ,GAAI,OAAM;AACtB,YAAM,QAAQ,OAAO,MAAM,OAAO,GAAG;AACrC,UAAI,kBAAkB,QAAW;AAC/B,aAAK,QAAQ,OAAO,MAAM;AAAA,MAC5B,OAAO;AACL,YAAI,cAAc,QAAW;AAC3B,eAAK,QAAQ,OAAO,IAAI;AAAA,QAC1B,WAAW,cAAc;AACvB,eAAK,QAAQ,WAAW,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,QAClD,OAAO;AACL,eAAK,QAAQ,WAAW,KAAK;AAAA,QAC/B;AACA,aAAK,QAAQ,eAAe,MAAM;AAAA,MACpC;AAEA,aAAO;AAAA,IACT;AASA,aAAS,OAAO,YAAY;AAC1B,aAAO,OAAO,KAAK,UAAU,EAC1B,IAAI,CAAC,cAAc;AAClB,YAAI,iBAAiB,WAAW,SAAS;AACzC,YAAI,CAAC,MAAM,QAAQ,cAAc,EAAG,kBAAiB,CAAC,cAAc;AACpE,eAAO,eACJ,IAAI,CAAC,WAAW;AACf,iBAAO,CAAC,SAAS,EACd;AAAA,YACC,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM;AAC7B,kBAAI,SAAS,OAAO,CAAC;AACrB,kBAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,UAAS,CAAC,MAAM;AAC5C,qBAAO,OACJ,IAAI,CAAC,MAAO,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,EAAG,EACzC,KAAK,IAAI;AAAA,YACd,CAAC;AAAA,UACH,EACC,KAAK,IAAI;AAAA,QACd,CAAC,EACA,KAAK,IAAI;AAAA,MACd,CAAC,EACA,KAAK,IAAI;AAAA,IACd;AAEA,WAAO,UAAU,EAAE,QAAQ,MAAM;AAAA;AAAA;;;AC1MjC;AAAA;AAAA;AAIA,QAAM,eAAe,UAAQ,QAAQ;AACrC,QAAM,QAAQ,UAAQ,OAAO;AAC7B,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAMC,OAAM,UAAQ,KAAK;AACzB,QAAMC,OAAM,UAAQ,KAAK;AACzB,QAAM,EAAE,aAAa,YAAAC,YAAW,IAAI,UAAQ,QAAQ;AACpD,QAAM,EAAE,QAAQ,SAAS,IAAI,UAAQ,QAAQ;AAC7C,QAAM,EAAE,KAAAC,KAAI,IAAI,UAAQ,KAAK;AAE7B,QAAM,oBAAoB;AAC1B,QAAMC,YAAW;AACjB,QAAMC,UAAS;AACf,QAAM,EAAE,OAAO,IAAI;AAEnB,QAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,QAAM;AAAA,MACJ,aAAa,EAAE,kBAAkB,oBAAoB;AAAA,IACvD,IAAI;AACJ,QAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,QAAM,EAAE,SAAS,IAAI;AAErB,QAAM,eAAe,KAAK;AAC1B,QAAM,WAAW,uBAAO,UAAU;AAClC,QAAM,mBAAmB,CAAC,GAAG,EAAE;AAC/B,QAAM,cAAc,CAAC,cAAc,QAAQ,WAAW,QAAQ;AAC9D,QAAM,mBAAmB;AAOzB,QAAMC,aAAN,MAAM,mBAAkB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQnC,YAAY,SAAS,WAAW,SAAS;AACvC,cAAM;AAEN,aAAK,cAAc,aAAa,CAAC;AACjC,aAAK,aAAa;AAClB,aAAK,sBAAsB;AAC3B,aAAK,kBAAkB;AACvB,aAAK,gBAAgB;AACrB,aAAK,cAAc;AACnB,aAAK,gBAAgB;AACrB,aAAK,cAAc,CAAC;AACpB,aAAK,UAAU;AACf,aAAK,YAAY;AACjB,aAAK,cAAc,WAAU;AAC7B,aAAK,YAAY;AACjB,aAAK,UAAU;AACf,aAAK,UAAU;AAEf,YAAI,YAAY,MAAM;AACpB,eAAK,kBAAkB;AACvB,eAAK,YAAY;AACjB,eAAK,aAAa;AAElB,cAAI,cAAc,QAAW;AAC3B,wBAAY,CAAC;AAAA,UACf,WAAW,CAAC,MAAM,QAAQ,SAAS,GAAG;AACpC,gBAAI,OAAO,cAAc,YAAY,cAAc,MAAM;AACvD,wBAAU;AACV,0BAAY,CAAC;AAAA,YACf,OAAO;AACL,0BAAY,CAAC,SAAS;AAAA,YACxB;AAAA,UACF;AAEA,uBAAa,MAAM,SAAS,WAAW,OAAO;AAAA,QAChD,OAAO;AACL,eAAK,YAAY,QAAQ;AACzB,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,IAAI,aAAa;AACf,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,IAAI,WAAW,MAAM;AACnB,YAAI,CAAC,aAAa,SAAS,IAAI,EAAG;AAElC,aAAK,cAAc;AAKnB,YAAI,KAAK,UAAW,MAAK,UAAU,cAAc;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,iBAAiB;AACnB,YAAI,CAAC,KAAK,QAAS,QAAO,KAAK;AAE/B,eAAO,KAAK,QAAQ,eAAe,SAAS,KAAK,QAAQ;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,aAAa;AACf,eAAO,OAAO,KAAK,KAAK,WAAW,EAAE,KAAK;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAW;AACb,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,SAAS;AACX,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,YAAY;AACd,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAW;AACb,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,aAAa;AACf,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,MAAM;AACR,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBA,UAAU,QAAQ,MAAM,SAAS;AAC/B,cAAM,WAAW,IAAIF,UAAS;AAAA,UAC5B,wBAAwB,QAAQ;AAAA,UAChC,YAAY,KAAK;AAAA,UACjB,YAAY,KAAK;AAAA,UACjB,UAAU,KAAK;AAAA,UACf,YAAY,QAAQ;AAAA,UACpB,oBAAoB,QAAQ;AAAA,QAC9B,CAAC;AAED,cAAM,SAAS,IAAIC,QAAO,QAAQ,KAAK,aAAa,QAAQ,YAAY;AAExE,aAAK,YAAY;AACjB,aAAK,UAAU;AACf,aAAK,UAAU;AAEf,iBAAS,UAAU,IAAI;AACvB,eAAO,UAAU,IAAI;AACrB,eAAO,UAAU,IAAI;AAErB,iBAAS,GAAG,YAAY,kBAAkB;AAC1C,iBAAS,GAAG,SAAS,eAAe;AACpC,iBAAS,GAAG,SAAS,eAAe;AACpC,iBAAS,GAAG,WAAW,iBAAiB;AACxC,iBAAS,GAAG,QAAQ,cAAc;AAClC,iBAAS,GAAG,QAAQ,cAAc;AAElC,eAAO,UAAU;AAKjB,YAAI,OAAO,WAAY,QAAO,WAAW,CAAC;AAC1C,YAAI,OAAO,WAAY,QAAO,WAAW;AAEzC,YAAI,KAAK,SAAS,EAAG,QAAO,QAAQ,IAAI;AAExC,eAAO,GAAG,SAAS,aAAa;AAChC,eAAO,GAAG,QAAQ,YAAY;AAC9B,eAAO,GAAG,OAAO,WAAW;AAC5B,eAAO,GAAG,SAAS,aAAa;AAEhC,aAAK,cAAc,WAAU;AAC7B,aAAK,KAAK,MAAM;AAAA,MAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,YAAY;AACV,YAAI,CAAC,KAAK,SAAS;AACjB,eAAK,cAAc,WAAU;AAC7B,eAAK,KAAK,SAAS,KAAK,YAAY,KAAK,aAAa;AACtD;AAAA,QACF;AAEA,YAAI,KAAK,YAAY,kBAAkB,aAAa,GAAG;AACrD,eAAK,YAAY,kBAAkB,aAAa,EAAE,QAAQ;AAAA,QAC5D;AAEA,aAAK,UAAU,mBAAmB;AAClC,aAAK,cAAc,WAAU;AAC7B,aAAK,KAAK,SAAS,KAAK,YAAY,KAAK,aAAa;AAAA,MACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBA,MAAM,MAAM,MAAM;AAChB,YAAI,KAAK,eAAe,WAAU,OAAQ;AAC1C,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,MAAM;AACZ,yBAAe,MAAM,KAAK,MAAM,GAAG;AACnC;AAAA,QACF;AAEA,YAAI,KAAK,eAAe,WAAU,SAAS;AACzC,cACE,KAAK,oBACJ,KAAK,uBAAuB,KAAK,UAAU,eAAe,eAC3D;AACA,iBAAK,QAAQ,IAAI;AAAA,UACnB;AAEA;AAAA,QACF;AAEA,aAAK,cAAc,WAAU;AAC7B,aAAK,QAAQ,MAAM,MAAM,MAAM,CAAC,KAAK,WAAW,CAAC,QAAQ;AAKvD,cAAI,IAAK;AAET,eAAK,kBAAkB;AAEvB,cACE,KAAK,uBACL,KAAK,UAAU,eAAe,cAC9B;AACA,iBAAK,QAAQ,IAAI;AAAA,UACnB;AAAA,QACF,CAAC;AAED,sBAAc,IAAI;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,QAAQ;AACN,YACE,KAAK,eAAe,WAAU,cAC9B,KAAK,eAAe,WAAU,QAC9B;AACA;AAAA,QACF;AAEA,aAAK,UAAU;AACf,aAAK,QAAQ,MAAM;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEA,YAAI,OAAO,SAAS,YAAY;AAC9B,eAAK;AACL,iBAAO,OAAO;AAAA,QAChB,WAAW,OAAO,SAAS,YAAY;AACrC,eAAK;AACL,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;AAAA,QACF;AAEA,YAAI,SAAS,OAAW,QAAO,CAAC,KAAK;AACrC,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEA,YAAI,OAAO,SAAS,YAAY;AAC9B,eAAK;AACL,iBAAO,OAAO;AAAA,QAChB,WAAW,OAAO,SAAS,YAAY;AACrC,eAAK;AACL,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;AAAA,QACF;AAEA,YAAI,SAAS,OAAW,QAAO,CAAC,KAAK;AACrC,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,SAAS;AACP,YACE,KAAK,eAAe,WAAU,cAC9B,KAAK,eAAe,WAAU,QAC9B;AACA;AAAA,QACF;AAEA,aAAK,UAAU;AACf,YAAI,CAAC,KAAK,UAAU,eAAe,UAAW,MAAK,QAAQ,OAAO;AAAA,MACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiBA,KAAK,MAAM,SAAS,IAAI;AACtB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEA,YAAI,OAAO,YAAY,YAAY;AACjC,eAAK;AACL,oBAAU,CAAC;AAAA,QACb;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;AAAA,QACF;AAEA,cAAM,OAAO;AAAA,UACX,QAAQ,OAAO,SAAS;AAAA,UACxB,MAAM,CAAC,KAAK;AAAA,UACZ,UAAU;AAAA,UACV,KAAK;AAAA,UACL,GAAG;AAAA,QACL;AAEA,YAAI,CAAC,KAAK,YAAY,kBAAkB,aAAa,GAAG;AACtD,eAAK,WAAW;AAAA,QAClB;AAEA,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,YAAY;AACV,YAAI,KAAK,eAAe,WAAU,OAAQ;AAC1C,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,MAAM;AACZ,yBAAe,MAAM,KAAK,MAAM,GAAG;AACnC;AAAA,QACF;AAEA,YAAI,KAAK,SAAS;AAChB,eAAK,cAAc,WAAU;AAC7B,eAAK,QAAQ,QAAQ;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAMA,WAAO,eAAeC,YAAW,cAAc;AAAA,MAC7C,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,YAAY;AAAA,IACzC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,cAAc;AAAA,MACvD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,YAAY;AAAA,IACzC,CAAC;AAMD,WAAO,eAAeA,YAAW,QAAQ;AAAA,MACvC,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,MAAM;AAAA,IACnC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,QAAQ;AAAA,MACjD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,MAAM;AAAA,IACnC,CAAC;AAMD,WAAO,eAAeA,YAAW,WAAW;AAAA,MAC1C,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,SAAS;AAAA,IACtC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,WAAW;AAAA,MACpD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,SAAS;AAAA,IACtC,CAAC;AAMD,WAAO,eAAeA,YAAW,UAAU;AAAA,MACzC,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,QAAQ;AAAA,IACrC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,UAAU;AAAA,MACnD,YAAY;AAAA,MACZ,OAAO,YAAY,QAAQ,QAAQ;AAAA,IACrC,CAAC;AAED;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,QAAQ,CAAC,aAAa;AACtB,aAAO,eAAeA,WAAU,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,IAC3E,CAAC;AAMD,KAAC,QAAQ,SAAS,SAAS,SAAS,EAAE,QAAQ,CAAC,WAAW;AACxD,aAAO,eAAeA,WAAU,WAAW,KAAK,MAAM,IAAI;AAAA,QACxD,YAAY;AAAA,QACZ,MAAM;AACJ,qBAAW,YAAY,KAAK,UAAU,MAAM,GAAG;AAC7C,gBAAI,SAAS,oBAAoB,EAAG,QAAO,SAAS,SAAS;AAAA,UAC/D;AAEA,iBAAO;AAAA,QACT;AAAA,QACA,IAAI,SAAS;AACX,qBAAW,YAAY,KAAK,UAAU,MAAM,GAAG;AAC7C,gBAAI,SAAS,oBAAoB,GAAG;AAClC,mBAAK,eAAe,QAAQ,QAAQ;AACpC;AAAA,YACF;AAAA,UACF;AAEA,cAAI,OAAO,YAAY,WAAY;AAEnC,eAAK,iBAAiB,QAAQ,SAAS;AAAA,YACrC,CAAC,oBAAoB,GAAG;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,IAAAA,WAAU,UAAU,mBAAmB;AACvC,IAAAA,WAAU,UAAU,sBAAsB;AAE1C,WAAO,UAAUA;AAoCjB,aAAS,aAAa,WAAW,SAAS,WAAW,SAAS;AAC5D,YAAM,OAAO;AAAA,QACX,wBAAwB;AAAA,QACxB,UAAU;AAAA,QACV,iBAAiB,iBAAiB,CAAC;AAAA,QACnC,YAAY,MAAM,OAAO;AAAA,QACzB,oBAAoB;AAAA,QACpB,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,GAAG;AAAA,QACH,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAEA,gBAAU,YAAY,KAAK;AAE3B,UAAI,CAAC,iBAAiB,SAAS,KAAK,eAAe,GAAG;AACpD,cAAM,IAAI;AAAA,UACR,iCAAiC,KAAK,eAAe,yBAC3B,iBAAiB,KAAK,IAAI,CAAC;AAAA,QACvD;AAAA,MACF;AAEA,UAAI;AAEJ,UAAI,mBAAmBH,MAAK;AAC1B,oBAAY;AAAA,MACd,OAAO;AACL,YAAI;AACF,sBAAY,IAAIA,KAAI,OAAO;AAAA,QAC7B,SAAS,GAAG;AACV,gBAAM,IAAI,YAAY,gBAAgB,OAAO,EAAE;AAAA,QACjD;AAAA,MACF;AAEA,UAAI,UAAU,aAAa,SAAS;AAClC,kBAAU,WAAW;AAAA,MACvB,WAAW,UAAU,aAAa,UAAU;AAC1C,kBAAU,WAAW;AAAA,MACvB;AAEA,gBAAU,OAAO,UAAU;AAE3B,YAAM,WAAW,UAAU,aAAa;AACxC,YAAM,WAAW,UAAU,aAAa;AACxC,UAAI;AAEJ,UAAI,UAAU,aAAa,SAAS,CAAC,YAAY,CAAC,UAAU;AAC1D,4BACE;AAAA,MAEJ,WAAW,YAAY,CAAC,UAAU,UAAU;AAC1C,4BAAoB;AAAA,MACtB,WAAW,UAAU,MAAM;AACzB,4BAAoB;AAAA,MACtB;AAEA,UAAI,mBAAmB;AACrB,cAAM,MAAM,IAAI,YAAY,iBAAiB;AAE7C,YAAI,UAAU,eAAe,GAAG;AAC9B,gBAAM;AAAA,QACR,OAAO;AACL,4BAAkB,WAAW,GAAG;AAChC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,cAAc,WAAW,MAAM;AACrC,YAAM,MAAM,YAAY,EAAE,EAAE,SAAS,QAAQ;AAC7C,YAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,YAAM,cAAc,oBAAI,IAAI;AAC5B,UAAI;AAEJ,WAAK,mBACH,KAAK,qBAAqB,WAAW,aAAa;AACpD,WAAK,cAAc,KAAK,eAAe;AACvC,WAAK,OAAO,UAAU,QAAQ;AAC9B,WAAK,OAAO,UAAU,SAAS,WAAW,GAAG,IACzC,UAAU,SAAS,MAAM,GAAG,EAAE,IAC9B,UAAU;AACd,WAAK,UAAU;AAAA,QACb,GAAG,KAAK;AAAA,QACR,yBAAyB,KAAK;AAAA,QAC9B,qBAAqB;AAAA,QACrB,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AACA,WAAK,OAAO,UAAU,WAAW,UAAU;AAC3C,WAAK,UAAU,KAAK;AAEpB,UAAI,KAAK,mBAAmB;AAC1B,4BAAoB,IAAI;AAAA,UACtB,KAAK,sBAAsB,OAAO,KAAK,oBAAoB,CAAC;AAAA,UAC5D;AAAA,UACA,KAAK;AAAA,QACP;AACA,aAAK,QAAQ,0BAA0B,IAAI,OAAO;AAAA,UAChD,CAAC,kBAAkB,aAAa,GAAG,kBAAkB,MAAM;AAAA,QAC7D,CAAC;AAAA,MACH;AACA,UAAI,UAAU,QAAQ;AACpB,mBAAW,YAAY,WAAW;AAChC,cACE,OAAO,aAAa,YACpB,CAAC,iBAAiB,KAAK,QAAQ,KAC/B,YAAY,IAAI,QAAQ,GACxB;AACA,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAEA,sBAAY,IAAI,QAAQ;AAAA,QAC1B;AAEA,aAAK,QAAQ,wBAAwB,IAAI,UAAU,KAAK,GAAG;AAAA,MAC7D;AACA,UAAI,KAAK,QAAQ;AACf,YAAI,KAAK,kBAAkB,IAAI;AAC7B,eAAK,QAAQ,sBAAsB,IAAI,KAAK;AAAA,QAC9C,OAAO;AACL,eAAK,QAAQ,SAAS,KAAK;AAAA,QAC7B;AAAA,MACF;AACA,UAAI,UAAU,YAAY,UAAU,UAAU;AAC5C,aAAK,OAAO,GAAG,UAAU,QAAQ,IAAI,UAAU,QAAQ;AAAA,MACzD;AAEA,UAAI,UAAU;AACZ,cAAM,QAAQ,KAAK,KAAK,MAAM,GAAG;AAEjC,aAAK,aAAa,MAAM,CAAC;AACzB,aAAK,OAAO,MAAM,CAAC;AAAA,MACrB;AAEA,UAAI;AAEJ,UAAI,KAAK,iBAAiB;AACxB,YAAI,UAAU,eAAe,GAAG;AAC9B,oBAAU,eAAe;AACzB,oBAAU,kBAAkB;AAC5B,oBAAU,4BAA4B,WAClC,KAAK,aACL,UAAU;AAEd,gBAAM,UAAU,WAAW,QAAQ;AAMnC,oBAAU,EAAE,GAAG,SAAS,SAAS,CAAC,EAAE;AAEpC,cAAI,SAAS;AACX,uBAAW,CAACI,MAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,sBAAQ,QAAQA,KAAI,YAAY,CAAC,IAAI;AAAA,YACvC;AAAA,UACF;AAAA,QACF,WAAW,UAAU,cAAc,UAAU,MAAM,GAAG;AACpD,gBAAM,aAAa,WACf,UAAU,eACR,KAAK,eAAe,UAAU,4BAC9B,QACF,UAAU,eACR,QACA,UAAU,SAAS,UAAU;AAEnC,cAAI,CAAC,cAAe,UAAU,mBAAmB,CAAC,UAAW;AAK3D,mBAAO,KAAK,QAAQ;AACpB,mBAAO,KAAK,QAAQ;AAEpB,gBAAI,CAAC,WAAY,QAAO,KAAK,QAAQ;AAErC,iBAAK,OAAO;AAAA,UACd;AAAA,QACF;AAOA,YAAI,KAAK,QAAQ,CAAC,QAAQ,QAAQ,eAAe;AAC/C,kBAAQ,QAAQ,gBACd,WAAW,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,QACvD;AAEA,cAAM,UAAU,OAAO,QAAQ,IAAI;AAEnC,YAAI,UAAU,YAAY;AAUxB,oBAAU,KAAK,YAAY,UAAU,KAAK,GAAG;AAAA,QAC/C;AAAA,MACF,OAAO;AACL,cAAM,UAAU,OAAO,QAAQ,IAAI;AAAA,MACrC;AAEA,UAAI,KAAK,SAAS;AAChB,YAAI,GAAG,WAAW,MAAM;AACtB,yBAAe,WAAW,KAAK,iCAAiC;AAAA,QAClE,CAAC;AAAA,MACH;AAEA,UAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,YAAI,QAAQ,QAAQ,IAAI,QAAQ,EAAG;AAEnC,cAAM,UAAU,OAAO;AACvB,0BAAkB,WAAW,GAAG;AAAA,MAClC,CAAC;AAED,UAAI,GAAG,YAAY,CAAC,QAAQ;AAC1B,cAAM,WAAW,IAAI,QAAQ;AAC7B,cAAM,aAAa,IAAI;AAEvB,YACE,YACA,KAAK,mBACL,cAAc,OACd,aAAa,KACb;AACA,cAAI,EAAE,UAAU,aAAa,KAAK,cAAc;AAC9C,2BAAe,WAAW,KAAK,4BAA4B;AAC3D;AAAA,UACF;AAEA,cAAI,MAAM;AAEV,cAAI;AAEJ,cAAI;AACF,mBAAO,IAAIJ,KAAI,UAAU,OAAO;AAAA,UAClC,SAAS,GAAG;AACV,kBAAM,MAAM,IAAI,YAAY,gBAAgB,QAAQ,EAAE;AACtD,8BAAkB,WAAW,GAAG;AAChC;AAAA,UACF;AAEA,uBAAa,WAAW,MAAM,WAAW,OAAO;AAAA,QAClD,WAAW,CAAC,UAAU,KAAK,uBAAuB,KAAK,GAAG,GAAG;AAC3D;AAAA,YACE;AAAA,YACA;AAAA,YACA,+BAA+B,IAAI,UAAU;AAAA,UAC/C;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI,GAAG,WAAW,CAAC,KAAK,QAAQ,SAAS;AACvC,kBAAU,KAAK,WAAW,GAAG;AAM7B,YAAI,UAAU,eAAeG,WAAU,WAAY;AAEnD,cAAM,UAAU,OAAO;AAEvB,cAAM,UAAU,IAAI,QAAQ;AAE5B,YAAI,YAAY,UAAa,QAAQ,YAAY,MAAM,aAAa;AAClE,yBAAe,WAAW,QAAQ,wBAAwB;AAC1D;AAAA,QACF;AAEA,cAAM,SAASJ,YAAW,MAAM,EAC7B,OAAO,MAAM,IAAI,EACjB,OAAO,QAAQ;AAElB,YAAI,IAAI,QAAQ,sBAAsB,MAAM,QAAQ;AAClD,yBAAe,WAAW,QAAQ,qCAAqC;AACvE;AAAA,QACF;AAEA,cAAM,aAAa,IAAI,QAAQ,wBAAwB;AACvD,YAAI;AAEJ,YAAI,eAAe,QAAW;AAC5B,cAAI,CAAC,YAAY,MAAM;AACrB,wBAAY;AAAA,UACd,WAAW,CAAC,YAAY,IAAI,UAAU,GAAG;AACvC,wBAAY;AAAA,UACd;AAAA,QACF,WAAW,YAAY,MAAM;AAC3B,sBAAY;AAAA,QACd;AAEA,YAAI,WAAW;AACb,yBAAe,WAAW,QAAQ,SAAS;AAC3C;AAAA,QACF;AAEA,YAAI,WAAY,WAAU,YAAY;AAEtC,cAAM,yBAAyB,IAAI,QAAQ,0BAA0B;AAErE,YAAI,2BAA2B,QAAW;AACxC,cAAI,CAAC,mBAAmB;AACtB,kBAAM,UACJ;AAEF,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,cAAI;AAEJ,cAAI;AACF,yBAAa,MAAM,sBAAsB;AAAA,UAC3C,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,gBAAM,iBAAiB,OAAO,KAAK,UAAU;AAE7C,cACE,eAAe,WAAW,KAC1B,eAAe,CAAC,MAAM,kBAAkB,eACxC;AACA,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,cAAI;AACF,8BAAkB,OAAO,WAAW,kBAAkB,aAAa,CAAC;AAAA,UACtE,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;AAAA,UACF;AAEA,oBAAU,YAAY,kBAAkB,aAAa,IACnD;AAAA,QACJ;AAEA,kBAAU,UAAU,QAAQ,MAAM;AAAA,UAChC,wBAAwB,KAAK;AAAA,UAC7B,cAAc,KAAK;AAAA,UACnB,YAAY,KAAK;AAAA,UACjB,oBAAoB,KAAK;AAAA,QAC3B,CAAC;AAAA,MACH,CAAC;AAED,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,KAAK,SAAS;AAAA,MACnC,OAAO;AACL,YAAI,IAAI;AAAA,MACV;AAAA,IACF;AASA,aAAS,kBAAkB,WAAW,KAAK;AACzC,gBAAU,cAAcI,WAAU;AAKlC,gBAAU,gBAAgB;AAC1B,gBAAU,KAAK,SAAS,GAAG;AAC3B,gBAAU,UAAU;AAAA,IACtB;AASA,aAAS,WAAW,SAAS;AAC3B,cAAQ,OAAO,QAAQ;AACvB,aAAON,KAAI,QAAQ,OAAO;AAAA,IAC5B;AASA,aAAS,WAAW,SAAS;AAC3B,cAAQ,OAAO;AAEf,UAAI,CAAC,QAAQ,cAAc,QAAQ,eAAe,IAAI;AACpD,gBAAQ,aAAaA,KAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;AAAA,MAC7D;AAEA,aAAOC,KAAI,QAAQ,OAAO;AAAA,IAC5B;AAWA,aAAS,eAAe,WAAW,QAAQ,SAAS;AAClD,gBAAU,cAAcK,WAAU;AAElC,YAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,YAAM,kBAAkB,KAAK,cAAc;AAE3C,UAAI,OAAO,WAAW;AACpB,eAAO,QAAQ,IAAI;AACnB,eAAO,MAAM;AAEb,YAAI,OAAO,UAAU,CAAC,OAAO,OAAO,WAAW;AAM7C,iBAAO,OAAO,QAAQ;AAAA,QACxB;AAEA,gBAAQ,SAAS,mBAAmB,WAAW,GAAG;AAAA,MACpD,OAAO;AACL,eAAO,QAAQ,GAAG;AAClB,eAAO,KAAK,SAAS,UAAU,KAAK,KAAK,WAAW,OAAO,CAAC;AAC5D,eAAO,KAAK,SAAS,UAAU,UAAU,KAAK,SAAS,CAAC;AAAA,MAC1D;AAAA,IACF;AAWA,aAAS,eAAe,WAAW,MAAM,IAAI;AAC3C,UAAI,MAAM;AACR,cAAM,SAAS,OAAO,IAAI,IAAI,KAAK,OAAO,SAAS,IAAI,EAAE;AAQzD,YAAI,UAAU,QAAS,WAAU,QAAQ,kBAAkB;AAAA,YACtD,WAAU,mBAAmB;AAAA,MACpC;AAEA,UAAI,IAAI;AACN,cAAM,MAAM,IAAI;AAAA,UACd,qCAAqC,UAAU,UAAU,KACnD,YAAY,UAAU,UAAU,CAAC;AAAA,QACzC;AACA,gBAAQ,SAAS,IAAI,GAAG;AAAA,MAC1B;AAAA,IACF;AASA,aAAS,mBAAmB,MAAM,QAAQ;AACxC,YAAM,YAAY,KAAK,UAAU;AAEjC,gBAAU,sBAAsB;AAChC,gBAAU,gBAAgB;AAC1B,gBAAU,aAAa;AAEvB,UAAI,UAAU,QAAQ,UAAU,MAAM,OAAW;AAEjD,gBAAU,QAAQ,eAAe,QAAQ,YAAY;AACrD,cAAQ,SAAS,QAAQ,UAAU,OAAO;AAE1C,UAAI,SAAS,KAAM,WAAU,MAAM;AAAA,UAC9B,WAAU,MAAM,MAAM,MAAM;AAAA,IACnC;AAOA,aAAS,kBAAkB;AACzB,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,CAAC,UAAU,SAAU,WAAU,QAAQ,OAAO;AAAA,IACpD;AAQA,aAAS,gBAAgB,KAAK;AAC5B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,QAAQ,UAAU,MAAM,QAAW;AAC/C,kBAAU,QAAQ,eAAe,QAAQ,YAAY;AAMrD,gBAAQ,SAAS,QAAQ,UAAU,OAAO;AAE1C,kBAAU,MAAM,IAAI,WAAW,CAAC;AAAA,MAClC;AAEA,UAAI,CAAC,UAAU,eAAe;AAC5B,kBAAU,gBAAgB;AAC1B,kBAAU,KAAK,SAAS,GAAG;AAAA,MAC7B;AAAA,IACF;AAOA,aAAS,mBAAmB;AAC1B,WAAK,UAAU,EAAE,UAAU;AAAA,IAC7B;AASA,aAAS,kBAAkB,MAAM,UAAU;AACzC,WAAK,UAAU,EAAE,KAAK,WAAW,MAAM,QAAQ;AAAA,IACjD;AAQA,aAAS,eAAe,MAAM;AAC5B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,UAAW,WAAU,KAAK,MAAM,CAAC,KAAK,WAAW,IAAI;AACnE,gBAAU,KAAK,QAAQ,IAAI;AAAA,IAC7B;AAQA,aAAS,eAAe,MAAM;AAC5B,WAAK,UAAU,EAAE,KAAK,QAAQ,IAAI;AAAA,IACpC;AAQA,aAAS,OAAO,QAAQ;AACtB,aAAO,OAAO;AAAA,IAChB;AAQA,aAAS,cAAc,KAAK;AAC1B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,eAAeA,WAAU,OAAQ;AAC/C,UAAI,UAAU,eAAeA,WAAU,MAAM;AAC3C,kBAAU,cAAcA,WAAU;AAClC,sBAAc,SAAS;AAAA,MACzB;AAOA,WAAK,QAAQ,IAAI;AAEjB,UAAI,CAAC,UAAU,eAAe;AAC5B,kBAAU,gBAAgB;AAC1B,kBAAU,KAAK,SAAS,GAAG;AAAA,MAC7B;AAAA,IACF;AAQA,aAAS,cAAc,WAAW;AAChC,gBAAU,cAAc;AAAA,QACtB,UAAU,QAAQ,QAAQ,KAAK,UAAU,OAAO;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAOA,aAAS,gBAAgB;AACvB,YAAM,YAAY,KAAK,UAAU;AAEjC,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,eAAe,QAAQ,YAAY;AACxC,WAAK,eAAe,OAAO,WAAW;AAEtC,gBAAU,cAAcA,WAAU;AAElC,UAAI;AAWJ,UACE,CAAC,KAAK,eAAe,cACrB,CAAC,UAAU,uBACX,CAAC,UAAU,UAAU,eAAe,iBACnC,QAAQ,UAAU,QAAQ,KAAK,OAAO,MACvC;AACA,kBAAU,UAAU,MAAM,KAAK;AAAA,MACjC;AAEA,gBAAU,UAAU,IAAI;AAExB,WAAK,UAAU,IAAI;AAEnB,mBAAa,UAAU,WAAW;AAElC,UACE,UAAU,UAAU,eAAe,YACnC,UAAU,UAAU,eAAe,cACnC;AACA,kBAAU,UAAU;AAAA,MACtB,OAAO;AACL,kBAAU,UAAU,GAAG,SAAS,gBAAgB;AAChD,kBAAU,UAAU,GAAG,UAAU,gBAAgB;AAAA,MACnD;AAAA,IACF;AAQA,aAAS,aAAa,OAAO;AAC3B,UAAI,CAAC,KAAK,UAAU,EAAE,UAAU,MAAM,KAAK,GAAG;AAC5C,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAOA,aAAS,cAAc;AACrB,YAAM,YAAY,KAAK,UAAU;AAEjC,gBAAU,cAAcA,WAAU;AAClC,gBAAU,UAAU,IAAI;AACxB,WAAK,IAAI;AAAA,IACX;AAOA,aAAS,gBAAgB;AACvB,YAAM,YAAY,KAAK,UAAU;AAEjC,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,GAAG,SAAS,IAAI;AAErB,UAAI,WAAW;AACb,kBAAU,cAAcA,WAAU;AAClC,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA;AAAA;;;AC32CA;AAAA;AAAA;AAGA,QAAME,aAAY;AAClB,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AAQnC,aAAS,UAAU,QAAQ;AACzB,aAAO,KAAK,OAAO;AAAA,IACrB;AAOA,aAAS,cAAc;AACrB,UAAI,CAAC,KAAK,aAAa,KAAK,eAAe,UAAU;AACnD,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAQA,aAAS,cAAc,KAAK;AAC1B,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,QAAQ;AACb,UAAI,KAAK,cAAc,OAAO,MAAM,GAAG;AAErC,aAAK,KAAK,SAAS,GAAG;AAAA,MACxB;AAAA,IACF;AAUA,aAASC,uBAAsB,IAAI,SAAS;AAC1C,UAAI,qBAAqB;AAEzB,YAAM,SAAS,IAAI,OAAO;AAAA,QACxB,GAAG;AAAA,QACH,aAAa;AAAA,QACb,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,oBAAoB;AAAA,MACtB,CAAC;AAED,SAAG,GAAG,WAAW,SAAS,QAAQ,KAAK,UAAU;AAC/C,cAAM,OACJ,CAAC,YAAY,OAAO,eAAe,aAAa,IAAI,SAAS,IAAI;AAEnE,YAAI,CAAC,OAAO,KAAK,IAAI,EAAG,IAAG,MAAM;AAAA,MACnC,CAAC;AAED,SAAG,KAAK,SAAS,SAAS,MAAM,KAAK;AACnC,YAAI,OAAO,UAAW;AAWtB,6BAAqB;AACrB,eAAO,QAAQ,GAAG;AAAA,MACpB,CAAC;AAED,SAAG,KAAK,SAAS,SAAS,QAAQ;AAChC,YAAI,OAAO,UAAW;AAEtB,eAAO,KAAK,IAAI;AAAA,MAClB,CAAC;AAED,aAAO,WAAW,SAAU,KAAK,UAAU;AACzC,YAAI,GAAG,eAAe,GAAG,QAAQ;AAC/B,mBAAS,GAAG;AACZ,kBAAQ,SAAS,WAAW,MAAM;AAClC;AAAA,QACF;AAEA,YAAI,SAAS;AAEb,WAAG,KAAK,SAAS,SAAS,MAAMC,MAAK;AACnC,mBAAS;AACT,mBAASA,IAAG;AAAA,QACd,CAAC;AAED,WAAG,KAAK,SAAS,SAAS,QAAQ;AAChC,cAAI,CAAC,OAAQ,UAAS,GAAG;AACzB,kBAAQ,SAAS,WAAW,MAAM;AAAA,QACpC,CAAC;AAED,YAAI,mBAAoB,IAAG,UAAU;AAAA,MACvC;AAEA,aAAO,SAAS,SAAU,UAAU;AAClC,YAAI,GAAG,eAAe,GAAG,YAAY;AACnC,aAAG,KAAK,QAAQ,SAAS,OAAO;AAC9B,mBAAO,OAAO,QAAQ;AAAA,UACxB,CAAC;AACD;AAAA,QACF;AAMA,YAAI,GAAG,YAAY,KAAM;AAEzB,YAAI,GAAG,QAAQ,eAAe,UAAU;AACtC,mBAAS;AACT,cAAI,OAAO,eAAe,WAAY,QAAO,QAAQ;AAAA,QACvD,OAAO;AACL,aAAG,QAAQ,KAAK,UAAU,SAAS,SAAS;AAI1C,qBAAS;AAAA,UACX,CAAC;AACD,aAAG,MAAM;AAAA,QACX;AAAA,MACF;AAEA,aAAO,QAAQ,WAAY;AACzB,YAAI,GAAG,SAAU,IAAG,OAAO;AAAA,MAC7B;AAEA,aAAO,SAAS,SAAU,OAAO,UAAU,UAAU;AACnD,YAAI,GAAG,eAAe,GAAG,YAAY;AACnC,aAAG,KAAK,QAAQ,SAAS,OAAO;AAC9B,mBAAO,OAAO,OAAO,UAAU,QAAQ;AAAA,UACzC,CAAC;AACD;AAAA,QACF;AAEA,WAAG,KAAK,OAAO,QAAQ;AAAA,MACzB;AAEA,aAAO,GAAG,OAAO,WAAW;AAC5B,aAAO,GAAG,SAAS,aAAa;AAChC,aAAO;AAAA,IACT;AAEA,WAAO,UAAUD;AAAA;AAAA;;;AChKjB;AAAA;AAAA;AAEA,QAAM,EAAE,WAAW,IAAI;AASvB,aAAS,MAAM,QAAQ;AACrB,YAAM,YAAY,oBAAI,IAAI;AAC1B,UAAI,QAAQ;AACZ,UAAI,MAAM;AACV,UAAI,IAAI;AAER,WAAK,GAAG,IAAI,OAAO,QAAQ,KAAK;AAC9B,cAAM,OAAO,OAAO,WAAW,CAAC;AAEhC,YAAI,QAAQ,MAAM,WAAW,IAAI,MAAM,GAAG;AACxC,cAAI,UAAU,GAAI,SAAQ;AAAA,QAC5B,WACE,MAAM,MACL,SAAS,MAAkB,SAAS,IACrC;AACA,cAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;AAAA,QACxC,WAAW,SAAS,IAAgB;AAClC,cAAI,UAAU,IAAI;AAChB,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,UAC5D;AAEA,cAAI,QAAQ,GAAI,OAAM;AAEtB,gBAAME,YAAW,OAAO,MAAM,OAAO,GAAG;AAExC,cAAI,UAAU,IAAIA,SAAQ,GAAG;AAC3B,kBAAM,IAAI,YAAY,QAAQA,SAAQ,6BAA6B;AAAA,UACrE;AAEA,oBAAU,IAAIA,SAAQ;AACtB,kBAAQ,MAAM;AAAA,QAChB,OAAO;AACL,gBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;AAAA,QAC5D;AAAA,MACF;AAEA,UAAI,UAAU,MAAM,QAAQ,IAAI;AAC9B,cAAM,IAAI,YAAY,yBAAyB;AAAA,MACjD;AAEA,YAAM,WAAW,OAAO,MAAM,OAAO,CAAC;AAEtC,UAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B,cAAM,IAAI,YAAY,QAAQ,QAAQ,6BAA6B;AAAA,MACrE;AAEA,gBAAU,IAAI,QAAQ;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,UAAU,EAAE,MAAM;AAAA;AAAA;;;AC7DzB;AAAA;AAAA;AAIA,QAAM,eAAe,UAAQ,QAAQ;AACrC,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AACnC,QAAM,EAAE,YAAAC,YAAW,IAAI,UAAQ,QAAQ;AAEvC,QAAM,YAAY;AAClB,QAAM,oBAAoB;AAC1B,QAAM,cAAc;AACpB,QAAMC,aAAY;AAClB,QAAM,EAAE,MAAM,WAAW,IAAI;AAE7B,QAAM,WAAW;AAEjB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,SAAS;AAOf,QAAMC,mBAAN,cAA8B,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgCzC,YAAY,SAAS,UAAU;AAC7B,cAAM;AAEN,kBAAU;AAAA,UACR,wBAAwB;AAAA,UACxB,UAAU;AAAA,UACV,YAAY,MAAM,OAAO;AAAA,UACzB,oBAAoB;AAAA,UACpB,mBAAmB;AAAA,UACnB,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,UAChB,cAAc;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA;AAAA,UACT,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAAD;AAAA,UACA,GAAG;AAAA,QACL;AAEA,YACG,QAAQ,QAAQ,QAAQ,CAAC,QAAQ,UAAU,CAAC,QAAQ,YACpD,QAAQ,QAAQ,SAAS,QAAQ,UAAU,QAAQ,aACnD,QAAQ,UAAU,QAAQ,UAC3B;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,YAAI,QAAQ,QAAQ,MAAM;AACxB,eAAK,UAAU,KAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,kBAAM,OAAO,KAAK,aAAa,GAAG;AAElC,gBAAI,UAAU,KAAK;AAAA,cACjB,kBAAkB,KAAK;AAAA,cACvB,gBAAgB;AAAA,YAClB,CAAC;AACD,gBAAI,IAAI,IAAI;AAAA,UACd,CAAC;AACD,eAAK,QAAQ;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,QAAQ;AACzB,eAAK,UAAU,QAAQ;AAAA,QACzB;AAEA,YAAI,KAAK,SAAS;AAChB,gBAAM,iBAAiB,KAAK,KAAK,KAAK,MAAM,YAAY;AAExD,eAAK,mBAAmB,aAAa,KAAK,SAAS;AAAA,YACjD,WAAW,KAAK,KAAK,KAAK,MAAM,WAAW;AAAA,YAC3C,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO;AAAA,YACnC,SAAS,CAAC,KAAK,QAAQ,SAAS;AAC9B,mBAAK,cAAc,KAAK,QAAQ,MAAM,cAAc;AAAA,YACtD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,QAAQ,sBAAsB,KAAM,SAAQ,oBAAoB,CAAC;AACrE,YAAI,QAAQ,gBAAgB;AAC1B,eAAK,UAAU,oBAAI,IAAI;AACvB,eAAK,mBAAmB;AAAA,QAC1B;AAEA,aAAK,UAAU;AACf,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,UAAU;AACR,YAAI,KAAK,QAAQ,UAAU;AACzB,gBAAM,IAAI,MAAM,4CAA4C;AAAA,QAC9D;AAEA,YAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,eAAO,KAAK,QAAQ,QAAQ;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,IAAI;AACR,YAAI,KAAK,WAAW,QAAQ;AAC1B,cAAI,IAAI;AACN,iBAAK,KAAK,SAAS,MAAM;AACvB,iBAAG,IAAI,MAAM,2BAA2B,CAAC;AAAA,YAC3C,CAAC;AAAA,UACH;AAEA,kBAAQ,SAAS,WAAW,IAAI;AAChC;AAAA,QACF;AAEA,YAAI,GAAI,MAAK,KAAK,SAAS,EAAE;AAE7B,YAAI,KAAK,WAAW,QAAS;AAC7B,aAAK,SAAS;AAEd,YAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,QAAQ;AAChD,cAAI,KAAK,SAAS;AAChB,iBAAK,iBAAiB;AACtB,iBAAK,mBAAmB,KAAK,UAAU;AAAA,UACzC;AAEA,cAAI,KAAK,SAAS;AAChB,gBAAI,CAAC,KAAK,QAAQ,MAAM;AACtB,sBAAQ,SAAS,WAAW,IAAI;AAAA,YAClC,OAAO;AACL,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF,OAAO;AACL,oBAAQ,SAAS,WAAW,IAAI;AAAA,UAClC;AAAA,QACF,OAAO;AACL,gBAAME,UAAS,KAAK;AAEpB,eAAK,iBAAiB;AACtB,eAAK,mBAAmB,KAAK,UAAU;AAMvC,UAAAA,QAAO,MAAM,MAAM;AACjB,sBAAU,IAAI;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAa,KAAK;AAChB,YAAI,KAAK,QAAQ,MAAM;AACrB,gBAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG;AACjC,gBAAM,WAAW,UAAU,KAAK,IAAI,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI;AAE9D,cAAI,aAAa,KAAK,QAAQ,KAAM,QAAO;AAAA,QAC7C;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,cAAc,KAAK,QAAQ,MAAM,IAAI;AACnC,eAAO,GAAG,SAAS,aAAa;AAEhC,cAAM,MAAM,IAAI,QAAQ,mBAAmB;AAC3C,cAAM,UAAU,IAAI,QAAQ;AAC5B,cAAM,UAAU,CAAC,IAAI,QAAQ,uBAAuB;AAEpD,YAAI,IAAI,WAAW,OAAO;AACxB,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,QACF;AAEA,YAAI,YAAY,UAAa,QAAQ,YAAY,MAAM,aAAa;AAClE,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,QACF;AAEA,YAAI,QAAQ,UAAa,CAAC,SAAS,KAAK,GAAG,GAAG;AAC5C,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,QACF;AAEA,YAAI,YAAY,MAAM,YAAY,GAAG;AACnC,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,SAAS;AAAA,YACjE,yBAAyB;AAAA,UAC3B,CAAC;AACD;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,aAAa,GAAG,GAAG;AAC3B,yBAAe,QAAQ,GAAG;AAC1B;AAAA,QACF;AAEA,cAAM,uBAAuB,IAAI,QAAQ,wBAAwB;AACjE,YAAI,YAAY,oBAAI,IAAI;AAExB,YAAI,yBAAyB,QAAW;AACtC,cAAI;AACF,wBAAY,YAAY,MAAM,oBAAoB;AAAA,UACpD,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,8CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,UACF;AAAA,QACF;AAEA,cAAM,yBAAyB,IAAI,QAAQ,0BAA0B;AACrE,cAAM,aAAa,CAAC;AAEpB,YACE,KAAK,QAAQ,qBACb,2BAA2B,QAC3B;AACA,gBAAM,oBAAoB,IAAI;AAAA,YAC5B,KAAK,QAAQ;AAAA,YACb;AAAA,YACA,KAAK,QAAQ;AAAA,UACf;AAEA,cAAI;AACF,kBAAM,SAAS,UAAU,MAAM,sBAAsB;AAErD,gBAAI,OAAO,kBAAkB,aAAa,GAAG;AAC3C,gCAAkB,OAAO,OAAO,kBAAkB,aAAa,CAAC;AAChE,yBAAW,kBAAkB,aAAa,IAAI;AAAA,YAChD;AAAA,UACF,SAAS,KAAK;AACZ,kBAAM,UACJ;AACF,8CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;AAAA,UACF;AAAA,QACF;AAKA,YAAI,KAAK,QAAQ,cAAc;AAC7B,gBAAM,OAAO;AAAA,YACX,QACE,IAAI,QAAQ,GAAG,YAAY,IAAI,yBAAyB,QAAQ,EAAE;AAAA,YACpE,QAAQ,CAAC,EAAE,IAAI,OAAO,cAAc,IAAI,OAAO;AAAA,YAC/C;AAAA,UACF;AAEA,cAAI,KAAK,QAAQ,aAAa,WAAW,GAAG;AAC1C,iBAAK,QAAQ,aAAa,MAAM,CAAC,UAAU,MAAM,SAAS,YAAY;AACpE,kBAAI,CAAC,UAAU;AACb,uBAAO,eAAe,QAAQ,QAAQ,KAAK,SAAS,OAAO;AAAA,cAC7D;AAEA,mBAAK;AAAA,gBACH;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF,CAAC;AACD;AAAA,UACF;AAEA,cAAI,CAAC,KAAK,QAAQ,aAAa,IAAI,EAAG,QAAO,eAAe,QAAQ,GAAG;AAAA,QACzE;AAEA,aAAK,gBAAgB,YAAY,KAAK,WAAW,KAAK,QAAQ,MAAM,EAAE;AAAA,MACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAeA,gBAAgB,YAAY,KAAK,WAAW,KAAK,QAAQ,MAAM,IAAI;AAIjE,YAAI,CAAC,OAAO,YAAY,CAAC,OAAO,SAAU,QAAO,OAAO,QAAQ;AAEhE,YAAI,OAAO,UAAU,GAAG;AACtB,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,QAAS,QAAO,eAAe,QAAQ,GAAG;AAE5D,cAAM,SAASH,YAAW,MAAM,EAC7B,OAAO,MAAM,IAAI,EACjB,OAAO,QAAQ;AAElB,cAAM,UAAU;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA,yBAAyB,MAAM;AAAA,QACjC;AAEA,cAAM,KAAK,IAAI,KAAK,QAAQ,UAAU,MAAM,QAAW,KAAK,OAAO;AAEnE,YAAI,UAAU,MAAM;AAIlB,gBAAM,WAAW,KAAK,QAAQ,kBAC1B,KAAK,QAAQ,gBAAgB,WAAW,GAAG,IAC3C,UAAU,OAAO,EAAE,KAAK,EAAE;AAE9B,cAAI,UAAU;AACZ,oBAAQ,KAAK,2BAA2B,QAAQ,EAAE;AAClD,eAAG,YAAY;AAAA,UACjB;AAAA,QACF;AAEA,YAAI,WAAW,kBAAkB,aAAa,GAAG;AAC/C,gBAAM,SAAS,WAAW,kBAAkB,aAAa,EAAE;AAC3D,gBAAM,QAAQ,UAAU,OAAO;AAAA,YAC7B,CAAC,kBAAkB,aAAa,GAAG,CAAC,MAAM;AAAA,UAC5C,CAAC;AACD,kBAAQ,KAAK,6BAA6B,KAAK,EAAE;AACjD,aAAG,cAAc;AAAA,QACnB;AAKA,aAAK,KAAK,WAAW,SAAS,GAAG;AAEjC,eAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,KAAK,MAAM,CAAC;AAChD,eAAO,eAAe,SAAS,aAAa;AAE5C,WAAG,UAAU,QAAQ,MAAM;AAAA,UACzB,wBAAwB,KAAK,QAAQ;AAAA,UACrC,YAAY,KAAK,QAAQ;AAAA,UACzB,oBAAoB,KAAK,QAAQ;AAAA,QACnC,CAAC;AAED,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,IAAI,EAAE;AACnB,aAAG,GAAG,SAAS,MAAM;AACnB,iBAAK,QAAQ,OAAO,EAAE;AAEtB,gBAAI,KAAK,oBAAoB,CAAC,KAAK,QAAQ,MAAM;AAC/C,sBAAQ,SAAS,WAAW,IAAI;AAAA,YAClC;AAAA,UACF,CAAC;AAAA,QACH;AAEA,WAAG,IAAI,GAAG;AAAA,MACZ;AAAA,IACF;AAEA,WAAO,UAAUE;AAYjB,aAAS,aAAaC,SAAQ,KAAK;AACjC,iBAAW,SAAS,OAAO,KAAK,GAAG,EAAG,CAAAA,QAAO,GAAG,OAAO,IAAI,KAAK,CAAC;AAEjE,aAAO,SAAS,kBAAkB;AAChC,mBAAW,SAAS,OAAO,KAAK,GAAG,GAAG;AACpC,UAAAA,QAAO,eAAe,OAAO,IAAI,KAAK,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAQA,aAAS,UAAUA,SAAQ;AACzB,MAAAA,QAAO,SAAS;AAChB,MAAAA,QAAO,KAAK,OAAO;AAAA,IACrB;AAOA,aAAS,gBAAgB;AACvB,WAAK,QAAQ;AAAA,IACf;AAWA,aAAS,eAAe,QAAQ,MAAM,SAAS,SAAS;AAStD,gBAAU,WAAW,KAAK,aAAa,IAAI;AAC3C,gBAAU;AAAA,QACR,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,QAC3C,GAAG;AAAA,MACL;AAEA,aAAO,KAAK,UAAU,OAAO,OAAO;AAEpC,aAAO;AAAA,QACL,YAAY,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC;AAAA,IACzC,OAAO,KAAK,OAAO,EAChB,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,EAChC,KAAK,MAAM,IACd,aACA;AAAA,MACJ;AAAA,IACF;AAcA,aAAS,kCACPA,SACA,KACA,QACA,MACA,SACA,SACA;AACA,UAAIA,QAAO,cAAc,eAAe,GAAG;AACzC,cAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,cAAM,kBAAkB,KAAK,iCAAiC;AAE9D,QAAAA,QAAO,KAAK,iBAAiB,KAAK,QAAQ,GAAG;AAAA,MAC/C,OAAO;AACL,uBAAe,QAAQ,MAAM,SAAS,OAAO;AAAA,MAC/C;AAAA,IACF;AAAA;AAAA;;;ACriBA,YAAY,SAAS;AACrB,YAAY,SAAS;AACrB,YAAYC,SAAQ;AACpB,YAAY,SAAS;AACrB,YAAY,YAAY;AAExB,OAAO,gBAAgB;AACvB,YAAY,UAAU;AACtB,YAAYC,SAAQ;AACpB,SAAS,cAAc;AACvB,SAAS,gBAAgB;;;ACVzB,YAAY,QAAQ;AAEb,SAAS,cAAc;AAE1B,SAAU,gBAAa,GAAG;AAG9B;AAEA,IAAO,mBAAQ;;;ACTf,YAAY,QAAQ;AAOb,SAAS,aAAqB;AACjC,SAAU,WAAQ;AACtB;;;AFkIA,IAAI,aAAyB,CAAC;AAC9B,IAAI;AACF,QAAM,aAAkB,UAAK,WAAW,GAAG,aAAa,aAAa;AACrE,MAAO,eAAW,UAAU,GAAG;AAC7B,UAAM,gBAAmB,iBAAa,YAAY,MAAM;AACxD,iBAAa,KAAK,MAAM,aAAa;AAAA,EAGvC,OAAO;AACL,YAAQ,IAAI,4BAA4B,YAAY,kBAAkB;AAAA,EACxE;AACF,SAAS,GAAG;AACV,UAAQ,MAAM,0BAA0B,CAAC;AACzC,eAAa,CAAC;AAChB;AAEO,IAAM,WAAN,MAAe;AAAA,EA2GpB,YAAY,UAA2B,CAAC,GAAG;AAzG3C;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AAGA;AAAA;AAGA;AAAA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AAGA;AAAA;AACA;AAGA;AAAA;AACA;AAGA;AAAA;AACA;AAQE,SAAK,OAAO,QAAQ,QAAQ,WAAW,QAAQ;AAC/C,SAAK,OAAO,OAAO,SAAS,OAAO,QAAQ,IAAI,CAAC,IAC5C,OAAO,QAAQ,IAAI,IACnB,WAAW,QAAQ;AAGvB,SAAK,SAAS,QAAQ,WAAW,SAAY,QAAQ,SAAU,WAAW,WAAW,SAAY,WAAW,SAAS;AAGrH,QAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAChC,WAAK,QAAQ,QAAQ;AACrB,cAAQ,IAAI,6BAA6B,KAAK,MAAM,QAAQ,OAAO;AAAA,IACrE,WAAW,QAAQ,SAAS,OAAO,QAAQ,UAAU,UAAU;AAC7D,WAAK,QAAQ,CAAC,QAAQ,KAAK;AAC3B,cAAQ,IAAI,gCAAgC;AAAA,IAC9C,WAAW,MAAM,QAAQ,WAAW,KAAK,GAAG;AAC1C,WAAK,QAAQ,WAAW;AACxB,cAAQ,IAAI,gCAAgC,KAAK,MAAM,QAAQ,OAAO;AAAA,IACxE,OAAO;AACL,WAAK,QAAQ,CAAC;AACd,cAAQ,IAAI,sBAAsB;AAAA,IACpC;AAGA,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAQ,IAAI,sBAAsB;AAAA,QAChC,UAAU,KAAK,MAAM,CAAC,EAAE;AAAA,QACxB,aAAa,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE;AAAA,QAC7B,MAAM,KAAK,MAAM,CAAC,EAAE;AAAA,QACpB,WAAW,KAAK,MAAM,CAAC,EAAE;AAAA,MAC3B,CAAC;AAAA,IACH;AAGA,QAAI,QAAQ,IAAI;AACd,WAAK,KAAK,QAAQ;AAAA,IACpB,OAAO;AACL,UAAI;AACF,cAAM,WAAW,mBAAc,iBAAY,IAAI,QAAQ,IAAI;AAC3D,cAAM,SAAS,QAAQ,UAAU,WAAW,UAAU;AAAA,MACxD,SAAS,KAAK;AAEZ,gBAAQ;AAAA,UACN;AAAA,UACC,OAAQ,IAAc,UAAY,IAAc,UAAU;AAAA,QAC7D;AACA,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAGA,SAAK,eACH,QAAQ,gBACR,QAAQ,IAAI,uBACZ,WAAW,gBACX;AACF,QAAI,CAAC,KAAK,cAAc;AACtB,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAc,YAAW,SAAK,EAAE,SAAY,SAAK,EAAE,SAAS;AAClE,UAAM,uBAAuB,KAAK;AAAA,MAChC;AAAA,MACA,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,IACtC;AACA,SAAK,oBACH,OAAO,QAAQ,sBAAsB,WACjC,QAAQ,oBACR;AAIN,SAAK,iBAAiB,IAAI,WAAW,MAAM;AAAA,MACzC,eAAe;AAAA,MACf,SAAS;AAAA,IACX,CAAC;AAGD,SAAK,oBAAoB,oBAAI,IAAI;AAEjC,SAAK,iBAAiB,oBAAI,IAAI;AAC9B,SAAK,oBAAoB,QAAQ,kBAAkB,WAAW,kBAAkB,KAAK,KAAK;AAC1F,SAAK,qBAAqB,QAAQ,oBAAoB,WAAW,oBAAoB;AACrF,SAAK,mBAAmB,QAAQ,kBAAkB,WAAW,kBAAkB,KAAK,KAAK;AACzF,SAAK,oBAAoB,QAAQ,oBAAoB,SAAY,QAAQ,kBAAmB,WAAW,oBAAoB,SAAY,WAAW,kBAAkB;AACpK,SAAK,oBAAoB,QAAQ,mBAAmB,KAAK;AACzD,SAAK,8BAA8B,QAAQ,4BAA4B;AAIvE,SAAK,wBACH,OAAO,QAAQ,wBAAwB,WACnC,QAAQ,sBACR,OAAO,WAAW,wBAAwB,WAC1C,WAAW,sBACX;AACN,SAAK,aAAa,QAAQ,cAAc,WAAW,cAAc;AACjE,SAAK,yBACH,QAAQ,2BAA2B,SAC/B,QAAQ,yBACR;AAIN,SAAK,gBAAgB,QAAQ,iBAC3B,WAAW,iBAAiB;AAAA,MAC1B,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAGF,SAAK,sBAAsB,QAAQ,uBAAuB;AAG1D,SAAK,mBAAmB,QAAQ,mBAAmB;AACnD,SAAK,mBAAmB,QAAQ,mBAAmB;AACnD,SAAK,mBAAmB,QAAQ,mBAAmB,KAAK;AACxD,SAAK,oBAAoB,QAAQ,oBAAoB;AACrD,SAAK,oBAAoB,QAAQ,oBAAoB;AACrD,SAAK,qBAAqB,QAAQ,qBAAqB;AAGvD,SAAK,mBAAmB,QAAQ,mBAAmB,KAAK,KAAK;AAC7D,SAAK,+BAA+B,YAAY,MAAM;AACpD,YAAM,MAAM,KAAK,IAAI;AACrB,WAAK,kBAAkB,QAAQ,CAAC,GAAG,MAAM;AACvC,YAAI,EAAE,aAAa,EAAE,aAAa,IAAK,MAAK,kBAAkB,OAAO,CAAC;AAAA,MACxE,CAAC;AACD,WAAK,eAAe,QAAQ,CAAC,GAAG,MAAM;AACpC,YAAI,EAAE,aAAa,EAAE,aAAa,IAAK,MAAK,eAAe,OAAO,CAAC;AAAA,MACrE,CAAC;AAAA,IACH,GAAG,KAAK,IAAI,KAAK,KAAM,KAAK,mBAAmB,CAAC,CAAC;AAGjD,SAAK,QAAQ,SAAU,OAAe,MAAY;AAChD,UAAI;AACF,cAAM,WAAW,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AAE7C,YAAI,SAAS,MAAO,UAAS,QAAQ;AACrC,YAAI,SAAS,SAAU,UAAS,WAAW;AAC3C,YAAI,SAAS,aAAc,UAAS,eAAe;AACnD,YAAI,SAAS,cAAe,UAAS,gBAAgB;AACrD,gBAAQ;AAAA,UACN,KAAK,UAAU;AAAA,YACb,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,YAC3B;AAAA,YACA,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,GAAG;AAAA,MAAC;AAAA,IACf;AAGA,SAAK,iBAAiB,CAAC;AACvB,SAAK,cAAc;AACnB,SAAK,iBAAiB,oBAAI,IAAI;AAC9B,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,CAAC,CAAC;AACvE,SAAK,iBACH,OAAO,QAAQ,mBAAmB,WAC9B,QAAQ,iBACR;AACN,SAAK,oBACH,QAAQ,qBAAqB,KAAK,IAAI,GAAG,KAAK,iBAAiB,CAAC;AAElE,aAAS,IAAI,GAAG,IAAI,KAAK,gBAAgB,KAAK;AAC5C,YAAM,IAAI,IAAI,OAAY,UAAK,WAAW,WAAW,kBAAkB,CAAC;AACxE,QAAE,GAAG,WAAW,CAAC,MAAM;AACrB,cAAM,IAAI,KAAK,eAAe,IAAI,EAAE,EAAE;AACtC,YAAI,GAAG;AACL,gBAAM,QAAQ,EAAE,SAAS;AACzB,gBAAM,MAAM,QAAQ,KAAK,IAAI,IAAI,QAAQ;AACzC,cAAI,MAAM;AACR,iBAAK;AAAA,cACH,KAAK;AAAA,cACL;AAAA,cACA,KAAK;AAAA,YACP;AACF,uBAAa,EAAE,KAAK;AACpB,eAAK,eAAe,OAAO,EAAE,EAAE;AAC/B,cAAI,EAAE,OAAO;AACX,iBAAK,gBAAgB,KAAK,KAAK,IAAI,CAAC;AACpC,cAAE,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,UAC7B,OAAO;AACL,cAAE,QAAQ,EAAE,EAAE;AAAA,UAChB;AAAA,QACF;AAEA,YAAI;AACF,eAAK,gBAAgB;AAAA,QACvB,SAAS,GAAG;AAAA,QAAC;AAAA,MACf,CAAC;AACD,QAAE,GAAG,SAAS,CAAC,MAAM;AACnB,gBAAQ,MAAM,uBAAwB,KAAM,EAAY,OAAQ;AAChE,aAAK,gBAAgB,KAAK,KAAK,IAAI,CAAC;AACpC,YAAI;AACF,eAAK,gBAAgB;AAAA,QACvB,SAASC,IAAG;AAAA,QAAC;AAAA,MACf,CAAC;AACD,WAAK,eAAe,KAAK,CAAC;AAAA,IAC5B;AAGA,SAAK,mBAAmB,CAAC;AACzB,SAAK,uBAAuB,QAAQ,uBAAuB;AAG3D,SAAK,kBAAkB,CAAC;AACxB,SAAK,yBAAyB,QAAQ,yBAAyB,KAAK;AACpE,SAAK,0BAA0B,QAAQ,0BAA0B;AACjE,SAAK,2BACH,QAAQ,2BAA2B,IAAI,KAAK;AAC9C,SAAK,sBAAsB;AAG3B,SAAK,oBAAoB,IAAI,SAAS,EAAE,KAAK,KAAM,KAAK,MAAO,KAAK,EAAE,CAAC;AAGvE,SAAK,UAAU,QAAQ,WAAW;AAGlC,SAAK,wBACH,OAAO,QAAQ,0BAA0B,WACrC,QAAQ,wBACR;AAGN,SAAK,aAAa,CAAC;AACnB,SAAK,UAAU;AACf,SAAK,aAAa,oBAAI,IAAI;AAC1B,SAAK,eAAe,CAAC;AACrB,SAAK,mBAAmB,QAAQ,mBAAmB;AACnD,SAAK,cAAc,CAAC;AACpB,SAAK,qBAAqB,QAAQ,qBAAqB,KAAK;AAC5D,SAAK,sBAAsB,QAAQ,sBAAsB;AACzD,SAAK,uBAAuB,QAAQ,uBAAuB,IAAI,KAAK;AACpE,SAAK,kBAAkB;AAEvB,QAAI,QAAQ,oBAAoB,QAAQ,mBAAmB,GAAG;AAC5D,YAAM,gBAAgB,KAAK;AAAA,QACzB;AAAA,QACA,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC;AAAA,MACvD;AACA,YAAM,SACJ,OAAO,QAAQ,qBAAqB,WAChC,QAAQ,mBACR;AAEN,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,cAAM,IAAI,IAAI,OAAY,UAAK,WAAW,cAAc,CAAC;AAEzD,UAAE,YAAY;AAAA,UACZ,IAAI,QAAQ,CAAC;AAAA,UACb,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,SAAS,QAAQ,SACR,UAAK,mBAAc,iBAAY,IAAI,QAAQ,IAAI,GAAG,QAAQ,MAAM,IACrE;AAAA,UACN;AAAA,QACF,CAAC;AAED,UAAE,GAAG,WAAW,CAAC,MAAM;AACrB,gBAAM,IAAI,KAAK,WAAW,IAAI,EAAE,EAAE;AAClC,cAAI,GAAG;AACL,kBAAM,QAAQ,EAAE,SAAS;AACzB,kBAAM,MAAM,QAAQ,KAAK,IAAI,IAAI,QAAQ;AACzC,gBAAI,MAAM;AACR,mBAAK;AAAA,gBACH,KAAK;AAAA,gBACL;AAAA,gBACA,KAAK;AAAA,cACP;AACF,yBAAa,EAAE,KAAK;AACpB,iBAAK,WAAW,OAAO,EAAE,EAAE;AAC3B,gBAAI,EAAE,OAAO;AACX,mBAAK,YAAY,KAAK,KAAK,IAAI,CAAC;AAChC,gBAAE,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,YAC7B,OAAO;AACL,gBAAE,QAAQ,EAAE,GAAG;AAAA,YACjB;AAAA,UACF;AACA,cAAI;AACF,iBAAK,gBAAgB;AAAA,UACvB,SAAS,GAAG;AAAA,UAAC;AAAA,QACf,CAAC;AAED,UAAE,GAAG,SAAS,CAAC,MAAM;AACnB,kBAAQ,MAAM,mBAAoB,KAAM,EAAY,OAAQ;AAC5D,eAAK,YAAY,KAAK,KAAK,IAAI,CAAC;AAChC,cAAI;AACF,iBAAK,gBAAgB;AAAA,UACvB,SAASA,IAAG;AAAA,UAAC;AAAA,QACf,CAAC;AACD,aAAK,WAAW,KAAK,CAAC;AAAA,MACxB;AAAA,IACF;AAGA,SAAK,oBAAoB,CAAC;AAC1B,SAAK,iBAAiB;AACtB,SAAK,oBAAoB,oBAAI,IAAI;AACjC,UAAM,oBAAoB,QAAQ,qBAAqB;AACvD,SAAK,oBAAoB;AACzB,SAAK,sBAAsB,CAAC;AAC5B,SAAK,0BAA0B,QAAQ,0BAA0B;AACjE,SAAK,qBAAqB,CAAC;AAC3B,SAAK,4BACH,QAAQ,4BAA4B,KAAK;AAC3C,SAAK,6BAA6B,QAAQ,6BAA6B;AACvE,SAAK,8BACH,QAAQ,8BAA8B,IAAI,KAAK;AACjD,SAAK,yBAAyB;AAE9B,QAAI,oBAAoB,GAAG;AACzB,eAAS,IAAI,GAAG,IAAI,mBAAmB,KAAK;AAC1C,cAAM,KAAK,IAAI,OAAY,UAAK,WAAW,qBAAqB,CAAC;AACjE,WAAG,GAAG,WAAW,CAAC,MAAM;AACtB,gBAAM,IAAI,KAAK,kBAAkB,IAAI,EAAE,EAAE;AACzC,cAAI,GAAG;AACL,kBAAM,QAAQ,EAAE,SAAS;AACzB,kBAAM,MAAM,QAAQ,KAAK,IAAI,IAAI,QAAQ;AACzC,gBAAI,MAAM;AACR,mBAAK;AAAA,gBACH,KAAK;AAAA,gBACL;AAAA,gBACA,KAAK;AAAA,cACP;AACF,yBAAa,EAAE,KAAK;AACpB,iBAAK,kBAAkB,OAAO,EAAE,EAAE;AAClC,gBAAI,EAAE,OAAO;AACX,mBAAK,mBAAmB,KAAK,KAAK,IAAI,CAAC;AACvC,gBAAE,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,YAC7B,OAAO;AACL,gBAAE,QAAQ,EAAE,GAAG;AAAA,YACjB;AAAA,UACF;AAAA,QACF,CAAC;AACD,WAAG,GAAG,SAAS,CAAC,MAAM;AACpB,kBAAQ,MAAM,0BAA2B,KAAM,EAAY,OAAQ;AACnE,eAAK,mBAAmB,KAAK,KAAK,IAAI,CAAC;AAAA,QACzC,CAAC;AACD,aAAK,kBAAkB,KAAK,EAAE;AAAA,MAChC;AAAA,IACF;AAGA,SAAK,UAAU;AAAA,MACb,eAAe,MAAM,KAAK,eAAe;AAAA,MACzC,WAAW,MAAM,KAAK,WAAW;AAAA,MACjC,WAAW,MAAM,KAAK,WAAW;AAAA,MACjC,mBAAmB;AAAA,MACnB,kBAAkB,MAAM,KAAK,kBAAkB;AAAA,MAC/C,kBAAkB,MAAM,KAAK,kBAAkB;AAAA,MAC/C,kBAAkB,MAAM;AACtB,cAAM,IAAI,KAAK;AACf,eAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,SAAS;AAAA,MAC9D;AAAA,MACA,cAAc,MAAM;AAClB,cAAM,IAAI,KAAK;AACf,eAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,SAAS;AAAA,MAC9D;AAAA,MACA,qBAAqB,MAAM;AACzB,cAAM,IAAI,KAAK;AACf,eAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,SAAS;AAAA,MAC9D;AAAA,MACA,eAAe,MACb,KAAK,WAAW,KAAK,QAAQ,iBACzB,KAAK,QAAQ,iBACb;AAAA,MACN,gBAAgB,MACd,KAAK,WACL,KAAK,QAAQ,wBACb,KAAK,IAAI,IAAI,KAAK,QAAQ,uBACtB,OACA;AAAA,IACR;AAGA,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,UAAU,QAAQ,WAAW;AAGlC,SAAK,wBAAwB,QAAQ,yBAAyB;AAC9D,SAAK,oBACH,QAAQ,sBACP,QAAQ,eAAe,QAAQ,eAAe,MAAM;AAGvD,SAAK,uBAAuB,QAAQ,uBAAuB;AAC3D,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA,EA/YQ,qBAA6B;AACnC,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA;AAAA,EAgZA,eAAe,KAAe,KAAa,KAAa;AACtD,QAAI;AACF,UAAI,KAAK,GAAG;AACZ,UAAI,IAAI,SAAS,IAAK,KAAI,MAAM;AAAA,IAClC,SAAS,GAAG;AAAA,IAAC;AAAA,EACf;AAAA;AAAA,EAGA,kBAAkB;AAChB,QAAI;AAEF,YAAM,UAAU,KAAK,eAAe;AACpC,YAAM,UAAU,KAAK,eAAe;AACpC,UAAI,UAAU,UAAU,KAAK,UAAU,KAAK,mBAAmB;AAE7D,cAAM,IAAI,IAAI,OAAY,UAAK,WAAW,WAAW,kBAAkB,CAAC;AACxE,UAAE,GAAG,WAAW,CAAC,MAAM;AACrB,gBAAM,IAAI,KAAK,eAAe,IAAI,EAAE,EAAE;AACtC,cAAI,GAAG;AACL,yBAAa,EAAE,KAAK;AACpB,iBAAK,eAAe,OAAO,EAAE,EAAE;AAC/B,gBAAI,EAAE,MAAO,GAAE,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,gBACnC,GAAE,QAAQ,EAAE,EAAE;AAAA,UACrB;AAAA,QACF,CAAC;AACD,UAAE,GAAG,SAAS,CAAC,MAAM;AACnB,kBAAQ,MAAM,mCAAoC,KAAM,EAAY,OAAQ;AAAA,QAC9E,CAAC;AACD,aAAK,eAAe,KAAK,CAAC;AAAA,MAC5B;AAEA,UAAI,UAAU,KAAK,IAAI,KAAK,uBAAuB,UAAU,CAAC,GAAG;AAC/D,YAAI;AACF,eAAK,MAAM,cAAc,EAAE,MAAM,UAAU,SAAS,QAAQ,CAAC;AAAA,QAC/D,SAAS,GAAG;AAAA,QAAC;AAAA,MACf;AAGA,YAAM,YAAY,KAAK,WAAW;AAClC,YAAM,YAAY,KAAK,WAAW;AAClC,YAAM,QAAQ,KAAK;AAAA,QACjB,KAAK,WAAW;AAAA,QAChB,KAAK,iBAAiB,KAAK,WAAW,SAAS;AAAA,MACjD;AAEA,UAAI,YAAY,YAAY,KAAK,YAAY,OAAO;AAClD,cAAM,IAAI,IAAI,OAAY,UAAK,WAAW,cAAc,CAAC;AACzD,UAAE,YAAY;AAAA,UACZ,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA,UAC3B,QAAQ;AAAA,UACR,SAAS,EAAE,SAAS,OAAU;AAAA,QAChC,CAAC;AAED,UAAE,GAAG,WAAW,CAAC,MAAM;AACrB,gBAAM,IAAI,KAAK,WAAW,IAAI,EAAE,EAAE;AAClC,cAAI,GAAG;AACL,yBAAa,EAAE,KAAK;AACpB,iBAAK,WAAW,OAAO,EAAE,EAAE;AAC3B,gBAAI,EAAE,MAAO,GAAE,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,gBACnC,GAAE,QAAQ,EAAE,GAAG;AAAA,UACtB;AAAA,QACF,CAAC;AAED,UAAE,GAAG,SAAS,CAAC,MAAM;AACnB,kBAAQ,MAAM,+BAAgC,KAAM,EAAY,OAAQ;AAAA,QAC1E,CAAC;AACD,aAAK,WAAW,KAAK,CAAC;AAAA,MACxB;AAEA,UAAI,YAAY,KAAK,IAAI,KAAK,uBAAuB,YAAY,CAAC,GAAG;AACnE,YAAI;AACF,eAAK,MAAM,cAAc;AAAA,YACvB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAAA,QACH,SAAS,GAAG;AAAA,QAAC;AAAA,MACf;AAAA,IACF,SAAS,GAAG;AAAA,IAAC;AAAA,EACf;AAAA,EAEA,QAAQ;AACN,UAAM,iBAAiB,OAAO,WAAuC;AAEnE,UAAI,KAAK,QAAQ,qBAAqB,KAAK,gBAAgB;AACzD,YAAI;AACF,iBAAO,IAAI;AAAA,QACb,SAAS,GAAG;AAAA,QAAC;AACb;AAAA,MACF;AACA,WAAK,QAAQ;AACb,cAAQ,IAAI,kBAAkB;AAI9B,aAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,gBAAQ,MAAM,iBAAkB,OAAQ,IAAc,UAAY,IAAc,UAAU,GAAG;AAAA,MAC/F,CAAC;AAED,aAAO,GAAG,SAAS,CAAC,aAAsB;AAExC,gBAAQ,IAAI,iBAAiB,WAAW,mBAAmB,EAAE;AAC7D,aAAK,QAAQ,oBAAoB,KAAK;AAAA,UACpC;AAAA,UACA,KAAK,QAAQ,oBAAoB;AAAA,QACnC;AAAA,MACF,CAAC;AAGD,UAAI,UAAU;AACd,UAAI,mBAAmB;AACvB,aAAO,WAAW,KAAK,qBAAqB;AAE5C,aAAO,GAAG,WAAW,MAAM;AACzB,YAAI;AACF,+BAAqB,EAAE,SAAS,SAAS,SAAS,UAAU,CAAC;AAAA,QAC/D,SAAS,GAAG;AAAA,QAAC;AACb,eAAO,IAAI;AAAA,MACb,CAAC;AAGD,YAAM,uBAAuB,CAAC,QAAa;AACzC,YAAI;AACF,gBAAM,IAAI,KAAK,UAAU,GAAG,IAAI;AAChC,kBAAQ,IAAI,oDAAoD,OAAO,eAAe,OAAO,YAAY,KAAK,EAAE,KAAK,CAAC;AACtH,gBAAM,KAAK,OAAO,MAAM,CAAC;AACzB,kBAAQ,IAAI,yCAAyC,EAAE;AACvD,cAAI,CAAC,IAAI;AACP,mBAAO,MAAM;AACb,mBAAO,KAAK,SAAS,MAAM,OAAO,OAAO,CAAC;AAAA,UAC5C;AAAA,QACF,SAAS,GAAG;AACV,kBAAQ,MAAM,+BAA+B,CAAC;AAAA,QAChD;AAAA,MACF;AAGA,YAAM,eAAe,CAAC,QAA4B;AAChD,eAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,cAAI;AACF,kBAAM,IAAI,KAAK,UAAU,GAAG,IAAI;AAChC,oBAAQ,IAAI,yBAAyB,EAAE,KAAK,CAAC;AAC7C,mBAAO,MAAM,GAAG,CAAC,QAAQ;AACvB,kBAAI,KAAK;AACP,wBAAQ,MAAM,6BAA6B,GAAG;AAC9C,uBAAO,OAAO,GAAG;AAAA,cACnB;AACA,sBAAQ,IAAI,qDAAqD;AAEjE,yBAAW,MAAM;AACf,wBAAQ,IAAI,kCAAkC;AAC9C,gBAAAA,SAAQ;AAAA,cACV,GAAG,EAAE;AAAA,YACP,CAAC;AAAA,UACH,SAAS,GAAG;AACV,oBAAQ,MAAM,2BAA2B,CAAC;AAC1C,mBAAO,CAAC;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAO,GAAG,QAAQ,OAAO,SAAiB;AAExC,YAAI,KAAK,SAAS,KAAK,mBAAmB;AACxC,cAAI;AACF,iCAAqB;AAAA,cACnB,SAAS;AAAA,cACT,SAAS;AAAA,YACX,CAAC;AAAA,UACH,SAAS,GAAG;AAAA,UAAC;AACb,iBAAO,IAAI;AACX;AAAA,QACF;AAEA,mBAAW,KAAK,SAAS;AACzB,YAAI;AACJ,gBAAQ,MAAM,QAAQ,QAAQ,IAAI,OAAO,IAAI;AAC3C,cAAI,EAAE,mBAAmB,KAAK,6BAA6B;AACzD,gBAAI;AACF,mCAAqB;AAAA,gBACnB,SAAS;AAAA,gBACT,SAAS;AAAA,cACX,CAAC;AAAA,YACH,SAAS,GAAG;AAAA,YAAC;AACb,mBAAO,IAAI;AACX;AAAA,UACF;AAEA,gBAAM,OAAO,QAAQ,MAAM,GAAG,GAAG,EAAE,KAAK;AACxC,oBAAU,QAAQ,MAAM,MAAM,CAAC;AAC/B,cAAI,CAAC,KAAM;AAEX,cAAI;AACJ,cAAI;AACF,qBAAS,KAAK,MAAM,IAAI;AAAA,UAC1B,SAAS,KAAK;AACZ,oBAAQ;AAAA,cACN;AAAA,cACC,OAAQ,IAAc,UAAY,IAAc,UAAU;AAAA,YAC7D;AACA,gBAAI;AACF,mCAAqB;AAAA,gBACnB,SAAS;AAAA,gBACT,SAAS;AAAA,cACX,CAAC;AAAA,YACH,SAAS,GAAG;AAAA,YAAC;AAEb;AAAA,UACF;AAGA,gBAAM,kBAAkB,OAAO,WAAW,OAAO;AAEjD,kBAAQ,iBAAiB;AAAA,YACvB,KAAK;AAEH,oBAAM,WAAW,OAAO,MAAM,YAAY;AAC1C,oBAAM,WAAW,OAAO,MAAM,YAAY;AAE1C,sBAAQ,IAAI,kBAAkB,EAAE,UAAU,aAAa,CAAC,CAAC,UAAU,UAAU,OAAO,IAAI,QAAQ,KAAK,OAAO,CAAC;AAG7G,kBAAI,CAAC,KAAK,QAAQ;AAChB,wBAAQ,IAAI,kDAAkD;AAC9D,sBAAM,cAAc,KAAK,mBAAmB;AAC5C,sBAAMC,SAAY;AAAA,kBAChB,EAAE,UAAU,YAAY,IAAI,MAAM,YAAY;AAAA,kBAC9C;AAAA,kBACA,EAAE,WAAW,MAAM;AAAA,gBACrB;AAEA,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAM,EAAE,OAAAA,OAAM;AAAA,kBAChB,CAAC;AACD,0BAAQ,IAAI,uCAAuC;AAAA,gBACrD,SAAS,GAAG;AACV,0BAAQ,MAAM,0BAA0B,CAAC;AAAA,gBAC3C;AACA;AAAA,cACF;AAGA,kBAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,wBAAQ,IAAI,6DAA6D;AACzE,oBAAI;AACF,wBAAM,aAAa;AAAA,oBACjB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAM;AAAA,kBACR,CAAC;AACD,0BAAQ,IAAI,2DAA2D;AAEvE,yBAAO,IAAI;AACX,0BAAQ,IAAI,+BAA+B;AAAA,gBAC7C,SAAS,GAAG;AACV,0BAAQ,MAAM,4BAA4B,CAAC;AAC3C,yBAAO,IAAI;AAAA,gBACb;AACA;AAAA,cACF;AAGA,oBAAM,WACH,OAAe,iBAAkB,OAAe,iBAAiB;AACpE,kBAAI;AACF,sBAAM,YAAY,KAAK,eAAe,IAAI,QAAQ;AAClD,sBAAM,UAAU,SAAS,MAAM,QAAQ,QAAQ,CAAC;AAAA,cAClD,SAAS,GAAG;AAEV,qBAAK,MAAM,0BAA0B;AAAA,kBACnC,IAAI;AAAA,kBACJ,KAAO,KAAgB,EAAY,WAAY,OAAO,CAAC;AAAA,gBACzD,CAAC;AAAA,cACH;AAGA,kBAAI,KAAK,mBAAmB;AAC1B,sBAAM,QAAQ,KAAK,IAAI;AACvB,sBAAM,QAAQ,KAAK,eAAe,IAAI,QAAQ,KAAK;AAAA,kBACjD,UAAU;AAAA,kBACV,aAAa;AAAA,kBACb,WAAW,QAAQ,KAAK;AAAA,gBAC1B;AACA,sBAAM,YAAY,MAAM,YAAY,KAAK;AACzC,sBAAM,YAAY,QAAQ,KAAK;AAE/B,oBAAI,MAAM,YAAY,KAAK,oBAAoB;AAC7C,wBAAM,cAAc,QAAQ,KAAK;AACjC,uBAAK,MAAM,cAAc;AAAA,oBACvB,IAAI;AAAA,oBACJ,UAAU,MAAM;AAAA,kBAClB,CAAC;AAAA,gBACH;AACA,qBAAK,eAAe,IAAI,UAAU,KAAK;AACvC,oBAAI,MAAM,eAAe,MAAM,cAAc,OAAO;AAClD,uBAAK,MAAM,aAAa,EAAE,IAAI,SAAS,CAAC;AACxC,sBAAI;AACF,yCAAqB;AAAA,sBACnB,SAAS;AAAA,sBACT,SAAS;AAAA,sBACT,MAAM;AAAA,oBACR,CAAC;AAAA,kBACH,SAAS,GAAG;AAAA,kBAAC;AACb;AAAA,gBACF;AAAA,cACF;AAGA,oBAAM,MAAM,KAAK,IAAI;AACrB,oBAAM,SAAS,KAAK,kBAAkB,IAAI,QAAQ,KAAK;AAAA,gBACrD,UAAU;AAAA,gBACV,aAAa;AAAA,gBACb,WAAW,MAAM,KAAK;AAAA,cACxB;AACA,kBAAI,OAAO,eAAe,OAAO,cAAc,KAAK;AAClD,oBAAI;AACF,uCAAqB;AAAA,oBACnB,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAM;AAAA,kBACR,CAAC;AAAA,gBACH,SAAS,GAAG;AAAA,gBAAC;AACb;AAAA,cACF;AAGA,oBAAM,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ;AAC3D,kBAAI,CAAC,MAAM;AAET,uBAAO,YAAY,OAAO,YAAY,KAAK;AAC3C,uBAAO,YAAY,KAAK,IAAI,IAAI,KAAK;AACrC,oBAAI,OAAO,YAAY,KAAK,oBAAoB;AAC9C,yBAAO,cAAc,MAAM,KAAK;AAEhC,uBAAK,MAAM,iBAAiB,EAAE,MAAM,UAAU,IAAI,SAAS,CAAC;AAAA,gBAC9D;AACA,qBAAK,kBAAkB,IAAI,UAAU,MAAM;AAC3C,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAM;AAAA,kBACR,CAAC;AAAA,gBACH,SAAS,GAAG;AAAA,gBAAC;AACb;AAAA,cACF;AAGA,sBAAQ,IAAI,eAAe;AAAA,gBACzB,UAAU,KAAK;AAAA,gBACf,aAAa,CAAC,CAAC,KAAK;AAAA,gBACpB,eAAe,KAAK;AAAA,gBACpB,MAAM,KAAK;AAAA,gBACX,WAAW,KAAK;AAAA,cAClB,CAAC;AACD,sBAAQ,IAAI,sBAAsB,QAAQ;AAG1C,kBAAI,UAAU;AAGd,kBAAI,KAAK,SAAS,SAAS,KAAK,UAAU;AAExC,wBAAQ,IAAI,mDAAmD;AAC/D,0BAAU,KAAK,aAAa;AAAA,cAC9B,WAAW,KAAK,SAAS,QAAQ,KAAK,UAAU;AAE9C,wBAAQ,IAAI,0CAA0C,KAAK,aAAa,QAAQ;AAChF,sBAAM,YAAY,KAAK,aAAa;AAEpC,oBAAI,cAAc,UAAU;AAE1B,wBAAM,kBAAkB,CAACC,WAAkB,SACzC,IAAI,QAAQ,CAACF,UAAS,WAAW;AAC/B,wBAAI,CAAC,KAAK,kBAAkB,KAAK,eAAe,WAAW;AACzD,6BAAOA,SAAQ,KAAK;AAEtB,0BAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC7C,0BAAM,SACJ,KAAK,gBAAgB,KAAK,eAAe;AAC3C,0BAAM,QAAQ,KAAK,IAAI;AACvB,0BAAM,QAAQ,WAAW,MAAM;AAC7B,4BAAM,IAAI,KAAK,eAAe,IAAI,EAAE;AACpC,0BAAI,GAAG;AACL,6BAAK,eAAe,OAAO,EAAE;AAC7B,0BAAE,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,sBAC7C;AACA,0BAAI;AACF,6BAAK,eAAe,MAAM,EAAE,UAAU;AAAA,sBACxC,SAAS,GAAG;AAAA,sBAAC;AACb,4BAAM,KAAK,IAAI;AAAA,wBACR,UAAK,WAAW,WAAW,kBAAkB;AAAA,sBACpD;AACA,2BAAK,eAAe,MAAM,IAAI;AAAA,oBAChC,GAAG,KAAK,qBAAqB;AAE7B,yBAAK,eAAe,IAAI,IAAI;AAAA,sBAC1B,SAAAA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF,CAAC;AAED,wBAAI;AACF,2BAAK,eAAe,MAAM,EAAE,YAAY;AAAA,wBACtC;AAAA,wBACA,UAAAE;AAAA,wBACA;AAAA,sBACF,CAAC;AAAA,oBACH,SAAS,GAAG;AACV,mCAAa,KAAK;AAClB,2BAAK,eAAe,OAAO,EAAE;AAC7B,6BAAOF,SAAQ,KAAK;AAAA,oBACtB;AAAA,kBACF,CAAC;AAEH,sBAAI;AAIF,8BAAU,KAAK,aAAa;AAAA,kBAC9B,SAAS,GAAG;AACV,8BAAU;AAAA,kBACZ;AAAA,gBACF,WAAW,cAAc,YAAY,cAAc,UAAU;AAE3D,wBAAM,iBAAwB,kBAAW,SAAS,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK;AACjF,4BAAU,KAAK,aAAa;AAAA,gBAC9B;AAAA,cACF;AAEA,kBAAI,CAAC,SAAS;AACZ,uBAAO,YAAY,OAAO,YAAY,KAAK;AAC3C,uBAAO,YAAY,KAAK,IAAI,IAAI,KAAK;AACrC,oBAAI,OAAO,YAAY,KAAK,oBAAoB;AAC9C,yBAAO,cAAc,MAAM,KAAK;AAChC,uBAAK,MAAM,iBAAiB,EAAE,MAAM,UAAU,IAAI,SAAS,CAAC;AAAA,gBAC9D;AACA,qBAAK,kBAAkB,IAAI,UAAU,MAAM;AAC3C,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAM;AAAA,kBACR,CAAC;AAAA,gBACH,SAAS,GAAG;AAAA,gBAAC;AACb;AAAA,cACF;AAGA,mBAAK,kBAAkB,OAAO,QAAQ;AAGtC,kBAAI;AACJ,kBAAI;AACF,wBAAY,SAAK,EAAE,UAAU,KAAK,SAAS,GAAG,KAAK,mBAAmB,GAAG;AAAA,kBACvE,WAAW;AAAA,gBACb,CAAC;AAAA,cACH,SAAS,GAAG;AACV,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAM,EAAE,OAAS,KAAgB,EAAY,WAAY,OAAO,CAAC,EAAE;AAAA,kBACrE,CAAC;AAAA,gBACH,SAASD,IAAG;AAAA,gBAAC;AACb;AAAA,cACF;AAEA,kBAAI;AACF,qCAAqB;AAAA,kBACnB,IAAI,OAAO;AAAA,kBACX,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,MAAM,EAAE,MAAM;AAAA,gBAChB,CAAC;AAAA,cACH,SAAS,GAAG;AAAA,cAAC;AACb;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAI,uBAAuB,MAAM;AAEzC,kBAAI;AAEF,sBAAME,SACJ,OAAO,SAAU,OAAO,QAAQ,OAAO,KAAK;AAC9C,oBAAI,CAACA,OAAO,OAAM,IAAI,MAAM,eAAe;AAG3C,oBACE,OAAOA,WAAU,YACjB,OAAO,WAAWA,QAAO,MAAM,IAAI;AAEnC,wBAAM,IAAI,MAAM,iBAAiB;AAEnC,sBAAM,oBAAwB,WAAOA,MAAK;AAC1C,oBAAI,CAAC;AACH,wBAAM,IAAI,MAAM,uBAAuB;AAGzC,sBAAME,YAAW,kBAAkB,aAAa,kBAAkB,SAAS,cAAc,KAAK;AAC9F,oBAAIA,cAAa;AACf,wBAAM,IAAI,MAAM,uBAAuB;AAGzC,sBAAM,aAAa,KAAK,MAAM;AAAA,kBAC5B,CAAC,MAAM,EAAE,aAAaA;AAAA,gBACxB;AACA,oBAAI,CAAC,YAAY;AAEf,sBAAIA,cAAa,MAAM,CAAC,KAAK,QAAQ;AAAA,kBAErC,OAAO;AACL,0BAAM,IAAI,MAAM,cAAc;AAAA,kBAChC;AAAA,gBACF;AAGA,oBAAI;AAEJ,sBAAM,WAAW,GAAGF,MAAK,IAAI,KAAK,YAAY;AAC9C,sBAAM,SAAS,KAAK,kBAAkB,IAAI,QAAQ;AAClD,oBAAI,QAAQ;AACV,4BAAU;AAAA,gBACZ,OAAO;AACL,sBAAI;AACF,8BAAc,WAAOA,QAAO,KAAK,mBAAmB,CAAC;AACrD,yBAAK,kBAAkB,IAAI,UAAU,OAAO;AAAA,kBAC9C,SAAS,SAAS;AAChB,yBAAK,MAAM,qBAAqB;AAAA,sBAC9B,MAAME;AAAA,oBACR,CAAC;AACD,0BAAM,IAAI,MAAM,4BAA4B;AAAA,kBAC9C;AAAA,gBACF;AACA,oBAAI,CAAC;AACH,wBAAM,IAAI,MAAM,4BAA4B;AAE9C,wBAAQ,IAAI,6CAA6C;AAGzD,oBAAI,CAAC,KAAK,MAAM,OAAO,KAAK,GAAG,QAAQ,YAAY;AACjD,0BAAQ,MAAM,+BAA+B;AAC7C,uCAAqB;AAAA,oBACnB,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAM;AAAA,kBACR,CAAC;AACD;AAAA,gBACF;AAEA,wBAAQ,IAAI,8CAA8C;AAG1D,sBAAMC,QACJ,OAAO,QAAQ,OAAO,OAAO,SAAS,WAClC,OAAO,OACP,CAAC;AAGP,sBAAM,oBAAoB,CAAC,YACzB,IAAI,QAAQ,CAACJ,UAAS,WAAW;AAC/B,sBAAI;AACF,wBACE,CAAC,KAAK,qBACN,KAAK,kBAAkB,WAAW;AAElC,6BAAOA,SAAQ,IAAI;AAErB,wBAAI,KAAK,IAAI,KAAK,KAAK,0BAA0B;AAC/C,6BAAOA,SAAQ,IAAI;AACrB,0BAAM,SACJ,KAAK,mBAAmB,KAAK,kBAAkB;AACjD,0BAAM,IAAI,KAAK,kBAAkB,MAAM;AACvC,0BAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC7C,0BAAM,QAAQ;AAAA,sBACZ,MAAM;AACJ,8BAAM,IAAI,KAAK,kBAAkB,IAAI,EAAE;AACvC,4BAAI,GAAG;AACL,+BAAK,kBAAkB,OAAO,EAAE;AAChC,4BAAE,OAAO,IAAI,MAAM,0BAA0B,CAAC;AAAA,wBAChD;AACA,4BAAI;AACF,4BAAE,UAAU;AAAA,wBACd,SAAS,GAAG;AAAA,wBAAC;AAEb,6BAAK,mBAAmB,KAAK,KAAK,IAAI,CAAC;AAEvC,8BAAM,SAAS,KAAK,mBAAmB;AAAA,0BACrC,CAAC,MACC,IAAI,KAAK,IAAI,IAAI,KAAK;AAAA,wBAC1B;AACA,4BAAI,OAAO,UAAU,KAAK;AACxB,+BAAK,yBACH,KAAK,IAAI,IAAI,KAAK;AAAA,sBACxB;AAAA,sBACA,KAAK,uBAAuB;AAAA,oBAC9B;AACA,yBAAK,kBAAkB,IAAI,IAAI;AAAA,sBAC7B,SAAAA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,OAAO,KAAK,IAAI;AAAA,oBAClB,CAAC;AACD,sBAAE,YAAY;AAAA,sBACZ;AAAA,sBACA,QAAQ;AAAA,sBACR;AAAA,sBACA,SAAS;AAAA,wBACP,QAAQ,KAAK;AAAA,wBACb,UAAU,KAAK;AAAA,wBACf,UAAU,KAAK;AAAA,sBACjB;AAAA,oBACF,CAAC;AAAA,kBACH,SAAS,GAAG;AACV,2BAAOA,SAAQ,IAAI;AAAA,kBACrB;AAAA,gBACF,CAAC;AAEH,sBAAM,oBAAoB,CAAC,YACzB,IAAI,QAAQ,CAACA,UAAS,WAAW;AAC/B,sBAAI;AACF,wBACE,CAAC,KAAK,qBACN,KAAK,kBAAkB,WAAW;AAElC,6BAAOA,SAAQ,IAAI;AACrB,wBAAI,KAAK,IAAI,KAAK,KAAK,0BAA0B;AAC/C,6BAAOA,SAAQ,IAAI;AACrB,0BAAM,SACJ,KAAK,mBAAmB,KAAK,kBAAkB;AACjD,0BAAM,IAAI,KAAK,kBAAkB,MAAM;AACvC,0BAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC7C,0BAAM,QAAQ;AAAA,sBACZ,MAAM;AACJ,8BAAM,IAAI,KAAK,kBAAkB,IAAI,EAAE;AACvC,4BAAI,GAAG;AACL,+BAAK,kBAAkB,OAAO,EAAE;AAChC,4BAAE,OAAO,IAAI,MAAM,0BAA0B,CAAC;AAAA,wBAChD;AACA,4BAAI;AACF,4BAAE,UAAU;AAAA,wBACd,SAAS,GAAG;AAAA,wBAAC;AACb,6BAAK,mBAAmB,KAAK,KAAK,IAAI,CAAC;AACvC,8BAAM,SAAS,KAAK,mBAAmB;AAAA,0BACrC,CAAC,MACC,IAAI,KAAK,IAAI,IAAI,KAAK;AAAA,wBAC1B;AACA,4BAAI,OAAO,UAAU,KAAK;AACxB,+BAAK,yBACH,KAAK,IAAI,IAAI,KAAK;AAAA,sBACxB;AAAA,sBACA,KAAK,uBAAuB;AAAA,oBAC9B;AACA,yBAAK,kBAAkB,IAAI,IAAI;AAAA,sBAC7B,SAAAA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,OAAO,KAAK,IAAI;AAAA,oBAClB,CAAC;AACD,sBAAE,YAAY;AAAA,sBACZ;AAAA,sBACA,QAAQ;AAAA,sBACR;AAAA,sBACA,SAAS;AAAA,wBACP,aAAa;AAAA,0BACX;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF;AAAA,wBACA,UAAU,KAAK;AAAA,wBACf,UAAU,KAAK;AAAA,wBACf,WAAW,KAAK;AAAA,sBAClB;AAAA,oBACF,CAAC;AAAA,kBACH,SAAS,GAAG;AACV,2BAAOA,SAAQ,IAAI;AAAA,kBACrB;AAAA,gBACF,CAAC;AAEH,sBAAM,gBAAgB,CAAC,YAAiB;AACtC,wBAAM,MAAW,CAAC;AAClB,sBAAI,QAAQ;AACZ,wBAAM,aAAa,CAAC,KAAU,UAA2B;AACvD,wBAAI,QAAQ,KAAK,iBAAkB,QAAO;AAC1C,wBAAI,UAAU,KAAK,iBAAkB,QAAO;AAC5C,wBAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,iCAAW,KAAK,OAAO,KAAK,GAAG,GAAG;AAChC,8BAAM,YAAY,KAAK,iBAAiB,CAAC,GAAG,CAAC;AAC7C,4BAAI,CAAC,SAAU;AACf,8BAAM,MAAM,IAAI,CAAC;AACjB,4BAAI,aAAa,YAAY,OAAO,QAAQ;AAC1C,8BAAI,CAAC,IAAI;AAAA,iCAET,aAAa,YACb,OAAO,QAAQ;AAEf,8BAAI,CAAC,IAAI;AAAA,iCAET,aAAa,YACb,OACA,OAAO,QAAQ,UACf;AACA,8BAAI,QAAQ,KAAK,KAAK,kBAAkB;AACtC,gCAAI,CAAC,IAAI,CAAC;AACV,uCAAW,MAAM,OAAO,KAAK,GAAG,GAAG;AACjC,mCAAK,KAAK,iBAAiB,CAAC,GAAG,EAAE;AAC/B,oCAAI,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE;AAAA,4BACvB;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AACA,6BAAO;AAAA,oBACT;AACA,2BAAO;AAAA,kBACT;AACA,sBAAI,CAAC,WAAW,SAAS,CAAC,EAAG,QAAO,CAAC;AACrC,yBAAO;AAAA,gBACT;AAGA,oBAAI,UAAe,CAAC;AACpB,oBAAI;AACF,sBACE,KAAK,qBACL,KAAK,kBAAkB,SAAS,GAChC;AACA,0BAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,sBAC7B,kBAAkBI,KAAI,EAAE,MAAM,MAAM,IAAI;AAAA,sBACxC,IAAI,QAAQ,CAAC,MAAM,WAAW,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;AAAA,oBACpD,CAAC;AACD,wBAAI,OAAO,OAAO,QAAQ,SAAU,WAAU;AAAA,wBACzC,WAAU,cAAcA,KAAI;AAAA,kBACnC,OAAO;AACL,8BAAU,cAAcA,KAAI;AAAA,kBAC9B;AAAA,gBACF,SAAS,GAAG;AACV,4BAAU,cAAcA,KAAI;AAAA,gBAC9B;AAEA,wBAAQ,IAAI,mDAAmD,OAAO,KAAK,OAAO,CAAC;AAGnF,oBAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,0BAAQ,MAAM,6CAA6C;AAC3D,sBAAI;AACF,yCAAqB;AAAA,sBACnB,IAAI,OAAO;AAAA,sBACX,SAAS;AAAA,sBACT,SAAS;AAAA,sBACT,MAAM;AAAA,oBACR,CAAC;AAAA,kBACH,SAAS,GAAG;AAAA,kBAAC;AACb;AAAA,gBACF;AAGA,sBAAM,gBAAgB,CAAC,YACrB,IAAI,QAAQ,CAACJ,UAAS,WAAW;AAC/B,sBAAI,CAAC,KAAK,cAAc,KAAK,WAAW,WAAW;AACjD,2BAAOA,SAAQ,IAAI;AACrB,wBAAM,SAAS,KAAK,YAAY,KAAK,WAAW;AAChD,wBAAM,IAAI,KAAK,WAAW,MAAM;AAChC,wBAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC7C,wBAAM,QAAQ,WAAW,MAAM;AAC7B,0BAAM,IAAI,KAAK,WAAW,IAAI,EAAE;AAChC,wBAAI,GAAG;AACL,2BAAK,WAAW,OAAO,EAAE;AACzB,wBAAE,OAAO,IAAI,MAAM,mBAAmB,CAAC;AAAA,oBACzC;AACA,wBAAI;AACF,wBAAE,UAAU;AAAA,oBACd,SAAS,GAAG;AAAA,oBAAC;AAEb,0BAAM,KAAK,IAAI;AAAA,sBACR,UAAK,WAAW,cAAc;AAAA,oBACrC;AACA,uBAAG,GAAG,WAAW,CAAC,MAAM;AACtB,4BAAMK,KAAI,KAAK,WAAW,IAAI,EAAE,EAAE;AAClC,0BAAIA,IAAG;AACL,qCAAaA,GAAE,KAAK;AACpB,6BAAK,WAAW,OAAO,EAAE,EAAE;AAC3B,4BAAI,EAAE,MAAO,CAAAA,GAAE,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,4BACnC,CAAAA,GAAE,QAAQ,EAAE,GAAG;AAAA,sBACtB;AAAA,oBACF,CAAC;AACD,yBAAK,WAAW,MAAM,IAAI;AAAA,kBAC5B,GAAG,KAAK,iBAAiB;AACzB,uBAAK,WAAW,IAAI,IAAI;AAAA,oBACtB,SAAAL;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,OAAO,KAAK,IAAI;AAAA,kBAClB,CAAC;AACD,sBAAI;AACF,sBAAE,YAAY,EAAE,IAAI,QAAQ,OAAO,QAAQ,CAAC;AAAA,kBAC9C,SAAS,GAAG;AACV,iCAAa,KAAK;AAClB,yBAAK,WAAW,OAAO,EAAE;AACzB,2BAAOA,SAAQ,IAAI;AAAA,kBACrB;AAAA,gBACF,CAAC;AAGH,sBAAM,OAAO,QAAQ;AACrB,sBAAM,eAAe,QAAQ;AAE7B,oBAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,0BAAQ,MAAM,gCAAgC;AAC9C,sBAAI;AACF,yCAAqB;AAAA,sBACnB,IAAI,OAAO;AAAA,sBACX,SAAS;AAAA,sBACT,SAAS;AAAA,sBACT,MAAM;AAAA,oBACR,CAAC;AAAA,kBACH,SAAS,GAAG;AAAA,kBAAC;AACb;AAAA,gBACF;AAEA,wBAAQ,IAAI,2CAA2C,YAAY;AAEnE,sBAAM,aACJ,KAAK,cAAc,KAAK,WAAW,SAAS,IACxC,cAAc,IAAI,IAClB,QAAQ,QAAQ,KAAK,GAAG,IAAI,MAAM,YAAY,CAAC;AAErD,wBAAQ,IAAI,4BAA4B;AAGxC,wBAAQ,QAAQ,UAAU,EACvB,KAAK,OAAO,QAAQ;AACnB,0BAAQ,IAAI,oCAAoC,OAAO,GAAG;AAC1D,sBAAI;AACF,wBAAI;AACJ,wBACE,KAAK,qBACL,KAAK,kBAAkB,SAAS,GAChC;AACA,0BAAI;AACF,8BAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,0BAC9B,kBAAkB,GAAG,EAAE,MAAM,MAAM,IAAI;AAAA,0BACvC,IAAI,QAAQ,CAAC,MAAM,WAAW,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;AAAA,wBACpD,CAAC;AACD,8BAAM,QAAQ,OAAO,SAAS,WAAW,OAAO;AAAA,sBAClD,SAAS,GAAG;AACV,8BAAM;AAAA,sBACR;AAAA,oBACF;AACA,wBAAI,CAAC,KAAK;AAER,4BAAM,cAAc;AAAA,wBAClB;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA;AAAA,wBAEA;AAAA,wBACA;AAAA;AAAA,wBAEA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA;AAAA,wBAEA;AAAA,sBACF;AACA,0BAAI,QAAQ;AACZ,4BAAM,MAAM,CAAC,OAAY,QAAQ,GAAG,aAAa,OAAOM,SAAiB,CAAC,MAAW;AACnF,4BAAI,UAAU,KAAK;AACjB,iCAAO;AACT,4BAAI,QAAQ,KAAK;AACf,iCAAO;AACT,4BAAI,UAAU,QAAQ,UAAU;AAC9B,iCAAO;AACT,4BAAI,OAAO,UAAU,UAAU;AAC7B,8BAAI,MAAM,SAAS,KAAK;AACtB,mCACE,MAAM,MAAM,GAAG,KAAK,kBAAkB,IACtC;AAEJ,iCAAO;AAAA,wBACT;AACA,4BACE,OAAO,UAAU,YACjB,OAAO,UAAU;AAEjB,iCAAO;AACT,4BAAI,OAAO,UAAU,YAAY;AAE/B,gCAAM,oBAAoBA,OAAK,SAAS,WAAW;AACnD,8BAAI,mBAAmB;AACrB,mCAAO,cAAc,MAAM,QAAQ,WAAW;AAAA,0BAChD;AACA,iCAAO;AAAA,wBACT;AACA,4BAAI,MAAM,QAAQ,KAAK;AACrB,iCAAO,MAAM,IAAI,CAAC,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAOA,MAAI,CAAC;AACxD,4BAAI,OAAO,UAAU,UAAU;AAC7B,gCAAM,OAAY,CAAC;AAEnB,gCAAM,oBAAoBA,OAAK,SAAS,WAAW;AACnD,gCAAM,eAAeA,OAAK,SAAS,MAAM;AACzC,qCAAW,KAAK,OAAO,KAAK,KAAK,GAAG;AAGlC,gCAAI,cAAc,YAAY,SAAS,CAAC,KAAK,qBAAqB,cAAc;AAC9E,mCAAK,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAGA,QAAM,CAAC,CAAC;AAAA,4BACxD,OAAO;AACL,mCAAK,CAAC,IAAI;AAAA,4BACZ;AAAA,0BACF;AACA,iCAAO;AAAA,wBACT;AACA,+BAAO;AAAA,sBACT;AACA,4BAAM,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,oBAC5B;AACA,4BAAQ,IAAI,kCAAkC,OAAO,KAAK,GAAG;AAC7D,wBAAI;AACF,8BAAQ,IAAI,6CAA6C,OAAO,EAAE;AAClE,2CAAqB;AAAA,wBACnB,IAAI,OAAO;AAAA,wBACX,SAAS;AAAA,wBACT,SAAS;AAAA,wBACT,MAAM;AAAA,sBACR,CAAC;AAAA,oBACH,SAAS,GAAG;AACV,8BAAQ,MAAM,4CAA4C,CAAC;AAAA,oBAC7D;AAAA,kBACF,SAAS,GAAG;AACV,4BAAQ,MAAM,uCAAuC,CAAC;AACtD,wBAAI;AACF,2CAAqB;AAAA,wBACnB,IAAI,OAAO;AAAA,wBACX,SAAS;AAAA,wBACT,SAAS;AAAA,wBACT,MAAQ,KAAgB,EAAY,WAAY,OAAO,CAAC;AAAA,sBAC1D,CAAC;AAAA,oBACH,SAAS,IAAI;AAAA,oBAAC;AAAA,kBAChB;AAAA,gBACF,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,0BAAQ,MAAM,0BAA0B,GAAG;AAC3C,sBAAI;AACF,yCAAqB;AAAA,sBACnB,IAAI,OAAO;AAAA,sBACX,SAAS;AAAA,sBACT,SAAS;AAAA,sBACT,MAAQ,OAAkB,IAAc,WAAY,OAAO,GAAG;AAAA,oBAChE,CAAC;AAAA,kBACH,SAAS,GAAG;AACV,4BAAQ,MAAM,+CAA+C,CAAC;AAAA,kBAChE;AAAA,gBACF,CAAC;AAAA,cACL,SAAS,KAAK;AACZ,oBAAI;AACF,wBAAM,aAAa;AAAA,oBACjB,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAQ,OAAkB,IAAc,WAAY;AAAA,kBACtD,CAAC;AACD,0BAAQ,IAAI,mEAAmE;AAAA,gBAEjF,SAAS,GAAG;AACV,0BAAQ,MAAM,kCAAkC,CAAC;AAAA,gBACnD;AACA;AAAA,cACF;AAEA;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAI,qBAAqB,MAAM;AACvC,kBAAI;AAEF,sBAAML,SAAQ,OAAO,SAAU,OAAO,QAAQ,OAAO,KAAK;AAC1D,oBAAI,CAACA,OAAO,OAAM,IAAI,MAAM,eAAe;AAG3C,sBAAM,UAAc,WAAOA,QAAO,KAAK,mBAAmB,CAAC;AAC3D,oBAAI,CAAC,QAAS,OAAM,IAAI,MAAM,eAAe;AAE7C,sBAAME,YAAW,QAAQ,YAAY,QAAQ,QAAQ;AAGrD,sBAAM,eAAe,OAAO,MAAM;AAClC,oBAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,wBAAM,IAAI,MAAM,iCAAiC;AAAA,gBACnD;AAGA,oBAAI,CAAC,mBAAmB,KAAK,YAAY,GAAG;AAC1C,wBAAM,IAAI,MAAM,oFAAoF;AAAA,gBACtG;AAGA,oBAAI,CAAC,KAAK,SAAS;AACjB,wBAAM,IAAI,MAAM,uBAAuB;AAAA,gBACzC;AAEA,wBAAQ,IAAI,sBAAsB,YAAY,cAAcA,SAAQ,EAAE;AAGtE,sBAAM,iBAAiB,gBAAgB,YAAY;AAAA,eAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,aAAgBA,SAAQ;AAAA;AAAA,eAAoB,YAAY;AAAA;AAEpJ,sBAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,GAAG,YAAY,OAAO,cAAc;AAE9E,wBAAQ,IAAI,2BAA2B,MAAM;AAE7C,oBAAI,CAAC,OAAO,SAAS;AACnB,wBAAM,IAAI,MAAM,OAAO,OAAO;AAAA,gBAChC;AAEA,qCAAqB;AAAA,kBACnB,IAAI,OAAO;AAAA,kBACX,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,MAAM;AAAA,oBACJ,SAAS;AAAA,oBACT;AAAA,oBACA,MAAM,OAAO;AAAA,oBACb,SAAS,aAAa,YAAY;AAAA,kBACpC;AAAA,gBACF,CAAC;AAAA,cACH,SAAS,KAAK;AACZ,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAQ,OAAkB,IAAc,WAAY,OAAO,GAAG;AAAA,kBAChE,CAAC;AAAA,gBACH,SAAS,GAAG;AAAA,gBAAC;AAAA,cACf;AACA;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAI,oBAAoB,MAAM;AACtC,kBAAI;AAEF,sBAAMF,SAAQ,OAAO,SAAU,OAAO,QAAQ,OAAO,KAAK;AAC1D,oBAAI,CAACA,OAAO,OAAM,IAAI,MAAM,eAAe;AAE3C,wBAAQ,IAAI,8BAA8B;AAE1C,sBAAM,UAAc,WAAOA,QAAO,KAAK,mBAAmB,CAAC;AAC3D,oBAAI,CAAC,QAAS,OAAM,IAAI,MAAM,eAAe;AAE7C,wBAAQ,IAAI,4CAA4C;AAExD,oBAAI,CAAC,KAAK,SAAS;AACjB,wBAAM,IAAI,MAAM,uBAAuB;AAAA,gBACzC;AAEA,sBAAM,QAAQ,MAAM,KAAK,QAAQ,UAAU;AAC3C,wBAAQ,IAAI,0BAA0B,KAAK;AAG3C,sBAAM,YAAY,MACf,OAAO,CAAC,SAAiB,KAAK,SAAS,KAAK,CAAC,EAC7C,IAAI,CAAC,SAAiB;AACrB,wBAAM,OAAO,KAAK,QAAQ,SAAS,EAAE;AACrC,yBAAO,EAAE,MAAM,MAAM,KAAK;AAAA,gBAC5B,CAAC;AAEH,wBAAQ,IAAI,mCAAmC,UAAU,QAAQ,WAAW;AAC5E,qCAAqB;AAAA,kBACnB,IAAI,OAAO;AAAA,kBACX,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,MAAM;AAAA,oBACJ;AAAA,oBACA,OAAO,UAAU;AAAA,kBACnB;AAAA,gBACF,CAAC;AAAA,cACH,SAAS,KAAK;AACZ,wBAAQ,MAAM,mBAAmB,GAAG;AACpC,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAQ,OAAkB,IAAc,WAAY,OAAO,GAAG;AAAA,kBAChE,CAAC;AAAA,gBACH,SAAS,GAAG;AACV,0BAAQ,MAAM,kCAAkC,CAAC;AAAA,gBACnD;AAAA,cACF;AACA;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAI,qBAAqB,MAAM;AACvC,kBAAI;AAEF,sBAAMA,SAAQ,OAAO,SAAU,OAAO,QAAQ,OAAO,KAAK;AAC1D,oBAAI,CAACA,OAAO,OAAM,IAAI,MAAM,eAAe;AAG3C,sBAAM,UAAc,WAAOA,QAAO,KAAK,mBAAmB,CAAC;AAC3D,oBAAI,CAAC,QAAS,OAAM,IAAI,MAAM,eAAe;AAE7C,sBAAME,YAAW,QAAQ,YAAY,QAAQ,QAAQ;AAGrD,sBAAM,eAAe,OAAO,MAAM;AAClC,oBAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,wBAAM,IAAI,MAAM,iCAAiC;AAAA,gBACnD;AAGA,oBAAI,CAAC,KAAK,SAAS;AACjB,wBAAM,IAAI,MAAM,uBAAuB;AAAA,gBACzC;AAEA,wBAAQ,IAAI,sBAAsB,YAAY,aAAaA,SAAQ,EAAE;AAErE,sBAAM,SAAS,MAAM,KAAK,QAAQ,WAAW,GAAG,YAAY,KAAK;AAEjE,wBAAQ,IAAI,8BAA8B,MAAM;AAEhD,oBAAI,CAAC,OAAO,SAAS;AACnB,wBAAM,IAAI,MAAM,OAAO,OAAO;AAAA,gBAChC;AAEA,qCAAqB;AAAA,kBACnB,IAAI,OAAO;AAAA,kBACX,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,MAAM;AAAA,oBACJ,SAAS;AAAA,oBACT;AAAA,oBACA,SAAS,aAAa,YAAY;AAAA,kBACpC;AAAA,gBACF,CAAC;AAAA,cACH,SAAS,KAAK;AACZ,wBAAQ,MAAM,oBAAoB,GAAG;AACrC,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAQ,OAAkB,IAAc,WAAY,OAAO,GAAG;AAAA,kBAChE,CAAC;AAAA,gBACH,SAAS,GAAG;AACV,0BAAQ,MAAM,kCAAkC,CAAC;AAAA,gBACnD;AAAA,cACF;AACA;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAI,qBAAqB,MAAM;AACvC,kBAAI;AAEF,sBAAMF,SAAQ,OAAO,SAAU,OAAO,QAAQ,OAAO,KAAK;AAC1D,oBAAI,CAACA,OAAO,OAAM,IAAI,MAAM,eAAe;AAG3C,sBAAM,UAAc,WAAOA,QAAO,KAAK,mBAAmB,CAAC;AAC3D,oBAAI,CAAC,QAAS,OAAM,IAAI,MAAM,eAAe;AAE7C,sBAAME,YAAW,QAAQ,YAAY,QAAQ,QAAQ;AAGrD,sBAAM,eAAe,OAAO,MAAM;AAClC,sBAAM,UAAU,OAAO,MAAM;AAE7B,oBAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,wBAAM,IAAI,MAAM,iCAAiC;AAAA,gBACnD;AACA,oBAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,wBAAM,IAAI,MAAM,4BAA4B;AAAA,gBAC9C;AAGA,oBAAI,CAAC,mBAAmB,KAAK,OAAO,GAAG;AACrC,wBAAM,IAAI,MAAM,wFAAwF;AAAA,gBAC1G;AAGA,oBAAI,CAAC,KAAK,SAAS;AACjB,wBAAM,IAAI,MAAM,uBAAuB;AAAA,gBACzC;AAEA,wBAAQ,IAAI,sBAAsB,YAAY,OAAO,OAAO,aAAaA,SAAQ,EAAE;AAGnF,sBAAM,YAAY,MAAM,KAAK,QAAQ,QAAQ,GAAG,YAAY,KAAK;AACjE,oBAAI,CAAC,UAAU,SAAS;AACtB,wBAAM,IAAI,MAAM,UAAU,WAAW,aAAa,YAAY,aAAa;AAAA,gBAC7E;AAGA,oBAAI,UAAU,UAAU,WAAW;AACnC,0BAAU,QACP,QAAQ,IAAI,OAAO,gBAAgB,YAAY,IAAI,GAAG,GAAG,gBAAgB,OAAO,EAAE,EAClF,QAAQ,IAAI,OAAO,gBAAgB,YAAY,IAAI,GAAG,GAAG,gBAAgB,OAAO,EAAE;AAGrF,sBAAM,YAAY,MAAM,KAAK,QAAQ,QAAQ,GAAG,OAAO,OAAO,OAAO;AACrE,oBAAI,CAAC,UAAU,SAAS;AACtB,wBAAM,IAAI,MAAM,UAAU,OAAO;AAAA,gBACnC;AAGA,sBAAM,eAAe,MAAM,KAAK,QAAQ,WAAW,GAAG,YAAY,KAAK;AACvE,oBAAI,CAAC,aAAa,SAAS;AAEzB,wBAAM,KAAK,QAAQ,WAAW,GAAG,OAAO,KAAK;AAC7C,wBAAM,IAAI,MAAM,aAAa,OAAO;AAAA,gBACtC;AAEA,wBAAQ,IAAI,+BAA+B;AAE3C,qCAAqB;AAAA,kBACnB,IAAI,OAAO;AAAA,kBACX,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,MAAM;AAAA,oBACJ,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT;AAAA,oBACA,SAAS,aAAa,YAAY,iBAAiB,OAAO;AAAA,kBAC5D;AAAA,gBACF,CAAC;AAAA,cACH,SAAS,KAAK;AACZ,wBAAQ,MAAM,oBAAoB,GAAG;AACrC,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAQ,OAAkB,IAAc,WAAY,OAAO,GAAG;AAAA,kBAChE,CAAC;AAAA,gBACH,SAAS,GAAG;AACV,0BAAQ,MAAM,kCAAkC,CAAC;AAAA,gBACnD;AAAA,cACF;AACA;AAAA,YAEF,KAAK;AACH,sBAAQ,IAAI,kBAAkB,MAAM;AACpC,kBAAI;AAEF,sBAAMF,SAAQ,OAAO,SAAU,OAAO,QAAQ,OAAO,KAAK;AAC1D,oBAAI,CAACA,OAAO,OAAM,IAAI,MAAM,eAAe;AAG3C,sBAAM,UAAc,WAAOA,QAAO,KAAK,mBAAmB,CAAC;AAC3D,oBAAI,CAAC,QAAS,OAAM,IAAI,MAAM,eAAe;AAG7C,sBAAM,eAAe,OAAO,MAAM;AAClC,oBAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,wBAAM,IAAI,MAAM,iCAAiC;AAAA,gBACnD;AAGA,oBAAI,CAAC,KAAK,SAAS;AACjB,wBAAM,IAAI,MAAM,uBAAuB;AAAA,gBACzC;AAEA,wBAAQ,IAAI,qBAAqB,YAAY,EAAE;AAE/C,sBAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,GAAG,YAAY,KAAK;AAE9D,wBAAQ,IAAI,2BAA2B,MAAM;AAE7C,oBAAI,CAAC,OAAO,SAAS;AACnB,wBAAM,IAAI,MAAM,OAAO,OAAO;AAAA,gBAChC;AAEA,qCAAqB;AAAA,kBACnB,IAAI,OAAO;AAAA,kBACX,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,MAAM;AAAA,oBACJ,SAAS;AAAA,oBACT;AAAA,oBACA,SAAS,OAAO,WAAW;AAAA,oBAC3B,MAAM,OAAO;AAAA,kBACf;AAAA,gBACF,CAAC;AAAA,cACH,SAAS,KAAK;AACZ,wBAAQ,MAAM,iBAAiB,GAAG;AAClC,oBAAI;AACF,uCAAqB;AAAA,oBACnB,IAAI,OAAO;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,SAAS;AAAA,oBACT,MAAQ,OAAkB,IAAc,WAAY,OAAO,GAAG;AAAA,kBAChE,CAAC;AAAA,gBACH,SAAS,GAAG;AACV,0BAAQ,MAAM,kCAAkC,CAAC;AAAA,gBACnD;AAAA,cACF;AACA;AAAA,YAEF,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AACH,sBAAQ,IAAI,WAAW,eAAe,sBAAsB;AAC5D,kBAAI;AACF,qCAAqB;AAAA,kBACnB,IAAI,OAAO;AAAA,kBACX,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,MAAM,WAAW,eAAe;AAAA,gBAClC,CAAC;AAAA,cACH,SAAS,GAAG;AAAA,cAAC;AACb;AAAA,YAEF;AACE,sBAAQ,IAAI,oBAAoB,iBAAiB,WAAW,MAAM;AAClE,qBAAO;AAAA,gBACL,KAAK,UAAU;AAAA,kBACb,SAAS;AAAA,kBACT,SAAS;AAAA,gBACX,CAAC,IAAI;AAAA,cACP;AACA,qBAAO,IAAI;AACX;AAAA,UACJ;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,GAAG,OAAO,MAAM;AACrB,gBAAQ,IAAI,qBAAqB;AAAA,MACnC,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,0BAA0B,QAAQ,IAAI,aAAa,cAAc;AACxE,UAAI,EAAE,KAAK,eAAe,KAAK,WAAW,OAAO,KAAK,WAAW,QAAQ;AACvE,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,KAAK,eAAe,KAAK,WAAW,OAAO,KAAK,WAAW,OAAO;AACpE,YAAM,UAAU,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU;AAEjD,UAAI;AACF,YAAI,OAAO,QAAQ,QAAQ,YAAe,eAAW,QAAQ,GAAG;AAC9D,kBAAQ,MAAS,iBAAa,QAAQ,GAAG;AAC3C,YAAI,OAAO,QAAQ,SAAS,YAAe,eAAW,QAAQ,IAAI;AAChE,kBAAQ,OAAU,iBAAa,QAAQ,IAAI;AAAA,MAC/C,SAAS,GAAG;AAAA,MAAC;AACb,mBAAiB,iBAAa,SAAS,cAAc;AAAA,IACvD,OAAO;AACL,mBAAiB,iBAAa,cAAc;AAAA,IAC9C;AAEA,SAAK,SAAS;AAEd,SAAK,OAAO,OAAO,KAAK,MAAM,KAAK,MAAM,MAAM;AAE7C,UAAI,OAAO;AACX,UAAI;AACF,YAAI,KAAK,SAAS,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG;AACpE,gBAAM,IAAU,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG;AAChD,gBAAM,QAAQ,EAAE,YAAY;AAE5B,cAAI,SAAS,OAAO,EAAE,aAAa,YAAY,EAAE,UAAU;AACzD,mBACE,mBAAmB,OAAO,KAAK,CAAC,IAChC;AAAA,UAGJ,WAAW,OAAO;AAChB,mBAAO,mBAAmB,OAAO,KAAK,CAAC,IAAI;AAAA,UAC7C;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AACA,cAAQ;AAAA,QACN,kCAAkC,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,MACjE;AAEA,UAAI;AACF,YAAI,CAAC,KAAK,mBAAmB,KAAK,uBAAuB,GAAG;AAC1D,eAAK,kBAAkB,YAAY,MAAM;AACvC,gBAAI;AACF,mBAAK,gBAAgB;AAAA,YACvB,SAAS,GAAG;AAAA,YAAC;AAAA,UACf,GAAG,KAAK,oBAAoB;AAAA,QAC9B;AAAA,MACF,SAAS,GAAG;AAAA,MAAC;AAAA,IACf,CAAC;AAED,SAAK,OAAO,GAAG,SAAS,MAAM;AAC5B,UAAI;AACF,YAAI,KAAK,iBAAiB;AACxB,wBAAc,KAAK,eAAe;AAClC,eAAK,kBAAkB;AAAA,QACzB;AAAA,MACF,SAAS,GAAG;AAAA,MAAC;AAAA,IACf,CAAC;AAAA,EACH;AACF;;;AGljEA,YAAYM,YAAU;AACtB,YAAYC,UAAQ;;;ACFpB,OAAO,SAAS;AAChB,OAAO,QAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAMR,IAAM,KAAN,MAAS;AAAA,EAOZ,YAAY,SAAqB;AANjC,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,gBAAeC,MAAK,KAAKC,IAAG,QAAQ,GAAG,aAAa,WAAW;AACvE,wBAAQ,gBAAeD,MAAK,KAAKC,IAAG,QAAQ,GAAG,WAAW;AAC1D,wBAAQ,eAAyD,CAAC;AAG9D,QAAI,CAACC,IAAG,WAAW,KAAK,YAAY,GAAG;AACnC,MAAAA,IAAG,UAAU,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IACvD;AACA,QAAI,CAACA,IAAG,WAAW,KAAK,YAAY,GAAG;AACnC,MAAAA,IAAG,UAAU,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IACvD;AAGA,UAAM,UAAUF,MAAK,KAAK,KAAK,cAAc,cAAc;AAC3D,QAAIE,IAAG,WAAW,OAAO,GAAG;AACxB,WAAK,cAAc,KAAK,MAAMA,IAAG,aAAa,SAAS,MAAM,CAAC;AAAA,IAClE;AACA,SAAK,aAAa,IAAI,IAAI,WAAW;AAAA,MACjC,QAAQ,SAAS,YAAY;AAAA,IACjC,CAAC;AAID,SAAK,kBAAkB,SAAS,mBAAmB,CAAC;AAEpD,SAAK,MAAM,GAAG,cAAc,KAAK,eAAe;AAAA,EAGpD;AAAA,EAEA,SAAS,SAAiC;AACtC,SAAK,kBAAkB,EAAE,GAAG,KAAK,iBAAiB,GAAG,QAAQ;AAE7D,SAAK,MAAM,GAAG,cAAc,KAAK,eAAe;AAAA,EACpD;AAAA,EAEA,YAAY,UAAiB,OAAe;AACxC,UAAM,UAAU,EAAE,OAAO,KAAK,aAAa;AAE3C,QAAI,eAAe;AACnB,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,UAAI,aAAa,WAAW,QAAQ,GAAG,GAAG;AACtC,uBAAe,aAAa,QAAQ,OAAO,MAAM;AACjD;AAAA,MACJ;AAAA,IACJ;AAGA,mBAAeF,MAAK,UAAU,YAAY;AAE1C,WAAO,SAAS,KAAK,UAAQ;AACzB,YAAM,iBAAiBA,MAAK,UAAU,IAAI;AAC1C,YAAM,iBAAiB,eAAe,QAAQ,aAAa,EAAE;AAC7D,aAAO,mBAAmB,gBACnB,mBAAmB,gBACnB,mBAAmB,eAAe,SAClC,mBAAmB,eAAe;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,aAAa,WAAgB,mBAAwB;AAEvD,UAAM,UAAUE,IAAG,YAAY,KAAK,YAAY,EAC3C,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,EAC7B,IAAI,OAAKF,MAAK,KAAK,KAAK,cAAc,CAAC,CAAC;AAE7C,UAAM,WAAW,KAAK,YAAY,SAAS,SAAS;AACpD,QAAI,UAAU;AACV,UAAI;AACA,cAAM,eAAe,MAAM,OAAO;AAClC,cAAM,cAAc,OAAO,KAAK,YAAY;AAC5C,eAAO,IAAI,GAAG;AAAA,UACV;AAAA,UACA,WAAY;AACR,wBAAY,QAAQ,SAAO;AACvB,mBAAK,UAAU,KAAK,aAAa,GAAG,CAAC;AAAA,YACzC,CAAC;AAAA,UACL;AAAA,UACA,EAAE,YAAY,WAAW,SAAS,kBAAkB,QAAQ;AAAA,QAChE;AAAA,MACJ,SAAS,KAAK;AACV,gBAAQ,MAAM,kCAAkC,SAAS,KAAK,GAAG;AACjE,cAAM;AAAA,MACV;AAAA,IACJ;AAGA,UAAM,kBAAkB,OAAO,KAAK,KAAK,YAAY,gBAAgB,CAAC,CAAC;AACvE,QAAI,gBAAgB,SAAS,SAAS,GAAG;AACrC,UAAI;AAEA,cAAM,aAAaA,MAAK,KAAK,KAAK,cAAc,gBAAgB,SAAS;AACzE,cAAM,eAAe,MAAM,OAAO;AAClC,cAAM,cAAc,OAAO,KAAK,YAAY;AAC5C,eAAO,IAAI,GAAG;AAAA,UACV;AAAA,UACA,WAAY;AACR,wBAAY,QAAQ,SAAO;AACvB,mBAAK,UAAU,KAAK,aAAa,GAAG,CAAC;AAAA,YACzC,CAAC;AAAA,UACL;AAAA,UACA,EAAE,YAAY,WAAW,SAAS,kBAAkB,QAAQ;AAAA,QAChE;AAAA,MACJ,SAAS,KAAK;AACV,gBAAQ,MAAM,mCAAmC,SAAS,KAAK,GAAG;AAClE,cAAM;AAAA,MACV;AAAA,IACJ;AAEA,UAAM,IAAI,MAAM,UAAU,SAAS,+BAA+B;AAAA,EACtE;AAAA,EAEA,MAAM,IAAI,MAAc,SAA0C;AAa9D,UAAM,OAAc,CAAC;AAErB,UAAM,gBAAgB,CAAC,OAAO,SAAS,QAAQ,QAAQ,SAAS,OAAO,EAAE,OAAO,CAAC,KAAU,SAAc;AACrG,UAAI,IAAI,IAAI,IAAI,SAAgB,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AACxD,aAAO;AAAA,IACX,GAAG,CAAC,CAAC;AAEL,SAAK,SAAS;AAAA,MACV,SAAS;AAAA,IACb,CAAC;AAGD,UAAM,KAAK,KAAK,WAAW,cAAc,IAAI;AAC7C,UAAM,MAAM,IAAI,GAAG,iBAAiB,IAAI,EAAE,SAAS,KAAK,KAAK,YAAYA,MAAK,KAAK,KAAK,cAAc,kBAAkB,EAAE,CAAC;AAC3H,UAAM,IAAI,KAAK,KAAK,aAAa,KAAK,IAAI,CAAC;AAC3C,UAAM,IAAI,SAAS;AAEnB,WAAO;AAAA,MACH,WAAW,IAAI;AAAA,MACf;AAAA,IACJ;AAAA,EACJ;AACJ;AAGA,IAAO,cAAQ;;;ACnKf,YAAYG,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,iBAA4B;AA6B9B,IAAM,UAAN,MAAc;AAAA,EAKnB,YAAY,UAAkB,SAAkB;AAJhD,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,QAAyB;AAG/B,SAAK,WAAW;AAChB,SAAK,UAAU,WAAW;AAAA,EAC5B;AAAA,EAEA,MAAM,WAAW,WAA0B,MAA0B;AACnE,QAAI;AAEF,UAAI,UAAU;AACZ,aAAK,WAAW;AAAA,MAClB;AAGA,UAAI,CAAI,eAAW,KAAK,QAAQ,GAAG;AACjC,QAAG,cAAU,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MACjD;AAGA,WAAK,OAAO,UAAU,KAAK,OAAO;AAGlC,UAAI,CAAI,eAAgB,WAAK,KAAK,SAAS,MAAM,CAAC,GAAG;AAEnD,YAAI;AACF,gBAAM,KAAK,KAAK,KAAK;AAErB,gBAAM,KAAK,iBAAiB;AAAA,QAC9B,SAAS,OAAY;AACnB,gBAAM,IAAI,MAAM,wCAAwC,MAAM,OAAO,EAAE;AAAA,QACzE;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,IACd,SAAS,OAAY;AACnB,YAAM,IAAI,MAAM,oCAAoC,MAAM,OAAO,EAAE;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,UAAkB,SAAgF;AAC9G,QAAI;AACF,YAAM,WAAgB,WAAK,KAAK,UAAU,QAAQ;AAClD,YAAM,MAAW,cAAQ,QAAQ;AAGjC,UAAI,CAAI,eAAW,GAAG,GAAG;AACvB,QAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MACvC;AAGA,MAAG,kBAAc,UAAU,OAAO;AAGlC,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AACA,YAAM,kBAAuB,eAAS,KAAK,SAAS,QAAQ;AAC5D,YAAM,KAAK,KAAK,IAAI,eAAe;AAEnC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,QAAQ,QAAQ;AAAA,QACzB,MAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,uBAAuB,MAAM,OAAO;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,UAAkB,SAAgF;AACjH,QAAI;AACF,YAAM,WAAgB,WAAK,KAAK,UAAU,QAAQ;AAElD,UAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,QAAQ,QAAQ;AAAA,QAC3B;AAAA,MACF;AAGA,MAAG,kBAAc,UAAU,OAAO;AAGlC,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AACA,YAAM,kBAAuB,eAAS,KAAK,SAAS,QAAQ;AAC5D,YAAM,KAAK,KAAK,IAAI,eAAe;AAEnC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,QAAQ,QAAQ;AAAA,QACzB,MAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,0BAA0B,MAAM,OAAO;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,UAAoG;AAChH,QAAI;AACF,YAAM,WAAgB,WAAK,KAAK,UAAU,QAAQ;AAElD,UAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,QAAQ,QAAQ;AAAA,QAC3B;AAAA,MACF;AAEA,YAAM,UAAa,iBAAa,UAAU,MAAM;AAEhD,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,wBAAwB,MAAM,OAAO;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,UAAkE;AACjF,QAAI;AACF,YAAM,WAAgB,WAAK,KAAK,UAAU,QAAQ;AAElD,UAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,QAAQ,QAAQ;AAAA,QAC3B;AAAA,MACF;AAGA,MAAG,eAAW,QAAQ;AAGtB,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AACA,YAAM,kBAAuB,eAAS,KAAK,SAAS,QAAQ;AAC5D,YAAM,KAAK,KAAK,IAAI,eAAe;AAEnC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,0BAA0B,MAAM,OAAO;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAiE;AAC5E,QAAI;AAEF,YAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AACA,YAAM,KAAK,KAAK,OAAO,OAAO;AAE9B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,6BAA6B,MAAM,OAAO;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAiC;AACrC,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,SAAS,MAAM,KAAK,KAAK,OAAO;AAEtC,YAAM,SAAmB,CAAC;AAC1B,YAAM,WAAqB,CAAC;AAC5B,YAAM,YAAsB,CAAC;AAG7B,aAAO,SAAS,QAAQ,UAAQ;AAC9B,iBAAS,KAAK,IAAI;AAAA,MACpB,CAAC;AAGD,aAAO,QAAQ,QAAQ,UAAQ;AAC7B,eAAO,KAAK,IAAI;AAAA,MAClB,CAAC;AAGD,aAAO,QAAQ,QAAQ,UAAQ;AAC7B,iBAAS,KAAK,IAAI;AAAA,MACpB,CAAC;AAGD,aAAO,QAAQ,QAAQ,UAAQ;AAC7B,eAAO,KAAK,KAAK,EAAE;AAAA,MACrB,CAAC;AAGD,aAAO,UAAU,QAAQ,UAAQ;AAC/B,kBAAU,KAAK,IAAI;AAAA,MACrB,CAAC;AAGD,aAAO,OAAO,QAAQ,UAAQ;AAC5B,eAAO,KAAK,IAAI;AAAA,MAClB,CAAC;AAED,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,OAAO,QAAQ;AAAA,MACxB;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,QAAQ,CAAC;AAAA,QACT,UAAU,CAAC;AAAA,QACX,WAAW,CAAC;AAAA,QACZ,OAAO;AAAA,QACP,OAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,UAA4C;AAC3D,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,MAAM,MAAM,KAAK,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC;AAElD,aAAO,IAAI,IAAI,IAAI,aAAW;AAAA,QAC5B,MAAM,OAAO,KAAK,UAAU,GAAG,CAAC;AAAA,QAChC,SAAS,OAAO,WAAW;AAAA,QAC3B,MAAM,OAAO,QAAQ;AAAA,QACrB,QAAQ,OAAO,eAAe;AAAA,MAChC,EAAE;AAAA,IACJ,SAAS,OAAY;AACnB,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,QAAmB,QAAuC,SAA0E;AAClJ,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,UAAiB,CAAC;AAGxB,UAAI,OAAO,UAAU;AACnB,cAAM,KAAK,KAAK,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,aAAa,OAAO,QAAQ,CAAC;AAC1E,gBAAQ,KAAK,EAAE,KAAK,aAAa,OAAO,OAAO,UAAU,MAAM,CAAC;AAAA,MAClE;AAGA,UAAI,OAAO,WAAW;AACpB,cAAM,KAAK,KAAK,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,cAAc,OAAO,SAAS,CAAC;AAC5E,gBAAQ,KAAK,EAAE,KAAK,cAAc,OAAO,OAAO,WAAW,MAAM,CAAC;AAAA,MACpE;AAGA,UAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;AACxD,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,OAAO,GAAG;AACzD,gBAAM,KAAK,KAAK,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AACxD,kBAAQ,KAAK,EAAE,KAAK,OAAO,MAAM,CAAC;AAAA,QACpC;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,gCAAgC,MAAM,OAAO;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,KAAa,QAAuC,SAAwG;AAC1K,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,SAAS,MAAM,KAAK,KAAK,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,SAAS,GAAG,CAAC;AAEzE,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,OAAO,OAAO,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AAEnB,UAAI,MAAM,QAAQ,SAAS,cAAc,GAAG;AAC1C,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,sBAAsB,GAAG,kBAAkB,KAAK;AAAA,QAC3D;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,mCAAmC,GAAG,KAAK,MAAM,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,QAAuC,SAAuF;AAC7I,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,SAAS,MAAM,KAAK,KAAK,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,QAAQ,CAAC;AACrE,YAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,IAAI;AACtC,YAAM,SAAc,CAAC;AAErB,YAAM,QAAQ,UAAQ;AACpB,cAAM,CAAC,KAAK,KAAK,IAAI,KAAK,MAAM,GAAG;AACnC,YAAI,KAAK;AACP,iBAAO,GAAG,IAAI,SAAS;AAAA,QACzB;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,iCAAiC,MAAM,OAAO;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,WAAW,mBAAmB,YAAY,uBAAuB,mBAA2C,CAAC,GAAmD;AACrL,UAAM,SAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,iBAAiB;AAAA;AAAA,QACjB,iBAAiB;AAAA;AAAA,QACjB,GAAG;AAAA,MACL;AAAA,IACF;AAEA,WAAO,KAAK,UAAU,QAAQ,OAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,MAAc,KAA0F;AACtH,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,KAAK,KAAK,UAAU,MAAM,GAAG;AAEnC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,WAAW,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,yBAAyB,IAAI,MAAM,MAAM,OAAO;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,MAA6E;AAC9F,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,KAAK,KAAK,aAAa,IAAI;AAEjC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,WAAW,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,4BAA4B,IAAI,MAAM,MAAM,OAAO;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAsF;AAC1F,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAEA,YAAM,UAAU,MAAM,KAAK,KAAK,WAAW,IAAI;AAE/C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,aAAW;AAAA,UAC9B,MAAM,OAAO;AAAA,UACb,MAAM,OAAO,KAAK;AAAA,UAClB,SAAS,OAAO,KAAK;AAAA,QACvB,EAAE;AAAA,MACJ;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,2BAA2B,MAAM,OAAO;AAAA,QACjD,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAK,SAAS,UAAU,SAAS,QAAQ,UAAsD,CAAC,GAAqF;AACzL,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAGA,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,eAAe,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AAEhE,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,WAAW,MAAM;AAAA,QAC5B;AAAA,MACF;AAGA,UAAI,CAAC,UAAU,WAAW,WAAW;AACnC,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,KAAK,OAAO;AACtC,mBAAS,OAAO,WAAW;AAAA,QAC7B,QAAQ;AACN,mBAAS;AAAA,QACX;AAAA,MACF;AAGA,YAAM,cAAmB,CAAC;AAE1B,UAAI,QAAQ,OAAO;AACjB,oBAAY,SAAS,IAAI;AAAA,MAC3B;AAGA,UAAI,QAAQ,gBAAgB,OAAO;AACjC,oBAAY,IAAI,IAAI;AAAA,MACtB;AAGA,YAAM,KAAK,KAAK,KAAK,QAAQ,QAAQ,WAAW;AAEhD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,0BAA0B,MAAM,IAAI,MAAM;AAAA,QACnD;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AAEnB,UAAI,MAAM,QAAQ,SAAS,uBAAuB,KAAK,MAAM,QAAQ,SAAS,wCAAwC,GAAG;AACvH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,WAAW,MAAM;AAAA,QAC5B;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,SAAS,uBAAuB,GAAG;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,qBAAqB,MAAM,IAAI,MAAM,KAAK,MAAM,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAK,SAAS,UAAU,SAAS,QAAQ,UAAiD,CAAC,GAAqF;AACpL,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAGA,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,eAAe,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AAEhE,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,WAAW,MAAM;AAAA,QAC5B;AAAA,MACF;AAGA,UAAI,CAAC,UAAU,WAAW,WAAW;AACnC,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,KAAK,OAAO;AACtC,mBAAS,OAAO,WAAW;AAAA,QAC7B,QAAQ;AACN,mBAAS;AAAA,QACX;AAAA,MACF;AAGA,YAAM,cAAmB,CAAC;AAE1B,UAAI,QAAQ,yBAAyB;AACnC,oBAAY,KAAK,6BAA6B;AAAA,MAChD;AAGA,YAAM,KAAK,KAAK,KAAK,QAAQ,QAAQ,WAAW;AAEhD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,4BAA4B,MAAM,IAAI,MAAM;AAAA,QACrD;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AAEnB,UAAI,MAAM,QAAQ,SAAS,uBAAuB,GAAG;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,WAAW,MAAM;AAAA,QAC5B;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,SAAS,uBAAuB,GAAG;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,SAAS,UAAU,GAAG;AACtC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,uBAAuB,MAAM,IAAI,MAAM,KAAK,MAAM,OAAO;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAM,SAAS,UAAU,SAAS,QAAQ,UAA+B,CAAC,GAAqF;AACnK,QAAI;AACF,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AAGA,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,eAAe,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AAEhE,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,WAAW,MAAM;AAAA,QAC5B;AAAA,MACF;AAGA,YAAM,eAAoB,CAAC;AAE3B,UAAI,QAAQ,OAAO;AACjB,qBAAa,SAAS,IAAI;AAAA,MAC5B;AAGA,YAAM,KAAK,KAAK,MAAM,QAAQ,QAAQ,YAAY;AAElD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,6BAA6B,MAAM,IAAI,MAAM;AAAA,QACtD;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AAEnB,UAAI,MAAM,QAAQ,SAAS,uBAAuB,GAAG;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,WAAW,MAAM;AAAA,QAC5B;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,SAAS,uBAAuB,GAAG;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,wBAAwB,MAAM,IAAI,MAAM,KAAK,MAAM,OAAO;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAM,KAAa,aAA4B,MAAM,UAA+D,CAAC,GAAgF;AACzM,QAAI;AAEF,YAAM,YAAY,cAAc,KAAK;AAGrC,YAAM,eAAoB,CAAC;AAE3B,UAAI,QAAQ,MAAM;AAChB,qBAAa,QAAQ,IAAI;AAAA,MAC3B;AAEA,UAAI,QAAQ,QAAQ;AAClB,qBAAa,UAAU,IAAI,QAAQ;AAAA,MACrC;AAEA,UAAI,QAAQ,OAAO;AACjB,qBAAa,SAAS,IAAI,QAAQ,MAAM,SAAS;AAAA,MACnD;AAGA,YAAM,MAAM,UAAU;AACtB,YAAM,IAAI,MAAM,KAAK,WAAW,YAAY;AAG5C,UAAI,CAAC,YAAY;AACf,aAAK,WAAW;AAChB,aAAK,OAAO,UAAU,SAAS;AAAA,MACjC;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,uCAAuC,GAAG;AAAA,QACnD;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,mCAAmC,GAAG,KAAK,MAAM,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAA+B;AAC7B,WAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAI;AACF,cAAM,QAAkB,CAAC;AAEzB,cAAM,WAAW,CAAC,KAAa,eAAe,OAAO;AACnD,gBAAM,QAAW,gBAAY,GAAG;AAEhC,gBAAM,QAAQ,UAAQ;AACpB,kBAAM,WAAgB,WAAK,KAAK,IAAI;AACpC,kBAAM,mBAAwB,WAAK,cAAc,IAAI;AAErD,gBAAO,aAAS,QAAQ,EAAE,YAAY,GAAG;AACvC,uBAAS,UAAU,gBAAgB;AAAA,YACrC,OAAO;AACL,oBAAM,KAAK,gBAAgB;AAAA,YAC7B;AAAA,UACF,CAAC;AAAA,QACH;AAEA,iBAAS,KAAK,QAAQ;AAGtB,QAAAA,SAAQ,MAAM,OAAO,UAAQ,CAAC,KAAK,WAAW,MAAM,CAAC,CAAC;AAAA,MACxD,SAAS,OAAO;AACd,QAAAA,SAAQ,CAAC,CAAC;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAGF;AAEA,IAAOC,eAAQ;;;ACn0Bf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,aAAa;AAItB,IAAM,UAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBxB,IAAM,eAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2B7B,IAAM,mBAA2B;AAAA;AAAA;AAAA;AAAA;AAMjC,IAAM,gBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0B9B,IAAM,gBAAgB;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,OAAO;AAAA,IACH;AAAA,MACI,UAAU;AAAA,MACV,UAAU;AAAA,MACV,MAAM;AAAA,MACN,WAAW;AAAA,IACf;AAAA,EACJ;AACJ;AAEA,SAAS,SAAS,KAAa;AAC3B,QAAM,QAAQ;AACd,SAAO,MAAM,KAAK,GAAG;AACzB;AAEA,SAAS,eAAe,KAAa,OAAe;AAChD,QAAM,SAAS,IAAI;AAAA,IACf;AAAA,IACA,WAAW,KAAK;AAAA,EACpB;AACA,SAAO;AACX;AAEA,SAAS,eAAe,aAAqC;AACzD,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACpC,YAAQ,IAAI,0BAA0B,WAAW;AAEjD,UAAM,OAAO,MAAM,OAAO,CAAC,GAAG,GAAG;AAAA,MAC7B,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACX,CAAC;AAED,SAAK,GAAG,SAAS,CAAC,SAAS;AACvB,UAAI,SAAS,GAAG;AACZ,gBAAQ,IAAI,6BAA6B;AACzC,QAAAA,SAAQ;AAAA,MACZ,OAAO;AACH,gBAAQ,MAAM,2BAA2B,IAAI;AAC7C,eAAO,IAAI,MAAM,gCAAgC,IAAI,EAAE,CAAC;AAAA,MAC5D;AAAA,IACJ,CAAC;AAED,SAAK,GAAG,SAAS,CAAC,QAAQ;AACtB,cAAQ,MAAM,gCAAgC,GAAG;AACjD,aAAO,GAAG;AAAA,IACd,CAAC;AAAA,EACL,CAAC;AACL;AAEA,eAAe,aAAa,aAAqB;AAC7C,MAAI;AACA,YAAQ,IAAI,yBAAyB;AACrC,UAAM,UAAU,IAAIC,aAAQ,WAAW;AAEvC,UAAM,YAAYC,IAAG,aAAaC,MAAK,KAAK,aAAa,aAAa,GAAG,MAAM;AAC/E,UAAM,SAAS,KAAK,MAAM,SAAS;AAEnC,UAAM,QAAQ,WAAW,WAAW;AACpC,YAAQ,IAAI,qBAAqB;AAGjC,QAAI,OAAO,mBAAmB,OAAO,cAAc;AAC/C,YAAM,YAAY;AAAA,QACd,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,MACtB;AACA,YAAM,QAAQ,UAAU,SAAS;AACjC,cAAQ,IAAI,gBAAgB;AAAA,IAChC,OAAO;AACH,cAAQ,IAAI,6DAA6D;AAAA,IAC7E;AAGA,QAAI,OAAO,cAAc,SAAS,OAAO,UAAU,GAAG;AAClD,YAAM,YAAY,eAAe,OAAO,YAAY,OAAO,YAAY;AACvE,YAAM,QAAQ,UAAU,UAAU,OAAO,eAAe,YAAY,OAAO,UAAU;AACrF,YAAM,QAAQ,KAAK,UAAU,OAAO,iBAAiB,MAAM;AAC3D,cAAQ,IAAI,8BAA8B;AAAA,IAC9C,OAAO;AACH,cAAQ,IAAI,2EAA2E;AAAA,IAC3F;AAEA,YAAQ,IAAI,wBAAwB;AAAA,EACxC,SAAS,KAAK;AACV,YAAQ,KAAK,wCAAwC,GAAG;AAAA,EAC5D;AACJ;AAEA,eAAsB,WAAW;AAC7B,QAAM,cAAcA,MAAK,KAAK,WAAW,GAAG,WAAW;AACvD,QAAM,eAAeA,MAAK,KAAK,aAAa,WAAW;AACvD,QAAM,cAAcA,MAAK,KAAK,aAAa,UAAU;AACrD,QAAM,aAAaA,MAAK,KAAK,aAAa,SAAS;AACnD,QAAM,SAASA,MAAK,KAAK,aAAa,KAAK;AAC3C,QAAM,aAAaA,MAAK,KAAK,aAAa,aAAa;AACvD,QAAM,gBAAgBA,MAAK,KAAK,aAAa,YAAY;AACzD,QAAM,kBAAkBA,MAAK,KAAK,aAAa,cAAc;AAC7D,QAAM,eAAeA,MAAK,KAAK,aAAa,eAAe;AAC3D,QAAM,gBAAgBA,MAAK,KAAK,aAAa,qBAAqB;AAGlE,QAAM,eAAeD,IAAG,WAAW,WAAW,KAC1CA,IAAG,WAAW,YAAY,KAC1BA,IAAG,WAAW,WAAW,KACzBA,IAAG,WAAW,UAAU,KACxBA,IAAG,WAAW,MAAM,KACpBA,IAAG,WAAW,UAAU,KACxBA,IAAG,WAAW,aAAa,KAC3BA,IAAG,WAAW,eAAe,KAC7BA,IAAG,WAAW,YAAY,KAC1BA,IAAG,WAAW,aAAa;AAE/B,MAAI,cAAc;AACd,YAAQ,IAAI,gDAAgD,WAAW;AACvE;AAAA,EACJ;AAEA,UAAQ,IAAI,kCAAkC;AAE9C,MAAI,CAACA,IAAG,WAAW,WAAW,GAAG;AAC7B,IAAAA,IAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC7C,IAAAA,IAAG,UAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC9C,IAAAA,IAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC7C,IAAAA,IAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAC5C,IAAAA,IAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACxC,IAAAA,IAAG,cAAc,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,GAAG,MAAM;AAC3E,IAAAA,IAAG,cAAc,eAAe,kBAAkB,MAAM;AACxD,IAAAA,IAAG,cAAc,iBAAiB,SAAS,MAAM;AACjD,IAAAA,IAAG,cAAc,cAAc,cAAc,MAAM;AACnD,IAAAA,IAAG,cAAc,eAAe,eAAe,MAAM;AACrD,YAAQ,IAAI,YAAY,WAAW;AACnC,UAAM,eAAe,WAAW;AAChC,UAAM,aAAa,WAAW;AAAA,EAClC,OAAO;AAEH,QAAI,CAACA,IAAG,WAAW,YAAY,GAAG;AAC9B,MAAAA,IAAG,UAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IAClD;AAEA,QAAI,CAACA,IAAG,WAAW,WAAW,GAAG;AAC7B,MAAAA,IAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,IACjD;AAEA,QAAI,CAACA,IAAG,WAAW,UAAU,GAAG;AAC5B,MAAAA,IAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAChD;AAEA,QAAI,CAACA,IAAG,WAAW,MAAM,GAAG;AACxB,MAAAA,IAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5C;AAGA,QAAI,CAACA,IAAG,WAAW,UAAU,GAAG;AAC5B,MAAAA,IAAG,cAAc,YAAY,KAAK,UAAU,eAAe,MAAM,CAAC,GAAG,MAAM;AAAA,IAC/E;AAEA,QAAI,CAACA,IAAG,WAAW,aAAa,GAAG;AAC/B,MAAAA,IAAG,cAAc,eAAe,kBAAkB,MAAM;AAAA,IAC5D;AAEA,QAAI,CAACA,IAAG,WAAW,eAAe,GAAG;AACjC,MAAAA,IAAG,cAAc,iBAAiB,SAAS,MAAM;AAAA,IACrD;AAEA,QAAI,CAACA,IAAG,WAAW,YAAY,GAAG;AAC9B,MAAAA,IAAG,cAAc,cAAc,cAAc,MAAM;AAAA,IACvD;AAEA,QAAI,CAACA,IAAG,WAAW,aAAa,GAAG;AAC/B,MAAAA,IAAG,cAAc,eAAe,eAAe,MAAM;AAAA,IACzD;AAGA,QAAI,CAACA,IAAG,WAAWC,MAAK,KAAK,aAAa,cAAc,CAAC,GAAG;AACxD,YAAM,eAAe,WAAW;AAAA,IACpC;AAEA,YAAQ,IAAI,gBAAgB;AAC5B,UAAM,aAAa,WAAW;AAAA,EAClC;AACJ;;;AC3RA,oBAAkC;AAClC,sBAAqB;AACrB,oBAAmB;AACnB,uBAAsB;AACtB,8BAA4B;;;ACJ5B,YAAYC,UAAS;AACrB,YAAYC,UAAS;AACrB,SAAS,WAAW;AACpB,YAAYC,aAAY;AAwExB,IAAM,aAAa;AAAA,EACf,OAAO,MAAM;AAAA,EAAE;AAAA,EACf,MAAM,MAAM;AAAA,EAAE;AAAA,EACd,MAAM,MAAM;AAAA,EAAE;AAAA,EACd,OAAO,MAAM;AAAA,EAAE;AACnB;AAEO,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqDxB,YAAY,KAAa,UAAyB,CAAC,GAAG;AAnDtD;AAAA,wBAAQ;AACR,wBAAQ,iBAAwB;AAChC,wBAAQ,kBAAyB;AACjC,wBAAQ,SAA2B,MAAM;AAAA,IAAE;AAC3C,wBAAQ,aAAoC,MAAM,CAAC;AACnD,wBAAQ,UAAkB,CAAC;AAC3B,wBAAQ,UAAkB;AAC1B,wBAAQ,kBAAyB;AACjC,wBAAQ,WAAkB;AAC1B,wBAAQ,cAAqB;AAC7B,wBAAQ,SAAoC;AAC5C,wBAAQ,OAAc;AACtB,wBAAQ,gBAAuB;AAC/B,wBAAQ,YAA0B;AAClC,wBAAQ,YAA0B;AAClC,wBAAQ,QAAe;AACvB,wBAAQ,QAAe;AACvB,wBAAQ,YAA0B;AAClC,wBAAQ,UAA4C;AACpD,wBAAQ,UAAiB,OAAO,MAAM,CAAC;AACvC,wBAAQ,WAAkB;AAC1B,wBAAQ,YAAwC,oBAAI,IAAI;AACxD,wBAAQ,eAAsB;AAC9B,wBAAQ,aAAoB;AAC5B,wBAAQ,iBAAiC,CAAC;AAC1C,wBAAQ,cAAsB;AAC9B,wBAAQ,mBAA2B;AACnC,wBAAQ,SAAuB;AAC/B,wBAAQ,mBAA0B;AAClC,wBAAQ,eAA6B;AACrC,wBAAQ,cAAsB;AAC9B,wBAAQ,mBAAyC;AACjD,wBAAQ,WAAyD;AACjE,wBAAQ,cAAmC,KAAK;AAChD,wBAAQ,SAAsB,QAAQ,QAAQ;AAC9C,wBAAQ,mBAAiD;AACzD,wBAAQ,kBAAgD;AACxD,wBAAQ,eAAmC;AAC3C,wBAAQ,kBAAgC;AAcpC,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,OAAM,IAAI,MAAM,cAAc;AACnE,SAAK,UAAU,OAAO,OAAO,CAAC,GAAG,OAAO;AAExC,SAAK,gBAAgB,OAAO,SAAS,KAAK,QAAQ,aAAa,IACzD,KAAK,QAAQ,gBACb;AAEN,SAAK,iBAAiB,OAAO,SAAS,KAAK,QAAQ,cAAc,IAC3D,KAAK,QAAQ,iBACb,IAAI,OAAO;AAGjB,SAAK,QAAQ,CAAC,QAAQ;AAClB,UAAI;AACA,YAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,cAAM,OAAO,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,IAAI,OAAO,OAAO,CAAC,GAAG,GAAG;AACrE,YAAI,KAAK,MAAO,MAAK,QAAQ;AAC7B,YAAI,KAAK,SAAU,MAAK,WAAW;AACnC,YAAI,KAAK,QAAQ,KAAK,KAAK,SAAU,MAAK,KAAK,WAAW;AAC1D,eAAO;AAAA,MACX,SAAS,GAAG;AACR,eAAO;AAAA,MACX;AAAA,IACJ;AAGA,UAAM,YACF,KAAK,QAAQ,UAAU,OAAO,KAAK,QAAQ,WAAW,WAChD,KAAK,QAAQ,SACb;AACV,SAAK,YAAY,CAAC,SAAS;AACvB,aAAO,KAAK,IAAI,CAAC,MAAM;AACnB,YAAI,CAAC,EAAG,QAAO;AACf,YAAI,OAAO,MAAM,SAAU,QAAO;AAClC,eAAO,KAAK,MAAM,CAAC;AAAA,MACvB,CAAC;AAAA,IACL;AAGA,SAAK,SAAS;AAAA,MACV,OAAO,IAAI,SACP,UAAU,SAAS,UAAU,MAAM,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,MAC9D,MAAM,IAAI,SACN,UAAU,QAAQ,UAAU,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,MAC5D,MAAM,IAAI,SACN,UAAU,QAAQ,UAAU,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,MAC5D,OAAO,IAAI,SACP,UAAU,SAAS,UAAU,MAAM,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,IAClE;AAEA,SAAK,SACD,OAAO,KAAK,QAAQ,WAAW,YAAY,CAAC,CAAC,KAAK,QAAQ,SAAS;AACvE,QAAI,CAAC,KAAK;AACN,WAAK,OAAO;AAAA,QACR;AAAA,MACJ;AAEJ,SAAK,iBAAiB,OAAO,SAAS,KAAK,QAAQ,cAAc,IAC3D,KAAK,QAAQ,iBACb;AACN,SAAK,UAAU,OAAO,SAAS,KAAK,QAAQ,OAAO,IAC7C,KAAK,QAAQ,UACb;AACN,SAAK,aAAa,OAAO,SAAS,KAAK,QAAQ,UAAU,IACnD,KAAK,QAAQ,aACb;AAGN,SAAK,QACD,KAAK,QAAQ,UAAU,mBAAmB,KAAK,QAAQ,qBACjD,kBACA;AAGV,QAAI;AACJ,QAAI;AACA,eAAS,IAAI,IAAI,GAAG;AAAA,IACxB,SAAS,GAAG;AACR,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AAGA,QAAI,OAAO,aAAa,aAAa;AACjC,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACvD;AAEA,SAAK,MAAM;AACX,SAAK,eAAe,OAAO,WACrB,OAAO,SAAS,QAAQ,KAAK,EAAE,IAC/B;AAEN,SAAK,YACA,OAAO,KAAK,QAAQ,aAAa,WAC5B,KAAK,QAAQ,WACb,OAAO,aAAa;AAC9B,SAAK,YACA,OAAO,KAAK,QAAQ,aAAa,WAC5B,KAAK,QAAQ,WACb,OAAO,aAAa;AAC9B,QAAI,OAAO,YAAY,EAAE,OAAO,KAAK,QAAQ,aAAa,WAAW;AACjE,WAAK,OAAO;AAAA,QACR;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI;AACA,aAAO,WAAW;AAClB,aAAO,WAAW;AAClB,WAAK,MAAM,OAAO,SAAS;AAAA,IAC/B,SAAS,GAAG;AAER,WAAK,MAAM;AAAA,IACf;AACA,SAAK,OAAO,OAAO,YAAY;AAC/B,SAAK,OAAO,OAAO,OAAO,SAAS,OAAO,MAAM,EAAE,IAAI;AACtD,SAAK,WACD,OAAO,YAAY,OAAO,SAAS,SAAS,IACtC,OAAO,SAAS,MAAM,CAAC,IACvB;AAGV,SAAK,SAAS;AACd,SAAK,SAAS,OAAO,MAAM,CAAC;AAC5B,SAAK,UAAU;AACf,SAAK,WAAW,oBAAI,IAAI;AACxB,SAAK,cAAc,OAAO,SAAS,KAAK,QAAQ,UAAU,IACpD,KAAK,QAAQ,aACb;AACN,SAAK,YAAY,OAAO,SAAS,KAAK,QAAQ,QAAQ,IAChD,KAAK,QAAQ,WACb;AACN,SAAK,gBAAgB,CAAC;AACtB,SAAK,aAAa;AAClB,SAAK,kBAAkB;AACvB,SAAK,QAAQ;AACb,SAAK,kBAAkB;AACvB,SAAK,cAAc;AACnB,SAAK,aAAa;AAClB,SAAK,kBAAkB;AAGvB,SAAK,UACD,KAAK,QAAQ,WAAW,KAAK,QAAQ,QAAQ,SACvC,KAAK,QAAQ,UACb;AAGV,SAAK,aACD,OAAO,KAAK,QAAQ,cAAc,aAC5B,KAAK,QAAQ,YACb,KAAK;AAGf,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,eAAe;AACX,SAAK,QAAQ,IAAI,QAAQ,CAACC,UAAS,WAAW;AAC1C,WAAK,kBAAkBA;AACvB,WAAK,iBAAiB;AAAA,IAC1B,CAAC;AAAA,EACL;AAAA,EAEA,cAAc,OAAY;AACtB,QAAI,KAAK,iBAAiB;AACtB,UAAI;AACA,aAAK,gBAAgB,KAAK;AAAA,MAC9B,SAAS,GAAG;AAAA,MAAE;AACd,WAAK,kBAAkB;AACvB,WAAK,iBAAiB;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEA,aAAa,KAAY;AACrB,QAAI,KAAK,gBAAgB;AAGrB,YAAM,WAAW,KAAK;AACtB,WAAK,kBAAkB;AACvB,WAAK,iBAAiB;AAEtB,cAAQ,SAAS,MAAM;AACnB,YAAI;AACA,mBAAS,GAAG;AAAA,QAChB,SAAS,GAAG;AAAA,QAEZ;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAqB;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AAEN,QAAI,KAAK,YAAa,QAAO,KAAK;AAElC,SAAK,cAAc,IAAI,QAAQ,CAACA,UAAS,WAAW;AAChD,YAAM,OAAO,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAChD,YAAM,YAAY,MAAM;AACpB,gBAAQ,IAAI,0CAA0C,KAAK,MAAM,KAAK,IAAI;AAC1E,aAAK,QAAQ,OAAO,qBAAqB;AACzC,aAAK,aAAa;AAClB,aAAK,kBAAkB;AACvB,gBAAQ,IAAI,yCAAyC;AACrD,aAAK,gBAAgB;AACrB,gBAAQ,IAAI,mCAAmC;AAC/C,aAAK,aAAa,EACb,KAAK,MAAM;AAER,eAAK,cAAc;AACnB,UAAAA,SAAQ,IAAI;AAAA,QAChB,CAAC,EACA,MAAM,CAAC,QAAQ;AACZ,iBAAO,GAAG;AAAA,QACd,CAAC;AAAA,MACT;AAEA,UAAI;AACA,YAAI,KAAK,QAAQ;AAEb,gBAAM,iBAAiB,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAC1D,gBAAM,aAAkB,OAAO;AAAA,YAC3B,CAAC;AAAA,YACD,KAAK,QAAQ,cAAc,CAAC;AAAA,YAC5B;AAAA,UACJ;AAEA,cAAI,OAAO,WAAW,uBAAuB;AACzC,uBAAW,qBAAqB;AACpC,eAAK,SAAa,aAAQ,YAAqC,SAAS;AAAA,QAC5E,OAAO;AACH,eAAK,SAAa,sBAAiB,MAAM,SAAS;AAAA,QACtD;AAAA,MACJ,SAAS,GAAG;AACR,cAAM,QAAQ;AACd,aAAK,QAAQ,QAAQ,qBAAqB,MAAM,OAAO;AAEvD,aAAK,aAAa,KAAK;AAEvB,aAAK,aAAa;AAElB,aAAK,cAAc;AACnB,eAAO,OAAO,KAAK;AAAA,MACvB;AAGA,UAAI,CAAC,KAAK,QAAQ;AACd,cAAM,QAAQ,IAAI,MAAM,gCAAgC;AACxD,aAAK,QAAQ,QAAQ,qBAAqB,MAAM,OAAO;AACvD,aAAK,cAAc;AACnB,eAAO,OAAO,KAAK;AAAA,MACvB;AAGA,YAAM,UAAU,CAAC,QAAe;AAC5B,aAAK,QAAQ;AAAA,UACT;AAAA,UACA,OAAO,IAAI,UAAU,IAAI,UAAU;AAAA,QACvC;AACA,aAAK,kBAAkB,GAAG;AAAA,MAC9B;AACA,YAAM,UAAU,CAAC,aAAsB;AACnC,aAAK,QAAQ,OAAO,0BAA0B;AAE9C,aAAK,kBAAkB,IAAI;AAAA,MAC/B;AACA,WAAK,OAAO,GAAG,SAAS,OAAO;AAC/B,WAAK,OAAO,GAAG,SAAS,OAAO;AAE/B,UAAI,KAAK,gBAAgB,KAAK,KAAK,QAAQ;AACvC,aAAK,OAAO,WAAW,KAAK,aAAa;AACzC,aAAK,OAAO,GAAG,WAAW,MAAM;AAC5B,eAAK,QAAQ,OAAO,uCAAuC;AAC3D,cAAI;AACA,iBAAK,QAAQ,QAAQ;AAAA,UACzB,SAAS,GAAG;AAAA,UAAE;AAAA,QAClB,CAAC;AAAA,MACL;AAAA,IACJ,CAAC,EAAE,MAAM,CAAC,QAAQ;AAEd,WAAK,cAAc;AACnB,YAAM;AAAA,IACV,CAAC;AAED,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,kBAAkB;AACd,QAAI,CAAC,KAAK,OAAQ;AAClB,YAAQ,IAAI,0DAA0D,CAAC,CAAC,KAAK,MAAM;AAEnF,SAAK,OAAO,mBAAmB,MAAM;AACrC,SAAK,SAAS,OAAO,MAAM,CAAC;AAE5B,YAAQ,IAAI,+CAA+C,KAAK,KAAK;AAGrE,QAAI,KAAK,UAAU,iBAAiB;AAEhC,WAAK,OAAO,GAAG,QAAQ,CAAC,UAAU;AAC9B,YAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,cAAI;AACA,oBAAQ,OAAO,KAAK,KAAK;AAAA,UAC7B,SAAS,GAAG;AACR;AAAA,UACJ;AAAA,QACJ;AAEA,aAAK,SAAS,OAAO,OAAO,CAAC,KAAK,QAAQ,KAAK,CAAC;AAChD,eAAO,KAAK,OAAO,UAAU,GAAG;AAC5B,gBAAM,MAAM,KAAK,OAAO,aAAa,CAAC;AAEtC,cAAI,MAAM,KAAK,gBAAgB;AAC3B,iBAAK,QAAQ;AAAA,cACT;AAAA,YACJ;AACA,gBAAI;AACA,mBAAK,QAAQ,QAAQ;AAAA,YACzB,SAAS,GAAG;AAAA,YAAE;AACd;AAAA,UACJ;AACA,cAAI,KAAK,OAAO,SAAS,IAAI,IAAK;AAClC,gBAAM,UAAU,KAAK,OAAO,MAAM,GAAG,IAAI,GAAG;AAC5C,eAAK,SAAS,KAAK,OAAO,MAAM,IAAI,GAAG;AACvC,cAAI;AACJ,cAAI;AACA,kBAAM,KAAK,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,UAC7C,SAAS,GAAG;AACR,iBAAK,QAAQ;AAAA,cACT;AAAA,cACA,KAAM,EAAY,UAAW,EAAY,UAAU;AAAA,YACvD;AACA;AAAA,UACJ;AAEA,cAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AACrC,gBAAM,eACD,OAAO,IAAI,OAAO,eAAe,OAAO,IAAI,OAAO,cACnD,OAAO,IAAI,WAAW,YACnB,OAAO,IAAI,WAAW,iBACzB,OAAO,IAAI,YAAY,YACpB,OAAO,IAAI,YAAY,iBAC1B,OAAO,IAAI,YAAY,YACpB,OAAO,IAAI,YAAY,iBAC1B,OAAO,IAAI,SAAS,YACjB,OAAO,IAAI,SAAS,eACpB,IAAI,SAAS;AACrB,cAAI,CAAC,aAAa;AACd,iBAAK,QAAQ,OAAO,kDAA6C;AACjE;AAAA,UACJ;AACA,eAAK,eAAe,GAAG;AAAA,QAC3B;AAAA,MACJ,CAAC;AAAA,IACL,OAAO;AAEH,cAAQ,IAAI,iEAAiE;AAC7E,WAAK,OAAO,GAAG,QAAQ,CAAC,UAAU;AAC9B,gBAAQ,IAAI,gDAAgD,MAAM,MAAM;AACxE,YAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AACzB,cAAI;AACA,oBAAQ,OAAO,KAAK,KAAK;AAAA,UAC7B,SAAS,GAAG;AACR;AAAA,UACJ;AAAA,QACJ;AAGA,cAAM,iBAAiB,MAAM,QAAQ,EAAI;AACzC,YAAI,KAAK,OAAO,WAAW,KAAK,mBAAmB,MAAM,SAAS,GAAG;AAEjE,cAAI,QAAQ;AACZ,cAAIC;AACJ,kBAAQA,OAAM,MAAM,QAAQ,IAAM,KAAK,OAAO,IAAI;AAC9C,kBAAM,UAAU,MAAM,MAAM,OAAOA,IAAG;AACtC,oBAAQA,OAAM;AACd,gBAAI,QAAQ,WAAW,EAAG;AAC1B,gBAAI;AACJ,gBAAI;AACA,oBAAM,KAAK,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,YAC7C,SAAS,GAAQ;AACb,mBAAK,QAAQ;AAAA,gBACT;AAAA,gBACA,KAAK,EAAE,UAAU,EAAE,UAAU;AAAA,cACjC;AACA;AAAA,YACJ;AAEA,gBAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AACrC,kBAAM,eACD,OAAO,IAAI,OAAO,eAAe,OAAO,IAAI,OAAO,cACnD,OAAO,IAAI,WAAW,YACnB,OAAO,IAAI,WAAW,iBACzB,OAAO,IAAI,YAAY,YACpB,OAAO,IAAI,YAAY,iBAC1B,OAAO,IAAI,YAAY,YACpB,OAAO,IAAI,YAAY;AAC/B,gBAAI,CAAC,YAAa;AAClB,iBAAK,eAAe,GAAG;AAAA,UAC3B;AACA;AAAA,QACJ;AAGA,aAAK,SAAS,OAAO,OAAO,CAAC,KAAK,QAAQ,KAAK,CAAC;AAIhD,YAAI,KAAK,OAAO,SAAS,KAAK,gBAAgB;AAC1C,eAAK,QAAQ;AAAA,YACT;AAAA,UACJ;AACA,cAAI;AACA,iBAAK,QAAQ,QAAQ;AAAA,UACzB,SAAS,GAAG;AAAA,UAAE;AACd;AAAA,QACJ;AAEA,YAAI;AACJ,gBAAQ,MAAM,KAAK,OAAO,QAAQ,EAAI,OAAO,IAAI;AAC7C,gBAAM,UAAU,KAAK,OAAO,MAAM,GAAG,GAAG;AACxC,eAAK,SAAS,KAAK,OAAO,MAAM,MAAM,CAAC;AACvC,cAAI,QAAQ,WAAW,EAAG;AAC1B,cAAI;AACJ,cAAI;AACA,kBAAM,KAAK,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,UAC7C,SAAS,GAAQ;AACb,iBAAK,QAAQ;AAAA,cACT;AAAA,cACA,KAAM,EAAY,UAAW,EAAY,UAAU;AAAA,YACvD;AACA;AAAA,UACJ;AAEA,gBAAM,eACD,OAAO,IAAI,OAAO,eAAe,OAAO,IAAI,OAAO,cACnD,OAAO,IAAI,WAAW,YACnB,OAAO,IAAI,WAAW,iBACzB,OAAO,IAAI,YAAY,YACpB,OAAO,IAAI,YAAY,iBAC1B,OAAO,IAAI,YAAY,YACpB,OAAO,IAAI,YAAY;AAC/B,cAAI,CAAC,aAAa;AACd,iBAAK,QAAQ,OAAO,kDAA6C;AACjE;AAAA,UACJ;AAEA,eAAK,eAAe,GAAG;AAAA,QAC3B;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA;AAAA,EAGA,kBAAkB,aAAsB,IAAY;AAEhD,UAAM,aAAsB,OAAO;AAAA,MAC/B,EAAE,IAAI,QAAQ,YAAY,OAAO;AAAA,MACjC,YAAY,SAAS,SAAY,EAAE,MAAM,YAAY,KAAK,IAAI,CAAC;AAAA,IACnE;AAEA,QAAI,KAAK,MAAO,YAAW,QAAQ,KAAK;AAExC,UAAM,aAAa,KAAK,WAAW,UAAU;AAE7C,QAAI,KAAK,WAAW,KAAK,QAAQ,QAAQ;AACrC,YAAM,OAAc;AAAA,QAChB,KAAK,QAAQ,aAAa;AAAA,QAC1B,KAAK,QAAQ;AAAA,MACjB;AACA,WAAK,OAAO,UAAU;AACtB,YAAM,MAAM,KAAK,OAAO,KAAK;AAC7B,YAAM,WAAW,EAAE,IAAI,WAAW,KAAK,SAAS,WAAW;AAC3D,YAAM,cAAc,KAAK,WAAW,QAAQ;AAC5C,UAAI,KAAK,UAAU,iBAAiB;AAChC,cAAM,OAAO,OAAO,KAAK,aAAa,MAAM;AAC5C,cAAM,MAAM,OAAO,YAAY,IAAI,KAAK,MAAM;AAC9C,YAAI,cAAc,KAAK,QAAQ,CAAC;AAChC,aAAK,KAAK,KAAK,CAAC;AAChB,eAAO;AAAA,MACX;AACA,aAAO,OAAO,KAAK,cAAc,MAAM,MAAM;AAAA,IACjD;AAGA,QAAI,KAAK,UAAU,iBAAiB;AAChC,YAAM,OAAO,OAAO,KAAK,YAAY,MAAM;AAC3C,YAAM,MAAM,OAAO,YAAY,IAAI,KAAK,MAAM;AAC9C,UAAI,cAAc,KAAK,QAAQ,CAAC;AAChC,WAAK,KAAK,KAAK,CAAC;AAChB,aAAO;AAAA,IACX;AACA,WAAO,OAAO,KAAK,aAAa,MAAM,MAAM;AAAA,EAChD;AAAA,EAEA,eAAe,KAAc;AACzB,YAAQ,IAAI,kCAAkC,KAAK,UAAU,GAAG,CAAC;AACjE,YAAQ,IAAI,yCAAyC,IAAI,IAAI,eAAe,IAAI,QAAQ,gBAAiB,IAAY,SAAS,gBAAgB,IAAI,OAAO;AAGzJ,QAAI,OAAO,OAAO,IAAI,OAAO,aAAa;AACtC,cAAQ,IAAI,6BAA6B,IAAI,IAAI,WAAW,IAAI,QAAQ,YAAY,IAAI,OAAO;AAC/F,YAAM,UAAU,KAAK,SAAS,IAAI,IAAI,EAAE;AACxC,UAAI,CAAC,SAAS;AACV,gBAAQ,IAAI,6BAA6B,IAAI,IAAI,qBAAqB,KAAK,SAAS,IAAI;AACxF,aAAK,QAAQ,QAAQ,6BAA6B,IAAI,EAAE;AACxD;AAAA,MACJ;AACA,YAAM,EAAE,SAAAD,UAAS,QAAQ,MAAM,IAAI;AACnC,UAAI,MAAO,cAAa,KAAK;AAC7B,WAAK,SAAS,OAAO,IAAI,EAAE;AAE3B,WAAK,cAAc;AAGnB,UAAI,IAAI,WAAW,WAAW,IAAI,YAAY,SAAS;AACnD,gBAAQ,IAAI,mCAAmC;AAC/C,YAAI,IAAI,YAAY,WAAW;AAC3B,kBAAQ,IAAI,uCAAuC;AACnD,eAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,QAAQ,IAAI,KAAK,QAAQ;AAC3D,eAAK,cAAc,IAAI;AACvB,iBAAOA,SAAQ,IAAI,IAAI;AAAA,QAC3B,OAAO;AACH,kBAAQ,IAAI,gBAAgB,IAAI,IAAI;AACpC,eAAK,aAAa,IAAI,MAAM,uBAAuB,CAAC;AACpD,gBAAM,WAAW,IAAI,QAAQ;AAE7B,cAAI;AACA,iBAAK,QAAQ,IAAI;AAAA,UACrB,SAAS,GAAG;AAAA,UAAE;AACd,iBAAO,OAAO,IAAI,MAAM,OAAO,aAAa,WAAW,WAAW,uBAAuB,CAAC;AAAA,QAC9F;AAAA,MACJ;AAEA,WAAK,IAAI,WAAW,iBAAiB,IAAI,YAAY,kBAAkB,IAAI,YAAY;AACnF,eAAOA,SAAQ,IAAI,IAAI;AAC3B,WAAK,IAAI,WAAW,iBAAiB,IAAI,YAAY,kBAAkB,IAAI,YAAY;AACnF,eAAO,OAAO,IAAI,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,uBAAuB,CAAC;AAG9F,UAAI,IAAI,WAAW,eAAe,IAAI,YAAY;AAC9C,eAAOA,SAAQ,IAAI,IAAI;AAC3B,UAAI,IAAI,WAAW,eAAe,IAAI,YAAY;AAC9C,eAAO,OAAO,IAAI,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,2BAA2B,CAAC;AAGlG,UAAI,IAAI,YAAY,QAAQ,IAAI,YAAY,WAAW;AACnD,eAAOA,SAAQ,IAAI,IAAI;AAAA,MAC3B,WAAW,IAAI,YAAY,SAAS;AAChC,eAAO,OAAO,IAAI,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,gBAAgB,CAAC;AAAA,MACvF;AAEA,aAAO,OAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,IAC3D;AAGA,YAAQ,IAAI,sBAAsB,GAAG;AACrC,SAAK,QAAQ,QAAQ,iCAAiC,KAAK,MAAM,GAAG,CAAC;AAAA,EACzE;AAAA,EAEA,eAAe;AACX,QAAI,KAAK;AACL,aAAO,QAAQ,OAAO,IAAI,MAAM,wBAAwB,CAAC;AAC7D,SAAK,kBAAkB;AAEvB,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACpC,YAAM,KAAK,KAAK;AAChB,YAAM,UAAmB;AAAA,QACrB;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,EAAE,UAAU,KAAK,UAAU,UAAU,KAAK,SAAS;AAAA,MAC7D;AAGA,UAAI,QAAa;AACjB,UAAI,KAAK,iBAAiB,GAAG;AACzB,gBAAQ,WAAW,MAAM;AACrB,eAAK,SAAS,OAAO,EAAE;AACvB,eAAK,kBAAkB;AACvB,iBAAO,IAAI,MAAM,cAAc,CAAC;AAChC,eAAK,MAAM;AAAA,QACf,GAAG,KAAK,cAAc;AAAA,MAC1B;AAEA,WAAK,SAAS,IAAI,IAAI;AAAA,QAClB,SAAS,CAAC,SAAc;AACpB,cAAI,MAAO,cAAa,KAAK;AAC7B,eAAK,kBAAkB;AAEvB,cAAI,QAAS,KAAa,MAAO,MAAK,QAAS,KAAa;AAC5D,UAAAA,SAAQ,IAAI;AAAA,QAChB;AAAA,QACA,QAAQ,CAAC,QAAa;AAClB,cAAI,MAAO,cAAa,KAAK;AAC7B,eAAK,kBAAkB;AACvB,iBAAO,GAAG;AAAA,QACd;AAAA,QACA;AAAA,MACJ,CAAC;AAED,UAAI;AAEA,cAAM,MAAM,OAAO,KAAK,KAAK,UAAU,OAAO,IAAI,MAAM,MAAM;AAC9D,aAAK,OAAO,GAAG,EAAE,MAAM,CAAC,QAAa;AACjC,cAAI,MAAO,cAAa,KAAK;AAC7B,eAAK,SAAS,OAAO,EAAE;AACvB,eAAK,kBAAkB;AACvB,iBAAO,GAAG;AAAA,QACd,CAAC;AAAA,MACL,SAAS,GAAQ;AACb,qBAAa,KAAK;AAClB,aAAK,SAAS,OAAO,EAAE;AACvB,aAAK,kBAAkB;AACvB,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ,CAAC,EACI,KAAK,CAAC,SAAc;AAEjB,UAAI,QAAS,KAAa,OAAO;AAC7B,aAAK,QAAS,KAAa;AAC3B,aAAK,cAAc,IAAI;AAAA,MAC3B;AACA,aAAO;AAAA,IACX,CAAC,EACA,MAAM,CAAC,QAAa;AACjB,WAAK,aAAa,GAAG;AACrB,YAAM;AAAA,IACV,CAAC;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,KAAU;AACb,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACpC,UAAI,CAAC,KAAK,UAAU,CAAC,KAAK;AACtB,eAAO,OAAO,IAAI,MAAM,eAAe,CAAC;AAC5C,UAAI;AACA,cAAM,KAAK,KAAK,OAAO,MAAM,KAAK,CAAC,QAAQ;AACvC,cAAI,IAAK,QAAO,OAAO,GAAG;AAC1B,UAAAA,SAAQ,MAAS;AAAA,QACrB,CAAC;AACD,YAAI,CAAC,IAAI;AAEL,eAAK,OAAO,KAAK,SAAS,MAAMA,SAAQ,MAAS,CAAC;AAAA,QACtD;AAAA,MAEJ,SAAS,GAAG;AACR,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,gBAAgB;AAClB,WACI,KAAK,SAAS,OAAO,KAAK,eAC1B,KAAK,cAAc,SAAS,GAC9B;AACE,YAAM,OAAY,KAAK,cAAc,MAAM;AAC3C,YAAM,EAAE,aAAa,IAAI,SAAAA,UAAS,QAAQ,MAAM,IAAI;AAEpD,UAAI,KAAK,eAAe,KAAK,IAAI,KAAK,KAAK,aAAa;AACpD,cAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,YAAI,CAAC,WAAW;AACZ,uBAAa,KAAK;AAClB,cAAI;AACA,mBAAO,IAAI,MAAM,kCAAkC,CAAC;AAAA,UACxD,SAAS,GAAG;AAAA,UAAE;AACd;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI;AACJ,UAAI;AACA,cAAM,KAAK,kBAAkB,aAAa,EAAE;AAAA,MAChD,SAAS,GAAG;AACR,qBAAa,KAAK;AAClB,YAAI;AACA,iBAAO,CAAC;AAAA,QACZ,SAAS,IAAI;AAAA,QAAE;AACf;AAAA,MACJ;AAGA,WAAK,SAAS,IAAI,IAAI,EAAE,SAAAA,UAAS,QAAQ,MAAM,CAAC;AAEhD,UAAI;AACA,cAAM,KAAK,OAAO,GAAG;AAAA,MACzB,SAAS,GAAG;AACR,qBAAa,KAAK;AAClB,aAAK,SAAS,OAAO,EAAE;AACvB,YAAI;AACA,iBAAO,CAAC;AAAA,QACZ,SAAS,IAAI;AAAA,QAAE;AAAA,MACnB;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,SAAkB;AAE5B,QAAI;AACA,YAAM,KAAK;AAAA,IACf,SAAS,KAAU;AACf,YAAM,IAAI;AAAA,QACN,yBAAyB,OAAO,IAAI,UAAU,IAAI,UAAU;AAAA,MAChE;AAAA,IACJ;AAEA,QAAI,CAAC,KAAK,MAAO,OAAM,IAAI,MAAM,mBAAmB;AAEpD,UAAM,KAAK,KAAK;AAGhB,UAAM,cAA8B,EAAE,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,KAAK;AAGjF,QAAI,KAAK,eAAe,KAAK,IAAI,KAAK,KAAK,aAAa;AACpD,YAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,eAAe;AAAA,IACnD;AAEA,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AAEpC,UAAI,QAAa;AACjB,UAAI,KAAK,iBAAiB,GAAG;AACzB,gBAAQ,WAAW,MAAM;AACrB,cAAI,KAAK,SAAS,IAAI,EAAE,GAAG;AACvB,iBAAK,SAAS,OAAO,EAAE;AACvB,mBAAO,IAAI,MAAM,iBAAiB,CAAC;AAAA,UACvC;AAAA,QACJ,GAAG,KAAK,cAAc;AAAA,MAC1B;AAGA,UAAI,KAAK,SAAS,QAAQ,KAAK,aAAa;AACxC,YAAI,KAAK,cAAc,UAAU,KAAK,WAAW;AAC7C,cAAI,MAAO,cAAa,KAAK;AAC7B,iBAAO,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,QACjD;AAEA,aAAK,cAAc,KAAK,EAAE,aAAa,IAAI,SAAAA,UAAS,QAAQ,MAAM,CAAC;AAEnE,aAAK,cAAc,EAAE,MAAM,MAAM;AAAA,QAAE,CAAC;AACpC;AAAA,MACJ;AAGA,UAAI;AACJ,UAAI;AACA,mBAAW,KAAK,kBAAkB,aAAa,EAAE;AAAA,MACrD,SAAS,GAAG;AACR,qBAAa,KAAK;AAClB,eAAO,OAAO,CAAC;AAAA,MACnB;AAEA,WAAK,SAAS,IAAI,IAAI,EAAE,SAAAA,UAAS,QAAQ,MAAM,CAAC;AAEhD,WAAK,OAAO,QAAQ,EAAE,MAAM,CAAC,MAAM;AAC/B,YAAI,MAAO,cAAa,KAAK;AAC7B,aAAK,SAAS,OAAO,EAAE;AACvB,eAAO,CAAC;AAAA,MACZ,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB;AACvB,QACI,CAAC,KAAK,QAAQ,gBACd,OAAO,KAAK,QAAQ,iBAAiB;AAErC,aAAO;AACX,QAAI;AACA,YAAM,MAAM,MAAM,KAAK,QAAQ,aAAa;AAC5C,UAAI,OAAO,IAAI,OAAO;AAClB,aAAK,QAAQ,IAAI;AACjB,YAAI,IAAI,UAAW,MAAK,cAAc,IAAI;AAC1C,eAAO;AAAA,MACX;AAAA,IACJ,SAAS,GAAG;AACR,WAAK,QAAQ;AAAA,QACT;AAAA,QACA,KAAM,EAAY,UAAW,EAAY,UAAU,OAAO,CAAC;AAAA,MAC/D;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,UAAU;AACN,SAAK,aAAa;AAClB,QAAI,KAAK,iBAAiB;AACtB,mBAAa,KAAK,eAAe;AACjC,WAAK,kBAAkB;AAAA,IAC3B;AAEA,SAAK,aAAa,IAAI,MAAM,kBAAkB,CAAC;AAC/C,SAAK,SAAS,QAAQ,CAAC,SAAS,OAAO;AACnC,UAAI,QAAQ,MAAO,cAAa,QAAQ,KAAK;AAC7C,UAAI;AACA,gBAAQ,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA,MAChD,SAAS,GAAQ;AAAA,MAAE;AACnB,WAAK,SAAS,OAAO,EAAE;AAAA,IAC3B,CAAC;AACD,SAAK,gBAAgB,CAAC;AACtB,QAAI;AACA,UAAI,KAAK,OAAQ,MAAK,OAAO,QAAQ;AAAA,IACzC,SAAS,GAAQ;AAAA,IAAE;AACnB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,kBAAkB,KAAU;AAExB,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,iBAAiB;AAC3C;AAAA,IACJ;AAGA,UAAM,oBAAoB,KAAK;AAG/B,SAAK,SAAS,QAAQ,CAAC,SAAS,OAAO;AACnC,UAAI,QAAQ,MAAO,cAAa,QAAQ,KAAK;AAG7C,YAAM,WAAW,oBACX,wDACC,OAAO,IAAI,UAAU,IAAI,UAAU;AAE1C,cAAQ,SAAS,MAAM;AACnB,YAAI;AAEA,kBAAQ,OAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,QACtC,SAAS,GAAQ;AAAA,QAEjB;AAAA,MACJ,CAAC;AAED,WAAK,SAAS,OAAO,EAAE;AAAA,IAC3B,CAAC;AAED,SAAK,aAAa;AAElB,SAAK,cAAc;AAEnB,SAAK,kBAAkB;AAGvB,QAAI,qBAAqB,KAAK,YAAY,GAAG;AACzC,YAAM,YAAY,OAAO,IAAI,MAAM,iDAAiD;AACpF,UAAI;AACA,aAAK,aAAa,SAAS;AAAA,MAC/B,SAAS,GAAQ;AAAA,MAAE;AACnB;AAAA,IACJ;AAGA,QAAI,KAAK,kBAAkB,KAAK,SAAS;AAErC,WAAK,aAAa;AAElB,YAAM,OAAO,KAAK;AAAA,QACd,KAAK,aAAa,KAAK,IAAI,GAAG,KAAK,eAAe;AAAA,QAClD;AAAA,MACJ;AACA,YAAM,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,KAAM,IAAI,CAAC;AAC9D,YAAM,QAAQ,OAAO;AACrB,WAAK,mBAAmB;AACxB,WAAK,QAAQ;AAAA,QACT,6BACA,QACA,iBACA,KAAK,kBACL;AAAA,MACJ;AAEA,WAAK,QAAQ;AACb,iBAAW,MAAM;AAGb,aAAK,QAAQ,EAAE,MAAM,CAAC,MAAW;AAC7B,eAAK,QAAQ,QAAQ,oBAAoB,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC;AAAA,QAC3E,CAAC;AAAA,MACL,GAAG,KAAK;AAAA,IACZ,OAAO;AAEH,UAAI;AACA,aAAK,aAAa,OAAO,IAAI,MAAM,kCAAkC,CAAC;AAAA,MAC1E,SAAS,GAAQ;AAAA,MAAE;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,QAAQ;AACJ,QAAI,CAAC,KAAK,OAAQ;AAClB,QAAI;AACA,WAAK,OAAO,mBAAmB,MAAM;AACrC,WAAK,OAAO,mBAAmB,OAAO;AACtC,WAAK,OAAO,mBAAmB,OAAO;AACtC,WAAK,OAAO,IAAI;AAAA,IACpB,SAAS,GAAQ;AAAA,IAAE;AACnB,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACT,SAAK,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAgB,OAAY,CAAC,GAAiB;AAC5D,WAAO,KAAK,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,UAAkB,UAAgC;AAC1D,WAAO,KAAK,YAAY,SAAS,EAAE,UAAU,SAAS,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAuB;AACzB,WAAO,KAAK,YAAY,UAAU,CAAC,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAA8B;AAChC,WAAO,KAAK,YAAY,YAAY,CAAC,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAA4B;AAC7C,WAAO,KAAK,YAAY,aAAa,EAAE,cAAc,KAAK,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAA4B;AAC7C,WAAO,KAAK,YAAY,aAAa,EAAE,cAAc,KAAK,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,SAAiB,SAA+B;AACjE,WAAO,KAAK,YAAY,aAAa,EAAE,cAAc,SAAS,QAAQ,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAAuB,cAAoC;AACjE,QAAI;AACJ,QAAI,OAAO,SAAS,YAAY;AAC5B,YAAM,UAAU,KAAK,SAAS;AAE9B,YAAM,aAAa,QAAQ,MAAM,2BAA2B;AAC5D,YAAM,gBAAgB,QAAQ,MAAM,oCAAoC;AACxE,YAAM,QAAQ,cAAc;AAC5B,YAAM,QAAQ,QAAQ,MAAM,CAAC,EAAE,SAAS;AACxC,YAAM,MAAM,QAAQ,YAAY,GAAG;AACnC,mBAAa,QAAQ,UAAU,OAAO,GAAG;AAEzC,mBAAa,WAAW,QAAQ,cAAc,EAAE,EAAE,QAAQ,cAAc,EAAE;AAG1E,mBAAa,WAAW;AAAA,QACpB;AAAA,QACA,CAAC,GAAG,WAAW,OAAO,eAAe;AAEjC,gBAAM,UAAU,UAAU,KAAK;AAC/B,cAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AAElD,kBAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK;AACxC,mBAAO,YAAY,KAAK,WAAW,KAAK,GAAG,UAAU,GAAG,KAAK;AAAA,UACjE,OAAO;AAEH,mBAAO,UAAU,OAAO,SAAS,KAAK,GAAG,UAAU,GAAG,KAAK;AAAA,UAC/D;AAAA,QACJ;AAAA,MACJ;AAGA,mBAAa,WAAW,MAAM,IAAI,EAAE,IAAI,UAAQ,KAAK,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,KAAK;AAAA,IACjF,OAAO;AACH,mBAAa;AAAA,IACjB;AACA,WAAO,KAAK,YAAY,eAAe,EAAE,MAAM,YAAY,aAAa,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,cAAoC;AACnD,WAAO,KAAK,YAAY,WAAW,EAAE,aAAa,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,cAAsB,MAAyB;AAChE,WAAO,KAAK,YAAY,aAAa,EAAE,cAAc,GAAG,KAAK,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAwB;AAC1B,WAAO,KAAK,YAAY,YAAY,CAAC,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAA8D;AAC7E,WAAO,KAAK,YAAY,iBAAiB,EAAE,QAAQ,CAAC;AAAA,EACxD;AACJ;AAEA,IAAOE,eAAQ;;;ACnpCf,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAE1B,IAAM,cAAc,UAAU,IAAI;AAqBlC,IAAMC,cAAa;AAAA,EACjB,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,MAAM,MAAM;AAAA,EAAC;AAAA,EACb,MAAM,MAAM;AAAA,EAAC;AAAA,EACb,OAAO,MAAM;AAAA,EAAC;AAChB;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAM1B,YAAY,SAAuB;AALnC,wBAAQ,OAA8B;AACtC,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,YAA0C,oBAAI,IAAI;AAGxD,SAAK,UAAU;AACf,SAAK,SAAS,QAAQ,UAAUA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAuB;AACrB,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAI;AACF,aAAK,MAAM,IAAI,wBAAAC,QAAgB,EAAE,MAAM,KAAK,QAAQ,OAAO,CAAC;AAE5D,aAAK,IAAI,GAAG,aAAa,MAAM;AAC7B,eAAK,OAAO,OAAO,qCAAqC,KAAK,QAAQ,MAAM,EAAE;AAC7E,UAAAD,SAAQ;AAAA,QACV,CAAC;AAED,aAAK,IAAI,GAAG,SAAS,CAAC,UAAU;AAC9B,eAAK,OAAO,QAAQ,2BAA2B,KAAK;AACpD,iBAAO,KAAK;AAAA,QACd,CAAC;AAED,aAAK,IAAI,GAAG,cAAc,CAAC,OAAO;AAChC,eAAK,iBAAiB,EAAE;AAAA,QAC1B,CAAC;AAAA,MAEH,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,IAAe;AACtC,SAAK,OAAO,OAAO,0BAA0B;AAE7C,UAAM,UAAyB;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAEA,SAAK,SAAS,IAAI,IAAI,OAAO;AAE7B,OAAG,GAAG,WAAW,OAAO,SAAS;AAC/B,YAAM,KAAK,cAAc,SAAS,IAAI;AAAA,IACxC,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,WAAK,YAAY,OAAO;AAAA,IAC1B,CAAC;AAED,OAAG,GAAG,SAAS,CAAC,UAAU;AACxB,WAAK,OAAO,QAAQ,oBAAoB,KAAK;AAC7C,WAAK,YAAY,OAAO;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,SAAwB,MAAW;AAC7D,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,KAAK,SAAS,CAAC;AAC1C,YAAM,EAAE,IAAI,QAAQ,MAAM,QAAQ,IAAI;AAGtC,UAAI,WAAW,SAAS;AACtB,cAAM,KAAK,YAAY,SAAS,IAAI,OAAO;AAC3C;AAAA,MACF;AAGA,UAAI,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,QAAQ;AAC7C,aAAK,UAAU,QAAQ,IAAI,IAAI,mBAAmB;AAClD;AAAA,MACF;AAGA,YAAM,KAAK,cAAc,SAAS,IAAI,QAAQ,OAAO;AAAA,IAEvD,SAAS,OAAY;AACnB,WAAK,OAAO,QAAQ,2BAA2B,KAAK;AACpD,WAAK,UAAU,QAAQ,IAAI,QAAW,MAAM,OAAO;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,SAAwB,IAAY,SAAc;AAC1E,QAAI;AACF,YAAM,EAAE,UAAU,UAAU,QAAQ,aAAa,IAAI;AAGrD,YAAM,eAAe,KAAK,QAAQ,WAAW,SAAY,KAAK,QAAQ,SAAS;AAE/E,cAAQ,IAAI,qBAAqB,EAAE,cAAc,cAAc,UAAU,YAAY,UAAU,CAAC;AAGhG,UAAI,iBAAiB,UAAa,iBAAiB,cAAc;AAC/D,cAAM,WAAW,eACb,4GACA;AACJ,aAAK,OAAO,OAAO,yBAAyB,EAAE,cAAc,aAAa,CAAC;AAC1E,cAAM,IAAI,MAAM,QAAQ;AAAA,MAC1B;AAGA,UAAI;AACJ,UAAI,YAAY,aAAa,IAAI;AAE/B,cAAM,cAAc,QAAQ,IAAI,YAAY,EAAE,IAAI,KAAK,QAAQ,YAAY,IAAI,KAAK,QAAQ,YAAY;AAAA,MAC1G,OAAO;AAEL,cAAM,cAAc,KAAK,QAAQ,YAAY,IAAI,KAAK,QAAQ,YAAY;AAAA,MAC5E;AAEA,WAAK,OAAO,OAAO,sCAAsC,IAAI,QAAQ,YAAY,QAAQ,CAAC;AAE1F,YAAM,SAAS,IAAIE,aAAe,KAAK;AAAA,QACrC,QAAQ;AAAA;AAAA,QACR,QAAQ,KAAK;AAAA,QACb,gBAAgB;AAAA;AAAA,QAChB,SAAS;AAAA;AAAA,MACX,CAAC;AAGD,cAAQ,IAAI,kCAAkC;AAC9C,WAAK,OAAO,OAAO,kCAAkC;AAErD,YAAM,mBAAmB,KAAK,IAAI;AAGlC,YAAM,OAAO,QAAQ,EAAE,MAAM,CAAC,QAAQ;AAEpC,cAAM;AAAA,MACR,CAAC;AAED,YAAM,kBAAkB,KAAK,IAAI,IAAI;AAErC,cAAQ,IAAI,kDAAkD,eAAe,IAAI;AACjF,WAAK,OAAO,OAAO,6CAA6C;AAGhE,cAAQ,SAAS;AACjB,cAAQ,gBAAgB;AAGxB,cAAQ,IAAI,uCAAuC,EAAE;AACrD,WAAK,OAAO,OAAO,4BAA4B;AAC/C,WAAK,aAAa,QAAQ,IAAI,IAAI,SAAS,WAAW,EAAE,OAAO,gBAAgB,CAAC;AAChF,cAAQ,IAAI,yBAAyB;AAAA,IAEvC,SAAS,OAAY;AACnB,WAAK,OAAO,QAAQ,iBAAiB,KAAK;AAC1C,WAAK,aAAa,QAAQ,IAAI,IAAI,SAAS,eAAe,MAAM,OAAO;AAGvE,UAAI,QAAQ,QAAQ;AAClB,YAAI;AACF,kBAAQ,OAAO,QAAQ;AAAA,QACzB,SAAS,GAAG;AAAA,QAAC;AACb,gBAAQ,SAAS;AAAA,MACnB;AAGA,WAAK,SAAS,OAAO,QAAQ,EAAE;AAG/B,cAAQ,GAAG,MAAM;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,SAAwB,IAAY,QAAgB,SAAc;AAC5F,QAAI;AACF,cAAQ,IAAI,sBAAsB,QAAQ,YAAY,OAAO;AAC7D,YAAM,SAAS,QAAQ;AACvB,UAAI;AAEJ,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,kBAAQ,IAAI,kBAAkB;AAC9B,mBAAS,MAAM,OAAO,QAAQ,EAAE,QAAQ,SAAS,CAAC;AAClD,kBAAQ,gBAAgB;AACxB,kBAAQ,SAAS;AACjB;AAAA,QAEF,KAAK;AACH,kBAAQ,IAAI,oBAAoB;AAChC,mBAAS,MAAM,OAAO,QAAQ,EAAE,QAAQ,WAAW,CAAC;AACpD,kBAAQ,IAAI,oBAAoB,MAAM;AACtC;AAAA,QAEF,KAAK;AACH,mBAAS,MAAM,OAAO,QAAQ;AAAA,YAC5B,QAAQ;AAAA,YACR,MAAM,EAAE,cAAc,QAAQ,aAAa;AAAA,UAC7C,CAAC;AACD;AAAA,QAEF,KAAK;AACH,mBAAS,MAAM,OAAO,QAAQ;AAAA,YAC5B,QAAQ;AAAA,YACR,MAAM,EAAE,cAAc,QAAQ,aAAa;AAAA,UAC7C,CAAC;AACD;AAAA,QAEF,KAAK;AACH,mBAAS,MAAM,OAAO,QAAQ;AAAA,YAC5B,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,cAAc,QAAQ;AAAA,cACtB,SAAS,QAAQ;AAAA,YACnB;AAAA,UACF,CAAC;AACD;AAAA,QAEF,KAAK;AACH,kBAAQ,IAAI,gCAAgC;AAC5C,mBAAS,MAAM,OAAO,QAAQ;AAAA,YAC5B,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,MAAM,QAAQ;AAAA,cACd,cAAc,QAAQ;AAAA,YACxB;AAAA,UACF,CAAC;AACD,kBAAQ,IAAI,gCAAgC,MAAM;AAClD;AAAA,QAEF,KAAK;AACH,mBAAS,MAAM,OAAO,QAAQ;AAAA,YAC5B,QAAQ;AAAA,YACR,MAAM,EAAE,cAAc,QAAQ,aAAa;AAAA,UAC7C,CAAC;AACD;AAAA,QAEF,KAAK;AACH,mBAAS,MAAM,OAAO,QAAQ;AAAA,YAC5B,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AACD;AAAA,QAEF,KAAK;AACH,mBAAS,MAAM,OAAO,QAAQ,EAAE,QAAQ,WAAW,CAAC;AACpD;AAAA,QAEF,KAAK;AACH,mBAAS,MAAM,OAAO,QAAQ;AAAA,YAC5B,QAAQ;AAAA,YACR,MAAM,EAAE,cAAc,QAAQ,aAAa;AAAA,UAC7C,CAAC;AACD;AAAA,QAEF,KAAK;AAEH,mBAAS,MAAM,KAAK,oBAAoB,QAAQ,OAAO;AACvD;AAAA,QAEF;AACE,gBAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,MAC/C;AAGA,WAAK,aAAa,QAAQ,IAAI,IAAI,QAAQ,MAAM,MAAM;AAAA,IAExD,SAAS,OAAY;AACnB,WAAK,OAAO,QAAQ,mBAAmB,MAAM,KAAK,KAAK;AACvD,WAAK,aAAa,QAAQ,IAAI,IAAI,QAAQ,SAAS,MAAM,OAAO;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,IAAe,IAAwB,QAAgB,SAAiB,MAAY;AACvG,QAAI,CAAC,MAAM,GAAG,eAAe,iBAAAC,QAAU,MAAM;AAC3C,cAAQ,MAAM,+CAA+C;AAAA,QAC3D,QAAQ,CAAC,CAAC;AAAA,QACV,YAAY,IAAI;AAAA,QAChB,eAAe,iBAAAA,QAAU;AAAA,MAC3B,CAAC;AACD,WAAK,OAAO,QAAQ,2CAA2C;AAC/D;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,YAAQ,IAAI,gCAAgC,QAAQ;AACpD,SAAK,OAAO,OAAO,gCAAgC,EAAE,IAAI,QAAQ,QAAQ,CAAC;AAE1E,QAAI;AACF,SAAG,KAAK,KAAK,UAAU,QAAQ,CAAC;AAChC,cAAQ,IAAI,0CAA0C;AACtD,WAAK,OAAO,OAAO,4BAA4B;AAAA,IACjD,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAC/C,WAAK,OAAO,QAAQ,4BAA4B,KAAK;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,IAAe,IAAwB,OAAe;AACtE,SAAK,aAAa,IAAI,IAAI,SAAS,SAAS,KAAK;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,SAA8D;AAC9F,QAAI;AACF,WAAK,OAAO,OAAO,4BAA4B,OAAO,EAAE;AAGxD,UAAI,QAAQ,SAAS,KAAM;AACzB,cAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAEA,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,YAAY,SAAS;AAAA,QACpD,SAAS;AAAA;AAAA,QACT,WAAW,OAAO;AAAA;AAAA,QAClB,KAAK,QAAQ,IAAI;AAAA,MACnB,CAAC;AAED,aAAO;AAAA,QACL,QAAQ,UAAU;AAAA,QAClB,QAAQ,UAAU;AAAA,MACpB;AAAA,IACF,SAAS,OAAY;AACnB,WAAK,OAAO,QAAQ,yBAAyB,KAAK;AAClD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,MAAM,WAAW,OAAO,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAAwB;AAC1C,SAAK,OAAO,OAAO,6BAA6B;AAEhD,QAAI,QAAQ,QAAQ;AAClB,UAAI;AACF,gBAAQ,OAAO,QAAQ;AAAA,MACzB,SAAS,OAAO;AACd,aAAK,OAAO,QAAQ,4BAA4B,KAAK;AAAA,MACvD;AACA,cAAQ,SAAS;AAAA,IACnB;AAEA,SAAK,SAAS,OAAO,QAAQ,EAAE;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAsB;AAC1B,WAAO,IAAI,QAAQ,CAACH,aAAY;AAE9B,WAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,YAAI,QAAQ,QAAQ;AAClB,cAAI;AACF,oBAAQ,OAAO,QAAQ;AAAA,UACzB,SAAS,OAAO;AACd,iBAAK,OAAO,QAAQ,4BAA4B,KAAK;AAAA,UACvD;AAAA,QACF;AACA,gBAAQ,GAAG,MAAM;AAAA,MACnB,CAAC;AAED,WAAK,SAAS,MAAM;AAEpB,UAAI,KAAK,KAAK;AACZ,aAAK,IAAI,MAAM,MAAM;AACnB,eAAK,OAAO,OAAO,yBAAyB;AAC5C,UAAAA,SAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,QAAAA,SAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAKA,eAAsB,qBAAqB,SAAgD;AACzF,QAAM,QAAQ,IAAI,eAAe,OAAO;AACxC,QAAM,MAAM,MAAM;AAClB,SAAO;AACT;;;ACtcA,OAAOI,WAAU;AACjB,OAAOC,SAAQ;AACf,YAAYC,SAAQ;;;ACFb,SAAS,aAAa,KAAU;AACnC,SAAO,6BAA6B,KAAK,GAAG;AAChD;;;ACAO,SAAS,YAAY,KAAU,QAAgB,GAAW;AAC7D,QAAM,aAAa;AACnB,QAAM,SAAS,WAAW,OAAO,KAAK;AACtC,QAAM,cAAc,WAAW,OAAO,QAAQ,CAAC;AAE/C,MAAI,QAAQ,KAAM,QAAO;AACzB,QAAM,IAAI,OAAO;AACjB,MAAI,MAAM,SAAU,QAAO,KAAK,UAAU,GAAG;AAC7C,MAAI,MAAM,YAAY,MAAM,UAAW,QAAO,OAAO,GAAG;AACxD,MAAI,MAAM,WAAY,QAAO,IAAI,SAAS;AAC1C,MAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,UAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC;AACtD,WACI,QACA,MAAM,IAAI,CAAC,OAAO,cAAc,EAAE,EAAE,KAAK,KAAK,IAC9C,OACA,SACA;AAAA,EAER;AACA,MAAI,MAAM,UAAU;AAChB,UAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAM,UAAU,KAAK,IAAI,CAAC,MAAM;AAC5B,YAAM,UAAU,aAAa,CAAC,IAAI,IAAI,KAAK,UAAU,CAAC;AACtD,YAAM,IAAI,YAAY,IAAI,CAAC,GAAG,QAAQ,CAAC;AACvC,aAAO,cAAc,UAAU,OAAO;AAAA,IAC1C,CAAC;AACD,WAAO,QAAQ,QAAQ,KAAK,KAAK,IAAI,OAAO,SAAS;AAAA,EACzD;AACA,SAAO,OAAO,GAAG;AACrB;;;AF7BO,SAAS,OAAO,QAAgB,QAAgB,MAAyB;AAC5E,QAAM,MAAM;AACZ,QAAM,WAAWC,MAAK,KAAQ,YAAQ,GAAG,WAAW;AACpD,QAAM,UAAkBA,MAAK,QAAQ,UAAU,GAAG;AAClD,QAAM,SAASA,MAAK,KAAK,SAAS,GAAG,MAAM,KAAK;AAEhD,MAAI;AAEJ,MAAI,CAACC,IAAG,WAAW,MAAM,GAAG;AAExB,QAAI;AACA,MAAAA,IAAG,cAAc,QAAQ,IAAI,MAAM;AAEnC,aAAO,8BAA8B,MAAM;AAAA,IAC/C,SAAS,GAAG;AAER,aAAO,iCAAiC,MAAM;AAAA,IAClD;AAAA,EACJ;AAEA,QAAMA,IAAG,aAAa,QAAQ,MAAM;AAEpC,QAAM,cAAc;AAEpB,QAAM,UAAU,OAAO,QAAQ,yBAAyB,MAAM;AAC9D,QAAM,UAAU,IAAI;AAAA,IAChB,eAAe,OAAO,uBAAuB,OAAO,+BAA+B,OAAO;AAAA,IAC1F;AAAA,EACJ;AACA,QAAM,aAAa,IAAI,MAAM,OAAO;AAGpC,MAAI,WAAW;AAEf,MAAI,YAAY;AACZ,QAAI,WAAgB,WAAW;AAC/B,UAAM,UAAU,IAAI,MAAM,UAAU,WAAW,EAAE;AACjD,QAAI,cAAc,KAAK,OAAO,EAAG,YAAW;AAAA,aACnC,WAAW,KAAK,OAAO,EAAG,YAAW;AAAA,aACrC,yBAAyB,KAAK,OAAO,EAAG,YAAW;AAAA,EAChE;AAGA,MAAI;AACJ,MAAI,OAAO,SAAS,YAAY;AAC5B,UAAM,QAAQ,KAAK,SAAS;AAE5B,QAAI,aAAa,gBAAgB;AAC7B,UAAI,kBAAkB,KAAK,KAAK,EAAG,WAAU;AAAA;AAEzC,kBAAU,YAAY,MAAM,GAAG,MAAM;AAAA,UACjC;AAAA,UACA;AAAA,QACJ,CAAC;AAAA,IACT,WAAW,aAAa,aAAa;AACjC,UAAI,eAAe,KAAK,KAAK,EAAG,WAAU;AAAA,eACjC,cAAc,KAAK,KAAK;AAC7B,kBAAU,MAAM,QAAQ,eAAe,SAAS,MAAM,IAAI;AAAA,UACzD,WAAU,SAAS,MAAM,MAAM,KAAK;AAAA,IAC7C,OAAO;AACH,gBAAU,SAAS,MAAM,MAAM,KAAK;AAAA,IACxC;AAAA,EACJ,OAAO;AACH,cAAU,SAAS,MAAM,MAAM,YAAY,MAAM,CAAC,CAAC;AAAA,EACvD;AAGA,MAAI,YAAY;AACZ,UAAM,WAAW,WAAW;AAE5B,UAAM,WAAW,IAAI,QAAQ,KAAK,QAAQ;AAC1C,UAAM,aAAa,IAAI,QAAQ,KAAK,QAAQ;AAC5C,QAAI,YAAY;AAChB,QAAI,aAAa,GAAI,aAAY;AAAA,aACxB,eAAe,GAAI,aAAY;AAAA,QACnC,aAAY,KAAK,IAAI,UAAU,UAAU;AAE9C,QAAI,cAAc,IAAI;AAElB,YAAM,WAAW,IAAI;AAAA,QACjB,sBAAsB,OAAO,wBAAwB,OAAO;AAAA,QAC5D;AAAA,MACJ;AACA,UAAI,SAAS,KAAK,GAAG,GAAG;AACpB,cAAM,IAAI;AAAA,UACN;AAAA,UACA,GAAG,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,QACzD;AAAA,MACJ,OAAO;AACH,cACI,MAAM;AAAA;AAAA,EAAO,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,MACvE;AAAA,IACJ,OAAO;AACH,YAAM,cAAc,IAAI,SAAS;AACjC,YAAM,cAAc,gBAAgB,MAAM,MAAM;AAChD,UAAI,IAAI,YAAY;AACpB,UAAI,QAAQ;AACZ,YAAM,MAAM,IAAI;AAChB,aAAO,IAAI,OAAO,QAAQ,GAAG;AACzB,cAAM,KAAK,IAAI,CAAC;AAChB,YAAI,OAAO,YAAa;AAAA,iBACf,OAAO,YAAa;AAC7B;AAAA,MACJ;AACA,UAAI,aAAa;AACjB,UAAI,SAAS;AACb,UAAI,IAAI,MAAM,YAAY,aAAa,CAAC,MAAM;AAC1C,iBAAS,aAAa;AAE1B,YAAM,SAAS,IAAI,MAAM,GAAG,QAAQ;AACpC,YAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,YAAM,SAAS,UAAU;AAAA,IAC7B;AAAA,EACJ,OAAO;AAEH,UAAM,WAAW,IAAI;AAAA,MACjB,sBAAsB,OAAO,wBAAwB,OAAO;AAAA,MAC5D;AAAA,IACJ;AACA,QAAI,SAAS,KAAK,GAAG,GAAG;AACpB,YAAM,IAAI;AAAA,QACN;AAAA,QACA,GAAG,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,MACzD;AAAA,IACJ,OAAO;AACH,YACI,MAAM;AAAA;AAAA,EAAO,OAAO;AAAA;AAAA,eAAoB,MAAM,WAAW,MAAM;AAAA,IACvE;AAAA,EACJ;AAEA,EAAAA,IAAG,cAAc,QAAQ,KAAK,MAAM;AAEpC,MAAI,QAAQ,aAAa;AACrB,WAAO,SAAS,MAAM,gBAAgB,MAAM;AAAA,EAChD,OAAO;AACH,WAAO,WAAW,MAAM,SAAS,MAAM;AAAA,EAC3C;AACJ;;;AG9IA,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,YAAYC,SAAQ;AAEb,SAAS,OAAO,QAAgB,QAAgB;AACnD,QAAM,MAAM;AACZ,QAAM,WAAWF,MAAK,KAAQ,YAAQ,GAAG,WAAW;AACpD,QAAM,UAAkBA,MAAK,QAAQ,UAAU,GAAG;AAClD,QAAM,SAASA,MAAK,KAAK,SAAS,GAAG,MAAM,KAAK;AAChD,MAAI,CAACC,IAAG,WAAW,MAAM,EAAG,QAAO;AAGnC,MAAI,CAAC,QAAQ;AACT,UAAME,OAAM,GAAG,MAAM;AACrB,QAAI;AACA,MAAAF,IAAG,aAAa,QAAQE,IAAG;AAAA,IAC/B,SAAS,GAAG;AAAA,IAEZ;AACA,QAAI;AACA,MAAAF,IAAG,WAAW,MAAM;AACpB,aAAO;AAAA,IACX,SAAS,GAAG;AACR,aAAO;AAAA,IACX;AAAA,EACJ;AAGA,QAAM,MAAM,GAAG,MAAM;AACrB,MAAI;AACA,IAAAA,IAAG,aAAa,QAAQ,GAAG;AAAA,EAC/B,SAAS,GAAG;AAAA,EAEZ;AAEA,MAAI,MAAMA,IAAG,aAAa,QAAQ,MAAM;AACxC,QAAM,UAAU,OAAO,QAAQ,yBAAyB,MAAM;AAG9D,QAAM,UAAU,IAAI;AAAA,IAChB,eAAe,OAAO,uBAAuB,OAAO,+BAA+B,OAAO;AAAA,IAC1F;AAAA,EACJ;AAEA,QAAM,aAAa,IAAI,MAAM,OAAO;AAEpC,MAAI,YAAY;AACZ,UAAM,WAAW,WAAW;AAG5B,UAAM,MAAM,IAAI;AAChB,UAAM,WAAW,IAAI,QAAQ,KAAK,QAAQ;AAC1C,UAAM,aAAa,IAAI,QAAQ,KAAK,QAAQ;AAC5C,QAAI,YAAY;AAChB,QAAI,aAAa,GAAI,aAAY;AAAA,aACxB,eAAe,GAAI,aAAY;AAAA,QACnC,aAAY,KAAK,IAAI,UAAU,UAAU;AAE9C,QAAI,cAAc,IAAI;AAClB,YAAM,cAAc,IAAI,SAAS;AACjC,YAAM,cAAc,gBAAgB,MAAM,MAAM;AAChD,UAAI,IAAI,YAAY;AACpB,UAAI,QAAQ;AACZ,aAAO,IAAI,OAAO,QAAQ,GAAG;AACzB,cAAM,KAAK,IAAI,CAAC;AAChB,YAAI,OAAO,YAAa;AAAA,iBACf,OAAO,YAAa;AAC7B;AAAA,MACJ;AACA,UAAI,aAAa;AACjB,UAAI,SAAS;AACb,UAAI,IAAI,MAAM,YAAY,aAAa,CAAC,MAAM;AAC1C,iBAAS,aAAa;AAE1B,YAAM,SAAS,IAAI,MAAM,GAAG,QAAQ;AACpC,YAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,YAAM,SAAS;AAAA,IACnB,OAAO;AAEH,YAAM,OAAO,IAAI,QAAQ,KAAK,QAAQ;AACtC,UAAI,SAAS,SAAS,KAAK,OAAO,IAAI,IAAI,QAAQ,QAAQ,QAAQ;AAClE,UAAI,WAAW,GAAI,UAAS;AAC5B,YAAM,IAAI,MAAM,GAAG,QAAQ,IAAI,IAAI,MAAM,MAAM;AAAA,IACnD;AAAA,EACJ;AAGA,QAAM,WAAW,IAAI;AAAA,IACjB,sBAAsB,OAAO,wBAAwB,OAAO;AAAA,IAC5D;AAAA,EACJ;AACA,QAAM,IAAI,QAAQ,UAAU,EAAE;AAG9B,QAAM,IAAI,QAAQ,WAAW,MAAM;AAEnC,EAAAA,IAAG,cAAc,QAAQ,KAAK,MAAM;AAEpC,SAAO,WAAW,MAAM,kBAAkB,MAAM;AACpD;;;AChGA,OAAOG,SAAQ;AACf,OAAOC,WAAU;AACjB,YAAYC,SAAQ;AAMb,SAAS,OAAO,QAAgB,MAA+B;AAClE,QAAM,MAAM;AACZ,QAAM,WAAWD,MAAK,KAAQ,YAAQ,GAAG,WAAW;AACpD,QAAM,UAAkBA,MAAK,QAAQ,UAAU,GAAG;AAClD,QAAM,SAASA,MAAK,KAAK,SAAS,GAAG,MAAM,KAAK;AAEhD,EAAAD,IAAG,eAAe,QAAQ,KAAK,SAAS,GAAG,MAAM;AACrD;;;ACfA,YAAYG,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AASb,SAAS,KAAK,QAAgB,MAAqC;AACtE,QAAM,MAAM;AACZ,QAAM,WAAgB,WAAQ,YAAQ,GAAG,WAAW;AACpD,QAAM,UAAuB,cAAQ,UAAU,GAAG;AAClD,QAAM,SAAc,WAAK,SAAS,GAAG,MAAM,KAAK;AAEhD,MAAI,cAAc,OAAO,SAAS,aAAa,KAAK,SAAS,IAAI;AAEjE,EAAG,kBAAc,QAAQ,aAAa,MAAM;AAChD;;;ACvBA,YAAYC,UAAQ;AACpB,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AAOb,SAAS,KAAK,QAAwB;AACzC,QAAM,MAAM;AACZ,QAAM,WAAgB,WAAQ,YAAQ,GAAG,WAAW;AACpD,QAAM,UAAuB,cAAQ,UAAU,GAAG;AAClD,QAAM,SAAc,WAAK,SAAS,GAAG,MAAM,KAAK;AAEhD,MAAI,CAAI,gBAAW,MAAM,GAAG;AACxB,UAAM,IAAI,MAAM,aAAa,MAAM,aAAa;AAAA,EACpD;AAEA,SAAU,kBAAa,QAAQ,MAAM;AACzC;;;ACdO,IAAMC,UAAS;AACf,IAAMC,UAAS;AACf,IAAMC,UAAS;AACf,IAAMC,QAAO;AACb,IAAMC,QAAO;AAEpB,eAAsB,uBAAuB;AAEzC,QAAM,iBAAiB,oBAAI,IAAiB;AAE5C,iBAAe,IAAI,UAAUJ,OAAM;AACnC,iBAAe,IAAI,UAAUC,OAAM;AACnC,iBAAe,IAAI,UAAUC,OAAM;AACnC,iBAAe,IAAI,QAAQC,KAAI;AAC/B,iBAAe,IAAI,QAAQC,KAAI;AAE/B,QAAM,UAA+B;AAAA;AAAA,IAEjC,SAAS,CAAC,eAAuB;AAC7B,YAAM,SAAS,eAAe,IAAI,UAAU;AAC5C,UAAI,CAAC,QAAQ;AACT,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AAEA,aAAO,OAAO,WAAW;AAAA,IAC7B;AAAA;AAAA,IAGA,QAAQ,OAAO,eAAuB;AAClC,YAAM,SAAS,eAAe,IAAI,UAAU;AAC5C,UAAI,CAAC,QAAQ;AACT,cAAM,IAAI,MAAM,WAAW,UAAU,aAAa;AAAA,MACtD;AACA,aAAO;AAAA,QACH,SAAS,OAAO,WAAW;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,aAAW,CAAC,MAAM,aAAa,KAAK,gBAAgB;AAChD,YAAQ,IAAI,IAAI,cAAc,WAAW;AAAA,EAC7C;AAEA,SAAO;AACX;AAEA,IAAOC,eAAQ;;;AdjBf,SAAS,cAAc,SAAiB,KAA6B;AACnE,UAAQ,MAAM,OAAO;AACrB,MAAI,IAAK,SAAQ,MAAM,GAAG;AAC1B,UAAQ,KAAK,CAAC;AAChB;AAEA,eAAsB,SAAwB;AAE5C,MAAI,WAAgB,YAAK,WAAW,GAAG,WAAW;AAGlD,MAAI;AACF,YAAQ,IAAI,kCAAkC;AAC9C,UAAM,SAAS;AACf,YAAQ,IAAI,gBAAgB;AAAA,EAC9B,SAAS,KAAK;AACZ,kBAAc,sCAAsC,GAAG;AAAA,EACzD;AAEA,UAAQ,IAAI,0BAA0B;AACtC,MAAI,SAAiB;AAAA,IACnB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,QACE,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAGA,QAAM,aAA0B,YAAK,UAAU,aAAa;AAC5D,MAAO,gBAAW,UAAU,GAAG;AAC7B,QAAI;AACF,YAAM,cAAyB,kBAAa,YAAY,MAAM;AAC9D,YAAM,SAAkB,KAAK,MAAM,WAAW;AAC9C,UAAI,UAAU,OAAO,WAAW,UAAU;AACxC,cAAM,eAAe;AAErB,cAAM,UAA2B,CAAC;AAClC,YAAI,OAAO,aAAa,SAAS,SAAU,SAAQ,OAAO,aAAa;AACvE,YAAI,aAAa,SAAS,OAAW,SAAQ,OAAO,aAAa;AACjE,YAAI,aAAa,UAAU,QAAW;AAEpC,cAAI,MAAM,QAAQ,aAAa,KAAK,GAAG;AACrC,gBAAI,aAAa,MAAM,WAAW,GAAG;AACnC,sBAAQ,QAAQ,CAAC;AAAA,YACnB,WAAW,OAAO,aAAa,MAAM,CAAC,MAAM,UAAU;AAEpD,sBAAQ,QAAS,aAAa,MAAmB,IAAI,CAAC,cAAsB;AAAA,gBAC1E;AAAA,gBACA,UAAU;AAAA,gBACV,MAAM;AAAA,cACR,EAAE;AAAA,YACJ,OAAO;AAEL,sBAAQ,QAAQ,aAAa;AAAA,YAC/B;AAAA,UACF,OAAO;AAEL,oBAAQ,QAAQ,CAAC,aAAa,KAAa;AAAA,UAC7C;AAAA,QACF;AACA,YAAI,OAAO,aAAa,WAAW,SAAU,SAAQ,SAAS,aAAa;AAC3E,YAAI,OAAO,aAAa,WAAW,UAAW,SAAQ,SAAS,aAAa;AAC5E,iBAAS,EAAE,GAAG,QAAQ,GAAG,QAAQ;AAAA,MACnC,OAAO;AACL,gBAAQ,KAAK,8CAA8C;AAAA,MAC7D;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,qDAAqD,GAAG;AAAA,IACvE;AAAA,EACF;AAGA,MAAI,OAAO,OAAO,SAAS,UAAU;AACnC,UAAM,IAAI,SAAS,OAAO,MAAM,EAAE;AAClC,QAAI,CAAC,OAAO,MAAM,CAAC,EAAG,QAAO,OAAO;AAAA,EACtC;AACA,MAAI,CAAC,OAAO,SAAS,OAAO,IAAI,EAAG,QAAO,OAAO;AAEjD,MAAI,OAAO,OAAO,KAAK,OAAO,OAAO,OAAO;AAC1C,YAAQ,KAAK,oDAAoD;AACjE,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,GAAG;AAChC,QAAI,OAAO,SAAS,OAAO,OAAO,UAAU,SAAU,QAAO,QAAQ,CAAC,OAAO,KAAK;AAAA,QAC7E,QAAO,QAAQ,CAAC,EAAE,UAAU,IAAI,UAAU,OAAU,CAAC;AAAA,EAC5D;AACA,SAAO,QAAQ,OAAO,MAAM,IAAI,CAAC,MAAiB;AAChD,QAAI,CAAC,EAAG,QAAO,EAAE,UAAU,IAAI,UAAU,OAAU;AACnD,QAAI,OAAO,MAAM,SAAU,QAAO,EAAE,UAAU,GAAG,UAAU,OAAU;AACrE,QAAI,OAAO,MAAM,UAAU;AACzB,aAAO;AAAA,QACL,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAAA,QACxD,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAAA,QACxD,MAAM,OAAO,EAAE,SAAS,YAAY,EAAE,OAAO;AAAA,QAC7C,WAAY,EAAE,cAAc,YAAY,EAAE,cAAc,YAAY,EAAE,cAAc,WAAY,EAAE,YAAY;AAAA,MAChH;AAAA,IACF;AACA,WAAO,EAAE,UAAU,IAAI,UAAU,OAAU;AAAA,EAC7C,CAAC;AAGD,QAAM,UAAuB,eAAQ,UAAU,OAAO,OAAO,UAAU,WAAW,CAAC;AACnF,QAAM,YAAyB,eAAQ,UAAU,SAAS;AAC1D,MAAI;AACF,QAAI,CAAI,gBAAW,OAAO,GAAG;AAC3B,MAAG,eAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACzC,cAAQ,IAAI,mCAAmC,OAAO,EAAE;AAAA,IAC1D,WAAW,CAAI,cAAS,OAAO,EAAE,YAAY,GAAG;AAC9C,oBAAc,oDAAoD,OAAO,EAAE;AAAA,IAC7E;AAAA,EACF,SAAS,KAAK;AACZ,kBAAc,2CAA2C,GAAG;AAAA,EAC9D;AAGA,MAAIC;AACJ,MAAI;AAEF,IAAAA,MAAK,IAAI,YAAG,EAAE,UAAU,MAAM,iBAAiB,CAAC,EAAE,CAAC;AAGnD,YAAQ,IAAI,0CAA0C;AACtD,UAAM,gBAAgB,MAAMC,aAAqB;AAEjD,IAAAD,IAAG,SAAS,aAAa;AAEzB,YAAQ,IAAI,2CAA2C;AAAA,EACzD,SAAS,KAAK;AACZ,kBAAc,2BAA2B,GAAG;AAAA,EAC9C;AAGA,MAAI,UAA0B;AAC9B,MAAI;AACF,cAAU,IAAI,QAAQ,SAAS,QAAQ;AACvC,UAAM,QAAQ,WAAW;AACzB,YAAQ,IAAI,0BAA0B,OAAO,YAAY,QAAQ,GAAG;AAAA,EACtE,SAAS,KAAK;AACZ,kBAAc,gCAAgC,GAAG;AAAA,EACnD;AAGA,MAAI,CAAC,SAAS;AACZ,kBAAc,6BAA6B;AAAA,EAC7C;AAEA,MAAI;AACJ,MAAI;AACF,qBAAiB,IAAI,SAAS;AAAA,MAC5B,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,MACd,IAAIA;AAAA,MACJ;AAAA,IACF,CAAC;AACD,QAAI,OAAO,eAAe,UAAU,YAAY;AAC9C,oBAAc,kCAAkC;AAAA,IAClD;AACA,mBAAe,MAAM;AACrB,YAAQ,IAAI,8BAA8B,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AAAA,EACxE,SAAS,KAAK;AACZ,kBAAc,4BAA4B,GAAG;AAAA,EAC/C;AAGA,MAAI;AACF,UAAM,SAAS,OAAO,OAAO;AAC7B,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO,WAAW,SAAY,OAAO,SAAS;AAAA,MACtD,QAAQ;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,mCAAmC,MAAM,EAAE;AAAA,EACzD,SAAS,KAAK;AACZ,YAAQ,KAAK,8DAA8D,GAAG;AAAA,EAChF;AACF;;;Ae9NA,SAAS,gBAAgB;AACzB,SAAS,cAAAE,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;;;ACNxB,SAAS,uBAAuB;AAShC,eAAsB,WAAW,SAAuB;AACtD,QAAM,KAAK,gBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ;AAAA,EACV,CAAC;AAED,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,iBAAiB,QAAQ,IAAI,IAAI,QAAQ,IAAI,KAAK;AAG9D,QAAM,WAAW,MAAM,SAAS,IAAI,YAAY;AAChD,QAAM,WAAW,MAAM,SAAS,IAAI,cAAc,IAAI;AAEtD,MAAI;AACJ,MAAI;AAEJ,MAAI;AAEF,aAAS,IAAIC,aAAO,cAAc,QAAQ,IAAI,IAAI,QAAQ,IAAI,IAAI;AAAA,MAChE,QAAQ,QAAQ,UAAU;AAAA,MAC1B,QAAQ;AAAA,QACN,OAAO,MAAM;AAAA,QAAC;AAAA;AAAA,QACd,MAAM,MAAM;AAAA,QAAC;AAAA,QACb,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAED,UAAM,OAAO,QAAQ;AAGrB,UAAM,cAAmB,MAAM,OAAO,QAAQ;AAAA,MAC5C,QAAQ;AAAA,MACR,MAAM,EAAE,UAAU,SAAS;AAAA,IAC7B,CAAC;AAED,QAAI,YAAY,OAAO;AACrB,cAAQ,MAAM,0BAAqB,YAAY,KAAK;AACpD,YAAM,OAAO,MAAM;AACnB,SAAG,MAAM;AACT;AAAA,IACF;AAEA,YAAQ,YAAY;AACpB,YAAQ,IAAI,kCAA6B;AACzC,YAAQ,IAAI,yDAAyD;AACrE,YAAQ,IAAI,kEAAkE;AAC9E,YAAQ,IAAI;AAEZ,QAAI;AAEJ,OAAG,OAAO;AAEV,OAAG,GAAG,QAAQ,OAAO,SAAS;AAC5B,YAAM,UAAU,KAAK,KAAK;AAE1B,UAAI,CAAC,SAAS;AACZ,WAAG,OAAO;AACV;AAAA,MACF;AAGA,UAAI,YAAY,WAAW,YAAY,SAAS;AAC9C,gBAAQ,IAAI,UAAU;AACtB,cAAM,OAAO,MAAM;AACnB,WAAG,MAAM;AACT;AAAA,MACF;AAEA,UAAI,YAAY,SAAS;AACvB,uBAAe;AACf,WAAG,OAAO;AACV;AAAA,MACF;AAEA,UAAI,YAAY,QAAQ;AACtB,YAAI;AACF,gBAAM,SAAc,MAAM,OAAO,QAAQ;AAAA,YACvC,QAAQ;AAAA,YACR,MAAM,EAAE,MAAM;AAAA,UAChB,CAAC;AACD,cAAI,OAAO,OAAO;AAChB,oBAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UACtC,OAAO;AACL,oBAAQ,IAAI,cAAc;AAC1B,gBAAI,OAAO,aAAa,OAAO,UAAU,SAAS,GAAG;AACnD,qBAAO,UAAU,QAAQ,CAAC,OAAe;AACvC,sBAAM,SAAS,OAAO,YAAY,OAAO;AACzC,wBAAQ,IAAI,OAAO,EAAE,GAAG,MAAM,EAAE;AAAA,cAClC,CAAC;AAAA,YACH,OAAO;AACL,sBAAQ,IAAI,kBAAkB;AAAA,YAChC;AACA,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,SAAS,KAAK;AACZ,kBAAQ,MAAM,UAAU,GAAG;AAAA,QAC7B;AACA,WAAG,OAAO;AACV;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,oBAAY,QAAQ,UAAU,CAAC,EAAE,KAAK;AACtC,gBAAQ,IAAI,0BAAqB,SAAS,EAAE;AAC5C,WAAG,OAAO;AACV;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,UAAU,GAAG;AAClC,cAAM,SAAS,QAAQ,UAAU,CAAC,EAAE,KAAK;AACzC,YAAI;AACF,gBAAM,SAAc,MAAM,OAAO,QAAQ;AAAA,YACvC,QAAQ;AAAA,YACR,MAAM,EAAE,OAAO,cAAc,OAAO;AAAA,UACtC,CAAC;AACD,cAAI,OAAO,OAAO;AAChB,oBAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UACtC,OAAO;AACL,oBAAQ,IAAI,4BAAuB,MAAM,EAAE;AAC3C,wBAAY;AAAA,UACd;AAAA,QACF,SAAS,KAAK;AACZ,kBAAQ,MAAM,UAAU,GAAG;AAAA,QAC7B;AACA,WAAG,OAAO;AACV;AAAA,MACF;AAGA,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAM,gEAAgE;AAC9E,WAAG,OAAO;AACV;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAc,MAAM,OAAO,QAAQ;AAAA,UACvC,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ;AAAA,YACA,cAAc;AAAA,YACd,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAED,YAAI,OAAO,OAAO;AAChB,kBAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QACtC,OAAO;AAEL,cAAI,OAAO,WAAW,QAAW;AAC/B,oBAAQ,IAAI,aAAa,OAAO,MAAM,CAAC;AAAA,UACzC;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,gBAAQ,MAAM,UAAU,IAAI,WAAW,GAAG;AAAA,MAC5C;AAEA,SAAG,OAAO;AAAA,IACZ,CAAC;AAED,OAAG,GAAG,SAAS,YAAY;AACzB,cAAQ,IAAI,YAAY;AACxB,YAAM,OAAO,MAAM;AACnB,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EAEH,SAAS,KAAU;AACjB,YAAQ,MAAM,+BAA0B,IAAI,WAAW,GAAG;AAC1D,OAAG,MAAM;AACT,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,SAAS,IAAS,QAAgB,SAAkB,OAAwB;AACnF,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,QAAI,QAAQ;AAEV,YAAM,QAAQ,QAAQ;AACtB,YAAM,aAAa,IAAI;AACvB,cAAQ,OAAO,MAAM,MAAM;AAE3B,UAAI,WAAW;AACf,YAAM,GAAG,QAAQ,SAAS,OAAO,MAAc;AAC7C,cAAM,IAAI,KAAK,SAAS;AACxB,YAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,KAAU;AAC9C,gBAAM,aAAa,KAAK;AACxB,gBAAM,eAAe,QAAQ,MAAM;AACnC,kBAAQ,OAAO,MAAM,IAAI;AACzB,UAAAA,SAAQ,QAAQ;AAAA,QAClB,WAAW,MAAM,KAAU;AAEzB,gBAAM,aAAa,KAAK;AACxB,kBAAQ,KAAK,CAAC;AAAA,QAChB,WAAW,MAAM,UAAY,MAAM,MAAM;AAEvC,cAAI,SAAS,SAAS,GAAG;AACvB,uBAAW,SAAS,MAAM,GAAG,EAAE;AAC/B,oBAAQ,OAAO,MAAM,OAAO;AAAA,UAC9B;AAAA,QACF,OAAO;AACL,sBAAY;AACZ,kBAAQ,OAAO,MAAM,GAAG;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,SAAG,SAAS,QAAQ,CAAC,WAAmB;AACtC,QAAAA,SAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,QAAqB;AACzC,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,OAAW,QAAO;AAEjC,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI;AACF,aAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,IACvC,QAAQ;AACN,aAAO,OAAO,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,OAAO,MAAM;AACtB;AAEA,SAAS,iBAAiB;AACxB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAiBb;AACD;;;ADxPA,IAAI,MAAW;AACf,IAAI;AACF,QAAM,UAAQ,KAAK;AACrB,QAAQ;AAER;AAEA,IAAM,eAAeC,MAAKC,SAAQ,GAAG,WAAW;AAChD,IAAM,cAAcD,MAAK,cAAc,aAAa;AACpD,IAAM,eAAeA,MAAK,cAAc,cAAc;AACtD,IAAM,iBAAiBA,MAAK,cAAc,qBAAqB;AAE/D,eAAe,OAAO;AACpB,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,UAAU,KAAK,CAAC;AACtB,QAAM,WAAW,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,UAAU;AAChE,QAAM,UAAU,KAAK,SAAS,SAAS;AAEvC,MAAI,CAAC,WAAW,YAAY,SAAS;AACnC,UAAM,aAAa,UAAU,OAAO;AAAA,EACtC,WAAW,YAAY,QAAQ;AAC7B,UAAM,YAAY;AAAA,EACpB,WAAW,YAAY,WAAW;AAChC,UAAM,eAAe,QAAQ;AAAA,EAC/B,WAAW,YAAY,UAAU;AAC/B,UAAM,cAAc;AAAA,EACtB,WAAW,YAAY,QAAQ;AAC7B,UAAM,YAAY;AAAA,EACpB,WAAW,YAAY,SAAS;AAC9B,UAAM,aAAa;AAAA,EACrB,WAAW,YAAY,SAAS;AAC9B,UAAM,aAAa;AAAA,EACrB,WAAW,YAAY,OAAO;AAC5B,UAAM,WAAW,KAAK,MAAM,CAAC,CAAC;AAAA,EAChC,WAAW,YAAY,YAAY,YAAY,MAAM;AACnD,UAAM,cAAc,KAAK,MAAM,CAAC,CAAC;AAAA,EACnC,WAAW,YAAY,UAAU,YAAY,YAAY,YAAY,MAAM;AACzE,cAAU;AAAA,EACZ,WAAW,YAAY,aAAa,YAAY,eAAe,YAAY,MAAM;AAC/E,iBAAa;AAAA,EACf,OAAO;AACL,YAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,YAAQ,MAAM,2CAA2C;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,aAAa,QAAiB,QAAiB,OAAO;AAEnE,MAAI,CAAC,OAAO;AACV,UAAM,UAAU,MAAM,gBAAgB;AACtC,QAAI,SAAS;AACX,cAAQ,MAAM,oCAAoC;AAClD,cAAQ,IAAI,uCAAuC;AACnD,cAAQ,IAAI,wCAAwC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,YAAQ,IAAI,4CAA4C;AACxD,UAAM,mBAAmB;AAAA,EAC3B,OAAO;AACL,YAAQ,IAAI,6BAA6B;AACzC,QAAI;AACF,YAAM,OAAO;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,MAAM,2BAA2B,GAAG;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAEA,eAAe,kBAAoC;AACjD,MAAI,CAAC,IAAK,QAAO;AAEjB,SAAO,IAAI,QAAQ,CAACE,aAAY;AAC9B,QAAI,SAAS,YAAY,CAAC,KAAU,uBAA4B;AAC9D,UAAI,OAAO,CAAC,sBAAsB,mBAAmB,WAAW,GAAG;AACjE,QAAAA,SAAQ,KAAK;AAAA,MACf,OAAO;AACL,cAAM,WAAW,mBAAmB,CAAC,GAAG,SAAS,WAAW;AAC5D,QAAAA,SAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,qBAAqB;AAClC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,yCAAyC;AACvD,QAAI;AACF,eAAS,sBAAsB,EAAE,OAAO,UAAU,CAAC;AACnD,cAAQ,IAAI,mCAA8B;AAG1C,aAAO,UAAQ,MAAM,UAAQ,QAAQ,KAAK,CAAC;AAC3C,UAAI;AACF,cAAM,UAAQ,KAAK;AAAA,MACrB,QAAQ;AAEN,gBAAQ,MAAM,uCAAuC;AACrD,gBAAQ,IAAI,qDAAqD;AACjE,gBAAQ,IAAI,sBAAsB;AAClC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,0BAA0B,GAAG;AAC3C,cAAQ,IAAI,iDAAiD;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,wBAAsB;AAGtB,QAAM,gBAAgB;AAGtB,SAAO,IAAI,QAAc,CAACA,UAAS,WAAW;AAC5C,QAAI,MAAM,eAAe,CAAC,QAAa;AACrC,UAAI,KAAK;AACP,gBAAQ,MAAM,2BAA2B,GAAG;AAC5C,YAAI,WAAW,MAAM,QAAQ,KAAK,CAAC,CAAC;AACpC,eAAO,OAAO,GAAG;AAAA,MACnB;AAEA,cAAQ,IAAI,+CAA0C;AACtD,cAAQ,IAAI,WAAW,aAAa,EAAE;AACtC,cAAQ,IAAI,uCAAuC;AACnD,cAAQ,IAAI,kCAAkC;AAC9C,cAAQ,IAAI,6CAA6C;AAGzD,UAAI,WAAW,MAAM;AACnB,QAAAA,SAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,cAAc;AAC3B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,sBAAsB;AACpC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAO,IAAI,QAAc,CAACA,UAAS,WAAW;AAE5C,QAAI,SAAS,YAAY,CAAC,KAAU,uBAA4B;AAC9D,UAAI,OAAO,CAAC,sBAAsB,mBAAmB,WAAW,GAAG;AACjE,gBAAQ,IAAI,gCAAgC;AAC5C,YAAI,WAAW,MAAMA,SAAQ,CAAC;AAC9B;AAAA,MACF;AAGA,cAAQ,IAAI,6BAA6B;AACzC,UAAI,KAAK,YAAY,CAACC,SAAa;AACjC,YAAIA,MAAK;AACP,kBAAQ,MAAM,0BAA0BA,IAAG;AAC3C,cAAI,WAAW,MAAM,QAAQ,KAAK,CAAC,CAAC;AACpC,iBAAO,OAAOA,IAAG;AAAA,QACnB;AAGA,YAAI,OAAO,YAAY,CAACA,SAAa;AACnC,cAAIA,MAAK;AACP,oBAAQ,MAAM,6BAA6BA,IAAG;AAAA,UAChD,OAAO;AACL,oBAAQ,IAAI,gCAA2B;AAAA,UACzC;AACA,cAAI,WAAW,MAAMD,SAAQ,CAAC;AAAA,QAChC,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,eAAe,QAAiB;AAC7C,UAAQ,IAAI,+BAA+B;AAC3C,QAAM,YAAY;AAClB,QAAM,IAAI,QAAQ,CAAAA,aAAW,WAAWA,UAAS,GAAI,CAAC;AACtD,QAAM,aAAa,QAAQ,MAAM;AACnC;AAEA,eAAe,gBAAgB;AAC7B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,sBAAsB;AACpC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAO,IAAI,QAAc,CAACA,aAAY;AAEpC,QAAI,KAAK,CAAC,KAAU,SAAc;AAChC,UAAI,KAAK;AACP,gBAAQ,MAAM,yBAAyB,GAAG;AAC1C,YAAI,WAAW,MAAMA,SAAQ,CAAC;AAC9B;AAAA,MACF;AAEA,YAAM,kBAAkB,KAAK,KAAK,CAAC,MAAW,EAAE,SAAS,UAAU;AAEnE,UAAI,mBAAmB,gBAAgB,QAAQ,WAAW,UAAU;AAClE,gBAAQ,IAAI,mCAA8B;AAC1C,gBAAQ,IAAI,UAAU,gBAAgB,GAAG,EAAE;AAC3C,gBAAQ,IAAI,cAAc,gBAAgB,MAAM,SAAS,OAAO,MAAM,QAAQ,CAAC,CAAC,KAAK;AACrF,gBAAQ,IAAI,UAAU,gBAAgB,MAAM,IAAI,QAAQ,CAAC,CAAC,GAAG;AAC7D,gBAAQ,IAAI,aAAa,KAAK,MAAM,gBAAgB,QAAQ,SAAS,GAAI,CAAC,GAAG;AAC7E,gBAAQ,IAAI,eAAe,gBAAgB,QAAQ,YAAY,EAAE;AACjE,gBAAQ,IAAI,wBAAwB;AACpC,gBAAQ,IAAI,+CAA+C;AAC3D,gBAAQ,IAAI,+CAA+C;AAC3D,gBAAQ,IAAI,yCAAyC;AACrD,gBAAQ,IAAI,sCAAsC;AAAA,MACpD,OAAO;AACL,gBAAQ,IAAI,uCAAkC;AAAA,MAChD;AAEA,UAAI,WAAW,MAAMA,SAAQ,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,cAAc;AAE3B,QAAM,UAAUF,MAAK,cAAc,kBAAkB;AAErD,MAAI,CAACI,YAAW,OAAO,GAAG;AACxB,YAAQ,IAAI,2DAA2D;AACvE,YAAQ,IAAI,gDAAgD;AAC5D;AAAA,EACF;AAEA,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,aAAa,OAAO,EAAE;AAClC,UAAQ,IAAI,EAAE;AAEd,MAAI;AAEF,UAAM,EAAE,OAAAC,OAAM,IAAI,UAAQ,eAAe;AACzC,UAAM,OAAOA,OAAM,QAAQ,CAAC,MAAM,OAAO,GAAG,EAAE,OAAO,UAAU,CAAC;AAGhE,YAAQ,GAAG,UAAU,MAAM;AACzB,WAAK,KAAK;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,SAAK,GAAG,SAAS,MAAM;AAErB,cAAQ,IAAI,8FAA8F;AAC1G,cAAQ,IAAI,0CAA0C,OAAO;AAC7D,YAAM,aAAaC,cAAa,SAAS,OAAO;AAChD,cAAQ,IAAI,UAAU;AAAA,IACxB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,MAAM,0BAA0B,GAAG;AAC3C,YAAQ,IAAI,0CAA0C,OAAO,EAAE;AAAA,EACjE;AACF;AAEA,eAAe,eAAe;AAC5B,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,sBAAsB;AACpC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAO,IAAI,QAAc,CAACJ,aAAY;AAEpC,QAAI,KAAK,CAAC,KAAU,SAAc;AAChC,UAAI,KAAK;AACP,gBAAQ,MAAM,yBAAyB,GAAG;AAC1C,YAAI,WAAW,MAAMA,SAAQ,CAAC;AAC9B;AAAA,MACF;AAEA,YAAM,kBAAkB,KAAK,KAAK,CAAC,MAAW,EAAE,SAAS,UAAU;AAEnE,UAAI,mBAAmB,gBAAgB,QAAQ,WAAW,UAAU;AAClE,gBAAQ,IAAI,4BAA4B;AACxC,gBAAQ,IAAI,yBAAyB;AACrC,gBAAQ,IAAI,WAAW,gBAAgB,QAAQ,MAAM,EAAE;AACvD,gBAAQ,IAAI,QAAQ,gBAAgB,GAAG,EAAE;AACzC,gBAAQ,IAAI,YAAY,gBAAgB,MAAM,SAAS,OAAO,MAAM,QAAQ,CAAC,CAAC,KAAK;AACnF,gBAAQ,IAAI,QAAQ,gBAAgB,MAAM,IAAI,QAAQ,CAAC,CAAC,GAAG;AAC3D,gBAAQ,IAAI,WAAW,KAAK,MAAM,gBAAgB,QAAQ,SAAS,GAAI,CAAC,GAAG;AAC3E,gBAAQ,IAAI,aAAa,gBAAgB,QAAQ,YAAY,EAAE;AAC/D,gBAAQ,IAAI,iBAAiB,IAAI,KAAK,gBAAgB,QAAQ,UAAU,EAAE,YAAY,CAAC,EAAE;AACzF,gBAAQ,IAAI,SAAS,gBAAgB,QAAQ,cAAc,SAAS,SAAS,SAAS,EAAE;AACxF,gBAAQ,IAAI,aAAa,gBAAgB,QAAQ,QAAQ,QAAQ,IAAI,EAAE;AACvE,gBAAQ,IAAI,WAAW,gBAAgB,QAAQ,UAAU,gBAAgB,QAAQ,MAAM,EAAE;AAAA,MAC3F,OAAO;AACL,gBAAQ,IAAI,uCAAkC;AAAA,MAChD;AAEA,UAAI,WAAW,MAAMA,SAAQ,CAAC;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,eAAe;AAE5B,QAAM,UAAU,MAAM,gBAAgB;AACtC,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,uCAAkC;AAChD,YAAQ,IAAI,gDAAgD;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,SAAS;AAEb,MAAIE,YAAW,WAAW,GAAG;AAC3B,QAAI;AACF,YAAM,SAAS,KAAK,MAAME,cAAa,aAAa,OAAO,CAAC;AAC5D,UAAI,OAAO,KAAM,QAAO,OAAO;AAC/B,UAAI,OAAO,KAAM,QAAO,OAAO;AAC/B,UAAI,OAAO,OAAQ,UAAS,OAAO;AAAA,IACrC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC;AACzC;AAEA,eAAe,WAAW,UAAoB;AAC5C,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,IAAI,yDAAyD;AACrE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW;AACvB,YAAQ,IAAI,sEAAsE;AAClF,YAAQ,IAAI,gEAAgE;AAC5E,YAAQ,IAAI,mEAAmE;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,UAAU,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,IAAI;AAGtE,QAAM,OAAO,SAAS,OAAO,OAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAEpD,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,QAAI;AAEJ,QAAI,SAAS;AAEX,YAAM,QAAQ,IAAI;AAClB,cAAQ,IAAI,cAAc,KAAK,KAAK,IAAI,CAAC,0BAA0B;AAAA,IACrE,OAAO;AAEL,wBAAkB;AAClB,YAAM;AACN,cAAQ,IAAI,cAAc,KAAK,KAAK,IAAI,CAAC,0BAA0B;AAAA,IACrE;AAEA,UAAM,MAAM,aAAa,KAAK,KAAK,GAAG;AACtC,aAAS,KAAK,EAAE,OAAO,WAAW,IAAI,CAAC;AAEvC,QAAI,SAAS;AACX,cAAQ,IAAI,iCAA4B,KAAK,KAAK,IAAI,CAAC,UAAU;AAAA,IACnE,OAAO;AACL,cAAQ,IAAI,iCAA4B,KAAK,KAAK,IAAI,CAAC,0BAA0B;AAAA,IACnF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B;AAC1C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,cAAc,UAAoB;AAC/C,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,IAAI,4DAA4D;AACxE,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW;AACvB,YAAQ,IAAI,uEAAuE;AACnF,YAAQ,IAAI,+DAA+D;AAC3E,YAAQ,IAAI,oEAAoE;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,UAAU,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,IAAI;AAGtE,QAAM,OAAO,SAAS,OAAO,OAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAEpD,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,MAAM,6BAA6B;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,QAAI;AAEJ,QAAI,SAAS;AAEX,YAAM,QAAQ,IAAI;AAClB,cAAQ,IAAI,YAAY,KAAK,KAAK,IAAI,CAAC,4BAA4B;AAAA,IACrE,OAAO;AAEL,UAAI,CAACF,YAAW,YAAY,GAAG;AAC7B,gBAAQ,MAAM,4BAA4B;AAC1C,gBAAQ,IAAI,wDAAwD;AACpE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM;AACN,cAAQ,IAAI,YAAY,KAAK,KAAK,IAAI,CAAC,4BAA4B;AAAA,IACrE;AAEA,UAAM,MAAM,gBAAgB,KAAK,KAAK,GAAG;AACzC,aAAS,KAAK,EAAE,OAAO,WAAW,IAAI,CAAC;AAEvC,QAAI,SAAS;AACX,cAAQ,IAAI,+BAA0B,KAAK,KAAK,IAAI,CAAC,UAAU;AAAA,IACjE,OAAO;AACL,cAAQ,IAAI,+BAA0B,KAAK,KAAK,IAAI,CAAC,4BAA4B;AAAA,IACnF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B;AACzC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,oBAAoB;AAE3B,MAAI,CAACA,YAAW,YAAY,GAAG;AAC7B,IAAAG,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7C;AAGA,MAAI,CAACH,YAAW,YAAY,GAAG;AAC7B,UAAM,qBAAqB;AAAA,MACzB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAe;AAAA,MACf,WAAW;AAAA,MACX,mBAAmB;AAAA,QACjB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,oCAAoC;AAAA,QACpC,6BAA6B;AAAA,QAC7B,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,MACA,gBAAgB;AAAA,QACd,UAAU;AAAA,MACZ;AAAA,IACF;AACA,IAAAI,eAAc,cAAc,KAAK,UAAU,oBAAoB,MAAM,CAAC,CAAC;AACvE,YAAQ,IAAI,kCAAkC;AAAA,EAChD;AACF;AAGA,SAAS,wBAAwB;AAC/B,oBAAkB;AAGlB,QAAM,SAASR,MAAK,cAAc,KAAK;AACvC,MAAI,CAACI,YAAW,MAAM,GAAG;AACvB,IAAAG,WAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AAEA,MAAI,CAACH,YAAW,cAAc,GAAG;AAC/B,UAAM,UAAUJ,MAAK,QAAQ,cAAc;AAC3C,UAAM,WAAW;AAAA;AAAA;AAAA,eAGN,OAAO;AAAA;AAAA,YAEV,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAQLA,MAAK,cAAc,eAAe,CAAC;AAAA,iBACrCA,MAAK,cAAc,aAAa,CAAC;AAAA,iBACjCA,MAAK,cAAc,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnD,IAAAQ,eAAc,gBAAgB,QAAQ;AACtC,YAAQ,IAAI,6BAA6B,cAAc,EAAE;AAAA,EAC3D;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,QAAe;AAC3B,UAAQ,MAAM,qBAAqB,GAAG;AACtC,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,SAAS,YAAY;AACnB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA0Db;AACD;AAEA,SAAS,eAAe;AAEtB,QAAM,cAAcF,cAAaN,MAAK,WAAW,iBAAiB,GAAG,OAAO;AAC5E,QAAM,EAAE,QAAQ,IAAI,KAAK,MAAM,WAAW;AAC1C,UAAQ,IAAI,iBAAiB,OAAO,EAAE;AACxC;","names":["data","Receiver","Sender","net","tls","createHash","URL","Receiver","Sender","WebSocket","key","WebSocket","createWebSocketStream","err","protocol","createHash","WebSocket","WebSocketServer","server","fs","os","e","resolve","token","password","username","data","p","path","path","fs","fs","path","os","path","os","fs","fs","path","resolve","src_default","path","fs","resolve","src_default","fs","path","net","tls","crypto","resolve","idx","src_default","noopLogger","resolve","WebSocketServer","src_default","WebSocket","path","fs","os","path","fs","path","fs","os","bak","fs","path","os","fs","path","os","fs","path","os","update","remove","create","save","read","src_default","vm","src_default","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","src_default","resolve","join","homedir","resolve","err","existsSync","spawn","readFileSync","mkdirSync","writeFileSync"]}