@dbx-tools/shared-core 0.9.117 → 0.9.119

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.
package/README.md CHANGED
@@ -402,9 +402,9 @@ if (log.isLevelEnabled("debug")) {
402
402
  ```
403
403
 
404
404
  `log.logger()` is dependency-free and uses the platform console in browsers or
405
- formatted stderr output on server runtimes. It honors `LOG_LEVEL` per call, so
406
- debug statements can stay in production code without paying formatting cost
407
- when disabled.
405
+ formatted process streams on server runtimes: debug/info use stdout and
406
+ warn/error use stderr. It honors `LOG_LEVEL` per call, so debug statements can
407
+ stay in production code without paying formatting cost when disabled.
408
408
 
409
409
  ## Modules
410
410
 
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
6
- export const PACKAGE_VERSION = "0.9.117";
6
+ export const PACKAGE_VERSION = "0.9.119";
7
7
  export * as asyncUtils from "./src/async-utils.ts";
8
8
  export * as bindings from "./src/bindings.ts";
9
9
  export * as brandUtils from "./src/brand-utils.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
2
- export declare const PACKAGE_VERSION = "0.9.117";
2
+ export declare const PACKAGE_VERSION = "0.9.119";
3
3
  export * as asyncUtils from "./src/async-utils.ts";
4
4
  export * as bindings from "./src/bindings.ts";
5
5
  export * as brandUtils from "./src/brand-utils.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
5
- export const PACKAGE_VERSION = "0.9.117";
5
+ export const PACKAGE_VERSION = "0.9.119";
6
6
  export * as asyncUtils from "./src/async-utils.js";
7
7
  export * as bindings from "./src/bindings.js";
8
8
  export * as brandUtils from "./src/brand-utils.js";
@@ -25,4 +25,4 @@ export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoic
25
25
  export { MAX_TCP_PORT } from "./src/net.js";
26
26
  export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, PostgresEnvironmentNamesSchema, postgresEnvironmentNames, postgresRoleSchema, PostgresOptionsSchema, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema } from "./src/options.js";
27
27
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER } from "./src/token.js";
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzVDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSwwQkFBMEIsRUFBRSw4QkFBOEIsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUs5UyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTE3XCI7XG5leHBvcnQgKiBhcyBhc3luY1V0aWxzIGZyb20gXCIuL3NyYy9hc3luYy11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZFV0aWxzIGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBleGVjdXRpb24gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZnVuY3Rpb25VdGlscyBmcm9tIFwiLi9zcmMvZnVuY3Rpb24tdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGhhc2ggZnJvbSBcIi4vc3JjL2hhc2gudHNcIjtcbmV4cG9ydCAqIGFzIGh0dHAgZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCAqIGFzIGpzb24gZnJvbSBcIi4vc3JjL2pzb24udHNcIjtcbmV4cG9ydCAqIGFzIGxvZyBmcm9tIFwiLi9zcmMvbG9nLnRzXCI7XG5leHBvcnQgKiBhcyBuZXQgZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0ICogYXMgb2JqZWN0IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCAqIGFzIG9wdGlvbnMgZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHByZWRpY2F0ZSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgKiBhcyBzdHJpbmdVdGlscyBmcm9tIFwiLi9zcmMvc3RyaW5nLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyB0b2tlbiBmcm9tIFwiLi9zcmMvdG9rZW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29uY3VycmVudEVycm9yTW9kZSwgTWFwQ29uY3VycmVudE9wdGlvbnMsIFBvbGxDb250ZXh0LCBQb2xsUHJvZHVjZXIsIFBvbGxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2FzeW5jLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JSQU5EX0FTU0VUUywgQnJhbmRBc3NldFNldFNjaGVtYSwgQnJhbmRDb2xvcnNTY2hlbWEsIEJyYW5kVm9pY2VTY2hlbWEsIEJyYW5kQ29udGV4dFNjaGVtYSwgZGVmYXVsdEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZENvbnRleHQsIEJyYW5kQ29udGV4dElucHV0LCBCcmFuZEFzc2V0U2V0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVycm9yQ29udGV4dCB9IGZyb20gXCIuL3NyYy9lcnJvci11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25SZXN1bHQsIEV4ZWN1dG9yLCBFeGVjdXRpb25GYWlsdXJlLCBSdW5PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZW1vaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBIZWFkZXJMaWtlIH0gZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCB7IE1BWF9UQ1BfUE9SVCB9IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXJsTGlrZSwgSXBWZXJzaW9uLCBQYXJzZWRJcCwgQ2lkciwgVXJsQnVpbGRlciwgUGFyc2VFbWFpbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXF1ZW5jZSwgQ29udGFpbmVyLCBDb2xsZWN0aW9uLCBPbmVPck1hbnksIE5hbWVMaWtlLCBOb25GdW5jdGlvbktleXMsIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSwgU2VyaWFsaXphYmxlVmFsdWUsIFRvTnVtYmVyT3B0aW9ucywgVG9EYXRlT3B0aW9ucywgVG9EdXJhdGlvbk9wdGlvbnMsIERlZXBFcXVhbENvbXBhcmF0b3IgfSBmcm9tIFwiLi9zcmMvb2JqZWN0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYSwgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMsIFBvc3RncmVzRW52aXJvbm1lbnROYW1lc1NjaGVtYSwgcG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBwb3N0Z3Jlc1JvbGVTY2hlbWEsIFBvc3RncmVzT3B0aW9uc1NjaGVtYSwgdGNwUG9ydFNjaGVtYSwgdGNwUG9ydE9yWmVyb1NjaGVtYSwgbm9ybWFsaXplZFVybFNjaGVtYSwgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEsIExha2ViYXNlT3B0aW9uc1NjaGVtYSB9IGZyb20gXCIuL3NyYy9vcHRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLCBQb3N0Z3Jlc0Vudmlyb25tZW50TmFtZXMsIFBvc3RncmVzT3B0aW9ucywgRGF0YWJyaWNrc09wdGlvbnMsIE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQsIExha2ViYXNlT3B0aW9ucywgT3B0aW9uVmFsdWVNYXAsIExpc3RlblNjaGVtZSwgVGNwTGlzdGVuQWRkcmVzcywgVW5peExpc3RlbkFkZHJlc3MsIExpc3RlbkFkZHJlc3MsIExpc3RlbkFkZHJlc3NPcHRpb25zLCBMaXN0ZW5BZGRyZXNzSW5wdXQgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wYXR0ZXJuLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByZWRpY2F0ZUZ1bmN0aW9uLCBUeXBlUHJlZGljYXRlRnVuY3Rpb24sIFByZWRpY2F0ZUlucHV0LCBQcmVkaWNhdGUgfSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRva2VuaXplT3B0aW9ucywgS2V5T3B0aW9ucywgSWRlbnRpZmllck9wdGlvbnMsIERlZGVudE9wdGlvbnMsIERlc2NyaXB0aW9uIH0gZnJvbSBcIi4vc3JjL3N0cmluZy11dGlscy50c1wiO1xuZXhwb3J0IHsgQUNDRVNTX1RPS0VOX0hFQURFUiwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSIH0gZnJvbSBcIi4vc3JjL3Rva2VuLnRzXCI7XG4iXX0=
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU8vSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzVDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSwwQkFBMEIsRUFBRSw4QkFBOEIsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUs5UyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTE5XCI7XG5leHBvcnQgKiBhcyBhc3luY1V0aWxzIGZyb20gXCIuL3NyYy9hc3luYy11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZFV0aWxzIGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBleGVjdXRpb24gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZnVuY3Rpb25VdGlscyBmcm9tIFwiLi9zcmMvZnVuY3Rpb24tdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGhhc2ggZnJvbSBcIi4vc3JjL2hhc2gudHNcIjtcbmV4cG9ydCAqIGFzIGh0dHAgZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCAqIGFzIGpzb24gZnJvbSBcIi4vc3JjL2pzb24udHNcIjtcbmV4cG9ydCAqIGFzIGxvZyBmcm9tIFwiLi9zcmMvbG9nLnRzXCI7XG5leHBvcnQgKiBhcyBuZXQgZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0ICogYXMgb2JqZWN0IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCAqIGFzIG9wdGlvbnMgZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHByZWRpY2F0ZSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgKiBhcyBzdHJpbmdVdGlscyBmcm9tIFwiLi9zcmMvc3RyaW5nLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyB0b2tlbiBmcm9tIFwiLi9zcmMvdG9rZW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29uY3VycmVudEVycm9yTW9kZSwgTWFwQ29uY3VycmVudE9wdGlvbnMsIFBvbGxDb250ZXh0LCBQb2xsUHJvZHVjZXIsIFBvbGxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2FzeW5jLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JSQU5EX0FTU0VUUywgQnJhbmRBc3NldFNldFNjaGVtYSwgQnJhbmRDb2xvcnNTY2hlbWEsIEJyYW5kVm9pY2VTY2hlbWEsIEJyYW5kQ29udGV4dFNjaGVtYSwgZGVmYXVsdEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZENvbnRleHQsIEJyYW5kQ29udGV4dElucHV0LCBCcmFuZEFzc2V0U2V0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVycm9yQ29udGV4dCB9IGZyb20gXCIuL3NyYy9lcnJvci11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25SZXN1bHQsIEV4ZWN1dG9yLCBFeGVjdXRpb25GYWlsdXJlLCBSdW5PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZW1vaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBIZWFkZXJMaWtlIH0gZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCB7IE1BWF9UQ1BfUE9SVCB9IGZyb20gXCIuL3NyYy9uZXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXJsTGlrZSwgSXBWZXJzaW9uLCBQYXJzZWRJcCwgQ2lkciwgVXJsQnVpbGRlciwgUGFyc2VFbWFpbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXF1ZW5jZSwgQ29udGFpbmVyLCBDb2xsZWN0aW9uLCBPbmVPck1hbnksIE5hbWVMaWtlLCBOb25GdW5jdGlvbktleXMsIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSwgU2VyaWFsaXphYmxlVmFsdWUsIFRvTnVtYmVyT3B0aW9ucywgVG9EYXRlT3B0aW9ucywgVG9EdXJhdGlvbk9wdGlvbnMsIERlZXBFcXVhbENvbXBhcmF0b3IgfSBmcm9tIFwiLi9zcmMvb2JqZWN0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYSwgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMsIFBvc3RncmVzRW52aXJvbm1lbnROYW1lc1NjaGVtYSwgcG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBwb3N0Z3Jlc1JvbGVTY2hlbWEsIFBvc3RncmVzT3B0aW9uc1NjaGVtYSwgdGNwUG9ydFNjaGVtYSwgdGNwUG9ydE9yWmVyb1NjaGVtYSwgbm9ybWFsaXplZFVybFNjaGVtYSwgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEsIExha2ViYXNlT3B0aW9uc1NjaGVtYSB9IGZyb20gXCIuL3NyYy9vcHRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLCBQb3N0Z3Jlc0Vudmlyb25tZW50TmFtZXMsIFBvc3RncmVzT3B0aW9ucywgRGF0YWJyaWNrc09wdGlvbnMsIE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQsIExha2ViYXNlT3B0aW9ucywgT3B0aW9uVmFsdWVNYXAsIExpc3RlblNjaGVtZSwgVGNwTGlzdGVuQWRkcmVzcywgVW5peExpc3RlbkFkZHJlc3MsIExpc3RlbkFkZHJlc3MsIExpc3RlbkFkZHJlc3NPcHRpb25zLCBMaXN0ZW5BZGRyZXNzSW5wdXQgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wYXR0ZXJuLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByZWRpY2F0ZUZ1bmN0aW9uLCBUeXBlUHJlZGljYXRlRnVuY3Rpb24sIFByZWRpY2F0ZUlucHV0LCBQcmVkaWNhdGUgfSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRva2VuaXplT3B0aW9ucywgS2V5T3B0aW9ucywgSWRlbnRpZmllck9wdGlvbnMsIERlZGVudE9wdGlvbnMsIERlc2NyaXB0aW9uIH0gZnJvbSBcIi4vc3JjL3N0cmluZy11dGlscy50c1wiO1xuZXhwb3J0IHsgQUNDRVNTX1RPS0VOX0hFQURFUiwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSIH0gZnJvbSBcIi4vc3JjL3Rva2VuLnRzXCI7XG4iXX0=
package/lib/src/log.d.ts CHANGED
@@ -12,10 +12,10 @@
12
12
  * {@link LogLevel} filtering runs through {@link shouldEmit} in per-level
13
13
  * wrappers around the platform console or stderr sink.
14
14
  *
15
- * The console fallback writes formatted lines to `process.stderr` when it is
16
- * available (Bun `inspect` per argument when `LOG_BUN_CONSOLE_DISABLED` is
17
- * unset, otherwise `node:util` `formatWithOptions`), or delegates to global
18
- * `console.*` when stderr or `node:util` is unavailable. Browser hosts omit
15
+ * The console fallback writes debug/info to `process.stdout` and warn/error to
16
+ * `process.stderr` when available (Bun `inspect` per argument when
17
+ * `LOG_BUN_CONSOLE_DISABLED` is unset, otherwise `node:util` inspection), or
18
+ * delegates to global `console.*` when process streams are unavailable. Browser hosts omit
19
19
  * the `LEVEL` text prefix (devtools show severity) and keep only the `[name]`
20
20
  * tag.
21
21
  *
package/lib/src/log.js CHANGED
@@ -12,10 +12,10 @@
12
12
  * {@link LogLevel} filtering runs through {@link shouldEmit} in per-level
13
13
  * wrappers around the platform console or stderr sink.
14
14
  *
15
- * The console fallback writes formatted lines to `process.stderr` when it is
16
- * available (Bun `inspect` per argument when `LOG_BUN_CONSOLE_DISABLED` is
17
- * unset, otherwise `node:util` `formatWithOptions`), or delegates to global
18
- * `console.*` when stderr or `node:util` is unavailable. Browser hosts omit
15
+ * The console fallback writes debug/info to `process.stdout` and warn/error to
16
+ * `process.stderr` when available (Bun `inspect` per argument when
17
+ * `LOG_BUN_CONSOLE_DISABLED` is unset, otherwise `node:util` inspection), or
18
+ * delegates to global `console.*` when process streams are unavailable. Browser hosts omit
19
19
  * the `LEVEL` text prefix (devtools show severity) and keep only the `[name]`
20
20
  * tag.
21
21
  *
@@ -51,6 +51,10 @@ const globalBun = globalThis.Bun;
51
51
  const globalProcessStdErr = globalProcess && typeof globalProcess.stderr?.write === "function"
52
52
  ? globalProcess.stderr
53
53
  : undefined;
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
+ const globalProcessStdOut = globalProcess && typeof globalProcess.stdout?.write === "function"
56
+ ? globalProcess.stdout
57
+ : undefined;
54
58
  const LOG_LEVELS = ["debug", "info", "warn", "error"];
55
59
  const LOG_LEVEL_RANK = Object.fromEntries(LOG_LEVELS.map((level, index) => [level, index]));
56
60
  const LOG_LEVEL_COLORS = Object.fromEntries(LOG_LEVELS.map((level) => {
@@ -73,26 +77,27 @@ const DEFAULT_LEVEL = "info";
73
77
  /**
74
78
  * Console {@link LoggerFactory}; always succeeds.
75
79
  *
76
- * When `process.stderr` is available, formats each line and writes only to
77
- * stderr. Bun `inspect` formats each argument when enabled; otherwise
78
- * `util.inspect` when `node:util` loads, or a `JSON.stringify` fallback when
79
- * it does not. When stderr is unavailable (every browser), binds
80
+ * When process streams are available, formats each line and writes debug/info
81
+ * to stdout and warn/error to stderr. Bun `inspect` formats each argument when
82
+ * enabled; otherwise `util.inspect` when `node:util` loads, or a
83
+ * `JSON.stringify` fallback when it does not. When process streams are
84
+ * unavailable (every browser), binds
80
85
  * {@link createFormatter} prefixes into global `console.*` calls and skips the
81
86
  * `node:util` import entirely.
82
87
  */
83
- async function createConsoleLoggerFactory(globalProcessStdErr) {
88
+ async function createConsoleLoggerFactory(globalProcessStdOut, globalProcessStdErr) {
84
89
  // Indirect specifier so this browser-safe module doesn't statically pull in
85
90
  // node types: `node:util` is optional (the JSON fallback covers its absence).
86
91
  const nodeUtil = "node:util";
87
92
  // Gated, not just caught: the indirect specifier defeats bundler analysis by
88
93
  // design, so a client build emits a literal `import("node:util")` that no
89
94
  // browser can resolve, and the caught rejection still surfaced as a console
90
- // error. `utils` only feeds the stderr branch of the emitter below, so no
91
- // stderr means the import has nothing to serve and is skipped outright.
92
- const utils = globalProcessStdErr === undefined
95
+ // error. `utils` only feeds the process-stream branch of the emitter below,
96
+ // so no writable stream means the import has nothing to serve and is skipped.
97
+ const utils = globalProcessStdOut === undefined && globalProcessStdErr === undefined
93
98
  ? undefined
94
99
  : await import(__rewriteRelativeImportExtension(/* @vite-ignore */ nodeUtil)).catch(() => undefined);
95
- return consoleLoggerFactory(globalProcessStdErr, utils);
100
+ return consoleLoggerFactory(globalProcessStdOut, globalProcessStdErr, utils);
96
101
  }
97
102
  /**
98
103
  * The synchronous core of {@link createConsoleLoggerFactory}, split out so the
@@ -100,7 +105,7 @@ async function createConsoleLoggerFactory(globalProcessStdErr) {
100
105
  * resolved. `utils` is `node:util` when it loaded; without it, object arguments
101
106
  * format through the `JSON.stringify` fallback.
102
107
  */
103
- function consoleLoggerFactory(globalProcessStdErr, utils) {
108
+ function consoleLoggerFactory(globalProcessStdOut, globalProcessStdErr, utils) {
104
109
  const bunInspect = globalBun !== undefined && !toBoolean(globalBun.env?.LOG_BUN_CONSOLE_DISABLED)
105
110
  ? globalBun.inspect
106
111
  : undefined;
@@ -136,18 +141,20 @@ function consoleLoggerFactory(globalProcessStdErr, utils) {
136
141
  }
137
142
  };
138
143
  const factory = (name) => {
139
- const prefixFormatter = createFormatter(name, globalProcessStdErr, resetColorsPrefix);
140
144
  const logger = Object.fromEntries(LOG_LEVELS.map((level) => {
145
+ const preferredStream = level === "warn" || level === "error" ? globalProcessStdErr : globalProcessStdOut;
146
+ const stream = preferredStream ?? globalProcessStdErr ?? globalProcessStdOut;
147
+ const prefixFormatter = createFormatter(name, stream, resetColorsPrefix);
141
148
  const { prefix, colors, resetColors } = prefixFormatter(level);
142
149
  const emitter = (...args) => {
143
150
  if (!shouldEmit(level, true))
144
151
  return;
145
- if (globalProcessStdErr !== undefined) {
152
+ if (stream !== undefined) {
146
153
  const messageParts = prefix ? [prefix] : [];
147
154
  messageParts.push(...args.map((arg) => inspect(arg, colors)));
148
155
  if (resetColors)
149
156
  messageParts.push(LOG_LEVEL_COLOR_RESET);
150
- globalProcessStdErr.write(messageParts.join(" ") + "\n");
157
+ stream.write(messageParts.join(" ") + "\n");
151
158
  }
152
159
  else {
153
160
  let levelFn = console[level];
@@ -174,14 +181,14 @@ function consoleLoggerFactory(globalProcessStdErr, utils) {
174
181
  * concurrent and repeat callers share one in-flight promise and settled result.
175
182
  */
176
183
  const resolveFactory = memoize(async () => {
177
- return createConsoleLoggerFactory(globalProcessStdErr);
184
+ return createConsoleLoggerFactory(globalProcessStdOut, globalProcessStdErr);
178
185
  });
179
186
  /**
180
187
  * Active factory starts as a sync console sink (no `await`, so this module
181
188
  * finishes evaluating immediately) and swaps to {@link resolveFactory}'s
182
189
  * result when server-side argument inspection is ready.
183
190
  */
184
- let activeFactory = consoleLoggerFactory(globalProcessStdErr);
191
+ let activeFactory = consoleLoggerFactory(globalProcessStdOut, globalProcessStdErr);
185
192
  void resolveFactory().then((factory) => {
186
193
  activeFactory = factory;
187
194
  }, () => {
@@ -331,4 +338,4 @@ export function logger(loggerName) {
331
338
  const name = extractLoggerName(loggerName);
332
339
  return createLogger(name);
333
340
  }
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFjdkQsTUFBTSxhQUFhLEdBQUksVUFBd0MsQ0FBQyxPQUFPLENBQUM7QUFDeEUsTUFBTSxTQUFTLEdBQUksVUFBZ0MsQ0FBQyxHQUFHLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxtQkFBbUIsR0FDdkIsYUFBYSxJQUFJLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssVUFBVTtJQUNoRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07SUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVoQixNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3ZDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUNyQixDQUFDO0FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3ZCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLE9BQU87SUFDL0IsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssTUFBTTtZQUNULEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPO1lBQzNCLE1BQU07UUFDUixL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R0FBWSxFQUFFLGFBQXVCO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxhQUFhLElBQUksS0FBSyxDQUFDO0lBQ3ZELE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWU7SUFDNUMsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0saUJBQWlCLEdBQUcsd0RBQXdELENBQUM7QUFFbkY7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFVBQXlDO0lBQ2xFLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7SUFDbEMsQ0FBQztJQUNELE9BQU8saUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFVBQXlDO0lBQzlELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRhZ2dlZCwgbGV2ZWxlZCBsb2dnaW5nIGZvciBldmVyeSBydW50aW1lIC0gdGhlIG9uZSBsb2dnZXIgdGhlIHdob2xlXG4gKiBtb25vcmVwbyBzaGFyZXMuXG4gKlxuICogSW1wb3J0IHRoaXMgbW9kdWxlIGluc3RlYWQgb2YgY29uc3RydWN0aW5nIHBhY2thZ2UtbG9jYWwgY29uc29sZSB3cmFwcGVycyBzb1xuICogbG9nIGxldmVscywgdGFncywgZm9ybWF0dGluZywgYW5kIGJyb3dzZXIgYmVoYXZpb3IgcmVtYWluIGNvbnNpc3RlbnQuXG4gKlxuICoge0BsaW5rIGxvZ2dlcn0gcmVzb2x2ZXMgYSB0YWdnZWQge0BsaW5rIExvZ2dlcn0gdGhyb3VnaCBhIHN5bmNocm9ub3VzIGNvbnNvbGVcbiAqIHNpbmssIHRoZW4gdXBncmFkZXMgaXRzIHNlcnZlci1zaWRlIGZvcm1hdHRlciB3aGVuIGBub2RlOnV0aWxgIHJlc29sdmVzLlxuICogS2VlcGluZyB0aGUgc2luayBkZXBlbmRlbmN5LWZyZWUgcHJldmVudHMgYnJvd3NlciBidW5kbGVycyBmcm9tIHJldGFpbmluZyBhblxuICogb3B0aW9uYWwgYmFyZSBpbXBvcnQgdGhhdCBkb3duc3RyZWFtIGFwcHMgd291bGQgc3RpbGwgaGF2ZSB0byBpbnN0YWxsLlxuICoge0BsaW5rIExvZ0xldmVsfSBmaWx0ZXJpbmcgcnVucyB0aHJvdWdoIHtAbGluayBzaG91bGRFbWl0fSBpbiBwZXItbGV2ZWxcbiAqIHdyYXBwZXJzIGFyb3VuZCB0aGUgcGxhdGZvcm0gY29uc29sZSBvciBzdGRlcnIgc2luay5cbiAqXG4gKiBUaGUgY29uc29sZSBmYWxsYmFjayB3cml0ZXMgZm9ybWF0dGVkIGxpbmVzIHRvIGBwcm9jZXNzLnN0ZGVycmAgd2hlbiBpdCBpc1xuICogYXZhaWxhYmxlIChCdW4gYGluc3BlY3RgIHBlciBhcmd1bWVudCB3aGVuIGBMT0dfQlVOX0NPTlNPTEVfRElTQUJMRURgIGlzXG4gKiB1bnNldCwgb3RoZXJ3aXNlIGBub2RlOnV0aWxgIGBmb3JtYXRXaXRoT3B0aW9uc2ApLCBvciBkZWxlZ2F0ZXMgdG8gZ2xvYmFsXG4gKiBgY29uc29sZS4qYCB3aGVuIHN0ZGVyciBvciBgbm9kZTp1dGlsYCBpcyB1bmF2YWlsYWJsZS4gQnJvd3NlciBob3N0cyBvbWl0XG4gKiB0aGUgYExFVkVMYCB0ZXh0IHByZWZpeCAoZGV2dG9vbHMgc2hvdyBzZXZlcml0eSkgYW5kIGtlZXAgb25seSB0aGUgYFtuYW1lXWBcbiAqIHRhZy5cbiAqXG4gKiBFbnYgdG9nZ2xlczogYExPR19MRVZFTGAgKHJlYWQgcGVyIGNhbGwpIGFuZCBgTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEYFxuICogKHJlYWQgb25jZSBkdXJpbmcgZmFjdG9yeSBpbml0KS5cbiAqXG4gKiBCcm93c2VyLXNhZmU6IGBwcm9jZXNzYCAvIGBCdW5gIC8gYHdpbmRvd2AgLyBgZG9jdW1lbnRgIGFyZSBhbGwgcmVhY2hlZFxuICogdGhyb3VnaCBgZ2xvYmFsVGhpc2AgYW5kIGd1YXJkZWQsIGFuZCBgbm9kZTp1dGlsYCBpcyBpbXBvcnRlZCBPTkxZIG9uIGEgaG9zdFxuICogdGhhdCBoYXMgYHByb2Nlc3Muc3RkZXJyYCAtIG5ldmVyIGluIGEgYnJvd3Nlciwgd2hlcmUgdGhlIHNwZWNpZmllciBpc1xuICogdW5yZXNvbHZhYmxlIC0gc28gdGhlIG1vZHVsZSB3b3JrcyBpbiBhbnkgcnVudGltZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gXCIuL2Z1bmN0aW9uLXV0aWxzLnRzXCI7XG5pbXBvcnQgeyB0eXBlIE5hbWVMaWtlLCB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuLyoqIGBwcm9jZXNzYC1zaGFwZWQgdmlldyBvZmYgYGdsb2JhbFRoaXNgLCBzbyBubyBub2RlIHR5cGVzIGFyZSBuZWVkZWQuICovXG5pbnRlcmZhY2UgUHJvY2Vzc0xpa2Uge1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBzdGRlcnI/OiB7IHdyaXRlPzogKGNodW5rOiBzdHJpbmcpID0+IHZvaWQ7IGlzVFRZPzogdW5rbm93biB9O1xufVxuXG4vKiogYEJ1bmAtc2hhcGVkIHZpZXcgb2ZmIGBnbG9iYWxUaGlzYCwgc28gbm8gYEB0eXBlcy9idW5gIGlzIG5lZWRlZC4gKi9cbmludGVyZmFjZSBCdW5MaWtlIHtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgaW5zcGVjdD86ICh2YWx1ZTogdW5rbm93biwgb3B0aW9ucz86IHsgY29sb3JzPzogYm9vbGVhbjsgZGVwdGg/OiBudW1iZXIgfSkgPT4gc3RyaW5nO1xufVxuXG5jb25zdCBnbG9iYWxQcm9jZXNzID0gKGdsb2JhbFRoaXMgYXMgeyBwcm9jZXNzPzogUHJvY2Vzc0xpa2UgfSkucHJvY2VzcztcbmNvbnN0IGdsb2JhbEJ1biA9IChnbG9iYWxUaGlzIGFzIHsgQnVuPzogQnVuTGlrZSB9KS5CdW47XG5cbi8qKlxuICogTm9kZSBgcHJvY2Vzcy5zdGRlcnJgIHdoZW4gd3JpdGFibGUsIGVsc2UgYHVuZGVmaW5lZGAgKHN0YWJsZSBmb3IgdGhlXG4gKiBwcm9jZXNzKS4gVHlwZWQgbG9vc2VseSAoYGFueWApIGJlY2F1c2UgaXQgaXMgaGFuZGVkIHRvIHRoZSBjb25zb2xlIHNpbmsnc1xuICogYC53cml0ZWAsIHdoaWNoIG91ciBzdHJ1Y3R1cmFsIHtAbGluayBQcm9jZXNzTGlrZX0gc2hhcGUgZG9lcyBub3Qgc2F0aXNmeVxuICogbm9taW5hbGx5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55ID1cbiAgZ2xvYmFsUHJvY2VzcyAmJiB0eXBlb2YgZ2xvYmFsUHJvY2Vzcy5zdGRlcnI/LndyaXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IGdsb2JhbFByb2Nlc3Muc3RkZXJyXG4gICAgOiB1bmRlZmluZWQ7XG5cbmNvbnN0IExPR19MRVZFTFMgPSBbXCJkZWJ1Z1wiLCBcImluZm9cIiwgXCJ3YXJuXCIsIFwiZXJyb3JcIl0gYXMgY29uc3Q7XG5jb25zdCBMT0dfTEVWRUxfUkFOSyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgTE9HX0xFVkVMUy5tYXAoKGxldmVsLCBpbmRleCkgPT4gW2xldmVsLCBpbmRleF0pLFxuKSBhcyBSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj47XG5jb25zdCBMT0dfTEVWRUxfQ09MT1JTID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBMT0dfTEVWRUxTLm1hcCgobGV2ZWwpID0+IHtcbiAgICBsZXQgY29sb3IgPSBcIlxceDFiWzkwbVwiOyAvLyBncmF5XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBcImluZm9cIjpcbiAgICAgICAgY29sb3IgPSBcIlxceDFiWzM0bVwiOyAvLyBibHVlXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIndhcm5cIjpcbiAgICAgICAgY29sb3IgPSBcIlxceDFiWzMzbVwiOyAvLyB5ZWxsb3dcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgY29sb3IgPSBcIlxceDFiWzMxbVwiOyAvLyByZWRcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBbbGV2ZWwsIGNvbG9yXTtcbiAgfSksXG4pIGFzIFJlY29yZDxMb2dMZXZlbCwgc3RyaW5nPjtcbmNvbnN0IExPR19MRVZFTF9DT0xPUl9SRVNFVCA9IFwiXFx4MWJbMG1cIjtcbmNvbnN0IERFRkFVTFRfTEVWRUw6IExvZ0xldmVsID0gXCJpbmZvXCI7XG5cbi8qKlxuICogU3VwcG9ydGVkIHNldmVyaXRpZXMsIGxvd2VzdCB0byBoaWdoZXN0OiBgZGVidWdgLCBgaW5mb2AsIGB3YXJuYCwgYGVycm9yYC5cbiAqIEEgY2FsbCBiZWxvdyB0aGUgYWN0aXZlIHRocmVzaG9sZCBpcyBkaXNjYXJkZWQgYmVmb3JlIGFueSBzdHJpbmcgd29yayBvclxuICogc2luayBJL08uXG4gKlxuICogVGhlIHRocmVzaG9sZCBjb21lcyBmcm9tIGBwcm9jZXNzLmVudi5MT0dfTEVWRUxgIG9uIGV2ZXJ5IGNhbGxcbiAqIChjYXNlLWluc2Vuc2l0aXZlLCBkZWZhdWx0IGBpbmZvYCB3aGVuIHVuc2V0LCBlbXB0eSwgb3IgdW5rbm93bikgc28gdGVzdFxuICogcnVubmVycyBhbmQgZW1iZWRkZXJzIGNhbiBjaGFuZ2UgdmVyYm9zaXR5IGFmdGVyIGltcG9ydCB3aXRob3V0IHJlc3RhcnRpbmdcbiAqIHRoZSBwcm9jZXNzLlxuICovXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICh0eXBlb2YgTE9HX0xFVkVMUylbbnVtYmVyXTtcblxuLyoqXG4gKiBEZXBlbmRlbmN5LWZyZWUgbGV2ZWxlZCBsb2dnZXIuIFN0YW5kYXJkIG1ldGhvZHMgaG9ub3IgYExPR19MRVZFTGA7IGBzdGFydGBcbiAqIGFuZCBgc3VjY2Vzc2AgYXJlIGluZm9ybWF0aW9uYWwgYWxpYXNlcyB3aXRoIGRpc3RpbmN0IHByZXNlbnRhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgTG9nZ2VyID0ge1xuICBbSyBpbiBMb2dMZXZlbF06ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn0gJiB7XG4gIC8qKiBTdWNjZXNzIG1lc3NhZ2UgZW1pdHRlZCBhdCBgaW5mb2AgbGV2ZWwuICovXG4gIHN1Y2Nlc3M6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbiAgLyoqIFN0YXJ0IC8gaW4tcHJvZ3Jlc3MgbWVzc2FnZSBlbWl0dGVkIGF0IGBpbmZvYCBsZXZlbC4gKi9cbiAgc3RhcnQ6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn07XG5cbi8qKiBgKG5hbWU/KSA9PiBMb2dnZXJgIHNpbmsgY29uc3RydWN0b3IgcmV0dXJuZWQgYnkgdGhlIGluaXQtdGltZSBmYWN0b3J5IGNoYWluLiAqL1xudHlwZSBMb2dnZXJGYWN0b3J5ID0gKG5hbWU/OiBzdHJpbmcpID0+IExvZ2dlcjtcblxuLyoqXG4gKiBDb25zb2xlIHtAbGluayBMb2dnZXJGYWN0b3J5fTsgYWx3YXlzIHN1Y2NlZWRzLlxuICpcbiAqIFdoZW4gYHByb2Nlc3Muc3RkZXJyYCBpcyBhdmFpbGFibGUsIGZvcm1hdHMgZWFjaCBsaW5lIGFuZCB3cml0ZXMgb25seSB0b1xuICogc3RkZXJyLiBCdW4gYGluc3BlY3RgIGZvcm1hdHMgZWFjaCBhcmd1bWVudCB3aGVuIGVuYWJsZWQ7IG90aGVyd2lzZVxuICogYHV0aWwuaW5zcGVjdGAgd2hlbiBgbm9kZTp1dGlsYCBsb2Fkcywgb3IgYSBgSlNPTi5zdHJpbmdpZnlgIGZhbGxiYWNrIHdoZW5cbiAqIGl0IGRvZXMgbm90LiBXaGVuIHN0ZGVyciBpcyB1bmF2YWlsYWJsZSAoZXZlcnkgYnJvd3NlciksIGJpbmRzXG4gKiB7QGxpbmsgY3JlYXRlRm9ybWF0dGVyfSBwcmVmaXhlcyBpbnRvIGdsb2JhbCBgY29uc29sZS4qYCBjYWxscyBhbmQgc2tpcHMgdGhlXG4gKiBgbm9kZTp1dGlsYCBpbXBvcnQgZW50aXJlbHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNvbnNvbGVMb2dnZXJGYWN0b3J5KGdsb2JhbFByb2Nlc3NTdGRFcnI6IGFueSk6IFByb21pc2U8TG9nZ2VyRmFjdG9yeT4ge1xuICAvLyBJbmRpcmVjdCBzcGVjaWZpZXIgc28gdGhpcyBicm93c2VyLXNhZmUgbW9kdWxlIGRvZXNuJ3Qgc3RhdGljYWxseSBwdWxsIGluXG4gIC8vIG5vZGUgdHlwZXM6IGBub2RlOnV0aWxgIGlzIG9wdGlvbmFsICh0aGUgSlNPTiBmYWxsYmFjayBjb3ZlcnMgaXRzIGFic2VuY2UpLlxuICBjb25zdCBub2RlVXRpbCA9IFwibm9kZTp1dGlsXCI7XG4gIC8vIEdhdGVkLCBub3QganVzdCBjYXVnaHQ6IHRoZSBpbmRpcmVjdCBzcGVjaWZpZXIgZGVmZWF0cyBidW5kbGVyIGFuYWx5c2lzIGJ5XG4gIC8vIGRlc2lnbiwgc28gYSBjbGllbnQgYnVpbGQgZW1pdHMgYSBsaXRlcmFsIGBpbXBvcnQoXCJub2RlOnV0aWxcIilgIHRoYXQgbm9cbiAgLy8gYnJvd3NlciBjYW4gcmVzb2x2ZSwgYW5kIHRoZSBjYXVnaHQgcmVqZWN0aW9uIHN0aWxsIHN1cmZhY2VkIGFzIGEgY29uc29sZVxuICAvLyBlcnJvci4gYHV0aWxzYCBvbmx5IGZlZWRzIHRoZSBzdGRlcnIgYnJhbmNoIG9mIHRoZSBlbWl0dGVyIGJlbG93LCBzbyBub1xuICAvLyBzdGRlcnIgbWVhbnMgdGhlIGltcG9ydCBoYXMgbm90aGluZyB0byBzZXJ2ZSBhbmQgaXMgc2tpcHBlZCBvdXRyaWdodC5cbiAgY29uc3QgdXRpbHM6IHsgaW5zcGVjdD86IGFueSB9IHwgdW5kZWZpbmVkID1cbiAgICBnbG9iYWxQcm9jZXNzU3RkRXJyID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gbm9kZVV0aWwpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIHJldHVybiBjb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyLCB1dGlscyk7XG59XG5cbi8qKlxuICogVGhlIHN5bmNocm9ub3VzIGNvcmUgb2Yge0BsaW5rIGNyZWF0ZUNvbnNvbGVMb2dnZXJGYWN0b3J5fSwgc3BsaXQgb3V0IHNvIHRoZVxuICogc2FtZSBlbWl0dGVyIGFsc28gc2VydmVzIGFzIHRoZSBib290c3RyYXAgc2luayBiZWZvcmUgYW55IGFzeW5jIGZhY3RvcnkgaGFzXG4gKiByZXNvbHZlZC4gYHV0aWxzYCBpcyBgbm9kZTp1dGlsYCB3aGVuIGl0IGxvYWRlZDsgd2l0aG91dCBpdCwgb2JqZWN0IGFyZ3VtZW50c1xuICogZm9ybWF0IHRocm91Z2ggdGhlIGBKU09OLnN0cmluZ2lmeWAgZmFsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGNvbnNvbGVMb2dnZXJGYWN0b3J5KFxuICBnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnksXG4gIHV0aWxzPzogeyBpbnNwZWN0PzogYW55IH0gfCB1bmRlZmluZWQsXG4pOiBMb2dnZXJGYWN0b3J5IHtcbiAgY29uc3QgYnVuSW5zcGVjdCA9XG4gICAgZ2xvYmFsQnVuICE9PSB1bmRlZmluZWQgJiYgIXRvQm9vbGVhbihnbG9iYWxCdW4uZW52Py5MT0dfQlVOX0NPTlNPTEVfRElTQUJMRUQpXG4gICAgICA/IGdsb2JhbEJ1bi5pbnNwZWN0XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzZXRDb2xvcnNQcmVmaXggPSBidW5JbnNwZWN0ICE9PSB1bmRlZmluZWQ7XG5cbiAgY29uc3QgaW5zcGVjdCA9IChhcmc6IGFueSwgY29sb3JzPzogYm9vbGVhbikgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykgfHwgKHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiYgYXJnICE9PSBudWxsKSkge1xuICAgICAgaWYgKGJ1bkluc3BlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYnVuSW5zcGVjdChhcmcsIHtcbiAgICAgICAgICBjb2xvcnM6IGNvbG9ycyxcbiAgICAgICAgICBkZXB0aDogdXRpbHM/Lmluc3BlY3Q/LmRlZmF1bHRPcHRpb25zPy5kZXB0aCA/PyB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh1dGlscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5pbnNwZWN0KGFyZywge1xuICAgICAgICAgIC4uLnV0aWxzPy5pbnNwZWN0Py5kZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgICBjb2xvcnM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldCgpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnLCAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG4gICAgICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTdHJpbmcoYXJnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZmFjdG9yeSA9IChuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJlZml4Rm9ybWF0dGVyID0gY3JlYXRlRm9ybWF0dGVyKG5hbWUsIGdsb2JhbFByb2Nlc3NTdGRFcnIsIHJlc2V0Q29sb3JzUHJlZml4KTtcbiAgICBjb25zdCBsb2dnZXIgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBMT0dfTEVWRUxTLm1hcCgobGV2ZWwpID0+IHtcbiAgICAgICAgY29uc3QgeyBwcmVmaXgsIGNvbG9ycywgcmVzZXRDb2xvcnMgfSA9IHByZWZpeEZvcm1hdHRlcihsZXZlbCk7XG4gICAgICAgIGNvbnN0IGVtaXR0ZXIgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBpZiAoIXNob3VsZEVtaXQobGV2ZWwsIHRydWUpKSByZXR1cm47XG4gICAgICAgICAgaWYgKGdsb2JhbFByb2Nlc3NTdGRFcnIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcnRzID0gcHJlZml4ID8gW3ByZWZpeF0gOiBbXTtcbiAgICAgICAgICAgIG1lc3NhZ2VQYXJ0cy5wdXNoKC4uLmFyZ3MubWFwKChhcmcpID0+IGluc3BlY3QoYXJnLCBjb2xvcnMpKSk7XG4gICAgICAgICAgICBpZiAocmVzZXRDb2xvcnMpIG1lc3NhZ2VQYXJ0cy5wdXNoKExPR19MRVZFTF9DT0xPUl9SRVNFVCk7XG4gICAgICAgICAgICBnbG9iYWxQcm9jZXNzU3RkRXJyLndyaXRlKG1lc3NhZ2VQYXJ0cy5qb2luKFwiIFwiKSArIFwiXFxuXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGV2ZWxGbiA9IGNvbnNvbGVbbGV2ZWxdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbEZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgbGV2ZWxGbiA9IGNvbnNvbGUubG9nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZWZpeCkgbGV2ZWxGbiA9IGxldmVsRm4uYmluZChjb25zb2xlLCBwcmVmaXgpO1xuICAgICAgICAgICAgbGV2ZWxGbiguLi5hcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBbbGV2ZWwsIGVtaXR0ZXJdO1xuICAgICAgfSksXG4gICAgKSBhcyBMb2dnZXI7XG4gICAgLy8gQ29udmVuaWVuY2UgbGV2ZWxzIHNoYXJlIHRoZSBpbmZvIHNpbmsuXG4gICAgbG9nZ2VyLnN1Y2Nlc3MgPSBsb2dnZXIuaW5mbztcbiAgICBsb2dnZXIuc3RhcnQgPSBsb2dnZXIuaW5mbztcbiAgICByZXR1cm4gbG9nZ2VyO1xuICB9O1xuICBjb25zdCBkZWZhdWx0RmFjdG9yeSA9IG1lbW9pemUoZmFjdG9yeSk7XG4gIHJldHVybiAobmFtZT86IHN0cmluZykgPT4gKG5hbWUgPyBmYWN0b3J5KG5hbWUpIDogZGVmYXVsdEZhY3RvcnkoKSk7XG59XG5cbi8qKlxuICogRnVsbCBjb25zb2xlIHNpbmsgd2l0aCBvcHRpb25hbCBgbm9kZTp1dGlsYCBpbnNwZWN0aW9uLiBNZW1vaXplZCBzb1xuICogY29uY3VycmVudCBhbmQgcmVwZWF0IGNhbGxlcnMgc2hhcmUgb25lIGluLWZsaWdodCBwcm9taXNlIGFuZCBzZXR0bGVkIHJlc3VsdC5cbiAqL1xuY29uc3QgcmVzb2x2ZUZhY3RvcnkgPSBtZW1vaXplKGFzeW5jICgpOiBQcm9taXNlPExvZ2dlckZhY3Rvcnk+ID0+IHtcbiAgcmV0dXJuIGNyZWF0ZUNvbnNvbGVMb2dnZXJGYWN0b3J5KGdsb2JhbFByb2Nlc3NTdGRFcnIpO1xufSk7XG5cbi8qKlxuICogQWN0aXZlIGZhY3Rvcnkgc3RhcnRzIGFzIGEgc3luYyBjb25zb2xlIHNpbmsgKG5vIGBhd2FpdGAsIHNvIHRoaXMgbW9kdWxlXG4gKiBmaW5pc2hlcyBldmFsdWF0aW5nIGltbWVkaWF0ZWx5KSBhbmQgc3dhcHMgdG8ge0BsaW5rIHJlc29sdmVGYWN0b3J5fSdzXG4gKiByZXN1bHQgd2hlbiBzZXJ2ZXItc2lkZSBhcmd1bWVudCBpbnNwZWN0aW9uIGlzIHJlYWR5LlxuICovXG5sZXQgYWN0aXZlRmFjdG9yeTogTG9nZ2VyRmFjdG9yeSA9IGNvbnNvbGVMb2dnZXJGYWN0b3J5KGdsb2JhbFByb2Nlc3NTdGRFcnIpO1xudm9pZCByZXNvbHZlRmFjdG9yeSgpLnRoZW4oXG4gIChmYWN0b3J5KSA9PiB7XG4gICAgYWN0aXZlRmFjdG9yeSA9IGZhY3Rvcnk7XG4gIH0sXG4gICgpID0+IHtcbiAgICAvLyBLZWVwIHRoZSBzeW5jIGNvbnNvbGUgc2luazsgbmV2ZXIgbGVhdmUgaW1wb3J0ZXJzIHdpdGhvdXQgYSBmYWN0b3J5LlxuICB9LFxuKTtcblxuLyoqXG4gKiBCdWlsZCBhIGxvZ2dlciB0aGF0IHJlYmluZHMgd2hlbiB7QGxpbmsgYWN0aXZlRmFjdG9yeX0gdXBncmFkZXMuIENhbGxlcnMgdGhhdFxuICogY2FwdHVyZSBgY29uc3QgbG9nID0gbG9nZ2VyKFwieFwiKWAgYXQgbW9kdWxlIHNjb3BlIHN0aWxsIGdldCB0aGUgdXBncmFkZWRcbiAqIGZvcm1hdHRlciBvbmNlIGl0IGFycml2ZXMsIHdpdGhvdXQgZXZlcnkgY2FsbCBzaXRlIHdhaXRpbmcgb24gYSBwcm9taXNlLlxuICovXG5mdW5jdGlvbiBjcmVhdGVMb2dnZXIobmFtZT86IHN0cmluZyk6IExvZ2dlciB7XG4gIGxldCBib3VuZDogeyBmYWN0b3J5OiBMb2dnZXJGYWN0b3J5OyBsb2dnZXI6IExvZ2dlciB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzaW5rID0gKCk6IExvZ2dlciA9PiB7XG4gICAgaWYgKGJvdW5kPy5mYWN0b3J5ICE9PSBhY3RpdmVGYWN0b3J5KSB7XG4gICAgICBib3VuZCA9IHsgZmFjdG9yeTogYWN0aXZlRmFjdG9yeSwgbG9nZ2VyOiBhY3RpdmVGYWN0b3J5KG5hbWUpIH07XG4gICAgfVxuICAgIHJldHVybiBib3VuZC5sb2dnZXI7XG4gIH07XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLkxPR19MRVZFTFMsIFwic3VjY2Vzc1wiLCBcInN0YXJ0XCJdLm1hcCgobGV2ZWwpID0+IFtcbiAgICAgIGxldmVsLFxuICAgICAgKC4uLmFyZ3M6IGFueVtdKSA9PiBzaW5rKClbbGV2ZWwgYXMga2V5b2YgTG9nZ2VyXSguLi5hcmdzKSxcbiAgICBdKSxcbiAgKSBhcyBMb2dnZXI7XG59XG5cbi8qKlxuICogQnVpbGQgYSBsaW5lIHByZWZpeCBvZiBgTEVWRUwgW25hbWVdYCBvbiBOb2RlL0J1biBob3N0cywgb3IgYFtuYW1lXWAgYWxvbmVcbiAqIGluIGJyb3dzZXJzIChlaXRoZXIgcGFydCBvbWl0dGVkIHdoZW4gYWJzZW50KS4gQXBwbGllcyBwZXItbGV2ZWwgQU5TSSBjb2xvclxuICogd2hlbiBgc3RyZWFtU3VwcG9ydHNDb2xvcmAgaXMgdHJ1ZSBmb3IgdGhlIGdpdmVuIHN0ZGVyciBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlcihcbiAgbmFtZTogYW55LFxuICBzdHJlYW06IGFueSxcbiAgcmVzZXRDb2xvcnNQcmVmaXg/OiBib29sZWFuLFxuKTogKGxldmVsPzogTG9nTGV2ZWwpID0+IHsgcHJlZml4OiBzdHJpbmc7IGNvbG9yczogYm9vbGVhbjsgcmVzZXRDb2xvcnM6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGdsb2IgPSBnbG9iYWxUaGlzIGFzIHsgd2luZG93PzogdW5rbm93bjsgZG9jdW1lbnQ/OiB1bmtub3duIH07XG4gIGNvbnN0IGlzQnJvd3NlciA9IGdsb2Iud2luZG93ICE9PSB1bmRlZmluZWQgJiYgZ2xvYi5kb2N1bWVudCAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBzdXBwb3J0c0NvbG9yID0gIWlzQnJvd3NlciA/IHN0cmVhbVN1cHBvcnRzQ29sb3Ioc3RyZWFtKSA6IGZhbHNlO1xuICBjb25zdCBuYW1lUHJlZml4ID0gbmFtZSA/IFwiW1wiICsgbmFtZSArIFwiXVwiIDogdW5kZWZpbmVkO1xuICByZXR1cm4gKGxldmVsPzogTG9nTGV2ZWwpID0+IHtcbiAgICBjb25zdCBjb2xvciA9IHN1cHBvcnRzQ29sb3IgJiYgbGV2ZWwgIT09IHVuZGVmaW5lZCA/IExPR19MRVZFTF9DT0xPUlNbbGV2ZWxdIDogdW5kZWZpbmVkO1xuICAgIGxldCBwcmVmaXggPSBbIWlzQnJvd3NlciAmJiBsZXZlbCA/IGxldmVsLnRvVXBwZXJDYXNlKCkgOiB1bmRlZmluZWQsIG5hbWVQcmVmaXhdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbihcIiBcIik7XG4gICAgbGV0IHJlc2V0Q29sb3JzID0gZmFsc2U7XG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBjb25zdCBhcHBseVJlc2V0Q29sb3JzUHJlZml4ID0gcmVzZXRDb2xvcnNQcmVmaXggfHwgXCJpbmZvXCIgPT09IGxldmVsO1xuICAgICAgaWYgKCFhcHBseVJlc2V0Q29sb3JzUHJlZml4KSByZXNldENvbG9ycyA9IHRydWU7XG4gICAgICBwcmVmaXggPSBhcHBseVJlc2V0Q29sb3JzUHJlZml4ID8gY29sb3IgKyBwcmVmaXggKyBMT0dfTEVWRUxfQ09MT1JfUkVTRVQgOiBjb2xvciArIHByZWZpeDtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHJlZml4LCBjb2xvcnM6IGNvbG9yID8gdHJ1ZSA6IGZhbHNlLCByZXNldENvbG9ycyB9O1xuICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIGBzdHJlYW1gIGlzIGEgVFRZIGFuZCB0aGUgdGVybWluYWwgaXMgbm90IGBkdW1iYC4gKi9cbmZ1bmN0aW9uIHN0cmVhbVN1cHBvcnRzQ29sb3Ioc3RyZWFtPzogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoZ2xvYmFsUHJvY2VzcyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBzdHJlYW0gIT09IFwib2JqZWN0XCIgfHwgc3RyZWFtID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHsgaXNUVFkgfSA9IHN0cmVhbSBhcyB7IGlzVFRZPzogdW5rbm93biB9O1xuICBpZiAoaXNUVFkgIT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdGVybSA9IGdsb2JhbFByb2Nlc3MuZW52Py5URVJNPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoXCJkdW1iXCIgPT0gdGVybSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFBhcnNlIGEgcmF3IHZhbHVlIGFzIHtAbGluayBMb2dMZXZlbH0gKHRyaW1tZWQsIGNhc2UtaW5zZW5zaXRpdmUpLiAqL1xuZnVuY3Rpb24gcGFyc2VMb2dMZXZlbChyYXc6IHVua25vd24pOiBMb2dMZXZlbCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCB0ZXh0ID0gdHlwZW9mIHJhdyA9PT0gXCJzdHJpbmdcIiA/IHJhdyA6IFN0cmluZyhyYXcpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgIGlmIChpID4gMCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGV4dCA9PT0gbm9ybWFsaXplZCkgYnJlYWs7XG4gICAgICB0ZXh0ID0gbm9ybWFsaXplZDtcbiAgICB9XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHRleHQgaW4gTE9HX0xFVkVMX1JBTkspIHtcbiAgICAgIHJldHVybiB0ZXh0IGFzIExvZ0xldmVsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogQWN0aXZlIHRocmVzaG9sZCBmcm9tIGBwcm9jZXNzLmVudi5MT0dfTEVWRUxgLCBkZWZhdWx0IHtAbGluayBERUZBVUxUX0xFVkVMfS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3RpdmVMZXZlbCgpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBwYXJzZUxvZ0xldmVsKGdsb2JhbFByb2Nlc3M/LmVudj8uTE9HX0xFVkVMKSA/PyBERUZBVUxUX0xFVkVMO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYHJhd2AgbWVldHMgdGhlIGN1cnJlbnQgYExPR19MRVZFTGAgdGhyZXNob2xkLlxuICpcbiAqIFBhcnNlcyBgcmF3YCBhcyBhIHtAbGluayBMb2dMZXZlbH07IHdoZW4gcGFyc2luZyBmYWlscywgcmV0dXJuc1xuICogYGRlZmF1bHRSZXN1bHRgIGlmIHN1cHBsaWVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkRW1pdChyYXc6IHVua25vd24sIGRlZmF1bHRSZXN1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxldmVsID0gcGFyc2VMb2dMZXZlbChyYXcpO1xuICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRSZXN1bHQgPz8gZmFsc2U7XG4gIHJldHVybiBMT0dfTEVWRUxfUkFOS1tsZXZlbF0gPj0gTE9HX0xFVkVMX1JBTktbYWN0aXZlTGV2ZWwoKV07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGNhbGwgYXQgYGxldmVsYCB3b3VsZCBiZSBlbWl0dGVkIGF0IHRoZSBjdXJyZW50XG4gKiBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCB0aHJlc2hvbGQuIFVzZSBiZWZvcmUgYnVpbGRpbmcgZXhwZW5zaXZlIGRlYnVnXG4gKiBwYXlsb2Fkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzTGV2ZWxFbmFibGVkKFwiZGVidWdcIikpIHtcbiAqICAgbG9nLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHsgY29udHJpYnV0aW9uOiBhd2FpdCBoZWF2eVNuYXBzaG90KCkgfSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xldmVsRW5hYmxlZChsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNob3VsZEVtaXQobGV2ZWwpO1xufVxuXG5jb25zdCBMT0dHRVJfTkFNRV9SRUdFWCA9IC9eKD86W2Etel1bYS16MC05Ky4tXSo6XFwvXFwvKT8uKlxcLyhbXi8uXSspKD86XFwuW14vXSspPyQvaTtcblxuLyoqXG4gKiBEZXJpdmUgdGhlIHRhZyBzdHJpbmcgZnJvbSBhIGxvZ2dlciBuYW1lLCBwbHVnaW4sIG9yIHBhdGguIFNsYXNoLSBhbmRcbiAqIFVSTC1zaGFwZWQgc3RyaW5ncyB1c2UgdGhlIGxhc3QgcGF0aCBzZWdtZW50IChleHRlbnNpb24gc3RyaXBwZWQpOyBwbGFpblxuICogc3RyaW5ncyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLiBFbXB0eSBvciBtaXNzaW5nIG5hbWVzIC0+IGB1bmRlZmluZWRgXG4gKiAodW50YWdnZWQgc2luaykuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWU6IE5hbWVMaWtlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFsb2dnZXJOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGxvZ2dlck5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxvZ2dlck5hbWUubWF0Y2goTE9HR0VSX05BTUVfUkVHRVgpO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/IGxvZ2dlck5hbWU7XG4gIH1cbiAgcmV0dXJuIGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWUubmFtZSk7XG59XG5cbi8qKlxuICogQnVpbGQgYSB0YWdnZWQgbG9nZ2VyIGZvciBhIHBsdWdpbiBvciBtb2R1bGUuXG4gKlxuICogVGhlIHRhZyBpcyBgW25hbWVdYCB3aGVuIGBsb2dnZXJOYW1lYCBpcyBhIG5vbi1lbXB0eSBzdHJpbmcsIGFcbiAqIHtAbGluayBOYW1lTGlrZX0gd2l0aCBgbmFtZWAsIG9yIGEgZmlsZSAvIFVSTCBwYXRoICh0aGUgYmFzZW5hbWUgd2l0aG91dFxuICogZXh0ZW5zaW9uIGlzIHVzZWQpLiBUaGUgY29uc29sZSBzaW5rIHByZXBlbmRzIGBMRVZFTCBbbmFtZV1gIG9uIE5vZGUvQnVuXG4gKiBob3N0cyBvciBgW25hbWVdYCBhbG9uZSBpbiBicm93c2VycyB2aWEge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0uXG4gKlxuICogQ2FsbHMgYmVsb3cgYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgYXJlIGRyb3BwZWQgYnkge0BsaW5rIHNob3VsZEVtaXR9IGJlZm9yZVxuICogdGhlIHNpbmsgZm9ybWF0cyBvciB3cml0ZXMgdGhlIGxpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG4gKlxuICogY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImdlbmllL2NoYXRcIik7XG4gKiBsb2dnZXIuaW5mbyhcInN0YXJ0aW5nXCIpO1xuICogbG9nZ2VyLndhcm4oXCJtaXNzaW5nIG9wdGlvbmFsIGNvbmZpZ1wiLCB7IHJlYXNvbjogXCJubyBlbnYgdmFyXCIgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dnZXIobG9nZ2VyTmFtZTogTmFtZUxpa2UgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBMb2dnZXIge1xuICBjb25zdCBuYW1lID0gZXh0cmFjdExvZ2dlck5hbWUobG9nZ2VyTmFtZSk7XG4gIHJldHVybiBjcmVhdGVMb2dnZXIobmFtZSk7XG59XG4iXX0=
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFpQixTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFldkQsTUFBTSxhQUFhLEdBQUksVUFBd0MsQ0FBQyxPQUFPLENBQUM7QUFDeEUsTUFBTSxTQUFTLEdBQUksVUFBZ0MsQ0FBQyxHQUFHLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxtQkFBbUIsR0FDdkIsYUFBYSxJQUFJLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssVUFBVTtJQUNoRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07SUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQiw4REFBOEQ7QUFDOUQsTUFBTSxtQkFBbUIsR0FDdkIsYUFBYSxJQUFJLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssVUFBVTtJQUNoRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07SUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVoQixNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3ZDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUNyQixDQUFDO0FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDekMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUss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QU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxVQUF5QztJQUM5RCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUYWdnZWQsIGxldmVsZWQgbG9nZ2luZyBmb3IgZXZlcnkgcnVudGltZSAtIHRoZSBvbmUgbG9nZ2VyIHRoZSB3aG9sZVxuICogbW9ub3JlcG8gc2hhcmVzLlxuICpcbiAqIEltcG9ydCB0aGlzIG1vZHVsZSBpbnN0ZWFkIG9mIGNvbnN0cnVjdGluZyBwYWNrYWdlLWxvY2FsIGNvbnNvbGUgd3JhcHBlcnMgc29cbiAqIGxvZyBsZXZlbHMsIHRhZ3MsIGZvcm1hdHRpbmcsIGFuZCBicm93c2VyIGJlaGF2aW9yIHJlbWFpbiBjb25zaXN0ZW50LlxuICpcbiAqIHtAbGluayBsb2dnZXJ9IHJlc29sdmVzIGEgdGFnZ2VkIHtAbGluayBMb2dnZXJ9IHRocm91Z2ggYSBzeW5jaHJvbm91cyBjb25zb2xlXG4gKiBzaW5rLCB0aGVuIHVwZ3JhZGVzIGl0cyBzZXJ2ZXItc2lkZSBmb3JtYXR0ZXIgd2hlbiBgbm9kZTp1dGlsYCByZXNvbHZlcy5cbiAqIEtlZXBpbmcgdGhlIHNpbmsgZGVwZW5kZW5jeS1mcmVlIHByZXZlbnRzIGJyb3dzZXIgYnVuZGxlcnMgZnJvbSByZXRhaW5pbmcgYW5cbiAqIG9wdGlvbmFsIGJhcmUgaW1wb3J0IHRoYXQgZG93bnN0cmVhbSBhcHBzIHdvdWxkIHN0aWxsIGhhdmUgdG8gaW5zdGFsbC5cbiAqIHtAbGluayBMb2dMZXZlbH0gZmlsdGVyaW5nIHJ1bnMgdGhyb3VnaCB7QGxpbmsgc2hvdWxkRW1pdH0gaW4gcGVyLWxldmVsXG4gKiB3cmFwcGVycyBhcm91bmQgdGhlIHBsYXRmb3JtIGNvbnNvbGUgb3Igc3RkZXJyIHNpbmsuXG4gKlxuICogVGhlIGNvbnNvbGUgZmFsbGJhY2sgd3JpdGVzIGRlYnVnL2luZm8gdG8gYHByb2Nlc3Muc3Rkb3V0YCBhbmQgd2Fybi9lcnJvciB0b1xuICogYHByb2Nlc3Muc3RkZXJyYCB3aGVuIGF2YWlsYWJsZSAoQnVuIGBpbnNwZWN0YCBwZXIgYXJndW1lbnQgd2hlblxuICogYExPR19CVU5fQ09OU09MRV9ESVNBQkxFRGAgaXMgdW5zZXQsIG90aGVyd2lzZSBgbm9kZTp1dGlsYCBpbnNwZWN0aW9uKSwgb3JcbiAqIGRlbGVnYXRlcyB0byBnbG9iYWwgYGNvbnNvbGUuKmAgd2hlbiBwcm9jZXNzIHN0cmVhbXMgYXJlIHVuYXZhaWxhYmxlLiBCcm93c2VyIGhvc3RzIG9taXRcbiAqIHRoZSBgTEVWRUxgIHRleHQgcHJlZml4IChkZXZ0b29scyBzaG93IHNldmVyaXR5KSBhbmQga2VlcCBvbmx5IHRoZSBgW25hbWVdYFxuICogdGFnLlxuICpcbiAqIEVudiB0b2dnbGVzOiBgTE9HX0xFVkVMYCAocmVhZCBwZXIgY2FsbCkgYW5kIGBMT0dfQlVOX0NPTlNPTEVfRElTQUJMRURgXG4gKiAocmVhZCBvbmNlIGR1cmluZyBmYWN0b3J5IGluaXQpLlxuICpcbiAqIEJyb3dzZXItc2FmZTogYHByb2Nlc3NgIC8gYEJ1bmAgLyBgd2luZG93YCAvIGBkb2N1bWVudGAgYXJlIGFsbCByZWFjaGVkXG4gKiB0aHJvdWdoIGBnbG9iYWxUaGlzYCBhbmQgZ3VhcmRlZCwgYW5kIGBub2RlOnV0aWxgIGlzIGltcG9ydGVkIE9OTFkgb24gYSBob3N0XG4gKiB0aGF0IGhhcyBgcHJvY2Vzcy5zdGRlcnJgIC0gbmV2ZXIgaW4gYSBicm93c2VyLCB3aGVyZSB0aGUgc3BlY2lmaWVyIGlzXG4gKiB1bnJlc29sdmFibGUgLSBzbyB0aGUgbW9kdWxlIHdvcmtzIGluIGFueSBydW50aW1lLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSBcIi4vZnVuY3Rpb24tdXRpbHMudHNcIjtcbmltcG9ydCB7IHR5cGUgTmFtZUxpa2UsIHRvQm9vbGVhbiB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG4vKiogYHByb2Nlc3NgLXNoYXBlZCB2aWV3IG9mZiBgZ2xvYmFsVGhpc2AsIHNvIG5vIG5vZGUgdHlwZXMgYXJlIG5lZWRlZC4gKi9cbmludGVyZmFjZSBQcm9jZXNzTGlrZSB7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHN0ZG91dD86IHsgd3JpdGU/OiAoY2h1bms6IHN0cmluZykgPT4gdm9pZDsgaXNUVFk/OiB1bmtub3duIH07XG4gIHN0ZGVycj86IHsgd3JpdGU/OiAoY2h1bms6IHN0cmluZykgPT4gdm9pZDsgaXNUVFk/OiB1bmtub3duIH07XG59XG5cbi8qKiBgQnVuYC1zaGFwZWQgdmlldyBvZmYgYGdsb2JhbFRoaXNgLCBzbyBubyBgQHR5cGVzL2J1bmAgaXMgbmVlZGVkLiAqL1xuaW50ZXJmYWNlIEJ1bkxpa2Uge1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBpbnNwZWN0PzogKHZhbHVlOiB1bmtub3duLCBvcHRpb25zPzogeyBjb2xvcnM/OiBib29sZWFuOyBkZXB0aD86IG51bWJlciB9KSA9PiBzdHJpbmc7XG59XG5cbmNvbnN0IGdsb2JhbFByb2Nlc3MgPSAoZ2xvYmFsVGhpcyBhcyB7IHByb2Nlc3M/OiBQcm9jZXNzTGlrZSB9KS5wcm9jZXNzO1xuY29uc3QgZ2xvYmFsQnVuID0gKGdsb2JhbFRoaXMgYXMgeyBCdW4/OiBCdW5MaWtlIH0pLkJ1bjtcblxuLyoqXG4gKiBOb2RlIGBwcm9jZXNzLnN0ZGVycmAgd2hlbiB3cml0YWJsZSwgZWxzZSBgdW5kZWZpbmVkYCAoc3RhYmxlIGZvciB0aGVcbiAqIHByb2Nlc3MpLiBUeXBlZCBsb29zZWx5IChgYW55YCkgYmVjYXVzZSBpdCBpcyBoYW5kZWQgdG8gdGhlIGNvbnNvbGUgc2luaydzXG4gKiBgLndyaXRlYCwgd2hpY2ggb3VyIHN0cnVjdHVyYWwge0BsaW5rIFByb2Nlc3NMaWtlfSBzaGFwZSBkb2VzIG5vdCBzYXRpc2Z5XG4gKiBub21pbmFsbHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnkgPVxuICBnbG9iYWxQcm9jZXNzICYmIHR5cGVvZiBnbG9iYWxQcm9jZXNzLnN0ZGVycj8ud3JpdGUgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gZ2xvYmFsUHJvY2Vzcy5zdGRlcnJcbiAgICA6IHVuZGVmaW5lZDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBnbG9iYWxQcm9jZXNzU3RkT3V0OiBhbnkgPVxuICBnbG9iYWxQcm9jZXNzICYmIHR5cGVvZiBnbG9iYWxQcm9jZXNzLnN0ZG91dD8ud3JpdGUgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gZ2xvYmFsUHJvY2Vzcy5zdGRvdXRcbiAgICA6IHVuZGVmaW5lZDtcblxuY29uc3QgTE9HX0xFVkVMUyA9IFtcImRlYnVnXCIsIFwiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiXSBhcyBjb25zdDtcbmNvbnN0IExPR19MRVZFTF9SQU5LID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBMT0dfTEVWRUxTLm1hcCgobGV2ZWwsIGluZGV4KSA9PiBbbGV2ZWwsIGluZGV4XSksXG4pIGFzIFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPjtcbmNvbnN0IExPR19MRVZFTF9DT0xPUlMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIExPR19MRVZFTFMubWFwKChsZXZlbCkgPT4ge1xuICAgIGxldCBjb2xvciA9IFwiXFx4MWJbOTBtXCI7IC8vIGdyYXlcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlIFwiaW5mb1wiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzRtXCI7IC8vIGJsdWVcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwid2FyblwiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzNtXCI7IC8vIHllbGxvd1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzFtXCI7IC8vIHJlZFxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIFtsZXZlbCwgY29sb3JdO1xuICB9KSxcbikgYXMgUmVjb3JkPExvZ0xldmVsLCBzdHJpbmc+O1xuY29uc3QgTE9HX0xFVkVMX0NPTE9SX1JFU0VUID0gXCJcXHgxYlswbVwiO1xuY29uc3QgREVGQVVMVF9MRVZFTDogTG9nTGV2ZWwgPSBcImluZm9cIjtcblxuLyoqXG4gKiBTdXBwb3J0ZWQgc2V2ZXJpdGllcywgbG93ZXN0IHRvIGhpZ2hlc3Q6IGBkZWJ1Z2AsIGBpbmZvYCwgYHdhcm5gLCBgZXJyb3JgLlxuICogQSBjYWxsIGJlbG93IHRoZSBhY3RpdmUgdGhyZXNob2xkIGlzIGRpc2NhcmRlZCBiZWZvcmUgYW55IHN0cmluZyB3b3JrIG9yXG4gKiBzaW5rIEkvTy5cbiAqXG4gKiBUaGUgdGhyZXNob2xkIGNvbWVzIGZyb20gYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgb24gZXZlcnkgY2FsbFxuICogKGNhc2UtaW5zZW5zaXRpdmUsIGRlZmF1bHQgYGluZm9gIHdoZW4gdW5zZXQsIGVtcHR5LCBvciB1bmtub3duKSBzbyB0ZXN0XG4gKiBydW5uZXJzIGFuZCBlbWJlZGRlcnMgY2FuIGNoYW5nZSB2ZXJib3NpdHkgYWZ0ZXIgaW1wb3J0IHdpdGhvdXQgcmVzdGFydGluZ1xuICogdGhlIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gKHR5cGVvZiBMT0dfTEVWRUxTKVtudW1iZXJdO1xuXG4vKipcbiAqIERlcGVuZGVuY3ktZnJlZSBsZXZlbGVkIGxvZ2dlci4gU3RhbmRhcmQgbWV0aG9kcyBob25vciBgTE9HX0xFVkVMYDsgYHN0YXJ0YFxuICogYW5kIGBzdWNjZXNzYCBhcmUgaW5mb3JtYXRpb25hbCBhbGlhc2VzIHdpdGggZGlzdGluY3QgcHJlc2VudGF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBMb2dnZXIgPSB7XG4gIFtLIGluIExvZ0xldmVsXTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufSAmIHtcbiAgLyoqIFN1Y2Nlc3MgbWVzc2FnZSBlbWl0dGVkIGF0IGBpbmZvYCBsZXZlbC4gKi9cbiAgc3VjY2VzczogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICAvKiogU3RhcnQgLyBpbi1wcm9ncmVzcyBtZXNzYWdlIGVtaXR0ZWQgYXQgYGluZm9gIGxldmVsLiAqL1xuICBzdGFydDogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufTtcblxuLyoqIGAobmFtZT8pID0+IExvZ2dlcmAgc2luayBjb25zdHJ1Y3RvciByZXR1cm5lZCBieSB0aGUgaW5pdC10aW1lIGZhY3RvcnkgY2hhaW4uICovXG50eXBlIExvZ2dlckZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4gTG9nZ2VyO1xuXG4vKipcbiAqIENvbnNvbGUge0BsaW5rIExvZ2dlckZhY3Rvcnl9OyBhbHdheXMgc3VjY2VlZHMuXG4gKlxuICogV2hlbiBwcm9jZXNzIHN0cmVhbXMgYXJlIGF2YWlsYWJsZSwgZm9ybWF0cyBlYWNoIGxpbmUgYW5kIHdyaXRlcyBkZWJ1Zy9pbmZvXG4gKiB0byBzdGRvdXQgYW5kIHdhcm4vZXJyb3IgdG8gc3RkZXJyLiBCdW4gYGluc3BlY3RgIGZvcm1hdHMgZWFjaCBhcmd1bWVudCB3aGVuXG4gKiBlbmFibGVkOyBvdGhlcndpc2UgYHV0aWwuaW5zcGVjdGAgd2hlbiBgbm9kZTp1dGlsYCBsb2Fkcywgb3IgYVxuICogYEpTT04uc3RyaW5naWZ5YCBmYWxsYmFjayB3aGVuIGl0IGRvZXMgbm90LiBXaGVuIHByb2Nlc3Mgc3RyZWFtcyBhcmVcbiAqIHVuYXZhaWxhYmxlIChldmVyeSBicm93c2VyKSwgYmluZHNcbiAqIHtAbGluayBjcmVhdGVGb3JtYXR0ZXJ9IHByZWZpeGVzIGludG8gZ2xvYmFsIGBjb25zb2xlLipgIGNhbGxzIGFuZCBza2lwcyB0aGVcbiAqIGBub2RlOnV0aWxgIGltcG9ydCBlbnRpcmVseS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29uc29sZUxvZ2dlckZhY3RvcnkoXG4gIGdsb2JhbFByb2Nlc3NTdGRPdXQ6IGFueSxcbiAgZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55LFxuKTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5PiB7XG4gIC8vIEluZGlyZWN0IHNwZWNpZmllciBzbyB0aGlzIGJyb3dzZXItc2FmZSBtb2R1bGUgZG9lc24ndCBzdGF0aWNhbGx5IHB1bGwgaW5cbiAgLy8gbm9kZSB0eXBlczogYG5vZGU6dXRpbGAgaXMgb3B0aW9uYWwgKHRoZSBKU09OIGZhbGxiYWNrIGNvdmVycyBpdHMgYWJzZW5jZSkuXG4gIGNvbnN0IG5vZGVVdGlsID0gXCJub2RlOnV0aWxcIjtcbiAgLy8gR2F0ZWQsIG5vdCBqdXN0IGNhdWdodDogdGhlIGluZGlyZWN0IHNwZWNpZmllciBkZWZlYXRzIGJ1bmRsZXIgYW5hbHlzaXMgYnlcbiAgLy8gZGVzaWduLCBzbyBhIGNsaWVudCBidWlsZCBlbWl0cyBhIGxpdGVyYWwgYGltcG9ydChcIm5vZGU6dXRpbFwiKWAgdGhhdCBub1xuICAvLyBicm93c2VyIGNhbiByZXNvbHZlLCBhbmQgdGhlIGNhdWdodCByZWplY3Rpb24gc3RpbGwgc3VyZmFjZWQgYXMgYSBjb25zb2xlXG4gIC8vIGVycm9yLiBgdXRpbHNgIG9ubHkgZmVlZHMgdGhlIHByb2Nlc3Mtc3RyZWFtIGJyYW5jaCBvZiB0aGUgZW1pdHRlciBiZWxvdyxcbiAgLy8gc28gbm8gd3JpdGFibGUgc3RyZWFtIG1lYW5zIHRoZSBpbXBvcnQgaGFzIG5vdGhpbmcgdG8gc2VydmUgYW5kIGlzIHNraXBwZWQuXG4gIGNvbnN0IHV0aWxzOiB7IGluc3BlY3Q/OiBhbnkgfSB8IHVuZGVmaW5lZCA9XG4gICAgZ2xvYmFsUHJvY2Vzc1N0ZE91dCA9PT0gdW5kZWZpbmVkICYmIGdsb2JhbFByb2Nlc3NTdGRFcnIgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBub2RlVXRpbCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGNvbnNvbGVMb2dnZXJGYWN0b3J5KGdsb2JhbFByb2Nlc3NTdGRPdXQsIGdsb2JhbFByb2Nlc3NTdGRFcnIsIHV0aWxzKTtcbn1cblxuLyoqXG4gKiBUaGUgc3luY2hyb25vdXMgY29yZSBvZiB7QGxpbmsgY3JlYXRlQ29uc29sZUxvZ2dlckZhY3Rvcnl9LCBzcGxpdCBvdXQgc28gdGhlXG4gKiBzYW1lIGVtaXR0ZXIgYWxzbyBzZXJ2ZXMgYXMgdGhlIGJvb3RzdHJhcCBzaW5rIGJlZm9yZSBhbnkgYXN5bmMgZmFjdG9yeSBoYXNcbiAqIHJlc29sdmVkLiBgdXRpbHNgIGlzIGBub2RlOnV0aWxgIHdoZW4gaXQgbG9hZGVkOyB3aXRob3V0IGl0LCBvYmplY3QgYXJndW1lbnRzXG4gKiBmb3JtYXQgdGhyb3VnaCB0aGUgYEpTT04uc3RyaW5naWZ5YCBmYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gY29uc29sZUxvZ2dlckZhY3RvcnkoXG4gIGdsb2JhbFByb2Nlc3NTdGRPdXQ6IGFueSxcbiAgZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55LFxuICB1dGlscz86IHsgaW5zcGVjdD86IGFueSB9IHwgdW5kZWZpbmVkLFxuKTogTG9nZ2VyRmFjdG9yeSB7XG4gIGNvbnN0IGJ1bkluc3BlY3QgPVxuICAgIGdsb2JhbEJ1biAhPT0gdW5kZWZpbmVkICYmICF0b0Jvb2xlYW4oZ2xvYmFsQnVuLmVudj8uTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEKVxuICAgICAgPyBnbG9iYWxCdW4uaW5zcGVjdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc2V0Q29sb3JzUHJlZml4ID0gYnVuSW5zcGVjdCAhPT0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGluc3BlY3QgPSAoYXJnOiBhbnksIGNvbG9ycz86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpIHx8ICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkpIHtcbiAgICAgIGlmIChidW5JbnNwZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bkluc3BlY3QoYXJnLCB7XG4gICAgICAgICAgY29sb3JzOiBjb2xvcnMsXG4gICAgICAgICAgZGVwdGg6IHV0aWxzPy5pbnNwZWN0Py5kZWZhdWx0T3B0aW9ucz8uZGVwdGggPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdXRpbHMuaW5zcGVjdChhcmcsIHtcbiAgICAgICAgICAuLi51dGlscz8uaW5zcGVjdD8uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgY29sb3JzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZywgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGFyZyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIExPR19MRVZFTFMubWFwKChsZXZlbCkgPT4ge1xuICAgICAgICBjb25zdCBwcmVmZXJyZWRTdHJlYW0gPVxuICAgICAgICAgIGxldmVsID09PSBcIndhcm5cIiB8fCBsZXZlbCA9PT0gXCJlcnJvclwiID8gZ2xvYmFsUHJvY2Vzc1N0ZEVyciA6IGdsb2JhbFByb2Nlc3NTdGRPdXQ7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHByZWZlcnJlZFN0cmVhbSA/PyBnbG9iYWxQcm9jZXNzU3RkRXJyID8/IGdsb2JhbFByb2Nlc3NTdGRPdXQ7XG4gICAgICAgIGNvbnN0IHByZWZpeEZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihuYW1lLCBzdHJlYW0sIHJlc2V0Q29sb3JzUHJlZml4KTtcbiAgICAgICAgY29uc3QgeyBwcmVmaXgsIGNvbG9ycywgcmVzZXRDb2xvcnMgfSA9IHByZWZpeEZvcm1hdHRlcihsZXZlbCk7XG4gICAgICAgIGNvbnN0IGVtaXR0ZXIgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBpZiAoIXNob3VsZEVtaXQobGV2ZWwsIHRydWUpKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN0cmVhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFydHMgPSBwcmVmaXggPyBbcHJlZml4XSA6IFtdO1xuICAgICAgICAgICAgbWVzc2FnZVBhcnRzLnB1c2goLi4uYXJncy5tYXAoKGFyZykgPT4gaW5zcGVjdChhcmcsIGNvbG9ycykpKTtcbiAgICAgICAgICAgIGlmIChyZXNldENvbG9ycykgbWVzc2FnZVBhcnRzLnB1c2goTE9HX0xFVkVMX0NPTE9SX1JFU0VUKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShtZXNzYWdlUGFydHMuam9pbihcIiBcIikgKyBcIlxcblwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxldmVsRm4gPSBjb25zb2xlW2xldmVsXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWxGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIGxldmVsRm4gPSBjb25zb2xlLmxvZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmVmaXgpIGxldmVsRm4gPSBsZXZlbEZuLmJpbmQoY29uc29sZSwgcHJlZml4KTtcbiAgICAgICAgICAgIGxldmVsRm4oLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW2xldmVsLCBlbWl0dGVyXTtcbiAgICAgIH0pLFxuICAgICkgYXMgTG9nZ2VyO1xuICAgIC8vIENvbnZlbmllbmNlIGxldmVscyBzaGFyZSB0aGUgaW5mbyBzaW5rLlxuICAgIGxvZ2dlci5zdWNjZXNzID0gbG9nZ2VyLmluZm87XG4gICAgbG9nZ2VyLnN0YXJ0ID0gbG9nZ2VyLmluZm87XG4gICAgcmV0dXJuIGxvZ2dlcjtcbiAgfTtcbiAgY29uc3QgZGVmYXVsdEZhY3RvcnkgPSBtZW1vaXplKGZhY3RvcnkpO1xuICByZXR1cm4gKG5hbWU/OiBzdHJpbmcpID0+IChuYW1lID8gZmFjdG9yeShuYW1lKSA6IGRlZmF1bHRGYWN0b3J5KCkpO1xufVxuXG4vKipcbiAqIEZ1bGwgY29uc29sZSBzaW5rIHdpdGggb3B0aW9uYWwgYG5vZGU6dXRpbGAgaW5zcGVjdGlvbi4gTWVtb2l6ZWQgc29cbiAqIGNvbmN1cnJlbnQgYW5kIHJlcGVhdCBjYWxsZXJzIHNoYXJlIG9uZSBpbi1mbGlnaHQgcHJvbWlzZSBhbmQgc2V0dGxlZCByZXN1bHQuXG4gKi9cbmNvbnN0IHJlc29sdmVGYWN0b3J5ID0gbWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5PiA9PiB7XG4gIHJldHVybiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkT3V0LCBnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbn0pO1xuXG4vKipcbiAqIEFjdGl2ZSBmYWN0b3J5IHN0YXJ0cyBhcyBhIHN5bmMgY29uc29sZSBzaW5rIChubyBgYXdhaXRgLCBzbyB0aGlzIG1vZHVsZVxuICogZmluaXNoZXMgZXZhbHVhdGluZyBpbW1lZGlhdGVseSkgYW5kIHN3YXBzIHRvIHtAbGluayByZXNvbHZlRmFjdG9yeX0nc1xuICogcmVzdWx0IHdoZW4gc2VydmVyLXNpZGUgYXJndW1lbnQgaW5zcGVjdGlvbiBpcyByZWFkeS5cbiAqL1xubGV0IGFjdGl2ZUZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSBjb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkT3V0LCBnbG9iYWxQcm9jZXNzU3RkRXJyKTtcbnZvaWQgcmVzb2x2ZUZhY3RvcnkoKS50aGVuKFxuICAoZmFjdG9yeSkgPT4ge1xuICAgIGFjdGl2ZUZhY3RvcnkgPSBmYWN0b3J5O1xuICB9LFxuICAoKSA9PiB7XG4gICAgLy8gS2VlcCB0aGUgc3luYyBjb25zb2xlIHNpbms7IG5ldmVyIGxlYXZlIGltcG9ydGVycyB3aXRob3V0IGEgZmFjdG9yeS5cbiAgfSxcbik7XG5cbi8qKlxuICogQnVpbGQgYSBsb2dnZXIgdGhhdCByZWJpbmRzIHdoZW4ge0BsaW5rIGFjdGl2ZUZhY3Rvcnl9IHVwZ3JhZGVzLiBDYWxsZXJzIHRoYXRcbiAqIGNhcHR1cmUgYGNvbnN0IGxvZyA9IGxvZ2dlcihcInhcIilgIGF0IG1vZHVsZSBzY29wZSBzdGlsbCBnZXQgdGhlIHVwZ3JhZGVkXG4gKiBmb3JtYXR0ZXIgb25jZSBpdCBhcnJpdmVzLCB3aXRob3V0IGV2ZXJ5IGNhbGwgc2l0ZSB3YWl0aW5nIG9uIGEgcHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKG5hbWU/OiBzdHJpbmcpOiBMb2dnZXIge1xuICBsZXQgYm91bmQ6IHsgZmFjdG9yeTogTG9nZ2VyRmFjdG9yeTsgbG9nZ2VyOiBMb2dnZXIgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2luayA9ICgpOiBMb2dnZXIgPT4ge1xuICAgIGlmIChib3VuZD8uZmFjdG9yeSAhPT0gYWN0aXZlRmFjdG9yeSkge1xuICAgICAgYm91bmQgPSB7IGZhY3Rvcnk6IGFjdGl2ZUZhY3RvcnksIGxvZ2dlcjogYWN0aXZlRmFjdG9yeShuYW1lKSB9O1xuICAgIH1cbiAgICByZXR1cm4gYm91bmQubG9nZ2VyO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5MT0dfTEVWRUxTLCBcInN1Y2Nlc3NcIiwgXCJzdGFydFwiXS5tYXAoKGxldmVsKSA9PiBbXG4gICAgICBsZXZlbCxcbiAgICAgICguLi5hcmdzOiBhbnlbXSkgPT4gc2luaygpW2xldmVsIGFzIGtleW9mIExvZ2dlcl0oLi4uYXJncyksXG4gICAgXSksXG4gICkgYXMgTG9nZ2VyO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgbGluZSBwcmVmaXggb2YgYExFVkVMIFtuYW1lXWAgb24gTm9kZS9CdW4gaG9zdHMsIG9yIGBbbmFtZV1gIGFsb25lXG4gKiBpbiBicm93c2VycyAoZWl0aGVyIHBhcnQgb21pdHRlZCB3aGVuIGFic2VudCkuIEFwcGxpZXMgcGVyLWxldmVsIEFOU0kgY29sb3JcbiAqIHdoZW4gYHN0cmVhbVN1cHBvcnRzQ29sb3JgIGlzIHRydWUgZm9yIHRoZSBnaXZlbiBzdGRlcnIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoXG4gIG5hbWU6IGFueSxcbiAgc3RyZWFtOiBhbnksXG4gIHJlc2V0Q29sb3JzUHJlZml4PzogYm9vbGVhbixcbik6IChsZXZlbD86IExvZ0xldmVsKSA9PiB7IHByZWZpeDogc3RyaW5nOyBjb2xvcnM6IGJvb2xlYW47IHJlc2V0Q29sb3JzOiBib29sZWFuIH0ge1xuICBjb25zdCBnbG9iID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHVua25vd247IGRvY3VtZW50PzogdW5rbm93biB9O1xuICBjb25zdCBpc0Jyb3dzZXIgPSBnbG9iLndpbmRvdyAhPT0gdW5kZWZpbmVkICYmIGdsb2IuZG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VwcG9ydHNDb2xvciA9ICFpc0Jyb3dzZXIgPyBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbSkgOiBmYWxzZTtcbiAgY29uc3QgbmFtZVByZWZpeCA9IG5hbWUgPyBcIltcIiArIG5hbWUgKyBcIl1cIiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChsZXZlbD86IExvZ0xldmVsKSA9PiB7XG4gICAgY29uc3QgY29sb3IgPSBzdXBwb3J0c0NvbG9yICYmIGxldmVsICE9PSB1bmRlZmluZWQgPyBMT0dfTEVWRUxfQ09MT1JTW2xldmVsXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlZml4ID0gWyFpc0Jyb3dzZXIgJiYgbGV2ZWwgPyBsZXZlbC50b1VwcGVyQ2FzZSgpIDogdW5kZWZpbmVkLCBuYW1lUHJlZml4XVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGxldCByZXNldENvbG9ycyA9IGZhbHNlO1xuICAgIGlmIChjb2xvcikge1xuICAgICAgY29uc3QgYXBwbHlSZXNldENvbG9yc1ByZWZpeCA9IHJlc2V0Q29sb3JzUHJlZml4IHx8IFwiaW5mb1wiID09PSBsZXZlbDtcbiAgICAgIGlmICghYXBwbHlSZXNldENvbG9yc1ByZWZpeCkgcmVzZXRDb2xvcnMgPSB0cnVlO1xuICAgICAgcHJlZml4ID0gYXBwbHlSZXNldENvbG9yc1ByZWZpeCA/IGNvbG9yICsgcHJlZml4ICsgTE9HX0xFVkVMX0NPTE9SX1JFU0VUIDogY29sb3IgKyBwcmVmaXg7XG4gICAgfVxuICAgIHJldHVybiB7IHByZWZpeCwgY29sb3JzOiBjb2xvciA/IHRydWUgOiBmYWxzZSwgcmVzZXRDb2xvcnMgfTtcbiAgfTtcbn1cblxuLyoqIFRydWUgd2hlbiBgc3RyZWFtYCBpcyBhIFRUWSBhbmQgdGhlIHRlcm1pbmFsIGlzIG5vdCBgZHVtYmAuICovXG5mdW5jdGlvbiBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbT86IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGdsb2JhbFByb2Nlc3MgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygc3RyZWFtICE9PSBcIm9iamVjdFwiIHx8IHN0cmVhbSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB7IGlzVFRZIH0gPSBzdHJlYW0gYXMgeyBpc1RUWT86IHVua25vd24gfTtcbiAgaWYgKGlzVFRZICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRlcm0gPSBnbG9iYWxQcm9jZXNzLmVudj8uVEVSTT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKFwiZHVtYlwiID09IHRlcm0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBQYXJzZSBhIHJhdyB2YWx1ZSBhcyB7QGxpbmsgTG9nTGV2ZWx9ICh0cmltbWVkLCBjYXNlLWluc2Vuc2l0aXZlKS4gKi9cbmZ1bmN0aW9uIHBhcnNlTG9nTGV2ZWwocmF3OiB1bmtub3duKTogTG9nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgdGV4dCA9IHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIgPyByYXcgOiBTdHJpbmcocmF3KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHRleHQgPT09IG5vcm1hbGl6ZWQpIGJyZWFrO1xuICAgICAgdGV4dCA9IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIGlmICghdGV4dCkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0ZXh0IGluIExPR19MRVZFTF9SQU5LKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBMb2dMZXZlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEFjdGl2ZSB0aHJlc2hvbGQgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCwgZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9MRVZFTH0uICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlTGV2ZWwoKTogTG9nTGV2ZWwge1xuICByZXR1cm4gcGFyc2VMb2dMZXZlbChnbG9iYWxQcm9jZXNzPy5lbnY/LkxPR19MRVZFTCkgPz8gREVGQVVMVF9MRVZFTDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGByYXdgIG1lZXRzIHRoZSBjdXJyZW50IGBMT0dfTEVWRUxgIHRocmVzaG9sZC5cbiAqXG4gKiBQYXJzZXMgYHJhd2AgYXMgYSB7QGxpbmsgTG9nTGV2ZWx9OyB3aGVuIHBhcnNpbmcgZmFpbHMsIHJldHVybnNcbiAqIGBkZWZhdWx0UmVzdWx0YCBpZiBzdXBwbGllZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZEVtaXQocmF3OiB1bmtub3duLCBkZWZhdWx0UmVzdWx0PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBsZXZlbCA9IHBhcnNlTG9nTGV2ZWwocmF3KTtcbiAgaWYgKGxldmVsID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0UmVzdWx0ID8/IGZhbHNlO1xuICByZXR1cm4gTE9HX0xFVkVMX1JBTktbbGV2ZWxdID49IExPR19MRVZFTF9SQU5LW2FjdGl2ZUxldmVsKCldO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBjYWxsIGF0IGBsZXZlbGAgd291bGQgYmUgZW1pdHRlZCBhdCB0aGUgY3VycmVudFxuICogYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgdGhyZXNob2xkLiBVc2UgYmVmb3JlIGJ1aWxkaW5nIGV4cGVuc2l2ZSBkZWJ1Z1xuICogcGF5bG9hZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc0xldmVsRW5hYmxlZChcImRlYnVnXCIpKSB7XG4gKiAgIGxvZy5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlclwiLCB7IGNvbnRyaWJ1dGlvbjogYXdhaXQgaGVhdnlTbmFwc2hvdCgpIH0pO1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMZXZlbEVuYWJsZWQobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaG91bGRFbWl0KGxldmVsKTtcbn1cblxuY29uc3QgTE9HR0VSX05BTUVfUkVHRVggPSAvXig/OlthLXpdW2EtejAtOSsuLV0qOlxcL1xcLyk/LipcXC8oW14vLl0rKSg/OlxcLlteL10rKT8kL2k7XG5cbi8qKlxuICogRGVyaXZlIHRoZSB0YWcgc3RyaW5nIGZyb20gYSBsb2dnZXIgbmFtZSwgcGx1Z2luLCBvciBwYXRoLiBTbGFzaC0gYW5kXG4gKiBVUkwtc2hhcGVkIHN0cmluZ3MgdXNlIHRoZSBsYXN0IHBhdGggc2VnbWVudCAoZXh0ZW5zaW9uIHN0cmlwcGVkKTsgcGxhaW5cbiAqIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC4gRW1wdHkgb3IgbWlzc2luZyBuYW1lcyAtPiBgdW5kZWZpbmVkYFxuICogKHVudGFnZ2VkIHNpbmspLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TG9nZ2VyTmFtZShsb2dnZXJOYW1lOiBOYW1lTGlrZSB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghbG9nZ2VyTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBsb2dnZXJOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsb2dnZXJOYW1lLm1hdGNoKExPR0dFUl9OQU1FX1JFR0VYKTtcbiAgICByZXR1cm4gbWF0Y2g/LlsxXSA/PyBsb2dnZXJOYW1lO1xuICB9XG4gIHJldHVybiBleHRyYWN0TG9nZ2VyTmFtZShsb2dnZXJOYW1lLm5hbWUpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgdGFnZ2VkIGxvZ2dlciBmb3IgYSBwbHVnaW4gb3IgbW9kdWxlLlxuICpcbiAqIFRoZSB0YWcgaXMgYFtuYW1lXWAgd2hlbiBgbG9nZ2VyTmFtZWAgaXMgYSBub24tZW1wdHkgc3RyaW5nLCBhXG4gKiB7QGxpbmsgTmFtZUxpa2V9IHdpdGggYG5hbWVgLCBvciBhIGZpbGUgLyBVUkwgcGF0aCAodGhlIGJhc2VuYW1lIHdpdGhvdXRcbiAqIGV4dGVuc2lvbiBpcyB1c2VkKS4gVGhlIGNvbnNvbGUgc2luayBwcmVwZW5kcyBgTEVWRUwgW25hbWVdYCBvbiBOb2RlL0J1blxuICogaG9zdHMgb3IgYFtuYW1lXWAgYWxvbmUgaW4gYnJvd3NlcnMgdmlhIHtAbGluayBjcmVhdGVGb3JtYXR0ZXJ9LlxuICpcbiAqIENhbGxzIGJlbG93IGBwcm9jZXNzLmVudi5MT0dfTEVWRUxgIGFyZSBkcm9wcGVkIGJ5IHtAbGluayBzaG91bGRFbWl0fSBiZWZvcmVcbiAqIHRoZSBzaW5rIGZvcm1hdHMgb3Igd3JpdGVzIHRoZSBsaW5lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuICpcbiAqIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJnZW5pZS9jaGF0XCIpO1xuICogbG9nZ2VyLmluZm8oXCJzdGFydGluZ1wiKTtcbiAqIGxvZ2dlci53YXJuKFwibWlzc2luZyBvcHRpb25hbCBjb25maWdcIiwgeyByZWFzb246IFwibm8gZW52IHZhclwiIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKGxvZ2dlck5hbWU6IE5hbWVMaWtlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogTG9nZ2VyIHtcbiAgY29uc3QgbmFtZSA9IGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWUpO1xuICByZXR1cm4gY3JlYXRlTG9nZ2VyKG5hbWUpO1xufVxuIl19
package/package.json CHANGED
@@ -114,7 +114,7 @@
114
114
  "./package.json": "./package.json"
115
115
  }
116
116
  },
117
- "version": "0.9.117",
117
+ "version": "0.9.119",
118
118
  "types": "./lib/index.d.ts",
119
119
  "dbxToolsConfig": {
120
120
  "tags": [
package/src/log.ts CHANGED
@@ -12,10 +12,10 @@
12
12
  * {@link LogLevel} filtering runs through {@link shouldEmit} in per-level
13
13
  * wrappers around the platform console or stderr sink.
14
14
  *
15
- * The console fallback writes formatted lines to `process.stderr` when it is
16
- * available (Bun `inspect` per argument when `LOG_BUN_CONSOLE_DISABLED` is
17
- * unset, otherwise `node:util` `formatWithOptions`), or delegates to global
18
- * `console.*` when stderr or `node:util` is unavailable. Browser hosts omit
15
+ * The console fallback writes debug/info to `process.stdout` and warn/error to
16
+ * `process.stderr` when available (Bun `inspect` per argument when
17
+ * `LOG_BUN_CONSOLE_DISABLED` is unset, otherwise `node:util` inspection), or
18
+ * delegates to global `console.*` when process streams are unavailable. Browser hosts omit
19
19
  * the `LEVEL` text prefix (devtools show severity) and keep only the `[name]`
20
20
  * tag.
21
21
  *
@@ -36,6 +36,7 @@ import { type NameLike, toBoolean } from "./object.ts";
36
36
  /** `process`-shaped view off `globalThis`, so no node types are needed. */
37
37
  interface ProcessLike {
38
38
  env?: Record<string, string | undefined>;
39
+ stdout?: { write?: (chunk: string) => void; isTTY?: unknown };
39
40
  stderr?: { write?: (chunk: string) => void; isTTY?: unknown };
40
41
  }
41
42
 
@@ -59,6 +60,11 @@ const globalProcessStdErr: any =
59
60
  globalProcess && typeof globalProcess.stderr?.write === "function"
60
61
  ? globalProcess.stderr
61
62
  : undefined;
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ const globalProcessStdOut: any =
65
+ globalProcess && typeof globalProcess.stdout?.write === "function"
66
+ ? globalProcess.stdout
67
+ : undefined;
62
68
 
63
69
  const LOG_LEVELS = ["debug", "info", "warn", "error"] as const;
64
70
  const LOG_LEVEL_RANK = Object.fromEntries(
@@ -115,27 +121,31 @@ type LoggerFactory = (name?: string) => Logger;
115
121
  /**
116
122
  * Console {@link LoggerFactory}; always succeeds.
117
123
  *
118
- * When `process.stderr` is available, formats each line and writes only to
119
- * stderr. Bun `inspect` formats each argument when enabled; otherwise
120
- * `util.inspect` when `node:util` loads, or a `JSON.stringify` fallback when
121
- * it does not. When stderr is unavailable (every browser), binds
124
+ * When process streams are available, formats each line and writes debug/info
125
+ * to stdout and warn/error to stderr. Bun `inspect` formats each argument when
126
+ * enabled; otherwise `util.inspect` when `node:util` loads, or a
127
+ * `JSON.stringify` fallback when it does not. When process streams are
128
+ * unavailable (every browser), binds
122
129
  * {@link createFormatter} prefixes into global `console.*` calls and skips the
123
130
  * `node:util` import entirely.
124
131
  */
125
- async function createConsoleLoggerFactory(globalProcessStdErr: any): Promise<LoggerFactory> {
132
+ async function createConsoleLoggerFactory(
133
+ globalProcessStdOut: any,
134
+ globalProcessStdErr: any,
135
+ ): Promise<LoggerFactory> {
126
136
  // Indirect specifier so this browser-safe module doesn't statically pull in
127
137
  // node types: `node:util` is optional (the JSON fallback covers its absence).
128
138
  const nodeUtil = "node:util";
129
139
  // Gated, not just caught: the indirect specifier defeats bundler analysis by
130
140
  // design, so a client build emits a literal `import("node:util")` that no
131
141
  // browser can resolve, and the caught rejection still surfaced as a console
132
- // error. `utils` only feeds the stderr branch of the emitter below, so no
133
- // stderr means the import has nothing to serve and is skipped outright.
142
+ // error. `utils` only feeds the process-stream branch of the emitter below,
143
+ // so no writable stream means the import has nothing to serve and is skipped.
134
144
  const utils: { inspect?: any } | undefined =
135
- globalProcessStdErr === undefined
145
+ globalProcessStdOut === undefined && globalProcessStdErr === undefined
136
146
  ? undefined
137
147
  : await import(/* @vite-ignore */ nodeUtil).catch(() => undefined);
138
- return consoleLoggerFactory(globalProcessStdErr, utils);
148
+ return consoleLoggerFactory(globalProcessStdOut, globalProcessStdErr, utils);
139
149
  }
140
150
 
141
151
  /**
@@ -145,6 +155,7 @@ async function createConsoleLoggerFactory(globalProcessStdErr: any): Promise<Log
145
155
  * format through the `JSON.stringify` fallback.
146
156
  */
147
157
  function consoleLoggerFactory(
158
+ globalProcessStdOut: any,
148
159
  globalProcessStdErr: any,
149
160
  utils?: { inspect?: any } | undefined,
150
161
  ): LoggerFactory {
@@ -182,17 +193,20 @@ function consoleLoggerFactory(
182
193
  };
183
194
 
184
195
  const factory = (name?: string) => {
185
- const prefixFormatter = createFormatter(name, globalProcessStdErr, resetColorsPrefix);
186
196
  const logger = Object.fromEntries(
187
197
  LOG_LEVELS.map((level) => {
198
+ const preferredStream =
199
+ level === "warn" || level === "error" ? globalProcessStdErr : globalProcessStdOut;
200
+ const stream = preferredStream ?? globalProcessStdErr ?? globalProcessStdOut;
201
+ const prefixFormatter = createFormatter(name, stream, resetColorsPrefix);
188
202
  const { prefix, colors, resetColors } = prefixFormatter(level);
189
203
  const emitter = (...args: any[]) => {
190
204
  if (!shouldEmit(level, true)) return;
191
- if (globalProcessStdErr !== undefined) {
205
+ if (stream !== undefined) {
192
206
  const messageParts = prefix ? [prefix] : [];
193
207
  messageParts.push(...args.map((arg) => inspect(arg, colors)));
194
208
  if (resetColors) messageParts.push(LOG_LEVEL_COLOR_RESET);
195
- globalProcessStdErr.write(messageParts.join(" ") + "\n");
209
+ stream.write(messageParts.join(" ") + "\n");
196
210
  } else {
197
211
  let levelFn = console[level];
198
212
  if (typeof levelFn !== "function") {
@@ -219,7 +233,7 @@ function consoleLoggerFactory(
219
233
  * concurrent and repeat callers share one in-flight promise and settled result.
220
234
  */
221
235
  const resolveFactory = memoize(async (): Promise<LoggerFactory> => {
222
- return createConsoleLoggerFactory(globalProcessStdErr);
236
+ return createConsoleLoggerFactory(globalProcessStdOut, globalProcessStdErr);
223
237
  });
224
238
 
225
239
  /**
@@ -227,7 +241,7 @@ const resolveFactory = memoize(async (): Promise<LoggerFactory> => {
227
241
  * finishes evaluating immediately) and swaps to {@link resolveFactory}'s
228
242
  * result when server-side argument inspection is ready.
229
243
  */
230
- let activeFactory: LoggerFactory = consoleLoggerFactory(globalProcessStdErr);
244
+ let activeFactory: LoggerFactory = consoleLoggerFactory(globalProcessStdOut, globalProcessStdErr);
231
245
  void resolveFactory().then(
232
246
  (factory) => {
233
247
  activeFactory = factory;