velocious 1.0.462 → 1.0.463

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/build/configuration.js +33 -8
  2. package/build/database/pool/async-tracked-multi-connection.js +66 -1
  3. package/build/database/pool/base.js +8 -0
  4. package/build/http-server/client/index.js +1 -1
  5. package/build/http-server/client/request-runner.js +1 -1
  6. package/build/http-server/worker-handler/index.js +3 -2
  7. package/build/routes/resolver.js +1 -1
  8. package/build/src/configuration.d.ts +13 -0
  9. package/build/src/configuration.d.ts.map +1 -1
  10. package/build/src/configuration.js +32 -10
  11. package/build/src/database/pool/async-tracked-multi-connection.d.ts +18 -0
  12. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  13. package/build/src/database/pool/async-tracked-multi-connection.js +62 -2
  14. package/build/src/database/pool/base.d.ts +5 -0
  15. package/build/src/database/pool/base.d.ts.map +1 -1
  16. package/build/src/database/pool/base.js +8 -1
  17. package/build/src/http-server/client/index.js +2 -2
  18. package/build/src/http-server/client/request-runner.js +2 -2
  19. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  20. package/build/src/http-server/worker-handler/index.js +4 -3
  21. package/build/src/routes/resolver.d.ts.map +1 -1
  22. package/build/src/routes/resolver.js +2 -2
  23. package/build/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +3 -2
  25. package/src/configuration.js +33 -8
  26. package/src/database/pool/async-tracked-multi-connection.js +66 -1
  27. package/src/database/pool/base.js +8 -0
  28. package/src/http-server/client/index.js +1 -1
  29. package/src/http-server/client/request-runner.js +1 -1
  30. package/src/http-server/worker-handler/index.js +3 -2
  31. package/src/routes/resolver.js +1 -1
  32. package/build/src/utils/ensure-error.d.ts +0 -7
  33. package/build/src/utils/ensure-error.d.ts.map +0 -1
  34. package/build/src/utils/ensure-error.js +0 -15
  35. package/build/utils/ensure-error.js +0 -15
  36. package/src/utils/ensure-error.js +0 -15
@@ -1,7 +1,7 @@
1
1
  // @ts-check
2
+ import { ensureError } from "typanic";
2
3
  import Logger from "../../logger.js";
3
4
  import { Worker } from "worker_threads";
4
- import ensureError from "../../utils/ensure-error.js";
5
5
  import websocketEventsHost from "../websocket-events-host.js";
