@mnaoumov/typescript-lib 1.2.0 → 1.4.0

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.
@@ -56,12 +56,12 @@ __export(async_exports, {
56
56
  module.exports = __toCommonJS(async_exports);
57
57
  var import_abort_controller = require('./abort-controller.cjs');
58
58
  var import_async_operation_hook = require('./async-operation-hook.cjs');
59
+ var import_debug_switches = require('./debug-switches.cjs');
59
60
  var import_debug = require('./debug.cjs');
60
61
  var import_error = require('./error.cjs');
61
62
  var import_function = require('./function.cjs');
62
63
  var import_object_utils = require('./object-utils.cjs');
63
64
  var import_type_guards = require('./type-guards.cjs');
64
- var import_typescript_lib_state = require('./typescript-lib-state.cjs');
65
65
  async function addErrorHandler(asyncFunction, stackTrace) {
66
66
  stackTrace ??= (0, import_error.getStackTrace)(1);
67
67
  const wasScheduledWithinIgnoreContext = (0, import_error.isAsyncErrorIgnoreContextActive)();
@@ -209,7 +209,7 @@ function chain(chainPromise, promisableFunction) {
209
209
  return nextChainPromise;
210
210
  }
211
211
  function isTerminationOnTimeoutEnabled() {
212
- return getTerminationOnTimeoutEnabledWrapper().value;
212
+ return (0, import_debug_switches.getTerminateOnTimeoutDebugSwitch)().isEnabled();
213
213
  }
214
214
  function marksAsTerminateRetry(error) {
215
215
  terminateRetryErrors.add(error);
@@ -398,7 +398,7 @@ async function setImmediateAsync() {
398
398
  });
399
399
  }
400
400
  function setTerminationOnTimeoutEnabled(isEnabled) {
401
- getTerminationOnTimeoutEnabledWrapper().value = isEnabled;
401
+ (0, import_debug_switches.getTerminateOnTimeoutDebugSwitch)().setEnabled(isEnabled);
402
402
  }
403
403
  async function setTimeoutAsync(delay) {
404
404
  await new Promise((resolve) => {
@@ -437,7 +437,7 @@ async function toArray(iter) {
437
437
  return array;
438
438
  }
439
439
  function defaultOnTimeout(context) {
440
- if (getTerminationOnTimeoutEnabledWrapper().value) {
440
+ if ((0, import_debug_switches.getTerminateOnTimeoutDebugSwitch)().isEnabled()) {
441
441
  context.terminateOperation();
442
442
  return;
443
443
  }
@@ -445,9 +445,6 @@ function defaultOnTimeout(context) {
445
445
  `Timeout termination is switched off, so the operation '${context.operationName}' keeps running after ${String(context.duration)} milliseconds`
446
446
  );
447
447
  }
448
- function getTerminationOnTimeoutEnabledWrapper() {
449
- return (0, import_typescript_lib_state.getTypescriptLibState)("isTerminationOnTimeoutEnabled", true);
450
- }
451
448
  // Annotate the CommonJS export names for ESM import in node:
452
449
  0 && (module.exports = {
453
450
  addErrorHandler,
@@ -480,4 +477,4 @@ function getTerminationOnTimeoutEnabledWrapper() {
480
477
  timeout,
481
478
  toArray
482
479
  });
483
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgR2VuZXJpY0FzeW5jRnVuY3Rpb24sXG4gIEdlbmVyaWNGdW5jdGlvbixcbiAgR2VuZXJpY1ZvaWRGdW5jdGlvblxufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVXcmFwcGVyIH0gZnJvbSAnLi92YWx1ZS13cmFwcGVyLnRzJztcblxuaW1wb3J0IHtcbiAgYWJvcnRTaWduYWxBbnksXG4gIGFib3J0U2lnbmFsTmV2ZXIsXG4gIGFib3J0U2lnbmFsVGltZW91dCxcbiAgd2FpdEZvckFib3J0XG59IGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQgfSBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmltcG9ydCB7XG4gIGdldExpYkRlYnVnZ2VyLFxuICBwcmludFdpdGhTdGFja1RyYWNlXG59IGZyb20gJy4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgQVNZTkNfV1JBUFBFUl9FUlJPUl9NRVNTQUdFLFxuICBDdXN0b21TdGFja1RyYWNlRXJyb3IsXG4gIGVtaXRBc3luY0Vycm9yRXZlbnQsXG4gIGdldFN0YWNrVHJhY2UsXG4gIGlzQXN5bmNFcnJvcklnbm9yZUNvbnRleHRBY3RpdmUsXG4gIHByaW50RXJyb3IsXG4gIFNpbGVudEVycm9yXG59IGZyb20gJy4vZXJyb3IudHMnO1xuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBhc3NlcnROb25OdWxsYWJsZVxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IGdldFR5cGVzY3JpcHRMaWJTdGF0ZSB9IGZyb20gJy4vdHlwZXNjcmlwdC1saWItc3RhdGUudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFzeW5jRnVuY3Rpb246IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1RyYWNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdHlwZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvbWlzZVJlc29sdmU8VD4gPSB1bmRlZmluZWQgZXh0ZW5kcyBUID8gKHZhbHVlPzogUHJvbWlzZUxpa2U8VD4gfCBUKSA9PiB2b2lkXG4gIDogKHZhbHVlOiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWQ7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJldHJ5V2l0aFRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGFib3J0IHNpZ25hbCB0byBjYW5jZWwgdGhlIHJldHJ5IG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEEgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDBgXG4gICAqL1xuICByZWFkb25seSByZXRyeURlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0cnkgdGhlIGZ1bmN0aW9uIG9uIGVycm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXRyeU9uRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIG9uIHJldHJ5aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGhhbmRsZXIgdG8gYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBjYXRjaGVzIGFueSBlcnJvcnMgYW5kIGVtaXRzIGFuIGFzeW5jIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0Z1bmN0aW9uIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciB0by5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZW1pdHMgYXN5bmMgZXJyb3IgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRFcnJvckhhbmRsZXIoYXN5bmNGdW5jdGlvbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICAvLyBDYXB0dXJlIHRoZSBpZ25vcmUgY29udGV4dCBzeW5jaHJvbm91c2x5IGF0IHNjaGVkdWxlIHRpbWUsIHNvIGEgZGVmZXJyZWQgcmVqZWN0aW9uIHNldHRsaW5nIGFmdGVyIHRoZSBzY29wZSBleGl0cyBpcyBzdGlsbCBpZ25vcmVkLlxuICBjb25zdCB3YXNTY2hlZHVsZWRXaXRoaW5JZ25vcmVDb250ZXh0ID0gaXNBc3luY0Vycm9ySWdub3JlQ29udGV4dEFjdGl2ZSgpO1xuICB0cnkge1xuICAgIGF3YWl0IGFzeW5jRnVuY3Rpb24oKTtcbiAgfSBjYXRjaCAoYXN5bmNFcnJvcikge1xuICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgY2F1c2U6IGFzeW5jRXJyb3IsXG4gICAgICBtZXNzYWdlOiBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG4gICAgaWYgKGhhbmRsZVNpbGVudEVycm9yKHdyYXBwZWRFcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW1pdEFzeW5jRXJyb3JFdmVudCh3cmFwcGVkRXJyb3IsIHdhc1NjaGVkdWxlZFdpdGhpbklnbm9yZUNvbnRleHQpO1xuICB9XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gZmlsdGVyLlxuICogQHBhcmFtIHByZWRpY2F0ZSAtIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbHRlcjxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxib29sZWFuPik6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGFuczogVFtdID0gW107XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFycmF5LCBpbmRleCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBhcnJheVtpbmRleF0gYXMgVDtcbiAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIGFucy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbnM7XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSBpbiBwbGFjZSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gZmlsdGVyLlxuICogQHBhcmFtIHByZWRpY2F0ZSAtIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFycmF5IGlzIGZpbHRlcmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaWx0ZXJJblBsYWNlPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgbGV0IHdyaXRlSW5kZXggPSAwO1xuICBmb3IgKGxldCByZWFkSW5kZXggPSAwOyByZWFkSW5kZXggPCBsZW5ndGg7IHJlYWRJbmRleCsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFycmF5LCByZWFkSW5kZXgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50ID0gYXJyYXlbcmVhZEluZGV4XSBhcyBUO1xuICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoY3VycmVudCwgcmVhZEluZGV4LCBhcnJheSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFllcywgaXQgaXMgYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24sIGJ1dCBJIGRvbid0IGFuIGVsZWdhbnQgd2F5IHRvIGZpeCBpdC5cbiAgICAgIGFycmF5W3dyaXRlSW5kZXgrK10gPSBjdXJyZW50O1xuICAgIH1cbiAgfVxuICBhcnJheS5sZW5ndGggPSB3cml0ZUluZGV4O1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudCwgYW5kIHRoZW4gZmxhdHRlbnMgdGhlIHJlc3VsdHMgaW50byBhIHNpbmdsZSBhcnJheS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIG1hcCBvdmVyIGFuZCBmbGF0dGVuLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhIGZsYXR0ZW5lZCBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZsYXRNYXA8VCwgVT4oYXJyYXk6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVW10+KTogUHJvbWlzZTxVW10+IHtcbiAgY29uc3QgbmVzdGVkUmVzdWx0cyA9IGF3YWl0IGFzeW5jTWFwKGFycmF5LCBjYWxsYmFjayk7XG4gIHJldHVybiBuZXN0ZWRSZXN1bHRzLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBtYXAgb3Zlci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNNYXA8VCwgVT4oYXJyYXk6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVPik6IFByb21pc2U8VVtdPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWFycmF5LWNhbGxiYWNrLXJlZmVyZW5jZSAtLSBQYXNzaW5nIGBjYWxsYmFja2Agc3RyYWlnaHQgdGhyb3VnaCBpcyB0aGUgY29udHJhY3Q6IGl0IGlzIGRlY2xhcmVkIGFzIGAodmFsdWUsIGluZGV4LCBhcnJheSlgIHNvIHRoYXQgaXQgcmVjZWl2ZXMgZXhhY3RseSB3aGF0IGBBcnJheSNtYXBgIHN1cHBsaWVzLiBXcmFwcGluZyBpdCB0byB0YWtlIG9ubHkgdGhlIHZhbHVlIHdvdWxkIHF1aWV0bHkgc3RvcCBmb3J3YXJkaW5nIHRoZSBvdGhlciB0d28uXG4gIHJldHVybiBhd2FpdCBwcm9taXNlQWxsU2VxdWVudGlhbGx5KGFycmF5Lm1hcChjYWxsYmFjaykpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhIHN5bmNocm9ub3VzIG9uZSBieSBhdXRvbWF0aWNhbGx5IGhhbmRsaW5nIHRoZSBQcm9taXNlIHJlamVjdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHBhcmFtIGFzeW5jRnVuY3Rpb24gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYSBzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QXN5bmNUb1N5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihhc3luY0Z1bmN0aW9uOiBHZW5lcmljQXN5bmNGdW5jdGlvbjxBcmd1bWVudHM+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogR2VuZXJpY1ZvaWRGdW5jdGlvbjxBcmd1bWVudHM+IHtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgcmV0dXJuICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpOiB2b2lkID0+IHtcbiAgICBhc3NlcnROb25OdWxsYWJsZShzdGFja1RyYWNlKTtcbiAgICBjb25zdCBpbm5lclN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICAgIHN0YWNrVHJhY2UgKz0gYFxcbiAgICBhdCAtLS0gY29udmVydEFzeW5jVG9TeW5jIC0tLSAoMClcXG4ke2lubmVyU3RhY2tUcmFjZX1gO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuY3Rpb24oLi4uJGFyZ3VtZW50cyksIHN0YWNrVHJhY2UpO1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYW4gYXN5bmNocm9ub3VzIG9uZSBieSB3cmFwcGluZyBpdCBpbiBhIHtAbGluayBQcm9taXNlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0Z1bmN0aW9uIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdLCBSZXN1bHQ+KHN5bmNGdW5jdGlvbjogR2VuZXJpY0Z1bmN0aW9uPEFyZ3VtZW50cywgUmVzdWx0Pik6IEdlbmVyaWNBc3luY0Z1bmN0aW9uPEFyZ3VtZW50cywgUmVzdWx0PiB7XG4gIHJldHVybiBhc3luYyAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgICByZXR1cm4gc3luY0Z1bmN0aW9uKC4uLiRhcmd1bWVudHMpO1xuICB9O1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBzaWxlbnQgZXJyb3IuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGhhbmRsZS5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGVycm9yIGlzIGEgc2lsZW50IGVycm9yLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBUaGUgbmFtZSBzdGF0ZXMgdGhlIGFjdGlvbjsgdGhlIGJvb2xlYW4gb25seSByZXBvcnRzIHdoZXRoZXIgdGhlIGVycm9yIHdhcyBoYW5kbGVkLlxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVNpbGVudEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGxldCBjYXVzZSA9IGVycm9yO1xuICB3aGlsZSAoIShjYXVzZSBpbnN0YW5jZW9mIFNpbGVudEVycm9yKSkge1xuICAgIGlmICghKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2F1c2UgPSBjYXVzZS5jYXVzZTtcbiAgfVxuXG4gIGdldExpYkRlYnVnZ2VyKCdBc3luYzpoYW5kbGVTaWxlbnRFcnJvcicpKGVycm9yKTtcbiAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIElnbm9yZXMgYW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gYnkgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdG8gaWdub3JlIHRoZSBlcnJvciBvZi5cbiAqIEBwYXJhbSBmYWxsYmFja1ZhbHVlIC0gQWx3YXlzIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY29tcGxldGVzIG9yIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3IocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPiwgZmFsbGJhY2tWYWx1ZT86IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG4vKipcbiAqIEludm9rZXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGEgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvciB0aGUgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgZmFsbGJhY2tWYWx1ZTogVCk6IFByb21pc2U8VD47XG4vKipcbiAqIElnbm9yZXMgYW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gYnkgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvciB0aGUgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgZmFsbGJhY2tWYWx1ZT86IFQpOiBQcm9taXNlPFQgfCB2b2lkPiB7XG4gIGNvbnN0IGlnbm9yZUVycm9yRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6aWdub3JlRXJyb3InKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IGdldFN0YWNrVHJhY2UoMSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWdub3JlRXJyb3JEZWJ1Z2dlcihcbiAgICAgICdJZ25vcmVkIGVycm9yJyxcbiAgICAgIG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIG1lc3NhZ2U6ICdJZ25vcmVkIGVycm9yJyxcbiAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBhIHtAbGluayBQcm9taXNlfSBhbmQgc2FmZWx5IGhhbmRsZXMgYW55IGVycm9ycyBieSBjYXRjaGluZyB0aGVtIGFuZCBlbWl0dGluZyBhbiBhc3luYyBlcnJvciBldmVudC5cbiAqXG4gKiBAcGFyYW0gYXN5bmNGdW5jdGlvbiAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gaW52b2tlIHNhZmVseS5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3luY1NhZmVseShhc3luY0Z1bmN0aW9uOiAoKSA9PiBQcm9taXNhYmxlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG5cbiAgbGV0IHJlc3VsdDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhc3luY0Z1bmN0aW9uKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzIC0tIFJlLXJlamVjdGluZyB0aGUgb3JpZ2luYWwgY2F1Z2h0IGVycm9yIGFzLWlzLlxuICAgIG5vdGlmeUFzeW5jT3BlcmF0aW9uU3RhcnRlZChhZGRFcnJvckhhbmRsZXIoKCkgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpLCBzdGFja1RyYWNlKSk7XG4gIH1cbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQoYWRkRXJyb3JIYW5kbGVyKCgpID0+IHJlc3VsdCwgc3RhY2tUcmFjZSkpO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYWZ0ZXIgYSBkZWxheS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheShwYXJhbXM6IEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgYXN5bmNGdW5jdGlvbixcbiAgICBkZWxheUluTWlsbGlzZWNvbmRzID0gMFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbCA/PyBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2xlZXAoeyBhYm9ydFNpZ25hbCwgbWlsbGlzZWNvbmRzOiBkZWxheUluTWlsbGlzZWNvbmRzLCBzaG91bGRUaHJvd09uQWJvcnQ6IHRydWUgfSk7XG4gICAgYXdhaXQgYXN5bmNGdW5jdGlvbihhYm9ydFNpZ25hbCk7XG4gIH0sIHN0YWNrVHJhY2UpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGFzeW5jIGZ1bmN0aW9ucyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFzeW5jRm5zIC0gVGhlIGFzeW5jIGZ1bmN0aW9ucyB0byBleGVjdXRlIHNlcXVlbnRpYWxseS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgYXN5bmMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbEFzeW5jRm5zU2VxdWVudGlhbGx5PFQ+KGFzeW5jRm5zOiAoKCkgPT4gUHJvbWlzYWJsZTxUPilbXSk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFzeW5jRnVuY3Rpb24gb2YgYXN5bmNGbnMpIHtcbiAgICByZXN1bHRzLnB1c2goYXdhaXQgYXN5bmNGdW5jdGlvbigpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBwcm9taXNlcyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHByb21pc2VzIC0gVGhlIHByb21pc2VzIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9taXNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb21pc2VBbGxTZXF1ZW50aWFsbHk8VD4ocHJvbWlzZXM6IFByb21pc2FibGU8VD5bXSk6IFByb21pc2U8VFtdPiB7XG4gIHJldHVybiBhd2FpdCBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHkocHJvbWlzZXMubWFwKChwcm9taXNlKSA9PiAoKSA9PiBwcm9taXNlKSk7XG59XG5cbmNvbnN0IHRlcm1pbmF0ZVJldHJ5RXJyb3JzID0gbmV3IFdlYWtTZXQ8RXJyb3I+KCk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJldHJ5V2l0aFRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5V2l0aFRpbWVvdXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgdGltZW91dC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgdGltZW91dCBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgb25UaW1lb3V0PzogKGNvbnRleHQ6IFRpbWVvdXRDb250ZXh0KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXRyeSBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlPcHRpb25zPzogUmV0cnlPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJ1bldpdGhUaW1lb3V0fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5XaXRoVGltZW91dFBhcmFtczxSZXN1bHQ+IHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB0aW1lb3V0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSB0aW1lb3V0IGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBvblRpbWVvdXQ/OiAoY29udGV4dDogVGltZW91dENvbnRleHQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8UmVzdWx0PjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1RyYWNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNsZWVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGVlcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnRleHQgcHJvdmlkZWQgdG8gdGhlIHRpbWVvdXQgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lb3V0Q29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBvcGVyYXRpb24gc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqL1xuICBvbk9wZXJhdGlvbkNvbXBsZXRlZDogKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRlcm1pbmF0ZXMgdGhlIG9wZXJhdGlvbiB0aGF0IHRpbWVkIG91dC5cbiAgICovXG4gIHRlcm1pbmF0ZU9wZXJhdGlvbjogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZW91dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZW91dCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hhaW5zIGEgcHJvbWlzZSB3aXRoIGFub3RoZXIgcHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0gY2hhaW5Qcm9taXNlIC0gUmVwcmVzZW50cyB0aGUgY2hhaW5lZCBwcm9taXNlLlxuICogQHBhcmFtIHByb21pc2FibGVGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBjaGFpbi5cbiAqIEByZXR1cm5zIENoYWluZWQgcHJvbWlzZSBvciBgbnVsbGAgaWYgbm8gYXN5bmMgbG9naWMgaXMgY2hhaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluKGNoYWluUHJvbWlzZTogbnVsbCB8IFByb21pc2U8dm9pZD4sIHByb21pc2FibGVGdW5jdGlvbjogKCkgPT4gbnVsbCB8IFByb21pc2FibGU8dm9pZD4pOiBudWxsIHwgUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXh0Q2hhaW5Qcm9taXNlID0gY2hhaW5Qcm9taXNlO1xuICBpZiAoY2hhaW5Qcm9taXNlKSB7XG4gICAgbmV4dENoYWluUHJvbWlzZSA9IGNoYWluUHJvbWlzZS50aGVuKCgpID0+IHByb21pc2FibGVGdW5jdGlvbigpID8/IHVuZGVmaW5lZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvbWlzYWJsZSA9IHByb21pc2FibGVGdW5jdGlvbigpO1xuICAgIGlmIChwcm9taXNhYmxlKSB7XG4gICAgICBuZXh0Q2hhaW5Qcm9taXNlID0gcHJvbWlzYWJsZSBpbnN0YW5jZW9mIFByb21pc2UgPyBwcm9taXNhYmxlIGFzIFByb21pc2U8dm9pZD4gOiBQcm9taXNlLnJlc29sdmUocHJvbWlzYWJsZSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dENoYWluUHJvbWlzZT8uY2F0Y2gobm9vcCk7XG4gIHJldHVybiBuZXh0Q2hhaW5Qcm9taXNlO1xufVxuXG4vKipcbiAqIEdldHMgd2hldGhlciBhIHtAbGluayBydW5XaXRoVGltZW91dH0gY2FsbCB3aXRob3V0IGl0cyBvd24gYG9uVGltZW91dGAgdGVybWluYXRlcyB0aGUgb3BlcmF0aW9uIHdoZW4gaXQgdGltZXMgb3V0LlxuICpcbiAqIFRoZSB2YWx1ZSBpcyBhcHAtd2lkZTogaXQgbGl2ZXMgaW4gdGhlIHNoYXJlZCBzdGF0ZSwgc28gZXZlcnkgY29weSBvZiB0aGlzIGxpYnJhcnkgbG9hZGVkIGluIG9uZSByZWFsbSwgc3VjaCBhc1xuICogdGhlIGNvcHkgZWFjaCBPYnNpZGlhbiBwbHVnaW4gYnVuZGxlcywgcmVhZHMgdGhlIHNhbWUgdmFsdWUuXG4gKlxuICogQHJldHVybnMgYHRydWVgICh0aGUgZGVmYXVsdCkgaWYgYSB0aW1lZC1vdXQgb3BlcmF0aW9uIGlzIHRlcm1pbmF0ZWQsIGBmYWxzZWAgaWYgaXQgaXMgbGVmdCBydW5uaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWRXcmFwcGVyKCkudmFsdWU7XG59XG5cbi8qKlxuICogTWFya3MgYW4gZXJyb3IgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBtYXJrIHRvIHRlcm1pbmF0ZSByZXRyeSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtzQXNUZXJtaW5hdGVSZXRyeShlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgdGVybWluYXRlUmV0cnlFcnJvcnMuYWRkKGVycm9yKTtcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBmdW5jdGlvbiB0aGF0IG5ldmVyIGVuZHMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBuZXZlciByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5ldmVyRW5kcygpOiBQcm9taXNlPG5ldmVyPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKCgpID0+IHtcbiAgICBub29wKCk7XG4gIH0pO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQ7IHRoZSBhd2FpdCBhYm92ZSBuZXZlciByZXNvbHZlcy4gKi9cbiAgYXNzZXJ0KGZhbHNlLCAnU2hvdWxkIG5ldmVyIGhhcHBlbicpO1xuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgdGljay5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHRpY2sgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV4dFRpY2tBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0byBuYXRpdmUgcHJvbWlzYWJsZSwgY29udmVydGluZyB7QGxpbmsgUHJvbWlzZUxpa2V9IChha2EgVGhlbmFibGUpIHRvIGEgbmF0aXZlIHtAbGluayBQcm9taXNlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzYWJsZSAtIFRoZSBwcm9taXNhYmxlIHRvIG5vcm1hbGl6ZS5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBpdHNlbGYgb3IgYSBuYXRpdmUge0BsaW5rIFByb21pc2V9IGlmIHRoZSB2YWx1ZSBpcyBhIHtAbGluayBQcm9taXNlTGlrZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcm9taXNhYmxlPFQ+KHByb21pc2FibGU6IFByb21pc2FibGU8VD4pOiBQcm9taXNlPFQ+IHwgVCB7XG4gIGlmICghcHJvbWlzYWJsZSkge1xuICAgIHJldHVybiBwcm9taXNhYmxlO1xuICB9XG5cbiAgaWYgKHByb21pc2FibGUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgcmV0dXJuIHByb21pc2FibGUgYXMgUHJvbWlzZTxUPjtcbiAgfVxuXG4gIHJldHVybiAocHJvbWlzYWJsZSBhcyBQYXJ0aWFsPFByb21pc2VMaWtlPFQ+PikudGhlbiA/IFByb21pc2UucmVzb2x2ZShwcm9taXNhYmxlKSA6IChwcm9taXNhYmxlIGFzIFQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgcXVldWUgbWljcm90YXNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcXVldWUgbWljcm90YXNrIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWljcm90YXNrQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCByZXF1ZXN0IGFuaW1hdGlvbiBmcmFtZS5cbiAqXG4gKiBAcGFyYW0gZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgZmFsbGJhY2sgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSBpZiBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBkb2VzIG5vdCBmaXJlIChlLmcuIHRoZSB3aW5kb3cgaXMgbm90IGFjdGl2ZSkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBgMTAwYCBtaWxsaXNlY29uZHMuIFVzZSBgMGAgdG8gZGlzYWJsZSB0aGUgZmFsbGJhY2suXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lIGlzIGF2YWlsYWJsZSAob3Igd2hlbiB0aGUgZmFsbGJhY2sgdGltZSBpcyByZWFjaGVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IERFRkFVTFRfRkFMTEJBQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDA7XG4gIGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzID8/PSBERUZBVUxUX0ZBTExCQUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3JlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jUHJvbWlzZSwgZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgPiAwID8gc2xlZXAoeyBtaWxsaXNlY29uZHM6IGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzIH0pIDogbmV2ZXJFbmRzKCldKTtcbn1cblxuLyoqXG4gKiBSZXRyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1bnRpbCBpdCByZXR1cm5zIGB0cnVlYCBvciB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBvciByZWplY3RzIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldHJ5V2l0aFRpbWVvdXQocGFyYW1zOiBSZXRyeVdpdGhUaW1lb3V0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpyZXRyeVdpdGhUaW1lb3V0Jyk7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICByZXRyeURlbGF5SW5NaWxsaXNlY29uZHM6IDEwMCxcbiAgICBzaG91bGRSZXRyeU9uRXJyb3I6IGZhbHNlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzIC0tIEV4dHJhY3RpbmcgbWFnaWMgbnVtYmVyIGFzIGEgY29uc3RhbnQgd291bGQgYmUgcmVwZXRpdGl2ZSwgYXMgdGhlIHZhbHVlIGlzIHVzZWQgb25seSBvbmNlIGFuZCBpdHMgbmFtZSB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJvcGVydHkuXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiA1MDAwXG4gIH07XG4gIGNvbnN0IGZ1bGxPcHRpb25zID0geyAuLi5ERUZBVUxUX1JFVFJZX09QVElPTlMsIC4uLnBhcmFtcy5yZXRyeU9wdGlvbnMgfTtcbiAgZnVsbE9wdGlvbnMuYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXdhaXQgcnVuV2l0aFRpbWVvdXQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFJ1bldpdGhUaW1lb3V0UGFyYW1zPHZvaWQ+Pih7XG4gICAgY29udGV4dDogeyBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJywgcmV0cnlGdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uIH0sXG4gICAgb25UaW1lb3V0OiBwYXJhbXMub25UaW1lb3V0LFxuICAgIGFzeW5jIG9wZXJhdGlvbkZ1bmN0aW9uKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgY29tYmluZWRBYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsQW55KGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsLCBhYm9ydFNpZ25hbCk7XG4gICAgICBjb21iaW5lZEFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICB3aGlsZSAoIWNvbWJpbmVkQWJvcnRTaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGxldCBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNTdWNjZXNzID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uKGNvbWJpbmVkQWJvcnRTaWduYWwpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW5zaWRlIGBmbigpYC4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgICAgICAgIGlmIChjb21iaW5lZEFib3J0U2lnbmFsLmFib3J0ZWQgfHwgIWZ1bGxPcHRpb25zLnNob3VsZFJldHJ5T25FcnJvciB8fCB0ZXJtaW5hdGVSZXRyeUVycm9ycy5oYXMoZXJyb3IgYXMgRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAncmV0cnlXaXRoVGltZW91dCBmYWlsZWQnLFxuICAgICAgICAgICAgICBzdGFja1RyYWNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRFcnJvcihlcnJvcik7XG4gICAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAgICAgJGFyZ3VtZW50czogW3tcbiAgICAgICAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVidWdnZXJJbnN0YW5jZTogcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJldHJ5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgJHtTdHJpbmcoYXR0ZW1wdCl9IGF0dGVtcHRzYCxcbiAgICAgICAgICAgIHN0YWNrVHJhY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZGVidWdnZXJJbnN0YW5jZTogcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICAgIG1lc3NhZ2U6IGBSZXRyeSBhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfSBjb21wbGV0ZWQgdW5zdWNjZXNzZnVsbHkuIFRyeWluZyBhZ2FpbiBpbiAke1N0cmluZyhmdWxsT3B0aW9ucy5yZXRyeURlbGF5SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgLFxuICAgICAgICAgIHN0YWNrVHJhY2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoeyBhYm9ydFNpZ25hbCwgbWlsbGlzZWNvbmRzOiBmdWxsT3B0aW9ucy5yZXRyeURlbGF5SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJyxcbiAgICBzdGFja1RyYWNlLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogZnVsbE9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIGZ1bmN0aW9uIHdpdGggYSB0aW1lb3V0LiBJZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgY29tcGxldGUgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSwgaXQgaXMgY29uc2lkZXJlZCB0byBoYXZlIHRpbWVkIG91dC5cbiAqXG4gKiBXaXRob3V0IGFuIGBvblRpbWVvdXRgLCBhIHRpbWVkLW91dCBmdW5jdGlvbiBpcyB0ZXJtaW5hdGVkLCB1bmxlc3Mge0BsaW5rIHNldFRlcm1pbmF0aW9uT25UaW1lb3V0RW5hYmxlZH0gc3dpdGNoZWQgdGhhdCBvZmYgYXBwLXdpZGUsXG4gKiBpbiB3aGljaCBjYXNlIGl0IGlzIGFsbG93ZWQgdG8gcnVuIGluZGVmaW5pdGVseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZnJvbSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHJlamVjdHMgaWYgaXQgdGltZXMgb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFRpbWVvdXQ8UmVzdWx0PihwYXJhbXM6IFJ1bldpdGhUaW1lb3V0UGFyYW1zPFJlc3VsdD4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICBjb25zdCBzdGFja1RyYWNlID0gcGFyYW1zLnN0YWNrVHJhY2UgPz8gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgY29uc3QgcnVuQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCB0aW1lb3V0QWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCByZXN1bHQ6IG51bGwgfCBSZXN1bHQgPSBudWxsO1xuICBsZXQgaGFzUmVzdWx0ID0gZmFsc2U7XG4gIGxldCBpc0NvbXBsZXRlZCA9IGZhbHNlO1xuICBjb25zdCBydW5XaXRoVGltZW91dERlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOnJ1bldpdGhUaW1lb3V0Jyk7XG4gIGNvbnN0IG9uVGltZW91dCA9IHBhcmFtcy5vblRpbWVvdXQgPz8gZGVmYXVsdE9uVGltZW91dDtcblxuICBhd2FpdCBQcm9taXNlLnJhY2UoW3J1bigpLCBpbm5lclRpbWVvdXQoKV0pO1xuICAvLyBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIHJ1biBmaW5pc2hlZCBvbiBpdHMgb3duLiBXaGVuIHRoZSB0aW1lb3V0IHRlcm1pbmF0ZWQgaXQsIHRoZVxuICAvLyBvcGVyYXRpb24gbWlnaHQgc3RpbGwgcmVzb2x2ZSBhZnRlcndhcmRzIChlLmcuIGEgcmV0cnkgbG9vcCB0aGF0IGV4aXRzIG9uIGFib3J0KSwgYnV0IHRoYXQgdmFsdWVcbiAgLy8gaXMgcGFzdCB0aGUgZGVhZGxpbmUgYW5kIG11c3QgYmUgdHJlYXRlZCBhcyBhIGZhaWx1cmUsIG5vdCBhIHN1Y2Nlc3MuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEJvdGggbWlnaHQgY2hhbmdlIGluc2lkZSBgcnVuKClgL2Bpbm5lclRpbWVvdXQoKWAuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGhhc1Jlc3VsdCAmJiAhcnVuQWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICBjYXVzZTogcnVuQWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24sXG4gICAgbWVzc2FnZTogJ1J1biB3aXRoIHRpbWVvdXQgZmFpbGVkJyxcbiAgICBzdGFja1RyYWNlXG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uKHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLnRydW5jKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgfV0sXG4gICAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJ1bldpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgIG1lc3NhZ2U6IGBFeGVjdXRpb24gdGltZTogJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgLFxuICAgICAgICBzdGFja1RyYWNlXG4gICAgICB9KTtcbiAgICAgIGhhc1Jlc3VsdCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJ1bkFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdDb21wbGV0ZWQnKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJUaW1lb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHNsZWVwKHsgYWJvcnRTaWduYWw6IHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuc2lnbmFsLCBtaWxsaXNlY29uZHM6IHBhcmFtcy50aW1lb3V0SW5NaWxsaXNlY29uZHMgfSk7XG5cbiAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLnRydW5jKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICRhcmd1bWVudHM6IFt7XG4gICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgfV0sXG4gICAgICBkZWJ1Z2dlckluc3RhbmNlOiBydW5XaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgbWVzc2FnZTogYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2AsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lb3V0Q29udGV4dDogVGltZW91dENvbnRleHQgPSBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VGltZW91dENvbnRleHQ+KHtcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgb25PcGVyYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYWxsYmFjayk7XG4gICAgICB9LFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsXG4gICAgICB0ZXJtaW5hdGVPcGVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgKTtcbiAgICAgICAgcnVuQWJvcnRDb250cm9sbGVyLmFib3J0KGVycm9yKTtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvblRpbWVvdXQodGltZW91dENvbnRleHQpO1xuICAgIGF3YWl0IHdhaXRGb3JBYm9ydCh0aW1lb3V0QWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTZXRzIHdoZXRoZXIgYSB7QGxpbmsgcnVuV2l0aFRpbWVvdXR9IGNhbGwgd2l0aG91dCBpdHMgb3duIGBvblRpbWVvdXRgIHRlcm1pbmF0ZXMgdGhlIG9wZXJhdGlvbiB3aGVuIGl0IHRpbWVzIG91dC5cbiAqXG4gKiBTd2l0Y2ggaXQgb2ZmIHdoaWxlIGRlYnVnZ2luZywgc28gYW4gb3BlcmF0aW9uIHBhdXNlZCBvbiBhIGJyZWFrcG9pbnQgaXMgbm90IHRlcm1pbmF0ZWQgdW5kZXIgdGhlIGRlYnVnZ2VyLiBUaGVcbiAqIHRpbWVvdXQgaXMgc3RpbGwgbG9nZ2VkIHRocm91Z2ggdGhlIGBBc3luYzpydW5XaXRoVGltZW91dGAgZGVidWdnZXIuIFRoZSB2YWx1ZSBpcyBhcHAtd2lkZSwgc2VlXG4gKiB7QGxpbmsgaXNUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWR9LlxuICpcbiAqIEBwYXJhbSBpc0VuYWJsZWQgLSBgdHJ1ZWAgdG8gdGVybWluYXRlIGEgdGltZWQtb3V0IG9wZXJhdGlvbiwgYGZhbHNlYCB0byBsZWF2ZSBpdCBydW5uaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VGVybWluYXRpb25PblRpbWVvdXRFbmFibGVkKGlzRW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICBnZXRUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWRXcmFwcGVyKCkudmFsdWUgPSBpc0VuYWJsZWQ7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gZGVsYXkgLSBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFRpbWVvdXRBc3luYyhkZWxheT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKHBhcmFtczogU2xlZXBQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIG1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgd2FpdEZvckFib3J0KGFib3J0U2lnbmFsQW55KGFib3J0U2lnbmFsLCBhYm9ydFNpZ25hbFRpbWVvdXQobWlsbGlzZWNvbmRzKSkpO1xuICBpZiAoc2hvdWxkVGhyb3dPbkFib3J0KSB7XG4gICAgYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgcGVyaW9kLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBhbHdheXMgcmVqZWN0cyB3aXRoIGEgdGltZW91dCBlcnJvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRpbWVvdXQocGFyYW1zOiBUaW1lb3V0UGFyYW1zKTogUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgc2hvdWxkVGhyb3dPbkFib3J0LFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBzbGVlcChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2xlZXBQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBtaWxsaXNlY29uZHM6IHRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSkpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gYW4gYXJyYXkgYnkgY29uc3VtaW5nIGFsbCBpdHMgZWxlbWVudHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqIEBwYXJhbSBpdGVyIC0gVGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYXJyYXk6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcikge1xuICAgIGFycmF5LnB1c2goaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0T25UaW1lb3V0KGNvbnRleHQ6IFRpbWVvdXRDb250ZXh0KTogdm9pZCB7XG4gIGlmIChnZXRUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWRXcmFwcGVyKCkudmFsdWUpIHtcbiAgICBjb250ZXh0LnRlcm1pbmF0ZU9wZXJhdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dCcpKFxuICAgIGBUaW1lb3V0IHRlcm1pbmF0aW9uIGlzIHN3aXRjaGVkIG9mZiwgc28gdGhlIG9wZXJhdGlvbiAnJHtjb250ZXh0Lm9wZXJhdGlvbk5hbWV9JyBrZWVwcyBydW5uaW5nIGFmdGVyICR7U3RyaW5nKGNvbnRleHQuZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFRlcm1pbmF0aW9uT25UaW1lb3V0RW5hYmxlZFdyYXBwZXIoKTogVmFsdWVXcmFwcGVyPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGdldFR5cGVzY3JpcHRMaWJTdGF0ZSgnaXNUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWQnLCB0cnVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsOEJBS087QUFDUCxrQ0FBNEM7QUFDNUMsbUJBR087QUFDUCxtQkFRTztBQUNQLHNCQUdPO0FBQ1AsMEJBQTRDO0FBQzVDLHlCQUdPO0FBQ1Asa0NBQXNDO0FBNkV0QyxlQUFzQixn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
480
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgR2VuZXJpY0FzeW5jRnVuY3Rpb24sXG4gIEdlbmVyaWNGdW5jdGlvbixcbiAgR2VuZXJpY1ZvaWRGdW5jdGlvblxufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcblxuaW1wb3J0IHtcbiAgYWJvcnRTaWduYWxBbnksXG4gIGFib3J0U2lnbmFsTmV2ZXIsXG4gIGFib3J0U2lnbmFsVGltZW91dCxcbiAgd2FpdEZvckFib3J0XG59IGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQgfSBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmltcG9ydCB7IGdldFRlcm1pbmF0ZU9uVGltZW91dERlYnVnU3dpdGNoIH0gZnJvbSAnLi9kZWJ1Zy1zd2l0Y2hlcy50cyc7XG5pbXBvcnQge1xuICBnZXRMaWJEZWJ1Z2dlcixcbiAgcHJpbnRXaXRoU3RhY2tUcmFjZVxufSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIEFTWU5DX1dSQVBQRVJfRVJST1JfTUVTU0FHRSxcbiAgQ3VzdG9tU3RhY2tUcmFjZUVycm9yLFxuICBlbWl0QXN5bmNFcnJvckV2ZW50LFxuICBnZXRTdGFja1RyYWNlLFxuICBpc0FzeW5jRXJyb3JJZ25vcmVDb250ZXh0QWN0aXZlLFxuICBwcmludEVycm9yLFxuICBTaWxlbnRFcnJvclxufSBmcm9tICcuL2Vycm9yLnRzJztcbmltcG9ydCB7XG4gIG5vb3AsXG4gIG5vb3BBc3luY1xufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgYXNzZXJ0Tm9uTnVsbGFibGVcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2tlQXN5bmNTYWZlbHlBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYXN5bmNGdW5jdGlvbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSB0eXBlIHJlcHJlc2VudGluZyBhIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgYSB7QGxpbmsgUHJvbWlzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBQcm9taXNlUmVzb2x2ZTxUPiA9IHVuZGVmaW5lZCBleHRlbmRzIFQgPyAodmFsdWU/OiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWRcbiAgOiAodmFsdWU6IFByb21pc2VMaWtlPFQ+IHwgVCkgPT4gdm9pZDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmV0cnlXaXRoVGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYWJvcnQgc2lnbmFsIHRvIGNhbmNlbCB0aGUgcmV0cnkgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiByZXRyeSBhdHRlbXB0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEwMGBcbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXRyeSB0aGUgZnVuY3Rpb24gb24gZXJyb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldHJ5T25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbWF4aW11bSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgb24gcmV0cnlpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gZXJyb3IgaGFuZGxlciB0byBhIHtAbGluayBQcm9taXNlfSB0aGF0IGNhdGNoZXMgYW55IGVycm9ycyBhbmQgZW1pdHMgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRnVuY3Rpb24gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIHRvLlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBvciBlbWl0cyBhc3luYyBlcnJvciBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcihhc3luY0Z1bmN0aW9uOiAoKSA9PiBQcm9taXNlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIC8vIENhcHR1cmUgdGhlIGlnbm9yZSBjb250ZXh0IHN5bmNocm9ub3VzbHkgYXQgc2NoZWR1bGUgdGltZSwgc28gYSBkZWZlcnJlZCByZWplY3Rpb24gc2V0dGxpbmcgYWZ0ZXIgdGhlIHNjb3BlIGV4aXRzIGlzIHN0aWxsIGlnbm9yZWQuXG4gIGNvbnN0IHdhc1NjaGVkdWxlZFdpdGhpbklnbm9yZUNvbnRleHQgPSBpc0FzeW5jRXJyb3JJZ25vcmVDb250ZXh0QWN0aXZlKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXN5bmNGdW5jdGlvbigpO1xuICB9IGNhdGNoIChhc3luY0Vycm9yKSB7XG4gICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgICBjYXVzZTogYXN5bmNFcnJvcixcbiAgICAgIG1lc3NhZ2U6IEFTWU5DX1dSQVBQRVJfRVJST1JfTUVTU0FHRSxcbiAgICAgIHN0YWNrVHJhY2VcbiAgICB9KTtcbiAgICBpZiAoaGFuZGxlU2lsZW50RXJyb3Iod3JhcHBlZEVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbWl0QXN5bmNFcnJvckV2ZW50KHdyYXBwZWRFcnJvciwgd2FzU2NoZWR1bGVkV2l0aGluSWdub3JlQ29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBrZWVwaW5nIG9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVyPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYW5zOiBUW10gPSBbXTtcblxuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oYXJyYXksIGluZGV4KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbSA9IGFycmF5W2luZGV4XSBhcyBUO1xuICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgYW5zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFucztcbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5IGluIHBsYWNlLCBrZWVwaW5nIG9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXJyYXkgaXMgZmlsdGVyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbHRlckluUGxhY2U8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBsZXQgd3JpdGVJbmRleCA9IDA7XG4gIGZvciAobGV0IHJlYWRJbmRleCA9IDA7IHJlYWRJbmRleCA8IGxlbmd0aDsgcmVhZEluZGV4KyspIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oYXJyYXksIHJlYWRJbmRleCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSBhcnJheVtyZWFkSW5kZXhdIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShjdXJyZW50LCByZWFkSW5kZXgsIGFycmF5KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gWWVzLCBpdCBpcyBhIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiwgYnV0IEkgZG9uJ3QgYW4gZWxlZ2FudCB3YXkgdG8gZml4IGl0LlxuICAgICAgYXJyYXlbd3JpdGVJbmRleCsrXSA9IGN1cnJlbnQ7XG4gICAgfVxuICB9XG4gIGFycmF5Lmxlbmd0aCA9IHdyaXRlSW5kZXg7XG59XG5cbi8qKlxuICogTWFwcyBvdmVyIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBhcHBseWluZyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50LCBhbmQgdGhlbiBmbGF0dGVucyB0aGUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIGFycmF5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIgYW5kIGZsYXR0ZW4uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGEgZmxhdHRlbmVkIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmxhdE1hcDxULCBVPihhcnJheTogVFtdLCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPFVbXT4pOiBQcm9taXNlPFVbXT4ge1xuICBjb25zdCBuZXN0ZWRSZXN1bHRzID0gYXdhaXQgYXN5bmNNYXAoYXJyYXksIGNhbGxiYWNrKTtcbiAgcmV0dXJuIG5lc3RlZFJlc3VsdHMuZmxhdCgpO1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIG1hcCBvdmVyLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY01hcDxULCBVPihhcnJheTogVFtdLCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPFU+KTogUHJvbWlzZTxVW10+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tYXJyYXktY2FsbGJhY2stcmVmZXJlbmNlIC0tIFBhc3NpbmcgYGNhbGxiYWNrYCBzdHJhaWdodCB0aHJvdWdoIGlzIHRoZSBjb250cmFjdDogaXQgaXMgZGVjbGFyZWQgYXMgYCh2YWx1ZSwgaW5kZXgsIGFycmF5KWAgc28gdGhhdCBpdCByZWNlaXZlcyBleGFjdGx5IHdoYXQgYEFycmF5I21hcGAgc3VwcGxpZXMuIFdyYXBwaW5nIGl0IHRvIHRha2Ugb25seSB0aGUgdmFsdWUgd291bGQgcXVpZXRseSBzdG9wIGZvcndhcmRpbmcgdGhlIG90aGVyIHR3by5cbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxTZXF1ZW50aWFsbHkoYXJyYXkubWFwKGNhbGxiYWNrKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGEgc3luY2hyb25vdXMgb25lIGJ5IGF1dG9tYXRpY2FsbHkgaGFuZGxpbmcgdGhlIFByb21pc2UgcmVqZWN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gKiBAcGFyYW0gYXN5bmNGdW5jdGlvbiAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBpbiBhIHN5bmNocm9ub3VzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBc3luY1RvU3luYzxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KGFzeW5jRnVuY3Rpb246IEdlbmVyaWNBc3luY0Z1bmN0aW9uPEFyZ3VtZW50cz4sIHN0YWNrVHJhY2U/OiBzdHJpbmcpOiBHZW5lcmljVm9pZEZ1bmN0aW9uPEFyZ3VtZW50cz4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICByZXR1cm4gKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQgPT4ge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHN0YWNrVHJhY2UpO1xuICAgIGNvbnN0IGlubmVyU3RhY2tUcmFjZSA9IGdldFN0YWNrVHJhY2UoMSk7XG4gICAgc3RhY2tUcmFjZSArPSBgXFxuICAgIGF0IC0tLSBjb252ZXJ0QXN5bmNUb1N5bmMgLS0tICgwKVxcbiR7aW5uZXJTdGFja1RyYWNlfWA7XG4gICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gYXN5bmNGdW5jdGlvbiguLi4kYXJndW1lbnRzKSwgc3RhY2tUcmFjZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS5cbiAqIEBwYXJhbSBzeW5jRnVuY3Rpb24gLSBUaGUgc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYW4gYXN5bmNocm9ub3VzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRTeW5jVG9Bc3luYzxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10sIFJlc3VsdD4oc3luY0Z1bmN0aW9uOiBHZW5lcmljRnVuY3Rpb248QXJndW1lbnRzLCBSZXN1bHQ+KTogR2VuZXJpY0FzeW5jRnVuY3Rpb248QXJndW1lbnRzLCBSZXN1bHQ+IHtcbiAgcmV0dXJuIGFzeW5jICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICAgIHJldHVybiBzeW5jRnVuY3Rpb24oLi4uJGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIHNpbGVudCBlcnJvci5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gaGFuZGxlLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZXJyb3IgaXMgYSBzaWxlbnQgZXJyb3IuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtYm9vbGVhbi1uYW1lIC0tIFRoZSBuYW1lIHN0YXRlcyB0aGUgYWN0aW9uOyB0aGUgYm9vbGVhbiBvbmx5IHJlcG9ydHMgd2hldGhlciB0aGUgZXJyb3Igd2FzIGhhbmRsZWQuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlU2lsZW50RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgbGV0IGNhdXNlID0gZXJyb3I7XG4gIHdoaWxlICghKGNhdXNlIGluc3RhbmNlb2YgU2lsZW50RXJyb3IpKSB7XG4gICAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYXVzZSA9IGNhdXNlLmNhdXNlO1xuICB9XG5cbiAgZ2V0TGliRGVidWdnZXIoJ0FzeW5jOmhhbmRsZVNpbGVudEVycm9yJykoZXJyb3IpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBBbHdheXMgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcihwcm9taXNlOiBQcm9taXNlPHVua25vd24+LCBmYWxsYmFja1ZhbHVlPzogdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPjtcbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlOiBUKTogUHJvbWlzZTxUPjtcbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlPzogVCk6IFByb21pc2U8VCB8IHZvaWQ+IHtcbiAgY29uc3QgaWdub3JlRXJyb3JEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzppZ25vcmVFcnJvcicpO1xuICBjb25zdCBzdGFja1RyYWNlID0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZ25vcmVFcnJvckRlYnVnZ2VyKFxuICAgICAgJ0lnbm9yZWQgZXJyb3InLFxuICAgICAgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgbWVzc2FnZTogJ0lnbm9yZWQgZXJyb3InLFxuICAgICAgICBzdGFja1RyYWNlXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIGZhbGxiYWNrVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2VzIGEge0BsaW5rIFByb21pc2V9IGFuZCBzYWZlbHkgaGFuZGxlcyBhbnkgZXJyb3JzIGJ5IGNhdGNoaW5nIHRoZW0gYW5kIGVtaXR0aW5nIGFuIGFzeW5jIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0Z1bmN0aW9uIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBpbnZva2Ugc2FmZWx5LlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jRnVuY3Rpb246ICgpID0+IFByb21pc2FibGU8dW5rbm93bj4sIHN0YWNrVHJhY2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcblxuICBsZXQgcmVzdWx0OiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGFzeW5jRnVuY3Rpb24oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnMgLS0gUmUtcmVqZWN0aW5nIHRoZSBvcmlnaW5hbCBjYXVnaHQgZXJyb3IgYXMtaXMuXG4gICAgbm90aWZ5QXN5bmNPcGVyYXRpb25TdGFydGVkKGFkZEVycm9ySGFuZGxlcigoKSA9PiBQcm9taXNlLnJlamVjdChlcnJvciksIHN0YWNrVHJhY2UpKTtcbiAgfVxuICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIG5vdGlmeUFzeW5jT3BlcmF0aW9uU3RhcnRlZChhZGRFcnJvckhhbmRsZXIoKCkgPT4gcmVzdWx0LCBzdGFja1RyYWNlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2VzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBhZnRlciBhIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHlBZnRlckRlbGF5KHBhcmFtczogSW52b2tlQXN5bmNTYWZlbHlBZnRlckRlbGF5UGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBhc3luY0Z1bmN0aW9uLFxuICAgIGRlbGF5SW5NaWxsaXNlY29uZHMgPSAwXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsID8/IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHBhcmFtcy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBzbGVlcCh7IGFib3J0U2lnbmFsLCBtaWxsaXNlY29uZHM6IGRlbGF5SW5NaWxsaXNlY29uZHMsIHNob3VsZFRocm93T25BYm9ydDogdHJ1ZSB9KTtcbiAgICBhd2FpdCBhc3luY0Z1bmN0aW9uKGFib3J0U2lnbmFsKTtcbiAgfSwgc3RhY2tUcmFjZSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYXN5bmMgZnVuY3Rpb25zIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gYXN5bmNGbnMgLSBUaGUgYXN5bmMgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBhc3luYyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHk8VD4oYXN5bmNGbnM6ICgoKSA9PiBQcm9taXNhYmxlPFQ+KVtdKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGZvciAoY29uc3QgYXN5bmNGdW5jdGlvbiBvZiBhc3luY0Zucykge1xuICAgIHJlc3VsdHMucHVzaChhd2FpdCBhc3luY0Z1bmN0aW9uKCkpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHByb21pc2VzIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzZXMgLSBUaGUgcHJvbWlzZXMgdG8gZXhlY3V0ZSBzZXF1ZW50aWFsbHkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIHByb21pc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbFNlcXVlbnRpYWxseTxUPihwcm9taXNlczogUHJvbWlzYWJsZTxUPltdKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxBc3luY0Zuc1NlcXVlbnRpYWxseShwcm9taXNlcy5tYXAoKHByb21pc2UpID0+ICgpID0+IHByb21pc2UpKTtcbn1cblxuY29uc3QgdGVybWluYXRlUmV0cnlFcnJvcnMgPSBuZXcgV2Vha1NldDxFcnJvcj4oKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmV0cnlXaXRoVGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlXaXRoVGltZW91dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB0aW1lb3V0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSB0aW1lb3V0IGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBvblRpbWVvdXQ/OiAoY29udGV4dDogVGltZW91dENvbnRleHQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJldHJ5IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSByZXRyeU9wdGlvbnM/OiBSZXRyeU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUcmFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcnVuV2l0aFRpbWVvdXR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVzdWx0IC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bldpdGhUaW1lb3V0UGFyYW1zPFJlc3VsdD4ge1xuICAvKipcbiAgICogVGhlIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHRpbWVvdXQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9uVGltZW91dD86IChjb250ZXh0OiBUaW1lb3V0Q29udGV4dCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2xlZXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsZWVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBtaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25BYm9ydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udGV4dCBwcm92aWRlZCB0byB0aGUgdGltZW91dCBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVvdXRDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIG9wZXJhdGlvbiBzdGFydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAgICovXG4gIG9uT3BlcmF0aW9uQ29tcGxldGVkOiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGVybWluYXRlcyB0aGUgb3BlcmF0aW9uIHRoYXQgdGltZWQgb3V0LlxuICAgKi9cbiAgdGVybWluYXRlT3BlcmF0aW9uOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0aW1lb3V0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lb3V0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25BYm9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lb3V0IHBlcmlvZCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDaGFpbnMgYSBwcm9taXNlIHdpdGggYW5vdGhlciBwcm9taXNlLlxuICpcbiAqIEBwYXJhbSBjaGFpblByb21pc2UgLSBSZXByZXNlbnRzIHRoZSBjaGFpbmVkIHByb21pc2UuXG4gKiBAcGFyYW0gcHJvbWlzYWJsZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGNoYWluLlxuICogQHJldHVybnMgQ2hhaW5lZCBwcm9taXNlIG9yIGBudWxsYCBpZiBubyBhc3luYyBsb2dpYyBpcyBjaGFpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhaW4oY2hhaW5Qcm9taXNlOiBudWxsIHwgUHJvbWlzZTx2b2lkPiwgcHJvbWlzYWJsZUZ1bmN0aW9uOiAoKSA9PiBudWxsIHwgUHJvbWlzYWJsZTx2b2lkPik6IG51bGwgfCBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5leHRDaGFpblByb21pc2UgPSBjaGFpblByb21pc2U7XG4gIGlmIChjaGFpblByb21pc2UpIHtcbiAgICBuZXh0Q2hhaW5Qcm9taXNlID0gY2hhaW5Qcm9taXNlLnRoZW4oKCkgPT4gcHJvbWlzYWJsZUZ1bmN0aW9uKCkgPz8gdW5kZWZpbmVkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9taXNhYmxlID0gcHJvbWlzYWJsZUZ1bmN0aW9uKCk7XG4gICAgaWYgKHByb21pc2FibGUpIHtcbiAgICAgIG5leHRDaGFpblByb21pc2UgPSBwcm9taXNhYmxlIGluc3RhbmNlb2YgUHJvbWlzZSA/IHByb21pc2FibGUgYXMgUHJvbWlzZTx2b2lkPiA6IFByb21pc2UucmVzb2x2ZShwcm9taXNhYmxlKTtcbiAgICB9XG4gIH1cblxuICBuZXh0Q2hhaW5Qcm9taXNlPy5jYXRjaChub29wKTtcbiAgcmV0dXJuIG5leHRDaGFpblByb21pc2U7XG59XG5cbi8qKlxuICogR2V0cyB3aGV0aGVyIGEge0BsaW5rIHJ1bldpdGhUaW1lb3V0fSBjYWxsIHdpdGhvdXQgaXRzIG93biBgb25UaW1lb3V0YCB0ZXJtaW5hdGVzIHRoZSBvcGVyYXRpb24gd2hlbiBpdCB0aW1lcyBvdXQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBnZXRUZXJtaW5hdGVPblRpbWVvdXREZWJ1Z1N3aXRjaH1gKCkuaXNFbmFibGVkKClgLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCAodGhlIGRlZmF1bHQpIGlmIGEgdGltZWQtb3V0IG9wZXJhdGlvbiBpcyB0ZXJtaW5hdGVkLCBgZmFsc2VgIGlmIGl0IGlzIGxlZnQgcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVybWluYXRpb25PblRpbWVvdXRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0VGVybWluYXRlT25UaW1lb3V0RGVidWdTd2l0Y2goKS5pc0VuYWJsZWQoKTtcbn1cblxuLyoqXG4gKiBNYXJrcyBhbiBlcnJvciB0byB0ZXJtaW5hdGUgcmV0cnkgbG9naWMuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIG1hcmsgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya3NBc1Rlcm1pbmF0ZVJldHJ5KGVycm9yOiBFcnJvcik6IHZvaWQge1xuICB0ZXJtaW5hdGVSZXRyeUVycm9ycy5hZGQoZXJyb3IpO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgbmV2ZXIgZW5kcy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV2ZXJFbmRzKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIG5vb3AoKTtcbiAgfSk7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZDsgdGhlIGF3YWl0IGFib3ZlIG5ldmVyIHJlc29sdmVzLiAqL1xuICBhc3NlcnQoZmFsc2UsICdTaG91bGQgbmV2ZXIgaGFwcGVuJyk7XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCB0aWNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgdGljayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuZXh0VGlja0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIG5hdGl2ZSBwcm9taXNhYmxlLCBjb252ZXJ0aW5nIHtAbGluayBQcm9taXNlTGlrZX0gKGFrYSBUaGVuYWJsZSkgdG8gYSBuYXRpdmUge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSBwcm9taXNhYmxlIC0gVGhlIHByb21pc2FibGUgdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMgVGhlIHZhbHVlIGl0c2VsZiBvciBhIG5hdGl2ZSB7QGxpbmsgUHJvbWlzZX0gaWYgdGhlIHZhbHVlIGlzIGEge0BsaW5rIFByb21pc2VMaWtlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVByb21pc2FibGU8VD4ocHJvbWlzYWJsZTogUHJvbWlzYWJsZTxUPik6IFByb21pc2U8VD4gfCBUIHtcbiAgaWYgKCFwcm9taXNhYmxlKSB7XG4gICAgcmV0dXJuIHByb21pc2FibGU7XG4gIH1cblxuICBpZiAocHJvbWlzYWJsZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICByZXR1cm4gcHJvbWlzYWJsZSBhcyBQcm9taXNlPFQ+O1xuICB9XG5cbiAgcmV0dXJuIChwcm9taXNhYmxlIGFzIFBhcnRpYWw8UHJvbWlzZUxpa2U8VD4+KS50aGVuID8gUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpIDogKHByb21pc2FibGUgYXMgVCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCBxdWV1ZSBtaWNyb3Rhc2suXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBxdWV1ZSBtaWNyb3Rhc2sgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVldWVNaWNyb3Rhc2tBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lLlxuICpcbiAqIEBwYXJhbSBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSBmYWxsYmFjayB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byByZXNvbHZlIHRoZSBwcm9taXNlIGlmIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGRvZXMgbm90IGZpcmUgKGUuZy4gdGhlIHdpbmRvdyBpcyBub3QgYWN0aXZlKS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGAxMDBgIG1pbGxpc2Vjb25kcy4gVXNlIGAwYCB0byBkaXNhYmxlIHRoZSBmYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcmVxdWVzdCBhbmltYXRpb24gZnJhbWUgaXMgYXZhaWxhYmxlIChvciB3aGVuIHRoZSBmYWxsYmFjayB0aW1lIGlzIHJlYWNoZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmMoZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmNQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgREVGQVVMVF9GQUxMQkFDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbiAgZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz89IERFRkFVTFRfRkFMTEJBQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgcmV0dXJuIFByb21pc2UucmFjZShbcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmNQcm9taXNlLCBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA+IDAgPyBzbGVlcCh7IG1pbGxpc2Vjb25kczogZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSkgOiBuZXZlckVuZHMoKV0pO1xufVxuXG4vKipcbiAqIFJldHJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVudGlsIGl0IHJldHVybnMgYHRydWVgIG9yIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIG9yIHJlamVjdHMgd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV0cnlXaXRoVGltZW91dChwYXJhbXM6IFJldHJ5V2l0aFRpbWVvdXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOnJldHJ5V2l0aFRpbWVvdXQnKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHBhcmFtcy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kczogMTAwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDUwMDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucGFyYW1zLnJldHJ5T3B0aW9ucyB9O1xuICBmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcblxuICBhd2FpdCBydW5XaXRoVGltZW91dChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UnVuV2l0aFRpbWVvdXRQYXJhbXM8dm9pZD4+KHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLCByZXRyeUZ1bmN0aW9uOiBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24gfSxcbiAgICBvblRpbWVvdXQ6IHBhcmFtcy5vblRpbWVvdXQsXG4gICAgYXN5bmMgb3BlcmF0aW9uRnVuY3Rpb24oYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBjb21iaW5lZEFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsKTtcbiAgICAgIGNvbWJpbmVkQWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgIHdoaWxlICghY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgbGV0IGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24oY29tYmluZWRBYm9ydFNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbnNpZGUgYGZuKClgLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgICAgICAgaWYgKGNvbWJpbmVkQWJvcnRTaWduYWwuYWJvcnRlZCB8fCAhZnVsbE9wdGlvbnMuc2hvdWxkUmV0cnlPbkVycm9yIHx8IHRlcm1pbmF0ZVJldHJ5RXJyb3JzLmhhcyhlcnJvciBhcyBFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdyZXRyeVdpdGhUaW1lb3V0IGZhaWxlZCcsXG4gICAgICAgICAgICAgIHN0YWNrVHJhY2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmludEVycm9yKGVycm9yKTtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgUmV0cnkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAke1N0cmluZyhhdHRlbXB0KX0gYXR0ZW1wdHNgLFxuICAgICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAgICRhcmd1bWVudHM6IFt7XG4gICAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgICAgbWVzc2FnZTogYFJldHJ5IGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9IGNvbXBsZXRlZCB1bnN1Y2Nlc3NmdWxseS4gVHJ5aW5nIGFnYWluIGluICR7U3RyaW5nKGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsXG4gICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBzbGVlcCh7IGFib3J0U2lnbmFsLCBtaWxsaXNlY29uZHM6IGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLFxuICAgIHN0YWNrVHJhY2UsXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBmdWxsT3B0aW9ucy50aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQuIElmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgdGltZWQgb3V0LlxuICpcbiAqIFdpdGhvdXQgYW4gYG9uVGltZW91dGAsIGEgdGltZWQtb3V0IGZ1bmN0aW9uIGlzIHRlcm1pbmF0ZWQsIHVubGVzcyB0aGUge0BsaW5rIGdldFRlcm1pbmF0ZU9uVGltZW91dERlYnVnU3dpdGNofSBkZWJ1ZyBzd2l0Y2ggaXMgb2ZmLFxuICogaW4gd2hpY2ggY2FzZSBpdCBpcyBhbGxvd2VkIHRvIHJ1biBpbmRlZmluaXRlbHkuXG4gKlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IGZyb20gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvciByZWplY3RzIGlmIGl0IHRpbWVzIG91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhUaW1lb3V0PFJlc3VsdD4ocGFyYW1zOiBSdW5XaXRoVGltZW91dFBhcmFtczxSZXN1bHQ+KTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHBhcmFtcy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIGNvbnN0IHJ1bkFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBsZXQgcmVzdWx0OiBudWxsIHwgUmVzdWx0ID0gbnVsbDtcbiAgbGV0IGhhc1Jlc3VsdCA9IGZhbHNlO1xuICBsZXQgaXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgY29uc3QgcnVuV2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dCcpO1xuICBjb25zdCBvblRpbWVvdXQgPSBwYXJhbXMub25UaW1lb3V0ID8/IGRlZmF1bHRPblRpbWVvdXQ7XG5cbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtydW4oKSwgaW5uZXJUaW1lb3V0KCldKTtcbiAgLy8gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBydW4gZmluaXNoZWQgb24gaXRzIG93bi4gV2hlbiB0aGUgdGltZW91dCB0ZXJtaW5hdGVkIGl0LCB0aGVcbiAgLy8gb3BlcmF0aW9uIG1pZ2h0IHN0aWxsIHJlc29sdmUgYWZ0ZXJ3YXJkcyAoZS5nLiBhIHJldHJ5IGxvb3AgdGhhdCBleGl0cyBvbiBhYm9ydCksIGJ1dCB0aGF0IHZhbHVlXG4gIC8vIGlzIHBhc3QgdGhlIGRlYWRsaW5lIGFuZCBtdXN0IGJlIHRyZWF0ZWQgYXMgYSBmYWlsdXJlLCBub3QgYSBzdWNjZXNzLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBCb3RoIG1pZ2h0IGNoYW5nZSBpbnNpZGUgYHJ1bigpYC9gaW5uZXJUaW1lb3V0KClgLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChoYXNSZXN1bHQgJiYgIXJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybiByZXN1bHQgYXMgUmVzdWx0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgY2F1c2U6IHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uLFxuICAgIG1lc3NhZ2U6ICdSdW4gd2l0aCB0aW1lb3V0IGZhaWxlZCcsXG4gICAgc3RhY2tUcmFjZVxuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbihydW5BYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC50cnVuYyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICAgJGFyZ3VtZW50czogW3tcbiAgICAgICAgICBjb250ZXh0OiBwYXJhbXMuY29udGV4dCxcbiAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICAgIH1dLFxuICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiBydW5XaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICBtZXNzYWdlOiBgRXhlY3V0aW9uIHRpbWU6ICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCxcbiAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgfSk7XG4gICAgICBoYXNSZXN1bHQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBydW5BYm9ydENvbnRyb2xsZXIuYWJvcnQoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICB0aW1lb3V0QWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignQ29tcGxldGVkJykpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGlubmVyVGltZW91dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzbGVlcCh7IGFib3J0U2lnbmFsOiB0aW1lb3V0QWJvcnRDb250cm9sbGVyLnNpZ25hbCwgbWlsbGlzZWNvbmRzOiBwYXJhbXMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pO1xuXG4gICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC50cnVuYyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICBjb250ZXh0OiBwYXJhbXMuY29udGV4dCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgIH1dLFxuICAgICAgZGVidWdnZXJJbnN0YW5jZTogcnVuV2l0aFRpbWVvdXREZWJ1Z2dlcixcbiAgICAgIG1lc3NhZ2U6IGBUaW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgLFxuICAgICAgc3RhY2tUcmFjZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdGltZW91dENvbnRleHQ6IFRpbWVvdXRDb250ZXh0ID0gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFRpbWVvdXRDb250ZXh0Pih7XG4gICAgICBkdXJhdGlvbixcbiAgICAgIG9uT3BlcmF0aW9uQ29tcGxldGVkKGNhbGxiYWNrKSB7XG4gICAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgY2FsbGJhY2spO1xuICAgICAgfSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLFxuICAgICAgdGVybWluYXRlT3BlcmF0aW9uKCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgVGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCk7XG4gICAgICAgIHJ1bkFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuYWJvcnQoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgb25UaW1lb3V0KHRpbWVvdXRDb250ZXh0KTtcbiAgICBhd2FpdCB3YWl0Rm9yQWJvcnQodGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgc2V0IGltbWVkaWF0ZSBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRJbW1lZGlhdGVBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2V0cyB3aGV0aGVyIGEge0BsaW5rIHJ1bldpdGhUaW1lb3V0fSBjYWxsIHdpdGhvdXQgaXRzIG93biBgb25UaW1lb3V0YCB0ZXJtaW5hdGVzIHRoZSBvcGVyYXRpb24gd2hlbiBpdCB0aW1lcyBvdXQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBnZXRUZXJtaW5hdGVPblRpbWVvdXREZWJ1Z1N3aXRjaH1gKCkuc2V0RW5hYmxlZChpc0VuYWJsZWQpYC5cbiAqXG4gKiBAcGFyYW0gaXNFbmFibGVkIC0gYHRydWVgIHRvIHRlcm1pbmF0ZSBhIHRpbWVkLW91dCBvcGVyYXRpb24sIGBmYWxzZWAgdG8gbGVhdmUgaXQgcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRlcm1pbmF0aW9uT25UaW1lb3V0RW5hYmxlZChpc0VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgZ2V0VGVybWluYXRlT25UaW1lb3V0RGVidWdTd2l0Y2goKS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gZGVsYXkgLSBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFRpbWVvdXRBc3luYyhkZWxheT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKHBhcmFtczogU2xlZXBQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIG1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgd2FpdEZvckFib3J0KGFib3J0U2lnbmFsQW55KGFib3J0U2lnbmFsLCBhYm9ydFNpZ25hbFRpbWVvdXQobWlsbGlzZWNvbmRzKSkpO1xuICBpZiAoc2hvdWxkVGhyb3dPbkFib3J0KSB7XG4gICAgYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgcGVyaW9kLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBhbHdheXMgcmVqZWN0cyB3aXRoIGEgdGltZW91dCBlcnJvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRpbWVvdXQocGFyYW1zOiBUaW1lb3V0UGFyYW1zKTogUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgc2hvdWxkVGhyb3dPbkFib3J0LFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBzbGVlcChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2xlZXBQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBtaWxsaXNlY29uZHM6IHRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSkpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gYW4gYXJyYXkgYnkgY29uc3VtaW5nIGFsbCBpdHMgZWxlbWVudHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqIEBwYXJhbSBpdGVyIC0gVGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYXJyYXk6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcikge1xuICAgIGFycmF5LnB1c2goaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0T25UaW1lb3V0KGNvbnRleHQ6IFRpbWVvdXRDb250ZXh0KTogdm9pZCB7XG4gIGlmIChnZXRUZXJtaW5hdGVPblRpbWVvdXREZWJ1Z1N3aXRjaCgpLmlzRW5hYmxlZCgpKSB7XG4gICAgY29udGV4dC50ZXJtaW5hdGVPcGVyYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQnKShcbiAgICBgVGltZW91dCB0ZXJtaW5hdGlvbiBpcyBzd2l0Y2hlZCBvZmYsIHNvIHRoZSBvcGVyYXRpb24gJyR7Y29udGV4dC5vcGVyYXRpb25OYW1lfScga2VlcHMgcnVubmluZyBhZnRlciAke1N0cmluZyhjb250ZXh0LmR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYFxuICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSw4QkFLTztBQUNQLGtDQUE0QztBQUM1Qyw0QkFBaUQ7QUFDakQsbUJBR087QUFDUCxtQkFRTztBQUNQLHNCQUdPO0FBQ1AsMEJBQTRDO0FBQzVDLHlCQUdPO0FBNkVQLGVBQXNCLGdCQUFnQixlQUF1QyxZQUFvQztBQUMvRyxxQkFBZSw0QkFBYyxDQUFDO0FBRTlCLFFBQU0sc0NBQWtDLDhDQUFnQztBQUN4RSxNQUFJO0FBQ0YsVUFBTSxjQUFjO0FBQUEsRUFDdEIsU0FBUyxZQUFZO0FBQ25CLFVBQU0sZUFBZSxJQUFJLG1DQUFzQjtBQUFBLE1BQzdDLE9BQU87QUFBQSxNQUNQLFNBQVM7QUFBQSxNQUNUO0FBQUEsSUFDRixDQUFDO0FBQ0QsUUFBSSxrQkFBa0IsWUFBWSxHQUFHO0FBQ25DO0FBQUEsSUFDRjtBQUNBLDBDQUFvQixjQUFjLCtCQUErQjtBQUFBLEVBQ25FO0FBQ0Y7QUFVQSxlQUFzQixZQUFlLE9BQVksV0FBdUY7QUFDdEksUUFBTSxNQUFXLENBQUM7QUFFbEIsUUFBTSxTQUFTLE1BQU07QUFDckIsV0FBUyxRQUFRLEdBQUcsUUFBUSxRQUFRLFNBQVM7QUFDM0MsUUFBSSxDQUFDLE9BQU8sT0FBTyxPQUFPLEtBQUssR0FBRztBQUNoQztBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sTUFBTSxLQUFLO0FBQ3hCLFFBQUks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
@@ -324,8 +324,7 @@ export declare function chain(chainPromise: null | Promise<void>, promisableFunc
324
324
  /**
325
325
  * Gets whether a {@link runWithTimeout} call without its own `onTimeout` terminates the operation when it times out.
326
326
  *
327
- * The value is app-wide: it lives in the shared state, so every copy of this library loaded in one realm, such as
328
- * the copy each Obsidian plugin bundles, reads the same value.
327
+ * @deprecated Use {@link getTerminateOnTimeoutDebugSwitch}`().isEnabled()`.
329
328
  *
330
329
  * @returns `true` (the default) if a timed-out operation is terminated, `false` if it is left running.
331
330
  */
@@ -380,7 +379,7 @@ export declare function retryWithTimeout(params: RetryWithTimeoutParams): Promis
380
379
  /**
381
380
  * Executes a function with a timeout. If the function does not complete within the specified time, it is considered to have timed out.
382
381
  *
383
- * Without an `onTimeout`, a timed-out function is terminated, unless {@link setTerminationOnTimeoutEnabled} switched that off app-wide,
382
+ * Without an `onTimeout`, a timed-out function is terminated, unless the {@link getTerminateOnTimeoutDebugSwitch} debug switch is off,
384
383
  * in which case it is allowed to run indefinitely.
385
384
  *
386
385
  * @typeParam Result - The type of the result from the asynchronous function.
@@ -397,9 +396,7 @@ export declare function setImmediateAsync(): Promise<void>;
397
396
  /**
398
397
  * Sets whether a {@link runWithTimeout} call without its own `onTimeout` terminates the operation when it times out.
399
398
  *
400
- * Switch it off while debugging, so an operation paused on a breakpoint is not terminated under the debugger. The
401
- * timeout is still logged through the `Async:runWithTimeout` debugger. The value is app-wide, see
402
- * {@link isTerminationOnTimeoutEnabled}.
399
+ * @deprecated Use {@link getTerminateOnTimeoutDebugSwitch}`().setEnabled(isEnabled)`.
403
400
  *
404
401
  * @param isEnabled - `true` to terminate a timed-out operation, `false` to leave it running.
405
402
  */
@@ -0,0 +1,125 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var debug_switches_exports = {};
25
+ __export(debug_switches_exports, {
26
+ getDebugSwitch: () => getDebugSwitch,
27
+ getDebugSwitches: () => getDebugSwitches,
28
+ getTerminateOnTimeoutDebugSwitch: () => getTerminateOnTimeoutDebugSwitch,
29
+ onDebugSwitchChanged: () => onDebugSwitchChanged,
30
+ registerDebugSwitch: () => registerDebugSwitch,
31
+ setDebugSwitch: () => setDebugSwitch
32
+ });
33
+ module.exports = __toCommonJS(debug_switches_exports);
34
+ var import_disposable = require('./disposable.cjs');
35
+ var import_typescript_lib_state = require('./typescript-lib-state.cjs');
36
+ const LEGACY_STATE_KEYS = {
37
+ "typescript-lib:terminate-on-timeout": "isTerminationOnTimeoutEnabled"
38
+ };
39
+ const TERMINATE_ON_TIMEOUT_DEFINITION = {
40
+ description: "Terminate an operation that times out. Switch it off so an operation paused on a breakpoint keeps running.",
41
+ id: "typescript-lib:terminate-on-timeout",
42
+ isEnabledByDefault: true,
43
+ name: "Terminate operations on timeout"
44
+ };
45
+ const BUILT_IN_DEFINITIONS = [TERMINATE_ON_TIMEOUT_DEFINITION];
46
+ function getDebugSwitch(id) {
47
+ const definition = getDefinitions().get(id);
48
+ return definition ? createHandle(definition) : void 0;
49
+ }
50
+ function getDebugSwitches() {
51
+ return [...getDefinitions().values()].sort((a, b) => a.id.localeCompare(b.id)).map((definition) => createHandle(definition));
52
+ }
53
+ function getTerminateOnTimeoutDebugSwitch() {
54
+ return registerDebugSwitch(TERMINATE_ON_TIMEOUT_DEFINITION);
55
+ }
56
+ function onDebugSwitchChanged(listener) {
57
+ const listeners = getListeners();
58
+ listeners.add(listener);
59
+ return new import_disposable.CallbackDisposable({
60
+ callback() {
61
+ listeners.delete(listener);
62
+ }
63
+ });
64
+ }
65
+ function registerDebugSwitch(definition) {
66
+ const definitions = getDefinitions();
67
+ let registeredDefinition = definitions.get(definition.id);
68
+ if (!registeredDefinition) {
69
+ registeredDefinition = {
70
+ description: definition.description,
71
+ id: definition.id,
72
+ isEnabledByDefault: definition.isEnabledByDefault,
73
+ name: definition.name
74
+ };
75
+ definitions.set(definition.id, registeredDefinition);
76
+ }
77
+ return createHandle(registeredDefinition);
78
+ }
79
+ function setDebugSwitch(id, isEnabled) {
80
+ const definition = getDefinitions().get(id);
81
+ const wrapper = getValueWrapper(id, definition?.isEnabledByDefault ?? !isEnabled);
82
+ if (wrapper.value === isEnabled) {
83
+ return;
84
+ }
85
+ wrapper.value = isEnabled;
86
+ for (const listener of getListeners()) {
87
+ listener({ id, isEnabled });
88
+ }
89
+ }
90
+ function createHandle(definition) {
91
+ return {
92
+ ...definition,
93
+ isEnabled() {
94
+ return getValueWrapper(definition.id, definition.isEnabledByDefault).value;
95
+ },
96
+ setEnabled(isEnabled) {
97
+ setDebugSwitch(definition.id, isEnabled);
98
+ }
99
+ };
100
+ }
101
+ function getDefinitions() {
102
+ const definitions = (0, import_typescript_lib_state.getTypescriptLibState)("debugSwitchDefinitions", /* @__PURE__ */ new Map()).value;
103
+ for (const definition of BUILT_IN_DEFINITIONS) {
104
+ if (!definitions.has(definition.id)) {
105
+ definitions.set(definition.id, definition);
106
+ }
107
+ }
108
+ return definitions;
109
+ }
110
+ function getListeners() {
111
+ return (0, import_typescript_lib_state.getTypescriptLibState)("debugSwitchListeners", /* @__PURE__ */ new Set()).value;
112
+ }
113
+ function getValueWrapper(id, isEnabledByDefault) {
114
+ return (0, import_typescript_lib_state.getTypescriptLibState)(LEGACY_STATE_KEYS[id] ?? `debugSwitch:${id}`, isEnabledByDefault);
115
+ }
116
+ // Annotate the CommonJS export names for ESM import in node:
117
+ 0 && (module.exports = {
118
+ getDebugSwitch,
119
+ getDebugSwitches,
120
+ getTerminateOnTimeoutDebugSwitch,
121
+ onDebugSwitchChanged,
122
+ registerDebugSwitch,
123
+ setDebugSwitch
124
+ });
125
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlYnVnLXN3aXRjaGVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSByZWdpc3RyeSBvZiBkZWJ1ZyBzd2l0Y2hlczogbmFtZWQsIGFwcC13aWRlIGJvb2xlYW5zIHRoYXQgY2hhbmdlIGJlaGF2aW9yIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBBIGRlYnVnIG5hbWVzcGFjZSAoc2VlIGBkZWJ1Zy50c2ApIGNvbnRyb2xzIGxvZ2dpbmcgb25seS4gQmVoYXZpb3IgdGhhdCBzaG91bGQgZGlmZmVyIHdoaWxlIGRlYnVnZ2luZywgc3VjaCBhc1xuICogbm90IHRlcm1pbmF0aW5nIGFuIG9wZXJhdGlvbiBwYXVzZWQgb24gYSBicmVha3BvaW50LCBpcyBhIGRlYnVnIHN3aXRjaCBpbnN0ZWFkLCBzbyB0dXJuaW5nIGxvZ2dpbmcgb24gbmV2ZXJcbiAqIGNoYW5nZXMgd2hhdCB0aGUgY29kZSBkb2VzLlxuICpcbiAqIFRoZSBkZWZpbml0aW9ucywgdGhlIHZhbHVlcyBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnMgYWxsIGxpdmUgaW4gdGhlIHNoYXJlZCBzdGF0ZSBiYWcgKGB0eXBlc2NyaXB0LWxpYi1zdGF0ZS50c2ApXG4gKiBhcyBwbGFpbiBkYXRhLCBzbyBldmVyeSBjb3B5IG9mIHRoaXMgbGlicmFyeSBsb2FkZWQgaW4gb25lIHJlYWxtLCBzdWNoIGFzIHRoZSBjb3B5IGVhY2ggT2JzaWRpYW4gcGx1Z2luIGJ1bmRsZXMsXG4gKiBzZWVzIG9uZSB2YWx1ZSBwZXIgc3dpdGNoLiBBIHRvb2wgc3VjaCBhcyBhIGRlYnVnLXNldHRpbmdzIFVJIGxpc3RzIGV2ZXJ5IHJlZ2lzdGVyZWQgc3dpdGNoIHdpdGhcbiAqIHtAbGluayBnZXREZWJ1Z1N3aXRjaGVzfSBhbmQgbmVlZHMgbm8gY2hhbmdlIHdoZW4gYSBsaWJyYXJ5IG9yIHBsdWdpbiBhZGRzIG9uZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERpc3Bvc2FibGVFeCB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlV3JhcHBlciB9IGZyb20gJy4vdmFsdWUtd3JhcHBlci50cyc7XG5cbmltcG9ydCB7IENhbGxiYWNrRGlzcG9zYWJsZSB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBnZXRUeXBlc2NyaXB0TGliU3RhdGUgfSBmcm9tICcuL3R5cGVzY3JpcHQtbGliLXN0YXRlLnRzJztcblxuLyoqXG4gKiBBIGhhbmRsZSB0byBhIHJlZ2lzdGVyZWQgZGVidWcgc3dpdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlYnVnU3dpdGNoIGV4dGVuZHMgRGVidWdTd2l0Y2hEZWZpbml0aW9uIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3dpdGNoIGlzIG9uLlxuICAgKi9cbiAgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgbm90aWZ5aW5nIHRoZSB7QGxpbmsgb25EZWJ1Z1N3aXRjaENoYW5nZWR9IGxpc3RlbmVycyBpZiBpdCBjaGFuZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0gaXNFbmFibGVkIC0gVGhlIG5ldyB2YWx1ZS5cbiAgICovXG4gIHNldEVuYWJsZWQ6IChpc0VuYWJsZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQSBjaGFuZ2Ugb2YgYSBkZWJ1ZyBzd2l0Y2gncyB2YWx1ZSwgcGFzc2VkIHRvIGFuIHtAbGluayBvbkRlYnVnU3dpdGNoQ2hhbmdlZH0gbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVidWdTd2l0Y2hDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBzd2l0Y2ggdGhhdCBjaGFuZ2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5ldyB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2Yge0BsaW5rIG9uRGVidWdTd2l0Y2hDaGFuZ2VkfS5cbiAqL1xuZXhwb3J0IHR5cGUgRGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lciA9IChjaGFuZ2U6IERlYnVnU3dpdGNoQ2hhbmdlKSA9PiB2b2lkO1xuXG4vKipcbiAqIFRoZSBkZWZpbml0aW9uIG9mIGEgZGVidWcgc3dpdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlYnVnU3dpdGNoRGVmaW5pdGlvbiB7XG4gIC8qKlxuICAgKiBXaGF0IHRoZSBzd2l0Y2ggZG9lcywgZm9yIGEgc2V0dGluZ3MgVUkuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkLCBuYW1lc3BhY2VkIGJ5IHRoZSBsaWJyYXJ5IG9yIHBsdWdpbiB0aGF0IG93bnMgdGhlIHN3aXRjaCwgZS5nLlxuICAgKiBgdHlwZXNjcmlwdC1saWI6dGVybWluYXRlLW9uLXRpbWVvdXRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzd2l0Y2ggaGFzIHVudGlsIHNvbWV0aGluZyBzZXRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbmFibGVkQnlEZWZhdWx0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSwgZm9yIGEgc2V0dGluZ3MgVUkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8vIEEgc3dpdGNoIHdob3NlIHZhbHVlIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkga2VwdCB1bmRlciBpdHMgb3duIHNoYXJlZC1zdGF0ZSBrZXkga2VlcHMgdGhhdCBrZXksIHNvIGFcbi8vIGNvcHkgb2YgdGhhdCB2ZXJzaW9uIGxvYWRlZCBiZXNpZGUgdGhpcyBvbmUgc3RpbGwgcmVhZHMgYW5kIHdyaXRlcyB0aGUgc2FtZSB2YWx1ZS5cbmNvbnN0IExFR0FDWV9TVEFURV9LRVlTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgJ3R5cGVzY3JpcHQtbGliOnRlcm1pbmF0ZS1vbi10aW1lb3V0JzogJ2lzVGVybWluYXRpb25PblRpbWVvdXRFbmFibGVkJ1xufTtcblxuY29uc3QgVEVSTUlOQVRFX09OX1RJTUVPVVRfREVGSU5JVElPTjogRGVidWdTd2l0Y2hEZWZpbml0aW9uID0ge1xuICBkZXNjcmlwdGlvbjogJ1Rlcm1pbmF0ZSBhbiBvcGVyYXRpb24gdGhhdCB0aW1lcyBvdXQuIFN3aXRjaCBpdCBvZmYgc28gYW4gb3BlcmF0aW9uIHBhdXNlZCBvbiBhIGJyZWFrcG9pbnQga2VlcHMgcnVubmluZy4nLFxuICBpZDogJ3R5cGVzY3JpcHQtbGliOnRlcm1pbmF0ZS1vbi10aW1lb3V0JyxcbiAgaXNFbmFibGVkQnlEZWZhdWx0OiB0cnVlLFxuICBuYW1lOiAnVGVybWluYXRlIG9wZXJhdGlvbnMgb24gdGltZW91dCdcbn07XG5cbi8vIFRoaXMgbGlicmFyeSdzIG93biBzd2l0Y2hlcywgYWx3YXlzIHJlZ2lzdGVyZWQsIHNvIGEgc2V0dGluZ3MgVUkgbGlzdHMgdGhlbSBiZWZvcmUgYW55IGNvZGUgdGhhdCByZWFkcyB0aGVtIHJ1bnMuXG5jb25zdCBCVUlMVF9JTl9ERUZJTklUSU9OUzogcmVhZG9ubHkgRGVidWdTd2l0Y2hEZWZpbml0aW9uW10gPSBbVEVSTUlOQVRFX09OX1RJTUVPVVRfREVGSU5JVElPTl07XG5cbi8qKlxuICogR2V0cyBhIHJlZ2lzdGVyZWQgZGVidWcgc3dpdGNoLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3dpdGNoLlxuICogQHJldHVybnMgVGhlIHN3aXRjaCwgb3IgYHVuZGVmaW5lZGAgaWYgbm8gc3dpdGNoIHdpdGggdGhhdCBpZCBpcyByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdTd2l0Y2goaWQ6IHN0cmluZyk6IERlYnVnU3dpdGNoIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb25zKCkuZ2V0KGlkKTtcbiAgcmV0dXJuIGRlZmluaXRpb24gPyBjcmVhdGVIYW5kbGUoZGVmaW5pdGlvbikgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0cyBldmVyeSByZWdpc3RlcmVkIGRlYnVnIHN3aXRjaCwgc29ydGVkIGJ5IGlkLlxuICpcbiAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIHN3aXRjaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdTd2l0Y2hlcygpOiBEZWJ1Z1N3aXRjaFtdIHtcbiAgcmV0dXJuIFsuLi5nZXREZWZpbml0aW9ucygpLnZhbHVlcygpXVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCkpXG4gICAgLm1hcCgoZGVmaW5pdGlvbikgPT4gY3JlYXRlSGFuZGxlKGRlZmluaXRpb24pKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBkZWJ1ZyBzd2l0Y2ggdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBgcnVuV2l0aFRpbWVvdXRgIGNhbGwgd2l0aG91dCBpdHMgb3duIGBvblRpbWVvdXRgIHRlcm1pbmF0ZXMgdGhlXG4gKiBvcGVyYXRpb24gd2hlbiBpdCB0aW1lcyBvdXQuXG4gKlxuICogSXRzIGlkIGlzIGB0eXBlc2NyaXB0LWxpYjp0ZXJtaW5hdGUtb24tdGltZW91dGAgYW5kIGl0IGlzIG9uIGJ5IGRlZmF1bHQuIFN3aXRjaCBpdCBvZmYgd2hpbGUgZGVidWdnaW5nLCBzbyBhblxuICogb3BlcmF0aW9uIHBhdXNlZCBvbiBhIGJyZWFrcG9pbnQgaXMgbm90IHRlcm1pbmF0ZWQgdW5kZXIgdGhlIGRlYnVnZ2VyLiBUaGUgdGltZW91dCBpcyBzdGlsbCBsb2dnZWQgdGhyb3VnaCB0aGVcbiAqIGBBc3luYzpydW5XaXRoVGltZW91dGAgZGVidWdnZXIuXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnIHN3aXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlcm1pbmF0ZU9uVGltZW91dERlYnVnU3dpdGNoKCk6IERlYnVnU3dpdGNoIHtcbiAgcmV0dXJuIHJlZ2lzdGVyRGVidWdTd2l0Y2goVEVSTUlOQVRFX09OX1RJTUVPVVRfREVGSU5JVElPTik7XG59XG5cbi8qKlxuICogQWRkcyBhIGxpc3RlbmVyIGNhbGxlZCB3aGVuZXZlciBhIGRlYnVnIHN3aXRjaCdzIHZhbHVlIGNoYW5nZXMsIGluIGFueSBsb2FkZWQgY29weSBvZiB0aGlzIGxpYnJhcnkuXG4gKlxuICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyLlxuICogQHJldHVybnMgQSBkaXNwb3NhYmxlIHRoYXQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRlYnVnU3dpdGNoQ2hhbmdlZChsaXN0ZW5lcjogRGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lcik6IERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpO1xuICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBkZWJ1ZyBzd2l0Y2guXG4gKlxuICogUmVnaXN0ZXJpbmcgYW4gaWQgYWdhaW4gaXMgaWRlbXBvdGVudDogdGhlIGZpcnN0IGRlZmluaXRpb24gaXMga2VwdCwgYW5kIHRoZSByZXR1cm5lZCBoYW5kbGUgcmVhZHMgdGhlIHNhbWVcbiAqIHZhbHVlLiBBIHZhbHVlIHNldCB3aXRoIHtAbGluayBzZXREZWJ1Z1N3aXRjaH0gYmVmb3JlIHRoZSBzd2l0Y2ggd2FzIHJlZ2lzdGVyZWQgaXMga2VwdCwgbm90IHJlc2V0IHRvIHRoZVxuICogZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0gZGVmaW5pdGlvbiAtIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBzd2l0Y2guXG4gKiBAcmV0dXJucyBUaGUgaGFuZGxlIHRvIHRoZSBzd2l0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlYnVnU3dpdGNoKGRlZmluaXRpb246IERlYnVnU3dpdGNoRGVmaW5pdGlvbik6IERlYnVnU3dpdGNoIHtcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSBnZXREZWZpbml0aW9ucygpO1xuICBsZXQgcmVnaXN0ZXJlZERlZmluaXRpb24gPSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbi5pZCk7XG4gIGlmICghcmVnaXN0ZXJlZERlZmluaXRpb24pIHtcbiAgICByZWdpc3RlcmVkRGVmaW5pdGlvbiA9IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWZpbml0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgaWQ6IGRlZmluaXRpb24uaWQsXG4gICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGRlZmluaXRpb24uaXNFbmFibGVkQnlEZWZhdWx0LFxuICAgICAgbmFtZTogZGVmaW5pdGlvbi5uYW1lXG4gICAgfTtcbiAgICBkZWZpbml0aW9ucy5zZXQoZGVmaW5pdGlvbi5pZCwgcmVnaXN0ZXJlZERlZmluaXRpb24pO1xuICB9XG4gIHJldHVybiBjcmVhdGVIYW5kbGUocmVnaXN0ZXJlZERlZmluaXRpb24pO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgZGVidWcgc3dpdGNoLCBub3RpZnlpbmcgdGhlIHtAbGluayBvbkRlYnVnU3dpdGNoQ2hhbmdlZH0gbGlzdGVuZXJzIGlmIGl0IGNoYW5nZWQuXG4gKlxuICogVGhlIHN3aXRjaCBkb2VzIG5vdCBoYXZlIHRvIGJlIHJlZ2lzdGVyZWQgeWV0OiB0aGUgdmFsdWUgaXMga2VwdCwgYW5kIHRoZSBzd2l0Y2ggdGFrZXMgaXQgd2hlbiBpdCByZWdpc3RlcnMuIFRoYXRcbiAqIGxldHMgYSBzZXR0aW5ncyBzdG9yZSByZS1hcHBseSBzYXZlZCB2YWx1ZXMgYmVmb3JlIGV2ZXJ5IGxpYnJhcnkgb3IgcGx1Z2luIHRoYXQgb3ducyBhIHN3aXRjaCBoYXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3dpdGNoLlxuICogQHBhcmFtIGlzRW5hYmxlZCAtIFRoZSBuZXcgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWJ1Z1N3aXRjaChpZDogc3RyaW5nLCBpc0VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb25zKCkuZ2V0KGlkKTtcbiAgLy8gQW4gdW5yZWdpc3RlcmVkIHN3aXRjaCB3aXRoIG5vIHZhbHVlIHlldCBoYXMgbm8gcHJldmlvdXMgdmFsdWUsIHNvIGl0cyBmaXJzdCBzZXQgY291bnRzIGFzIGEgY2hhbmdlLlxuICBjb25zdCB3cmFwcGVyID0gZ2V0VmFsdWVXcmFwcGVyKGlkLCBkZWZpbml0aW9uPy5pc0VuYWJsZWRCeURlZmF1bHQgPz8gIWlzRW5hYmxlZCk7XG4gIGlmICh3cmFwcGVyLnZhbHVlID09PSBpc0VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd3JhcHBlci52YWx1ZSA9IGlzRW5hYmxlZDtcbiAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBnZXRMaXN0ZW5lcnMoKSkge1xuICAgIGxpc3RlbmVyKHsgaWQsIGlzRW5hYmxlZCB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIYW5kbGUoZGVmaW5pdGlvbjogRGVidWdTd2l0Y2hEZWZpbml0aW9uKTogRGVidWdTd2l0Y2gge1xuICByZXR1cm4ge1xuICAgIC4uLmRlZmluaXRpb24sXG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGdldFZhbHVlV3JhcHBlcihkZWZpbml0aW9uLmlkLCBkZWZpbml0aW9uLmlzRW5hYmxlZEJ5RGVmYXVsdCkudmFsdWU7XG4gICAgfSxcbiAgICBzZXRFbmFibGVkKGlzRW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgc2V0RGVidWdTd2l0Y2goZGVmaW5pdGlvbi5pZCwgaXNFbmFibGVkKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldERlZmluaXRpb25zKCk6IE1hcDxzdHJpbmcsIERlYnVnU3dpdGNoRGVmaW5pdGlvbj4ge1xuICBjb25zdCBkZWZpbml0aW9ucyA9IGdldFR5cGVzY3JpcHRMaWJTdGF0ZSgnZGVidWdTd2l0Y2hEZWZpbml0aW9ucycsIG5ldyBNYXA8c3RyaW5nLCBEZWJ1Z1N3aXRjaERlZmluaXRpb24+KCkpLnZhbHVlO1xuICAvLyBDaGVja2VkIG9uIGV2ZXJ5IHJlYWQsIGJlY2F1c2UgdGhlIG1hcCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgYSBjb3B5IG9mIHRoaXMgbGlicmFyeSB0aGF0IHByZWRhdGVzIGEgc3dpdGNoLlxuICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgQlVJTFRfSU5fREVGSU5JVElPTlMpIHtcbiAgICBpZiAoIWRlZmluaXRpb25zLmhhcyhkZWZpbml0aW9uLmlkKSkge1xuICAgICAgZGVmaW5pdGlvbnMuc2V0KGRlZmluaXRpb24uaWQsIGRlZmluaXRpb24pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmaW5pdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldExpc3RlbmVycygpOiBTZXQ8RGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lcj4ge1xuICByZXR1cm4gZ2V0VHlwZXNjcmlwdExpYlN0YXRlKCdkZWJ1Z1N3aXRjaExpc3RlbmVycycsIG5ldyBTZXQ8RGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lcj4oKSkudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlV3JhcHBlcihpZDogc3RyaW5nLCBpc0VuYWJsZWRCeURlZmF1bHQ6IGJvb2xlYW4pOiBWYWx1ZVdyYXBwZXI8Ym9vbGVhbj4ge1xuICByZXR1cm4gZ2V0VHlwZXNjcmlwdExpYlN0YXRlKExFR0FDWV9TVEFURV9LRVlTW2lkXSA/PyBgZGVidWdTd2l0Y2g6JHtpZH1gLCBpc0VuYWJsZWRCeURlZmF1bHQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtCQSx3QkFBbUM7QUFDbkMsa0NBQXNDO0FBcUV0QyxNQUFNLG9CQUFzRDtBQUFBLEVBQzFELHVDQUF1QztBQUN6QztBQUVBLE1BQU0sa0NBQXlEO0FBQUEsRUFDN0QsYUFBYTtBQUFBLEVBQ2IsSUFBSTtBQUFBLEVBQ0osb0JBQW9CO0FBQUEsRUFDcEIsTUFBTTtBQUNSO0FBR0EsTUFBTSx1QkFBeUQsQ0FBQywrQkFBK0I7QUFReEYsU0FBUyxlQUFlLElBQXFDO0FBQ2xFLFFBQU0sYUFBYSxlQUFlLEVBQUUsSUFBSSxFQUFFO0FBQzFDLFNBQU8sYUFBYSxhQUFhLFVBQVUsSUFBSTtBQUNqRDtBQU9PLFNBQVMsbUJBQWtDO0FBQ2hELFNBQU8sQ0FBQyxHQUFHLGVBQWUsRUFBRSxPQUFPLENBQUMsRUFDakMsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUN2QyxJQUFJLENBQUMsZUFBZSxhQUFhLFVBQVUsQ0FBQztBQUNqRDtBQVlPLFNBQVMsbUNBQWdEO0FBQzlELFNBQU8sb0JBQW9CLCtCQUErQjtBQUM1RDtBQVFPLFNBQVMscUJBQXFCLFVBQW1EO0FBQ3RGLFFBQU0sWUFBWSxhQUFhO0FBQy9CLFlBQVUsSUFBSSxRQUFRO0FBQ3RCLFNBQU8sSUFBSSxxQ0FBbUI7QUFBQSxJQUM1QixXQUFpQjtBQUNmLGdCQUFVLE9BQU8sUUFBUTtBQUFBLElBQzNCO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFZTyxTQUFTLG9CQUFvQixZQUFnRDtBQUNsRixRQUFNLGNBQWMsZUFBZTtBQUNuQyxNQUFJLHVCQUF1QixZQUFZLElBQUksV0FBVyxFQUFFO0FBQ3hELE1BQUksQ0FBQyxzQkFBc0I7QUFDekIsMkJBQXVCO0FBQUEsTUFDckIsYUFBYSxXQUFXO0FBQUEsTUFDeEIsSUFBSSxXQUFXO0FBQUEsTUFDZixvQkFBb0IsV0FBVztBQUFBLE1BQy9CLE1BQU0sV0FBVztBQUFBLElBQ25CO0FBQ0EsZ0JBQVksSUFBSSxXQUFXLElBQUksb0JBQW9CO0FBQUEsRUFDckQ7QUFDQSxTQUFPLGFBQWEsb0JBQW9CO0FBQzFDO0FBV08sU0FBUyxlQUFlLElBQVksV0FBMEI7QUFDbkUsUUFBTSxhQUFhLGVBQWUsRUFBRSxJQUFJLEVBQUU7QUFFMUMsUUFBTSxVQUFVLGdCQUFnQixJQUFJLFlBQVksc0JBQXNCLENBQUMsU0FBUztBQUNoRixNQUFJLFFBQVEsVUFBVSxXQUFXO0FBQy9CO0FBQUEsRUFDRjtBQUNBLFVBQVEsUUFBUTtBQUNoQixhQUFXLFlBQVksYUFBYSxHQUFHO0FBQ3JDLGFBQVMsRUFBRSxJQUFJLFVBQVUsQ0FBQztBQUFBLEVBQzVCO0FBQ0Y7QUFFQSxTQUFTLGFBQWEsWUFBZ0Q7QUFDcEUsU0FBTztBQUFBLElBQ0wsR0FBRztBQUFBLElBQ0gsWUFBcUI7QUFDbkIsYUFBTyxnQkFBZ0IsV0FBVyxJQUFJLFdBQVcsa0JBQWtCLEVBQUU7QUFBQSxJQUN2RTtBQUFBLElBQ0EsV0FBVyxXQUEwQjtBQUNuQyxxQkFBZSxXQUFXLElBQUksU0FBUztBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxpQkFBcUQ7QUFDNUQsUUFBTSxrQkFBYyxtREFBc0IsMEJBQTBCLG9CQUFJLElBQW1DLENBQUMsRUFBRTtBQUU5RyxhQUFXLGNBQWMsc0JBQXNCO0FBQzdDLFFBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxFQUFFLEdBQUc7QUFDbkMsa0JBQVksSUFBSSxXQUFXLElBQUksVUFBVTtBQUFBLElBQzNDO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsZUFBK0M7QUFDdEQsYUFBTyxtREFBc0Isd0JBQXdCLG9CQUFJLElBQStCLENBQUMsRUFBRTtBQUM3RjtBQUVBLFNBQVMsZ0JBQWdCLElBQVksb0JBQW9EO0FBQ3ZGLGFBQU8sbURBQXNCLGtCQUFrQixFQUFFLEtBQUssZUFBZSxFQUFFLElBQUksa0JBQWtCO0FBQy9GOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,124 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * A registry of debug switches: named, app-wide booleans that change behavior while debugging.
6
+ *
7
+ * A debug namespace (see `debug.ts`) controls logging only. Behavior that should differ while debugging, such as
8
+ * not terminating an operation paused on a breakpoint, is a debug switch instead, so turning logging on never
9
+ * changes what the code does.
10
+ *
11
+ * The definitions, the values and the change listeners all live in the shared state bag (`typescript-lib-state.ts`)
12
+ * as plain data, so every copy of this library loaded in one realm, such as the copy each Obsidian plugin bundles,
13
+ * sees one value per switch. A tool such as a debug-settings UI lists every registered switch with
14
+ * {@link getDebugSwitches} and needs no change when a library or plugin adds one.
15
+ */
16
+ import type { DisposableEx } from './disposable.cjs';
17
+ /**
18
+ * A handle to a registered debug switch.
19
+ */
20
+ export interface DebugSwitch extends DebugSwitchDefinition {
21
+ /**
22
+ * Gets the current value.
23
+ *
24
+ * @returns `true` if the switch is on.
25
+ */
26
+ isEnabled: () => boolean;
27
+ /**
28
+ * Sets the value, notifying the {@link onDebugSwitchChanged} listeners if it changed.
29
+ *
30
+ * @param isEnabled - The new value.
31
+ */
32
+ setEnabled: (isEnabled: boolean) => void;
33
+ }
34
+ /**
35
+ * A change of a debug switch's value, passed to an {@link onDebugSwitchChanged} listener.
36
+ */
37
+ export interface DebugSwitchChange {
38
+ /**
39
+ * The id of the switch that changed.
40
+ */
41
+ readonly id: string;
42
+ /**
43
+ * The new value.
44
+ */
45
+ readonly isEnabled: boolean;
46
+ }
47
+ /**
48
+ * The listener of {@link onDebugSwitchChanged}.
49
+ */
50
+ export type DebugSwitchChangeListener = (change: DebugSwitchChange) => void;
51
+ /**
52
+ * The definition of a debug switch.
53
+ */
54
+ export interface DebugSwitchDefinition {
55
+ /**
56
+ * What the switch does, for a settings UI.
57
+ */
58
+ readonly description: string;
59
+ /**
60
+ * The unique id, namespaced by the library or plugin that owns the switch, e.g.
61
+ * `typescript-lib:terminate-on-timeout`.
62
+ */
63
+ readonly id: string;
64
+ /**
65
+ * The value the switch has until something sets it.
66
+ */
67
+ readonly isEnabledByDefault: boolean;
68
+ /**
69
+ * The human-readable name, for a settings UI.
70
+ */
71
+ readonly name: string;
72
+ }
73
+ /**
74
+ * Gets a registered debug switch.
75
+ *
76
+ * @param id - The id of the switch.
77
+ * @returns The switch, or `undefined` if no switch with that id is registered.
78
+ */
79
+ export declare function getDebugSwitch(id: string): DebugSwitch | undefined;
80
+ /**
81
+ * Gets every registered debug switch, sorted by id.
82
+ *
83
+ * @returns The registered switches.
84
+ */
85
+ export declare function getDebugSwitches(): DebugSwitch[];
86
+ /**
87
+ * Gets the debug switch that decides whether a `runWithTimeout` call without its own `onTimeout` terminates the
88
+ * operation when it times out.
89
+ *
90
+ * Its id is `typescript-lib:terminate-on-timeout` and it is on by default. Switch it off while debugging, so an
91
+ * operation paused on a breakpoint is not terminated under the debugger. The timeout is still logged through the
92
+ * `Async:runWithTimeout` debugger.
93
+ *
94
+ * @returns The debug switch.
95
+ */
96
+ export declare function getTerminateOnTimeoutDebugSwitch(): DebugSwitch;
97
+ /**
98
+ * Adds a listener called whenever a debug switch's value changes, in any loaded copy of this library.
99
+ *
100
+ * @param listener - The listener.
101
+ * @returns A disposable that removes the listener.
102
+ */
103
+ export declare function onDebugSwitchChanged(listener: DebugSwitchChangeListener): DisposableEx;
104
+ /**
105
+ * Registers a debug switch.
106
+ *
107
+ * Registering an id again is idempotent: the first definition is kept, and the returned handle reads the same
108
+ * value. A value set with {@link setDebugSwitch} before the switch was registered is kept, not reset to the
109
+ * default.
110
+ *
111
+ * @param definition - The definition of the switch.
112
+ * @returns The handle to the switch.
113
+ */
114
+ export declare function registerDebugSwitch(definition: DebugSwitchDefinition): DebugSwitch;
115
+ /**
116
+ * Sets the value of a debug switch, notifying the {@link onDebugSwitchChanged} listeners if it changed.
117
+ *
118
+ * The switch does not have to be registered yet: the value is kept, and the switch takes it when it registers. That
119
+ * lets a settings store re-apply saved values before every library or plugin that owns a switch has loaded.
120
+ *
121
+ * @param id - The id of the switch.
122
+ * @param isEnabled - The new value.
123
+ */
124
+ export declare function setDebugSwitch(id: string, isEnabled: boolean): void;