From b1376d401e709515cee078cc08b05fd3fb89caeb Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Wed, 24 Apr 2024 18:12:30 -0400
Subject: completing eslint pass

---
 src/client/util/ServerStats.tsx | 45 +++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 20 deletions(-)

(limited to 'src/client/util/ServerStats.tsx')

diff --git a/src/client/util/ServerStats.tsx b/src/client/util/ServerStats.tsx
index c8df9182d..891561245 100644
--- a/src/client/util/ServerStats.tsx
+++ b/src/client/util/ServerStats.tsx
@@ -1,44 +1,28 @@
-import { action, computed, makeObservable, observable } from 'mobx';
+import { action, computed, makeObservable, observable, runInAction } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
 import { MainViewModal } from '../views/MainViewModal';
 import './SharingManager.scss';
 import { PingManager } from './PingManager';
-import { StrCast } from '../../fields/Types';
-import { Doc } from '../../fields/Doc';
 import { SettingsManager } from './SettingsManager';
 
 @observer
 export class ServerStats extends React.Component<{}> {
+    // eslint-disable-next-line no-use-before-define
     public static Instance: ServerStats;
     @observable private isOpen = false; // whether the SharingManager modal is open or not
 
+    @observable _stats: { [key: string]: any } | undefined = undefined;
     // private get linkVisible() {
     //     return this.targetDoc ? this.targetDoc["acl-" + PublicKey] !== SharingPermissions.None : false;
     // }
 
-    @action
-    public open = async () => {
-        /**
-         * Populates the list of users.
-         */
-        fetch('/stats').then((res: Response) => res.text().then(action(stats => (this._stats = JSON.parse(stats)))));
-
-        this.isOpen = true;
-    };
-
-    public close = action(() => {
-        this.isOpen = false;
-    });
-
     constructor(props: {}) {
         super(props);
         makeObservable(this);
         ServerStats.Instance = this;
     }
 
-    @observable _stats: { [key: string]: any } | undefined = undefined;
-
     /**
      * @returns the main interface of the SharingManager.
      */
@@ -63,7 +47,28 @@ export class ServerStats extends React.Component<{}> {
         );
     }
 
+    // eslint-disable-next-line react/sort-comp
+    public close = action(() => {
+        this.isOpen = false;
+    });
+    public open = async () => {
+        /**
+         * Populates the list of users.
+         */
+        fetch('/stats').then((res: Response) =>
+            res.text().then(
+                action(stats => {
+                    this._stats = JSON.parse(stats);
+                })
+            )
+        );
+
+        runInAction(() => {
+            this.isOpen = true;
+        });
+    };
+
     render() {
-        return <MainViewModal contents={this.sharingInterface} isDisplayed={this.isOpen} interactive={true} closeOnExternalClick={this.close} />;
+        return <MainViewModal contents={this.sharingInterface} isDisplayed={this.isOpen} interactive closeOnExternalClick={this.close} />;
     }
 }
-- 
cgit v1.2.3-70-g09d2


From 6de58d7ecbfd14beb7389c6ff56e764b5c00ba25 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 30 Apr 2024 01:10:20 -0400
Subject: changed acl- and some other field- to acl_ and field_ style

---
 report.20231129.000028.55430.0.001.json            | 1343 --------------------
 src/client/documents/DocumentTypes.ts              |    1 -
 src/client/documents/Documents.ts                  |  137 +-
 src/client/util/CurrentUserUtils.ts                |    4 +-
 src/client/util/ServerStats.tsx                    |    2 +-
 src/client/util/SharingManager.tsx                 |   22 +-
 src/client/views/DashboardView.tsx                 |    2 +-
 src/client/views/FilterPanel.tsx                   |    2 +-
 src/client/views/PropertiesView.tsx                |   16 +-
 .../views/collections/CollectionCarouselView.tsx   |    2 +-
 src/client/views/collections/CollectionMenu.tsx    |   12 +-
 src/client/views/collections/CollectionView.tsx    |    4 +-
 .../collectionFreeForm/CollectionFreeFormView.tsx  |    2 +-
 src/client/views/linking/LinkMenuItem.tsx          |    3 +-
 .../views/nodes/CollectionFreeFormDocumentView.tsx |    4 +-
 src/client/views/nodes/ImageBox.tsx                |    5 +-
 src/client/views/nodes/KeyValuePair.tsx            |    2 +-
 src/client/views/nodes/trails/PresBox.tsx          |    2 +-
 src/fields/Doc.ts                                  |   12 +-
 src/fields/util.ts                                 |   22 +-
 src/server/authentication/DashUserModel.ts         |    4 +-
 src/server/authentication/Passport.ts              |    4 +-
 22 files changed, 127 insertions(+), 1480 deletions(-)
 delete mode 100644 report.20231129.000028.55430.0.001.json

(limited to 'src/client/util/ServerStats.tsx')

