velocious 1.0.698 → 1.0.700

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 (95) hide show
  1. package/README.md +2 -2
  2. package/build/configuration-types.js +23 -0
  3. package/build/configuration.js +136 -1
  4. package/build/database/advisory-lock-backend-policy.js +204 -0
  5. package/build/database/advisory-lock-file-backend.js +348 -0
  6. package/build/database/advisory-lock-runner.js +239 -16
  7. package/build/database/drivers/base.js +318 -15
  8. package/build/database/drivers/mssql/index.js +1 -1
  9. package/build/database/drivers/mysql/index.js +4 -2
  10. package/build/database/drivers/pgsql/index.js +4 -2
  11. package/build/database/drivers/sqlite/base.js +13 -129
  12. package/build/database/drivers/sqlite/index.js +41 -62
  13. package/build/database/migrator.js +120 -50
  14. package/build/database/record/attachments/store.js +84 -1
  15. package/build/environment-handlers/base.js +13 -0
  16. package/build/environment-handlers/node.js +11 -0
  17. package/build/http-server/server-lock.js +21 -115
  18. package/build/src/configuration-types.d.ts +68 -0
  19. package/build/src/configuration-types.d.ts.map +1 -1
  20. package/build/src/configuration-types.js +21 -1
  21. package/build/src/configuration.d.ts +100 -1
  22. package/build/src/configuration.d.ts.map +1 -1
  23. package/build/src/configuration.js +124 -2
  24. package/build/src/database/advisory-lock-backend-policy.d.ts +145 -0
  25. package/build/src/database/advisory-lock-backend-policy.d.ts.map +1 -0
  26. package/build/src/database/advisory-lock-backend-policy.js +184 -0
  27. package/build/src/database/advisory-lock-file-backend.d.ts +194 -0
  28. package/build/src/database/advisory-lock-file-backend.d.ts.map +1 -0
  29. package/build/src/database/advisory-lock-file-backend.js +313 -0
  30. package/build/src/database/advisory-lock-runner.d.ts +116 -15
  31. package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
  32. package/build/src/database/advisory-lock-runner.js +190 -17
  33. package/build/src/database/drivers/base.d.ts +125 -4
  34. package/build/src/database/drivers/base.d.ts.map +1 -1
  35. package/build/src/database/drivers/base.js +282 -17
  36. package/build/src/database/drivers/mssql/index.d.ts +1 -1
  37. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  38. package/build/src/database/drivers/mssql/index.js +2 -2
  39. package/build/src/database/drivers/mysql/index.d.ts +4 -2
  40. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  41. package/build/src/database/drivers/mysql/index.js +5 -3
  42. package/build/src/database/drivers/pgsql/index.d.ts +4 -2
  43. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  44. package/build/src/database/drivers/pgsql/index.js +5 -3
  45. package/build/src/database/drivers/sqlite/base.d.ts +11 -49
  46. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  47. package/build/src/database/drivers/sqlite/base.js +14 -114
  48. package/build/src/database/drivers/sqlite/index.d.ts +28 -19
  49. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  50. package/build/src/database/drivers/sqlite/index.js +41 -59
  51. package/build/src/database/migrator.d.ts.map +1 -1
  52. package/build/src/database/migrator.js +110 -56
  53. package/build/src/database/record/attachments/store.d.ts +0 -3
  54. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  55. package/build/src/database/record/attachments/store.js +71 -2
  56. package/build/src/environment-handlers/base.d.ts +14 -0
  57. package/build/src/environment-handlers/base.d.ts.map +1 -1
  58. package/build/src/environment-handlers/base.js +13 -1
  59. package/build/src/environment-handlers/node.d.ts +11 -0
  60. package/build/src/environment-handlers/node.d.ts.map +1 -1
  61. package/build/src/environment-handlers/node.js +11 -1
  62. package/build/src/http-server/server-lock.d.ts +13 -37
  63. package/build/src/http-server/server-lock.d.ts.map +1 -1
  64. package/build/src/http-server/server-lock.js +22 -109
  65. package/build/src/testing/test-runner.d.ts +74 -0
  66. package/build/src/testing/test-runner.d.ts.map +1 -1
  67. package/build/src/testing/test-runner.js +140 -1
  68. package/build/src/testing/test-tenant-database-pool.d.ts +183 -0
  69. package/build/src/testing/test-tenant-database-pool.d.ts.map +1 -0
  70. package/build/src/testing/test-tenant-database-pool.js +388 -0
  71. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
  72. package/build/src/testing/velocious-attempt-executor.js +43 -1
  73. package/build/testing/test-runner.js +152 -0
  74. package/build/testing/test-tenant-database-pool.js +438 -0
  75. package/build/testing/velocious-attempt-executor.js +44 -0
  76. package/package.json +1 -1
  77. package/src/configuration-types.js +23 -0
  78. package/src/configuration.js +136 -1
  79. package/src/database/advisory-lock-backend-policy.js +204 -0
  80. package/src/database/advisory-lock-file-backend.js +348 -0
  81. package/src/database/advisory-lock-runner.js +239 -16
  82. package/src/database/drivers/base.js +318 -15
  83. package/src/database/drivers/mssql/index.js +1 -1
  84. package/src/database/drivers/mysql/index.js +4 -2
  85. package/src/database/drivers/pgsql/index.js +4 -2
  86. package/src/database/drivers/sqlite/base.js +13 -129
  87. package/src/database/drivers/sqlite/index.js +41 -62
  88. package/src/database/migrator.js +120 -50
  89. package/src/database/record/attachments/store.js +84 -1
  90. package/src/environment-handlers/base.js +13 -0
  91. package/src/environment-handlers/node.js +11 -0
  92. package/src/http-server/server-lock.js +21 -115
  93. package/src/testing/test-runner.js +152 -0
  94. package/src/testing/test-tenant-database-pool.js +438 -0
  95. package/src/testing/velocious-attempt-executor.js +44 -0
@@ -96,40 +96,33 @@ export default class VelociousDatabaseDriversSqliteNode extends Base {
96
96
  return result.changes || 0;
97
97
  }
98
98
  /**
99
- * Layers a filesystem lock directory on top of the in-process waiter
100
- * queue so SQLite deployments with multiple Node processes writing to
101
- * the same database file see consistent advisory-lock mutual exclusion
102
- * across processes, not just within a single process.
99
+ * The filesystem lock directory is this driver's driver-native tier on
100
+ * top of the shared process-local pre-filter tier from the base driver,
101
+ * so SQLite deployments with multiple Node processes writing to the same
102
+ * database file see consistent advisory-lock mutual exclusion across
103
+ * processes, not just within a single process.
104
+ * @returns {boolean} - Always true for the Node SQLite driver.
105
+ */
106
+ supportsDriverNativeAdvisoryLock() {
107
+ return true;
108
+ }
109
+ /**
110
+ * Filesystem lock directory as the driver-native tier on top of the
111
+ * shared process-local pre-filter tier from the base driver, so SQLite
112
+ * deployments with multiple Node processes writing to the same database
113
+ * file see consistent advisory-lock mutual exclusion across processes,
114
+ * not just within a single process.
103
115
  *
104
- * The in-process queue from the shared SQLite base class is still used
105
- * for the fast intra-process path (no polling, waiters wake each other
106
- * through the `Set<string>` + waiter queue); the filesystem lock is
107
- * only checked once the in-process queue has granted the caller, so
108
- * typical single-process traffic pays at most two `fs.mkdir` calls
109
- * (create and remove) per critical section.
116
+ * The base driver's process-local tier serializes same-process callers
117
+ * first (no filesystem round trip for uncontended traffic); this hook
118
+ * is only reached once the tier has granted the caller its turn, and its
119
+ * result is what confirms cross-process exclusion for SQLite.
110
120
  * @param {string} name - Lock name.
111
121
  * @param {{timeoutMs?: number | null}} [args] - Optional timeout in milliseconds; `null`, `undefined`, or negative blocks forever.
112
122
  * @returns {Promise<boolean>} - Whether the advisory lock was acquired.
113
123
  */
114
124
  async _acquireAdvisoryLock(name, { timeoutMs } = {}) {
115
- const deadline = typeof timeoutMs === "number" && timeoutMs >= 0 ? Date.now() + timeoutMs : null;
116
- const remainingForInProcess = deadline !== null ? Math.max(0, deadline - Date.now()) : null;
117
- const inProcessAcquired = await super._acquireAdvisoryLock(name, { timeoutMs: remainingForInProcess });
118
- if (!inProcessAcquired)
119
- return false;
120
- try {
121
- const remainingForFile = deadline !== null ? Math.max(0, deadline - Date.now()) : null;
122
- const fileAcquired = await this._acquireAdvisoryLockFile(name, { timeoutMs: remainingForFile });
123
- if (!fileAcquired) {
124
- await super._releaseAdvisoryLock(name);
125
- return false;
126
- }
127
- }
128
- catch (error) {
129
- await super._releaseAdvisoryLock(name);
130
- throw error;
131
- }
132
- return true;
125
+ return await this._acquireAdvisoryLockFile(name, { timeoutMs });
133
126
  }
