@lowentry/utils 1.10.1 → 1.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.js +1 -13
  2. package/index.js.map +1 -1
  3. package/package.json +5 -2
package/index.js CHANGED
@@ -1,14 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/toConsumableArray"),t=require("@babel/runtime/helpers/defineProperty"),r=require("@babel/runtime/helpers/asyncToGenerator"),n=require("@babel/runtime/helpers/typeof");require("@babel/runtime/helpers/awaitAsyncGenerator");var a=require("@babel/runtime/helpers/wrapAsyncGenerator"),o=require("@babel/runtime/regenerator");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=i(e),c=i(t),l=i(r),s=i(n),f=i(a),p=i(o);function d(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var h=d((function e(t,r){if(t===r)return!0;if(t&&r&&"object"==typeof t&&"object"==typeof r){if(t.constructor!==r.constructor)return!1;var n,a,o;if(Array.isArray(t)){if((n=t.length)!=r.length)return!1;for(a=n;0!=a--;)if(!e(t[a],r[a]))return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if((n=(o=Object.keys(t)).length)!==Object.keys(r).length)return!1;for(a=n;0!=a--;)if(!Object.prototype.hasOwnProperty.call(r,o[a]))return!1;for(a=n;0!=a--;){var i=o[a];if(!e(t[i],r[i]))return!1}return!0}return t!=t&&r!=r})),m=Object.prototype.toString,g=function(e){if(void 0===e)return"undefined";if(null===e)return"null";var t=typeof e;if("boolean"===t)return"boolean";if("string"===t)return"string";if("number"===t)return"number";if("symbol"===t)return"symbol";if("function"===t)return"GeneratorFunction"===v(e)?"generatorfunction":"function";if(function(e){return Array.isArray?Array.isArray(e):e instanceof Array}(e))return"array";if(function(e){if(e.constructor&&"function"==typeof e.constructor.isBuffer)return e.constructor.isBuffer(e);return!1}
2
- /*!
3
- * shallow-clone <https://github.com/jonschlinkert/shallow-clone>
4
- *
5
- * Copyright (c) 2015-present, Jon Schlinkert.
6
- * Released under the MIT License.
7
- */(e))return"buffer";if(function(e){try{if("number"==typeof e.length&&"function"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf("callee"))return!0}return!1}(e))return"arguments";if(function(e){return e instanceof Date||"function"==typeof e.toDateString&&"function"==typeof e.getDate&&"function"==typeof e.setDate}(e))return"date";if(function(e){return e instanceof Error||"string"==typeof e.message&&e.constructor&&"number"==typeof e.constructor.stackTraceLimit}(e))return"error";if(function(e){return e instanceof RegExp||"string"==typeof e.flags&&"boolean"==typeof e.ignoreCase&&"boolean"==typeof e.multiline&&"boolean"==typeof e.global}(e))return"regexp";switch(v(e)){case"Symbol":return"symbol";case"Promise":return"promise";case"WeakMap":return"weakmap";case"WeakSet":return"weakset";case"Map":return"map";case"Set":return"set";case"Int8Array":return"int8array";case"Uint8Array":return"uint8array";case"Uint8ClampedArray":return"uint8clampedarray";case"Int16Array":return"int16array";case"Uint16Array":return"uint16array";case"Int32Array":return"int32array";case"Uint32Array":return"uint32array";case"Float32Array":return"float32array";case"Float64Array":return"float64array"}if(function(e){return"function"==typeof e.throw&&"function"==typeof e.return&&"function"==typeof e.next}(e))return"generator";switch(t=m.call(e)){case"[object Object]":return"object";case"[object Map Iterator]":return"mapiterator";case"[object Set Iterator]":return"setiterator";case"[object String Iterator]":return"stringiterator";case"[object Array Iterator]":return"arrayiterator"}return t.slice(8,-1).toLowerCase().replace(/\s/g,"")};function v(e){return"function"==typeof e.constructor?e.constructor.name:null}const y=Symbol.prototype.valueOf,b=g;var w=function(e){return null!=e&&"object"==typeof e&&!1===Array.isArray(e)};
8
- /*!
9
- * isobject <https://github.com/jonschlinkert/isobject>
10
- *
11
- * Copyright (c) 2014-2017, Jon Schlinkert.
12
- * Released under the MIT License.
13
- */function A(e){return!0===w(e)&&"[object Object]"===Object.prototype.toString.call(e)}const x=function(e,t){switch(b(e)){case"array":return e.slice();case"object":return Object.assign({},e);case"date":return new e.constructor(Number(e));case"map":return new Map(e);case"set":return new Set(e);case"buffer":return function(e){const t=e.length,r=Buffer.allocUnsafe?Buffer.allocUnsafe(t):Buffer.from(t);return e.copy(r),r}(e);case"symbol":return function(e){return y?Object(y.call(e)):{}}(e);case"arraybuffer":return function(e){const t=new e.constructor(e.byteLength);return new Uint8Array(t).set(new Uint8Array(e)),t}(e);case"float32array":case"float64array":case"int16array":case"int32array":case"int8array":case"uint16array":case"uint32array":case"uint8clampedarray":case"uint8array":return function(e,t){return new e.constructor(e.buffer,e.byteOffset,e.length)}(e);case"regexp":return function(e){const t=void 0!==e.flags?e.flags:/\w+$/.exec(e)||void 0,r=new e.constructor(e.source,t);return r.lastIndex=e.lastIndex,r}(e);case"error":return Object.create(e);default:return e}},O=g,j=function(e){var t,r;return!1!==A(e)&&("function"==typeof(t=e.constructor)&&(!1!==A(r=t.prototype)&&!1!==r.hasOwnProperty("isPrototypeOf")))};function k(e,t){switch(O(e)){case"object":return function(e,t){if("function"==typeof t)return t(e);if(t||j(e)){const r=new e.constructor;for(let n in e)r[n]=k(e[n],t);return r}return e}(e,t);case"array":return function(e,t){const r=new e.constructor(e.length);for(let n=0;n<e.length;n++)r[n]=k(e[n],t);return r}(e,t);default:return x(e)}}var T=d(k),S=/[^0-9.\-]/g,M=function(e){return null!=e},C=function(e){return Array.isArray(e)},I=function(e){return"object"===s.default(e)&&null!==e&&!Array.isArray(e)},E=function(e){return M(e)?""+e:""},_=function(e){var t=+e;return isNaN(t)?0:t},L=function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];for(var n=0,a=t;n<a.length;n++){var o=a[n];if(null!==o){var i=+o;if(!isNaN(i))return i}}return 0},U=function(e){return Math.round(P(e))},N=function(){return Math.round(F.apply(void 0,arguments))},P=function(e){var t="number"==typeof e?e:parseFloat((e+"").replace(S,""));return isNaN(t)?0:t},F=function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];for(var n=0,a=t;n<a.length;n++){var o=a[n];if(null!==o){var i="number"==typeof o?o:parseFloat((o+"").replace(S,""));if(!isNaN(i))return i}}return 0};function q(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var B,D,R,V,G,W,z,Y,H,J,K,X,$,Q,Z,ee,te,re=function(e){if(!ae.isTransactionalValueValid(e))throw console.error("The given value is not a valid TransactionalValue:"),console.error(e),new Error("The given value is not a valid TransactionalValue")},ne=function(e,t){for(var r=0;r<e.changes.length;r++){var n=e.changes[r];if(n.id===t)return{index:r,value:n.value}}return null},ae={equals:h,parseVersionString:function(e){var t,r,n;if(I(e)&&M(null===(t=e)||void 0===t?void 0:t.major)&&M(null===(r=e)||void 0===r?void 0:r.minor)&&M(null===(n=e)||void 0===n?void 0:n.patch))return e;var a=(e=E(e).trim()).split(" ")[0].split("-")[0].split("."),o=U(a[0]),i=U(a[1]),u=U(a[2]),c={major:o,minor:i,patch:u,toString:function(){return o+"."+i+"."+u},equals:function(e){return e=ae.parseVersionString(e),o===e.major&&i===e.minor&&u===e.patch},largerThan:function(e){return e=ae.parseVersionString(e),o>e.major||!(o<e.major)&&(i>e.minor||!(i<e.minor)&&u>e.patch)},largerThanOrEquals:function(e){return e=ae.parseVersionString(e),o>e.major||!(o<e.major)&&(i>e.minor||!(i<e.minor)&&u>=e.patch)},smallerThan:function(e){return!c.largerThanOrEquals(e)},smallerThanOrEquals:function(e){return!c.largerThan(e)}};return c},contains:function(e,t){if(!e)return!1;var r=!1;return t=E(t),ae.each(e,(function(e){if(E(e)===t)return r=!0,!1})),r},containsCaseInsensitive:function(e,t){if(!e)return!1;var r=!1;return t=E(t).toLowerCase(),ae.each(e,(function(e){if(E(e).toLowerCase()===t)return r=!0,!1})),r},containsAll:function(e,t){if(!e)return!1;var r=!0;return ae.each(t,(function(t){if(!ae.contains(e,t))return r=!1,!1})),r},containsAllCaseInsensitive:function(e,t){if(!e)return!1;var r=!0;return ae.each(t,(function(t){if(!ae.containsCaseInsensitive(e,t))return r=!1,!1})),r},containsAny:function(e,t){if(!e)return!1;var r=!1;return ae.each(t,(function(t){if(ae.contains(e,t))return r=!0,!1})),r},containsAnyCaseInsensitive:function(e,t){if(!e)return!1;var r=!1;return ae.each(t,(function(t){if(ae.containsCaseInsensitive(e,t))return r=!0,!1})),r},containsNone:function(e,t){if(!e)return!0;var r=!0;return ae.each(t,(function(t){if(ae.contains(e,t))return r=!1,!1})),r},containsNoneCaseInsensitive:function(e,t){if(!e)return!0;var r=!0;return ae.each(t,(function(t){if(ae.containsCaseInsensitive(e,t))return r=!1,!1})),r},each:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=e)if(Array.isArray(e))for(var n=0;n<e.length&&!1!==t.call(e[n],e[n],n);n++);else if("object"===s.default(e)||"function"==typeof e){for(var a in e)if((!0===r||Object.prototype.hasOwnProperty.call(e,a))&&!1===t.call(e[a],e[a],a))break}else console.warn("Executed LeUtils.each() on an invalid type: ["+s.default(e)+"]",e);return e},eachAsync:(te=function(){var e=l.default(p.default.mark((function e(t,r,n,a){var o,i;return p.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=[],i=!1,e.next=4,ae.eachAsync(t,function(){var e=l.default(p.default.mark((function e(t,a){var u,c;return p.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:u=p.default.mark((function e(){var t;return p.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=[],ae.each(o,(function(e){e.__lowentry_utils__promise_is_done__||t.push(e)})),!((o=t).length>n)){e.next=6;break}return e.next=6,Promise.any(o);case 6:case"end":return e.stop()}}),e)}));case 1:if(!(o.length>n)){e.next=5;break}return e.delegateYield(u(),"t0",3);case 3:e.next=1;break;case 5:if(!i){e.next=7;break}return e.abrupt("return",!1);case 7:c=l.default(p.default.mark((function e(){return p.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,r.call(t,t,a);case 2:if(e.t0=e.sent,!1!==e.t0){e.next=5;break}i=!0;case 5:c.__lowentry_utils__promise_is_done__=!0;case 6:case"end":return e.stop()}}),e)})))(),o.push(c);case 9:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),a);case 4:return e.next=6,Promise.all(o);case 6:return e.abrupt("return",t);case 7:case"end":return e.stop()}}),e)})));return function(t,r,n,a){return e.apply(this,arguments)}}(),function(){var e=l.default(p.default.mark((function e(t,r){var n,a,o,i,u=arguments;return p.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=u.length>2&&void 0!==u[2]?u[2]:1,a=u.length>3&&void 0!==u[3]&&u[3],null==t){e.next=36;break}if(!((n=U(n))>1)){e.next=8;break}return e.next=7,te(t,r,n,a);case 7:return e.abrupt("return",e.sent);case 8:if(!Array.isArray(t)){e.next=21;break}o=0;case 10:if(!(o<t.length)){e.next=19;break}return e.next=13,r.call(t[o],t[o],o);case 13:if(e.t0=e.sent,!1!==e.t0){e.next=16;break}return e.abrupt("break",19);case 16:o++,e.next=10;break;case 19:e.next=36;break;case 21:if("object"!==s.default(t)&&"function"!=typeof t){e.next=35;break}e.t1=p.default.keys(t);case 23:if((e.t2=e.t1()).done){e.next=33;break}if(i=e.t2.value,!0!==a&&!Object.prototype.hasOwnProperty.call(t,i)){e.next=31;break}return e.next=28,r.call(t[i],t[i],i);case 28:if(e.t3=e.sent,!1!==e.t3){e.next=31;break}return e.abrupt("break",33);case 31:e.next=23;break;case 33:e.next=36;break;case 35:console.warn("Executed LeUtils.eachAsync() on an invalid type: ["+s.default(t)+"]",t);case 36:return e.abrupt("return",t);case 37:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()),filter:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=e){if(Array.isArray(e)){for(var n=[],a=0;a<e.length;a++)!1!==t.call(e[a],e[a],a)&&n.push(e[a]);return n}if("object"===s.default(e)||"function"==typeof e){var o={};for(var i in e)(!0===r||Object.prototype.hasOwnProperty.call(e,i))&&!1!==t.call(e[i],e[i],i)&&(o[i]=e[i]);return o}console.warn("Executed LeUtils.filter() on an invalid type: ["+s.default(e)+"]",e)}return e},map:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=e){if(Array.isArray(e)){for(var n=[],a=0;a<e.length;a++)n[a]=t.call(e[a],e[a],a);return n}if("object"===s.default(e)||"function"==typeof e){var o={};for(var i in e)(!0===r||Object.prototype.hasOwnProperty.call(e,i))&&(o[i]=t.call(e[i],e[i],i));return o}console.warn("Executed LeUtils.map() on an invalid type: ["+s.default(e)+"]",e)}return e},mapToArray:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=[];if(null!=e)if(Array.isArray(e))for(var a=0;a<e.length;a++)n.push(t.call(e[a],e[a],a));else if("object"===s.default(e)||"function"==typeof e)for(var o in e)(!0===r||Object.prototype.hasOwnProperty.call(e,o))&&n.push(t.call(e[o],e[o],o));else console.warn("Executed LeUtils.mapToArray() on an invalid type: ["+s.default(e)+"]",e);return n},mapToArraySorted:function(e,t,r){for(var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=ae.sortKeys(e,t,n),o=[],i=0;i<a.length;i++)o.push(r.call(e[a[i]],e[a[i]],a[i]));return o},sortKeys:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=[];if(null!=e)if(Array.isArray(e))for(var a=0;a<e.length;a++)n.push(a);else if("object"===s.default(e)||"function"==typeof e)for(var o in e)(!0===r||Object.prototype.hasOwnProperty.call(e,o))&&n.push(o);else console.warn("Executed LeUtils.sortKeys() on an invalid type: ["+s.default(e)+"]",e);return n.sort((function(r,n){return t(e[r],e[n])})),n},flattenArray:(ee=function e(t,r){Array.isArray(r)?r.forEach((function(r){e(t,r)})):t.push(r)},function(e){if(!Array.isArray(e))return[e];var t=[];return e.forEach((function(e){ee(t,e)})),t}),compare:function(e,t){return e<t?-1:e>t?1:0},compareNumbers:function(e,t){return e-t},compareNumericStrings:function(e,t){return e=E(e).trim(),t=E(t).trim(),e.length===t.length?e<t?-1:e>t?1:0:e.length<t.length?-1:1},compareTimestampStrings:function(e,t){return e=ae.base64ToHex(E(e).replaceAll("-","+").replaceAll("_","/")),t=ae.base64ToHex(E(t).replaceAll("-","+").replaceAll("_","/")),ae.compare(e,t)},isEmptyObject:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];for(var r in e)if(!0===t||Object.prototype.hasOwnProperty.call(e,r))return!1;return!0},getObjectFieldsCount:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=0;for(var n in e)(!0===t||Object.prototype.hasOwnProperty.call(e,n))&&r++;return r},isGeneratorFunction:(X=p.default.mark((function e(){return p.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)})).constructor,$=f.default(p.default.mark((function e(){return p.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))).constructor,Q=function(){}.constructor,Z=Array.from(new Set(["GeneratorFunction","AsyncFunction","AsyncGeneratorFunction",X.name,X.displayName,$.name,$.displayName])).filter((function(e){return e&&e!==Q.name&&e!==Q.displayName})),function(e){if(!e)return!1;var t=e.constructor;return!!t&&(t.name&&Z.includes(t.name)||t.displayName&&Z.includes(t.displayName))}),setTimeout:function(e){function t(t,r){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e,t){t=P(t);var r=performance.now(),n=setTimeout((function(){var t=performance.now();try{e((t-r)/1e3)}catch(e){console.error(e)}r=t}),t);return{remove:function(){null!==n&&(clearTimeout(n),n=null)}}})),setInterval:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(t=F(t,1e3),r)try{e(0)}catch(e){console.error(e)}var n=performance.now(),a=setInterval((function(){var t=performance.now();try{e((t-n)/1e3)}catch(e){console.error(e)}n=t}),t);return{remove:function(){null!==a&&(clearInterval(a),a=null)}}})),setAnimationFrameTimeout:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;t=N(t,1);var r=!0,n=null,a=performance.now();return function o(){if(r){if(t<=0){r=!1,n=null;var i=performance.now();try{e((i-a)/1e3)}catch(e){console.error(e)}return void(a=i)}t--,n="undefined"==typeof window?setTimeout(o,1e3/60):requestAnimationFrame(o)}}(),{remove:function(){r=!1,null!==n&&("undefined"==typeof window?clearTimeout(n):cancelAnimationFrame(n),n=null)}}},setAnimationFrameInterval:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(t=N(t,1),r)try{e(0)}catch(e){console.error(e)}var n=!0,a=null,o=performance.now(),i=t,u=function r(){if(n){if(i<=0){var u=performance.now();try{e((u-o)/1e3)}catch(e){console.error(e)}o=u,i=t}i--,n&&(a="undefined"==typeof window?setTimeout(r,1e3/60):requestAnimationFrame(r))}};return"undefined"==typeof window?setTimeout(u,1e3/60):requestAnimationFrame(u),{remove:function(){n=!1,null!==a&&("undefined"==typeof window?clearTimeout(a):cancelAnimationFrame(a),a=null)}}},promiseTimeout:function(e){return e=P(e),new Promise(e<=0?function(e){return e()}:function(t){return setTimeout(t,e)})},promiseAnimationFrameTimeout:function(e){return e=U(e),new Promise(e<=0?function(e){return e()}:function(t){return ae.setAnimationFrameTimeout(t,e)})},platformIsMobile:function(){var e,t;if("undefined"==typeof window)return!1;var r=E((null===(e=window.navigator)||void 0===e?void 0:e.userAgent)||(null===(t=window.navigator)||void 0===t?void 0:t.vendor)||window.opera||""),n=r.substring(0,4);return!(!/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(r)&&!/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(n))},platformHasCursor:function(){var e;return"undefined"==typeof window||!(ae.platformIsMobile()||null!==(e=window.matchMedia("(any-hover: none)"))&&void 0!==e&&e.matches)},capitalize:function(e){return(e=E(e).trim()).length<=0?e:e.charAt(0).toUpperCase()+e.slice(1)},endsWithAny:function(e,t){var r;e=E(e),r=Array.isArray(t)?t:E(t).split("");var n=!1;return ae.each(r,(function(t){if(e.endsWith(E(t)))return n=!0,!1})),n},startsWithAny:function(e,t){var r;e=E(e),r=Array.isArray(t)?t:E(t).split("");var n=!1;return ae.each(r,(function(t){if(e.startsWith(E(t)))return n=!0,!1})),n},trimEnd:function(e,t){var r;e=E(e),r=Array.isArray(t)?t:E(t).split("");for(var n=function(t){t=E(t),e.endsWith(t)&&(e=e.substring(0,e.length-t.length),a=!0)},a=!0;a;)a=!1,ae.each(r,n);return e},trimStart:function(e,t){var r;e=E(e),r=Array.isArray(t)?t:E(t).split("");for(var n=function(t){t=E(t),e.startsWith(t)&&(e=e.substring(t.length),a=!0)},a=!0;a;)a=!1,ae.each(r,n);return e},trim:function(e,t){return ae.trimEnd(ae.trimStart(e,t),t)},purgeSentence:function(e){return e=ae.trimEnd(E(e).trim(),".: \r\n\t"),e+=ae.endsWithAny(e,"!?;")?"":"."},purgeErrorMessage:function(e){var t,r=E("string"==typeof e?e:null!==(t=e.message)&&void 0!==t?t:JSON.stringify(e)).split("threw an error:");return r[r.length-1].trim()},generateNamePermutations:function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];var n=[];return(t=ae.flattenArray(t).map((function(e){return E(e).trim().toLowerCase()})).filter((function(e){return e.length>0}))).length>0&&(n.push(t.join("")),n.push(t.map(ae.capitalize).join(""))),t.length>1&&(n.push([t[0]].concat(t.slice(1).map(ae.capitalize)).join("")),n.push(t.join("-")),n.push(t.join("_"))),n},increaseNumericStringByOne:function(e){if("string"!=typeof e)for(var t=(e=""+e).length-1;t>=0;t--){var r=e.charAt(t);if(r<"0"||r>"9")return"1"}if(""===e)return"1";for(var n=e.length-1;n>=0;n--){var a=e.charAt(n);if(a<"0"||a>"9")return"1";if(a<"9"){a++,e=e.substring(0,n)+a+e.substring(n+1);break}e=e.substring(0,n)+"0"+e.substring(n+1)}return"0"===e.charAt(0)&&(e="1"+e),e},uniqueId:(Y=null,H={},J=function(e){for(var t=0===e?0:Math.ceil((Math.floor(Math.log2(e))+1)/8),r=new Uint8ClampedArray(t),n=e,a=t-1;a>=0;a--){var o=255&n;r[a]=o,n=Math.floor(n/256)}return r},K=function(){var e;try{if("number"!=typeof(e=(performance.timeOrigin||performance.timing.navigationStart)+performance.now()))throw new Error}catch(t){e=Date.now?Date.now():(new Date).getTime()}e=Math.round(e);var t=J(e),r=null;try{var n;r=null===(n=crypto)||void 0===n?void 0:n.randomUUID()}catch(e){}if(r)r=ae.base64ToBytes(ae.hexToBase64(r));else{var a=J((Math.random()+" ").substring(2,12).padEnd(10,"0")),o=J((Math.random()+" ").substring(2,12).padEnd(10,"0")),i=J((Math.random()+" ").substring(2,12).padEnd(10,"0")),u=J((Math.random()+" ").substring(2,12).padEnd(10,"0"));(r=new Uint8Array(a.length+o.length+i.length+u.length)).set(a,0),r.set(o,a.length),r.set(i,a.length+o.length),r.set(u,a.length+o.length+i.length)}var c=new Uint8Array(t.length+r.length);return c.set(t,0),c.set(r,t.length),{time:e,id:r=ae.bytesToBase64(c).replaceAll("=","").replaceAll("+","-").replaceAll("/","_")}},function(){for(;;){var e=K();if(Y!==e.time)return Y=e.time,H=c.default({},e.id,!0),e.id;if(!0!==H[e.id])return H[e.id]=!0,e.id}}),timestamp:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if(M(e))e=P(e);else try{if("number"!=typeof(e=(performance.timeOrigin||performance.timing.navigationStart)+performance.now()))throw new Error}catch(t){e=Date.now?Date.now():(new Date).getTime()}var t=function(e){for(var t=0===e?0:Math.ceil((Math.floor(Math.log2(e))+1)/8),r=new Uint8ClampedArray(t),n=e,a=t-1;a>=0;a--){var o=255&n;r[a]=o,n=Math.floor(n/256)}return r}(e=Math.round(e));return ae.bytesToBase64(t).replaceAll("=","").replaceAll("+","-").replaceAll("/","_")},getEmptyImageSrc:function(){return"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="},getPercentage:function(e,t){return e=P(e),(t=P(t))<=0?100:Math.max(0,Math.min(100,e/t*100))},getImagePixels:function(e){if(!document)return new Uint8ClampedArray;var t=document.createElement("canvas");document.body.appendChild(t);try{var r=t.getContext("2d"),n=Math.floor(e.width),a=Math.floor(e.height);return n<=0||a<=0?(t.width=1,t.height=1):(t.width=n,t.height=a,r.drawImage(e,0,0,t.width,t.height)),r.getImageData(0,0,t.width,t.height).data}finally{t.parentNode.removeChild(t)}},getColoredImage:function(e,t){if(!document)return ae.getEmptyImageSrc();var r=document.createElement("canvas");document.body.appendChild(r);try{var n=r.getContext("2d"),a=Math.floor(e.width),o=Math.floor(e.height);return a<=0||o<=0?(r.width=1,r.height=1):(r.width=a,r.height=o,n.drawImage(e,0,0,r.width,r.height)),n.globalCompositeOperation="source-in",n.fillStyle=t,n.fillRect(0,0,r.width,r.height),r.toDataURL("image/png")}finally{r.parentNode.removeChild(r)}},rgbToHex:function(e){return"#"+e.map((function(e){var t=e.toString(16);return 1===t.length?"0"+t:t})).join("")},hexToRgb:function(e){for(var t=4===(e=e.replace(/[^0-9A-F]/gi,"")).length||8===e.length;e.length<6;)e=e.replace(/(.)/g,"$1$1");var r=e.match(/\w{2}/g).map((function(e){return parseInt(e,16)}));return[r[0],r[1],r[2]].concat(u.default(t?[r[3]]:[]))},rgbToHsl:function(e){var t,r,n=e[0]/255,a=e[1]/255,o=e[2]/255,i=Math.max(n,a,o),c=Math.min(n,a,o),l=(i+c)/2;if(i===c)t=r=0;else{var s=i-c;switch(r=l>.5?s/(2-i-c):s/(i+c),i){case n:t=(a-o)/s+(a<o?6:0);break;case a:t=(o-n)/s+2;break;case o:t=(n-a)/s+4}t/=6}return[t,r,l].concat(u.default(e.length>=4?[e[3]/255]:[]))},hslToRgb:(z=function(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?e+6*(t-e)*r:r<.5?t:r<2/3?e+(t-e)*(2/3-r)*6:e},function(e){var t,r,n,a=e[0],o=e[1],i=e[2];if(0===o)t=r=n=i;else{var c=i<.5?i*(1+o):i+o-i*o,l=2*i-c;t=z(l,c,a+1/3),r=z(l,c,a),n=z(l,c,a-1/3)}return[255*t,255*r,255*n].concat(u.default(e.length>=4?[255*e[3]]:[])).map((function(e){return Math.max(0,Math.min(255,Math.round(e)))}))}),rgbToLab:function(e){var t=e[0]/255,r=e[1]/255,n=e[2]/255,a=(.4124*(t=t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92)+.3576*(r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92))/.95047,o=.2126*t+.7152*r+.0722*n,i=(.0193*t+.1192*r+.9505*n)/1.08883;return a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,[116*(o=o>.008856?Math.pow(o,1/3):7.787*o+16/116)-16,500*(a-o),200*(o-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))].concat(u.default(e.length>=4?[e[3]/255]:[]))},getDifferenceBetweenRgb:function(e,t){var r=ae.rgbToLab(e),n=ae.rgbToLab(t);return ae.getDifferenceBetweenLab(r,n)},getDifferenceBetweenLab:function(e,t){var r=e[0]-t[0],n=e[1]-t[1],a=e[2]-t[2],o=Math.sqrt(e[1]*e[1]+e[2]*e[2]),i=o-Math.sqrt(t[1]*t[1]+t[2]*t[2]),u=n*n+a*a-i*i,c=r/1,l=i/(1+.045*o),s=(u=u<0?0:Math.sqrt(u))/(1+.015*o),f=c*c+l*l+s*s;return f<0?0:Math.sqrt(f)},getRgbOfGradient:function(e,t){t=Math.max(0,Math.min(100,P(t)));var r=null;if(ae.each(e,(function(e,n){if(n=U(n),null===r)r=[n,Math.abs(t-n)];else{var a=Math.abs(t-n);a<r[1]&&(r=[n,a])}})),null===r)return null;r=r[0];var n=99999,a=-99999;if(ae.each(e,(function(e,t){(t=U(t))<r&&t>a&&(a=t),t>r&&t<n&&(n=t)})),99999===n&&(n=null),-99999===a&&(a=null),null===n&&null===a||n===a)return e[r];if(null!==n&&null!==a?Math.abs(n-t)>Math.abs(t-a)?n=r:a=r:null===a?a=r:n=r,a>n){var o=n;n=a,a=o}var i=n-a,u=t-a;return ae.getRgbBetween(e[a],e[n],u/i*100)},getRgbBetween:function(e,t,r){r=P(r);for(var n=Math.max(0,Math.min(1,r/100)),a=1-n,o=Math.min(e.length,t.length),i=[],u=0;u<o;u++)i.push(Math.max(0,Math.min(255,Math.round(e[u]*a+t[u]*n))));return i},btoa:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return"function"==typeof btoa?btoa(e):Buffer.from(e).toString("base64")})),atob:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return"function"==typeof atob?atob(e):Buffer.from(e,"base64").toString()})),utf8ToBase64:function(e){return ae.btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,(function(e,t){return String.fromCharCode(parseInt(t,16))})))},base64ToUtf8:function(e){return decodeURIComponent(ae.atob(e.trim()).split("").map((function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)})).join(""))},base64ToHex:function(e){return ae.atob(e.trim()).split("").map((function(e){return("0"+e.charCodeAt(0).toString(16)).slice(-2)})).join("")},hexToBase64:function(e){return ae.btoa(e.replace(/[^0-9A-F]/gi,"").match(/\w{2}/g).map((function(e){return String.fromCharCode(parseInt(e,16))})).join(""))},base64ToBytes:function(e){for(var t=ae.atob(e.trim()),r=t.length,n=new Uint8Array(r),a=0;a<r;a++)n[a]=t.charCodeAt(a);return n},bytesToBase64:function(e){for(var t=new Uint8Array(e),r=t.byteLength,n="",a=0;a<r;a++)n+=String.fromCharCode(t[a]);return ae.btoa(n)},downloadFile:function(e,t,r){var n=document.createElement("a");n.setAttribute("download","string"==typeof t?t:"file"),n.href="data:"+r+";base64,"+e,n.setAttribute("target","_blank"),n.click()},localStorageGet:function(e){if("undefined"!=typeof window){var t=window.localStorage.getItem("LeUtils_"+e);if("string"==typeof t)try{if(void 0!==(t=JSON.parse(t))["-"])return t["-"]}catch(e){}}},localStorageSet:function(e,t){"undefined"!=typeof window&&(void 0!==t?window.localStorage.setItem("LeUtils_"+e,JSON.stringify({"-":t})):window.localStorage.removeItem("LeUtils_"+e))},localStorageRemove:function(e){"undefined"!=typeof window&&window.localStorage.removeItem("LeUtils_"+e)},isCurrentHostPrivate:(G=null,W=!1,function(){if("undefined"==typeof window)return!1;var e=window.location.hostname;return G===e?W:(G=e,W=ae.isGivenHostPrivate(G))}),isGivenHostPrivate:function(e){if("localhost"===(e=E(e).trim().toLowerCase())||"127.0.0.1"===e)return!0;if(!/^(\d{1,3}\.){3}\d{1,3}$/.test(e))return!1;var t=e.split(".");return"10"===t[0]||"172"===t[0]&&parseInt(t[1],10)>=16&&parseInt(t[1],10)<=31||"192"===t[0]&&"168"===t[1]},createTreeSet:function(e,t){t=t||ae.compare,(e=e||[]).sort(t);var r=function(r){for(var n=0,a=e.length-1;n<=a;){var o=Math.floor((n+a)/2),i=e[o],u=t(i,r);if(u<0)n=o+1;else{if(!(u>0))return{found:!0,index:o,value:i};a=o-1}}return{found:!1,index:n,value:void 0}},n={getElements:function(){return e},getComparator:function(){return t},size:function(){return e.length},isEmpty:function(){return e.length<=0},contains:function(e){return r(e).found},first:function(){return e.length>0?e[0]:void 0},last:function(){return e.length>0?e[e.length-1]:void 0},pollFirst:function(){return e.length>0?e.splice(0,1)[0]:void 0},pollLast:function(){return e.length>0?e.splice(e.length-1,1)[0]:void 0},add:function(t){var n=r(t);n.found||e.splice(n.index,0,t)},addAll:function(e){ae.each(e,n.add)},getEqualValue:function(e){var t=r(e);if(t.found)return t.value},getEqualValueOrAdd:function(t){var n=r(t);return n.found?n.value:(e.splice(n.index,0,t),t)}};return n},createTransactionalValue:function(e){return void 0===e&&(e=null),{value:e,changes:[]}},isTransactionalValueValid:function(e){return"object"===s.default(e)&&"value"in e&&"changes"in e&&Array.isArray(e.changes)},transactionalValueToString:function(e){if(!ae.isTransactionalValueValid(e))return e+"";if(e.changes.length<=0)return""+e.value;for(var t=""+e.value,r=0;r<e.changes.length;r++)t+=" -> "+e.changes[r].value;return e.changes[e.changes.length-1].value+" ("+t+")"},transactionSetAndCommit:function(e,t){re(e),void 0===t&&(t=null),e.value=t,e.changes=[]},transactionSetWithoutCommitting:function(e,t){re(e),void 0===t&&(t=null);var r=ae.uniqueId();return e.changes.push({id:r,value:t}),r},transactionCommitChange:function(e,t){re(e);var r=ne(e,t);return null!==r&&(e.value=r.value,e.changes.splice(0,r.index+1),!0)},transactionCancelChange:function(e,t){re(e);var r=ne(e,t);return null!==r&&(e.changes.splice(r.index,1),!0)},transactionIsChangeRelevant:function(e,t){return re(e),null!==ne(e,t)},transactionGetCommittedValue:function(e){return re(e),e.value},transactionGetValue:function(e){return re(e),e.changes.length<=0?e.value:e.changes[e.changes.length-1].value},createWorkerThread:function(e){var t=new Worker("/workers/"+e+".worker.js"),r={},n=function(e){delete r[e]};return t.onerror=function(t){console.error("Worker "+e+":",t)},t.onmessage=function(e){var t=e.data;if(null!=t&&t.id){var a=r[t.id];a&&(n(t.id),a(t))}},{worker:t,sendMessage:function(e,a){return new Promise((function(o,i){var u,l=ae.uniqueId();!function(e,t){r[e]=t}(l,o),setTimeout((function(){n(l),i("timeout")}),null!==(u=null==a?void 0:a.timeout)&&void 0!==u?u:1e4),t.postMessage(function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?q(Object(r),!0).forEach((function(t){c.default(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):q(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({id:l},e))}))}}},sendWorkerMessage:(V={},function(e,t,r){return V[e]||(V[e]=ae.createWorkerThread(e)),V[e].sendMessage(t,r)}),clone:function(e){return T(e,!0)},purgeEmail:function(e){return(e=E(e).trim().toLowerCase().replace(/\s/g,"")).includes("@")&&e.includes(".")?e:""},isFocusClear:(R=["text","search","email","number","password","tel","time","url","week","month","date","datetime-local"],function(){var e,t;return!("input"===(null===(e=document)||void 0===e||null===(e=e.activeElement)||void 0===e||null===(e=e.tagName)||void 0===e?void 0:e.toLowerCase())&&R.includes(null===(t=document)||void 0===t||null===(t=t.activeElement)||void 0===t||null===(t=t.type)||void 0===t?void 0:t.toLowerCase()))}),getUserLocale:(D=null,function(){return null===D&&(D=function(){if("undefined"==typeof window)return"en-US";var e=window.navigator.languages;if(!C(e)||e.length<=0)return"en-US";if((e=e.filter((function(e){return"string"==typeof e&&e.includes("-")&&"en-us"!==e.toLowerCase()}))).length<=0)return"en-US";var t=e.filter((function(e){return!e.toLowerCase().startsWith("en-")}));return t.length<=0?e[0]:t[0]}()),D}),getUserLocaleDateFormat:(B=null,function(){return null===B&&(B=function(){var e="/";if("undefined"!=typeof window&&"undefined"!=typeof Intl&&void 0!==Intl.DateTimeFormat){var t=new Intl.DateTimeFormat(ae.getUserLocale()).format();t.includes("-")?e="-":(t.includes(". ")||t.includes("."))&&(e=".")}return"YYYY"+e+"MM"+e+"DD"}()),B})};exports.ARRAY=function(e){return C(e)?e:void 0!==e?[e]:[]},exports.FLOAT=_,exports.FLOAT_ANY=L,exports.FLOAT_LAX=P,exports.FLOAT_LAX_ANY=F,exports.INT=function(e){return Math.round(_(e))},exports.INT_ANY=function(){return Math.round(L.apply(void 0,arguments))},exports.INT_LAX=U,exports.INT_LAX_ANY=N,exports.ISSET=M,exports.IS_ARRAY=C,exports.IS_OBJECT=I,exports.LeUtils=ae,exports.OBJECT=function(e){return I(e)?e:{}},exports.STRING=E,exports.STRING_ANY=function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];for(var n=0,a=t;n<a.length;n++){var o=a[n];if(M(o))return""+o}return""};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/toConsumableArray"),n=require("@babel/runtime/helpers/defineProperty"),t=require("@babel/runtime/helpers/asyncToGenerator"),r=require("@babel/runtime/helpers/typeof");require("@babel/runtime/helpers/awaitAsyncGenerator");var a=require("@babel/runtime/helpers/wrapAsyncGenerator"),o=require("@babel/runtime/regenerator"),i=require("fast-deep-equal"),u=require("clone-deep");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=l(e),s=l(n),f=l(t),d=l(r),p=l(a),h=l(o),m=l(i),v=l(u),g=/[^0-9.\-]/g,w=function(e){return null!=e},y=function(e){return Array.isArray(e)},b=function(e){return"object"===d.default(e)&&null!==e&&!Array.isArray(e)},A=function(e){return w(e)?""+e:""},x=function(e){var n=+e;return isNaN(n)?0:n},T=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];for(var r=0,a=n;r<a.length;r++){var o=a[r];if(null!==o){var i=+o;if(!isNaN(i))return i}}return 0},k=function(e){return Math.round(S(e))},M=function(){return Math.round(C.apply(void 0,arguments))},S=function(e){var n="number"==typeof e?e:parseFloat((e+"").replace(g,""));return isNaN(n)?0:n},C=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];for(var r=0,a=n;r<a.length;r++){var o=a[r];if(null!==o){var i="number"==typeof o?o:parseFloat((o+"").replace(g,""));if(!isNaN(i))return i}}return 0};function O(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}var j,I,E,_,L,N,q,U,F,P,D,B,R,V,G,z,W,Y=function(e){if(!J.isTransactionalValueValid(e))throw console.error("The given value is not a valid TransactionalValue:"),console.error(e),new Error("The given value is not a valid TransactionalValue")},H=function(e,n){for(var t=0;t<e.changes.length;t++){var r=e.changes[t];if(r.id===n)return{index:t,value:r.value}}return null},J={equals:m.default,parseVersionString:function(e){var n,t,r;if(b(e)&&w(null===(n=e)||void 0===n?void 0:n.major)&&w(null===(t=e)||void 0===t?void 0:t.minor)&&w(null===(r=e)||void 0===r?void 0:r.patch))return e;var a=(e=A(e).trim()).split(" ")[0].split("-")[0].split("."),o=k(a[0]),i=k(a[1]),u=k(a[2]),l={major:o,minor:i,patch:u,toString:function(){return o+"."+i+"."+u},equals:function(e){return e=J.parseVersionString(e),o===e.major&&i===e.minor&&u===e.patch},largerThan:function(e){return e=J.parseVersionString(e),o>e.major||!(o<e.major)&&(i>e.minor||!(i<e.minor)&&u>e.patch)},largerThanOrEquals:function(e){return e=J.parseVersionString(e),o>e.major||!(o<e.major)&&(i>e.minor||!(i<e.minor)&&u>=e.patch)},smallerThan:function(e){return!l.largerThanOrEquals(e)},smallerThanOrEquals:function(e){return!l.largerThan(e)}};return l},contains:function(e,n){if(!e)return!1;var t=!1;return n=A(n),J.each(e,(function(e){if(A(e)===n)return t=!0,!1})),t},containsCaseInsensitive:function(e,n){if(!e)return!1;var t=!1;return n=A(n).toLowerCase(),J.each(e,(function(e){if(A(e).toLowerCase()===n)return t=!0,!1})),t},containsAll:function(e,n){if(!e)return!1;var t=!0;return J.each(n,(function(n){if(!J.contains(e,n))return t=!1,!1})),t},containsAllCaseInsensitive:function(e,n){if(!e)return!1;var t=!0;return J.each(n,(function(n){if(!J.containsCaseInsensitive(e,n))return t=!1,!1})),t},containsAny:function(e,n){if(!e)return!1;var t=!1;return J.each(n,(function(n){if(J.contains(e,n))return t=!0,!1})),t},containsAnyCaseInsensitive:function(e,n){if(!e)return!1;var t=!1;return J.each(n,(function(n){if(J.containsCaseInsensitive(e,n))return t=!0,!1})),t},containsNone:function(e,n){if(!e)return!0;var t=!0;return J.each(n,(function(n){if(J.contains(e,n))return t=!1,!1})),t},containsNoneCaseInsensitive:function(e,n){if(!e)return!0;var t=!0;return J.each(n,(function(n){if(J.containsCaseInsensitive(e,n))return t=!1,!1})),t},each:function(e,n){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=e)if(Array.isArray(e))for(var r=0;r<e.length&&!1!==n.call(e[r],e[r],r);r++);else if("object"===d.default(e)||"function"==typeof e){for(var a in e)if((!0===t||Object.prototype.hasOwnProperty.call(e,a))&&!1===n.call(e[a],e[a],a))break}else console.warn("Executed LeUtils.each() on an invalid type: ["+d.default(e)+"]",e);return e},eachAsync:(W=function(){var e=f.default(h.default.mark((function e(n,t,r,a){var o,i;return h.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=[],i=!1,e.next=4,J.eachAsync(n,function(){var e=f.default(h.default.mark((function e(n,a){var u,l;return h.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:u=h.default.mark((function e(){var n;return h.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=[],J.each(o,(function(e){e.__lowentry_utils__promise_is_done__||n.push(e)})),!((o=n).length>r)){e.next=6;break}return e.next=6,Promise.any(o);case 6:case"end":return e.stop()}}),e)}));case 1:if(!(o.length>r)){e.next=5;break}return e.delegateYield(u(),"t0",3);case 3:e.next=1;break;case 5:if(!i){e.next=7;break}return e.abrupt("return",!1);case 7:l=f.default(h.default.mark((function e(){return h.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.call(n,n,a);case 2:if(e.t0=e.sent,!1!==e.t0){e.next=5;break}i=!0;case 5:l.__lowentry_utils__promise_is_done__=!0;case 6:case"end":return e.stop()}}),e)})))(),o.push(l);case 9:case"end":return e.stop()}}),e)})));return function(n,t){return e.apply(this,arguments)}}(),a);case 4:return e.next=6,Promise.all(o);case 6:return e.abrupt("return",n);case 7:case"end":return e.stop()}}),e)})));return function(n,t,r,a){return e.apply(this,arguments)}}(),function(){var e=f.default(h.default.mark((function e(n,t){var r,a,o,i,u=arguments;return h.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=u.length>2&&void 0!==u[2]?u[2]:1,a=u.length>3&&void 0!==u[3]&&u[3],null==n){e.next=36;break}if(!((r=k(r))>1)){e.next=8;break}return e.next=7,W(n,t,r,a);case 7:return e.abrupt("return",e.sent);case 8:if(!Array.isArray(n)){e.next=21;break}o=0;case 10:if(!(o<n.length)){e.next=19;break}return e.next=13,t.call(n[o],n[o],o);case 13:if(e.t0=e.sent,!1!==e.t0){e.next=16;break}return e.abrupt("break",19);case 16:o++,e.next=10;break;case 19:e.next=36;break;case 21:if("object"!==d.default(n)&&"function"!=typeof n){e.next=35;break}e.t1=h.default.keys(n);case 23:if((e.t2=e.t1()).done){e.next=33;break}if(i=e.t2.value,!0!==a&&!Object.prototype.hasOwnProperty.call(n,i)){e.next=31;break}return e.next=28,t.call(n[i],n[i],i);case 28:if(e.t3=e.sent,!1!==e.t3){e.next=31;break}return e.abrupt("break",33);case 31:e.next=23;break;case 33:e.next=36;break;case 35:console.warn("Executed LeUtils.eachAsync() on an invalid type: ["+d.default(n)+"]",n);case 36:return e.abrupt("return",n);case 37:case"end":return e.stop()}}),e)})));return function(n,t){return e.apply(this,arguments)}}()),filter:function(e,n){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=e){if(Array.isArray(e)){for(var r=[],a=0;a<e.length;a++)!1!==n.call(e[a],e[a],a)&&r.push(e[a]);return r}if("object"===d.default(e)||"function"==typeof e){var o={};for(var i in e)(!0===t||Object.prototype.hasOwnProperty.call(e,i))&&!1!==n.call(e[i],e[i],i)&&(o[i]=e[i]);return o}console.warn("Executed LeUtils.filter() on an invalid type: ["+d.default(e)+"]",e)}return e},map:function(e,n){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(null!=e){if(Array.isArray(e)){for(var r=[],a=0;a<e.length;a++)r[a]=n.call(e[a],e[a],a);return r}if("object"===d.default(e)||"function"==typeof e){var o={};for(var i in e)(!0===t||Object.prototype.hasOwnProperty.call(e,i))&&(o[i]=n.call(e[i],e[i],i));return o}console.warn("Executed LeUtils.map() on an invalid type: ["+d.default(e)+"]",e)}return e},mapToArray:function(e,n){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=[];if(null!=e)if(Array.isArray(e))for(var a=0;a<e.length;a++)r.push(n.call(e[a],e[a],a));else if("object"===d.default(e)||"function"==typeof e)for(var o in e)(!0===t||Object.prototype.hasOwnProperty.call(e,o))&&r.push(n.call(e[o],e[o],o));else console.warn("Executed LeUtils.mapToArray() on an invalid type: ["+d.default(e)+"]",e);return r},mapToArraySorted:function(e,n,t){for(var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=J.sortKeys(e,n,r),o=[],i=0;i<a.length;i++)o.push(t.call(e[a[i]],e[a[i]],a[i]));return o},sortKeys:function(e,n){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=[];if(null!=e)if(Array.isArray(e))for(var a=0;a<e.length;a++)r.push(a);else if("object"===d.default(e)||"function"==typeof e)for(var o in e)(!0===t||Object.prototype.hasOwnProperty.call(e,o))&&r.push(o);else console.warn("Executed LeUtils.sortKeys() on an invalid type: ["+d.default(e)+"]",e);return r.sort((function(t,r){return n(e[t],e[r])})),r},flattenArray:(z=function e(n,t){Array.isArray(t)?t.forEach((function(t){e(n,t)})):n.push(t)},function(e){if(!Array.isArray(e))return[e];var n=[];return e.forEach((function(e){z(n,e)})),n}),compare:function(e,n){return e<n?-1:e>n?1:0},compareNumbers:function(e,n){return e-n},compareNumericStrings:function(e,n){return e=A(e).trim(),n=A(n).trim(),e.length===n.length?e<n?-1:e>n?1:0:e.length<n.length?-1:1},compareTimestampStrings:function(e,n){return e=J.base64ToHex(A(e).replaceAll("-","+").replaceAll("_","/")),n=J.base64ToHex(A(n).replaceAll("-","+").replaceAll("_","/")),J.compare(e,n)},isEmptyObject:function(e){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];for(var t in e)if(!0===n||Object.prototype.hasOwnProperty.call(e,t))return!1;return!0},getObjectFieldsCount:function(e){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],t=0;for(var r in e)(!0===n||Object.prototype.hasOwnProperty.call(e,r))&&t++;return t},isGeneratorFunction:(B=h.default.mark((function e(){return h.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)})).constructor,R=p.default(h.default.mark((function e(){return h.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)}))).constructor,V=function(){}.constructor,G=Array.from(new Set(["GeneratorFunction","AsyncFunction","AsyncGeneratorFunction",B.name,B.displayName,R.name,R.displayName])).filter((function(e){return e&&e!==V.name&&e!==V.displayName})),function(e){if(!e)return!1;var n=e.constructor;return!!n&&(n.name&&G.includes(n.name)||n.displayName&&G.includes(n.displayName))}),setTimeout:function(e){function n(n,t){return e.apply(this,arguments)}return n.toString=function(){return e.toString()},n}((function(e,n){n=S(n);var t=performance.now(),r=setTimeout((function(){var n=performance.now();try{e((n-t)/1e3)}catch(e){console.error(e)}t=n}),n);return{remove:function(){null!==r&&(clearTimeout(r),r=null)}}})),setInterval:function(e){function n(n){return e.apply(this,arguments)}return n.toString=function(){return e.toString()},n}((function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(n=C(n,1e3),t)try{e(0)}catch(e){console.error(e)}var r=performance.now(),a=setInterval((function(){var n=performance.now();try{e((n-r)/1e3)}catch(e){console.error(e)}r=n}),n);return{remove:function(){null!==a&&(clearInterval(a),a=null)}}})),setAnimationFrameTimeout:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;n=M(n,1);var t=!0,r=null,a=performance.now();return function o(){if(t){if(n<=0){t=!1,r=null;var i=performance.now();try{e((i-a)/1e3)}catch(e){console.error(e)}return void(a=i)}n--,r="undefined"==typeof window?setTimeout(o,1e3/60):requestAnimationFrame(o)}}(),{remove:function(){t=!1,null!==r&&("undefined"==typeof window?clearTimeout(r):cancelAnimationFrame(r),r=null)}}},setAnimationFrameInterval:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(n=M(n,1),t)try{e(0)}catch(e){console.error(e)}var r=!0,a=null,o=performance.now(),i=n,u=function t(){if(r){if(i<=0){var u=performance.now();try{e((u-o)/1e3)}catch(e){console.error(e)}o=u,i=n}i--,r&&(a="undefined"==typeof window?setTimeout(t,1e3/60):requestAnimationFrame(t))}};return"undefined"==typeof window?setTimeout(u,1e3/60):requestAnimationFrame(u),{remove:function(){r=!1,null!==a&&("undefined"==typeof window?clearTimeout(a):cancelAnimationFrame(a),a=null)}}},promiseTimeout:function(e){return e=S(e),new Promise(e<=0?function(e){return e()}:function(n){return setTimeout(n,e)})},promiseAnimationFrameTimeout:function(e){return e=k(e),new Promise(e<=0?function(e){return e()}:function(n){return J.setAnimationFrameTimeout(n,e)})},platformIsMobile:function(){var e,n;if("undefined"==typeof window)return!1;var t=A((null===(e=window.navigator)||void 0===e?void 0:e.userAgent)||(null===(n=window.navigator)||void 0===n?void 0:n.vendor)||window.opera||""),r=t.substring(0,4);return!(!/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)&&!/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(r))},platformHasCursor:function(){var e;return"undefined"==typeof window||!(J.platformIsMobile()||null!==(e=window.matchMedia("(any-hover: none)"))&&void 0!==e&&e.matches)},capitalize:function(e){return(e=A(e).trim()).length<=0?e:e.charAt(0).toUpperCase()+e.slice(1)},endsWithAny:function(e,n){var t;e=A(e),t=Array.isArray(n)?n:A(n).split("");var r=!1;return J.each(t,(function(n){if(e.endsWith(A(n)))return r=!0,!1})),r},startsWithAny:function(e,n){var t;e=A(e),t=Array.isArray(n)?n:A(n).split("");var r=!1;return J.each(t,(function(n){if(e.startsWith(A(n)))return r=!0,!1})),r},trimEnd:function(e,n){var t;e=A(e),t=Array.isArray(n)?n:A(n).split("");for(var r=function(n){n=A(n),e.endsWith(n)&&(e=e.substring(0,e.length-n.length),a=!0)},a=!0;a;)a=!1,J.each(t,r);return e},trimStart:function(e,n){var t;e=A(e),t=Array.isArray(n)?n:A(n).split("");for(var r=function(n){n=A(n),e.startsWith(n)&&(e=e.substring(n.length),a=!0)},a=!0;a;)a=!1,J.each(t,r);return e},trim:function(e,n){return J.trimEnd(J.trimStart(e,n),n)},purgeSentence:function(e){return e=J.trimEnd(A(e).trim(),".: \r\n\t"),e+=J.endsWithAny(e,"!?;")?"":"."},purgeErrorMessage:function(e){var n,t=A("string"==typeof e?e:null!==(n=e.message)&&void 0!==n?n:JSON.stringify(e)).split("threw an error:");return t[t.length-1].trim()},generateNamePermutations:function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];var r=[];return(n=J.flattenArray(n).map((function(e){return A(e).trim().toLowerCase()})).filter((function(e){return e.length>0}))).length>0&&(r.push(n.join("")),r.push(n.map(J.capitalize).join(""))),n.length>1&&(r.push([n[0]].concat(n.slice(1).map(J.capitalize)).join("")),r.push(n.join("-")),r.push(n.join("_"))),r},increaseNumericStringByOne:function(e){if("string"!=typeof e)for(var n=(e=""+e).length-1;n>=0;n--){var t=e.charAt(n);if(t<"0"||t>"9")return"1"}if(""===e)return"1";for(var r=e.length-1;r>=0;r--){var a=e.charAt(r);if(a<"0"||a>"9")return"1";if(a<"9"){a++,e=e.substring(0,r)+a+e.substring(r+1);break}e=e.substring(0,r)+"0"+e.substring(r+1)}return"0"===e.charAt(0)&&(e="1"+e),e},uniqueId:(U=null,F={},P=function(e){for(var n=0===e?0:Math.ceil((Math.floor(Math.log2(e))+1)/8),t=new Uint8ClampedArray(n),r=e,a=n-1;a>=0;a--){var o=255&r;t[a]=o,r=Math.floor(r/256)}return t},D=function(){var e;try{if("number"!=typeof(e=(performance.timeOrigin||performance.timing.navigationStart)+performance.now()))throw new Error}catch(n){e=Date.now?Date.now():(new Date).getTime()}e=Math.round(e);var n=P(e),t=null;try{var r;t=null===(r=crypto)||void 0===r?void 0:r.randomUUID()}catch(e){}if(t)t=J.base64ToBytes(J.hexToBase64(t));else{var a=P((Math.random()+" ").substring(2,12).padEnd(10,"0")),o=P((Math.random()+" ").substring(2,12).padEnd(10,"0")),i=P((Math.random()+" ").substring(2,12).padEnd(10,"0")),u=P((Math.random()+" ").substring(2,12).padEnd(10,"0"));(t=new Uint8Array(a.length+o.length+i.length+u.length)).set(a,0),t.set(o,a.length),t.set(i,a.length+o.length),t.set(u,a.length+o.length+i.length)}var l=new Uint8Array(n.length+t.length);return l.set(n,0),l.set(t,n.length),{time:e,id:t=J.bytesToBase64(l).replaceAll("=","").replaceAll("+","-").replaceAll("/","_")}},function(){for(;;){var e=D();if(U!==e.time)return U=e.time,F=s.default({},e.id,!0),e.id;if(!0!==F[e.id])return F[e.id]=!0,e.id}}),timestamp:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if(w(e))e=S(e);else try{if("number"!=typeof(e=(performance.timeOrigin||performance.timing.navigationStart)+performance.now()))throw new Error}catch(n){e=Date.now?Date.now():(new Date).getTime()}var n=function(e){for(var n=0===e?0:Math.ceil((Math.floor(Math.log2(e))+1)/8),t=new Uint8ClampedArray(n),r=e,a=n-1;a>=0;a--){var o=255&r;t[a]=o,r=Math.floor(r/256)}return t}(e=Math.round(e));return J.bytesToBase64(n).replaceAll("=","").replaceAll("+","-").replaceAll("/","_")},getEmptyImageSrc:function(){return"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="},getPercentage:function(e,n){return e=S(e),(n=S(n))<=0?100:Math.max(0,Math.min(100,e/n*100))},getImagePixels:function(e){if(!document)return new Uint8ClampedArray;var n=document.createElement("canvas");document.body.appendChild(n);try{var t=n.getContext("2d"),r=Math.floor(e.width),a=Math.floor(e.height);return r<=0||a<=0?(n.width=1,n.height=1):(n.width=r,n.height=a,t.drawImage(e,0,0,n.width,n.height)),t.getImageData(0,0,n.width,n.height).data}finally{n.parentNode.removeChild(n)}},getColoredImage:function(e,n){if(!document)return J.getEmptyImageSrc();var t=document.createElement("canvas");document.body.appendChild(t);try{var r=t.getContext("2d"),a=Math.floor(e.width),o=Math.floor(e.height);return a<=0||o<=0?(t.width=1,t.height=1):(t.width=a,t.height=o,r.drawImage(e,0,0,t.width,t.height)),r.globalCompositeOperation="source-in",r.fillStyle=n,r.fillRect(0,0,t.width,t.height),t.toDataURL("image/png")}finally{t.parentNode.removeChild(t)}},rgbToHex:function(e){return"#"+e.map((function(e){var n=e.toString(16);return 1===n.length?"0"+n:n})).join("")},hexToRgb:function(e){for(var n=4===(e=e.replace(/[^0-9A-F]/gi,"")).length||8===e.length;e.length<6;)e=e.replace(/(.)/g,"$1$1");var t=e.match(/\w{2}/g).map((function(e){return parseInt(e,16)}));return[t[0],t[1],t[2]].concat(c.default(n?[t[3]]:[]))},rgbToHsl:function(e){var n,t,r=e[0]/255,a=e[1]/255,o=e[2]/255,i=Math.max(r,a,o),u=Math.min(r,a,o),l=(i+u)/2;if(i===u)n=t=0;else{var s=i-u;switch(t=l>.5?s/(2-i-u):s/(i+u),i){case r:n=(a-o)/s+(a<o?6:0);break;case a:n=(o-r)/s+2;break;case o:n=(r-a)/s+4}n/=6}return[n,t,l].concat(c.default(e.length>=4?[e[3]/255]:[]))},hslToRgb:(q=function(e,n,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?e+6*(n-e)*t:t<.5?n:t<2/3?e+(n-e)*(2/3-t)*6:e},function(e){var n,t,r,a=e[0],o=e[1],i=e[2];if(0===o)n=t=r=i;else{var u=i<.5?i*(1+o):i+o-i*o,l=2*i-u;n=q(l,u,a+1/3),t=q(l,u,a),r=q(l,u,a-1/3)}return[255*n,255*t,255*r].concat(c.default(e.length>=4?[255*e[3]]:[])).map((function(e){return Math.max(0,Math.min(255,Math.round(e)))}))}),rgbToLab:function(e){var n=e[0]/255,t=e[1]/255,r=e[2]/255,a=(.4124*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.3576*(t=t>.04045?Math.pow((t+.055)/1.055,2.4):t/12.92)+.1805*(r=r>.04045?Math.pow((r+.055)/1.055,2.4):r/12.92))/.95047,o=.2126*n+.7152*t+.0722*r,i=(.0193*n+.1192*t+.9505*r)/1.08883;return a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,[116*(o=o>.008856?Math.pow(o,1/3):7.787*o+16/116)-16,500*(a-o),200*(o-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))].concat(c.default(e.length>=4?[e[3]/255]:[]))},getDifferenceBetweenRgb:function(e,n){var t=J.rgbToLab(e),r=J.rgbToLab(n);return J.getDifferenceBetweenLab(t,r)},getDifferenceBetweenLab:function(e,n){var t=e[0]-n[0],r=e[1]-n[1],a=e[2]-n[2],o=Math.sqrt(e[1]*e[1]+e[2]*e[2]),i=o-Math.sqrt(n[1]*n[1]+n[2]*n[2]),u=r*r+a*a-i*i,l=t/1,c=i/(1+.045*o),s=(u=u<0?0:Math.sqrt(u))/(1+.015*o),f=l*l+c*c+s*s;return f<0?0:Math.sqrt(f)},getRgbOfGradient:function(e,n){n=Math.max(0,Math.min(100,S(n)));var t=null;if(J.each(e,(function(e,r){if(r=k(r),null===t)t=[r,Math.abs(n-r)];else{var a=Math.abs(n-r);a<t[1]&&(t=[r,a])}})),null===t)return null;t=t[0];var r=99999,a=-99999;if(J.each(e,(function(e,n){(n=k(n))<t&&n>a&&(a=n),n>t&&n<r&&(r=n)})),99999===r&&(r=null),-99999===a&&(a=null),null===r&&null===a||r===a)return e[t];if(null!==r&&null!==a?Math.abs(r-n)>Math.abs(n-a)?r=t:a=t:null===a?a=t:r=t,a>r){var o=r;r=a,a=o}var i=r-a,u=n-a;return J.getRgbBetween(e[a],e[r],u/i*100)},getRgbBetween:function(e,n,t){t=S(t);for(var r=Math.max(0,Math.min(1,t/100)),a=1-r,o=Math.min(e.length,n.length),i=[],u=0;u<o;u++)i.push(Math.max(0,Math.min(255,Math.round(e[u]*a+n[u]*r))));return i},btoa:function(e){function n(n){return e.apply(this,arguments)}return n.toString=function(){return e.toString()},n}((function(e){return"function"==typeof btoa?btoa(e):Buffer.from(e).toString("base64")})),atob:function(e){function n(n){return e.apply(this,arguments)}return n.toString=function(){return e.toString()},n}((function(e){return"function"==typeof atob?atob(e):Buffer.from(e,"base64").toString()})),utf8ToBase64:function(e){return J.btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,(function(e,n){return String.fromCharCode(parseInt(n,16))})))},base64ToUtf8:function(e){return decodeURIComponent(J.atob(e.trim()).split("").map((function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)})).join(""))},base64ToHex:function(e){return J.atob(e.trim()).split("").map((function(e){return("0"+e.charCodeAt(0).toString(16)).slice(-2)})).join("")},hexToBase64:function(e){return J.btoa(e.replace(/[^0-9A-F]/gi,"").match(/\w{2}/g).map((function(e){return String.fromCharCode(parseInt(e,16))})).join(""))},base64ToBytes:function(e){for(var n=J.atob(e.trim()),t=n.length,r=new Uint8Array(t),a=0;a<t;a++)r[a]=n.charCodeAt(a);return r},bytesToBase64:function(e){for(var n=new Uint8Array(e),t=n.byteLength,r="",a=0;a<t;a++)r+=String.fromCharCode(n[a]);return J.btoa(r)},downloadFile:function(e,n,t){var r=document.createElement("a");r.setAttribute("download","string"==typeof n?n:"file"),r.href="data:"+t+";base64,"+e,r.setAttribute("target","_blank"),r.click()},localStorageGet:function(e){if("undefined"!=typeof window){var n=window.localStorage.getItem("LeUtils_"+e);if("string"==typeof n)try{if(void 0!==(n=JSON.parse(n))["-"])return n["-"]}catch(e){}}},localStorageSet:function(e,n){"undefined"!=typeof window&&(void 0!==n?window.localStorage.setItem("LeUtils_"+e,JSON.stringify({"-":n})):window.localStorage.removeItem("LeUtils_"+e))},localStorageRemove:function(e){"undefined"!=typeof window&&window.localStorage.removeItem("LeUtils_"+e)},isCurrentHostPrivate:(L=null,N=!1,function(){if("undefined"==typeof window)return!1;var e=window.location.hostname;return L===e?N:(L=e,N=J.isGivenHostPrivate(L))}),isGivenHostPrivate:function(e){if("localhost"===(e=A(e).trim().toLowerCase())||"127.0.0.1"===e)return!0;if(!/^(\d{1,3}\.){3}\d{1,3}$/.test(e))return!1;var n=e.split(".");return"10"===n[0]||"172"===n[0]&&parseInt(n[1],10)>=16&&parseInt(n[1],10)<=31||"192"===n[0]&&"168"===n[1]},createTreeSet:function(e,n){n=n||J.compare,(e=e||[]).sort(n);var t=function(t){for(var r=0,a=e.length-1;r<=a;){var o=Math.floor((r+a)/2),i=e[o],u=n(i,t);if(u<0)r=o+1;else{if(!(u>0))return{found:!0,index:o,value:i};a=o-1}}return{found:!1,index:r,value:void 0}},r={getElements:function(){return e},getComparator:function(){return n},size:function(){return e.length},isEmpty:function(){return e.length<=0},contains:function(e){return t(e).found},first:function(){return e.length>0?e[0]:void 0},last:function(){return e.length>0?e[e.length-1]:void 0},pollFirst:function(){return e.length>0?e.splice(0,1)[0]:void 0},pollLast:function(){return e.length>0?e.splice(e.length-1,1)[0]:void 0},add:function(n){var r=t(n);r.found||e.splice(r.index,0,n)},addAll:function(e){J.each(e,r.add)},getEqualValue:function(e){var n=t(e);if(n.found)return n.value},getEqualValueOrAdd:function(n){var r=t(n);return r.found?r.value:(e.splice(r.index,0,n),n)}};return r},createTransactionalValue:function(e){return void 0===e&&(e=null),{value:e,changes:[]}},isTransactionalValueValid:function(e){return"object"===d.default(e)&&"value"in e&&"changes"in e&&Array.isArray(e.changes)},transactionalValueToString:function(e){if(!J.isTransactionalValueValid(e))return e+"";if(e.changes.length<=0)return""+e.value;for(var n=""+e.value,t=0;t<e.changes.length;t++)n+=" -> "+e.changes[t].value;return e.changes[e.changes.length-1].value+" ("+n+")"},transactionSetAndCommit:function(e,n){Y(e),void 0===n&&(n=null),e.value=n,e.changes=[]},transactionSetWithoutCommitting:function(e,n){Y(e),void 0===n&&(n=null);var t=J.uniqueId();return e.changes.push({id:t,value:n}),t},transactionCommitChange:function(e,n){Y(e);var t=H(e,n);return null!==t&&(e.value=t.value,e.changes.splice(0,t.index+1),!0)},transactionCancelChange:function(e,n){Y(e);var t=H(e,n);return null!==t&&(e.changes.splice(t.index,1),!0)},transactionIsChangeRelevant:function(e,n){return Y(e),null!==H(e,n)},transactionGetCommittedValue:function(e){return Y(e),e.value},transactionGetValue:function(e){return Y(e),e.changes.length<=0?e.value:e.changes[e.changes.length-1].value},createWorkerThread:function(e){var n=new Worker("/workers/"+e+".worker.js"),t={},r=function(e){delete t[e]};return n.onerror=function(n){console.error("Worker "+e+":",n)},n.onmessage=function(e){var n=e.data;if(null!=n&&n.id){var a=t[n.id];a&&(r(n.id),a(n))}},{worker:n,sendMessage:function(e,a){return new Promise((function(o,i){var u,l=J.uniqueId();!function(e,n){t[e]=n}(l,o),setTimeout((function(){r(l),i("timeout")}),null!==(u=null==a?void 0:a.timeout)&&void 0!==u?u:1e4),n.postMessage(function(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?O(Object(t),!0).forEach((function(n){s.default(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):O(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}({id:l},e))}))}}},sendWorkerMessage:(_={},function(e,n,t){return _[e]||(_[e]=J.createWorkerThread(e)),_[e].sendMessage(n,t)}),clone:function(e){return v.default(e,!0)},purgeEmail:function(e){return(e=A(e).trim().toLowerCase().replace(/\s/g,"")).includes("@")&&e.includes(".")?e:""},isFocusClear:(E=["text","search","email","number","password","tel","time","url","week","month","date","datetime-local"],function(){var e,n;return!("input"===(null===(e=document)||void 0===e||null===(e=e.activeElement)||void 0===e||null===(e=e.tagName)||void 0===e?void 0:e.toLowerCase())&&E.includes(null===(n=document)||void 0===n||null===(n=n.activeElement)||void 0===n||null===(n=n.type)||void 0===n?void 0:n.toLowerCase()))}),getUserLocale:(I=null,function(){return null===I&&(I=function(){if("undefined"==typeof window)return"en-US";var e=window.navigator.languages;if(!y(e)||e.length<=0)return"en-US";if((e=e.filter((function(e){return"string"==typeof e&&e.includes("-")&&"en-us"!==e.toLowerCase()}))).length<=0)return"en-US";var n=e.filter((function(e){return!e.toLowerCase().startsWith("en-")}));return n.length<=0?e[0]:n[0]}()),I}),getUserLocaleDateFormat:(j=null,function(){return null===j&&(j=function(){var e="/";if("undefined"!=typeof window&&"undefined"!=typeof Intl&&void 0!==Intl.DateTimeFormat){var n=new Intl.DateTimeFormat(J.getUserLocale()).format();n.includes("-")?e="-":(n.includes(". ")||n.includes("."))&&(e=".")}return"YYYY"+e+"MM"+e+"DD"}()),j})};exports.ARRAY=function(e){return y(e)?e:void 0!==e?[e]:[]},exports.FLOAT=x,exports.FLOAT_ANY=T,exports.FLOAT_LAX=S,exports.FLOAT_LAX_ANY=C,exports.INT=function(e){return Math.round(x(e))},exports.INT_ANY=function(){return Math.round(T.apply(void 0,arguments))},exports.INT_LAX=k,exports.INT_LAX_ANY=M,exports.ISSET=w,exports.IS_ARRAY=y,exports.IS_OBJECT=b,exports.LeUtils=J,exports.OBJECT=function(e){return b(e)?e:{}},exports.STRING=A,exports.STRING_ANY=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];for(var r=0,a=n;r<a.length;r++){var o=a[r];if(w(o))return""+o}return""};
14
2
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/fast-deep-equal/index.js","../node_modules/kind-of/index.js","../node_modules/shallow-clone/index.js","../node_modules/is-plain-object/index.js","../node_modules/isobject/index.js","../node_modules/clone-deep/index.js","src/LeTypes.js","src/LeUtils.js"],"sourcesContent":["'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","var toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n\n var type = typeof val;\n if (type === 'boolean') return 'boolean';\n if (type === 'string') return 'string';\n if (type === 'number') return 'number';\n if (type === 'symbol') return 'symbol';\n if (type === 'function') {\n return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n }\n\n if (isArray(val)) return 'array';\n if (isBuffer(val)) return 'buffer';\n if (isArguments(val)) return 'arguments';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n if (isRegexp(val)) return 'regexp';\n\n switch (ctorName(val)) {\n case 'Symbol': return 'symbol';\n case 'Promise': return 'promise';\n\n // Set, Map, WeakSet, WeakMap\n case 'WeakMap': return 'weakmap';\n case 'WeakSet': return 'weakset';\n case 'Map': return 'map';\n case 'Set': return 'set';\n\n // 8-bit typed arrays\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n // 16-bit typed arrays\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n\n // 32-bit typed arrays\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n }\n\n if (isGeneratorObj(val)) {\n return 'generator';\n }\n\n // Non-plain objects\n type = toString.call(val);\n switch (type) {\n case '[object Object]': return 'object';\n // iterators\n case '[object Map Iterator]': return 'mapiterator';\n case '[object Set Iterator]': return 'setiterator';\n case '[object String Iterator]': return 'stringiterator';\n case '[object Array Iterator]': return 'arrayiterator';\n }\n\n // other\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n if (Array.isArray) return Array.isArray(val);\n return val instanceof Array;\n}\n\nfunction isError(val) {\n return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function'\n && typeof val.getDate === 'function'\n && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n if (val instanceof RegExp) return true;\n return typeof val.flags === 'string'\n && typeof val.ignoreCase === 'boolean'\n && typeof val.multiline === 'boolean'\n && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n return typeof val.throw === 'function'\n && typeof val.return === 'function'\n && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n try {\n if (typeof val.length === 'number' && typeof val.callee === 'function') {\n return true;\n }\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n return val.constructor.isBuffer(val);\n }\n return false;\n}\n","/*!\n * shallow-clone <https://github.com/jonschlinkert/shallow-clone>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst valueOf = Symbol.prototype.valueOf;\nconst typeOf = require('kind-of');\n\nfunction clone(val, deep) {\n switch (typeOf(val)) {\n case 'array':\n return val.slice();\n case 'object':\n return Object.assign({}, val);\n case 'date':\n return new val.constructor(Number(val));\n case 'map':\n return new Map(val);\n case 'set':\n return new Set(val);\n case 'buffer':\n return cloneBuffer(val);\n case 'symbol':\n return cloneSymbol(val);\n case 'arraybuffer':\n return cloneArrayBuffer(val);\n case 'float32array':\n case 'float64array':\n case 'int16array':\n case 'int32array':\n case 'int8array':\n case 'uint16array':\n case 'uint32array':\n case 'uint8clampedarray':\n case 'uint8array':\n return cloneTypedArray(val);\n case 'regexp':\n return cloneRegExp(val);\n case 'error':\n return Object.create(val);\n default: {\n return val;\n }\n }\n}\n\nfunction cloneRegExp(val) {\n const flags = val.flags !== void 0 ? val.flags : (/\\w+$/.exec(val) || void 0);\n const re = new val.constructor(val.source, flags);\n re.lastIndex = val.lastIndex;\n return re;\n}\n\nfunction cloneArrayBuffer(val) {\n const res = new val.constructor(val.byteLength);\n new Uint8Array(res).set(new Uint8Array(val));\n return res;\n}\n\nfunction cloneTypedArray(val, deep) {\n return new val.constructor(val.buffer, val.byteOffset, val.length);\n}\n\nfunction cloneBuffer(val) {\n const len = val.length;\n const buf = Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : Buffer.from(len);\n val.copy(buf);\n return buf;\n}\n\nfunction cloneSymbol(val) {\n return valueOf ? Object(valueOf.call(val)) : {};\n}\n\n/**\n * Expose `clone`\n */\n\nmodule.exports = clone;\n","/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\n\nfunction isObjectObject(o) {\n return isObject(o) === true\n && Object.prototype.toString.call(o) === '[object Object]';\n}\n\nmodule.exports = function isPlainObject(o) {\n var ctor,prot;\n\n if (isObjectObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (typeof ctor !== 'function') return false;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObjectObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n};\n","/*!\n * isobject <https://github.com/jonschlinkert/isobject>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isObject(val) {\n return val != null && typeof val === 'object' && Array.isArray(val) === false;\n};\n","'use strict';\n\n/**\n * Module dependenices\n */\n\nconst clone = require('shallow-clone');\nconst typeOf = require('kind-of');\nconst isPlainObject = require('is-plain-object');\n\nfunction cloneDeep(val, instanceClone) {\n switch (typeOf(val)) {\n case 'object':\n return cloneObjectDeep(val, instanceClone);\n case 'array':\n return cloneArrayDeep(val, instanceClone);\n default: {\n return clone(val);\n }\n }\n}\n\nfunction cloneObjectDeep(val, instanceClone) {\n if (typeof instanceClone === 'function') {\n return instanceClone(val);\n }\n if (instanceClone || isPlainObject(val)) {\n const res = new val.constructor();\n for (let key in val) {\n res[key] = cloneDeep(val[key], instanceClone);\n }\n return res;\n }\n return val;\n}\n\nfunction cloneArrayDeep(val, instanceClone) {\n const res = new val.constructor(val.length);\n for (let i = 0; i < val.length; i++) {\n res[i] = cloneDeep(val[i], instanceClone);\n }\n return res;\n}\n\n/**\n * Expose `cloneDeep`\n */\n\nmodule.exports = cloneDeep;\n","const REGEX_ALL_NON_FLOAT_CHARACTERS = /[^0-9.\\-]/g;\n\n\n/**\n * Returns true if the value is set (not undefined and not null).\n *\n * @param {*} value\n * @returns {boolean}\n */\nexport const ISSET = (value) => (typeof value !== 'undefined') && (value !== null);\n\n\n/**\n * Returns true if the value is an array.\n *\n * @param {*} value\n * @returns {boolean}\n */\nexport const IS_ARRAY = (value) => Array.isArray(value);\n\n/**\n * Ensures the given value is an array (returns the value wrapped in an array if it's not).\n *\n * @param {*} value\n * @returns {*[]}\n */\nexport const ARRAY = (value) => IS_ARRAY(value) ? value : ((typeof value !== 'undefined') ? [value] : []);\n\n\n/**\n * Returns true if the value is an object.\n *\n * @param {*} value\n * @returns {boolean}\n */\nexport const IS_OBJECT = (value) => (typeof value === 'object') && (value !== null) && !Array.isArray(value);\n\n/**\n * Ensures the given value is an object (returns an empty object if it's not).\n *\n * @param value\n * @returns {object}\n */\nexport const OBJECT = (value) => IS_OBJECT(value) ? value : {};\n\n\n/**\n * Ensures the given value is a string (casts it to a string if it's not, null and undefined will return an empty string).\n *\n * @param {*} value\n * @returns {string}\n */\nexport const STRING = (value) => ISSET(value) ? ('' + value) : '';\n\n/**\n * Returns the first non-null non-undefined value as a string.\n *\n * @param {*} values\n * @returns {string}\n */\nexport const STRING_ANY = (...values) =>\n{\n\tfor(let value of values)\n\t{\n\t\tif(ISSET(value))\n\t\t{\n\t\t\treturn '' + value;\n\t\t}\n\t}\n\treturn '';\n};\n\n\n/**\n * Ensures the given value is an integer (attempts to cast it to an integer if it's not, null and undefined will return 0).\n *\n * @param {*} value\n * @returns {number}\n */\nexport const INT = (value) => Math.round(FLOAT(value));\n\n/**\n * Returns the first non-null non-undefined int-castable value as an integer.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const INT_ANY = (...values) => Math.round(FLOAT_ANY(...values));\n\n\n/**\n * Ensures the given value is a float (attempts to cast it to a float if it's not, null and undefined will return 0).\n *\n * @param {*} value\n * @returns {number}\n */\nexport const FLOAT = (value) =>\n{\n\tconst v = +value;\n\tif(!isNaN(v))\n\t{\n\t\treturn v;\n\t}\n\treturn 0;\n};\n\n/**\n * Returns the first non-null non-undefined float-castable value as a float.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const FLOAT_ANY = (...values) =>\n{\n\tfor(let value of values)\n\t{\n\t\tif(value !== null)\n\t\t{\n\t\t\tconst v = +value;\n\t\t\tif(!isNaN(v))\n\t\t\t{\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n};\n\n\n/**\n * Ensures the given value is an integer (attempts to cast it to an integer if it's not, null and undefined will return 0).\n * This version is less strict than INT, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} value\n * @returns {number}\n */\nexport const INT_LAX = (value) => Math.round(FLOAT_LAX(value));\n\n/**\n * Returns the first non-null non-undefined int-castable value as an integer.\n * This version is less strict than INT_ANY, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const INT_LAX_ANY = (...values) => Math.round(FLOAT_LAX_ANY(...values));\n\n\n/**\n * Ensures the given value is a float (attempts to cast it to a float if it's not, null and undefined will return 0).\n * This version is less strict than FLOAT, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} value\n * @returns {number}\n */\nexport const FLOAT_LAX = (value) =>\n{\n\tconst v = (typeof value === 'number') ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));\n\tif(!isNaN(v))\n\t{\n\t\treturn v;\n\t}\n\treturn 0;\n};\n\n/**\n * Returns the first non-null non-undefined float-castable value as a float.\n * This version is less strict than FLOAT_ANY, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const FLOAT_LAX_ANY = (...values) =>\n{\n\tfor(let value of values)\n\t{\n\t\tif(value !== null)\n\t\t{\n\t\t\tconst v = (typeof value === 'number') ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));\n\t\t\tif(!isNaN(v))\n\t\t\t{\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n};\n","import FastDeepEqual from 'fast-deep-equal';\nimport CloneDeep from 'clone-deep';\nimport {ISSET, IS_OBJECT, IS_ARRAY, STRING, INT_LAX, FLOAT_LAX, INT_LAX_ANY, FLOAT_LAX_ANY} from './LeTypes.js';\n\n\n/**\n * @param {LeUtils~TransactionalValue} transactionalValue\n */\nconst checkTransactionalValue = (transactionalValue) =>\n{\n\tif(!LeUtils.isTransactionalValueValid(transactionalValue))\n\t{\n\t\tconsole.error('The given value is not a valid TransactionalValue:');\n\t\tconsole.error(transactionalValue);\n\t\tthrow new Error('The given value is not a valid TransactionalValue');\n\t}\n};\n\n/**\n * @param {LeUtils~TransactionalValue} transactionalValue\n * @param {string} changeId\n * @returns {{index:number, value:*}|null}\n */\nconst findTransactionalValueChange = (transactionalValue, changeId) =>\n{\n\tfor(let i = 0; i < transactionalValue.changes.length; i++)\n\t{\n\t\tconst change = transactionalValue.changes[i];\n\t\tif(change.id === changeId)\n\t\t{\n\t\t\treturn {index:i, value:change.value};\n\t\t}\n\t}\n\treturn null;\n};\n\n\nexport const LeUtils = {\n\t/**\n\t * A deep equals implementation (npm package \"fast-deep-equal\").\n\t *\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns true if the values are equivalent.\n\t */\n\tequals:FastDeepEqual,\n\t\n\t/**\n\t * Parses the given version string, and returns an object with the major, minor, and patch numbers, as well as some comparison functions.\n\t *\n\t * Expects a version string such as:\n\t * - \"1\"\n\t * - \"1.2\"\n\t * - \"1.2.3\"\n\t * - \"1.2.3 anything\"\n\t * - \"1.2.3-anything\"\n\t *\n\t * @param {string|*} versionString\n\t * @returns {{major: (number), minor: (number), patch: (number), toString: (function(): string), equals: (function(string|*): boolean), smallerThan: (function(string|*): boolean), smallerThanOrEquals: (function(string|*): boolean), largerThan: (function(string|*): boolean), largerThanOrEquals: (function(string|*): boolean)}}\n\t */\n\tparseVersionString:\n\t\t(versionString) =>\n\t\t{\n\t\t\tif(IS_OBJECT(versionString) && ISSET(versionString?.major) && ISSET(versionString?.minor) && ISSET(versionString?.patch))\n\t\t\t{\n\t\t\t\treturn versionString;\n\t\t\t}\n\t\t\t\n\t\t\tversionString = STRING(versionString).trim();\n\t\t\tconst partsVersion = versionString.split(' ')[0].split('-')[0].split('.');\n\t\t\tconst major = INT_LAX(partsVersion[0]);\n\t\t\tconst minor = INT_LAX(partsVersion[1]);\n\t\t\tconst patch = INT_LAX(partsVersion[2]);\n\t\t\t\n\t\t\tconst THIS = {\n\t\t\t\tmajor:major,\n\t\t\t\tminor:minor,\n\t\t\t\tpatch:patch,\n\t\t\t\t\n\t\t\t\ttoString:\n\t\t\t\t\t() => major + '.' + minor + '.' + patch,\n\t\t\t\t\n\t\t\t\tequals:\n\t\t\t\t\t(otherVersion) =>\n\t\t\t\t\t{\n\t\t\t\t\t\totherVersion = LeUtils.parseVersionString(otherVersion);\n\t\t\t\t\t\treturn (major === otherVersion.major) && (minor === otherVersion.minor) && (patch === otherVersion.patch);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\tlargerThan:\n\t\t\t\t\t(otherVersion) =>\n\t\t\t\t\t{\n\t\t\t\t\t\totherVersion = LeUtils.parseVersionString(otherVersion);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(major > otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(major < otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(minor > otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(minor < otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn (patch > otherVersion.patch);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\tlargerThanOrEquals:\n\t\t\t\t\t(otherVersion) =>\n\t\t\t\t\t{\n\t\t\t\t\t\totherVersion = LeUtils.parseVersionString(otherVersion);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(major > otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(major < otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(minor > otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(minor < otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn (patch >= otherVersion.patch);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\tsmallerThan:\n\t\t\t\t\t(otherVersion) => !THIS.largerThanOrEquals(otherVersion),\n\t\t\t\t\n\t\t\t\tsmallerThanOrEquals:\n\t\t\t\t\t(otherVersion) => !THIS.largerThan(otherVersion),\n\t\t\t};\n\t\t\treturn THIS;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains the given value.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {*} value\n\t * @returns {boolean}\n\t */\n\tcontains:\n\t\t(array, value) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tvalue = STRING(value);\n\t\t\tLeUtils.each(array, (val) =>\n\t\t\t{\n\t\t\t\tif(STRING(val) === value)\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains the given value.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {*} value\n\t * @returns {boolean}\n\t */\n\tcontainsCaseInsensitive:\n\t\t(array, value) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tvalue = STRING(value).toLowerCase();\n\t\t\tLeUtils.each(array, (val) =>\n\t\t\t{\n\t\t\t\tif(STRING(val).toLowerCase() === value)\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains all the given values.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAll:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(!LeUtils.contains(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains all the given values.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAllCaseInsensitive:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(!LeUtils.containsCaseInsensitive(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains any of the given values.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAny:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.contains(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains any of the given values.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAnyCaseInsensitive:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.containsCaseInsensitive(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains none of the given values.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsNone:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.contains(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains none of the given values.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsNoneCaseInsensitive:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.containsCaseInsensitive(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__eachCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through each element in the given array or object, and calls the callback for each element.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__eachCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|Function}\n\t */\n\teach:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) === false)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) === false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.each() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn elements;\n\t\t},\n\t\n\t/**\n\t * Like LeUtils.each(), except that it expects an async callback.\n\t *\n\t * @param {*[]|object|function} elements\n\t * @param {LeUtils~__eachCallback} asyncCallback\n\t * @param {number} [optionalParallelCount]\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|function}\n\t */\n\teachAsync:\n\t\t(() =>\n\t\t{\n\t\t\tconst eachAsyncParallel = async (elements, asyncCallback, optionalParallelCount, optionalSkipHasOwnPropertyCheck) =>\n\t\t\t{\n\t\t\t\tlet promises = [];\n\t\t\t\tlet doBreak = false;\n\t\t\t\tawait LeUtils.eachAsync(elements, async (element, index) =>\n\t\t\t\t{\n\t\t\t\t\twhile(promises.length > optionalParallelCount)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet newPromises = [];\n\t\t\t\t\t\tLeUtils.each(promises, (promise) =>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(!promise.__lowentry_utils__promise_is_done__)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnewPromises.push(promise);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tpromises = newPromises;\n\t\t\t\t\t\tif(promises.length > optionalParallelCount)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tawait Promise.any(promises);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(doBreak)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tconst promise = (async () =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif((await asyncCallback.call(element, element, index)) === false)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdoBreak = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpromise.__lowentry_utils__promise_is_done__ = true;\n\t\t\t\t\t})();\n\t\t\t\t\tpromises.push(promise);\n\t\t\t\t}, optionalSkipHasOwnPropertyCheck);\n\t\t\t\tawait Promise.all(promises);\n\t\t\t\treturn elements;\n\t\t\t};\n\t\t\t\n\t\t\treturn async (elements, asyncCallback, parallelCount = 1, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t\t{\n\t\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t\t{\n\t\t\t\t\tparallelCount = INT_LAX(parallelCount);\n\t\t\t\t\tif(parallelCount > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn await eachAsyncParallel(elements, asyncCallback, parallelCount, optionalSkipHasOwnPropertyCheck);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif((await asyncCallback.call(elements[index], elements[index], index)) === false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif((await asyncCallback.call(elements[index], elements[index], index)) === false)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tconsole.warn('Executed LeUtils.eachAsync() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn elements;\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * @callback LeUtils~__filterCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array or object, with only the elements that didn't return false from the callback.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__filterCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|Function}\n\t */\n\tfilter:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) !== false)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.push(elements[index]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tlet result = {};\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) !== false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tresult[index] = elements[index];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.filter() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn elements;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__mapCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array or object, with the elements that were returned from the callback.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__mapCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|Function}\n\t */\n\tmap:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult[index] = callback.call(elements[index], elements[index], index);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tlet result = {};\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult[index] = callback.call(elements[index], elements[index], index);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.map() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn elements;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__mapToArrayCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array, with the elements that were returned from the callback. Always returns an array.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__mapToArrayCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]}\n\t */\n\tmapToArray:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tlet result = [];\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult.push(callback.call(elements[index], elements[index], index));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.push(callback.call(elements[index], elements[index], index));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.mapToArray() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__mapToArraySortedCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array, with the elements that were returned from the callback. The elements will be sorted by the result from the given comparator. Always returns an array.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__sortKeysComparatorCallback} comparator\n\t * @param {LeUtils~__mapToArraySortedCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]}\n\t */\n\tmapToArraySorted:\n\t\t(elements, comparator, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tconst keys = LeUtils.sortKeys(elements, comparator, optionalSkipHasOwnPropertyCheck);\n\t\t\tlet result = [];\n\t\t\tfor(let i = 0; i < keys.length; i++)\n\t\t\t{\n\t\t\t\tresult.push(callback.call(elements[keys[i]], elements[keys[i]], keys[i]));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__sortKeysComparatorCallback\n\t * @param {*} elementA\n\t * @param {*} elementB\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array, with the keys from the given elements, sorted by the result from the given comparator. Always returns an array.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__sortKeysComparatorCallback} comparator\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]}\n\t */\n\tsortKeys:\n\t\t(elements, comparator, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tkeys.push(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeys.push(index);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.sortKeys() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\tkeys.sort((a, b) => comparator(elements[a], elements[b]));\n\t\t\treturn keys;\n\t\t},\n\t\n\t/**\n\t * Turns the given value(s) into a 1 dimensional array.\n\t *\n\t * Does the same thing as Array.flat(Infinity).\n\t *\n\t * @param {*} array\n\t * @returns {*[]}\n\t */\n\tflattenArray:\n\t\t(() =>\n\t\t{\n\t\t\tconst flattenArrayRecursive = (result, array) =>\n\t\t\t{\n\t\t\t\tif(!Array.isArray(array))\n\t\t\t\t{\n\t\t\t\t\tresult.push(array);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tarray.forEach((entry) =>\n\t\t\t\t{\n\t\t\t\t\tflattenArrayRecursive(result, entry);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\treturn (array) =>\n\t\t\t{\n\t\t\t\tif(!Array.isArray(array))\n\t\t\t\t{\n\t\t\t\t\treturn [array];\n\t\t\t\t}\n\t\t\t\tlet result = [];\n\t\t\t\tarray.forEach((entry) =>\n\t\t\t\t{\n\t\t\t\t\tflattenArrayRecursive(result, entry);\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Compares two values. Primarily used for sorting.\n\t *\n\t * @param {*} a\n\t * @param {*} b\n\t * @returns {number}\n\t */\n\tcompare:\n\t\t(a, b) => (a < b) ? -1 : ((a > b) ? 1 : 0),\n\t\n\t/**\n\t * Compares two numbers. Primarily used for sorting.\n\t *\n\t * @param {number} a\n\t * @param {number} b\n\t * @returns {number}\n\t */\n\tcompareNumbers:\n\t\t(a, b) => a - b,\n\t\n\t/**\n\t * Compares two numeric strings. Primarily used for sorting.\n\t *\n\t * @param {string|number} a\n\t * @param {string|number} b\n\t * @returns {number}\n\t */\n\tcompareNumericStrings:\n\t\t(a, b) =>\n\t\t{\n\t\t\ta = STRING(a).trim();\n\t\t\tb = STRING(b).trim();\n\t\t\tif(a.length === b.length)\n\t\t\t{\n\t\t\t\treturn (a < b) ? -1 : ((a > b) ? 1 : 0);\n\t\t\t}\n\t\t\treturn (a.length < b.length) ? -1 : 1;\n\t\t},\n\t\n\t/**\n\t * Compares two strings generated by LeUtils.timestamp(). Primarily used for sorting.\n\t *\n\t * @param {string} a\n\t * @param {string} b\n\t * @returns {number}\n\t */\n\tcompareTimestampStrings:\n\t\t(a, b) =>\n\t\t{\n\t\t\ta = LeUtils.base64ToHex(STRING(a).replaceAll('-', '+').replaceAll('_', '/'));\n\t\t\tb = LeUtils.base64ToHex(STRING(b).replaceAll('-', '+').replaceAll('_', '/'));\n\t\t\treturn LeUtils.compare(a, b);\n\t\t},\n\t\n\t/**\n\t * Returns true if the given object is empty, false otherwise.\n\t *\n\t * @param {object} obj\n\t * @param [optionalSkipHasOwnPropertyCheck]\n\t * @returns {boolean}\n\t */\n\tisEmptyObject:\n\t\t(obj, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tfor(let field in obj)\n\t\t\t{\n\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(obj, field))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\n\t/**\n\t * Returns the number of fields in the given object.\n\t *\n\t * @param {object} obj\n\t * @param [optionalSkipHasOwnPropertyCheck]\n\t * @returns {number}\n\t */\n\tgetObjectFieldsCount:\n\t\t(obj, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tlet count = 0;\n\t\t\tfor(let field in obj)\n\t\t\t{\n\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(obj, field))\n\t\t\t\t{\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\t\n\t/**\n\t * Returns true if the given function is a generator function (like: \"function* (){}\"), returns false otherwise.\n\t *\n\t * @param {Function} func\n\t * @returns {boolean}\n\t */\n\tisGeneratorFunction:\n\t\t(() =>\n\t\t{\n\t\t\tconst GeneratorFunction = function* ()\n\t\t\t{\n\t\t\t}.constructor;\n\t\t\t\n\t\t\tconst AsyncGeneratorFunction = async function* ()\n\t\t\t{\n\t\t\t}.constructor;\n\t\t\t\n\t\t\tconst RegularFunction = function()\n\t\t\t{\n\t\t\t}.constructor;\n\t\t\t\n\t\t\tconst PossibleGeneratorFunctionNames = Array.from(new Set(['GeneratorFunction', 'AsyncFunction', 'AsyncGeneratorFunction', GeneratorFunction.name, GeneratorFunction.displayName, AsyncGeneratorFunction.name, AsyncGeneratorFunction.displayName])).filter((element) =>\n\t\t\t{\n\t\t\t\treturn (element && (element !== RegularFunction.name) && (element !== RegularFunction.displayName));\n\t\t\t});\n\t\t\t\n\t\t\treturn (func) =>\n\t\t\t{\n\t\t\t\tif(!func)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst constructor = func.constructor;\n\t\t\t\tif(!constructor)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn ((constructor.name && PossibleGeneratorFunctionNames.includes(constructor.name)) || (constructor.displayName && PossibleGeneratorFunctionNames.includes(constructor.displayName)));\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * @callback LeUtils~__setTimeoutCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback after the given number of milliseconds. Passes the elapsed time in seconds to the callback.\n\t *\n\t * To cancel the timeout, call remove() on the result of this function (example: \"const timeoutHandler = LeUtils.setTimeout((deltaTime)=>{}, 1000); timeoutHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setTimeoutCallback} callback ([number] deltaTime)\n\t * @param {number} ms\n\t * @returns {{remove:Function}}\n\t */\n\tsetTimeout:\n\t\t(callback, ms) =>\n\t\t{\n\t\t\tms = FLOAT_LAX(ms);\n\t\t\t\n\t\t\tlet lastTime = performance.now();\n\t\t\tlet handler = setTimeout(() =>\n\t\t\t{\n\t\t\t\tconst currentTime = performance.now();\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t\tlastTime = currentTime;\n\t\t\t}, ms);\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif(handler !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclearTimeout(handler);\n\t\t\t\t\t\t\thandler = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__setIntervalCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback every given number of milliseconds. Passes the time difference in seconds between the last frame and now to it.\n\t *\n\t * To remove the interval, call remove() on the result of this function (example: \"const intervalHandler = LeUtils.setInterval((deltaTime)=>{}, 1000); intervalHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setIntervalCallback} callback ([number] deltaTime)\n\t * @param {number} [intervalMs]\n\t * @param {boolean} [fireImmediately]\n\t * @returns {{remove:Function}}\n\t */\n\tsetInterval:\n\t\t(callback, intervalMs = 1000, fireImmediately = false) =>\n\t\t{\n\t\t\tintervalMs = FLOAT_LAX_ANY(intervalMs, 1000);\n\t\t\t\n\t\t\tif(fireImmediately)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback(0);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet lastTime = performance.now();\n\t\t\tlet handler = setInterval(() =>\n\t\t\t{\n\t\t\t\tconst currentTime = performance.now();\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t\tlastTime = currentTime;\n\t\t\t}, intervalMs);\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif(handler !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclearInterval(handler);\n\t\t\t\t\t\t\thandler = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__setAnimationFrameTimeoutCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback after the given number of frames. Passes the elapsed time in seconds to the callback.\n\t *\n\t * To cancel the timeout, call remove() on the result of this function (example: \"const timeoutHandler = LeUtils.setAnimationFrameTimeout((deltaTime){}, 5); timeoutHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setAnimationFrameTimeoutCallback} callback ([number] deltaTime)\n\t * @param {number} [frames]\n\t * @returns {{remove:Function}}\n\t */\n\tsetAnimationFrameTimeout:\n\t\t(callback, frames = 1) =>\n\t\t{\n\t\t\tframes = INT_LAX_ANY(frames, 1);\n\t\t\t\n\t\t\tlet run = true;\n\t\t\tlet requestAnimationFrameId = null;\n\t\t\tlet lastTime = performance.now();\n\t\t\tconst tick = () =>\n\t\t\t{\n\t\t\t\tif(run)\n\t\t\t\t{\n\t\t\t\t\tif(frames <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\trun = false;\n\t\t\t\t\t\trequestAnimationFrameId = null;\n\t\t\t\t\t\tconst currentTime = performance.now();\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(e)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastTime = currentTime;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tframes--;\n\t\t\t\t\trequestAnimationFrameId = (typeof window === 'undefined') ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);\n\t\t\t\t}\n\t\t\t};\n\t\t\ttick();\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\trun = false;\n\t\t\t\t\t\tif(requestAnimationFrameId !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t(typeof window === 'undefined') ? clearTimeout(requestAnimationFrameId) : cancelAnimationFrame(requestAnimationFrameId);\n\t\t\t\t\t\t\trequestAnimationFrameId = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__setAnimationFrameIntervalCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback every given number of frames. Passes the time difference in seconds between the last frame and now to it.\n\t *\n\t * To remove the interval, call remove() on the result of this function (example: \"const intervalHandler = LeUtils.setAnimationFrameInterval((deltaTime)=>{}, 5); intervalHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setAnimationFrameIntervalCallback} callback ([number] deltaTime)\n\t * @param {number} [intervalFrames]\n\t * @param {boolean} [fireImmediately]\n\t * @returns {{remove:Function}}\n\t */\n\tsetAnimationFrameInterval:\n\t\t(callback, intervalFrames = 1, fireImmediately = false) =>\n\t\t{\n\t\t\tintervalFrames = INT_LAX_ANY(intervalFrames, 1);\n\t\t\t\n\t\t\tif(fireImmediately)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback(0);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet run = true;\n\t\t\tlet requestAnimationFrameId = null;\n\t\t\tlet lastTime = performance.now();\n\t\t\tlet frames = intervalFrames;\n\t\t\tconst tick = () =>\n\t\t\t{\n\t\t\t\tif(run)\n\t\t\t\t{\n\t\t\t\t\tif(frames <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet currentTime = performance.now();\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(e)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastTime = currentTime;\n\t\t\t\t\t\tframes = intervalFrames;\n\t\t\t\t\t}\n\t\t\t\t\tframes--;\n\t\t\t\t\t\n\t\t\t\t\tif(run)\n\t\t\t\t\t{\n\t\t\t\t\t\trequestAnimationFrameId = (typeof window === 'undefined') ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t(typeof window === 'undefined') ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\trun = false;\n\t\t\t\t\t\tif(requestAnimationFrameId !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t(typeof window === 'undefined') ? clearTimeout(requestAnimationFrameId) : cancelAnimationFrame(requestAnimationFrameId);\n\t\t\t\t\t\t\trequestAnimationFrameId = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * Returns a promise, which will be resolved after the given number of milliseconds.\n\t *\n\t * @param {number} ms\n\t * @returns {Promise}\n\t */\n\tpromiseTimeout:\n\t\t(ms) =>\n\t\t{\n\t\t\tms = FLOAT_LAX(ms);\n\t\t\tif(ms <= 0)\n\t\t\t{\n\t\t\t\treturn new Promise(resolve => resolve());\n\t\t\t}\n\t\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t\t},\n\t\n\t/**\n\t * Returns a promise, which will be resolved after the given number of frames.\n\t *\n\t * @param {number} frames\n\t * @returns {Promise}\n\t */\n\tpromiseAnimationFrameTimeout:\n\t\t(frames) =>\n\t\t{\n\t\t\tframes = INT_LAX(frames);\n\t\t\tif(frames <= 0)\n\t\t\t{\n\t\t\t\treturn new Promise(resolve => resolve());\n\t\t\t}\n\t\t\treturn new Promise(resolve => LeUtils.setAnimationFrameTimeout(resolve, frames));\n\t\t},\n\t\n\t/**\n\t * Returns true if the user is on a smartphone device (mobile).\n\t * Will return false if the user is on a tablet or on a desktop.\n\t *\n\t * In short:\n\t * - Mobile: True\n\t * - Tablet: False\n\t * - Desktop: False\n\t *\n\t * @returns {boolean}\n\t */\n\tplatformIsMobile:\n\t\t() =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// noinspection JSDeprecatedSymbols, JSUnresolvedReference\n\t\t\t/** navigator.userAgentData.mobile doesn't return the correct value on some platforms, so this is a work-around, code from: http://detectmobilebrowsers.com **/\n\t\t\tconst a = STRING(window.navigator?.userAgent || window.navigator?.vendor || window.opera || '');\n\t\t\tconst b = a.substring(0, 4);\n\t\t\treturn !!(\n\t\t\t\t/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series([46])0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i\n\t\t\t\t\t.test(a) ||\n\t\t\t\t/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \\-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i\n\t\t\t\t\t.test(b)\n\t\t\t);\n\t\t},\n\t\n\t/**\n\t * Returns true if the user has a cursor (mouse, touchpad, etc).\n\t * In this context, a cursor is defined as an input device that can hover over elements without necessarily interacting with them.\n\t *\n\t * @returns {boolean}\n\t */\n\tplatformHasCursor:\n\t\t() =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !LeUtils.platformIsMobile() && !window.matchMedia('(any-hover: none)')?.matches;\n\t\t},\n\t\n\t/**\n\t * Returns the given string, with the first character capitalized.\n\t *\n\t * @param {String} string\n\t * @returns {string}\n\t */\n\tcapitalize:\n\t\t(string) =>\n\t\t{\n\t\t\tstring = STRING(string).trim();\n\t\t\tif(string.length <= 0)\n\t\t\t{\n\t\t\t\treturn string;\n\t\t\t}\n\t\t\treturn string.charAt(0).toUpperCase() + string.slice(1);\n\t\t},\n\t\n\t/**\n\t * Returns true if the given string ends with any of the given characters or words.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} endingCharsStringOrArray\n\t * @returns {boolean}\n\t */\n\tendsWithAny:\n\t\t(string, endingCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet endingCharsArray;\n\t\t\tif(Array.isArray(endingCharsStringOrArray))\n\t\t\t{\n\t\t\t\tendingCharsArray = endingCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tendingCharsArray = STRING(endingCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(endingCharsArray, (chars) =>\n\t\t\t{\n\t\t\t\tif(string.endsWith(STRING(chars)))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the given string starts with any of the given characters or words.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} startingCharsStringOrArray\n\t * @returns {boolean}\n\t */\n\tstartsWithAny:\n\t\t(string, startingCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet startingCharsArray;\n\t\t\tif(Array.isArray(startingCharsStringOrArray))\n\t\t\t{\n\t\t\t\tstartingCharsArray = startingCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstartingCharsArray = STRING(startingCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(startingCharsArray, (chars) =>\n\t\t\t{\n\t\t\t\tif(string.startsWith(STRING(chars)))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Trims the end of the given string, by removing the given characters from it.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} trimCharsStringOrArray\n\t */\n\ttrimEnd:\n\t\t(string, trimCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet endingCharsArray;\n\t\t\tif(Array.isArray(trimCharsStringOrArray))\n\t\t\t{\n\t\t\t\tendingCharsArray = trimCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tendingCharsArray = STRING(trimCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tconst trimChars = (chars) =>\n\t\t\t{\n\t\t\t\tchars = STRING(chars);\n\t\t\t\tif(string.endsWith(chars))\n\t\t\t\t{\n\t\t\t\t\tstring = string.substring(0, string.length - chars.length);\n\t\t\t\t\trun = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet run = true;\n\t\t\twhile(run)\n\t\t\t{\n\t\t\t\trun = false;\n\t\t\t\tLeUtils.each(endingCharsArray, trimChars);\n\t\t\t}\n\t\t\treturn string;\n\t\t},\n\t\n\t/**\n\t * Trims the start of the given string, by removing the given characters from it.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} trimCharsStringOrArray\n\t */\n\ttrimStart:\n\t\t(string, trimCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet startingCharsArray;\n\t\t\tif(Array.isArray(trimCharsStringOrArray))\n\t\t\t{\n\t\t\t\tstartingCharsArray = trimCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstartingCharsArray = STRING(trimCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tconst trimChars = (chars) =>\n\t\t\t{\n\t\t\t\tchars = STRING(chars);\n\t\t\t\tif(string.startsWith(chars))\n\t\t\t\t{\n\t\t\t\t\tstring = string.substring(chars.length);\n\t\t\t\t\trun = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet run = true;\n\t\t\twhile(run)\n\t\t\t{\n\t\t\t\trun = false;\n\t\t\t\tLeUtils.each(startingCharsArray, trimChars);\n\t\t\t}\n\t\t\treturn string;\n\t\t},\n\t\n\t/**\n\t * Trims the start and end of the given string, by removing the given characters from it.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} trimCharsStringOrArray\n\t */\n\ttrim:\n\t\t(string, trimCharsStringOrArray) => LeUtils.trimEnd(LeUtils.trimStart(string, trimCharsStringOrArray), trimCharsStringOrArray),\n\t\n\t/**\n\t * Returns the given string, trims the start and end, and makes sure it ends with a valid sentence ending character (such as !?;.).\n\t *\n\t * @param {string} sentence\n\t * @returns {string}\n\t */\n\tpurgeSentence:\n\t\t(sentence) =>\n\t\t{\n\t\t\tsentence = LeUtils.trimEnd(STRING(sentence).trim(), '.: \\r\\n\\t');\n\t\t\tsentence += (LeUtils.endsWithAny(sentence, '!?;') ? '' : '.');\n\t\t\treturn sentence;\n\t\t},\n\t\n\t/**\n\t * Attempts to obtain and return an error message from the given error, regardless of what is passed to this function.\n\t *\n\t * @param {*} error\n\t * @returns {string}\n\t */\n\tpurgeErrorMessage:\n\t\t(error) =>\n\t\t{\n\t\t\tconst message = STRING(((typeof error === 'string') ? error : (error.message ?? JSON.stringify(error))));\n\t\t\tconst messageParts = message.split('threw an error:');\n\t\t\treturn messageParts[messageParts.length - 1].trim();\n\t\t},\n\t\n\t/**\n\t * Generates all permutations of the given names.\n\t *\n\t * For example, if you pass \"foo\" and \"bar\", it will return:\n\t * - foobar\n\t * - fooBar\n\t * - FooBar\n\t * - foo-bar\n\t * - foo_bar\n\t *\n\t * @param {string} names\n\t * @returns {string[]}\n\t */\n\tgenerateNamePermutations:\n\t\t(...names) =>\n\t\t{\n\t\t\tnames = LeUtils.flattenArray(names)\n\t\t\t\t.map(name => STRING(name).trim().toLowerCase())\n\t\t\t\t.filter(name => (name.length > 0));\n\t\t\tlet results = [];\n\t\t\tif(names.length > 0)\n\t\t\t{\n\t\t\t\tresults.push(names.join('')); //foobar\n\t\t\t\tresults.push(names.map(LeUtils.capitalize).join('')); //FooBar\n\t\t\t}\n\t\t\tif(names.length > 1)\n\t\t\t{\n\t\t\t\tresults.push([names[0]].concat(names.slice(1).map(LeUtils.capitalize)).join('')); //fooBar\n\t\t\t\tresults.push(names.join('-')); //foo-bar\n\t\t\t\tresults.push(names.join('_')); //foo_bar\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\t\n\t/**\n\t * Increases the given numeric string by 1, this allows you to increase a numeric string without a limit.\n\t *\n\t * @param {string} string\n\t * @returns {string}\n\t */\n\tincreaseNumericStringByOne:\n\t\t(string) =>\n\t\t{\n\t\t\tif(typeof string !== 'string')\n\t\t\t{\n\t\t\t\tstring = '' + string;\n\t\t\t\tfor(let i = string.length - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tconst c = string.charAt(i);\n\t\t\t\t\tif((c < '0') || (c > '9'))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn '1';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(string === '')\n\t\t\t{\n\t\t\t\treturn '1';\n\t\t\t}\n\t\t\tfor(let i = string.length - 1; i >= 0; i--)\n\t\t\t{\n\t\t\t\tlet c = string.charAt(i);\n\t\t\t\tif((c < '0') || (c > '9'))\n\t\t\t\t{\n\t\t\t\t\treturn '1';\n\t\t\t\t}\n\t\t\t\tif(c < '9')\n\t\t\t\t{\n\t\t\t\t\tc++;\n\t\t\t\t\tstring = string.substring(0, i) + c + string.substring(i + 1);// string[i] = (char + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tstring = string.substring(0, i) + '0' + string.substring(i + 1);// string[i] = '0';\n\t\t\t}\n\t\t\tif(string.charAt(0) === '0')\n\t\t\t{\n\t\t\t\tstring = '1' + string;\n\t\t\t}\n\t\t\treturn string;\n\t\t},\n\t\n\t/**\n\t * Generates a base64 string (with +/ replaced by -_) that is guaranteed to be unique.\n\t *\n\t * @returns {string}\n\t */\n\tuniqueId:\n\t\t(() =>\n\t\t{\n\t\t\tlet previousUniqueIdsTime = null;\n\t\t\tlet previousUniqueIds = {};\n\t\t\t\n\t\t\tconst numberToBytes = (number) =>\n\t\t\t{\n\t\t\t\tconst size = (number === 0) ? 0 : Math.ceil((Math.floor(Math.log2(number)) + 1) / 8);\n\t\t\t\tconst bytes = new Uint8ClampedArray(size);\n\t\t\t\tlet x = number;\n\t\t\t\tfor(let i = (size - 1); i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tconst rightByte = x & 0xff;\n\t\t\t\t\tbytes[i] = rightByte;\n\t\t\t\t\tx = Math.floor(x / 0x100);\n\t\t\t\t}\n\t\t\t\treturn bytes;\n\t\t\t};\n\t\t\t\n\t\t\tconst generateUniqueId = () =>\n\t\t\t{\n\t\t\t\tlet now;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// noinspection JSDeprecatedSymbols\n\t\t\t\t\tnow = (performance.timeOrigin || performance.timing.navigationStart) + performance.now();\n\t\t\t\t\tif(typeof now !== 'number')\n\t\t\t\t\t{\n\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tnow = (Date.now ? Date.now() : (new Date()).getTime());\n\t\t\t\t}\n\t\t\t\tnow = Math.round(now);\n\t\t\t\tconst nowBytes = numberToBytes(now);\n\t\t\t\t\n\t\t\t\tlet uuid = null;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tuuid = crypto?.randomUUID();\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(uuid)\n\t\t\t\t{\n\t\t\t\t\tuuid = LeUtils.base64ToBytes(LeUtils.hexToBase64(uuid));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst bytesChunkA = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tconst bytesChunkB = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tconst bytesChunkC = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tconst bytesChunkD = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tuuid = new Uint8Array(bytesChunkA.length + bytesChunkB.length + bytesChunkC.length + bytesChunkD.length);\n\t\t\t\t\tuuid.set(bytesChunkA, 0);\n\t\t\t\t\tuuid.set(bytesChunkB, bytesChunkA.length);\n\t\t\t\t\tuuid.set(bytesChunkC, bytesChunkA.length + bytesChunkB.length);\n\t\t\t\t\tuuid.set(bytesChunkD, bytesChunkA.length + bytesChunkB.length + bytesChunkC.length);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst bytes = new Uint8Array(nowBytes.length + uuid.length);\n\t\t\t\tbytes.set(nowBytes, 0);\n\t\t\t\tbytes.set(uuid, nowBytes.length);\n\t\t\t\tuuid = LeUtils.bytesToBase64(bytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\ttime:now,\n\t\t\t\t\tid: uuid,\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\treturn () =>\n\t\t\t{\n\t\t\t\twhile(true)\n\t\t\t\t{\n\t\t\t\t\tconst result = generateUniqueId();\n\t\t\t\t\tif(previousUniqueIdsTime !== result.time)\n\t\t\t\t\t{\n\t\t\t\t\t\tpreviousUniqueIdsTime = result.time;\n\t\t\t\t\t\tpreviousUniqueIds = {[result.id]:true};\n\t\t\t\t\t\treturn result.id;\n\t\t\t\t\t}\n\t\t\t\t\telse if(previousUniqueIds[result.id] !== true)\n\t\t\t\t\t{\n\t\t\t\t\t\tpreviousUniqueIds[result.id] = true;\n\t\t\t\t\t\treturn result.id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Generates a base64 string (with +/ replaced by -_) of the current time (in milliseconds since 1970).\n\t *\n\t * @param {number} [now] Optional time to use instead of the current time. If not set, the current time will be used.\n\t * @returns {string}\n\t */\n\ttimestamp:\n\t\t(() =>\n\t\t{\n\t\t\tconst numberToBytes = (number) =>\n\t\t\t{\n\t\t\t\tconst size = (number === 0) ? 0 : Math.ceil((Math.floor(Math.log2(number)) + 1) / 8);\n\t\t\t\tconst bytes = new Uint8ClampedArray(size);\n\t\t\t\tlet x = number;\n\t\t\t\tfor(let i = (size - 1); i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tconst rightByte = x & 0xff;\n\t\t\t\t\tbytes[i] = rightByte;\n\t\t\t\t\tx = Math.floor(x / 0x100);\n\t\t\t\t}\n\t\t\t\treturn bytes;\n\t\t\t};\n\t\t\t\n\t\t\treturn (now = null) =>\n\t\t\t{\n\t\t\t\tif(ISSET(now))\n\t\t\t\t{\n\t\t\t\t\tnow = FLOAT_LAX(now);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\t// noinspection JSDeprecatedSymbols\n\t\t\t\t\t\tnow = (performance.timeOrigin || performance.timing.navigationStart) + performance.now();\n\t\t\t\t\t\tif(typeof now !== 'number')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch(e)\n\t\t\t\t\t{\n\t\t\t\t\t\tnow = (Date.now ? Date.now() : (new Date()).getTime());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnow = Math.round(now);\n\t\t\t\tconst nowBytes = numberToBytes(now);\n\t\t\t\t\n\t\t\t\treturn LeUtils.bytesToBase64(nowBytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns a data URL of a 1x1 transparent pixel.\n\t *\n\t * @returns {string}\n\t */\n\tgetEmptyImageSrc:\n\t\t() =>\n\t\t{\n\t\t\t// noinspection SpellCheckingInspection\n\t\t\treturn 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\t\t},\n\t\n\t/**\n\t * Calculates and returns the percentage of the part and total ((part / total) * 100).\n\t *\n\t * @param {number|string} part\n\t * @param {number|string} total\n\t * @returns {number}\n\t */\n\tgetPercentage:\n\t\t(part, total) =>\n\t\t{\n\t\t\tpart = FLOAT_LAX(part);\n\t\t\ttotal = FLOAT_LAX(total);\n\t\t\tif(total <= 0)\n\t\t\t{\n\t\t\t\treturn 100;\n\t\t\t}\n\t\t\treturn Math.max(0, Math.min(100, ((part / total) * 100)));\n\t\t},\n\t\n\t/**\n\t * Returns the pixels of the given Image object.\n\t *\n\t * @param {HTMLImageElement} image\n\t * @returns {Uint8ClampedArray}\n\t */\n\tgetImagePixels:\n\t\t(image) =>\n\t\t{\n\t\t\tif(!document)\n\t\t\t{\n\t\t\t\treturn new Uint8ClampedArray();\n\t\t\t}\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tdocument.body.appendChild(canvas);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconst ctx = canvas.getContext('2d');\n\t\t\t\tconst width = Math.floor(image.width);\n\t\t\t\tconst height = Math.floor(image.height);\n\t\t\t\tif((width <= 0) || (height <= 0))\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = 1;\n\t\t\t\t\tcanvas.height = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = width;\n\t\t\t\t\tcanvas.height = height;\n\t\t\t\t\tctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\t\t\t\t}\n\t\t\t\treturn ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tcanvas.parentNode.removeChild(canvas);\n\t\t\t}\n\t\t},\n\t\n\t/**\n\t * Returns the data URL (mimetype \"image/png\") of a colored version of the given Image object.\n\t *\n\t * @param {HTMLImageElement} image\n\t * @param {string} color\n\t * @returns {string}\n\t */\n\tgetColoredImage:\n\t\t(image, color) =>\n\t\t{\n\t\t\tif(!document)\n\t\t\t{\n\t\t\t\treturn LeUtils.getEmptyImageSrc();\n\t\t\t}\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tdocument.body.appendChild(canvas);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconst ctx = canvas.getContext('2d');\n\t\t\t\tconst width = Math.floor(image.width);\n\t\t\t\tconst height = Math.floor(image.height);\n\t\t\t\tif((width <= 0) || (height <= 0))\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = 1;\n\t\t\t\t\tcanvas.height = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = width;\n\t\t\t\t\tcanvas.height = height;\n\t\t\t\t\tctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\t\t\t\t}\n\t\t\t\tctx.globalCompositeOperation = 'source-in';\n\t\t\t\tctx.fillStyle = color;\n\t\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\t\t\t\treturn canvas.toDataURL('image/png');\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tcanvas.parentNode.removeChild(canvas);\n\t\t\t}\n\t\t},\n\t\n\t/**\n\t * Returns the hex color of the given RGB(A).\n\t *\n\t * @param {number[]} rgb\n\t * @returns {string}\n\t */\n\trgbToHex:\n\t\t(rgb) =>\n\t\t{\n\t\t\treturn '#' + rgb.map((x) =>\n\t\t\t{\n\t\t\t\tconst hex = x.toString(16);\n\t\t\t\treturn ((hex.length === 1) ? '0' + hex : hex);\n\t\t\t}).join('');\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) of the given hex color.\n\t *\n\t * @param {string} hexstring\n\t * @returns {number[]}\n\t */\n\thexToRgb:\n\t\t(hexstring) =>\n\t\t{\n\t\t\thexstring = hexstring.replace(/[^0-9A-F]/gi, '');\n\t\t\tconst hasAlpha = ((hexstring.length === 4) || (hexstring.length === 8));\n\t\t\twhile(hexstring.length < 6)\n\t\t\t{\n\t\t\t\thexstring = hexstring.replace(/(.)/g, '$1$1');\n\t\t\t}\n\t\t\tconst result = hexstring.match(/\\w{2}/g).map((a) => parseInt(a, 16));\n\t\t\treturn [\n\t\t\t\tresult[0],\n\t\t\t\tresult[1],\n\t\t\t\tresult[2],\n\t\t\t\t...(hasAlpha ? [result[3]] : []),\n\t\t\t];\n\t\t},\n\t\n\t/**\n\t * Returns the HSL(A) of the given RGB(A).\n\t *\n\t * @param {number[]} rgb\n\t * @returns {number[]}\n\t */\n\trgbToHsl:\n\t\t(rgb) =>\n\t\t{\n\t\t\tconst r = rgb[0] / 255;\n\t\t\tconst g = rgb[1] / 255;\n\t\t\tconst b = rgb[2] / 255;\n\t\t\tconst max = Math.max(r, g, b);\n\t\t\tconst min = Math.min(r, g, b);\n\t\t\tlet h, s, l = (max + min) / 2;\n\t\t\tif(max === min)\n\t\t\t{\n\t\t\t\th = s = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst d = max - min;\n\t\t\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\t\t\tswitch(max)\n\t\t\t\t{\n\t\t\t\t\tcase r:\n\t\t\t\t\t\th = (g - b) / d + (g < b ? 6 : 0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase g:\n\t\t\t\t\t\th = (b - r) / d + 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase b:\n\t\t\t\t\t\th = (r - g) / d + 4;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\th /= 6;\n\t\t\t}\n\t\t\treturn [h, s, l, ...((rgb.length >= 4) ? [rgb[3] / 255] : [])];\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) of the given HSL(A).\n\t *\n\t * @param {number[]} hsl\n\t * @returns {number[]}\n\t */\n\thslToRgb:\n\t\t(() =>\n\t\t{\n\t\t\tconst hue2rgb = (p, q, t) =>\n\t\t\t{\n\t\t\t\tif(t < 0)\n\t\t\t\t{\n\t\t\t\t\tt += 1;\n\t\t\t\t}\n\t\t\t\tif(t > 1)\n\t\t\t\t{\n\t\t\t\t\tt -= 1;\n\t\t\t\t}\n\t\t\t\tif(t < 1 / 6)\n\t\t\t\t{\n\t\t\t\t\treturn p + (q - p) * 6 * t;\n\t\t\t\t}\n\t\t\t\tif(t < 1 / 2)\n\t\t\t\t{\n\t\t\t\t\treturn q;\n\t\t\t\t}\n\t\t\t\tif(t < 2 / 3)\n\t\t\t\t{\n\t\t\t\t\treturn p + (q - p) * (2 / 3 - t) * 6;\n\t\t\t\t}\n\t\t\t\treturn p;\n\t\t\t};\n\t\t\treturn (hsl) =>\n\t\t\t{\n\t\t\t\tconst h = hsl[0];\n\t\t\t\tconst s = hsl[1];\n\t\t\t\tconst l = hsl[2];\n\t\t\t\tlet r, g, b;\n\t\t\t\tif(s === 0)\n\t\t\t\t{\n\t\t\t\t\tr = g = b = l;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst q = (l < 0.5) ? (l * (1 + s)) : (l + s - (l * s));\n\t\t\t\t\tconst p = (2 * l) - q;\n\t\t\t\t\tr = hue2rgb(p, q, h + (1 / 3));\n\t\t\t\t\tg = hue2rgb(p, q, h);\n\t\t\t\t\tb = hue2rgb(p, q, h - (1 / 3));\n\t\t\t\t}\n\t\t\t\treturn [r * 255, g * 255, b * 255, ...((hsl.length >= 4) ? [hsl[3] * 255] : [])].map((c) => Math.max(0, Math.min(255, Math.round(c))));\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns the LAB(A) of the given RGB(A).\n\t *\n\t * @param {number[]} rgb\n\t * @returns {number[]}\n\t */\n\trgbToLab:\n\t\t(rgb) =>\n\t\t{\n\t\t\tlet r = rgb[0] / 255;\n\t\t\tlet g = rgb[1] / 255;\n\t\t\tlet b = rgb[2] / 255;\n\t\t\tr = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : (r / 12.92);\n\t\t\tg = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : (g / 12.92);\n\t\t\tb = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : (b / 12.92);\n\t\t\tlet x = ((r * 0.4124) + (g * 0.3576) + (b * 0.1805)) / 0.95047;\n\t\t\tlet y = ((r * 0.2126) + (g * 0.7152) + (b * 0.0722));\n\t\t\tlet z = ((r * 0.0193) + (g * 0.1192) + (b * 0.9505)) / 1.08883;\n\t\t\tx = (x > 0.008856) ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\t\t\ty = (y > 0.008856) ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\t\t\tz = (z > 0.008856) ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\t\t\treturn [(116 * y) - 16, 500 * (x - y), 200 * (y - z), ...((rgb.length >= 4) ? [rgb[3] / 255] : [])];\n\t\t},\n\t\n\t/**\n\t * Returns the difference (calculated with DeltaE) of the LAB values of the given RGB values.\n\t *\n\t * Returns a number:\n\t *\n\t * <pre>\n\t * < 1.0 is not perceptible by human eyes\n\t * 1-2 is perceptible through close observation\n\t * 2-10 is perceptible at a glance\n\t * 11-49 is more similar than opposite\n\t * 100 is exactly the opposite color\n\t * </pre>\n\t *\n\t * @param {number[]} rgbA\n\t * @param {number[]} rgbB\n\t * @returns {number}\n\t */\n\tgetDifferenceBetweenRgb:\n\t\t(rgbA, rgbB) =>\n\t\t{\n\t\t\tconst labA = LeUtils.rgbToLab(rgbA);\n\t\t\tconst labB = LeUtils.rgbToLab(rgbB);\n\t\t\treturn LeUtils.getDifferenceBetweenLab(labA, labB);\n\t\t},\n\t\n\t/**\n\t * Returns the difference (calculated with DeltaE) of the given LAB values. Ignores the Alpha channel.\n\t *\n\t * Returns a number:\n\t *\n\t * <pre>\n\t * < 1.0 is not perceptible by human eyes\n\t * 1-2 is perceptible through close observation\n\t * 2-10 is perceptible at a glance\n\t * 11-49 is more similar than opposite\n\t * 100 is exactly the opposite color\n\t * </pre>\n\t *\n\t * @param {number[]} labA\n\t * @param {number[]} labB\n\t * @returns {number}\n\t */\n\tgetDifferenceBetweenLab:\n\t\t(labA, labB) =>\n\t\t{\n\t\t\tconst deltaL = labA[0] - labB[0];\n\t\t\tconst deltaA = labA[1] - labB[1];\n\t\t\tconst deltaB = labA[2] - labB[2];\n\t\t\tconst c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n\t\t\tconst c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n\t\t\tconst deltaC = c1 - c2;\n\t\t\tlet deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n\t\t\tdeltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\t\t\tconst sc = 1.0 + 0.045 * c1;\n\t\t\tconst sh = 1.0 + 0.015 * c1;\n\t\t\tconst deltaLKlsl = deltaL / (1.0);\n\t\t\tconst deltaCkcsc = deltaC / (sc);\n\t\t\tconst deltaHkhsh = deltaH / (sh);\n\t\t\tconst i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\t\t\treturn (i < 0) ? 0 : Math.sqrt(i);\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) of the given RGB(A) values, based on the given percentage (0-100).\n\t * This allows you to define a gradient of colors to fade in between, rather than just having a start and an end color.\n\t *\n\t * Usage:\n\t *\n\t * <pre>\n\t * LeUtils.getRgbOfGradient({\n\t * 0: [255, 0, 0],\n\t * 33: [255, 255, 0],\n\t * 66: [0, 255, 0],\n\t * 100:[0, 255, 255],\n\t * }, 45.1234);\n\t * </pre>\n\t *\n\t * @param {{[percentage]: number[]}} gradient\n\t * @param {number} percentage\n\t * @returns {number[]}\n\t */\n\tgetRgbOfGradient:\n\t\t(gradient, percentage) =>\n\t\t{\n\t\t\tpercentage = Math.max(0, Math.min(100, FLOAT_LAX(percentage)));\n\t\t\t\n\t\t\tlet closest = null;\n\t\t\tLeUtils.each(gradient, (color, percent) =>\n\t\t\t{\n\t\t\t\tpercent = INT_LAX(percent);\n\t\t\t\tif(closest === null)\n\t\t\t\t{\n\t\t\t\t\tclosest = [percent, Math.abs(percentage - percent)];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst difference = Math.abs(percentage - percent);\n\t\t\t\t\tif(difference < closest[1])\n\t\t\t\t\t{\n\t\t\t\t\t\tclosest = [percent, difference];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(closest === null)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tclosest = closest[0];\n\t\t\t\n\t\t\tlet higher = 99999;\n\t\t\tlet lower = -99999;\n\t\t\tLeUtils.each(gradient, (color, percent) =>\n\t\t\t{\n\t\t\t\tpercent = INT_LAX(percent);\n\t\t\t\tif(percent < closest)\n\t\t\t\t{\n\t\t\t\t\tif(percent > lower)\n\t\t\t\t\t{\n\t\t\t\t\t\tlower = percent;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(percent > closest)\n\t\t\t\t{\n\t\t\t\t\tif(percent < higher)\n\t\t\t\t\t{\n\t\t\t\t\t\thigher = percent;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(higher === 99999)\n\t\t\t{\n\t\t\t\thigher = null;\n\t\t\t}\n\t\t\tif(lower === -99999)\n\t\t\t{\n\t\t\t\tlower = null;\n\t\t\t}\n\t\t\t\n\t\t\tif(((higher === null) && (lower === null)) || (higher === lower))\n\t\t\t{\n\t\t\t\treturn gradient[closest];\n\t\t\t}\n\t\t\telse if((higher !== null) && (lower !== null))\n\t\t\t{\n\t\t\t\tconst higherDifference = Math.abs(higher - percentage);\n\t\t\t\tconst lowerDifference = Math.abs(percentage - lower);\n\t\t\t\tif(higherDifference > lowerDifference)\n\t\t\t\t{\n\t\t\t\t\thigher = closest;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlower = closest;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(lower === null)\n\t\t\t{\n\t\t\t\tlower = closest;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thigher = closest;\n\t\t\t}\n\t\t\t\n\t\t\tif(lower > higher)\n\t\t\t{\n\t\t\t\tconst tmp = higher;\n\t\t\t\thigher = lower;\n\t\t\t\tlower = tmp;\n\t\t\t}\n\t\t\t\n\t\t\tconst total = (higher - lower);\n\t\t\tconst part = (percentage - lower);\n\t\t\treturn LeUtils.getRgbBetween(gradient[lower], gradient[higher], ((part / total) * 100));\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) between the two given RGB(A) values, based on the given percentage (0-100).\n\t *\n\t * @param {number[]} startRgb\n\t * @param {number[]} endRgb\n\t * @param {number} percentage\n\t * @returns {number[]}\n\t */\n\tgetRgbBetween:\n\t\t(startRgb, endRgb, percentage) =>\n\t\t{\n\t\t\tpercentage = FLOAT_LAX(percentage);\n\t\t\tconst partEnd = Math.max(0, Math.min(1, (percentage / 100.0)));\n\t\t\tconst partStart = (1 - partEnd);\n\t\t\tconst length = Math.min(startRgb.length, endRgb.length);\n\t\t\tlet result = [];\n\t\t\tfor(let i = 0; i < length; i++)\n\t\t\t{\n\t\t\t\tresult.push(Math.max(0, Math.min(255, Math.round((startRgb[i] * partStart) + (endRgb[i] * partEnd)))));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * An implementation of the btoa function, which should work in all environments.\n\t *\n\t * @param {string} string\n\t * @returns {string}\n\t */\n\tbtoa:\n\t\t(string) =>\n\t\t{\n\t\t\tif(typeof btoa === 'function')\n\t\t\t{\n\t\t\t\treturn btoa(string);\n\t\t\t}\n\t\t\treturn Buffer.from(string).toString('base64');\n\t\t},\n\t\n\t/**\n\t * An implementation of the atob function, which should work in all environments.\n\t *\n\t * @param {string} base64string\n\t * @returns {string}\n\t */\n\tatob:\n\t\t(base64string) =>\n\t\t{\n\t\t\tif(typeof atob === 'function')\n\t\t\t{\n\t\t\t\treturn atob(base64string);\n\t\t\t}\n\t\t\treturn Buffer.from(base64string, 'base64').toString();\n\t\t},\n\t\n\t/**\n\t * Encodes a UTF-8 string into a base64 string.\n\t *\n\t * @param {string} string\n\t * @returns {string}\n\t */\n\tutf8ToBase64:\n\t\t(string) =>\n\t\t{\n\t\t\treturn LeUtils.btoa(encodeURIComponent(string).replace(/%([0-9A-F]{2})/g, (match, p1) => String.fromCharCode(parseInt(p1, 16))));\n\t\t},\n\t\n\t/**\n\t * Decodes a base64 string back into a UTF-8 string.\n\t *\n\t * @param {string} base64string\n\t * @returns {string}\n\t */\n\tbase64ToUtf8:\n\t\t(base64string) =>\n\t\t{\n\t\t\treturn decodeURIComponent(LeUtils.atob(base64string.trim()).split('').map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));\n\t\t},\n\t\n\t/**\n\t * Converts a base64 string into a hex string.\n\t *\n\t * @param {string} base64string\n\t * @returns {string}\n\t */\n\tbase64ToHex:\n\t\t(base64string) =>\n\t\t{\n\t\t\treturn LeUtils.atob(base64string.trim()).split('').map((c) => ('0' + c.charCodeAt(0).toString(16)).slice(-2)).join('');\n\t\t},\n\t\n\t/**\n\t * Converts a hex string into a base64 string.\n\t *\n\t * @param {string} hexstring\n\t * @returns {string}\n\t */\n\thexToBase64:\n\t\t(hexstring) =>\n\t\t{\n\t\t\treturn LeUtils.btoa(hexstring.replace(/[^0-9A-F]/gi, '').match(/\\w{2}/g).map((a) => String.fromCharCode(parseInt(a, 16))).join(''));\n\t\t},\n\t\n\t/**\n\t * Converts a base64 string into bytes (Uint8Array).\n\t *\n\t * @param {string} base64string\n\t * @returns {Uint8Array}\n\t */\n\tbase64ToBytes:\n\t\t(base64string) =>\n\t\t{\n\t\t\tconst binary = LeUtils.atob(base64string.trim());\n\t\t\tconst len = binary.length;\n\t\t\tlet data = new Uint8Array(len);\n\t\t\tfor(let i = 0; i < len; i++)\n\t\t\t{\n\t\t\t\tdata[i] = binary.charCodeAt(i);\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\n\t/**\n\t * Converts bytes into a base64 string.\n\t *\n\t * @param {ArrayLike<number>|ArrayBufferLike} arraybuffer\n\t * @returns {string}\n\t */\n\tbytesToBase64:\n\t\t(arraybuffer) =>\n\t\t{\n\t\t\tconst bytes = new Uint8Array(arraybuffer);\n\t\t\tconst len = bytes.byteLength;\n\t\t\tlet binary = '';\n\t\t\tfor(let i = 0; i < len; i++)\n\t\t\t{\n\t\t\t\tbinary += String.fromCharCode(bytes[i]);\n\t\t\t}\n\t\t\treturn LeUtils.btoa(binary);\n\t\t},\n\t\n\t/**\n\t * Downloads the given base64 string as a file.\n\t *\n\t * @param {string} base64string\n\t * @param {string} [fileName]\n\t * @param {string} [mimeType]\n\t */\n\tdownloadFile:\n\t\t(base64string, fileName, mimeType) =>\n\t\t{\n\t\t\tconst link = document.createElement('a');\n\t\t\tlink.setAttribute('download', (typeof fileName === 'string') ? fileName : 'file');\n\t\t\tlink.href = 'data:' + mimeType + ';base64,' + base64string;\n\t\t\tlink.setAttribute('target', '_blank');\n\t\t\tlink.click();\n\t\t},\n\t\n\t/**\n\t * Loads the value from the browser, returns undefined if the value doesn't exist.\n\t *\n\t * @param {string} id\n\t * @returns {*}\n\t */\n\tlocalStorageGet:\n\t\t(id) =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet result = window.localStorage.getItem('LeUtils_' + id);\n\t\t\tif(typeof result !== 'string')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry\n\t\t\t{\n\t\t\t\tresult = JSON.parse(result);\n\t\t\t\tif(typeof result['-'] !== 'undefined')\n\t\t\t\t{\n\t\t\t\t\treturn result['-'];\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch(e)\n\t\t\t{\n\t\t\t}\n\t\t},\n\t\n\t/**\n\t * Saves the given data in the browser.\n\t *\n\t * @param {string} id\n\t * @param {*} data\n\t */\n\tlocalStorageSet:\n\t\t(id, data) =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(typeof data === 'undefined')\n\t\t\t{\n\t\t\t\twindow.localStorage.removeItem('LeUtils_' + id);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.localStorage.setItem('LeUtils_' + id, JSON.stringify({'-':data}));\n\t\t},\n\t\n\t/**\n\t * Removes the data from the browser.\n\t *\n\t * @param {string} id\n\t */\n\tlocalStorageRemove:\n\t\t(id) =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.localStorage.removeItem('LeUtils_' + id);\n\t\t},\n\t\n\t/**\n\t * Returns whether the current hostname (window.location.hostname) is private (such as localhost, 192.168.1.1, etc).\n\t * This can be used to determine if the app is running in a development environment or not.\n\t *\n\t * Only \"localhost\" and IPv4 addresses are supported. IPv6 addresses will always return false.\n\t *\n\t * @returns {boolean}\n\t */\n\tisCurrentHostPrivate:\n\t\t(() =>\n\t\t{\n\t\t\tlet lastHostname = null;\n\t\t\tlet lastResult = false;\n\t\t\t\n\t\t\treturn () =>\n\t\t\t{\n\t\t\t\tif(typeof window === 'undefined')\n\t\t\t\t{\n\t\t\t\t\treturn false; // server-side rendering, who knows to who it is being served to, assume it's public\n\t\t\t\t}\n\t\t\t\tconst hostname = window.location.hostname;\n\t\t\t\tif(lastHostname === hostname)\n\t\t\t\t{\n\t\t\t\t\treturn lastResult;\n\t\t\t\t}\n\t\t\t\tlastHostname = hostname;\n\t\t\t\tlastResult = LeUtils.isGivenHostPrivate(lastHostname);\n\t\t\t\treturn lastResult;\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns true if the given hostname is private (such as localhost, 192.168.1.1, etc).\n\t *\n\t * Only \"localhost\" and IPv4 addresses are supported. IPv6 addresses will always return false.\n\t *\n\t * @param {string} host\n\t * @returns {boolean}\n\t */\n\tisGivenHostPrivate:\n\t\t(host) =>\n\t\t{\n\t\t\thost = STRING(host).trim().toLowerCase();\n\t\t\tif((host === 'localhost') || (host === '127.0.0.1'))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(!/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(host))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst parts = host.split('.');\n\t\t\treturn (parts[0] === '10') || // 10.0.0.0 - 10.255.255.255\n\t\t\t\t((parts[0] === '172') && ((parseInt(parts[1], 10) >= 16) && (parseInt(parts[1], 10) <= 31))) || // 172.16.0.0 - 172.31.255.255\n\t\t\t\t((parts[0] === '192') && (parts[1] === '168')); // 192.168.0.0 - 192.168.255.255\n\t\t},\n\t\n\t/**\n\t * Creates and returns a new TreeSet.\n\t * A TreeSet is a set of elements, sorted by a comparator.\n\t * Binary search is used to find elements, which makes it very fast to find elements.\n\t *\n\t * The comparator is also used to determine if two values are equal to each other.\n\t * This way, you can have values that aren't the same be treated as if they are. This can be used to deal with issues such as floating point errors for example.\n\t *\n\t * @param {*[]} elements\n\t * @param {Function} comparator\n\t * @returns {{getElements: (function(): *[]), getComparator: (function(): Function), size: (function(): number), isEmpty: (function(): boolean), contains: (function(*): boolean), first: (function(): *|undefined), last: (function(): *|undefined), pollFirst: (function(): *|undefined), pollLast: (function(): *|undefined), add: function(*), addAll: function(*[]|object), getEqualValue: (function(*): (*)), getEqualValueOrAdd: (function(*): (*))}}\n\t */\n\tcreateTreeSet:\n\t\t(elements, comparator) =>\n\t\t{\n\t\t\tcomparator = comparator || LeUtils.compare;\n\t\t\telements = elements || [];\n\t\t\telements.sort(comparator);\n\t\t\t\n\t\t\t/**\n\t\t\t * Performs a binary search on the elements, and returns the result.\n\t\t\t *\n\t\t\t * @param {*} value\n\t\t\t * @returns {{found: boolean, index: number, value: *|undefined}}\n\t\t\t */\n\t\t\tconst binarySearch = (value) =>\n\t\t\t{\n\t\t\t\tlet low = 0;\n\t\t\t\tlet high = elements.length - 1;\n\t\t\t\twhile(low <= high)\n\t\t\t\t{\n\t\t\t\t\tconst mid = Math.floor((low + high) / 2);\n\t\t\t\t\tconst midValue = elements[mid];\n\t\t\t\t\tconst cmp = comparator(midValue, value);\n\t\t\t\t\tif(cmp < 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tlow = mid + 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(cmp > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\thigh = mid - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\treturn {found:true, index:mid, value:midValue};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {found:false, index:low, value:undefined};\n\t\t\t};\n\t\t\t\n\t\t\tconst treeSet = {\n\t\t\t\t/**\n\t\t\t\t * Returns the elements of the set.\n\t\t\t\t *\n\t\t\t\t * @returns {*[]}\n\t\t\t\t */\n\t\t\t\tgetElements:\n\t\t\t\t\t() => elements,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the comparator of the set.\n\t\t\t\t *\n\t\t\t\t * @returns {Function}\n\t\t\t\t */\n\t\t\t\tgetComparator:\n\t\t\t\t\t() => comparator,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the size of the set.\n\t\t\t\t *\n\t\t\t\t * @returns {number}\n\t\t\t\t */\n\t\t\t\tsize:\n\t\t\t\t\t() => elements.length,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns true if the set is empty, false otherwise.\n\t\t\t\t *\n\t\t\t\t * @returns {boolean}\n\t\t\t\t */\n\t\t\t\tisEmpty:\n\t\t\t\t\t() => (elements.length <= 0),\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns true if the set contains a value that is equal to the given value, returns false otherwise.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t * @returns {boolean}\n\t\t\t\t */\n\t\t\t\tcontains:\n\t\t\t\t\t(value) => binarySearch(value).found,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the first element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tfirst:\n\t\t\t\t\t() => (elements.length > 0) ? elements[0] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the last element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tlast:\n\t\t\t\t\t() => (elements.length > 0) ? elements[elements.length - 1] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Removes and returns the first element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tpollFirst:\n\t\t\t\t\t() => (elements.length > 0) ? elements.splice(0, 1)[0] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Removes and returns the last element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tpollLast:\n\t\t\t\t\t() => (elements.length > 0) ? elements.splice(elements.length - 1, 1)[0] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Adds the given value to the set. Will only do so if no equal value already exists.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t */\n\t\t\t\tadd:\n\t\t\t\t\t(value) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tconst result = binarySearch(value);\n\t\t\t\t\t\tif(result.found)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telements.splice(result.index, 0, value);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Adds all the given values to the set. Will only do so if no equal value already exists.\n\t\t\t\t *\n\t\t\t\t * @param {*[]|object} values\n\t\t\t\t */\n\t\t\t\taddAll:\n\t\t\t\t\t(values) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tLeUtils.each(values, treeSet.add);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns an equal value that's already in the tree set, or undefined if no equal values in it exist.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tgetEqualValue:\n\t\t\t\t\t(value) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tconst result = binarySearch(value);\n\t\t\t\t\t\tif(result.found)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns an equal value that's already in the tree set. If no equal values in it exist, the given value will be added and returned.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t * @returns {*}\n\t\t\t\t */\n\t\t\t\tgetEqualValueOrAdd:\n\t\t\t\t\t(value) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tconst result = binarySearch(value);\n\t\t\t\t\t\tif(result.found)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telements.splice(result.index, 0, value);\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t},\n\t\t\t};\n\t\t\treturn treeSet;\n\t\t},\n\t\n\t/**\n\t * @typedef {Object} LeUtils~TransactionalValue\n\t * @property {*} value\n\t * @property {{id:string, value:*}[]} changes\n\t */\n\t/**\n\t * Creates and returns a new TransactionalValue object.\n\t * With a TransactionalValue, you can keep track of changes to a value, and commit or cancel them.\n\t *\n\t * Multiple uncommitted changes can be made at the same time, the last change will be the one that overwrites older changes.\n\t * If that change is cancelled, the previous change will be the one that overwrites older changes.\n\t * This allows you to make multiple unconfirmed changes, and confirm or cancel each of them individually at any time.\n\t *\n\t * @param {*} [value]\n\t * @returns {LeUtils~TransactionalValue}\n\t */\n\tcreateTransactionalValue:\n\t\t(value) =>\n\t\t{\n\t\t\tif(typeof value === 'undefined')\n\t\t\t{\n\t\t\t\tvalue = null;\n\t\t\t}\n\t\t\treturn {value:value, changes:[]};\n\t\t},\n\t\n\t/**\n\t * Returns true if the given value is a valid TransactionalValue, returns false if it isn't.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {boolean}\n\t */\n\tisTransactionalValueValid:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\treturn ((typeof transactionalValue === 'object') && ('value' in transactionalValue) && ('changes' in transactionalValue) && Array.isArray(transactionalValue.changes));\n\t\t},\n\t\n\t/**\n\t * Returns true if the given value is a TransactionalValue, false otherwise.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {string}\n\t */\n\ttransactionalValueToString:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\tif(!LeUtils.isTransactionalValueValid(transactionalValue))\n\t\t\t{\n\t\t\t\treturn transactionalValue + '';\n\t\t\t}\n\t\t\tif(transactionalValue.changes.length <= 0)\n\t\t\t{\n\t\t\t\treturn '' + transactionalValue.value;\n\t\t\t}\n\t\t\tlet valuesString = '' + transactionalValue.value;\n\t\t\tfor(let i = 0; i < transactionalValue.changes.length; i++)\n\t\t\t{\n\t\t\t\tvaluesString += ' -> ' + transactionalValue.changes[i].value;\n\t\t\t}\n\t\t\treturn transactionalValue.changes[transactionalValue.changes.length - 1].value + ' (' + valuesString + ')';\n\t\t},\n\t\n\t/**\n\t * Sets the committed value of the given TransactionalValue to the given value. Clears out the previously uncommitted changes.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {*} value\n\t */\n\ttransactionSetAndCommit:\n\t\t(transactionalValue, value) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tif(typeof value === 'undefined')\n\t\t\t{\n\t\t\t\tvalue = null;\n\t\t\t}\n\t\t\ttransactionalValue.value = value;\n\t\t\ttransactionalValue.changes = [];\n\t\t},\n\t\n\t/**\n\t * Sets the value of the given TransactionalValue to the given value, without yet committing it, meaning it can be committed or cancelled later.\n\t * It returns the ID of the change, which can be used to commit or cancel the change later.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {*} value\n\t * @returns {string}\n\t */\n\ttransactionSetWithoutCommitting:\n\t\t(transactionalValue, value) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tif(typeof value === 'undefined')\n\t\t\t{\n\t\t\t\tvalue = null;\n\t\t\t}\n\t\t\tconst id = LeUtils.uniqueId();\n\t\t\ttransactionalValue.changes.push({id:id, value:value});\n\t\t\treturn id;\n\t\t},\n\t\n\t/**\n\t * Commits the change with the given ID, making it the new committed value.\n\t * Returns true if the change was found and committed, returns false if it was already overwritten by a newer committed change.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {string} changeId\n\t * @returns {boolean}\n\t */\n\ttransactionCommitChange:\n\t\t(transactionalValue, changeId) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tconst change = findTransactionalValueChange(transactionalValue, changeId);\n\t\t\tif(change === null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttransactionalValue.value = change.value;\n\t\t\ttransactionalValue.changes.splice(0, change.index + 1);\n\t\t\treturn true;\n\t\t},\n\t\n\t/**\n\t * Cancels the change with the given ID, removing it from the uncommitted changes.\n\t * Returns true if the change was found and removed, returns false if it was already overwritten by a newer committed change.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {string} changeId\n\t * @returns {boolean}\n\t */\n\ttransactionCancelChange:\n\t\t(transactionalValue, changeId) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tconst change = findTransactionalValueChange(transactionalValue, changeId);\n\t\t\tif(change === null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttransactionalValue.changes.splice(change.index, 1);\n\t\t\treturn true;\n\t\t},\n\t\n\t/**\n\t * Returns true if the change was found, meaning it can still make a difference to the final committed value of this TransactionalValue.\n\t * Returns false if it was already overwritten by a newer committed change, meaning that this change can no longer make a difference to the final committed value of this TransactionalValue.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {string} changeId\n\t * @returns {boolean}\n\t */\n\ttransactionIsChangeRelevant:\n\t\t(transactionalValue, changeId) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\treturn (findTransactionalValueChange(transactionalValue, changeId) !== null);\n\t\t},\n\t\n\t/**\n\t * Returns the committed value of the given TransactionalValue.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {*}\n\t */\n\ttransactionGetCommittedValue:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\treturn transactionalValue.value;\n\t\t},\n\t\n\t/**\n\t * Returns the value (including any uncommitted changes made to it) of the given TransactionalValue.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {*}\n\t */\n\ttransactionGetValue:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tif(transactionalValue.changes.length <= 0)\n\t\t\t{\n\t\t\t\treturn transactionalValue.value;\n\t\t\t}\n\t\t\treturn transactionalValue.changes[transactionalValue.changes.length - 1].value;\n\t\t},\n\t\n\t/**\n\t * Creates a worker thread. Workers have to be stored at /workers/{workerName}.worker.js for this to work.\n\t *\n\t * Example of a worker file:\n\t *\n\t * ```js\n\t * onmessage = (message) =>\n\t * {\n\t * postMessage({\n\t * ...message.data,\n\t * results: ['...some expensive calculation involving message.data...'],\n\t * });\n\t * };\n\t * ```\n\t *\n\t * Usage:\n\t *\n\t * ```js\n\t * const {results} = await (async () =>\n\t * {\n\t * try\n\t * {\n\t * return await LeUtils.sendWorkerMessage('my-worker', {someData:[1, 2, 3, 4, 5]});\n\t * }\n\t * catch(error)\n\t * {\n\t * console.error('MyWorker: ', error);\n\t * return {results:[]};\n\t * }\n\t * })();\n\t * ```\n\t *\n\t * or, if you want more control over the number of threads you have (the above example will only create 1 thread per worker):\n\t *\n\t * ```js\n\t * const myWorker1 = LeUtils.createWorkerThread('my-worker'); // creates a thread, you can create multiple worker threads of the same worker, to run multiple instances in parallel\n\t * const myWorker2 = LeUtils.createWorkerThread('my-worker'); // same worker, another thread\n\t * const {results} = await (async () =>\n\t * {\n\t * try\n\t * {\n\t * return await myWorker1.sendMessage({someData:[1, 2, 3, 4, 5]});\n\t * }\n\t * catch(error)\n\t * {\n\t * console.error('MyWorker: ', error);\n\t * return {results:[]};\n\t * }\n\t * })();\n\t * ```\n\t *\n\t * @param {string} name\n\t * @returns {{worker: Worker, sendMessage: function(Object, {timeout: number|undefined}|undefined): Promise<Object>}}\n\t */\n\tcreateWorkerThread:\n\t\t(name) =>\n\t\t{\n\t\t\tconst worker = new Worker('/workers/' + name + '.worker.js');\n\t\t\tlet listeners = {};\n\t\t\t\n\t\t\tconst addListener = (id, callback) =>\n\t\t\t{\n\t\t\t\tlisteners[id] = callback;\n\t\t\t};\n\t\t\t\n\t\t\tconst removeListener = (id) =>\n\t\t\t{\n\t\t\t\tdelete listeners[id];\n\t\t\t};\n\t\t\t\n\t\t\tconst sendMessage = (data, options) =>\n\t\t\t{\n\t\t\t\treturn new Promise((resolve, reject) =>\n\t\t\t\t{\n\t\t\t\t\tconst id = LeUtils.uniqueId();\n\t\t\t\t\taddListener(id, resolve);\n\t\t\t\t\tsetTimeout(() =>\n\t\t\t\t\t{\n\t\t\t\t\t\tremoveListener(id);\n\t\t\t\t\t\treject('timeout');\n\t\t\t\t\t}, options?.timeout ?? 10000);\n\t\t\t\t\t\n\t\t\t\t\tworker.postMessage({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t...data,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\tworker.onerror = (error) =>\n\t\t\t{\n\t\t\t\tconsole.error('Worker ' + name + ':', error);\n\t\t\t};\n\t\t\tworker.onmessage = (message) =>\n\t\t\t{\n\t\t\t\tconst data = message.data;\n\t\t\t\tif(data?.id)\n\t\t\t\t{\n\t\t\t\t\tconst callback = listeners[data.id];\n\t\t\t\t\tif(callback)\n\t\t\t\t\t{\n\t\t\t\t\t\tremoveListener(data.id);\n\t\t\t\t\t\tcallback(data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\treturn {worker, sendMessage};\n\t\t},\n\t\n\t/**\n\t * Sends a message to the given worker. Creates a worker thread for this worker if it doesn't exist yet.\n\t *\n\t * See {@link LeUtils#createWorkerThread} for more info on how to use workers.\n\t *\n\t * @param {string} workerName\n\t * @param {Object} data\n\t * @param {{timeout: number|undefined}} [options]\n\t * @returns {Promise<Object>}\n\t */\n\tsendWorkerMessage:\n\t\t(() =>\n\t\t{\n\t\t\tconst workers = {};\n\t\t\treturn (workerName, data, options) =>\n\t\t\t{\n\t\t\t\tif(!workers[workerName])\n\t\t\t\t{\n\t\t\t\t\tworkers[workerName] = LeUtils.createWorkerThread(workerName);\n\t\t\t\t}\n\t\t\t\treturn workers[workerName].sendMessage(data, options);\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns a deep copy of the given value.\n\t *\n\t * @param {*} value\n\t * @returns {*}\n\t */\n\tclone:\n\t\t(value) => CloneDeep(value, true),\n\t\n\t/**\n\t * Purges the given email address, returning an empty string if it's invalid.\n\t *\n\t * @param {string} email\n\t * @returns {string}\n\t */\n\tpurgeEmail:\n\t\t(email) =>\n\t\t{\n\t\t\temail = STRING(email).trim().toLowerCase().replace(/\\s/g, '');\n\t\t\tif(!email.includes('@') || !email.includes('.'))\n\t\t\t{\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn email;\n\t\t},\n\t\n\t/**\n\t * Returns true if the focus is effectively clear, meaning that the user is not typing in an input field.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFocusClear:(() =>\n\t{\n\t\tconst inputTypes = ['text', 'search', 'email', 'number', 'password', 'tel', 'time', 'url', 'week', 'month', 'date', 'datetime-local'];\n\t\treturn () => !((document?.activeElement?.tagName?.toLowerCase() === 'input') && inputTypes.includes(document?.activeElement?.type?.toLowerCase()));\n\t})(),\n\t\n\t/**\n\t * Returns the user's locale. Returns 'en-US' if it can't be determined.\n\t *\n\t * @returns {string}\n\t */\n\tgetUserLocale:(() =>\n\t{\n\t\tlet userLocale = null;\n\t\treturn () =>\n\t\t{\n\t\t\tif(userLocale === null)\n\t\t\t{\n\t\t\t\tuserLocale = (() =>\n\t\t\t\t{\n\t\t\t\t\tif(typeof window === 'undefined')\n\t\t\t\t\t{\n\t\t\t\t\t\treturn 'en-US';\n\t\t\t\t\t}\n\t\t\t\t\tlet locales = window.navigator.languages;\n\t\t\t\t\tif(!IS_ARRAY(locales) || (locales.length <= 0))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn 'en-US';\n\t\t\t\t\t}\n\t\t\t\t\tlocales = locales.filter(locale => ((typeof locale === 'string') && locale.includes('-') && (locale.toLowerCase() !== 'en-us')));\n\t\t\t\t\tif(locales.length <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn 'en-US';\n\t\t\t\t\t}\n\t\t\t\t\tconst localesNoEnglish = locales.filter(locale => !locale.toLowerCase().startsWith('en-'));\n\t\t\t\t\tif(localesNoEnglish.length <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn locales[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn localesNoEnglish[0];\n\t\t\t\t})();\n\t\t\t}\n\t\t\treturn userLocale;\n\t\t};\n\t})(),\n\t\n\t/**\n\t * Returns the user's locale date format. Always returns YYYY MM DD, with the character in between depending on the user's locale. Returns 'YYYY/MM/DD' if the user's locale can't be determined.\n\t *\n\t * @returns {string}\n\t */\n\tgetUserLocaleDateFormat:(() =>\n\t{\n\t\tlet userLocaleDateFormat = null;\n\t\treturn () =>\n\t\t{\n\t\t\tif(userLocaleDateFormat === null)\n\t\t\t{\n\t\t\t\tuserLocaleDateFormat = (() =>\n\t\t\t\t{\n\t\t\t\t\tlet char = '/';\n\t\t\t\t\tif((typeof window !== 'undefined') && (typeof Intl !== 'undefined') && (typeof Intl.DateTimeFormat !== 'undefined'))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst formattedDate = new Intl.DateTimeFormat(LeUtils.getUserLocale()).format();\n\t\t\t\t\t\tif(formattedDate.includes('-'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchar = '-';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(formattedDate.includes('. '))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchar = '.';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(formattedDate.includes('.'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchar = '.';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn 'YYYY' + char + 'MM' + char + 'DD';\n\t\t\t\t})();\n\t\t\t}\n\t\t\treturn userLocaleDateFormat;\n\t\t};\n\t})(),\n};\n"],"names":["equal","a","b","constructor","length","i","keys","Array","isArray","RegExp","source","flags","valueOf","Object","prototype","toString","hasOwnProperty","call","key","kindOf","val","type","ctorName","isBuffer","callee","err","message","indexOf","isArguments","Date","toDateString","getDate","setDate","isDate","Error","stackTraceLimit","isError","ignoreCase","multiline","global","isRegexp","throw","return","next","isGeneratorObj","slice","toLowerCase","replace","name","Symbol","typeOf","require$$0","isObject","isObjectObject","o","clone","deep","assign","Number","Map","Set","len","buf","Buffer","allocUnsafe","from","copy","cloneBuffer","cloneSymbol","res","byteLength","Uint8Array","set","cloneArrayBuffer","buffer","byteOffset","cloneTypedArray","exec","re","lastIndex","cloneRegExp","create","require$$1","isPlainObject","ctor","prot","cloneDeep","instanceClone","cloneObjectDeep","cloneArrayDeep","REGEX_ALL_NON_FLOAT_CHARACTERS","ISSET","value","IS_ARRAY","IS_OBJECT","_typeof","STRING","FLOAT","v","isNaN","FLOAT_ANY","_len2","arguments","values","_key2","_i2","_values2","INT_LAX","Math","round","FLOAT_LAX","INT_LAX_ANY","FLOAT_LAX_ANY","apply","parseFloat","_len3","_key3","_i3","_values3","userLocaleDateFormat","userLocale","inputTypes","workers","lastHostname","lastResult","hue2rgb","previousUniqueIdsTime","previousUniqueIds","numberToBytes","generateUniqueId","GeneratorFunction","AsyncGeneratorFunction","RegularFunction","PossibleGeneratorFunctionNames","flattenArrayRecursive","eachAsyncParallel","checkTransactionalValue","transactionalValue","LeUtils","isTransactionalValueValid","console","error","findTransactionalValueChange","changeId","changes","change","id","index","equals","FastDeepEqual","parseVersionString","versionString","_versionString","_versionString2","_versionString3","major","minor","patch","partsVersion","trim","split","THIS","otherVersion","largerThan","largerThanOrEquals","smallerThan","smallerThanOrEquals","contains","array","result","each","containsCaseInsensitive","containsAll","containsAllCaseInsensitive","containsAny","containsAnyCaseInsensitive","containsNone","containsNoneCaseInsensitive","elements","callback","optionalSkipHasOwnPropertyCheck","undefined","warn","eachAsync","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee3","asyncCallback","optionalParallelCount","promises","doBreak","wrap","_context4","prev","_ref3","_callee2","element","_loop","promise","_context3","newPromises","_context2","__lowentry_utils__promise_is_done__","push","Promise","any","stop","delegateYield","abrupt","_callee","_context","t0","sent","_x5","_x6","this","all","_x","_x2","_x3","_x4","_ref5","_callee4","parallelCount","_index2","_args5","_context5","t1","t2","done","t3","_x7","_x8","filter","map","mapToArray","mapToArraySorted","comparator","sortKeys","sort","flattenArray","forEach","entry","compare","compareNumbers","compareNumericStrings","compareTimestampStrings","base64ToHex","replaceAll","isEmptyObject","obj","field","getObjectFieldsCount","count","isGeneratorFunction","_callee5","_context6","_wrapAsyncGenerator","_callee6","_context7","displayName","func","includes","setTimeout","_setTimeout","_x9","_x10","ms","lastTime","performance","now","handler","currentTime","e","remove","clearTimeout","setInterval","_setInterval","_x11","intervalMs","fireImmediately","clearInterval","setAnimationFrameTimeout","frames","run","requestAnimationFrameId","tick","window","requestAnimationFrame","cancelAnimationFrame","setAnimationFrameInterval","intervalFrames","promiseTimeout","resolve","promiseAnimationFrameTimeout","platformIsMobile","_window$navigator","_window$navigator2","navigator","userAgent","vendor","opera","substring","test","platformHasCursor","_window$matchMedia","matchMedia","matches","capitalize","string","charAt","toUpperCase","endsWithAny","endingCharsStringOrArray","endingCharsArray","chars","endsWith","startsWithAny","startingCharsStringOrArray","startingCharsArray","startsWith","trimEnd","trimCharsStringOrArray","trimChars","trimStart","purgeSentence","sentence","purgeErrorMessage","_error$message","messageParts","JSON","stringify","generateNamePermutations","_len","names","_key","results","join","concat","increaseNumericStringByOne","c","uniqueId","number","size","ceil","floor","log2","bytes","Uint8ClampedArray","x","rightByte","timeOrigin","timing","navigationStart","getTime","nowBytes","uuid","_crypto","crypto","randomUUID","base64ToBytes","hexToBase64","bytesChunkA","random","padEnd","bytesChunkB","bytesChunkC","bytesChunkD","time","bytesToBase64","_defineProperty","timestamp","getEmptyImageSrc","getPercentage","part","total","max","min","getImagePixels","image","document","canvas","createElement","body","appendChild","ctx","getContext","width","height","drawImage","getImageData","data","parentNode","removeChild","getColoredImage","color","globalCompositeOperation","fillStyle","fillRect","toDataURL","rgbToHex","rgb","hex","hexToRgb","hexstring","hasAlpha","match","parseInt","_toConsumableArray","rgbToHsl","h","s","r","g","l","d","hslToRgb","p","q","t","hsl","rgbToLab","pow","y","z","getDifferenceBetweenRgb","rgbA","rgbB","labA","labB","getDifferenceBetweenLab","deltaL","deltaA","deltaB","c1","sqrt","deltaC","deltaH","deltaLKlsl","deltaCkcsc","deltaHkhsh","getRgbOfGradient","gradient","percentage","closest","percent","abs","difference","higher","lower","tmp","getRgbBetween","startRgb","endRgb","partEnd","partStart","btoa","_btoa","_x12","atob","_atob","_x13","base64string","utf8ToBase64","encodeURIComponent","p1","String","fromCharCode","base64ToUtf8","decodeURIComponent","charCodeAt","binary","arraybuffer","downloadFile","fileName","mimeType","link","setAttribute","href","click","localStorageGet","localStorage","getItem","parse","localStorageSet","setItem","removeItem","localStorageRemove","isCurrentHostPrivate","hostname","location","isGivenHostPrivate","host","parts","createTreeSet","binarySearch","low","high","mid","midValue","cmp","found","treeSet","getElements","getComparator","isEmpty","first","last","pollFirst","splice","pollLast","add","addAll","getEqualValue","getEqualValueOrAdd","createTransactionalValue","transactionalValueToString","valuesString","transactionSetAndCommit","transactionSetWithoutCommitting","transactionCommitChange","transactionCancelChange","transactionIsChangeRelevant","transactionGetCommittedValue","transactionGetValue","createWorkerThread","worker","Worker","listeners","removeListener","onerror","onmessage","sendMessage","options","reject","_options$timeout","addListener","timeout","postMessage","_objectSpread","sendWorkerMessage","workerName","CloneDeep","purgeEmail","email","isFocusClear","_document","_document2","activeElement","tagName","getUserLocale","locales","languages","locale","localesNoEnglish","getUserLocaleDateFormat","char","Intl","DateTimeFormat","formattedDate","format","_i","_values"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["src/LeTypes.js","src/LeUtils.js"],"sourcesContent":["const REGEX_ALL_NON_FLOAT_CHARACTERS = /[^0-9.\\-]/g;\n\n\n/**\n * Returns true if the value is set (not undefined and not null).\n *\n * @param {*} value\n * @returns {boolean}\n */\nexport const ISSET = (value) => (typeof value !== 'undefined') && (value !== null);\n\n\n/**\n * Returns true if the value is an array.\n *\n * @param {*} value\n * @returns {boolean}\n */\nexport const IS_ARRAY = (value) => Array.isArray(value);\n\n/**\n * Ensures the given value is an array (returns the value wrapped in an array if it's not).\n *\n * @param {*} value\n * @returns {*[]}\n */\nexport const ARRAY = (value) => IS_ARRAY(value) ? value : ((typeof value !== 'undefined') ? [value] : []);\n\n\n/**\n * Returns true if the value is an object.\n *\n * @param {*} value\n * @returns {boolean}\n */\nexport const IS_OBJECT = (value) => (typeof value === 'object') && (value !== null) && !Array.isArray(value);\n\n/**\n * Ensures the given value is an object (returns an empty object if it's not).\n *\n * @param value\n * @returns {object}\n */\nexport const OBJECT = (value) => IS_OBJECT(value) ? value : {};\n\n\n/**\n * Ensures the given value is a string (casts it to a string if it's not, null and undefined will return an empty string).\n *\n * @param {*} value\n * @returns {string}\n */\nexport const STRING = (value) => ISSET(value) ? ('' + value) : '';\n\n/**\n * Returns the first non-null non-undefined value as a string.\n *\n * @param {*} values\n * @returns {string}\n */\nexport const STRING_ANY = (...values) =>\n{\n\tfor(let value of values)\n\t{\n\t\tif(ISSET(value))\n\t\t{\n\t\t\treturn '' + value;\n\t\t}\n\t}\n\treturn '';\n};\n\n\n/**\n * Ensures the given value is an integer (attempts to cast it to an integer if it's not, null and undefined will return 0).\n *\n * @param {*} value\n * @returns {number}\n */\nexport const INT = (value) => Math.round(FLOAT(value));\n\n/**\n * Returns the first non-null non-undefined int-castable value as an integer.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const INT_ANY = (...values) => Math.round(FLOAT_ANY(...values));\n\n\n/**\n * Ensures the given value is a float (attempts to cast it to a float if it's not, null and undefined will return 0).\n *\n * @param {*} value\n * @returns {number}\n */\nexport const FLOAT = (value) =>\n{\n\tconst v = +value;\n\tif(!isNaN(v))\n\t{\n\t\treturn v;\n\t}\n\treturn 0;\n};\n\n/**\n * Returns the first non-null non-undefined float-castable value as a float.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const FLOAT_ANY = (...values) =>\n{\n\tfor(let value of values)\n\t{\n\t\tif(value !== null)\n\t\t{\n\t\t\tconst v = +value;\n\t\t\tif(!isNaN(v))\n\t\t\t{\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n};\n\n\n/**\n * Ensures the given value is an integer (attempts to cast it to an integer if it's not, null and undefined will return 0).\n * This version is less strict than INT, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} value\n * @returns {number}\n */\nexport const INT_LAX = (value) => Math.round(FLOAT_LAX(value));\n\n/**\n * Returns the first non-null non-undefined int-castable value as an integer.\n * This version is less strict than INT_ANY, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const INT_LAX_ANY = (...values) => Math.round(FLOAT_LAX_ANY(...values));\n\n\n/**\n * Ensures the given value is a float (attempts to cast it to a float if it's not, null and undefined will return 0).\n * This version is less strict than FLOAT, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} value\n * @returns {number}\n */\nexport const FLOAT_LAX = (value) =>\n{\n\tconst v = (typeof value === 'number') ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));\n\tif(!isNaN(v))\n\t{\n\t\treturn v;\n\t}\n\treturn 0;\n};\n\n/**\n * Returns the first non-null non-undefined float-castable value as a float.\n * This version is less strict than FLOAT_ANY, as it relies on parseFloat instead of on +value, meaning that it will accept strings that contain a number followed by other characters, which +value doesn't.\n *\n * @param {*} values\n * @returns {number}\n */\nexport const FLOAT_LAX_ANY = (...values) =>\n{\n\tfor(let value of values)\n\t{\n\t\tif(value !== null)\n\t\t{\n\t\t\tconst v = (typeof value === 'number') ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));\n\t\t\tif(!isNaN(v))\n\t\t\t{\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n};\n","import FastDeepEqual from 'fast-deep-equal';\nimport CloneDeep from 'clone-deep';\nimport {ISSET, IS_OBJECT, IS_ARRAY, STRING, INT_LAX, FLOAT_LAX, INT_LAX_ANY, FLOAT_LAX_ANY} from './LeTypes.js';\n\n\n/**\n * @param {LeUtils~TransactionalValue} transactionalValue\n */\nconst checkTransactionalValue = (transactionalValue) =>\n{\n\tif(!LeUtils.isTransactionalValueValid(transactionalValue))\n\t{\n\t\tconsole.error('The given value is not a valid TransactionalValue:');\n\t\tconsole.error(transactionalValue);\n\t\tthrow new Error('The given value is not a valid TransactionalValue');\n\t}\n};\n\n/**\n * @param {LeUtils~TransactionalValue} transactionalValue\n * @param {string} changeId\n * @returns {{index:number, value:*}|null}\n */\nconst findTransactionalValueChange = (transactionalValue, changeId) =>\n{\n\tfor(let i = 0; i < transactionalValue.changes.length; i++)\n\t{\n\t\tconst change = transactionalValue.changes[i];\n\t\tif(change.id === changeId)\n\t\t{\n\t\t\treturn {index:i, value:change.value};\n\t\t}\n\t}\n\treturn null;\n};\n\n\nexport const LeUtils = {\n\t/**\n\t * A deep equals implementation (npm package \"fast-deep-equal\").\n\t *\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns true if the values are equivalent.\n\t */\n\tequals:FastDeepEqual,\n\t\n\t/**\n\t * Parses the given version string, and returns an object with the major, minor, and patch numbers, as well as some comparison functions.\n\t *\n\t * Expects a version string such as:\n\t * - \"1\"\n\t * - \"1.2\"\n\t * - \"1.2.3\"\n\t * - \"1.2.3 anything\"\n\t * - \"1.2.3-anything\"\n\t *\n\t * @param {string|*} versionString\n\t * @returns {{major: (number), minor: (number), patch: (number), toString: (function(): string), equals: (function(string|*): boolean), smallerThan: (function(string|*): boolean), smallerThanOrEquals: (function(string|*): boolean), largerThan: (function(string|*): boolean), largerThanOrEquals: (function(string|*): boolean)}}\n\t */\n\tparseVersionString:\n\t\t(versionString) =>\n\t\t{\n\t\t\tif(IS_OBJECT(versionString) && ISSET(versionString?.major) && ISSET(versionString?.minor) && ISSET(versionString?.patch))\n\t\t\t{\n\t\t\t\treturn versionString;\n\t\t\t}\n\t\t\t\n\t\t\tversionString = STRING(versionString).trim();\n\t\t\tconst partsVersion = versionString.split(' ')[0].split('-')[0].split('.');\n\t\t\tconst major = INT_LAX(partsVersion[0]);\n\t\t\tconst minor = INT_LAX(partsVersion[1]);\n\t\t\tconst patch = INT_LAX(partsVersion[2]);\n\t\t\t\n\t\t\tconst THIS = {\n\t\t\t\tmajor:major,\n\t\t\t\tminor:minor,\n\t\t\t\tpatch:patch,\n\t\t\t\t\n\t\t\t\ttoString:\n\t\t\t\t\t() => major + '.' + minor + '.' + patch,\n\t\t\t\t\n\t\t\t\tequals:\n\t\t\t\t\t(otherVersion) =>\n\t\t\t\t\t{\n\t\t\t\t\t\totherVersion = LeUtils.parseVersionString(otherVersion);\n\t\t\t\t\t\treturn (major === otherVersion.major) && (minor === otherVersion.minor) && (patch === otherVersion.patch);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\tlargerThan:\n\t\t\t\t\t(otherVersion) =>\n\t\t\t\t\t{\n\t\t\t\t\t\totherVersion = LeUtils.parseVersionString(otherVersion);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(major > otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(major < otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(minor > otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(minor < otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn (patch > otherVersion.patch);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\tlargerThanOrEquals:\n\t\t\t\t\t(otherVersion) =>\n\t\t\t\t\t{\n\t\t\t\t\t\totherVersion = LeUtils.parseVersionString(otherVersion);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(major > otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(major < otherVersion.major)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(minor > otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(minor < otherVersion.minor)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn (patch >= otherVersion.patch);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\tsmallerThan:\n\t\t\t\t\t(otherVersion) => !THIS.largerThanOrEquals(otherVersion),\n\t\t\t\t\n\t\t\t\tsmallerThanOrEquals:\n\t\t\t\t\t(otherVersion) => !THIS.largerThan(otherVersion),\n\t\t\t};\n\t\t\treturn THIS;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains the given value.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {*} value\n\t * @returns {boolean}\n\t */\n\tcontains:\n\t\t(array, value) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tvalue = STRING(value);\n\t\t\tLeUtils.each(array, (val) =>\n\t\t\t{\n\t\t\t\tif(STRING(val) === value)\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains the given value.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {*} value\n\t * @returns {boolean}\n\t */\n\tcontainsCaseInsensitive:\n\t\t(array, value) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tvalue = STRING(value).toLowerCase();\n\t\t\tLeUtils.each(array, (val) =>\n\t\t\t{\n\t\t\t\tif(STRING(val).toLowerCase() === value)\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains all the given values.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAll:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(!LeUtils.contains(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains all the given values.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAllCaseInsensitive:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(!LeUtils.containsCaseInsensitive(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains any of the given values.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAny:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.contains(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains any of the given values.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsAnyCaseInsensitive:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.containsCaseInsensitive(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains none of the given values.\n\t *\n\t * Values are compared by casting both of them to a string.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsNone:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.contains(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the array or object contains none of the given values.\n\t *\n\t * Values are compared by casting both of them to a string, and then lowercasing them.\n\t *\n\t * @param {array|object|Function} array\n\t * @param {array|object|Function} values\n\t * @returns {boolean}\n\t */\n\tcontainsNoneCaseInsensitive:\n\t\t(array, values) =>\n\t\t{\n\t\t\tif(!array)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tlet result = true;\n\t\t\tLeUtils.each(values, function(value)\n\t\t\t{\n\t\t\t\tif(LeUtils.containsCaseInsensitive(array, value))\n\t\t\t\t{\n\t\t\t\t\tresult = false;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__eachCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through each element in the given array or object, and calls the callback for each element.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__eachCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|Function}\n\t */\n\teach:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) === false)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) === false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.each() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn elements;\n\t\t},\n\t\n\t/**\n\t * Like LeUtils.each(), except that it expects an async callback.\n\t *\n\t * @param {*[]|object|function} elements\n\t * @param {LeUtils~__eachCallback} asyncCallback\n\t * @param {number} [optionalParallelCount]\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|function}\n\t */\n\teachAsync:\n\t\t(() =>\n\t\t{\n\t\t\tconst eachAsyncParallel = async (elements, asyncCallback, optionalParallelCount, optionalSkipHasOwnPropertyCheck) =>\n\t\t\t{\n\t\t\t\tlet promises = [];\n\t\t\t\tlet doBreak = false;\n\t\t\t\tawait LeUtils.eachAsync(elements, async (element, index) =>\n\t\t\t\t{\n\t\t\t\t\twhile(promises.length > optionalParallelCount)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet newPromises = [];\n\t\t\t\t\t\tLeUtils.each(promises, (promise) =>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(!promise.__lowentry_utils__promise_is_done__)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnewPromises.push(promise);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tpromises = newPromises;\n\t\t\t\t\t\tif(promises.length > optionalParallelCount)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tawait Promise.any(promises);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(doBreak)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tconst promise = (async () =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif((await asyncCallback.call(element, element, index)) === false)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdoBreak = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpromise.__lowentry_utils__promise_is_done__ = true;\n\t\t\t\t\t})();\n\t\t\t\t\tpromises.push(promise);\n\t\t\t\t}, optionalSkipHasOwnPropertyCheck);\n\t\t\t\tawait Promise.all(promises);\n\t\t\t\treturn elements;\n\t\t\t};\n\t\t\t\n\t\t\treturn async (elements, asyncCallback, parallelCount = 1, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t\t{\n\t\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t\t{\n\t\t\t\t\tparallelCount = INT_LAX(parallelCount);\n\t\t\t\t\tif(parallelCount > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn await eachAsyncParallel(elements, asyncCallback, parallelCount, optionalSkipHasOwnPropertyCheck);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif((await asyncCallback.call(elements[index], elements[index], index)) === false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif((await asyncCallback.call(elements[index], elements[index], index)) === false)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tconsole.warn('Executed LeUtils.eachAsync() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn elements;\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * @callback LeUtils~__filterCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array or object, with only the elements that didn't return false from the callback.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__filterCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|Function}\n\t */\n\tfilter:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) !== false)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.push(elements[index]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tlet result = {};\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(callback.call(elements[index], elements[index], index) !== false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tresult[index] = elements[index];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.filter() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn elements;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__mapCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array or object, with the elements that were returned from the callback.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__mapCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]|object|Function}\n\t */\n\tmap:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tlet result = [];\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult[index] = callback.call(elements[index], elements[index], index);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tlet result = {};\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult[index] = callback.call(elements[index], elements[index], index);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.map() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn elements;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__mapToArrayCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array, with the elements that were returned from the callback. Always returns an array.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__mapToArrayCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]}\n\t */\n\tmapToArray:\n\t\t(elements, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tlet result = [];\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult.push(callback.call(elements[index], elements[index], index));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tresult.push(callback.call(elements[index], elements[index], index));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.mapToArray() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__mapToArraySortedCallback\n\t * @param {*} value\n\t * @param {*} index\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array, with the elements that were returned from the callback. The elements will be sorted by the result from the given comparator. Always returns an array.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__sortKeysComparatorCallback} comparator\n\t * @param {LeUtils~__mapToArraySortedCallback} callback\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]}\n\t */\n\tmapToArraySorted:\n\t\t(elements, comparator, callback, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tconst keys = LeUtils.sortKeys(elements, comparator, optionalSkipHasOwnPropertyCheck);\n\t\t\tlet result = [];\n\t\t\tfor(let i = 0; i < keys.length; i++)\n\t\t\t{\n\t\t\t\tresult.push(callback.call(elements[keys[i]], elements[keys[i]], keys[i]));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__sortKeysComparatorCallback\n\t * @param {*} elementA\n\t * @param {*} elementB\n\t */\n\t/**\n\t * Loops through the given elements, and returns a new array, with the keys from the given elements, sorted by the result from the given comparator. Always returns an array.\n\t *\n\t * @param {*[]|object|Function} elements\n\t * @param {LeUtils~__sortKeysComparatorCallback} comparator\n\t * @param {boolean} [optionalSkipHasOwnPropertyCheck]\n\t * @returns {*[]}\n\t */\n\tsortKeys:\n\t\t(elements, comparator, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tlet keys = [];\n\t\t\tif((elements !== null) && (typeof elements !== 'undefined'))\n\t\t\t{\n\t\t\t\tif(Array.isArray(elements))\n\t\t\t\t{\n\t\t\t\t\tfor(let index = 0; index < elements.length; index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tkeys.push(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if((typeof elements === 'object') || (typeof elements === 'function'))\n\t\t\t\t{\n\t\t\t\t\tfor(let index in elements)\n\t\t\t\t\t{\n\t\t\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, index))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkeys.push(index);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconsole.warn('Executed LeUtils.sortKeys() on an invalid type: [' + (typeof elements) + ']', elements);\n\t\t\t\t}\n\t\t\t}\n\t\t\tkeys.sort((a, b) => comparator(elements[a], elements[b]));\n\t\t\treturn keys;\n\t\t},\n\t\n\t/**\n\t * Turns the given value(s) into a 1 dimensional array.\n\t *\n\t * Does the same thing as Array.flat(Infinity).\n\t *\n\t * @param {*} array\n\t * @returns {*[]}\n\t */\n\tflattenArray:\n\t\t(() =>\n\t\t{\n\t\t\tconst flattenArrayRecursive = (result, array) =>\n\t\t\t{\n\t\t\t\tif(!Array.isArray(array))\n\t\t\t\t{\n\t\t\t\t\tresult.push(array);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tarray.forEach((entry) =>\n\t\t\t\t{\n\t\t\t\t\tflattenArrayRecursive(result, entry);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\treturn (array) =>\n\t\t\t{\n\t\t\t\tif(!Array.isArray(array))\n\t\t\t\t{\n\t\t\t\t\treturn [array];\n\t\t\t\t}\n\t\t\t\tlet result = [];\n\t\t\t\tarray.forEach((entry) =>\n\t\t\t\t{\n\t\t\t\t\tflattenArrayRecursive(result, entry);\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Compares two values. Primarily used for sorting.\n\t *\n\t * @param {*} a\n\t * @param {*} b\n\t * @returns {number}\n\t */\n\tcompare:\n\t\t(a, b) => (a < b) ? -1 : ((a > b) ? 1 : 0),\n\t\n\t/**\n\t * Compares two numbers. Primarily used for sorting.\n\t *\n\t * @param {number} a\n\t * @param {number} b\n\t * @returns {number}\n\t */\n\tcompareNumbers:\n\t\t(a, b) => a - b,\n\t\n\t/**\n\t * Compares two numeric strings. Primarily used for sorting.\n\t *\n\t * @param {string|number} a\n\t * @param {string|number} b\n\t * @returns {number}\n\t */\n\tcompareNumericStrings:\n\t\t(a, b) =>\n\t\t{\n\t\t\ta = STRING(a).trim();\n\t\t\tb = STRING(b).trim();\n\t\t\tif(a.length === b.length)\n\t\t\t{\n\t\t\t\treturn (a < b) ? -1 : ((a > b) ? 1 : 0);\n\t\t\t}\n\t\t\treturn (a.length < b.length) ? -1 : 1;\n\t\t},\n\t\n\t/**\n\t * Compares two strings generated by LeUtils.timestamp(). Primarily used for sorting.\n\t *\n\t * @param {string} a\n\t * @param {string} b\n\t * @returns {number}\n\t */\n\tcompareTimestampStrings:\n\t\t(a, b) =>\n\t\t{\n\t\t\ta = LeUtils.base64ToHex(STRING(a).replaceAll('-', '+').replaceAll('_', '/'));\n\t\t\tb = LeUtils.base64ToHex(STRING(b).replaceAll('-', '+').replaceAll('_', '/'));\n\t\t\treturn LeUtils.compare(a, b);\n\t\t},\n\t\n\t/**\n\t * Returns true if the given object is empty, false otherwise.\n\t *\n\t * @param {object} obj\n\t * @param [optionalSkipHasOwnPropertyCheck]\n\t * @returns {boolean}\n\t */\n\tisEmptyObject:\n\t\t(obj, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tfor(let field in obj)\n\t\t\t{\n\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(obj, field))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\n\t/**\n\t * Returns the number of fields in the given object.\n\t *\n\t * @param {object} obj\n\t * @param [optionalSkipHasOwnPropertyCheck]\n\t * @returns {number}\n\t */\n\tgetObjectFieldsCount:\n\t\t(obj, optionalSkipHasOwnPropertyCheck = false) =>\n\t\t{\n\t\t\tlet count = 0;\n\t\t\tfor(let field in obj)\n\t\t\t{\n\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(obj, field))\n\t\t\t\t{\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\t\n\t/**\n\t * Returns true if the given function is a generator function (like: \"function* (){}\"), returns false otherwise.\n\t *\n\t * @param {Function} func\n\t * @returns {boolean}\n\t */\n\tisGeneratorFunction:\n\t\t(() =>\n\t\t{\n\t\t\tconst GeneratorFunction = function* ()\n\t\t\t{\n\t\t\t}.constructor;\n\t\t\t\n\t\t\tconst AsyncGeneratorFunction = async function* ()\n\t\t\t{\n\t\t\t}.constructor;\n\t\t\t\n\t\t\tconst RegularFunction = function()\n\t\t\t{\n\t\t\t}.constructor;\n\t\t\t\n\t\t\tconst PossibleGeneratorFunctionNames = Array.from(new Set(['GeneratorFunction', 'AsyncFunction', 'AsyncGeneratorFunction', GeneratorFunction.name, GeneratorFunction.displayName, AsyncGeneratorFunction.name, AsyncGeneratorFunction.displayName])).filter((element) =>\n\t\t\t{\n\t\t\t\treturn (element && (element !== RegularFunction.name) && (element !== RegularFunction.displayName));\n\t\t\t});\n\t\t\t\n\t\t\treturn (func) =>\n\t\t\t{\n\t\t\t\tif(!func)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst constructor = func.constructor;\n\t\t\t\tif(!constructor)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn ((constructor.name && PossibleGeneratorFunctionNames.includes(constructor.name)) || (constructor.displayName && PossibleGeneratorFunctionNames.includes(constructor.displayName)));\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * @callback LeUtils~__setTimeoutCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback after the given number of milliseconds. Passes the elapsed time in seconds to the callback.\n\t *\n\t * To cancel the timeout, call remove() on the result of this function (example: \"const timeoutHandler = LeUtils.setTimeout((deltaTime)=>{}, 1000); timeoutHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setTimeoutCallback} callback ([number] deltaTime)\n\t * @param {number} ms\n\t * @returns {{remove:Function}}\n\t */\n\tsetTimeout:\n\t\t(callback, ms) =>\n\t\t{\n\t\t\tms = FLOAT_LAX(ms);\n\t\t\t\n\t\t\tlet lastTime = performance.now();\n\t\t\tlet handler = setTimeout(() =>\n\t\t\t{\n\t\t\t\tconst currentTime = performance.now();\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t\tlastTime = currentTime;\n\t\t\t}, ms);\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif(handler !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclearTimeout(handler);\n\t\t\t\t\t\t\thandler = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__setIntervalCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback every given number of milliseconds. Passes the time difference in seconds between the last frame and now to it.\n\t *\n\t * To remove the interval, call remove() on the result of this function (example: \"const intervalHandler = LeUtils.setInterval((deltaTime)=>{}, 1000); intervalHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setIntervalCallback} callback ([number] deltaTime)\n\t * @param {number} [intervalMs]\n\t * @param {boolean} [fireImmediately]\n\t * @returns {{remove:Function}}\n\t */\n\tsetInterval:\n\t\t(callback, intervalMs = 1000, fireImmediately = false) =>\n\t\t{\n\t\t\tintervalMs = FLOAT_LAX_ANY(intervalMs, 1000);\n\t\t\t\n\t\t\tif(fireImmediately)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback(0);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet lastTime = performance.now();\n\t\t\tlet handler = setInterval(() =>\n\t\t\t{\n\t\t\t\tconst currentTime = performance.now();\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t\tlastTime = currentTime;\n\t\t\t}, intervalMs);\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\tif(handler !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclearInterval(handler);\n\t\t\t\t\t\t\thandler = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__setAnimationFrameTimeoutCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback after the given number of frames. Passes the elapsed time in seconds to the callback.\n\t *\n\t * To cancel the timeout, call remove() on the result of this function (example: \"const timeoutHandler = LeUtils.setAnimationFrameTimeout((deltaTime){}, 5); timeoutHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setAnimationFrameTimeoutCallback} callback ([number] deltaTime)\n\t * @param {number} [frames]\n\t * @returns {{remove:Function}}\n\t */\n\tsetAnimationFrameTimeout:\n\t\t(callback, frames = 1) =>\n\t\t{\n\t\t\tframes = INT_LAX_ANY(frames, 1);\n\t\t\t\n\t\t\tlet run = true;\n\t\t\tlet requestAnimationFrameId = null;\n\t\t\tlet lastTime = performance.now();\n\t\t\tconst tick = () =>\n\t\t\t{\n\t\t\t\tif(run)\n\t\t\t\t{\n\t\t\t\t\tif(frames <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\trun = false;\n\t\t\t\t\t\trequestAnimationFrameId = null;\n\t\t\t\t\t\tconst currentTime = performance.now();\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(e)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastTime = currentTime;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tframes--;\n\t\t\t\t\trequestAnimationFrameId = (typeof window === 'undefined') ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);\n\t\t\t\t}\n\t\t\t};\n\t\t\ttick();\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\trun = false;\n\t\t\t\t\t\tif(requestAnimationFrameId !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t(typeof window === 'undefined') ? clearTimeout(requestAnimationFrameId) : cancelAnimationFrame(requestAnimationFrameId);\n\t\t\t\t\t\t\trequestAnimationFrameId = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * @callback LeUtils~__setAnimationFrameIntervalCallback\n\t * @param {number} deltaTime\n\t */\n\t/**\n\t * Executes the callback every given number of frames. Passes the time difference in seconds between the last frame and now to it.\n\t *\n\t * To remove the interval, call remove() on the result of this function (example: \"const intervalHandler = LeUtils.setAnimationFrameInterval((deltaTime)=>{}, 5); intervalHandler.remove();\")\n\t *\n\t * @param {LeUtils~__setAnimationFrameIntervalCallback} callback ([number] deltaTime)\n\t * @param {number} [intervalFrames]\n\t * @param {boolean} [fireImmediately]\n\t * @returns {{remove:Function}}\n\t */\n\tsetAnimationFrameInterval:\n\t\t(callback, intervalFrames = 1, fireImmediately = false) =>\n\t\t{\n\t\t\tintervalFrames = INT_LAX_ANY(intervalFrames, 1);\n\t\t\t\n\t\t\tif(fireImmediately)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback(0);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet run = true;\n\t\t\tlet requestAnimationFrameId = null;\n\t\t\tlet lastTime = performance.now();\n\t\t\tlet frames = intervalFrames;\n\t\t\tconst tick = () =>\n\t\t\t{\n\t\t\t\tif(run)\n\t\t\t\t{\n\t\t\t\t\tif(frames <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet currentTime = performance.now();\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(e)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastTime = currentTime;\n\t\t\t\t\t\tframes = intervalFrames;\n\t\t\t\t\t}\n\t\t\t\t\tframes--;\n\t\t\t\t\t\n\t\t\t\t\tif(run)\n\t\t\t\t\t{\n\t\t\t\t\t\trequestAnimationFrameId = (typeof window === 'undefined') ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t(typeof window === 'undefined') ? setTimeout(tick, 1000 / 60) : requestAnimationFrame(tick);\n\t\t\t\n\t\t\treturn {\n\t\t\t\tremove:\n\t\t\t\t\t() =>\n\t\t\t\t\t{\n\t\t\t\t\t\trun = false;\n\t\t\t\t\t\tif(requestAnimationFrameId !== null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t(typeof window === 'undefined') ? clearTimeout(requestAnimationFrameId) : cancelAnimationFrame(requestAnimationFrameId);\n\t\t\t\t\t\t\trequestAnimationFrameId = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\n\t/**\n\t * Returns a promise, which will be resolved after the given number of milliseconds.\n\t *\n\t * @param {number} ms\n\t * @returns {Promise}\n\t */\n\tpromiseTimeout:\n\t\t(ms) =>\n\t\t{\n\t\t\tms = FLOAT_LAX(ms);\n\t\t\tif(ms <= 0)\n\t\t\t{\n\t\t\t\treturn new Promise(resolve => resolve());\n\t\t\t}\n\t\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t\t},\n\t\n\t/**\n\t * Returns a promise, which will be resolved after the given number of frames.\n\t *\n\t * @param {number} frames\n\t * @returns {Promise}\n\t */\n\tpromiseAnimationFrameTimeout:\n\t\t(frames) =>\n\t\t{\n\t\t\tframes = INT_LAX(frames);\n\t\t\tif(frames <= 0)\n\t\t\t{\n\t\t\t\treturn new Promise(resolve => resolve());\n\t\t\t}\n\t\t\treturn new Promise(resolve => LeUtils.setAnimationFrameTimeout(resolve, frames));\n\t\t},\n\t\n\t/**\n\t * Returns true if the user is on a smartphone device (mobile).\n\t * Will return false if the user is on a tablet or on a desktop.\n\t *\n\t * In short:\n\t * - Mobile: True\n\t * - Tablet: False\n\t * - Desktop: False\n\t *\n\t * @returns {boolean}\n\t */\n\tplatformIsMobile:\n\t\t() =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// noinspection JSDeprecatedSymbols, JSUnresolvedReference\n\t\t\t/** navigator.userAgentData.mobile doesn't return the correct value on some platforms, so this is a work-around, code from: http://detectmobilebrowsers.com **/\n\t\t\tconst a = STRING(window.navigator?.userAgent || window.navigator?.vendor || window.opera || '');\n\t\t\tconst b = a.substring(0, 4);\n\t\t\treturn !!(\n\t\t\t\t/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series([46])0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i\n\t\t\t\t\t.test(a) ||\n\t\t\t\t/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \\-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i\n\t\t\t\t\t.test(b)\n\t\t\t);\n\t\t},\n\t\n\t/**\n\t * Returns true if the user has a cursor (mouse, touchpad, etc).\n\t * In this context, a cursor is defined as an input device that can hover over elements without necessarily interacting with them.\n\t *\n\t * @returns {boolean}\n\t */\n\tplatformHasCursor:\n\t\t() =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !LeUtils.platformIsMobile() && !window.matchMedia('(any-hover: none)')?.matches;\n\t\t},\n\t\n\t/**\n\t * Returns the given string, with the first character capitalized.\n\t *\n\t * @param {String} string\n\t * @returns {string}\n\t */\n\tcapitalize:\n\t\t(string) =>\n\t\t{\n\t\t\tstring = STRING(string).trim();\n\t\t\tif(string.length <= 0)\n\t\t\t{\n\t\t\t\treturn string;\n\t\t\t}\n\t\t\treturn string.charAt(0).toUpperCase() + string.slice(1);\n\t\t},\n\t\n\t/**\n\t * Returns true if the given string ends with any of the given characters or words.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} endingCharsStringOrArray\n\t * @returns {boolean}\n\t */\n\tendsWithAny:\n\t\t(string, endingCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet endingCharsArray;\n\t\t\tif(Array.isArray(endingCharsStringOrArray))\n\t\t\t{\n\t\t\t\tendingCharsArray = endingCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tendingCharsArray = STRING(endingCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(endingCharsArray, (chars) =>\n\t\t\t{\n\t\t\t\tif(string.endsWith(STRING(chars)))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Returns true if the given string starts with any of the given characters or words.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} startingCharsStringOrArray\n\t * @returns {boolean}\n\t */\n\tstartsWithAny:\n\t\t(string, startingCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet startingCharsArray;\n\t\t\tif(Array.isArray(startingCharsStringOrArray))\n\t\t\t{\n\t\t\t\tstartingCharsArray = startingCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstartingCharsArray = STRING(startingCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tlet result = false;\n\t\t\tLeUtils.each(startingCharsArray, (chars) =>\n\t\t\t{\n\t\t\t\tif(string.startsWith(STRING(chars)))\n\t\t\t\t{\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * Trims the end of the given string, by removing the given characters from it.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} trimCharsStringOrArray\n\t */\n\ttrimEnd:\n\t\t(string, trimCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet endingCharsArray;\n\t\t\tif(Array.isArray(trimCharsStringOrArray))\n\t\t\t{\n\t\t\t\tendingCharsArray = trimCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tendingCharsArray = STRING(trimCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tconst trimChars = (chars) =>\n\t\t\t{\n\t\t\t\tchars = STRING(chars);\n\t\t\t\tif(string.endsWith(chars))\n\t\t\t\t{\n\t\t\t\t\tstring = string.substring(0, string.length - chars.length);\n\t\t\t\t\trun = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet run = true;\n\t\t\twhile(run)\n\t\t\t{\n\t\t\t\trun = false;\n\t\t\t\tLeUtils.each(endingCharsArray, trimChars);\n\t\t\t}\n\t\t\treturn string;\n\t\t},\n\t\n\t/**\n\t * Trims the start of the given string, by removing the given characters from it.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} trimCharsStringOrArray\n\t */\n\ttrimStart:\n\t\t(string, trimCharsStringOrArray) =>\n\t\t{\n\t\t\tstring = STRING(string);\n\t\t\tlet startingCharsArray;\n\t\t\tif(Array.isArray(trimCharsStringOrArray))\n\t\t\t{\n\t\t\t\tstartingCharsArray = trimCharsStringOrArray;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstartingCharsArray = STRING(trimCharsStringOrArray).split('');\n\t\t\t}\n\t\t\tconst trimChars = (chars) =>\n\t\t\t{\n\t\t\t\tchars = STRING(chars);\n\t\t\t\tif(string.startsWith(chars))\n\t\t\t\t{\n\t\t\t\t\tstring = string.substring(chars.length);\n\t\t\t\t\trun = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet run = true;\n\t\t\twhile(run)\n\t\t\t{\n\t\t\t\trun = false;\n\t\t\t\tLeUtils.each(startingCharsArray, trimChars);\n\t\t\t}\n\t\t\treturn string;\n\t\t},\n\t\n\t/**\n\t * Trims the start and end of the given string, by removing the given characters from it.\n\t *\n\t * @param {string} string\n\t * @param {string|string[]} trimCharsStringOrArray\n\t */\n\ttrim:\n\t\t(string, trimCharsStringOrArray) => LeUtils.trimEnd(LeUtils.trimStart(string, trimCharsStringOrArray), trimCharsStringOrArray),\n\t\n\t/**\n\t * Returns the given string, trims the start and end, and makes sure it ends with a valid sentence ending character (such as !?;.).\n\t *\n\t * @param {string} sentence\n\t * @returns {string}\n\t */\n\tpurgeSentence:\n\t\t(sentence) =>\n\t\t{\n\t\t\tsentence = LeUtils.trimEnd(STRING(sentence).trim(), '.: \\r\\n\\t');\n\t\t\tsentence += (LeUtils.endsWithAny(sentence, '!?;') ? '' : '.');\n\t\t\treturn sentence;\n\t\t},\n\t\n\t/**\n\t * Attempts to obtain and return an error message from the given error, regardless of what is passed to this function.\n\t *\n\t * @param {*} error\n\t * @returns {string}\n\t */\n\tpurgeErrorMessage:\n\t\t(error) =>\n\t\t{\n\t\t\tconst message = STRING(((typeof error === 'string') ? error : (error.message ?? JSON.stringify(error))));\n\t\t\tconst messageParts = message.split('threw an error:');\n\t\t\treturn messageParts[messageParts.length - 1].trim();\n\t\t},\n\t\n\t/**\n\t * Generates all permutations of the given names.\n\t *\n\t * For example, if you pass \"foo\" and \"bar\", it will return:\n\t * - foobar\n\t * - fooBar\n\t * - FooBar\n\t * - foo-bar\n\t * - foo_bar\n\t *\n\t * @param {string} names\n\t * @returns {string[]}\n\t */\n\tgenerateNamePermutations:\n\t\t(...names) =>\n\t\t{\n\t\t\tnames = LeUtils.flattenArray(names)\n\t\t\t\t.map(name => STRING(name).trim().toLowerCase())\n\t\t\t\t.filter(name => (name.length > 0));\n\t\t\tlet results = [];\n\t\t\tif(names.length > 0)\n\t\t\t{\n\t\t\t\tresults.push(names.join('')); //foobar\n\t\t\t\tresults.push(names.map(LeUtils.capitalize).join('')); //FooBar\n\t\t\t}\n\t\t\tif(names.length > 1)\n\t\t\t{\n\t\t\t\tresults.push([names[0]].concat(names.slice(1).map(LeUtils.capitalize)).join('')); //fooBar\n\t\t\t\tresults.push(names.join('-')); //foo-bar\n\t\t\t\tresults.push(names.join('_')); //foo_bar\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\t\n\t/**\n\t * Increases the given numeric string by 1, this allows you to increase a numeric string without a limit.\n\t *\n\t * @param {string} string\n\t * @returns {string}\n\t */\n\tincreaseNumericStringByOne:\n\t\t(string) =>\n\t\t{\n\t\t\tif(typeof string !== 'string')\n\t\t\t{\n\t\t\t\tstring = '' + string;\n\t\t\t\tfor(let i = string.length - 1; i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tconst c = string.charAt(i);\n\t\t\t\t\tif((c < '0') || (c > '9'))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn '1';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(string === '')\n\t\t\t{\n\t\t\t\treturn '1';\n\t\t\t}\n\t\t\tfor(let i = string.length - 1; i >= 0; i--)\n\t\t\t{\n\t\t\t\tlet c = string.charAt(i);\n\t\t\t\tif((c < '0') || (c > '9'))\n\t\t\t\t{\n\t\t\t\t\treturn '1';\n\t\t\t\t}\n\t\t\t\tif(c < '9')\n\t\t\t\t{\n\t\t\t\t\tc++;\n\t\t\t\t\tstring = string.substring(0, i) + c + string.substring(i + 1);// string[i] = (char + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tstring = string.substring(0, i) + '0' + string.substring(i + 1);// string[i] = '0';\n\t\t\t}\n\t\t\tif(string.charAt(0) === '0')\n\t\t\t{\n\t\t\t\tstring = '1' + string;\n\t\t\t}\n\t\t\treturn string;\n\t\t},\n\t\n\t/**\n\t * Generates a base64 string (with +/ replaced by -_) that is guaranteed to be unique.\n\t *\n\t * @returns {string}\n\t */\n\tuniqueId:\n\t\t(() =>\n\t\t{\n\t\t\tlet previousUniqueIdsTime = null;\n\t\t\tlet previousUniqueIds = {};\n\t\t\t\n\t\t\tconst numberToBytes = (number) =>\n\t\t\t{\n\t\t\t\tconst size = (number === 0) ? 0 : Math.ceil((Math.floor(Math.log2(number)) + 1) / 8);\n\t\t\t\tconst bytes = new Uint8ClampedArray(size);\n\t\t\t\tlet x = number;\n\t\t\t\tfor(let i = (size - 1); i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tconst rightByte = x & 0xff;\n\t\t\t\t\tbytes[i] = rightByte;\n\t\t\t\t\tx = Math.floor(x / 0x100);\n\t\t\t\t}\n\t\t\t\treturn bytes;\n\t\t\t};\n\t\t\t\n\t\t\tconst generateUniqueId = () =>\n\t\t\t{\n\t\t\t\tlet now;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// noinspection JSDeprecatedSymbols\n\t\t\t\t\tnow = (performance.timeOrigin || performance.timing.navigationStart) + performance.now();\n\t\t\t\t\tif(typeof now !== 'number')\n\t\t\t\t\t{\n\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tnow = (Date.now ? Date.now() : (new Date()).getTime());\n\t\t\t\t}\n\t\t\t\tnow = Math.round(now);\n\t\t\t\tconst nowBytes = numberToBytes(now);\n\t\t\t\t\n\t\t\t\tlet uuid = null;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tuuid = crypto?.randomUUID();\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(uuid)\n\t\t\t\t{\n\t\t\t\t\tuuid = LeUtils.base64ToBytes(LeUtils.hexToBase64(uuid));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst bytesChunkA = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tconst bytesChunkB = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tconst bytesChunkC = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tconst bytesChunkD = numberToBytes((Math.random() + ' ').substring(2, 12).padEnd(10, '0'));\n\t\t\t\t\tuuid = new Uint8Array(bytesChunkA.length + bytesChunkB.length + bytesChunkC.length + bytesChunkD.length);\n\t\t\t\t\tuuid.set(bytesChunkA, 0);\n\t\t\t\t\tuuid.set(bytesChunkB, bytesChunkA.length);\n\t\t\t\t\tuuid.set(bytesChunkC, bytesChunkA.length + bytesChunkB.length);\n\t\t\t\t\tuuid.set(bytesChunkD, bytesChunkA.length + bytesChunkB.length + bytesChunkC.length);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst bytes = new Uint8Array(nowBytes.length + uuid.length);\n\t\t\t\tbytes.set(nowBytes, 0);\n\t\t\t\tbytes.set(uuid, nowBytes.length);\n\t\t\t\tuuid = LeUtils.bytesToBase64(bytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\ttime:now,\n\t\t\t\t\tid: uuid,\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\treturn () =>\n\t\t\t{\n\t\t\t\twhile(true)\n\t\t\t\t{\n\t\t\t\t\tconst result = generateUniqueId();\n\t\t\t\t\tif(previousUniqueIdsTime !== result.time)\n\t\t\t\t\t{\n\t\t\t\t\t\tpreviousUniqueIdsTime = result.time;\n\t\t\t\t\t\tpreviousUniqueIds = {[result.id]:true};\n\t\t\t\t\t\treturn result.id;\n\t\t\t\t\t}\n\t\t\t\t\telse if(previousUniqueIds[result.id] !== true)\n\t\t\t\t\t{\n\t\t\t\t\t\tpreviousUniqueIds[result.id] = true;\n\t\t\t\t\t\treturn result.id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Generates a base64 string (with +/ replaced by -_) of the current time (in milliseconds since 1970).\n\t *\n\t * @param {number} [now] Optional time to use instead of the current time. If not set, the current time will be used.\n\t * @returns {string}\n\t */\n\ttimestamp:\n\t\t(() =>\n\t\t{\n\t\t\tconst numberToBytes = (number) =>\n\t\t\t{\n\t\t\t\tconst size = (number === 0) ? 0 : Math.ceil((Math.floor(Math.log2(number)) + 1) / 8);\n\t\t\t\tconst bytes = new Uint8ClampedArray(size);\n\t\t\t\tlet x = number;\n\t\t\t\tfor(let i = (size - 1); i >= 0; i--)\n\t\t\t\t{\n\t\t\t\t\tconst rightByte = x & 0xff;\n\t\t\t\t\tbytes[i] = rightByte;\n\t\t\t\t\tx = Math.floor(x / 0x100);\n\t\t\t\t}\n\t\t\t\treturn bytes;\n\t\t\t};\n\t\t\t\n\t\t\treturn (now = null) =>\n\t\t\t{\n\t\t\t\tif(ISSET(now))\n\t\t\t\t{\n\t\t\t\t\tnow = FLOAT_LAX(now);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\t// noinspection JSDeprecatedSymbols\n\t\t\t\t\t\tnow = (performance.timeOrigin || performance.timing.navigationStart) + performance.now();\n\t\t\t\t\t\tif(typeof now !== 'number')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthrow new Error();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch(e)\n\t\t\t\t\t{\n\t\t\t\t\t\tnow = (Date.now ? Date.now() : (new Date()).getTime());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnow = Math.round(now);\n\t\t\t\tconst nowBytes = numberToBytes(now);\n\t\t\t\t\n\t\t\t\treturn LeUtils.bytesToBase64(nowBytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns a data URL of a 1x1 transparent pixel.\n\t *\n\t * @returns {string}\n\t */\n\tgetEmptyImageSrc:\n\t\t() =>\n\t\t{\n\t\t\t// noinspection SpellCheckingInspection\n\t\t\treturn 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\t\t},\n\t\n\t/**\n\t * Calculates and returns the percentage of the part and total ((part / total) * 100).\n\t *\n\t * @param {number|string} part\n\t * @param {number|string} total\n\t * @returns {number}\n\t */\n\tgetPercentage:\n\t\t(part, total) =>\n\t\t{\n\t\t\tpart = FLOAT_LAX(part);\n\t\t\ttotal = FLOAT_LAX(total);\n\t\t\tif(total <= 0)\n\t\t\t{\n\t\t\t\treturn 100;\n\t\t\t}\n\t\t\treturn Math.max(0, Math.min(100, ((part / total) * 100)));\n\t\t},\n\t\n\t/**\n\t * Returns the pixels of the given Image object.\n\t *\n\t * @param {HTMLImageElement} image\n\t * @returns {Uint8ClampedArray}\n\t */\n\tgetImagePixels:\n\t\t(image) =>\n\t\t{\n\t\t\tif(!document)\n\t\t\t{\n\t\t\t\treturn new Uint8ClampedArray();\n\t\t\t}\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tdocument.body.appendChild(canvas);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconst ctx = canvas.getContext('2d');\n\t\t\t\tconst width = Math.floor(image.width);\n\t\t\t\tconst height = Math.floor(image.height);\n\t\t\t\tif((width <= 0) || (height <= 0))\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = 1;\n\t\t\t\t\tcanvas.height = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = width;\n\t\t\t\t\tcanvas.height = height;\n\t\t\t\t\tctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\t\t\t\t}\n\t\t\t\treturn ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tcanvas.parentNode.removeChild(canvas);\n\t\t\t}\n\t\t},\n\t\n\t/**\n\t * Returns the data URL (mimetype \"image/png\") of a colored version of the given Image object.\n\t *\n\t * @param {HTMLImageElement} image\n\t * @param {string} color\n\t * @returns {string}\n\t */\n\tgetColoredImage:\n\t\t(image, color) =>\n\t\t{\n\t\t\tif(!document)\n\t\t\t{\n\t\t\t\treturn LeUtils.getEmptyImageSrc();\n\t\t\t}\n\t\t\tconst canvas = document.createElement('canvas');\n\t\t\tdocument.body.appendChild(canvas);\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconst ctx = canvas.getContext('2d');\n\t\t\t\tconst width = Math.floor(image.width);\n\t\t\t\tconst height = Math.floor(image.height);\n\t\t\t\tif((width <= 0) || (height <= 0))\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = 1;\n\t\t\t\t\tcanvas.height = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcanvas.width = width;\n\t\t\t\t\tcanvas.height = height;\n\t\t\t\t\tctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\t\t\t\t}\n\t\t\t\tctx.globalCompositeOperation = 'source-in';\n\t\t\t\tctx.fillStyle = color;\n\t\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\t\t\t\treturn canvas.toDataURL('image/png');\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tcanvas.parentNode.removeChild(canvas);\n\t\t\t}\n\t\t},\n\t\n\t/**\n\t * Returns the hex color of the given RGB(A).\n\t *\n\t * @param {number[]} rgb\n\t * @returns {string}\n\t */\n\trgbToHex:\n\t\t(rgb) =>\n\t\t{\n\t\t\treturn '#' + rgb.map((x) =>\n\t\t\t{\n\t\t\t\tconst hex = x.toString(16);\n\t\t\t\treturn ((hex.length === 1) ? '0' + hex : hex);\n\t\t\t}).join('');\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) of the given hex color.\n\t *\n\t * @param {string} hexstring\n\t * @returns {number[]}\n\t */\n\thexToRgb:\n\t\t(hexstring) =>\n\t\t{\n\t\t\thexstring = hexstring.replace(/[^0-9A-F]/gi, '');\n\t\t\tconst hasAlpha = ((hexstring.length === 4) || (hexstring.length === 8));\n\t\t\twhile(hexstring.length < 6)\n\t\t\t{\n\t\t\t\thexstring = hexstring.replace(/(.)/g, '$1$1');\n\t\t\t}\n\t\t\tconst result = hexstring.match(/\\w{2}/g).map((a) => parseInt(a, 16));\n\t\t\treturn [\n\t\t\t\tresult[0],\n\t\t\t\tresult[1],\n\t\t\t\tresult[2],\n\t\t\t\t...(hasAlpha ? [result[3]] : []),\n\t\t\t];\n\t\t},\n\t\n\t/**\n\t * Returns the HSL(A) of the given RGB(A).\n\t *\n\t * @param {number[]} rgb\n\t * @returns {number[]}\n\t */\n\trgbToHsl:\n\t\t(rgb) =>\n\t\t{\n\t\t\tconst r = rgb[0] / 255;\n\t\t\tconst g = rgb[1] / 255;\n\t\t\tconst b = rgb[2] / 255;\n\t\t\tconst max = Math.max(r, g, b);\n\t\t\tconst min = Math.min(r, g, b);\n\t\t\tlet h, s, l = (max + min) / 2;\n\t\t\tif(max === min)\n\t\t\t{\n\t\t\t\th = s = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst d = max - min;\n\t\t\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\t\t\tswitch(max)\n\t\t\t\t{\n\t\t\t\t\tcase r:\n\t\t\t\t\t\th = (g - b) / d + (g < b ? 6 : 0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase g:\n\t\t\t\t\t\th = (b - r) / d + 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase b:\n\t\t\t\t\t\th = (r - g) / d + 4;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\th /= 6;\n\t\t\t}\n\t\t\treturn [h, s, l, ...((rgb.length >= 4) ? [rgb[3] / 255] : [])];\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) of the given HSL(A).\n\t *\n\t * @param {number[]} hsl\n\t * @returns {number[]}\n\t */\n\thslToRgb:\n\t\t(() =>\n\t\t{\n\t\t\tconst hue2rgb = (p, q, t) =>\n\t\t\t{\n\t\t\t\tif(t < 0)\n\t\t\t\t{\n\t\t\t\t\tt += 1;\n\t\t\t\t}\n\t\t\t\tif(t > 1)\n\t\t\t\t{\n\t\t\t\t\tt -= 1;\n\t\t\t\t}\n\t\t\t\tif(t < 1 / 6)\n\t\t\t\t{\n\t\t\t\t\treturn p + (q - p) * 6 * t;\n\t\t\t\t}\n\t\t\t\tif(t < 1 / 2)\n\t\t\t\t{\n\t\t\t\t\treturn q;\n\t\t\t\t}\n\t\t\t\tif(t < 2 / 3)\n\t\t\t\t{\n\t\t\t\t\treturn p + (q - p) * (2 / 3 - t) * 6;\n\t\t\t\t}\n\t\t\t\treturn p;\n\t\t\t};\n\t\t\treturn (hsl) =>\n\t\t\t{\n\t\t\t\tconst h = hsl[0];\n\t\t\t\tconst s = hsl[1];\n\t\t\t\tconst l = hsl[2];\n\t\t\t\tlet r, g, b;\n\t\t\t\tif(s === 0)\n\t\t\t\t{\n\t\t\t\t\tr = g = b = l;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst q = (l < 0.5) ? (l * (1 + s)) : (l + s - (l * s));\n\t\t\t\t\tconst p = (2 * l) - q;\n\t\t\t\t\tr = hue2rgb(p, q, h + (1 / 3));\n\t\t\t\t\tg = hue2rgb(p, q, h);\n\t\t\t\t\tb = hue2rgb(p, q, h - (1 / 3));\n\t\t\t\t}\n\t\t\t\treturn [r * 255, g * 255, b * 255, ...((hsl.length >= 4) ? [hsl[3] * 255] : [])].map((c) => Math.max(0, Math.min(255, Math.round(c))));\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns the LAB(A) of the given RGB(A).\n\t *\n\t * @param {number[]} rgb\n\t * @returns {number[]}\n\t */\n\trgbToLab:\n\t\t(rgb) =>\n\t\t{\n\t\t\tlet r = rgb[0] / 255;\n\t\t\tlet g = rgb[1] / 255;\n\t\t\tlet b = rgb[2] / 255;\n\t\t\tr = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : (r / 12.92);\n\t\t\tg = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : (g / 12.92);\n\t\t\tb = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : (b / 12.92);\n\t\t\tlet x = ((r * 0.4124) + (g * 0.3576) + (b * 0.1805)) / 0.95047;\n\t\t\tlet y = ((r * 0.2126) + (g * 0.7152) + (b * 0.0722));\n\t\t\tlet z = ((r * 0.0193) + (g * 0.1192) + (b * 0.9505)) / 1.08883;\n\t\t\tx = (x > 0.008856) ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\t\t\ty = (y > 0.008856) ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\t\t\tz = (z > 0.008856) ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\t\t\treturn [(116 * y) - 16, 500 * (x - y), 200 * (y - z), ...((rgb.length >= 4) ? [rgb[3] / 255] : [])];\n\t\t},\n\t\n\t/**\n\t * Returns the difference (calculated with DeltaE) of the LAB values of the given RGB values.\n\t *\n\t * Returns a number:\n\t *\n\t * <pre>\n\t * < 1.0 is not perceptible by human eyes\n\t * 1-2 is perceptible through close observation\n\t * 2-10 is perceptible at a glance\n\t * 11-49 is more similar than opposite\n\t * 100 is exactly the opposite color\n\t * </pre>\n\t *\n\t * @param {number[]} rgbA\n\t * @param {number[]} rgbB\n\t * @returns {number}\n\t */\n\tgetDifferenceBetweenRgb:\n\t\t(rgbA, rgbB) =>\n\t\t{\n\t\t\tconst labA = LeUtils.rgbToLab(rgbA);\n\t\t\tconst labB = LeUtils.rgbToLab(rgbB);\n\t\t\treturn LeUtils.getDifferenceBetweenLab(labA, labB);\n\t\t},\n\t\n\t/**\n\t * Returns the difference (calculated with DeltaE) of the given LAB values. Ignores the Alpha channel.\n\t *\n\t * Returns a number:\n\t *\n\t * <pre>\n\t * < 1.0 is not perceptible by human eyes\n\t * 1-2 is perceptible through close observation\n\t * 2-10 is perceptible at a glance\n\t * 11-49 is more similar than opposite\n\t * 100 is exactly the opposite color\n\t * </pre>\n\t *\n\t * @param {number[]} labA\n\t * @param {number[]} labB\n\t * @returns {number}\n\t */\n\tgetDifferenceBetweenLab:\n\t\t(labA, labB) =>\n\t\t{\n\t\t\tconst deltaL = labA[0] - labB[0];\n\t\t\tconst deltaA = labA[1] - labB[1];\n\t\t\tconst deltaB = labA[2] - labB[2];\n\t\t\tconst c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n\t\t\tconst c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n\t\t\tconst deltaC = c1 - c2;\n\t\t\tlet deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n\t\t\tdeltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\t\t\tconst sc = 1.0 + 0.045 * c1;\n\t\t\tconst sh = 1.0 + 0.015 * c1;\n\t\t\tconst deltaLKlsl = deltaL / (1.0);\n\t\t\tconst deltaCkcsc = deltaC / (sc);\n\t\t\tconst deltaHkhsh = deltaH / (sh);\n\t\t\tconst i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\t\t\treturn (i < 0) ? 0 : Math.sqrt(i);\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) of the given RGB(A) values, based on the given percentage (0-100).\n\t * This allows you to define a gradient of colors to fade in between, rather than just having a start and an end color.\n\t *\n\t * Usage:\n\t *\n\t * <pre>\n\t * LeUtils.getRgbOfGradient({\n\t * 0: [255, 0, 0],\n\t * 33: [255, 255, 0],\n\t * 66: [0, 255, 0],\n\t * 100:[0, 255, 255],\n\t * }, 45.1234);\n\t * </pre>\n\t *\n\t * @param {{[percentage]: number[]}} gradient\n\t * @param {number} percentage\n\t * @returns {number[]}\n\t */\n\tgetRgbOfGradient:\n\t\t(gradient, percentage) =>\n\t\t{\n\t\t\tpercentage = Math.max(0, Math.min(100, FLOAT_LAX(percentage)));\n\t\t\t\n\t\t\tlet closest = null;\n\t\t\tLeUtils.each(gradient, (color, percent) =>\n\t\t\t{\n\t\t\t\tpercent = INT_LAX(percent);\n\t\t\t\tif(closest === null)\n\t\t\t\t{\n\t\t\t\t\tclosest = [percent, Math.abs(percentage - percent)];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst difference = Math.abs(percentage - percent);\n\t\t\t\t\tif(difference < closest[1])\n\t\t\t\t\t{\n\t\t\t\t\t\tclosest = [percent, difference];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(closest === null)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tclosest = closest[0];\n\t\t\t\n\t\t\tlet higher = 99999;\n\t\t\tlet lower = -99999;\n\t\t\tLeUtils.each(gradient, (color, percent) =>\n\t\t\t{\n\t\t\t\tpercent = INT_LAX(percent);\n\t\t\t\tif(percent < closest)\n\t\t\t\t{\n\t\t\t\t\tif(percent > lower)\n\t\t\t\t\t{\n\t\t\t\t\t\tlower = percent;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(percent > closest)\n\t\t\t\t{\n\t\t\t\t\tif(percent < higher)\n\t\t\t\t\t{\n\t\t\t\t\t\thigher = percent;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(higher === 99999)\n\t\t\t{\n\t\t\t\thigher = null;\n\t\t\t}\n\t\t\tif(lower === -99999)\n\t\t\t{\n\t\t\t\tlower = null;\n\t\t\t}\n\t\t\t\n\t\t\tif(((higher === null) && (lower === null)) || (higher === lower))\n\t\t\t{\n\t\t\t\treturn gradient[closest];\n\t\t\t}\n\t\t\telse if((higher !== null) && (lower !== null))\n\t\t\t{\n\t\t\t\tconst higherDifference = Math.abs(higher - percentage);\n\t\t\t\tconst lowerDifference = Math.abs(percentage - lower);\n\t\t\t\tif(higherDifference > lowerDifference)\n\t\t\t\t{\n\t\t\t\t\thigher = closest;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlower = closest;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(lower === null)\n\t\t\t{\n\t\t\t\tlower = closest;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thigher = closest;\n\t\t\t}\n\t\t\t\n\t\t\tif(lower > higher)\n\t\t\t{\n\t\t\t\tconst tmp = higher;\n\t\t\t\thigher = lower;\n\t\t\t\tlower = tmp;\n\t\t\t}\n\t\t\t\n\t\t\tconst total = (higher - lower);\n\t\t\tconst part = (percentage - lower);\n\t\t\treturn LeUtils.getRgbBetween(gradient[lower], gradient[higher], ((part / total) * 100));\n\t\t},\n\t\n\t/**\n\t * Returns the RGB(A) between the two given RGB(A) values, based on the given percentage (0-100).\n\t *\n\t * @param {number[]} startRgb\n\t * @param {number[]} endRgb\n\t * @param {number} percentage\n\t * @returns {number[]}\n\t */\n\tgetRgbBetween:\n\t\t(startRgb, endRgb, percentage) =>\n\t\t{\n\t\t\tpercentage = FLOAT_LAX(percentage);\n\t\t\tconst partEnd = Math.max(0, Math.min(1, (percentage / 100.0)));\n\t\t\tconst partStart = (1 - partEnd);\n\t\t\tconst length = Math.min(startRgb.length, endRgb.length);\n\t\t\tlet result = [];\n\t\t\tfor(let i = 0; i < length; i++)\n\t\t\t{\n\t\t\t\tresult.push(Math.max(0, Math.min(255, Math.round((startRgb[i] * partStart) + (endRgb[i] * partEnd)))));\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\n\t/**\n\t * An implementation of the btoa function, which should work in all environments.\n\t *\n\t * @param {string} string\n\t * @returns {string}\n\t */\n\tbtoa:\n\t\t(string) =>\n\t\t{\n\t\t\tif(typeof btoa === 'function')\n\t\t\t{\n\t\t\t\treturn btoa(string);\n\t\t\t}\n\t\t\treturn Buffer.from(string).toString('base64');\n\t\t},\n\t\n\t/**\n\t * An implementation of the atob function, which should work in all environments.\n\t *\n\t * @param {string} base64string\n\t * @returns {string}\n\t */\n\tatob:\n\t\t(base64string) =>\n\t\t{\n\t\t\tif(typeof atob === 'function')\n\t\t\t{\n\t\t\t\treturn atob(base64string);\n\t\t\t}\n\t\t\treturn Buffer.from(base64string, 'base64').toString();\n\t\t},\n\t\n\t/**\n\t * Encodes a UTF-8 string into a base64 string.\n\t *\n\t * @param {string} string\n\t * @returns {string}\n\t */\n\tutf8ToBase64:\n\t\t(string) =>\n\t\t{\n\t\t\treturn LeUtils.btoa(encodeURIComponent(string).replace(/%([0-9A-F]{2})/g, (match, p1) => String.fromCharCode(parseInt(p1, 16))));\n\t\t},\n\t\n\t/**\n\t * Decodes a base64 string back into a UTF-8 string.\n\t *\n\t * @param {string} base64string\n\t * @returns {string}\n\t */\n\tbase64ToUtf8:\n\t\t(base64string) =>\n\t\t{\n\t\t\treturn decodeURIComponent(LeUtils.atob(base64string.trim()).split('').map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));\n\t\t},\n\t\n\t/**\n\t * Converts a base64 string into a hex string.\n\t *\n\t * @param {string} base64string\n\t * @returns {string}\n\t */\n\tbase64ToHex:\n\t\t(base64string) =>\n\t\t{\n\t\t\treturn LeUtils.atob(base64string.trim()).split('').map((c) => ('0' + c.charCodeAt(0).toString(16)).slice(-2)).join('');\n\t\t},\n\t\n\t/**\n\t * Converts a hex string into a base64 string.\n\t *\n\t * @param {string} hexstring\n\t * @returns {string}\n\t */\n\thexToBase64:\n\t\t(hexstring) =>\n\t\t{\n\t\t\treturn LeUtils.btoa(hexstring.replace(/[^0-9A-F]/gi, '').match(/\\w{2}/g).map((a) => String.fromCharCode(parseInt(a, 16))).join(''));\n\t\t},\n\t\n\t/**\n\t * Converts a base64 string into bytes (Uint8Array).\n\t *\n\t * @param {string} base64string\n\t * @returns {Uint8Array}\n\t */\n\tbase64ToBytes:\n\t\t(base64string) =>\n\t\t{\n\t\t\tconst binary = LeUtils.atob(base64string.trim());\n\t\t\tconst len = binary.length;\n\t\t\tlet data = new Uint8Array(len);\n\t\t\tfor(let i = 0; i < len; i++)\n\t\t\t{\n\t\t\t\tdata[i] = binary.charCodeAt(i);\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\n\t/**\n\t * Converts bytes into a base64 string.\n\t *\n\t * @param {ArrayLike<number>|ArrayBufferLike} arraybuffer\n\t * @returns {string}\n\t */\n\tbytesToBase64:\n\t\t(arraybuffer) =>\n\t\t{\n\t\t\tconst bytes = new Uint8Array(arraybuffer);\n\t\t\tconst len = bytes.byteLength;\n\t\t\tlet binary = '';\n\t\t\tfor(let i = 0; i < len; i++)\n\t\t\t{\n\t\t\t\tbinary += String.fromCharCode(bytes[i]);\n\t\t\t}\n\t\t\treturn LeUtils.btoa(binary);\n\t\t},\n\t\n\t/**\n\t * Downloads the given base64 string as a file.\n\t *\n\t * @param {string} base64string\n\t * @param {string} [fileName]\n\t * @param {string} [mimeType]\n\t */\n\tdownloadFile:\n\t\t(base64string, fileName, mimeType) =>\n\t\t{\n\t\t\tconst link = document.createElement('a');\n\t\t\tlink.setAttribute('download', (typeof fileName === 'string') ? fileName : 'file');\n\t\t\tlink.href = 'data:' + mimeType + ';base64,' + base64string;\n\t\t\tlink.setAttribute('target', '_blank');\n\t\t\tlink.click();\n\t\t},\n\t\n\t/**\n\t * Loads the value from the browser, returns undefined if the value doesn't exist.\n\t *\n\t * @param {string} id\n\t * @returns {*}\n\t */\n\tlocalStorageGet:\n\t\t(id) =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet result = window.localStorage.getItem('LeUtils_' + id);\n\t\t\tif(typeof result !== 'string')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry\n\t\t\t{\n\t\t\t\tresult = JSON.parse(result);\n\t\t\t\tif(typeof result['-'] !== 'undefined')\n\t\t\t\t{\n\t\t\t\t\treturn result['-'];\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch(e)\n\t\t\t{\n\t\t\t}\n\t\t},\n\t\n\t/**\n\t * Saves the given data in the browser.\n\t *\n\t * @param {string} id\n\t * @param {*} data\n\t */\n\tlocalStorageSet:\n\t\t(id, data) =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(typeof data === 'undefined')\n\t\t\t{\n\t\t\t\twindow.localStorage.removeItem('LeUtils_' + id);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.localStorage.setItem('LeUtils_' + id, JSON.stringify({'-':data}));\n\t\t},\n\t\n\t/**\n\t * Removes the data from the browser.\n\t *\n\t * @param {string} id\n\t */\n\tlocalStorageRemove:\n\t\t(id) =>\n\t\t{\n\t\t\tif(typeof window === 'undefined')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twindow.localStorage.removeItem('LeUtils_' + id);\n\t\t},\n\t\n\t/**\n\t * Returns whether the current hostname (window.location.hostname) is private (such as localhost, 192.168.1.1, etc).\n\t * This can be used to determine if the app is running in a development environment or not.\n\t *\n\t * Only \"localhost\" and IPv4 addresses are supported. IPv6 addresses will always return false.\n\t *\n\t * @returns {boolean}\n\t */\n\tisCurrentHostPrivate:\n\t\t(() =>\n\t\t{\n\t\t\tlet lastHostname = null;\n\t\t\tlet lastResult = false;\n\t\t\t\n\t\t\treturn () =>\n\t\t\t{\n\t\t\t\tif(typeof window === 'undefined')\n\t\t\t\t{\n\t\t\t\t\treturn false; // server-side rendering, who knows to who it is being served to, assume it's public\n\t\t\t\t}\n\t\t\t\tconst hostname = window.location.hostname;\n\t\t\t\tif(lastHostname === hostname)\n\t\t\t\t{\n\t\t\t\t\treturn lastResult;\n\t\t\t\t}\n\t\t\t\tlastHostname = hostname;\n\t\t\t\tlastResult = LeUtils.isGivenHostPrivate(lastHostname);\n\t\t\t\treturn lastResult;\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns true if the given hostname is private (such as localhost, 192.168.1.1, etc).\n\t *\n\t * Only \"localhost\" and IPv4 addresses are supported. IPv6 addresses will always return false.\n\t *\n\t * @param {string} host\n\t * @returns {boolean}\n\t */\n\tisGivenHostPrivate:\n\t\t(host) =>\n\t\t{\n\t\t\thost = STRING(host).trim().toLowerCase();\n\t\t\tif((host === 'localhost') || (host === '127.0.0.1'))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(!/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(host))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst parts = host.split('.');\n\t\t\treturn (parts[0] === '10') || // 10.0.0.0 - 10.255.255.255\n\t\t\t\t((parts[0] === '172') && ((parseInt(parts[1], 10) >= 16) && (parseInt(parts[1], 10) <= 31))) || // 172.16.0.0 - 172.31.255.255\n\t\t\t\t((parts[0] === '192') && (parts[1] === '168')); // 192.168.0.0 - 192.168.255.255\n\t\t},\n\t\n\t/**\n\t * Creates and returns a new TreeSet.\n\t * A TreeSet is a set of elements, sorted by a comparator.\n\t * Binary search is used to find elements, which makes it very fast to find elements.\n\t *\n\t * The comparator is also used to determine if two values are equal to each other.\n\t * This way, you can have values that aren't the same be treated as if they are. This can be used to deal with issues such as floating point errors for example.\n\t *\n\t * @param {*[]} elements\n\t * @param {Function} comparator\n\t * @returns {{getElements: (function(): *[]), getComparator: (function(): Function), size: (function(): number), isEmpty: (function(): boolean), contains: (function(*): boolean), first: (function(): *|undefined), last: (function(): *|undefined), pollFirst: (function(): *|undefined), pollLast: (function(): *|undefined), add: function(*), addAll: function(*[]|object), getEqualValue: (function(*): (*)), getEqualValueOrAdd: (function(*): (*))}}\n\t */\n\tcreateTreeSet:\n\t\t(elements, comparator) =>\n\t\t{\n\t\t\tcomparator = comparator || LeUtils.compare;\n\t\t\telements = elements || [];\n\t\t\telements.sort(comparator);\n\t\t\t\n\t\t\t/**\n\t\t\t * Performs a binary search on the elements, and returns the result.\n\t\t\t *\n\t\t\t * @param {*} value\n\t\t\t * @returns {{found: boolean, index: number, value: *|undefined}}\n\t\t\t */\n\t\t\tconst binarySearch = (value) =>\n\t\t\t{\n\t\t\t\tlet low = 0;\n\t\t\t\tlet high = elements.length - 1;\n\t\t\t\twhile(low <= high)\n\t\t\t\t{\n\t\t\t\t\tconst mid = Math.floor((low + high) / 2);\n\t\t\t\t\tconst midValue = elements[mid];\n\t\t\t\t\tconst cmp = comparator(midValue, value);\n\t\t\t\t\tif(cmp < 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tlow = mid + 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(cmp > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\thigh = mid - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\treturn {found:true, index:mid, value:midValue};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {found:false, index:low, value:undefined};\n\t\t\t};\n\t\t\t\n\t\t\tconst treeSet = {\n\t\t\t\t/**\n\t\t\t\t * Returns the elements of the set.\n\t\t\t\t *\n\t\t\t\t * @returns {*[]}\n\t\t\t\t */\n\t\t\t\tgetElements:\n\t\t\t\t\t() => elements,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the comparator of the set.\n\t\t\t\t *\n\t\t\t\t * @returns {Function}\n\t\t\t\t */\n\t\t\t\tgetComparator:\n\t\t\t\t\t() => comparator,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the size of the set.\n\t\t\t\t *\n\t\t\t\t * @returns {number}\n\t\t\t\t */\n\t\t\t\tsize:\n\t\t\t\t\t() => elements.length,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns true if the set is empty, false otherwise.\n\t\t\t\t *\n\t\t\t\t * @returns {boolean}\n\t\t\t\t */\n\t\t\t\tisEmpty:\n\t\t\t\t\t() => (elements.length <= 0),\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns true if the set contains a value that is equal to the given value, returns false otherwise.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t * @returns {boolean}\n\t\t\t\t */\n\t\t\t\tcontains:\n\t\t\t\t\t(value) => binarySearch(value).found,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the first element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tfirst:\n\t\t\t\t\t() => (elements.length > 0) ? elements[0] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns the last element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tlast:\n\t\t\t\t\t() => (elements.length > 0) ? elements[elements.length - 1] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Removes and returns the first element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tpollFirst:\n\t\t\t\t\t() => (elements.length > 0) ? elements.splice(0, 1)[0] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Removes and returns the last element of the set, or undefined if it is empty.\n\t\t\t\t *\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tpollLast:\n\t\t\t\t\t() => (elements.length > 0) ? elements.splice(elements.length - 1, 1)[0] : undefined,\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Adds the given value to the set. Will only do so if no equal value already exists.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t */\n\t\t\t\tadd:\n\t\t\t\t\t(value) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tconst result = binarySearch(value);\n\t\t\t\t\t\tif(result.found)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telements.splice(result.index, 0, value);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Adds all the given values to the set. Will only do so if no equal value already exists.\n\t\t\t\t *\n\t\t\t\t * @param {*[]|object} values\n\t\t\t\t */\n\t\t\t\taddAll:\n\t\t\t\t\t(values) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tLeUtils.each(values, treeSet.add);\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns an equal value that's already in the tree set, or undefined if no equal values in it exist.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t * @returns {*|undefined}\n\t\t\t\t */\n\t\t\t\tgetEqualValue:\n\t\t\t\t\t(value) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tconst result = binarySearch(value);\n\t\t\t\t\t\tif(result.found)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t},\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Returns an equal value that's already in the tree set. If no equal values in it exist, the given value will be added and returned.\n\t\t\t\t *\n\t\t\t\t * @param {*} value\n\t\t\t\t * @returns {*}\n\t\t\t\t */\n\t\t\t\tgetEqualValueOrAdd:\n\t\t\t\t\t(value) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tconst result = binarySearch(value);\n\t\t\t\t\t\tif(result.found)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telements.splice(result.index, 0, value);\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t},\n\t\t\t};\n\t\t\treturn treeSet;\n\t\t},\n\t\n\t/**\n\t * @typedef {Object} LeUtils~TransactionalValue\n\t * @property {*} value\n\t * @property {{id:string, value:*}[]} changes\n\t */\n\t/**\n\t * Creates and returns a new TransactionalValue object.\n\t * With a TransactionalValue, you can keep track of changes to a value, and commit or cancel them.\n\t *\n\t * Multiple uncommitted changes can be made at the same time, the last change will be the one that overwrites older changes.\n\t * If that change is cancelled, the previous change will be the one that overwrites older changes.\n\t * This allows you to make multiple unconfirmed changes, and confirm or cancel each of them individually at any time.\n\t *\n\t * @param {*} [value]\n\t * @returns {LeUtils~TransactionalValue}\n\t */\n\tcreateTransactionalValue:\n\t\t(value) =>\n\t\t{\n\t\t\tif(typeof value === 'undefined')\n\t\t\t{\n\t\t\t\tvalue = null;\n\t\t\t}\n\t\t\treturn {value:value, changes:[]};\n\t\t},\n\t\n\t/**\n\t * Returns true if the given value is a valid TransactionalValue, returns false if it isn't.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {boolean}\n\t */\n\tisTransactionalValueValid:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\treturn ((typeof transactionalValue === 'object') && ('value' in transactionalValue) && ('changes' in transactionalValue) && Array.isArray(transactionalValue.changes));\n\t\t},\n\t\n\t/**\n\t * Returns true if the given value is a TransactionalValue, false otherwise.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {string}\n\t */\n\ttransactionalValueToString:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\tif(!LeUtils.isTransactionalValueValid(transactionalValue))\n\t\t\t{\n\t\t\t\treturn transactionalValue + '';\n\t\t\t}\n\t\t\tif(transactionalValue.changes.length <= 0)\n\t\t\t{\n\t\t\t\treturn '' + transactionalValue.value;\n\t\t\t}\n\t\t\tlet valuesString = '' + transactionalValue.value;\n\t\t\tfor(let i = 0; i < transactionalValue.changes.length; i++)\n\t\t\t{\n\t\t\t\tvaluesString += ' -> ' + transactionalValue.changes[i].value;\n\t\t\t}\n\t\t\treturn transactionalValue.changes[transactionalValue.changes.length - 1].value + ' (' + valuesString + ')';\n\t\t},\n\t\n\t/**\n\t * Sets the committed value of the given TransactionalValue to the given value. Clears out the previously uncommitted changes.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {*} value\n\t */\n\ttransactionSetAndCommit:\n\t\t(transactionalValue, value) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tif(typeof value === 'undefined')\n\t\t\t{\n\t\t\t\tvalue = null;\n\t\t\t}\n\t\t\ttransactionalValue.value = value;\n\t\t\ttransactionalValue.changes = [];\n\t\t},\n\t\n\t/**\n\t * Sets the value of the given TransactionalValue to the given value, without yet committing it, meaning it can be committed or cancelled later.\n\t * It returns the ID of the change, which can be used to commit or cancel the change later.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {*} value\n\t * @returns {string}\n\t */\n\ttransactionSetWithoutCommitting:\n\t\t(transactionalValue, value) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tif(typeof value === 'undefined')\n\t\t\t{\n\t\t\t\tvalue = null;\n\t\t\t}\n\t\t\tconst id = LeUtils.uniqueId();\n\t\t\ttransactionalValue.changes.push({id:id, value:value});\n\t\t\treturn id;\n\t\t},\n\t\n\t/**\n\t * Commits the change with the given ID, making it the new committed value.\n\t * Returns true if the change was found and committed, returns false if it was already overwritten by a newer committed change.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {string} changeId\n\t * @returns {boolean}\n\t */\n\ttransactionCommitChange:\n\t\t(transactionalValue, changeId) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tconst change = findTransactionalValueChange(transactionalValue, changeId);\n\t\t\tif(change === null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttransactionalValue.value = change.value;\n\t\t\ttransactionalValue.changes.splice(0, change.index + 1);\n\t\t\treturn true;\n\t\t},\n\t\n\t/**\n\t * Cancels the change with the given ID, removing it from the uncommitted changes.\n\t * Returns true if the change was found and removed, returns false if it was already overwritten by a newer committed change.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {string} changeId\n\t * @returns {boolean}\n\t */\n\ttransactionCancelChange:\n\t\t(transactionalValue, changeId) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tconst change = findTransactionalValueChange(transactionalValue, changeId);\n\t\t\tif(change === null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttransactionalValue.changes.splice(change.index, 1);\n\t\t\treturn true;\n\t\t},\n\t\n\t/**\n\t * Returns true if the change was found, meaning it can still make a difference to the final committed value of this TransactionalValue.\n\t * Returns false if it was already overwritten by a newer committed change, meaning that this change can no longer make a difference to the final committed value of this TransactionalValue.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @param {string} changeId\n\t * @returns {boolean}\n\t */\n\ttransactionIsChangeRelevant:\n\t\t(transactionalValue, changeId) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\treturn (findTransactionalValueChange(transactionalValue, changeId) !== null);\n\t\t},\n\t\n\t/**\n\t * Returns the committed value of the given TransactionalValue.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {*}\n\t */\n\ttransactionGetCommittedValue:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\treturn transactionalValue.value;\n\t\t},\n\t\n\t/**\n\t * Returns the value (including any uncommitted changes made to it) of the given TransactionalValue.\n\t *\n\t * @param {LeUtils~TransactionalValue} transactionalValue\n\t * @returns {*}\n\t */\n\ttransactionGetValue:\n\t\t(transactionalValue) =>\n\t\t{\n\t\t\tcheckTransactionalValue(transactionalValue);\n\t\t\tif(transactionalValue.changes.length <= 0)\n\t\t\t{\n\t\t\t\treturn transactionalValue.value;\n\t\t\t}\n\t\t\treturn transactionalValue.changes[transactionalValue.changes.length - 1].value;\n\t\t},\n\t\n\t/**\n\t * Creates a worker thread. Workers have to be stored at /workers/{workerName}.worker.js for this to work.\n\t *\n\t * Example of a worker file:\n\t *\n\t * ```js\n\t * onmessage = (message) =>\n\t * {\n\t * postMessage({\n\t * ...message.data,\n\t * results: ['...some expensive calculation involving message.data...'],\n\t * });\n\t * };\n\t * ```\n\t *\n\t * Usage:\n\t *\n\t * ```js\n\t * const {results} = await (async () =>\n\t * {\n\t * try\n\t * {\n\t * return await LeUtils.sendWorkerMessage('my-worker', {someData:[1, 2, 3, 4, 5]});\n\t * }\n\t * catch(error)\n\t * {\n\t * console.error('MyWorker: ', error);\n\t * return {results:[]};\n\t * }\n\t * })();\n\t * ```\n\t *\n\t * or, if you want more control over the number of threads you have (the above example will only create 1 thread per worker):\n\t *\n\t * ```js\n\t * const myWorker1 = LeUtils.createWorkerThread('my-worker'); // creates a thread, you can create multiple worker threads of the same worker, to run multiple instances in parallel\n\t * const myWorker2 = LeUtils.createWorkerThread('my-worker'); // same worker, another thread\n\t * const {results} = await (async () =>\n\t * {\n\t * try\n\t * {\n\t * return await myWorker1.sendMessage({someData:[1, 2, 3, 4, 5]});\n\t * }\n\t * catch(error)\n\t * {\n\t * console.error('MyWorker: ', error);\n\t * return {results:[]};\n\t * }\n\t * })();\n\t * ```\n\t *\n\t * @param {string} name\n\t * @returns {{worker: Worker, sendMessage: function(Object, {timeout: number|undefined}|undefined): Promise<Object>}}\n\t */\n\tcreateWorkerThread:\n\t\t(name) =>\n\t\t{\n\t\t\tconst worker = new Worker('/workers/' + name + '.worker.js');\n\t\t\tlet listeners = {};\n\t\t\t\n\t\t\tconst addListener = (id, callback) =>\n\t\t\t{\n\t\t\t\tlisteners[id] = callback;\n\t\t\t};\n\t\t\t\n\t\t\tconst removeListener = (id) =>\n\t\t\t{\n\t\t\t\tdelete listeners[id];\n\t\t\t};\n\t\t\t\n\t\t\tconst sendMessage = (data, options) =>\n\t\t\t{\n\t\t\t\treturn new Promise((resolve, reject) =>\n\t\t\t\t{\n\t\t\t\t\tconst id = LeUtils.uniqueId();\n\t\t\t\t\taddListener(id, resolve);\n\t\t\t\t\tsetTimeout(() =>\n\t\t\t\t\t{\n\t\t\t\t\t\tremoveListener(id);\n\t\t\t\t\t\treject('timeout');\n\t\t\t\t\t}, options?.timeout ?? 10000);\n\t\t\t\t\t\n\t\t\t\t\tworker.postMessage({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t...data,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\tworker.onerror = (error) =>\n\t\t\t{\n\t\t\t\tconsole.error('Worker ' + name + ':', error);\n\t\t\t};\n\t\t\tworker.onmessage = (message) =>\n\t\t\t{\n\t\t\t\tconst data = message.data;\n\t\t\t\tif(data?.id)\n\t\t\t\t{\n\t\t\t\t\tconst callback = listeners[data.id];\n\t\t\t\t\tif(callback)\n\t\t\t\t\t{\n\t\t\t\t\t\tremoveListener(data.id);\n\t\t\t\t\t\tcallback(data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\treturn {worker, sendMessage};\n\t\t},\n\t\n\t/**\n\t * Sends a message to the given worker. Creates a worker thread for this worker if it doesn't exist yet.\n\t *\n\t * See {@link LeUtils#createWorkerThread} for more info on how to use workers.\n\t *\n\t * @param {string} workerName\n\t * @param {Object} data\n\t * @param {{timeout: number|undefined}} [options]\n\t * @returns {Promise<Object>}\n\t */\n\tsendWorkerMessage:\n\t\t(() =>\n\t\t{\n\t\t\tconst workers = {};\n\t\t\treturn (workerName, data, options) =>\n\t\t\t{\n\t\t\t\tif(!workers[workerName])\n\t\t\t\t{\n\t\t\t\t\tworkers[workerName] = LeUtils.createWorkerThread(workerName);\n\t\t\t\t}\n\t\t\t\treturn workers[workerName].sendMessage(data, options);\n\t\t\t};\n\t\t})(),\n\t\n\t/**\n\t * Returns a deep copy of the given value.\n\t *\n\t * @param {*} value\n\t * @returns {*}\n\t */\n\tclone:\n\t\t(value) => CloneDeep(value, true),\n\t\n\t/**\n\t * Purges the given email address, returning an empty string if it's invalid.\n\t *\n\t * @param {string} email\n\t * @returns {string}\n\t */\n\tpurgeEmail:\n\t\t(email) =>\n\t\t{\n\t\t\temail = STRING(email).trim().toLowerCase().replace(/\\s/g, '');\n\t\t\tif(!email.includes('@') || !email.includes('.'))\n\t\t\t{\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn email;\n\t\t},\n\t\n\t/**\n\t * Returns true if the focus is effectively clear, meaning that the user is not typing in an input field.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFocusClear:(() =>\n\t{\n\t\tconst inputTypes = ['text', 'search', 'email', 'number', 'password', 'tel', 'time', 'url', 'week', 'month', 'date', 'datetime-local'];\n\t\treturn () => !((document?.activeElement?.tagName?.toLowerCase() === 'input') && inputTypes.includes(document?.activeElement?.type?.toLowerCase()));\n\t})(),\n\t\n\t/**\n\t * Returns the user's locale. Returns 'en-US' if it can't be determined.\n\t *\n\t * @returns {string}\n\t */\n\tgetUserLocale:(() =>\n\t{\n\t\tlet userLocale = null;\n\t\treturn () =>\n\t\t{\n\t\t\tif(userLocale === null)\n\t\t\t{\n\t\t\t\tuserLocale = (() =>\n\t\t\t\t{\n\t\t\t\t\tif(typeof window === 'undefined')\n\t\t\t\t\t{\n\t\t\t\t\t\treturn 'en-US';\n\t\t\t\t\t}\n\t\t\t\t\tlet locales = window.navigator.languages;\n\t\t\t\t\tif(!IS_ARRAY(locales) || (locales.length <= 0))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn 'en-US';\n\t\t\t\t\t}\n\t\t\t\t\tlocales = locales.filter(locale => ((typeof locale === 'string') && locale.includes('-') && (locale.toLowerCase() !== 'en-us')));\n\t\t\t\t\tif(locales.length <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn 'en-US';\n\t\t\t\t\t}\n\t\t\t\t\tconst localesNoEnglish = locales.filter(locale => !locale.toLowerCase().startsWith('en-'));\n\t\t\t\t\tif(localesNoEnglish.length <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn locales[0];\n\t\t\t\t\t}\n\t\t\t\t\treturn localesNoEnglish[0];\n\t\t\t\t})();\n\t\t\t}\n\t\t\treturn userLocale;\n\t\t};\n\t})(),\n\t\n\t/**\n\t * Returns the user's locale date format. Always returns YYYY MM DD, with the character in between depending on the user's locale. Returns 'YYYY/MM/DD' if the user's locale can't be determined.\n\t *\n\t * @returns {string}\n\t */\n\tgetUserLocaleDateFormat:(() =>\n\t{\n\t\tlet userLocaleDateFormat = null;\n\t\treturn () =>\n\t\t{\n\t\t\tif(userLocaleDateFormat === null)\n\t\t\t{\n\t\t\t\tuserLocaleDateFormat = (() =>\n\t\t\t\t{\n\t\t\t\t\tlet char = '/';\n\t\t\t\t\tif((typeof window !== 'undefined') && (typeof Intl !== 'undefined') && (typeof Intl.DateTimeFormat !== 'undefined'))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst formattedDate = new Intl.DateTimeFormat(LeUtils.getUserLocale()).format();\n\t\t\t\t\t\tif(formattedDate.includes('-'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchar = '-';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(formattedDate.includes('. '))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchar = '.';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(formattedDate.includes('.'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchar = '.';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn 'YYYY' + char + 'MM' + char + 'DD';\n\t\t\t\t})();\n\t\t\t}\n\t\t\treturn userLocaleDateFormat;\n\t\t};\n\t})(),\n};\n"],"names":["REGEX_ALL_NON_FLOAT_CHARACTERS","ISSET","value","IS_ARRAY","Array","isArray","IS_OBJECT","_typeof","STRING","FLOAT","v","isNaN","FLOAT_ANY","_len2","arguments","length","values","_key2","_i2","_values2","INT_LAX","Math","round","FLOAT_LAX","INT_LAX_ANY","FLOAT_LAX_ANY","apply","parseFloat","replace","_len3","_key3","_i3","_values3","userLocaleDateFormat","userLocale","inputTypes","workers","lastHostname","lastResult","hue2rgb","previousUniqueIdsTime","previousUniqueIds","numberToBytes","generateUniqueId","GeneratorFunction","AsyncGeneratorFunction","RegularFunction","PossibleGeneratorFunctionNames","flattenArrayRecursive","eachAsyncParallel","checkTransactionalValue","transactionalValue","LeUtils","isTransactionalValueValid","console","error","Error","findTransactionalValueChange","changeId","i","changes","change","id","index","equals","FastDeepEqual","parseVersionString","versionString","_versionString","_versionString2","_versionString3","major","minor","patch","partsVersion","trim","split","THIS","toString","otherVersion","largerThan","largerThanOrEquals","smallerThan","smallerThanOrEquals","contains","array","result","each","val","containsCaseInsensitive","toLowerCase","containsAll","containsAllCaseInsensitive","containsAny","containsAnyCaseInsensitive","containsNone","containsNoneCaseInsensitive","elements","callback","optionalSkipHasOwnPropertyCheck","undefined","call","Object","prototype","hasOwnProperty","warn","eachAsync","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee3","asyncCallback","optionalParallelCount","promises","doBreak","wrap","_context4","prev","next","_ref3","_callee2","element","_loop","promise","_context3","newPromises","_context2","__lowentry_utils__promise_is_done__","push","Promise","any","stop","delegateYield","abrupt","_callee","_context","t0","sent","_x5","_x6","this","all","_x","_x2","_x3","_x4","_ref5","_callee4","parallelCount","_index2","_args5","_context5","t1","keys","t2","done","t3","_x7","_x8","filter","map","mapToArray","mapToArraySorted","comparator","sortKeys","sort","a","b","flattenArray","forEach","entry","compare","compareNumbers","compareNumericStrings","compareTimestampStrings","base64ToHex","replaceAll","isEmptyObject","obj","field","getObjectFieldsCount","count","isGeneratorFunction","_callee5","_context6","constructor","_wrapAsyncGenerator","_callee6","_context7","from","Set","name","displayName","func","includes","setTimeout","_setTimeout","_x9","_x10","ms","lastTime","performance","now","handler","currentTime","e","remove","clearTimeout","setInterval","_setInterval","_x11","intervalMs","fireImmediately","clearInterval","setAnimationFrameTimeout","frames","run","requestAnimationFrameId","tick","window","requestAnimationFrame","cancelAnimationFrame","setAnimationFrameInterval","intervalFrames","promiseTimeout","resolve","promiseAnimationFrameTimeout","platformIsMobile","_window$navigator","_window$navigator2","navigator","userAgent","vendor","opera","substring","test","platformHasCursor","_window$matchMedia","matchMedia","matches","capitalize","string","charAt","toUpperCase","slice","endsWithAny","endingCharsStringOrArray","endingCharsArray","chars","endsWith","startsWithAny","startingCharsStringOrArray","startingCharsArray","startsWith","trimEnd","trimCharsStringOrArray","trimChars","trimStart","purgeSentence","sentence","purgeErrorMessage","_error$message","messageParts","message","JSON","stringify","generateNamePermutations","_len","names","_key","results","join","concat","increaseNumericStringByOne","c","uniqueId","number","size","ceil","floor","log2","bytes","Uint8ClampedArray","x","rightByte","timeOrigin","timing","navigationStart","Date","getTime","nowBytes","uuid","_crypto","crypto","randomUUID","base64ToBytes","hexToBase64","bytesChunkA","random","padEnd","bytesChunkB","bytesChunkC","bytesChunkD","Uint8Array","set","time","bytesToBase64","_defineProperty","timestamp","getEmptyImageSrc","getPercentage","part","total","max","min","getImagePixels","image","document","canvas","createElement","body","appendChild","ctx","getContext","width","height","drawImage","getImageData","data","parentNode","removeChild","getColoredImage","color","globalCompositeOperation","fillStyle","fillRect","toDataURL","rgbToHex","rgb","hex","hexToRgb","hexstring","hasAlpha","match","parseInt","_toConsumableArray","rgbToHsl","h","s","r","g","l","d","hslToRgb","p","q","t","hsl","rgbToLab","pow","y","z","getDifferenceBetweenRgb","rgbA","rgbB","labA","labB","getDifferenceBetweenLab","deltaL","deltaA","deltaB","c1","sqrt","deltaC","deltaH","deltaLKlsl","deltaCkcsc","deltaHkhsh","getRgbOfGradient","gradient","percentage","closest","percent","abs","difference","higher","lower","tmp","getRgbBetween","startRgb","endRgb","partEnd","partStart","btoa","_btoa","_x12","Buffer","atob","_atob","_x13","base64string","utf8ToBase64","encodeURIComponent","p1","String","fromCharCode","base64ToUtf8","decodeURIComponent","charCodeAt","binary","len","arraybuffer","byteLength","downloadFile","fileName","mimeType","link","setAttribute","href","click","localStorageGet","localStorage","getItem","parse","localStorageSet","setItem","removeItem","localStorageRemove","isCurrentHostPrivate","hostname","location","isGivenHostPrivate","host","parts","createTreeSet","binarySearch","low","high","mid","midValue","cmp","found","treeSet","getElements","getComparator","isEmpty","first","last","pollFirst","splice","pollLast","add","addAll","getEqualValue","getEqualValueOrAdd","createTransactionalValue","transactionalValueToString","valuesString","transactionSetAndCommit","transactionSetWithoutCommitting","transactionCommitChange","transactionCancelChange","transactionIsChangeRelevant","transactionGetCommittedValue","transactionGetValue","createWorkerThread","worker","Worker","listeners","removeListener","onerror","onmessage","sendMessage","options","reject","_options$timeout","addListener","timeout","postMessage","_objectSpread","sendWorkerMessage","workerName","clone","CloneDeep","purgeEmail","email","isFocusClear","_document","_document2","activeElement","tagName","type","getUserLocale","locales","languages","locale","localesNoEnglish","getUserLocaleDateFormat","char","Intl","DateTimeFormat","formattedDate","format","_i","_values"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowentry/utils",
3
- "version": "1.10.1",
3
+ "version": "1.10.2",
4
4
  "private": false,
5
5
  "description": "Provides utilities for general JavaScript development.",
6
6
  "author": "Low Entry",
@@ -21,11 +21,14 @@
21
21
  "test": ""
22
22
  },
23
23
  "dependencies": {
24
+ "@babel/runtime": "*",
24
25
  "clone-deep": "^4",
25
26
  "fast-deep-equal": "^3"
26
27
  },
27
28
  "peerDependencies": {
28
- "@babel/runtime": "*"
29
+ "@babel/runtime": "*",
30
+ "clone-deep": "^4",
31
+ "fast-deep-equal": "^3"
29
32
  },
30
33
  "devDependencies": {
31
34
  "@babel/core": "^7.24.7",