diff --git a/report.20231129.000028.55430.0.001.json b/report.20231129.000028.55430.0.001.json
deleted file mode 100644
index a29d550ae..000000000
--- a/report.20231129.000028.55430.0.001.json
+++ /dev/null
@@ -1,1343 +0,0 @@
-
-{
-  "header": {
-    "reportVersion": 1,
-    "event": "Allocation failed - JavaScript heap out of memory",
-    "trigger": "FatalError",
-    "filename": "report.20231129.000028.55430.0.001.json",
-    "dumpEventTime": "2023-11-29T00:00:28Z",
-    "dumpEventTimeStamp": "1701234028056",
-    "processId": 55430,
-    "cwd": "/Users/sarah/Desktop/dash/Dash-Web",
-    "commandLine": [
-      "/Users/sarah/.nvm/versions/node/v12.16.0/bin/node",
-      "--max-old-space-size=2048",
-      "/Users/sarah/Desktop/dash/Dash-Web/node_modules/ts-node-dev/lib/wrap.js",
-      "/Users/sarah/Desktop/dash/Dash-Web/node_modules/fork-ts-checker-webpack-plugin/lib/service.js"
-    ],
-    "nodejsVersion": "v12.16.0",
-    "wordSize": 64,
-    "arch": "x64",
-    "platform": "darwin",
-    "componentVersions": {
-      "node": "12.16.0",
-      "v8": "7.8.279.23-node.31",
-      "uv": "1.34.0",
-      "zlib": "1.2.11",
-      "brotli": "1.0.7",
-      "ares": "1.15.0",
-      "modules": "72",
-      "nghttp2": "1.40.0",
-      "napi": "5",
-      "llhttp": "2.0.4",
-      "http_parser": "2.9.3",
-      "openssl": "1.1.1d",
-      "cldr": "35.1",
-      "icu": "64.2",
-      "tz": "2019c",
-      "unicode": "12.1"
-    },
-    "release": {
-      "name": "node",
-      "lts": "Erbium",
-      "headersUrl": "https://nodejs.org/download/release/v12.16.0/node-v12.16.0-headers.tar.gz",
-      "sourceUrl": "https://nodejs.org/download/release/v12.16.0/node-v12.16.0.tar.gz"
-    },
-    "osName": "Darwin",
-    "osRelease": "22.6.0",
-    "osVersion": "Darwin Kernel Version 22.6.0: Wed Jul  5 22:21:56 PDT 2023; root:xnu-8796.141.3~6/RELEASE_X86_64",
-    "osMachine": "x86_64",
-    "cpus": [
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 19491620,
-        "nice": 0,
-        "sys": 10530730,
-        "idle": 128029940,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1041080,
-        "nice": 0,
-        "sys": 832510,
-        "idle": 156711500,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 17230140,
-        "nice": 0,
-        "sys": 7308720,
-        "idle": 133550270,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1101080,
-        "nice": 0,
-        "sys": 813690,
-        "idle": 156678120,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 14246350,
-        "nice": 0,
-        "sys": 5654800,
-        "idle": 138314740,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1142930,
-        "nice": 0,
-        "sys": 790770,
-        "idle": 156668310,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 12228700,
-        "nice": 0,
-        "sys": 4533960,
-        "idle": 141551990,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1165420,
-        "nice": 0,
-        "sys": 773220,
-        "idle": 156669740,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 9805920,
-        "nice": 0,
-        "sys": 3386750,
-        "idle": 145216650,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1177080,
-        "nice": 0,
-        "sys": 759980,
-        "idle": 156674610,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 8806950,
-        "nice": 0,
-        "sys": 2889820,
-        "idle": 146774530,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1166250,
-        "nice": 0,
-        "sys": 737790,
-        "idle": 156711830,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 7865920,
-        "nice": 0,
-        "sys": 2438950,
-        "idle": 148205800,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1155370,
-        "nice": 0,
-        "sys": 719580,
-        "idle": 156743860,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 7478040,
-        "nice": 0,
-        "sys": 2248690,
-        "idle": 148810130,
-        "irq": 0
-      },
-      {
-        "model": "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz",
-        "speed": 2300,
-        "user": 1131070,
-        "nice": 0,
-        "sys": 695000,
-        "idle": 156797450,
-        "irq": 0
-      }
-    ],
-    "networkInterfaces": [
-      {
-        "name": "lo0",
-        "internal": true,
-        "mac": "00:00:00:00:00:00",
-        "address": "127.0.0.1",
-        "netmask": "255.0.0.0",
-        "family": "IPv4"
-      },
-      {
-        "name": "lo0",
-        "internal": true,
-        "mac": "00:00:00:00:00:00",
-        "address": "::1",
-        "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
-        "family": "IPv6",
-        "scopeid": 0
-      },
-      {
-        "name": "lo0",
-        "internal": true,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::1",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 1
-      },
-      {
-        "name": "en5",
-        "internal": false,
-        "mac": "ac:de:48:00:11:22",
-        "address": "fe80::aede:48ff:fe00:1122",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 4
-      },
-      {
-        "name": "en0",
-        "internal": false,
-        "mac": "88:66:5a:29:28:77",
-        "address": "fe80::1467:9dad:c3d1:73a7",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 6
-      },
-      {
-        "name": "en0",
-        "internal": false,
-        "mac": "88:66:5a:29:28:77",
-        "address": "10.38.21.14",
-        "netmask": "255.255.192.0",
-        "family": "IPv4"
-      },
-      {
-        "name": "en0",
-        "internal": false,
-        "mac": "88:66:5a:29:28:77",
-        "address": "fde6:e673:d766:4b72:1481:e813:77a2:da34",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 0
-      },
-      {
-        "name": "en0",
-        "internal": false,
-        "mac": "88:66:5a:29:28:77",
-        "address": "2620:6e:6000:3100:148e:201a:1a33:145d",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 0
-      },
-      {
-        "name": "en0",
-        "internal": false,
-        "mac": "88:66:5a:29:28:77",
-        "address": "2620:6e:6000:3100:5c7f:8d3f:76ba:694b",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 0
-      },
-      {
-        "name": "awdl0",
-        "internal": false,
-        "mac": "12:df:77:23:4c:4e",
-        "address": "fe80::10df:77ff:fe23:4c4e",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 9
-      },
-      {
-        "name": "llw0",
-        "internal": false,
-        "mac": "12:df:77:23:4c:4e",
-        "address": "fe80::10df:77ff:fe23:4c4e",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 12
-      },
-      {
-        "name": "utun0",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::6616:29f1:d83d:2f8d",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 14
-      },
-      {
-        "name": "utun1",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::b4dc:ec9a:5d3d:18ab",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 15
-      },
-      {
-        "name": "utun2",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::ce81:b1c:bd2c:69e",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 16
-      },
-      {
-        "name": "utun3",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::bd9f:d9d8:700d:2011",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 17
-      },
-      {
-        "name": "utun4",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::9a49:1de7:e220:2bb",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 18
-      },
-      {
-        "name": "utun5",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::93fe:38cf:1393:3191",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 19
-      },
-      {
-        "name": "utun6",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::781d:651c:69a7:3d42",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 20
-      },
-      {
-        "name": "utun7",
-        "internal": false,
-        "mac": "00:00:00:00:00:00",
-        "address": "fe80::b39:d094:2a6d:e0c5",
-        "netmask": "ffff:ffff:ffff:ffff::",
-        "family": "IPv6",
-        "scopeid": 21
-      }
-    ],
-    "host": "sarahs-mbp-2.devices.brown.edu"
-  },
-  "javascriptStack": {
-    "message": "No stack.",
-    "stack": [
-      "Unavailable."
-    ]
-  },
-  "nativeStack": [
-    {
-      "pc": "0x000000010015c8ca",
-      "symbol": "report::TriggerNodeReport(v8::Isolate*, node::Environment*, char const*, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, v8::Local<v8::String>) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100080f3e",
-      "symbol": "node::OnFatalError(char const*, char const*) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100185467",
-      "symbol": "v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100185403",
-      "symbol": "v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x000000010030b5f5",
-      "symbol": "v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x000000010030ccc4",
-      "symbol": "v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100309b37",
-      "symbol": "v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100307afd",
-      "symbol": "v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x00000001003132ba",
-      "symbol": "v8::internal::Heap::AllocateRawWithLightRetry(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100313341",
-      "symbol": "v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x00000001002e065b",
-      "symbol": "v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationType, v8::internal::AllocationOrigin) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100618a18",
-      "symbol": "v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    },
-    {
-      "pc": "0x0000000100950c19",
-      "symbol": "Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit [/Users/sarah/.nvm/versions/node/v12.16.0/bin/node]"
-    }
-  ],
-  "javascriptHeap": {
-    "totalMemory": 2154991616,
-    "totalCommittedMemory": 2153815368,
-    "usedMemory": 2136222480,
-    "availableMemory": 51343040,
-    "memoryLimit": 2197815296,
-    "heapSpaces": {
-      "read_only_space": {
-        "memorySize": 262144,
-        "committedMemory": 33088,
-        "capacity": 32808,
-        "used": 32808,
-        "available": 0
-      },
-      "new_space": {
-        "memorySize": 8388608,
-        "committedMemory": 8388528,
-        "capacity": 4189824,
-        "used": 69544,
-        "available": 4120280
-      },
-      "old_space": {
-        "memorySize": 1946566656,
-        "committedMemory": 1946346224,
-        "capacity": 1939183704,
-        "used": 1938974448,
-        "available": 209256
-      },
-      "code_space": {
-        "memorySize": 14323712,
-        "committedMemory": 13779552,
-        "capacity": 12481792,
-        "used": 12481792,
-        "available": 0
-      },
-      "map_space": {
-        "memorySize": 1576960,
-        "committedMemory": 1394440,
-        "capacity": 1280720,
-        "used": 1280720,
-        "available": 0
-      },
-      "large_object_space": {
-        "memorySize": 183824384,
-        "committedMemory": 183824384,
-        "capacity": 183380384,
-        "used": 183380384,
-        "available": 0
-      },
-      "code_large_object_space": {
-        "memorySize": 49152,
-        "committedMemory": 49152,
-        "capacity": 2784,
-        "used": 2784,
-        "available": 0
-      },
-      "new_large_object_space": {
-        "memorySize": 0,
-        "committedMemory": 0,
-        "capacity": 4189824,
-        "used": 0,
-        "available": 4189824
-      }
-    }
-  },
-  "resourceUsage": {
-    "userCpuSeconds": 306.691,
-    "kernelCpuSeconds": 15.3869,
-    "cpuConsumptionPercent": 11.2772,
-    "maxRss": 2231285841920,
-    "pageFaults": {
-      "IORequired": 110,
-      "IONotRequired": 2487718
-    },
-    "fsActivity": {
-      "reads": 0,
-      "writes": 0
-    }
-  },
-  "libuv": [
-  ],
-  "environmentVariables": {
-    "npm_config_save_dev": "",
-    "npm_config_legacy_bundling": "",
-    "npm_config_dry_run": "",
-    "npm_package_dependencies_request": "^2.88.2",
-    "npm_package_dependencies_express_flash": "0.0.2",
-    "npm_package_dependencies__fortawesome_fontawesome_svg_core": "^6.3.0",
-    "NVM_INC": "/Users/sarah/.nvm/versions/node/v12.16.0/include/node",
-    "npm_config_viewer": "man",
-    "npm_config_only": "",
-    "npm_config_commit_hooks": "true",
-    "npm_config_browser": "",
-    "npm_package_gitHead": "5754c1c056ec62e17b5d7badddc4a8fc3637e09f",
-    "npm_package_dependencies_webpack_dev_middleware": "^5.3.1",
-    "npm_package_dependencies_webpack_cli": "^4.10.0",
-    "npm_package_devDependencies_prettier": "^2.7.1",
-    "npm_package_devDependencies_awesome_typescript_loader": "^5.2.1",
-    "npm_package_devDependencies__types_archiver": "^3.1.1",
-    "npm_config_also": "",
-    "npm_package_dependencies_react_jsx_parser": "^1.29.0",
-    "npm_package_dependencies_mongoose": "^5.13.14",
-    "npm_package_dependencies_connect_flash": "^0.1.1",
-    "npm_package_browser_child_process": "false",
-    "npm_config_sign_git_commit": "",
-    "npm_config_rollback": "true",
-    "npm_package_dependencies_material_ui": "^0.20.2",
-    "npm_package_devDependencies__types_sharp": "^0.23.1",
-    "npm_package_devDependencies__types_passport_local": "^1.0.34",
-    "npm_package_devDependencies__types_dotenv": "^6.1.1",
-    "npm_package_devDependencies__types_cookie_parser": "^1.4.2",
-    "TERM_PROGRAM": "Apple_Terminal",
-    "NODE": "/Users/sarah/.nvm/versions/node/v12.16.0/bin/node",
-    "npm_config_usage": "",
-    "npm_config_audit": "true",
-    "npm_package_dependencies_reveal_js": "^4.3.0",
-    "npm_package_dependencies_process": "^0.11.10",
-    "npm_package_dependencies_pdfjs": "^2.4.7",
-    "npm_package_dependencies_html_to_image": "^0.1.3",
-    "npm_package_devDependencies_file_loader": "^3.0.1",
-    "npm_package_devDependencies__types_express_flash": "0.0.0",
-    "npm_package_scripts_monitor": "cross-env MONITORED=true NODE_OPTIONS=--max_old_space_size=4096 ts-node src/server/index.ts",
-    "INIT_CWD": "/Users/sarah/Desktop/dash/Dash-Web",
-    "npm_package_dependencies_rehype_raw": "^6.1.1",
-    "npm_package_dependencies_react_audio_waveform": "0.0.5",
-    "npm_package_dependencies_path_browserify": "^1.0.1",
-    "npm_package_dependencies_nodemailer": "^5.1.1",
-    "npm_package_dependencies_axios": "^0.19.2",
-    "npm_package_devDependencies_typescript": "^4.7.4",
-    "NVM_CD_FLAGS": "-q",
-    "npm_config_globalignorefile": "/Users/sarah/.nvm/versions/node/v12.16.0/etc/npmignore",
-    "npm_package_dependencies_react_grid_layout": "^1.3.4",
-    "npm_package_dependencies_prosemirror_find_replace": "^0.9.0",
-    "npm_package_dependencies_normalize_css": "^8.0.1",
-    "npm_package_devDependencies_mocha": "^5.2.0",
-    "npm_package_devDependencies__types_express_session": "^1.17.5",
-    "SHELL": "/bin/zsh",
-    "TERM": "xterm-256color",
-    "npm_config_shell": "/bin/zsh",
-    "npm_config_maxsockets": "50",
-    "npm_config_init_author_url": "",
-    "npm_package_dependencies_prosemirror_dev_tools": "^3.1.0",
-    "npm_package_dependencies_p_limit": "^2.2.0",
-    "npm_package_dependencies_bson": "^4.6.1",
-    "npm_package_dependencies__types_dom_speech_recognition": "0.0.1",
-    "npm_package_dependencies__emotion_styled": "^11.11.0",
-    "npm_package_devDependencies_style_loader": "^0.23.1",
-    "npm_package_devDependencies__types_react_datepicker": "^3.1.8",
-    "npm_config_shrinkwrap": "true",
-    "npm_config_parseable": "",
-    "npm_config_metrics_registry": "https://registry.npmjs.org/",
-    "npm_package_dependencies_xregexp": "^4.4.1",
-    "npm_package_dependencies_shelljs": "^0.8.5",
-    "npm_package_dependencies_bezier_curve": "^1.0.0",
-    "npm_package_dependencies__mui_icons_material": "^5.11.16",
-    "npm_package_devDependencies_tslint": "^5.20.1",
-    "npm_package_devDependencies__types_react_transition_group": "^4.4.5",
-    "npm_package_scripts_tsc": "tsc",
-    "TMPDIR": "/var/folders/yk/p_39q8jn673c5p8_66mcxm7r0000gn/T/",
-    "npm_config_timing": "",
-    "npm_config_init_license": "ISC",
-    "npm_package_dependencies_socket_io": "^2.5.0",
-    "npm_package_dependencies_probe_image_size": "^4.0.0",
-    "npm_package_dependencies_canvas": "^2.9.3",
-    "npm_package_dependencies__hig_theme_data": "^2.23.1",
-    "npm_package_devDependencies__types_react_select": "^3.1.2",
-    "npm_package_devDependencies__types_prosemirror_model": "^1.16.1",
-    "CONDA_SHLVL": "1",
-    "npm_config_if_present": "",
-    "npm_package_dependencies_typescript_collections": "^1.3.3",
-    "npm_package_dependencies_rimraf": "^3.0.0",
-    "npm_package_dependencies_react_autosuggest": "^9.4.3",
-    "npm_package_dependencies_flexlayout_react": "^0.3.11",
-    "npm_package_dependencies_find_in_files": "^0.5.0",
-    "npm_package_devDependencies__types_chai": "^4.3.0",
-    "CONDA_PROMPT_MODIFIER": "(base) ",
-    "TERM_PROGRAM_VERSION": "447",
-    "npm_package_dependencies_prosemirror_inputrules": "^1.1.3",
-    "npm_package_dependencies_bcrypt_nodejs": "0.0.3",
-    "npm_package_dependencies_async": "^2.6.2",
-    "npm_config_sign_git_tag": "",
-    "npm_config_init_author_email": "",
-    "npm_config_cache_max": "Infinity",
-    "npm_package_dependencies_uuid": "^3.4.0",
-    "npm_package_dependencies_supercluster": "^7.1.4",
-    "npm_package_dependencies_remark_gfm": "^3.0.1",
-    "npm_package_dependencies_connect_mongo": "^2.0.3",
-    "npm_package_dependencies_browser_assert": "^1.2.1",
-    "npm_package_devDependencies_sass_loader": "^7.3.1",
-    "npm_package_scripts_start_release_debug": "cross-env RELEASE=true USE_AZURE=true NODE_OPTIONS=--max_old_space_size=4096 ts-node-dev --inspect -- src/server/index.ts",
-    "npm_config_preid": "",
-    "npm_config_long": "",
-    "npm_config_local_address": "",
-    "npm_config_git_tag_version": "true",
-    "npm_config_cert": "",
-    "npm_package_dependencies_js_datepicker": "^4.6.6",
-    "npm_package_devDependencies__types_webpack_hot_middleware": "^2.25.6",
-    "npm_package_devDependencies__types_mongodb": "^3.6.20",
-    "npm_package_devDependencies__types_mocha": "^5.2.6",
-    "TERM_SESSION_ID": "4AACD142-8780-44F4-A4FA-BB53E1BF6081",
-    "npm_config_registry": "https://registry.npmjs.org/",
-    "npm_config_noproxy": "",
-    "npm_config_fetch_retries": "2",
-    "npm_package_dependencies_react_compound_slider": "^2.5.0",
-    "npm_package_dependencies_prosemirror_history": "^1.2.0",
-    "npm_package_devDependencies__types_react_color": "^2.17.6",
-    "npm_package_devDependencies__types_google_maps_react": "^2.0.5",
-    "npm_package_devDependencies__types_color": "^3.0.3",
-    "npm_package_dependencies_react_dom": "^18.2.0",
-    "npm_package_dependencies_passport_local": "^1.0.0",
-    "npm_package_dependencies__octokit_core": "^4.0.4",
-    "npm_package_devDependencies__types_async": "^2.4.1",
-    "npm_package_scripts_debug": "cross-env  NODE_OPTIONS=--max_old_space_size=8192 ts-node-dev --transpile-only --inspect -- src/server/index.ts",
-    "npm_package_scripts_oldstart": "cross-env NODE_OPTIONS=--max_old_space_size=4096 ts-node-dev --debug -- src/server/index.ts",
-    "npm_config_versions": "",
-    "npm_config_message": "%s",
-    "npm_config_key": "",
-    "npm_package_readmeFilename": "README.md",
-    "npm_package_dependencies_react_refresh_typescript": "^2.0.7",
-    "npm_package_dependencies_react_dropzone": "^14.2.3",
-    "npm_package_dependencies_image_size": "^0.7.5",
-    "npm_package_dependencies_html_to_text": "^5.1.1",
-    "npm_package_dependencies_express_validator": "^5.3.1",
-    "npm_package_devDependencies_eslint_plugin_jsx_a11y": "^6.6.0",
-    "npm_package_node_child_process": "empty",
-    "npm_package_dependencies_react_resizable_rotatable_draggable": "^0.2.0",
-    "npm_package_dependencies_got": "^12.0.1",
-    "npm_package_dependencies__types_d3_color": "^2.0.3",
-    "npm_package_devDependencies_webpack": "^5.69.1",
-    "npm_package_devDependencies__types_nodemailer": "^4.6.6",
-    "npm_package_description": "Install Node.js, then, from the project directory, run",
-    "NVM_DIR": "/Users/sarah/.nvm",
-    "USER": "sarah",
-    "npm_package_dependencies__types_d3_scale": "^3.3.2",
-    "npm_package_devDependencies_dotenv": "^8.6.0",
-    "npm_package_devDependencies__types_react": "^18.0.15",
-    "npm_package_devDependencies__types_prosemirror_transform": "^1.1.5",
-    "npm_package_devDependencies__types_prosemirror_history": "^1.0.3",
-    "npm_package_dependencies_readline": "^1.3.0",
-    "npm_package_dependencies__types_supercluster": "^7.1.0",
-    "npm_package_dependencies__azure_storage_blob": "^12.14.0",
-    "npm_config_globalconfig": "/Users/sarah/.nvm/versions/node/v12.16.0/etc/npmrc",
-    "npm_package_dependencies_depcheck": "^0.9.2",
-    "npm_package_dependencies__types_web": "0.0.53",
-    "CONDA_EXE": "/Users/sarah/miniconda3/bin/conda",
-    "npm_config_prefer_online": "",
-    "npm_config_logs_max": "10",
-    "npm_config_always_auth": "",
-    "npm_package_dependencies_react_icons": "^4.3.1",
-    "npm_package_dependencies_passport_google_oauth20": "^2.0.0",
-    "npm_package_devDependencies_webpack_dev_server": "^3.11.3",
-    "npm_package_devDependencies__types_brotli": "^1.3.1",
-    "npm_package_dependencies_url_loader": "^1.1.2",
-    "npm_package_dependencies_stream_browserify": "^3.0.0",
-    "npm_package_dependencies_prosemirror_transform": "^1.3.4",
-    "npm_package_dependencies_lodash": "^4.17.21",
-    "npm_package_dependencies_i": "^0.3.7",
-    "npm_package_devDependencies_tslint_loader": "^3.6.0",
-    "SSH_AUTH_SOCK": "/private/tmp/com.apple.launchd.dBaRxB6a53/Listeners",
-    "npm_package_dependencies_words_to_numbers": "^1.5.1",
-    "npm_package_dependencies_valid_url": "^1.0.9",
-    "npm_package_dependencies_styled_components": "^4.4.1",
-    "npm_package_dependencies_csv_parser": "^3.0.0",
-    "npm_package_dependencies_class_transformer": "^0.2.0",
-    "npm_package_devDependencies_eslint": "^8.36.0",
-    "npm_package_devDependencies__types_prosemirror_inputrules": "^1.0.4",
-    "npm_package_devDependencies__types_express": "^4.17.13",
-    "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0",
-    "npm_execpath": "/Users/sarah/.nvm/versions/node/v12.16.0/lib/node_modules/npm/bin/npm-cli.js",
-    "npm_config_global_style": "",
-    "npm_config_cache_lock_retries": "10",
-    "npm_package_dependencies_wikijs": "^6.3.3",
-    "npm_package_dependencies_bluebird": "^3.7.2",
-    "npm_package_devDependencies__types_react_typist": "^2.0.3",
-    "npm_config_update_notifier": "true",
-    "npm_config_cafile": "",
-    "npm_package_dependencies_util": "^0.12.4",
-    "npm_package_dependencies_raw_loader": "^1.0.0",
-    "npm_package_dependencies_https_browserify": "^1.0.0",
-    "npm_package_dependencies_brotli": "^1.3.3",
-    "npm_package_dependencies__mui_material": "^5.13.1",
-    "npm_package_dependencies__fortawesome_react_fontawesome": "^0.2.0",
-    "npm_package_devDependencies__types_passport_google_oauth20": "^2.0.11",
-    "npm_package_dependencies_cors": "^2.8.5",
-    "npm_package_dependencies_bezier_js": "^4.1.1",
-    "npm_package_dependencies__fortawesome_free_brands_svg_icons": "^6.3.0",
-    "npm_config_heading": "npm",
-    "npm_config_audit_level": "low",
-    "npm_package_dependencies_chrome": "^0.1.0",
-    "npm_package_dependencies__react_three_fiber": "^6.2.3",
-    "npm_package_devDependencies_eslint_plugin_prettier": "^4.2.1",
-    "npm_package_devDependencies_copy_webpack_plugin": "^4.6.0",
-    "npm_package_devDependencies__types_react_measure": "^2.0.8",
-    "npm_package_devDependencies__types_react_dom": "^18.0.6",
-    "npm_package_devDependencies__types_mobile_detect": "^1.3.4",
-    "_CE_CONDA": "",
-    "npm_config_searchlimit": "20",
-    "npm_config_read_only": "",
-    "npm_config_offline": "",
-    "npm_config_fetch_retry_mintimeout": "10000",
-    "npm_package_dependencies_react_typist": "^2.0.5",
-    "npm_package_dependencies_mobx_react_devtools": "^6.1.1",
-    "npm_package_dependencies_md5_file": "^5.0.0",
-    "npm_package_dependencies_forever_agent": "^0.6.1",
-    "npm_package_devDependencies__types_xregexp": "^4.4.0",
-    "npm_package_devDependencies__types_typescript": "^2.0.0",
-    "npm_package_devDependencies__types_request": "^2.48.8",
-    "npm_package_devDependencies__types_prosemirror_commands": "^1.0.4",
-    "npm_config_json": "",
-    "npm_config_access": "",
-    "npm_config_argv": "{\"remain\":[],\"cooked\":[\"start\"],\"original\":[\"start\"]}",
-    "npm_package_dependencies__fortawesome_free_solid_svg_icons": "^6.3.0",
-    "npm_package_devDependencies__types_socket_io": "^2.1.13",
-    "PATH": "/Users/sarah/.nvm/versions/node/v12.16.0/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/Users/sarah/Desktop/dash/Dash-Web/node_modules/.bin:/Users/sarah/.nvm/versions/node/v12.16.0/bin:/Users/sarah/miniconda3/bin:/Users/sarah/miniconda3/condabin:/Users/sarah/.elan/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin",
-    "npm_config_allow_same_version": "",
-    "npm_package_dependencies_webrtc_adapter": "^7.7.1",
-    "npm_package_dependencies_react_reveal": "^1.2.2",
-    "npm_package_dependencies_prosemirror_schema_list": "^1.1.6",
-    "npm_package_dependencies__material_ui_core": "^4.12.3",
-    "npm_package_devDependencies__types_rimraf": "^2.0.5",
-    "npm_package_devDependencies__types_connect_flash": "0.0.34",
-    "npm_config_https_proxy": "",
-    "npm_config_engine_strict": "",
-    "npm_config_description": "true",
-    "npm_package_dependencies_pug": "^2.0.4",
-    "npm_package_dependencies_prosemirror_keymap": "^1.1.5",
-    "npm_package_dependencies_pdfjs_dist": "^2.14.305",
-    "npm_package_dependencies_mobile_detect": "^1.4.5",
-    "npm_package_dependencies_image_size_stream": "^1.1.0",
-    "npm_package_dependencies_golden_layout": "^1.5.9",
-    "npm_package_dependencies_child_process": "^1.0.2",
-    "npm_package_dependencies__types_d3_axis": "^2.1.3",
-    "_": "/Users/sarah/Desktop/dash/Dash-Web/node_modules/.bin/cross-env",
-    "LaunchInstanceID": "16109DB5-CDB2-454A-9613-8F6F534702AC",
-    "npm_config_userconfig": "/Users/sarah/.npmrc",
-    "npm_config_init_module": "/Users/sarah/.npm-init.js",
-    "npm_package_dependencies__react_google_maps_api": "^2.7.0",
-    "CONDA_PREFIX": "/Users/sarah/miniconda3",
-    "__CFBundleIdentifier": "com.apple.Terminal",
-    "npm_config_cidr": "",
-    "npm_package_dependencies_puppeteer": "^3.3.0",
-    "npm_package_dependencies_prosemirror_view": "^1.26.5",
-    "npm_package_dependencies_mongodb": "^3.7.3",
-    "npm_package_dependencies_google_auth_library": "^4.2.4",
-    "npm_package_dependencies_bootstrap": "^4.6.1",
-    "npm_package_devDependencies_eslint_config_airbnb": "^19.0.4",
-    "PWD": "/Users/sarah/desktop/dash/dash-web",
-    "npm_config_user": "501",
-    "npm_config_node_version": "12.16.0",
-    "npm_package_dependencies_node_sass": "^4.14.1",
-    "npm_package_dependencies_howler": "^2.2.3",
-    "npm_package_dependencies_expressjs": "^1.0.1",
-    "npm_package_dependencies_core_js": "^3.28.0",
-    "npm_package_dependencies_browndash_components": "^0.1.36",
-    "npm_package_devDependencies_eslint_plugin_react_hooks": "^4.6.0",
-    "npm_package_devDependencies__types_lodash": "^4.14.179",
-    "JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk1.8.0_341.jdk/Contents/Home",
-    "npm_lifecycle_event": "start",
-    "npm_package_dependencies_react_table": "^6.11.5",
-    "npm_package_dependencies_react_loading": "^2.0.3",
-    "npm_package_dependencies_mobx": "^5.15.7",
-    "npm_package_dependencies_babel": "^6.23.0",
-    "npm_package_devDependencies_jsdom": "^15.2.1",
-    "npm_package_devDependencies_chai": "^4.3.6",
-    "npm_config_save": "true",
-    "npm_config_ignore_prepublish": "",
-    "npm_config_editor": "vi",
-    "npm_config_auth_type": "legacy",
-    "npm_package_dependencies_npm": "^6.14.18",
-    "npm_package_dependencies_node_stream_zip": "^1.15.0",
-    "npm_package_dependencies_image_data_uri": "^2.0.1",
-    "npm_package_scripts_start_release": "cross-env RELEASE=true USE_AZURE=false NODE_OPTIONS=--max_old_space_size=4096 ts-node-dev -- src/server/index.ts",
-    "npm_package_name": "dash",
-    "LANG": "en_US.UTF-8",
-    "npm_config_tag": "latest",
-    "npm_config_script_shell": "",
-    "npm_package_dependencies_query_string": "^6.14.1",
-    "npm_package_dependencies_mobx_utils": "^5.6.2",
-    "npm_package_dependencies_file_saver": "^2.0.5",
-    "npm_package_dependencies_body_parser": "^1.19.2",
-    "npm_package_dependencies__types_reveal": "^3.3.33",
-    "npm_package_devDependencies_eslint_plugin_import": "^2.26.0",
-    "npm_package_devDependencies__types_prosemirror_view": "^1.23.1",
-    "npm_config_progress": "true",
-    "npm_config_global": "",
-    "npm_config_before": "",
-    "npm_package_dependencies_xoauth2": "^1.2.0",
-    "npm_package_dependencies_standard_http_error": "^2.0.1",
-    "npm_package_dependencies_react_loader_spinner": "^5.3.4",
-    "npm_package_dependencies_http_browserify": "^1.7.0",
-    "npm_package_dependencies__types_d3_selection": "^2.0.1",
-    "npm_package_dependencies__hig_flyout": "^1.3.1",
-    "npm_package_devDependencies_fork_ts_checker_webpack_plugin": "^1.6.0",
-    "npm_package_scripts_build": "cross-env NODE_OPTIONS=--max_old_space_size=8192 webpack --env production",
-    "npm_package_scripts_start": "cross-env NODE_OPTIONS=--max_old_space_size=4096 ts-node-dev --debug --transpile-only -- src/server/index.ts",
-    "npm_config_searchstaleness": "900",
-    "npm_config_optional": "true",
-    "npm_config_ham_it_up": "",
-    "npm_package_dependencies_sharp": "^0.23.4",
-    "npm_package_dependencies_rc_switch": "^1.9.2",
-    "npm_package_dependencies_googlephotos": "^0.2.5",
-    "npm_package_dependencies_exifr": "^7.1.3",
-    "npm_package_dependencies__types_google_maps": "^3.2.3",
-    "npm_package_dependencies__types_bezier_js": "^4.1.0",
-    "npm_package_dependencies__ffmpeg_core": "0.10.0",
-    "npm_package_devDependencies_ts_loader": "^5.3.3",
-    "npm_package_devDependencies__types_bcrypt_nodejs": "0.0.30",
-    "XPC_FLAGS": "0x0",
-    "npm_config_save_prod": "",
-    "npm_config_force": "",
-    "npm_config_bin_links": "true",
-    "npm_package_devDependencies__types_youtube": "0.0.39",
-    "npm_config_searchopts": "",
-    "npm_package_dependencies_react_beautiful_dnd": "^13.1.0",
-    "npm_package_dependencies_jszip": "^3.7.1",
-    "npm_package_dependencies_csv_stringify": "^6.3.0",
-    "npm_package_devDependencies__types_react_icons": "^3.0.0",
-    "npm_config_node_gyp": "/Users/sarah/.nvm/versions/node/v12.16.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js",
-    "npm_config_depth": "Infinity",
-    "npm_package_dependencies_google_maps_react": "^2.0.6",
-    "npm_package_dependencies_express_session": "^1.17.2",
-    "npm_package_devDependencies_eslint_plugin_node": "^11.1.0",
-    "npm_package_devDependencies_eslint_config_prettier": "^8.5.0",
-    "npm_package_main": "index.js",
-    "npm_config_sso_poll_frequency": "500",
-    "npm_config_rebuild_bundle": "true",
-    "npm_package_dependencies_chart_js": "^3.8.0",
-    "npm_package_dependencies__emotion_react": "^11.11.0",
-    "npm_package_devDependencies__types_prosemirror_menu": "^1.0.6",
-    "npm_package_devDependencies__types_prosemirror_keymap": "^1.0.4",
-    "npm_package_devDependencies__types_pdfjs_dist": "^2.10.378",
-    "npm_package_devDependencies__types_exif": "^0.6.3",
-    "npm_package_version": "1.0.0",
-    "_CE_M": "",
-    "XPC_SERVICE_NAME": "0",
-    "npm_config_unicode": "true",
-    "npm_package_dependencies_typescript_language_server": "^0.4.0",
-    "npm_package_dependencies_prosemirror_model": "^1.18.1",
-    "npm_package_dependencies__ffmpeg_ffmpeg": "0.10.0",
-    "SHLVL": "2",
-    "HOME": "/Users/sarah",
-    "npm_config_fetch_retry_maxtimeout": "60000",
-    "npm_package_dependencies_request_promise": "^4.2.6",
-    "npm_package_dependencies_react_markdown": "^8.0.3",
-    "npm_package_dependencies__hig_theme_context": "^2.1.3",
-    "npm_package_devDependencies__types_react_autosuggest": "^9.3.14",
-    "npm_package_devDependencies__types_mongoose": "^5.11.97",
-    "npm_package_devDependencies__types_d3": "^7.4.0",
-    "npm_package_devDependencies__types_animejs": "^2.0.2",
-    "npm_package_scripts_test": "mocha -r ts-node/register test/**/*.ts",
-    "npm_config_tag_version_prefix": "v",
-    "npm_config_strict_ssl": "true",
-    "npm_config_sso_type": "oauth",
-    "npm_config_scripts_prepend_node_path": "warn-only",
-    "npm_config_save_prefix": "^",
-    "npm_config_loglevel": "notice",
-    "npm_config_ca": "",
-    "npm_package_dependencies_three": "^0.127.0",
-    "npm_package_dependencies_openai": "^3.2.1",
-    "npm_package_dependencies_mobx_react": "^5.4.4",
-    "npm_package_dependencies_google_translate_api_browser": "^3.0.1",
-    "npm_package_dependencies_cookie_parser": "^1.4.6",
-    "npm_package_dependencies_adm_zip": "^0.4.16",
-    "npm_package_devDependencies_eslint_config_node": "^4.1.0",
-    "npm_config_save_exact": "",
-    "npm_config_group": "20",
-    "npm_config_fetch_retry_factor": "10",
-    "npm_config_dev": "",
-    "npm_package_devDependencies_webpack_hot_middleware": "^2.25.1",
-    "npm_package_devDependencies_cross_env": "^5.2.1",
-    "npm_config_version": "",
-    "npm_config_prefer_offline": "",
-    "npm_config_cache_lock_stale": "60000",
-    "npm_package_devDependencies__types_prosemirror_state": "^1.2.8",
-    "npm_package_devDependencies__types_body_parser": "^1.19.2",
-    "npm_config_otp": "",
-    "npm_config_cache_min": "10",
-    "npm_package_dependencies_react_color": "^2.19.3",
-    "npm_package_dependencies_d3": "^7.6.1",
-    "npm_package_devDependencies_ts_node": "^10.9.1",
-    "npm_package_devDependencies__types_react_grid_layout": "^1.3.2",
-    "npm_config_searchexclude": "",
-    "npm_config_cache": "/Users/sarah/.npm",
-    "npm_package_dependencies_tough_cookie": "^4.0.0",
-    "npm_package_dependencies_googleapis": "^40.0.0",
-    "npm_package_devDependencies__types_valid_url": "^1.0.3",
-    "npm_package_devDependencies__types_passport": "^1.0.9",
-    "npm_package_devDependencies__types_adm_zip": "^0.4.34",
-    "CONDA_PYTHON_EXE": "/Users/sarah/miniconda3/bin/python",
-    "LOGNAME": "sarah",
-    "npm_lifecycle_script": "cross-env NODE_OPTIONS=--max_old_space_size=4096 ts-node-dev --debug --transpile-only -- src/server/index.ts",
-    "npm_config_color": "true",
-    "npm_package_dependencies_solr_node": "^1.2.1",
-    "npm_package_dependencies_react_transition_group": "^4.4.2",
-    "npm_package_dependencies_iink_js": "^1.5.4",
-    "npm_package_dependencies_html_webpack_plugin": "^5.5.0",
-    "npm_config_proxy": "",
-    "npm_config_package_lock": "true",
-    "npm_package_dependencies_prosemirror_state": "^1.4.1",
-    "npm_package_dependencies_nodemon": "^1.19.4",
-    "npm_package_dependencies_function_plot": "^1.22.8",
-    "npm_package_dependencies_equation_editor_react": "github:bobzel/equation-editor-react#useLocally",
-    "npm_package_devDependencies__types_socket_io_parser": "^3.0.0",
-    "CLASSPATH": "/Users/sarah/Downloads/cs15/*:.",
-    "npm_config_package_lock_only": "",
-    "npm_config_fund": "true",
-    "npm_package_dependencies_react": "^18.2.0",
-    "npm_package_dependencies_bingmaps_react": "^1.2.10",
-    "npm_package_devDependencies_scss_loader": "0.0.1",
-    "npm_package_devDependencies__types_cookie_session": "^2.0.44",
-    "npm_config_save_optional": "",
-    "npm_package_dependencies_textarea_caret": "^3.1.0",
-    "npm_package_dependencies_react_measure": "^2.5.2",
-    "npm_package_dependencies_exif": "^0.6.0",
-    "NVM_BIN": "/Users/sarah/.nvm/versions/node/v12.16.0/bin",
-    "CONDA_DEFAULT_ENV": "base",
-    "npm_config_ignore_scripts": "",
-    "npm_config_user_agent": "npm/6.14.7 node/v12.16.0 darwin x64",
-    "npm_package_dependencies_react_resizable": "^1.11.1",
-    "npm_package_dependencies_prosemirror_commands": "^1.2.1",
-    "npm_package_dependencies_memorystream": "^0.3.1",
-    "npm_package_dependencies_formidable": "1.2.1",
-    "npm_package_devDependencies__types_uuid": "^3.4.10",
-    "npm_config_cache_lock_wait": "10000",
-    "npm_package_dependencies_socket_io_client": "^2.5.0",
-    "npm_package_dependencies_recharts": "^2.1.12",
-    "npm_package_dependencies_react_chartjs_2": "^4.3.0",
-    "npm_package_dependencies_fluent_ffmpeg": "^2.1.2",
-    "npm_package_dependencies__types_cors": "^2.8.12",
-    "npm_package_devDependencies__types_node": "^10.17.60",
-    "npm_package_devDependencies__types_file_saver": "^2.0.5",
-    "npm_config_production": "",
-    "npm_package_dependencies_jsonschema": "^1.4.0",
-    "npm_package_dependencies_ffmpeg": "0.0.4",
-    "npm_package_dependencies_cookie_session": "^2.0.0",
-    "npm_package_dependencies_color": "^3.2.1",
-    "npm_package_devDependencies__types_webpack": "^4.41.32",
-    "npm_package_devDependencies__types_request_promise": "^4.1.48",
-    "npm_package_devDependencies__types_prosemirror_schema_list": "^1.0.3",
-    "npm_config_send_metrics": "",
-    "npm_config_save_bundle": "",
-    "npm_package_dependencies_web_request": "^1.0.7",
-    "npm_package_dependencies_react_datepicker": "^3.8.0",
-    "npm_package_dependencies_express": "^4.17.3",
-    "npm_package_dependencies_D": "^1.0.0",
-    "npm_package_dependencies__types_formidable": "1.0.31",
-    "npm_package_devDependencies__types_rc_switch": "^1.9.2",
-    "npm_package_devDependencies__types_prosemirror_dev_tools": "^2.1.0",
-    "npm_package_devDependencies__types_jquery": "^3.5.14",
-    "npm_config_umask": "0022",
-    "npm_config_node_options": "",
-    "npm_config_init_version": "1.0.0",
-    "npm_package_dependencies_https": "^1.0.0",
-    "npm_package_dependencies_array_batcher": "^1.2.3",
-    "npm_package_dependencies__fortawesome_free_regular_svg_icons": "^6.3.0",
-    "npm_package_devDependencies__types_shelljs": "^0.8.11",
-    "npm_package_devDependencies__types_libxmljs": "^0.18.7",
-    "npm_package_devDependencies__types_express_validator": "^3.0.0",
-    "npm_package_devDependencies__types_bluebird": "^3.5.36",
-    "npm_config_init_author_name": "",
-    "npm_config_git": "git",
-    "npm_config_scope": "",
-    "npm_package_dependencies_react_select": "^3.2.0",
-    "npm_package_dependencies_pdf_parse": "^1.1.1",
-    "npm_package_dependencies_colors": "^1.4.0",
-    "npm_package_dependencies_archiver": "^3.1.1",
-    "npm_package_devDependencies_css_loader": "^2.1.1",
-    "npm_package_devDependencies__types_socket_io_client": "^1.4.36",
-    "SECURITYSESSIONID": "186a6",
-    "npm_config_unsafe_perm": "true",
-    "npm_config_tmp": "/var/folders/yk/p_39q8jn673c5p8_66mcxm7r0000gn/T",
-    "npm_config_onload_script": "",
-    "npm_package_dependencies_serializr": "^1.5.4",
-    "npm_package_dependencies_fit_curve": "^0.1.7",
-    "npm_package_dependencies__webscopeio_react_textarea_autocomplete": "^4.9.1",
-    "npm_package_dependencies__types_three": "^0.126.2",
-    "npm_package_devDependencies_ts_node_dev": "^2.0.0",
-    "npm_node_execpath": "/Users/sarah/.nvm/versions/node/v12.16.0/bin/node",
-    "npm_config_prefix": "/Users/sarah/.nvm/versions/node/v12.16.0",
-    "npm_config_link": "",
-    "npm_config_format_package_lock": "true",
-    "npm_package_dependencies_passport": "^0.4.0",
-    "npm_package_devDependencies_eslint_plugin_react": "^7.30.1",
-    "npm_package_devDependencies__types_react_table": "^6.8.9",
-    "npm_package_devDependencies__types_react_reconciler": "^0.26.4",
-    "NODE_OPTIONS": "--max_old_space_size=4096",
-    "TS_NODE_DEV": "true",
-    "_CLIENT_OPENAI_KEY": "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",
-    "VIPSHOME": "/usr/local/Cellar/vips/8.8.1",
-    "TYPESCRIPT_PATH": "/Users/sarah/Desktop/dash/Dash-Web/node_modules/typescript/lib/typescript.js",
-    "TSCONFIG": "/Users/sarah/Desktop/dash/Dash-Web/tsconfig.json",
-    "COMPILER_OPTIONS": "{}",
-    "TSLINT": "true",
-    "CONTEXT": "/Users/sarah/Desktop/dash/Dash-Web",
-    "TSLINTAUTOFIX": "false",
-    "ESLINT": "false",
-    "ESLINT_OPTIONS": "{}",
-    "WATCH": "",
-    "WORK_DIVISION": "1",
-    "MEMORY_LIMIT": "2048",
-    "CHECK_SYNTACTIC_ERRORS": "false",
-    "USE_INCREMENTAL_API": "true",
-    "VUE": "false"
-  },
-  "userLimits": {
-    "core_file_size_blocks": {
-      "soft": 0,
-      "hard": "unlimited"
-    },
-    "data_seg_size_kbytes": {
-      "soft": "unlimited",
-      "hard": "unlimited"
-    },
-    "file_size_blocks": {
-      "soft": "unlimited",
-      "hard": "unlimited"
-    },
-    "max_locked_memory_bytes": {
-      "soft": "unlimited",
-      "hard": "unlimited"
-    },
-    "max_memory_size_kbytes": {
-      "soft": "unlimited",
-      "hard": "unlimited"
-    },
-    "open_files": {
-      "soft": 1048575,
-      "hard": "unlimited"
-    },
-    "stack_size_bytes": {
-      "soft": 8388608,
-      "hard": 67104768
-    },
-    "cpu_time_seconds": {
-      "soft": "unlimited",
-      "hard": "unlimited"
-    },
-    "max_user_processes": {
-      "soft": 2784,
-      "hard": 4176
-    },
-    "virtual_memory_kbytes": {
-      "soft": "unlimited",
-      "hard": "unlimited"
-    }
-  },
-  "sharedObjects": [
-    "/Users/sarah/.nvm/versions/node/v12.16.0/bin/node",
-    "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation",
-    "/usr/lib/libobjc.A.dylib",
-    "/System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal",
-    "/usr/lib/liboah.dylib",
-    "/usr/lib/libfakelink.dylib",
-    "/usr/lib/libicucore.A.dylib",
-    "/usr/lib/libSystem.B.dylib",
-    "/System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking",
-    "/usr/lib/libc++abi.dylib",
-    "/usr/lib/libc++.1.dylib",
-    "/usr/lib/system/libcache.dylib",
-    "/usr/lib/system/libcommonCrypto.dylib",
-    "/usr/lib/system/libcompiler_rt.dylib",
-    "/usr/lib/system/libcopyfile.dylib",
-    "/usr/lib/system/libcorecrypto.dylib",
-    "/usr/lib/system/libdispatch.dylib",
-    "/usr/lib/system/libdyld.dylib",
-    "/usr/lib/system/libkeymgr.dylib",
-    "/usr/lib/system/libmacho.dylib",
-    "/usr/lib/system/libquarantine.dylib",
-    "/usr/lib/system/libremovefile.dylib",
-    "/usr/lib/system/libsystem_asl.dylib",
-    "/usr/lib/system/libsystem_blocks.dylib",
-    "/usr/lib/system/libsystem_c.dylib",
-    "/usr/lib/system/libsystem_collections.dylib",
-    "/usr/lib/system/libsystem_configuration.dylib",
-    "/usr/lib/system/libsystem_containermanager.dylib",
-    "/usr/lib/system/libsystem_coreservices.dylib",
-    "/usr/lib/system/libsystem_darwin.dylib",
-    "/usr/lib/system/libsystem_dnssd.dylib",
-    "/usr/lib/system/libsystem_featureflags.dylib",
-    "/usr/lib/system/libsystem_info.dylib",
-    "/usr/lib/system/libsystem_m.dylib",
-    "/usr/lib/system/libsystem_malloc.dylib",
-    "/usr/lib/system/libsystem_networkextension.dylib",
-    "/usr/lib/system/libsystem_notify.dylib",
-    "/usr/lib/system/libsystem_sandbox.dylib",
-    "/usr/lib/system/libsystem_secinit.dylib",
-    "/usr/lib/system/libsystem_kernel.dylib",
-    "/usr/lib/system/libsystem_platform.dylib",
-    "/usr/lib/system/libsystem_pthread.dylib",
-    "/usr/lib/system/libsystem_symptoms.dylib",
-    "/usr/lib/system/libsystem_trace.dylib",
-    "/usr/lib/system/libunwind.dylib",
-    "/usr/lib/system/libxpc.dylib",
-    "/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices",
-    "/usr/lib/libDiagnosticMessagesClient.dylib",
-    "/usr/lib/libenergytrace.dylib",
-    "/usr/lib/libbsm.0.dylib",
-    "/usr/lib/libz.1.dylib",
-    "/usr/lib/system/libkxld.dylib",
-    "/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices",
-    "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList",
-    "/System/Library/Frameworks/Security.framework/Versions/A/Security",
-    "/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration",
-    "/usr/lib/libapple_nghttp2.dylib",
-    "/usr/lib/libcompression.dylib",
-    "/usr/lib/libnetwork.dylib",
-    "/usr/lib/libsqlite3.dylib",
-    "/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation",
-    "/System/Library/Frameworks/Network.framework/Versions/A/Network",
-    "/usr/lib/libCoreEntitlements.dylib",
-    "/System/Library/PrivateFrameworks/MessageSecurity.framework/Versions/A/MessageSecurity",
-    "/System/Library/PrivateFrameworks/ProtocolBuffer.framework/Versions/A/ProtocolBuffer",
-    "/usr/lib/libMobileGestalt.dylib",
-    "/System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression",
-    "/usr/lib/libcoretls.dylib",
-    "/usr/lib/libcoretls_cfhelpers.dylib",
-    "/usr/lib/libpam.2.dylib",
-    "/usr/lib/libxar.1.dylib",
-    "/System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout",
-    "/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration",
-    "/usr/lib/libarchive.2.dylib",
-    "/usr/lib/libxml2.2.dylib",
-    "/usr/lib/liblangid.dylib",
-    "/System/Library/Frameworks/Combine.framework/Versions/A/Combine",
-    "/usr/lib/swift/libswiftCore.dylib",
-    "/usr/lib/swift/libswiftCoreFoundation.dylib",
-    "/usr/lib/swift/libswiftDarwin.dylib",
-    "/usr/lib/swift/libswiftDispatch.dylib",
-    "/usr/lib/swift/libswiftIOKit.dylib",
-    "/usr/lib/swift/libswiftObjectiveC.dylib",
-    "/usr/lib/swift/libswiftXPC.dylib",
-    "/usr/lib/swift/libswift_Concurrency.dylib",
-    "/usr/lib/swift/libswift_StringProcessing.dylib",
-    "/usr/lib/swift/libswiftos.dylib",
-    "/System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo",
-    "/System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer",
-    "/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface",
-    "/usr/lib/libpcap.A.dylib",
-    "/usr/lib/libdns_services.dylib",
-    "/usr/lib/liblzma.5.dylib",
-    "/usr/lib/libbz2.1.0.dylib",
-    "/usr/lib/libiconv.2.dylib",
-    "/usr/lib/libcharset.1.dylib",
-    "/usr/lib/swift/libswift_RegexParser.dylib",
-    "/usr/lib/libheimdal-asn1.dylib",
-    "/usr/lib/libCheckFix.dylib",
-    "/System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC",
-    "/System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP",
-    "/System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate",
-    "/usr/lib/libmecab.dylib",
-    "/usr/lib/libCRFSuite.dylib",
-    "/usr/lib/libgermantok.dylib",
-    "/usr/lib/libThaiTokenizer.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib",
-    "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib",
-    "/System/Library/PrivateFrameworks/MIL.framework/Versions/A/MIL",
-    "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory",
-    "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory",
-    "/System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS",
-    "/System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation",
-    "/usr/lib/libutil.dylib",
-    "/System/Library/PrivateFrameworks/InstalledContentLibrary.framework/Versions/A/InstalledContentLibrary",
-    "/System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore",
-    "/usr/lib/libapp_launch_measurement.dylib",
-    "/System/Library/PrivateFrameworks/AppleMobileFileIntegrity.framework/Versions/A/AppleMobileFileIntegrity",
-    "/usr/lib/libmis.dylib",
-    "/System/Library/PrivateFrameworks/MobileSystemServices.framework/Versions/A/MobileSystemServices",
-    "/System/Library/PrivateFrameworks/ConfigProfileHelper.framework/Versions/A/ConfigProfileHelper",
-    "/System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics",
-    "/System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce",
-    "/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling",
-    "/usr/lib/libxslt.1.dylib",
-    "/usr/lib/libcmph.dylib",
-    "/System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji",
-    "/System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData",
-    "/System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon",
-    "/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement",
-    "/usr/lib/libTLE.dylib",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices",
-    "/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics",
-    "/System/Library/Frameworks/CoreText.framework/Versions/A/CoreText",
-    "/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO",
-    "/System/Library/Frameworks/ColorSync.framework/Versions/A/ColorSync",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSyncLegacy.framework/Versions/A/ColorSyncLegacy",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis",
-    "/System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight",
-    "/System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib",
-    "/System/Library/PrivateFrameworks/RunningBoardServices.framework/Versions/A/RunningBoardServices",
-    "/System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/Versions/A/IOSurfaceAccelerator",
-    "/System/Library/PrivateFrameworks/WatchdogClient.framework/Versions/A/WatchdogClient",
-    "/System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay",
-    "/System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia",
-    "/System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator",
-    "/System/Library/Frameworks/Metal.framework/Versions/A/Metal",
-    "/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders",
-    "/System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport",
-    "/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore",
-    "/System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox",
-    "/System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard",
-    "/System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG",
-    "/usr/lib/libexpat.1.dylib",
-    "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib",
-    "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib",
-    "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib",
-    "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib",
-    "/usr/lib/libate.dylib",
-    "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib",
-    "/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib",
-    "/System/Library/PrivateFrameworks/GPUWrangler.framework/Versions/A/GPUWrangler",
-    "/System/Library/PrivateFrameworks/IOPresentment.framework/Versions/A/IOPresentment",
-    "/System/Library/PrivateFrameworks/DSExternalDisplay.framework/Versions/A/DSExternalDisplay",
-    "/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/libllvm-flatbuffers.dylib",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib",
-    "/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/libGPUCompilerUtils.dylib",
-    "/System/Library/PrivateFrameworks/CMCaptureCore.framework/Versions/A/CMCaptureCore",
-    "/usr/lib/libspindump.dylib",
-    "/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio",
-    "/System/Library/Frameworks/ExtensionFoundation.framework/Versions/A/ExtensionFoundation",
-    "/System/Library/PrivateFrameworks/CoreTime.framework/Versions/A/CoreTime",
-    "/System/Library/PrivateFrameworks/AppServerSupport.framework/Versions/A/AppServerSupport",
-    "/System/Library/PrivateFrameworks/perfdata.framework/Versions/A/perfdata",
-    "/System/Library/PrivateFrameworks/AudioToolboxCore.framework/Versions/A/AudioToolboxCore",
-    "/System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk",
-    "/usr/lib/libAudioStatistics.dylib",
-    "/System/Library/PrivateFrameworks/SystemPolicy.framework/Versions/A/SystemPolicy",
-    "/usr/lib/libSMC.dylib",
-    "/System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI",
-    "/usr/lib/libAudioToolboxUtility.dylib",
-    "/System/Library/PrivateFrameworks/OSAServicesClient.framework/Versions/A/OSAServicesClient",
-    "/usr/lib/libperfcheck.dylib",
-    "/System/Library/PrivateFrameworks/PlugInKit.framework/Versions/A/PlugInKit",
-    "/System/Library/PrivateFrameworks/AssertionServices.framework/Versions/A/AssertionServices",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib",
-    "/usr/lib/libRosetta.dylib",
-    "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/MPSCore",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/MPSImage",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/MPSNDArray",
-    "/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSFunctions.framework/Versions/A/MPSFunctions",
-    "/System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools",
-    "/System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary",
-    "/usr/lib/libIOReport.dylib",
-    "/System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage",
-    "/System/Library/PrivateFrameworks/PhotosensitivityProcessing.framework/Versions/A/PhotosensitivityProcessing",
-    "/System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL",
-    "/System/Library/PrivateFrameworks/GraphVisualizer.framework/Versions/A/GraphVisualizer",
-    "/System/Library/PrivateFrameworks/FontServices.framework/Versions/A/FontServices",
-    "/System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers",
-    "/System/Library/PrivateFrameworks/OTSVG.framework/Versions/A/OTSVG",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib",
-    "/System/Library/PrivateFrameworks/FontServices.framework/libhvf.dylib",
-    "/System/Library/PrivateFrameworks/FontServices.framework/libXTFontStaticRegistryData.dylib",
-    "/usr/lib/swift/libswiftMetal.dylib",
-    "/usr/lib/swift/libswiftsimd.dylib",
-    "/System/Library/PrivateFrameworks/VideoToolboxParavirtualizationSupport.framework/Versions/A/VideoToolboxParavirtualizationSupport",
-    "/System/Library/PrivateFrameworks/AppleVA.framework/Versions/A/AppleVA",
-    "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATSUI.framework/Versions/A/ATSUI",
-    "/usr/lib/libcups.2.dylib",
-    "/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos",
-    "/System/Library/Frameworks/GSS.framework/Versions/A/GSS",
-    "/usr/lib/libresolv.9.dylib",
-    "/System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal",
-    "/System/Library/Frameworks/Kerberos.framework/Versions/A/Libraries/libHeimdalProxy.dylib",
-    "/System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth",
-    "/System/Library/Frameworks/AVFAudio.framework/Versions/A/AVFAudio",
-    "/System/Library/PrivateFrameworks/AXCoreUtilities.framework/Versions/A/AXCoreUtilities",
-    "/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox",
-    "/System/Library/PrivateFrameworks/AudioSession.framework/Versions/A/AudioSession",
-    "/System/Library/Frameworks/IOBluetooth.framework/Versions/A/IOBluetooth",
-    "/System/Library/PrivateFrameworks/MediaExperience.framework/Versions/A/MediaExperience",
-    "/System/Library/PrivateFrameworks/AudioSession.framework/libSessionUtility.dylib",
-    "/System/Library/PrivateFrameworks/AudioResourceArbitration.framework/Versions/A/AudioResourceArbitration",
-    "/System/Library/PrivateFrameworks/PowerLog.framework/Versions/A/PowerLog",
-    "/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData",
-    "/System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth",
-    "/System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit",
-    "/System/Library/PrivateFrameworks/CoreUtils.framework/Versions/A/CoreUtils",
-    "/System/Library/PrivateFrameworks/CoreUtilsExtras.framework/Versions/A/CoreUtilsExtras",
-    "/System/Library/PrivateFrameworks/IO80211.framework/Versions/A/IO80211",
-    "/System/Library/PrivateFrameworks/MobileKeyBag.framework/Versions/A/MobileKeyBag",
-    "/Users/sarah/Desktop/dash/Dash-Web/node_modules/fsevents/build/Release/fse.node"
-  ]
-}
\ No newline at end of file
diff --git a/src/client/documents/DocumentTypes.ts b/src/client/documents/DocumentTypes.ts
index 4e3496608..b4ad9c17d 100644
--- a/src/client/documents/DocumentTypes.ts
+++ b/src/client/documents/DocumentTypes.ts
@@ -33,7 +33,6 @@ export enum DocumentType {
     PRES = 'presentation',
     PRESELEMENT = 'preselement',
     COMPARISON = 'comparison',
-    GROUP = 'group',
     PUSHPIN = 'pushpin',
     MAPROUTE = 'maproute',
     CALENDAR = 'calendar',
diff --git a/src/client/documents/Documents.ts b/src/client/documents/Documents.ts
index cf397e85a..ddb6f65b6 100644
--- a/src/client/documents/Documents.ts
+++ b/src/client/documents/Documents.ts
@@ -246,8 +246,8 @@ export class DocumentOptions {
     _nativeWidth?: NUMt = new NumInfo('native width of document contents (e.g., the pixel width of an image)', false);
     _nativeHeight?: NUMt = new NumInfo('native height of document contents (e.g., the pixel height of an image)', false);
 
-    'acl-Guest'?: STRt = new StrInfo("permissions granted to users logged in as 'guest' (either view, or private)"); // public permissions
-    '_acl-Guest'?: string; // public permissions
+    acl_Guest?: STRt = new StrInfo("permissions granted to users logged in as 'guest' (either view, or private)"); // public permissions
+    _acl_Guest?: string; // public permissions
     type?: DTYPEt = new DTypeInfo('type of document', true);
     type_collection?: COLLt = new CTypeInfo('how collection is rendered'); // sub type of a collection
     _type_collection?: COLLt = new CTypeInfo('how collection is rendered'); // sub type of a collection
@@ -535,6 +535,7 @@ export namespace Docs {
                 {
                     layout: { view: FormattedTextBox, dataField: 'text' },
                     options: {
+                        acl: '',
                         _height: 35,
                         _xMargin: 10,
                         _yMargin: 10,
@@ -550,21 +551,21 @@ export namespace Docs {
                 DocumentType.SEARCH,
                 {
                     layout: { view: SearchBox, dataField: defaultDataKey },
-                    options: { _width: 400 },
+                    options: { acl: '', _width: 400 },
                 },
             ],
             [
                 DocumentType.IMG,
                 {
                     layout: { view: ImageBox, dataField: defaultDataKey },
-                    options: { freeform: '', systemIcon: 'BsFileEarmarkImageFill' },
+                    options: { acl: '', freeform: '', systemIcon: 'BsFileEarmarkImageFill' },
                 },
             ],
             [
                 DocumentType.WEB,
                 {
                     layout: { view: WebBox, dataField: defaultDataKey },
-                    options: { _height: 300, _layout_fitWidth: true, layout_nativeDimEditable: true, layout_reflowVertical: true, waitForDoubleClickToClick: 'always', systemIcon: 'BsGlobe' },
+                    options: { acl: '', _height: 300, _layout_fitWidth: true, layout_nativeDimEditable: true, layout_reflowVertical: true, waitForDoubleClickToClick: 'always', systemIcon: 'BsGlobe' },
                 },
             ],
             [
@@ -572,6 +573,7 @@ export namespace Docs {
                 {
                     layout: { view: CollectionView, dataField: defaultDataKey },
                     options: {
+                        acl: '',
                         _layout_fitWidth: true,
                         freeform: '',
                         _freeform_panX: 0,
@@ -588,42 +590,42 @@ export namespace Docs {
                 DocumentType.KVP,
                 {
                     layout: { view: KeyValueBox, dataField: defaultDataKey },
-                    options: { _layout_fitWidth: true, _height: 150 },
+                    options: { acl: '', _layout_fitWidth: true, _height: 150 },
                 },
             ],
             [
                 DocumentType.VID,
                 {
                     layout: { view: VideoBox, dataField: defaultDataKey },
-                    options: { _layout_currentTimecode: 0, systemIcon: 'BsFileEarmarkPlayFill' },
+                    options: { acl: '', _layout_currentTimecode: 0, systemIcon: 'BsFileEarmarkPlayFill' },
                 },
             ],
             [
                 DocumentType.AUDIO,
                 {
                     layout: { view: AudioBox, dataField: defaultDataKey },
-                    options: { _height: 100, layout_fitWidth: true, layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true, systemIcon: 'BsFillVolumeUpFill' },
+                    options: { acl: '', _height: 100, layout_fitWidth: true, layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true, systemIcon: 'BsFillVolumeUpFill' },
                 },
             ],
             [
                 DocumentType.REC,
                 {
                     layout: { view: VideoBox, dataField: defaultDataKey },
-                    options: { _height: 100, backgroundColor: 'pink', systemIcon: 'BsFillMicFill' },
+                    options: { acl: '', _height: 100, backgroundColor: 'pink', systemIcon: 'BsFillMicFill' },
                 },
             ],
             [
                 DocumentType.PDF,
                 {
                     layout: { view: PDFBox, dataField: defaultDataKey },
-                    options: { _layout_curPage: 1, _layout_fitWidth: true, layout_nativeDimEditable: true, layout_reflowVertical: true, systemIcon: 'BsFileEarmarkPdfFill' },
+                    options: { acl: '', _layout_curPage: 1, _layout_fitWidth: true, layout_nativeDimEditable: true, layout_reflowVertical: true, systemIcon: 'BsFileEarmarkPdfFill' },
                 },
             ],
             [
                 DocumentType.MAP,
                 {
                     layout: { view: MapBox, dataField: defaultDataKey },
-                    options: { map: '', _height: 600, _width: 800, layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true, systemIcon: 'BsFillPinMapFill' },
+                    options: { acl: '', map: '', _height: 600, _width: 800, layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true, systemIcon: 'BsFillPinMapFill' },
                 },
             ],
             [
@@ -631,6 +633,7 @@ export namespace Docs {
                 {
                     layout: { view: LinkBox, dataField: 'link' },
                     options: {
+                        acl: '',
                         childDontRegisterViews: true,
                         layout_hideLinkAnchors: true,
                         _height: 1,
@@ -647,88 +650,77 @@ export namespace Docs {
                 {
                     data: new List<Doc>(),
                     layout: { view: EmptyBox, dataField: defaultDataKey },
-                    options: { title: 'Global Script Database' },
+                    options: { acl: '', title: 'Global Script Database' },
                 },
             ],
             [
                 DocumentType.SCRIPTING,
                 {
                     layout: { view: ScriptingBox, dataField: defaultDataKey },
-                    options: { systemIcon: 'BsFileEarmarkCodeFill' },
+                    options: { acl: '', systemIcon: 'BsFileEarmarkCodeFill' },
                 },
             ],
             [
                 DocumentType.LABEL,
                 {
                     layout: { view: LabelBox, dataField: 'title' },
-                    options: { _singleLine: true, layout_nativeDimEditable: true, layout_reflowHorizontal: true, layout_reflowVertical: true },
+                    options: { acl: '', _singleLine: true, layout_nativeDimEditable: true, layout_reflowHorizontal: true, layout_reflowVertical: true },
                 },
             ],
             [
                 DocumentType.EQUATION,
                 {
                     layout: { view: EquationBox, dataField: 'text' },
-                    options: {
-                        fontSize: '14px',
-                        layout_reflowHorizontal: true,
-                        layout_reflowVertical: true,
-                        layout_nativeDimEditable: true,
-                        layout_hideDecorationTitle: true,
-                        systemIcon: 'BsCalculatorFill',
-                    }, // systemIcon: 'BsSuperscript' + BsSubscript
+                    options: { acl: '', fontSize: '14px', layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true, layout_hideDecorationTitle: true, systemIcon: 'BsCalculatorFill' }, // systemIcon: 'BsSuperscript' + BsSubscript
                 },
             ],
             [
                 DocumentType.FUNCPLOT,
                 {
                     layout: { view: FunctionPlotBox, dataField: defaultDataKey },
-                    options: {
-                        layout_reflowHorizontal: true,
-                        layout_reflowVertical: true,
-                        layout_nativeDimEditable: true,
-                    },
+                    options: { acl: '', layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true },
                 },
             ],
             [
                 DocumentType.BUTTON,
                 {
                     layout: { view: LabelBox, dataField: 'title' },
-                    options: { layout_nativeDimEditable: true, layout_reflowHorizontal: true, layout_reflowVertical: true },
+                    options: { acl: '', layout_nativeDimEditable: true, layout_reflowHorizontal: true, layout_reflowVertical: true },
                 },
             ],
             [
                 DocumentType.PRES,
                 {
                     layout: { view: PresBox, dataField: defaultDataKey },
-                    options: { defaultDoubleClick: 'ignore', hideClickBehaviors: true, layout_hideLinkAnchors: true },
+                    options: { acl: '', defaultDoubleClick: 'ignore', hideClickBehaviors: true, layout_hideLinkAnchors: true },
                 },
             ],
             [
                 DocumentType.FONTICON,
                 {
                     layout: { view: FontIconBox, dataField: 'icon' },
-                    options: { defaultDoubleClick: 'ignore', waitForDoubleClickToClick: 'never', layout_hideContextMenu: true, layout_hideLinkButton: true, _width: 40, _height: 40 },
+                    options: { acl: '', defaultDoubleClick: 'ignore', waitForDoubleClickToClick: 'never', layout_hideContextMenu: true, layout_hideLinkButton: true, _width: 40, _height: 40 },
                 },
             ],
             [
                 DocumentType.WEBCAM,
                 {
                     layout: { view: RecordingBox, dataField: defaultDataKey },
-                    options: { systemIcon: 'BsFillCameraVideoFill' },
+                    options: { acl: '', systemIcon: 'BsFillCameraVideoFill' },
                 },
             ],
             [
                 DocumentType.PRESELEMENT,
                 {
                     layout: { view: PresElementBox, dataField: defaultDataKey },
-                    options: { title: 'pres element template', _layout_fitWidth: true, _xMargin: 0, isTemplateDoc: true, isTemplateForField: 'data' },
+                    options: { acl: '', title: 'pres element template', _layout_fitWidth: true, _xMargin: 0, isTemplateDoc: true, isTemplateForField: 'data' },
                 },
             ],
             [
                 DocumentType.CONFIG,
                 {
                     layout: { view: CollectionView, dataField: defaultDataKey },
-                    options: { config: '', layout_hideLinkButton: true, layout_unrendered: true },
+                    options: { acl: '', config: '', layout_hideLinkButton: true, layout_unrendered: true },
                 },
             ],
             [
@@ -737,6 +729,7 @@ export namespace Docs {
                     // NOTE: this is unused!! ink fields are filled in directly within the InkDocument() method
                     layout: { view: InkingStroke, dataField: 'stroke' },
                     options: {
+                        acl: '',
                         systemIcon: 'BsFillPencilFill', //
                         layout_nativeDimEditable: true,
                         layout_reflowVertical: true,
@@ -751,7 +744,7 @@ export namespace Docs {
                 DocumentType.SCREENSHOT,
                 {
                     layout: { view: ScreenshotBox, dataField: defaultDataKey },
-                    options: { layout_nativeDimEditable: true, systemIcon: 'BsCameraFill' },
+                    options: { acl: '', layout_nativeDimEditable: true, systemIcon: 'BsCameraFill' },
                 },
             ],
             [
@@ -759,35 +752,48 @@ export namespace Docs {
                 {
                     data: '',
                     layout: { view: ComparisonBox, dataField: defaultDataKey },
-                    options: { backgroundColor: 'gray', dropAction: dropActionType.move, waitForDoubleClickToClick: 'always', layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true, systemIcon: 'BsLayoutSplit' },
+                    options: {
+                        acl: '',
+                        backgroundColor: 'gray',
+                        dropAction: dropActionType.move,
+                        waitForDoubleClickToClick: 'always',
+                        layout_reflowHorizontal: true,
+                        layout_reflowVertical: true,
+                        layout_nativeDimEditable: true,
+                        systemIcon: 'BsLayoutSplit',
+                    },
                 },
             ],
             [
                 DocumentType.GROUPDB,
                 {
                     layout: { view: EmptyBox, dataField: defaultDataKey },
-                    options: { title: 'Global Group Database' },
-                },
-            ],
-            [
-                DocumentType.GROUP,
-                {
-                    layout: { view: EmptyBox, dataField: defaultDataKey },
-                    options: {},
+                    options: { acl: '', title: 'Global Group Database' },
                 },
             ],
             [
                 DocumentType.DATAVIZ,
                 {
                     layout: { view: DataVizBox, dataField: defaultDataKey },
-                    options: { dataViz_title: '', dataViz_line: '', dataViz_pie: '', dataViz_histogram: '', dataViz: 'table', _layout_fitWidth: true, layout_reflowHorizontal: true, layout_reflowVertical: true, layout_nativeDimEditable: true },
+                    options: {
+                        acl: '',
+                        dataViz_title: '',
+                        dataViz_line: '',
+                        dataViz_pie: '',
+                        dataViz_histogram: '',
+                        dataViz: 'table',
+                        _layout_fitWidth: true,
+                        layout_reflowHorizontal: true,
+                        layout_reflowVertical: true,
+                        layout_nativeDimEditable: true,
+                    },
                 },
             ],
             [
                 DocumentType.LOADING,
                 {
                     layout: { view: LoadingBox, dataField: '' },
-                    options: { _layout_fitWidth: true, _fitHeight: true, layout_nativeDimEditable: true },
+                    options: { acl: '', _layout_fitWidth: true, _fitHeight: true, layout_nativeDimEditable: true },
                 },
             ],
             [
@@ -795,41 +801,28 @@ export namespace Docs {
                 {
                     data: '',
                     layout: { view: PhysicsSimulationBox, dataField: defaultDataKey, _width: 1000, _height: 800 },
-                    options: {
-                        _height: 100,
-                        mass1: '',
-                        mass2: '',
-                        layout_nativeDimEditable: true,
-                        position: '',
-                        acceleration: '',
-                        pendulum: '',
-                        spring: '',
-                        wedge: '',
-                        simulation: '',
-                        review: '',
-                        systemIcon: 'BsShareFill',
-                    },
+                    options: { acl: '', _height: 100, mass1: '', mass2: '', layout_nativeDimEditable: true, position: '', acceleration: '', pendulum: '', spring: '', wedge: '', simulation: '', review: '', systemIcon: 'BsShareFill' },
                 },
             ],
             [
                 DocumentType.PUSHPIN,
                 {
                     layout: { view: MapPushpinBox, dataField: defaultDataKey },
-                    options: {},
+                    options: { acl: '' },
                 },
             ],
             [
                 DocumentType.MAPROUTE,
                 {
                     layout: { view: CollectionView, dataField: defaultDataKey },
-                    options: {},
+                    options: { acl: '' },
                 },
             ],
             [
                 DocumentType.CALENDAR,
                 {
                     layout: { view: CalendarBox, dataField: defaultDataKey },
-                    options: {},
+                    options: { acl: '' },
                 },
             ],
         ]);
@@ -926,7 +919,7 @@ export namespace Docs {
                 type,
                 isBaseProto: true,
                 _width: 300,
-                'acl-Guest': SharingPermissions.View,
+                acl_Guest: SharingPermissions.View,
                 ...(template.options || {}),
                 layout: layout.view?.LayoutString(layout.dataField),
                 data: template.data,
@@ -971,8 +964,8 @@ export namespace Docs {
             const viewKeys = ['x', 'y', 'isSystem']; // keys that should be addded to the view document even though they don't begin with an "_"
             const { omit: dataProps, extract: viewProps } = OmitKeys(options, viewKeys, '^_');
 
-            // dataProps['acl-Override'] = SharingPermissions.Unset;
-            dataProps['acl-Guest'] = options['acl-Guest'] ?? (Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.View);
+            // dataProps.acl_Override = SharingPermissions.Unset;
+            dataProps.acl_Guest = options.acl_Guest ?? (Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.View);
             dataProps.isSystem = viewProps.isSystem;
             dataProps.isDataDoc = true;
             dataProps.author = ClientUtils.CurrentUserEmail();
@@ -996,7 +989,7 @@ export namespace Docs {
 
             if (!noView) {
                 const viewFirstProps: { [id: string]: any } = { author: ClientUtils.CurrentUserEmail() };
-                viewFirstProps['acl-Guest'] = options['_acl-Guest'] ?? (Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.View);
+                viewFirstProps.acl_Guest = options._acl_Guest ?? (Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.View);
                 let viewDoc: Doc;
                 // determines whether viewDoc should be created using placeholder Doc or default
                 if (placeholderDoc) {
@@ -1004,7 +997,7 @@ export namespace Docs {
                     placeholderDoc._width = options._width !== undefined ? Number(options._width) : undefined;
                     viewDoc = Doc.assign(placeholderDoc, viewFirstProps, true, true);
                     Array.from(Object.keys(placeholderDoc))
-                        .filter(key => key.startsWith('acl'))
+                        .filter(key => key.startsWith('acl_'))
                         .forEach(key => {
                             dataDoc[key] = viewDoc[key] = placeholderDoc[key];
                         });
@@ -1157,8 +1150,8 @@ export namespace Docs {
             I.rotation = 0;
             I.defaultDoubleClick = 'ignore';
             I.author_date = new DateField();
-            I['acl-Guest'] = Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.View;
-            // I['acl-Override'] = SharingPermissions.Unset;
+            I.acl_Guest = Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.View;
+            // I.acl_Override = SharingPermissions.Unset;
             I[Initializing] = false;
 
             return ink;
@@ -1335,7 +1328,7 @@ export namespace Docs {
             const doc = DockDocument(
                 configs.map(c => c.doc),
                 JSON.stringify(layoutConfig),
-                ClientUtils.CurrentUserEmail() === 'guest' ? options : { 'acl-Guest': SharingPermissions.View, ...options },
+                ClientUtils.CurrentUserEmail() === 'guest' ? options : { acl_Guest: SharingPermissions.View, ...options },
                 id
             );
             configs.forEach(c => {
@@ -1539,8 +1532,8 @@ export namespace DocUtils {
                 source,
                 target,
                 {
-                    'acl-Guest': SharingPermissions.Augment,
-                    '_acl-Guest': SharingPermissions.Augment,
+                    acl_Guest: SharingPermissions.Augment,
+                    _acl_Guest: SharingPermissions.Augment,
                     title: ComputedField.MakeFunction('generateLinkTitle(this)') as any,
                     link_anchor_1_useSmallAnchor: source.useSmallAnchor ? true : undefined,
                     link_anchor_2_useSmallAnchor: target.useSmallAnchor ? true : undefined,
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index eae5b2d6a..00279e7e1 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -836,7 +836,7 @@ pie title Minerals in my tap water
             linkDocs.author = ClientUtils.CurrentUserEmail();
             linkDocs.isSystem = true;
             linkDocs.data = new List<Doc>([]);
-            linkDocs["acl-Guest"] = SharingPermissions.Augment;
+            linkDocs.acl_Guest = SharingPermissions.Augment;
             doc.myLinkDatabase = new PrefetchProxy(linkDocs);
         }
     }
@@ -857,7 +857,7 @@ pie title Minerals in my tap water
             // childContextMenuScripts: new List<ScriptField>([addToDashboards!,]),
             // childContextMenuLabels: new List<string>(["Add to Dashboards",]),
             // childContextMenuIcons: new List<string>(["user-plus",]),
-            "acl-Guest": SharingPermissions.Augment, "_acl-Guest": SharingPermissions.Augment,
+            acl_Guest: SharingPermissions.Augment, _acl_Guest: SharingPermissions.Augment,
             childDragAction: dropActionType.embed, isSystem: true, childContentPointerEvents: "none", childLimitHeight: 0, _yMargin: 0, _gridGap: 15, childDontRegisterViews:true,
             // NOTE: treeView_HideTitle & _layout_showTitle is for a TreeView's editable title, _layout_showTitle is for DocumentViews title bar
             _layout_showTitle: "title", treeView_HideTitle: true, ignoreClick: true, _lockedPosition: true, layout_boxShadow: "0 0", _chromeHidden: true, dontRegisterView: true, 
diff --git a/src/client/util/ServerStats.tsx b/src/client/util/ServerStats.tsx
index 891561245..57363663d 100644
--- a/src/client/util/ServerStats.tsx
+++ b/src/client/util/ServerStats.tsx
@@ -14,7 +14,7 @@ export class ServerStats extends React.Component<{}> {
 
     @observable _stats: { [key: string]: any } | undefined = undefined;
     // private get linkVisible() {
-    //     return this.targetDoc ? this.targetDoc["acl-" + PublicKey] !== SharingPermissions.None : false;
+    //     return this.targetDoc ? this.targetDoc['acl_' + PublicKey] !== SharingPermissions.None : false;
     // }
 
     constructor(props: {}) {
diff --git a/src/client/util/SharingManager.tsx b/src/client/util/SharingManager.tsx
index 5b4ac5aff..19a7948e6 100644
--- a/src/client/util/SharingManager.tsx
+++ b/src/client/util/SharingManager.tsx
@@ -90,7 +90,7 @@ export class SharingManager extends React.Component<{}> {
     @observable private myDocAcls: boolean = false; // whether the My Docs checkbox is selected or not
 
     // private get linkVisible() {
-    //     return this.targetDoc ? this.targetDoc["acl-" + PublicKey] !== SharingPermissions.None : false;
+    //     return this.targetDoc ? this.targetDoc['acl_' + PublicKey] !== SharingPermissions.None : false;
     // }
 
     constructor(props: {}) {
@@ -172,10 +172,10 @@ export class SharingManager extends React.Component<{}> {
 
         // the list of users shared with
         const userListContents = users
-            // .filter(({ user }) => (docs.length > 1 ? commonKeys.includes(`acl-${normalizeEmail(user.email)}`) : docs[0]?.author !== user.email))
+            // .filter(({ user }) => (docs.length > 1 ? commonKeys.includes(`acl_${normalizeEmail(user.email)}`) : docs[0]?.author !== user.email))
             .filter(({ user }) => docs[0]?.author !== user.email)
             .map(({ user, linkDatabase, sharingDoc, userColor }) => {
-                const userKey = `acl-${normalizeEmail(user.email)}`;
+                const userKey = `acl_${normalizeEmail(user.email)}`;
                 const uniform = docs.every(doc => doc?.[DocAcl]?.[userKey] === docs[0]?.[DocAcl]?.[userKey]);
                 // const permissions = uniform ? StrCast(targetDoc?.[userKey]) : '-multiple-';
                 let permissions = targetDoc[DocAcl][userKey] ? HierarchyMapping.get(targetDoc[DocAcl][userKey])?.name : StrCast(targetDoc[userKey]);
@@ -204,7 +204,7 @@ export class SharingManager extends React.Component<{}> {
         const sameAuthor = docs.every(doc => doc?.author === docs[0]?.author);
 
         // the owner of the doc and the current user are placed at the top of the user list.
-        const userKey = `acl-${normalizeEmail(ClientUtils.CurrentUserEmail())}`;
+        const userKey = `acl_${normalizeEmail(ClientUtils.CurrentUserEmail())}`;
         const curUserPermission = StrCast(targetDoc[userKey]);
         // const curUserPermission = HierarchyMapping.get(effectiveAcls[0])!.name
         userListContents.unshift(
@@ -230,10 +230,10 @@ export class SharingManager extends React.Component<{}> {
         );
 
         // the list of groups shared with
-        const groupListMap: (Doc | { title: string })[] = groups.filter(({ title }) => (docs.length > 1 ? commonKeys.includes(`acl-${normalizeEmail(StrCast(title))}`) : true));
+        const groupListMap: (Doc | { title: string })[] = groups.filter(({ title }) => (docs.length > 1 ? commonKeys.includes(`acl_${normalizeEmail(StrCast(title))}`) : true));
         groupListMap.unshift({ title: 'Guest' }); // , { title: "ALL" });
         const groupListContents = groupListMap.map(group => {
-            const groupKey = `acl-${StrCast(group.title)}`;
+            const groupKey = `acl_${StrCast(group.title)}`;
             const uniform = docs.every(doc => doc?.[DocAcl]?.[groupKey] === docs[0]?.[DocAcl]?.[groupKey]);
             const permissions = uniform ? StrCast(targetDoc?.[groupKey]) : '-multiple-';
 
@@ -442,7 +442,7 @@ export class SharingManager extends React.Component<{}> {
     setInternalSharing = undoable((recipient: ValidatedUser, permission: string, targetDoc: Doc | undefined) => {
         const { user, sharingDoc } = recipient;
         const target = targetDoc || this.targetDoc!;
-        const acl = `acl-${normalizeEmail(user.email)}`;
+        const acl = `acl_${normalizeEmail(user.email)}`;
         const docs = SelectionManager.Views.length < 2 ? [target] : SelectionManager.Views.map(docView => docView.Document);
         docs.map(doc => (this.layoutDocAcls || doc.dockingConfig ? doc : Doc.GetProto(doc))).forEach(doc => {
             distributeAcls(acl, permission as SharingPermissions, doc, undefined, this.upgradeNested ? true : undefined);
@@ -459,7 +459,7 @@ export class SharingManager extends React.Component<{}> {
      */
     setInternalGroupSharing = undoable((group: Doc | { title: string }, permission: string, targetDoc?: Doc) => {
         const target = targetDoc || this.targetDoc!;
-        const acl = `acl-${normalizeEmail(StrCast(group.title))}`;
+        const acl = `acl_${normalizeEmail(StrCast(group.title))}`;
 
         const docs = SelectionManager.Views.length < 2 ? [target] : SelectionManager.Views.map(docView => docView.Document);
         docs.map(doc => (this.layoutDocAcls || doc.dockingConfig ? doc : Doc.GetProto(doc))).forEach(doc => {
@@ -578,7 +578,7 @@ export class SharingManager extends React.Component<{}> {
         } else {
             docs.forEach(doc => {
                 if (GetEffectiveAcl(doc) === AclAdmin) {
-                    distributeAcls(`acl-${shareWith}`, permission, doc, undefined);
+                    distributeAcls(`acl_${shareWith}`, permission, doc, undefined);
                 }
             });
         }
@@ -618,7 +618,7 @@ export class SharingManager extends React.Component<{}> {
     removeGroup = (group: Doc) => {
         if (group.docsShared) {
             DocListCast(group.docsShared).forEach(doc => {
-                const acl = `acl-${StrCast(group.title)}`;
+                const acl = `acl_${StrCast(group.title)}`;
                 distributeAcls(acl, SharingPermissions.None, doc);
 
                 const members: string[] = JSON.parse(StrCast(group.members));
@@ -634,7 +634,7 @@ export class SharingManager extends React.Component<{}> {
     //     if (!targetDoc) {
     //         return;
     //     }
-    //     targetDoc["acl-" + PublicKey] = permission;
+    //     targetDoc['acl_' + PublicKey] = permission;
     // }s
 
     /**
diff --git a/src/client/views/DashboardView.tsx b/src/client/views/DashboardView.tsx
index 25415a4f0..c4855d2e7 100644
--- a/src/client/views/DashboardView.tsx
+++ b/src/client/views/DashboardView.tsx
@@ -165,7 +165,7 @@ export class DashboardView extends ObservableReactComponent<{}> {
                             : this.getDashboards(this.selectedDashboardGroup).map(dashboard => {
                                   const href = ImageCast(dashboard.thumb)?.url?.href;
                                   const shared = Object.keys(dashboard[DocAcl])
-                                      .filter(key => key !== `acl-${normalizeEmail(ClientUtils.CurrentUserEmail())}` && !['acl-Me', 'acl-Guest'].includes(key))
+                                      .filter(key => key !== `acl_${normalizeEmail(ClientUtils.CurrentUserEmail())}` && !['acl_Me', 'acl_Guest'].includes(key))
                                       .some(key => dashboard[DocAcl][key] !== AclPrivate);
                                   return (
                                       <div
diff --git a/src/client/views/FilterPanel.tsx b/src/client/views/FilterPanel.tsx
index 994107c01..ed9fc8dfb 100644
--- a/src/client/views/FilterPanel.tsx
+++ b/src/client/views/FilterPanel.tsx
@@ -222,7 +222,7 @@ export class FilterPanel extends ObservableReactComponent<filterProps> {
             <div className="filterBox-treeView">
                 <div className="filterBox-select">
                     <div style={{ width: '100%' }}>
-                        <FieldsDropdown Document={this.Document} selectFunc={this.facetClick} showPlaceholder placeholder="add a filter" addedFields={['acl-Guest', LinkedTo]} />
+                        <FieldsDropdown Document={this.Document} selectFunc={this.facetClick} showPlaceholder placeholder="add a filter" addedFields={['acl_Guest', LinkedTo]} />
                     </div>
                     {/* THE FOLLOWING CODE SHOULD BE DEVELOPER FOR BOOLEAN EXPRESSION (AND / OR) */}
                     {/* <div className="filterBox-select-bool"> 
diff --git a/src/client/views/PropertiesView.tsx b/src/client/views/PropertiesView.tsx
index 5e1c80f0c..f4ded8367 100644
--- a/src/client/views/PropertiesView.tsx
+++ b/src/client/views/PropertiesView.tsx
@@ -231,7 +231,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
 
     @computed get noviceFields() {
         const noviceReqFields = ['author', 'author_date', 'tags', '_layout_curPage'];
-        return this.editableFields(key => key.indexOf('modificationDate') !== -1 || (key[0] === key[0].toUpperCase() && !key.startsWith('acl')), noviceReqFields);
+        return this.editableFields(key => key.indexOf('modificationDate') !== -1 || (key[0] === key[0].toUpperCase() && !key.startsWith('acl_')), noviceReqFields);
     }
 
     @undoBatch
@@ -473,7 +473,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
         SharingManager.Instance.users.forEach(eachUser => {
             let userOnDoc = true;
             if (seldoc) {
-                if (Doc.GetT(seldoc, 'acl-' + normalizeEmail(eachUser.user.email), 'string', true) === '' || Doc.GetT(seldoc, 'acl-' + normalizeEmail(eachUser.user.email), 'string', true) === undefined) {
+                if (Doc.GetT(seldoc, 'acl_' + normalizeEmail(eachUser.user.email), 'string', true) === '' || Doc.GetT(seldoc, 'acl_' + normalizeEmail(eachUser.user.email), 'string', true) === undefined) {
                     userOnDoc = false;
                 }
             }
@@ -485,7 +485,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
         // sorts and then adds each user to the table
         usersAdded.sort(this.sortUsers);
         usersAdded.forEach(userEmail => {
-            const userKey = `acl-${normalizeEmail(userEmail)}`;
+            const userKey = `acl_${normalizeEmail(userEmail)}`;
             const aclField = Doc.GetT(this.layoutDocAcls ? target : Doc.GetProto(target), userKey, 'string', true);
             const permission = StrCast(aclField);
             individualTableEntries.unshift(this.sharingItem(userEmail, showAdmin, permission!, false)); // adds each user
@@ -494,7 +494,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
         // adds current user
         let userEmail = ClientUtils.CurrentUserEmail();
         if (userEmail === 'guest') userEmail = 'Guest';
-        const userKey = `acl-${normalizeEmail(userEmail)}`;
+        const userKey = `acl_${normalizeEmail(userEmail)}`;
         if (!usersAdded.includes(userEmail) && userEmail !== 'Guest' && userEmail !== target.author) {
             let permission;
             if (this.layoutDocAcls) {
@@ -514,7 +514,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
         groupList.sort(this.sortGroups);
         groupList.forEach(group => {
             if (group.title !== 'Guest' && this.selectedDoc) {
-                const groupKey = 'acl-' + normalizeEmail(StrCast(group.title));
+                const groupKey = 'acl_' + normalizeEmail(StrCast(group.title));
                 if (this.selectedDoc[groupKey] !== '' && this.selectedDoc[groupKey] !== undefined) {
                     let permission;
                     if (this.layoutDocAcls) {
@@ -529,7 +529,7 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
         });
 
         // guest permission
-        const guestPermission = StrCast((this.layoutDocAcls ? target : Doc.GetProto(target))['acl-Guest']);
+        const guestPermission = StrCast((this.layoutDocAcls ? target : Doc.GetProto(target)).acl_Guest);
 
         return (
             <div>
@@ -1733,8 +1733,8 @@ export class PropertiesView extends ObservableReactComponent<PropertiesViewProps
         }
         if (this.isPres && PresBox.Instance) {
             const selectedItem: boolean = PresBox.Instance.selectedArray.size > 0;
-            const type = [DocumentType.AUDIO, DocumentType.VID].includes(DocCast(PresBox.Instance.activeItem?.annotationOn)?.type as any as DocumentType)
-                ? (DocCast(PresBox.Instance.activeItem?.annotationOn)?.type as any as DocumentType)
+            const type = [DocumentType.AUDIO, DocumentType.VID].find(dt => dt === DocCast(PresBox.Instance.activeItem?.annotationOn)?.type)
+                ? DocCast(PresBox.Instance.activeItem?.annotationOn)?.type
                 : PresBox.targetRenderedDoc(PresBox.Instance.activeItem)?.type;
             return (
                 <div className="propertiesView" style={{ width: this._props.width }}>
diff --git a/src/client/views/collections/CollectionCarouselView.tsx b/src/client/views/collections/CollectionCarouselView.tsx
index 51352d3e2..fda320077 100644
--- a/src/client/views/collections/CollectionCarouselView.tsx
+++ b/src/client/views/collections/CollectionCarouselView.tsx
@@ -52,7 +52,7 @@ export class CollectionCarouselView extends CollectionSubView() {
     };
     captionStyleProvider = (doc: Doc | undefined, captionProps: Opt<FieldViewProps>, property: string): any => {
         // first look for properties on the document in the carousel, then fallback to properties on the container
-        const childValue = doc?.['caption-' + property] ? this._props.styleProvider?.(doc, captionProps, property) : undefined;
+        const childValue = doc?.['caption_' + property] ? this._props.styleProvider?.(doc, captionProps, property) : undefined;
         return childValue ?? this._props.styleProvider?.(this.layoutDoc, captionProps, property);
     };
     panelHeight = () => this._props.PanelHeight() - (StrCast(this.layoutDoc._layout_showCaption) ? 50 : 0);
diff --git a/src/client/views/collections/CollectionMenu.tsx b/src/client/views/collections/CollectionMenu.tsx
index 6dba9e155..f945a7aa4 100644
--- a/src/client/views/collections/CollectionMenu.tsx
+++ b/src/client/views/collections/CollectionMenu.tsx
@@ -53,7 +53,7 @@ export class CollectionMenu extends AntimodeMenu<CollectionMenuProps> {
         makeObservable(this);
         CollectionMenu.Instance = this;
         this._canFade = false; // don't let the inking menu fade away
-        this.Pinned = Cast(Doc.UserDoc()['menuCollections-pinned'], 'boolean', true);
+        this.Pinned = Cast(Doc.UserDoc().menuCollections_pinned, 'boolean', true);
         this.jumpTo(300, 300);
     }
 
@@ -71,7 +71,7 @@ export class CollectionMenu extends AntimodeMenu<CollectionMenuProps> {
 
     @action
     toggleMenuPin = () => {
-        Doc.UserDoc()['menuCollections-pinned'] = this.Pinned = !this.Pinned;
+        Doc.UserDoc().menuCollections_pinned = this.Pinned = !this.Pinned;
         if (!this.Pinned && this._left < 0) {
             this.jumpTo(300, 300);
         }
@@ -280,8 +280,8 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewMenu
     _saveFilterCommand = {
         params: ['target'],
         title: 'save filter',
-        script: `this.target._childFilters = compareLists(this['target-childFilters'],this.target._childFilters) ? undefined : copyField(this['target-childFilters']); 
-        this.target._searchFilterDocs = compareLists(this['target-searchFilterDocs'],this.target._searchFilterDocs) ? undefined: copyField(this['target-searchFilterDocs']);`,
+        script: `this.target._childFilters = compareLists(this.target_childFilters,this.target._childFilters) ? undefined : copyField(this.target_childFilters); 
+        this.target._searchFilterDocs = compareLists(this.target_searchFilterDocs,this.target._searchFilterDocs) ? undefined: copyField(this.target_searchFilterDocs);`,
         immediate: undoBatch(() => {
             this.target._childFilters = undefined;
             this.target._searchFilterDocs = undefined;
@@ -289,8 +289,8 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewMenu
         initialize: (button: Doc) => {
             const activeDash = Doc.ActiveDashboard;
             if (activeDash) {
-                button['target-childFilters'] = (Doc.MySearcher._childFilters || activeDash._childFilters) instanceof ObjectField ? ObjectField.MakeCopy((Doc.MySearcher._childFilters || activeDash._childFilters) as any as ObjectField) : undefined;
-                button['target-searchFilterDocs'] = activeDash._searchFilterDocs instanceof ObjectField ? ObjectField.MakeCopy(activeDash._searchFilterDocs as any as ObjectField) : undefined;
+                button.target_childFilters = (Doc.MySearcher._childFilters || activeDash._childFilters) instanceof ObjectField ? ObjectField.MakeCopy((Doc.MySearcher._childFilters || activeDash._childFilters) as any as ObjectField) : undefined;
+                button.target_searchFilterDocs = activeDash._searchFilterDocs instanceof ObjectField ? ObjectField.MakeCopy(activeDash._searchFilterDocs as any as ObjectField) : undefined;
             }
         },
     };
diff --git a/src/client/views/collections/CollectionView.tsx b/src/client/views/collections/CollectionView.tsx
index a0d84ab28..d6cbe0dab 100644
--- a/src/client/views/collections/CollectionView.tsx
+++ b/src/client/views/collections/CollectionView.tsx
@@ -70,7 +70,7 @@ export class CollectionView extends ViewBoxAnnotatableComponent<CollectionViewPr
     }
 
     get collectionViewType(): CollectionViewType | undefined {
-        const viewField = StrCast(this.layoutDoc._type_collection);
+        const viewField = StrCast(this.layoutDoc._type_collection) as any as CollectionViewType;
         if (CollectionView._safeMode) {
             switch (viewField) { 
                 case CollectionViewType.Freeform:
@@ -79,7 +79,7 @@ export class CollectionView extends ViewBoxAnnotatableComponent<CollectionViewPr
                 default:
             } // prettier-ignore
         }
-        return viewField as any as CollectionViewType;
+        return viewField;
     }
 
     screenToLocalTransform = () => (this._props.renderDepth ? this.ScreenToLocalBoxXf() : this.ScreenToLocalBoxXf().scale(this._props.PanelWidth() / this.bodyPanelWidth()));
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index 986c1e357..c1a889539 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -1664,7 +1664,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
             doc.x = scr?.[0];
             doc.y = scr?.[1];
         });
-        this._props.addDocTab(childDocs as any as Doc, OpenWhere.inParentFromScreen);
+        this._props.addDocTab(childDocs, OpenWhere.inParentFromScreen);
     };
 
     @undoBatch
diff --git a/src/client/views/linking/LinkMenuItem.tsx b/src/client/views/linking/LinkMenuItem.tsx
index 303ff4b98..278d30d6a 100644
--- a/src/client/views/linking/LinkMenuItem.tsx
+++ b/src/client/views/linking/LinkMenuItem.tsx
@@ -1,6 +1,5 @@
 /* eslint-disable jsx-a11y/no-static-element-interactions */
 /* eslint-disable jsx-a11y/click-events-have-key-events */
-import { IconProp } from '@fortawesome/fontawesome-svg-core';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { Tooltip } from '@mui/material';
 import { action, computed, makeObservable, observable } from 'mobx';
@@ -156,7 +155,7 @@ export class LinkMenuItem extends ObservableReactComponent<LinkMenuItemProps> {
     @observable _hover = false;
     docView = () => this._props.docView;
     render() {
-        const destinationIcon = Doc.toIcon(this._props.destinationDoc) as any as IconProp;
+        const destinationIcon = Doc.toIcon(this._props.destinationDoc);
 
         const title = StrCast(this._props.destinationDoc.title).length > 18 ? StrCast(this._props.destinationDoc.title).substr(0, 14) + '...' : this._props.destinationDoc.title;
 
diff --git a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
index 6a86af6a7..7b1847ae4 100644
--- a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
+++ b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
@@ -160,7 +160,7 @@ export class CollectionFreeFormDocumentView extends DocComponent<CollectionFreeF
         const timecode = Math.round(time);
         Object.keys(vals).forEach(val => {
             const findexed = Cast(d[`${val}_indexed`], listSpec('string'), []).slice();
-            findexed[timecode] = vals[val] as any as string;
+            findexed[timecode] = vals[val] || '';
             d[`${val}_indexed`] = new List<string>(findexed);
         });
     }
@@ -169,7 +169,7 @@ export class CollectionFreeFormDocumentView extends DocComponent<CollectionFreeF
         const timecode = Math.round(time);
         Object.keys(vals).forEach(val => {
             const findexed = Cast(d[`${val}_indexed`], listSpec('number'), []).slice();
-            findexed[timecode] = vals[val] as any as number;
+            findexed[timecode] = vals[val] || 0;
             d[`${val}_indexed`] = new List<number>(findexed);
         });
     }
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index db28d0a48..6d3d4be06 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -6,11 +6,10 @@ import { observer } from 'mobx-react';
 import { extname } from 'path';
 import * as React from 'react';
 import { ClientUtils, DashColor, returnEmptyString, returnFalse, returnOne, returnZero, setupMoveUpEvents } from '../../../ClientUtils';
-import { Doc, Opt } from '../../../fields/Doc';
+import { Doc, DocListCast, Opt } from '../../../fields/Doc';
 import { DocData } from '../../../fields/DocSymbols';
 import { Id } from '../../../fields/FieldSymbols';
 import { InkTool } from '../../../fields/InkField';
-import { List } from '../../../fields/List';
 import { ObjectField } from '../../../fields/ObjectField';
 import { Cast, ImageCast, NumCast, StrCast } from '../../../fields/Types';
 import { ImageField } from '../../../fields/URLField';
@@ -341,7 +340,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() impl
 
     @computed get paths() {
         const field = Cast(this.dataDoc[this.fieldKey], ImageField, null); // retrieve the primary image URL that is being rendered from the data doc
-        const alts = this.dataDoc[this.fieldKey + '_alternates'] as any as List<Doc>; // retrieve alternate documents that may be rendered as alternate images
+        const alts = DocListCast(this.dataDoc[this.fieldKey + '_alternates']); // retrieve alternate documents that may be rendered as alternate images
         const defaultUrl = new URL(ClientUtils.prepend('/assets/unknown-file-icon-hi.png'));
         const altpaths =
             alts
diff --git a/src/client/views/nodes/KeyValuePair.tsx b/src/client/views/nodes/KeyValuePair.tsx
index f96dd2b76..a9aa017a1 100644
--- a/src/client/views/nodes/KeyValuePair.tsx
+++ b/src/client/views/nodes/KeyValuePair.tsx
@@ -101,7 +101,7 @@ export class KeyValuePair extends ObservableReactComponent<KeyValuePairProps> {
                         </button>
                         <input className="keyValuePair-td-key-check" type="checkbox" style={hover} onChange={this.handleCheck} ref={this.checkbox} />
                         <Tooltip title={Object.entries(new DocumentOptions()).find((pair: [string, FInfo]) => pair[0].replace(/^_/, '') === this._props.keyName)?.[1].description ?? ''}>
-                            <div className="keyValuePair-keyField" style={{ marginLeft: 20 * (this._props.keyName.match(/_/g)?.length || 0), color: keyStyle }}>
+                            <div className="keyValuePair-keyField" style={{ marginLeft: 20 * (this._props.keyName.replace(/__/g, '').match(/_/g)?.length || 0), color: keyStyle }}>
                                 {'('.repeat(parenCount)}
                                 {this._props.keyName}
                                 {')'.repeat(parenCount)}
diff --git a/src/client/views/nodes/trails/PresBox.tsx b/src/client/views/nodes/trails/PresBox.tsx
index ed9635bdd..4fe7ec993 100644
--- a/src/client/views/nodes/trails/PresBox.tsx
+++ b/src/client/views/nodes/trails/PresBox.tsx
@@ -1607,7 +1607,7 @@ export class PresBox extends ViewBoxBaseComponent<FieldViewProps>() {
                             </div>
                         </Tooltip>
                     </div>
-                    {[DocumentType.AUDIO, DocumentType.VID].includes(targetType as any as DocumentType) ? null : (
+                    {[DocumentType.AUDIO, DocumentType.VID].find(dt => dt === targetType) ? null : (
                         <>
                             <div className="ribbon-doubleButton">
                                 <div className="presBox-subheading">Slide Duration</div>
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index c9aaa5158..9083d6ca3 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -156,9 +156,9 @@ export const ReverseHierarchyMap: Map<string, { level: aclLevel; acl: symbol; im
 export function updateCachedAcls(doc: Doc) {
     if (doc) {
         const target = (doc as any)?.__fieldTuples ?? doc;
-        const permissions: { [key: string]: symbol } = !target.author || target.author === ClientUtils.CurrentUserEmail() ? { 'acl-Me': AclAdmin } : {};
+        const permissions: { [key: string]: symbol } = !target.author || target.author === ClientUtils.CurrentUserEmail() ? { acl_Me: AclAdmin } : {};
         Object.keys(target).forEach(key => {
-            key.startsWith('acl') && (permissions[key] = ReverseHierarchyMap.get(StrCast(target[key]))!.acl);
+            key.startsWith('acl_') && (permissions[key] = ReverseHierarchyMap.get(StrCast(target[key]))!.acl);
         });
         if (Object.keys(permissions).length || doc[DocAcl]?.length) {
             runInAction(() => {
@@ -382,7 +382,7 @@ export class Doc extends RefField {
                     this[UpdatingFromServer] = true;
                     this[fKey] = value;
                     this[UpdatingFromServer] = false;
-                    if (fKey.startsWith('acl')) {
+                    if (fKey.startsWith('acl_')) {
                         updateCachedAcls(this);
                     }
                     if (prev === AclPrivate && GetEffectiveAcl(this) !== AclPrivate) {
@@ -390,7 +390,7 @@ export class Doc extends RefField {
                     }
                 };
                 const writeMode = DocServer.getFieldWriteMode(fKey);
-                if (fKey.startsWith('acl') || writeMode !== DocServer.WriteMode.Playground) {
+                if (fKey.startsWith('acl_') || writeMode !== DocServer.WriteMode.Playground) {
                     delete this[CachedUpdates][fKey];
                     // eslint-disable-next-line no-await-in-loop
                     await fn();
@@ -832,7 +832,7 @@ export namespace Doc {
                             newLayoutDoc.rootDocument = targetDoc;
                             newLayoutDoc.embedContainer = targetDoc;
                             newLayoutDoc.resolvedDataDoc = dataDoc;
-                            newLayoutDoc['acl-Guest'] = SharingPermissions.Edit;
+                            newLayoutDoc.acl_Guest = SharingPermissions.Edit;
                             if (dataDoc[templateField] === undefined && (templateLayoutDoc[templateField] as any)?.length) {
                                 dataDoc[templateField] = ObjectField.MakeCopy(templateLayoutDoc[templateField] as List<Doc>);
                                 // ComputedField.MakeFunction(`ObjectField.MakeCopy(templateLayoutDoc["${templateField}"])`, { templateLayoutDoc: Doc.name }, { templateLayoutDoc });
@@ -970,7 +970,7 @@ export namespace Doc {
             delegate.proto = doc;
             delegate.author = ClientUtils.CurrentUserEmail();
             Object.keys(doc)
-                .filter(key => key.startsWith('acl'))
+                .filter(key => key.startsWith('acl_'))
                 .forEach(key => {
                     delegate[key] = doc[key];
                 });
diff --git a/src/fields/util.ts b/src/fields/util.ts
index 72b0ef721..9361430cb 100644
--- a/src/fields/util.ts
+++ b/src/fields/util.ts
@@ -107,7 +107,7 @@ const _setterImpl = action((target: any, prop: string | symbol | number, valueIn
             if (value === undefined) 
                  (target as Doc|ObjectField)[FieldChanged]?.(undefined, { $unset: { ['fields.' + prop]: '' } });
             else (target as Doc|ObjectField)[FieldChanged]?.(undefined, { $set:   { ['fields.' + prop]: value instanceof ObjectField ? SerializationHelper.Serialize(value) :value}});
-            if (prop === 'author' || prop.toString().startsWith('acl')) updateCachedAcls(target);
+            if (prop === 'author' || prop.toString().startsWith('acl_')) updateCachedAcls(target);
         } else {
             DocServer.registerDocWithCachedUpdate(receiver, prop as string, curValue);
         }
@@ -184,7 +184,7 @@ export function SetCachedGroups(groups: string[]) {
 }
 function getEffectiveAcl(target: any, user?: string): symbol {
     const targetAcls = target[DocAcl];
-    if (targetAcls?.['acl-Me'] === AclAdmin || GetCachedGroupByName('Admin')) return AclAdmin;
+    if (targetAcls?.acl_Me === AclAdmin || GetCachedGroupByName('Admin')) return AclAdmin;
 
     const userChecked = user || ClientUtils.CurrentUserEmail(); // if the current user is the author of the document / the current user is a member of the admin group
     if (targetAcls && Object.keys(targetAcls).length) {
@@ -210,7 +210,7 @@ function getEffectiveAcl(target: any, user?: string): symbol {
 
 /**
  * Recursively distributes the access right for a user across the children of a document and its annotations.
- * @param key the key storing the access right (e.g. acl-groupname)
+ * @param key the key storing the access right (e.g. acl_groupname)
  * @param acl the access right being stored (e.g. "Can Edit")
  * @param target the document on which this access right is being set
  * @param visited list of Doc's already distributed to.
@@ -219,7 +219,7 @@ function getEffectiveAcl(target: any, user?: string): symbol {
  */
 // eslint-disable-next-line default-param-last
 export function distributeAcls(key: string, acl: SharingPermissions, target: Doc, visited: Doc[] = [], allowUpgrade?: boolean, layoutOnly = false) {
-    const selfKey = `acl-${normalizeEmail(ClientUtils.CurrentUserEmail())}`;
+    const selfKey = `acl_${normalizeEmail(ClientUtils.CurrentUserEmail())}`;
     if (!target || visited.includes(target) || key === selfKey) return;
     visited.push(target);
 
@@ -268,15 +268,15 @@ export function distributeAcls(key: string, acl: SharingPermissions, target: Doc
  * Copies parent's acl fields to the child
  */
 export function inheritParentAcls(parent: Doc, child: Doc, layoutOnly: boolean) {
-    [...Object.keys(parent), ...(ClientUtils.CurrentUserEmail() !== parent.author ? ['acl-Owner'] : [])]
-        .filter(key => key.startsWith('acl'))
+    [...Object.keys(parent), ...(ClientUtils.CurrentUserEmail() !== parent.author ? ['acl_Owner'] : [])]
+        .filter(key => key.startsWith('acl_'))
         .forEach(key => {
-            // if the default acl mode is private, then don't inherit the acl-guest permission, but set it to private.
-            // const permission: string = key === 'acl-guest' && Doc.defaultAclPrivate ? AclPrivate : parent[key];
-            const parAcl = ReverseHierarchyMap.get(StrCast(key === 'acl-Owner' ? (Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.Edit) : parent[key]))?.acl;
+            // if the default acl mode is private, then don't inherit the acl_guest permission, but set it to private.
+            // const permission: string = key === 'acl_Guest' && Doc.defaultAclPrivate ? AclPrivate : parent[key];
+            const parAcl = ReverseHierarchyMap.get(StrCast(key === 'acl_Owner' ? (Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.Edit) : parent[key]))?.acl;
             if (parAcl) {
                 const sharePermission = HierarchyMapping.get(parAcl)?.name;
-                sharePermission && distributeAcls(key === 'acl-Owner' ? `acl-${normalizeEmail(StrCast(parent.author))}` : key, sharePermission, child, undefined, false, layoutOnly);
+                sharePermission && distributeAcls(key === 'acl_Owner' ? `acl_${normalizeEmail(StrCast(parent.author))}` : key, sharePermission, child, undefined, false, layoutOnly);
             }
         });
 }
@@ -303,7 +303,7 @@ export function setter(target: any, inProp: string | symbol | number, value: any
     const effectiveAcl = inProp === 'constructor' || typeof inProp === 'symbol' ? AclAdmin : GetPropAcl(target, prop);
     if (effectiveAcl !== AclEdit && effectiveAcl !== AclAugment && effectiveAcl !== AclAdmin) return true;
     // if you're trying to change an acl but don't have Admin access / you're trying to change it to something that isn't an acceptable acl, you can't
-    if (typeof prop === 'string' && prop.startsWith('acl') && (effectiveAcl !== AclAdmin || ![...Object.values(SharingPermissions), undefined].includes(value))) return true;
+    if (typeof prop === 'string' && prop.startsWith('acl_') && (effectiveAcl !== AclAdmin || ![...Object.values(SharingPermissions), undefined].includes(value))) return true;
 
     if (typeof prop === 'string' && prop !== '__id' && prop !== '__fieldTuples' && prop.startsWith('_')) {
         if (!prop.startsWith('__')) prop = prop.substring(1);
diff --git a/src/server/authentication/DashUserModel.ts b/src/server/authentication/DashUserModel.ts
index a288bfeab..bfa6d7bdb 100644
--- a/src/server/authentication/DashUserModel.ts
+++ b/src/server/authentication/DashUserModel.ts
@@ -61,7 +61,7 @@ const userSchema = new mongoose.Schema(
  * Password hash middleware.
  */
 userSchema.pre('save', function save(next) {
-    const user = this as any as DashUserModel;
+    const user = this;
     if (!user.isModified('password')) {
         return next();
     }
@@ -70,7 +70,7 @@ userSchema.pre('save', function save(next) {
             return next(err);
         }
         bcrypt.hash(
-            user.password,
+            user.password ?? '',
             salt,
             () => {},
             (cryptErr: mongoose.Error, hash: string) => {
diff --git a/src/server/authentication/Passport.ts b/src/server/authentication/Passport.ts
index a5222e531..ca9e3058e 100644
--- a/src/server/authentication/Passport.ts
+++ b/src/server/authentication/Passport.ts
@@ -18,11 +18,11 @@ passport.deserializeUser<any, any>((id, done) => {
 passport.use(
     new LocalStrategy({ usernameField: 'email', passReqToCallback: true }, (req, email, password, done) => {
         User.findOne({ email: email.toLowerCase() })
-            .then((user: any) => {
+            .then((user: DashUserModel) => {
                 if (!user) {
                     done(undefined, false, { message: 'Invalid email or password' }); // invalid email
                 } else {
-                    (user as any as DashUserModel).comparePassword(password, (error: Error, isMatch: boolean) => {
+                    user.comparePassword(password, (error: Error, isMatch: boolean) => {
                         if (error) return done(error);
                         if (!isMatch) return done(undefined, false, { message: 'Invalid email or password' }); // invalid password
                         // valid authentication HERE
-- 
cgit v1.2.3-70-g09d2

