velocious 1.0.680 → 1.0.682

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 (28) hide show
  1. package/build/background-jobs/worker.js +121 -15
  2. package/build/http-server/client/index.js +160 -0
  3. package/build/http-server/client/request-runner.js +13 -5
  4. package/build/http-server/client/response.js +142 -0
  5. package/build/http-server/worker-handler/in-process.js +20 -2
  6. package/build/http-server/worker-handler/worker-thread.js +4 -1
  7. package/build/src/background-jobs/worker.d.ts +59 -10
  8. package/build/src/background-jobs/worker.d.ts.map +1 -1
  9. package/build/src/background-jobs/worker.js +117 -16
  10. package/build/src/http-server/client/index.d.ts +69 -0
  11. package/build/src/http-server/client/index.d.ts.map +1 -1
  12. package/build/src/http-server/client/index.js +147 -1
  13. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  14. package/build/src/http-server/client/request-runner.js +16 -7
  15. package/build/src/http-server/client/response.d.ts +88 -0
  16. package/build/src/http-server/client/response.d.ts.map +1 -1
  17. package/build/src/http-server/client/response.js +136 -1
  18. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  19. package/build/src/http-server/worker-handler/in-process.js +20 -3
  20. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  21. package/build/src/http-server/worker-handler/worker-thread.js +4 -2
  22. package/package.json +1 -1
  23. package/src/background-jobs/worker.js +121 -15
  24. package/src/http-server/client/index.js +160 -0
  25. package/src/http-server/client/request-runner.js +13 -5
  26. package/src/http-server/client/response.js +142 -0
  27. package/src/http-server/worker-handler/in-process.js +20 -2
  28. package/src/http-server/worker-handler/worker-thread.js +4 -1
@@ -271,13 +271,22 @@ export default class VelociousHttpServerClientRequestRunner {
271
271
  errorType: "framework-error"
272
272
  });
273
273
  response.setStatus(500);
