make naviator calls safe

pull/356/head
Vladimir Mandic 2023-01-12 15:40:37 -05:00
parent 3191666d8d
commit 22062e5b7c
14 changed files with 1082 additions and 1076 deletions

View File

@ -9,15 +9,16 @@
## Changelog
### **HEAD -> main** 2023/01/07 mandic00@live.com
- fix facedetector-only configs
### **3.0.3** 2023/01/07 mandic00@live.com
### **origin/main** 2023/01/06 mandic00@live.com
- full rebuild
### **3.0.2** 2023/01/06 mandic00@live.com
- full rebuild
- default face.rotation disabled
### **release: 3.0.1** 2022/11/22 mandic00@live.com

File diff suppressed because one or more lines are too long

11
dist/human.esm.js vendored
View File

@ -32289,12 +32289,13 @@ var Env = class {
this.offscreen = typeof OffscreenCanvas !== "undefined";
this.initial = true;
this.worker = this.browser && this.offscreen ? typeof WorkerGlobalScope !== "undefined" : void 0;
if (typeof navigator !== "undefined") {
const raw = navigator.userAgent.match(/\(([^()]+)\)/g);
if (typeof navigator !== "undefined" && typeof navigator.userAgent !== "undefined") {
const agent = navigator.userAgent || "";
const raw = agent.match(/\(([^()]+)\)/g);
if (raw == null ? void 0 : raw[0]) {
const platformMatch = raw[0].match(/\(([^()]+)\)/g);
this.platform = (platformMatch == null ? void 0 : platformMatch[0]) ? platformMatch[0].replace(/\(|\)/g, "") : "";
this.agent = navigator.userAgent.replace(raw[0], "");
this.agent = agent.replace(raw[0], "");
if (this.platform[1])
this.agent = this.agent.replace(raw[1], "");
this.agent = this.agent.replace(/ /g, " ");
@ -32353,7 +32354,7 @@ var Env = class {
this.webgl.renderer = gl2.getParameter(gl2.RENDERER);
this.webgl.shader = gl2.getParameter(gl2.SHADING_LANGUAGE_VERSION);
}
this.webgpu.supported = this.browser && typeof navigator.gpu !== "undefined";
this.webgpu.supported = this.browser && typeof navigator !== "undefined" && typeof navigator.gpu !== "undefined";
this.webgpu.backend = this.backends.includes("webgpu");
try {
if (this.webgpu.supported) {
@ -38373,6 +38374,7 @@ function generateAnchors(inputSize10) {
function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize10) {
const boxSize = getBoxSize(box);
const coordsScaled = coordsRaw.map((coord) => [
// scaled around zero-point
boxSize[0] / inputSize10 * (coord[0] - inputSize10 / 2),
boxSize[1] / inputSize10 * (coord[1] - inputSize10 / 2),
coord[2] || 0
@ -39337,6 +39339,7 @@ var calculateGaze = (face4) => {
const eyeCenter = left ? [(face4.mesh[133][0] + face4.mesh[33][0]) / 2, (face4.mesh[133][1] + face4.mesh[33][1]) / 2] : [(face4.mesh[263][0] + face4.mesh[362][0]) / 2, (face4.mesh[263][1] + face4.mesh[362][1]) / 2];
const eyeSize = left ? [face4.mesh[133][0] - face4.mesh[33][0], face4.mesh[23][1] - face4.mesh[27][1]] : [face4.mesh[263][0] - face4.mesh[362][0], face4.mesh[253][1] - face4.mesh[257][1]];
const eyeDiff = [
// x distance between extreme point and center point normalized with eye size
(eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],
eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1]
];

File diff suppressed because one or more lines are too long

2
dist/human.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/human.node.js vendored

File diff suppressed because one or more lines are too long

View File

@ -91,17 +91,17 @@
"@tensorflow/tfjs-node-gpu": "^4.2.0",
"@types/node": "^18.11.18",
"@types/offscreencanvas": "^2019.7.0",
"@typescript-eslint/eslint-plugin": "^5.48.0",
"@typescript-eslint/parser": "^5.48.0",
"@typescript-eslint/eslint-plugin": "^5.48.1",
"@typescript-eslint/parser": "^5.48.1",
"@vladmandic/build": "^0.7.15",
"@vladmandic/pilogger": "^0.4.7",
"@vladmandic/tfjs": "github:vladmandic/tfjs",
"canvas": "^2.11.0",
"esbuild": "^0.16.15",
"esbuild": "^0.16.17",
"eslint": "8.31.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-html": "^7.1.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-import": "^2.27.4",
"eslint-plugin-json": "^3.1.0",
"eslint-plugin-markdown": "^3.0.0",
"eslint-plugin-node": "^11.1.0",

View File

@ -107,12 +107,13 @@ export class Env {
// @ts-ignore WorkerGlobalScope evaluated in browser only
this.worker = this.browser && this.offscreen ? (typeof WorkerGlobalScope !== 'undefined') : undefined;
if (typeof navigator !== 'undefined') { // TBD replace with navigator.userAgentData once in mainline
const raw = navigator.userAgent.match(/\(([^()]+)\)/g);
if ((typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined')) { // TBD replace with navigator.userAgentData once in mainline
const agent = navigator.userAgent || '';
const raw = agent.match(/\(([^()]+)\)/g);
if (raw?.[0]) {
const platformMatch = raw[0].match(/\(([^()]+)\)/g);
this.platform = (platformMatch?.[0]) ? platformMatch[0].replace(/\(|\)/g, '') : '';
this.agent = navigator.userAgent.replace(raw[0], '');
this.agent = agent.replace(raw[0], '');
if (this.platform[1]) this.agent = this.agent.replace(raw[1], '');
this.agent = this.agent.replace(/ /g, ' ');
}
@ -148,7 +149,7 @@ export class Env {
this.webgl.renderer = gl.getParameter(gl.RENDERER);
this.webgl.shader = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);
}
this.webgpu.supported = this.browser && typeof navigator.gpu !== 'undefined';
this.webgpu.supported = this.browser && typeof navigator !== 'undefined' && typeof navigator.gpu !== 'undefined';
this.webgpu.backend = this.backends.includes('webgpu');
try {
if (this.webgpu.supported) {

View File

@ -1,50 +1,50 @@
2023-01-07 15:48:18 DATA:  Build {"name":"@vladmandic/human","version":"3.0.3"}
2023-01-07 15:48:18 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.3"}
2023-01-07 15:48:18 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
2023-01-07 15:48:18 INFO:  Toolchain: {"build":"0.7.15","esbuild":"0.16.15","typescript":"4.9.4","typedoc":"0.23.24","eslint":"8.31.0"}
2023-01-07 15:48:18 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
2023-01-07 15:48:18 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]}
2023-01-07 15:48:18 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361}
2023-01-07 15:48:18 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924}
2023-01-07 15:48:18 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670847,"outputBytes":317245}
2023-01-07 15:48:18 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928}
2023-01-07 15:48:18 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670851,"outputBytes":317249}
2023-01-07 15:48:18 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876}
2023-01-07 15:48:18 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671799,"outputBytes":317360}
2023-01-07 15:48:18 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670}
2023-01-07 15:48:18 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":670593,"outputBytes":315821}
2023-01-07 15:48:18 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1151306}
2023-01-07 15:48:18 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1821229,"outputBytes":1463072}
2023-01-07 15:48:18 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1821229,"outputBytes":1928352}
2023-01-07 15:48:22 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15}
2023-01-07 15:48:24 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true}
2023-01-07 15:48:24 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6082,"outputBytes":2872}
2023-01-07 15:48:24 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17503,"outputBytes":9403}
2023-01-07 15:48:32 STATE: Lint: {"locations":["**/*.json","src/**/*.ts","test/**/*.js","demo/**/*.js","**/*.md"],"files":169,"errors":0,"warnings":0}
2023-01-07 15:48:33 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
2023-01-07 15:48:33 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"}
2023-01-07 15:48:33 INFO:  Done...
2023-01-07 15:48:33 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"}
2023-01-07 15:48:33 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"}
2023-01-07 15:48:33 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"}
2023-01-07 15:48:33 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"}
2023-01-07 15:48:33 STATE: Filter: {"input":"types/tfjs-core.d.ts"}
2023-01-07 15:48:34 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":204}
2023-01-07 15:48:34 STATE: Filter: {"input":"types/human.d.ts"}
2023-01-07 15:48:34 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"}
2023-01-07 15:48:34 STATE: Write: {"output":"dist/human.esm.d.ts"}
2023-01-07 15:48:34 STATE: Write: {"output":"dist/human.d.ts"}
2023-01-07 15:48:34 STATE: Write: {"output":"dist/human.node-gpu.d.ts"}
2023-01-07 15:48:34 STATE: Write: {"output":"dist/human.node.d.ts"}
2023-01-07 15:48:34 STATE: Write: {"output":"dist/human.node-wasm.d.ts"}
2023-01-07 15:48:34 INFO:  Analyze models: {"folders":8,"result":"models/models.json"}
2023-01-07 15:48:34 STATE: Models {"folder":"./models","models":12}
2023-01-07 15:48:34 STATE: Models {"folder":"../human-models/models","models":41}
2023-01-07 15:48:34 STATE: Models {"folder":"../blazepose/model/","models":4}
2023-01-07 15:48:34 STATE: Models {"folder":"../anti-spoofing/model","models":1}
2023-01-07 15:48:34 STATE: Models {"folder":"../efficientpose/models","models":3}
2023-01-07 15:48:34 STATE: Models {"folder":"../insightface/models","models":5}
2023-01-07 15:48:34 STATE: Models {"folder":"../movenet/models","models":3}
2023-01-07 15:48:34 STATE: Models {"folder":"../nanodet/models","models":4}
2023-01-07 15:48:34 STATE: Models: {"count":55,"totalSize":372917743}
2023-01-07 15:48:34 INFO:  Human Build complete... {"logFile":"test/build.log"}
2023-01-12 15:35:33 DATA:  Build {"name":"@vladmandic/human","version":"3.0.3"}
2023-01-12 15:35:33 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.3"}
2023-01-12 15:35:33 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true}
2023-01-12 15:35:33 INFO:  Toolchain: {"build":"0.7.15","esbuild":"0.16.17","typescript":"4.9.4","typedoc":"0.23.24","eslint":"8.31.0"}
2023-01-12 15:35:33 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]}
2023-01-12 15:35:33 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]}
2023-01-12 15:35:33 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361}
2023-01-12 15:35:33 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924}
2023-01-12 15:35:33 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670952,"outputBytes":317307}
2023-01-12 15:35:33 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928}
2023-01-12 15:35:33 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670956,"outputBytes":317311}
2023-01-12 15:35:33 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876}
2023-01-12 15:35:33 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671904,"outputBytes":317422}
2023-01-12 15:35:33 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670}
2023-01-12 15:35:33 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":670698,"outputBytes":315883}
2023-01-12 15:35:34 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1151306}
2023-01-12 15:35:34 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1821334,"outputBytes":1463134}
2023-01-12 15:35:34 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1821334,"outputBytes":1928567}
2023-01-12 15:35:38 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15}
2023-01-12 15:35:40 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true}
2023-01-12 15:35:40 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6082,"outputBytes":2872}
2023-01-12 15:35:40 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17503,"outputBytes":9403}
2023-01-12 15:35:49 STATE: Lint: {"locations":["**/*.json","src/**/*.ts","test/**/*.js","demo/**/*.js","**/*.md"],"files":169,"errors":0,"warnings":0}
2023-01-12 15:35:49 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"}
2023-01-12 15:35:49 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"}
2023-01-12 15:35:49 INFO:  Done...
2023-01-12 15:35:49 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"}
2023-01-12 15:35:49 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"}
2023-01-12 15:35:49 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"}
2023-01-12 15:35:49 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"}
2023-01-12 15:35:49 STATE: Filter: {"input":"types/tfjs-core.d.ts"}
2023-01-12 15:35:50 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":204}
2023-01-12 15:35:50 STATE: Filter: {"input":"types/human.d.ts"}
2023-01-12 15:35:50 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"}
2023-01-12 15:35:50 STATE: Write: {"output":"dist/human.esm.d.ts"}
2023-01-12 15:35:50 STATE: Write: {"output":"dist/human.d.ts"}
2023-01-12 15:35:50 STATE: Write: {"output":"dist/human.node-gpu.d.ts"}
2023-01-12 15:35:50 STATE: Write: {"output":"dist/human.node.d.ts"}
2023-01-12 15:35:50 STATE: Write: {"output":"dist/human.node-wasm.d.ts"}
2023-01-12 15:35:50 INFO:  Analyze models: {"folders":8,"result":"models/models.json"}
2023-01-12 15:35:50 STATE: Models {"folder":"./models","models":12}
2023-01-12 15:35:50 STATE: Models {"folder":"../human-models/models","models":41}
2023-01-12 15:35:50 STATE: Models {"folder":"../blazepose/model/","models":4}
2023-01-12 15:35:50 STATE: Models {"folder":"../anti-spoofing/model","models":1}
2023-01-12 15:35:50 STATE: Models {"folder":"../efficientpose/models","models":3}
2023-01-12 15:35:50 STATE: Models {"folder":"../insightface/models","models":5}
2023-01-12 15:35:50 STATE: Models {"folder":"../movenet/models","models":3}
2023-01-12 15:35:50 STATE: Models {"folder":"../nanodet/models","models":4}
2023-01-12 15:35:51 STATE: Models: {"count":55,"totalSize":372917743}
2023-01-12 15:35:51 INFO:  Human Build complete... {"logFile":"test/build.log"}

