From b7c9a0e3869185e41ab4bf82baf95a42232afb86 Mon Sep 17 00:00:00 2001 From: Alex Clark Date: Wed, 20 Jul 2022 15:58:49 -0400 Subject: [PATCH 1/2] Refactor for webpack/ES6 modules --- .gitignore | 6 +- .vscode/tasks.json | 13 +- app/index.html | 6 +- app/mixtures-electron.js | 1448 ++++++++++++++++++++++++++++ app/mixtures-web.js | 1197 +++++++++++++++++++++++ app/webdemo.html | 22 +- dist/index-electron.ts | 8 + dist/index-web.ts | 35 + package.json | 10 +- src/baselib.ts | 34 - src/cmdline/Console.ts | 17 +- src/cmdline/RenderHTML.ts | 16 +- src/cmdline/TableExtract.ts | 42 +- src/cmdline/TransformMixtures.ts | 21 +- src/data/Mixfile.ts | 92 -- src/data/Mixture.ts | 6 +- src/data/MixtureCollection.ts | 5 +- src/data/NormMixture.ts | 33 +- src/data/Units.ts | 6 +- src/lookup/ExtractCTABComponent.ts | 32 +- src/lookup/LookupCompoundDialog.ts | 31 +- src/lookup/PubChemSearch.ts | 18 +- src/main/CollectionPanel.ts | 36 +- src/main/InChI.ts | 13 +- src/main/MainPanel.ts | 5 +- src/main/MenuBanner.ts | 18 +- src/main/MixturePanel.ts | 50 +- src/mixture/ArrangeMixture.ts | 69 +- src/mixture/DrawMixture.ts | 19 +- src/mixture/EditComponent.ts | 47 +- src/mixture/EditMixture.ts | 70 +- src/mixture/ExportMInChI.ts | 18 +- src/mixture/ExportSDFile.ts | 30 +- src/mixture/ImportSDFile.ts | 19 +- src/mixture/KeyValueWidget.ts | 7 +- src/mixture/MetadataWidget.ts | 37 +- src/mixture/SquarePacking.ts | 18 +- src/startup.ts | 43 +- src/web/EditMixtureWeb.ts | 24 +- src/web/WebWidget.ts | 65 +- tsconfig.json | 19 +- webpack-electron.config.js | 30 + webpack-web.config.js | 30 + wmk | 1 + 44 files changed, 3282 insertions(+), 484 deletions(-) create mode 100644 app/mixtures-electron.js create mode 100644 app/mixtures-web.js create mode 100644 dist/index-electron.ts create mode 100644 dist/index-web.ts delete mode 100644 src/baselib.ts create mode 100644 webpack-electron.config.js create mode 100644 webpack-web.config.js create mode 120000 wmk diff --git a/.gitignore b/.gitignore index f64d5c3..bcf4259 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ **/.DS_Store node_modules deprecated -dist package-lock.json -app/mixfile.js* +dist/wmk +dist/src +dist/work +dist/cdd diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 342340b..1db52b8 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,20 +1,17 @@ { +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { - "label": "build", - "type": "typescript", - "tsconfig": "tsconfig.json", - "problemMatcher": - [ - "$tsc" - ], + "type": "npm", + "script": "build", "group": { "kind": "build", "isDefault": true - } + } } ] } \ No newline at end of file diff --git a/app/index.html b/app/index.html index 88d0355..96fd299 100644 --- a/app/index.html +++ b/app/index.html @@ -6,15 +6,17 @@ - + -
+
diff --git a/app/mixtures-electron.js b/app/mixtures-electron.js new file mode 100644 index 0000000..795f302 --- /dev/null +++ b/app/mixtures-electron.js @@ -0,0 +1,1448 @@ +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +var Mixtures; +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/@electron/remote/dist/src/common/get-electron-binding.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@electron/remote/dist/src/common/get-electron-binding.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; +eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.getElectronBinding = void 0;\nconst getElectronBinding = (name) => {\n if (process._linkedBinding) {\n return process._linkedBinding('electron_common_' + name);\n }\n else if (process.electronBinding) {\n return process.electronBinding(name);\n }\n else {\n return null;\n }\n};\nexports.getElectronBinding = getElectronBinding;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/@electron/remote/dist/src/common/get-electron-binding.js?"); + +/***/ }), + +/***/ "./node_modules/@electron/remote/dist/src/common/module-names.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@electron/remote/dist/src/common/module-names.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; +eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.browserModuleNames = exports.commonModuleNames = void 0;\nconst get_electron_binding_1 = __webpack_require__(/*! ./get-electron-binding */ \"./node_modules/@electron/remote/dist/src/common/get-electron-binding.js\");\nexports.commonModuleNames = [\n 'clipboard',\n 'nativeImage',\n 'shell',\n];\nexports.browserModuleNames = [\n 'app',\n 'autoUpdater',\n 'BaseWindow',\n 'BrowserView',\n 'BrowserWindow',\n 'contentTracing',\n 'crashReporter',\n 'dialog',\n 'globalShortcut',\n 'ipcMain',\n 'inAppPurchase',\n 'Menu',\n 'MenuItem',\n 'nativeTheme',\n 'net',\n 'netLog',\n 'MessageChannelMain',\n 'Notification',\n 'powerMonitor',\n 'powerSaveBlocker',\n 'protocol',\n 'screen',\n 'session',\n 'ShareMenu',\n 'systemPreferences',\n 'TopLevelWindow',\n 'TouchBar',\n 'Tray',\n 'View',\n 'webContents',\n 'WebContentsView',\n 'webFrameMain',\n].concat(exports.commonModuleNames);\nconst features = get_electron_binding_1.getElectronBinding('features');\nif (!features || features.isDesktopCapturerEnabled()) {\n exports.browserModuleNames.push('desktopCapturer');\n}\nif (!features || features.isViewApiEnabled()) {\n exports.browserModuleNames.push('ImageView');\n}\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/@electron/remote/dist/src/common/module-names.js?"); + +/***/ }), + +/***/ "./node_modules/@electron/remote/dist/src/common/type-utils.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@electron/remote/dist/src/common/type-utils.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; +eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.deserialize = exports.serialize = exports.isSerializableObject = exports.isPromise = void 0;\nconst electron_1 = __webpack_require__(/*! electron */ \"electron\");\nfunction isPromise(val) {\n return (val &&\n val.then &&\n val.then instanceof Function &&\n val.constructor &&\n val.constructor.reject &&\n val.constructor.reject instanceof Function &&\n val.constructor.resolve &&\n val.constructor.resolve instanceof Function);\n}\nexports.isPromise = isPromise;\nconst serializableTypes = [\n Boolean,\n Number,\n String,\n Date,\n Error,\n RegExp,\n ArrayBuffer\n];\n// https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#Supported_types\nfunction isSerializableObject(value) {\n return value === null || ArrayBuffer.isView(value) || serializableTypes.some(type => value instanceof type);\n}\nexports.isSerializableObject = isSerializableObject;\nconst objectMap = function (source, mapper) {\n const sourceEntries = Object.entries(source);\n const targetEntries = sourceEntries.map(([key, val]) => [key, mapper(val)]);\n return Object.fromEntries(targetEntries);\n};\nfunction serializeNativeImage(image) {\n const representations = [];\n const scaleFactors = image.getScaleFactors();\n // Use Buffer when there's only one representation for better perf.\n // This avoids compressing to/from PNG where it's not necessary to\n // ensure uniqueness of dataURLs (since there's only one).\n if (scaleFactors.length === 1) {\n const scaleFactor = scaleFactors[0];\n const size = image.getSize(scaleFactor);\n const buffer = image.toBitmap({ scaleFactor });\n representations.push({ scaleFactor, size, buffer });\n }\n else {\n // Construct from dataURLs to ensure that they are not lost in creation.\n for (const scaleFactor of scaleFactors) {\n const size = image.getSize(scaleFactor);\n const dataURL = image.toDataURL({ scaleFactor });\n representations.push({ scaleFactor, size, dataURL });\n }\n }\n return { __ELECTRON_SERIALIZED_NativeImage__: true, representations };\n}\nfunction deserializeNativeImage(value) {\n const image = electron_1.nativeImage.createEmpty();\n // Use Buffer when there's only one representation for better perf.\n // This avoids compressing to/from PNG where it's not necessary to\n // ensure uniqueness of dataURLs (since there's only one).\n if (value.representations.length === 1) {\n const { buffer, size, scaleFactor } = value.representations[0];\n const { width, height } = size;\n image.addRepresentation({ buffer, scaleFactor, width, height });\n }\n else {\n // Construct from dataURLs to ensure that they are not lost in creation.\n for (const rep of value.representations) {\n const { dataURL, size, scaleFactor } = rep;\n const { width, height } = size;\n image.addRepresentation({ dataURL, scaleFactor, width, height });\n }\n }\n return image;\n}\nfunction serialize(value) {\n if (value && value.constructor && value.constructor.name === 'NativeImage') {\n return serializeNativeImage(value);\n }\n if (Array.isArray(value)) {\n return value.map(serialize);\n }\n else if (isSerializableObject(value)) {\n return value;\n }\n else if (value instanceof Object) {\n return objectMap(value, serialize);\n }\n else {\n return value;\n }\n}\nexports.serialize = serialize;\nfunction deserialize(value) {\n if (value && value.__ELECTRON_SERIALIZED_NativeImage__) {\n return deserializeNativeImage(value);\n }\n else if (Array.isArray(value)) {\n return value.map(deserialize);\n }\n else if (isSerializableObject(value)) {\n return value;\n }\n else if (value instanceof Object) {\n return objectMap(value, deserialize);\n }\n else {\n return value;\n }\n}\nexports.deserialize = deserialize;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/@electron/remote/dist/src/common/type-utils.js?"); + +/***/ }), + +/***/ "./node_modules/@electron/remote/dist/src/renderer/callbacks-registry.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@electron/remote/dist/src/renderer/callbacks-registry.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; +eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.CallbacksRegistry = void 0;\nclass CallbacksRegistry {\n constructor() {\n this.nextId = 0;\n this.callbacks = {};\n this.callbackIds = new WeakMap();\n this.locationInfo = new WeakMap();\n }\n add(callback) {\n // The callback is already added.\n let id = this.callbackIds.get(callback);\n if (id != null)\n return id;\n id = this.nextId += 1;\n this.callbacks[id] = callback;\n this.callbackIds.set(callback, id);\n // Capture the location of the function and put it in the ID string,\n // so that release errors can be tracked down easily.\n const regexp = /at (.*)/gi;\n const stackString = (new Error()).stack;\n if (!stackString)\n return id;\n let filenameAndLine;\n let match;\n while ((match = regexp.exec(stackString)) !== null) {\n const location = match[1];\n if (location.includes('(native)'))\n continue;\n if (location.includes('()'))\n continue;\n if (location.includes('callbacks-registry.js'))\n continue;\n if (location.includes('remote.js'))\n continue;\n if (location.includes('@electron/remote/dist'))\n continue;\n const ref = /([^/^)]*)\\)?$/gi.exec(location);\n if (ref)\n filenameAndLine = ref[1];\n break;\n }\n this.locationInfo.set(callback, filenameAndLine);\n return id;\n }\n get(id) {\n return this.callbacks[id] || function () { };\n }\n getLocation(callback) {\n return this.locationInfo.get(callback);\n }\n apply(id, ...args) {\n return this.get(id).apply(global, ...args);\n }\n remove(id) {\n const callback = this.callbacks[id];\n if (callback) {\n this.callbackIds.delete(callback);\n delete this.callbacks[id];\n }\n }\n}\nexports.CallbacksRegistry = CallbacksRegistry;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/@electron/remote/dist/src/renderer/callbacks-registry.js?"); + +/***/ }), + +/***/ "./node_modules/@electron/remote/dist/src/renderer/index.js": +/*!******************************************************************!*\ + !*** ./node_modules/@electron/remote/dist/src/renderer/index.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; +eval("\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nif (process.type === 'browser')\n throw new Error(`\"@electron/remote\" cannot be required in the browser process. Instead require(\"@electron/remote/main\").`);\n__exportStar(__webpack_require__(/*! ./remote */ \"./node_modules/@electron/remote/dist/src/renderer/remote.js\"), exports);\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/@electron/remote/dist/src/renderer/index.js?"); + +/***/ }), + +/***/ "./node_modules/@electron/remote/dist/src/renderer/remote.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@electron/remote/dist/src/renderer/remote.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; +eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.createFunctionWithReturnValue = exports.getGlobal = exports.getCurrentWebContents = exports.getCurrentWindow = exports.getBuiltin = void 0;\nconst callbacks_registry_1 = __webpack_require__(/*! ./callbacks-registry */ \"./node_modules/@electron/remote/dist/src/renderer/callbacks-registry.js\");\nconst type_utils_1 = __webpack_require__(/*! ../common/type-utils */ \"./node_modules/@electron/remote/dist/src/common/type-utils.js\");\nconst electron_1 = __webpack_require__(/*! electron */ \"electron\");\nconst module_names_1 = __webpack_require__(/*! ../common/module-names */ \"./node_modules/@electron/remote/dist/src/common/module-names.js\");\nconst get_electron_binding_1 = __webpack_require__(/*! ../common/get-electron-binding */ \"./node_modules/@electron/remote/dist/src/common/get-electron-binding.js\");\nconst callbacksRegistry = new callbacks_registry_1.CallbacksRegistry();\nconst remoteObjectCache = new Map();\nconst finalizationRegistry = new FinalizationRegistry((id) => {\n const ref = remoteObjectCache.get(id);\n if (ref !== undefined && ref.deref() === undefined) {\n remoteObjectCache.delete(id);\n electron_1.ipcRenderer.send(\"REMOTE_BROWSER_DEREFERENCE\" /* BROWSER_DEREFERENCE */, contextId, id, 0);\n }\n});\nconst electronIds = new WeakMap();\nconst isReturnValue = new WeakSet();\nfunction getCachedRemoteObject(id) {\n const ref = remoteObjectCache.get(id);\n if (ref !== undefined) {\n const deref = ref.deref();\n if (deref !== undefined)\n return deref;\n }\n}\nfunction setCachedRemoteObject(id, value) {\n const wr = new WeakRef(value);\n remoteObjectCache.set(id, wr);\n finalizationRegistry.register(value, id);\n return value;\n}\nfunction getContextId() {\n const v8Util = get_electron_binding_1.getElectronBinding('v8_util');\n if (v8Util) {\n return v8Util.getHiddenValue(global, 'contextId');\n }\n else {\n throw new Error('Electron >=v13.0.0-beta.6 required to support sandboxed renderers');\n }\n}\n// An unique ID that can represent current context.\nconst contextId = process.contextId || getContextId();\n// Notify the main process when current context is going to be released.\n// Note that when the renderer process is destroyed, the message may not be\n// sent, we also listen to the \"render-view-deleted\" event in the main process\n// to guard that situation.\nprocess.on('exit', () => {\n const command = \"REMOTE_BROWSER_CONTEXT_RELEASE\" /* BROWSER_CONTEXT_RELEASE */;\n electron_1.ipcRenderer.send(command, contextId);\n});\nconst IS_REMOTE_PROXY = Symbol('is-remote-proxy');\n// Convert the arguments object into an array of meta data.\nfunction wrapArgs(args, visited = new Set()) {\n const valueToMeta = (value) => {\n // Check for circular reference.\n if (visited.has(value)) {\n return {\n type: 'value',\n value: null\n };\n }\n if (value && value.constructor && value.constructor.name === 'NativeImage') {\n return { type: 'nativeimage', value: type_utils_1.serialize(value) };\n }\n else if (Array.isArray(value)) {\n visited.add(value);\n const meta = {\n type: 'array',\n value: wrapArgs(value, visited)\n };\n visited.delete(value);\n return meta;\n }\n else if (value instanceof Buffer) {\n return {\n type: 'buffer',\n value\n };\n }\n else if (type_utils_1.isSerializableObject(value)) {\n return {\n type: 'value',\n value\n };\n }\n else if (typeof value === 'object') {\n if (type_utils_1.isPromise(value)) {\n return {\n type: 'promise',\n then: valueToMeta(function (onFulfilled, onRejected) {\n value.then(onFulfilled, onRejected);\n })\n };\n }\n else if (electronIds.has(value)) {\n return {\n type: 'remote-object',\n id: electronIds.get(value)\n };\n }\n const meta = {\n type: 'object',\n name: value.constructor ? value.constructor.name : '',\n members: []\n };\n visited.add(value);\n for (const prop in value) { // eslint-disable-line guard-for-in\n meta.members.push({\n name: prop,\n value: valueToMeta(value[prop])\n });\n }\n visited.delete(value);\n return meta;\n }\n else if (typeof value === 'function' && isReturnValue.has(value)) {\n return {\n type: 'function-with-return-value',\n value: valueToMeta(value())\n };\n }\n else if (typeof value === 'function') {\n return {\n type: 'function',\n id: callbacksRegistry.add(value),\n location: callbacksRegistry.getLocation(value),\n length: value.length\n };\n }\n else {\n return {\n type: 'value',\n value\n };\n }\n };\n return args.map(valueToMeta);\n}\n// Populate object's members from descriptors.\n// The |ref| will be kept referenced by |members|.\n// This matches |getObjectMemebers| in rpc-server.\nfunction setObjectMembers(ref, object, metaId, members) {\n if (!Array.isArray(members))\n return;\n for (const member of members) {\n if (Object.prototype.hasOwnProperty.call(object, member.name))\n continue;\n const descriptor = { enumerable: member.enumerable };\n if (member.type === 'method') {\n const remoteMemberFunction = function (...args) {\n let command;\n if (this && this.constructor === remoteMemberFunction) {\n command = \"REMOTE_BROWSER_MEMBER_CONSTRUCTOR\" /* BROWSER_MEMBER_CONSTRUCTOR */;\n }\n else {\n command = \"REMOTE_BROWSER_MEMBER_CALL\" /* BROWSER_MEMBER_CALL */;\n }\n const ret = electron_1.ipcRenderer.sendSync(command, contextId, metaId, member.name, wrapArgs(args));\n return metaToValue(ret);\n };\n let descriptorFunction = proxyFunctionProperties(remoteMemberFunction, metaId, member.name);\n descriptor.get = () => {\n descriptorFunction.ref = ref; // The member should reference its object.\n return descriptorFunction;\n };\n // Enable monkey-patch the method\n descriptor.set = (value) => {\n descriptorFunction = value;\n return value;\n };\n descriptor.configurable = true;\n }\n else if (member.type === 'get') {\n descriptor.get = () => {\n const command = \"REMOTE_BROWSER_MEMBER_GET\" /* BROWSER_MEMBER_GET */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, metaId, member.name);\n return metaToValue(meta);\n };\n if (member.writable) {\n descriptor.set = (value) => {\n const args = wrapArgs([value]);\n const command = \"REMOTE_BROWSER_MEMBER_SET\" /* BROWSER_MEMBER_SET */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, metaId, member.name, args);\n if (meta != null)\n metaToValue(meta);\n return value;\n };\n }\n }\n Object.defineProperty(object, member.name, descriptor);\n }\n}\n// Populate object's prototype from descriptor.\n// This matches |getObjectPrototype| in rpc-server.\nfunction setObjectPrototype(ref, object, metaId, descriptor) {\n if (descriptor === null)\n return;\n const proto = {};\n setObjectMembers(ref, proto, metaId, descriptor.members);\n setObjectPrototype(ref, proto, metaId, descriptor.proto);\n Object.setPrototypeOf(object, proto);\n}\n// Wrap function in Proxy for accessing remote properties\nfunction proxyFunctionProperties(remoteMemberFunction, metaId, name) {\n let loaded = false;\n // Lazily load function properties\n const loadRemoteProperties = () => {\n if (loaded)\n return;\n loaded = true;\n const command = \"REMOTE_BROWSER_MEMBER_GET\" /* BROWSER_MEMBER_GET */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, metaId, name);\n setObjectMembers(remoteMemberFunction, remoteMemberFunction, meta.id, meta.members);\n };\n return new Proxy(remoteMemberFunction, {\n set: (target, property, value) => {\n if (property !== 'ref')\n loadRemoteProperties();\n target[property] = value;\n return true;\n },\n get: (target, property) => {\n if (property === IS_REMOTE_PROXY)\n return true;\n if (!Object.prototype.hasOwnProperty.call(target, property))\n loadRemoteProperties();\n const value = target[property];\n if (property === 'toString' && typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n },\n ownKeys: (target) => {\n loadRemoteProperties();\n return Object.getOwnPropertyNames(target);\n },\n getOwnPropertyDescriptor: (target, property) => {\n const descriptor = Object.getOwnPropertyDescriptor(target, property);\n if (descriptor)\n return descriptor;\n loadRemoteProperties();\n return Object.getOwnPropertyDescriptor(target, property);\n }\n });\n}\n// Convert meta data from browser into real value.\nfunction metaToValue(meta) {\n if (meta.type === 'value') {\n return meta.value;\n }\n else if (meta.type === 'array') {\n return meta.members.map((member) => metaToValue(member));\n }\n else if (meta.type === 'nativeimage') {\n return type_utils_1.deserialize(meta.value);\n }\n else if (meta.type === 'buffer') {\n return Buffer.from(meta.value.buffer, meta.value.byteOffset, meta.value.byteLength);\n }\n else if (meta.type === 'promise') {\n return Promise.resolve({ then: metaToValue(meta.then) });\n }\n else if (meta.type === 'error') {\n return metaToError(meta);\n }\n else if (meta.type === 'exception') {\n if (meta.value.type === 'error') {\n throw metaToError(meta.value);\n }\n else {\n throw new Error(`Unexpected value type in exception: ${meta.value.type}`);\n }\n }\n else {\n let ret;\n if ('id' in meta) {\n const cached = getCachedRemoteObject(meta.id);\n if (cached !== undefined) {\n return cached;\n }\n }\n // A shadow class to represent the remote function object.\n if (meta.type === 'function') {\n const remoteFunction = function (...args) {\n let command;\n if (this && this.constructor === remoteFunction) {\n command = \"REMOTE_BROWSER_CONSTRUCTOR\" /* BROWSER_CONSTRUCTOR */;\n }\n else {\n command = \"REMOTE_BROWSER_FUNCTION_CALL\" /* BROWSER_FUNCTION_CALL */;\n }\n const obj = electron_1.ipcRenderer.sendSync(command, contextId, meta.id, wrapArgs(args));\n return metaToValue(obj);\n };\n ret = remoteFunction;\n }\n else {\n ret = {};\n }\n setObjectMembers(ret, ret, meta.id, meta.members);\n setObjectPrototype(ret, ret, meta.id, meta.proto);\n if (ret.constructor && ret.constructor[IS_REMOTE_PROXY]) {\n Object.defineProperty(ret.constructor, 'name', { value: meta.name });\n }\n // Track delegate obj's lifetime & tell browser to clean up when object is GCed.\n electronIds.set(ret, meta.id);\n setCachedRemoteObject(meta.id, ret);\n return ret;\n }\n}\nfunction metaToError(meta) {\n const obj = meta.value;\n for (const { name, value } of meta.members) {\n obj[name] = metaToValue(value);\n }\n return obj;\n}\nfunction handleMessage(channel, handler) {\n electron_1.ipcRenderer.on(channel, (event, passedContextId, id, ...args) => {\n if (event.senderId !== 0) {\n console.error(`Message ${channel} sent by unexpected WebContents (${event.senderId})`);\n return;\n }\n if (passedContextId === contextId) {\n handler(id, ...args);\n }\n else {\n // Message sent to an un-exist context, notify the error to main process.\n electron_1.ipcRenderer.send(\"REMOTE_BROWSER_WRONG_CONTEXT_ERROR\" /* BROWSER_WRONG_CONTEXT_ERROR */, contextId, passedContextId, id);\n }\n });\n}\nconst enableStacks = process.argv.includes('--enable-api-filtering-logging');\nfunction getCurrentStack() {\n const target = { stack: undefined };\n if (enableStacks) {\n Error.captureStackTrace(target, getCurrentStack);\n }\n return target.stack;\n}\n// Browser calls a callback in renderer.\nhandleMessage(\"REMOTE_RENDERER_CALLBACK\" /* RENDERER_CALLBACK */, (id, args) => {\n callbacksRegistry.apply(id, metaToValue(args));\n});\n// A callback in browser is released.\nhandleMessage(\"REMOTE_RENDERER_RELEASE_CALLBACK\" /* RENDERER_RELEASE_CALLBACK */, (id) => {\n callbacksRegistry.remove(id);\n});\nexports.require = (module) => {\n const command = \"REMOTE_BROWSER_REQUIRE\" /* BROWSER_REQUIRE */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, module, getCurrentStack());\n return metaToValue(meta);\n};\n// Alias to remote.require('electron').xxx.\nfunction getBuiltin(module) {\n const command = \"REMOTE_BROWSER_GET_BUILTIN\" /* BROWSER_GET_BUILTIN */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, module, getCurrentStack());\n return metaToValue(meta);\n}\nexports.getBuiltin = getBuiltin;\nfunction getCurrentWindow() {\n const command = \"REMOTE_BROWSER_GET_CURRENT_WINDOW\" /* BROWSER_GET_CURRENT_WINDOW */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, getCurrentStack());\n return metaToValue(meta);\n}\nexports.getCurrentWindow = getCurrentWindow;\n// Get current WebContents object.\nfunction getCurrentWebContents() {\n const command = \"REMOTE_BROWSER_GET_CURRENT_WEB_CONTENTS\" /* BROWSER_GET_CURRENT_WEB_CONTENTS */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, getCurrentStack());\n return metaToValue(meta);\n}\nexports.getCurrentWebContents = getCurrentWebContents;\n// Get a global object in browser.\nfunction getGlobal(name) {\n const command = \"REMOTE_BROWSER_GET_GLOBAL\" /* BROWSER_GET_GLOBAL */;\n const meta = electron_1.ipcRenderer.sendSync(command, contextId, name, getCurrentStack());\n return metaToValue(meta);\n}\nexports.getGlobal = getGlobal;\n// Get the process object in browser.\nObject.defineProperty(exports, \"process\", ({\n enumerable: true,\n get: () => exports.getGlobal('process')\n}));\n// Create a function that will return the specified value when called in browser.\nfunction createFunctionWithReturnValue(returnValue) {\n const func = () => returnValue;\n isReturnValue.add(func);\n return func;\n}\nexports.createFunctionWithReturnValue = createFunctionWithReturnValue;\nconst addBuiltinProperty = (name) => {\n Object.defineProperty(exports, name, {\n enumerable: true,\n get: () => exports.getBuiltin(name)\n });\n};\nmodule_names_1.browserModuleNames\n .forEach(addBuiltinProperty);\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/@electron/remote/dist/src/renderer/remote.js?"); + +/***/ }), + +/***/ "./node_modules/@electron/remote/renderer/index.js": +/*!*********************************************************!*\ + !*** ./node_modules/@electron/remote/renderer/index.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +eval("module.exports = __webpack_require__(/*! ../dist/src/renderer */ \"./node_modules/@electron/remote/dist/src/renderer/index.js\")\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/@electron/remote/renderer/index.js?"); + +/***/ }), + +/***/ "./node_modules/stream-chain/index.js": +/*!********************************************!*\ + !*** ./node_modules/stream-chain/index.js ***! + \********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +eval("\n\nconst {Readable, Writable, Duplex, Transform} = __webpack_require__(/*! stream */ \"stream\");\n\nconst none = Symbol.for('object-stream.none');\nconst finalSymbol = Symbol.for('object-stream.final');\nconst manySymbol = Symbol.for('object-stream.many');\n\nconst final = value => ({[finalSymbol]: value});\nconst many = values => ({[manySymbol]: values});\n\nconst isFinal = o => o && typeof o == 'object' && finalSymbol in o;\nconst isMany = o => o && typeof o == 'object' && manySymbol in o;\n\nconst getFinalValue = o => o[finalSymbol];\nconst getManyValues = o => o[manySymbol];\n\nconst runAsyncGenerator = async (gen, stream) => {\n for (;;) {\n let data = gen.next();\n if (data && typeof data.then == 'function') {\n data = await data;\n }\n if (data.done) break;\n let value = data.value;\n if (value && typeof value.then == 'function') {\n value = await value;\n }\n Chain.sanitize(value, stream);\n }\n};\n\nconst wrapFunction = fn =>\n new Transform({\n writableObjectMode: true,\n readableObjectMode: true,\n transform(chunk, encoding, callback) {\n try {\n const result = fn.call(this, chunk, encoding);\n if (result && typeof result.then == 'function') {\n // thenable\n result.then(result => (Chain.sanitize(result, this), callback(null)), error => callback(error));\n return;\n }\n if (result && typeof result.next == 'function') {\n // generator\n runAsyncGenerator(result, this).then(() => callback(null), error => callback(error));\n return;\n }\n Chain.sanitize(result, this);\n callback(null);\n } catch (error) {\n callback(error);\n }\n }\n });\n\nconst wrapArray = fns =>\n new Transform({\n writableObjectMode: true,\n readableObjectMode: true,\n transform(chunk, encoding, callback) {\n try {\n let value = chunk;\n for (let i = 0; i < fns.length; ++i) {\n const result = fns[i].call(this, value, encoding);\n if (result === Chain.none) {\n callback(null);\n return;\n }\n if (Chain.isFinal(result)) {\n value = Chain.getFinalValue(result);\n break;\n }\n value = result;\n }\n Chain.sanitize(value, this);\n callback(null);\n } catch (error) {\n callback(error);\n }\n }\n });\n\nclass Chain extends Duplex {\n constructor(fns, options) {\n super(options || {writableObjectMode: true, readableObjectMode: true});\n\n if (!(fns instanceof Array) || !fns.length) {\n throw Error(\"Chain's argument should be a non-empty array.\");\n }\n\n this.streams = fns\n .filter(fn => fn)\n .map((fn, index, fns) => {\n if (typeof fn === 'function' || fn instanceof Array) return Chain.convertToTransform(fn);\n if (\n fn instanceof Duplex ||\n fn instanceof Transform ||\n (!index && fn instanceof Readable) ||\n (index === fns.length - 1 && fn instanceof Writable)\n ) {\n return fn;\n }\n throw Error('Arguments should be functions, arrays or streams.');\n })\n .filter(s => s);\n this.input = this.streams[0];\n this.output = this.streams.reduce((output, stream) => (output && output.pipe(stream)) || stream);\n\n if (!(this.input instanceof Writable)) {\n this._write = (_1, _2, callback) => callback(null);\n this._final = callback => callback(null); // unavailable in Node 6\n this.input.on('end', () => this.end());\n }\n\n if (this.output instanceof Readable) {\n this.output.on('data', chunk => !this.push(chunk) && this.output.pause());\n this.output.on('end', () => this.push(null));\n } else {\n this._read = () => {}; // nop\n this.resume();\n this.output.on('finish', () => this.push(null));\n }\n\n // connect events\n if (!options || !options.skipEvents) {\n this.streams.forEach(stream => stream.on('error', error => this.emit('error', error)));\n }\n }\n _write(chunk, encoding, callback) {\n let error = null;\n try {\n this.input.write(chunk, encoding, e => callback(e || error));\n } catch (e) {\n error = e;\n }\n }\n _final(callback) {\n let error = null;\n try {\n this.input.end(null, null, e => callback(e || error));\n } catch (e) {\n error = e;\n }\n }\n _read() {\n this.output.resume();\n }\n static make(fns, options) {\n return new Chain(fns, options);\n }\n static sanitize(result, stream) {\n if (Chain.isFinal(result)) {\n result = Chain.getFinalValue(result);\n } else if (Chain.isMany(result)) {\n result = Chain.getManyValues(result);\n }\n if (result !== undefined && result !== null && result !== Chain.none) {\n if (result instanceof Array) {\n result.forEach(value => value !== undefined && value !== null && stream.push(value));\n } else {\n stream.push(result);\n }\n }\n }\n static convertToTransform(fn) {\n if (typeof fn === 'function') return wrapFunction(fn);\n if (fn instanceof Array) return fn.length ? wrapArray(fn) : null;\n return null;\n }\n}\n\nChain.none = none;\nChain.final = final;\nChain.isFinal = isFinal;\nChain.getFinalValue = getFinalValue;\nChain.many = many;\nChain.isMany = isMany;\nChain.getManyValues = getManyValues;\n\nChain.chain = Chain.make;\nChain.make.Constructor = Chain;\n\nmodule.exports = Chain;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/stream-chain/index.js?"); + +/***/ }), + +/***/ "./node_modules/stream-json/Assembler.js": +/*!***********************************************!*\ + !*** ./node_modules/stream-json/Assembler.js ***! + \***********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +eval("\n\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\n\nconst startObject = Ctr =>\n function () {\n if (this.done) {\n this.done = false;\n } else {\n this.stack.push(this.current, this.key);\n }\n this.current = new Ctr();\n this.key = null;\n };\n\nclass Assembler extends EventEmitter {\n static connectTo(stream, options) {\n return new Assembler(options).connectTo(stream);\n }\n\n constructor(options) {\n super();\n this.stack = [];\n this.current = this.key = null;\n this.done = true;\n if (options) {\n this.reviver = typeof options.reviver == 'function' && options.reviver;\n if (this.reviver) {\n this.stringValue = this._saveValue = this._saveValueWithReviver;\n }\n }\n }\n\n connectTo(stream) {\n stream.on('data', chunk => {\n if (this[chunk.name]) {\n this[chunk.name](chunk.value);\n if (this.done) this.emit('done', this);\n }\n });\n return this;\n }\n\n get depth() {\n return (this.stack.length >> 1) + (this.done ? 0 : 1);\n }\n\n get path() {\n const path = [];\n for (let i = 0; i < this.stack.length; i += 2) {\n const key = this.stack[i + 1];\n path.push(key === null ? this.stack[i].length : key);\n }\n return path;\n }\n\n dropToLevel(level) {\n if (level < this.depth) {\n if (level) {\n const index = (level - 1) << 1;\n this.current = this.stack[index];\n this.key = this.stack[index + 1];\n this.stack.splice(index);\n } else {\n this.stack = [];\n this.current = this.key = null;\n this.done = true;\n }\n }\n return this;\n }\n\n consume(chunk) {\n this[chunk.name] && this[chunk.name](chunk.value);\n return this;\n }\n\n keyValue(value) {\n this.key = value;\n }\n\n //stringValue() - aliased below to _saveValue()\n\n numberValue(value) {\n this._saveValue(parseFloat(value));\n }\n nullValue() {\n this._saveValue(null);\n }\n trueValue() {\n this._saveValue(true);\n }\n falseValue() {\n this._saveValue(false);\n }\n\n //startObject() - assigned below\n\n endObject() {\n if (this.stack.length) {\n const value = this.current;\n this.key = this.stack.pop();\n this.current = this.stack.pop();\n this._saveValue(value);\n } else {\n this.done = true;\n }\n }\n\n //startArray() - assigned below\n //endArray() - aliased below to endObject()\n\n _saveValue(value) {\n if (this.done) {\n this.current = value;\n } else {\n if (this.current instanceof Array) {\n this.current.push(value);\n } else {\n this.current[this.key] = value;\n this.key = null;\n }\n }\n }\n _saveValueWithReviver(value) {\n if (this.done) {\n this.current = this.reviver('', value);\n } else {\n if (this.current instanceof Array) {\n value = this.reviver('' + this.current.length, value);\n this.current.push(value);\n if (value === undefined) {\n delete this.current[this.current.length - 1];\n }\n } else {\n value = this.reviver(this.key, value);\n if (value !== undefined) {\n this.current[this.key] = value;\n }\n this.key = null;\n }\n }\n }\n}\n\nAssembler.prototype.stringValue = Assembler.prototype._saveValue;\nAssembler.prototype.startObject = startObject(Object);\nAssembler.prototype.startArray = startObject(Array);\nAssembler.prototype.endArray = Assembler.prototype.endObject;\n\nmodule.exports = Assembler;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/stream-json/Assembler.js?"); + +/***/ }), + +/***/ "./node_modules/stream-json/Parser.js": +/*!********************************************!*\ + !*** ./node_modules/stream-json/Parser.js ***! + \********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +eval("\n\nconst Utf8Stream = __webpack_require__(/*! ./utils/Utf8Stream */ \"./node_modules/stream-json/utils/Utf8Stream.js\");\n\nconst patterns = {\n value1: /^(?:[\\\"\\{\\[\\]\\-\\d]|true\\b|false\\b|null\\b|\\s{1,256})/,\n string: /^(?:[^\\\"\\\\]{1,256}|\\\\[bfnrt\\\"\\\\\\/]|\\\\u[\\da-fA-F]{4}|\\\")/,\n key1: /^(?:[\\\"\\}]|\\s{1,256})/,\n colon: /^(?:\\:|\\s{1,256})/,\n comma: /^(?:[\\,\\]\\}]|\\s{1,256})/,\n ws: /^\\s{1,256}/,\n numberStart: /^\\d/,\n numberDigit: /^\\d{0,256}/,\n numberFraction: /^[\\.eE]/,\n numberExponent: /^[eE]/,\n numberExpSign: /^[-+]/\n};\nconst MAX_PATTERN_SIZE = 16;\n\nlet noSticky = true;\ntry {\n new RegExp('.', 'y');\n noSticky = false;\n} catch (e) {\n // suppress\n}\n\n!noSticky &&\n Object.keys(patterns).forEach(key => {\n let src = patterns[key].source.slice(1); // lop off ^\n if (src.slice(0, 3) === '(?:' && src.slice(-1) === ')') {\n src = src.slice(3, -1);\n }\n patterns[key] = new RegExp(src, 'y');\n });\n\npatterns.numberFracStart = patterns.numberExpStart = patterns.numberStart;\npatterns.numberFracDigit = patterns.numberExpDigit = patterns.numberDigit;\n\nconst values = {true: true, false: false, null: null},\n expected = {object: 'objectStop', array: 'arrayStop', '': 'done'};\n\n// long hexadecimal codes: \\uXXXX\nconst fromHex = s => String.fromCharCode(parseInt(s.slice(2), 16));\n\n// short codes: \\b \\f \\n \\r \\t \\\" \\\\ \\/\nconst codes = {b: '\\b', f: '\\f', n: '\\n', r: '\\r', t: '\\t', '\"': '\"', '\\\\': '\\\\', '/': '/'};\n\nclass Parser extends Utf8Stream {\n static make(options) {\n return new Parser(options);\n }\n\n constructor(options) {\n super(Object.assign({}, options, {readableObjectMode: true}));\n\n this._packKeys = this._packStrings = this._packNumbers = this._streamKeys = this._streamStrings = this._streamNumbers = true;\n if (options) {\n 'packValues' in options && (this._packKeys = this._packStrings = this._packNumbers = options.packValues);\n 'packKeys' in options && (this._packKeys = options.packKeys);\n 'packStrings' in options && (this._packStrings = options.packStrings);\n 'packNumbers' in options && (this._packNumbers = options.packNumbers);\n 'streamValues' in options && (this._streamKeys = this._streamStrings = this._streamNumbers = options.streamValues);\n 'streamKeys' in options && (this._streamKeys = options.streamKeys);\n 'streamStrings' in options && (this._streamStrings = options.streamStrings);\n 'streamNumbers' in options && (this._streamNumbers = options.streamNumbers);\n this._jsonStreaming = options.jsonStreaming;\n }\n !this._packKeys && (this._streamKeys = true);\n !this._packStrings && (this._streamStrings = true);\n !this._packNumbers && (this._streamNumbers = true);\n\n this._done = false;\n this._expect = this._jsonStreaming ? 'done' : 'value';\n this._stack = [];\n this._parent = '';\n this._open_number = false;\n this._accumulator = '';\n }\n\n _flush(callback) {\n this._done = true;\n super._flush(error => {\n if (error) return callback(error);\n if (this._open_number) {\n if (this._streamNumbers) {\n this.push({name: 'endNumber'});\n }\n this._open_number = false;\n if (this._packNumbers) {\n this.push({name: 'numberValue', value: this._accumulator});\n this._accumulator = '';\n }\n }\n callback(null);\n });\n }\n\n _processBuffer(callback) {\n let match,\n value,\n index = 0;\n main: for (;;) {\n switch (this._expect) {\n case 'value1':\n case 'value':\n patterns.value1.lastIndex = index;\n match = patterns.value1.exec(this._buffer);\n if (!match) {\n if (this._done || index + MAX_PATTERN_SIZE < this._buffer.length) {\n if (index < this._buffer.length) return callback(new Error('Parser cannot parse input: expected a value'));\n return callback(new Error('Parser has expected a value'));\n }\n break main; // wait for more input\n }\n value = match[0];\n switch (value) {\n case '\"':\n this._streamStrings && this.push({name: 'startString'});\n this._expect = 'string';\n break;\n case '{':\n this.push({name: 'startObject'});\n this._stack.push(this._parent);\n this._parent = 'object';\n this._expect = 'key1';\n break;\n case '[':\n this.push({name: 'startArray'});\n this._stack.push(this._parent);\n this._parent = 'array';\n this._expect = 'value1';\n break;\n case ']':\n if (this._expect !== 'value1') return callback(new Error(\"Parser cannot parse input: unexpected token ']'\"));\n if (this._open_number) {\n this._streamNumbers && this.push({name: 'endNumber'});\n this._open_number = false;\n if (this._packNumbers) {\n this.push({name: 'numberValue', value: this._accumulator});\n this._accumulator = '';\n }\n }\n this.push({name: 'endArray'});\n this._parent = this._stack.pop();\n this._expect = expected[this._parent];\n break;\n case '-':\n this._open_number = true;\n if (this._streamNumbers) {\n this.push({name: 'startNumber'});\n this.push({name: 'numberChunk', value: '-'});\n }\n this._packNumbers && (this._accumulator = '-');\n this._expect = 'numberStart';\n break;\n case '0':\n this._open_number = true;\n if (this._streamNumbers) {\n this.push({name: 'startNumber'});\n this.push({name: 'numberChunk', value: '0'});\n }\n this._packNumbers && (this._accumulator = '0');\n this._expect = 'numberFraction';\n break;\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n this._open_number = true;\n if (this._streamNumbers) {\n this.push({name: 'startNumber'});\n this.push({name: 'numberChunk', value: value});\n }\n this._packNumbers && (this._accumulator = value);\n this._expect = 'numberDigit';\n break;\n case 'true':\n case 'false':\n case 'null':\n if (this._buffer.length - index === value.length && !this._done) break main; // wait for more input\n this.push({name: value + 'Value', value: values[value]});\n this._expect = expected[this._parent];\n break;\n // default: // ws\n }\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'keyVal':\n case 'string':\n patterns.string.lastIndex = index;\n match = patterns.string.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length && (this._done || this._buffer.length - index >= 6))\n return callback(new Error('Parser cannot parse input: escaped characters'));\n if (this._done) return callback(new Error('Parser has expected a string value'));\n break main; // wait for more input\n }\n value = match[0];\n if (value === '\"') {\n if (this._expect === 'keyVal') {\n this._streamKeys && this.push({name: 'endKey'});\n if (this._packKeys) {\n this.push({name: 'keyValue', value: this._accumulator});\n this._accumulator = '';\n }\n this._expect = 'colon';\n } else {\n this._streamStrings && this.push({name: 'endString'});\n if (this._packStrings) {\n this.push({name: 'stringValue', value: this._accumulator});\n this._accumulator = '';\n }\n this._expect = expected[this._parent];\n }\n } else if (value.length > 1 && value.charAt(0) === '\\\\') {\n const t = value.length == 2 ? codes[value.charAt(1)] : fromHex(value);\n if (this._expect === 'keyVal' ? this._streamKeys : this._streamStrings) {\n this.push({name: 'stringChunk', value: t});\n }\n if (this._expect === 'keyVal' ? this._packKeys : this._packStrings) {\n this._accumulator += t;\n }\n } else {\n if (this._expect === 'keyVal' ? this._streamKeys : this._streamStrings) {\n this.push({name: 'stringChunk', value: value});\n }\n if (this._expect === 'keyVal' ? this._packKeys : this._packStrings) {\n this._accumulator += value;\n }\n }\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'key1':\n case 'key':\n patterns.key1.lastIndex = index;\n match = patterns.key1.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) return callback(new Error('Parser cannot parse input: expected an object key'));\n break main; // wait for more input\n }\n value = match[0];\n if (value === '\"') {\n this._streamKeys && this.push({name: 'startKey'});\n this._expect = 'keyVal';\n } else if (value === '}') {\n if (this._expect !== 'key1') return callback(new Error(\"Parser cannot parse input: unexpected token '}'\"));\n this.push({name: 'endObject'});\n this._parent = this._stack.pop();\n this._expect = expected[this._parent];\n }\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'colon':\n patterns.colon.lastIndex = index;\n match = patterns.colon.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) return callback(new Error(\"Parser cannot parse input: expected ':'\"));\n break main; // wait for more input\n }\n value = match[0];\n value === ':' && (this._expect = 'value');\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'arrayStop':\n case 'objectStop':\n patterns.comma.lastIndex = index;\n match = patterns.comma.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) return callback(new Error(\"Parser cannot parse input: expected ','\"));\n break main; // wait for more input\n }\n if (this._open_number) {\n this._streamNumbers && this.push({name: 'endNumber'});\n this._open_number = false;\n if (this._packNumbers) {\n this.push({name: 'numberValue', value: this._accumulator});\n this._accumulator = '';\n }\n }\n value = match[0];\n if (value === ',') {\n this._expect = this._expect === 'arrayStop' ? 'value' : 'key';\n } else if (value === '}' || value === ']') {\n this.push({name: value === '}' ? 'endObject' : 'endArray'});\n this._parent = this._stack.pop();\n this._expect = expected[this._parent];\n }\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n // number chunks\n case 'numberStart': // [0-9]\n patterns.numberStart.lastIndex = index;\n match = patterns.numberStart.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) return callback(new Error('Parser cannot parse input: expected a starting digit'));\n break main; // wait for more input\n }\n value = match[0];\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n this._expect = value === '0' ? 'numberFraction' : 'numberDigit';\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'numberDigit': // [0-9]*\n patterns.numberDigit.lastIndex = index;\n match = patterns.numberDigit.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) return callback(new Error('Parser cannot parse input: expected a digit'));\n break main; // wait for more input\n }\n value = match[0];\n if (value) {\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n } else {\n if (index < this._buffer.length) {\n this._expect = 'numberFraction';\n break;\n }\n if (this._done) {\n this._expect = expected[this._parent];\n break;\n }\n break main; // wait for more input\n }\n break;\n case 'numberFraction': // [\\.eE]?\n patterns.numberFraction.lastIndex = index;\n match = patterns.numberFraction.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) {\n this._expect = expected[this._parent];\n break;\n }\n break main; // wait for more input\n }\n value = match[0];\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n this._expect = value === '.' ? 'numberFracStart' : 'numberExpSign';\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'numberFracStart': // [0-9]\n patterns.numberFracStart.lastIndex = index;\n match = patterns.numberFracStart.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) return callback(new Error('Parser cannot parse input: expected a fractional part of a number'));\n break main; // wait for more input\n }\n value = match[0];\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n this._expect = 'numberFracDigit';\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'numberFracDigit': // [0-9]*\n patterns.numberFracDigit.lastIndex = index;\n match = patterns.numberFracDigit.exec(this._buffer);\n value = match[0];\n if (value) {\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n } else {\n if (index < this._buffer.length) {\n this._expect = 'numberExponent';\n break;\n }\n if (this._done) {\n this._expect = expected[this._parent];\n break;\n }\n break main; // wait for more input\n }\n break;\n case 'numberExponent': // [eE]?\n patterns.numberExponent.lastIndex = index;\n match = patterns.numberExponent.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length) {\n this._expect = expected[this._parent];\n break;\n }\n if (this._done) {\n this._expect = 'done';\n break;\n }\n break main; // wait for more input\n }\n value = match[0];\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n this._expect = 'numberExpSign';\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'numberExpSign': // [-+]?\n patterns.numberExpSign.lastIndex = index;\n match = patterns.numberExpSign.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length) {\n this._expect = 'numberExpStart';\n break;\n }\n if (this._done) return callback(new Error('Parser has expected an exponent value of a number'));\n break main; // wait for more input\n }\n value = match[0];\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n this._expect = 'numberExpStart';\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'numberExpStart': // [0-9]\n patterns.numberExpStart.lastIndex = index;\n match = patterns.numberExpStart.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length || this._done) return callback(new Error('Parser cannot parse input: expected an exponent part of a number'));\n break main; // wait for more input\n }\n value = match[0];\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n this._expect = 'numberExpDigit';\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n case 'numberExpDigit': // [0-9]*\n patterns.numberExpDigit.lastIndex = index;\n match = patterns.numberExpDigit.exec(this._buffer);\n value = match[0];\n if (value) {\n this._streamNumbers && this.push({name: 'numberChunk', value: value});\n this._packNumbers && (this._accumulator += value);\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n } else {\n if (index < this._buffer.length || this._done) {\n this._expect = expected[this._parent];\n break;\n }\n break main; // wait for more input\n }\n break;\n case 'done':\n patterns.ws.lastIndex = index;\n match = patterns.ws.exec(this._buffer);\n if (!match) {\n if (index < this._buffer.length) {\n if (this._jsonStreaming) {\n this._expect = 'value';\n break;\n }\n return callback(new Error('Parser cannot parse input: unexpected characters'));\n }\n break main; // wait for more input\n }\n value = match[0];\n if (this._open_number) {\n this._streamNumbers && this.push({name: 'endNumber'});\n this._open_number = false;\n if (this._packNumbers) {\n this.push({name: 'numberValue', value: this._accumulator});\n this._accumulator = '';\n }\n }\n if (noSticky) {\n this._buffer = this._buffer.slice(value.length);\n } else {\n index += value.length;\n }\n break;\n }\n }\n !noSticky && (this._buffer = this._buffer.slice(index));\n callback(null);\n }\n}\nParser.parser = Parser.make;\nParser.make.Constructor = Parser;\n\nmodule.exports = Parser;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/stream-json/Parser.js?"); + +/***/ }), + +/***/ "./node_modules/stream-json/streamers/StreamArray.js": +/*!***********************************************************!*\ + !*** ./node_modules/stream-json/streamers/StreamArray.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +eval("\n\nconst StreamBase = __webpack_require__(/*! ./StreamBase */ \"./node_modules/stream-json/streamers/StreamBase.js\");\nconst withParser = __webpack_require__(/*! ../utils/withParser */ \"./node_modules/stream-json/utils/withParser.js\");\n\nclass StreamArray extends StreamBase {\n static make(options) {\n return new StreamArray(options);\n }\n\n static withParser(options) {\n return withParser(StreamArray.make, options);\n }\n\n constructor(options) {\n super(options);\n this._level = 1;\n this._counter = 0;\n }\n\n _wait(chunk, _, callback) {\n // first chunk should open an array\n if (chunk.name !== 'startArray') {\n return callback(new Error('Top-level object should be an array.'));\n }\n this._transform = this._filter;\n return this._transform(chunk, _, callback);\n }\n\n _push(discard) {\n if (this._assembler.current.length) {\n if (discard) {\n ++this._counter;\n this._assembler.current.pop();\n } else {\n this.push({key: this._counter++, value: this._assembler.current.pop()});\n }\n }\n }\n}\nStreamArray.streamArray = StreamArray.make;\nStreamArray.make.Constructor = StreamArray;\n\nmodule.exports = StreamArray;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/stream-json/streamers/StreamArray.js?"); + +/***/ }), + +/***/ "./node_modules/stream-json/streamers/StreamBase.js": +/*!**********************************************************!*\ + !*** ./node_modules/stream-json/streamers/StreamBase.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +eval("\n\nconst {Transform} = __webpack_require__(/*! stream */ \"stream\");\nconst Assembler = __webpack_require__(/*! ../Assembler */ \"./node_modules/stream-json/Assembler.js\");\n\nclass Counter {\n constructor(initialDepth) {\n this.depth = initialDepth;\n }\n startObject() {\n ++this.depth;\n }\n endObject() {\n --this.depth;\n }\n startArray() {\n ++this.depth;\n }\n endArray() {\n --this.depth;\n }\n}\n\nclass StreamBase extends Transform {\n constructor(options) {\n super(Object.assign({}, options, {writableObjectMode: true, readableObjectMode: true}));\n if (options) {\n this.objectFilter = options.objectFilter;\n this.includeUndecided = options.includeUndecided;\n }\n if (typeof this.objectFilter != 'function') {\n this._filter = this._transform;\n }\n this._transform = this._wait || this._filter;\n this._assembler = new Assembler(options && {reviver: options.reviver});\n }\n\n _transform(chunk, encoding, callback) {\n if (this._assembler[chunk.name]) {\n this._assembler[chunk.name](chunk.value);\n if (this._assembler.depth === this._level) {\n this._push();\n }\n }\n callback(null);\n }\n\n _filter(chunk, encoding, callback) {\n if (this._assembler[chunk.name]) {\n this._assembler[chunk.name](chunk.value);\n const result = this.objectFilter(this._assembler);\n if (result) {\n if (this._assembler.depth === this._level) {\n this._push();\n this._transform = this._filter;\n }\n this._transform = this._accept;\n return callback(null);\n }\n if (result === false) {\n this._saved_assembler = this._assembler;\n this._assembler = new Counter(this._saved_assembler.depth);\n this._saved_assembler.dropToLevel(this._level);\n if (this._assembler.depth === this._level) {\n this._assembler = this._saved_assembler;\n this._transform = this._filter;\n }\n this._transform = this._reject;\n return callback(null);\n }\n if (this._assembler.depth === this._level) {\n this._push(!this.includeUndecided);\n }\n }\n callback(null);\n }\n\n _accept(chunk, encoding, callback) {\n if (this._assembler[chunk.name]) {\n this._assembler[chunk.name](chunk.value);\n if (this._assembler.depth === this._level) {\n this._push();\n this._transform = this._filter;\n }\n }\n callback(null);\n }\n\n _reject(chunk, encoding, callback) {\n if (this._assembler[chunk.name]) {\n this._assembler[chunk.name](chunk.value);\n if (this._assembler.depth === this._level) {\n this._assembler = this._saved_assembler;\n this._transform = this._filter;\n }\n }\n callback(null);\n }\n}\n\nmodule.exports = StreamBase;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/stream-json/streamers/StreamBase.js?"); + +/***/ }), + +/***/ "./node_modules/stream-json/utils/Utf8Stream.js": +/*!******************************************************!*\ + !*** ./node_modules/stream-json/utils/Utf8Stream.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +eval("\n\nconst {Transform} = __webpack_require__(/*! stream */ \"stream\");\nconst {StringDecoder} = __webpack_require__(/*! string_decoder */ \"string_decoder\");\n\nclass Utf8Stream extends Transform {\n constructor(options) {\n super(Object.assign({}, options, {writableObjectMode: false}));\n this._buffer = '';\n }\n\n _transform(chunk, encoding, callback) {\n if (typeof chunk == 'string') {\n this._transform = this._transformString;\n } else {\n this._stringDecoder = new StringDecoder();\n this._transform = this._transformBuffer;\n }\n this._transform(chunk, encoding, callback);\n }\n\n _transformBuffer(chunk, _, callback) {\n this._buffer += this._stringDecoder.write(chunk);\n this._processBuffer(callback);\n }\n\n _transformString(chunk, _, callback) {\n this._buffer += chunk.toString();\n this._processBuffer(callback);\n }\n\n _processBuffer(callback) {\n if (this._buffer) {\n this.push(this._buffer, 'utf8');\n this._buffer = '';\n }\n callback(null);\n }\n\n _flushInput() {\n // meant to be called from _flush()\n if (this._stringDecoder) {\n this._buffer += this._stringDecoder.end();\n }\n }\n\n _flush(callback) {\n this._flushInput();\n this._processBuffer(callback);\n }\n}\n\nmodule.exports = Utf8Stream;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/stream-json/utils/Utf8Stream.js?"); + +/***/ }), + +/***/ "./node_modules/stream-json/utils/withParser.js": +/*!******************************************************!*\ + !*** ./node_modules/stream-json/utils/withParser.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +eval("\n\nconst Chain = __webpack_require__(/*! stream-chain */ \"./node_modules/stream-chain/index.js\");\n\nconst Parser = __webpack_require__(/*! ../Parser */ \"./node_modules/stream-json/Parser.js\");\n\nconst withParser = (fn, options) =>\n new Chain([new Parser(options), fn(options)], Object.assign({}, options, {writableObjectMode: false, readableObjectMode: true}));\n\nmodule.exports = withParser;\n\n\n//# sourceURL=webpack://Mixtures/./node_modules/stream-json/utils/withParser.js?"); + +/***/ }), + +/***/ "./dist/index-electron.ts": +/*!********************************!*\ + !*** ./dist/index-electron.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ALL_TRANSFORMMIXTURE_FORMATS\": () => (/* reexport safe */ _src_cmdline_TransformMixtures__WEBPACK_IMPORTED_MODULE_5__.ALL_TRANSFORMMIXTURE_FORMATS),\n/* harmony export */ \"ASCENT_FUDGE\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.ASCENT_FUDGE),\n/* harmony export */ \"ArrangeMixture\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.ArrangeMixture),\n/* harmony export */ \"CollectionPanel\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.CollectionPanel),\n/* harmony export */ \"Console\": () => (/* reexport safe */ _src_cmdline_Console__WEBPACK_IMPORTED_MODULE_2__.Console),\n/* harmony export */ \"DEGRAD\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.DEGRAD),\n/* harmony export */ \"DOM\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.DOM),\n/* harmony export */ \"DrawMixture\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.DrawMixture),\n/* harmony export */ \"EditComponent\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.EditComponent),\n/* harmony export */ \"EditMixture\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.EditMixture),\n/* harmony export */ \"EditMixtureWeb\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.EditMixtureWeb),\n/* harmony export */ \"ExportMInChI\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.ExportMInChI),\n/* harmony export */ \"ExportSDFile\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.ExportSDFile),\n/* harmony export */ \"ExtractCTABComponent\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.ExtractCTABComponent),\n/* harmony export */ \"INV_TWOPI\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.INV_TWOPI),\n/* harmony export */ \"ImportSDFile\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.ImportSDFile),\n/* harmony export */ \"InChI\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.InChI),\n/* harmony export */ \"KeyCode\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.KeyCode),\n/* harmony export */ \"KeyValueWidget\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.KeyValueWidget),\n/* harmony export */ \"LookupCompoundDialog\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.LookupCompoundDialog),\n/* harmony export */ \"MIXFILE_COMPONENT_FIELDS\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MIXFILE_COMPONENT_FIELDS),\n/* harmony export */ \"MIXFILE_ROOT_FIELDS\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MIXFILE_ROOT_FIELDS),\n/* harmony export */ \"MIXFILE_VERSION\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MIXFILE_VERSION),\n/* harmony export */ \"MInChISegment\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MInChISegment),\n/* harmony export */ \"MainPanel\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MainPanel),\n/* harmony export */ \"MenuBanner\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MenuBanner),\n/* harmony export */ \"MenuBannerCommand\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MenuBannerCommand),\n/* harmony export */ \"MetadataWidget\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MetadataWidget),\n/* harmony export */ \"Mixture\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.Mixture),\n/* harmony export */ \"MixtureCollection\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MixtureCollection),\n/* harmony export */ \"MixturePanel\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.MixturePanel),\n/* harmony export */ \"NormMixture\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.NormMixture),\n/* harmony export */ \"ON_DESKTOP\": () => (/* reexport safe */ _src_startup__WEBPACK_IMPORTED_MODULE_1__.ON_DESKTOP),\n/* harmony export */ \"Permutation\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.Permutation),\n/* harmony export */ \"PubChemSearch\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.PubChemSearch),\n/* harmony export */ \"RADDEG\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.RADDEG),\n/* harmony export */ \"RenderHTML\": () => (/* reexport safe */ _src_cmdline_RenderHTML__WEBPACK_IMPORTED_MODULE_3__.RenderHTML),\n/* harmony export */ \"SquarePacking\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.SquarePacking),\n/* harmony export */ \"StandardUnits\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.StandardUnits),\n/* harmony export */ \"TWOPI\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.TWOPI),\n/* harmony export */ \"TableExtract\": () => (/* reexport safe */ _src_cmdline_TableExtract__WEBPACK_IMPORTED_MODULE_4__.TableExtract),\n/* harmony export */ \"TableExtractType\": () => (/* reexport safe */ _src_cmdline_TableExtract__WEBPACK_IMPORTED_MODULE_4__.TableExtractType),\n/* harmony export */ \"Theme\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.Theme),\n/* harmony export */ \"TransformMixtureFormat\": () => (/* reexport safe */ _src_cmdline_TransformMixtures__WEBPACK_IMPORTED_MODULE_5__.TransformMixtureFormat),\n/* harmony export */ \"TransformMixtures\": () => (/* reexport safe */ _src_cmdline_TransformMixtures__WEBPACK_IMPORTED_MODULE_5__.TransformMixtures),\n/* harmony export */ \"Units\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.Units),\n/* harmony export */ \"Vec\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.Vec),\n/* harmony export */ \"WebWidget\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.WebWidget),\n/* harmony export */ \"XML\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.XML),\n/* harmony export */ \"addText\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.addText),\n/* harmony export */ \"angleDiff\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.angleDiff),\n/* harmony export */ \"angleDiffPos\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.angleDiffPos),\n/* harmony export */ \"angleNorm\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.angleNorm),\n/* harmony export */ \"blendRGB\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.blendRGB),\n/* harmony export */ \"clone\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.clone),\n/* harmony export */ \"colourAlpha\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.colourAlpha),\n/* harmony export */ \"colourCanvas\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.colourCanvas),\n/* harmony export */ \"colourCode\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.colourCode),\n/* harmony export */ \"deepClone\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.deepClone),\n/* harmony export */ \"dictValues\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.dictValues),\n/* harmony export */ \"dom\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.dom),\n/* harmony export */ \"domLegacy\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.domLegacy),\n/* harmony export */ \"drawLine\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.drawLine),\n/* harmony export */ \"empiricalScrollerSize\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.empiricalScrollerSize),\n/* harmony export */ \"escapeHTML\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.escapeHTML),\n/* harmony export */ \"eventCoords\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.eventCoords),\n/* harmony export */ \"findNode\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.findNode),\n/* harmony export */ \"findNodes\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.findNodes),\n/* harmony export */ \"fltEqual\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.fltEqual),\n/* harmony export */ \"fontSansSerif\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.fontSansSerif),\n/* harmony export */ \"formatDate\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.formatDate),\n/* harmony export */ \"formatDouble\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.formatDouble),\n/* harmony export */ \"fromUTF8\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.fromUTF8),\n/* harmony export */ \"getBoundaryPixelsDOM\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.getBoundaryPixelsDOM),\n/* harmony export */ \"getOffsetPixelsDOM\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.getOffsetPixelsDOM),\n/* harmony export */ \"hasInlineCSS\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.hasInlineCSS),\n/* harmony export */ \"htmlToRGB\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.htmlToRGB),\n/* harmony export */ \"initWebMolKit\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.initWebMolKit),\n/* harmony export */ \"installInlineCSS\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.installInlineCSS),\n/* harmony export */ \"invZ\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.invZ),\n/* harmony export */ \"isDef\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.isDef),\n/* harmony export */ \"jsonPrettyPrint\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.jsonPrettyPrint),\n/* harmony export */ \"maxArray\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.maxArray),\n/* harmony export */ \"minArray\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.minArray),\n/* harmony export */ \"newElement\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.newElement),\n/* harmony export */ \"nodeText\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.nodeText),\n/* harmony export */ \"norm2_xy\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.norm2_xy),\n/* harmony export */ \"norm2_xyz\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.norm2_xyz),\n/* harmony export */ \"norm_xy\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.norm_xy),\n/* harmony export */ \"norm_xyz\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.norm_xyz),\n/* harmony export */ \"notDef\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.notDef),\n/* harmony export */ \"openNewWindow\": () => (/* reexport safe */ _src_startup__WEBPACK_IMPORTED_MODULE_1__.openNewWindow),\n/* harmony export */ \"orBlank\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.orBlank),\n/* harmony export */ \"pathRoundedRect\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.pathRoundedRect),\n/* harmony export */ \"pixelDensity\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.pixelDensity),\n/* harmony export */ \"plural\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.plural),\n/* harmony export */ \"postJSONURL\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.postJSONURL),\n/* harmony export */ \"randomInt\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.randomInt),\n/* harmony export */ \"readTextURL\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.readTextURL),\n/* harmony export */ \"realEqual\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.realEqual),\n/* harmony export */ \"runMixfileEditor\": () => (/* reexport safe */ _src_startup__WEBPACK_IMPORTED_MODULE_1__.runMixfileEditor),\n/* harmony export */ \"safeFloat\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.safeFloat),\n/* harmony export */ \"safeInt\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.safeInt),\n/* harmony export */ \"setBoundaryPixels\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.setBoundaryPixels),\n/* harmony export */ \"setOnDesktop\": () => (/* reexport safe */ _src_startup__WEBPACK_IMPORTED_MODULE_1__.setOnDesktop),\n/* harmony export */ \"signum\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.signum),\n/* harmony export */ \"sortAngles\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.sortAngles),\n/* harmony export */ \"sqr\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.sqr),\n/* harmony export */ \"toUTF8\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.toUTF8),\n/* harmony export */ \"uniqueAngles\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.uniqueAngles),\n/* harmony export */ \"yieldDOM\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.yieldDOM),\n/* harmony export */ \"zip\": () => (/* reexport safe */ _index_web__WEBPACK_IMPORTED_MODULE_0__.zip)\n/* harmony export */ });\n/* harmony import */ var _index_web__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index-web */ \"./dist/index-web.ts\");\n/* harmony import */ var _src_startup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/startup */ \"./src/startup.ts\");\n/* harmony import */ var _src_cmdline_Console__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../src/cmdline/Console */ \"./src/cmdline/Console.ts\");\n/* harmony import */ var _src_cmdline_RenderHTML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../src/cmdline/RenderHTML */ \"./src/cmdline/RenderHTML.ts\");\n/* harmony import */ var _src_cmdline_TableExtract__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../src/cmdline/TableExtract */ \"./src/cmdline/TableExtract.ts\");\n/* harmony import */ var _src_cmdline_TransformMixtures__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/cmdline/TransformMixtures */ \"./src/cmdline/TransformMixtures.ts\");\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://Mixtures/./dist/index-electron.ts?"); + +/***/ }), + +/***/ "./dist/index-web.ts": +/*!***************************!*\ + !*** ./dist/index-web.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ASCENT_FUDGE\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.ASCENT_FUDGE),\n/* harmony export */ \"ArrangeMixture\": () => (/* reexport safe */ _src_mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_18__.ArrangeMixture),\n/* harmony export */ \"CollectionPanel\": () => (/* reexport safe */ _src_main_CollectionPanel__WEBPACK_IMPORTED_MODULE_13__.CollectionPanel),\n/* harmony export */ \"DEGRAD\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.DEGRAD),\n/* harmony export */ \"DOM\": () => (/* reexport safe */ _wmk_util_dom__WEBPACK_IMPORTED_MODULE_0__.DOM),\n/* harmony export */ \"DrawMixture\": () => (/* reexport safe */ _src_mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_19__.DrawMixture),\n/* harmony export */ \"EditComponent\": () => (/* reexport safe */ _src_mixture_EditComponent__WEBPACK_IMPORTED_MODULE_20__.EditComponent),\n/* harmony export */ \"EditMixture\": () => (/* reexport safe */ _src_mixture_EditMixture__WEBPACK_IMPORTED_MODULE_21__.EditMixture),\n/* harmony export */ \"EditMixtureWeb\": () => (/* reexport safe */ _src_web_EditMixtureWeb__WEBPACK_IMPORTED_MODULE_28__.EditMixtureWeb),\n/* harmony export */ \"ExportMInChI\": () => (/* reexport safe */ _src_mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_22__.ExportMInChI),\n/* harmony export */ \"ExportSDFile\": () => (/* reexport safe */ _src_mixture_ExportSDFile__WEBPACK_IMPORTED_MODULE_23__.ExportSDFile),\n/* harmony export */ \"ExtractCTABComponent\": () => (/* reexport safe */ _src_lookup_ExtractCTABComponent__WEBPACK_IMPORTED_MODULE_10__.ExtractCTABComponent),\n/* harmony export */ \"INV_TWOPI\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.INV_TWOPI),\n/* harmony export */ \"ImportSDFile\": () => (/* reexport safe */ _src_mixture_ImportSDFile__WEBPACK_IMPORTED_MODULE_24__.ImportSDFile),\n/* harmony export */ \"InChI\": () => (/* reexport safe */ _src_main_InChI__WEBPACK_IMPORTED_MODULE_14__.InChI),\n/* harmony export */ \"KeyCode\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.KeyCode),\n/* harmony export */ \"KeyValueWidget\": () => (/* reexport safe */ _src_mixture_KeyValueWidget__WEBPACK_IMPORTED_MODULE_25__.KeyValueWidget),\n/* harmony export */ \"LookupCompoundDialog\": () => (/* reexport safe */ _src_lookup_LookupCompoundDialog__WEBPACK_IMPORTED_MODULE_11__.LookupCompoundDialog),\n/* harmony export */ \"MIXFILE_COMPONENT_FIELDS\": () => (/* reexport safe */ _src_data_Mixfile__WEBPACK_IMPORTED_MODULE_5__.MIXFILE_COMPONENT_FIELDS),\n/* harmony export */ \"MIXFILE_ROOT_FIELDS\": () => (/* reexport safe */ _src_data_Mixfile__WEBPACK_IMPORTED_MODULE_5__.MIXFILE_ROOT_FIELDS),\n/* harmony export */ \"MIXFILE_VERSION\": () => (/* reexport safe */ _src_data_Mixfile__WEBPACK_IMPORTED_MODULE_5__.MIXFILE_VERSION),\n/* harmony export */ \"MInChISegment\": () => (/* reexport safe */ _src_mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_22__.MInChISegment),\n/* harmony export */ \"MainPanel\": () => (/* reexport safe */ _src_main_MainPanel__WEBPACK_IMPORTED_MODULE_15__.MainPanel),\n/* harmony export */ \"MenuBanner\": () => (/* reexport safe */ _src_main_MenuBanner__WEBPACK_IMPORTED_MODULE_16__.MenuBanner),\n/* harmony export */ \"MenuBannerCommand\": () => (/* reexport safe */ _src_main_MenuBanner__WEBPACK_IMPORTED_MODULE_16__.MenuBannerCommand),\n/* harmony export */ \"MetadataWidget\": () => (/* reexport safe */ _src_mixture_MetadataWidget__WEBPACK_IMPORTED_MODULE_26__.MetadataWidget),\n/* harmony export */ \"Mixture\": () => (/* reexport safe */ _src_data_Mixture__WEBPACK_IMPORTED_MODULE_6__.Mixture),\n/* harmony export */ \"MixtureCollection\": () => (/* reexport safe */ _src_data_MixtureCollection__WEBPACK_IMPORTED_MODULE_7__.MixtureCollection),\n/* harmony export */ \"MixturePanel\": () => (/* reexport safe */ _src_main_MixturePanel__WEBPACK_IMPORTED_MODULE_17__.MixturePanel),\n/* harmony export */ \"NormMixture\": () => (/* reexport safe */ _src_data_NormMixture__WEBPACK_IMPORTED_MODULE_8__.NormMixture),\n/* harmony export */ \"Permutation\": () => (/* reexport safe */ _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Permutation),\n/* harmony export */ \"PubChemSearch\": () => (/* reexport safe */ _src_lookup_PubChemSearch__WEBPACK_IMPORTED_MODULE_12__.PubChemSearch),\n/* harmony export */ \"RADDEG\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.RADDEG),\n/* harmony export */ \"SquarePacking\": () => (/* reexport safe */ _src_mixture_SquarePacking__WEBPACK_IMPORTED_MODULE_27__.SquarePacking),\n/* harmony export */ \"StandardUnits\": () => (/* reexport safe */ _src_data_Units__WEBPACK_IMPORTED_MODULE_9__.StandardUnits),\n/* harmony export */ \"TWOPI\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.TWOPI),\n/* harmony export */ \"Theme\": () => (/* reexport safe */ _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_2__.Theme),\n/* harmony export */ \"Units\": () => (/* reexport safe */ _src_data_Units__WEBPACK_IMPORTED_MODULE_9__.Units),\n/* harmony export */ \"Vec\": () => (/* reexport safe */ _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec),\n/* harmony export */ \"WebWidget\": () => (/* reexport safe */ _src_web_WebWidget__WEBPACK_IMPORTED_MODULE_29__.WebWidget),\n/* harmony export */ \"XML\": () => (/* reexport safe */ _wmk_util_XML__WEBPACK_IMPORTED_MODULE_4__.XML),\n/* harmony export */ \"addText\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.addText),\n/* harmony export */ \"angleDiff\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.angleDiff),\n/* harmony export */ \"angleDiffPos\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.angleDiffPos),\n/* harmony export */ \"angleNorm\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.angleNorm),\n/* harmony export */ \"blendRGB\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.blendRGB),\n/* harmony export */ \"clone\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.clone),\n/* harmony export */ \"colourAlpha\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.colourAlpha),\n/* harmony export */ \"colourCanvas\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.colourCanvas),\n/* harmony export */ \"colourCode\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.colourCode),\n/* harmony export */ \"deepClone\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.deepClone),\n/* harmony export */ \"dictValues\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.dictValues),\n/* harmony export */ \"dom\": () => (/* reexport safe */ _wmk_util_dom__WEBPACK_IMPORTED_MODULE_0__.dom),\n/* harmony export */ \"domLegacy\": () => (/* reexport safe */ _wmk_util_dom__WEBPACK_IMPORTED_MODULE_0__.domLegacy),\n/* harmony export */ \"drawLine\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.drawLine),\n/* harmony export */ \"empiricalScrollerSize\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.empiricalScrollerSize),\n/* harmony export */ \"escapeHTML\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.escapeHTML),\n/* harmony export */ \"eventCoords\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.eventCoords),\n/* harmony export */ \"findNode\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.findNode),\n/* harmony export */ \"findNodes\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.findNodes),\n/* harmony export */ \"fltEqual\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.fltEqual),\n/* harmony export */ \"fontSansSerif\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.fontSansSerif),\n/* harmony export */ \"formatDate\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.formatDate),\n/* harmony export */ \"formatDouble\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.formatDouble),\n/* harmony export */ \"fromUTF8\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.fromUTF8),\n/* harmony export */ \"getBoundaryPixelsDOM\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.getBoundaryPixelsDOM),\n/* harmony export */ \"getOffsetPixelsDOM\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.getOffsetPixelsDOM),\n/* harmony export */ \"hasInlineCSS\": () => (/* reexport safe */ _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_2__.hasInlineCSS),\n/* harmony export */ \"htmlToRGB\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.htmlToRGB),\n/* harmony export */ \"initWebMolKit\": () => (/* reexport safe */ _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_2__.initWebMolKit),\n/* harmony export */ \"installInlineCSS\": () => (/* reexport safe */ _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_2__.installInlineCSS),\n/* harmony export */ \"invZ\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.invZ),\n/* harmony export */ \"isDef\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.isDef),\n/* harmony export */ \"jsonPrettyPrint\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.jsonPrettyPrint),\n/* harmony export */ \"maxArray\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.maxArray),\n/* harmony export */ \"minArray\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.minArray),\n/* harmony export */ \"newElement\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.newElement),\n/* harmony export */ \"nodeText\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.nodeText),\n/* harmony export */ \"norm2_xy\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.norm2_xy),\n/* harmony export */ \"norm2_xyz\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.norm2_xyz),\n/* harmony export */ \"norm_xy\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.norm_xy),\n/* harmony export */ \"norm_xyz\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.norm_xyz),\n/* harmony export */ \"notDef\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.notDef),\n/* harmony export */ \"orBlank\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.orBlank),\n/* harmony export */ \"pathRoundedRect\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.pathRoundedRect),\n/* harmony export */ \"pixelDensity\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.pixelDensity),\n/* harmony export */ \"plural\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.plural),\n/* harmony export */ \"postJSONURL\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.postJSONURL),\n/* harmony export */ \"randomInt\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.randomInt),\n/* harmony export */ \"readTextURL\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.readTextURL),\n/* harmony export */ \"realEqual\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.realEqual),\n/* harmony export */ \"safeFloat\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.safeFloat),\n/* harmony export */ \"safeInt\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.safeInt),\n/* harmony export */ \"setBoundaryPixels\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.setBoundaryPixels),\n/* harmony export */ \"signum\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.signum),\n/* harmony export */ \"sortAngles\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.sortAngles),\n/* harmony export */ \"sqr\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.sqr),\n/* harmony export */ \"toUTF8\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.toUTF8),\n/* harmony export */ \"uniqueAngles\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.uniqueAngles),\n/* harmony export */ \"yieldDOM\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.yieldDOM),\n/* harmony export */ \"zip\": () => (/* reexport safe */ _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__.zip)\n/* harmony export */ });\n/* harmony import */ var _wmk_util_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../wmk/util/dom */ \"../../work/WebMolKit/src/util/dom.ts\");\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n/* harmony import */ var _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../wmk/util/Theme */ \"../../work/WebMolKit/src/util/Theme.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _wmk_util_XML__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../wmk/util/XML */ \"../../work/WebMolKit/src/util/XML.ts\");\n/* harmony import */ var _src_data_Mixfile__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../src/data/Mixfile */ \"./src/data/Mixfile.ts\");\n/* harmony import */ var _src_data_Mixture__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../src/data/Mixture */ \"./src/data/Mixture.ts\");\n/* harmony import */ var _src_data_MixtureCollection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../src/data/MixtureCollection */ \"./src/data/MixtureCollection.ts\");\n/* harmony import */ var _src_data_NormMixture__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../src/data/NormMixture */ \"./src/data/NormMixture.ts\");\n/* harmony import */ var _src_data_Units__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../src/data/Units */ \"./src/data/Units.ts\");\n/* harmony import */ var _src_lookup_ExtractCTABComponent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../src/lookup/ExtractCTABComponent */ \"./src/lookup/ExtractCTABComponent.ts\");\n/* harmony import */ var _src_lookup_LookupCompoundDialog__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../src/lookup/LookupCompoundDialog */ \"./src/lookup/LookupCompoundDialog.ts\");\n/* harmony import */ var _src_lookup_PubChemSearch__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../src/lookup/PubChemSearch */ \"./src/lookup/PubChemSearch.ts\");\n/* harmony import */ var _src_main_CollectionPanel__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../src/main/CollectionPanel */ \"./src/main/CollectionPanel.ts\");\n/* harmony import */ var _src_main_InChI__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../src/main/InChI */ \"./src/main/InChI.ts\");\n/* harmony import */ var _src_main_MainPanel__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../src/main/MainPanel */ \"./src/main/MainPanel.ts\");\n/* harmony import */ var _src_main_MenuBanner__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../src/main/MenuBanner */ \"./src/main/MenuBanner.ts\");\n/* harmony import */ var _src_main_MixturePanel__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../src/main/MixturePanel */ \"./src/main/MixturePanel.ts\");\n/* harmony import */ var _src_mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../src/mixture/ArrangeMixture */ \"./src/mixture/ArrangeMixture.ts\");\n/* harmony import */ var _src_mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../src/mixture/DrawMixture */ \"./src/mixture/DrawMixture.ts\");\n/* harmony import */ var _src_mixture_EditComponent__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../src/mixture/EditComponent */ \"./src/mixture/EditComponent.ts\");\n/* harmony import */ var _src_mixture_EditMixture__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../src/mixture/EditMixture */ \"./src/mixture/EditMixture.ts\");\n/* harmony import */ var _src_mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../src/mixture/ExportMInChI */ \"./src/mixture/ExportMInChI.ts\");\n/* harmony import */ var _src_mixture_ExportSDFile__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../src/mixture/ExportSDFile */ \"./src/mixture/ExportSDFile.ts\");\n/* harmony import */ var _src_mixture_ImportSDFile__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../src/mixture/ImportSDFile */ \"./src/mixture/ImportSDFile.ts\");\n/* harmony import */ var _src_mixture_KeyValueWidget__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../src/mixture/KeyValueWidget */ \"./src/mixture/KeyValueWidget.ts\");\n/* harmony import */ var _src_mixture_MetadataWidget__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../src/mixture/MetadataWidget */ \"./src/mixture/MetadataWidget.ts\");\n/* harmony import */ var _src_mixture_SquarePacking__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../src/mixture/SquarePacking */ \"./src/mixture/SquarePacking.ts\");\n/* harmony import */ var _src_web_EditMixtureWeb__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../src/web/EditMixtureWeb */ \"./src/web/EditMixtureWeb.ts\");\n/* harmony import */ var _src_web_WebWidget__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../src/web/WebWidget */ \"./src/web/WebWidget.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://Mixtures/./dist/index-web.ts?"); + +/***/ }), + +/***/ "./src/cmdline/Console.ts": +/*!********************************!*\ + !*** ./src/cmdline/Console.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Console\": () => (/* binding */ Console)\n/* harmony export */ });\n/* harmony import */ var _wmk_util_XML__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/util/XML */ \"../../work/WebMolKit/src/util/XML.ts\");\n/* harmony import */ var _main_InChI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../main/InChI */ \"./src/main/InChI.ts\");\n/* harmony import */ var _startup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../startup */ \"./src/startup.ts\");\n/* harmony import */ var _RenderHTML__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RenderHTML */ \"./src/cmdline/RenderHTML.ts\");\n/* harmony import */ var _TableExtract__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TableExtract */ \"./src/cmdline/TableExtract.ts\");\n/* harmony import */ var _TransformMixtures__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TransformMixtures */ \"./src/cmdline/TransformMixtures.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\nclass Console {\n constructor(args) {\n this.inputFile = null;\n this.inputFormat = null;\n this.outputFile = null;\n this.outputFormat = null;\n this.tableFile = null;\n this.lookupFile = null;\n this.mappingFile = null;\n this.htmlFile = null;\n this.withMInChI = false;\n this.justHelp = false;\n this.verbose = false;\n (0,_startup__WEBPACK_IMPORTED_MODULE_2__.setOnDesktop)(true);\n const { DOMParser, XMLSerializer } = __webpack_require__(/*! xmldom/dom-parser.js */ \"./node_modules/xmldom/dom-parser.js\");\n _wmk_util_XML__WEBPACK_IMPORTED_MODULE_0__.XML.customParser = DOMParser;\n _wmk_util_XML__WEBPACK_IMPORTED_MODULE_0__.XML.customSerial = XMLSerializer;\n for (let n = 0; n < args.length; n++) {\n if (args[n] == '-i' && n + 1 < args.length)\n this.inputFile = args[++n];\n else if (args[n] == '-if' && n + 1 < args.length)\n this.inputFormat = args[++n];\n else if (args[n] == '-o' && n + 1 < args.length)\n this.outputFile = args[++n];\n else if (args[n] == '-of' && n + 1 < args.length)\n this.outputFormat = args[++n];\n else if (args[n] == '--table' && n + 1 < args.length)\n this.tableFile = args[++n];\n else if (args[n] == '--lookup' && n + 1 < args.length)\n this.lookupFile = args[++n];\n else if (args[n] == '--mapping' && n + 1 < args.length)\n this.mappingFile = args[++n];\n else if (args[n] == '--html' && n + 1 < args.length)\n this.htmlFile = args[++n];\n else if (args[n] == '--minchi')\n this.withMInChI = true;\n else if (args[n] == '--inchi' && n < args.length - 1)\n _main_InChI__WEBPACK_IMPORTED_MODULE_1__.InChI.setExecutable(args[++n]);\n else if (args[n] == '-h' || args[n] == '-help' || args[n] == '--help')\n this.justHelp = true;\n else if (args[n] == '--verbose')\n this.verbose = true;\n }\n }\n run() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.tableFile)\n yield new _TableExtract__WEBPACK_IMPORTED_MODULE_4__.TableExtract(this.tableFile, this.lookupFile, this.mappingFile, this.verbose).exec();\n else if (this.htmlFile)\n yield new _RenderHTML__WEBPACK_IMPORTED_MODULE_3__.RenderHTML(this.htmlFile, this.withMInChI).exec();\n else if (this.inputFile || this.inputFormat || this.outputFile || this.outputFormat)\n yield new _TransformMixtures__WEBPACK_IMPORTED_MODULE_5__.TransformMixtures(this.inputFile, this.inputFormat, this.outputFile, this.outputFormat).exec();\n else if (this.justHelp)\n this.printHelp();\n else {\n this.log('Nothing to do.');\n this.printHelp();\n }\n });\n }\n printHelp() {\n console.log('Mixtures console utilities. Arguments:');\n console.log(' -i {fn} read input file (type guessed from suffix)');\n console.log(' -if {fmt} specify/override type for input file');\n console.log(' -o {fn} write output file (type guessed from suffix)');\n console.log(' -of {fmt} specify/override type for output file');\n console.log(' --table {fn} convert a tabular datafile to mixfile collection');\n console.log(' --lookup {fn} (optional) lookup file for name-to-structure');\n console.log(' --mapping {fn} (optional) JSON-formatted file for column mappings');\n console.log(' --html {fn} render mixfile collection as an HTML table');\n console.log(' --minchi (optional) include MInChI notation');\n console.log(' --inchi {fn} (optional) specify InChI executable location');\n console.log('Mixture formats:');\n for (let fmt of _TransformMixtures__WEBPACK_IMPORTED_MODULE_5__.ALL_TRANSFORMMIXTURE_FORMATS)\n console.log(' ' + fmt);\n }\n log(str) {\n if (this.verbose)\n console.log(str);\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/cmdline/Console.ts?"); + +/***/ }), + +/***/ "./src/cmdline/RenderHTML.ts": +/*!***********************************!*\ + !*** ./src/cmdline/RenderHTML.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"RenderHTML\": () => (/* binding */ RenderHTML)\n/* harmony export */ });\n/* harmony import */ var _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/gfx/ArrangeMeasurement */ \"../../work/WebMolKit/src/gfx/ArrangeMeasurement.ts\");\n/* harmony import */ var _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/gfx/MetaVector */ \"../../work/WebMolKit/src/gfx/MetaVector.ts\");\n/* harmony import */ var _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/gfx/Rendering */ \"../../work/WebMolKit/src/gfx/Rendering.ts\");\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n/* harmony import */ var _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../data/MixtureCollection */ \"./src/data/MixtureCollection.ts\");\n/* harmony import */ var _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../mixture/ArrangeMixture */ \"./src/mixture/ArrangeMixture.ts\");\n/* harmony import */ var _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixture/DrawMixture */ \"./src/mixture/DrawMixture.ts\");\n/* harmony import */ var _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../mixture/ExportMInChI */ \"./src/mixture/ExportMInChI.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nclass RenderHTML {\n constructor(htmlFile, withMInChI) {\n this.htmlFile = htmlFile;\n this.withMInChI = withMInChI;\n this.fs = __webpack_require__(/*! fs */ \"fs\");\n this.path = __webpack_require__(/*! path */ \"path\");\n }\n exec() {\n return __awaiter(this, void 0, void 0, function* () {\n let content;\n try {\n content = this.fs.readFileSync(this.htmlFile).toString();\n }\n catch (ex) {\n throw 'Unable to read file ' + this.htmlFile + ': ' + ex;\n }\n let mixlist = _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_4__.MixtureCollection.deserialise(content);\n if (mixlist.count == 0)\n throw 'Nothing to render';\n let emitln = (line) => console.log(line);\n let emit = (txt) => { process.stdout.write(txt); };\n emitln('');\n emitln('');\n emitln('');\n let policy = _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_2__.RenderPolicy.defaultColourOnWhite(15);\n let measure = new _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_0__.OutlineMeasurement(0, 0, policy.data.pointScale);\n for (let n = 0; n < mixlist.count; n++) {\n let mixture = mixlist.getMixtureDirect(n);\n emitln('');\n emitln(``);\n let layout = new _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_5__.ArrangeMixture(mixture, measure, policy);\n layout.arrange();\n let gfx = new _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__.MetaVector();\n let draw = new _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_6__.DrawMixture(layout, gfx);\n draw.draw();\n gfx.normalise();\n emitln('');\n if (this.withMInChI) {\n let maker = new _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_7__.ExportMInChI(mixture.mixfile);\n yield maker.fillInChI();\n maker.formulate();\n emit('');\n }\n emitln('');\n }\n emitln('
${n + 1}');\n emitln(gfx.createSVG());\n emitln('
');\n                    let minchi = maker.getResult(), segment = maker.getSegment();\n                    for (let n = 0; n < minchi.length; n++) {\n                        emit('' + (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_3__.escapeHTML)(minchi[n]) + '');\n                    }\n                    emitln('
');\n });\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/cmdline/RenderHTML.ts?"); + +/***/ }), + +/***/ "./src/cmdline/TableExtract.ts": +/*!*************************************!*\ + !*** ./src/cmdline/TableExtract.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"TableExtract\": () => (/* binding */ TableExtract),\n/* harmony export */ \"TableExtractType\": () => (/* binding */ TableExtractType)\n/* harmony export */ });\n/* harmony import */ var _wmk_aspect_AssayProvenance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/aspect/AssayProvenance */ \"../../work/WebMolKit/src/aspect/AssayProvenance.ts\");\n/* harmony import */ var _wmk_aspect_MeasurementData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/aspect/MeasurementData */ \"../../work/WebMolKit/src/aspect/MeasurementData.ts\");\n/* harmony import */ var _wmk_aspect_Mixture__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/aspect/Mixture */ \"../../work/WebMolKit/src/aspect/Mixture.ts\");\n/* harmony import */ var _wmk_data_DataSheet__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/data/DataSheet */ \"../../work/WebMolKit/src/data/DataSheet.ts\");\n/* harmony import */ var _wmk_data_DataSheetStream__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/data/DataSheetStream */ \"../../work/WebMolKit/src/data/DataSheetStream.ts\");\n/* harmony import */ var _wmk_data_MDLReader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../wmk/data/MDLReader */ \"../../work/WebMolKit/src/data/MDLReader.ts\");\n/* harmony import */ var _wmk_data_MDLWriter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../wmk/data/MDLWriter */ \"../../work/WebMolKit/src/data/MDLWriter.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _data_Mixture__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../data/Mixture */ \"./src/data/Mixture.ts\");\n/* harmony import */ var _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../data/MixtureCollection */ \"./src/data/MixtureCollection.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\nvar TableExtractType;\n(function (TableExtractType) {\n TableExtractType[\"Structure\"] = \"structure\";\n TableExtractType[\"Name\"] = \"name\";\n TableExtractType[\"Quantity\"] = \"quantity\";\n TableExtractType[\"Bound\"] = \"bound\";\n TableExtractType[\"Error\"] = \"error\";\n TableExtractType[\"Ratio\"] = \"ratio\";\n TableExtractType[\"Units\"] = \"units\";\n TableExtractType[\"Relation\"] = \"relation\";\n TableExtractType[\"Identifier\"] = \"identifier\";\n TableExtractType[\"Link\"] = \"link\";\n TableExtractType[\"Property\"] = \"property\";\n})(TableExtractType || (TableExtractType = {}));\nclass TableExtract {\n constructor(tableFile, lookupFile, mappingFile, verbose) {\n this.tableFile = tableFile;\n this.lookupFile = lookupFile;\n this.mappingFile = mappingFile;\n this.verbose = verbose;\n this.fs = __webpack_require__(/*! fs */ \"fs\");\n this.path = __webpack_require__(/*! path */ \"path\");\n this.table = null;\n this.aprov = null;\n this.mdata = null;\n this.lookup = null;\n this.mappings = [];\n }\n exec() {\n return __awaiter(this, void 0, void 0, function* () {\n let content;\n try {\n content = this.fs.readFileSync(this.tableFile).toString();\n }\n catch (ex) {\n throw 'Unable to read file ' + this.tableFile + ': ' + ex;\n }\n if (this.tableFile.endsWith('.ds'))\n this.table = _wmk_data_DataSheetStream__WEBPACK_IMPORTED_MODULE_4__.DataSheetStream.readXML(content);\n else if (this.tableFile.endsWith('.sdf'))\n this.table = new _wmk_data_MDLReader__WEBPACK_IMPORTED_MODULE_5__.MDLSDFReader(content).parse();\n else if (this.tableFile.endsWith('.csv'))\n this.table = this.parseLines(',', true);\n else if (this.tableFile.endsWith('.tsv') || this.tableFile.endsWith('.tab'))\n this.table = this.parseLines('\\t', false);\n if (!this.table)\n throw 'Unable to parse: ' + this.tableFile;\n if (_wmk_aspect_AssayProvenance__WEBPACK_IMPORTED_MODULE_0__.AssayProvenance.isAssayProvenance(this.table))\n this.aprov = new _wmk_aspect_AssayProvenance__WEBPACK_IMPORTED_MODULE_0__.AssayProvenance(this.table, false);\n if (_wmk_aspect_MeasurementData__WEBPACK_IMPORTED_MODULE_1__.MeasurementData.isMeasurementData(this.table))\n this.mdata = new _wmk_aspect_MeasurementData__WEBPACK_IMPORTED_MODULE_1__.MeasurementData(this.table, false);\n if (this.lookupFile) {\n }\n this.initialMapping();\n if (this.mappingFile) {\n content = this.fs.readFileSync(this.mappingFile);\n this.customMapping(JSON.parse(content));\n }\n if (this.mappings.length == 0)\n throw 'No column mapping information available.';\n let mixtures = new _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_9__.MixtureCollection();\n for (let n = 0; n < this.table.numRows; n++) {\n let mixture = this.extractMixture(n);\n if (mixture)\n mixtures.appendMixtureDirect(mixture);\n }\n console.log(mixtures.serialise(true));\n });\n }\n parseLines(sep, escaped) {\n let ds = new _wmk_data_DataSheet__WEBPACK_IMPORTED_MODULE_3__.DataSheet();\n return ds;\n }\n initialMapping() {\n if (!_wmk_aspect_Mixture__WEBPACK_IMPORTED_MODULE_2__.Mixture.isMixture(this.table))\n return;\n let aspect = new _wmk_aspect_Mixture__WEBPACK_IMPORTED_MODULE_2__.Mixture(this.table, false);\n for (let attr of aspect.getHeader().attributes) {\n let map = {\n 'column': attr.column,\n 'origin': _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_7__.Vec.add(attr.position, -1),\n 'type': attr.type,\n 'info': attr.info,\n };\n this.mappings.push(map);\n }\n }\n customMapping(custom) {\n for (let map of custom) {\n let idx = this.mappings.findIndex((look) => look.column == map.column);\n if (idx >= 0)\n this.mappings[idx] = map;\n else\n this.mappings.push(map);\n }\n }\n extractMixture(row) {\n let mixture = new _data_Mixture__WEBPACK_IMPORTED_MODULE_8__.Mixture();\n for (let map of this.mappings) {\n let comp = mixture.mixfile;\n for (let idx of map.origin) {\n if (comp.contents == null)\n comp.contents = [];\n while (idx >= comp.contents.length)\n comp.contents.push({});\n comp = comp.contents[idx];\n }\n }\n let appendQuant = (quantity, val) => {\n if (isNaN(val))\n return quantity;\n if (quantity == null)\n return val;\n else if (typeof quantity == 'number' && quantity != val)\n return [Math.min(quantity, val), Math.max(quantity, val)];\n else\n return quantity;\n };\n let stashRatio = new Map();\n let fields = this.mdata ? this.mdata.getHeader().fields : [];\n for (let map of this.mappings) {\n let col = this.table.findColByName(map.column);\n if (col < 0 || this.table.isNull(row, col))\n continue;\n let comp = mixture.getComponent(map.origin);\n if (map.type == TableExtractType.Structure) {\n let mol = this.table.getMolecule(row, col);\n comp.molfile = new _wmk_data_MDLWriter__WEBPACK_IMPORTED_MODULE_6__.MDLMOLWriter(mol).write();\n }\n else if (map.type == TableExtractType.Name) {\n comp.name = this.table.toString(row, col);\n }\n else if (map.type == TableExtractType.Quantity) {\n if (this.aprov && map.column == _wmk_aspect_AssayProvenance__WEBPACK_IMPORTED_MODULE_0__.AssayProvenance.COLNAME_VALUE) {\n comp.quantity = this.aprov.getValue(row);\n let error = this.aprov.getError(row);\n if (!isNaN(error))\n comp.error = error;\n comp.units = this.aprov.getUnits(row);\n let relation = this.aprov.getRelation(row);\n if (relation && relation != '=')\n comp.relation = relation;\n continue;\n }\n let field = fields.find((f) => f.name == map.column);\n if (field) {\n let value = this.mdata.getValueField(row, field);\n comp.quantity = value.value;\n if (!isNaN(value.error))\n comp.error = value.error;\n comp.units = value.units;\n if (value.mod && value.mod != '=')\n comp.relation = value.mod;\n continue;\n }\n let val = parseFloat(this.table.toString(row, col));\n comp.quantity = appendQuant(comp.quantity, val);\n }\n else if (map.type == TableExtractType.Bound) {\n let val = parseFloat(this.table.toString(row, col));\n comp.quantity = appendQuant(comp.quantity, val);\n }\n else if (map.type == TableExtractType.Error) {\n let val = parseFloat(this.table.toString(row, col));\n if (!isNaN(val))\n comp.error = val;\n }\n else if (map.type == TableExtractType.Ratio) {\n let val = parseFloat(this.table.toString(row, col));\n if (!isNaN(val))\n stashRatio.set(JSON.stringify(map.origin), val);\n }\n else if (map.type == TableExtractType.Units) {\n let units = this.table.toString(row, col);\n comp.units = units;\n }\n else if (map.type == TableExtractType.Relation) {\n let relation = this.table.toString(row, col);\n comp.relation = relation;\n }\n else if (map.type == TableExtractType.Identifier) {\n if (comp.identifiers == null)\n comp.identifiers = {};\n comp.identifiers[map.column] = this.table.toString(row, col);\n }\n else if (map.type == TableExtractType.Link) {\n if (comp.links == null)\n comp.links = {};\n comp.links[map.column] = this.table.toString(row, col);\n }\n else if (map.type == TableExtractType.Property) {\n console.log('TODO: property');\n }\n }\n for (let origin of mixture.getOrigins()) {\n let comp = mixture.getComponent(origin);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_7__.Vec.isBlank(comp.contents))\n continue;\n let num = 0, total = 0;\n for (let n = 0; n < comp.contents.length; n++)\n if (!_data_Mixture__WEBPACK_IMPORTED_MODULE_8__.Mixture.isComponentEmpty(comp.contents[n])) {\n let ratio = stashRatio.get(JSON.stringify([...origin, n]));\n if (!ratio) {\n num = 0;\n break;\n }\n num++;\n total += ratio;\n }\n if (num > 0)\n for (let n = 0; n < comp.contents.length; n++)\n if (!_data_Mixture__WEBPACK_IMPORTED_MODULE_8__.Mixture.isComponentEmpty(comp.contents[n])) {\n let ratio = stashRatio.get(JSON.stringify([...origin, n]));\n comp.contents[n].ratio = [ratio, total];\n }\n }\n skip: for (let origin of _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_7__.Vec.reverse(mixture.getOrigins())) {\n let comp = mixture.getComponent(origin);\n if (_data_Mixture__WEBPACK_IMPORTED_MODULE_8__.Mixture.isComponentEmpty(comp)) {\n mixture.deleteComponent(origin);\n continue;\n }\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_7__.Vec.arrayLength(comp.contents) != 1)\n continue;\n for (let key in comp)\n if (key != 'contents' && comp[key])\n continue skip;\n let sub = comp.contents[0];\n comp.contents = null;\n mixture.setComponent(origin, sub);\n }\n return mixture;\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/cmdline/TableExtract.ts?"); + +/***/ }), + +/***/ "./src/cmdline/TransformMixtures.ts": +/*!******************************************!*\ + !*** ./src/cmdline/TransformMixtures.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ALL_TRANSFORMMIXTURE_FORMATS\": () => (/* binding */ ALL_TRANSFORMMIXTURE_FORMATS),\n/* harmony export */ \"TransformMixtureFormat\": () => (/* binding */ TransformMixtureFormat),\n/* harmony export */ \"TransformMixtures\": () => (/* binding */ TransformMixtures)\n/* harmony export */ });\n/* harmony import */ var _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/gfx/ArrangeMeasurement */ \"../../work/WebMolKit/src/gfx/ArrangeMeasurement.ts\");\n/* harmony import */ var _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/gfx/MetaVector */ \"../../work/WebMolKit/src/gfx/MetaVector.ts\");\n/* harmony import */ var _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/gfx/Rendering */ \"../../work/WebMolKit/src/gfx/Rendering.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _data_Mixture__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../data/Mixture */ \"./src/data/Mixture.ts\");\n/* harmony import */ var _main_InChI__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../main/InChI */ \"./src/main/InChI.ts\");\n/* harmony import */ var _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixture/ArrangeMixture */ \"./src/mixture/ArrangeMixture.ts\");\n/* harmony import */ var _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../mixture/DrawMixture */ \"./src/mixture/DrawMixture.ts\");\n/* harmony import */ var _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../mixture/ExportMInChI */ \"./src/mixture/ExportMInChI.ts\");\n/* harmony import */ var _mixture_ExportSDFile__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../mixture/ExportSDFile */ \"./src/mixture/ExportSDFile.ts\");\n/* harmony import */ var _mixture_ImportSDFile__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../mixture/ImportSDFile */ \"./src/mixture/ImportSDFile.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\nvar TransformMixtureFormat;\n(function (TransformMixtureFormat) {\n TransformMixtureFormat[\"Mixfile\"] = \"mixfile\";\n TransformMixtureFormat[\"JSON\"] = \"json\";\n TransformMixtureFormat[\"SDF\"] = \"sdf\";\n TransformMixtureFormat[\"MInChI\"] = \"minchi\";\n TransformMixtureFormat[\"LongMInChIKey\"] = \"longminchikey\";\n TransformMixtureFormat[\"ShortMInChIKey\"] = \"shortminchikey\";\n TransformMixtureFormat[\"SVG\"] = \"svg\";\n})(TransformMixtureFormat || (TransformMixtureFormat = {}));\nconst ALL_TRANSFORMMIXTURE_FORMATS = Object.values(TransformMixtureFormat);\nclass TransformMixtures {\n constructor(inputFile, inputFormat, outputFile, outputFormat) {\n this.inputFile = inputFile;\n this.outputFile = outputFile;\n this.fs = __webpack_require__(/*! fs */ \"fs\");\n this.process = __webpack_require__(/*! process */ \"process\");\n this.inputFormat = null;\n this.outputFormat = null;\n this.instream = null;\n this.outstream = null;\n this.count = 0;\n this.nextIndex = 0;\n this.roster = [];\n if (inputFormat) {\n if (!ALL_TRANSFORMMIXTURE_FORMATS.includes(inputFormat))\n throw 'Unknown input format: ' + inputFormat;\n this.inputFormat = inputFormat;\n }\n if (outputFormat) {\n if (!ALL_TRANSFORMMIXTURE_FORMATS.includes(outputFormat))\n throw 'Unknown output format: ' + outputFormat;\n this.outputFormat = outputFormat;\n }\n }\n exec() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.inputFile && !this.inputFormat) {\n for (let fmt of ALL_TRANSFORMMIXTURE_FORMATS)\n if (this.inputFile.endsWith('.' + fmt)) {\n this.inputFormat = fmt;\n break;\n }\n }\n if (!this.inputFormat)\n throw 'Unknown input format';\n if (this.inputFormat == TransformMixtureFormat.MInChI || this.inputFormat == TransformMixtureFormat.SVG ||\n this.inputFormat == TransformMixtureFormat.LongMInChIKey || this.inputFormat == TransformMixtureFormat.ShortMInChIKey)\n throw 'Can only write format: ' + this.inputFormat;\n if (this.outputFile && !this.outputFormat) {\n for (let fmt of ALL_TRANSFORMMIXTURE_FORMATS)\n if (this.outputFile.endsWith('.' + fmt)) {\n this.outputFormat = fmt;\n break;\n }\n }\n if (!this.outputFormat)\n throw 'Unknown output format';\n if ((this.outputFormat == TransformMixtureFormat.MInChI || this.outputFormat == TransformMixtureFormat.LongMInChIKey ||\n this.outputFormat == TransformMixtureFormat.ShortMInChIKey) && !_main_InChI__WEBPACK_IMPORTED_MODULE_5__.InChI.hasExecutable())\n throw 'For MInChI, must specify InChI executable as command line parameter.';\n this.instream = this.inputFile ? this.fs.createReadStream(this.inputFile) : this.process.stdin;\n this.outstream = this.outputFile ? this.fs.createWriteStream(this.outputFile) : this.process.stdout;\n if (this.outputFormat == TransformMixtureFormat.JSON)\n this.outstream.write('[\\n');\n if (this.inputFormat == TransformMixtureFormat.Mixfile)\n yield this.pipeMixfile();\n else if (this.inputFormat == TransformMixtureFormat.JSON)\n yield this.pipeJSON();\n else if (this.inputFormat == TransformMixtureFormat.SDF)\n yield this.pipeSDF();\n this.flushRoster();\n if (this.outputFormat == TransformMixtureFormat.JSON)\n this.outstream.write(']\\n');\n this.outstream.end();\n });\n }\n pipeMixfile() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n let json = '';\n this.instream.on('data', (chunk) => json += chunk);\n this.instream.on('end', () => {\n (() => __awaiter(this, void 0, void 0, function* () {\n try {\n let mixfile = JSON.parse(json);\n yield this.processMixfile(this.count++, mixfile);\n resolve();\n }\n catch (ex) {\n reject(ex);\n }\n }))();\n });\n });\n });\n }\n pipeJSON() {\n return __awaiter(this, void 0, void 0, function* () {\n const StreamArray = __webpack_require__(/*! stream-json/streamers/StreamArray */ \"./node_modules/stream-json/streamers/StreamArray.js\");\n return new Promise((resolve, reject) => {\n let array = StreamArray.withParser();\n this.instream.pipe(array.input);\n let json = {};\n array.on('data', (keyval) => {\n let mixfile = keyval['value'];\n (() => __awaiter(this, void 0, void 0, function* () {\n try {\n yield this.processMixfile(this.count++, mixfile);\n }\n catch (ex) {\n reject(ex);\n }\n }))();\n });\n array.on('end', () => resolve());\n });\n });\n }\n pipeSDF() {\n return __awaiter(this, void 0, void 0, function* () {\n let sdfile = new _mixture_ImportSDFile__WEBPACK_IMPORTED_MODULE_10__.ImportSDFile();\n return new Promise((resolve, reject) => {\n this.instream.on('data', (chunk) => {\n sdfile.feed(chunk);\n for (let mixfile = sdfile.poll(); mixfile; mixfile = sdfile.poll())\n this.processMixfile(this.count++, mixfile);\n });\n this.instream.on('end', () => {\n (() => __awaiter(this, void 0, void 0, function* () {\n try {\n let mixfile = sdfile.poll(true);\n if (mixfile)\n yield this.processMixfile(this.count++, mixfile);\n resolve();\n }\n catch (ex) {\n reject(ex);\n }\n }))();\n });\n });\n });\n }\n processMixfile(idx, mixfile) {\n return __awaiter(this, void 0, void 0, function* () {\n if (mixfile.mixfileVersion == null)\n throw 'Invalid mixfile';\n let chunk = null;\n if (this.outputFormat == TransformMixtureFormat.Mixfile) {\n let json = new _data_Mixture__WEBPACK_IMPORTED_MODULE_4__.Mixture(mixfile).serialise();\n chunk = json + '\\n';\n }\n else if (this.outputFormat == TransformMixtureFormat.JSON) {\n this.outstream.write(idx == 0 ? ' ' : ',');\n let json = JSON.stringify(mixfile);\n chunk = json + '\\n';\n }\n else if (this.outputFormat == TransformMixtureFormat.SDF) {\n let sdfile = new _mixture_ExportSDFile__WEBPACK_IMPORTED_MODULE_9__.ExportSDFile();\n sdfile.append(mixfile);\n let record = sdfile.write();\n chunk = record + '\\n';\n }\n else if (this.outputFormat == TransformMixtureFormat.MInChI) {\n if (!_main_InChI__WEBPACK_IMPORTED_MODULE_5__.InChI.isAvailable())\n throw 'InChI unavailable: need to specify executable on command line';\n let minchi = new _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_8__.ExportMInChI(mixfile);\n yield minchi.fillInChI();\n minchi.formulate();\n chunk = minchi.getResult() + '\\n';\n }\n else if (this.outputFormat == TransformMixtureFormat.LongMInChIKey) {\n if (!_main_InChI__WEBPACK_IMPORTED_MODULE_5__.InChI.isAvailable())\n throw 'InChI unavailable: need to specify executable on command line';\n let minchi = new _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_8__.ExportMInChI(mixfile);\n yield minchi.fillInChI();\n let hashkey = minchi.makeLongHashKey();\n chunk = hashkey + '\\n';\n }\n else if (this.outputFormat == TransformMixtureFormat.ShortMInChIKey) {\n if (!_main_InChI__WEBPACK_IMPORTED_MODULE_5__.InChI.isAvailable())\n throw 'InChI unavailable: need to specify executable on command line';\n let minchi = new _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_8__.ExportMInChI(mixfile);\n yield minchi.fillInChI();\n let hashkey = minchi.makeShortHashKey();\n chunk = hashkey + '\\n';\n }\n else if (this.outputFormat == TransformMixtureFormat.SVG) {\n let policy = _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_2__.RenderPolicy.defaultColourOnWhite(20);\n let measure = new _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_0__.OutlineMeasurement(0, 0, policy.data.pointScale);\n let layout = new _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_6__.ArrangeMixture(new _data_Mixture__WEBPACK_IMPORTED_MODULE_4__.Mixture(mixfile), measure, policy);\n layout.arrange();\n let gfx = new _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__.MetaVector();\n new _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_7__.DrawMixture(layout, gfx).draw();\n gfx.normalise();\n let svg = gfx.createSVG(false);\n chunk = svg + '\\n';\n }\n this.roster.push({ idx, chunk });\n this.flushRoster();\n });\n }\n flushRoster() {\n if (this.roster.length > 1)\n this.roster.sort((r1, r2) => r1.idx - r2.idx);\n while (this.roster.length > 0 && _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.first(this.roster).idx == this.nextIndex) {\n let { chunk } = this.roster.shift();\n if (chunk)\n this.outstream.write(chunk);\n this.nextIndex++;\n }\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/cmdline/TransformMixtures.ts?"); + +/***/ }), + +/***/ "./src/data/Mixfile.ts": +/*!*****************************!*\ + !*** ./src/data/Mixfile.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MIXFILE_COMPONENT_FIELDS\": () => (/* binding */ MIXFILE_COMPONENT_FIELDS),\n/* harmony export */ \"MIXFILE_ROOT_FIELDS\": () => (/* binding */ MIXFILE_ROOT_FIELDS),\n/* harmony export */ \"MIXFILE_VERSION\": () => (/* binding */ MIXFILE_VERSION)\n/* harmony export */ });\nconst MIXFILE_VERSION = 1.00;\nconst MIXFILE_COMPONENT_FIELDS = [\n 'name', 'description', 'synonyms', 'formula', 'molfile', 'inchi', 'inchiKey', 'smiles',\n 'ratio', 'quantity', 'units', 'relation', 'identifiers', 'links', 'contents'\n];\nconst MIXFILE_ROOT_FIELDS = [\n 'mixfileVersion', ...MIXFILE_COMPONENT_FIELDS\n];\n\n\n//# sourceURL=webpack://Mixtures/./src/data/Mixfile.ts?"); + +/***/ }), + +/***/ "./src/data/Mixture.ts": +/*!*****************************!*\ + !*** ./src/data/Mixture.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Mixture\": () => (/* binding */ Mixture)\n/* harmony export */ });\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _Mixfile__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Mixfile */ \"./src/data/Mixfile.ts\");\n\n\n\nclass Mixture {\n constructor(mixfile) {\n this.mixfile = mixfile;\n if (!mixfile)\n this.mixfile = { 'mixfileVersion': _Mixfile__WEBPACK_IMPORTED_MODULE_2__.MIXFILE_VERSION };\n else if (!this.mixfile.mixfileVersion)\n this.mixfile.mixfileVersion = _Mixfile__WEBPACK_IMPORTED_MODULE_2__.MIXFILE_VERSION;\n }\n static fromComponent(comp) {\n let mixfile = (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_0__.deepClone)(comp);\n mixfile.mixfileVersion = _Mixfile__WEBPACK_IMPORTED_MODULE_2__.MIXFILE_VERSION;\n return new Mixture(mixfile);\n }\n isEmpty() {\n return Mixture.isComponentEmpty(this.mixfile);\n }\n static isComponentEmpty(comp) {\n const BITS = ['name', 'description', 'synonyms', 'formula', 'molfile', 'inchi', 'inchiKey', 'smiles',\n 'ratio', 'quantity', 'units', 'relation', 'identifiers', 'links'];\n for (let bit of BITS)\n if (comp[bit] != null)\n return false;\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__.Vec.arrayLength(comp.contents) > 0)\n return false;\n return true;\n }\n static hasQuantity(comp) {\n return comp.quantity != null || comp.ratio != null;\n }\n clone() {\n return new Mixture((0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_0__.deepClone)(this.mixfile));\n }\n equals(other) {\n if (other == null)\n return false;\n return this.recursiveEqual(this.mixfile, other.mixfile);\n }\n static deserialise(data) {\n let mixfile = JSON.parse(data);\n return new Mixture(mixfile);\n }\n serialise() {\n return Mixture.beautify(this.mixfile);\n }\n static serialiseComponent(comp) {\n return Mixture.beautify(comp);\n }\n getComponent(origin) {\n if (origin.length == 0)\n return this.mixfile;\n let find = null, look = this.mixfile.contents || [];\n for (let o of origin) {\n find = look[o];\n if (!find)\n return null;\n look = find.contents || [];\n }\n return find;\n }\n getParentComponent(origin) {\n if (origin.length == 0)\n return null;\n origin = origin.slice();\n origin.pop();\n return this.getComponent(origin);\n }\n getComponents() {\n let list = [], stack = [this.mixfile];\n while (stack.length > 0) {\n let comp = stack.shift();\n list.push(comp);\n if (comp.contents)\n for (let sub of comp.contents)\n stack.push(sub);\n }\n return list;\n }\n getOrigins() {\n let origins = [];\n let nodeEnum = (origin, comp) => {\n origins.push(origin);\n for (let n = 0; n < _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__.Vec.arrayLength(comp.contents); n++)\n nodeEnum(_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__.Vec.append(origin, n), comp.contents[n]);\n };\n nodeEnum([], this.mixfile);\n return origins;\n }\n setComponent(origin, comp) {\n let find = this.mixfile, look = this.mixfile.contents;\n for (let o of origin) {\n find = look[o];\n look = find.contents;\n }\n let modified = false;\n for (let k in comp) {\n let v = comp[k];\n if (v != find[k]) {\n find[k] = v;\n modified = true;\n }\n }\n Object.keys(find).forEach((key) => { if (find[key] == null)\n delete find[key]; });\n return modified;\n }\n deleteComponent(origin) {\n if (origin.length == 0)\n return;\n let find = this.mixfile, look = this.mixfile.contents, parent = look;\n for (let o of origin) {\n parent = look;\n find = look[o];\n look = find.contents;\n }\n let idx = origin[origin.length - 1];\n parent.splice(idx, 1);\n if (look)\n for (let c of look)\n parent.splice(idx++, 0, c);\n }\n prependBefore(origin, comp) {\n if (origin.length == 0) {\n let mixfile = this.mixfile;\n let subcomp = {};\n const SKIP = ['mixfileVersion', 'contents'];\n for (let key in mixfile)\n if (!SKIP.includes(key)) {\n subcomp[key] = mixfile[key];\n delete mixfile[key];\n }\n mixfile.contents = [subcomp];\n return;\n }\n let find = this.mixfile, look = this.mixfile.contents, parent = look;\n for (let o of origin) {\n parent = look;\n find = look[o];\n look = find.contents;\n }\n let idx = origin[origin.length - 1];\n parent[idx] = comp;\n comp.contents = [find];\n }\n static splitOrigin(origin) {\n if (origin.length == 0)\n return [null, null];\n let parent = origin.slice(0);\n let idx = parent.splice(origin.length - 1, 1)[0];\n return [parent, idx];\n }\n static beautify(json) {\n let lines = JSON.stringify(json, null, 4).split('\\n');\n let regex = /^(\\s*\\\"\\w+\\\": )([\\[\\{].*)$/, regpad = /^(\\s*)/;\n for (let n = 0; n < lines.length; n++) {\n let match = regex.exec(lines[n]);\n if (!match)\n continue;\n let padding = regpad.exec(lines[n]);\n lines[n] = match[1] + '\\n' + padding[1] + match[2];\n }\n return lines.join('\\n');\n }\n recursiveEqual(comp1, comp2) {\n let dict1 = comp1, dict2 = comp2;\n let keys1 = [], keys2 = [];\n for (let k in dict1)\n if (k != 'contents' && dict1[k] != null)\n keys1.push(k);\n for (let k in dict2)\n if (k != 'contents' && dict2[k] != null)\n keys2.push(k);\n keys1.sort();\n keys2.sort();\n if (!_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__.Vec.equals(keys1, keys2))\n return false;\n for (let k of keys1) {\n let v1 = dict1[k], v2 = dict2[k];\n if (Array.isArray(v1) && Array.isArray(v2)) {\n if (!_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__.Vec.equals(v1, v2))\n return false;\n }\n else {\n if (v1 != v2)\n return false;\n }\n }\n let len = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__.Vec.arrayLength(comp1.contents);\n if (len != _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_1__.Vec.arrayLength(comp2.contents))\n return false;\n for (let n = 0; n < len; n++)\n if (!this.recursiveEqual(comp1.contents[n], comp2.contents[n]))\n return false;\n return true;\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/data/Mixture.ts?"); + +/***/ }), + +/***/ "./src/data/MixtureCollection.ts": +/*!***************************************!*\ + !*** ./src/data/MixtureCollection.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MixtureCollection\": () => (/* binding */ MixtureCollection)\n/* harmony export */ });\n/* harmony import */ var _Mixture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Mixture */ \"./src/data/Mixture.ts\");\n\nclass MixtureCollection {\n constructor(mixtures) {\n this.mixtures = [];\n if (mixtures)\n this.mixtures = mixtures.slice(0);\n }\n get count() {\n return this.mixtures.length;\n }\n getMixture(idx) {\n return this.mixtures[idx].clone();\n }\n getMixtureDirect(idx) {\n return this.mixtures[idx];\n }\n setMixture(idx, mixture) {\n this.mixtures[idx] = mixture.clone();\n }\n setMixtureDirect(idx, mixture) {\n this.mixtures[idx] = mixture;\n }\n deleteMixture(idx) {\n this.mixtures.splice(idx, 1);\n }\n appendMixture(mixture) {\n this.mixtures.push(mixture.clone());\n return this.mixtures.length - 1;\n }\n appendMixtureDirect(mixture) {\n this.mixtures.push(mixture);\n return this.mixtures.length - 1;\n }\n appendCollection(collection) {\n this.mixtures = this.mixtures.concat(collection.mixtures);\n }\n insertMixture(idx, mixture) {\n this.mixtures.splice(idx, 0, mixture.clone());\n }\n swapMixtures(idx1, idx2) {\n let [m1, m2] = [this.mixtures[idx1], this.mixtures[idx2]];\n this.mixtures[idx1] = m2;\n this.mixtures[idx2] = m1;\n }\n static deserialise(data) {\n let list = JSON.parse(data);\n if (!Array.isArray(list))\n throw 'Input content is not a JSON array.';\n let mixtures = [];\n for (let mixfile of list)\n mixtures.push(new _Mixture__WEBPACK_IMPORTED_MODULE_0__.Mixture(mixfile));\n return new MixtureCollection(mixtures);\n }\n serialise(beautify) {\n let list = [];\n for (let mixture of this.mixtures)\n list.push(mixture.mixfile);\n if (beautify || list.length <= 100)\n return _Mixture__WEBPACK_IMPORTED_MODULE_0__.Mixture.beautify(list);\n let lines = list.map((mixfile) => JSON.stringify(mixfile));\n return '[\\n ' + lines.join(',\\n ') + '\\n]\\n';\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/data/MixtureCollection.ts?"); + +/***/ }), + +/***/ "./src/data/NormMixture.ts": +/*!*********************************!*\ + !*** ./src/data/NormMixture.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"NormMixture\": () => (/* binding */ NormMixture)\n/* harmony export */ });\n/* harmony import */ var _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/data/Molecule */ \"../../work/WebMolKit/src/data/Molecule.ts\");\n/* harmony import */ var _wmk_data_MoleculeStream__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/data/MoleculeStream */ \"../../work/WebMolKit/src/data/MoleculeStream.ts\");\n/* harmony import */ var _wmk_sketcher_MoleculeActivity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/sketcher/MoleculeActivity */ \"../../work/WebMolKit/src/sketcher/MoleculeActivity.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _Units__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Units */ \"./src/data/Units.ts\");\n\n\n\n\n\nvar AbsType;\n(function (AbsType) {\n AbsType[AbsType[\"None\"] = 0] = \"None\";\n AbsType[AbsType[\"Mass\"] = 1] = \"Mass\";\n AbsType[AbsType[\"Volume\"] = 2] = \"Volume\";\n AbsType[AbsType[\"Moles\"] = 3] = \"Moles\";\n})(AbsType || (AbsType = {}));\nclass NormMixture {\n constructor(mixture) {\n this.mixture = mixture;\n this.notes = [];\n }\n analyse() {\n let origins = this.mixture.getOrigins();\n let compList = origins.map((origin) => this.mixture.getComponent(origin));\n for (let n = 0; n < origins.length; n++) {\n let note = { 'origin': origins[n] };\n let comp = compList[n];\n if (comp.molfile && _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.isBlank(comp.contents)) {\n let mol = _wmk_data_MoleculeStream__WEBPACK_IMPORTED_MODULE_1__.MoleculeStream.readUnknown(comp.molfile);\n if (!mol)\n continue;\n let stereo = this.enumerateStereo(mol);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.notBlank(stereo))\n note.stereoEnum = stereo.map((mol) => _wmk_data_MoleculeStream__WEBPACK_IMPORTED_MODULE_1__.MoleculeStream.writeMDLMOL(mol));\n }\n this.notes.push(note);\n }\n let childIndexes = [];\n for (let n = 0; n < origins.length; n++) {\n childIndexes[n] = [];\n let o = origins[n];\n for (let i = n + 1; i < origins.length; i++)\n if (origins[i].length == o.length + 1 && _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.equals(o, origins[i].slice(0, o.length)))\n childIndexes[n].push(i);\n }\n let sumType = new Array(origins.length).fill(AbsType.None);\n let sumAmount1 = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.numberArray(null, origins.length);\n let sumAmount2 = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.numberArray(null, origins.length);\n let sumError = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.numberArray(null, origins.length);\n while (true) {\n let modified = false;\n for (let n = 0; n < origins.length; n++) {\n let comp = compList[n], note = this.notes[n];\n if (sumType[n] == AbsType.None) {\n [sumType[n], sumAmount1[n], sumAmount2[n], sumError[n]] = this.toAbsoluteUnits(comp);\n if (sumType[n] != AbsType.None)\n modified = true;\n }\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.isBlank(comp.contents))\n continue;\n if (sumType[n] == AbsType.None) {\n let amount = 0, childType = AbsType.None;\n for (let i of childIndexes[n]) {\n if (sumType[i] == AbsType.None || sumAmount2[i] != null ||\n (childType != AbsType.None && sumType[i] != childType)) {\n childType = AbsType.None;\n break;\n }\n childType = sumType[i];\n amount += sumAmount1[i];\n }\n if (childType != AbsType.None) {\n sumType[n] = childType;\n sumAmount1[n] = amount;\n modified = true;\n }\n }\n if (sumType[n] != AbsType.None && childIndexes[n].length >= 2) {\n let idxOne = -1, sum = 0;\n for (let i of childIndexes[n]) {\n if (sumType[i] == AbsType.None) {\n if (idxOne >= 0) {\n idxOne = -1;\n break;\n }\n idxOne = i;\n }\n else if (sumType[i] != sumType[n]) {\n idxOne = -1;\n break;\n }\n else if (sumAmount2[i] != null) {\n idxOne = -1;\n break;\n }\n else\n sum += sumAmount1[i];\n }\n if (idxOne >= 0) {\n sumType[idxOne] = sumType[n];\n sumAmount1[idxOne] = sumAmount1[n] - sum;\n modified = true;\n }\n }\n }\n if (!modified)\n break;\n }\n for (let n = 0; n < origins.length; n++)\n if (sumType[n] != AbsType.None) {\n for (let i of childIndexes[n])\n if (sumType[i] != AbsType.None) {\n let scale = 0, denom = sumAmount1[n], uri = null;\n if (sumType[i] == AbsType.Mass) {\n if (sumType[n] == AbsType.Mass)\n [scale, uri] = [100 / denom, _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.pcWW];\n else if (sumType[n] == AbsType.Volume)\n [scale, uri] = [100 / denom, _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.pcWV];\n else if (sumType[n] == AbsType.Moles) { }\n }\n else if (sumType[i] == AbsType.Volume) {\n if (sumType[n] == AbsType.Mass) { }\n else if (sumType[n] == AbsType.Volume)\n [scale, uri] = [100 / denom, _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.pcVV];\n else if (sumType[n] == AbsType.Moles) { }\n }\n else if (sumType[i] == AbsType.Moles) {\n if (sumType[n] == AbsType.Mass) { }\n else if (sumType[n] == AbsType.Volume)\n [scale, uri] = [1.0 / denom, _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.mol_L];\n else if (sumType[n] == AbsType.Moles)\n [scale, uri] = [100 / denom, _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.pcMM];\n }\n if (uri != null) {\n if (sumAmount2[i] == null) {\n this.notes[i].concQuantity = sumAmount1[i] * scale;\n this.notes[i].concError = sumError[i] == null ? null : sumError[i] * scale;\n }\n else {\n this.notes[i].concQuantity = [sumAmount1[i] * scale, sumAmount2[i] * scale];\n }\n this.notes[i].concUnits = _Units__WEBPACK_IMPORTED_MODULE_4__.Units.uriToName(uri);\n this.notes[i].concRelation = compList[n].relation;\n }\n }\n }\n }\n findNote(origin) {\n for (let note of this.notes)\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_3__.Vec.equals(origin, note.origin))\n return note;\n return null;\n }\n enumerateStereo(mol) {\n let splitMolecule = (mol) => {\n for (let n = 1; n <= mol.numBonds; n++)\n if (mol.bondType(n) == _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_0__.Molecule.BONDTYPE_UNKNOWN) {\n let mol1 = mol.clone(), mol2 = mol.clone();\n if (mol.bondOrder(n) == 1) {\n mol1.setBondType(n, _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_0__.Molecule.BONDTYPE_DECLINED);\n mol2.setBondType(n, _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_0__.Molecule.BONDTYPE_INCLINED);\n return [mol1, mol2];\n }\n else if (mol.bondOrder(n) == 2) {\n let mol1 = mol.clone();\n mol1.setBondType(n, _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_0__.Molecule.BONDTYPE_NORMAL);\n let mol2 = null;\n if (!mol.bondInRing(n)) {\n let state = { 'mol': mol1, 'currentAtom': 0, 'currentBond': n, 'selectedMask': null };\n let activ = new _wmk_sketcher_MoleculeActivity__WEBPACK_IMPORTED_MODULE_2__.MoleculeActivity(state, _wmk_sketcher_MoleculeActivity__WEBPACK_IMPORTED_MODULE_2__.ActivityType.BondRotate, {});\n activ.execute();\n if (!activ.errmsg && activ.output.mol)\n mol2 = activ.output.mol;\n }\n return mol2 ? [mol1, mol2] : [mol1];\n }\n }\n return null;\n };\n let list = [mol];\n for (let n = 0; n < list.length; n++) {\n let emols = splitMolecule(list[n]);\n if (!emols)\n continue;\n list[n] = emols[0];\n for (let i = emols.length - 1; i >= 1; i--)\n list.splice(n + 1, 0, emols[i]);\n n--;\n }\n return list.length > 1 ? list : null;\n }\n toAbsoluteUnits(comp) {\n if (!comp.units || comp.quantity == null)\n return [AbsType.None, null, null, null];\n let uri = _Units__WEBPACK_IMPORTED_MODULE_4__.Units.nameToURI(comp.units);\n if (!uri)\n return [AbsType.None, null, null, null];\n let scale = 0, type = AbsType.None;\n if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.kg)\n [scale, type] = [1E3, AbsType.Mass];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.g)\n [scale, type] = [1, AbsType.Mass];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.mg)\n [scale, type] = [1E-3, AbsType.Mass];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.ug)\n [scale, type] = [1E-6, AbsType.Mass];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.ng)\n [scale, type] = [1E-9, AbsType.Mass];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.L)\n [scale, type] = [1, AbsType.Volume];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.mL)\n [scale, type] = [1E-3, AbsType.Volume];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.uL)\n [scale, type] = [1E-6, AbsType.Volume];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.nL)\n [scale, type] = [1E-9, AbsType.Volume];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.mol)\n [scale, type] = [1, AbsType.Moles];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.mmol)\n [scale, type] = [1E-3, AbsType.Moles];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.umol)\n [scale, type] = [1E-6, AbsType.Moles];\n else if (uri == _Units__WEBPACK_IMPORTED_MODULE_4__.StandardUnits.nmol)\n [scale, type] = [1E-9, AbsType.Moles];\n else\n return [AbsType.None, null, null, null];\n if (typeof comp.quantity == 'number') {\n let error = comp.error == null ? null : comp.error * scale;\n return [type, comp.quantity * scale, null, error];\n }\n else {\n let [lo, hi] = comp.quantity;\n return [type, lo * scale, hi * scale, null];\n }\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/data/NormMixture.ts?"); + +/***/ }), + +/***/ "./src/data/Units.ts": +/*!***************************!*\ + !*** ./src/data/Units.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"StandardUnits\": () => (/* binding */ StandardUnits),\n/* harmony export */ \"Units\": () => (/* binding */ Units)\n/* harmony export */ });\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n\nvar StandardUnits;\n(function (StandardUnits) {\n StandardUnits[\"pc\"] = \"http://purl.obolibrary.org/obo/UO_0000187\";\n StandardUnits[\"pcWV\"] = \"http://purl.obolibrary.org/obo/UO_0000164\";\n StandardUnits[\"pcWW\"] = \"http://purl.obolibrary.org/obo/UO_0000163\";\n StandardUnits[\"pcVV\"] = \"http://purl.obolibrary.org/obo/UO_0000205\";\n StandardUnits[\"pcMM\"] = \"http://purl.obolibrary.org/obo/UO_0000076\";\n StandardUnits[\"ratio\"] = \"http://purl.obolibrary.org/obo/UO_0000190\";\n StandardUnits[\"mol_L\"] = \"http://purl.obolibrary.org/obo/UO_0000062\";\n StandardUnits[\"mmol_L\"] = \"http://purl.obolibrary.org/obo/UO_0000063\";\n StandardUnits[\"umol_L\"] = \"http://purl.obolibrary.org/obo/UO_0000064\";\n StandardUnits[\"nmol_L\"] = \"http://purl.obolibrary.org/obo/UO_0000065\";\n StandardUnits[\"pmol_L\"] = \"http://purl.obolibrary.org/obo/UO_0000066\";\n StandardUnits[\"g_L\"] = \"http://purl.obolibrary.org/obo/UO_0000175\";\n StandardUnits[\"mg_L\"] = \"http://purl.obolibrary.org/obo/UO_0000273\";\n StandardUnits[\"ug_L\"] = \"http://purl.obolibrary.org/obo/UO_0000275\";\n StandardUnits[\"mol_kg\"] = \"http://purl.obolibrary.org/obo/UO_0000068\";\n StandardUnits[\"kg\"] = \"http://purl.obolibrary.org/obo/UO_0000009\";\n StandardUnits[\"g\"] = \"http://purl.obolibrary.org/obo/UO_0000021\";\n StandardUnits[\"mg\"] = \"http://purl.obolibrary.org/obo/UO_0000022\";\n StandardUnits[\"ug\"] = \"http://purl.obolibrary.org/obo/UO_0000023\";\n StandardUnits[\"ng\"] = \"http://purl.obolibrary.org/obo/UO_0000024\";\n StandardUnits[\"L\"] = \"http://purl.obolibrary.org/obo/UO_0000099\";\n StandardUnits[\"mL\"] = \"http://purl.obolibrary.org/obo/UO_0000098\";\n StandardUnits[\"uL\"] = \"http://purl.obolibrary.org/obo/UO_0000101\";\n StandardUnits[\"nL\"] = \"http://purl.obolibrary.org/obo/UO_0000102\";\n StandardUnits[\"mol\"] = \"http://purl.obolibrary.org/obo/UO_0000013\";\n StandardUnits[\"mmol\"] = \"http://purl.obolibrary.org/obo/UO_0000040\";\n StandardUnits[\"umol\"] = \"http://purl.obolibrary.org/obo/UO_0000039\";\n StandardUnits[\"nmol\"] = \"http://purl.obolibrary.org/obo/UO_0000041\";\n StandardUnits[\"ppm\"] = \"placeholder1\";\n StandardUnits[\"ppb\"] = \"placeholder2\";\n})(StandardUnits || (StandardUnits = {}));\nconst PAIR_UNIT_NAMES = [\n [StandardUnits.pc, '%'],\n [StandardUnits.pcWV, 'w/v%'],\n [StandardUnits.pcWW, 'w/w%'],\n [StandardUnits.pcVV, 'v/v%'],\n [StandardUnits.pcMM, 'mol/mol%'],\n [StandardUnits.ratio, 'ratio'],\n [StandardUnits.mol_L, 'mol/L', 'M'],\n [StandardUnits.mmol_L, 'mmol/L', 'mM'],\n [StandardUnits.umol_L, '\\u{03BC}mol/L', 'umol/L', 'uM'],\n [StandardUnits.nmol_L, 'nmol/L', 'nM'],\n [StandardUnits.pmol_L, 'pmol/L', 'pM'],\n [StandardUnits.g_L, 'g/L'],\n [StandardUnits.mg_L, 'mg/L'],\n [StandardUnits.ug_L, '\\u{03BC}g/L', 'ug/L'],\n [StandardUnits.mol_kg, 'mol/kg'],\n [StandardUnits.kg, 'kg'],\n [StandardUnits.g, 'g'],\n [StandardUnits.mg, 'mg'],\n [StandardUnits.ug, '\\u{03BC}g', 'ug'],\n [StandardUnits.ng, 'ng'],\n [StandardUnits.L, 'L'],\n [StandardUnits.mL, 'mL'],\n [StandardUnits.uL, '\\u{03BC}L', 'uL'],\n [StandardUnits.nL, 'nL'],\n [StandardUnits.mol, 'mol'],\n [StandardUnits.mmol, 'mmol'],\n [StandardUnits.umol, '\\u{03BC}mol', 'umol'],\n [StandardUnits.nmol, 'nmol'],\n [StandardUnits.ppm, 'ppm'],\n [StandardUnits.ppb, 'ppb'],\n];\nconst PAIR_UNIT_MINCHI = [\n [StandardUnits.pc, 'pp', 1],\n [StandardUnits.pcWV, 'wv', 0.01],\n [StandardUnits.pcWW, 'wf', 0.01],\n [StandardUnits.pcVV, 'vf', 0.01],\n [StandardUnits.pcMM, 'mf', 0.01],\n [StandardUnits.ratio, 'rt', 1],\n [StandardUnits.mol_L, 'mr', 1],\n [StandardUnits.mmol_L, 'mr', 1E-3],\n [StandardUnits.umol_L, 'mr', 1E-6],\n [StandardUnits.nmol_L, 'mr', 1E-9],\n [StandardUnits.pmol_L, 'mr', 1E-12],\n [StandardUnits.g_L, 'wv', 1E-3],\n [StandardUnits.mg_L, 'wv', 1E-6],\n [StandardUnits.ug_L, 'wv', 1E-9],\n [StandardUnits.mol_kg, 'mb', 1],\n [StandardUnits.ppm, 'pp', 1E-6],\n [StandardUnits.ppb, 'pp', 1E-9],\n];\nclass Units {\n static setup() {\n for (let pair of PAIR_UNIT_NAMES) {\n let uri = pair[0], name = pair[1];\n this.STANDARD_LIST.push(uri);\n this.COMMON_NAMES.push(name);\n this.URI_TO_NAME[uri] = name;\n for (let n = 1; n <= pair.length; n++)\n this.NAME_TO_URI[pair[n]] = uri;\n }\n for (let pair of PAIR_UNIT_MINCHI) {\n let uri = pair[0], name = pair[1], scale = pair[2];\n this.URI_TO_MINCHI[uri] = [name, scale];\n }\n this.setup = () => { };\n }\n static standardList() {\n this.setup();\n return this.STANDARD_LIST;\n }\n static commonNames() {\n this.setup();\n return this.COMMON_NAMES;\n }\n static uriToName(uri) {\n this.setup();\n return this.URI_TO_NAME[uri];\n }\n static nameToURI(name) {\n this.setup();\n return this.NAME_TO_URI[name];\n }\n static convertToMInChI(uri, values) {\n let [mnemonic, scale] = this.URI_TO_MINCHI[uri] || [null, null];\n if (!mnemonic)\n return [null, null];\n return [mnemonic, _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_0__.Vec.mul(values, scale)];\n }\n}\nUnits.STANDARD_LIST = [];\nUnits.COMMON_NAMES = [];\nUnits.URI_TO_NAME = {};\nUnits.NAME_TO_URI = {};\nUnits.URI_TO_MINCHI = {};\n\n\n//# sourceURL=webpack://Mixtures/./src/data/Units.ts?"); + +/***/ }), + +/***/ "./src/lookup/ExtractCTABComponent.ts": +/*!********************************************!*\ + !*** ./src/lookup/ExtractCTABComponent.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ExtractCTABComponent\": () => (/* binding */ ExtractCTABComponent)\n/* harmony export */ });\n/* harmony import */ var _wmk_data_MDLReader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/data/MDLReader */ \"../../work/WebMolKit/src/data/MDLReader.ts\");\n/* harmony import */ var _wmk_data_MDLWriter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/data/MDLWriter */ \"../../work/WebMolKit/src/data/MDLWriter.ts\");\n/* harmony import */ var _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/data/Molecule */ \"../../work/WebMolKit/src/data/Molecule.ts\");\n/* harmony import */ var _wmk_data_MolUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/data/MolUtil */ \"../../work/WebMolKit/src/data/MolUtil.ts\");\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n\n\n\n\n\n\nclass ExtractCTABComponent {\n constructor(text) {\n this.text = text;\n }\n extract() {\n let ctab = new _wmk_data_MDLReader__WEBPACK_IMPORTED_MODULE_0__.MDLMOLReader(this.text);\n try {\n ctab.parse();\n }\n catch (ex) {\n return null;\n }\n if (!ctab.mol)\n return null;\n let seed = { 'mol': ctab.mol };\n if (ctab.groupAttachAny.size > 0)\n seed.attachAny = ctab.groupAttachAny;\n if (ctab.groupStereoRacemic.length > 0)\n seed.stereoRacemic = ctab.groupStereoRacemic;\n if (ctab.groupStereoRelative.length > 0)\n seed.stereoRelative = ctab.groupStereoRelative;\n if (ctab.groupLinkNodes.length > 0)\n seed.linkNodes = ctab.groupLinkNodes;\n if (ctab.groupMixtures.length > 0)\n seed.mixtures = ctab.groupMixtures;\n if (!seed.attachAny && !seed.stereoRacemic && !seed.stereoRelative &&\n !seed.linkNodes && !seed.mixtures)\n return null;\n const SANITY = 100;\n let prototypes = [seed];\n for (let n = 0; n < prototypes.length;) {\n let proto = prototypes[n];\n let list = this.enumerateAttachAny(proto);\n if (!list)\n list = this.enumerateStereoRacemic(proto);\n if (!list)\n list = this.enumerateStereoRelative(proto);\n if (!list)\n list = this.enumerateLinkNodes(proto);\n if (!list)\n list = this.enumerateMixtures(proto);\n if (list) {\n prototypes[n] = list[0];\n for (let i = 1; i < list.length; i++)\n prototypes.splice(n + i, 0, list[i]);\n }\n else\n n++;\n if (prototypes.length > SANITY)\n break;\n }\n if (prototypes.length == 0)\n return null;\n if (prototypes.length == 1 && _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.isBlank(prototypes[0].children))\n return null;\n let emit = (comp, proto) => {\n let subComp = {};\n if (proto.mol)\n subComp.molfile = new _wmk_data_MDLWriter__WEBPACK_IMPORTED_MODULE_1__.MDLMOLWriter(proto.mol).write();\n comp.contents.push(subComp);\n if (proto.children) {\n subComp.contents = [];\n for (let child of proto.children)\n emit(subComp, child);\n }\n };\n let comp = { 'contents': [] };\n if (ctab.molName)\n comp.name = ctab.molName;\n for (let proto of prototypes)\n emit(comp, proto);\n return comp;\n }\n enumerateAttachAny(proto) {\n if (!proto.attachAny)\n return null;\n let bond = null;\n for (let look of proto.attachAny.keys()) {\n bond = look;\n break;\n }\n if (bond == null)\n return null;\n let atoms = proto.attachAny.get(bond);\n proto.attachAny.delete(bond);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.isBlank(atoms))\n return null;\n let mol = proto.mol;\n let atomKeep = mol.bondFrom(bond), atomChop = mol.bondTo(bond);\n if (mol.atomElement(atomChop) == '*') { }\n else if (mol.atomElement(atomKeep) == '*')\n [atomKeep, atomChop] = [atomChop, atomKeep];\n else if (mol.atomAdjCount(atomKeep) < mol.atomAdjCount(atomChop))\n [atomKeep, atomChop] = [atomChop, atomKeep];\n for (let look of proto.attachAny.keys())\n this.removeAtom(proto.attachAny.get(look), atomChop);\n if (proto.stereoRelative)\n for (let look of proto.stereoRelative)\n this.removeAtom(look, atomChop);\n if (proto.stereoRacemic)\n for (let look of proto.stereoRacemic)\n this.removeAtom(look, atomChop);\n if (proto.linkNodes)\n for (let n = proto.linkNodes.length - 1; n >= 0; n--) {\n if (proto.linkNodes[n].atom == atomChop) {\n proto.linkNodes.splice(n, 1);\n continue;\n }\n if (proto.linkNodes[n].atom > atomChop)\n proto.linkNodes[n].atom--;\n this.removeAtom(proto.linkNodes[n].nbrs, atomChop);\n }\n if (proto.mixtures)\n for (let look of proto.mixtures)\n this.removeAtom(look.atoms, atomChop);\n let list = [];\n for (let connAtom of atoms) {\n let cmol = mol.clone();\n if (atomChop == cmol.bondFrom(bond))\n cmol.setBondFrom(bond, connAtom);\n else\n cmol.setBondTo(bond, connAtom);\n cmol.deleteAtomAndBonds(atomChop);\n list.push(this.protoClone(proto, cmol));\n }\n return list;\n }\n enumerateStereoRacemic(proto) {\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.isBlank(proto.stereoRacemic))\n return null;\n let blk = proto.stereoRacemic.shift();\n let mol = proto.mol;\n let affected = new Set();\n for (let atom of blk)\n affected.add(atom);\n let bonds = [];\n for (let n = 1; n <= mol.numBonds; n++)\n if (affected.has(mol.bondFrom(n)) || affected.has(mol.bondTo(n))) {\n let bt = mol.bondType(n);\n if (bt == _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_INCLINED || bt == _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_DECLINED)\n bonds.push(n);\n }\n let nperm = Math.min(256, 1 << bonds.length);\n let list = [this.protoClone(proto, mol)];\n for (let n = 1; n < nperm; n++) {\n let rmol = mol.clone();\n for (let i = 0, bitand = 1; i < bonds.length; i++) {\n if (n & bitand) {\n let bt = rmol.bondType(bonds[i]);\n bt = bt == _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_INCLINED ? _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_DECLINED : _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_INCLINED;\n rmol.setBondType(bonds[i], bt);\n }\n bitand = bitand << 1;\n }\n list.push(this.protoClone(proto, rmol));\n }\n return list;\n }\n enumerateStereoRelative(proto) {\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.isBlank(proto.stereoRelative))\n return null;\n let blk = proto.stereoRelative.shift();\n let affected = new Set();\n for (let atom of blk)\n affected.add(atom);\n let molinv = proto.mol.clone();\n for (let n = 1; n <= molinv.numBonds; n++)\n if (affected.has(molinv.bondFrom(n)) || affected.has(molinv.bondTo(n))) {\n let bt = molinv.bondType(n);\n if (bt == _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_INCLINED)\n molinv.setBondType(n, _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_DECLINED);\n else if (bt == _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_DECLINED)\n molinv.setBondType(n, _wmk_data_Molecule__WEBPACK_IMPORTED_MODULE_2__.Molecule.BONDTYPE_INCLINED);\n }\n return [proto, this.protoClone(proto, molinv)];\n }\n enumerateLinkNodes(proto) {\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.isBlank(proto.linkNodes))\n return null;\n let link = proto.linkNodes.shift();\n let mol = proto.mol, a1 = link.atom;\n let nbr1 = link.nbrs.length >= 1 ? link.nbrs[0] : 0;\n let list = [];\n for (let n = link.minRep; n <= link.maxRep; n++) {\n if (n == 1) {\n list.push(this.protoClone(proto, mol));\n continue;\n }\n let rmol = mol.clone();\n let addedAtoms = [];\n for (let i = 2; i <= n; i++) {\n let a2 = rmol.addAtom(rmol.atomElement(a1), rmol.atomX(a1), rmol.atomY(a1));\n rmol.setAtomCharge(a2, rmol.atomCharge(a1));\n rmol.setAtomUnpaired(a2, rmol.atomUnpaired(a2));\n rmol.addBond(a1, a2, 1);\n if (nbr1 > 0) {\n let a3 = 0;\n for (let adj of rmol.atomAdjList(a1))\n if (adj != a2 && adj != nbr1) {\n a3 = adj;\n break;\n }\n if (a3 > 0) {\n let b = rmol.findBond(a1, a3);\n if (rmol.bondFrom(b) == a1)\n rmol.setBondFrom(b, a2);\n else\n rmol.setBondTo(b, a2);\n }\n }\n addedAtoms.push(a1);\n }\n let rproto = this.protoClone(proto, rmol);\n if (rproto.mixtures)\n for (let mix of rproto.mixtures) {\n if (mix.atoms.includes(a1))\n mix.atoms.push(...addedAtoms);\n }\n list.push(rproto);\n }\n return list;\n }\n enumerateMixtures(proto) {\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.isBlank(proto.mixtures))\n return null;\n let mol = proto.mol, mixtures = proto.mixtures;\n let identity = mixtures.map((mix) => mix.index);\n let leafmask = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.booleanArray(true, mixtures.length);\n for (let mix of mixtures)\n if (mix.parent > 0) {\n let i = identity.indexOf(mix.parent);\n if (i >= 0)\n leafmask[i] = false;\n }\n let root = { 'children': [] };\n let mapTree = new Map();\n mapTree.set(0, root);\n while (true) {\n let anything = false;\n for (let n = 0; n < mixtures.length; n++)\n if (!leafmask[n] && !mapTree.has(mixtures[n].index)) {\n let parent = mapTree.get(mixtures[n].parent);\n if (!parent)\n continue;\n let node = { 'children': [] };\n parent.children.push(node);\n mapTree.set(mixtures[n].index, node);\n anything = true;\n }\n if (!anything)\n break;\n }\n let nonemask = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.booleanArray(true, mol.numAtoms);\n for (let mix of mixtures)\n for (let a of mix.atoms)\n nonemask[a - 1] = false;\n for (let n = 0; n < mixtures.length; n++)\n if (leafmask[n]) {\n let atommask = nonemask.slice(0);\n for (let a of mixtures[n].atoms)\n atommask[a - 1] = true;\n let mixmol = _wmk_data_MolUtil__WEBPACK_IMPORTED_MODULE_3__.MolUtil.subgraphMask(mol, atommask);\n let node = { 'mol': mixmol };\n mapTree.get(mixtures[n].parent).children.push(node);\n }\n if (root.children.length == 1)\n root = root.children[0];\n return root.children;\n }\n protoClone(proto, mol) {\n let dup = {\n 'mol': mol,\n 'children': [],\n 'attachAny': proto.attachAny ? new Map(proto.attachAny) : null,\n 'stereoRacemic': (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_4__.deepClone)(proto.stereoRacemic),\n 'stereoRelative': (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_4__.deepClone)(proto.stereoRelative),\n 'linkNodes': (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_4__.deepClone)(proto.linkNodes),\n 'mixtures': (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_4__.deepClone)(proto.mixtures),\n };\n return dup;\n }\n removeAtom(list, atom) {\n for (let n = list.length - 1; n >= 0; n--) {\n if (list[n] == atom)\n list.splice(n, 1);\n else if (list[n] > atom)\n list[n]--;\n }\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/lookup/ExtractCTABComponent.ts?"); + +/***/ }), + +/***/ "./src/lookup/LookupCompoundDialog.ts": +/*!********************************************!*\ + !*** ./src/lookup/LookupCompoundDialog.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LookupCompoundDialog\": () => (/* binding */ LookupCompoundDialog)\n/* harmony export */ });\n/* harmony import */ var _wmk_dialog_Dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/dialog/Dialog */ \"../../work/WebMolKit/src/dialog/Dialog.ts\");\n/* harmony import */ var _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/gfx/ArrangeMeasurement */ \"../../work/WebMolKit/src/gfx/ArrangeMeasurement.ts\");\n/* harmony import */ var _wmk_gfx_ArrangeMolecule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/gfx/ArrangeMolecule */ \"../../work/WebMolKit/src/gfx/ArrangeMolecule.ts\");\n/* harmony import */ var _wmk_gfx_DrawMolecule__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/gfx/DrawMolecule */ \"../../work/WebMolKit/src/gfx/DrawMolecule.ts\");\n/* harmony import */ var _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/gfx/MetaVector */ \"../../work/WebMolKit/src/gfx/MetaVector.ts\");\n/* harmony import */ var _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../wmk/gfx/Rendering */ \"../../work/WebMolKit/src/gfx/Rendering.ts\");\n/* harmony import */ var _wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../wmk/util/dom */ \"../../work/WebMolKit/src/util/dom.ts\");\n/* harmony import */ var _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../wmk/util/Theme */ \"../../work/WebMolKit/src/util/Theme.ts\");\n/* harmony import */ var _PubChemSearch__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./PubChemSearch */ \"./src/lookup/PubChemSearch.ts\");\n\n\n\n\n\n\n\n\n\nclass LookupCompoundDialog extends _wmk_dialog_Dialog__WEBPACK_IMPORTED_MODULE_0__.Dialog {\n constructor(searchText, parentSize) {\n super();\n this.searchText = searchText;\n this.parentSize = parentSize;\n this.pubchem = null;\n this.resultList = [];\n this.nameSelected = -1;\n this.nameList = [];\n this.nameDOM = [];\n this.molSelected = -1;\n this.molList = [];\n this.molDOM = [];\n this.callbackSelect = null;\n if (!(0,_wmk_util_Theme__WEBPACK_IMPORTED_MODULE_7__.hasInlineCSS)('mixtures-lookupcompound'))\n (0,_wmk_util_Theme__WEBPACK_IMPORTED_MODULE_7__.installInlineCSS)('mixtures-lookupcompound', this.composeCSS());\n this.title = 'Lookup Compound';\n this.minPortionWidth = 95;\n this.maxPortionWidth = 95;\n this.maximumHeight = parentSize[1];\n }\n onSelect(callback) {\n this.callbackSelect = callback;\n }\n populate() {\n let buttons = this.buttonsDOM(), body = this.bodyDOM();\n this.spanStatus = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('').appendTo(buttons);\n buttons.appendText(' ');\n buttons.append(this.domClose);\n buttons.appendText(' ');\n this.btnSearch = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('').appendTo(buttons);\n this.btnSearch.onClick(() => this.runSearch());\n buttons.appendText(' ');\n this.btnApply = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('').appendTo(buttons);\n this.btnApply.onClick(() => this.applyResult());\n this.btnApply.elInput.disabled = true;\n body.css({ 'padding': '0 0 0 0.5em' });\n this.vertical = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(body);\n this.vertical.css({ 'overflow-y': 'scroll', 'height': '100%' });\n this.vertical.css({ 'max-height': (this.parentSize[1] - 200) + 'px' });\n this.vertical.css({ 'padding-right': '18px', 'padding-bottom': '10px' });\n this.populateSearchEntry();\n this.resultArea = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(this.vertical);\n if (this.searchText)\n this.runSearch();\n }\n close() {\n if (this.pubchem)\n this.pubchem.stop();\n super.close();\n }\n getName() {\n return this.nameSelected < 0 ? null : this.nameList[this.nameSelected];\n }\n getMolecule() {\n return this.molSelected < 0 ? null : this.molList[this.molSelected];\n }\n populateSearchEntry() {\n let grid = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(this.vertical).css({ 'display': 'grid' });\n grid.css({ 'width': '100%', 'margin': '0.5em 0 0.5em 0' });\n grid.css({ 'align-items': 'center', 'justify-content': 'start', 'grid-row-gap': '0.5em' });\n grid.css({ 'grid-template-columns': '[start field] max-content [value] 1fr [end]' });\n let divLabel = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(grid).css({ 'grid-column': 'field', 'grid-row': '1', 'padding-right': '0.5em' });\n divLabel.setText('Name:');\n let divInput = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(grid).css({ 'grid-column': 'value', 'grid-row': '1' });\n this.searchInput = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('').appendTo(divInput).css({ 'width': '100%', 'font': 'inherit' });\n this.searchInput.setValue(this.searchText);\n this.searchInput.onKeyDown((event) => this.trapKeys(event));\n this.searchInput.grabFocus();\n }\n runSearch() {\n if (this.pubchem)\n this.pubchem.stop();\n this.resultArea.empty();\n this.resultList = [];\n this.spanStatus.setText('Searching...');\n let text = this.searchInput.getValue();\n if (!text)\n return;\n this.pubchem = new _PubChemSearch__WEBPACK_IMPORTED_MODULE_8__.PubChemSearch(text, (result) => this.gotResult(result), (err) => this.finishedSearch(err));\n this.pubchem.start();\n }\n applyResult() {\n this.callbackSelect(this);\n this.close();\n }\n gotResult(result) {\n this.resultList.push(result);\n let grid = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(this.resultArea).css({ 'display': 'grid' });\n grid.css({ 'width': '100%', 'margin': '0.5em 0 0.5em 0', 'align-items': 'top', 'justify-content': 'start' });\n grid.css({ 'grid-row-gap': '0.5em' });\n grid.css({ 'grid-template-columns': '[start molecule] max-content [names] 1fr [end]' });\n let divMol = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(grid).css({ 'grid-column': 'molecule', 'grid-row': '1', 'padding-right': '0.5em' });\n if (result.mol) {\n let policy = _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_5__.RenderPolicy.defaultColourOnWhite();\n let measure = new _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_1__.OutlineMeasurement(0, 0, policy.data.pointScale);\n let layout = new _wmk_gfx_ArrangeMolecule__WEBPACK_IMPORTED_MODULE_2__.ArrangeMolecule(result.mol, measure, policy);\n layout.arrange();\n layout.squeezeInto(0, 0, 300, 300);\n let gfx = new _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_4__.MetaVector();\n new _wmk_gfx_DrawMolecule__WEBPACK_IMPORTED_MODULE_3__.DrawMolecule(layout, gfx).draw();\n gfx.normalise();\n let svg = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)(gfx.createSVG()).appendTo(divMol).css({ 'display': 'inline-block' });\n svg.addClass('mixtures-lookupcompound-unselected');\n const idx = this.molList.length;\n svg.onClick(() => this.selectMolecule(idx));\n this.molList.push(result.mol);\n this.molDOM.push(svg);\n }\n else\n divMol.setText('(no structure)');\n let divName = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(grid).css({ 'grid-column': 'names', 'grid-row': '1', 'padding-right': '0.5em' });\n if (result.names.length == 0)\n divName.setText('(no names)');\n else\n for (let name of result.names) {\n let div = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('
').appendTo(divName);\n let span = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_6__.dom)('').appendTo(div);\n span.addClass('mixtures-lookupcompound-unselected');\n span.setText(name);\n const idx = this.nameList.length;\n div.onClick(() => this.selectName(idx));\n this.nameList.push(name);\n this.nameDOM.push(span);\n }\n }\n finishedSearch(err) {\n this.spanStatus.setText('');\n if (err)\n alert('Search failed: ' + err);\n else if (this.resultList.length == 0) {\n this.resultArea.empty();\n this.resultArea.setText('Nothing found.');\n }\n }\n trapKeys(event) {\n if (event.keyCode == 27) {\n event.preventDefault();\n this.close();\n }\n else if (event.keyCode == 13) {\n event.preventDefault();\n this.runSearch();\n }\n }\n selectName(idx) {\n let prev = this.nameSelected;\n if (prev == idx)\n idx = -1;\n if (prev >= 0)\n this.nameDOM[prev].removeClass('mixtures-lookupcompound-selected');\n if (idx >= 0)\n this.nameDOM[idx].addClass('mixtures-lookupcompound-selected');\n this.nameSelected = idx;\n this.btnApply.elInput.disabled = this.nameSelected < 0 && this.molSelected < 0;\n }\n selectMolecule(idx) {\n let prev = this.molSelected;\n if (prev == idx)\n idx = -1;\n if (prev >= 0)\n this.molDOM[prev].removeClass('mixtures-lookupcompound-selected');\n if (idx >= 0)\n this.molDOM[idx].addClass('mixtures-lookupcompound-selected');\n this.molSelected = idx;\n this.btnApply.elInput.disabled = this.nameSelected < 0 && this.molSelected < 0;\n }\n composeCSS() {\n return `\n\t\t\t.mixtures-lookupcompound-unselected\n\t\t\t{\n\t\t\t\tcursor: pointer;\n\t\t\t\tbackground-color: transparent;\n\t\t\t\tborder: 1px solid transparent;\n\t\t\t\tpadding: 3px;\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\t\t\t.mixtures-lookupcompound-selected\n\t\t\t{\n\t\t\t\tcursor: default;\n\t\t\t\tbackground-color: #E0E0E0;\n\t\t\t\tborder: 1px solid #808080;\n\t\t\t}\n\t\t`;\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/lookup/LookupCompoundDialog.ts?"); + +/***/ }), + +/***/ "./src/lookup/PubChemSearch.ts": +/*!*************************************!*\ + !*** ./src/lookup/PubChemSearch.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"PubChemSearch\": () => (/* binding */ PubChemSearch)\n/* harmony export */ });\n/* harmony import */ var _wmk_data_CoordUtil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/data/CoordUtil */ \"../../work/WebMolKit/src/data/CoordUtil.ts\");\n/* harmony import */ var _wmk_data_MDLReader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/data/MDLReader */ \"../../work/WebMolKit/src/data/MDLReader.ts\");\n/* harmony import */ var _wmk_data_MolUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/data/MolUtil */ \"../../work/WebMolKit/src/data/MolUtil.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\nconst BASE_COMPOUND = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound';\nclass PubChemSearch {\n constructor(searchText, callbackResult, callbackFinished) {\n this.searchText = searchText;\n this.callbackResult = callbackResult;\n this.callbackFinished = callbackFinished;\n this.stopped = false;\n this.cidList = [];\n }\n static find(searchText) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n let results = [];\n let callbackResult = (result) => {\n results.push(result);\n };\n let callbackFinished = (err) => {\n if (err)\n reject(err);\n else\n resolve(results);\n };\n new PubChemSearch(searchText, callbackResult, callbackFinished).start();\n });\n });\n }\n start() {\n let url = BASE_COMPOUND + '/name/' + encodeURIComponent(this.searchText) + '/cids/JSON';\n const https = __webpack_require__(/*! https */ \"https\");\n https.get(url, (resp) => {\n let data = '';\n resp.on('data', (chunk) => data += chunk);\n resp.on('end', () => this.receivedList(data));\n }).on('error', (err) => { if (!this.stopped)\n this.callbackFinished(err.toString()); });\n }\n stop() {\n this.stopped = true;\n }\n receivedList(data) {\n if (this.stopped)\n return;\n let obj = null;\n try {\n obj = JSON.parse(data);\n }\n catch (ex) {\n console.log('Received unparseable result: ' + data);\n this.callbackFinished('Unparseable result from name query: ' + ex.toString());\n }\n if (!obj.IdentifierList) {\n this.callbackFinished();\n return;\n }\n this.cidList = obj.IdentifierList.CID;\n this.fetchNext();\n }\n fetchNext() {\n if (this.stopped)\n return;\n if (this.cidList.length == 0) {\n this.callbackFinished();\n return;\n }\n let cid = this.cidList.shift();\n let url = BASE_COMPOUND + '/cid/' + cid + '/SDF';\n const https = __webpack_require__(/*! https */ \"https\");\n https.get(url, (resp) => {\n let data = '';\n resp.on('data', (chunk) => data += chunk);\n resp.on('end', () => this.receivedCompound(data));\n }).on('error', (err) => { if (!this.stopped)\n this.callbackFinished(err.toString()); });\n }\n receivedCompound(data) {\n if (this.stopped)\n return;\n let ds = new _wmk_data_MDLReader__WEBPACK_IMPORTED_MODULE_1__.MDLSDFReader(data).parse();\n for (let n = 0; n < ds.numRows; n++)\n this.unpackCompound(ds, n);\n this.fetchNext();\n }\n unpackCompound(ds, row) {\n let result = {\n 'mol': ds.getMolecule(row, 'Molecule'),\n 'names': [],\n 'formula': ds.getString(row, 'PUBCHEM_MOLECULAR_FORMULA'),\n 'inchi': ds.getString(row, 'PUBCHEM_IUPAC_INCHI'),\n 'inchiKey': ds.getString(row, 'PUBCHEM_IUPAC_INCHIKEY'),\n };\n if (result.mol) {\n _wmk_data_MolUtil__WEBPACK_IMPORTED_MODULE_2__.MolUtil.stripHydrogens(result.mol);\n _wmk_data_CoordUtil__WEBPACK_IMPORTED_MODULE_0__.CoordUtil.normaliseBondDistances(result.mol);\n }\n const NAMECOLS = ['PUBCHEM_IUPAC_TRADITIONAL_NAME', 'PUBCHEM_IUPAC_SYSTEMATIC_NAME',\n 'PUBCHEM_IUPAC_OPENEYE_NAME', 'PUBCHEM_IUPAC_CAS_NAME', 'PUBCHEM_IUPAC_NAME'];\n for (let colName of NAMECOLS) {\n let names = ds.getString(row, colName);\n if (!names || typeof names != 'string')\n continue;\n for (let name of names.split('\\n'))\n if (name && result.names.indexOf(name) < 0)\n result.names.push(name);\n }\n this.callbackResult(result);\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/lookup/PubChemSearch.ts?"); + +/***/ }), + +/***/ "./src/main/CollectionPanel.ts": +/*!*************************************!*\ + !*** ./src/main/CollectionPanel.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CollectionPanel\": () => (/* binding */ CollectionPanel)\n/* harmony export */ });\n/* harmony import */ var _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/gfx/ArrangeMeasurement */ \"../../work/WebMolKit/src/gfx/ArrangeMeasurement.ts\");\n/* harmony import */ var _wmk_gfx_FontData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/gfx/FontData */ \"../../work/WebMolKit/src/gfx/FontData.ts\");\n/* harmony import */ var _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/gfx/MetaVector */ \"../../work/WebMolKit/src/gfx/MetaVector.ts\");\n/* harmony import */ var _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/gfx/Rendering */ \"../../work/WebMolKit/src/gfx/Rendering.ts\");\n/* harmony import */ var _wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/util/dom */ \"../../work/WebMolKit/src/util/dom.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _data_Mixture__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/Mixture */ \"./src/data/Mixture.ts\");\n/* harmony import */ var _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../data/MixtureCollection */ \"./src/data/MixtureCollection.ts\");\n/* harmony import */ var _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../mixture/ArrangeMixture */ \"./src/mixture/ArrangeMixture.ts\");\n/* harmony import */ var _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../mixture/DrawMixture */ \"./src/mixture/DrawMixture.ts\");\n/* harmony import */ var _mixture_EditMixture__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../mixture/EditMixture */ \"./src/mixture/EditMixture.ts\");\n/* harmony import */ var _startup__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../startup */ \"./src/startup.ts\");\n/* harmony import */ var _MainPanel__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./MainPanel */ \"./src/main/MainPanel.ts\");\n/* harmony import */ var _MenuBanner__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./MenuBanner */ \"./src/main/MenuBanner.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst BANNER = [\n [\n { 'icon': 'CommandSave.svg', 'tip': 'Save', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Save },\n ],\n [\n { 'icon': 'CommandEdit.svg', 'tip': 'Edit component', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.EditDetails },\n { 'icon': 'CommandStructure.svg', 'tip': 'Edit structure', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.EditStructure },\n { 'icon': 'CommandLookup.svg', 'tip': 'Lookup compound', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Lookup },\n { 'icon': 'CommandPicture.svg', 'tip': 'Export graphics', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ExportSVG },\n ],\n [\n { 'icon': 'CommandAppend.svg', 'tip': 'Append component', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Append },\n { 'icon': 'CommandPrepend.svg', 'tip': 'Prepend component', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Prepend },\n { 'icon': 'CommandDelete.svg', 'tip': 'Delete', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Delete },\n { 'icon': 'CommandMoveUp.svg', 'tip': 'Move Up', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.MoveUp },\n { 'icon': 'CommandMoveDown.svg', 'tip': 'Move Down', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.MoveDown },\n ],\n [\n { 'icon': 'CommandUndo.svg', 'tip': 'Undo', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Undo },\n { 'icon': 'CommandRedo.svg', 'tip': 'Redo', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Redo },\n ],\n [\n { 'icon': 'CommandCopy.svg', 'tip': 'Copy', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Copy },\n { 'icon': 'CommandCut.svg', 'tip': 'Cut', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Cut },\n { 'icon': 'CommandPaste.svg', 'tip': 'Paste', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Paste },\n ],\n [\n { 'icon': 'CommandViewDetail.svg', 'tip': 'Detail', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewDetail },\n { 'icon': 'CommandViewCard.svg', 'tip': 'Cards', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewCard },\n { 'icon': 'CommandZoomNormal.svg', 'tip': 'Zoom full', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomFull },\n { 'icon': 'CommandZoomIn.svg', 'tip': 'Zoom in', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomIn },\n { 'icon': 'CommandZoomOut.svg', 'tip': 'Zoom out', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomOut },\n ],\n];\nvar CollectionPanelView;\n(function (CollectionPanelView) {\n CollectionPanelView[CollectionPanelView[\"Detail\"] = 0] = \"Detail\";\n CollectionPanelView[CollectionPanelView[\"Card\"] = 1] = \"Card\";\n})(CollectionPanelView || (CollectionPanelView = {}));\nconst BG_NORMAL = '#E0E0E0';\nconst BG_SELECTED = '#B9CBFF';\nconst PAGE_SIZE = 100;\nclass CollectionPanel extends _MainPanel__WEBPACK_IMPORTED_MODULE_12__.MainPanel {\n constructor(root, proxyClip, proxyMenu) {\n super(root);\n this.proxyClip = proxyClip;\n this.proxyMenu = proxyMenu;\n this.filename = null;\n this.collection = new _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_7__.MixtureCollection();\n this.curPage = 0;\n this.pageBlock = [];\n this.isDirty = false;\n this.policy = _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_3__.RenderPolicy.defaultColourOnWhite(20);\n this.viewType = CollectionPanelView.Detail;\n this.selected = -1;\n this.mapMixDiv = new Map();\n this.editor = null;\n this.banner = new _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBanner(BANNER, (cmd) => this.menuAction(cmd));\n let divFlex = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(root).css({ 'display': 'flex' });\n divFlex.css({ 'flex-direction': 'column', 'width': '100%', 'height': '100%' });\n let divBanner = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(divFlex).css({ 'flex-grow': '0' });\n this.divMain = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(divFlex).css({ 'flex-grow': '1', 'overflow-y': 'scroll' });\n this.divFooter = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(divFlex).css({ 'flex-grow': '0' });\n this.banner.render(divBanner);\n this.dividePages();\n this.renderMain();\n this.updateBanner();\n }\n setCollection(collection) {\n this.collection = collection;\n this.dividePages();\n this.renderMain();\n }\n loadFile(filename) {\n if (!filename) {\n this.setCollection(new _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_7__.MixtureCollection());\n return;\n }\n const fs = __webpack_require__(/*! fs */ \"fs\");\n fs.readFile(filename, 'utf-8', (err, data) => {\n if (err)\n throw err;\n let collection;\n try {\n collection = _data_MixtureCollection__WEBPACK_IMPORTED_MODULE_7__.MixtureCollection.deserialise(data);\n }\n catch (e) {\n console.log('Invalid mixture collection file: ' + e + '\\n' + data);\n alert('Not a valid mixture collection file.');\n return;\n }\n this.setCollection(collection);\n this.filename = filename;\n this.isDirty = false;\n this.updateTitle();\n });\n }\n menuAction(cmd) {\n if (this.editor) {\n let dlg = this.editor.compoundEditor();\n if (dlg) {\n if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Cut)\n dlg.actionCut();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Copy)\n dlg.actionCopy();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Paste)\n dlg.actionPaste();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Undo)\n dlg.actionUndo();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Redo)\n dlg.actionRedo();\n return;\n }\n if (!this.editor.isReceivingCommands()) {\n if ([_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Cut, _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Copy, _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Paste,\n _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Undo, _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Redo].indexOf(cmd) >= 0)\n document.execCommand(cmd);\n return;\n }\n }\n super.menuAction(cmd);\n }\n customMenuAction(cmd) {\n if (this.editor) {\n if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Undo)\n this.editor.performUndo();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Redo)\n this.editor.performRedo();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Cut)\n this.editor.clipboardCopy(true);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Copy)\n this.editor.clipboardCopy(false);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.CopyBranch)\n this.editor.clipboardCopy(false, true);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Paste)\n this.editor.clipboardPaste();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.EditStructure)\n this.editor.editStructure();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.EditDetails)\n this.editor.editDetails();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Lookup)\n this.editor.lookupCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Delete)\n this.editor.deleteCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Append)\n this.editor.appendToCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Prepend)\n this.editor.prependBeforeCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.MoveUp)\n this.editor.reorderCurrent(-1);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.MoveDown)\n this.editor.reorderCurrent(1);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomFull)\n this.editor.zoomFull();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomNormal)\n this.editor.zoomFull();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomIn)\n this.editor.zoom(1.25);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomOut)\n this.editor.zoom(0.8);\n else\n super.customMenuAction(cmd);\n }\n else {\n if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Cut)\n this.clipboardCopy(true);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Copy)\n this.clipboardCopy(false);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Paste)\n this.clipboardPaste();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.EditDetails)\n this.editMixture();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Delete)\n this.deleteMixture();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Append)\n this.appendMixture();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Prepend)\n this.prependMixture();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.MoveUp)\n this.reorderCurrent(-1);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.MoveDown)\n this.reorderCurrent(1);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomFull)\n this.zoomScale();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomIn)\n this.zoomScale(1.25);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ZoomOut)\n this.zoomScale(0.8);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewDetail)\n this.changeView(cmd);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewCard)\n this.changeView(cmd);\n else\n super.customMenuAction(cmd);\n }\n }\n renderMain() {\n this.divMain.empty();\n this.divFooter.empty();\n this.selected = -1;\n this.mapMixDiv.clear();\n let divContent = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(this.divMain);\n if (this.viewType == CollectionPanelView.Card) {\n divContent.css({ 'display': 'flex', 'flex-wrap': 'wrap' });\n divContent.css({ 'justify-content': 'flex-start', 'align-items': 'flex-start' });\n }\n for (let idx of this.pageBlock[this.curPage]) {\n let div = this.createMixture(idx, this.collection.getMixture(idx)).appendTo(divContent);\n div.onClick(() => this.changeSelection(idx));\n div.onDblClick(() => this.editMixture());\n this.mapMixDiv.set(idx, div);\n }\n let npage = this.pageBlock.length;\n if (npage > 1) {\n this.divFooter.css({ 'text-align': 'center', 'border-top': '1px solid #808080', 'background-color': 'white' });\n if (this.curPage > 0) {\n let ahref = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('').appendTo(this.divFooter).attr({ 'href': '#' });\n ahref.setText('Previous');\n ahref.onClick((event) => {\n this.curPage--;\n this.renderMain();\n event.preventDefault();\n });\n }\n let showPages = [];\n for (let n = Math.max(0, this.curPage - 5); n <= Math.min(npage - 1, this.curPage + 5); n++)\n showPages.push(n);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.first(showPages) != 0)\n showPages.unshift(0);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_5__.Vec.last(showPages) != npage - 1)\n showPages.push(npage - 1);\n for (let n = 0; n < showPages.length; n++) {\n let page = showPages[n];\n if (n > 0 && page != showPages[n - 1] + 1)\n this.divFooter.appendText('...');\n if (page != this.curPage) {\n let ahref = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('').appendTo(this.divFooter).attr({ 'href': '#' });\n ahref.setText(`${page + 1}`);\n ahref.onClick((event) => {\n this.curPage = page;\n this.renderMain();\n event.preventDefault();\n });\n }\n else\n this.divFooter.appendHTML(`${page + 1}`);\n }\n if (this.curPage < npage - 1) {\n let ahref = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('').appendTo(this.divFooter).attr({ 'href': '#' });\n ahref.setText('Next');\n ahref.onClick((event) => {\n this.curPage++;\n this.renderMain();\n event.preventDefault();\n });\n }\n for (let dom of this.divFooter.findAll('a,span'))\n dom.css({ 'margin-left': '0.25em', 'margin-right': '0.25em' });\n this.divFooter.appendText(` (${this.collection.count})`);\n }\n }\n dividePages() {\n let sz = this.collection.count;\n if (sz == 0) {\n this.pageBlock = [[]];\n this.curPage = 0;\n return;\n }\n let blk = [];\n this.pageBlock = [blk];\n for (let n = 0; n < sz; n++) {\n if (blk.length >= PAGE_SIZE)\n this.pageBlock.push(blk = []);\n blk.push(n);\n }\n this.curPage = Math.min(this.curPage, this.pageBlock.length - 1);\n }\n createMixture(idx, mixture) {\n let divOuter = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
');\n if (this.viewType == CollectionPanelView.Detail) {\n divOuter.css({ 'display': 'block' });\n }\n else {\n divOuter.css({ 'display': 'inline-block' });\n }\n let divInner = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(divOuter).css({ 'display': 'flex' });\n divInner.css({ 'margin': '2px', 'padding': '2px', 'border-radius': '4px' });\n divInner.css({ 'background-color': BG_NORMAL, 'border': '1px solid #808080' });\n let measure = new _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_0__.OutlineMeasurement(0, 0, this.policy.data.pointScale);\n let layout = new _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_8__.ArrangeMixture(mixture, measure, this.policy);\n layout.arrange();\n let gfx = new _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_2__.MetaVector();\n let draw = new _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_9__.DrawMixture(layout, gfx);\n draw.draw();\n let tag = (idx + 1).toString(), fsz = 10, tpad = 2;\n let wad = _wmk_gfx_FontData__WEBPACK_IMPORTED_MODULE_1__.FontData.measureText(tag, fsz);\n gfx.drawRect(0, 0, wad[0] + 2 * tpad, wad[1] + 2 * tpad, _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_2__.MetaVector.NOCOLOUR, 0, 0x000000);\n gfx.drawText(0 + tpad, tpad, tag, fsz, 0xFFFFFF, _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_2__.TextAlign.Top | _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_2__.TextAlign.Left);\n gfx.normalise();\n let wrapSVG = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(divInner).css({ 'display': 'inline-block' });\n (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)(gfx.createSVG()).appendTo(wrapSVG).css({ 'display': 'block' });\n if (this.viewType == CollectionPanelView.Detail)\n this.displayFields((0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(divInner), mixture);\n return divInner;\n }\n changeView(cmd) {\n if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewDetail)\n this.viewType = CollectionPanelView.Detail;\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewCard)\n this.viewType = CollectionPanelView.Card;\n this.renderMain();\n }\n changeSelection(idx) {\n if (this.selected >= 0) {\n let div = this.mapMixDiv.get(this.selected);\n if (div)\n div.css({ 'background-color': BG_NORMAL });\n }\n this.selected = idx;\n if (idx >= 0) {\n let div = this.mapMixDiv.get(idx);\n if (div)\n div.css({ 'background-color': BG_SELECTED });\n }\n }\n actionFileOpen() {\n const electron = __webpack_require__(/*! electron */ \"electron\");\n const remote = __webpack_require__(/*! @electron/remote */ \"./node_modules/@electron/remote/renderer/index.js\");\n const dialog = remote.dialog;\n let params = {\n 'title': 'Open Mixtures',\n 'properties': ['openFile'],\n 'filters': [\n { 'name': 'Mixfile Collection', 'extensions': ['json'] },\n { 'name': 'Mixfile', 'extensions': ['mixfile'] },\n ]\n };\n dialog.showOpenDialog(params).then((value) => {\n if (value.canceled)\n return;\n for (let fn of value.filePaths) {\n if (fn.endsWith('.mixfile'))\n (0,_startup__WEBPACK_IMPORTED_MODULE_11__.openNewWindow)('MixturePanel', fn);\n else\n (0,_startup__WEBPACK_IMPORTED_MODULE_11__.openNewWindow)('CollectionPanel', fn);\n }\n });\n }\n actionFileSave() {\n if (this.editor) {\n this.stopEdit();\n return;\n }\n if (!this.filename) {\n this.actionFileSaveAs();\n return;\n }\n this.saveFile(this.filename);\n this.isDirty = false;\n this.updateTitle();\n }\n actionFileSaveAs() {\n const electron = __webpack_require__(/*! electron */ \"electron\");\n const remote = __webpack_require__(/*! @electron/remote */ \"./node_modules/@electron/remote/renderer/index.js\");\n const dialog = remote.dialog;\n let params = {\n 'title': 'Save Mixfile Collection',\n 'filters': [\n { 'name': 'Mixfile Collection', 'extensions': ['json'] }\n ]\n };\n dialog.showSaveDialog({}).then((value) => {\n if (value.canceled)\n return;\n this.saveFile(value.filePath);\n this.filename = value.filePath;\n this.isDirty = false;\n this.updateTitle();\n });\n }\n saveFile(filename) {\n let content = this.collection.serialise();\n const fs = __webpack_require__(/*! fs */ \"fs\");\n fs.writeFile(filename, content, (err) => {\n if (err)\n alert('Unable to save: ' + err);\n });\n }\n updateTitle() {\n if (this.filename == null) {\n document.title = 'Mixture Collection';\n return;\n }\n let slash = Math.max(this.filename.lastIndexOf('/'), this.filename.lastIndexOf('\\\\'));\n let title = 'Mixture Collection - ' + this.filename.substring(slash + 1);\n if (this.isDirty)\n title += '*';\n document.title = title;\n }\n updateBanner() {\n let isEditing = this.editor != null;\n this.banner.activateButtons({\n [_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.EditStructure]: isEditing,\n [_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Lookup]: isEditing,\n [_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ExportSVG]: isEditing,\n [_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Undo]: isEditing,\n [_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.Redo]: isEditing,\n [_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewDetail]: !isEditing,\n [_MenuBanner__WEBPACK_IMPORTED_MODULE_13__.MenuBannerCommand.ViewCard]: !isEditing,\n });\n }\n scrollToIndex(idx) {\n if (idx < 0)\n return;\n let div = this.mapMixDiv.get(idx);\n if (div)\n this.divMain.el.scrollTop = div.offset().y - this.divMain.offset().y + this.divMain.el.scrollTop;\n }\n editMixture() {\n if (this.selected < 0)\n return;\n this.editor = new _mixture_EditMixture__WEBPACK_IMPORTED_MODULE_10__.EditMixture(this.proxyClip, this.proxyMenu);\n this.divMain.empty();\n this.editor.render(this.divMain);\n this.editor.setMixture(this.collection.getMixture(this.selected));\n this.editor.setDirty(false);\n this.updateBanner();\n }\n stopEdit() {\n if (!this.editor)\n return;\n let idx = this.selected;\n if (this.editor.isDirty()) {\n this.collection.setMixture(idx, this.editor.getMixture());\n this.isDirty = true;\n }\n this.editor = null;\n this.renderMain();\n this.changeSelection(idx);\n this.scrollToIndex(idx);\n this.updateBanner();\n this.updateTitle();\n }\n clipboardCopy(withCut) {\n let idx = this.selected;\n if (idx < 0 || this.editor)\n return;\n let str = this.collection.getMixture(idx).serialise();\n this.proxyClip.setString(str);\n if (withCut) {\n this.collection.deleteMixture(idx);\n this.isDirty = true;\n let top = this.divMain.el.scrollTop;\n this.renderMain();\n this.divMain.el.scrollTop = top;\n this.updateBanner();\n this.updateTitle();\n }\n }\n clipboardPaste() {\n let mixture = _data_Mixture__WEBPACK_IMPORTED_MODULE_6__.Mixture.deserialise(this.proxyClip.getString());\n if (!mixture) {\n alert('No mixture on clipboard.');\n return;\n }\n this.appendMixture(mixture);\n }\n deleteMixture() {\n let idx = this.selected;\n if (idx < 0 || this.editor)\n return;\n this.collection.deleteMixture(idx);\n this.renderMain();\n if (idx < this.collection.count)\n this.scrollToIndex(idx);\n this.isDirty = true;\n this.updateTitle();\n }\n appendMixture(mixture) {\n if (!mixture)\n mixture = new _data_Mixture__WEBPACK_IMPORTED_MODULE_6__.Mixture();\n if (this.editor)\n return;\n let idx;\n if (this.selected < 0) {\n idx = this.collection.appendMixture(mixture);\n }\n else {\n idx = this.selected + 1;\n this.collection.insertMixture(idx, mixture);\n }\n this.dividePages();\n this.renderMain();\n this.changeSelection(idx);\n this.scrollToIndex(idx);\n this.isDirty = true;\n this.updateTitle();\n }\n prependMixture() {\n if (this.editor)\n return;\n let idx = Math.max(0, this.selected);\n this.collection.insertMixture(idx, new _data_Mixture__WEBPACK_IMPORTED_MODULE_6__.Mixture());\n let top = this.divMain.el.scrollTop;\n this.renderMain();\n this.changeSelection(idx);\n this.divMain.el.scrollTop = top;\n this.isDirty = true;\n this.updateTitle();\n }\n reorderCurrent(dir) {\n let idx = this.selected;\n if (idx < 0 || idx + dir < 0 || idx + dir >= this.collection.count || this.editor)\n return;\n this.collection.swapMixtures(idx, idx + dir);\n let top = this.divMain.el.scrollTop;\n this.renderMain();\n this.changeSelection(idx + dir);\n this.divMain.el.scrollTop = top;\n this.isDirty = true;\n this.updateTitle();\n }\n zoomScale(scale) {\n }\n displayFields(domParent, mixture) {\n let items = [];\n let root = mixture.mixfile;\n const SKIP = ['name', 'molfile', 'quantity', 'ratio', 'units', 'relation', 'mixfileVersion'];\n for (let key in root)\n if (!SKIP.includes(key)) {\n let val = root[key];\n if (typeof val != 'string' && typeof val != 'number')\n continue;\n items.push([key, val.toString()]);\n }\n if (items.length == 0)\n return;\n items.sort((i1, i2) => i1[0].localeCompare(i2[0]));\n domParent.css({ 'padding-left': '0.5em' });\n let flex = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(domParent).css({ 'display': 'flex' });\n flex.css({ 'flex-direction': 'row', 'flex-wrap': 'wrap', 'justify-content': 'flex-start', 'align-items': 'flex-start' });\n for (let [title, label] of items) {\n let div = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(flex).css({ 'white-space': 'nowrap', 'margin': '0 0.2em 0.2em 0' });\n let divTitle = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(div).css({ 'display': 'inline-block', 'padding': '0.2em', 'background-color': '#C0C0C0', 'border': '1px solid black' });\n let divLabel = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_4__.dom)('
').appendTo(div).css({ 'display': 'inline-block', 'padding': '0.2em', 'background-color': '#F8F8F8', 'border': '1px solid black' });\n divTitle.css({ 'border-right': 'none' });\n divTitle.css({ 'border-radius': '0.2em 0 0 0.2em' });\n divLabel.css({ 'border-radius': '0 0.2em 0.2em 0' });\n divTitle.setText(title);\n divLabel.setText(label);\n }\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/main/CollectionPanel.ts?"); + +/***/ }), + +/***/ "./src/main/InChI.ts": +/*!***************************!*\ + !*** ./src/main/InChI.ts ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"InChI\": () => (/* binding */ InChI)\n/* harmony export */ });\n/* harmony import */ var _wmk_data_MDLWriter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/data/MDLWriter */ \"../../work/WebMolKit/src/data/MDLWriter.ts\");\n/* harmony import */ var _wmk_data_MolUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/data/MolUtil */ \"../../work/WebMolKit/src/data/MolUtil.ts\");\n/* harmony import */ var _startup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../startup */ \"./src/startup.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\nlet execLocation = null;\nlet inchi = null;\nclass InChI {\n constructor() {\n this.available = false;\n this.inchiPath = execLocation;\n this.remote = null;\n if (!_startup__WEBPACK_IMPORTED_MODULE_2__.ON_DESKTOP)\n return;\n if (!this.inchiPath) {\n this.remote = __webpack_require__(/*! @electron/remote */ \"./node_modules/@electron/remote/renderer/index.js\");\n this.inchiPath = this.remote.getGlobal('INCHI_EXEC');\n }\n if (this.inchiPath) {\n const fs = __webpack_require__(/*! fs */ \"fs\");\n try {\n fs.accessSync(this.inchiPath, fs.constants.X_OK);\n this.available = true;\n }\n catch (ex) { }\n }\n }\n static hasExecutable() {\n return !!execLocation;\n }\n static setExecutable(exec) {\n execLocation = exec;\n }\n static isAvailable() {\n if (this.nativeMolfileToInChI != null)\n return true;\n if (!inchi)\n inchi = new InChI();\n return inchi.available;\n }\n static makeInChI(mol) {\n return __awaiter(this, void 0, void 0, function* () {\n mol = mol.clone();\n _wmk_data_MolUtil__WEBPACK_IMPORTED_MODULE_1__.MolUtil.expandAbbrevs(mol, true);\n for (let n = 1; n <= mol.numBonds; n++)\n if (mol.bondOrder(n) < 1 || mol.bondOrder(n) > 3)\n mol.setBondOrder(n, 1);\n let writer = new _wmk_data_MDLWriter__WEBPACK_IMPORTED_MODULE_0__.MDLMOLWriter(mol);\n writer.enhancedFields = false;\n let mdlmol = writer.write();\n if (this.nativeMolfileToInChI != null) {\n let inchi = yield this.nativeMolfileToInChI(mdlmol, '-AuxNone -NoLabels');\n return [inchi, null];\n }\n if (!inchi)\n inchi = new InChI();\n if (!inchi.available)\n throw 'InChI executable is not available.';\n const proc = __webpack_require__(/*! child_process */ \"child_process\"), path = __webpack_require__(/*! path */ \"path\");\n let cmd = inchi.inchiPath.replace(/ /g, '\\\\\\ ');\n let result = proc.spawnSync(cmd, ['-STDIO', '-AuxNone', '-NoLabels', '-Key'], { 'input': mdlmol });\n let raw = result.stdout.toString(), bits = raw.split('\\n');\n if (bits.length < 2 || !bits[0].startsWith('InChI=')) {\n console.log('InChI command returned result:\\n' + raw);\n console.log('Molecule:\\n' + mol);\n console.log('MDL Molfile:\\n' + mdlmol);\n throw 'Invalid returned by InChI generator: ' + raw;\n }\n return bits;\n });\n }\n}\nInChI.nativeMolfileToInChI = null;\n\n\n//# sourceURL=webpack://Mixtures/./src/main/InChI.ts?"); + +/***/ }), + +/***/ "./src/main/MainPanel.ts": +/*!*******************************!*\ + !*** ./src/main/MainPanel.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MainPanel\": () => (/* binding */ MainPanel)\n/* harmony export */ });\n/* harmony import */ var _wmk_util_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/util/dom */ \"../../work/WebMolKit/src/util/dom.ts\");\n/* harmony import */ var _startup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../startup */ \"./src/startup.ts\");\n/* harmony import */ var _MenuBanner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MenuBanner */ \"./src/main/MenuBanner.ts\");\n\n\n\nclass MainPanel {\n constructor(root) {\n this.root = root;\n (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_0__.dom)('body').css({ 'overflow': 'hidden' });\n root.css({ 'width': '100%', 'height': document.documentElement.clientHeight + 'px' });\n window.addEventListener('resize', () => this.onResize());\n root.css({ 'user-select': 'none' });\n this.root.el.addEventListener('menuAction', (event, cmd) => this.menuAction(cmd));\n }\n loadFile(filename) {\n }\n onResize() {\n this.root.css({ 'height': document.documentElement.clientHeight + 'px' });\n }\n menuAction(cmd) {\n if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_2__.MenuBannerCommand.NewMixture)\n (0,_startup__WEBPACK_IMPORTED_MODULE_1__.openNewWindow)('MixturePanel');\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_2__.MenuBannerCommand.NewCollection)\n (0,_startup__WEBPACK_IMPORTED_MODULE_1__.openNewWindow)('CollectionPanel');\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_2__.MenuBannerCommand.Open)\n this.actionFileOpen();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_2__.MenuBannerCommand.Save)\n this.actionFileSave();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_2__.MenuBannerCommand.SaveAs)\n this.actionFileSaveAs();\n else\n this.customMenuAction(cmd);\n }\n customMenuAction(cmd) {\n console.log('MENU:' + cmd);\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/main/MainPanel.ts?"); + +/***/ }), + +/***/ "./src/main/MenuBanner.ts": +/*!********************************!*\ + !*** ./src/main/MenuBanner.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MenuBanner\": () => (/* binding */ MenuBanner),\n/* harmony export */ \"MenuBannerCommand\": () => (/* binding */ MenuBannerCommand)\n/* harmony export */ });\n/* harmony import */ var _wmk_ui_Tooltip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/ui/Tooltip */ \"../../work/WebMolKit/src/ui/Tooltip.ts\");\n/* harmony import */ var _wmk_util_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/util/dom */ \"../../work/WebMolKit/src/util/dom.ts\");\n/* harmony import */ var _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/util/Geom */ \"../../work/WebMolKit/src/util/Geom.ts\");\n/* harmony import */ var _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/util/Theme */ \"../../work/WebMolKit/src/util/Theme.ts\");\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n\n\n\n\n\nvar MenuBannerCommand;\n(function (MenuBannerCommand) {\n MenuBannerCommand[\"NewMixture\"] = \"newMixture\";\n MenuBannerCommand[\"NewCollection\"] = \"newCollection\";\n MenuBannerCommand[\"Open\"] = \"open\";\n MenuBannerCommand[\"Save\"] = \"save\";\n MenuBannerCommand[\"SaveAs\"] = \"saveAs\";\n MenuBannerCommand[\"EditDetails\"] = \"editDetails\";\n MenuBannerCommand[\"EditStructure\"] = \"editStructure\";\n MenuBannerCommand[\"Lookup\"] = \"lookup\";\n MenuBannerCommand[\"ExportSVG\"] = \"exportSVG\";\n MenuBannerCommand[\"ExportSDF\"] = \"exportSDF\";\n MenuBannerCommand[\"CreateMInChI\"] = \"createMInChI\";\n MenuBannerCommand[\"Append\"] = \"append\";\n MenuBannerCommand[\"Prepend\"] = \"prepend\";\n MenuBannerCommand[\"InsertBefore\"] = \"insertBefore\";\n MenuBannerCommand[\"InsertAfter\"] = \"insertAfter\";\n MenuBannerCommand[\"Delete\"] = \"delete\";\n MenuBannerCommand[\"MoveUp\"] = \"moveUp\";\n MenuBannerCommand[\"MoveDown\"] = \"moveDown\";\n MenuBannerCommand[\"Undo\"] = \"undo\";\n MenuBannerCommand[\"Redo\"] = \"redo\";\n MenuBannerCommand[\"Copy\"] = \"copy\";\n MenuBannerCommand[\"CopyBranch\"] = \"copyBranch\";\n MenuBannerCommand[\"Cut\"] = \"cut\";\n MenuBannerCommand[\"Paste\"] = \"paste\";\n MenuBannerCommand[\"ZoomFull\"] = \"zoomFull\";\n MenuBannerCommand[\"ZoomNormal\"] = \"zoomNormal\";\n MenuBannerCommand[\"ZoomIn\"] = \"zoomIn\";\n MenuBannerCommand[\"ZoomOut\"] = \"zoomOut\";\n MenuBannerCommand[\"ViewDetail\"] = \"viewDetail\";\n MenuBannerCommand[\"ViewCard\"] = \"viewCard\";\n MenuBannerCommand[\"Back\"] = \"back\";\n})(MenuBannerCommand || (MenuBannerCommand = {}));\nconst CSS_MENUBANNER = `\n\t*.mixtures-menubanner-button:hover\n\t{\n\t\tbackground-color: #D0D0D0;\n\t}\n\t*.mixtures-menubanner-button:active\n\t{\n\t\tbackground-color: #C0C0C0;\n\t}\n`;\nclass MenuBanner {\n constructor(commands, callbackAction) {\n this.commands = commands;\n this.callbackAction = callbackAction;\n this.callbackRefocus = null;\n this.mapDiv = {};\n this.mapSVG = {};\n this.mapActive = {};\n this.selected = new Set();\n (0,_wmk_util_Theme__WEBPACK_IMPORTED_MODULE_3__.installInlineCSS)('mixtures-menubanner', CSS_MENUBANNER);\n }\n render(domParent) {\n domParent.empty();\n this.divFlex = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_1__.dom)('
').appendTo(domParent).css({ 'display': 'flex', 'width': '100%', 'height': '100%' });\n this.divFlex.css({ 'flex-direction': 'row', 'flex-wrap': 'nowrap', 'justify-content': 'space-around', 'align-items': 'center' });\n this.divFlex.css({ 'background': 'linear-gradient(to bottom, #FFFFFF, #C0C0C0)' });\n this.divFlex.css({ 'user-select': 'none' });\n for (let blk of this.commands) {\n let divBlk = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_1__.dom)('
').appendTo(this.divFlex);\n for (let btn of blk) {\n let [div, svg] = this.createCommand(btn);\n divBlk.append(div);\n this.mapDiv[btn.cmd] = div;\n this.mapSVG[btn.cmd] = svg;\n this.mapActive[btn.cmd] = true;\n }\n }\n }\n activateButtons(map) {\n for (let cmd in map) {\n let active = this.mapActive[cmd] = map[cmd];\n this.mapSVG[cmd].css({ 'opacity': active ? 1 : 0.5 });\n }\n }\n addSelected(cmd) {\n if (this.selected.has(cmd))\n return;\n this.selected.add(cmd);\n this.mapDiv[cmd].css({ 'background-color': '#D0D0D0' });\n }\n removeSelected(cmd) {\n if (!this.selected.has(cmd))\n return;\n this.selected.delete(cmd);\n this.mapDiv[cmd].css({ 'background-color': 'transparent' });\n }\n iconPosition(cmd) {\n let div = this.mapDiv[cmd];\n if (!div)\n return null;\n return new _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_2__.Box(div.elHTML.offsetLeft, div.elHTML.offsetTop, div.width(), div.height());\n }\n createCommand(btn) {\n let div = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_1__.dom)('
').css({ 'display': 'inline-block' });\n div.setAttr('id', 'mixtureEditor_btn_' + btn.icon.substring(0, btn.icon.lastIndexOf('.')));\n let width = btn.width ? btn.width : 20;\n div.css({ 'width': `${width}px`, 'height': '20px', 'margin': '2px', 'padding': '5px' });\n div.css({ 'border-radius': '4px' });\n if (this.selected.has(btn.cmd))\n div.css({ 'background-color': '#D0D0D0' });\n let imgURL = _wmk_util_Theme__WEBPACK_IMPORTED_MODULE_3__.Theme.RESOURCE_URL + '/img/icons/' + btn.icon;\n let svg = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_1__.dom)('').appendTo(div).attr({ 'src': imgURL });\n div.addClass('mixtures-menubanner-button');\n div.onClick(() => {\n if (this.callbackRefocus)\n this.callbackRefocus();\n if (!this.mapActive[btn.cmd])\n return;\n this.callbackAction(btn.cmd);\n });\n if (btn.tip)\n (0,_wmk_ui_Tooltip__WEBPACK_IMPORTED_MODULE_0__.addTooltip)(div, (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_4__.escapeHTML)(btn.tip));\n return [div, svg];\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/main/MenuBanner.ts?"); + +/***/ }), + +/***/ "./src/main/MixturePanel.ts": +/*!**********************************!*\ + !*** ./src/main/MixturePanel.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MixturePanel\": () => (/* binding */ MixturePanel)\n/* harmony export */ });\n/* harmony import */ var _wmk_dialog_Dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/dialog/Dialog */ \"../../work/WebMolKit/src/dialog/Dialog.ts\");\n/* harmony import */ var _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/gfx/ArrangeMeasurement */ \"../../work/WebMolKit/src/gfx/ArrangeMeasurement.ts\");\n/* harmony import */ var _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/gfx/MetaVector */ \"../../work/WebMolKit/src/gfx/MetaVector.ts\");\n/* harmony import */ var _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/gfx/Rendering */ \"../../work/WebMolKit/src/gfx/Rendering.ts\");\n/* harmony import */ var _wmk_ui_ClipboardProxy__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/ui/ClipboardProxy */ \"../../work/WebMolKit/src/ui/ClipboardProxy.ts\");\n/* harmony import */ var _wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../wmk/util/dom */ \"../../work/WebMolKit/src/util/dom.ts\");\n/* harmony import */ var _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../wmk/util/Geom */ \"../../work/WebMolKit/src/util/Geom.ts\");\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n/* harmony import */ var _data_Mixfile__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../data/Mixfile */ \"./src/data/Mixfile.ts\");\n/* harmony import */ var _data_Mixture__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../data/Mixture */ \"./src/data/Mixture.ts\");\n/* harmony import */ var _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../mixture/ArrangeMixture */ \"./src/mixture/ArrangeMixture.ts\");\n/* harmony import */ var _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../mixture/DrawMixture */ \"./src/mixture/DrawMixture.ts\");\n/* harmony import */ var _mixture_EditMixture__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../mixture/EditMixture */ \"./src/mixture/EditMixture.ts\");\n/* harmony import */ var _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../mixture/ExportMInChI */ \"./src/mixture/ExportMInChI.ts\");\n/* harmony import */ var _mixture_ExportSDFile__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../mixture/ExportSDFile */ \"./src/mixture/ExportSDFile.ts\");\n/* harmony import */ var _startup__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../startup */ \"./src/startup.ts\");\n/* harmony import */ var _InChI__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./InChI */ \"./src/main/InChI.ts\");\n/* harmony import */ var _MainPanel__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./MainPanel */ \"./src/main/MainPanel.ts\");\n/* harmony import */ var _MenuBanner__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./MenuBanner */ \"./src/main/MenuBanner.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst BANNER = [\n [\n { 'icon': 'CommandSave.svg', 'tip': 'Save', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Save },\n ],\n [\n { 'icon': 'CommandEdit.svg', 'tip': 'Edit component', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.EditDetails },\n { 'icon': 'CommandStructure.svg', 'tip': 'Edit structure', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.EditStructure },\n { 'icon': 'CommandLookup.svg', 'tip': 'Lookup compound', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Lookup },\n { 'icon': 'CommandPicture.svg', 'tip': 'Export graphics', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ExportSVG },\n ],\n [\n { 'icon': 'CommandAppend.svg', 'tip': 'Append component to the right', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Append },\n { 'icon': 'CommandPrepend.svg', 'tip': 'Prepend component to the left', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Prepend },\n { 'icon': 'CommandInsertBefore.svg', 'tip': 'Insert component above', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.InsertBefore },\n { 'icon': 'CommandInsertAfter.svg', 'tip': 'Append component below', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.InsertAfter },\n { 'icon': 'CommandDelete.svg', 'tip': 'Delete', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Delete },\n { 'icon': 'CommandMoveUp.svg', 'tip': 'Move Up', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.MoveUp },\n { 'icon': 'CommandMoveDown.svg', 'tip': 'Move Down', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.MoveDown },\n ],\n [\n { 'icon': 'CommandUndo.svg', 'tip': 'Undo', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Undo },\n { 'icon': 'CommandRedo.svg', 'tip': 'Redo', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Redo },\n ],\n [\n { 'icon': 'CommandCopy.svg', 'tip': 'Copy', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Copy },\n { 'icon': 'CommandCut.svg', 'tip': 'Cut', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Cut },\n { 'icon': 'CommandPaste.svg', 'tip': 'Paste', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Paste },\n ],\n [\n { 'icon': 'CommandZoomNormal.svg', 'tip': 'Zoom full', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ZoomFull },\n { 'icon': 'CommandZoomIn.svg', 'tip': 'Zoom in', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ZoomIn },\n { 'icon': 'CommandZoomOut.svg', 'tip': 'Zoom out', 'cmd': _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ZoomOut },\n ],\n];\nclass MixturePanel extends _MainPanel__WEBPACK_IMPORTED_MODULE_17__.MainPanel {\n constructor(root, proxyClip, proxyMenu) {\n super(root);\n this.proxyClip = proxyClip;\n this.proxyMenu = proxyMenu;\n this.filename = null;\n this.editor = new _mixture_EditMixture__WEBPACK_IMPORTED_MODULE_12__.EditMixture(this.proxyClip, this.proxyMenu);\n this.banner = new _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBanner(BANNER, (cmd) => this.menuAction(cmd));\n this.editor.callbackUpdateTitle = () => this.updateTitle();\n let divFlex = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__.dom)('
').appendTo(root).css({ 'display': 'flex' });\n divFlex.css({ 'flex-direction': 'column', 'width': '100%', 'height': '100%' });\n let divBanner = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__.dom)('
').appendTo(divFlex).css({ 'flex-grow': '0' });\n let divEditor = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__.dom)('
').appendTo(divFlex).css({ 'flex-grow': '1' });\n this.banner.render(divBanner);\n this.editor.render(divEditor);\n this.banner.callbackRefocus = () => this.editor.refocus();\n }\n setMixture(mixture) {\n this.editor.clearHistory();\n this.editor.setMixture(mixture, true, false);\n this.editor.setDirty(false);\n }\n loadFile(filename) {\n if (!filename) {\n this.editor.clearHistory();\n this.editor.setMixture(new _data_Mixture__WEBPACK_IMPORTED_MODULE_9__.Mixture(), true, true);\n this.updateTitle();\n this.filename = null;\n return;\n }\n const fs = __webpack_require__(/*! fs */ \"fs\");\n fs.readFile(filename, 'utf-8', (err, data) => {\n if (err)\n throw err;\n let mixture;\n try {\n mixture = _data_Mixture__WEBPACK_IMPORTED_MODULE_9__.Mixture.deserialise(data);\n }\n catch (e) {\n console.log('Invalid mixture file: ' + e + '\\n' + data);\n alert('Not a valid mixture file.');\n return;\n }\n mixture.mixfile.mixfileVersion = _data_Mixfile__WEBPACK_IMPORTED_MODULE_8__.MIXFILE_VERSION;\n this.editor.clearHistory();\n this.editor.setMixture(mixture, true, false);\n this.editor.setDirty(false);\n this.filename = filename;\n this.updateTitle();\n });\n }\n saveFile(filename) {\n const fs = __webpack_require__(/*! fs */ \"fs\");\n let mixture = this.editor.getMixture();\n let content = mixture.serialise();\n fs.writeFile(filename, content, (err) => {\n if (err)\n alert('Unable to save: ' + err);\n });\n }\n onResize() {\n super.onResize();\n this.editor.delayedRedraw();\n }\n menuAction(cmd) {\n let dlg = this.editor.compoundEditor();\n if (dlg) {\n if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Cut)\n dlg.actionCut();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Copy)\n dlg.actionCopy();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Paste)\n dlg.actionPaste();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Undo)\n dlg.actionUndo();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Redo)\n dlg.actionRedo();\n return;\n }\n if (!this.editor.isReceivingCommands()) {\n if ([_MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Cut, _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Copy, _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Paste,\n _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Undo, _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Redo].indexOf(cmd) >= 0)\n document.execCommand(cmd);\n return;\n }\n super.menuAction(cmd);\n }\n customMenuAction(cmd) {\n if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ExportSDF)\n this.actionExportSDF();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ExportSVG)\n this.actionFileExportSVG();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.CreateMInChI)\n this.actionFileCreateMInChI();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Undo)\n this.editor.performUndo();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Redo)\n this.editor.performRedo();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Cut)\n this.editor.clipboardCopy(true);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Copy)\n this.editor.clipboardCopy(false);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.CopyBranch)\n this.editor.clipboardCopy(false, true);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Paste)\n this.editor.clipboardPaste();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.EditStructure)\n this.editor.editStructure();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.EditDetails)\n this.editor.editDetails();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Lookup)\n this.editor.lookupCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Delete)\n this.editor.deleteCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Append)\n this.editor.appendToCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.Prepend)\n this.editor.prependBeforeCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.InsertBefore)\n this.editor.insertBeforeCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.InsertAfter)\n this.editor.insertAfterCurrent();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.MoveUp)\n this.editor.reorderCurrent(-1);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.MoveDown)\n this.editor.reorderCurrent(1);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ZoomFull)\n this.editor.zoomFull();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ZoomNormal)\n this.editor.zoomNormal();\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ZoomIn)\n this.editor.zoom(1.25);\n else if (cmd == _MenuBanner__WEBPACK_IMPORTED_MODULE_18__.MenuBannerCommand.ZoomOut)\n this.editor.zoom(0.8);\n else\n super.customMenuAction(cmd);\n }\n actionFileOpen() {\n const path = __webpack_require__(/*! path */ \"path\");\n const remote = __webpack_require__(/*! @electron/remote */ \"./node_modules/@electron/remote/renderer/index.js\");\n const dialog = remote.dialog;\n let filedir = this.filename && this.filename.indexOf(path.sep) ? this.filename.substring(0, this.filename.lastIndexOf(path.sep)) : undefined;\n let params = {\n 'title': 'Open Mixture',\n 'properties': ['openFile'],\n 'defaultPath': filedir,\n 'filters': [\n { 'name': 'Mixfile', 'extensions': ['mixfile'] },\n { 'name': 'Mixfile Collection', 'extensions': ['json'] },\n ]\n };\n dialog.showOpenDialog(params).then((value) => {\n if (value.canceled)\n return;\n let inPlace = this.editor.getMixture().isEmpty();\n for (let fn of value.filePaths) {\n if (inPlace && fn.endsWith('.mixfile')) {\n this.loadFile(fn);\n inPlace = false;\n }\n else if (fn.endsWith('.json'))\n (0,_startup__WEBPACK_IMPORTED_MODULE_15__.openNewWindow)('CollectionPanel', fn);\n else\n (0,_startup__WEBPACK_IMPORTED_MODULE_15__.openNewWindow)('MixturePanel', fn);\n }\n });\n }\n actionFileSave() {\n if (this.editor.isBlank())\n return;\n if (!this.filename) {\n this.actionFileSaveAs();\n return;\n }\n this.saveFile(this.filename);\n this.editor.setDirty(false);\n this.updateTitle();\n }\n actionFileSaveAs() {\n if (this.editor.isBlank())\n return;\n const electron = __webpack_require__(/*! electron */ \"electron\");\n const remote = __webpack_require__(/*! @electron/remote */ \"./node_modules/@electron/remote/renderer/index.js\");\n const dialog = remote.dialog;\n let params = {\n 'title': 'Save Mixfile',\n 'filters': [\n { 'name': 'Mixfile', 'extensions': ['mixfile'] }\n ]\n };\n dialog.showSaveDialog(params).then((value) => {\n if (value.canceled)\n return;\n this.saveFile(value.filePath);\n this.filename = value.filePath;\n this.editor.setDirty(false);\n this.updateTitle();\n });\n }\n actionExportSDF() {\n let mixture = this.editor.getMixture();\n if (mixture.isEmpty())\n return;\n let exportSDF = new _mixture_ExportSDFile__WEBPACK_IMPORTED_MODULE_14__.ExportSDFile();\n exportSDF.append(mixture.mixfile);\n let sdfile = exportSDF.write();\n const electron = __webpack_require__(/*! electron */ \"electron\"), fs = __webpack_require__(/*! fs */ \"fs\");\n const remote = __webpack_require__(/*! @electron/remote */ \"./node_modules/@electron/remote/renderer/index.js\");\n const dialog = remote.dialog;\n let defPath = this.filename;\n if (defPath) {\n let lastDot = defPath.lastIndexOf('.');\n if (lastDot > 0 && lastDot > defPath.lastIndexOf('/') && lastDot > defPath.lastIndexOf('\\\\'))\n defPath = defPath.substring(0, lastDot);\n defPath += '.sdf';\n }\n else\n defPath = undefined;\n let params = {\n 'title': 'Export as SDfile',\n 'defaultPath': defPath,\n 'filters': [\n { 'name': 'SDfile', 'extensions': ['sdf'] }\n ]\n };\n if (this.filename && this.filename.endsWith('.mixfile'))\n params.defaultPath = (this.filename.substring(0, this.filename.length - 8) + '.sdf').split(/[\\/\\\\]/).pop();\n dialog.showSaveDialog(params).then((value) => {\n if (value.canceled)\n return;\n fs.writeFile(value.filePath, sdfile, (err) => {\n if (err)\n alert('Unable to save: ' + err);\n });\n });\n }\n actionFileExportSVG() {\n let defPath = this.filename;\n if (defPath) {\n let lastDot = defPath.lastIndexOf('.');\n if (lastDot > 0 && lastDot > defPath.lastIndexOf('/') && lastDot > defPath.lastIndexOf('\\\\'))\n defPath = defPath.substring(0, lastDot);\n defPath += '.svg';\n }\n else\n defPath = undefined;\n const electron = __webpack_require__(/*! electron */ \"electron\");\n const remote = __webpack_require__(/*! @electron/remote */ \"./node_modules/@electron/remote/renderer/index.js\");\n const dialog = remote.dialog;\n let params = {\n 'title': 'Save SVG Diagram',\n 'defaultPath': defPath,\n 'filters': [\n { 'name': 'Scalable Vector Graphics', 'extensions': ['svg'] }\n ]\n };\n dialog.showSaveDialog(params).then((value) => {\n if (value.canceled)\n return;\n let policy = _wmk_gfx_Rendering__WEBPACK_IMPORTED_MODULE_3__.RenderPolicy.defaultColourOnWhite();\n let measure = new _wmk_gfx_ArrangeMeasurement__WEBPACK_IMPORTED_MODULE_1__.OutlineMeasurement(0, 0, policy.data.pointScale);\n let layout = new _mixture_ArrangeMixture__WEBPACK_IMPORTED_MODULE_10__.ArrangeMixture(this.editor.getMixture(), measure, policy);\n layout.collapsedBranches = this.editor.getCollapsedBranches();\n layout.packBranches = new _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_6__.Size(0.8 * this.editor.contentDOM.width(), 0.8 * this.editor.contentDOM.height());\n layout.arrange();\n let gfx = new _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_2__.MetaVector();\n new _mixture_DrawMixture__WEBPACK_IMPORTED_MODULE_11__.DrawMixture(layout, gfx).draw();\n gfx.normalise();\n let svg = gfx.createSVG(true, true);\n const fs = __webpack_require__(/*! fs */ \"fs\");\n fs.writeFile(value.filePath, svg, (err) => {\n if (err)\n alert('Unable to save: ' + err);\n });\n });\n }\n actionFileCreateMInChI() {\n if (!_InChI__WEBPACK_IMPORTED_MODULE_16__.InChI.isAvailable()) {\n alert('InChI executable has not been configured. Specify with --inchi parameter.');\n return;\n }\n let maker = new _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_13__.ExportMInChI(this.editor.getMixture().mixfile);\n let self = this;\n class MInChIDialog extends _wmk_dialog_Dialog__WEBPACK_IMPORTED_MODULE_0__.Dialog {\n constructor() {\n super();\n this.title = 'MInChI';\n }\n populate() {\n self.proxyClip.pushHandler(new _wmk_ui_ClipboardProxy__WEBPACK_IMPORTED_MODULE_4__.ClipboardProxyHandler());\n this.bodyDOM().setText('Calculating...');\n (() => __awaiter(this, void 0, void 0, function* () { return yield this.renderResult(); }))();\n }\n close() {\n self.proxyClip.popHandler();\n super.close();\n }\n renderResult() {\n return __awaiter(this, void 0, void 0, function* () {\n yield (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_7__.yieldDOM)();\n yield maker.fillInChI();\n maker.formulate();\n let body = this.bodyDOM();\n body.empty();\n let divOuter = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__.dom)('
').appendTo(body);\n let pre = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__.dom)('').appendTo(divOuter).css({ 'font-family': 'monospace', 'padding-top': '0.5em', 'word-break': 'break-all' });\n let minchi = maker.getResult(), segment = maker.getSegment();\n for (let n = 0; n < minchi.length; n++) {\n let span = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__.dom)('').appendTo(pre);\n span.setText(minchi[n]);\n if (segment[n] == _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_13__.MInChISegment.Header)\n span.setCSS('background-color', '#FFC0C0');\n else if (segment[n] == _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_13__.MInChISegment.Component)\n span.setCSS('background-color', '#C0C0FF');\n else if (segment[n] == _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_13__.MInChISegment.Hierarchy)\n span.setCSS('background-color', '#E0E080');\n else if (segment[n] == _mixture_ExportMInChI__WEBPACK_IMPORTED_MODULE_13__.MInChISegment.Concentration)\n span.setCSS('background-color', '#80E080');\n pre.appendHTML('');\n }\n let btnCopy = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_5__.dom)('').appendTo(divOuter).css({ 'margin-left': '0.5em' });\n btnCopy.onClick(() => self.proxyClip.setString(minchi));\n });\n }\n }\n new MInChIDialog().open();\n }\n updateTitle() {\n if (this.filename == null) {\n document.title = 'Mixtures';\n return;\n }\n let slash = Math.max(this.filename.lastIndexOf('/'), this.filename.lastIndexOf('\\\\'));\n let title = 'Mixtures - ' + this.filename.substring(slash + 1);\n if (this.editor.isDirty() && !this.editor.isBlank())\n title += '*';\n document.title = title;\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/main/MixturePanel.ts?"); + +/***/ }), + +/***/ "./src/mixture/ArrangeMixture.ts": +/*!***************************************!*\ + !*** ./src/mixture/ArrangeMixture.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ArrangeMixture\": () => (/* binding */ ArrangeMixture)\n/* harmony export */ });\n/* harmony import */ var _wmk_data_MoleculeStream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/data/MoleculeStream */ \"../../work/WebMolKit/src/data/MoleculeStream.ts\");\n/* harmony import */ var _wmk_data_OntologyTree__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/data/OntologyTree */ \"../../work/WebMolKit/src/data/OntologyTree.ts\");\n/* harmony import */ var _wmk_gfx_ArrangeMolecule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/gfx/ArrangeMolecule */ \"../../work/WebMolKit/src/gfx/ArrangeMolecule.ts\");\n/* harmony import */ var _wmk_gfx_FontData__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/gfx/FontData */ \"../../work/WebMolKit/src/gfx/FontData.ts\");\n/* harmony import */ var _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/util/Geom */ \"../../work/WebMolKit/src/util/Geom.ts\");\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _SquarePacking__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SquarePacking */ \"./src/mixture/SquarePacking.ts\");\n\n\n\n\n\n\n\n\nconst PADDING = 0.25;\nconst VSPACE = 0.5;\nconst HSPACE = 1;\nconst COLLAPSE_SIZE = 0.3;\nconst COLLAPSE_GAP = 0.05;\nclass ArrangeMixture {\n constructor(mixture, measure, policy) {\n this.mixture = mixture;\n this.measure = measure;\n this.policy = policy;\n this.norm = null;\n this.width = 0;\n this.height = 0;\n this.components = [];\n this.minBoxSize = null;\n this.showCollapsors = false;\n this.collapsedBranches = [];\n this.packBranches = null;\n this.scale = policy.data.pointScale;\n this.nameFontSize = 0.5 * this.scale;\n this.limitStructW = this.limitStructH = this.scale * 10;\n this.hardwrapName = 12 * this.scale;\n this.softwrapName = 8 * this.scale;\n }\n arrange() {\n this.createComponents();\n this.layoutSubComponents(0);\n this.contractComponents();\n let outline = null;\n for (let comp of this.components) {\n if (outline)\n outline = outline.union(comp.boundary);\n else\n outline = comp.boundary;\n }\n for (let comp of this.components) {\n comp.boundary.x -= outline.x;\n comp.boundary.y -= outline.y;\n if (comp.molLayout) {\n let b1 = comp.boundary, b2 = comp.molBox;\n comp.molLayout.squeezeInto(b1.x + b2.x, b1.y + b2.y, b2.w, b2.h);\n }\n }\n this.width = outline.w;\n this.height = outline.h;\n }\n scaleComponents(modScale) {\n if (modScale == 1)\n return;\n this.scale *= modScale;\n this.width *= modScale;\n this.height *= modScale;\n for (let comp of this.components) {\n comp.boundary.scaleBy(modScale);\n comp.outline.scaleBy(modScale);\n if (comp.molBox) {\n comp.molBox.scaleBy(modScale);\n if (comp.molLayout) {\n let mx = comp.boundary.x + comp.molBox.x, my = comp.boundary.y + comp.molBox.y;\n comp.molLayout.squeezeInto(mx, my, comp.molBox.w, comp.molBox.h);\n }\n }\n if (comp.nameBox)\n comp.nameBox.scaleBy(modScale);\n if (comp.collapseBox)\n comp.collapseBox.scaleBy(modScale);\n comp.fontSize *= modScale;\n }\n }\n findComponent(origin) {\n for (let n = 0; n < this.components.length; n++)\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.equals(this.components[n].origin, origin))\n return n;\n return -1;\n }\n static formatQuantity(mixcomp) {\n let prec = (val) => {\n if (val > 10000)\n return Math.round(val).toString();\n let str = val.toPrecision(6);\n if (str.indexOf('e') >= 0 || str.indexOf('.') < 0)\n return str;\n while (true) {\n if (str.endsWith('0'))\n str = str.substring(0, str.length - 1);\n else if (str.endsWith('.')) {\n str = str.substring(0, str.length - 1);\n break;\n }\n else\n break;\n }\n return str;\n };\n if (mixcomp.ratio) {\n if (mixcomp.ratio.length == 2)\n return prec(mixcomp.ratio[0]) + '/' + prec(mixcomp.ratio[1]);\n return null;\n }\n if (mixcomp.quantity == null)\n return null;\n let str = '';\n if (mixcomp.relation && mixcomp.relation != '=') {\n let rel = mixcomp.relation;\n if (rel == '>=')\n rel = '\\u{2265}';\n else if (rel == '<=')\n rel = '\\u{2264}';\n str += rel;\n }\n if (mixcomp.quantity instanceof Array) {\n if (mixcomp.quantity.length == 0)\n return;\n str += prec(mixcomp.quantity[0]);\n if (mixcomp.quantity.length >= 2)\n str += ' - ' + prec(mixcomp.quantity[1]);\n }\n else {\n str += prec(mixcomp.quantity);\n if (mixcomp.error) {\n str += ' \\u{00B1} ' + prec(mixcomp.error);\n }\n }\n if (mixcomp.units) {\n if (!mixcomp.units.startsWith('%'))\n str += ' ';\n str += mixcomp.units;\n }\n return str;\n }\n formatNormQuantity(origin) {\n if (!this.norm)\n return;\n let note = this.norm.findNote(origin);\n if (!note || !note.concQuantity)\n return;\n let comp = {\n 'quantity': note.concQuantity,\n 'error': note.concError,\n 'units': note.concUnits,\n 'relation': note.concRelation,\n };\n return ArrangeMixture.formatQuantity(comp);\n }\n createComponents() {\n let examineBranch = (origin, mixcomp, idx) => {\n let comp = { 'origin': origin, 'content': mixcomp, 'parentIdx': idx };\n let parentIdx = this.components.push(comp) - 1;\n comp.isCollapsed = false;\n for (let origin of this.collapsedBranches)\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.equals(origin, comp.origin))\n comp.isCollapsed = true;\n if (mixcomp.contents && !comp.isCollapsed)\n for (let n = 0; n < mixcomp.contents.length; n++) {\n let subOrigin = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.append(origin, n);\n examineBranch(subOrigin, mixcomp.contents[n], parentIdx);\n }\n };\n examineBranch([], this.mixture.mixfile, -1);\n let padding = PADDING * this.scale;\n for (let [idx, comp] of this.components.entries()) {\n let mixcomp = comp.content;\n if (mixcomp.molfile)\n comp.mol = _wmk_data_MoleculeStream__WEBPACK_IMPORTED_MODULE_0__.MoleculeStream.readUnknown(mixcomp.molfile);\n if (comp.mol) {\n comp.molLayout = new _wmk_gfx_ArrangeMolecule__WEBPACK_IMPORTED_MODULE_2__.ArrangeMolecule(comp.mol, this.measure, this.policy);\n comp.molLayout.arrange();\n comp.molLayout.squeezeInto(0, 0, this.limitStructW, this.limitStructH);\n let bounds = comp.molLayout.determineBoundary();\n comp.molBox = new _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_4__.Box(padding, padding, Math.ceil(bounds[2] - bounds[0]), Math.ceil(bounds[3] - bounds[1]));\n }\n else\n comp.molBox = _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_4__.Box.zero();\n comp.nameLines = [];\n if (mixcomp.name)\n this.wrapSplitName(comp.nameLines, mixcomp.name, 0x000000);\n let qline = ArrangeMixture.formatQuantity(mixcomp);\n if (qline)\n comp.nameLines.push({ 'text': qline, 'col': 0x000000 });\n qline = this.formatNormQuantity(comp.origin);\n if (qline)\n comp.nameLines.push({ 'text': `(${qline})`, 'col': 0x808080 });\n if (mixcomp.identifiers)\n for (let key in mixcomp.identifiers) {\n let line = key + ' ';\n let val = mixcomp.identifiers[key];\n if (val instanceof Array) {\n for (let n = 0; n < val.length; n++)\n line += (n == 0 ? '' : ', ') + val[n];\n }\n else\n line += val;\n comp.nameLines.push({ 'text': this.truncateEllipsis(line), 'col': 0x42007E });\n }\n if (mixcomp.metadata)\n for (let meta of mixcomp.metadata) {\n let metaString = (m) => {\n if (typeof m == 'number')\n return (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_5__.formatDouble)(m, 4);\n if (!_wmk_data_OntologyTree__WEBPACK_IMPORTED_MODULE_1__.OntologyTree.main)\n return m;\n let branch = _wmk_data_OntologyTree__WEBPACK_IMPORTED_MODULE_1__.OntologyTree.main.getBranch(m);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.notBlank(branch))\n return branch[0].label;\n return m;\n };\n let bits = [];\n if (Array.isArray(meta))\n bits = meta.map((m) => metaString(m));\n else\n bits = [metaString(meta)];\n comp.nameLines.push({ 'text': bits.join(' '), 'col': 0x002B88 });\n }\n comp.nameBox = new _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_4__.Box(padding, padding);\n comp.fontSize = this.nameFontSize;\n for (let n = 0; n < comp.nameLines.length; n++) {\n let wad = this.measure.measureText(comp.nameLines[n].text, comp.fontSize);\n comp.nameBox.w = Math.max(comp.nameBox.w, wad[0]);\n comp.nameBox.h += wad[1] + (n > 0 ? wad[2] * 2 : 0);\n }\n comp.outline = _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_4__.Box.zero();\n comp.outline.w = Math.max(comp.molBox.w, comp.nameBox.w) + 2 * padding;\n comp.outline.h = comp.molBox.h + comp.nameBox.h + 2 * padding;\n if (comp.molBox.notEmpty() && comp.nameBox.notEmpty()) {\n comp.outline.h += padding;\n comp.nameBox.y += comp.molBox.h + padding;\n comp.molBox.w = comp.nameBox.w = Math.max(comp.molBox.w, comp.nameBox.w);\n }\n if (this.minBoxSize) {\n let minsz = this.minBoxSize;\n let dw = minsz.w - comp.outline.w, dh = minsz.h - comp.outline.h;\n if (dw > 0) {\n comp.outline.w += dw;\n comp.molBox.w += dw;\n }\n if (dh > 0) {\n comp.outline.h += dh;\n comp.molBox.h += dh;\n comp.nameBox.y += dh;\n }\n }\n comp.boundary = comp.outline.clone();\n if ((this.showCollapsors || comp.isCollapsed) && _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.notBlank(comp.content.contents)) {\n let gap = COLLAPSE_GAP * this.scale, wh = COLLAPSE_SIZE * this.scale;\n comp.collapseBox = new _wmk_util_Geom__WEBPACK_IMPORTED_MODULE_4__.Box(comp.boundary.maxX() + gap, comp.boundary.midY() - 0.5 * wh, wh, wh);\n comp.boundary.w += gap + wh;\n }\n }\n }\n layoutSubComponents(idx) {\n let wholeBranch = [idx];\n let branchBlock = [];\n let branchBox = [];\n let totalWidth = 0, totalHeight = 0;\n for (let n = idx + 1; n < this.components.length; n++) {\n let comp = this.components[n];\n if (comp.parentIdx != idx)\n continue;\n let branch = this.layoutSubComponents(n);\n if (branch.length == 0)\n continue;\n let box = null;\n for (let i of branch) {\n wholeBranch.push(i);\n let bound = this.components[i].boundary;\n if (box)\n box = box.union(bound);\n else\n box = bound;\n }\n branchBlock.push(branch);\n branchBox.push(box);\n totalWidth = Math.max(totalWidth, box.w);\n totalHeight += box.h;\n }\n if (branchBlock.length == 0)\n return wholeBranch;\n let hspace = HSPACE * this.scale, vspace = VSPACE * this.scale;\n totalHeight += vspace * (branchBlock.length - 1);\n let cbox = this.components[idx].boundary;\n let x = cbox.maxX() + hspace;\n if (this.packBranches && branchBlock.length > 2 && totalHeight > this.packBranches.h) {\n let packSize = this.packBranches.clone();\n for (let box of branchBox)\n packSize.h = Math.max(packSize.h, box.h);\n let sq = new _SquarePacking__WEBPACK_IMPORTED_MODULE_7__.SquarePacking(packSize, branchBox, vspace, vspace);\n if (sq.pack()) {\n let y = cbox.midY() - 0.5 * sq.outline.h;\n for (let n = 0; n < branchBlock.length; n++) {\n let box = sq.layout[n];\n let dx = x - branchBox[n].x + box.x, dy = y - branchBox[n].y + box.y;\n for (let i of branchBlock[n]) {\n this.components[i].boundary.x += dx;\n this.components[i].boundary.y += dy;\n }\n }\n return wholeBranch;\n }\n }\n let y = cbox.midY() - 0.5 * totalHeight;\n for (let n = 0; n < branchBlock.length; n++) {\n let dx = x - branchBox[n].x, dy = y - branchBox[n].y;\n for (let i of branchBlock[n]) {\n this.components[i].boundary.x += dx;\n this.components[i].boundary.y += dy;\n }\n y += branchBox[n].h + vspace;\n }\n return wholeBranch;\n }\n contractComponents() {\n let allChildren = [];\n for (let n = 0; n < this.components.length; n++) {\n allChildren.push([]);\n for (let idx = this.components[n].parentIdx; idx >= 0; idx = this.components[idx].parentIdx)\n allChildren[idx].push(n);\n }\n let hspace = HSPACE * this.scale, padding = PADDING * this.scale;\n while (true) {\n let anything = false;\n for (let n = 1; n < allChildren.length; n++) {\n let pidx = this.components[n].parentIdx;\n let boundX = this.components[pidx].boundary.maxX() + hspace;\n let dx = this.components[n].boundary.minX() - boundX;\n if (dx < 1)\n continue;\n let idxInside = [n, ...allChildren[n]];\n let idxOutside = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.identity0(allChildren.length).filter((idx) => !idxInside.includes(idx));\n for (let i of idxInside) {\n let box1 = this.components[i].boundary.withGrow(padding, padding);\n for (let j of idxOutside) {\n let box2 = this.components[j].boundary;\n if (box2.minX() > box1.maxX())\n continue;\n if (box1.minY() > box2.maxY() || box1.maxY() < box2.minY())\n continue;\n dx = Math.min(dx, box1.minX() - box2.maxX());\n }\n }\n if (dx > 1) {\n for (let n of idxInside)\n this.components[n].boundary.x -= dx;\n anything = true;\n }\n }\n if (!anything)\n break;\n }\n }\n wrapSplitName(list, text, col) {\n if (!text)\n return;\n let xpos = _wmk_gfx_FontData__WEBPACK_IMPORTED_MODULE_3__.FontData.measureWidths(text, this.nameFontSize);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.last(xpos) <= this.softwrapName) {\n list.push({ text, col });\n return;\n }\n let p = 0;\n for (; xpos[p] < this.softwrapName; p++) { }\n for (; xpos[p] < this.hardwrapName; p++) {\n let ch = text.charAt(p);\n if (' ,;-/'.includes(ch)) {\n p++;\n break;\n }\n }\n list.push({ 'text': text.substring(0, p).trim(), col });\n this.wrapSplitName(list, text.substring(p).trim(), col);\n }\n truncateEllipsis(txt) {\n let xpos = _wmk_gfx_FontData__WEBPACK_IMPORTED_MODULE_3__.FontData.measureWidths(txt, this.nameFontSize);\n if (_wmk_util_Vec__WEBPACK_IMPORTED_MODULE_6__.Vec.last(xpos) <= this.hardwrapName)\n return txt;\n let ellipsis = '...', ellw = _wmk_gfx_FontData__WEBPACK_IMPORTED_MODULE_3__.FontData.measureText(ellipsis, this.nameFontSize)[0];\n let keep = 1;\n for (; keep < txt.length; keep++)\n if (xpos[keep] + ellw > this.hardwrapName)\n break;\n return txt.substring(0, keep) + ellipsis;\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/mixture/ArrangeMixture.ts?"); + +/***/ }), + +/***/ "./src/mixture/DrawMixture.ts": +/*!************************************!*\ + !*** ./src/mixture/DrawMixture.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"DrawMixture\": () => (/* binding */ DrawMixture)\n/* harmony export */ });\n/* harmony import */ var _wmk_gfx_DrawMolecule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/gfx/DrawMolecule */ \"../../work/WebMolKit/src/gfx/DrawMolecule.ts\");\n/* harmony import */ var _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/gfx/MetaVector */ \"../../work/WebMolKit/src/gfx/MetaVector.ts\");\n\n\nclass DrawMixture {\n constructor(layout, vg) {\n this.layout = layout;\n this.vg = vg;\n this.hoverIndex = -1;\n this.activeIndex = -1;\n this.selectedIndex = -1;\n this.measure = layout.measure;\n this.policy = layout.policy;\n this.scale = layout.scale;\n this.invScale = 1.0 / this.scale;\n }\n draw() {\n for (let comp of this.layout.components)\n if (comp.parentIdx >= 0)\n this.drawConnection(this.layout.components[comp.parentIdx], comp);\n for (let n = 0; n < this.layout.components.length; n++)\n this.drawComponent(n);\n }\n drawConnection(parent, child) {\n let x1 = parent.boundary.maxX(), x2 = child.boundary.minX();\n let y1 = parent.boundary.midY(), y2 = child.boundary.midY();\n let xm = x1 + 0.25 * this.scale;\n let ym = 0.5 * (y1 + y2);\n let d = 4, xd = d, yd = y1 < y2 - 1 ? -d : y1 > y2 + 1 ? d : 0;\n let px = [x1, xm - xd, xm, xm, xm, xm, xm + xd, x2];\n let py = [y1, y1, y1, y1 - yd, y2 + yd, y2, y2, y2];\n let lsz = this.scale * 0.1;\n this.vg.drawPath(px, py, [false, false, true, false, false, true, false, false], false, 0x000000, lsz, _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__.MetaVector.NOCOLOUR, false);\n }\n drawComponent(idx) {\n let comp = this.layout.components[idx];\n let box = comp.outline.clone();\n box.offsetBy(comp.boundary.x, comp.boundary.y);\n let bg = 0xF8F8F8;\n if (idx == this.activeIndex)\n bg = 0x8296E4;\n else if (idx == this.selectedIndex)\n bg = 0xA9BBFF;\n else if (idx == this.hoverIndex)\n bg = 0xE0E0E0;\n this.vg.drawRect(box.x, box.y, box.w, box.h, 0x808080, 1, bg);\n if (comp.molLayout)\n new _wmk_gfx_DrawMolecule__WEBPACK_IMPORTED_MODULE_0__.DrawMolecule(comp.molLayout, this.vg).draw();\n if (comp.nameLines.length > 0) {\n let x = box.x + comp.nameBox.midX(), y = box.y + comp.nameBox.y;\n for (let line of comp.nameLines) {\n let wad = this.measure.measureText(line.text, comp.fontSize);\n this.vg.drawText(x, y, line.text, comp.fontSize, line.col, _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__.TextAlign.Centre | _wmk_gfx_MetaVector__WEBPACK_IMPORTED_MODULE_1__.TextAlign.Top);\n y += wad[1] + 2 * wad[2];\n }\n }\n if (comp.collapseBox) {\n let cbox = comp.collapseBox.clone();\n cbox.offsetBy(comp.boundary.x, comp.boundary.y);\n this.vg.drawRect(cbox.x, cbox.y, cbox.w, cbox.h, 0x808080, 1, 0xF8F8F8);\n let cx = cbox.midX(), cy = cbox.midY(), d = Math.min(cbox.w, cbox.h) * 0.4, sz = d * 0.2;\n this.vg.drawLine(cx - d, cy, cx + d, cy, 0x000000, sz);\n if (comp.isCollapsed)\n this.vg.drawLine(cx, cy - d, cx, cy + d, 0x000000, sz);\n }\n }\n}\n\n\n//# sourceURL=webpack://Mixtures/./src/mixture/DrawMixture.ts?"); + +/***/ }), + +/***/ "./src/mixture/EditComponent.ts": +/*!**************************************!*\ + !*** ./src/mixture/EditComponent.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"EditComponent\": () => (/* binding */ EditComponent)\n/* harmony export */ });\n/* harmony import */ var _wmk_data_Chemistry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../wmk/data/Chemistry */ \"../../work/WebMolKit/src/data/Chemistry.ts\");\n/* harmony import */ var _wmk_data_MoleculeStream__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../wmk/data/MoleculeStream */ \"../../work/WebMolKit/src/data/MoleculeStream.ts\");\n/* harmony import */ var _wmk_data_MolUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../wmk/data/MolUtil */ \"../../work/WebMolKit/src/data/MolUtil.ts\");\n/* harmony import */ var _wmk_data_OntologyTree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../wmk/data/OntologyTree */ \"../../work/WebMolKit/src/data/OntologyTree.ts\");\n/* harmony import */ var _wmk_dialog_Dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../wmk/dialog/Dialog */ \"../../work/WebMolKit/src/dialog/Dialog.ts\");\n/* harmony import */ var _wmk_ui_ClipboardProxy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../wmk/ui/ClipboardProxy */ \"../../work/WebMolKit/src/ui/ClipboardProxy.ts\");\n/* harmony import */ var _wmk_ui_OptionList__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../wmk/ui/OptionList */ \"../../work/WebMolKit/src/ui/OptionList.ts\");\n/* harmony import */ var _wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../wmk/util/dom */ \"../../work/WebMolKit/src/util/dom.ts\");\n/* harmony import */ var _wmk_util_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../wmk/util/util */ \"../../work/WebMolKit/src/util/util.ts\");\n/* harmony import */ var _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../wmk/util/Vec */ \"../../work/WebMolKit/src/util/Vec.ts\");\n/* harmony import */ var _data_Mixture__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../data/Mixture */ \"./src/data/Mixture.ts\");\n/* harmony import */ var _data_Units__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../data/Units */ \"./src/data/Units.ts\");\n/* harmony import */ var _main_InChI__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../main/InChI */ \"./src/main/InChI.ts\");\n/* harmony import */ var _KeyValueWidget__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./KeyValueWidget */ \"./src/mixture/KeyValueWidget.ts\");\n/* harmony import */ var _MetadataWidget__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./MetadataWidget */ \"./src/mixture/MetadataWidget.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar QuantityType;\n(function (QuantityType) {\n QuantityType[\"Value\"] = \"Value\";\n QuantityType[\"Range\"] = \"Range\";\n QuantityType[\"Ratio\"] = \"Ratio\";\n})(QuantityType || (QuantityType = {}));\nconst RELATION_VALUES = ['=', '~', '<', '<=', '>', '>='];\nconst RELATION_LABELS = ['=', '~', '<', '≤', '>', '≥'];\nclass EditComponent extends _wmk_dialog_Dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog {\n constructor(component, parentSize, parent = null) {\n super(parent);\n this.parentSize = parentSize;\n this.proxyClip = null;\n this.areaDescr = null;\n this.areaSyn = null;\n this.callbackSave = null;\n this.callbackSketch = null;\n this.component = (0,_wmk_util_util__WEBPACK_IMPORTED_MODULE_8__.deepClone)(component);\n this.title = 'Edit Component';\n this.minPortionWidth = 20;\n this.maxPortionWidth = 95;\n }\n onSave(callback) {\n this.callbackSave = callback;\n }\n onSketch(callback) {\n this.callbackSketch = callback;\n }\n getComponent() { return this.component; }\n populate() {\n if (this.proxyClip)\n this.proxyClip.pushHandler(new _wmk_ui_ClipboardProxy__WEBPACK_IMPORTED_MODULE_5__.ClipboardProxyHandler());\n let buttons = this.buttonsDOM(), body = this.bodyDOM();\n if (this.callbackSketch) {\n this.btnSketch = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('').appendTo(buttons);\n this.btnSketch.onClick(() => this.invokeSketcher());\n }\n buttons.appendText(' ');\n buttons.append(this.domClose);\n buttons.appendText(' ');\n this.btnSave = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('').appendTo(buttons);\n this.btnSave.onClick(() => this.saveAndClose());\n body.css({ 'padding': '0 0 0 1em' });\n let vertical = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(body);\n vertical.css({ 'overflow-y': 'scroll', 'height': '100%' });\n vertical.css({ 'max-height': this.parentSize[1] + 'px' });\n vertical.css({ 'padding-right': '18px', 'padding-bottom': '10px' });\n let grid1 = this.fieldGrid().appendTo(vertical);\n this.createFieldName(grid1, 1, 'Name', false);\n this.lineName = this.createValueLine(grid1, 1);\n this.lineName.setValue(this.component.name);\n this.createFieldName(grid1, 2, 'Quantity', false);\n let divQuant = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(grid1);\n divQuant.css({ 'grid-column': 'value', 'grid-row': '2' });\n this.createQuantity(divQuant);\n this.createFieldName(grid1, 3, 'Description', true);\n this.areaDescr = this.createValueMultiline(grid1, 3);\n this.createFieldName(grid1, 4, 'Synonyms', true);\n this.areaSyn = this.createValueMultiline(grid1, 4);\n this.areaDescr.setValue(this.component.description);\n if (this.component.synonyms)\n this.areaSyn.setValue(this.component.synonyms.join('\\n'));\n let grid2 = this.fieldGrid().appendTo(vertical);\n let row = 0;\n row++;\n this.createFieldName(grid2, ++row, 'Formula', false);\n let divFormula = this.createDiv(grid2, row).css({ 'display': 'flex', 'align-items': 'center' });\n this.lineFormula = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('').appendTo(divFormula).css({ 'flex-grow': '1', 'font': 'inherit' });\n this.lineFormula.setValue(this.component.formula);\n this.lineFormula.elInput.placeholder = this.calculateFormula();\n this.lineFormula.onInput(() => this.calculateWeight());\n this.divWeight = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(divFormula).css({ 'flex-grow': '0' });\n this.calculateWeight();\n this.createFieldName(grid2, ++row, 'InChI', false);\n this.lineInChI = this.createValueLine(grid2, row);\n this.lineInChI.setValue(this.component.inchi);\n if (_main_InChI__WEBPACK_IMPORTED_MODULE_12__.InChI.isAvailable() && this.component.molfile) {\n let div = this.createDiv(grid2, ++row);\n let btn = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('').appendTo(div);\n btn.onClick(() => { this.calculateInChI().then(); });\n }\n this.createFieldName(grid2, ++row, 'SMILES', false);\n this.lineSMILES = this.createValueLine(grid2, row);\n this.lineSMILES.setValue(this.component.smiles);\n this.createFieldName(grid2, ++row, 'Identifiers', true);\n let editIdentifiers = new _KeyValueWidget__WEBPACK_IMPORTED_MODULE_13__.KeyValueWidget(this.component.identifiers, (dict) => {\n this.component.identifiers = dict;\n });\n editIdentifiers.render((0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(grid2).css({ 'grid-area': `${row} / value` }));\n this.createFieldName(grid2, ++row, 'Links', true);\n let editLinks = new _KeyValueWidget__WEBPACK_IMPORTED_MODULE_13__.KeyValueWidget(this.component.links, (dict) => {\n this.component.links = dict;\n });\n editLinks.render((0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(grid2).css({ 'grid-area': `${row} / value` }));\n if (_wmk_data_OntologyTree__WEBPACK_IMPORTED_MODULE_3__.OntologyTree.main && _wmk_data_OntologyTree__WEBPACK_IMPORTED_MODULE_3__.OntologyTree.main.getRoots().length > 0) {\n this.createFieldName(grid2, ++row, 'Metadata', true);\n let editMetadata = new _MetadataWidget__WEBPACK_IMPORTED_MODULE_14__.MetadataWidget(this.component.metadata, (metadata) => {\n this.component.metadata = _wmk_util_Vec__WEBPACK_IMPORTED_MODULE_9__.Vec.notBlank(metadata) ? metadata : undefined;\n });\n editMetadata.render((0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(grid2).css({ 'grid-area': `${row} / value` }));\n }\n this.lineName.grabFocus();\n for (let dom of body.findAll('input'))\n dom.onKeyDown((event) => this.trapEscape(event, true));\n for (let dom of body.findAll('textarea'))\n dom.onKeyDown((event) => this.trapEscape(event, false));\n for (let dom of body.findAll('input,textarea'))\n dom.elInput.spellcheck = false;\n }\n close() {\n if (this.proxyClip)\n this.proxyClip.popHandler();\n super.close();\n }\n saveAndClose() {\n let nullifyBlank = (str) => str === '' ? null : str;\n let splitLines = (str) => {\n let lines = str.split('\\n').filter((line) => line.length > 0);\n return lines.length > 0 ? lines : null;\n };\n let splitKeys = (str) => {\n let dict = null;\n for (let line of str.split('\\n')) {\n let eq = line.indexOf('=');\n if (eq < 0)\n continue;\n if (dict == null)\n dict = {};\n dict[line.substring(0, eq)] = line.substring(eq + 1);\n }\n return dict;\n };\n this.component.name = nullifyBlank(this.lineName.getValue());\n let qtype = this.optQuantType.getSelectedValue();\n [this.component.ratio, this.component.quantity, this.component.error] = [null, null, null];\n let strQuant1 = this.lineQuantVal1.getValue().trim(), strQuant2 = this.lineQuantVal2.getValue().trim();\n if (qtype == QuantityType.Value) {\n if (strQuant1)\n this.component.quantity = parseFloat(strQuant1);\n if (strQuant2)\n this.component.error = parseFloat(strQuant2);\n }\n else if (qtype == QuantityType.Range) {\n this.component.quantity = [parseFloat(strQuant1), parseFloat(strQuant2)];\n this.component.relation = null;\n }\n else if (qtype == QuantityType.Ratio) {\n this.component.ratio = [parseFloat(strQuant1), parseFloat(strQuant2)];\n this.component.relation = null;\n this.component.units = null;\n }\n if (!_data_Mixture__WEBPACK_IMPORTED_MODULE_10__.Mixture.hasQuantity(this.component)) {\n this.component.quantity = null;\n this.component.error = null;\n this.component.ratio = null;\n this.component.units = null;\n this.component.relation = null;\n }\n if (this.areaDescr)\n this.component.description = nullifyBlank(this.areaDescr.getValue());\n this.component.synonyms = splitLines(this.areaSyn.getValue());\n this.component.formula = nullifyBlank(this.lineFormula.getValue());\n this.component.inchi = nullifyBlank(this.lineInChI.getValue());\n this.component.smiles = nullifyBlank(this.lineSMILES.getValue());\n this.callbackSave(this);\n }\n invokeSketcher() {\n this.saveAndClose();\n this.callbackSketch(this);\n }\n fieldGrid() {\n let div = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').css({ 'display': 'grid', 'width': '100%', 'margin': '1em 0 1em 0' });\n div.css({ 'align-items': 'center' });\n div.css({ 'justify-content': 'start', 'grid-row-gap': '0.5em' });\n div.css({ 'grid-template-columns': '[start field] max-content [value] 1fr [end]' });\n return div;\n }\n createFieldName(parent, row, text, topAlign) {\n let div = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(parent);\n div.css({ 'grid-column': 'field', 'grid-row': row.toString(), 'align-self': topAlign ? 'baseline' : 'center' });\n if (topAlign)\n div.css({ 'padding-top': '0.2em' });\n div.css({ 'padding-right': '0.5em', 'font-weight': 'bold' });\n div.setText(text);\n return div;\n }\n createValueLine(parent, row) {\n let div = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(parent).css({ 'grid-area': `${row} / value` });\n let input = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('').appendTo(div);\n input.css({ 'width': 'calc(100% - 4px)', 'padding': '0', 'font': 'inherit' });\n return input;\n }\n createValueMultiline(parent, row) {\n let div = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('
').appendTo(parent).css({ 'grid-area': `${row} / value` });\n let area = (0,_wmk_util_dom__WEBPACK_IMPORTED_MODULE_7__.dom)('