274
- try {
275
- response.setErrorBody(error);
274
+ if (response.isStreaming()) {
275
+ // The headers already went to the client, so a plain error body is
276
+ // impossible. The handler owns the stream lifecycle: it aborts the
277
+ // stream (terminator + close callbacks) or, when it still controls
278
+ // the connection, writes an error SSE frame.
279
+ response.abortStream();
276
280
  }
277
- catch (responseError) {
278
- if (!(responseError instanceof HttpResponseBodyTooLargeError))
279
- throw responseError;
280
- response.setBody("");
281
+ else {
282
+ try {
283
+ response.setErrorBody(error);
284
+ }
285
+ catch (responseError) {
286
+ if (!(responseError instanceof HttpResponseBodyTooLargeError))
287
+ throw responseError;
288
+ response.setBody("");
289
+ }
281
290
  }
282
291
  }
283
292
  await this.logger.debug(() => ["Request runner done", {
@@ -314,4 +323,4 @@ export default class VelociousHttpServerClientRequestRunner {
314
323
  await logger[requestTiming.completedLogMethod](completedMessage);
315
324
  }
316
325
  }
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQ25DLE9BQU8sZ0JBQWdCLE1BQU0sdUNBQXVDLENBQUE7QUFDcEUsT0FBTyxZQUFZLE1BQU0sOEJBQThCLENBQUE7QUFDdkQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3pELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sUUFBUSxNQUFNLGVBQWUsQ0FBQTtBQUNwQyxPQUFPLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUUzRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsSUFBSTtJQUMxQixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXZCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUNwQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQUssRUFBRSxzQkFBc0I7SUFDeEQsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO0lBRWxFLElBQUksV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFBO0lBRW5FLE1BQU0sU0FBUyxHQUFHLE9BQU8sNENBQTRDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJ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bXBvcnQge2Vuc3VyZUVycm9yfSBmcm9tIFwidHlwYW5pY1wiXG5pbXBvcnQgQmFja3RyYWNlQ2xlYW5lciBmcm9tIFwiLi4vLi4vdXRpbHMvYmFja3RyYWNlLWNsZWFuZXItbm9kZS5qc1wiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7SHR0cFJlc3BvbnNlQm9keVRvb0xhcmdlRXJyb3J9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlcXVlc3RUaW1pbmcgZnJvbSBcIi4vcmVxdWVzdC10aW1pbmcuanNcIlxuaW1wb3J0IFJlc3BvbnNlIGZyb20gXCIuL3Jlc3BvbnNlLmpzXCJcbmltcG9ydCBSb3V0ZXNSZXNvbHZlciBmcm9tIFwiLi4vLi4vcm91dGVzL3Jlc29sdmVyLmpzXCJcbmltcG9ydCB7UkVRVUVTVF9USU1FX1pPTkVfSEVBREVSfSBmcm9tIFwiLi4vLi4vdGltZS16b25lLmpzXCJcblxuLyoqXG4gKiBSdW5zIHN0YWNrIGZyYW1lIGxpbmUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gbGluZSAtIFBvdGVudGlhbCBoZWFkZXIgbGluZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGxpbmUgaXMgYSBzdGFjayBmcmFtZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tGcmFtZUxpbmUobGluZSkge1xuICBpZiAoIWxpbmUpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiAvXmF0XFxzKy91LnRlc3QobGluZS50cmltKCkpXG59XG5cbi8qKlxuICogUnVucyByZXF1ZXN0IGVycm9yIHN1bW1hcnkuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIHRvIGZvcm1hdCBmb3IgbG9nZ2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyIC0gQ2xlYW5lZCBzdGFjayB3aXRoIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMge3N0cmluZ30gLSBFcnJvciBzdW1tYXJ5IGxpbmUgd2l0aCB0eXBlIGluZm9ybWF0aW9uLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0RXJyb3JTdW1tYXJ5KGVycm9yLCBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyKSB7XG4gIGNvbnN0IHN0YWNrSGVhZGVyID0gY2xlYW5lZFN0YWNrV2l0aEhlYWRlcj8uc3BsaXQoXCJcXG5cIilbMF0/LnRyaW0oKVxuXG4gIGlmIChzdGFja0hlYWRlciAmJiAhc3RhY2tGcmFtZUxpbmUoc3RhY2tIZWFkZXIpKSByZXR1cm4gc3RhY2tIZWFkZXJcblxuICBjb25zdCBlcnJvckNvZGUgPSB0eXBlb2YgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGVycm9yKS5jb2RlID09PSBcInN0cmluZ1wiXG4gICAgPyAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAoZXJyb3IpLmNvZGVcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcilcblxuICBpZiAoZXJyb3JDb2RlKSByZXR1cm4gYCR7ZXJyb3IubmFtZX0gWyR7ZXJyb3JDb2RlfV06ICR7ZXJyb3JNZXNzYWdlfWBcblxuICByZXR1cm4gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3JNZXNzYWdlfWBcbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgZXJyb3IgbG9nIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIHRvIGZvcm1hdCBmb3IgbG9nZ2luZy5cbiAqIEByZXR1cm5zIHt7XG4gKiAgIGVycm9yU3VtbWFyeTogc3RyaW5nLFxuICogICBjbGVhbmVkQmFja3RyYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gKiB9fSAtIExvZyBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0RXJyb3JMb2dEZXRhaWxzKGVycm9yKSB7XG4gIGNvbnN0IGNsZWFuZWRTdGFja1dpdGhIZWFkZXIgPSBCYWNrdHJhY2VDbGVhbmVyLmdldENsZWFuZWRTdGFjayhlcnJvcilcbiAgY29uc3QgZXJyb3JTdW1tYXJ5ID0gcmVxdWVzdEVycm9yU3VtbWFyeShlcnJvciwgY2xlYW5lZFN0YWNrV2l0aEhlYWRlcilcbiAgY29uc3QgY2xlYW5lZEJhY2t0cmFjZSA9IEJhY2t0cmFjZUNsZWFuZXIuZ2V0Q2xlYW5lZFN0YWNrKGVycm9yLCB7aW5jbHVkZUVycm9ySGVhZGVyOiBmYWxzZX0pIHx8IGNsZWFuZWRTdGFja1dpdGhIZWFkZXJcblxuICByZXR1cm4ge2Vycm9yU3VtbWFyeSwgY2xlYW5lZEJhY2t0cmFjZX1cbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgZXJyb3IgbG9nIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3tcbiAqICAgZXJyb3JTdW1tYXJ5OiBzdHJpbmcsXG4gKiAgIGNsZWFuZWRCYWNrdHJhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAqIH19IGxvZ0RldGFpbHMgLSBMb2cgZGV0YWlscy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2luZ2xlIHJlcXVlc3QgZXJyb3IgbG9nIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RFcnJvckxvZ01lc3NhZ2UobG9nRGV0YWlscykge1xuICBpZiAoIWxvZ0RldGFpbHMuY2xlYW5lZEJhY2t0cmFjZSkge1xuICAgIHJldHVybiBgRXJyb3Igd2hpbGUgcnVubmluZyByZXF1ZXN0OiAke2xvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5fWBcbiAgfVxuXG4gIHJldHVybiBgRXJyb3Igd2hpbGUgcnVubmluZyByZXF1ZXN0OiAke2xvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5fVxcbkNsZWFuZWQgYmFja3RyYWNlOlxcbiR7bG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlfWBcbn1cblxuLyoqXG4gKiBSdW5zIHJlc3BvbnNlIGJvZHkgdHlwZSBmb3IgbG9nLlxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzcG9uc2UgLSBSZXNwb25zZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlc3BvbnNlIGJvZHkgdHlwZSBmb3IgbG9nZ2luZy5cbiAqL1xuZnVuY3Rpb24gcmVzcG9uc2VCb2R5VHlwZUZvckxvZyhyZXNwb25zZSkge1xuICBpZiAocmVzcG9uc2UuZ2V0RmlsZVBhdGgoKSkgcmV0dXJuIFwiZmlsZVwiXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc3BvbnNlLmdldEJvZHkoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJ1bnNldFwiXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGZvcm1hdCBidWNrZXQgbXMuXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtaWxsaXNlY29uZHMgd2l0aCBvbmUgZGVjaW1hbCBwbGFjZS5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0QnVja2V0TXModmFsdWUpIHtcbiAgcmV0dXJuIGAke3ZhbHVlLnRvRml4ZWQoMSl9bXNgXG59XG5cbi8qKlxuICogUnVucyBxdWVyeSBjb3VudCBsYWJlbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFF1ZXJ5IGNvdW50LlxuICogQHJldHVybnMge3N0cmluZ30gLSBRdWVyeSBjb3VudCBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gcXVlcnlDb3VudExhYmVsKGNvdW50KSB7XG4gIHJldHVybiBgJHtjb3VudH0gJHtjb3VudCA9PT0gMSA/IFwicXVlcnlcIiA6IFwicXVlcmllc1wifWBcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFJlcXVlc3RSdW5uZXIge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3R9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG4gICAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXF1ZXN0IGdpdmVuXCIpXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgIHRoaXMucmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KVxuICAgIHRoaXMuY29tcGxldGVkUmVxdWVzdExvZ2dlZCA9IGZhbHNlXG4gICAgdGhpcy5yZXF1ZXN0VGltaW5nID0gbmV3IFJlcXVlc3RUaW1pbmcoKVxuICAgIHRoaXMuc3RhdGUgPSBcInJ1bm5pbmdcIlxuICB9XG5cbiAgZ2V0UmVxdWVzdCgpIHsgcmV0dXJuIHRoaXMucmVxdWVzdCB9XG4gIGdldFN0YXRlKCkgeyByZXR1cm4gdGhpcy5zdGF0ZSB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIHRoaXMucmVxdWVzdFRpbWluZy5zdGFydGVkQXRNcyA9IERhdGUubm93KClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFJlcXVlc3RUaW1pbmcodGhpcy5yZXF1ZXN0VGltaW5nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWRhY3RvciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRMb2dSZWRhY3RvcigpXG4gICAgICBjb25zdCBzZW5zaXRpdmVWYWx1ZXMgPSByZWRhY3Rvci5yZXF1ZXN0U2Vuc2l0aXZlVmFsdWVzKHRoaXMucmVxdWVzdCwgdGhpcy5yZXF1ZXN0VGltaW5nLmdldExvZ1NlbnNpdGl2ZVZhbHVlcygpKVxuXG4gICAgICB0aGlzLnJlcXVlc3RUaW1pbmcucmVnaXN0ZXJMb2dTZW5zaXRpdmVWYWx1ZXMoc2Vuc2l0aXZlVmFsdWVzKVxuXG4gICAgICAvLyBSdW4gdGhlIHdob2xlIHJlcXVlc3QgaW5zaWRlIGFueSBwZXItdGVzdCBzaGFyZWQgY29ubmVjdGlvbiBjb250ZXh0IHNvIGFuXG4gICAgICAvLyBpbi1wcm9jZXNzIGhhbmRsZXIgZXhlY3V0ZXMgb24gdGhlIHRlc3QncyBjb25uZWN0aW9uIChhbmQgb3BlbiB0cmFuc2FjdGlvbikuXG4gICAgICAvLyBObyBzaGFyZWQgY29ubmVjdGlvbiBpcyBzZXQgb3V0c2lkZSB0ZXN0cyAvIGluIHdvcmtlciB0aHJlYWRzLCBzbyB0aGlzIGlzIGFcbiAgICAgIC8vIG5vLW9wIHRoZXJlLlxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZXN0U2hhcmVkQ29ubmVjdGlvbkNvbnRleHRzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIF9ydW4oKSB7XG4gICAgY29uc3Qge2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSA9IHRoaXNcblxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdD9cIilcblxuICAgIGNvbnN0IHJlZGFjdG9yID0gY29uZmlndXJhdGlvbi5nZXRMb2dSZWRhY3RvcigpXG4gICAgY29uc3Qgc2Vuc2l0aXZlVmFsdWVzID0gdGhpcy5yZXF1ZXN0VGltaW5nLmdldExvZ1NlbnNpdGl2ZVZhbHVlcygpXG4gICAgY29uc3QgbG9nZ2VkUGF0aCA9IHJlZGFjdG9yLnJlZGFjdFBhdGgocmVxdWVzdC5wYXRoKCksIHNlbnNpdGl2ZVZhbHVlcylcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSdW4gcmVxdWVzdCBsaWZlY3ljbGVcIiwge1xuICAgICAgICBodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgaHR0cFZlcnNpb246IHJlcXVlc3QuaHR0cFZlcnNpb24oKSxcbiAgICAgICAgb3JpZ2luOiByZXF1ZXN0Lm9yaWdpbigpLFxuICAgICAgICBwYXRoOiBsb2dnZWRQYXRoLFxuICAgICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKVxuICAgICAgfV0pXG4gICAgICAvLyBCZWZvcmUgd2UgY2hlY2tlZCBpZiB0aGUgc2VjLWZldGNoLW1vZGUgd2FzIFwiY29yc1wiLCBidXQgaXQgc2VlbXMgdGhlIHNlYy1mZXRjaC1tb2RlIGlzbid0IGFsd2F5cyBwcmVzZW50XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSdW4gQ09SU1wiLCB7aHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksIHNlY0ZldGNoTW9kZTogcmVxdWVzdC5oZWFkZXIoXCJzZWMtZmV0Y2gtbW9kZVwiKX1dKVxuXG4gICAgICBjb25zdCBjb3JzID0gY29uZmlndXJhdGlvbi5nZXRDb3JzKClcblxuICAgICAgaWYgKGNvcnMpIHtcbiAgICAgICAgYXdhaXQgY29ycyh7cmVxdWVzdCwgcmVzcG9uc2V9KVxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJDT1JTIGhhbmRsZXIgZG9uZVwiLCB7XG4gICAgICAgICAgaHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICAgICAgcGF0aDogbG9nZ2VkUGF0aCxcbiAgICAgICAgICByZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKVxuICAgICAgICB9XSlcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVlc3QuaHR0cE1ldGhvZCgpID09IFwiT1BUSU9OU1wiICYmIHJlcXVlc3QuaGVhZGVyKFwic2VjLWZldGNoLW1vZGVcIikgPT0gXCJjb3JzXCIpIHtcbiAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKDIwMClcbiAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShcIlwiKVxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJIYW5kbGVkIHByZWZsaWdodCBPUFRJT05TIHJlcXVlc3RcIiwge1xuICAgICAgICAgIHBhdGg6IGxvZ2dlZFBhdGgsXG4gICAgICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKClcbiAgICAgICAgfV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZyhcIlJ1biByZXF1ZXN0XCIpXG4gICAgICAgIGNvbnN0IHJvdXRlc1Jlc29sdmVyID0gbmV3IFJvdXRlc1Jlc29sdmVyKHtjb25maWd1cmF0aW9uLCByZXF1ZXN0LCByZXNwb25zZX0pXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZU1zID0gRGF0ZS5ub3coKVxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aW1lb3V0SWQuXG4gICAgICAgICAqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgbGV0IHRpbWVvdXRJZFxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aW1lb3V0UmVqZWN0LlxuICAgICAgICAgKiBAdHlwZSB7KChlcnJvcjogRXJyb3IpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBsZXQgdGltZW91dFJlamVjdFxuICAgICAgICBsZXQgdGltZWRPdXQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IHNldFJlcXVlc3RUaW1lb3V0U2Vjb25kcyA9ICgvKiogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi8gdGltZW91dFNlY29uZHMpID0+IHtcbiAgICAgICAgICBpZiAodGltZW91dElkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICAgICAgdGltZW91dElkID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aW1lb3V0U2Vjb25kcyAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRTZWNvbmRzKSB8fCB0aW1lb3V0U2Vjb25kcyA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSB0aW1lb3V0U2Vjb25kcyAqIDEwMDBcbiAgICAgICAgICBjb25zdCBlbGFwc2VkTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lTXNcbiAgICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXRNcyAtIGVsYXBzZWRNc1xuXG4gICAgICAgICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHtcbiAgICAgICAgICAgIHRpbWVvdXRSZWplY3Q/LihuZXcgRXJyb3IoYFJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dFNlY29uZHN9c2ApKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lb3V0UmVqZWN0Py4obmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRTZWNvbmRzfXNgKSlcbiAgICAgICAgICB9LCByZW1haW5pbmdNcylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRSZWplY3QgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXNwb25zZS5zZXRSZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcigodGltZW91dFNlY29uZHMpID0+IHtcbiAgICAgICAgICBzZXRSZXF1ZXN0VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpXG4gICAgICAgIH0pXG5cbiAgICAgICAgc2V0UmVxdWVzdFRpbWVvdXRTZWNvbmRzKGNvbmZpZ3VyYXRpb24uZ2V0UmVxdWVzdFRpbWVvdXRNcz8uKCkpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBsZXQgcmVzb2x2ZVByb21pc2VcblxuICAgICAgICBjb25zdCBydW5SZXNvbHZlZFJlcXVlc3QgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByb3V0ZXNSZXNvbHZlci5yZXNvbHZlKClcbiAgICAgICAgICAvLyBLZWVwIFByb21pc2UucmFjZSBoZXJlIHRvIGFsbG93IGR5bmFtaWMgdGltZW91dCB1cGRhdGVzLlxuICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbcmVzb2x2ZVByb21pc2UsIHRpbWVvdXRQcm9taXNlXSlcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSb3V0ZXMgcmVzb2x2ZXIgZG9uZVwiLCB7XG4gICAgICAgICAgICBodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgICAgIHBhdGg6IGxvZ2dlZFBhdGgsXG4gICAgICAgICAgICByZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSxcbiAgICAgICAgICAgIGhhc0ZpbGVQYXRoOiBCb29sZWFuKHJlc3BvbnNlLmdldEZpbGVQYXRoKCkpLFxuICAgICAgICAgICAgYm9keVR5cGU6IHJlc3BvbnNlQm9keVR5cGVGb3JMb2cocmVzcG9uc2UpXG4gICAgICAgICAgfV0pXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RUaW1lWm9uZSA9IHJlcXVlc3QuaGVhZGVyKFJFUVVFU1RfVElNRV9aT05FX0hFQURFUilcblxuICAgICAgICAgIGlmIChyZXF1ZXN0VGltZVpvbmUgIT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0VGltZVpvbmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRpbWV6b25lKHJlcXVlc3RUaW1lWm9uZSwgcnVuUmVzb2x2ZWRSZXF1ZXN0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBydW5SZXNvbHZlZFJlcXVlc3QoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAodGltZWRPdXQgJiYgcmVzb2x2ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHZvaWQgcmVzb2x2ZVByb21pc2UuY2F0Y2goKHJlc29sdmVFcnJvcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzYWZlUmVzb2x2ZUVycm9yID0gcmVkYWN0b3IucmVkYWN0RXJyb3IoZW5zdXJlRXJyb3IocmVzb2x2ZUVycm9yKSwgc2Vuc2l0aXZlVmFsdWVzKVxuXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1wiUmVxdWVzdCBmaW5pc2hlZCBhZnRlciB0aW1lb3V0XCIsIHNhZmVSZXNvbHZlRXJyb3JdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGltZW91dElkKSBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBlbnN1cmVFcnJvcihlKVxuICAgICAgY29uc3QgZXJyb3JXaXRoQ29udGV4dCA9IC8qKiBAdHlwZSB7e3ZlbG9jaW91c0NvbnRleHQ/OiBvYmplY3R9fSAqLyAoZXJyb3IpXG4gICAgICBjb25zdCBlcnJvckNvbnRleHQgPSBlcnJvcldpdGhDb250ZXh0LnZlbG9jaW91c0NvbnRleHQgfHwge3N0YWdlOiBcInJlcXVlc3QtcnVubmVyXCJ9XG4gICAgICBjb25zdCBsb2dEZXRhaWxzID0gcmVxdWVzdEVycm9yTG9nRGV0YWlscyhlcnJvcilcbiAgICAgIGNvbnN0IHJlZGFjdGVkTG9nRGV0YWlscyA9IHtcbiAgICAgICAgY2xlYW5lZEJhY2t0cmFjZTogbG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlXG4gICAgICAgICAgPyByZWRhY3Rvci5yZWRhY3RTdHJpbmcobG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlLCBzZW5zaXRpdmVWYWx1ZXMpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVycm9yU3VtbWFyeTogcmVkYWN0b3IucmVkYWN0U3RyaW5nKGxvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5LCBzZW5zaXRpdmVWYWx1ZXMpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IHJlcXVlc3RFcnJvckxvZ01lc3NhZ2UocmVkYWN0ZWRMb2dEZXRhaWxzKSlcblxuICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgICBjb250ZXh0OiByZWRhY3Rvci5yZWRhY3RTdHJ1Y3R1cmVkKGVycm9yQ29udGV4dCwgc2Vuc2l0aXZlVmFsdWVzKSxcbiAgICAgICAgZXJyb3I6IHJlZGFjdG9yLnJlZGFjdEVycm9yKGVycm9yLCBzZW5zaXRpdmVWYWx1ZXMpLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXNwb25zZVxuICAgICAgfVxuXG4gICAgICBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgICBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImFsbC1lcnJvclwiLCB7XG4gICAgICAgIC4uLmVycm9yUGF5bG9hZCxcbiAgICAgICAgZXJyb3JUeXBlOiBcImZyYW1ld29yay1lcnJvclwiXG4gICAgICB9KVxuXG4gICAgICByZXNwb25zZS5zZXRTdGF0dXMoNTAwKVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2Uuc2V0RXJyb3JCb2R5KGVycm9yKVxuICAgICAgfSBjYXRjaCAocmVzcG9uc2VFcnJvcikge1xuICAgICAgICBpZiAoIShyZXNwb25zZUVycm9yIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQm9keVRvb0xhcmdlRXJyb3IpKSB0aHJvdyByZXNwb25zZUVycm9yXG5cbiAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShcIlwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlJlcXVlc3QgcnVubmVyIGRvbmVcIiwge1xuICAgICAgaHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICBwYXRoOiBsb2dnZWRQYXRoLFxuICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKClcbiAgICB9XSlcbiAgICB0aGlzLnN0YXRlID0gXCJkb25lXCJcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiZG9uZVwiLCB0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbG9nIGNvbXBsZXRlZCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBMb2dzIHRoZSBjb21wbGV0ZWQgcmVxdWVzdCBsaW5lIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBzZXJ2ZWQuXG4gICAqL1xuICBhc3luYyBsb2dDb21wbGV0ZWRSZXF1ZXN0KCkge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZFJlcXVlc3RMb2dnZWQpIHJldHVyblxuXG4gICAgdGhpcy5jb21wbGV0ZWRSZXF1ZXN0TG9nZ2VkID0gdHJ1ZVxuXG4gICAgY29uc3QgcmVxdWVzdFRpbWluZyA9IHRoaXMucmVxdWVzdFRpbWluZ1xuXG4gICAgcmVxdWVzdFRpbWluZy5tYXJrUmVzcG9uc2VTZXJ2ZWQoKVxuXG4gICAgaWYgKCFyZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ1N1YmplY3QgfHwgIXJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nTWV0aG9kKSByZXR1cm5cblxuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIocmVxdWVzdFRpbWluZy5jb21wbGV0ZWRMb2dTdWJqZWN0LCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcbiAgICBjb25zdCBzdW1tYXJ5ID0gcmVxdWVzdFRpbWluZy5zdW1tYXJ5KClcbiAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucmVzcG9uc2VcbiAgICBjb25zdCBjb21wbGV0ZWRNZXNzYWdlID0gW1xuICAgICAgYENvbXBsZXRlZCAke3Jlc3BvbnNlLmdldFN0YXR1c0NvZGUoKX0gJHtyZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCl9IGluICR7TWF0aC5yb3VuZChzdW1tYXJ5LnRvdGFsTXMpfW1zIChgLFxuICAgICAgYENvbnRyb2xsZXI6ICR7Zm9ybWF0QnVja2V0TXMoc3VtbWFyeS5jb250cm9sbGVyTXMpfWAsXG4gICAgICBgIHwgVmlld3M6ICR7Zm9ybWF0QnVja2V0TXMoc3VtbWFyeS52aWV3c01zKX1gLFxuICAgICAgYCB8IERCOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkuZGJNcyl9ICgke3F1ZXJ5Q291bnRMYWJlbChzdW1tYXJ5LmRiUXVlcnlDb3VudCl9KWAsXG4gICAgICBgIHwgVmVsb2Npb3VzOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkudmVsb2Npb3VzTXMpfWAsXG4gICAgICBgKWBcbiAgICBdLmpvaW4oXCJcIilcblxuICAgIGF3YWl0IGxvZ2dlcltyZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ01ldGhvZF0oY29tcGxldGVkTWVzc2FnZSlcbiAgfVxufVxuIl19
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQ25DLE9BQU8sZ0JBQWdCLE1BQU0sdUNBQXVDLENBQUE7QUFDcEUsT0FBTyxZQUFZLE1BQU0sOEJBQThCLENBQUE7QUFDdkQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3pELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sUUFBUSxNQUFNLGVBQWUsQ0FBQTtBQUNwQyxPQUFPLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUUzRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsSUFBSTtJQUMxQixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXZCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUNwQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQUssRUFBRSxzQkFBc0I7SUFDeEQsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO0lBRWxFLElBQUksV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFBO0lBRW5FLE1BQU0sU0FBUyxHQUFHLE9BQU8sNENBQTRDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJ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O1lBQ3RELEdBQUc7U0FDSixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUVWLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDbEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCBCYWNrdHJhY2VDbGVhbmVyIGZyb20gXCIuLi8uLi91dGlscy9iYWNrdHJhY2UtY2xlYW5lci1ub2RlLmpzXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IHtIdHRwUmVzcG9uc2VCb2R5VG9vTGFyZ2VFcnJvcn0gZnJvbSBcIi4vZXJyb3JzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVxdWVzdFRpbWluZyBmcm9tIFwiLi9yZXF1ZXN0LXRpbWluZy5qc1wiXG5pbXBvcnQgUmVzcG9uc2UgZnJvbSBcIi4vcmVzcG9uc2UuanNcIlxuaW1wb3J0IFJvdXRlc1Jlc29sdmVyIGZyb20gXCIuLi8uLi9yb3V0ZXMvcmVzb2x2ZXIuanNcIlxuaW1wb3J0IHtSRVFVRVNUX1RJTUVfWk9ORV9IRUFERVJ9IGZyb20gXCIuLi8uLi90aW1lLXpvbmUuanNcIlxuXG4vKipcbiAqIFJ1bnMgc3RhY2sgZnJhbWUgbGluZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBsaW5lIC0gUG90ZW50aWFsIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgbGluZSBpcyBhIHN0YWNrIGZyYW1lLlxuICovXG5mdW5jdGlvbiBzdGFja0ZyYW1lTGluZShsaW5lKSB7XG4gIGlmICghbGluZSkgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIC9eYXRcXHMrL3UudGVzdChsaW5lLnRyaW0oKSlcbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgZXJyb3Igc3VtbWFyeS5cbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgdG8gZm9ybWF0IGZvciBsb2dnaW5nLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGNsZWFuZWRTdGFja1dpdGhIZWFkZXIgLSBDbGVhbmVkIHN0YWNrIHdpdGggaGVhZGVyIGxpbmUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVycm9yIHN1bW1hcnkgbGluZSB3aXRoIHR5cGUgaW5mb3JtYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RFcnJvclN1bW1hcnkoZXJyb3IsIGNsZWFuZWRTdGFja1dpdGhIZWFkZXIpIHtcbiAgY29uc3Qgc3RhY2tIZWFkZXIgPSBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyPy5zcGxpdChcIlxcblwiKVswXT8udHJpbSgpXG5cbiAgaWYgKHN0YWNrSGVhZGVyICYmICFzdGFja0ZyYW1lTGluZShzdGFja0hlYWRlcikpIHJldHVybiBzdGFja0hlYWRlclxuXG4gIGNvbnN0IGVycm9yQ29kZSA9IHR5cGVvZiAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAoZXJyb3IpLmNvZGUgPT09IFwic3RyaW5nXCJcbiAgICA/IC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovIChlcnJvcikuY29kZVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKVxuXG4gIGlmIChlcnJvckNvZGUpIHJldHVybiBgJHtlcnJvci5uYW1lfSBbJHtlcnJvckNvZGV9XTogJHtlcnJvck1lc3NhZ2V9YFxuXG4gIHJldHVybiBgJHtlcnJvci5uYW1lfTogJHtlcnJvck1lc3NhZ2V9YFxufVxuXG4vKipcbiAqIFJ1bnMgcmVxdWVzdCBlcnJvciBsb2cgZGV0YWlscy5cbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgdG8gZm9ybWF0IGZvciBsb2dnaW5nLlxuICogQHJldHVybnMge3tcbiAqICAgZXJyb3JTdW1tYXJ5OiBzdHJpbmcsXG4gKiAgIGNsZWFuZWRCYWNrdHJhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAqIH19IC0gTG9nIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RFcnJvckxvZ0RldGFpbHMoZXJyb3IpIHtcbiAgY29uc3QgY2xlYW5lZFN0YWNrV2l0aEhlYWRlciA9IEJhY2t0cmFjZUNsZWFuZXIuZ2V0Q2xlYW5lZFN0YWNrKGVycm9yKVxuICBjb25zdCBlcnJvclN1bW1hcnkgPSByZXF1ZXN0RXJyb3JTdW1tYXJ5KGVycm9yLCBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyKVxuICBjb25zdCBjbGVhbmVkQmFja3RyYWNlID0gQmFja3RyYWNlQ2xlYW5lci5nZXRDbGVhbmVkU3RhY2soZXJyb3IsIHtpbmNsdWRlRXJyb3JIZWFkZXI6IGZhbHNlfSkgfHwgY2xlYW5lZFN0YWNrV2l0aEhlYWRlclxuXG4gIHJldHVybiB7ZXJyb3JTdW1tYXJ5LCBjbGVhbmVkQmFja3RyYWNlfVxufVxuXG4vKipcbiAqIFJ1bnMgcmVxdWVzdCBlcnJvciBsb2cgbWVzc2FnZS5cbiAqIEBwYXJhbSB7e1xuICogICBlcnJvclN1bW1hcnk6IHN0cmluZyxcbiAqICAgY2xlYW5lZEJhY2t0cmFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICogfX0gbG9nRGV0YWlscyAtIExvZyBkZXRhaWxzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTaW5nbGUgcmVxdWVzdCBlcnJvciBsb2cgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdEVycm9yTG9nTWVzc2FnZShsb2dEZXRhaWxzKSB7XG4gIGlmICghbG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlKSB7XG4gICAgcmV0dXJuIGBFcnJvciB3aGlsZSBydW5uaW5nIHJlcXVlc3Q6ICR7bG9nRGV0YWlscy5lcnJvclN1bW1hcnl9YFxuICB9XG5cbiAgcmV0dXJuIGBFcnJvciB3aGlsZSBydW5uaW5nIHJlcXVlc3Q6ICR7bG9nRGV0YWlscy5lcnJvclN1bW1hcnl9XFxuQ2xlYW5lZCBiYWNrdHJhY2U6XFxuJHtsb2dEZXRhaWxzLmNsZWFuZWRCYWNrdHJhY2V9YFxufVxuXG4vKipcbiAqIFJ1bnMgcmVzcG9uc2UgYm9keSB0eXBlIGZvciBsb2cuXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNwb25zZSAtIFJlc3BvbnNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVzcG9uc2UgYm9keSB0eXBlIGZvciBsb2dnaW5nLlxuICovXG5mdW5jdGlvbiByZXNwb25zZUJvZHlUeXBlRm9yTG9nKHJlc3BvbnNlKSB7XG4gIGlmIChyZXNwb25zZS5nZXRGaWxlUGF0aCgpKSByZXR1cm4gXCJmaWxlXCJcblxuICB0cnkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzcG9uc2UuZ2V0Qm9keSgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcInVuc2V0XCJcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgZm9ybWF0IGJ1Y2tldCBtcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRm9ybWF0dGVkIG1pbGxpc2Vjb25kcyB3aXRoIG9uZSBkZWNpbWFsIHBsYWNlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRCdWNrZXRNcyh2YWx1ZSkge1xuICByZXR1cm4gYCR7dmFsdWUudG9GaXhlZCgxKX1tc2Bcbn1cblxuLyoqXG4gKiBSdW5zIHF1ZXJ5IGNvdW50IGxhYmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gUXVlcnkgY291bnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFF1ZXJ5IGNvdW50IGxhYmVsLlxuICovXG5mdW5jdGlvbiBxdWVyeUNvdW50TGFiZWwoY291bnQpIHtcbiAgcmV0dXJuIGAke2NvdW50fSAke2NvdW50ID09PSAxID8gXCJxdWVyeVwiIDogXCJxdWVyaWVzXCJ9YFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50UmVxdWVzdFJ1bm5lciB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gYXJncy5yZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgcmVxdWVzdH0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcbiAgICBpZiAoIXJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlcXVlc3QgZ2l2ZW5cIilcblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbn0pXG4gICAgdGhpcy5jb21wbGV0ZWRSZXF1ZXN0TG9nZ2VkID0gZmFsc2VcbiAgICB0aGlzLnJlcXVlc3RUaW1pbmcgPSBuZXcgUmVxdWVzdFRpbWluZygpXG4gICAgdGhpcy5zdGF0ZSA9IFwicnVubmluZ1wiXG4gIH1cblxuICBnZXRSZXF1ZXN0KCkgeyByZXR1cm4gdGhpcy5yZXF1ZXN0IH1cbiAgZ2V0U3RhdGUoKSB7IHJldHVybiB0aGlzLnN0YXRlIH1cblxuICBhc3luYyBydW4oKSB7XG4gICAgdGhpcy5yZXF1ZXN0VGltaW5nLnN0YXJ0ZWRBdE1zID0gRGF0ZS5ub3coKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoUmVxdWVzdFRpbWluZyh0aGlzLnJlcXVlc3RUaW1pbmcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlZGFjdG9yID0gdGhpcy5jb25maWd1cmF0aW9uLmdldExvZ1JlZGFjdG9yKClcbiAgICAgIGNvbnN0IHNlbnNpdGl2ZVZhbHVlcyA9IHJlZGFjdG9yLnJlcXVlc3RTZW5zaXRpdmVWYWx1ZXModGhpcy5yZXF1ZXN0LCB0aGlzLnJlcXVlc3RUaW1pbmcuZ2V0TG9nU2Vuc2l0aXZlVmFsdWVzKCkpXG5cbiAgICAgIHRoaXMucmVxdWVzdFRpbWluZy5yZWdpc3RlckxvZ1NlbnNpdGl2ZVZhbHVlcyhzZW5zaXRpdmVWYWx1ZXMpXG5cbiAgICAgIC8vIFJ1biB0aGUgd2hvbGUgcmVxdWVzdCBpbnNpZGUgYW55IHBlci10ZXN0IHNoYXJlZCBjb25uZWN0aW9uIGNvbnRleHQgc28gYW5cbiAgICAgIC8vIGluLXByb2Nlc3MgaGFuZGxlciBleGVjdXRlcyBvbiB0aGUgdGVzdCdzIGNvbm5lY3Rpb24gKGFuZCBvcGVuIHRyYW5zYWN0aW9uKS5cbiAgICAgIC8vIE5vIHNoYXJlZCBjb25uZWN0aW9uIGlzIHNldCBvdXRzaWRlIHRlc3RzIC8gaW4gd29ya2VyIHRocmVhZHMsIHNvIHRoaXMgaXMgYVxuICAgICAgLy8gbm8tb3AgdGhlcmUuXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlc3RTaGFyZWRDb25uZWN0aW9uQ29udGV4dHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydW4oKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgX3J1bigpIHtcbiAgICBjb25zdCB7Y29uZmlndXJhdGlvbiwgcmVxdWVzdCwgcmVzcG9uc2V9ID0gdGhpc1xuXG4gICAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXF1ZXN0P1wiKVxuXG4gICAgY29uc3QgcmVkYWN0b3IgPSBjb25maWd1cmF0aW9uLmdldExvZ1JlZGFjdG9yKClcbiAgICBjb25zdCBzZW5zaXRpdmVWYWx1ZXMgPSB0aGlzLnJlcXVlc3RUaW1pbmcuZ2V0TG9nU2Vuc2l0aXZlVmFsdWVzKClcbiAgICBjb25zdCBsb2dnZWRQYXRoID0gcmVkYWN0b3IucmVkYWN0UGF0aChyZXF1ZXN0LnBhdGgoKSwgc2Vuc2l0aXZlVmFsdWVzKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlJ1biByZXF1ZXN0IGxpZmVjeWNsZVwiLCB7XG4gICAgICAgIGh0dHBNZXRob2Q6IHJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICBodHRwVmVyc2lvbjogcmVxdWVzdC5odHRwVmVyc2lvbigpLFxuICAgICAgICBvcmlnaW46IHJlcXVlc3Qub3JpZ2luKCksXG4gICAgICAgIHBhdGg6IGxvZ2dlZFBhdGgsXG4gICAgICAgIHJlbW90ZUFkZHJlc3M6IHJlcXVlc3QucmVtb3RlQWRkcmVzcygpXG4gICAgICB9XSlcbiAgICAgIC8vIEJlZm9yZSB3ZSBjaGVja2VkIGlmIHRoZSBzZWMtZmV0Y2gtbW9kZSB3YXMgXCJjb3JzXCIsIGJ1dCBpdCBzZWVtcyB0aGUgc2VjLWZldGNoLW1vZGUgaXNuJ3QgYWx3YXlzIHByZXNlbnRcbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlJ1biBDT1JTXCIsIHtodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSwgc2VjRmV0Y2hNb2RlOiByZXF1ZXN0LmhlYWRlcihcInNlYy1mZXRjaC1tb2RlXCIpfV0pXG5cbiAgICAgIGNvbnN0IGNvcnMgPSBjb25maWd1cmF0aW9uLmdldENvcnMoKVxuXG4gICAgICBpZiAoY29ycykge1xuICAgICAgICBhd2FpdCBjb3JzKHtyZXF1ZXN0LCByZXNwb25zZX0pXG4gICAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIkNPUlMgaGFuZGxlciBkb25lXCIsIHtcbiAgICAgICAgICBodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgICBwYXRoOiBsb2dnZWRQYXRoLFxuICAgICAgICAgIHJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpXG4gICAgICAgIH1dKVxuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdC5odHRwTWV0aG9kKCkgPT0gXCJPUFRJT05TXCIgJiYgcmVxdWVzdC5oZWFkZXIoXCJzZWMtZmV0Y2gtbW9kZVwiKSA9PSBcImNvcnNcIikge1xuICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoMjAwKVxuICAgICAgICByZXNwb25zZS5zZXRCb2R5KFwiXCIpXG4gICAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIkhhbmRsZWQgcHJlZmxpZ2h0IE9QVElPTlMgcmVxdWVzdFwiLCB7XG4gICAgICAgICAgcGF0aDogbG9nZ2VkUGF0aCxcbiAgICAgICAgICByZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKVxuICAgICAgICB9XSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKFwiUnVuIHJlcXVlc3RcIilcbiAgICAgICAgY29uc3Qgcm91dGVzUmVzb2x2ZXIgPSBuZXcgUm91dGVzUmVzb2x2ZXIoe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSlcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lTXMgPSBEYXRlLm5vdygpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRpbWVvdXRJZC5cbiAgICAgICAgICogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBsZXQgdGltZW91dElkXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmVzIHRpbWVvdXRSZWplY3QuXG4gICAgICAgICAqIEB0eXBlIHsoKGVycm9yOiBFcnJvcikgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIGxldCB0aW1lb3V0UmVqZWN0XG4gICAgICAgIGxldCB0aW1lZE91dCA9IGZhbHNlXG5cbiAgICAgICAgY29uc3Qgc2V0UmVxdWVzdFRpbWVvdXRTZWNvbmRzID0gKC8qKiBAdHlwZSB7bnVtYmVyIHwgdW5kZWZpbmVkfSAqLyB0aW1lb3V0U2Vjb25kcykgPT4ge1xuICAgICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgICAgICB0aW1lb3V0SWQgPSB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRpbWVvdXRTZWNvbmRzICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUodGltZW91dFNlY29uZHMpIHx8IHRpbWVvdXRTZWNvbmRzIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IHRpbWVvdXRTZWNvbmRzICogMTAwMFxuICAgICAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWVNc1xuICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dE1zIC0gZWxhcHNlZE1zXG5cbiAgICAgICAgICBpZiAocmVtYWluaW5nTXMgPD0gMCkge1xuICAgICAgICAgICAgdGltZW91dFJlamVjdD8uKG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0U2Vjb25kc31zYCkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRpbWVvdXRSZWplY3Q/LihuZXcgRXJyb3IoYFJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dFNlY29uZHN9c2ApKVxuICAgICAgICAgIH0sIHJlbWFpbmluZ01zKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgdGltZW91dFJlamVjdCA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGltZWRPdXQgPSB0cnVlXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJlc3BvbnNlLnNldFJlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyKCh0aW1lb3V0U2Vjb25kcykgPT4ge1xuICAgICAgICAgIHNldFJlcXVlc3RUaW1lb3V0U2Vjb25kcyh0aW1lb3V0U2Vjb25kcylcbiAgICAgICAgfSlcblxuICAgICAgICBzZXRSZXF1ZXN0VGltZW91dFNlY29uZHMoY29uZmlndXJhdGlvbi5nZXRSZXF1ZXN0VGltZW91dE1zPy4oKSlcblxuICAgICAgICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIGxldCByZXNvbHZlUHJvbWlzZVxuXG4gICAgICAgIGNvbnN0IHJ1blJlc29sdmVkUmVxdWVzdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlUHJvbWlzZSA9IHJvdXRlc1Jlc29sdmVyLnJlc29sdmUoKVxuICAgICAgICAgIC8vIEtlZXAgUHJvbWlzZS5yYWNlIGhlcmUgdG8gYWxsb3cgZHluYW1pYyB0aW1lb3V0IHVwZGF0ZXMuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtyZXNvbHZlUHJvbWlzZSwgdGltZW91dFByb21pc2VdKVxuICAgICAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlJvdXRlcyByZXNvbHZlciBkb25lXCIsIHtcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IHJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICAgICAgcGF0aDogbG9nZ2VkUGF0aCxcbiAgICAgICAgICAgIHJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLFxuICAgICAgICAgICAgaGFzRmlsZVBhdGg6IEJvb2xlYW4ocmVzcG9uc2UuZ2V0RmlsZVBhdGgoKSksXG4gICAgICAgICAgICBib2R5VHlwZTogcmVzcG9uc2VCb2R5VHlwZUZvckxvZyhyZXNwb25zZSlcbiAgICAgICAgICB9XSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdFRpbWVab25lID0gcmVxdWVzdC5oZWFkZXIoUkVRVUVTVF9USU1FX1pPTkVfSEVBREVSKVxuXG4gICAgICAgICAgaWYgKHJlcXVlc3RUaW1lWm9uZSAhPT0gdW5kZWZpbmVkICYmIHJlcXVlc3RUaW1lWm9uZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYXdhaXQgY29uZmlndXJhdGlvbi5ydW5XaXRoVGltZXpvbmUocmVxdWVzdFRpbWVab25lLCBydW5SZXNvbHZlZFJlcXVlc3QpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blJlc29sdmVkUmVxdWVzdCgpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICh0aW1lZE91dCAmJiByZXNvbHZlUHJvbWlzZSkge1xuICAgICAgICAgICAgdm9pZCByZXNvbHZlUHJvbWlzZS5jYXRjaCgocmVzb2x2ZUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNhZmVSZXNvbHZlRXJyb3IgPSByZWRhY3Rvci5yZWRhY3RFcnJvcihlbnN1cmVFcnJvcihyZXNvbHZlRXJyb3IpLCBzZW5zaXRpdmVWYWx1ZXMpXG5cbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXCJSZXF1ZXN0IGZpbmlzaGVkIGFmdGVyIHRpbWVvdXRcIiwgc2FmZVJlc29sdmVFcnJvcl0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmICh0aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGVuc3VyZUVycm9yKGUpXG4gICAgICBjb25zdCBlcnJvcldpdGhDb250ZXh0ID0gLyoqIEB0eXBlIHt7dmVsb2Npb3VzQ29udGV4dD86IG9iamVjdH19ICovIChlcnJvcilcbiAgICAgIGNvbnN0IGVycm9yQ29udGV4dCA9IGVycm9yV2l0aENvbnRleHQudmVsb2Npb3VzQ29udGV4dCB8fCB7c3RhZ2U6IFwicmVxdWVzdC1ydW5uZXJcIn1cbiAgICAgIGNvbnN0IGxvZ0RldGFpbHMgPSByZXF1ZXN0RXJyb3JMb2dEZXRhaWxzKGVycm9yKVxuICAgICAgY29uc3QgcmVkYWN0ZWRMb2dEZXRhaWxzID0ge1xuICAgICAgICBjbGVhbmVkQmFja3RyYWNlOiBsb2dEZXRhaWxzLmNsZWFuZWRCYWNrdHJhY2VcbiAgICAgICAgICA/IHJlZGFjdG9yLnJlZGFjdFN0cmluZyhsb2dEZXRhaWxzLmNsZWFuZWRCYWNrdHJhY2UsIHNlbnNpdGl2ZVZhbHVlcylcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXJyb3JTdW1tYXJ5OiByZWRhY3Rvci5yZWRhY3RTdHJpbmcobG9nRGV0YWlscy5lcnJvclN1bW1hcnksIHNlbnNpdGl2ZVZhbHVlcylcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gcmVxdWVzdEVycm9yTG9nTWVzc2FnZShyZWRhY3RlZExvZ0RldGFpbHMpKVxuXG4gICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB7XG4gICAgICAgIGNvbnRleHQ6IHJlZGFjdG9yLnJlZGFjdFN0cnVjdHVyZWQoZXJyb3JDb250ZXh0LCBzZW5zaXRpdmVWYWx1ZXMpLFxuICAgICAgICBlcnJvcjogcmVkYWN0b3IucmVkYWN0RXJyb3IoZXJyb3IsIHNlbnNpdGl2ZVZhbHVlcyksXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlc3BvbnNlXG4gICAgICB9XG5cbiAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiZnJhbWV3b3JrLWVycm9yXCIsIGVycm9yUGF5bG9hZClcbiAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKS5lbWl0KFwiYWxsLWVycm9yXCIsIHtcbiAgICAgICAgLi4uZXJyb3JQYXlsb2FkLFxuICAgICAgICBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJcbiAgICAgIH0pXG5cbiAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg1MDApXG4gICAgICBpZiAocmVzcG9uc2UuaXNTdHJlYW1pbmcoKSkge1xuICAgICAgICAvLyBUaGUgaGVhZGVycyBhbHJlYWR5IHdlbnQgdG8gdGhlIGNsaWVudCwgc28gYSBwbGFpbiBlcnJvciBib2R5IGlzXG4gICAgICAgIC8vIGltcG9zc2libGUuIFRoZSBoYW5kbGVyIG93bnMgdGhlIHN0cmVhbSBsaWZlY3ljbGU6IGl0IGFib3J0cyB0aGVcbiAgICAgICAgLy8gc3RyZWFtICh0ZXJtaW5hdG9yICsgY2xvc2UgY2FsbGJhY2tzKSBvciwgd2hlbiBpdCBzdGlsbCBjb250cm9sc1xuICAgICAgICAvLyB0aGUgY29ubmVjdGlvbiwgd3JpdGVzIGFuIGVycm9yIFNTRSBmcmFtZS5cbiAgICAgICAgcmVzcG9uc2UuYWJvcnRTdHJlYW0oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZS5zZXRFcnJvckJvZHkoZXJyb3IpXG4gICAgICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICBpZiAoIShyZXNwb25zZUVycm9yIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQm9keVRvb0xhcmdlRXJyb3IpKSB0aHJvdyByZXNwb25zZUVycm9yXG5cbiAgICAgICAgICByZXNwb25zZS5zZXRCb2R5KFwiXCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSZXF1ZXN0IHJ1bm5lciBkb25lXCIsIHtcbiAgICAgIGh0dHBNZXRob2Q6IHJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgcGF0aDogbG9nZ2VkUGF0aCxcbiAgICAgIHJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpXG4gICAgfV0pXG4gICAgdGhpcy5zdGF0ZSA9IFwiZG9uZVwiXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImRvbmVcIiwgdGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZyBjb21wbGV0ZWQgcmVxdWVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gTG9ncyB0aGUgY29tcGxldGVkIHJlcXVlc3QgbGluZSBhZnRlciB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gc2VydmVkLlxuICAgKi9cbiAgYXN5bmMgbG9nQ29tcGxldGVkUmVxdWVzdCgpIHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWRSZXF1ZXN0TG9nZ2VkKSByZXR1cm5cblxuICAgIHRoaXMuY29tcGxldGVkUmVxdWVzdExvZ2dlZCA9IHRydWVcblxuICAgIGNvbnN0IHJlcXVlc3RUaW1pbmcgPSB0aGlzLnJlcXVlc3RUaW1pbmdcblxuICAgIHJlcXVlc3RUaW1pbmcubWFya1Jlc3BvbnNlU2VydmVkKClcblxuICAgIGlmICghcmVxdWVzdFRpbWluZy5jb21wbGV0ZWRMb2dTdWJqZWN0IHx8ICFyZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ01ldGhvZCkgcmV0dXJuXG5cbiAgICBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nU3ViamVjdCwge2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbn0pXG4gICAgY29uc3Qgc3VtbWFyeSA9IHJlcXVlc3RUaW1pbmcuc3VtbWFyeSgpXG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlXG4gICAgY29uc3QgY29tcGxldGVkTWVzc2FnZSA9IFtcbiAgICAgIGBDb21wbGV0ZWQgJHtyZXNwb25zZS5nZXRTdGF0dXNDb2RlKCl9ICR7cmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpfSBpbiAke01hdGgucm91bmQoc3VtbWFyeS50b3RhbE1zKX1tcyAoYCxcbiAgICAgIGBDb250cm9sbGVyOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkuY29udHJvbGxlck1zKX1gLFxuICAgICAgYCB8IFZpZXdzOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkudmlld3NNcyl9YCxcbiAgICAgIGAgfCBEQjogJHtmb3JtYXRCdWNrZXRNcyhzdW1tYXJ5LmRiTXMpfSAoJHtxdWVyeUNvdW50TGFiZWwoc3VtbWFyeS5kYlF1ZXJ5Q291bnQpfSlgLFxuICAgICAgYCB8IFZlbG9jaW91czogJHtmb3JtYXRCdWNrZXRNcyhzdW1tYXJ5LnZlbG9jaW91c01zKX1gLFxuICAgICAgYClgXG4gICAgXS5qb2luKFwiXCIpXG5cbiAgICBhd2FpdCBsb2dnZXJbcmVxdWVzdFRpbWluZy5jb21wbGV0ZWRMb2dNZXRob2RdKGNvbXBsZXRlZE1lc3NhZ2UpXG4gIH1cbn1cbiJdfQ==
@@ -24,6 +24,35 @@ export default class VelociousHttpServerClientResponse {
24
24
  * Whether compression has been disabled for this specific response.
25
25
  * @type {boolean} */
26
26
  compressionDisabled: boolean;
27
+ /**
28
+ * Whether this response has been switched to live chunked streaming. Once
29
+ * streaming has started, the status line and headers are emitted to the
30
+ * client immediately and every `write()` is emitted as it happens, instead
31
+ * of the whole body being buffered and sent once after the handler
32
+ * returns.
33
+ * @type {boolean} */
34
+ streaming: boolean;
35
+ /**
36
+ * Whether the stream has been finished with `end()` (or finalized).
37
+ * @type {boolean} */
38
+ streamEnded: boolean;
39
+ /**
40
+ * Whether the client connection dropped while the stream was in flight.
41
+ * @type {boolean} */
42
+ streamAborted: boolean;
43
+ /**
44
+ * Transport sink wired in by the owning client so the response can emit
45
+ * headers and chunks to the socket-bound connection.
46
+ * @type {import("./index.js").default | null} */
47
+ transport: import("./index.js").default | null;
48
+ /**
49
+ * The socket-bound request this response belongs to.
50
+ * @type {import("./request.js").default | null} */
51
+ transportRequest: import("./request.js").default | null;
52
+ /**
53
+ * Callbacks fired when the client disconnects mid-stream.
54
+ * @type {Set<() => void>} */
55
+ streamCloseCallbacks: Set<() => void>;
27
56
  /**
28
57
  * Runs constructor.
29
58
  * @param {object} args - Options object.
@@ -90,6 +119,65 @@ export default class VelociousHttpServerClientResponse {
90
119
  * @returns {void} - No return value.
91
120
  */
92
121
  setBody(value: string | Uint8Array): void;
122
+ /**
123
+ * Whether this response is (or was) a live chunked stream.
124
+ * @returns {boolean} - Whether streaming has started.
125
+ */
126
+ isStreaming(): boolean;
127
+ /**
128
+ * Whether the client disconnected mid-stream.
129
+ * @returns {boolean} - Whether the stream was aborted by the client.
130
+ */
131
+ isStreamAborted(): boolean;
132
+ /**
133
+ * Switches this response to live chunked streaming. The status line and
134
+ * headers are emitted to the client immediately (with a
135
+ * `Transfer-Encoding: chunked` framing header) so `write()` chunks reach
136
+ * the client as they are produced — instead of the whole body being
137
+ * buffered and emitted once after the handler returns.
138
+ *
139
+ * Streaming requires a socket-bound HTTP request and an HTTP version that
140
+ * supports chunked framing, a status that may carry a body, and a
141
+ * non-HEAD request. It cannot be combined with a buffered body, a file
142
+ * response, or a second `stream()` call.
143
+ * @returns {void} - No return value.
144
+ */
145
+ stream(): void;
146
+ /**
147
+ * Emits one chunk to the client as soon as it is produced. Returns a
148
+ * promise that settles once the chunk has been delivered to the socket, so
149
+ * a relay loop can `await response.write(chunk)` and get socket
150
+ * backpressure without an ad-hoc drain wait. Rejects when the stream has
151
+ * ended or been aborted, or when the outbound delivery queue cannot accept
152
+ * the chunk (a stalled client).
153
+ * @param {string | Uint8Array} value - Chunk to emit.
154
+ * @returns {Promise<void>} - Settles after the chunk is delivered.
155
+ */
156
+ write(value: string | Uint8Array): Promise<void>;
157
+ /**
158
+ * Finishes an active stream: emits the chunked terminator and releases the
159
+ * response for completion logging. Settles after the terminator has been
160
+ * delivered to the socket.
161
+ * @returns {Promise<void>} - Settles after the stream is finished.
162
+ */
163
+ end(): Promise<void>;
164
+ /**
165
+ * Registers a callback fired when the client disconnects mid-stream, so
166
+ * the handler can release whatever the in-flight work reserved. Fired at
167
+ * most once; also fires when the stream is finalized after the client is
168
+ * already gone.
169
+ * @param {() => void} callback - Disconnect callback.
170
+ * @returns {void} - No return value.
171
+ */
172
+ onStreamClose(callback: () => void): void;
173
+ /**
174
+ * Terminates an active stream after a framework-level failure (the handler
175
+ * threw after `stream()` started): emits the chunked terminator and runs
176
+ * the close callbacks so in-flight work settles its resources. No-op when
177
+ * the stream already ended or was aborted.
178
+ * @returns {void} - No return value.
179
+ */
180
+ abortStream(): void;
93
181
  /**
94
182
  * Runs get file path.
95
183
  * @returns {string | null} - File path.
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/response.js"],"names":[],"mappings":"AAiFA,MAAM,CAAC,OAAO,OAAO,iCAAiC;IAgC7C,aAAa;IACb,iBAAiB;IACjB,8BAA8B,oBAqNT,MAAM,GAAG,SAAS,KAAK,IAAI;IA/BhD,UAAU;IACV,aAAa;IAxNpB;;4CAEwC;IACxC,IAAI,EADM,MAAM,GAAG,UAAU,GAAG,IAAI,CACzB;IAEX;;+BAE2B;IAC3B,QAAQ,EADE,MAAM,GAAG,IAAI,CACR;IAEf;;oFAEgF;IAChF,cAAc,EADJ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CACvD;IAErB;;0CAEsC;IACtC,OAAO,EADG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CACtB;IAEZ;;yBAEqB;IACrB,mBAAmB,EADT,OAAO,CACU;IAE3B;;;;OAIG;IACH,YAAY,EAAC,aAAa,EAAC,EAFxB;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAClD;KAC0B,EAI1B;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,IAAI,CAQhB;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,IAAI,CAIhB;IAED;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAHF,MAGE,GAFA,MAAM,EAAE,CAepB;IAED;;;;OAIG;IACH,YAAY,CAAC,GAAG,EAHL,MAGK,GAFH,IAAI,CAUhB;IAED;;;;OAIG;IACH,kBAAkB,IAFL,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAAqB,IAFR,OAAO,CAInB;IAED;;;OAGG;IACH,OAAO,IAFM,MAAM,GAAG,UAAU,GAAG,IAAI,CAQtC;IAED;;;OAGG;IACH,aAAa,IAFA,MAAM,CAIlB;IAED;;;OAGG;IACH,gBAAgB,IAFH,MAAM,CAIlB;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAHF,MAAM,GAAG,UAGP,GAFA,IAAI,CAehB;IAED;;;OAGG;IACH,WAAW,IAFE,MAAM,GAAG,IAAI,CAIzB;IAED;;;OAGG;IACH,iBAAiB,IAFJ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAI9E;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAJL,MAIK,EAAE,UAAU,AAHzB,CACA,EADQ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAGtC,GAFtB,IAAI,CAMhB;IAED;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAHP,KAGO,GAFL,IAAI,CAKhB;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAM,EAHL,MAAM,GAAG,MAGJ,GAFH,IAAI,CAYhB;IAED;;;OAGG;IACH,mBAAmB,IAFN,MAAM,GAAG,SAAS,CAI9B;IAED;;;;OAIG;IACH,mBAAmB,CAAC,cAAc,EAHvB,MAAM,GAAG,SAAS,GAAG,IAGE,GAFrB,IAAI,CAYhB;IAED;;;;OAIG;IACH,gCAAgC,CAAC,OAAO,EAH7B,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,KAAK,IAGX,GAF3B,IAAI,CAIhB;CACF"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/response.js"],"names":[],"mappings":"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"}
@@ -96,6 +96,35 @@ export default class VelociousHttpServerClientResponse {
96
96
  * Whether compression has been disabled for this specific response.
97
97
  * @type {boolean} */
98
98
  compressionDisabled = false;
99
+ /**
100
+ * Whether this response has been switched to live chunked streaming. Once
101
+ * streaming has started, the status line and headers are emitted to the
102
+ * client immediately and every `write()` is emitted as it happens, instead
103
+ * of the whole body being buffered and sent once after the handler
104
+ * returns.
105
+ * @type {boolean} */
106
+ streaming = false;
107
+ /**
108
+ * Whether the stream has been finished with `end()` (or finalized).
109
+ * @type {boolean} */
110
+ streamEnded = false;
111
+ /**
112
+ * Whether the client connection dropped while the stream was in flight.
113
+ * @type {boolean} */
114
+ streamAborted = false;
115
+ /**
116
+ * Transport sink wired in by the owning client so the response can emit
117
+ * headers and chunks to the socket-bound connection.
118
+ * @type {import("./index.js").default | null} */
119
+ transport = null;
120
+ /**
121
+ * The socket-bound request this response belongs to.
122
+ * @type {import("./request.js").default | null} */
123
+ transportRequest = null;
124
+ /**
125
+ * Callbacks fired when the client disconnects mid-stream.
126
+ * @type {Set<() => void>} */
127
+ streamCloseCallbacks = new Set();
99
128
  /**
100
129
  * Runs constructor.
101
130
  * @param {object} args - Options object.
@@ -211,6 +240,112 @@ export default class VelociousHttpServerClientResponse {
211
240
  }
212
241
  this.body = value;
213
242
  }
243
+ /**
244
+ * Whether this response is (or was) a live chunked stream.
245
+ * @returns {boolean} - Whether streaming has started.
246
+ */
247
+ isStreaming() {
248
+ return this.streaming;
249
+ }
250
+ /**
251
+ * Whether the client disconnected mid-stream.
252
+ * @returns {boolean} - Whether the stream was aborted by the client.
253
+ */
254
+ isStreamAborted() {
255
+ return this.streamAborted;
256
+ }
257
+ /**
258
+ * Switches this response to live chunked streaming. The status line and
259
+ * headers are emitted to the client immediately (with a
260
+ * `Transfer-Encoding: chunked` framing header) so `write()` chunks reach
261
+ * the client as they are produced — instead of the whole body being
262
+ * buffered and emitted once after the handler returns.
263
+ *
264
+ * Streaming requires a socket-bound HTTP request and an HTTP version that
265
+ * supports chunked framing, a status that may carry a body, and a
266
+ * non-HEAD request. It cannot be combined with a buffered body, a file
267
+ * response, or a second `stream()` call.
268
+ * @returns {void} - No return value.
269
+ */
270
+ stream() {
271
+ if (this.streaming)
272
+ throw new Error("The response is already streaming");
273
+ if (this.filePath !== null)
274
+ throw new Error("A file response cannot be switched to streaming");
275
+ if (this.body !== null && this.body !== undefined)
276
+ throw new Error("A buffered body was already set; call stream() before setBody() to stream instead");
277
+ if (this.transport === null)
278
+ throw new Error("Streaming responses require a socket-bound HTTP request");
279
+ const request = this.transportRequest;
280
+ if (!request)
281
+ throw new Error("Streaming responses require a socket-bound HTTP request");
282
+ if (request.httpMethod() === "HEAD")
283
+ throw new Error("HEAD responses cannot stream a body");
284
+ const statusCode = this.getStatusCode();
285
+ if ((statusCode >= 100 && statusCode < 200) || statusCode === 204 || statusCode === 304) {
286
+ throw new Error(`Status ${statusCode} cannot carry a streaming body`);
287
+ }
288
+ this.streaming = true;
289
+ this.transport.beginStreamResponse(this, request);
290
+ }
291
+ /**
292
+ * Emits one chunk to the client as soon as it is produced. Returns a
293
+ * promise that settles once the chunk has been delivered to the socket, so
294
+ * a relay loop can `await response.write(chunk)` and get socket
295
+ * backpressure without an ad-hoc drain wait. Rejects when the stream has
296
+ * ended or been aborted, or when the outbound delivery queue cannot accept
297
+ * the chunk (a stalled client).
298
+ * @param {string | Uint8Array} value - Chunk to emit.
299
+ * @returns {Promise<void>} - Settles after the chunk is delivered.
300
+ */
301
+ async write(value) {
302
+ if (this.transport === null)
303
+ throw new Error("write() requires an active streaming response");
304
+ if (!this.streaming)
305
+ throw new Error("write() requires stream() to be called first");
306
+ if (this.streamEnded || this.streamAborted)
307
+ return;
308
+ await this.transport.writeStreamChunk(value);
309
+ }
310
+ /**
311
+ * Finishes an active stream: emits the chunked terminator and releases the
312
+ * response for completion logging. Settles after the terminator has been
313
+ * delivered to the socket.
314
+ * @returns {Promise<void>} - Settles after the stream is finished.
315
+ */
316
+ async end() {
317
+ if (this.transport === null)
318
+ throw new Error("end() requires an active streaming response");
319
+ if (!this.streaming)
320
+ throw new Error("end() requires stream() to be called first");
321
+ if (this.streamEnded)
322
+ return;
323
+ await this.transport.endStreamResponse(this);
324
+ }
325
+ /**
326
+ * Registers a callback fired when the client disconnects mid-stream, so
327
+ * the handler can release whatever the in-flight work reserved. Fired at
328
+ * most once; also fires when the stream is finalized after the client is
329
+ * already gone.
330
+ * @param {() => void} callback - Disconnect callback.
331
+ * @returns {void} - No return value.
332
+ */
333
+ onStreamClose(callback) {
334
+ this.streamCloseCallbacks.add(callback);
335
+ }
336
+ /**
337
+ * Terminates an active stream after a framework-level failure (the handler
338
+ * threw after `stream()` started): emits the chunked terminator and runs
339
+ * the close callbacks so in-flight work settles its resources. No-op when
340
+ * the stream already ended or was aborted.
341
+ * @returns {void} - No return value.
342
+ */
343
+ abortStream() {
344
+ if (!this.streaming || this.streamEnded || this.transport === null)
345
+ return;
346
+ this.streamEnded = true;
347
+ this.transport.endStreamResponse(this);
348
+ }
214
349
  /**
215
350
  * Runs get file path.
216
351
  * @returns {string | null} - File path.
@@ -295,4 +430,4 @@ export default class VelociousHttpServerClientResponse {
295
430
  this._requestTimeoutMsChangeHandler = handler;
296
431
  }
297
432
  }
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFekQ7O29DQUVvQztBQUNwQyxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLFNBQVMsRUFBRSxHQUFHO0lBQ2QsV0FBVyxFQUFFLEdBQUc7SUFDaEIsdUJBQXVCLEVBQUUsR0FBRztDQUM3QixDQUFBO0FBRUQ7O29DQUVvQztBQUNwQyxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLHFCQUFxQjtJQUMxQixHQUFHLEVBQUUsWUFBWTtJQUNqQixHQUFHLEVBQUUsYUFBYTtJQUNsQixHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsK0JBQStCO0lBQ3BDLEdBQUcsRUFBRSxZQUFZO0lBQ2pCLEdBQUcsRUFBRSxlQUFlO0lBQ3BCLEdBQUcsRUFBRSxpQkFBaUI7SUFDdEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxrQkFBa0I7SUFDdkIsR0FBRyxFQUFFLG1CQUFtQjtJQUN4QixHQUFHLEVBQUUsT0FBTztJQUNaLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxjQUFjO0lBQ25CLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxvQkFBb0I7SUFDekIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixHQUFHLEVBQUUsYUFBYTtJQUNsQixHQUFHLEVBQUUsY0FBYztJQUNuQixHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdB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QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtIdHRwUmVzcG9uc2VCb2R5VG9vTGFyZ2VFcnJvcn0gZnJvbSBcIi4vZXJyb3JzLmpzXCJcblxuLyoqXG4gKiBOYW1lZCBzdGF0dXMgYWxpYXNlcy5cbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqL1xuY29uc3QgTkFNRURfU1RBVFVTX0FMSUFTRVMgPSB7XG4gIFwic3VjY2Vzc1wiOiAyMDAsXG4gIFwibm90LWZvdW5kXCI6IDQwNCxcbiAgXCJpbnRlcm5hbC1zZXJ2ZXItZXJyb3JcIjogNTAwXG59XG5cbi8qKlxuICogU3RhbmRhcmQgc3RhdHVzIG1lc3NhZ2VzLlxuICogQHR5cGUge1JlY29yZDxudW1iZXIsIHN0cmluZz59ICovXG5jb25zdCBTVEFOREFSRF9TVEFUVVNfTUVTU0FHRVMgPSB7XG4gIDEwMDogXCJDb250aW51ZVwiLFxuICAxMDE6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuICAxMDI6IFwiUHJvY2Vzc2luZ1wiLFxuICAxMDM6IFwiRWFybHkgSGludHNcIixcbiAgMjAwOiBcIk9LXCIsXG4gIDIwMTogXCJDcmVhdGVkXCIsXG4gIDIwMjogXCJBY2NlcHRlZFwiLFxuICAyMDM6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcbiAgMjA0OiBcIk5vIENvbnRlbnRcIixcbiAgMjA1OiBcIlJlc2V0IENvbnRlbnRcIixcbiAgMjA2OiBcIlBhcnRpYWwgQ29udGVudFwiLFxuICAyMDc6IFwiTXVsdGktU3RhdHVzXCIsXG4gIDIwODogXCJBbHJlYWR5IFJlcG9ydGVkXCIsXG4gIDIyNjogXCJJTSBVc2VkXCIsXG4gIDMwMDogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIDMwMTogXCJNb3ZlZCBQZXJtYW5lbnRseVwiLFxuICAzMDI6IFwiRm91bmRcIixcbiAgMzAzOiBcIlNlZSBPdGhlclwiLFxuICAzMDQ6IFwiTm90IE1vZGlmaWVkXCIsXG4gIDMwNTogXCJVc2UgUHJveHlcIixcbiAgMzA3OiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICAzMDg6IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gIDQwMDogXCJCYWQgUmVxdWVzdFwiLFxuICA0MDE6IFwiVW5hdXRob3JpemVkXCIsXG4gIDQwMjogXCJQYXltZW50IFJlcXVpcmVkXCIsXG4gIDQwMzogXCJGb3JiaWRkZW5cIixcbiAgNDA0OiBcIk5vdCBGb3VuZFwiLFxuICA0MDU6IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIsXG4gIDQwNjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuICA0MDc6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgNDA4OiBcIlJlcXVlc3QgVGltZW91dFwiLFxuICA0MDk6IFwiQ29uZmxpY3RcIixcbiAgNDEwOiBcIkdvbmVcIixcbiAgNDExOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICA0MTI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuICA0MTM6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgNDE0OiBcIlVSSSBUb28gTG9uZ1wiLFxuICA0MTU6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICA0MTY6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIDQxNzogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcbiAgNDE4OiBcIkknbSBhIHRlYXBvdFwiLFxuICA0MjE6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICA0MjI6IFwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcbiAgNDIzOiBcIkxvY2tlZFwiLFxuICA0MjQ6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgNDI1OiBcIlRvbyBFYXJseVwiLFxuICA0MjY6IFwiVXBncmFkZSBSZXF1aXJlZFwiLFxuICA0Mjg6IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXG4gIDQyOTogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICA0MzE6IFwiUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZVwiLFxuICA0NTE6IFwiVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnNcIixcbiAgNTAwOiBcIkludGVybmFsIHNlcnZlciBlcnJvclwiLFxuICA1MDE6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gIDUwMjogXCJCYWQgR2F0ZXdheVwiLFxuICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICA1MDQ6IFwiR2F0ZXdheSBUaW1lb3V0XCIsXG4gIDUwNTogXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiLFxuICA1MDY6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgNTA3OiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIDUwODogXCJMb29wIERldGVjdGVkXCIsXG4gIDUxMDogXCJOb3QgRXh0ZW5kZWRcIixcbiAgNTExOiBcIk5ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50UmVzcG9uc2Uge1xuICAvKipcbiAgICogQm9keS5cbiAgICogQHR5cGUge3N0cmluZyB8IFVpbnQ4QXJyYXkgfCBudWxsfSAqL1xuICBib2R5ID0gbnVsbFxuXG4gIC8qKlxuICAgKiBGaWxlIHBhdGguXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICBmaWxlUGF0aCA9IG51bGxcblxuICAvKipcbiAgICogRmlsZSByZXNwb25zZSBjb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAdHlwZSB7KChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgZmlsZU9uRmluaXNoZWQgPSBudWxsXG5cbiAgLyoqXG4gICAqIEhlYWRlcnMuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gIGhlYWRlcnMgPSB7fVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHNwZWNpZmljIHJlc3BvbnNlLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgY29tcHJlc3Npb25EaXNhYmxlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb259KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmhlYWRlcnMpKSB7XG4gICAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFtdXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzW2tleV0ucHVzaCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBLZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0SGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFt2YWx1ZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBIZWFkZXIgdmFsdWVzIGluIGluc2VydGlvbiBvcmRlci5cbiAgICovXG4gIGdldEhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCB2YWx1ZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKC4uLnRoaXMuaGVhZGVyc1toZWFkZXJLZXldKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHJlbW92ZUhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmhlYWRlcnNbaGVhZGVyS2V5XVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBIVFRQIHJlc3BvbnNlIGNvbXByZXNzaW9uIGZvciB0aGlzIHNwZWNpZmljIHJlc3BvbnNlLCBldmVuIHdoZW4gdGhlXG4gICAqIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIGNvbXByZXNzIGJ1ZmZlcmVkIHJlc3BvbnNlcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZGlzYWJsZUNvbXByZXNzaW9uKCkge1xuICAgIHRoaXMuY29tcHJlc3Npb25EaXNhYmxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGNvbXByZXNzaW9uIGRpc2FibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHJlc3BvbnNlLlxuICAgKi9cbiAgaXNDb21wcmVzc2lvbkRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXByZXNzaW9uRGlzYWJsZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBib2R5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgVWludDhBcnJheSB8IG51bGx9IC0gVGhlIGJvZHkuXG4gICAqL1xuICBnZXRCb2R5KCkge1xuICAgIGlmICh0aGlzLmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9keVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJvZHkgaGFzIGJlZW4gc2V0XCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgZ2V0U3RhdHVzQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlIHx8IDIwMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHN0YXR1cyBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBzdGF0dXMgbWVzc2FnZS5cbiAgICovXG4gIGdldFN0YXR1c01lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRCb2R5KHZhbHVlKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IG51bGxcbiAgICB0aGlzLmZpbGVPbkZpbmlzaGVkID0gbnVsbFxuXG4gICAgY29uc3QgYWN0dWFsQnl0ZXMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgXCJ1dGY4XCIpIDogdmFsdWUuYnl0ZUxlbmd0aFxuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEh0dHBTZXJ2ZXJNYXhCdWZmZXJlZFJlc3BvbnNlQm9keUJ5dGVzKClcblxuICAgIGlmIChtYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRoaXMuYm9keSA9IFwiXCJcbiAgICAgIHRocm93IG5ldyBIdHRwUmVzcG9uc2VCb2R5VG9vTGFyZ2VFcnJvcih7YWN0dWFsQnl0ZXMsIG1heEJ5dGVzfSlcbiAgICB9XG5cbiAgICB0aGlzLmJvZHkgPSB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGZpbGUgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gRmlsZSBwYXRoLlxuICAgKi9cbiAgZ2V0RmlsZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaWxlIHJlc3BvbnNlIGNvbXBsZXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHsoKHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSAtIEZpbGUgcmVzcG9uc2UgY29tcGxldGlvbiBjYWxsYmFjay5cbiAgICovXG4gIGdldEZpbGVPbkZpbmlzaGVkKCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVPbkZpbmlzaGVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHsoKHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSBbb25GaW5pc2hlZF0gLSBDb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRGaWxlUGF0aChwYXRoLCBvbkZpbmlzaGVkID0gbnVsbCkge1xuICAgIHRoaXMuZmlsZVBhdGggPSBwYXRoXG4gICAgdGhpcy5maWxlT25GaW5pc2hlZCA9IG9uRmluaXNoZWRcbiAgICB0aGlzLmJvZHkgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZXJyb3IgYm9keS5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0RXJyb3JCb2R5KGVycm9yKSB7XG4gICAgdGhpcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIpXG4gICAgdGhpcy5zZXRCb2R5KGAke2Vycm9yLm1lc3NhZ2V9XFxuXFxuJHtlcnJvci5zdGFja31gKVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSBudW1lcmljIEhUVFAgc3RhdHVzIGNvZGUgKGUuZy4gYDQyMmApIG9yIG9uZSBvZiB0aGVcbiAgICogbmFtZWQgYWxpYXNlcyAoYFwic3VjY2Vzc1wiYCwgYFwibm90LWZvdW5kXCJgLCBgXCJpbnRlcm5hbC1zZXJ2ZXItZXJyb3JcImApLlxuICAgKiBOdW1lcmljIGlucHV0cyBpbiB0aGUgc3RhbmRhcmQgMXh4LTV4eCByYW5nZSByZXNvbHZlIHRoZWlyIG93blxuICAgKiBzdGF0dXMgbWVzc2FnZXMgZnJvbSB0aGUgSUFOQSByZWdpc3RyeTsgYWxpYXNlcyBrZWVwIHRoZVxuICAgKiBiYWNrLWNvbXBhdGlibGUgY29kZSBtYXBwaW5nLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gc3RhdHVzIC0gU3RhdHVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRTdGF0dXMoc3RhdHVzKSB7XG4gICAgY29uc3QgYWxpYXNDb2RlID0gTkFNRURfU1RBVFVTX0FMSUFTRVNbU3RyaW5nKHN0YXR1cyldXG4gICAgY29uc3QgbnVtZXJpY1N0YXR1cyA9IGFsaWFzQ29kZSA/PyBOdW1iZXIoc3RhdHVzKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bWVyaWNTdGF0dXMpIHx8IG51bWVyaWNTdGF0dXMgPCAxMDAgfHwgbnVtZXJpY1N0YXR1cyA+IDU5OSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgc3RhdHVzOiAke3N0YXR1c31gKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bWVyaWNTdGF0dXNcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSBTVEFOREFSRF9TVEFUVVNfTUVTU0FHRVNbbnVtZXJpY1N0YXR1c10gfHwgXCJPS1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcmVxdWVzdCB0aW1lb3V0IG1zLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfSAtIFJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzLlxuICAgKi9cbiAgZ2V0UmVxdWVzdFRpbWVvdXRNcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdFRpbWVvdXRNc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHJlcXVlc3QgdGltZW91dCBtcy5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsfSB0aW1lb3V0U2Vjb25kcyAtIFRpbWVvdXQgaW4gc2Vjb25kcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0UmVxdWVzdFRpbWVvdXRNcyh0aW1lb3V0U2Vjb25kcykge1xuICAgIGlmICh0eXBlb2YgdGltZW91dFNlY29uZHMgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRTZWNvbmRzKSkge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNcyA9IHRpbWVvdXRTZWNvbmRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyKHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHJlcXVlc3QgdGltZW91dCBtcyBjaGFuZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHsodGltZW91dFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZH0gaGFuZGxlciAtIENoYW5nZSBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRSZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIgPSBoYW5kbGVyXG4gIH1cbn1cbiJdfQ==
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFekQ7O29DQUVvQztBQUNwQyxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLFNBQVMsRUFBRSxHQUFHO0lBQ2QsV0FBVyxFQUFFLEdBQUc7SUFDaEIsdUJBQXVCLEVBQUUsR0FBRztDQUM3QixDQUFBO0FBRUQ7O29DQUVvQztBQUNwQyxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLHFCQUFxQjtJQUMxQixHQUFHLEVBQUUsWUFBWTtJQUNqQixHQUFHLEVBQUUsYUFBYTtJQUNsQixHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsK0JBQStCO0lBQ3BDLEdBQUcsRUFBRSxZQUFZO0lBQ2pCLEdBQUcsRUFBRSxlQUFlO0lBQ3BCLEdBQUcsRUFBRSxpQkFBaUI7SUFDdEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxrQkFBa0I7SUFDdkIsR0FBRyxFQUFFLG1CQUFtQjtJQUN4QixHQUFHLEVBQUUsT0FBTztJQUNaLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxjQUFjO0lBQ25CLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxvQkFBb0I7SUFDekIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixHQUFHLEVBQUUsYUFBYTtJQUNsQixHQUFHLEVBQUUsY0FBYztJQUNuQixHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdB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QUFtQixDQUFDLGNBQWM7UUFDaEMsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQUE7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFBO1FBQ3BDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQ0FBZ0MsQ0FBQyxPQUFPO1FBQ3RDLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxPQUFPLENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7SHR0cFJlc3BvbnNlQm9keVRvb0xhcmdlRXJyb3J9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5cbi8qKlxuICogTmFtZWQgc3RhdHVzIGFsaWFzZXMuXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi9cbmNvbnN0IE5BTUVEX1NUQVRVU19BTElBU0VTID0ge1xuICBcInN1Y2Nlc3NcIjogMjAwLFxuICBcIm5vdC1mb3VuZFwiOiA0MDQsXG4gIFwiaW50ZXJuYWwtc2VydmVyLWVycm9yXCI6IDUwMFxufVxuXG4vKipcbiAqIFN0YW5kYXJkIHN0YXR1cyBtZXNzYWdlcy5cbiAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+fSAqL1xuY29uc3QgU1RBTkRBUkRfU1RBVFVTX01FU1NBR0VTID0ge1xuICAxMDA6IFwiQ29udGludWVcIixcbiAgMTAxOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgMTAyOiBcIlByb2Nlc3NpbmdcIixcbiAgMTAzOiBcIkVhcmx5IEhpbnRzXCIsXG4gIDIwMDogXCJPS1wiLFxuICAyMDE6IFwiQ3JlYXRlZFwiLFxuICAyMDI6IFwiQWNjZXB0ZWRcIixcbiAgMjAzOiBcIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uXCIsXG4gIDIwNDogXCJObyBDb250ZW50XCIsXG4gIDIwNTogXCJSZXNldCBDb250ZW50XCIsXG4gIDIwNjogXCJQYXJ0aWFsIENvbnRlbnRcIixcbiAgMjA3OiBcIk11bHRpLVN0YXR1c1wiLFxuICAyMDg6IFwiQWxyZWFkeSBSZXBvcnRlZFwiLFxuICAyMjY6IFwiSU0gVXNlZFwiLFxuICAzMDA6IFwiTXVsdGlwbGUgQ2hvaWNlc1wiLFxuICAzMDE6IFwiTW92ZWQgUGVybWFuZW50bHlcIixcbiAgMzAyOiBcIkZvdW5kXCIsXG4gIDMwMzogXCJTZWUgT3RoZXJcIixcbiAgMzA0OiBcIk5vdCBNb2RpZmllZFwiLFxuICAzMDU6IFwiVXNlIFByb3h5XCIsXG4gIDMwNzogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcbiAgMzA4OiBcIlBlcm1hbmVudCBSZWRpcmVjdFwiLFxuICA0MDA6IFwiQmFkIFJlcXVlc3RcIixcbiAgNDAxOiBcIlVuYXV0aG9yaXplZFwiLFxuICA0MDI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLFxuICA0MDM6IFwiRm9yYmlkZGVuXCIsXG4gIDQwNDogXCJOb3QgRm91bmRcIixcbiAgNDA1OiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxuICA0MDY6IFwiTm90IEFjY2VwdGFibGVcIixcbiAgNDA3OiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG4gIDQwODogXCJSZXF1ZXN0IFRpbWVvdXRcIixcbiAgNDA5OiBcIkNvbmZsaWN0XCIsXG4gIDQxMDogXCJHb25lXCIsXG4gIDQxMTogXCJMZW5ndGggUmVxdWlyZWRcIixcbiAgNDEyOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIixcbiAgNDEzOiBcIlBheWxvYWQgVG9vIExhcmdlXCIsXG4gIDQxNDogXCJVUkkgVG9vIExvbmdcIixcbiAgNDE1OiBcIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGVcIixcbiAgNDE2OiBcIlJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLFxuICA0MTc6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG4gIDQxODogXCJJJ20gYSB0ZWFwb3RcIixcbiAgNDIxOiBcIk1pc2RpcmVjdGVkIFJlcXVlc3RcIixcbiAgNDIyOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gIDQyMzogXCJMb2NrZWRcIixcbiAgNDI0OiBcIkZhaWxlZCBEZXBlbmRlbmN5XCIsXG4gIDQyNTogXCJUb28gRWFybHlcIixcbiAgNDI2OiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgNDI4OiBcIlByZWNvbmRpdGlvbiBSZXF1aXJlZFwiLFxuICA0Mjk6IFwiVG9vIE1hbnkgUmVxdWVzdHNcIixcbiAgNDMxOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgNDUxOiBcIlVuYXZhaWxhYmxlIEZvciBMZWdhbCBSZWFzb25zXCIsXG4gIDUwMDogXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIixcbiAgNTAxOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuICA1MDI6IFwiQmFkIEdhdGV3YXlcIixcbiAgNTAzOiBcIlNlcnZpY2UgVW5hdmFpbGFibGVcIixcbiAgNTA0OiBcIkdhdGV3YXkgVGltZW91dFwiLFxuICA1MDU6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIixcbiAgNTA2OiBcIlZhcmlhbnQgQWxzbyBOZWdvdGlhdGVzXCIsXG4gIDUwNzogXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFxuICA1MDg6IFwiTG9vcCBEZXRlY3RlZFwiLFxuICA1MTA6IFwiTm90IEV4dGVuZGVkXCIsXG4gIDUxMTogXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIEJvZHkuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBVaW50OEFycmF5IHwgbnVsbH0gKi9cbiAgYm9keSA9IG51bGxcblxuICAvKipcbiAgICogRmlsZSBwYXRoLlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gKi9cbiAgZmlsZVBhdGggPSBudWxsXG5cbiAgLyoqXG4gICAqIEZpbGUgcmVzcG9uc2UgY29tcGxldGlvbiBjYWxsYmFjay5cbiAgICogQHR5cGUgeygocmVzdWx0OiBcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCIpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9ICovXG4gIGZpbGVPbkZpbmlzaGVkID0gbnVsbFxuXG4gIC8qKlxuICAgKiBIZWFkZXJzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqL1xuICBoZWFkZXJzID0ge31cblxuICAvKipcbiAgICogV2hldGhlciBjb21wcmVzc2lvbiBoYXMgYmVlbiBkaXNhYmxlZCBmb3IgdGhpcyBzcGVjaWZpYyByZXNwb25zZS5cbiAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gIGNvbXByZXNzaW9uRGlzYWJsZWQgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcmVzcG9uc2UgaGFzIGJlZW4gc3dpdGNoZWQgdG8gbGl2ZSBjaHVua2VkIHN0cmVhbWluZy4gT25jZVxuICAgKiBzdHJlYW1pbmcgaGFzIHN0YXJ0ZWQsIHRoZSBzdGF0dXMgbGluZSBhbmQgaGVhZGVycyBhcmUgZW1pdHRlZCB0byB0aGVcbiAgICogY2xpZW50IGltbWVkaWF0ZWx5IGFuZCBldmVyeSBgd3JpdGUoKWAgaXMgZW1pdHRlZCBhcyBpdCBoYXBwZW5zLCBpbnN0ZWFkXG4gICAqIG9mIHRoZSB3aG9sZSBib2R5IGJlaW5nIGJ1ZmZlcmVkIGFuZCBzZW50IG9uY2UgYWZ0ZXIgdGhlIGhhbmRsZXJcbiAgICogcmV0dXJucy5cbiAgICogQHR5cGUge2Jvb2xlYW59ICovXG4gIHN0cmVhbWluZyA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgYmVlbiBmaW5pc2hlZCB3aXRoIGBlbmQoKWAgKG9yIGZpbmFsaXplZCkuXG4gICAqIEB0eXBlIHtib29sZWFufSAqL1xuICBzdHJlYW1FbmRlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsaWVudCBjb25uZWN0aW9uIGRyb3BwZWQgd2hpbGUgdGhlIHN0cmVhbSB3YXMgaW4gZmxpZ2h0LlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgc3RyZWFtQWJvcnRlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFRyYW5zcG9ydCBzaW5rIHdpcmVkIGluIGJ5IHRoZSBvd25pbmcgY2xpZW50IHNvIHRoZSByZXNwb25zZSBjYW4gZW1pdFxuICAgKiBoZWFkZXJzIGFuZCBjaHVua3MgdG8gdGhlIHNvY2tldC1ib3VuZCBjb25uZWN0aW9uLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgdHJhbnNwb3J0ID0gbnVsbFxuXG4gIC8qKlxuICAgKiBUaGUgc29ja2V0LWJvdW5kIHJlcXVlc3QgdGhpcyByZXNwb25zZSBiZWxvbmdzIHRvLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAqL1xuICB0cmFuc3BvcnRSZXF1ZXN0ID0gbnVsbFxuXG4gIC8qKlxuICAgKiBDYWxsYmFja3MgZmlyZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIG1pZC1zdHJlYW0uXG4gICAqIEB0eXBlIHtTZXQ8KCkgPT4gdm9pZD59ICovXG4gIHN0cmVhbUNsb3NlQ2FsbGJhY2tzID0gbmV3IFNldCgpXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb259KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmhlYWRlcnMpKSB7XG4gICAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFtdXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzW2tleV0ucHVzaCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBLZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0SGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFt2YWx1ZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBIZWFkZXIgdmFsdWVzIGluIGluc2VydGlvbiBvcmRlci5cbiAgICovXG4gIGdldEhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCB2YWx1ZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKC4uLnRoaXMuaGVhZGVyc1toZWFkZXJLZXldKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHJlbW92ZUhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmhlYWRlcnNbaGVhZGVyS2V5XVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBIVFRQIHJlc3BvbnNlIGNvbXByZXNzaW9uIGZvciB0aGlzIHNwZWNpZmljIHJlc3BvbnNlLCBldmVuIHdoZW4gdGhlXG4gICAqIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIGNvbXByZXNzIGJ1ZmZlcmVkIHJlc3BvbnNlcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZGlzYWJsZUNvbXByZXNzaW9uKCkge1xuICAgIHRoaXMuY29tcHJlc3Npb25EaXNhYmxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGNvbXByZXNzaW9uIGRpc2FibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHJlc3BvbnNlLlxuICAgKi9cbiAgaXNDb21wcmVzc2lvbkRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXByZXNzaW9uRGlzYWJsZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBib2R5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgVWludDhBcnJheSB8IG51bGx9IC0gVGhlIGJvZHkuXG4gICAqL1xuICBnZXRCb2R5KCkge1xuICAgIGlmICh0aGlzLmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9keVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJvZHkgaGFzIGJlZW4gc2V0XCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgZ2V0U3RhdHVzQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlIHx8IDIwMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHN0YXR1cyBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBzdGF0dXMgbWVzc2FnZS5cbiAgICovXG4gIGdldFN0YXR1c01lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRCb2R5KHZhbHVlKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IG51bGxcbiAgICB0aGlzLmZpbGVPbkZpbmlzaGVkID0gbnVsbFxuXG4gICAgY29uc3QgYWN0dWFsQnl0ZXMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgXCJ1dGY4XCIpIDogdmFsdWUuYnl0ZUxlbmd0aFxuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEh0dHBTZXJ2ZXJNYXhCdWZmZXJlZFJlc3BvbnNlQm9keUJ5dGVzKClcblxuICAgIGlmIChtYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRoaXMuYm9keSA9IFwiXCJcbiAgICAgIHRocm93IG5ldyBIdHRwUmVzcG9uc2VCb2R5VG9vTGFyZ2VFcnJvcih7YWN0dWFsQnl0ZXMsIG1heEJ5dGVzfSlcbiAgICB9XG5cbiAgICB0aGlzLmJvZHkgPSB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyByZXNwb25zZSBpcyAob3Igd2FzKSBhIGxpdmUgY2h1bmtlZCBzdHJlYW0uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgc3RyZWFtaW5nIGhhcyBzdGFydGVkLlxuICAgKi9cbiAgaXNTdHJlYW1pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtaW5nXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xpZW50IGRpc2Nvbm5lY3RlZCBtaWQtc3RyZWFtLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBzdHJlYW0gd2FzIGFib3J0ZWQgYnkgdGhlIGNsaWVudC5cbiAgICovXG4gIGlzU3RyZWFtQWJvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1BYm9ydGVkXG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdGhpcyByZXNwb25zZSB0byBsaXZlIGNodW5rZWQgc3RyZWFtaW5nLiBUaGUgc3RhdHVzIGxpbmUgYW5kXG4gICAqIGhlYWRlcnMgYXJlIGVtaXR0ZWQgdG8gdGhlIGNsaWVudCBpbW1lZGlhdGVseSAod2l0aCBhXG4gICAqIGBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZGAgZnJhbWluZyBoZWFkZXIpIHNvIGB3cml0ZSgpYCBjaHVua3MgcmVhY2hcbiAgICogdGhlIGNsaWVudCBhcyB0aGV5IGFyZSBwcm9kdWNlZCDigJQgaW5zdGVhZCBvZiB0aGUgd2hvbGUgYm9keSBiZWluZ1xuICAgKiBidWZmZXJlZCBhbmQgZW1pdHRlZCBvbmNlIGFmdGVyIHRoZSBoYW5kbGVyIHJldHVybnMuXG4gICAqXG4gICAqIFN0cmVhbWluZyByZXF1aXJlcyBhIHNvY2tldC1ib3VuZCBIVFRQIHJlcXVlc3QgYW5kIGFuIEhUVFAgdmVyc2lvbiB0aGF0XG4gICAqIHN1cHBvcnRzIGNodW5rZWQgZnJhbWluZywgYSBzdGF0dXMgdGhhdCBtYXkgY2FycnkgYSBib2R5LCBhbmQgYVxuICAgKiBub24tSEVBRCByZXF1ZXN0LiBJdCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhIGJ1ZmZlcmVkIGJvZHksIGEgZmlsZVxuICAgKiByZXNwb25zZSwgb3IgYSBzZWNvbmQgYHN0cmVhbSgpYCBjYWxsLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzdHJlYW0oKSB7XG4gICAgaWYgKHRoaXMuc3RyZWFtaW5nKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcmVzcG9uc2UgaXMgYWxyZWFkeSBzdHJlYW1pbmdcIilcbiAgICBpZiAodGhpcy5maWxlUGF0aCAhPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiQSBmaWxlIHJlc3BvbnNlIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBzdHJlYW1pbmdcIilcbiAgICBpZiAodGhpcy5ib2R5ICE9PSBudWxsICYmIHRoaXMuYm9keSAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJBIGJ1ZmZlcmVkIGJvZHkgd2FzIGFscmVhZHkgc2V0OyBjYWxsIHN0cmVhbSgpIGJlZm9yZSBzZXRCb2R5KCkgdG8gc3RyZWFtIGluc3RlYWRcIilcbiAgICBpZiAodGhpcy50cmFuc3BvcnQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlN0cmVhbWluZyByZXNwb25zZXMgcmVxdWlyZSBhIHNvY2tldC1ib3VuZCBIVFRQIHJlcXVlc3RcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnRyYW5zcG9ydFJlcXVlc3RcbiAgICBpZiAoIXJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIlN0cmVhbWluZyByZXNwb25zZXMgcmVxdWlyZSBhIHNvY2tldC1ib3VuZCBIVFRQIHJlcXVlc3RcIilcblxuICAgIGlmIChyZXF1ZXN0Lmh0dHBNZXRob2QoKSA9PT0gXCJIRUFEXCIpIHRocm93IG5ldyBFcnJvcihcIkhFQUQgcmVzcG9uc2VzIGNhbm5vdCBzdHJlYW0gYSBib2R5XCIpXG5cbiAgICBjb25zdCBzdGF0dXNDb2RlID0gdGhpcy5nZXRTdGF0dXNDb2RlKClcbiAgICBpZiAoKHN0YXR1c0NvZGUgPj0gMTAwICYmIHN0YXR1c0NvZGUgPCAyMDApIHx8IHN0YXR1c0NvZGUgPT09IDIwNCB8fCBzdGF0dXNDb2RlID09PSAzMDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdHVzICR7c3RhdHVzQ29kZX0gY2Fubm90IGNhcnJ5IGEgc3RyZWFtaW5nIGJvZHlgKVxuICAgIH1cblxuICAgIHRoaXMuc3RyZWFtaW5nID0gdHJ1ZVxuICAgIHRoaXMudHJhbnNwb3J0LmJlZ2luU3RyZWFtUmVzcG9uc2UodGhpcywgcmVxdWVzdClcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgY2h1bmsgdG8gdGhlIGNsaWVudCBhcyBzb29uIGFzIGl0IGlzIHByb2R1Y2VkLiBSZXR1cm5zIGFcbiAgICogcHJvbWlzZSB0aGF0IHNldHRsZXMgb25jZSB0aGUgY2h1bmsgaGFzIGJlZW4gZGVsaXZlcmVkIHRvIHRoZSBzb2NrZXQsIHNvXG4gICAqIGEgcmVsYXkgbG9vcCBjYW4gYGF3YWl0IHJlc3BvbnNlLndyaXRlKGNodW5rKWAgYW5kIGdldCBzb2NrZXRcbiAgICogYmFja3ByZXNzdXJlIHdpdGhvdXQgYW4gYWQtaG9jIGRyYWluIHdhaXQuIFJlamVjdHMgd2hlbiB0aGUgc3RyZWFtIGhhc1xuICAgKiBlbmRlZCBvciBiZWVuIGFib3J0ZWQsIG9yIHdoZW4gdGhlIG91dGJvdW5kIGRlbGl2ZXJ5IHF1ZXVlIGNhbm5vdCBhY2NlcHRcbiAgICogdGhlIGNodW5rIChhIHN0YWxsZWQgY2xpZW50KS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSB2YWx1ZSAtIENodW5rIHRvIGVtaXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFNldHRsZXMgYWZ0ZXIgdGhlIGNodW5rIGlzIGRlbGl2ZXJlZC5cbiAgICovXG4gIGFzeW5jIHdyaXRlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMudHJhbnNwb3J0ID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ3cml0ZSgpIHJlcXVpcmVzIGFuIGFjdGl2ZSBzdHJlYW1pbmcgcmVzcG9uc2VcIilcbiAgICBpZiAoIXRoaXMuc3RyZWFtaW5nKSB0aHJvdyBuZXcgRXJyb3IoXCJ3cml0ZSgpIHJlcXVpcmVzIHN0cmVhbSgpIHRvIGJlIGNhbGxlZCBmaXJzdFwiKVxuICAgIGlmICh0aGlzLnN0cmVhbUVuZGVkIHx8IHRoaXMuc3RyZWFtQWJvcnRlZCkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZVN0cmVhbUNodW5rKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmlzaGVzIGFuIGFjdGl2ZSBzdHJlYW06IGVtaXRzIHRoZSBjaHVua2VkIHRlcm1pbmF0b3IgYW5kIHJlbGVhc2VzIHRoZVxuICAgKiByZXNwb25zZSBmb3IgY29tcGxldGlvbiBsb2dnaW5nLiBTZXR0bGVzIGFmdGVyIHRoZSB0ZXJtaW5hdG9yIGhhcyBiZWVuXG4gICAqIGRlbGl2ZXJlZCB0byB0aGUgc29ja2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBTZXR0bGVzIGFmdGVyIHRoZSBzdHJlYW0gaXMgZmluaXNoZWQuXG4gICAqL1xuICBhc3luYyBlbmQoKSB7XG4gICAgaWYgKHRoaXMudHJhbnNwb3J0ID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJlbmQoKSByZXF1aXJlcyBhbiBhY3RpdmUgc3RyZWFtaW5nIHJlc3BvbnNlXCIpXG4gICAgaWYgKCF0aGlzLnN0cmVhbWluZykgdGhyb3cgbmV3IEVycm9yKFwiZW5kKCkgcmVxdWlyZXMgc3RyZWFtKCkgdG8gYmUgY2FsbGVkIGZpcnN0XCIpXG4gICAgaWYgKHRoaXMuc3RyZWFtRW5kZWQpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy50cmFuc3BvcnQuZW5kU3RyZWFtUmVzcG9uc2UodGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMgbWlkLXN0cmVhbSwgc29cbiAgICogdGhlIGhhbmRsZXIgY2FuIHJlbGVhc2Ugd2hhdGV2ZXIgdGhlIGluLWZsaWdodCB3b3JrIHJlc2VydmVkLiBGaXJlZCBhdFxuICAgKiBtb3N0IG9uY2U7IGFsc28gZmlyZXMgd2hlbiB0aGUgc3RyZWFtIGlzIGZpbmFsaXplZCBhZnRlciB0aGUgY2xpZW50IGlzXG4gICAqIGFscmVhZHkgZ29uZS5cbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjYWxsYmFjayAtIERpc2Nvbm5lY3QgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uU3RyZWFtQ2xvc2UoY2FsbGJhY2spIHtcbiAgICB0aGlzLnN0cmVhbUNsb3NlQ2FsbGJhY2tzLmFkZChjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXJtaW5hdGVzIGFuIGFjdGl2ZSBzdHJlYW0gYWZ0ZXIgYSBmcmFtZXdvcmstbGV2ZWwgZmFpbHVyZSAodGhlIGhhbmRsZXJcbiAgICogdGhyZXcgYWZ0ZXIgYHN0cmVhbSgpYCBzdGFydGVkKTogZW1pdHMgdGhlIGNodW5rZWQgdGVybWluYXRvciBhbmQgcnVuc1xuICAgKiB0aGUgY2xvc2UgY2FsbGJhY2tzIHNvIGluLWZsaWdodCB3b3JrIHNldHRsZXMgaXRzIHJlc291cmNlcy4gTm8tb3Agd2hlblxuICAgKiB0aGUgc3RyZWFtIGFscmVhZHkgZW5kZWQgb3Igd2FzIGFib3J0ZWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFib3J0U3RyZWFtKCkge1xuICAgIGlmICghdGhpcy5zdHJlYW1pbmcgfHwgdGhpcy5zdHJlYW1FbmRlZCB8fCB0aGlzLnRyYW5zcG9ydCA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICB0aGlzLnN0cmVhbUVuZGVkID0gdHJ1ZVxuICAgIHRoaXMudHJhbnNwb3J0LmVuZFN0cmVhbVJlc3BvbnNlKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBGaWxlIHBhdGguXG4gICAqL1xuICBnZXRGaWxlUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpbGUgcmVzcG9uc2UgY29tcGxldGlvbiBjYWxsYmFjay5cbiAgICogQHJldHVybnMgeygocmVzdWx0OiBcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCIpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9IC0gRmlsZSByZXNwb25zZSBjb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKi9cbiAgZ2V0RmlsZU9uRmluaXNoZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZU9uRmluaXNoZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcGFyYW0geygocmVzdWx0OiBcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCIpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9IFtvbkZpbmlzaGVkXSAtIENvbXBsZXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEZpbGVQYXRoKHBhdGgsIG9uRmluaXNoZWQgPSBudWxsKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IHBhdGhcbiAgICB0aGlzLmZpbGVPbkZpbmlzaGVkID0gb25GaW5pc2hlZFxuICAgIHRoaXMuYm9keSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBlcnJvciBib2R5LlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRFcnJvckJvZHkoZXJyb3IpIHtcbiAgICB0aGlzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcIilcbiAgICB0aGlzLnNldEJvZHkoYCR7ZXJyb3IubWVzc2FnZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWApXG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIG51bWVyaWMgSFRUUCBzdGF0dXMgY29kZSAoZS5nLiBgNDIyYCkgb3Igb25lIG9mIHRoZVxuICAgKiBuYW1lZCBhbGlhc2VzIChgXCJzdWNjZXNzXCJgLCBgXCJub3QtZm91bmRcImAsIGBcImludGVybmFsLXNlcnZlci1lcnJvclwiYCkuXG4gICAqIE51bWVyaWMgaW5wdXRzIGluIHRoZSBzdGFuZGFyZCAxeHgtNXh4IHJhbmdlIHJlc29sdmUgdGhlaXIgb3duXG4gICAqIHN0YXR1cyBtZXNzYWdlcyBmcm9tIHRoZSBJQU5BIHJlZ2lzdHJ5OyBhbGlhc2VzIGtlZXAgdGhlXG4gICAqIGJhY2stY29tcGF0aWJsZSBjb2RlIG1hcHBpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBzdGF0dXMgLSBTdGF0dXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFN0YXR1cyhzdGF0dXMpIHtcbiAgICBjb25zdCBhbGlhc0NvZGUgPSBOQU1FRF9TVEFUVVNfQUxJQVNFU1tTdHJpbmcoc3RhdHVzKV1cbiAgICBjb25zdCBudW1lcmljU3RhdHVzID0gYWxpYXNDb2RlID8/IE51bWJlcihzdGF0dXMpXG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtZXJpY1N0YXR1cykgfHwgbnVtZXJpY1N0YXR1cyA8IDEwMCB8fCBudW1lcmljU3RhdHVzID4gNTk5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBzdGF0dXM6ICR7c3RhdHVzfWApXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVtZXJpY1N0YXR1c1xuICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IFNUQU5EQVJEX1NUQVRVU19NRVNTQUdFU1tudW1lcmljU3RhdHVzXSB8fCBcIk9LXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCByZXF1ZXN0IHRpbWVvdXQgbXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gUmVxdWVzdCB0aW1lb3V0IGluIHNlY29uZHMuXG4gICAqL1xuICBnZXRSZXF1ZXN0VGltZW91dE1zKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0VGltZW91dE1zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgcmVxdWVzdCB0aW1lb3V0IG1zLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZCB8IG51bGx9IHRpbWVvdXRTZWNvbmRzIC0gVGltZW91dCBpbiBzZWNvbmRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRSZXF1ZXN0VGltZW91dE1zKHRpbWVvdXRTZWNvbmRzKSB7XG4gICAgaWYgKHR5cGVvZiB0aW1lb3V0U2Vjb25kcyA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodGltZW91dFNlY29uZHMpKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zID0gdGltZW91dFNlY29uZHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNcyA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcikge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIodGhpcy5fcmVxdWVzdFRpbWVvdXRNcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgcmVxdWVzdCB0aW1lb3V0IG1zIGNoYW5nZSBoYW5kbGVyLlxuICAgKiBAcGFyYW0geyh0aW1lb3V0U2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkfSBoYW5kbGVyIC0gQ2hhbmdlIGhhbmRsZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFJlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlciA9IGhhbmRsZXJcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"in-process.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/in-process.js"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,mBAAmB,MAAM,6BAA6B,CAAA;AAE7D,OAAO,MAAM,MAAM,iBAAiB,CAAA;AAGpC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,mCAAmC;IAQ/C,aAAa;IAElB;;+IAE2I;IACtI,OAAO,EADF,MAAM,CAAC,MAAM,EAAE;QAAC,aAAa,EAAE,mBAAmB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,CAAC;IAGvI,iCAAiC;IAC5B,0BAA0B,EADpB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAGxB,MAAM;IACN,WAAW;IACX,wBAAwB;IACxB,SAAS;IApBhB;;;;;OAKG;IACH,YAAY,EAAC,aAAa,EAAE,WAAW,EAAC,EAHrC;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAqB,WAAW,EAAxB,MAAM,CAChB;KACuC,EAevC;IAED;;kCAE8B;IACxB,KAAK,IADE,OAAO,CAAC,IAAI,CAAC,CAGzB;IAED;;;;OAIG;IACH,mBAAmB,CAAC,YAAY,EAHrB,OAAO,qBAAqB,EAAE,OAGT,GAFnB,IAAI,CAmFhB;IAED;;;;;;OAMG;IACH,4BAA4B,CAAC,EAAC,WAAW,EAAE,KAAK,EAAC,EAJ9C;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAoB,KAAK,EAAjB,KAAK,CACb;KAE8C,GAFpC,IAAI,CAWhB;IAED;;kCAE8B;IACxB,IAAI,IADG,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED;;;;;;;;;;OAUG;IACH,4BAA4B,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAC,EANnE;QAAqB,OAAO,EAApB,MAAM,CACd;QAA4D,eAAe,EAAnE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAA4C,IAAI,EAAxC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAAsB,OAAO,AAA7B,CACA,EADQ,MAAM,CACd;KAEmE,GAFzD,IAAI,CAMhB;IAED;;;OAGG;IACH,+BAA+B,IAFlB,OAAO,wBAAwB,EAAE,OAAO,CAIpD;IAED;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAC,EAN1D;QAAqB,OAAO,EAApB,MAAM,CACd;QAAsB,SAAS,AAA/B,CACA,EADQ,MAAM,CACd;QAAsB,OAAO,AAA7B,CACA,EADQ,MAAM,CACd;QAA4C,OAAO,EAA3C,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;KAE0D,GAFhD,IAAI,CAiBhB;CACF"}
1
+ {"version":3,"file":"in-process.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/in-process.js"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,mBAAmB,MAAM,6BAA6B,CAAA;AAE7D,OAAO,MAAM,MAAM,iBAAiB,CAAA;AAGpC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,mCAAmC;IAQ/C,aAAa;IAElB;;+IAE2I;IACtI,OAAO,EADF,MAAM,CAAC,MAAM,EAAE;QAAC,aAAa,EAAE,mBAAmB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,CAAC;IAGvI,iCAAiC;IAC5B,0BAA0B,EADpB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAGxB,MAAM;IACN,WAAW;IACX,wBAAwB;IACxB,SAAS;IApBhB;;;;;OAKG;IACH,YAAY,EAAC,aAAa,EAAE,WAAW,EAAC,EAHrC;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAqB,WAAW,EAAxB,MAAM,CAChB;KACuC,EAevC;IAED;;kCAE8B;IACxB,KAAK,IADE,OAAO,CAAC,IAAI,CAAC,CAGzB;IAED;;;;OAIG;IACH,mBAAmB,CAAC,YAAY,EAHrB,OAAO,qBAAqB,EAAE,OAGT,GAFnB,IAAI,CAkGhB;IAED;;;;;;OAMG;IACH,4BAA4B,CAAC,EAAC,WAAW,EAAE,KAAK,EAAC,EAJ9C;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAoB,KAAK,EAAjB,KAAK,CACb;KAE8C,GAFpC,IAAI,CAWhB;IAED;;kCAE8B;IACxB,IAAI,IADG,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;;;;;;;OAUG;IACH,4BAA4B,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAC,EANnE;QAAqB,OAAO,EAApB,MAAM,CACd;QAA4D,eAAe,EAAnE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAA4C,IAAI,EAAxC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAAsB,OAAO,AAA7B,CACA,EADQ,MAAM,CACd;KAEmE,GAFzD,IAAI,CAMhB;IAED;;;OAGG;IACH,+BAA+B,IAFlB,OAAO,wBAAwB,EAAE,OAAO,CAIpD;IAED;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAC,EAN1D;QAAqB,OAAO,EAApB,MAAM,CACd;QAAsB,SAAS,AAA/B,CACA,EADQ,MAAM,CACd;QAAsB,OAAO,AAA7B,CACA,EADQ,MAAM,CACd;QAA4C,OAAO,EAA3C,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;KAE0D,GAFhD,IAAI,CAiBhB;CACF"}