134
127
  /**
135
128
  * Runs try acquire advisory lock.
@@ -137,47 +130,36 @@ export default class VelociousDatabaseDriversSqliteNode extends Base {
137
130
  * @returns {Promise<boolean>} - Whether the advisory lock was acquired immediately.
138
131
  */
139
132
  async _tryAcquireAdvisoryLock(name) {
140
- const inProcessAcquired = await super._tryAcquireAdvisoryLock(name);
141
- if (!inProcessAcquired)
142
- return false;
143
- try {
144
- const fileAcquired = await this._tryAcquireAdvisoryLockFile(name);
145
- if (!fileAcquired) {
146
- await super._releaseAdvisoryLock(name);
147
- return false;
148
- }
149
- }
150
- catch (error) {
151
- await super._releaseAdvisoryLock(name);
152
- throw error;
153
- }
154
- return true;
133
+ return await this._tryAcquireAdvisoryLockFile(name);
155
134
  }
156
135
  /**
157
- * Releases the lock only if **this** driver instance acquired it, both
158
- * in the shared in-process owner table and in the on-disk lock
159
- * directory. A caller that tries to release a lock it never acquired
160
- * (or that was already released by another driver) gets `false` back
161
- * and the filesystem state is left alone so we never delete somebody
162
- * else's lock directory.
136
+ * Releases the on-disk lock directory for a lock this driver instance
137
+ * acquired through the base driver's two-tier chain. A caller that tries
138
+ * to release a lock it never acquired (or that was already released by
139
+ * another driver) gets `false` back and the filesystem state is left
140
+ * alone so we never delete somebody else's lock directory.
163
141
  * @param {string} name - Lock name.
164
142
  * @returns {Promise<boolean>} - Whether the advisory lock was released.
165
143
  */