File diff suppressed because it is too large Load Diff

View File

@ -316,7 +316,7 @@
</div>
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/util/env.ts#L126">src/util/env.ts:126</a></li></ul></aside></li></ul></section>
<li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/util/env.ts#L127">src/util/env.ts:127</a></li></ul></aside></li></ul></section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="updateCPU" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><span>updateCPU</span><a href="#updateCPU" aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><use href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@ -326,7 +326,7 @@
</div>
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/util/env.ts#L167">src/util/env.ts:167</a></li></ul></aside></li></ul></section></section></div>
<li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/util/env.ts#L168">src/util/env.ts:168</a></li></ul></aside></li></ul></section></section></div>
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
<div class="tsd-navigation settings">
<details class="tsd-index-accordion"><summary class="tsd-accordion-summary">

View File

@ -17,7 +17,7 @@
<h1>Variable env<code class="tsd-tag ts-flagConst">Const</code> </h1></div>
<div class="tsd-signature">env<span class="tsd-signature-symbol">:</span> <a href="../classes/Env.html" class="tsd-signature-type" data-tsd-kind="Class">Env</a><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/util/env.ts#L186">src/util/env.ts:186</a></li></ul></aside></div>
<li>Defined in <a href="https://github.com/vladmandic/human/blob/main/src/util/env.ts#L187">src/util/env.ts:187</a></li></ul></aside></div>
<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
<div class="tsd-navigation settings">
<details class="tsd-index-accordion"><summary class="tsd-accordion-summary">