6
6
  /**
7
7
  * Runs summarize worker message.
@@ -94,7 +94,8 @@ export default class VelociousHttpServerWorker {
94
94
  onWorkerError = (error) => {
95
95
  this.logger.error(`Velocious worker ${this.workerCount} error`, error);
96
96
  void this._closeAllClients();
97
- throw ensureError(error); // Throws original error with backtrace and everything into the console
97
+ // Preserve Error instances for the original backtrace while wrapping non-Error throwables.
98
+ throw ensureError(error);
98
99
  };
99
100
  /**
100
101
  * On worker exit.
@@ -331,4 +332,4 @@ export default class VelociousHttpServerWorker {
331
332
  this.unregisterFromEventsHost = null;
332
333
  }
333
334
  }
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvd29ya2VyLWhhbmRsZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyQyxPQUFPLFdBQVcsTUFBTSw2QkFBNkIsQ0FBQTtBQUNyRCxPQUFPLG1CQUFtQixNQUFNLDZCQUE2QixDQUFBO0FBRTdEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLElBQUk7SUFDbEMsTUFBTSxFQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksRUFBQyxHQUFHLElBQUksQ0FBQTtJQUU5QixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxPQUFPLE1BQU0sQ0FBQTtJQUNoQyxNQUFNLFlBQVksR0FBRyxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQzdDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTTtRQUNmLENBQUMsQ0FBQyxDQUFDLE1BQU0sWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRWxFLE9BQU87UUFDTCxHQUFHLElBQUk7UUFDUCxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsWUFBWTtZQUNwQixJQUFJLEVBQUUsVUFBVTtTQUNqQjtLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyx5QkFBeUI7SUFDNUM7Ozs7O09BS0c7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBQztRQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUVsQzs7MkVBRW1FO1FB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QUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQ2hILENBQUM7SUFFRDs7eUJBRXFCO0lBQ3JCLHNCQUFzQjtRQUNwQixJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFBRSxPQUFNO1FBRXpDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUVEOzt5QkFFcUI7SUFDckIsZ0NBQWdDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCO1lBQUUsT0FBTTtRQUUxQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtRQUMvQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFBO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IHtXb3JrZXJ9IGZyb20gXCJ3b3JrZXJfdGhyZWFkc1wiXG5pbXBvcnQgZW5zdXJlRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL2Vuc3VyZS1lcnJvci5qc1wiXG5pbXBvcnQgd2Vic29ja2V0RXZlbnRzSG9zdCBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50cy1ob3N0LmpzXCJcblxuLyoqXG4gKiBSdW5zIHN1bW1hcml6ZSB3b3JrZXIgbWVzc2FnZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gV29ya2VyIG1lc3NhZ2UgcGF5bG9hZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLmNvbW1hbmQgLSBDb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0ge251bWJlcn0gW2RhdGEuY2xpZW50Q291bnRdIC0gQ2xpZW50IGNvdW50LlxuICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSBbZGF0YS5vdXRwdXRdIC0gT3V0cHV0IGNodW5rLlxuICogQHJldHVybnMge29iamVjdH0gLSBMb2ctc2FmZSBtZXNzYWdlIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZVdvcmtlck1lc3NhZ2UoZGF0YSkge1xuICBjb25zdCB7b3V0cHV0LCAuLi5yZXN0fSA9IGRhdGFcblxuICBpZiAob3V0cHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdFxuICB9XG5cbiAgY29uc3Qgb3V0cHV0VHlwZSA9IHR5cGVvZiBvdXRwdXRcbiAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gdHlwZW9mIG91dHB1dCA9PT0gXCJzdHJpbmdcIlxuICAgID8gb3V0cHV0Lmxlbmd0aFxuICAgIDogKG91dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBvdXRwdXQuYnl0ZUxlbmd0aCA6IHVuZGVmaW5lZClcblxuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgb3V0cHV0OiB7XG4gICAgICBsZW5ndGg6IG91dHB1dExlbmd0aCxcbiAgICAgIHR5cGU6IG91dHB1dFR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlcldvcmtlciB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3Mud29ya2VyQ291bnQgLSBXb3JrZXIgY291bnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgd29ya2VyQ291bnR9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBpbXBvcnQoXCIuLi9zZXJ2ZXItY2xpZW50LmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuY2xpZW50cyA9IHt9XG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLndvcmtlckNvdW50ID0gd29ya2VyQ291bnRcbiAgICB0aGlzLndvcmtlclN0YXJ0ZWQgPSBmYWxzZVxuICAgIHRoaXMuX3N0b3BwaW5nID0gZmFsc2VcbiAgICB0aGlzLl9kZWJ1Z1JlcXVlc3RJZCA9IDBcbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxudW1iZXIsIHtyZXNvbHZlOiAoc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsID8+KSA9PiB2b2lkfT59ICovXG4gICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzID0gbmV3IE1hcCgpXG4gIH1cblxuICBzdGFydCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMub25TdGFydENhbGxiYWNrID0gcmVzb2x2ZVxuICAgICAgdGhpcy5fc3Bhd25Xb3JrZXIoKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfc3Bhd25Xb3JrZXIoKSB7XG4gICAgY29uc3QgZGVidWcgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVidWdcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KClcbiAgICBjb25zdCB2ZWxvY2lvdXNQYXRoID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50SGFuZGxlcigpLmdldFZlbG9jaW91c1BhdGgoKVxuXG4gICAgdGhpcy53b3JrZXIgPSBuZXcgV29ya2VyKGAke3ZlbG9jaW91c1BhdGh9L3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci93b3JrZXItc2NyaXB0LmpzYCwge1xuICAgICAgd29ya2VyRGF0YToge1xuICAgICAgICBkZWJ1ZyxcbiAgICAgICAgZGlyZWN0b3J5LFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50KCksXG4gICAgICAgIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50XG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLndvcmtlci5vbihcImVycm9yXCIsIHRoaXMub25Xb3JrZXJFcnJvcilcbiAgICB0aGlzLndvcmtlci5vbihcImV4aXRcIiwgdGhpcy5vbldvcmtlckV4aXQpXG4gICAgdGhpcy53b3JrZXIub24oXCJtZXNzYWdlXCIsIHRoaXMub25Xb3JrZXJNZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIHNvY2tldCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlcnZlci1jbGllbnQuanNcIikuZGVmYXVsdH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTb2NrZXRDb25uZWN0aW9uKGNsaWVudCkge1xuICAgIGNvbnN0IGNsaWVudENvdW50ID0gY2xpZW50LmNsaWVudENvdW50XG5cbiAgICBpZiAoIXRoaXMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjbGllbnQuc2V0V29ya2VyKHRoaXMud29ya2VyKVxuICAgIGNsaWVudC5saXN0ZW4oKVxuXG4gICAgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA9IGNsaWVudFxuICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcIm5ld0NsaWVudFwiLCBjbGllbnRDb3VudCwgcmVtb3RlQWRkcmVzczogY2xpZW50LnJlbW90ZUFkZHJlc3N9KVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHdvcmtlciBlcnJvci5cbiAgICogQHBhcmFtIHs/fSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKi9cbiAgb25Xb3JrZXJFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmVycm9yKGBWZWxvY2lvdXMgd29ya2VyICR7dGhpcy53b3JrZXJDb3VudH0gZXJyb3JgLCBlcnJvcilcbiAgICB2b2lkIHRoaXMuX2Nsb3NlQWxsQ2xpZW50cygpXG4gICAgdGhyb3cgZW5zdXJlRXJyb3IoZXJyb3IpIC8vIFRocm93cyBvcmlnaW5hbCBlcnJvciB3aXRoIGJhY2t0cmFjZSBhbmQgZXZlcnl0aGluZyBpbnRvIHRoZSBjb25zb2xlXG4gIH1cblxuICAvKipcbiAgICogT24gd29ya2VyIGV4aXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIC0gQ29kZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Xb3JrZXJFeGl0ID0gKGNvZGUpID0+IHtcbiAgICB0aGlzLl9oYXNFeGl0ZWQgPSB0cnVlXG4gICAgdGhpcy53b3JrZXJTdGFydGVkID0gZmFsc2VcblxuICAgIGlmIChjb2RlICE9PSAwICYmICF0aGlzLl9zdG9wcGluZykge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYFZlbG9jaW91cyB3b3JrZXIgJHt0aGlzLndvcmtlckNvdW50fSBleGl0ZWQgdW5leHBlY3RlZGx5IHdpdGggY29kZSAke2NvZGV9YClcbiAgICAgIHZvaWQgdGhpcy5fY2xvc2VBbGxDbGllbnRzKClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xpZW50IHdvcmtlciBzdG9wcGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBgQ2xpZW50IHdvcmtlciBzdG9wcGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gKVxuICAgIH1cblxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0SWZOZWVkZWQoKVxuICAgIGlmICh0aGlzLl9zdG9wUmVzb2x2ZSkge1xuICAgICAgdGhpcy5fc3RvcFJlc29sdmUoKVxuICAgIH1cbiAgICB0aGlzLl9zdG9wUmVzb2x2ZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsb3NlIGFsbCBjbGllbnRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfY2xvc2VBbGxDbGllbnRzKCkge1xuICAgIGNvbnN0IGNsaWVudHMgPSBPYmplY3QudmFsdWVzKHRoaXMuY2xpZW50cylcbiAgICB0aGlzLmNsaWVudHMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBjbGllbnQgb2YgY2xpZW50cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdm9pZCBjbGllbnQuZW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gY2xvc2UgY2xpZW50IGFmdGVyIHdvcmtlciBleGl0XCIsIGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbiB3b3JrZXIgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLmNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEuY2xpZW50Q291bnRdIC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IFtkYXRhLm91dHB1dF0gLSBPdXRwdXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5jaGFubmVsXSAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLnJlcXVlc3RJZF0gLSBEZWJ1ZyByZXF1ZXN0IGlkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbZGF0YS5zbmFwc2hvdF0gLSBXb3JrZXIgZGVidWcgc25hcHNob3QuXG4gICAqIEBwYXJhbSB7P30gW2RhdGEucGF5bG9hZF0gLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFtkYXRhLmJyb2FkY2FzdFBhcmFtc10gLSBWMiBicm9hZGNhc3QgZmlsdGVyIHBhcmFtcy5cbiAgICogQHBhcmFtIHs/fSBbZGF0YS5ib2R5XSAtIFYyIGJyb2FkY2FzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbldvcmtlck1lc3NhZ2UgPSAoZGF0YSkgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiV29ya2VyIG1lc3NhZ2VcIiwgc3VtbWFyaXplV29ya2VyTWVzc2FnZShkYXRhKSlcblxuICAgIGNvbnN0IHtjb21tYW5kfSA9IGRhdGFcblxuXG4gICAgaWYgKGNvbW1hbmQgPT0gXCJzdGFydGVkXCIpIHtcbiAgICAgIHRoaXMud29ya2VyU3RhcnRlZCA9IHRydWVcbiAgICAgIHRoaXMucmVnaXN0ZXJXaXRoRXZlbnRzSG9zdCgpXG5cbiAgICAgIGlmICh0aGlzLm9uU3RhcnRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLm9uU3RhcnRDYWxsYmFjayhudWxsKVxuICAgICAgfVxuXG4gICAgICB0aGlzLm9uU3RhcnRDYWxsYmFjayA9IG51bGxcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjbGllbnRPdXRwdXRcIikge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJDTElFTlQgT1VUUFVUXCIsIHN1bW1hcml6ZVdvcmtlck1lc3NhZ2UoZGF0YSkpXG5cbiAgICAgIGNvbnN0IHtjbGllbnRDb3VudCwgb3V0cHV0fSA9IGRhdGFcbiAgICAgIGNvbnN0IGNsaWVudCA9IHR5cGVvZiBjbGllbnRDb3VudCA9PT0gXCJudW1iZXJcIiA/IHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gOiB1bmRlZmluZWRcblxuICAgICAgaWYgKCFjbGllbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbYFZlbG9jaW91cyB3b3JrZXIgJHt0aGlzLndvcmtlckNvdW50fSBwcm9kdWNlZCBvdXRwdXQgZm9yIG1pc3NpbmcgY2xpZW50ICR7Y2xpZW50Q291bnR9YCwgZGF0YV0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAob3V0cHV0ICE9PSBudWxsICYmIG91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dExlbmd0aCA9IHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIgPyBvdXRwdXQubGVuZ3RoIDogb3V0cHV0LmJ5dGVMZW5ndGhcblxuICAgICAgICB2b2lkIGNsaWVudC5zZW5kKG91dHB1dCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW1wiQ2xpZW50IG91dHB1dCBkZWxpdmVyZWRcIiwge1xuICAgICAgICAgICAgY2xpZW50Q291bnQsXG4gICAgICAgICAgICBvdXRwdXRMZW5ndGgsXG4gICAgICAgICAgICB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudFxuICAgICAgICAgIH1dKVxuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZGVsaXZlciBjbGllbnQgb3V0cHV0XCIsIHtcbiAgICAgICAgICAgIGNsaWVudENvdW50LFxuICAgICAgICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnRcbiAgICAgICAgICB9LCBlcnJvcl0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2xpZW50Q2xvc2VcIikge1xuICAgICAgY29uc3Qge2NsaWVudENvdW50fSA9IGRhdGFcbiAgICAgIGNvbnN0IGNsaWVudCA9IHR5cGVvZiBjbGllbnRDb3VudCA9PT0gXCJudW1iZXJcIiA/IHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gOiB1bmRlZmluZWRcblxuICAgICAgaWYgKCFjbGllbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BWZWxvY2lvdXMgd29ya2VyICR7dGhpcy53b3JrZXJDb3VudH0gcmVxdWVzdGVkIGNsb3NlIGZvciBtaXNzaW5nIGNsaWVudCAke2NsaWVudENvdW50fWAsIGRhdGFdKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdm9pZCBjbGllbnQuZW5kKClcblxuICAgICAgaWYgKHR5cGVvZiBjbGllbnRDb3VudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBkZWxldGUgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImRlYnVnU25hcHNob3RcIikge1xuICAgICAgY29uc3Qge3JlcXVlc3RJZCwgc25hcHNob3R9ID0gZGF0YVxuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0SWQgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImRlYnVnU25hcHNob3QgcmVxdWVzdElkIG11c3QgYmUgYSBudW1iZXJcIilcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9kZWJ1Z1NuYXBzaG90UmVxdWVzdHMuZ2V0KHJlcXVlc3RJZClcblxuICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0SWQpXG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZShzbmFwc2hvdCB8fCB7fSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzaHV0ZG93bkNvbXBsZXRlXCIpIHtcbiAgICAgIHRoaXMuX3N0b3BSZXNvbHZlPy4oKVxuICAgICAgdGhpcy5fc3RvcFJlc29sdmUgPSBudWxsXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwid2Vic29ja2V0UHVibGlzaFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBkYXRhXG5cbiAgICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2Vic29ja2V0IHB1Ymxpc2ggY2hhbm5lbCBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gICAgICB9XG5cbiAgICAgIHdlYnNvY2tldEV2ZW50c0hvc3QucHVibGlzaCh7Y2hhbm5lbCwgcGF5bG9hZH0pXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwid2Vic29ja2V0VjJCcm9hZGNhc3RcIikge1xuICAgICAgY29uc3Qge2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbH0gPSBkYXRhXG5cbiAgICAgIGlmICh0eXBlb2YgY2hhbm5lbCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2Vic29ja2V0IHYyLWJyb2FkY2FzdCBjaGFubmVsIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgICAgIH1cblxuICAgICAgd2Vic29ja2V0RXZlbnRzSG9zdC5icm9hZGNhc3RWMih7Ym9keSwgYnJvYWRjYXN0UGFyYW1zOiBicm9hZGNhc3RQYXJhbXMgfHwge30sIGNoYW5uZWx9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRlYnVnIHNuYXBzaG90LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IC0gV29ya2VyLWxvY2FsIGRlYnVnIHNuYXBzaG90LlxuICAgKi9cbiAgZ2V0RGVidWdTbmFwc2hvdCgpIHtcbiAgICBpZiAoIXRoaXMud29ya2VyU3RhcnRlZCB8fCAhdGhpcy53b3JrZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe2FjdGl2ZTogZmFsc2UsIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50fSlcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSArK3RoaXMuX2RlYnVnUmVxdWVzdElkXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0SWQpXG4gICAgICAgIHJlc29sdmUoe2FjdGl2ZTogdHJ1ZSwgZXJyb3I6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHdvcmtlciBkZWJ1ZyBzbmFwc2hvdFwiLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0pXG4gICAgICB9LCAyMDAwKVxuXG4gICAgICBpZiAodHlwZW9mIHRpbWVvdXQudW5yZWYgPT09IFwiZnVuY3Rpb25cIikgdGltZW91dC51bnJlZigpXG5cbiAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyXG5cbiAgICAgIGlmICghd29ya2VyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICByZXNvbHZlKHthY3RpdmU6IGZhbHNlLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9kZWJ1Z1NuYXBzaG90UmVxdWVzdHMuc2V0KHJlcXVlc3RJZCwge1xuICAgICAgICByZXNvbHZlOiAoc25hcHNob3QpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgICByZXNvbHZlKHthY3RpdmU6IHRydWUsIHNuYXBzaG90LCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwiZGVidWdTbmFwc2hvdFwiLCByZXF1ZXN0SWR9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdG9wLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHN0b3BwZWQuXG4gICAqL1xuICBzdG9wKCkge1xuICAgIGlmICghdGhpcy53b3JrZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIGlmICh0aGlzLl9oYXNFeGl0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgdGhpcy5fc3RvcHBpbmcgPSB0cnVlXG4gICAgdGhpcy53b3JrZXJTdGFydGVkID0gZmFsc2VcbiAgICB0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdElmTmVlZGVkKClcbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLndvcmtlclxuXG4gICAgaWYgKCF3b3JrZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLl9zdG9wUmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDogXCJzaHV0ZG93blwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlzcGF0Y2ggd2Vic29ja2V0IGV2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY3JlYXRlZEF0XSAtIEV2ZW50IGNyZWF0aW9uIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5ldmVudElkXSAtIEV2ZW50IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7P30gYXJncy5wYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBkaXNwYXRjaFdlYnNvY2tldEV2ZW50KHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9KSB7XG4gICAgLy8gVGVzdCBhbmQgc2h1dGRvd24gcGF0aHMgY2FuIGxlYXZlIGEgcmVnaXN0ZXJlZCBoYW5kbGVyIHdpdGhvdXQgYSBsaXZlIHdvcmtlci10aHJlYWQgdHJhbnNwb3J0LlxuICAgIGlmICghdGhpcy53b3JrZXJTdGFydGVkKSByZXR1cm5cbiAgICBpZiAoIXRoaXMud29ya2VyIHx8IHR5cGVvZiB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm5cblxuICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtjaGFubmVsLCBjb21tYW5kOiBcIndlYnNvY2tldEV2ZW50XCIsIGNyZWF0ZWRBdCwgZXZlbnRJZCwgcGF5bG9hZH0pXG4gIH1cblxuICAvKipcbiAgICogRm9yd2FyZHMgYSBWMiBjaGFubmVsIGJyb2FkY2FzdCB0byB0aGlzIHdvcmtlcidzIHRocmVhZCBzbyBpdCBjYW5cbiAgICogZGlzcGF0Y2ggdG8gYW55IGxvY2FsbHktcmVnaXN0ZXJlZCBWMiBzdWJzY3JpcHRpb25zLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLmJyb2FkY2FzdFBhcmFtcyAtIFJvdXRpbmcgZmlsdGVyIHBhcmFtcy5cbiAgICogQHBhcmFtIHs/fSBhcmdzLmJvZHkgLSBNZXNzYWdlIGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5ldmVudElkXSAtIFBlcnNpc3RlZCBldmVudCBpZCBmb3IgcmVwbGF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY3JlYXRlZEF0XSAtIEV2ZW50IGNyZWF0aW9uIHRpbWVzdGFtcC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNwYXRjaFdlYnNvY2tldFYyQnJvYWRjYXN0KHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGV2ZW50SWQsIGNyZWF0ZWRBdH0pIHtcbiAgICBpZiAoIXRoaXMud29ya2VyU3RhcnRlZCkgcmV0dXJuXG4gICAgaWYgKCF0aGlzLndvcmtlciB8fCB0eXBlb2YgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuXG5cbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7Ym9keSwgYnJvYWRjYXN0UGFyYW1zLCBjaGFubmVsLCBjb21tYW5kOiBcIndlYnNvY2tldFYyQnJvYWRjYXN0XCIsIGV2ZW50SWQsIGNyZWF0ZWRBdH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWdpc3RlciB3aXRoIGV2ZW50cyBob3N0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgcmVnaXN0ZXJXaXRoRXZlbnRzSG9zdCgpIHtcbiAgICBpZiAodGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QpIHJldHVyblxuXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QgPSB3ZWJzb2NrZXRFdmVudHNIb3N0LnJlZ2lzdGVyKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1bnJlZ2lzdGVyIGZyb20gZXZlbnRzIGhvc3QgaWYgbmVlZGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgdW5yZWdpc3RlckZyb21FdmVudHNIb3N0SWZOZWVkZWQoKSB7XG4gICAgaWYgKCF0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdCkgcmV0dXJuXG5cbiAgICB0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdCgpXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QgPSBudWxsXG4gIH1cbn1cbiJdfQ==
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvd29ya2VyLWhhbmRsZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3JDLE9BQU8sbUJBQW1CLE1BQU0sNkJBQTZCLENBQUE7QUFFN0Q7Ozs7Ozs7R0FPRztBQUNILFNBQVMsc0JBQXNCLENBQUMsSUFBSTtJQUNsQyxNQUFNLEVBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFBO0lBRTlCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLE9BQU8sTUFBTSxDQUFBO0lBQ2hDLE1BQU0sWUFBWSxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFDN0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO1FBQ2YsQ0FBQyxDQUFDLENBQUMsTUFBTSxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFbEUsT0FBTztRQUNMLEdBQUcsSUFBSTtRQUNQLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLElBQUksRUFBRSxVQUFVO1NBQ2pCO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHlCQUF5QjtJQUM1Qzs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDOzsyRUFFbUU7UUFDbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQTtRQUN4Qjs7bUZBRTJFO1FBQzNFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3pDLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFBO1lBQzlCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNyQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQTtRQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25ELE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFFekYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLGFBQWEsa0RBQWtELEVBQUU7WUFDM0YsVUFBVSxFQUFFO2dCQUNWLEtBQUs7Z0JBQ0wsU0FBUztnQkFDVCxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUU7Z0JBQ2hELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUM5QjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsTUFBTTtRQUN4QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFBO1FBRXRDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUUzRCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM3QixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUE7UUFFZixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUNuRyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLElBQUksQ0FBQyxXQUFXLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN0RSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzVCLDJGQUEyRjtRQUMzRixNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxQixDQUFDLENBQUE7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7UUFFMUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsV0FBVyxrQ0FBa0MsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUMvRixLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3Q0FBd0MsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN6RSxDQUFDO1FBRUQsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUE7UUFDdkMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtJQUMxQixDQUFDLENBQUE7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVqQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQztnQkFDSCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUNuQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNyRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsZUFBZSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUVqRSxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBR3RCLElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1lBQ3pCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1lBRTdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzVCLENBQUM7WUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtRQUM3QixDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFFaEUsTUFBTSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFDbEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFdEYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsb0JBQW9CLElBQUksQ0FBQyxXQUFXLHVDQUF1QyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUN4SCxPQUFNO1lBQ1IsQ0FBQztZQUVELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sWUFBWSxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQTtnQkFFbkYsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMseUJBQXlCLEVBQUU7NEJBQ2xELFdBQVc7NEJBQ1gsWUFBWTs0QkFDWixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7eUJBQzlCLENBQUMsQ0FBQyxDQUFBO2dCQUNMLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQyxFQUFFOzRCQUMxRCxXQUFXOzRCQUNYLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzt5QkFDOUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUNaLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLE9BQU8sSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsSUFBSSxDQUFBO1lBQzFCLE1BQU0sTUFBTSxHQUFHLE9BQU8sV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1lBRXRGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixJQUFJLENBQUMsV0FBVyx1Q0FBdUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtnQkFDekgsT0FBTTtZQUNSLENBQUM7WUFFRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUVqQixJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDbEMsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtZQUNsQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVE7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1lBQzlGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFMUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUM3QyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUNqQyxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUE7WUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUE7UUFDMUIsQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFFL0IsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFBO1lBQ3RFLENBQUM7WUFFRCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUNqRCxDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFFN0MsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO1lBQzNFLENBQUM7WUFFRCxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGVBQWUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUMxRixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDaEQsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUVEOzs7T0FHRztJQUNILGdCQUFnQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBQ3hFLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUE7UUFFeEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQzdDLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLDZDQUE2QyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQTtZQUM5RyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFFUixJQUFJLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUV4RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1lBRTFCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3JCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFBO2dCQUN2RCxPQUFNO1lBQ1IsQ0FBQztZQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO2dCQUN6QyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDcEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUNyQixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUE7Z0JBQ2xFLENBQUM7YUFDRixDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO1FBQzNELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUk7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMxQyxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7UUFDMUIsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUE7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUUxQixJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXJDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQTtZQUMzQixNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDM0MsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxzQkFBc0IsQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQztRQUMzRCxpR0FBaUc7UUFDakcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTTtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLFVBQVU7WUFBRSxPQUFNO1FBRXpFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7SUFDNUYsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCw0QkFBNEIsQ0FBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUM7UUFDL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTTtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLFVBQVU7WUFBRSxPQUFNO1FBRXpFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQ2hILENBQUM7SUFFRDs7eUJBRXFCO0lBQ3JCLHNCQUFzQjtRQUNwQixJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFBRSxPQUFNO1FBRXpDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUVEOzt5QkFFcUI7SUFDckIsZ0NBQWdDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCO1lBQUUsT0FBTTtRQUUxQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtRQUMvQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFBO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2Vuc3VyZUVycm9yfSBmcm9tIFwidHlwYW5pY1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IHtXb3JrZXJ9IGZyb20gXCJ3b3JrZXJfdGhyZWFkc1wiXG5pbXBvcnQgd2Vic29ja2V0RXZlbnRzSG9zdCBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50cy1ob3N0LmpzXCJcblxuLyoqXG4gKiBSdW5zIHN1bW1hcml6ZSB3b3JrZXIgbWVzc2FnZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gV29ya2VyIG1lc3NhZ2UgcGF5bG9hZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLmNvbW1hbmQgLSBDb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0ge251bWJlcn0gW2RhdGEuY2xpZW50Q291bnRdIC0gQ2xpZW50IGNvdW50LlxuICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSBbZGF0YS5vdXRwdXRdIC0gT3V0cHV0IGNodW5rLlxuICogQHJldHVybnMge29iamVjdH0gLSBMb2ctc2FmZSBtZXNzYWdlIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZVdvcmtlck1lc3NhZ2UoZGF0YSkge1xuICBjb25zdCB7b3V0cHV0LCAuLi5yZXN0fSA9IGRhdGFcblxuICBpZiAob3V0cHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdFxuICB9XG5cbiAgY29uc3Qgb3V0cHV0VHlwZSA9IHR5cGVvZiBvdXRwdXRcbiAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gdHlwZW9mIG91dHB1dCA9PT0gXCJzdHJpbmdcIlxuICAgID8gb3V0cHV0Lmxlbmd0aFxuICAgIDogKG91dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBvdXRwdXQuYnl0ZUxlbmd0aCA6IHVuZGVmaW5lZClcblxuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgb3V0cHV0OiB7XG4gICAgICBsZW5ndGg6IG91dHB1dExlbmd0aCxcbiAgICAgIHR5cGU6IG91dHB1dFR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlcldvcmtlciB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3Mud29ya2VyQ291bnQgLSBXb3JrZXIgY291bnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgd29ya2VyQ291bnR9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBpbXBvcnQoXCIuLi9zZXJ2ZXItY2xpZW50LmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuY2xpZW50cyA9IHt9XG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLndvcmtlckNvdW50ID0gd29ya2VyQ291bnRcbiAgICB0aGlzLndvcmtlclN0YXJ0ZWQgPSBmYWxzZVxuICAgIHRoaXMuX3N0b3BwaW5nID0gZmFsc2VcbiAgICB0aGlzLl9kZWJ1Z1JlcXVlc3RJZCA9IDBcbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxudW1iZXIsIHtyZXNvbHZlOiAoc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsID8+KSA9PiB2b2lkfT59ICovXG4gICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzID0gbmV3IE1hcCgpXG4gIH1cblxuICBzdGFydCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMub25TdGFydENhbGxiYWNrID0gcmVzb2x2ZVxuICAgICAgdGhpcy5fc3Bhd25Xb3JrZXIoKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfc3Bhd25Xb3JrZXIoKSB7XG4gICAgY29uc3QgZGVidWcgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVidWdcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KClcbiAgICBjb25zdCB2ZWxvY2lvdXNQYXRoID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50SGFuZGxlcigpLmdldFZlbG9jaW91c1BhdGgoKVxuXG4gICAgdGhpcy53b3JrZXIgPSBuZXcgV29ya2VyKGAke3ZlbG9jaW91c1BhdGh9L3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci93b3JrZXItc2NyaXB0LmpzYCwge1xuICAgICAgd29ya2VyRGF0YToge1xuICAgICAgICBkZWJ1ZyxcbiAgICAgICAgZGlyZWN0b3J5LFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50KCksXG4gICAgICAgIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50XG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLndvcmtlci5vbihcImVycm9yXCIsIHRoaXMub25Xb3JrZXJFcnJvcilcbiAgICB0aGlzLndvcmtlci5vbihcImV4aXRcIiwgdGhpcy5vbldvcmtlckV4aXQpXG4gICAgdGhpcy53b3JrZXIub24oXCJtZXNzYWdlXCIsIHRoaXMub25Xb3JrZXJNZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIHNvY2tldCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlcnZlci1jbGllbnQuanNcIikuZGVmYXVsdH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTb2NrZXRDb25uZWN0aW9uKGNsaWVudCkge1xuICAgIGNvbnN0IGNsaWVudENvdW50ID0gY2xpZW50LmNsaWVudENvdW50XG5cbiAgICBpZiAoIXRoaXMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICBjbGllbnQuc2V0V29ya2VyKHRoaXMud29ya2VyKVxuICAgIGNsaWVudC5saXN0ZW4oKVxuXG4gICAgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA9IGNsaWVudFxuICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcIm5ld0NsaWVudFwiLCBjbGllbnRDb3VudCwgcmVtb3RlQWRkcmVzczogY2xpZW50LnJlbW90ZUFkZHJlc3N9KVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHdvcmtlciBlcnJvci5cbiAgICogQHBhcmFtIHs/fSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKi9cbiAgb25Xb3JrZXJFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmVycm9yKGBWZWxvY2lvdXMgd29ya2VyICR7dGhpcy53b3JrZXJDb3VudH0gZXJyb3JgLCBlcnJvcilcbiAgICB2b2lkIHRoaXMuX2Nsb3NlQWxsQ2xpZW50cygpXG4gICAgLy8gUHJlc2VydmUgRXJyb3IgaW5zdGFuY2VzIGZvciB0aGUgb3JpZ2luYWwgYmFja3RyYWNlIHdoaWxlIHdyYXBwaW5nIG5vbi1FcnJvciB0aHJvd2FibGVzLlxuICAgIHRocm93IGVuc3VyZUVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHdvcmtlciBleGl0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZSAtIENvZGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uV29ya2VyRXhpdCA9IChjb2RlKSA9PiB7XG4gICAgdGhpcy5faGFzRXhpdGVkID0gdHJ1ZVxuICAgIHRoaXMud29ya2VyU3RhcnRlZCA9IGZhbHNlXG5cbiAgICBpZiAoY29kZSAhPT0gMCAmJiAhdGhpcy5fc3RvcHBpbmcpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBWZWxvY2lvdXMgd29ya2VyICR7dGhpcy53b3JrZXJDb3VudH0gZXhpdGVkIHVuZXhwZWN0ZWRseSB3aXRoIGNvZGUgJHtjb2RlfWApXG4gICAgICB2b2lkIHRoaXMuX2Nsb3NlQWxsQ2xpZW50cygpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENsaWVudCB3b3JrZXIgc3RvcHBlZCB3aXRoIGV4aXQgY29kZSAke2NvZGV9YClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gYENsaWVudCB3b3JrZXIgc3RvcHBlZCB3aXRoIGV4aXQgY29kZSAke2NvZGV9YClcbiAgICB9XG5cbiAgICB0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdElmTmVlZGVkKClcbiAgICBpZiAodGhpcy5fc3RvcFJlc29sdmUpIHtcbiAgICAgIHRoaXMuX3N0b3BSZXNvbHZlKClcbiAgICB9XG4gICAgdGhpcy5fc3RvcFJlc29sdmUgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbG9zZSBhbGwgY2xpZW50cy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX2Nsb3NlQWxsQ2xpZW50cygpIHtcbiAgICBjb25zdCBjbGllbnRzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmNsaWVudHMpXG4gICAgdGhpcy5jbGllbnRzID0ge31cblxuICAgIGZvciAoY29uc3QgY2xpZW50IG9mIGNsaWVudHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZvaWQgY2xpZW50LmVuZCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGNsb3NlIGNsaWVudCBhZnRlciB3b3JrZXIgZXhpdFwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gd29ya2VyIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YS5jb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhLmNsaWVudENvdW50XSAtIENsaWVudCBjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSBbZGF0YS5vdXRwdXRdIC0gT3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuY2hhbm5lbF0gLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5yZXF1ZXN0SWRdIC0gRGVidWcgcmVxdWVzdCBpZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2RhdGEuc25hcHNob3RdIC0gV29ya2VyIGRlYnVnIHNuYXBzaG90LlxuICAgKiBAcGFyYW0gez99IFtkYXRhLnBheWxvYWRdIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbZGF0YS5icm9hZGNhc3RQYXJhbXNdIC0gVjIgYnJvYWRjYXN0IGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7P30gW2RhdGEuYm9keV0gLSBWMiBicm9hZGNhc3QgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Xb3JrZXJNZXNzYWdlID0gKGRhdGEpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIldvcmtlciBtZXNzYWdlXCIsIHN1bW1hcml6ZVdvcmtlck1lc3NhZ2UoZGF0YSkpXG5cbiAgICBjb25zdCB7Y29tbWFuZH0gPSBkYXRhXG5cblxuICAgIGlmIChjb21tYW5kID09IFwic3RhcnRlZFwiKSB7XG4gICAgICB0aGlzLndvcmtlclN0YXJ0ZWQgPSB0cnVlXG4gICAgICB0aGlzLnJlZ2lzdGVyV2l0aEV2ZW50c0hvc3QoKVxuXG4gICAgICBpZiAodGhpcy5vblN0YXJ0Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vblN0YXJ0Q2FsbGJhY2sobnVsbClcbiAgICAgIH1cblxuICAgICAgdGhpcy5vblN0YXJ0Q2FsbGJhY2sgPSBudWxsXG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2xpZW50T3V0cHV0XCIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiQ0xJRU5UIE9VVFBVVFwiLCBzdW1tYXJpemVXb3JrZXJNZXNzYWdlKGRhdGEpKVxuXG4gICAgICBjb25zdCB7Y2xpZW50Q291bnQsIG91dHB1dH0gPSBkYXRhXG4gICAgICBjb25zdCBjbGllbnQgPSB0eXBlb2YgY2xpZW50Q291bnQgPT09IFwibnVtYmVyXCIgPyB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW2BWZWxvY2lvdXMgd29ya2VyICR7dGhpcy53b3JrZXJDb3VudH0gcHJvZHVjZWQgb3V0cHV0IGZvciBtaXNzaW5nIGNsaWVudCAke2NsaWVudENvdW50fWAsIGRhdGFdKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKG91dHB1dCAhPT0gbnVsbCAmJiBvdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBvdXRwdXRMZW5ndGggPSB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiID8gb3V0cHV0Lmxlbmd0aCA6IG91dHB1dC5ieXRlTGVuZ3RoXG5cbiAgICAgICAgdm9pZCBjbGllbnQuc2VuZChvdXRwdXQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIkNsaWVudCBvdXRwdXQgZGVsaXZlcmVkXCIsIHtcbiAgICAgICAgICAgIGNsaWVudENvdW50LFxuICAgICAgICAgICAgb3V0cHV0TGVuZ3RoLFxuICAgICAgICAgICAgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnRcbiAgICAgICAgICB9XSlcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIGRlbGl2ZXIgY2xpZW50IG91dHB1dFwiLCB7XG4gICAgICAgICAgICBjbGllbnRDb3VudCxcbiAgICAgICAgICAgIHdvcmtlckNvdW50OiB0aGlzLndvcmtlckNvdW50XG4gICAgICAgICAgfSwgZXJyb3JdKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNsaWVudENsb3NlXCIpIHtcbiAgICAgIGNvbnN0IHtjbGllbnRDb3VudH0gPSBkYXRhXG4gICAgICBjb25zdCBjbGllbnQgPSB0eXBlb2YgY2xpZW50Q291bnQgPT09IFwibnVtYmVyXCIgPyB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgVmVsb2Npb3VzIHdvcmtlciAke3RoaXMud29ya2VyQ291bnR9IHJlcXVlc3RlZCBjbG9zZSBmb3IgbWlzc2luZyBjbGllbnQgJHtjbGllbnRDb3VudH1gLCBkYXRhXSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHZvaWQgY2xpZW50LmVuZCgpXG5cbiAgICAgIGlmICh0eXBlb2YgY2xpZW50Q291bnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJkZWJ1Z1NuYXBzaG90XCIpIHtcbiAgICAgIGNvbnN0IHtyZXF1ZXN0SWQsIHNuYXBzaG90fSA9IGRhdGFcbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdElkICE9PSBcIm51bWJlclwiKSB0aHJvdyBuZXcgRXJyb3IoXCJkZWJ1Z1NuYXBzaG90IHJlcXVlc3RJZCBtdXN0IGJlIGEgbnVtYmVyXCIpXG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzLmdldChyZXF1ZXN0SWQpXG5cbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMuX2RlYnVnU25hcHNob3RSZXF1ZXN0cy5kZWxldGUocmVxdWVzdElkKVxuICAgICAgICByZXF1ZXN0LnJlc29sdmUoc25hcHNob3QgfHwge30pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwic2h1dGRvd25Db21wbGV0ZVwiKSB7XG4gICAgICB0aGlzLl9zdG9wUmVzb2x2ZT8uKClcbiAgICAgIHRoaXMuX3N0b3BSZXNvbHZlID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIndlYnNvY2tldFB1Ymxpc2hcIikge1xuICAgICAgY29uc3Qge2NoYW5uZWwsIHBheWxvYWR9ID0gZGF0YVxuXG4gICAgICBpZiAodHlwZW9mIGNoYW5uZWwgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdlYnNvY2tldCBwdWJsaXNoIGNoYW5uZWwgbXVzdCBiZSBhIHN0cmluZ1wiKVxuICAgICAgfVxuXG4gICAgICB3ZWJzb2NrZXRFdmVudHNIb3N0LnB1Ymxpc2goe2NoYW5uZWwsIHBheWxvYWR9KVxuICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIndlYnNvY2tldFYyQnJvYWRjYXN0XCIpIHtcbiAgICAgIGNvbnN0IHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWx9ID0gZGF0YVxuXG4gICAgICBpZiAodHlwZW9mIGNoYW5uZWwgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdlYnNvY2tldCB2Mi1icm9hZGNhc3QgY2hhbm5lbCBtdXN0IGJlIGEgc3RyaW5nXCIpXG4gICAgICB9XG5cbiAgICAgIHdlYnNvY2tldEV2ZW50c0hvc3QuYnJvYWRjYXN0VjIoe2JvZHksIGJyb2FkY2FzdFBhcmFtczogYnJvYWRjYXN0UGFyYW1zIHx8IHt9LCBjaGFubmVsfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkZWJ1ZyBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSAtIFdvcmtlci1sb2NhbCBkZWJ1ZyBzbmFwc2hvdC5cbiAgICovXG4gIGdldERlYnVnU25hcHNob3QoKSB7XG4gICAgaWYgKCF0aGlzLndvcmtlclN0YXJ0ZWQgfHwgIXRoaXMud29ya2VyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHthY3RpdmU6IGZhbHNlLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdElkID0gKyt0aGlzLl9kZWJ1Z1JlcXVlc3RJZFxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlYnVnU25hcHNob3RSZXF1ZXN0cy5kZWxldGUocmVxdWVzdElkKVxuICAgICAgICByZXNvbHZlKHthY3RpdmU6IHRydWUsIGVycm9yOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciB3b3JrZXIgZGVidWcgc25hcHNob3RcIiwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgICAgfSwgMjAwMClcblxuICAgICAgaWYgKHR5cGVvZiB0aW1lb3V0LnVucmVmID09PSBcImZ1bmN0aW9uXCIpIHRpbWVvdXQudW5yZWYoKVxuXG4gICAgICBjb25zdCB3b3JrZXIgPSB0aGlzLndvcmtlclxuXG4gICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgcmVzb2x2ZSh7YWN0aXZlOiBmYWxzZSwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGVidWdTbmFwc2hvdFJlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHtcbiAgICAgICAgcmVzb2x2ZTogKHNuYXBzaG90KSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgICAgcmVzb2x2ZSh7YWN0aXZlOiB0cnVlLCBzbmFwc2hvdCwgd29ya2VyQ291bnQ6IHRoaXMud29ya2VyQ291bnR9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOiBcImRlYnVnU25hcHNob3RcIiwgcmVxdWVzdElkfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RvcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBzdG9wcGVkLlxuICAgKi9cbiAgc3RvcCgpIHtcbiAgICBpZiAoIXRoaXMud29ya2VyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICBpZiAodGhpcy5faGFzRXhpdGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIHRoaXMuX3N0b3BwaW5nID0gdHJ1ZVxuICAgIHRoaXMud29ya2VyU3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3RJZk5lZWRlZCgpXG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy53b3JrZXJcblxuICAgIGlmICghd29ya2VyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5fc3RvcFJlc29sdmUgPSByZXNvbHZlXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6IFwic2h1dGRvd25cIn0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRpc3BhdGNoIHdlYnNvY2tldCBldmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNyZWF0ZWRBdF0gLSBFdmVudCBjcmVhdGlvbiB0aW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBFdmVudCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gez99IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZGlzcGF0Y2hXZWJzb2NrZXRFdmVudCh7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSkge1xuICAgIC8vIFRlc3QgYW5kIHNodXRkb3duIHBhdGhzIGNhbiBsZWF2ZSBhIHJlZ2lzdGVyZWQgaGFuZGxlciB3aXRob3V0IGEgbGl2ZSB3b3JrZXItdGhyZWFkIHRyYW5zcG9ydC5cbiAgICBpZiAoIXRoaXMud29ya2VyU3RhcnRlZCkgcmV0dXJuXG4gICAgaWYgKCF0aGlzLndvcmtlciB8fCB0eXBlb2YgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuXG5cbiAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7Y2hhbm5lbCwgY29tbWFuZDogXCJ3ZWJzb2NrZXRFdmVudFwiLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmRzIGEgVjIgY2hhbm5lbCBicm9hZGNhc3QgdG8gdGhpcyB3b3JrZXIncyB0aHJlYWQgc28gaXQgY2FuXG4gICAqIGRpc3BhdGNoIHRvIGFueSBsb2NhbGx5LXJlZ2lzdGVyZWQgVjIgc3Vic2NyaXB0aW9ucy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5icm9hZGNhc3RQYXJhbXMgLSBSb3V0aW5nIGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7P30gYXJncy5ib2R5IC0gTWVzc2FnZSBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBQZXJzaXN0ZWQgZXZlbnQgaWQgZm9yIHJlcGxheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNyZWF0ZWRBdF0gLSBFdmVudCBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGlzcGF0Y2hXZWJzb2NrZXRWMkJyb2FkY2FzdCh7Ym9keSwgYnJvYWRjYXN0UGFyYW1zLCBjaGFubmVsLCBldmVudElkLCBjcmVhdGVkQXR9KSB7XG4gICAgaWYgKCF0aGlzLndvcmtlclN0YXJ0ZWQpIHJldHVyblxuICAgIGlmICghdGhpcy53b3JrZXIgfHwgdHlwZW9mIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVyblxuXG4gICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbCwgY29tbWFuZDogXCJ3ZWJzb2NrZXRWMkJyb2FkY2FzdFwiLCBldmVudElkLCBjcmVhdGVkQXR9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgd2l0aCBldmVudHMgaG9zdC5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIHJlZ2lzdGVyV2l0aEV2ZW50c0hvc3QoKSB7XG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0KSByZXR1cm5cblxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0ID0gd2Vic29ja2V0RXZlbnRzSG9zdC5yZWdpc3Rlcih0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW5yZWdpc3RlciBmcm9tIGV2ZW50cyBob3N0IGlmIG5lZWRlZC5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIHVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdElmTmVlZGVkKCkge1xuICAgIGlmICghdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QpIHJldHVyblxuXG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3QoKVxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0ID0gbnVsbFxuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAqDA;IAME;;;;;;OAMG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAzBD;;oCAEgC;IAChC,QADU,MAAM,GAAG,SAAS,CACtB;IAcJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;;OAGG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAED,yBAgKC;IA/JC,gFAAyC;IAiK3C;;;;;OAKG;IACH,2CAHG;QAAqB,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAsB9D;IAED;;;;;OAKG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;;OAMG;IACH,uCALW,MAAM,YAEd;QAA0B,sBAAsB;KAChD,GAAU,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAgEvF;IAED;;;;;;;OAOG;IACH,wDALG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,cAFa,OAAO,GAAG,MAAM,CAI5B;IAED;;;;;OAKG;IACH,mBAJa,CAAC,YACH,MAAM,OAAO,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAQtB;IAED;;;;;;OAMG;IACH,yDAJG;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,IAAI,CAShB;IAED;;;;OAIG;IACH,uBAHW,IAAI,GACF,MAAM,CAsBlB;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,OAAC,CA6Bb;CACF;mBAzgBkB,cAAc"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAqDA;IAME;;;;;;OAMG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAzBD;;oCAEgC;IAChC,QADU,MAAM,GAAG,SAAS,CACtB;IAcJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;;OAGG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAED,yBAgKC;IA/JC,gFAAyC;IAiK3C;;;;;OAKG;IACH,2CAHG;QAAqB,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAsB9D;IAED;;;;;OAKG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;;OAMG;IACH,uCALW,MAAM,YAEd;QAA0B,sBAAsB;KAChD,GAAU,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAgEvF;IAED;;;;;;;OAOG;IACH,wDALG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,cAFa,OAAO,GAAG,MAAM,CAI5B;IAED;;;;;OAKG;IACH,mBAJa,CAAC,YACH,MAAM,OAAO,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAQtB;IAED;;;;;;OAMG;IACH,yDAJG;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,IAAI,CAShB;IAED;;;;OAIG;IACH,uBAHW,IAAI,GACF,MAAM,CAsBlB;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,OAAC,CA6Bb;CACF;mBAxgBkB,cAAc"}
@@ -3,9 +3,9 @@ import { dirname } from "path";
3
3
  import { fileURLToPath } from "url";
4
4
  import fs from "fs/promises";
5
5
  import * as inflection from "inflection";
6
+ import { ensureError } from "typanic";
6
7
  import Logger from "../logger.js";
7
8
  import UploadedFile from "../http-server/client/uploaded-file/uploaded-file.js";
8
- import ensureError from "../utils/ensure-error.js";
9
9
  import toImportSpecifier from "../utils/to-import-specifier.js";
10
10
  /**
11
11
  * Runs normalize action name.
@@ -453,4 +453,4 @@ export default class VelociousRoutesResolver {
453
453
  return value;
454
454
  }
455
455
  }
456
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLFlBQVksTUFBTSxzREFBc0QsQ0FBQTtBQUMvRSxPQUFPLFdBQVcsTUFBTSwwQkFBMEIsQ0FBQTtBQUNsRCxPQUFPLGlCQUFpQixNQUFNLGlDQUFpQyxDQUFBO0FBRS9EOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQVU7SUFDckMsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDeEYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLCtCQUErQixDQUFDLEtBQUs7SUFDNUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3BELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQTtJQUU3RixPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ25CLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVB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Q0FBQyxRQUFRLEVBQUU7Z0JBQzFCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFO2FBQ25CLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNsRSxDQUFDO1FBRUQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkM7OzJDQUUrQjtZQUMvQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7WUFFakIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDMUQsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFBO1FBQ2YsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlybmFtZX0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tIFwidXJsXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFVwbG9hZGVkRmlsZSBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3VwbG9hZGVkLWZpbGUvdXBsb2FkZWQtZmlsZS5qc1wiXG5pbXBvcnQgZW5zdXJlRXJyb3IgZnJvbSBcIi4uL3V0aWxzL2Vuc3VyZS1lcnJvci5qc1wiXG5pbXBvcnQgdG9JbXBvcnRTcGVjaWZpZXIgZnJvbSBcIi4uL3V0aWxzL3RvLWltcG9ydC1zcGVjaWZpZXIuanNcIlxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGFjdGlvbiBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBSYXcgYWN0aW9uIG5hbWUgZnJvbSByb3V0ZSBwYXJhbXMgb3Igcm91dGUgaG9vay5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCBjb250cm9sbGVyIG1ldGhvZCBuYW1lLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBY3Rpb25OYW1lKGFjdGlvbk5hbWUpIHtcbiAgcmV0dXJuIGluZmxlY3Rpb24uY2FtZWxpemUoYWN0aW9uTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikucmVwbGFjZUFsbChcIi9cIiwgXCJfXCIpLCB0cnVlKVxufVxuXG4vKipcbiAqIFJ1bnMgbWlzc2luZyBtb2R1bGUgc3BlY2lmaWVyIGZyb20gZXJyb3IuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEltcG9ydCBlcnJvci5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gTWlzc2luZyBtb2R1bGUgc3BlY2lmaWVyIGZyb20gYW4gRVJSX01PRFVMRV9OT1RfRk9VTkQgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gbWlzc2luZ01vZHVsZVNwZWNpZmllckZyb21FcnJvcihlcnJvcikge1xuICBjb25zdCBmaXJzdExpbmUgPSBlcnJvci5tZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdIHx8IFwiXCJcbiAgY29uc3QgbWF0Y2ggPSBmaXJzdExpbmUubWF0Y2goL15DYW5ub3QgZmluZCAoPzptb2R1bGV8cGFja2FnZSkgWydcIl0oLis/KVsnXCJdIGltcG9ydGVkIGZyb20gLylcblxuICByZXR1cm4gbWF0Y2g/LlsxXVxufVxuXG4vKipcbiAqIFJ1bnMgaXMgbWlzc2luZyB0YXJnZXQgbW9kdWxlIGVycm9yLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0Vycm9yfSBhcmdzLmVycm9yIC0gSW1wb3J0IGVycm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFyZ2V0UGF0aCAtIFRhcmdldCBjb250cm9sbGVyIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YXJnZXRJbXBvcnRTcGVjaWZpZXIgLSBUYXJnZXQgY29udHJvbGxlciBpbXBvcnQgc3BlY2lmaWVyLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSB3aGVuIHRoZSBtaXNzaW5nIG1vZHVsZSBpcyB0aGUgdGFyZ2V0IGNvbnRyb2xsZXIgZmlsZS5cbiAqL1xuZnVuY3Rpb24gaXNNaXNzaW5nVGFyZ2V0TW9kdWxlRXJyb3Ioe2Vycm9yLCB0YXJnZXRQYXRoLCB0YXJnZXRJbXBvcnRTcGVjaWZpZXJ9KSB7XG4gIGNvbnN0IGVuc3VyZWRFcnJvciA9IGVuc3VyZUVycm9yKGVycm9yKVxuICBjb25zdCBpc01vZHVsZU5vdEZvdW5kRXJyb3IgPSBcImNvZGVcIiBpbiBlbnN1cmVkRXJyb3IgJiYgZW5zdXJlZEVycm9yLmNvZGUgPT09IFwiRVJSX01PRFVMRV9OT1RfRk9VTkRcIlxuXG4gIGlmICghaXNNb2R1bGVOb3RGb3VuZEVycm9yKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBtaXNzaW5nU3BlY2lmaWVyID0gbWlzc2luZ01vZHVsZVNwZWNpZmllckZyb21FcnJvcihlbnN1cmVkRXJyb3IpXG5cbiAgaWYgKCFtaXNzaW5nU3BlY2lmaWVyKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gbWlzc2luZ1NwZWNpZmllciA9PT0gdGFyZ2V0UGF0aCB8fCBtaXNzaW5nU3BlY2lmaWVyID09PSB0YXJnZXRJbXBvcnRTcGVjaWZpZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzUm91dGVzUmVzb2x2ZXIge1xuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7TG9nZ2VyIHwgdW5kZWZpbmVkfSAqL1xuICBsb2dnZXJcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlcXVlc3QgLSBSZXF1ZXN0IG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNwb25zZSAtIFJlc3BvbnNlIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCByZXF1ZXN0LCByZXNwb25zZX0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcbiAgICBpZiAoIXJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlcXVlc3QgZ2l2ZW5cIilcbiAgICBpZiAoIXJlc3BvbnNlKSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXNwb25zZSBnaXZlblwiKVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcihcIlJvdXRlc1Jlc29sdmVyXCIsIHtjb25maWd1cmF0aW9ufSlcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gcmVxdWVzdC5wYXJhbXMoKSB8fCB7fVxuICAgIHRoaXMucGFyYW1zID0gey4uLnJlcXVlc3RQYXJhbXN9XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmFjdGlvblxuICAgIGRlbGV0ZSB0aGlzLnBhcmFtcy5jb250cm9sbGVyXG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcXVlcnkgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gRmxhdCBxdWVyeSBwYXJhbXMgZm9yIHRlbmFudC9hYmlsaXR5IHJlc29sdXRpb24uXG4gICAqL1xuICBxdWVyeVBhcmFtZXRlcnMoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnJlcXVlc3QucGF0aCgpLnNwbGl0KFwiP1wiKVsxXVxuXG4gICAgaWYgKCFxdWVyeSkgcmV0dXJuIHt9XG5cbiAgICAvKipcbiAgICAgKiBQYXJhbXMuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgcGFyYW1zID0ge31cbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5KVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc2VhcmNoUGFyYW1zLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHBhcmFtc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmUoKSB7XG4gICAgdGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MgPSB1bmRlZmluZWRcbiAgICBsZXQgY29udHJvbGxlclBhdGhcbiAgICBjb25zdCBjb25maWd1cmF0aW9uUm91dGVzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFJvdXRlcygpXG4gICAgY29uc3QgY3VycmVudFJvdXRlID0gY29uZmlndXJhdGlvblJvdXRlcz8ucm9vdFJvdXRlXG4gICAgY29uc3QgcmF3UGF0aCA9IHRoaXMucmVxdWVzdC5wYXRoKClcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHJhd1BhdGguc3BsaXQoXCI/XCIpWzBdXG4gICAgbGV0IHZpZXdQYXRoXG5cbiAgICBjb25zdCBwcmVDaGVja1BhcmFtcyA9IHsuLi50aGlzLnBhcmFtc31cbiAgICBjb25zdCBoYXNNYXRjaGluZ0N1c3RvbVJvdXRlID0gY3VycmVudFJvdXRlID8gISF0aGlzLm1hdGNoUGF0aFdpdGhSb3V0ZXMoY3VycmVudFJvdXRlLCBjdXJyZW50UGF0aCkgOiBmYWxzZVxuXG4gICAgaWYgKGhhc01hdGNoaW5nQ3VzdG9tUm91dGUpIHtcbiAgICAgIHRoaXMucGFyYW1zID0gcHJlQ2hlY2tQYXJhbXNcbiAgICB9XG5cbiAgICBjb25zdCByb3V0ZVJlc29sdmVySG9va01hdGNoID0gYXdhaXQgdGhpcy5yZXNvbHZlUm91dGVSZXNvbHZlckhvb2tzKGN1cnJlbnRQYXRoLCB7aGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZX0pXG4gICAgbGV0IHNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgPSByb3V0ZVJlc29sdmVySG9va01hdGNoPy5za2lwQ29udHJvbGxlckNvbm5lY3Rpb25zID09PSB0cnVlXG4gICAgbGV0IHNraXBBYmlsaXR5UmVzb2x1dGlvbiA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2g/LnNraXBBYmlsaXR5UmVzb2x1dGlvbiA9PT0gdHJ1ZVxuICAgIGxldCBza2lwVGVuYW50UmVzb2x1dGlvbiA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2g/LnNraXBUZW5hbnRSZXNvbHV0aW9uID09PSB0cnVlXG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSByb3V0ZVJlc29sdmVySG9va01hdGNoIHx8ICFjdXJyZW50Um91dGUgPyB1bmRlZmluZWQgOiB0aGlzLm1hdGNoUGF0aFdpdGhSb3V0ZXMoY3VycmVudFJvdXRlLCBjdXJyZW50UGF0aClcbiAgICBjb25zdCBhY3Rpb25QYXJhbSA9IHRoaXMucGFyYW1zLmFjdGlvblxuICAgIGNvbnN0IGNvbnRyb2xsZXJQYXJhbSA9IHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICBjb25zdCBhY3Rpb25WYWx1ZSA9IHR5cGVvZiBhY3Rpb25QYXJhbSA9PSBcInN0cmluZ1wiID8gYWN0aW9uUGFyYW0gOiAoQXJyYXkuaXNBcnJheShhY3Rpb25QYXJhbSkgPyBhY3Rpb25QYXJhbVswXSA6IHVuZGVmaW5lZClcbiAgICBsZXQgYWN0aW9uID0gdHlwZW9mIGFjdGlvblZhbHVlID09IFwic3RyaW5nXCIgPyBub3JtYWxpemVBY3Rpb25OYW1lKGFjdGlvblZhbHVlKSA6IHVuZGVmaW5lZFxuICAgIGxldCBjb250cm9sbGVyID0gdHlwZW9mIGNvbnRyb2xsZXJQYXJhbSA9PSBcInN0cmluZ1wiID8gY29udHJvbGxlclBhcmFtIDogKEFycmF5LmlzQXJyYXkoY29udHJvbGxlclBhcmFtKSA/IGNvbnRyb2xsZXJQYXJhbVswXSA6IHVuZGVmaW5lZClcblxuICAgIGlmIChyb3V0ZVJlc29sdmVySG9va01hdGNoKSB7XG4gICAgICBjb25zdCByb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MgPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJDbGFzc1xuICAgICAgbGV0IHJvdXRlSG9va0NvbnRyb2xsZXJQYXRoXG4gICAgICBsZXQgcm91dGVIb29rVmlld1BhdGhcblxuICAgICAgaWYgKHR5cGVvZiByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJQYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJvdXRlSG9va0NvbnRyb2xsZXJQYXRoID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5jb250cm9sbGVyUGF0aFxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gudmlld1BhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm91dGVIb29rVmlld1BhdGggPSByb3V0ZVJlc29sdmVySG9va01hdGNoLnZpZXdQYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2xsZXIgPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJcbiAgICAgIGFjdGlvbiA9IG5vcm1hbGl6ZUFjdGlvbk5hbWUocm91dGVSZXNvbHZlckhvb2tNYXRjaC5hY3Rpb24pXG4gICAgICB0aGlzLnBhcmFtcy5jb250cm9sbGVyID0gY29udHJvbGxlclxuICAgICAgdGhpcy5wYXJhbXMuYWN0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5hY3Rpb25cbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gcm91dGVIb29rQ29udHJvbGxlclBhdGggfHwgYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn0vY29udHJvbGxlci5qc2BcbiAgICAgIHZpZXdQYXRoID0gcm91dGVIb29rVmlld1BhdGggfHwgYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn1gXG4gICAgICB0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHJvdXRlSG9va0NvbnRyb2xsZXJDbGFzc1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgICBjb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpXG4gICAgICBjb25zdCByZXF1ZXN0ZWRQYXRoID0gY3VycmVudFBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpIHx8IFwiX3Jvb3RcIlxuICAgICAgY29uc3QgYXR0ZW1wdGVkQ29udHJvbGxlclBhdGggPSBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtyZXF1ZXN0ZWRQYXRofS9jb250cm9sbGVyLmpzYFxuXG4gICAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlclxuXG4gICAgICBpZiAoIWxvZ2dlcikgdGhyb3cgbmV3IEVycm9yKFwiTG9nZ2VyIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgICBhd2FpdCBsb2dnZXIud2FybihgTm8gcm91dGUgbWF0Y2hlZCBmb3IgJHtyYXdQYXRofS4gVHJpZWQgY29udHJvbGxlciBhdCAke2F0dGVtcHRlZENvbnRyb2xsZXJQYXRofWApXG5cbiAgICAgIGNvbnRyb2xsZXIgPSBcImVycm9yc1wiXG4gICAgICBjb250cm9sbGVyUGF0aCA9IFwiLi9idWlsdC1pbi9lcnJvcnMvY29udHJvbGxlci5qc1wiXG4gICAgICBhY3Rpb24gPSBcIm5vdEZvdW5kXCJcbiAgICAgIHNraXBBYmlsaXR5UmVzb2x1dGlvbiA9IHRydWVcbiAgICAgIHNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgPSB0cnVlXG4gICAgICBza2lwVGVuYW50UmVzb2x1dGlvbiA9IHRydWVcbiAgICAgIHZpZXdQYXRoID0gYXdhaXQgZnMucmVhbHBhdGgoYCR7X19kaXJuYW1lfS9idWlsdC1pbi9lcnJvcnNgKVxuICAgIH0gZWxzZSBpZiAoYWN0aW9uKSB7XG4gICAgICBpZiAoIWNvbnRyb2xsZXIpIGNvbnRyb2xsZXIgPSBcIl9yb290XCJcblxuICAgICAgY29udHJvbGxlclBhdGggPSBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfS9jb250cm9sbGVyLmpzYFxuICAgICAgdmlld1BhdGggPSBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfWBcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXRjaGVkIHRoZSByb3V0ZSBidXQgZGlkbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIGl0OiAke3Jhd1BhdGh9IChhY3Rpb246ICR7YWN0aW9ufSwgY29udHJvbGxlcjogJHtjb250cm9sbGVyfSwgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGFyYW1zKX0pYClcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyQ2xhc3MgPSBhd2FpdCB0aGlzLnJlc29sdmVDb250cm9sbGVyQ2xhc3Moe2NvbnRyb2xsZXJQYXRofSlcbiAgICBjb25zdCBjb250cm9sbGVyUmVxdWVzdCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMucmVxdWVzdClcbiAgICBjb25zdCBjb250cm9sbGVySW5zdGFuY2UgPSBuZXcgY29udHJvbGxlckNsYXNzKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgcmVxdWVzdDogY29udHJvbGxlclJlcXVlc3QsXG4gICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZSxcbiAgICAgIHZpZXdQYXRoXG4gICAgfSlcblxuICAgIGlmICghKGFjdGlvbiBpbiBjb250cm9sbGVySW5zdGFuY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYWN0aW9uIG9uIGNvbnRyb2xsZXI6ICR7Y29udHJvbGxlcn0jJHthY3Rpb259YClcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25IYW5kbGVycyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4+fSAqLyAoLyoqIEB0eXBlIHs/fSAqLyAoY29udHJvbGxlckluc3RhbmNlKSlcblxuICAgIGNvbnN0IGxvZ01ldGhvZCA9IHRoaXMuX2xvZ01ldGhvZCgpXG5cbiAgICB0aGlzLl9zZXRDb21wbGV0ZWRMb2dNZXRhZGF0YSh7Y29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KVxuICAgIGF3YWl0IHRoaXMuX2xvZ0FjdGlvblN0YXJ0KHthY3Rpb24sIGNvbnRyb2xsZXJDbGFzcywgbG9nTWV0aG9kfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBza2lwVGVuYW50UmVzb2x1dGlvblxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgICAgICAgIHBhcmFtczogey4uLnRoaXMucXVlcnlQYXJhbWV0ZXJzKCksIC4uLnRoaXMucGFyYW1zfSxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlXG4gICAgICAgICAgfSlcblxuICAgICAgY29uc3QgcnVuQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBydW5Db250cm9sbGVyQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWJpbGl0eSA9IHNraXBBYmlsaXR5UmVzb2x1dGlvblxuICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7XG4gICAgICAgICAgICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aEFiaWxpdHkoYWJpbGl0eSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9tZWFzdXJlQ29udHJvbGxlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbGxlckluc3RhbmNlLl9ydW5CZWZvcmVDYWxsYmFja3MoKVxuICAgICAgICAgICAgICAgIGF3YWl0IGFjdGlvbkhhbmRsZXJzW2FjdGlvbl0oKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgcnVuQ29udHJvbGxlckFjdGlvbigpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7Y29udHJvbGxlckNsYXNzLm5hbWV9LiR7YWN0aW9ufWB9LCBydW5Db250cm9sbGVyQWN0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJvdW5kQWN0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEFyb3VuZEFjdGlvbj8uKClcblxuICAgICAgaWYgKGFyb3VuZEFjdGlvbikge1xuICAgICAgICBhd2FpdCBhcm91bmRBY3Rpb24oe3JlcXVlc3Q6IHRoaXMucmVxdWVzdCwgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2UsIG5leHQ6IHJ1bkFjdGlvbn0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBydW5BY3Rpb24oKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSBlbnN1cmVFcnJvcihlcnJvcilcbiAgICAgIGNvbnN0IGVycm9yQ29udGV4dCA9IHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBodHRwTWV0aG9kOiB0aGlzLnJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICBwYXRoOiB0aGlzLnJlcXVlc3QucGF0aCgpLFxuICAgICAgICBzdGFnZTogXCJjb250cm9sbGVyLWFjdGlvblwiXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yV2l0aENvbnRleHQgPSAvKiogQHR5cGUge3t2ZWxvY2lvdXNDb250ZXh0Pzogb2JqZWN0fX0gKi8gKGVuc3VyZWRFcnJvcilcblxuICAgICAgZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAuLi4oZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgY29udHJvbGxlckFjdGlvbjogZXJyb3JDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVuc3VyZWRFcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb250cm9sbGVyUGF0aCAtIENvbnRyb2xsZXIgaW1wb3J0IHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQ+fSAtIFRoZSByZXNvbHZlZCBjb250cm9sbGVyIGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KSB7XG4gICAgY29uc3QgY29udHJvbGxlckltcG9ydFNwZWNpZmllciA9IHRvSW1wb3J0U3BlY2lmaWVyKGNvbnRyb2xsZXJQYXRoKVxuXG4gICAgaWYgKCF0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcykge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gKi8gKChhd2FpdCBpbXBvcnQoY29udHJvbGxlckltcG9ydFNwZWNpZmllcikpLmRlZmF1bHQpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICgoYXdhaXQgaW1wb3J0KGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIpKS5kZWZhdWx0KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBpc01pc3NpbmdDb250cm9sbGVyRmlsZUVycm9yID0gaXNNaXNzaW5nVGFyZ2V0TW9kdWxlRXJyb3Ioe1xuICAgICAgICBlcnJvcjogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgICB0YXJnZXRJbXBvcnRTcGVjaWZpZXI6IGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIsXG4gICAgICAgIHRhcmdldFBhdGg6IGNvbnRyb2xsZXJQYXRoXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWlzTWlzc2luZ0NvbnRyb2xsZXJGaWxlRXJyb3IpIHRocm93IGVuc3VyZUVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2ggcGF0aCB3aXRoIHJvdXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgcGFyYW1zU25hcHNob3QgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN1YlJvdXRlLm1hdGNoV2l0aFBhdGgoe1xuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICBwYXRoOiBwYXRoV2l0aG91dFNsYXNoLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RcbiAgICAgIH0pXG5cbiAgICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlY3Vyc2l2ZU1hdGNoID0gdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKHN1YlJvdXRlLCByZXN0UGF0aClcblxuICAgICAgICBpZiAocmVjdXJzaXZlTWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlTWF0Y2hcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zU25hcHNob3RcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoUmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSByb3V0ZSByZXNvbHZlciBob29rcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkgc3RyaW5nLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFJlc29sdmVyIGhvb2sgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiB0aGUgcGF0aCBtYXRjaGVkIGFuIGV4cGxpY2l0IGN1c3RvbSByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Sb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSAtIE1hdGNoZWQgYWN0aW9uL2NvbnRyb2xsZXIgZnJvbSBob29rcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlID0gZmFsc2V9ID0gb3B0aW9uc1xuXG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVSZXNvbHZlckhvb2tzPy4oKSB8fCBbXVxuXG4gICAgZm9yIChjb25zdCBob29rIG9mIGhvb2tzKSB7XG4gICAgICBjb25zdCBob29rUmVzdWx0ID0gYXdhaXQgaG9vayh7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgY3VycmVudFBhdGgsXG4gICAgICAgIGhhc01hdGNoaW5nQ3VzdG9tUm91dGUsXG4gICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgcmVzb2x2ZXI6IHRoaXMsXG4gICAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWhvb2tSZXN1bHQpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgaG9va1Jlc3VsdC5hY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5hY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgYWN0aW9uIHRvIGJlIGEgc3RyaW5nLCBnb3Q6ICR7aG9va1Jlc3VsdC5hY3Rpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXIgIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5jb250cm9sbGVyLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXIgdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJ9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zICYmIHR5cGVvZiBob29rUmVzdWx0LnBhcmFtcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgcGFyYW1zIHRvIGJlIGFuIG9iamVjdCwgZ290OiAke2hvb2tSZXN1bHQucGFyYW1zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyQ2xhc3MgdG8gYmUgYSBjbGFzcy9mdW5jdGlvbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyQ2xhc3N9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuY29udHJvbGxlclBhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlclBhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlclBhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwQ29udHJvbGxlckNvbm5lY3Rpb25zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBBYmlsaXR5UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9ufWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBUZW5hbnRSZXNvbHV0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb24gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwVGVuYW50UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQudmlld1BhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC52aWV3UGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgdmlld1BhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQudmlld1BhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIGhvb2tSZXN1bHQucGFyYW1zKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaG9va1Jlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb2cgYWN0aW9uIHN0YXJ0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBBY3Rpb24uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gYXJncy5jb250cm9sbGVyQ2xhc3MgLSBDb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge1wiZGVidWdcIiB8IFwiaW5mb1wifSBhcmdzLmxvZ01ldGhvZCAtIExvZ2dlciBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuX2Zvcm1hdFRpbWVzdGFtcChuZXcgRGF0ZSgpKVxuICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSByZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKSB8fCBcInVua25vd25cIlxuICAgIGNvbnN0IGxvZ2dlZFBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodGhpcy5wYXJhbXMpKVxuXG4gICAgZGVsZXRlIGxvZ2dlZFBhcmFtcy5hY3Rpb25cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmNvbnRyb2xsZXJcblxuICAgIGNvbnN0IGNvbnRyb2xsZXJMb2dnZXIgPSBuZXcgTG9nZ2VyKGNvbnRyb2xsZXJDbGFzcy5uYW1lLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcblxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgU3RhcnRlZCAke3JlcXVlc3QuaHR0cE1ldGhvZCgpfSBcIiR7cmVxdWVzdC5wYXRoKCl9XCIgZm9yICR7cmVtb3RlQWRkcmVzc30gYXQgJHt0aW1lc3RhbXB9YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gYFByb2Nlc3NpbmcgYnkgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0jJHthY3Rpb259YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gW2AgIFBhcmFtZXRlcnM6YCwgbG9nZ2VkUGFyYW1zXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtcImRlYnVnXCIgfCBcImluZm9cIn0gLSBSZXF1ZXN0IGxvZyBtZXRob2QuXG4gICAqL1xuICBfbG9nTWV0aG9kKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIgPyBcImRlYnVnXCIgOiBcImluZm9cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWVhc3VyZSBjb250cm9sbGVyLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gbWVhc3VyZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX21lYXN1cmVDb250cm9sbGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVxdWVzdFRpbWluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDdXJyZW50UmVxdWVzdFRpbWluZygpXG5cbiAgICByZXR1cm4gcmVxdWVzdFRpbWluZ1xuICAgICAgPyBhd2FpdCByZXF1ZXN0VGltaW5nLm1lYXN1cmUoXCJjb250cm9sbGVyXCIsIGNhbGxiYWNrKVxuICAgICAgOiBhd2FpdCBjYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY29tcGxldGVkIGxvZyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbnRyb2xsZXJDbGFzcyAtIENvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJkZWJ1Z1wiIHwgXCJpbmZvXCJ9IGFyZ3MubG9nTWV0aG9kIC0gTG9nZ2VyIG1ldGhvZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pIHtcbiAgICBjb25zdCByZXF1ZXN0VGltaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcblxuICAgIGlmICghcmVxdWVzdFRpbWluZykgcmV0dXJuXG5cbiAgICByZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ1N1YmplY3QgPSBjb250cm9sbGVyQ2xhc3MubmFtZVxuICAgIHJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nTWV0aG9kID0gbG9nTWV0aG9kXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXQgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0aW1lc3RhbXAuXG4gICAqL1xuICBfZm9ybWF0VGltZXN0YW1wKGRhdGUpIHtcbiAgICAvKipcbiAgICAgKiBQYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bSAtIE51bS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkID0gKG51bSkgPT4gU3RyaW5nKG51bSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gICAgY29uc3QgZGF5ID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICAgIGNvbnN0IHNlY29uZHMgPSBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgY29uc3Qgb2Zmc2V0TWludXRlcyA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICAgIGNvbnN0IG9mZnNldFNpZ24gPSBvZmZzZXRNaW51dGVzID4gMCA/IFwiLVwiIDogXCIrXCJcbiAgICBjb25zdCBvZmZzZXRUb3RhbE1pbnV0ZXMgPSBNYXRoLmFicyhvZmZzZXRNaW51dGVzKVxuICAgIGNvbnN0IG9mZnNldEhvdXJzID0gcGFkKE1hdGguZmxvb3Iob2Zmc2V0VG90YWxNaW51dGVzIC8gNjApKVxuICAgIGNvbnN0IG9mZnNldFJlbWFpbmluZ01pbnV0ZXMgPSBwYWQob2Zmc2V0VG90YWxNaW51dGVzICUgNjApXG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aG91cnN9OiR7bWludXRlc306JHtzZWNvbmRzfSAke29mZnNldFNpZ259JHtvZmZzZXRIb3Vyc30ke29mZnNldFJlbWFpbmluZ01pbnV0ZXN9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7P30gLSBUaGUgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKi9cbiAgX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVwbG9hZGVkRmlsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3NOYW1lOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBmaWxlbmFtZTogdmFsdWUuZmlsZW5hbWUoKSxcbiAgICAgICAgc2l6ZTogdmFsdWUuc2l6ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcoaXRlbSkpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXN1bHQuXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodmFsdWVba2V5XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iXX0=
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sWUFBWSxNQUFNLHNEQUFzRCxDQUFBO0FBQy9FLE9BQU8saUJBQWlCLE1BQU0saUNBQWlDLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsK0JBQStCLENBQUMsS0FBSztJQUM1QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDcEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO0lBRTdGLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLDBCQUEwQixDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxx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QUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDMUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7YUFDbkIsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2Qzs7MkNBRStCO1lBQy9CLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUVqQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaXJuYW1lfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgVXBsb2FkZWRGaWxlIGZyb20gXCIuLi9odHRwLXNlcnZlci9jbGllbnQvdXBsb2FkZWQtZmlsZS91cGxvYWRlZC1maWxlLmpzXCJcbmltcG9ydCB0b0ltcG9ydFNwZWNpZmllciBmcm9tIFwiLi4vdXRpbHMvdG8taW1wb3J0LXNwZWNpZmllci5qc1wiXG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIFJhdyBhY3Rpb24gbmFtZSBmcm9tIHJvdXRlIHBhcmFtcyBvciByb3V0ZSBob29rLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIGNvbnRyb2xsZXIgbWV0aG9kIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uTmFtZSkge1xuICByZXR1cm4gaW5mbGVjdGlvbi5jYW1lbGl6ZShhY3Rpb25OYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIiksIHRydWUpXG59XG5cbi8qKlxuICogUnVucyBtaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBlcnJvci5cbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gSW1wb3J0IGVycm9yLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBNaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBhbiBFUlJfTU9EVUxFX05PVF9GT1VORCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVycm9yKSB7XG4gIGNvbnN0IGZpcnN0TGluZSA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF0gfHwgXCJcIlxuICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvXkNhbm5vdCBmaW5kICg/Om1vZHVsZXxwYWNrYWdlKSBbJ1wiXSguKz8pWydcIl0gaW1wb3J0ZWQgZnJvbSAvKVxuXG4gIHJldHVybiBtYXRjaD8uWzFdXG59XG5cbi8qKlxuICogUnVucyBpcyBtaXNzaW5nIHRhcmdldCBtb2R1bGUgZXJyb3IuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RXJyb3J9IGFyZ3MuZXJyb3IgLSBJbXBvcnQgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YXJnZXRQYXRoIC0gVGFyZ2V0IGNvbnRyb2xsZXIgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhcmdldEltcG9ydFNwZWNpZmllciAtIFRhcmdldCBjb250cm9sbGVyIGltcG9ydCBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIG1pc3NpbmcgbW9kdWxlIGlzIHRoZSB0YXJnZXQgY29udHJvbGxlciBmaWxlLlxuICovXG5mdW5jdGlvbiBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7ZXJyb3IsIHRhcmdldFBhdGgsIHRhcmdldEltcG9ydFNwZWNpZmllcn0pIHtcbiAgY29uc3QgZW5zdXJlZEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IpXG4gIGNvbnN0IGlzTW9kdWxlTm90Rm91bmRFcnJvciA9IFwiY29kZVwiIGluIGVuc3VyZWRFcnJvciAmJiBlbnN1cmVkRXJyb3IuY29kZSA9PT0gXCJFUlJfTU9EVUxFX05PVF9GT1VORFwiXG5cbiAgaWYgKCFpc01vZHVsZU5vdEZvdW5kRXJyb3IpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1pc3NpbmdTcGVjaWZpZXIgPSBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVuc3VyZWRFcnJvcilcblxuICBpZiAoIW1pc3NpbmdTcGVjaWZpZXIpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBtaXNzaW5nU3BlY2lmaWVyID09PSB0YXJnZXRQYXRoIHx8IG1pc3NpbmdTcGVjaWZpZXIgPT09IHRhcmdldEltcG9ydFNwZWNpZmllclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNSb3V0ZXNSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtMb2dnZXIgfCB1bmRlZmluZWR9ICovXG4gIGxvZ2dlclxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdCBnaXZlblwiKVxuICAgIGlmICghcmVzcG9uc2UpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3BvbnNlIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUm91dGVzUmVzb2x2ZXJcIiwge2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSByZXF1ZXN0LnBhcmFtcygpIHx8IHt9XG4gICAgdGhpcy5wYXJhbXMgPSB7Li4ucmVxdWVzdFBhcmFtc31cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBGbGF0IHF1ZXJ5IHBhcmFtcyBmb3IgdGVuYW50L2FiaWxpdHkgcmVzb2x1dGlvbi5cbiAgICovXG4gIHF1ZXJ5UGFyYW1ldGVycygpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucmVxdWVzdC5wYXRoKCkuc3BsaXQoXCI/XCIpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm4ge31cblxuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7fVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnkpXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZSgpIHtcbiAgICB0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHVuZGVmaW5lZFxuICAgIGxldCBjb250cm9sbGVyUGF0aFxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb3V0ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVzKClcbiAgICBjb25zdCBjdXJyZW50Um91dGUgPSBjb25maWd1cmF0aW9uUm91dGVzPy5yb290Um91dGVcbiAgICBjb25zdCByYXdQYXRoID0gdGhpcy5yZXF1ZXN0LnBhdGgoKVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcmF3UGF0aC5zcGxpdChcIj9cIilbMF1cbiAgICBsZXQgdmlld1BhdGhcblxuICAgIGNvbnN0IHByZUNoZWNrUGFyYW1zID0gey4uLnRoaXMucGFyYW1zfVxuICAgIGNvbnN0IGhhc01hdGNoaW5nQ3VzdG9tUm91dGUgPSBjdXJyZW50Um91dGUgPyAhIXRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKSA6IGZhbHNlXG5cbiAgICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkge1xuICAgICAgdGhpcy5wYXJhbXMgPSBwcmVDaGVja1BhcmFtc1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggPSBhd2FpdCB0aGlzLnJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSlcbiAgICBsZXQgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2g/LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgPT09IHRydWVcbiAgICBsZXQgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcEFiaWxpdHlSZXNvbHV0aW9uID09PSB0cnVlXG4gICAgbGV0IHNraXBUZW5hbnRSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcFRlbmFudFJlc29sdXRpb24gPT09IHRydWVcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggfHwgIWN1cnJlbnRSb3V0ZSA/IHVuZGVmaW5lZCA6IHRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IGFjdGlvblBhcmFtID0gdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtID0gdGhpcy5wYXJhbXMuY29udHJvbGxlclxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gdHlwZW9mIGFjdGlvblBhcmFtID09IFwic3RyaW5nXCIgPyBhY3Rpb25QYXJhbSA6IChBcnJheS5pc0FycmF5KGFjdGlvblBhcmFtKSA/IGFjdGlvblBhcmFtWzBdIDogdW5kZWZpbmVkKVxuICAgIGxldCBhY3Rpb24gPSB0eXBlb2YgYWN0aW9uVmFsdWUgPT0gXCJzdHJpbmdcIiA/IG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uVmFsdWUpIDogdW5kZWZpbmVkXG4gICAgbGV0IGNvbnRyb2xsZXIgPSB0eXBlb2YgY29udHJvbGxlclBhcmFtID09IFwic3RyaW5nXCIgPyBjb250cm9sbGVyUGFyYW0gOiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVyUGFyYW0pID8gY29udHJvbGxlclBhcmFtWzBdIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlckNsYXNzXG4gICAgICBsZXQgcm91dGVIb29rQ29udHJvbGxlclBhdGhcbiAgICAgIGxldCByb3V0ZUhvb2tWaWV3UGF0aFxuXG4gICAgICBpZiAodHlwZW9mIHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm91dGVIb29rQ29udHJvbGxlclBhdGggPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJQYXRoXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygcm91dGVSZXNvbHZlckhvb2tNYXRjaC52aWV3UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByb3V0ZUhvb2tWaWV3UGF0aCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gudmlld1BhdGhcbiAgICAgIH1cblxuICAgICAgY29udHJvbGxlciA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclxuICAgICAgYWN0aW9uID0gbm9ybWFsaXplQWN0aW9uTmFtZShyb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvbilcbiAgICAgIHRoaXMucGFyYW1zLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyXG4gICAgICB0aGlzLnBhcmFtcy5hY3Rpb24gPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvblxuICAgICAgY29udHJvbGxlclBhdGggPSByb3V0ZUhvb2tDb250cm9sbGVyUGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfS9jb250cm9sbGVyLmpzYFxuICAgICAgdmlld1BhdGggPSByb3V0ZUhvb2tWaWV3UGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfWBcbiAgICAgIHRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVIb29rQ29udHJvbGxlckNsYXNzXG4gICAgfSBlbHNlIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICAgIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcbiAgICAgIGNvbnN0IHJlcXVlc3RlZFBhdGggPSBjdXJyZW50UGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgfHwgXCJfcm9vdFwiXG4gICAgICBjb25zdCBhdHRlbXB0ZWRDb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke3JlcXVlc3RlZFBhdGh9L2NvbnRyb2xsZXIuanNgXG5cbiAgICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyXG5cbiAgICAgIGlmICghbG9nZ2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJMb2dnZXIgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBObyByb3V0ZSBtYXRjaGVkIGZvciAke3Jhd1BhdGh9LiBUcmllZCBjb250cm9sbGVyIGF0ICR7YXR0ZW1wdGVkQ29udHJvbGxlclBhdGh9YClcblxuICAgICAgY29udHJvbGxlciA9IFwiZXJyb3JzXCJcbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gXCIuL2J1aWx0LWluL2Vycm9ycy9jb250cm9sbGVyLmpzXCJcbiAgICAgIGFjdGlvbiA9IFwibm90Rm91bmRcIlxuICAgICAgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHRydWVcbiAgICAgIHNraXBUZW5hbnRSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgdmlld1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9L2J1aWx0LWluL2Vycm9yc2ApXG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGlmICghY29udHJvbGxlcikgY29udHJvbGxlciA9IFwiX3Jvb3RcIlxuXG4gICAgICBjb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoZWQgdGhlIHJvdXRlIGJ1dCBkaWRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQ6ICR7cmF3UGF0aH0gKGFjdGlvbjogJHthY3Rpb259LCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9LCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbXMpfSlgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yZXF1ZXN0KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiBjb250cm9sbGVyUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgaWYgKCEoYWN0aW9uIGluIGNvbnRyb2xsZXJJbnN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb24gb24gY29udHJvbGxlcjogJHtjb250cm9sbGVyfSMke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj59ICovICgvKiogQHR5cGUgez99ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgY29uc3QgbG9nTWV0aG9kID0gdGhpcy5fbG9nTWV0aG9kKClcblxuICAgIHRoaXMuX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pXG4gICAgYXdhaXQgdGhpcy5fbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHNraXBUZW5hbnRSZXNvbHV0aW9uXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgICAgICAgcGFyYW1zOiB7Li4udGhpcy5xdWVyeVBhcmFtZXRlcnMoKSwgLi4udGhpcy5wYXJhbXN9LFxuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICB9KVxuXG4gICAgICBjb25zdCBydW5BY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJ1bkNvbnRyb2xsZXJBY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhYmlsaXR5ID0gc2tpcEFiaWxpdHlSZXNvbHV0aW9uXG4gICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgIDogYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtcbiAgICAgICAgICAgICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21lYXN1cmVDb250cm9sbGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sbGVySW5zdGFuY2UuX3J1bkJlZm9yZUNhbGxiYWNrcygpXG4gICAgICAgICAgICAgICAgYXdhaXQgYWN0aW9uSGFuZGxlcnNbYWN0aW9uXSgpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5Db250cm9sbGVyQWN0aW9uKClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0uJHthY3Rpb259YH0sIHJ1bkNvbnRyb2xsZXJBY3Rpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhcm91bmRBY3Rpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0QXJvdW5kQWN0aW9uPy4oKVxuXG4gICAgICBpZiAoYXJvdW5kQWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IGFyb3VuZEFjdGlvbih7cmVxdWVzdDogdGhpcy5yZXF1ZXN0LCByZXNwb25zZTogdGhpcy5yZXNwb25zZSwgbmV4dDogcnVuQWN0aW9ufSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHJ1bkFjdGlvbigpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVuc3VyZWRFcnJvciA9IGVuc3VyZUVycm9yKGVycm9yKVxuICAgICAgY29uc3QgZXJyb3JDb250ZXh0ID0ge1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgIGh0dHBNZXRob2Q6IHRoaXMucmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICAgIHBhdGg6IHRoaXMucmVxdWVzdC5wYXRoKCksXG4gICAgICAgIHN0YWdlOiBcImNvbnRyb2xsZXItYWN0aW9uXCJcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JXaXRoQ29udGV4dCA9IC8qKiBAdHlwZSB7e3ZlbG9jaW91c0NvbnRleHQ/OiBvYmplY3R9fSAqLyAoZW5zdXJlZEVycm9yKVxuXG4gICAgICBlcnJvcldpdGhDb250ZXh0LnZlbG9jaW91c0NvbnRleHQgPSB7XG4gICAgICAgIC4uLihlcnJvcldpdGhDb250ZXh0LnZlbG9jaW91c0NvbnRleHQgfHwge30pLFxuICAgICAgICBjb250cm9sbGVyQWN0aW9uOiBlcnJvckNvbnRleHRcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZW5zdXJlZEVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbnRyb2xsZXJQYXRoIC0gQ29udHJvbGxlciBpbXBvcnQgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdD59IC0gVGhlIHJlc29sdmVkIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQ29udHJvbGxlckNsYXNzKHtjb250cm9sbGVyUGF0aH0pIHtcbiAgICBjb25zdCBjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyID0gdG9JbXBvcnRTcGVjaWZpZXIoY29udHJvbGxlclBhdGgpXG5cbiAgICBpZiAoIXRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAqLyAoKGF3YWl0IGltcG9ydChjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyKSkuZGVmYXVsdClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gKi8gKChhd2FpdCBpbXBvcnQoY29udHJvbGxlckltcG9ydFNwZWNpZmllcikpLmRlZmF1bHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGlzTWlzc2luZ0NvbnRyb2xsZXJGaWxlRXJyb3IgPSBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7XG4gICAgICAgIGVycm9yOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICAgIHRhcmdldEltcG9ydFNwZWNpZmllcjogY29udHJvbGxlckltcG9ydFNwZWNpZmllcixcbiAgICAgICAgdGFyZ2V0UGF0aDogY29udHJvbGxlclBhdGhcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaXNNaXNzaW5nQ29udHJvbGxlckZpbGVFcnJvcikgdGhyb3cgZW5zdXJlRXJyb3IoZXJyb3IpXG5cbiAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBtYXRjaCBwYXRoIHdpdGggcm91dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS1yb3V0ZS5qc1wiKS5kZWZhdWx0fSByb3V0ZSAtIFJvdXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEByZXR1cm5zIHt7cmVzdFBhdGg6IHN0cmluZ30gfCB1bmRlZmluZWR9IC0gUkVTVCBwYXRoIG1ldGFkYXRhIGZvciB0aGlzIHJvdXRlLlxuICAgKi9cbiAgbWF0Y2hQYXRoV2l0aFJvdXRlcyhyb3V0ZSwgcGF0aCkge1xuICAgIGNvbnN0IHBhdGhXaXRob3V0U2xhc2ggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKS5zcGxpdChcIj9cIilbMF1cblxuICAgIGZvciAoY29uc3Qgc3ViUm91dGUgb2Ygcm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBwYXJhbXNTbmFwc2hvdCA9IHsuLi50aGlzLnBhcmFtc31cbiAgICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3ViUm91dGUubWF0Y2hXaXRoUGF0aCh7XG4gICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgIHBhdGg6IHBhdGhXaXRob3V0U2xhc2gsXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdFxuICAgICAgfSlcblxuICAgICAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtc1NuYXBzaG90XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtyZXN0UGF0aH0gPSBtYXRjaFJlc3VsdFxuXG4gICAgICBpZiAocmVzdFBhdGgpIHtcbiAgICAgICAgY29uc3QgcmVjdXJzaXZlTWF0Y2ggPSB0aGlzLm1hdGNoUGF0aFdpdGhSb3V0ZXMoc3ViUm91dGUsIHJlc3RQYXRoKVxuXG4gICAgICAgIGlmIChyZWN1cnNpdmVNYXRjaCkge1xuICAgICAgICAgIHJldHVybiByZWN1cnNpdmVNYXRjaFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2hSZXN1bHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvbHZlIHJvdXRlIHJlc29sdmVyIGhvb2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3VycmVudFBhdGggLSBSZXF1ZXN0IHBhdGggd2l0aG91dCBxdWVyeSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gUmVzb2x2ZXIgaG9vayBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmhhc01hdGNoaW5nQ3VzdG9tUm91dGVdIC0gVHJ1ZSB3aGVuIHRoZSBwYXRoIG1hdGNoZWQgYW4gZXhwbGljaXQgY3VzdG9tIHJvdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IC0gTWF0Y2hlZCBhY3Rpb24vY29udHJvbGxlciBmcm9tIGhvb2tzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVJvdXRlUmVzb2x2ZXJIb29rcyhjdXJyZW50UGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge2hhc01hdGNoaW5nQ3VzdG9tUm91dGUgPSBmYWxzZX0gPSBvcHRpb25zXG5cbiAgICBjb25zdCBob29rcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRSb3V0ZVJlc29sdmVySG9va3M/LigpIHx8IFtdXG5cbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICBjdXJyZW50UGF0aCxcbiAgICAgICAgaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSxcbiAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcyxcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICByZXNvbHZlcjogdGhpcyxcbiAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaG9va1Jlc3VsdCkgY29udGludWVcblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBhY3Rpb24gdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmFjdGlvbn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlciAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmNvbnRyb2xsZXIubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlciB0byBiZSBhIHN0cmluZywgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlcn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMgJiYgdHlwZW9mIGhvb2tSZXN1bHQucGFyYW1zICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBwYXJhbXMgdG8gYmUgYW4gb2JqZWN0LCBnb3Q6ICR7aG9va1Jlc3VsdC5wYXJhbXN9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuY29udHJvbGxlckNsYXNzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXJDbGFzcyB0byBiZSBhIGNsYXNzL2Z1bmN0aW9uIHdoZW4gcHJvdmlkZWQsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzc31gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXJQYXRoICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyUGF0aCB0byBiZSBhIHN0cmluZyB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5za2lwQ29udHJvbGxlckNvbm5lY3Rpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgdG8gYmUgYSBib29sZWFuIHdoZW4gcHJvdmlkZWQsIGdvdDogJHtob29rUmVzdWx0LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnN9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9uICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgc2tpcEFiaWxpdHlSZXNvbHV0aW9uIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwQWJpbGl0eVJlc29sdXRpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb24gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC5za2lwVGVuYW50UmVzb2x1dGlvbiAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBUZW5hbnRSZXNvbHV0aW9uIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwVGVuYW50UmVzb2x1dGlvbn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC52aWV3UGF0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnZpZXdQYXRoICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayB2aWV3UGF0aCB0byBiZSBhIHN0cmluZyB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC52aWV3UGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhcmFtcywgaG9va1Jlc3VsdC5wYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBob29rUmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZyBhY3Rpb24gc3RhcnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmFjdGlvbiAtIEFjdGlvbi5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbnRyb2xsZXJDbGFzcyAtIENvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJkZWJ1Z1wiIHwgXCJpbmZvXCJ9IGFyZ3MubG9nTWV0aG9kIC0gTG9nZ2VyIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9sb2dBY3Rpb25TdGFydCh7YWN0aW9uLCBjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5fZm9ybWF0VGltZXN0YW1wKG5ldyBEYXRlKCkpXG4gICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IHJlcXVlc3QucmVtb3RlQWRkcmVzcygpIHx8IFwidW5rbm93blwiXG4gICAgY29uc3QgbG9nZ2VkUGFyYW1zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh0aGlzLnBhcmFtcykpXG5cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmFjdGlvblxuICAgIGRlbGV0ZSBsb2dnZWRQYXJhbXMuY29udHJvbGxlclxuXG4gICAgY29uc3QgY29udHJvbGxlckxvZ2dlciA9IG5ldyBMb2dnZXIoY29udHJvbGxlckNsYXNzLm5hbWUsIHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259KVxuXG4gICAgYXdhaXQgY29udHJvbGxlckxvZ2dlcltsb2dNZXRob2RdKCgpID0+IGBTdGFydGVkICR7cmVxdWVzdC5odHRwTWV0aG9kKCl9IFwiJHtyZXF1ZXN0LnBhdGgoKX1cIiBmb3IgJHtyZW1vdGVBZGRyZXNzfSBhdCAke3RpbWVzdGFtcH1gKVxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgUHJvY2Vzc2luZyBieSAke2NvbnRyb2xsZXJDbGFzcy5uYW1lfSMke2FjdGlvbn1gKVxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBbYCAgUGFyYW1ldGVyczpgLCBsb2dnZWRQYXJhbXNdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbG9nIG1ldGhvZC5cbiAgICogQHJldHVybnMge1wiZGVidWdcIiB8IFwiaW5mb1wifSAtIFJlcXVlc3QgbG9nIG1ldGhvZC5cbiAgICovXG4gIF9sb2dNZXRob2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcInRlc3RcIiA/IFwiZGVidWdcIiA6IFwiaW5mb1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBtZWFzdXJlIGNvbnRyb2xsZXIuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBtZWFzdXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfbWVhc3VyZUNvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXF1ZXN0VGltaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcblxuICAgIHJldHVybiByZXF1ZXN0VGltaW5nXG4gICAgICA/IGF3YWl0IHJlcXVlc3RUaW1pbmcubWVhc3VyZShcImNvbnRyb2xsZXJcIiwgY2FsbGJhY2spXG4gICAgICA6IGF3YWl0IGNhbGxiYWNrKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBjb21wbGV0ZWQgbG9nIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29udHJvbGxlckNsYXNzIC0gQ29udHJvbGxlciBjbGFzcy5cbiAgICogQHBhcmFtIHtcImRlYnVnXCIgfCBcImluZm9cIn0gYXJncy5sb2dNZXRob2QgLSBMb2dnZXIgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfc2V0Q29tcGxldGVkTG9nTWV0YWRhdGEoe2NvbnRyb2xsZXJDbGFzcywgbG9nTWV0aG9kfSkge1xuICAgIGNvbnN0IHJlcXVlc3RUaW1pbmcgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q3VycmVudFJlcXVlc3RUaW1pbmcoKVxuXG4gICAgaWYgKCFyZXF1ZXN0VGltaW5nKSByZXR1cm5cblxuICAgIHJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nU3ViamVjdCA9IGNvbnRyb2xsZXJDbGFzcy5uYW1lXG4gICAgcmVxdWVzdFRpbWluZy5jb21wbGV0ZWRMb2dNZXRob2QgPSBsb2dNZXRob2RcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdCB0aW1lc3RhbXAuXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHRpbWVzdGFtcC5cbiAgICovXG4gIF9mb3JtYXRUaW1lc3RhbXAoZGF0ZSkge1xuICAgIC8qKlxuICAgICAqIFBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtIC0gTnVtLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhZC5cbiAgICAgKi9cbiAgICBjb25zdCBwYWQgPSAobnVtKSA9PiBTdHJpbmcobnVtKS5wYWRTdGFydCgyLCBcIjBcIilcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgY29uc3QgbW9udGggPSBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gICAgY29uc3QgaG91cnMgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICAgIGNvbnN0IG1pbnV0ZXMgPSBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpXG4gICAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICBjb25zdCBvZmZzZXRNaW51dGVzID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpXG4gICAgY29uc3Qgb2Zmc2V0U2lnbiA9IG9mZnNldE1pbnV0ZXMgPiAwID8gXCItXCIgOiBcIitcIlxuICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IE1hdGguYWJzKG9mZnNldE1pbnV0ZXMpXG4gICAgY29uc3Qgb2Zmc2V0SG91cnMgPSBwYWQoTWF0aC5mbG9vcihvZmZzZXRUb3RhbE1pbnV0ZXMgLyA2MCkpXG4gICAgY29uc3Qgb2Zmc2V0UmVtYWluaW5nTWludXRlcyA9IHBhZChvZmZzZXRUb3RhbE1pbnV0ZXMgJSA2MClcblxuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9ICR7b2Zmc2V0U2lnbn0ke29mZnNldEhvdXJzfSR7b2Zmc2V0UmVtYWluaW5nTWludXRlc31gXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzYW5pdGl6ZSBwYXJhbXMgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB7P30gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHs/fSAtIFRoZSBzYW5pdGl6ZSBwYXJhbXMgZm9yIGxvZ2dpbmcuXG4gICAqL1xuICBfc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVXBsb2FkZWRGaWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc05hbWU6IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIGZpbGVuYW1lOiB2YWx1ZS5maWxlbmFtZSgpLFxuICAgICAgICBzaXplOiB2YWx1ZS5zaXplKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyhpdGVtKSlcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvKipcbiAgICAgICAqIFJlc3VsdC5cbiAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZVtrZXldKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/ensure-error.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.462",
6
+ "version": "1.0.463",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -70,7 +70,8 @@
70
70
  "snapreq": "^0.0.8",
71
71
  "sql-escape-string": "^1.1.0",
72
72
  "sql.js": "^1.12.0",
73
- "strftime": "^0.10.2"
73
+ "strftime": "^0.10.2",
74
+ "typanic": "^1.0.5"
74
75
  },
75
76
  "peerDependencies": {
76
77
  "react": ">=18",