166
144
  async _releaseAdvisoryLock(name) {
167
- const inProcessReleased = await super._releaseAdvisoryLock(name);
168
- if (inProcessReleased) {
169
- await this._releaseAdvisoryLockFile(name);
145
+ const lockPath = this._advisoryLockPath(name);
146
+ try {
147
+ await fs.stat(lockPath);
148
+ }
149
+ catch {
150
+ return false;
170
151
  }
171
- return inProcessReleased;
152
+ await this._releaseAdvisoryLockFile(name);
153
+ return true;
172
154
  }
173
155
  /**
174
- * Runs is advisory lock held.
156
+ * Filesystem-tier view for the base driver's `isAdvisoryLockHeld`, which
157
+ * answers from the process-local tier first and only asks this hook when
158
+ * the tier has no owner for the name.
175
159
  * @param {string} name - Lock name.
176
- * @returns {Promise<boolean>} - Whether the advisory lock is held.
160
+ * @returns {Promise<boolean>} - Whether the advisory lock file is held.
177
161
  */
178
- async isAdvisoryLockHeld(name) {
179
- if (await super.isAdvisoryLockHeld(name))
180
- return true;
162
+ async _isAdvisoryLockHeldNative(name) {
181
163
  return await this._isAdvisoryLockFileHeld(name);
182
164
  }
183
165
  /**
@@ -408,4 +390,4 @@ export default class VelociousDatabaseDriversSqliteNode extends Base {
408
390
  }
409
391
  }
410
392
  }
411
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9zcWxpdGUvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDdEMsT0FBTyxJQUFJLE1BQU0sd0JBQXdCLENBQUE7QUFDekMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBQzlCLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQTtBQUM3QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBRTNCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLFVBQVUsTUFBTSwrQkFBK0IsQ0FBQTtBQUV0RCxNQUFNLENBQUMsT0FBTyxPQUFPLGtDQUFtQyxTQUFRLElBQUk7SUFDbEU7O3VEQUVtRDtJQUNuRCxVQUFVLEdBQUcsU0FBUyxDQUFBO0lBRXRCOztvQ0FFZ0M7SUFDaEMsc0JBQXNCLEdBQUcsU0FBUyxDQUFBO0lBRWxDLEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzNCLE1BQU0sV0FBVyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQTtRQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFFeEMsSUFBSSxDQUFDLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJ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QyxRQUFRLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFBO1FBRXBFLElBQUksQ0FBQztZQUNILGdFQUFnRTtZQUNoRSwrREFBK0Q7WUFDL0QsbURBQW1EO1lBQ25ELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUUxQixPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksS0FBSyxPQUFPLENBQUE7UUFDekUsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUhhc2h9IGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgd2FpdCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvd2FpdC5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBvcyBmcm9tIFwibm9kZTpvc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBxdWVyeSBmcm9tIFwiLi9xdWVyeS5qc1wiXG5pbXBvcnQgc3FsaXRlMyBmcm9tIFwic3FsaXRlM1wiXG5pbXBvcnQge29wZW59IGZyb20gXCJzcWxpdGVcIlxuXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi9iYXNlLmpzXCJcbmltcG9ydCBmaWxlRXhpc3RzIGZyb20gXCIuLi8uLi8uLi91dGlscy9maWxlLWV4aXN0cy5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlRHJpdmVyc1NxbGl0ZU5vZGUgZXh0ZW5kcyBCYXNlIHtcbiAgLyoqXG4gICAqIENvbm5lY3Rpb24uXG4gICAqIEB0eXBlIHtpbXBvcnQoXCJzcWxpdGVcIikuRGF0YWJhc2UgfCB1bmRlZmluZWR9ICovXG4gIGNvbm5lY3Rpb24gPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogQWR2aXNvcnkgbG9jayBkaXJlY3RvcnkuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIF9hZHZpc29yeUxvY2tEaXJlY3RvcnkgPSB1bmRlZmluZWRcblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmdldEFyZ3MoKVxuICAgIGNvbnN0IGRhdGFiYXNlRGlyID0gYCR7dGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGlyZWN0b3J5KCl9L2RiYFxuICAgIGNvbnN0IGRhdGFiYXNlUGF0aCA9IHRoaXMuZGF0YWJhc2VQYXRoKClcblxuICAgIGlmICghYXdhaXQgZmlsZUV4aXN0cyhkYXRhYmFzZURpcikpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGRhdGFiYXNlRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICB9XG5cbiAgICBpZiAoYXJncy5yZXNldCkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGRhdGFiYXNlUGF0aClcbiAgICB9XG5cbiAgICB0aGlzLl9hZHZpc29yeUxvY2tEaXJlY3RvcnkgPSBwYXRoLmpvaW4oZGF0YWJhc2VEaXIsIGAke3RoaXMubG9jYWxTdG9yYWdlTmFtZSgpfS52ZWxvY2lvdXMtYWR2aXNvcnktbG9ja3NgKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGF3YWl0IG9wZW4oe1xuICAgICAgICBmaWxlbmFtZTogZGF0YWJhc2VQYXRoLFxuICAgICAgICBkcml2ZXI6IHNxbGl0ZTMuRGF0YWJhc2VcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3Qgb3BlbiBkYXRhYmFzZSAke2RhdGFiYXNlUGF0aH0gYmVjYXVzZSBvZiAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IG9wZW4gZGF0YWJhc2UgJHtkYXRhYmFzZVBhdGh9IGJlY2F1c2Ugb2YgJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJWZXJzaW9uKClcbiAgfVxuXG4gIGxvY2FsU3RvcmFnZU5hbWUoKSB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0QXJncygpXG5cbiAgICBpZiAoIWFyZ3MubmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gbmFtZSBnaXZlbiBmb3IgU1FMaXRlIE5vZGVcIilcblxuICAgIHJldHVybiBgVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzU3FsaXRlLS0tJHthcmdzLm5hbWV9YFxuICB9XG5cbiAgZGF0YWJhc2VQYXRoKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXREaXJlY3RvcnkoKX0vZGIvJHt0aGlzLmxvY2FsU3RvcmFnZU5hbWUoKX0uc3FsaXRlYFxuICB9XG5cbiAgYXN5bmMgX2Nsb3NlKCkge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbj8uY2xvc2UoKVxuICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICB9XG5cbiAgYXN5bmMgZGVsZXRlRGF0YWJhc2VTdG9yYWdlKCkge1xuICAgIGZvciAoY29uc3Qgc3VmZml4IG9mIFtcIlwiLCBcIi13YWxcIiwgXCItc2htXCIsIFwiLWpvdXJuYWxcIl0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnVubGluayhgJHt0aGlzLmRhdGFiYXNlUGF0aCgpfSR7c3VmZml4fWApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1ZXJ5IGFjdHVhbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIFNRTCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnN9IFtvcHRpb25zXSAtIFF1ZXJ5IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PltdPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBxdWVyeSBhY3R1YWwuXG4gICAqL1xuICBhc3luYyBfcXVlcnlBY3R1YWwoc3FsLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29ubmVjdGlvblwiKVxuXG4gICAgaWYgKG9wdGlvbnMuc3FsaXRlU2NyaXB0KSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uZXhlYyhzcWwpXG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcXVlcnkodGhpcy5jb25uZWN0aW9uLCBzcWwpXG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBtdXRhdGlvbiB3aXRoIGFmZmVjdGVkLXJvdyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIE11dGF0aW9uIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBBZmZlY3RlZCByb3cgY291bnQuXG4gICAqL1xuICBhc3luYyBfYWZmZWN0ZWRSb3dzQWN0dWFsKHNxbCkge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25uZWN0aW9uXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJ1bihzcWwpXG4gICAgcmV0dXJuIHJlc3VsdC5jaGFuZ2VzIHx8IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXllcnMgYSBmaWxlc3lzdGVtIGxvY2sgZGlyZWN0b3J5IG9uIHRvcCBvZiB0aGUgaW4tcHJvY2VzcyB3YWl0ZXJcbiAgICogcXVldWUgc28gU1FMaXRlIGRlcGxveW1lbnRzIHdpdGggbXVsdGlwbGUgTm9kZSBwcm9jZXNzZXMgd3JpdGluZyB0b1xuICAgKiB0aGUgc2FtZSBkYXRhYmFzZSBmaWxlIHNlZSBjb25zaXN0ZW50IGFkdmlzb3J5LWxvY2sgbXV0dWFsIGV4Y2x1c2lvblxuICAgKiBhY3Jvc3MgcHJvY2Vzc2VzLCBub3QganVzdCB3aXRoaW4gYSBzaW5nbGUgcHJvY2Vzcy5cbiAgICpcbiAgICogVGhlIGluLXByb2Nlc3MgcXVldWUgZnJvbSB0aGUgc2hhcmVkIFNRTGl0ZSBiYXNlIGNsYXNzIGlzIHN0aWxsIHVzZWRcbiAgICogZm9yIHRoZSBmYXN0IGludHJhLXByb2Nlc3MgcGF0aCAobm8gcG9sbGluZywgd2FpdGVycyB3YWtlIGVhY2ggb3RoZXJcbiAgICogdGhyb3VnaCB0aGUgYFNldDxzdHJpbmc+YCArIHdhaXRlciBxdWV1ZSk7IHRoZSBmaWxlc3lzdGVtIGxvY2sgaXNcbiAgICogb25seSBjaGVja2VkIG9uY2UgdGhlIGluLXByb2Nlc3MgcXVldWUgaGFzIGdyYW50ZWQgdGhlIGNhbGxlciwgc29cbiAgICogdHlwaWNhbCBzaW5nbGUtcHJvY2VzcyB0cmFmZmljIHBheXMgYXQgbW9zdCB0d28gYGZzLm1rZGlyYCBjYWxsc1xuICAgKiAoY3JlYXRlIGFuZCByZW1vdmUpIHBlciBjcml0aWNhbCBzZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHt7dGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IFthcmdzXSAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzOyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBuZWdhdGl2ZSBibG9ja3MgZm9yZXZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgYWR2aXNvcnkgbG9jayB3YXMgYWNxdWlyZWQuXG4gICAqL1xuICBhc3luYyBfYWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lLCB7dGltZW91dE1zfSA9IHt9KSB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSB0eXBlb2YgdGltZW91dE1zID09PSBcIm51bWJlclwiICYmIHRpbWVvdXRNcyA+PSAwID8gRGF0ZS5ub3coKSArIHRpbWVvdXRNcyA6IG51bGxcbiAgICBjb25zdCByZW1haW5pbmdGb3JJblByb2Nlc3MgPSBkZWFkbGluZSAhPT0gbnVsbCA/IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkgOiBudWxsXG4gICAgY29uc3QgaW5Qcm9jZXNzQWNxdWlyZWQgPSBhd2FpdCBzdXBlci5fYWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lLCB7dGltZW91dE1zOiByZW1haW5pbmdGb3JJblByb2Nlc3N9KVxuXG4gICAgaWYgKCFpblByb2Nlc3NBY3F1aXJlZCkgcmV0dXJuIGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVtYWluaW5nRm9yRmlsZSA9IGRlYWRsaW5lICE9PSBudWxsID8gTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSA6IG51bGxcbiAgICAgIGNvbnN0IGZpbGVBY3F1aXJlZCA9IGF3YWl0IHRoaXMuX2FjcXVpcmVBZHZpc29yeUxvY2tGaWxlKG5hbWUsIHt0aW1lb3V0TXM6IHJlbWFpbmluZ0ZvckZpbGV9KVxuXG4gICAgICBpZiAoIWZpbGVBY3F1aXJlZCkge1xuICAgICAgICBhd2FpdCBzdXBlci5fcmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgc3VwZXIuX3JlbGVhc2VBZHZpc29yeUxvY2sobmFtZSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRyeSBhY3F1aXJlIGFkdmlzb3J5IGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBhZHZpc29yeSBsb2NrIHdhcyBhY3F1aXJlZCBpbW1lZGlhdGVseS5cbiAgICovXG4gIGFzeW5jIF90cnlBY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUpIHtcbiAgICBjb25zdCBpblByb2Nlc3NBY3F1aXJlZCA9IGF3YWl0IHN1cGVyLl90cnlBY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUpXG5cbiAgICBpZiAoIWluUHJvY2Vzc0FjcXVpcmVkKSByZXR1cm4gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlQWNxdWlyZWQgPSBhd2FpdCB0aGlzLl90cnlBY3F1aXJlQWR2aXNvcnlMb2NrRmlsZShuYW1lKVxuXG4gICAgICBpZiAoIWZpbGVBY3F1aXJlZCkge1xuICAgICAgICBhd2FpdCBzdXBlci5fcmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgc3VwZXIuX3JlbGVhc2VBZHZpc29yeUxvY2sobmFtZSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbG9jayBvbmx5IGlmICoqdGhpcyoqIGRyaXZlciBpbnN0YW5jZSBhY3F1aXJlZCBpdCwgYm90aFxuICAgKiBpbiB0aGUgc2hhcmVkIGluLXByb2Nlc3Mgb3duZXIgdGFibGUgYW5kIGluIHRoZSBvbi1kaXNrIGxvY2tcbiAgICogZGlyZWN0b3J5LiBBIGNhbGxlciB0aGF0IHRyaWVzIHRvIHJlbGVhc2UgYSBsb2NrIGl0IG5ldmVyIGFjcXVpcmVkXG4gICAqIChvciB0aGF0IHdhcyBhbHJlYWR5IHJlbGVhc2VkIGJ5IGFub3RoZXIgZHJpdmVyKSBnZXRzIGBmYWxzZWAgYmFja1xuICAgKiBhbmQgdGhlIGZpbGVzeXN0ZW0gc3RhdGUgaXMgbGVmdCBhbG9uZSBzbyB3ZSBuZXZlciBkZWxldGUgc29tZWJvZHlcbiAgICogZWxzZSdzIGxvY2sgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgYWR2aXNvcnkgbG9jayB3YXMgcmVsZWFzZWQuXG4gICAqL1xuICBhc3luYyBfcmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKSB7XG4gICAgY29uc3QgaW5Qcm9jZXNzUmVsZWFzZWQgPSBhd2FpdCBzdXBlci5fcmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKVxuXG4gICAgaWYgKGluUHJvY2Vzc1JlbGVhc2VkKSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWxlYXNlQWR2aXNvcnlMb2NrRmlsZShuYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBpblByb2Nlc3NSZWxlYXNlZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgYWR2aXNvcnkgbG9jayBoZWxkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgYWR2aXNvcnkgbG9jayBpcyBoZWxkLlxuICAgKi9cbiAgYXN5bmMgaXNBZHZpc29yeUxvY2tIZWxkKG5hbWUpIHtcbiAgICBpZiAoYXdhaXQgc3VwZXIuaXNBZHZpc29yeUxvY2tIZWxkKG5hbWUpKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2lzQWR2aXNvcnlMb2NrRmlsZUhlbGQobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTm9kZSBTUUxpdGUgZHJpdmVyIGxheWVycyB0aGUgb3B0LWluIGZpbGUgdGllciBvbiB0b3Agb2YgdGhlXG4gICAqIHByb2Nlc3MtbG9jYWwgcHJlLWZpbHRlciwgc28gdGVsZW1ldHJ5IHJlcG9ydHMgaXQgYXMgYGZpbGVgLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRpZXIgbmFtZSByZXBvcnRlZCBvbiB0ZWxlbWV0cnkgcGF5bG9hZHMuXG4gICAqL1xuICBhZHZpc29yeUxvY2tCYWNrZW5kVGllcigpIHtcbiAgICByZXR1cm4gXCJmaWxlXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGUgdGhlIG5hbWVkIGxvY2sgdG8gdGhlIGZpbGUtdGllciBvd25lciByZWNvcmRlZCBpblxuICAgKiBgb3duZXIuanNvbmAgKGBwaWRAaG9zdG5hbWVgKSwgY2FwdHVyZWQgYXQgdGhlIHRlbGVtZXRyeSBldmVudCBtb21lbnRcbiAgICogKGJlc3QtZWZmb3J0OyB0aGUgY2FsbGVyIGd1YXJkcyBmYWlsdXJlcykuIEZhbGxzIGJhY2sgdG8gdGhlXG4gICAqIHByb2Nlc3MtbG9jYWwgb3duZXIgd2hlbiB0aGUgZmlsZXN5c3RlbSBsb2NrIGlzIG5vdCB0aGUgaG9sZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gRmlsZSBsb2NrIG93bmVyIGlkZW50aXR5LCBvciBudWxsIHdoZW4gbm8gcHJvY2VzcyBob2xkcyB0aGUgbG9jay5cbiAgICovXG4gIGFzeW5jIGFkdmlzb3J5TG9ja0hvbGRlckNvbm5lY3Rpb25JZChuYW1lKSB7XG4gICAgY29uc3QgbG9ja1BhdGggPSB0aGlzLl9hZHZpc29yeUxvY2tQYXRoKG5hbWUpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihsb2NrUGF0aCwgXCJvd25lci5qc29uXCIpLCBcInV0ZjhcIilcbiAgICAgIGNvbnN0IG93bmVyID0gSlNPTi5wYXJzZShjb250ZW50KVxuXG4gICAgICBpZiAob3duZXIgJiYgdHlwZW9mIG93bmVyLnBpZCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2Ygb3duZXIuaG9zdG5hbWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBgJHtvd25lci5waWR9QCR7b3duZXIuaG9zdG5hbWV9YFxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm8gZmlsZSBsb2NrIGRpcmVjdG9yeSBvciB1bnJlYWRhYmxlIG1ldGFkYXRhOiBmYWxsIHRocm91Z2ggdG8gdGhlXG4gICAgICAvLyBpbi1wcm9jZXNzIG93bmVyIGJlbG93LlxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5hZHZpc29yeUxvY2tIb2xkZXJDb25uZWN0aW9uSWQobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgYWR2aXNvcnkgbG9jayBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGFkdmlzb3J5LWxvY2sgZGlyZWN0b3J5LlxuICAgKi9cbiAgX3Jlc29sdmVBZHZpc29yeUxvY2tEaXJlY3RvcnkoKSB7XG4gICAgaWYgKCF0aGlzLl9hZHZpc29yeUxvY2tEaXJlY3RvcnkpIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBkZXJpdmluZyB0aGUgZGlyZWN0b3J5IGZvciBjYWxsZXJzIHRoYXQgaW52b2tlZFxuICAgICAgLy8gYWR2aXNvcnkgbG9jayBtZXRob2RzIGJlZm9yZSBgY29ubmVjdCgpYCB3aXJlZCB0aGUgZmllbGQgaW4uXG4gICAgICBjb25zdCBkYXRhYmFzZURpciA9IGAke3RoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldERpcmVjdG9yeSgpfS9kYmBcblxuICAgICAgdGhpcy5fYWR2aXNvcnlMb2NrRGlyZWN0b3J5ID0gcGF0aC5qb2luKGRhdGFiYXNlRGlyLCBgJHt0aGlzLmxvY2FsU3RvcmFnZU5hbWUoKX0udmVsb2Npb3VzLWFkdmlzb3J5LWxvY2tzYClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYWR2aXNvcnlMb2NrRGlyZWN0b3J5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZHZpc29yeSBsb2NrIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZpbGVzeXN0ZW0gcGF0aCBmb3IgdGhlIGFkdmlzb3J5IGxvY2suXG4gICAqL1xuICBfYWR2aXNvcnlMb2NrUGF0aChuYW1lKSB7XG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG5hbWUpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAxNilcbiAgICBjb25zdCBzYWZlTmFtZSA9IG5hbWUucmVwbGFjZSgvW15hLXpBLVowLTkuXy1dL2csIFwiX1wiKS5zbGljZSgwLCA2NClcblxuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5fcmVzb2x2ZUFkdmlzb3J5TG9ja0RpcmVjdG9yeSgpLCBgJHtzYWZlTmFtZX0tJHtoYXNofS5sb2NrYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVuc3VyZSBhZHZpc29yeSBsb2NrIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9lbnN1cmVBZHZpc29yeUxvY2tEaXJlY3RvcnkoKSB7XG4gICAgYXdhaXQgZnMubWtkaXIodGhpcy5fcmVzb2x2ZUFkdmlzb3J5TG9ja0RpcmVjdG9yeSgpLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdyaXRlIGFkdmlzb3J5IGxvY2sgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NrRGlyUGF0aCAtIEFic29sdXRlIHBhdGggb2YgdGhlIGxvY2sgZGlyZWN0b3J5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF93cml0ZUFkdmlzb3J5TG9ja01ldGFkYXRhKGxvY2tEaXJQYXRoKSB7XG4gICAgY29uc3Qgb3duZXJQYXRoID0gcGF0aC5qb2luKGxvY2tEaXJQYXRoLCBcIm93bmVyLmpzb25cIilcbiAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIGhvc3RuYW1lOiBvcy5ob3N0bmFtZSgpLFxuICAgICAgYWNxdWlyZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfSlcblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvd25lclBhdGgsIHBheWxvYWQpXG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIGEgZnVsbHkgaW5pdGlhbGl6ZWQgbG9jayBkaXJlY3Rvcnkgd2l0aCBvbmUgYXRvbWljIHJlbmFtZS5cbiAgICogQSBsb3NpbmcgY2FuZGlkYXRlIGlzIHJlbW92ZWQgaW4gdGhlIHNhbWUgY2FsbCwgc28gY29uY3VycmVudCBhY3F1aXNpdGlvblxuICAgKiBjYW5ub3Qgb2JzZXJ2ZSBvciBkZWxldGUgYW5vdGhlciBwcm9jZXNzJ3MgaGFsZi13cml0dGVuIG93bmVyIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9ja1BhdGggLSBTdGFibGUgYWR2aXNvcnktbG9jayBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoaXMgY2FuZGlkYXRlIGJlY2FtZSB0aGUgbG9jayBvd25lci5cbiAgICovXG4gIGFzeW5jIF9wdWJsaXNoQWR2aXNvcnlMb2NrRGlyZWN0b3J5KGxvY2tQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlUGF0aCA9IGF3YWl0IGZzLm1rZHRlbXAoYCR7bG9ja1BhdGh9LnBlbmRpbmctYClcbiAgICBsZXQgcHVibGlzaGVkID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93cml0ZUFkdmlzb3J5TG9ja01ldGFkYXRhKGNhbmRpZGF0ZVBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnJlbmFtZShjYW5kaWRhdGVQYXRoLCBsb2NrUGF0aClcbiAgICAgICAgcHVibGlzaGVkID0gdHJ1ZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y29kZT86IHN0cmluZ319ICovIChlcnJvcik/LmNvZGVcblxuICAgICAgICBpZiAoY29kZSA9PT0gXCJFRVhJU1RcIiB8fCBjb2RlID09PSBcIkVOT1RFTVBUWVwiKSByZXR1cm4gZmFsc2VcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCFwdWJsaXNoZWQpIGF3YWl0IGZzLnJtKGNhbmRpZGF0ZVBhdGgsIHtmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhY3F1aXJlIGFkdmlzb3J5IGxvY2sgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBhcmdzIC0gVGltZW91dCBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBhZHZpc29yeS1sb2NrIGZpbGUgd2FzIGFjcXVpcmVkLlxuICAgKi9cbiAgYXN5bmMgX2FjcXVpcmVBZHZpc29yeUxvY2tGaWxlKG5hbWUsIHt0aW1lb3V0TXN9KSB7XG4gICAgYXdhaXQgdGhpcy5fZW5zdXJlQWR2aXNvcnlMb2NrRGlyZWN0b3J5KClcblxuICAgIGNvbnN0IGxvY2tQYXRoID0gdGhpcy5fYWR2aXNvcnlMb2NrUGF0aChuYW1lKVxuICAgIGNvbnN0IGRlYWRsaW5lID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIiAmJiB0aW1lb3V0TXMgPj0gMCA/IERhdGUubm93KCkgKyB0aW1lb3V0TXMgOiBudWxsXG4gICAgY29uc3QgcG9sbEludGVydmFsTXMgPSA1MFxuXG4gICAgLy8gSW50ZW50aW9uYWxseSBsb29waW5nIHdpdGhvdXQgYSBmaXhlZCBpdGVyYXRpb24gY2FwIOKAlCBlaXRoZXIgdGhlXG4gICAgLy8gbWtkaXIgc3VjY2VlZHMsIHRoZSBkZWFkbGluZSBlbGFwc2VzLCBvciBhbiB1bmV4cGVjdGVkIGVycm9yIGlzXG4gICAgLy8gcmUtdGhyb3duLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5fcHVibGlzaEFkdmlzb3J5TG9ja0RpcmVjdG9yeShsb2NrUGF0aCkpIHJldHVybiB0cnVlXG5cbiAgICAgIGlmIChhd2FpdCB0aGlzLl9pc0Fkdmlzb3J5TG9ja1N0YWxlKGxvY2tQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy5ybShsb2NrUGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZGVhZGxpbmUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpXG5cbiAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSByZXR1cm4gZmFsc2VcblxuICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWluKHBvbGxJbnRlcnZhbE1zLCByZW1haW5pbmcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgd2FpdChwb2xsSW50ZXJ2YWxNcylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0cnkgYWNxdWlyZSBhZHZpc29yeSBsb2NrIGZpbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBhZHZpc29yeS1sb2NrIGZpbGUgd2FzIGFjcXVpcmVkIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgX3RyeUFjcXVpcmVBZHZpc29yeUxvY2tGaWxlKG5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLl9lbnN1cmVBZHZpc29yeUxvY2tEaXJlY3RvcnkoKVxuXG4gICAgY29uc3QgbG9ja1BhdGggPSB0aGlzLl9hZHZpc29yeUxvY2tQYXRoKG5hbWUpXG5cbiAgICBpZiAoYXdhaXQgdGhpcy5fcHVibGlzaEFkdmlzb3J5TG9ja0RpcmVjdG9yeShsb2NrUGF0aCkpIHJldHVybiB0cnVlXG5cbiAgICBpZiAoYXdhaXQgdGhpcy5faXNBZHZpc29yeUxvY2tTdGFsZShsb2NrUGF0aCkpIHtcbiAgICAgIGF3YWl0IGZzLnJtKGxvY2tQYXRoLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcHVibGlzaEFkdmlzb3J5TG9ja0RpcmVjdG9yeShsb2NrUGF0aClcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGVhc2UgYWR2aXNvcnkgbG9jayBmaWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfcmVsZWFzZUFkdmlzb3J5TG9ja0ZpbGUobmFtZSkge1xuICAgIGNvbnN0IGxvY2tQYXRoID0gdGhpcy5fYWR2aXNvcnlMb2NrUGF0aChuYW1lKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJtKGxvY2tQYXRoLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCByZWxlYXNlOyBpbi1wcm9jZXNzIHN0YXRlIGlzIHN0aWxsIGF1dGhvcml0YXRpdmUgYW5kXG4gICAgICAvLyBzdGFsZS1sb2NrIGNsZWFudXAgb24gdGhlIG5leHQgYWNxdWlyZSB3aWxsIHJlbW92ZSB0aGUgZGlyZWN0b3J5XG4gICAgICAvLyBpZiBpdCByZWFsbHkgaXMgc3RpbGwgbGluZ2VyaW5nLlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGFkdmlzb3J5IGxvY2sgZmlsZSBoZWxkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgYWR2aXNvcnktbG9jayBmaWxlIGV4aXN0cyBhbmQgaXMgYWN0aXZlLlxuICAgKi9cbiAgYXN5bmMgX2lzQWR2aXNvcnlMb2NrRmlsZUhlbGQobmFtZSkge1xuICAgIGNvbnN0IGxvY2tQYXRoID0gdGhpcy5fYWR2aXNvcnlMb2NrUGF0aChuYW1lKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnN0YXQobG9ja1BhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gIWF3YWl0IHRoaXMuX2lzQWR2aXNvcnlMb2NrU3RhbGUobG9ja1BhdGgpXG4gIH1cblxuICAvKipcbiAgICogQSBsb2NrIGRpcmVjdG9yeSBpcyBjb25zaWRlcmVkIHN0YWxlIHdoZW4gaXRzIG93bmVyIG1ldGFkYXRhIG5hbWVzIGFcbiAgICogUElEIG9uIHRoaXMgaG9zdCB0aGF0IGlzIG5vIGxvbmdlciBydW5uaW5nLiBDcm9zcy1ob3N0IG93bmVyc2hpcCAoYVxuICAgKiBkaWZmZXJlbnQgYGhvc3RuYW1lYCkgaXMgdHJlYXRlZCBhcyBsaXZlIGJlY2F1c2Ugd2UgY2Fubm90IHJlbGlhYmx5XG4gICAqIHByb2JlIGEgUElEIG9uIGFub3RoZXIgbWFjaGluZTsgb3BlcmF0b3JzIGluIHRoYXQgc2l0dWF0aW9uIHNob3VsZFxuICAgKiByZW1vdmUgc3RhbGUgbG9jayBkaXJlY3RvcmllcyBieSBoYW5kIGlmIHRoZXkgbGluZ2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9ja1BhdGggLSBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBsb2NrIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgYWR2aXNvcnktbG9jayBmaWxlIGlzIHN0YWxlLlxuICAgKi9cbiAgYXN5bmMgX2lzQWR2aXNvcnlMb2NrU3RhbGUobG9ja1BhdGgpIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHJhd093bmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgbGV0IHJhd093bmVyXG5cbiAgICB0cnkge1xuICAgICAgcmF3T3duZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4obG9ja1BhdGgsIFwib3duZXIuanNvblwiKSwgXCJ1dGY4XCIpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHVucmVhZGFibGUgbWV0YWRhdGEg4oCUIHRyZWF0IGFzIHN0YWxlIHNvIHdlIGNhbiByZWNsYWltLlxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIG93bmVyLlxuICAgICAqIEB0eXBlIHt7cGlkPzogbnVtYmVyLCBob3N0bmFtZT86IHN0cmluZ319ICovXG4gICAgbGV0IG93bmVyXG5cbiAgICB0cnkge1xuICAgICAgb3duZXIgPSBKU09OLnBhcnNlKHJhd093bmVyKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoIW93bmVyIHx8IHR5cGVvZiBvd25lci5waWQgIT09IFwibnVtYmVyXCIpIHJldHVybiB0cnVlXG4gICAgaWYgKG93bmVyLmhvc3RuYW1lICYmIG93bmVyLmhvc3RuYW1lICE9PSBvcy5ob3N0bmFtZSgpKSByZXR1cm4gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICAvLyBga2lsbChwaWQsIDApYCBpcyBhIG5vLW9wIHNpZ25hbCB0aGF0IGZhaWxzIHdpdGggRVNSQ0ggaWYgdGhlXG4gICAgICAvLyBwcm9jZXNzIGlzIG5vdCBydW5uaW5nOyBwZXJtaXNzaW9uIGVycm9ycyBzdGlsbCBpbmRpY2F0ZSB0aGVcbiAgICAgIC8vIHByb2Nlc3MgZXhpc3RzIHNvIHdlIHRyZWF0IHRob3NlIGFzIFwibm90IHN0YWxlXCIuXG4gICAgICBwcm9jZXNzLmtpbGwob3duZXIucGlkLCAwKVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7RXJyb3IgJiB7Y29kZT86IHN0cmluZ319ICovIChlcnJvcik/LmNvZGUgPT09IFwiRVNSQ0hcIlxuICAgIH1cbiAgfVxufVxuIl19
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9zcWxpdGUvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDdEMsT0FBTyxJQUFJLE1BQU0sd0JBQXdCLENBQUE7QUFDekMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBQzlCLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQTtBQUM3QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBRTNCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLFVBQVUsTUFBTSwrQkFBK0IsQ0FBQTtBQUV0RCxNQUFNLENBQUMsT0FBTyxPQUFPLGtDQUFtQyxTQUFRLElBQUk7SUFDbEU7O3VEQUVtRDtJQUNuRCxVQUFVLEdBQUcsU0FBUyxDQUFBO0lBRXRCOztvQ0FFZ0M7SUFDaEMsc0JBQXNCLEdBQUcsU0FBUyxDQUFBO0lBRWxDLEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzNCLE1BQU0sV0FBVyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQTtRQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7UUFFeEMsSUFBSSxDQUFDLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJ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QUFDLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQTtRQUN6RSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCB3YWl0IGZyb20gXCJhd2FpdGVyeS9idWlsZC93YWl0LmpzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHF1ZXJ5IGZyb20gXCIuL3F1ZXJ5LmpzXCJcbmltcG9ydCBzcWxpdGUzIGZyb20gXCJzcWxpdGUzXCJcbmltcG9ydCB7b3Blbn0gZnJvbSBcInNxbGl0ZVwiXG5cbmltcG9ydCBCYXNlIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0IGZpbGVFeGlzdHMgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2ZpbGUtZXhpc3RzLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzU3FsaXRlTm9kZSBleHRlbmRzIEJhc2Uge1xuICAvKipcbiAgICogQ29ubmVjdGlvbi5cbiAgICogQHR5cGUge2ltcG9ydChcInNxbGl0ZVwiKS5EYXRhYmFzZSB8IHVuZGVmaW5lZH0gKi9cbiAgY29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBBZHZpc29yeSBsb2NrIGRpcmVjdG9yeS5cbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgX2Fkdmlzb3J5TG9ja0RpcmVjdG9yeSA9IHVuZGVmaW5lZFxuXG4gIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0QXJncygpXG4gICAgY29uc3QgZGF0YWJhc2VEaXIgPSBgJHt0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXREaXJlY3RvcnkoKX0vZGJgXG4gICAgY29uc3QgZGF0YWJhc2VQYXRoID0gdGhpcy5kYXRhYmFzZVBhdGgoKVxuXG4gICAgaWYgKCFhd2FpdCBmaWxlRXhpc3RzKGRhdGFiYXNlRGlyKSkge1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGF0YWJhc2VEaXIsIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgIH1cblxuICAgIGlmIChhcmdzLnJlc2V0KSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsoZGF0YWJhc2VQYXRoKVxuICAgIH1cblxuICAgIHRoaXMuX2Fkdmlzb3J5TG9ja0RpcmVjdG9yeSA9IHBhdGguam9pbihkYXRhYmFzZURpciwgYCR7dGhpcy5sb2NhbFN0b3JhZ2VOYW1lKCl9LnZlbG9jaW91cy1hZHZpc29yeS1sb2Nrc2ApXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uID0gYXdhaXQgb3Blbih7XG4gICAgICAgIGZpbGVuYW1lOiBkYXRhYmFzZVBhdGgsXG4gICAgICAgIGRyaXZlcjogc3FsaXRlMy5EYXRhYmFzZVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBvcGVuIGRhdGFiYXNlICR7ZGF0YWJhc2VQYXRofSBiZWNhdXNlIG9mICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3Qgb3BlbiBkYXRhYmFzZSAke2RhdGFiYXNlUGF0aH0gYmVjYXVzZSBvZiAke3R5cGVvZiBlcnJvcn06ICR7ZXJyb3J9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZWdpc3RlclZlcnNpb24oKVxuICB9XG5cbiAgbG9jYWxTdG9yYWdlTmFtZSgpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5nZXRBcmdzKClcblxuICAgIGlmICghYXJncy5uYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBuYW1lIGdpdmVuIGZvciBTUUxpdGUgTm9kZVwiKVxuXG4gICAgcmV0dXJuIGBWZWxvY2lvdXNEYXRhYmFzZURyaXZlcnNTcWxpdGUtLS0ke2FyZ3MubmFtZX1gXG4gIH1cblxuICBkYXRhYmFzZVBhdGgoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldERpcmVjdG9yeSgpfS9kYi8ke3RoaXMubG9jYWxTdG9yYWdlTmFtZSgpfS5zcWxpdGVgXG4gIH1cblxuICBhc3luYyBfY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uPy5jbG9zZSgpXG4gICAgdGhpcy5jb25uZWN0aW9uID0gdW5kZWZpbmVkXG4gIH1cblxuICBhc3luYyBkZWxldGVEYXRhYmFzZVN0b3JhZ2UoKSB7XG4gICAgZm9yIChjb25zdCBzdWZmaXggb2YgW1wiXCIsIFwiLXdhbFwiLCBcIi1zaG1cIiwgXCItam91cm5hbFwiXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGAke3RoaXMuZGF0YWJhc2VQYXRoKCl9JHtzdWZmaXh9YClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikpIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcXVlcnkgYWN0dWFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIC0gUXVlcnkgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+W10+fSAtIFJlc29sdmVzIHdpdGggdGhlIHF1ZXJ5IGFjdHVhbC5cbiAgICovXG4gIGFzeW5jIF9xdWVyeUFjdHVhbChzcWwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25uZWN0aW9uXCIpXG5cbiAgICBpZiAob3B0aW9ucy5zcWxpdGVTY3JpcHQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5leGVjKHNxbClcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBxdWVyeSh0aGlzLmNvbm5lY3Rpb24sIHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIG11dGF0aW9uIHdpdGggYWZmZWN0ZWQtcm93IG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gTXV0YXRpb24gU1FMLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIEFmZmVjdGVkIHJvdyBjb3VudC5cbiAgICovXG4gIGFzeW5jIF9hZmZlY3RlZFJvd3NBY3R1YWwoc3FsKSB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbm5lY3Rpb25cIilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucnVuKHNxbClcbiAgICByZXR1cm4gcmVzdWx0LmNoYW5nZXMgfHwgMFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlc3lzdGVtIGxvY2sgZGlyZWN0b3J5IGlzIHRoaXMgZHJpdmVyJ3MgZHJpdmVyLW5hdGl2ZSB0aWVyIG9uXG4gICAqIHRvcCBvZiB0aGUgc2hhcmVkIHByb2Nlc3MtbG9jYWwgcHJlLWZpbHRlciB0aWVyIGZyb20gdGhlIGJhc2UgZHJpdmVyLFxuICAgKiBzbyBTUUxpdGUgZGVwbG95bWVudHMgd2l0aCBtdWx0aXBsZSBOb2RlIHByb2Nlc3NlcyB3cml0aW5nIHRvIHRoZSBzYW1lXG4gICAqIGRhdGFiYXNlIGZpbGUgc2VlIGNvbnNpc3RlbnQgYWR2aXNvcnktbG9jayBtdXR1YWwgZXhjbHVzaW9uIGFjcm9zc1xuICAgKiBwcm9jZXNzZXMsIG5vdCBqdXN0IHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBBbHdheXMgdHJ1ZSBmb3IgdGhlIE5vZGUgU1FMaXRlIGRyaXZlci5cbiAgICovXG4gIHN1cHBvcnRzRHJpdmVyTmF0aXZlQWR2aXNvcnlMb2NrKCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogRmlsZXN5c3RlbSBsb2NrIGRpcmVjdG9yeSBhcyB0aGUgZHJpdmVyLW5hdGl2ZSB0aWVyIG9uIHRvcCBvZiB0aGVcbiAgICogc2hhcmVkIHByb2Nlc3MtbG9jYWwgcHJlLWZpbHRlciB0aWVyIGZyb20gdGhlIGJhc2UgZHJpdmVyLCBzbyBTUUxpdGVcbiAgICogZGVwbG95bWVudHMgd2l0aCBtdWx0aXBsZSBOb2RlIHByb2Nlc3NlcyB3cml0aW5nIHRvIHRoZSBzYW1lIGRhdGFiYXNlXG4gICAqIGZpbGUgc2VlIGNvbnNpc3RlbnQgYWR2aXNvcnktbG9jayBtdXR1YWwgZXhjbHVzaW9uIGFjcm9zcyBwcm9jZXNzZXMsXG4gICAqIG5vdCBqdXN0IHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzLlxuICAgKlxuICAgKiBUaGUgYmFzZSBkcml2ZXIncyBwcm9jZXNzLWxvY2FsIHRpZXIgc2VyaWFsaXplcyBzYW1lLXByb2Nlc3MgY2FsbGVyc1xuICAgKiBmaXJzdCAobm8gZmlsZXN5c3RlbSByb3VuZCB0cmlwIGZvciB1bmNvbnRlbmRlZCB0cmFmZmljKTsgdGhpcyBob29rXG4gICAqIGlzIG9ubHkgcmVhY2hlZCBvbmNlIHRoZSB0aWVyIGhhcyBncmFudGVkIHRoZSBjYWxsZXIgaXRzIHR1cm4sIGFuZCBpdHNcbiAgICogcmVzdWx0IGlzIHdoYXQgY29uZmlybXMgY3Jvc3MtcHJvY2VzcyBleGNsdXNpb24gZm9yIFNRTGl0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBbYXJnc10gLSBPcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kczsgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgbmVnYXRpdmUgYmxvY2tzIGZvcmV2ZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIGFkdmlzb3J5IGxvY2sgd2FzIGFjcXVpcmVkLlxuICAgKi9cbiAgYXN5bmMgX2FjcXVpcmVBZHZpc29yeUxvY2sobmFtZSwge3RpbWVvdXRNc30gPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlQWR2aXNvcnlMb2NrRmlsZShuYW1lLCB7dGltZW91dE1zfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRyeSBhY3F1aXJlIGFkdmlzb3J5IGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBhZHZpc29yeSBsb2NrIHdhcyBhY3F1aXJlZCBpbW1lZGlhdGVseS5cbiAgICovXG4gIGFzeW5jIF90cnlBY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fdHJ5QWNxdWlyZUFkdmlzb3J5TG9ja0ZpbGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgb24tZGlzayBsb2NrIGRpcmVjdG9yeSBmb3IgYSBsb2NrIHRoaXMgZHJpdmVyIGluc3RhbmNlXG4gICAqIGFjcXVpcmVkIHRocm91Z2ggdGhlIGJhc2UgZHJpdmVyJ3MgdHdvLXRpZXIgY2hhaW4uIEEgY2FsbGVyIHRoYXQgdHJpZXNcbiAgICogdG8gcmVsZWFzZSBhIGxvY2sgaXQgbmV2ZXIgYWNxdWlyZWQgKG9yIHRoYXQgd2FzIGFscmVhZHkgcmVsZWFzZWQgYnlcbiAgICogYW5vdGhlciBkcml2ZXIpIGdldHMgYGZhbHNlYCBiYWNrIGFuZCB0aGUgZmlsZXN5c3RlbSBzdGF0ZSBpcyBsZWZ0XG4gICAqIGFsb25lIHNvIHdlIG5ldmVyIGRlbGV0ZSBzb21lYm9keSBlbHNlJ3MgbG9jayBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBhZHZpc29yeSBsb2NrIHdhcyByZWxlYXNlZC5cbiAgICovXG4gIGFzeW5jIF9yZWxlYXNlQWR2aXNvcnlMb2NrKG5hbWUpIHtcbiAgICBjb25zdCBsb2NrUGF0aCA9IHRoaXMuX2Fkdmlzb3J5TG9ja1BhdGgobmFtZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5zdGF0KGxvY2tQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5fcmVsZWFzZUFkdmlzb3J5TG9ja0ZpbGUobmFtZSlcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogRmlsZXN5c3RlbS10aWVyIHZpZXcgZm9yIHRoZSBiYXNlIGRyaXZlcidzIGBpc0Fkdmlzb3J5TG9ja0hlbGRgLCB3aGljaFxuICAgKiBhbnN3ZXJzIGZyb20gdGhlIHByb2Nlc3MtbG9jYWwgdGllciBmaXJzdCBhbmQgb25seSBhc2tzIHRoaXMgaG9vayB3aGVuXG4gICAqIHRoZSB0aWVyIGhhcyBubyBvd25lciBmb3IgdGhlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBhZHZpc29yeSBsb2NrIGZpbGUgaXMgaGVsZC5cbiAgICovXG4gIGFzeW5jIF9pc0Fkdmlzb3J5TG9ja0hlbGROYXRpdmUobmFtZSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9pc0Fkdmlzb3J5TG9ja0ZpbGVIZWxkKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogVGhlIE5vZGUgU1FMaXRlIGRyaXZlciBsYXllcnMgdGhlIG9wdC1pbiBmaWxlIHRpZXIgb24gdG9wIG9mIHRoZVxuICAgKiBwcm9jZXNzLWxvY2FsIHByZS1maWx0ZXIsIHNvIHRlbGVtZXRyeSByZXBvcnRzIGl0IGFzIGBmaWxlYC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaWVyIG5hbWUgcmVwb3J0ZWQgb24gdGVsZW1ldHJ5IHBheWxvYWRzLlxuICAgKi9cbiAgYWR2aXNvcnlMb2NrQmFja2VuZFRpZXIoKSB7XG4gICAgcmV0dXJuIFwiZmlsZVwiXG4gIH1cblxuICAvKipcbiAgICogQXR0cmlidXRlIHRoZSBuYW1lZCBsb2NrIHRvIHRoZSBmaWxlLXRpZXIgb3duZXIgcmVjb3JkZWQgaW5cbiAgICogYG93bmVyLmpzb25gIChgcGlkQGhvc3RuYW1lYCksIGNhcHR1cmVkIGF0IHRoZSB0ZWxlbWV0cnkgZXZlbnQgbW9tZW50XG4gICAqIChiZXN0LWVmZm9ydDsgdGhlIGNhbGxlciBndWFyZHMgZmFpbHVyZXMpLiBGYWxscyBiYWNrIHRvIHRoZVxuICAgKiBwcm9jZXNzLWxvY2FsIG93bmVyIHdoZW4gdGhlIGZpbGVzeXN0ZW0gbG9jayBpcyBub3QgdGhlIGhvbGRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIEZpbGUgbG9jayBvd25lciBpZGVudGl0eSwgb3IgbnVsbCB3aGVuIG5vIHByb2Nlc3MgaG9sZHMgdGhlIGxvY2suXG4gICAqL1xuICBhc3luYyBhZHZpc29yeUxvY2tIb2xkZXJDb25uZWN0aW9uSWQobmFtZSkge1xuICAgIGNvbnN0IGxvY2tQYXRoID0gdGhpcy5fYWR2aXNvcnlMb2NrUGF0aChuYW1lKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4obG9ja1BhdGgsIFwib3duZXIuanNvblwiKSwgXCJ1dGY4XCIpXG4gICAgICBjb25zdCBvd25lciA9IEpTT04ucGFyc2UoY29udGVudClcblxuICAgICAgaWYgKG93bmVyICYmIHR5cGVvZiBvd25lci5waWQgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIG93bmVyLmhvc3RuYW1lID09PSBcInN0cmluZ1wiKSByZXR1cm4gYCR7b3duZXIucGlkfUAke293bmVyLmhvc3RuYW1lfWBcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vIGZpbGUgbG9jayBkaXJlY3Rvcnkgb3IgdW5yZWFkYWJsZSBtZXRhZGF0YTogZmFsbCB0aHJvdWdoIHRvIHRoZVxuICAgICAgLy8gaW4tcHJvY2VzcyBvd25lciBiZWxvdy5cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuYWR2aXNvcnlMb2NrSG9sZGVyQ29ubmVjdGlvbklkKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvbHZlIGFkdmlzb3J5IGxvY2sgZGlyZWN0b3J5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBhZHZpc29yeS1sb2NrIGRpcmVjdG9yeS5cbiAgICovXG4gIF9yZXNvbHZlQWR2aXNvcnlMb2NrRGlyZWN0b3J5KCkge1xuICAgIGlmICghdGhpcy5fYWR2aXNvcnlMb2NrRGlyZWN0b3J5KSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZGVyaXZpbmcgdGhlIGRpcmVjdG9yeSBmb3IgY2FsbGVycyB0aGF0IGludm9rZWRcbiAgICAgIC8vIGFkdmlzb3J5IGxvY2sgbWV0aG9kcyBiZWZvcmUgYGNvbm5lY3QoKWAgd2lyZWQgdGhlIGZpZWxkIGluLlxuICAgICAgY29uc3QgZGF0YWJhc2VEaXIgPSBgJHt0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXREaXJlY3RvcnkoKX0vZGJgXG5cbiAgICAgIHRoaXMuX2Fkdmlzb3J5TG9ja0RpcmVjdG9yeSA9IHBhdGguam9pbihkYXRhYmFzZURpciwgYCR7dGhpcy5sb2NhbFN0b3JhZ2VOYW1lKCl9LnZlbG9jaW91cy1hZHZpc29yeS1sb2Nrc2ApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2Fkdmlzb3J5TG9ja0RpcmVjdG9yeVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWR2aXNvcnkgbG9jayBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGaWxlc3lzdGVtIHBhdGggZm9yIHRoZSBhZHZpc29yeSBsb2NrLlxuICAgKi9cbiAgX2Fkdmlzb3J5TG9ja1BhdGgobmFtZSkge1xuICAgIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShuYW1lKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTYpXG4gICAgY29uc3Qgc2FmZU5hbWUgPSBuYW1lLnJlcGxhY2UoL1teYS16QS1aMC05Ll8tXS9nLCBcIl9cIikuc2xpY2UoMCwgNjQpXG5cbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuX3Jlc29sdmVBZHZpc29yeUxvY2tEaXJlY3RvcnkoKSwgYCR7c2FmZU5hbWV9LSR7aGFzaH0ubG9ja2ApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnN1cmUgYWR2aXNvcnkgbG9jayBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBfZW5zdXJlQWR2aXNvcnlMb2NrRGlyZWN0b3J5KCkge1xuICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMuX3Jlc29sdmVBZHZpc29yeUxvY2tEaXJlY3RvcnkoKSwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3cml0ZSBhZHZpc29yeSBsb2NrIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9ja0RpclBhdGggLSBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBsb2NrIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfd3JpdGVBZHZpc29yeUxvY2tNZXRhZGF0YShsb2NrRGlyUGF0aCkge1xuICAgIGNvbnN0IG93bmVyUGF0aCA9IHBhdGguam9pbihsb2NrRGlyUGF0aCwgXCJvd25lci5qc29uXCIpXG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgICBob3N0bmFtZTogb3MuaG9zdG5hbWUoKSxcbiAgICAgIGFjcXVpcmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgIH0pXG5cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3duZXJQYXRoLCBwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGZ1bGx5IGluaXRpYWxpemVkIGxvY2sgZGlyZWN0b3J5IHdpdGggb25lIGF0b21pYyByZW5hbWUuXG4gICAqIEEgbG9zaW5nIGNhbmRpZGF0ZSBpcyByZW1vdmVkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGNvbmN1cnJlbnQgYWNxdWlzaXRpb25cbiAgICogY2Fubm90IG9ic2VydmUgb3IgZGVsZXRlIGFub3RoZXIgcHJvY2VzcydzIGhhbGYtd3JpdHRlbiBvd25lciBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tQYXRoIC0gU3RhYmxlIGFkdmlzb3J5LWxvY2sgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGlzIGNhbmRpZGF0ZSBiZWNhbWUgdGhlIGxvY2sgb3duZXIuXG4gICAqL1xuICBhc3luYyBfcHVibGlzaEFkdmlzb3J5TG9ja0RpcmVjdG9yeShsb2NrUGF0aCkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBhd2FpdCBmcy5ta2R0ZW1wKGAke2xvY2tQYXRofS5wZW5kaW5nLWApXG4gICAgbGV0IHB1Ymxpc2hlZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd3JpdGVBZHZpc29yeUxvY2tNZXRhZGF0YShjYW5kaWRhdGVQYXRoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5yZW5hbWUoY2FuZGlkYXRlUGF0aCwgbG9ja1BhdGgpXG4gICAgICAgIHB1Ymxpc2hlZCA9IHRydWVcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSAvKiogQHR5cGUge0Vycm9yICYge2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpPy5jb2RlXG5cbiAgICAgICAgaWYgKGNvZGUgPT09IFwiRUVYSVNUXCIgfHwgY29kZSA9PT0gXCJFTk9URU1QVFlcIikgcmV0dXJuIGZhbHNlXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghcHVibGlzaGVkKSBhd2FpdCBmcy5ybShjYW5kaWRhdGVQYXRoLCB7Zm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWNxdWlyZSBhZHZpc29yeSBsb2NrIGZpbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcGFyYW0ge3t0aW1lb3V0TXM/OiBudW1iZXIgfCBudWxsfX0gYXJncyAtIFRpbWVvdXQgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgYWR2aXNvcnktbG9jayBmaWxlIHdhcyBhY3F1aXJlZC5cbiAgICovXG4gIGFzeW5jIF9hY3F1aXJlQWR2aXNvcnlMb2NrRmlsZShuYW1lLCB7dGltZW91dE1zfSkge1xuICAgIGF3YWl0IHRoaXMuX2Vuc3VyZUFkdmlzb3J5TG9ja0RpcmVjdG9yeSgpXG5cbiAgICBjb25zdCBsb2NrUGF0aCA9IHRoaXMuX2Fkdmlzb3J5TG9ja1BhdGgobmFtZSlcbiAgICBjb25zdCBkZWFkbGluZSA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID49IDAgPyBEYXRlLm5vdygpICsgdGltZW91dE1zIDogbnVsbFxuICAgIGNvbnN0IHBvbGxJbnRlcnZhbE1zID0gNTBcblxuICAgIC8vIEludGVudGlvbmFsbHkgbG9vcGluZyB3aXRob3V0IGEgZml4ZWQgaXRlcmF0aW9uIGNhcCDigJQgZWl0aGVyIHRoZVxuICAgIC8vIG1rZGlyIHN1Y2NlZWRzLCB0aGUgZGVhZGxpbmUgZWxhcHNlcywgb3IgYW4gdW5leHBlY3RlZCBlcnJvciBpc1xuICAgIC8vIHJlLXRocm93bi5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuX3B1Ymxpc2hBZHZpc29yeUxvY2tEaXJlY3RvcnkobG9ja1BhdGgpKSByZXR1cm4gdHJ1ZVxuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5faXNBZHZpc29yeUxvY2tTdGFsZShsb2NrUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgZnMucm0obG9ja1BhdGgsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGRlYWRsaW5lICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKVxuXG4gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgYXdhaXQgd2FpdChNYXRoLm1pbihwb2xsSW50ZXJ2YWxNcywgcmVtYWluaW5nKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHdhaXQocG9sbEludGVydmFsTXMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdHJ5IGFjcXVpcmUgYWR2aXNvcnkgbG9jayBmaWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgYWR2aXNvcnktbG9jayBmaWxlIHdhcyBhY3F1aXJlZCBpbW1lZGlhdGVseS5cbiAgICovXG4gIGFzeW5jIF90cnlBY3F1aXJlQWR2aXNvcnlMb2NrRmlsZShuYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5fZW5zdXJlQWR2aXNvcnlMb2NrRGlyZWN0b3J5KClcblxuICAgIGNvbnN0IGxvY2tQYXRoID0gdGhpcy5fYWR2aXNvcnlMb2NrUGF0aChuYW1lKVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuX3B1Ymxpc2hBZHZpc29yeUxvY2tEaXJlY3RvcnkobG9ja1BhdGgpKSByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuX2lzQWR2aXNvcnlMb2NrU3RhbGUobG9ja1BhdGgpKSB7XG4gICAgICBhd2FpdCBmcy5ybShsb2NrUGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KVxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3B1Ymxpc2hBZHZpc29yeUxvY2tEaXJlY3RvcnkobG9ja1BhdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxlYXNlIGFkdmlzb3J5IGxvY2sgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3JlbGVhc2VBZHZpc29yeUxvY2tGaWxlKG5hbWUpIHtcbiAgICBjb25zdCBsb2NrUGF0aCA9IHRoaXMuX2Fkdmlzb3J5TG9ja1BhdGgobmFtZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5ybShsb2NrUGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQmVzdC1lZmZvcnQgcmVsZWFzZTsgaW4tcHJvY2VzcyBzdGF0ZSBpcyBzdGlsbCBhdXRob3JpdGF0aXZlIGFuZFxuICAgICAgLy8gc3RhbGUtbG9jayBjbGVhbnVwIG9uIHRoZSBuZXh0IGFjcXVpcmUgd2lsbCByZW1vdmUgdGhlIGRpcmVjdG9yeVxuICAgICAgLy8gaWYgaXQgcmVhbGx5IGlzIHN0aWxsIGxpbmdlcmluZy5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBhZHZpc29yeSBsb2NrIGZpbGUgaGVsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIGFkdmlzb3J5LWxvY2sgZmlsZSBleGlzdHMgYW5kIGlzIGFjdGl2ZS5cbiAgICovXG4gIGFzeW5jIF9pc0Fkdmlzb3J5TG9ja0ZpbGVIZWxkKG5hbWUpIHtcbiAgICBjb25zdCBsb2NrUGF0aCA9IHRoaXMuX2Fkdmlzb3J5TG9ja1BhdGgobmFtZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5zdGF0KGxvY2tQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuICFhd2FpdCB0aGlzLl9pc0Fkdmlzb3J5TG9ja1N0YWxlKGxvY2tQYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIEEgbG9jayBkaXJlY3RvcnkgaXMgY29uc2lkZXJlZCBzdGFsZSB3aGVuIGl0cyBvd25lciBtZXRhZGF0YSBuYW1lcyBhXG4gICAqIFBJRCBvbiB0aGlzIGhvc3QgdGhhdCBpcyBubyBsb25nZXIgcnVubmluZy4gQ3Jvc3MtaG9zdCBvd25lcnNoaXAgKGFcbiAgICogZGlmZmVyZW50IGBob3N0bmFtZWApIGlzIHRyZWF0ZWQgYXMgbGl2ZSBiZWNhdXNlIHdlIGNhbm5vdCByZWxpYWJseVxuICAgKiBwcm9iZSBhIFBJRCBvbiBhbm90aGVyIG1hY2hpbmU7IG9wZXJhdG9ycyBpbiB0aGF0IHNpdHVhdGlvbiBzaG91bGRcbiAgICogcmVtb3ZlIHN0YWxlIGxvY2sgZGlyZWN0b3JpZXMgYnkgaGFuZCBpZiB0aGV5IGxpbmdlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2tQYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgbG9jayBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIGFkdmlzb3J5LWxvY2sgZmlsZSBpcyBzdGFsZS5cbiAgICovXG4gIGFzeW5jIF9pc0Fkdmlzb3J5TG9ja1N0YWxlKGxvY2tQYXRoKSB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyByYXdPd25lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIGxldCByYXdPd25lclxuXG4gICAgdHJ5IHtcbiAgICAgIHJhd093bmVyID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKGxvY2tQYXRoLCBcIm93bmVyLmpzb25cIiksIFwidXRmOFwiKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBvciB1bnJlYWRhYmxlIG1ldGFkYXRhIOKAlCB0cmVhdCBhcyBzdGFsZSBzbyB3ZSBjYW4gcmVjbGFpbS5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBvd25lci5cbiAgICAgKiBAdHlwZSB7e3BpZD86IG51bWJlciwgaG9zdG5hbWU/OiBzdHJpbmd9fSAqL1xuICAgIGxldCBvd25lclxuXG4gICAgdHJ5IHtcbiAgICAgIG93bmVyID0gSlNPTi5wYXJzZShyYXdPd25lcilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKCFvd25lciB8fCB0eXBlb2Ygb3duZXIucGlkICE9PSBcIm51bWJlclwiKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChvd25lci5ob3N0bmFtZSAmJiBvd25lci5ob3N0bmFtZSAhPT0gb3MuaG9zdG5hbWUoKSkgcmV0dXJuIGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgLy8gYGtpbGwocGlkLCAwKWAgaXMgYSBuby1vcCBzaWduYWwgdGhhdCBmYWlscyB3aXRoIEVTUkNIIGlmIHRoZVxuICAgICAgLy8gcHJvY2VzcyBpcyBub3QgcnVubmluZzsgcGVybWlzc2lvbiBlcnJvcnMgc3RpbGwgaW5kaWNhdGUgdGhlXG4gICAgICAvLyBwcm9jZXNzIGV4aXN0cyBzbyB3ZSB0cmVhdCB0aG9zZSBhcyBcIm5vdCBzdGFsZVwiLlxuICAgICAgcHJvY2Vzcy5raWxsKG93bmVyLnBpZCwgMClcblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge0Vycm9yICYge2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpPy5jb2RlID09PSBcIkVTUkNIXCJcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/database/migrator.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/database/migrator.js"],"names":[],"mappings":"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"}